summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitattributes8
-rw-r--r--3rdparty/libconfig/extra/.gitignore2
-rw-r--r--3rdparty/libconfig/extra/gen/Makefile4
-rw-r--r--3rdparty/libconfig/extra/gen/clangwarnings.patch14
-rw-r--r--3rdparty/libconfig/extra/gen/grammar.y72
-rw-r--r--3rdparty/libconfig/extra/gen/scanner.l146
-rw-r--r--3rdparty/libconfig/grammar.c360
-rw-r--r--3rdparty/libconfig/grammar.h80
-rw-r--r--3rdparty/libconfig/libconfig.c58
-rw-r--r--3rdparty/libconfig/libconfig.h2
-rw-r--r--3rdparty/libconfig/scanner.c1154
-rw-r--r--3rdparty/libconfig/scanner.h457
-rw-r--r--3rdparty/libconfig/wincompat.h4
-rw-r--r--db/constants.conf16
-rw-r--r--doc/script_commands.txt24
-rw-r--r--npc/dev/test.txt9
-rw-r--r--src/common/cbasetypes.h5
-rw-r--r--src/map/script.c132
-rw-r--r--tools/utils/libconf.py31
19 files changed, 1856 insertions, 722 deletions
diff --git a/.gitattributes b/.gitattributes
index a839a28c9..d565bc7ac 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -2,4 +2,10 @@
*.c diff=cpp
*.sln merge=union
*.vcproj merge=union
-*.vcxproj merge=union \ No newline at end of file
+*.vcxproj merge=union
+
+# libconfig generated files
+3rdparty/libconfig/grammar.c linguist-generated=true
+3rdparty/libconfig/grammar.h linguist-generated=true
+3rdparty/libconfig/scanner.c linguist-generated=true
+3rdparty/libconfig/scanner.h linguist-generated=true
diff --git a/3rdparty/libconfig/extra/.gitignore b/3rdparty/libconfig/extra/.gitignore
index 03f1609a0..abc0e5b2d 100644
--- a/3rdparty/libconfig/extra/.gitignore
+++ b/3rdparty/libconfig/extra/.gitignore
@@ -2,4 +2,6 @@
/config.status
/gen/*.c
/gen/*.h
+/gen/*.orig
+/gen/*.rej
/autom4te.cache
diff --git a/3rdparty/libconfig/extra/gen/Makefile b/3rdparty/libconfig/extra/gen/Makefile
index 0b2e0655e..2e952e221 100644
--- a/3rdparty/libconfig/extra/gen/Makefile
+++ b/3rdparty/libconfig/extra/gen/Makefile
@@ -19,9 +19,9 @@ LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS)
YLWRAP = ../aux-build/ylwrap
YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS)
LEX = flex
-LEXLIB = -ll
+LEXLIB = -lfl
LEX_OUTPUT_ROOT = lex.yy
-SHELL = /bin/sh
+SHELL = /bin/bash
YACC = bison -y
YFLAGS =
diff --git a/3rdparty/libconfig/extra/gen/clangwarnings.patch b/3rdparty/libconfig/extra/gen/clangwarnings.patch
index 0270dfc44..ecae69c0e 100644
--- a/3rdparty/libconfig/extra/gen/clangwarnings.patch
+++ b/3rdparty/libconfig/extra/gen/clangwarnings.patch
@@ -10,7 +10,7 @@ index 3595578..26444f8 100644
- yymsg = "Deleting";
- YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
+ YY_SYMBOL_PRINT (yymsg != NULL ? yymsg : "Deleting", yytype, yyvaluep, yylocationp);
-
+
YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
YYUSE (yytype);
diff --git a/scanner.c b/scanner.c
@@ -22,15 +22,15 @@ index 60882db..8b8af33 100644
#include <errno.h>
#include <stdlib.h>
+#include <assert.h>
-
+
/* end standard C headers. */
-
+
@@ -1702,6 +1703,8 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
- libconfig_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner);
+ yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner);
}
-
+
+ assert(YY_CURRENT_BUFFER != NULL); // Fixes compiler warning -Wnull-dereference on gcc-6 and -O3
+
- libconfig_yy_init_buffer(YY_CURRENT_BUFFER,input_file ,yyscanner);
- libconfig_yy_load_buffer_state(yyscanner );
+ yy_init_buffer( YY_CURRENT_BUFFER, input_file , yyscanner);
+ yy_load_buffer_state( yyscanner );
}
diff --git a/3rdparty/libconfig/extra/gen/grammar.y b/3rdparty/libconfig/extra/gen/grammar.y
index 5d9f02c2d..b02612435 100644
--- a/3rdparty/libconfig/extra/gen/grammar.y
+++ b/3rdparty/libconfig/extra/gen/grammar.y
@@ -90,8 +90,8 @@ void libconfig_yyerror(void *scanner, struct parse_context *ctx,
char *sval;
}
-%token <ival> TOK_BOOLEAN TOK_INTEGER TOK_HEX
-%token <llval> TOK_INTEGER64 TOK_HEX64
+%token <ival> TOK_BOOLEAN TOK_INTEGER TOK_HEX TOK_BIN TOK_OCT
+%token <llval> TOK_INTEGER64 TOK_HEX64 TOK_BIN64 TOK_OCT64
%token <fval> TOK_FLOAT
%token <sval> TOK_STRING TOK_NAME
%token TOK_EQUALS TOK_NEWLINE TOK_ARRAY_START TOK_ARRAY_END TOK_LIST_START TOK_LIST_END TOK_COMMA TOK_GROUP_START TOK_GROUP_END TOK_SEMICOLON TOK_GARBAGE TOK_ERROR
@@ -310,6 +310,74 @@ simple_value:
config_setting_set_format(ctx->setting, CONFIG_FORMAT_HEX);
}
}
+ | TOK_BIN
+ {
+ if (IN_ARRAY() || IN_LIST()) {
+ struct config_setting_t *e = config_setting_set_int_elem(ctx->parent, -1, $1);
+
+ if (e == NULL) {
+ libconfig_yyerror(scanner, ctx, scan_ctx, err_array_elem_type);
+ YYABORT;
+ } else {
+ config_setting_set_format(e, CONFIG_FORMAT_BIN);
+ CAPTURE_PARSE_POS(e);
+ }
+ } else {
+ config_setting_set_int(ctx->setting, $1);
+ config_setting_set_format(ctx->setting, CONFIG_FORMAT_BIN);
+ }
+ }
+ | TOK_BIN64
+ {
+ if (IN_ARRAY() || IN_LIST()) {
+ struct config_setting_t *e = config_setting_set_int64_elem(ctx->parent, -1, $1);
+
+ if (e == NULL) {
+ libconfig_yyerror(scanner, ctx, scan_ctx, err_array_elem_type);
+ YYABORT;
+ } else {
+ config_setting_set_format(e, CONFIG_FORMAT_BIN);
+ CAPTURE_PARSE_POS(e);
+ }
+ } else {
+ config_setting_set_int64(ctx->setting, $1);
+ config_setting_set_format(ctx->setting, CONFIG_FORMAT_BIN);
+ }
+ }
+ | TOK_OCT
+ {
+ if (IN_ARRAY() || IN_LIST()) {
+ struct config_setting_t *e = config_setting_set_int_elem(ctx->parent, -1, $1);
+
+ if (e == NULL) {
+ libconfig_yyerror(scanner, ctx, scan_ctx, err_array_elem_type);
+ YYABORT;
+ } else {
+ config_setting_set_format(e, CONFIG_FORMAT_OCT);
+ CAPTURE_PARSE_POS(e);
+ }
+ } else {
+ config_setting_set_int(ctx->setting, $1);
+ config_setting_set_format(ctx->setting, CONFIG_FORMAT_OCT);
+ }
+ }
+ | TOK_OCT64
+ {
+ if (IN_ARRAY() || IN_LIST()) {
+ struct config_setting_t *e = config_setting_set_int64_elem(ctx->parent, -1, $1);
+
+ if (e == NULL) {
+ libconfig_yyerror(scanner, ctx, scan_ctx, err_array_elem_type);
+ YYABORT;
+ } else {
+ config_setting_set_format(e, CONFIG_FORMAT_OCT);
+ CAPTURE_PARSE_POS(e);
+ }
+ } else {
+ config_setting_set_int64(ctx->setting, $1);
+ config_setting_set_format(ctx->setting, CONFIG_FORMAT_OCT);
+ }
+ }
| TOK_FLOAT
{
if(IN_ARRAY() || IN_LIST())
diff --git a/3rdparty/libconfig/extra/gen/scanner.l b/3rdparty/libconfig/extra/gen/scanner.l
index f57e1c275..4a7e5a06d 100644
--- a/3rdparty/libconfig/extra/gen/scanner.l
+++ b/3rdparty/libconfig/extra/gen/scanner.l
@@ -50,38 +50,103 @@
#define YY_NO_INPUT // Suppress generation of useless input() function
-static unsigned long long fromhex(const char *s)
+/**
+ * converts a hexadecimal number literal to an ull integer
+ *
+ * @param p - a pointer to the hexacimal expression to parse
+ * @returns the resulting unsigned long long integer
+ */
+static unsigned long long fromhex(const char *p)
{
-#ifdef __MINGW32__
+ unsigned long long val = 0;
+
+ if (*p != '0' || (p[1] != 'x' && p[1] != 'X')) {
+ return 0;
+ }
- /* MinGW's strtoull() seems to be broken; it only returns the lower
- * 32 bits...
- */
+ for (p += 2; isxdigit(*p) || *p == '_'; ++p) {
+ if (*p != '_') {
+ val <<= 4;
+ val |= ((*p < 'A') ? (*p & 0xF) : (9 + (*p & 0x7)));
+ }
+ }
- const char *p = s;
+ return val;
+}
+
+/**
+ * converts a binary number literal to an ull integer
+ *
+ * @param p - a pointer to the hexacimal expression to parse
+ * @returns the resulting unsigned long long integer
+ */
+static unsigned long long frombin (const char *p)
+{
unsigned long long val = 0;
- if(*p != '0')
- return(0);
+ if (*p != '0' || (p[1] != 'b' && p[1] != 'B')) {
+ return 0;
+ }
+
+ for (p += 2; *p == '0' || *p == '1' || *p == '_'; ++p) {
+ if (*p != '_') {
+ val <<= 1;
+ val |= (*p == '0') ? 0 : 1;
+ }
+ }
- ++p;
+ return val;
+}
+
+/**
+ * converts an octal number literal to an ull integer
+ *
+ * @param p - a pointer to the hexacimal expression to parse
+ * @returns the resulting unsigned long long integer
+ */
+static unsigned long long fromoct (const char *p)
+{
+ unsigned long long val = 0;
- if(*p != 'x' && *p != 'X')
- return(0);
+ if (*p != '0' || (p[1] != 'o' && p[1] != 'O')) {
+ return 0;
+ }
- for(++p; isxdigit(*p); ++p)
- {
- val <<= 4;
- val |= ((*p < 'A') ? (*p & 0xF) : (9 + (*p & 0x7)));
+ for (p += 2; (*p >= '0' && *p <= '7') || *p == '_'; ++p) {
+ if (*p != '_') {
+ val <<= 3;
+ val |= (*p & 0xF);
+ }
}
- return(val);
+ return val;
+}
-#else /* ! __MINGW32__ */
+/**
+ * converts a decimal number literal to a ll integer
+ *
+ * @param p - a pointer to the hexacimal expression to parse
+ * @returns the resulting signed long long integer
+ */
+static long long fromdec (const char *p)
+{
+ unsigned char is_neg = 0;
- return(strtoull(s, NULL, 16));
+ if (*p == '-') {
+ is_neg = 1;
+ p++;
+ }
+
+ long long val = 0;
+
+ for (; isdigit(*p) || *p == '_'; ++p) {
+ if (*p != '_') {
+ val *= 10;
+ val += (*p & 0xF);
+ }
+ }
-#endif /* __MINGW32__ */
+ return (is_neg == 1) ? -val : val;
}
%}
@@ -89,10 +154,14 @@ static unsigned long long fromhex(const char *s)
true [Tt][Rr][Uu][Ee]
false [Ff][Aa][Ll][Ss][Ee]
name [A-Za-z0-9\*][-A-Za-z0-9_\*.]*
-integer [-+]?[0-9]+
-integer64 [-+]?[0-9]+L(L)?
-hex 0[Xx][0-9A-Fa-f]+
-hex64 0[Xx][0-9A-Fa-f]+L(L)?
+integer [-+]?[0-9_]+
+integer64 [-+]?[0-9_]+L(L)?
+hex 0[Xx][0-9A-Fa-f_]+
+hex64 0[Xx][0-9A-Fa-f_]+L(L)?
+bin 0[Bb][01_]+
+bin64 0[Bb][01_]+L(L)?
+oct 0[Oo][0-7_]+
+oct64 0[Oo][0-7_]+L(L)?
hexchar \\[Xx][0-9A-Fa-f]{2}
float ([-+]?([0-9]*)?\.[0-9]*([eE][-+]?[0-9]+)?)|([-+]?([0-9]+)(\.[0-9]*)?[eE][-+]?[0-9]+)
comment (#|\/\/).*$
@@ -173,29 +242,14 @@ include_open ^[ \t]*@include[ \t]+\"
{true} { yylval->ival = 1; return(TOK_BOOLEAN); }
{false} { yylval->ival = 0; return(TOK_BOOLEAN); }
{float} { yylval->fval = atof(yytext); return(TOK_FLOAT); }
-{integer} {
- long long llval;
- llval = atoll(yytext);
- if((llval < INT_MIN) || (llval > INT_MAX))
- {
- yylval->llval = llval;
- return(TOK_INTEGER64);
- }
- else
- {
- yylval->ival = (int)llval;
- return(TOK_INTEGER);
- }
- }
-{integer64} { yylval->llval = atoll(yytext); return(TOK_INTEGER64); }
-{hex} {
- unsigned long ulval = strtoul(yytext, NULL, 16);
- if (ulval > INT32_MAX)
- ulval &= INT32_MAX;
- yylval->ival = (int)ulval;
- return(TOK_HEX);
- }
-{hex64} { yylval->llval = fromhex(yytext); return(TOK_HEX64); }
+{integer} { yylval->ival = (int)fromdec(yytext); return TOK_INTEGER; }
+{integer64} { yylval->llval = fromdec(yytext); return TOK_INTEGER64; }
+{hex} { yylval->ival = (int)fromhex(yytext); return TOK_HEX; }
+{hex64} { yylval->llval = fromhex(yytext); return TOK_HEX64; }
+{bin} { yylval->ival = (int)frombin(yytext); return TOK_BIN; }
+{bin64} { yylval->llval = frombin(yytext); return TOK_BIN64; }
+{oct} { yylval->ival = (int)fromoct(yytext); return TOK_OCT; }
+{oct64} { yylval->llval = fromoct(yytext); return TOK_OCT64; }
{name} { yylval->sval = yytext; return(TOK_NAME); }
\[ { return(TOK_ARRAY_START); }
\] { return(TOK_ARRAY_END); }
diff --git a/3rdparty/libconfig/grammar.c b/3rdparty/libconfig/grammar.c
index a1b099678..0c3206d23 100644
--- a/3rdparty/libconfig/grammar.c
+++ b/3rdparty/libconfig/grammar.c
@@ -158,46 +158,54 @@ extern int libconfig_yydebug;
TOK_BOOLEAN = 258,
TOK_INTEGER = 259,
TOK_HEX = 260,
- TOK_INTEGER64 = 261,
- TOK_HEX64 = 262,
- TOK_FLOAT = 263,
- TOK_STRING = 264,
- TOK_NAME = 265,
- TOK_EQUALS = 266,
- TOK_NEWLINE = 267,
- TOK_ARRAY_START = 268,
- TOK_ARRAY_END = 269,
- TOK_LIST_START = 270,
- TOK_LIST_END = 271,
- TOK_COMMA = 272,
- TOK_GROUP_START = 273,
- TOK_GROUP_END = 274,
- TOK_SEMICOLON = 275,
- TOK_GARBAGE = 276,
- TOK_ERROR = 277
+ TOK_BIN = 261,
+ TOK_OCT = 262,
+ TOK_INTEGER64 = 263,
+ TOK_HEX64 = 264,
+ TOK_BIN64 = 265,
+ TOK_OCT64 = 266,
+ TOK_FLOAT = 267,
+ TOK_STRING = 268,
+ TOK_NAME = 269,
+ TOK_EQUALS = 270,
+ TOK_NEWLINE = 271,
+ TOK_ARRAY_START = 272,
+ TOK_ARRAY_END = 273,
+ TOK_LIST_START = 274,
+ TOK_LIST_END = 275,
+ TOK_COMMA = 276,
+ TOK_GROUP_START = 277,
+ TOK_GROUP_END = 278,
+ TOK_SEMICOLON = 279,
+ TOK_GARBAGE = 280,
+ TOK_ERROR = 281
};
#endif
/* Tokens. */
#define TOK_BOOLEAN 258
#define TOK_INTEGER 259
#define TOK_HEX 260
-#define TOK_INTEGER64 261
-#define TOK_HEX64 262
-#define TOK_FLOAT 263
-#define TOK_STRING 264
-#define TOK_NAME 265
-#define TOK_EQUALS 266
-#define TOK_NEWLINE 267
-#define TOK_ARRAY_START 268
-#define TOK_ARRAY_END 269
-#define TOK_LIST_START 270
-#define TOK_LIST_END 271
-#define TOK_COMMA 272
-#define TOK_GROUP_START 273
-#define TOK_GROUP_END 274
-#define TOK_SEMICOLON 275
-#define TOK_GARBAGE 276
-#define TOK_ERROR 277
+#define TOK_BIN 261
+#define TOK_OCT 262
+#define TOK_INTEGER64 263
+#define TOK_HEX64 264
+#define TOK_BIN64 265
+#define TOK_OCT64 266
+#define TOK_FLOAT 267
+#define TOK_STRING 268
+#define TOK_NAME 269
+#define TOK_EQUALS 270
+#define TOK_NEWLINE 271
+#define TOK_ARRAY_START 272
+#define TOK_ARRAY_END 273
+#define TOK_LIST_START 274
+#define TOK_LIST_END 275
+#define TOK_COMMA 276
+#define TOK_GROUP_START 277
+#define TOK_GROUP_END 278
+#define TOK_SEMICOLON 279
+#define TOK_GARBAGE 280
+#define TOK_ERROR 281
/* Value type. */
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
@@ -211,7 +219,7 @@ union YYSTYPE
double fval;
char *sval;
-#line 215 "grammar.c" /* yacc.c:355 */
+#line 223 "grammar.c" /* yacc.c:355 */
};
typedef union YYSTYPE YYSTYPE;
@@ -227,7 +235,7 @@ int libconfig_yyparse (void *scanner, struct parse_context *ctx, struct scan_con
/* Copy the second part of user declarations. */
-#line 231 "grammar.c" /* yacc.c:358 */
+#line 239 "grammar.c" /* yacc.c:358 */
#ifdef short
# undef short
@@ -469,21 +477,21 @@ union yyalloc
/* YYFINAL -- State number of the termination state. */
#define YYFINAL 6
/* YYLAST -- Last index in YYTABLE. */
-#define YYLAST 37
+#define YYLAST 52
/* YYNTOKENS -- Number of terminals. */
-#define YYNTOKENS 23
+#define YYNTOKENS 27
/* YYNNTS -- Number of nonterminals. */
#define YYNNTS 23
/* YYNRULES -- Number of rules. */
-#define YYNRULES 43
+#define YYNRULES 47
/* YYNSTATES -- Number of states. */
-#define YYNSTATES 51
+#define YYNSTATES 55
/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
by yylex, with out-of-bounds checking. */
#define YYUNDEFTOK 2
-#define YYMAXUTOK 277
+#define YYMAXUTOK 281
#define YYTRANSLATE(YYX) \
((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -519,7 +527,8 @@ static const yytype_uint8 yytranslate[] =
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
- 15, 16, 17, 18, 19, 20, 21, 22
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26
};
#if YYDEBUG
@@ -529,8 +538,8 @@ static const yytype_uint16 yyrline[] =
0, 101, 101, 103, 107, 108, 111, 113, 116, 118,
119, 122, 124, 129, 128, 148, 147, 171, 170, 193,
194, 195, 196, 200, 201, 205, 225, 247, 269, 291,
- 313, 331, 359, 360, 364, 367, 369, 373, 374, 378,
- 381, 383, 388, 387
+ 313, 330, 347, 364, 381, 399, 427, 428, 432, 435,
+ 437, 441, 442, 446, 449, 451, 456, 455
};
#endif
@@ -540,15 +549,16 @@ static const yytype_uint16 yyrline[] =
static const char *const yytname[] =
{
"$end", "error", "$undefined", "TOK_BOOLEAN", "TOK_INTEGER", "TOK_HEX",
- "TOK_INTEGER64", "TOK_HEX64", "TOK_FLOAT", "TOK_STRING", "TOK_NAME",
- "TOK_EQUALS", "TOK_NEWLINE", "TOK_ARRAY_START", "TOK_ARRAY_END",
- "TOK_LIST_START", "TOK_LIST_END", "TOK_COMMA", "TOK_GROUP_START",
- "TOK_GROUP_END", "TOK_SEMICOLON", "TOK_GARBAGE", "TOK_ERROR", "$accept",
- "configuration", "setting_list", "setting_list_optional",
- "setting_terminator", "comma_optional", "setting", "$@1", "array", "$@2",
- "list", "$@3", "value", "string", "simple_value", "value_list_sub",
- "value_list", "value_list_optional", "simple_value_list_sub",
- "simple_value_list", "simple_value_list_optional", "group", "$@4", YY_NULLPTR
+ "TOK_BIN", "TOK_OCT", "TOK_INTEGER64", "TOK_HEX64", "TOK_BIN64",
+ "TOK_OCT64", "TOK_FLOAT", "TOK_STRING", "TOK_NAME", "TOK_EQUALS",
+ "TOK_NEWLINE", "TOK_ARRAY_START", "TOK_ARRAY_END", "TOK_LIST_START",
+ "TOK_LIST_END", "TOK_COMMA", "TOK_GROUP_START", "TOK_GROUP_END",
+ "TOK_SEMICOLON", "TOK_GARBAGE", "TOK_ERROR", "$accept", "configuration",
+ "setting_list", "setting_list_optional", "setting_terminator",
+ "comma_optional", "setting", "$@1", "array", "$@2", "list", "$@3",
+ "value", "string", "simple_value", "value_list_sub", "value_list",
+ "value_list_optional", "simple_value_list_sub", "simple_value_list",
+ "simple_value_list_optional", "group", "$@4", YY_NULLPTR
};
#endif
@@ -559,14 +569,14 @@ static const yytype_uint16 yytoknum[] =
{
0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
- 275, 276, 277
+ 275, 276, 277, 278, 279, 280, 281
};
# endif
-#define YYPACT_NINF -26
+#define YYPACT_NINF -19
#define yypact_value_is_default(Yystate) \
- (!!((Yystate) == (-26)))
+ (!!((Yystate) == (-19)))
#define YYTABLE_NINF -1
@@ -577,12 +587,12 @@ static const yytype_uint16 yytoknum[] =
STATE-NUM. */
static const yytype_int8 yypact[] =
{
- 2, -26, 10, 2, -26, 5, -26, -26, 0, -26,
- -26, -26, -26, -26, -26, -26, -26, -26, -26, -26,
- -26, -6, 8, -26, -26, 18, 0, 2, -26, -26,
- -26, -26, -26, 11, -26, 15, -26, 13, -26, 16,
- 2, 12, 18, -26, -26, 0, -26, -26, -26, -26,
- -26
+ 0, -19, 18, 0, -19, 6, -19, -19, -2, -19,
+ -19, -19, -19, -19, -19, -19, -19, -19, -19, -19,
+ -19, -19, -19, -19, -19, -5, 9, -19, -19, 39,
+ -2, 0, -19, -19, -19, -19, -19, 2, -19, 7,
+ -19, 3, -19, 8, 0, 4, 39, -19, -19, -2,
+ -19, -19, -19, -19, -19
};
/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -591,27 +601,27 @@ static const yytype_int8 yypact[] =
static const yytype_uint8 yydefact[] =
{
2, 13, 0, 3, 4, 0, 1, 5, 0, 25,
- 26, 28, 27, 29, 30, 23, 15, 17, 42, 20,
- 21, 8, 31, 19, 22, 40, 35, 6, 10, 9,
- 14, 24, 37, 11, 41, 0, 32, 11, 36, 0,
- 7, 0, 12, 39, 16, 12, 34, 18, 43, 38,
- 33
+ 26, 28, 30, 32, 27, 29, 31, 33, 34, 23,
+ 15, 17, 46, 20, 21, 8, 35, 19, 22, 44,
+ 39, 6, 10, 9, 14, 24, 41, 11, 45, 0,
+ 36, 11, 40, 0, 7, 0, 12, 43, 16, 12,
+ 38, 18, 47, 42, 37
};
/* YYPGOTO[NTERM-NUM]. */
static const yytype_int8 yypgoto[] =
{
- -26, -26, 6, -26, -26, -2, -3, -26, -26, -26,
- -26, -26, -25, -26, -23, -26, -26, -26, -26, -26,
- -26, -26, -26
+ -19, -19, 1, -19, -19, -15, -3, -19, -19, -19,
+ -19, -19, -18, -19, -16, -19, -19, -19, -19, -19,
+ -19, -19, -19
};
/* YYDEFGOTO[NTERM-NUM]. */
static const yytype_int8 yydefgoto[] =
{
- -1, 2, 3, 41, 30, 43, 4, 5, 19, 25,
- 20, 26, 21, 22, 23, 37, 38, 39, 33, 34,
- 35, 24, 27
+ -1, 2, 3, 45, 34, 47, 4, 5, 23, 29,
+ 24, 30, 25, 26, 27, 41, 42, 43, 37, 38,
+ 39, 28, 31
};
/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
@@ -619,40 +629,44 @@ static const yytype_int8 yydefgoto[] =
number is the opposite. If YYTABLE_NINF, syntax error. */
static const yytype_uint8 yytable[] =
{
- 7, 36, 32, 9, 10, 11, 12, 13, 14, 15,
- 6, 28, 1, 16, 29, 17, 8, 31, 18, 49,
- 50, 9, 10, 11, 12, 13, 14, 15, 42, 44,
- 45, 48, 47, 40, 0, 46, 0, 7
+ 7, 9, 10, 11, 12, 13, 14, 15, 16, 17,
+ 18, 19, 40, 36, 1, 20, 32, 21, 6, 33,
+ 22, 8, 35, 46, 49, 48, 50, 52, 51, 0,
+ 53, 54, 44, 0, 0, 0, 0, 0, 0, 0,
+ 0, 7, 9, 10, 11, 12, 13, 14, 15, 16,
+ 17, 18, 19
};
static const yytype_int8 yycheck[] =
{
- 3, 26, 25, 3, 4, 5, 6, 7, 8, 9,
- 0, 17, 10, 13, 20, 15, 11, 9, 18, 42,
- 45, 3, 4, 5, 6, 7, 8, 9, 17, 14,
- 17, 19, 16, 27, -1, 37, -1, 40
+ 3, 3, 4, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 30, 29, 14, 17, 21, 19, 0, 24,
+ 22, 15, 13, 21, 21, 18, 41, 23, 20, -1,
+ 46, 49, 31, -1, -1, -1, -1, -1, -1, -1,
+ -1, 44, 3, 4, 5, 6, 7, 8, 9, 10,
+ 11, 12, 13
};
/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
symbol of state STATE-NUM. */
static const yytype_uint8 yystos[] =
{
- 0, 10, 24, 25, 29, 30, 0, 29, 11, 3,
- 4, 5, 6, 7, 8, 9, 13, 15, 18, 31,
- 33, 35, 36, 37, 44, 32, 34, 45, 17, 20,
- 27, 9, 37, 41, 42, 43, 35, 38, 39, 40,
- 25, 26, 17, 28, 14, 17, 28, 16, 19, 37,
- 35
+ 0, 14, 28, 29, 33, 34, 0, 33, 15, 3,
+ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+ 17, 19, 22, 35, 37, 39, 40, 41, 48, 36,
+ 38, 49, 21, 24, 31, 13, 41, 45, 46, 47,
+ 39, 42, 43, 44, 29, 30, 21, 32, 18, 21,
+ 32, 20, 23, 41, 39
};
/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
static const yytype_uint8 yyr1[] =
{
- 0, 23, 24, 24, 25, 25, 26, 26, 27, 27,
- 27, 28, 28, 30, 29, 32, 31, 34, 33, 35,
- 35, 35, 35, 36, 36, 37, 37, 37, 37, 37,
- 37, 37, 38, 38, 39, 40, 40, 41, 41, 42,
- 43, 43, 45, 44
+ 0, 27, 28, 28, 29, 29, 30, 30, 31, 31,
+ 31, 32, 32, 34, 33, 36, 35, 38, 37, 39,
+ 39, 39, 39, 40, 40, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 42, 42, 43, 44,
+ 44, 45, 45, 46, 47, 47, 49, 48
};
/* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */
@@ -661,8 +675,8 @@ static const yytype_uint8 yyr2[] =
0, 2, 0, 1, 1, 2, 0, 1, 0, 1,
1, 0, 1, 0, 5, 0, 4, 0, 4, 1,
1, 1, 1, 1, 2, 1, 1, 1, 1, 1,
- 1, 1, 1, 3, 2, 0, 1, 1, 3, 2,
- 0, 1, 0, 4
+ 1, 1, 1, 1, 1, 1, 1, 3, 2, 0,
+ 1, 1, 3, 2, 0, 1, 0, 4
};
@@ -1347,7 +1361,7 @@ yyreduce:
switch (yyn)
{
case 13:
-#line 129 "grammar.y" /* yacc.c:1661 */
+#line 129 "grammar.y" /* yacc.c:1646 */
{
ctx->setting = config_setting_add(ctx->parent, (yyvsp[0].sval), CONFIG_TYPE_NONE);
@@ -1361,11 +1375,11 @@ yyreduce:
CAPTURE_PARSE_POS(ctx->setting);
}
}
-#line 1367 "grammar.c" /* yacc.c:1661 */
+#line 1381 "grammar.c" /* yacc.c:1646 */
break;
case 15:
-#line 148 "grammar.y" /* yacc.c:1661 */
+#line 148 "grammar.y" /* yacc.c:1646 */
{
if(IN_LIST())
{
@@ -1379,20 +1393,20 @@ yyreduce:
ctx->setting = NULL;
}
}
-#line 1385 "grammar.c" /* yacc.c:1661 */
+#line 1399 "grammar.c" /* yacc.c:1646 */
break;
case 16:
-#line 163 "grammar.y" /* yacc.c:1661 */
+#line 163 "grammar.y" /* yacc.c:1646 */
{
if(ctx->parent)
ctx->parent = ctx->parent->parent;
}
-#line 1394 "grammar.c" /* yacc.c:1661 */
+#line 1408 "grammar.c" /* yacc.c:1646 */
break;
case 17:
-#line 171 "grammar.y" /* yacc.c:1661 */
+#line 171 "grammar.y" /* yacc.c:1646 */
{
if(IN_LIST())
{
@@ -1406,32 +1420,32 @@ yyreduce:
ctx->setting = NULL;
}
}
-#line 1412 "grammar.c" /* yacc.c:1661 */
+#line 1426 "grammar.c" /* yacc.c:1646 */
break;
case 18:
-#line 186 "grammar.y" /* yacc.c:1661 */
+#line 186 "grammar.y" /* yacc.c:1646 */
{
if(ctx->parent)
ctx->parent = ctx->parent->parent;
}
-#line 1421 "grammar.c" /* yacc.c:1661 */
+#line 1435 "grammar.c" /* yacc.c:1646 */
break;
case 23:
-#line 200 "grammar.y" /* yacc.c:1661 */
+#line 200 "grammar.y" /* yacc.c:1646 */
{ parsectx_append_string(ctx, (yyvsp[0].sval)); free((yyvsp[0].sval)); }
-#line 1427 "grammar.c" /* yacc.c:1661 */
+#line 1441 "grammar.c" /* yacc.c:1646 */
break;
case 24:
-#line 201 "grammar.y" /* yacc.c:1661 */
+#line 201 "grammar.y" /* yacc.c:1646 */
{ parsectx_append_string(ctx, (yyvsp[0].sval)); free((yyvsp[0].sval)); }
-#line 1433 "grammar.c" /* yacc.c:1661 */
+#line 1447 "grammar.c" /* yacc.c:1646 */
break;
case 25:
-#line 206 "grammar.y" /* yacc.c:1661 */
+#line 206 "grammar.y" /* yacc.c:1646 */
{
if(IN_ARRAY() || IN_LIST())
{
@@ -1451,11 +1465,11 @@ yyreduce:
else
config_setting_set_bool(ctx->setting, (int)(yyvsp[0].ival));
}
-#line 1457 "grammar.c" /* yacc.c:1661 */
+#line 1471 "grammar.c" /* yacc.c:1646 */
break;
case 26:
-#line 226 "grammar.y" /* yacc.c:1661 */
+#line 226 "grammar.y" /* yacc.c:1646 */
{
if(IN_ARRAY() || IN_LIST())
{
@@ -1477,11 +1491,11 @@ yyreduce:
config_setting_set_format(ctx->setting, CONFIG_FORMAT_DEFAULT);
}
}
-#line 1483 "grammar.c" /* yacc.c:1661 */
+#line 1497 "grammar.c" /* yacc.c:1646 */
break;
case 27:
-#line 248 "grammar.y" /* yacc.c:1661 */
+#line 248 "grammar.y" /* yacc.c:1646 */
{
if(IN_ARRAY() || IN_LIST())
{
@@ -1503,11 +1517,11 @@ yyreduce:
config_setting_set_format(ctx->setting, CONFIG_FORMAT_DEFAULT);
}
}
-#line 1509 "grammar.c" /* yacc.c:1661 */
+#line 1523 "grammar.c" /* yacc.c:1646 */
break;
case 28:
-#line 270 "grammar.y" /* yacc.c:1661 */
+#line 270 "grammar.y" /* yacc.c:1646 */
{
if(IN_ARRAY() || IN_LIST())
{
@@ -1529,11 +1543,11 @@ yyreduce:
config_setting_set_format(ctx->setting, CONFIG_FORMAT_HEX);
}
}
-#line 1535 "grammar.c" /* yacc.c:1661 */
+#line 1549 "grammar.c" /* yacc.c:1646 */
break;
case 29:
-#line 292 "grammar.y" /* yacc.c:1661 */
+#line 292 "grammar.y" /* yacc.c:1646 */
{
if(IN_ARRAY() || IN_LIST())
{
@@ -1555,11 +1569,95 @@ yyreduce:
config_setting_set_format(ctx->setting, CONFIG_FORMAT_HEX);
}
}
-#line 1561 "grammar.c" /* yacc.c:1661 */
+#line 1575 "grammar.c" /* yacc.c:1646 */
break;
case 30:
-#line 314 "grammar.y" /* yacc.c:1661 */
+#line 314 "grammar.y" /* yacc.c:1646 */
+ {
+ if (IN_ARRAY() || IN_LIST()) {
+ struct config_setting_t *e = config_setting_set_int_elem(ctx->parent, -1, (yyvsp[0].ival));
+
+ if (e == NULL) {
+ libconfig_yyerror(scanner, ctx, scan_ctx, err_array_elem_type);
+ YYABORT;
+ } else {
+ config_setting_set_format(e, CONFIG_FORMAT_BIN);
+ CAPTURE_PARSE_POS(e);
+ }
+ } else {
+ config_setting_set_int(ctx->setting, (yyvsp[0].ival));
+ config_setting_set_format(ctx->setting, CONFIG_FORMAT_BIN);
+ }
+ }
+#line 1596 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 31:
+#line 331 "grammar.y" /* yacc.c:1646 */
+ {
+ if (IN_ARRAY() || IN_LIST()) {
+ struct config_setting_t *e = config_setting_set_int64_elem(ctx->parent, -1, (yyvsp[0].llval));
+
+ if (e == NULL) {
+ libconfig_yyerror(scanner, ctx, scan_ctx, err_array_elem_type);
+ YYABORT;
+ } else {
+ config_setting_set_format(e, CONFIG_FORMAT_BIN);
+ CAPTURE_PARSE_POS(e);
+ }
+ } else {
+ config_setting_set_int64(ctx->setting, (yyvsp[0].llval));
+ config_setting_set_format(ctx->setting, CONFIG_FORMAT_BIN);
+ }
+ }
+#line 1617 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 32:
+#line 348 "grammar.y" /* yacc.c:1646 */
+ {
+ if (IN_ARRAY() || IN_LIST()) {
+ struct config_setting_t *e = config_setting_set_int_elem(ctx->parent, -1, (yyvsp[0].ival));
+
+ if (e == NULL) {
+ libconfig_yyerror(scanner, ctx, scan_ctx, err_array_elem_type);
+ YYABORT;
+ } else {
+ config_setting_set_format(e, CONFIG_FORMAT_OCT);
+ CAPTURE_PARSE_POS(e);
+ }
+ } else {
+ config_setting_set_int(ctx->setting, (yyvsp[0].ival));
+ config_setting_set_format(ctx->setting, CONFIG_FORMAT_OCT);
+ }
+ }
+#line 1638 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 33:
+#line 365 "grammar.y" /* yacc.c:1646 */
+ {
+ if (IN_ARRAY() || IN_LIST()) {
+ struct config_setting_t *e = config_setting_set_int64_elem(ctx->parent, -1, (yyvsp[0].llval));
+
+ if (e == NULL) {
+ libconfig_yyerror(scanner, ctx, scan_ctx, err_array_elem_type);
+ YYABORT;
+ } else {
+ config_setting_set_format(e, CONFIG_FORMAT_OCT);
+ CAPTURE_PARSE_POS(e);
+ }
+ } else {
+ config_setting_set_int64(ctx->setting, (yyvsp[0].llval));
+ config_setting_set_format(ctx->setting, CONFIG_FORMAT_OCT);
+ }
+ }
+#line 1659 "grammar.c" /* yacc.c:1646 */
+ break;
+
+ case 34:
+#line 382 "grammar.y" /* yacc.c:1646 */
{
if(IN_ARRAY() || IN_LIST())
{
@@ -1577,11 +1675,11 @@ yyreduce:
else
config_setting_set_float(ctx->setting, (yyvsp[0].fval));
}
-#line 1583 "grammar.c" /* yacc.c:1661 */
+#line 1681 "grammar.c" /* yacc.c:1646 */
break;
- case 31:
-#line 332 "grammar.y" /* yacc.c:1661 */
+ case 35:
+#line 400 "grammar.y" /* yacc.c:1646 */
{
if(IN_ARRAY() || IN_LIST())
{
@@ -1606,11 +1704,11 @@ yyreduce:
_delete(s);
}
}
-#line 1612 "grammar.c" /* yacc.c:1661 */
+#line 1710 "grammar.c" /* yacc.c:1646 */
break;
- case 42:
-#line 388 "grammar.y" /* yacc.c:1661 */
+ case 46:
+#line 456 "grammar.y" /* yacc.c:1646 */
{
if(IN_LIST())
{
@@ -1624,20 +1722,20 @@ yyreduce:
ctx->setting = NULL;
}
}
-#line 1630 "grammar.c" /* yacc.c:1661 */
+#line 1728 "grammar.c" /* yacc.c:1646 */
break;
- case 43:
-#line 403 "grammar.y" /* yacc.c:1661 */
+ case 47:
+#line 471 "grammar.y" /* yacc.c:1646 */
{
if(ctx->parent)
ctx->parent = ctx->parent->parent;
}
-#line 1639 "grammar.c" /* yacc.c:1661 */
+#line 1737 "grammar.c" /* yacc.c:1646 */
break;
-#line 1643 "grammar.c" /* yacc.c:1661 */
+#line 1741 "grammar.c" /* yacc.c:1646 */
default: break;
}
/* User semantic actions sometimes alter yychar, and that requires
@@ -1865,5 +1963,5 @@ yyreturn:
#endif
return yyresult;
}
-#line 409 "grammar.y" /* yacc.c:1906 */
+#line 477 "grammar.y" /* yacc.c:1906 */
diff --git a/3rdparty/libconfig/grammar.h b/3rdparty/libconfig/grammar.h
index 09e7ae0b4..85f33992b 100644
--- a/3rdparty/libconfig/grammar.h
+++ b/3rdparty/libconfig/grammar.h
@@ -48,60 +48,68 @@ extern int libconfig_yydebug;
TOK_BOOLEAN = 258,
TOK_INTEGER = 259,
TOK_HEX = 260,
- TOK_INTEGER64 = 261,
- TOK_HEX64 = 262,
- TOK_FLOAT = 263,
- TOK_STRING = 264,
- TOK_NAME = 265,
- TOK_EQUALS = 266,
- TOK_NEWLINE = 267,
- TOK_ARRAY_START = 268,
- TOK_ARRAY_END = 269,
- TOK_LIST_START = 270,
- TOK_LIST_END = 271,
- TOK_COMMA = 272,
- TOK_GROUP_START = 273,
- TOK_GROUP_END = 274,
- TOK_SEMICOLON = 275,
- TOK_GARBAGE = 276,
- TOK_ERROR = 277
+ TOK_BIN = 261,
+ TOK_OCT = 262,
+ TOK_INTEGER64 = 263,
+ TOK_HEX64 = 264,
+ TOK_BIN64 = 265,
+ TOK_OCT64 = 266,
+ TOK_FLOAT = 267,
+ TOK_STRING = 268,
+ TOK_NAME = 269,
+ TOK_EQUALS = 270,
+ TOK_NEWLINE = 271,
+ TOK_ARRAY_START = 272,
+ TOK_ARRAY_END = 273,
+ TOK_LIST_START = 274,
+ TOK_LIST_END = 275,
+ TOK_COMMA = 276,
+ TOK_GROUP_START = 277,
+ TOK_GROUP_END = 278,
+ TOK_SEMICOLON = 279,
+ TOK_GARBAGE = 280,
+ TOK_ERROR = 281
};
#endif
/* Tokens. */
#define TOK_BOOLEAN 258
#define TOK_INTEGER 259
#define TOK_HEX 260
-#define TOK_INTEGER64 261
-#define TOK_HEX64 262
-#define TOK_FLOAT 263
-#define TOK_STRING 264
-#define TOK_NAME 265
-#define TOK_EQUALS 266
-#define TOK_NEWLINE 267
-#define TOK_ARRAY_START 268
-#define TOK_ARRAY_END 269
-#define TOK_LIST_START 270
-#define TOK_LIST_END 271
-#define TOK_COMMA 272
-#define TOK_GROUP_START 273
-#define TOK_GROUP_END 274
-#define TOK_SEMICOLON 275
-#define TOK_GARBAGE 276
-#define TOK_ERROR 277
+#define TOK_BIN 261
+#define TOK_OCT 262
+#define TOK_INTEGER64 263
+#define TOK_HEX64 264
+#define TOK_BIN64 265
+#define TOK_OCT64 266
+#define TOK_FLOAT 267
+#define TOK_STRING 268
+#define TOK_NAME 269
+#define TOK_EQUALS 270
+#define TOK_NEWLINE 271
+#define TOK_ARRAY_START 272
+#define TOK_ARRAY_END 273
+#define TOK_LIST_START 274
+#define TOK_LIST_END 275
+#define TOK_COMMA 276
+#define TOK_GROUP_START 277
+#define TOK_GROUP_END 278
+#define TOK_SEMICOLON 279
+#define TOK_GARBAGE 280
+#define TOK_ERROR 281
/* Value type. */
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
union YYSTYPE
{
-#line 86 "grammar.y" /* yacc.c:1915 */
+#line 86 "grammar.y" /* yacc.c:1909 */
int ival;
long long llval;
double fval;
char *sval;
-#line 105 "grammar.h" /* yacc.c:1915 */
+#line 113 "grammar.h" /* yacc.c:1909 */
};
typedef union YYSTYPE YYSTYPE;
diff --git a/3rdparty/libconfig/libconfig.c b/3rdparty/libconfig/libconfig.c
index 533145ac4..daf3ba42d 100644
--- a/3rdparty/libconfig/libconfig.c
+++ b/3rdparty/libconfig/libconfig.c
@@ -174,6 +174,31 @@ static void __config_indent(FILE *stream, int depth, unsigned short w)
/* ------------------------------------------------------------------------- */
+/**
+ * converts an integer to a binary string (because itoa is not in C99)
+ * skips leading zeros, and does not prepend with a 0b prefix
+ *
+ * @param value - the integer to convert to a binary expression
+ * @param buffer - a pointer to the buffer used to build the string
+ * @returns the same buffer
+ */
+char *int_tobin(const unsigned long long value, char *buffer) {
+ const unsigned long long mask = 1;
+ unsigned char nonzero = 0;
+
+ for (char bit = 63; bit >= 0; --bit) {
+ if ((value & (mask << bit)) == 1) {
+ nonzero = 1;
+ *buffer++ = '1';
+ } else if (nonzero != 0) {
+ *buffer++ = '0';
+ }
+ }
+
+ *buffer = '\0';
+ return buffer;
+}
+
static void __config_write_value(const struct config_t *config,
const union config_value_t *value, int type,
int format, int depth, FILE *stream)
@@ -195,6 +220,17 @@ static void __config_write_value(const struct config_t *config,
fprintf(stream, "0x%X", (unsigned int)(value->ival));
break;
+ case CONFIG_FORMAT_BIN:
+ {
+ char buffer[33]; // 32 individual bits (char '0' and '1') represented as 32 bytes + null
+ fprintf(stream, "0b%s", int_tobin((unsigned int)(value->ival), buffer));
+ break;
+ }
+
+ case CONFIG_FORMAT_OCT:
+ fprintf(stream, "0o%o", (unsigned int)(value->ival));
+ break;
+
case CONFIG_FORMAT_DEFAULT:
default:
fprintf(stream, "%d", value->ival);
@@ -210,6 +246,17 @@ static void __config_write_value(const struct config_t *config,
fprintf(stream, "0x" INT64_HEX_FMT "L", (unsigned long long)(value->llval));
break;
+ case CONFIG_FORMAT_BIN:
+ {
+ char buffer[65]; // 64 individual bits (char '0' and '1') represented as 64 bytes + null
+ fprintf(stream, "0b%s", int_tobin((unsigned long long)(value->llval), buffer));
+ break;
+ }
+
+ case CONFIG_FORMAT_OCT:
+ fprintf(stream, "0o" INT64_OCT_FMT "L", (unsigned long long)(value->llval));
+ break;
+
case CONFIG_FORMAT_DEFAULT:
default:
fprintf(stream, INT64_FMT "L", value->llval);
@@ -1174,14 +1221,15 @@ int config_setting_set_string(struct config_setting_t *setting, const char *valu
int config_setting_set_format(struct config_setting_t *setting, short format)
{
- if(((setting->type != CONFIG_TYPE_INT)
- && (setting->type != CONFIG_TYPE_INT64))
- || ((format != CONFIG_FORMAT_DEFAULT) && (format != CONFIG_FORMAT_HEX)))
- return(CONFIG_FALSE);
+ if (((setting->type != CONFIG_TYPE_INT) && (setting->type != CONFIG_TYPE_INT64))
+ || ((format != CONFIG_FORMAT_DEFAULT) && (format != CONFIG_FORMAT_HEX)
+ && (format != CONFIG_FORMAT_BIN) && (format != CONFIG_FORMAT_OCT))) {
+ return CONFIG_FALSE;
+ }
setting->format = format;
- return(CONFIG_TRUE);
+ return CONFIG_TRUE;
}
/* ------------------------------------------------------------------------- */
diff --git a/3rdparty/libconfig/libconfig.h b/3rdparty/libconfig/libconfig.h
index 5662968a7..8c432b023 100644
--- a/3rdparty/libconfig/libconfig.h
+++ b/3rdparty/libconfig/libconfig.h
@@ -57,6 +57,8 @@ extern "C" {
#define CONFIG_FORMAT_DEFAULT 0
#define CONFIG_FORMAT_HEX 1
+#define CONFIG_FORMAT_BIN 2
+#define CONFIG_FORMAT_OCT 3
#define CONFIG_OPTION_AUTOCONVERT 0x01
#define CONFIG_OPTION_SEMICOLON_SEPARATORS 0x02
diff --git a/3rdparty/libconfig/scanner.c b/3rdparty/libconfig/scanner.c
index 1914142c4..584c8ae06 100644
--- a/3rdparty/libconfig/scanner.c
+++ b/3rdparty/libconfig/scanner.c
@@ -1,6 +1,6 @@
-#line 1 "scanner.c"
+#line 2 "scanner.c"
-#line 3 "scanner.c"
+#line 4 "scanner.c"
#define YY_INT_ALIGNED short int
@@ -9,11 +9,233 @@
#define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2
#define YY_FLEX_MINOR_VERSION 6
-#define YY_FLEX_SUBMINOR_VERSION 2
+#define YY_FLEX_SUBMINOR_VERSION 4
#if YY_FLEX_SUBMINOR_VERSION > 0
#define FLEX_BETA
#endif
+#ifdef yy_create_buffer
+#define libconfig_yy_create_buffer_ALREADY_DEFINED
+#else
+#define yy_create_buffer libconfig_yy_create_buffer
+#endif
+
+#ifdef yy_delete_buffer
+#define libconfig_yy_delete_buffer_ALREADY_DEFINED
+#else
+#define yy_delete_buffer libconfig_yy_delete_buffer
+#endif
+
+#ifdef yy_scan_buffer
+#define libconfig_yy_scan_buffer_ALREADY_DEFINED
+#else
+#define yy_scan_buffer libconfig_yy_scan_buffer
+#endif
+
+#ifdef yy_scan_string
+#define libconfig_yy_scan_string_ALREADY_DEFINED
+#else
+#define yy_scan_string libconfig_yy_scan_string
+#endif
+
+#ifdef yy_scan_bytes
+#define libconfig_yy_scan_bytes_ALREADY_DEFINED
+#else
+#define yy_scan_bytes libconfig_yy_scan_bytes
+#endif
+
+#ifdef yy_init_buffer
+#define libconfig_yy_init_buffer_ALREADY_DEFINED
+#else
+#define yy_init_buffer libconfig_yy_init_buffer
+#endif
+
+#ifdef yy_flush_buffer
+#define libconfig_yy_flush_buffer_ALREADY_DEFINED
+#else
+#define yy_flush_buffer libconfig_yy_flush_buffer
+#endif
+
+#ifdef yy_load_buffer_state
+#define libconfig_yy_load_buffer_state_ALREADY_DEFINED
+#else
+#define yy_load_buffer_state libconfig_yy_load_buffer_state
+#endif
+
+#ifdef yy_switch_to_buffer
+#define libconfig_yy_switch_to_buffer_ALREADY_DEFINED
+#else
+#define yy_switch_to_buffer libconfig_yy_switch_to_buffer
+#endif
+
+#ifdef yypush_buffer_state
+#define libconfig_yypush_buffer_state_ALREADY_DEFINED
+#else
+#define yypush_buffer_state libconfig_yypush_buffer_state
+#endif
+
+#ifdef yypop_buffer_state
+#define libconfig_yypop_buffer_state_ALREADY_DEFINED
+#else
+#define yypop_buffer_state libconfig_yypop_buffer_state
+#endif
+
+#ifdef yyensure_buffer_stack
+#define libconfig_yyensure_buffer_stack_ALREADY_DEFINED
+#else
+#define yyensure_buffer_stack libconfig_yyensure_buffer_stack
+#endif
+
+#ifdef yylex
+#define libconfig_yylex_ALREADY_DEFINED
+#else
+#define yylex libconfig_yylex
+#endif
+
+#ifdef yyrestart
+#define libconfig_yyrestart_ALREADY_DEFINED
+#else
+#define yyrestart libconfig_yyrestart
+#endif
+
+#ifdef yylex_init
+#define libconfig_yylex_init_ALREADY_DEFINED
+#else
+#define yylex_init libconfig_yylex_init
+#endif
+
+#ifdef yylex_init_extra
+#define libconfig_yylex_init_extra_ALREADY_DEFINED
+#else
+#define yylex_init_extra libconfig_yylex_init_extra
+#endif
+
+#ifdef yylex_destroy
+#define libconfig_yylex_destroy_ALREADY_DEFINED
+#else
+#define yylex_destroy libconfig_yylex_destroy
+#endif
+
+#ifdef yyget_debug
+#define libconfig_yyget_debug_ALREADY_DEFINED
+#else
+#define yyget_debug libconfig_yyget_debug
+#endif
+
+#ifdef yyset_debug
+#define libconfig_yyset_debug_ALREADY_DEFINED
+#else
+#define yyset_debug libconfig_yyset_debug
+#endif
+
+#ifdef yyget_extra
+#define libconfig_yyget_extra_ALREADY_DEFINED
+#else
+#define yyget_extra libconfig_yyget_extra
+#endif
+
+#ifdef yyset_extra
+#define libconfig_yyset_extra_ALREADY_DEFINED
+#else
+#define yyset_extra libconfig_yyset_extra
+#endif
+
+#ifdef yyget_in
+#define libconfig_yyget_in_ALREADY_DEFINED
+#else
+#define yyget_in libconfig_yyget_in
+#endif
+
+#ifdef yyset_in
+#define libconfig_yyset_in_ALREADY_DEFINED
+#else
+#define yyset_in libconfig_yyset_in
+#endif
+
+#ifdef yyget_out
+#define libconfig_yyget_out_ALREADY_DEFINED
+#else
+#define yyget_out libconfig_yyget_out
+#endif
+
+#ifdef yyset_out
+#define libconfig_yyset_out_ALREADY_DEFINED
+#else
+#define yyset_out libconfig_yyset_out
+#endif
+
+#ifdef yyget_leng
+#define libconfig_yyget_leng_ALREADY_DEFINED
+#else
+#define yyget_leng libconfig_yyget_leng
+#endif
+
+#ifdef yyget_text
+#define libconfig_yyget_text_ALREADY_DEFINED
+#else
+#define yyget_text libconfig_yyget_text
+#endif
+
+#ifdef yyget_lineno
+#define libconfig_yyget_lineno_ALREADY_DEFINED
+#else
+#define yyget_lineno libconfig_yyget_lineno
+#endif
+
+#ifdef yyset_lineno
+#define libconfig_yyset_lineno_ALREADY_DEFINED
+#else
+#define yyset_lineno libconfig_yyset_lineno
+#endif
+
+#ifdef yyget_column
+#define libconfig_yyget_column_ALREADY_DEFINED
+#else
+#define yyget_column libconfig_yyget_column
+#endif
+
+#ifdef yyset_column
+#define libconfig_yyset_column_ALREADY_DEFINED
+#else
+#define yyset_column libconfig_yyset_column
+#endif
+
+#ifdef yywrap
+#define libconfig_yywrap_ALREADY_DEFINED
+#else
+#define yywrap libconfig_yywrap
+#endif
+
+#ifdef yyget_lval
+#define libconfig_yyget_lval_ALREADY_DEFINED
+#else
+#define yyget_lval libconfig_yyget_lval
+#endif
+
+#ifdef yyset_lval
+#define libconfig_yyset_lval_ALREADY_DEFINED
+#else
+#define yyset_lval libconfig_yyset_lval
+#endif
+
+#ifdef yyalloc
+#define libconfig_yyalloc_ALREADY_DEFINED
+#else
+#define yyalloc libconfig_yyalloc
+#endif
+
+#ifdef yyrealloc
+#define libconfig_yyrealloc_ALREADY_DEFINED
+#else
+#define yyrealloc libconfig_yyrealloc
+#endif
+
+#ifdef yyfree
+#define libconfig_yyfree_ALREADY_DEFINED
+#else
+#define yyfree libconfig_yyfree
+#endif
+
/* First, we deal with platform-specific or compiler-specific issues. */
/* begin standard C headers. */
@@ -85,10 +307,16 @@ typedef unsigned int flex_uint32_t;
#define UINT32_MAX (4294967295U)
#endif
+#ifndef SIZE_MAX
+#define SIZE_MAX (~(size_t)0)
+#endif
+
#endif /* ! C99 */
#endif /* ! FLEXINT_H */
+/* begin standard C++ headers. */
+
/* TODO: this is always defined, so inline it */
#define yyconst const
@@ -137,7 +365,7 @@ typedef void* yyscan_t;
/* Action number for EOF rule of a given start state. */
#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
/* Special action meaning "start processing a new file". */
-#define YY_NEW_FILE libconfig_yyrestart(yyin ,yyscanner )
+#define YY_NEW_FILE yyrestart( yyin , yyscanner )
#define YY_END_OF_BUFFER_CHAR 0
/* Size of default input buffer. */
@@ -173,7 +401,7 @@ typedef size_t yy_size_t;
/* Note: We specifically omit the test for yy_rule_can_match_eol because it requires
* access to the local variable yy_act. Since yyless() is a macro, it would break
- * existing scanners that call yyless() from OUTSIDE libconfig_yylex.
+ * existing scanners that call yyless() from OUTSIDE yylex.
* One obvious solution it to make yy_act a global. I tried that, and saw
* a 5% performance hit in a non-yylineno scanner, because yy_act is
* normally declared as a register variable-- so it is not worth it.
@@ -248,7 +476,7 @@ struct yy_buffer_state
int yy_bs_lineno; /**< The line count. */
int yy_bs_column; /**< The column count. */
-
+
/* Whether to try to fill the input buffer when we reach the
* end of it.
*/
@@ -265,7 +493,7 @@ struct yy_buffer_state
* possible backing-up.
*
* When we actually see the EOF, we change the status to "new"
- * (via libconfig_yyrestart()), so that the user can continue scanning by
+ * (via yyrestart()), so that the user can continue scanning by
* just pointing yyin at a new input file.
*/
#define YY_BUFFER_EOF_PENDING 2
@@ -287,43 +515,43 @@ struct yy_buffer_state
*/
#define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top]
-void libconfig_yyrestart ( FILE *input_file , yyscan_t yyscanner );
-void libconfig_yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner );
-YY_BUFFER_STATE libconfig_yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner );
-void libconfig_yy_delete_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );
-void libconfig_yy_flush_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );
-void libconfig_yypush_buffer_state ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner );
-void libconfig_yypop_buffer_state ( yyscan_t yyscanner );
+void yyrestart ( FILE *input_file , yyscan_t yyscanner );
+void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner );
+YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner );
+void yy_delete_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );
+void yy_flush_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );
+void yypush_buffer_state ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner );
+void yypop_buffer_state ( yyscan_t yyscanner );
-static void libconfig_yyensure_buffer_stack ( yyscan_t yyscanner );
-static void libconfig_yy_load_buffer_state ( yyscan_t yyscanner );
-static void libconfig_yy_init_buffer ( YY_BUFFER_STATE b, FILE *file , yyscan_t yyscanner );
-#define YY_FLUSH_BUFFER libconfig_yy_flush_buffer(YY_CURRENT_BUFFER ,yyscanner)
+static void yyensure_buffer_stack ( yyscan_t yyscanner );
+static void yy_load_buffer_state ( yyscan_t yyscanner );
+static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file , yyscan_t yyscanner );
+#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER , yyscanner)
-YY_BUFFER_STATE libconfig_yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner );
-YY_BUFFER_STATE libconfig_yy_scan_string ( const char *yy_str , yyscan_t yyscanner );
-YY_BUFFER_STATE libconfig_yy_scan_bytes ( const char *bytes, int len , yyscan_t yyscanner );
+YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner );
+YY_BUFFER_STATE yy_scan_string ( const char *yy_str , yyscan_t yyscanner );
+YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len , yyscan_t yyscanner );
-void *libconfig_yyalloc ( yy_size_t , yyscan_t yyscanner );
-void *libconfig_yyrealloc ( void *, yy_size_t , yyscan_t yyscanner );
-void libconfig_yyfree ( void * , yyscan_t yyscanner );
+void *yyalloc ( yy_size_t , yyscan_t yyscanner );
+void *yyrealloc ( void *, yy_size_t , yyscan_t yyscanner );
+void yyfree ( void * , yyscan_t yyscanner );
-#define yy_new_buffer libconfig_yy_create_buffer
+#define yy_new_buffer yy_create_buffer
#define yy_set_interactive(is_interactive) \
{ \
if ( ! YY_CURRENT_BUFFER ){ \
- libconfig_yyensure_buffer_stack (yyscanner); \
+ yyensure_buffer_stack (yyscanner); \
YY_CURRENT_BUFFER_LVALUE = \
- libconfig_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \
+ yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \
} \
YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
}
#define yy_set_bol(at_bol) \
{ \
if ( ! YY_CURRENT_BUFFER ){\
- libconfig_yyensure_buffer_stack (yyscanner); \
+ yyensure_buffer_stack (yyscanner); \
YY_CURRENT_BUFFER_LVALUE = \
- libconfig_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \
+ yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \
} \
YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
}
@@ -351,8 +579,8 @@ static void yynoreturn yy_fatal_error ( const char* msg , yyscan_t yyscanner );
yyg->yy_hold_char = *yy_cp; \
*yy_cp = '\0'; \
yyg->yy_c_buf_p = yy_cp;
-#define YY_NUM_RULES 45
-#define YY_END_OF_BUFFER 46
+#define YY_NUM_RULES 49
+#define YY_END_OF_BUFFER 50
/* This struct is not used in this scanner,
but its presence is necessary. */
struct yy_trans_info
@@ -360,22 +588,23 @@ struct yy_trans_info
flex_int32_t yy_verify;
flex_int32_t yy_nxt;
};
-static const flex_int16_t yy_accept[123] =
+static const flex_int16_t yy_accept[134] =
{ 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 46, 44, 25, 24, 24, 5, 44, 40, 41, 37,
- 44, 27, 32, 44, 33, 33, 26, 42, 44, 37,
- 37, 38, 39, 28, 29, 25, 44, 3, 4, 3,
- 6, 15, 14, 20, 23, 45, 17, 45, 25, 0,
- 43, 37, 32, 33, 32, 0, 1, 0, 32, 33,
- 37, 34, 37, 16, 37, 37, 25, 0, 0, 2,
- 6, 12, 0, 11, 10, 7, 8, 9, 20, 22,
- 21, 17, 0, 18, 32, 0, 34, 0, 32, 32,
- 37, 0, 37, 32, 34, 35, 37, 37, 0, 0,
-
- 32, 0, 32, 34, 0, 37, 32, 36, 37, 30,
- 0, 13, 32, 36, 31, 0, 0, 0, 0, 0,
- 19, 0
+ 50, 48, 25, 24, 24, 5, 48, 44, 45, 41,
+ 48, 27, 32, 48, 33, 33, 26, 46, 48, 41,
+ 41, 42, 43, 33, 28, 29, 25, 48, 3, 4,
+ 3, 6, 15, 14, 20, 23, 49, 17, 49, 25,
+ 0, 47, 41, 32, 33, 33, 32, 0, 1, 0,
+ 32, 33, 41, 41, 34, 41, 41, 33, 16, 41,
+ 41, 34, 25, 0, 0, 2, 6, 12, 0, 11,
+ 10, 7, 8, 9, 20, 22, 21, 17, 0, 18,
+ 32, 0, 0, 32, 32, 41, 37, 0, 41, 32,
+
+ 34, 39, 35, 41, 41, 34, 0, 0, 32, 0,
+ 32, 0, 41, 32, 38, 40, 36, 41, 30, 0,
+ 13, 32, 38, 40, 36, 31, 0, 0, 0, 0,
+ 0, 19, 0
} ;
static const YY_CHAR yy_ec[256] =
@@ -384,16 +613,16 @@ static const YY_CHAR yy_ec[256] =
1, 4, 5, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 2, 1, 6, 7, 1, 1, 1, 1, 8,
- 9, 10, 11, 12, 13, 14, 15, 16, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 18, 19, 20,
- 21, 22, 1, 23, 24, 25, 25, 25, 26, 27,
- 28, 28, 28, 28, 28, 29, 28, 28, 28, 28,
- 28, 30, 31, 32, 33, 28, 28, 34, 28, 28,
- 35, 36, 37, 1, 38, 1, 24, 25, 39, 40,
-
- 41, 42, 28, 28, 43, 28, 28, 44, 28, 45,
- 28, 28, 28, 46, 31, 47, 48, 28, 28, 34,
- 28, 28, 49, 1, 50, 1, 1, 1, 1, 1,
+ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+ 18, 18, 18, 18, 18, 19, 19, 20, 21, 22,
+ 23, 24, 1, 25, 26, 27, 28, 28, 29, 30,
+ 31, 31, 31, 31, 31, 32, 31, 31, 33, 31,
+ 31, 34, 35, 36, 37, 31, 31, 38, 31, 31,
+ 39, 40, 41, 1, 42, 1, 26, 27, 43, 44,
+
+ 45, 46, 31, 31, 47, 31, 31, 48, 31, 49,
+ 33, 31, 31, 50, 35, 51, 52, 31, 31, 38,
+ 31, 31, 53, 1, 54, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -410,135 +639,160 @@ static const YY_CHAR yy_ec[256] =
1, 1, 1, 1, 1
} ;
-static const YY_CHAR yy_meta[51] =
+static const YY_CHAR yy_meta[55] =
{ 0,
1, 1, 1, 1, 1, 2, 1, 1, 1, 3,
- 1, 1, 3, 3, 1, 4, 4, 1, 1, 1,
- 1, 1, 1, 4, 4, 4, 4, 3, 3, 3,
- 3, 3, 3, 3, 1, 2, 1, 3, 4, 4,
- 4, 4, 3, 3, 3, 3, 3, 3, 1, 1
+ 1, 1, 3, 3, 1, 4, 4, 4, 4, 1,
+ 1, 1, 1, 1, 1, 4, 4, 4, 4, 4,
+ 3, 3, 3, 3, 3, 3, 3, 3, 1, 2,
+ 1, 3, 4, 4, 4, 4, 3, 3, 3, 3,
+ 3, 3, 1, 1
} ;
-static const flex_int16_t yy_base[134] =
+static const flex_int16_t yy_base[145] =
{ 0,
- 0, 49, 49, 50, 48, 49, 50, 51, 244, 243,
- 248, 251, 245, 251, 251, 251, 243, 251, 251, 0,
- 47, 251, 49, 52, 54, 211, 251, 251, 238, 219,
- 28, 251, 251, 251, 251, 71, 199, 251, 251, 226,
- 0, 251, 63, 0, 251, 70, 234, 217, 236, 234,
- 251, 0, 75, 86, 97, 108, 251, 233, 113, 201,
- 115, 205, 139, 251, 49, 48, 75, 190, 187, 251,
- 0, 251, 0, 251, 251, 251, 251, 251, 0, 251,
- 251, 225, 202, 251, 117, 124, 191, 101, 128, 131,
- 157, 133, 135, 143, 0, 156, 152, 63, 138, 0,
-
- 145, 171, 159, 251, 173, 175, 177, 140, 81, 0,
- 123, 251, 179, 0, 0, 105, 96, 79, 109, 140,
- 251, 251, 196, 200, 204, 208, 212, 214, 218, 222,
- 226, 78, 75
+ 0, 53, 53, 54, 52, 53, 54, 55, 347, 346,
+ 351, 354, 348, 354, 354, 354, 346, 354, 354, 0,
+ 54, 354, 58, 52, 90, 52, 354, 354, 342, 321,
+ 31, 354, 354, 82, 354, 354, 64, 299, 354, 354,
+ 330, 0, 354, 80, 0, 354, 76, 332, 310, 299,
+ 297, 354, 0, 120, 152, 125, 129, 143, 354, 280,
+ 134, 64, 156, 169, 249, 159, 186, 191, 354, 73,
+ 32, 206, 86, 188, 151, 354, 0, 354, 0, 354,
+ 354, 354, 354, 354, 0, 354, 354, 187, 154, 354,
+ 208, 223, 173, 201, 227, 241, 179, 231, 245, 249,
+
+ 0, 253, 132, 120, 154, 354, 97, 0, 257, 271,
+ 261, 275, 280, 287, 102, 101, 95, 177, 0, 77,
+ 354, 291, 0, 0, 0, 0, 63, 69, 67, 108,
+ 249, 354, 354, 310, 314, 318, 322, 326, 328, 332,
+ 336, 340, 79, 76
} ;
-static const flex_int16_t yy_def[134] =
+static const flex_int16_t yy_def[145] =
{ 0,
- 122, 1, 123, 123, 124, 124, 125, 125, 126, 126,
- 122, 122, 122, 122, 122, 122, 127, 122, 122, 128,
- 122, 122, 122, 122, 128, 25, 122, 122, 122, 128,
- 128, 122, 122, 122, 122, 122, 122, 122, 122, 122,
- 129, 122, 122, 130, 122, 122, 131, 131, 122, 127,
- 122, 128, 122, 122, 122, 122, 122, 127, 128, 25,
- 128, 128, 128, 122, 128, 128, 122, 122, 122, 122,
- 129, 122, 132, 122, 122, 122, 122, 122, 130, 122,
- 122, 131, 131, 122, 122, 122, 122, 122, 122, 128,
- 128, 122, 128, 128, 128, 63, 128, 128, 122, 133,
-
- 122, 122, 122, 122, 122, 128, 128, 128, 128, 128,
- 122, 122, 122, 128, 128, 122, 122, 122, 122, 122,
- 122, 0, 122, 122, 122, 122, 122, 122, 122, 122,
- 122, 122, 122
+ 133, 1, 134, 134, 135, 135, 136, 136, 137, 137,
+ 133, 133, 133, 133, 133, 133, 138, 133, 133, 139,
+ 133, 133, 133, 133, 139, 25, 133, 133, 133, 139,
+ 139, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+ 133, 140, 133, 133, 141, 133, 133, 142, 142, 133,
+ 138, 133, 139, 133, 133, 133, 133, 133, 133, 138,
+ 139, 25, 139, 139, 139, 139, 139, 139, 133, 139,
+ 139, 133, 133, 133, 133, 133, 140, 133, 143, 133,
+ 133, 133, 133, 133, 141, 133, 133, 142, 142, 133,
+ 133, 133, 133, 133, 139, 139, 139, 133, 139, 139,
+
+ 139, 139, 67, 139, 139, 133, 133, 144, 133, 133,
+ 133, 133, 139, 139, 139, 139, 139, 139, 139, 133,
+ 133, 133, 139, 139, 139, 139, 133, 133, 133, 133,
+ 133, 133, 0, 133, 133, 133, 133, 133, 133, 133,
+ 133, 133, 133, 133
} ;
-static const flex_int16_t yy_nxt[302] =
+static const flex_int16_t yy_nxt[409] =
{ 0,
12, 13, 14, 15, 15, 16, 17, 18, 19, 20,
- 21, 22, 21, 23, 24, 25, 26, 27, 28, 29,
- 27, 12, 12, 20, 20, 20, 30, 20, 20, 20,
- 20, 31, 20, 20, 32, 12, 33, 12, 20, 20,
- 20, 30, 20, 20, 20, 20, 31, 20, 34, 35,
- 36, 39, 39, 42, 42, 45, 45, 66, 40, 40,
- 53, 57, 54, 54, 55, 55, 58, 59, 72, 60,
- 60, 37, 67, 66, 56, 80, 67, 97, 112, 61,
- 98, 100, 62, 43, 43, 46, 46, 63, 110, 56,
- 55, 55, 97, 68, 61, 98, 73, 68, 74, 85,
-
- 56, 54, 54, 110, 75, 81, 115, 76, 77, 78,
- 120, 86, 55, 55, 87, 56, 89, 89, 88, 119,
- 88, 115, 56, 89, 89, 92, 86, 93, 90, 90,
- 94, 94, 101, 101, 92, 118, 92, 56, 91, 103,
- 103, 120, 102, 89, 89, 121, 90, 90, 103, 103,
- 94, 94, 117, 91, 96, 96, 91, 102, 94, 94,
- 101, 101, 96, 96, 96, 96, 116, 105, 114, 106,
- 102, 91, 107, 107, 103, 103, 111, 96, 96, 96,
- 96, 105, 109, 105, 108, 102, 113, 113, 113, 113,
- 107, 107, 107, 107, 113, 113, 38, 38, 38, 38,
-
- 41, 41, 41, 41, 44, 44, 44, 44, 47, 47,
- 47, 47, 50, 50, 50, 50, 52, 52, 71, 104,
- 71, 71, 79, 122, 79, 79, 82, 82, 82, 82,
- 83, 99, 69, 95, 52, 51, 51, 49, 84, 83,
- 70, 69, 65, 64, 52, 51, 49, 122, 48, 48,
- 11, 122, 122, 122, 122, 122, 122, 122, 122, 122,
- 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
- 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
- 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
- 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-
- 122
+ 21, 22, 21, 23, 24, 25, 26, 26, 26, 27,
+ 28, 29, 27, 12, 12, 20, 20, 20, 20, 30,
+ 20, 20, 20, 20, 20, 31, 20, 20, 32, 12,
+ 33, 34, 20, 20, 20, 30, 20, 20, 20, 20,
+ 31, 20, 35, 36, 37, 40, 40, 43, 43, 46,
+ 46, 59, 41, 41, 71, 73, 60, 54, 105, 55,
+ 55, 55, 55, 57, 57, 57, 57, 38, 53, 121,
+ 71, 86, 108, 105, 53, 78, 58, 73, 74, 53,
+ 53, 44, 44, 47, 47, 56, 53, 56, 56, 56,
+
+ 56, 53, 58, 61, 104, 62, 62, 62, 62, 131,
+ 74, 130, 129, 72, 128, 87, 63, 79, 64, 80,
+ 104, 65, 66, 56, 127, 81, 125, 67, 82, 83,
+ 84, 68, 124, 123, 64, 57, 57, 57, 57, 120,
+ 56, 56, 56, 56, 57, 57, 57, 57, 58, 95,
+ 95, 95, 95, 93, 118, 93, 72, 58, 94, 94,
+ 94, 94, 96, 117, 58, 91, 56, 55, 55, 55,
+ 55, 97, 97, 58, 102, 102, 102, 133, 96, 98,
+ 92, 99, 119, 72, 100, 100, 100, 100, 94, 94,
+ 94, 94, 89, 56, 97, 97, 92, 97, 119, 107,
+
+ 102, 103, 103, 103, 103, 126, 68, 68, 68, 68,
+ 115, 103, 103, 103, 103, 103, 94, 94, 94, 94,
+ 97, 126, 65, 109, 109, 109, 109, 103, 103, 103,
+ 103, 103, 68, 98, 75, 98, 110, 106, 111, 111,
+ 111, 111, 95, 95, 95, 95, 111, 111, 111, 111,
+ 131, 112, 110, 113, 132, 96, 114, 114, 114, 114,
+ 100, 100, 100, 100, 100, 100, 100, 100, 102, 102,
+ 102, 96, 109, 109, 109, 109, 111, 111, 111, 111,
+ 101, 112, 52, 112, 116, 110, 122, 122, 122, 122,
+ 122, 122, 122, 122, 102, 114, 114, 114, 114, 52,
+
+ 50, 110, 114, 114, 114, 114, 122, 122, 122, 122,
+ 39, 39, 39, 39, 42, 42, 42, 42, 45, 45,
+ 45, 45, 48, 48, 48, 48, 51, 51, 51, 51,
+ 53, 53, 77, 90, 77, 77, 85, 89, 85, 85,
+ 88, 88, 88, 88, 76, 75, 70, 69, 52, 50,
+ 133, 49, 49, 11, 133, 133, 133, 133, 133, 133,
+ 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+ 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+ 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+ 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+
+ 133, 133, 133, 133, 133, 133, 133, 133
} ;
-static const flex_int16_t yy_chk[302] =
+static const flex_int16_t yy_chk[409] =
{ 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 2, 3, 4, 5, 6, 7, 8, 31, 3, 4,
- 21, 24, 21, 21, 23, 23, 24, 25, 43, 25,
- 25, 2, 36, 31, 23, 46, 67, 65, 133, 25,
- 66, 132, 25, 5, 6, 7, 8, 25, 98, 23,
- 53, 53, 65, 36, 25, 66, 43, 67, 43, 54,
-
- 53, 54, 54, 98, 43, 46, 109, 43, 43, 43,
- 119, 54, 55, 55, 54, 53, 88, 88, 56, 118,
- 56, 109, 55, 56, 56, 61, 54, 61, 59, 59,
- 61, 61, 85, 85, 86, 117, 86, 55, 59, 86,
- 86, 120, 85, 89, 89, 120, 90, 90, 92, 92,
- 93, 93, 116, 59, 63, 63, 90, 85, 94, 94,
- 101, 101, 63, 63, 63, 63, 111, 91, 108, 91,
- 101, 90, 91, 91, 103, 103, 99, 63, 63, 63,
- 63, 102, 97, 102, 96, 101, 102, 102, 105, 105,
- 106, 106, 107, 107, 113, 113, 123, 123, 123, 123,
-
- 124, 124, 124, 124, 125, 125, 125, 125, 126, 126,
- 126, 126, 127, 127, 127, 127, 128, 128, 129, 87,
- 129, 129, 130, 83, 130, 130, 131, 131, 131, 131,
- 82, 69, 68, 62, 60, 58, 50, 49, 48, 47,
- 40, 37, 30, 29, 26, 17, 13, 11, 10, 9,
- 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
- 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
- 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
- 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
- 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-
- 122
+ 1, 1, 1, 1, 2, 3, 4, 5, 6, 7,
+ 8, 24, 3, 4, 31, 37, 24, 21, 71, 21,
+ 21, 21, 21, 23, 23, 23, 23, 2, 26, 144,
+ 31, 47, 143, 71, 26, 44, 23, 73, 37, 26,
+ 62, 5, 6, 7, 8, 21, 62, 34, 34, 34,
+
+ 34, 62, 23, 25, 70, 25, 25, 25, 25, 130,
+ 73, 129, 128, 34, 127, 47, 25, 44, 25, 44,
+ 70, 25, 25, 34, 120, 44, 117, 25, 44, 44,
+ 44, 25, 116, 115, 25, 54, 54, 54, 54, 107,
+ 56, 56, 56, 56, 57, 57, 57, 57, 54, 61,
+ 61, 61, 61, 58, 104, 58, 56, 57, 58, 58,
+ 58, 58, 61, 103, 54, 55, 56, 55, 55, 55,
+ 55, 63, 63, 57, 66, 66, 66, 89, 61, 64,
+ 55, 64, 105, 55, 64, 64, 64, 64, 93, 93,
+ 93, 93, 88, 55, 97, 97, 55, 63, 105, 75,
+
+ 66, 67, 67, 67, 67, 118, 68, 68, 68, 68,
+ 97, 67, 67, 67, 67, 67, 94, 94, 94, 94,
+ 97, 118, 68, 91, 91, 91, 91, 67, 67, 67,
+ 67, 67, 68, 92, 74, 92, 91, 72, 92, 92,
+ 92, 92, 95, 95, 95, 95, 98, 98, 98, 98,
+ 131, 96, 91, 96, 131, 95, 96, 96, 96, 96,
+ 99, 99, 99, 99, 100, 100, 100, 100, 102, 102,
+ 102, 95, 109, 109, 109, 109, 111, 111, 111, 111,
+ 65, 110, 60, 110, 102, 109, 110, 110, 110, 110,
+ 112, 112, 112, 112, 102, 113, 113, 113, 113, 51,
+
+ 50, 109, 114, 114, 114, 114, 122, 122, 122, 122,
+ 134, 134, 134, 134, 135, 135, 135, 135, 136, 136,
+ 136, 136, 137, 137, 137, 137, 138, 138, 138, 138,
+ 139, 139, 140, 49, 140, 140, 141, 48, 141, 141,
+ 142, 142, 142, 142, 41, 38, 30, 29, 17, 13,
+ 11, 10, 9, 133, 133, 133, 133, 133, 133, 133,
+ 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+ 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+ 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+ 133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
+
+ 133, 133, 133, 133, 133, 133, 133, 133
} ;
/* Table of booleans, true if rule could match eol. */
-static const flex_int32_t yy_rule_can_match_eol[46] =
+static const flex_int32_t yy_rule_can_match_eol[50] =
{ 0,
0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, };
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
/* The intent behind this definition is that it'll catch
* any uses of REJECT which flex missed.
@@ -589,43 +843,108 @@ static const flex_int32_t yy_rule_can_match_eol[46] =
#define YY_NO_INPUT // Suppress generation of useless input() function
-static unsigned long long fromhex(const char *s)
+/**
+ * converts a hexadecimal number literal to an ull integer
+ *
+ * @param p - a pointer to the hexacimal expression to parse
+ * @returns the resulting unsigned long long integer
+ */
+static unsigned long long fromhex(const char *p)
{
-#ifdef __MINGW32__
+ unsigned long long val = 0;
- /* MinGW's strtoull() seems to be broken; it only returns the lower
- * 32 bits...
- */
+ if (*p != '0' || (p[1] != 'x' && p[1] != 'X')) {
+ return 0;
+ }
- const char *p = s;
+ for (p += 2; isxdigit(*p) || *p == '_'; ++p) {
+ if (*p != '_') {
+ val <<= 4;
+ val |= ((*p < 'A') ? (*p & 0xF) : (9 + (*p & 0x7)));
+ }
+ }
+
+ return val;
+}
+
+/**
+ * converts a binary number literal to an ull integer
+ *
+ * @param p - a pointer to the hexacimal expression to parse
+ * @returns the resulting unsigned long long integer
+ */
+static unsigned long long frombin (const char *p)
+{
unsigned long long val = 0;
- if(*p != '0')
- return(0);
+ if (*p != '0' || (p[1] != 'b' && p[1] != 'B')) {
+ return 0;
+ }
+
+ for (p += 2; *p == '0' || *p == '1' || *p == '_'; ++p) {
+ if (*p != '_') {
+ val <<= 1;
+ val |= (*p == '0') ? 0 : 1;
+ }
+ }
+
+ return val;
+}
- ++p;
+/**
+ * converts an octal number literal to an ull integer
+ *
+ * @param p - a pointer to the hexacimal expression to parse
+ * @returns the resulting unsigned long long integer
+ */
+static unsigned long long fromoct (const char *p)
+{
+ unsigned long long val = 0;
- if(*p != 'x' && *p != 'X')
- return(0);
+ if (*p != '0' || (p[1] != 'o' && p[1] != 'O')) {
+ return 0;
+ }
- for(++p; isxdigit(*p); ++p)
- {
- val <<= 4;
- val |= ((*p < 'A') ? (*p & 0xF) : (9 + (*p & 0x7)));
+ for (p += 2; (*p >= '0' && *p <= '7') || *p == '_'; ++p) {
+ if (*p != '_') {
+ val <<= 3;
+ val |= (*p & 0xF);
+ }
}
- return(val);
+ return val;
+}
-#else /* ! __MINGW32__ */
+/**
+ * converts a decimal number literal to a ll integer
+ *
+ * @param p - a pointer to the hexacimal expression to parse
+ * @returns the resulting signed long long integer
+ */
+static long long fromdec (const char *p)
+{
+ unsigned char is_neg = 0;
+
+ if (*p == '-') {
+ is_neg = 1;
+ p++;
+ }
- return(strtoull(s, NULL, 16));
+ long long val = 0;
-#endif /* __MINGW32__ */
+ for (; isdigit(*p) || *p == '_'; ++p) {
+ if (*p != '_') {
+ val *= 10;
+ val += (*p & 0xF);
+ }
+ }
+
+ return (is_neg == 1) ? -val : val;
}
-#line 625 "scanner.c"
+#line 945 "scanner.c"
-#line 627 "scanner.c"
+#line 947 "scanner.c"
#define INITIAL 0
#define COMMENT 1
@@ -677,46 +996,46 @@ static int yy_init_globals ( yyscan_t yyscanner );
* from bison output in section 1.*/
# define yylval yyg->yylval_r
-int libconfig_yylex_init (yyscan_t* scanner);
+int yylex_init (yyscan_t* scanner);
-int libconfig_yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t* scanner);
+int yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t* scanner);
/* Accessor methods to globals.
These are made visible to non-reentrant scanners for convenience. */
-int libconfig_yylex_destroy ( yyscan_t yyscanner );
+int yylex_destroy ( yyscan_t yyscanner );
-int libconfig_yyget_debug ( yyscan_t yyscanner );
+int yyget_debug ( yyscan_t yyscanner );
-void libconfig_yyset_debug ( int debug_flag , yyscan_t yyscanner );
+void yyset_debug ( int debug_flag , yyscan_t yyscanner );
-YY_EXTRA_TYPE libconfig_yyget_extra ( yyscan_t yyscanner );
+YY_EXTRA_TYPE yyget_extra ( yyscan_t yyscanner );
-void libconfig_yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t yyscanner );
+void yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t yyscanner );
-FILE *libconfig_yyget_in ( yyscan_t yyscanner );
+FILE *yyget_in ( yyscan_t yyscanner );
-void libconfig_yyset_in ( FILE * _in_str , yyscan_t yyscanner );
+void yyset_in ( FILE * _in_str , yyscan_t yyscanner );
-FILE *libconfig_yyget_out ( yyscan_t yyscanner );
+FILE *yyget_out ( yyscan_t yyscanner );
-void libconfig_yyset_out ( FILE * _out_str , yyscan_t yyscanner );
+void yyset_out ( FILE * _out_str , yyscan_t yyscanner );
- int libconfig_yyget_leng ( yyscan_t yyscanner );
+ int yyget_leng ( yyscan_t yyscanner );
-char *libconfig_yyget_text ( yyscan_t yyscanner );
+char *yyget_text ( yyscan_t yyscanner );
-int libconfig_yyget_lineno ( yyscan_t yyscanner );
+int yyget_lineno ( yyscan_t yyscanner );
-void libconfig_yyset_lineno ( int _line_number , yyscan_t yyscanner );
+void yyset_lineno ( int _line_number , yyscan_t yyscanner );
-int libconfig_yyget_column ( yyscan_t yyscanner );
+int yyget_column ( yyscan_t yyscanner );
-void libconfig_yyset_column ( int _column_no , yyscan_t yyscanner );
+void yyset_column ( int _column_no , yyscan_t yyscanner );
-YYSTYPE * libconfig_yyget_lval ( yyscan_t yyscanner );
+YYSTYPE * yyget_lval ( yyscan_t yyscanner );
-void libconfig_yyset_lval ( YYSTYPE * yylval_param , yyscan_t yyscanner );
+void yyset_lval ( YYSTYPE * yylval_param , yyscan_t yyscanner );
/* Macros after this point can all be overridden by user definitions in
* section 1.
@@ -724,9 +1043,9 @@ void libconfig_yyset_lval ( YYSTYPE * yylval_param , yyscan_t yyscanner );
#ifndef YY_SKIP_YYWRAP
#ifdef __cplusplus
-extern "C" int libconfig_yywrap ( yyscan_t yyscanner );
+extern "C" int yywrap ( yyscan_t yyscanner );
#else
-extern int libconfig_yywrap ( yyscan_t yyscanner );
+extern int yywrap ( yyscan_t yyscanner );
#endif
#endif
@@ -831,10 +1150,10 @@ static int input ( yyscan_t yyscanner );
#ifndef YY_DECL
#define YY_DECL_IS_OURS 1
-extern int libconfig_yylex \
+extern int yylex \
(YYSTYPE * yylval_param , yyscan_t yyscanner);
-#define YY_DECL int libconfig_yylex \
+#define YY_DECL int yylex \
(YYSTYPE * yylval_param , yyscan_t yyscanner)
#endif /* !YY_DECL */
@@ -885,19 +1204,19 @@ YY_DECL
yyout = stdout;
if ( ! YY_CURRENT_BUFFER ) {
- libconfig_yyensure_buffer_stack (yyscanner);
+ yyensure_buffer_stack (yyscanner);
YY_CURRENT_BUFFER_LVALUE =
- libconfig_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner);
+ yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner);
}
- libconfig_yy_load_buffer_state(yyscanner );
+ yy_load_buffer_state( yyscanner );
}
{
-#line 103 "scanner.l"
+#line 172 "scanner.l"
-#line 899 "scanner.c"
+#line 1219 "scanner.c"
while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
{
@@ -925,13 +1244,13 @@ yy_match:
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 123 )
+ if ( yy_current_state >= 134 )
yy_c = yy_meta[yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
++yy_cp;
}
- while ( yy_current_state != 122 );
+ while ( yy_current_state != 133 );
yy_cp = yyg->yy_last_accepting_cpos;
yy_current_state = yyg->yy_last_accepting_state;
@@ -945,7 +1264,7 @@ yy_find_action:
int yyl;
for ( yyl = 0; yyl < yyleng; ++yyl )
if ( yytext[yyl] == '\n' )
-
+
do{ yylineno++;
yycolumn=0;
}while(0)
@@ -965,69 +1284,69 @@ do_action: /* This label is used only to access EOF actions. */
case 1:
YY_RULE_SETUP
-#line 105 "scanner.l"
+#line 174 "scanner.l"
{ BEGIN COMMENT; }
YY_BREAK
case 2:
YY_RULE_SETUP
-#line 106 "scanner.l"
+#line 175 "scanner.l"
{ BEGIN INITIAL; }
YY_BREAK
case 3:
YY_RULE_SETUP
-#line 107 "scanner.l"
+#line 176 "scanner.l"
{ /* ignore */ }
YY_BREAK
case 4:
/* rule 4 can match eol */
YY_RULE_SETUP
-#line 108 "scanner.l"
+#line 177 "scanner.l"
{ /* ignore */ }
YY_BREAK
case 5:
YY_RULE_SETUP
-#line 110 "scanner.l"
+#line 179 "scanner.l"
{ BEGIN STRING; }
YY_BREAK
case 6:
/* rule 6 can match eol */
YY_RULE_SETUP
-#line 111 "scanner.l"
+#line 180 "scanner.l"
{ scanctx_append_string(yyextra, yytext); }
YY_BREAK
case 7:
YY_RULE_SETUP
-#line 112 "scanner.l"
+#line 181 "scanner.l"
{ scanctx_append_string(yyextra, "\n"); }
YY_BREAK
case 8:
YY_RULE_SETUP
-#line 113 "scanner.l"
+#line 182 "scanner.l"
{ scanctx_append_string(yyextra, "\r"); }
YY_BREAK
case 9:
YY_RULE_SETUP
-#line 114 "scanner.l"
+#line 183 "scanner.l"
{ scanctx_append_string(yyextra, "\t"); }
YY_BREAK
case 10:
YY_RULE_SETUP
-#line 115 "scanner.l"
+#line 184 "scanner.l"
{ scanctx_append_string(yyextra, "\f"); }
YY_BREAK
case 11:
YY_RULE_SETUP
-#line 116 "scanner.l"
+#line 185 "scanner.l"
{ scanctx_append_string(yyextra, "\\"); }
YY_BREAK
case 12:
YY_RULE_SETUP
-#line 117 "scanner.l"
+#line 186 "scanner.l"
{ scanctx_append_string(yyextra, "\""); }
YY_BREAK
case 13:
YY_RULE_SETUP
-#line 118 "scanner.l"
+#line 187 "scanner.l"
{
char c[2] = { (char)(strtol(yytext + 2, NULL, 16) & 0xFF),
0 };
@@ -1036,12 +1355,12 @@ YY_RULE_SETUP
YY_BREAK
case 14:
YY_RULE_SETUP
-#line 123 "scanner.l"
+#line 192 "scanner.l"
{ scanctx_append_string(yyextra, "\\"); }
YY_BREAK
case 15:
YY_RULE_SETUP
-#line 124 "scanner.l"
+#line 193 "scanner.l"
{
yylval->sval = scanctx_take_string(yyextra);
BEGIN INITIAL;
@@ -1050,18 +1369,18 @@ YY_RULE_SETUP
YY_BREAK
case 16:
YY_RULE_SETUP
-#line 130 "scanner.l"
+#line 199 "scanner.l"
{ BEGIN SCRIPTBLOCK; }
YY_BREAK
case 17:
/* rule 17 can match eol */
YY_RULE_SETUP
-#line 131 "scanner.l"
+#line 200 "scanner.l"
{ scanctx_append_string(yyextra, yytext); }
YY_BREAK
case 18:
YY_RULE_SETUP
-#line 132 "scanner.l"
+#line 201 "scanner.l"
{
yylval->sval = scanctx_take_string(yyextra);
BEGIN INITIAL;
@@ -1070,28 +1389,28 @@ YY_RULE_SETUP
YY_BREAK
case 19:
YY_RULE_SETUP
-#line 138 "scanner.l"
+#line 207 "scanner.l"
{ BEGIN INCLUDE; }
YY_BREAK
case 20:
/* rule 20 can match eol */
YY_RULE_SETUP
-#line 139 "scanner.l"
+#line 208 "scanner.l"
{ scanctx_append_string(yyextra, yytext); }
YY_BREAK
case 21:
YY_RULE_SETUP
-#line 140 "scanner.l"
+#line 209 "scanner.l"
{ scanctx_append_string(yyextra, "\\"); }
YY_BREAK
case 22:
YY_RULE_SETUP
-#line 141 "scanner.l"
+#line 210 "scanner.l"
{ scanctx_append_string(yyextra, "\""); }
YY_BREAK
case 23:
YY_RULE_SETUP
-#line 142 "scanner.l"
+#line 211 "scanner.l"
{
const char *error;
FILE *fp = scanctx_push_include(yyextra,
@@ -1100,8 +1419,8 @@ YY_RULE_SETUP
if(fp)
{
yyin = fp;
- libconfig_yy_switch_to_buffer(
- libconfig_yy_create_buffer(yyin, YY_BUF_SIZE, yyscanner),
+ yy_switch_to_buffer(
+ yy_create_buffer(yyin, YY_BUF_SIZE, yyscanner),
yyscanner);
}
else
@@ -1119,129 +1438,130 @@ YY_RULE_SETUP
case 24:
/* rule 24 can match eol */
YY_RULE_SETUP
-#line 166 "scanner.l"
+#line 235 "scanner.l"
{ /* ignore */ }
YY_BREAK
case 25:
YY_RULE_SETUP
-#line 167 "scanner.l"
+#line 236 "scanner.l"
{ /* ignore */ }
YY_BREAK
case 26:
YY_RULE_SETUP
-#line 169 "scanner.l"
+#line 238 "scanner.l"
{ return(TOK_EQUALS); }
YY_BREAK
case 27:
YY_RULE_SETUP
-#line 170 "scanner.l"
+#line 239 "scanner.l"
{ return(TOK_COMMA); }
YY_BREAK
case 28:
YY_RULE_SETUP
-#line 171 "scanner.l"
+#line 240 "scanner.l"
{ return(TOK_GROUP_START); }
YY_BREAK
case 29:
YY_RULE_SETUP
-#line 172 "scanner.l"
+#line 241 "scanner.l"
{ return(TOK_GROUP_END); }
YY_BREAK
case 30:
YY_RULE_SETUP
-#line 173 "scanner.l"
+#line 242 "scanner.l"
{ yylval->ival = 1; return(TOK_BOOLEAN); }
YY_BREAK
case 31:
YY_RULE_SETUP
-#line 174 "scanner.l"
+#line 243 "scanner.l"
{ yylval->ival = 0; return(TOK_BOOLEAN); }
YY_BREAK
case 32:
YY_RULE_SETUP
-#line 175 "scanner.l"
+#line 244 "scanner.l"
{ yylval->fval = atof(yytext); return(TOK_FLOAT); }
YY_BREAK
case 33:
YY_RULE_SETUP
-#line 176 "scanner.l"
-{
- long long llval;
- llval = atoll(yytext);
- if((llval < INT_MIN) || (llval > INT_MAX))
- {
- yylval->llval = llval;
- return(TOK_INTEGER64);
- }
- else
- {
- yylval->ival = (int)llval;
- return(TOK_INTEGER);
- }
- }
+#line 245 "scanner.l"
+{ yylval->ival = (int)fromdec(yytext); return TOK_INTEGER; }
YY_BREAK
case 34:
YY_RULE_SETUP
-#line 190 "scanner.l"
-{ yylval->llval = atoll(yytext); return(TOK_INTEGER64); }
+#line 246 "scanner.l"
+{ yylval->llval = fromdec(yytext); return TOK_INTEGER64; }
YY_BREAK
case 35:
YY_RULE_SETUP
-#line 191 "scanner.l"
-{
- unsigned long ulval = strtoul(yytext, NULL, 16);
- if (ulval > INT32_MAX)
- ulval &= INT32_MAX;
- yylval->ival = (int)ulval;
- return(TOK_HEX);
- }
+#line 247 "scanner.l"
+{ yylval->ival = (int)fromhex(yytext); return TOK_HEX; }
YY_BREAK
case 36:
YY_RULE_SETUP
-#line 198 "scanner.l"
-{ yylval->llval = fromhex(yytext); return(TOK_HEX64); }
+#line 248 "scanner.l"
+{ yylval->llval = fromhex(yytext); return TOK_HEX64; }
YY_BREAK
case 37:
YY_RULE_SETUP
-#line 199 "scanner.l"
-{ yylval->sval = yytext; return(TOK_NAME); }
+#line 249 "scanner.l"
+{ yylval->ival = (int)frombin(yytext); return TOK_BIN; }
YY_BREAK
case 38:
YY_RULE_SETUP
-#line 200 "scanner.l"
-{ return(TOK_ARRAY_START); }
+#line 250 "scanner.l"
+{ yylval->llval = frombin(yytext); return TOK_BIN64; }
YY_BREAK
case 39:
YY_RULE_SETUP
-#line 201 "scanner.l"
-{ return(TOK_ARRAY_END); }
+#line 251 "scanner.l"
+{ yylval->ival = (int)fromoct(yytext); return TOK_OCT; }
YY_BREAK
case 40:
YY_RULE_SETUP
-#line 202 "scanner.l"
-{ return(TOK_LIST_START); }
+#line 252 "scanner.l"
+{ yylval->llval = fromoct(yytext); return TOK_OCT64; }
YY_BREAK
case 41:
YY_RULE_SETUP
-#line 203 "scanner.l"
-{ return(TOK_LIST_END); }
+#line 253 "scanner.l"
+{ yylval->sval = yytext; return(TOK_NAME); }
YY_BREAK
case 42:
YY_RULE_SETUP
-#line 204 "scanner.l"
-{ return(TOK_SEMICOLON); }
+#line 254 "scanner.l"
+{ return(TOK_ARRAY_START); }
YY_BREAK
case 43:
+YY_RULE_SETUP
+#line 255 "scanner.l"
+{ return(TOK_ARRAY_END); }
+ YY_BREAK
+case 44:
+YY_RULE_SETUP
+#line 256 "scanner.l"
+{ return(TOK_LIST_START); }
+ YY_BREAK
+case 45:
+YY_RULE_SETUP
+#line 257 "scanner.l"
+{ return(TOK_LIST_END); }
+ YY_BREAK
+case 46:
+YY_RULE_SETUP
+#line 258 "scanner.l"
+{ return(TOK_SEMICOLON); }
+ YY_BREAK
+case 47:
*yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */
yyg->yy_c_buf_p = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 205 "scanner.l"
+#line 259 "scanner.l"
{ /* ignore */ }
YY_BREAK
-case 44:
+case 48:
YY_RULE_SETUP
-#line 206 "scanner.l"
+#line 260 "scanner.l"
{ return(TOK_GARBAGE); }
YY_BREAK
case YY_STATE_EOF(INITIAL):
@@ -1249,25 +1569,25 @@ case YY_STATE_EOF(COMMENT):
case YY_STATE_EOF(STRING):
case YY_STATE_EOF(INCLUDE):
case YY_STATE_EOF(SCRIPTBLOCK):
-#line 208 "scanner.l"
+#line 262 "scanner.l"
{
YY_BUFFER_STATE buf = (YY_BUFFER_STATE)scanctx_pop_include(
yyextra);
if(buf)
{
- libconfig_yy_delete_buffer(YY_CURRENT_BUFFER, yyscanner);
- libconfig_yy_switch_to_buffer(buf, yyscanner);
+ yy_delete_buffer(YY_CURRENT_BUFFER, yyscanner);
+ yy_switch_to_buffer(buf, yyscanner);
}
else
yyterminate();
}
YY_BREAK
-case 45:
+case 49:
YY_RULE_SETUP
-#line 219 "scanner.l"
+#line 273 "scanner.l"
ECHO;
YY_BREAK
-#line 1269 "scanner.c"
+#line 1590 "scanner.c"
case YY_END_OF_BUFFER:
{
@@ -1283,7 +1603,7 @@ ECHO;
/* We're scanning a new file or input source. It's
* possible that this happened because the user
* just pointed yyin at a new source and called
- * libconfig_yylex(). If so, then we have to assure
+ * yylex(). If so, then we have to assure
* consistency between YY_CURRENT_BUFFER and our
* globals. Here is the right place to do so, because
* this is the first action (other than possibly a
@@ -1344,7 +1664,7 @@ ECHO;
{
yyg->yy_did_buffer_switch_on_eof = 0;
- if ( libconfig_yywrap(yyscanner ) )
+ if ( yywrap( yyscanner ) )
{
/* Note: because we've taken care in
* yy_get_next_buffer() to have set up
@@ -1398,7 +1718,7 @@ ECHO;
} /* end of action switch */
} /* end of scanning one token */
} /* end of user's declarations */
-} /* end of libconfig_yylex */
+} /* end of yylex */
/* yy_get_next_buffer - try to read in a new buffer
*
@@ -1477,7 +1797,8 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
b->yy_ch_buf = (char *)
/* Include room in for 2 EOB chars. */
- libconfig_yyrealloc((void *) b->yy_ch_buf,(yy_size_t) (b->yy_buf_size + 2) ,yyscanner );
+ yyrealloc( (void *) b->yy_ch_buf,
+ (yy_size_t) (b->yy_buf_size + 2) , yyscanner );
}
else
/* Can't grow it, we don't own it. */
@@ -1509,7 +1830,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
if ( number_to_move == YY_MORE_ADJ )
{
ret_val = EOB_ACT_END_OF_FILE;
- libconfig_yyrestart(yyin ,yyscanner);
+ yyrestart( yyin , yyscanner);
}
else
@@ -1526,9 +1847,12 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
if ((yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
/* Extend the array by 50%, plus the number we really need. */
int new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1);
- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) libconfig_yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,(yy_size_t) new_size ,yyscanner );
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc(
+ (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size , yyscanner );
if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+ /* "- 2" to take care of EOB's */
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2);
}
yyg->yy_n_chars += number_to_move;
@@ -1562,7 +1886,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 123 )
+ if ( yy_current_state >= 134 )
yy_c = yy_meta[yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
@@ -1591,11 +1915,11 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 123 )
+ if ( yy_current_state >= 134 )
yy_c = yy_meta[yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
- yy_is_jam = (yy_current_state == 122);
+ yy_is_jam = (yy_current_state == 133);
(void)yyg;
return yy_is_jam ? 0 : yy_current_state;
@@ -1647,13 +1971,13 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
*/
/* Reset buffer status. */
- libconfig_yyrestart(yyin ,yyscanner);
+ yyrestart( yyin , yyscanner);
/*FALLTHROUGH*/
case EOB_ACT_END_OF_FILE:
{
- if ( libconfig_yywrap(yyscanner ) )
+ if ( yywrap( yyscanner ) )
return 0;
if ( ! yyg->yy_did_buffer_switch_on_eof )
@@ -1678,7 +2002,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n');
if ( YY_CURRENT_BUFFER_LVALUE->yy_at_bol )
-
+
do{ yylineno++;
yycolumn=0;
}while(0)
@@ -1693,36 +2017,36 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
* @param yyscanner The scanner object.
* @note This function does not reset the start condition to @c INITIAL .
*/
- void libconfig_yyrestart (FILE * input_file , yyscan_t yyscanner)
+ void yyrestart (FILE * input_file , yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
if ( ! YY_CURRENT_BUFFER ){
- libconfig_yyensure_buffer_stack (yyscanner);
+ yyensure_buffer_stack (yyscanner);
YY_CURRENT_BUFFER_LVALUE =
- libconfig_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner);
+ yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner);
}
assert(YY_CURRENT_BUFFER != NULL); // Fixes compiler warning -Wnull-dereference on gcc-6 and -O3
- libconfig_yy_init_buffer(YY_CURRENT_BUFFER,input_file ,yyscanner);
- libconfig_yy_load_buffer_state(yyscanner );
+ yy_init_buffer( YY_CURRENT_BUFFER, input_file , yyscanner);
+ yy_load_buffer_state( yyscanner );
}
/** Switch to a different input buffer.
* @param new_buffer The new input buffer.
* @param yyscanner The scanner object.
*/
- void libconfig_yy_switch_to_buffer (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
+ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
/* TODO. We should be able to replace this entire function body
* with
- * libconfig_yypop_buffer_state();
- * libconfig_yypush_buffer_state(new_buffer);
+ * yypop_buffer_state();
+ * yypush_buffer_state(new_buffer);
*/
- libconfig_yyensure_buffer_stack (yyscanner);
+ yyensure_buffer_stack (yyscanner);
if ( YY_CURRENT_BUFFER == new_buffer )
return;
@@ -1735,17 +2059,17 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
}
YY_CURRENT_BUFFER_LVALUE = new_buffer;
- libconfig_yy_load_buffer_state(yyscanner );
+ yy_load_buffer_state( yyscanner );
/* We don't actually know whether we did this switch during
- * EOF (libconfig_yywrap()) processing, but the only time this flag
- * is looked at is after libconfig_yywrap() is called, so it's safe
+ * EOF (yywrap()) processing, but the only time this flag
+ * is looked at is after yywrap() is called, so it's safe
* to go ahead and always set it.
*/
yyg->yy_did_buffer_switch_on_eof = 1;
}
-static void libconfig_yy_load_buffer_state (yyscan_t yyscanner)
+static void yy_load_buffer_state (yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
@@ -1760,35 +2084,35 @@ static void libconfig_yy_load_buffer_state (yyscan_t yyscanner)
* @param yyscanner The scanner object.
* @return the allocated buffer state.
*/
- YY_BUFFER_STATE libconfig_yy_create_buffer (FILE * file, int size , yyscan_t yyscanner)
+ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size , yyscan_t yyscanner)
{
YY_BUFFER_STATE b;
- b = (YY_BUFFER_STATE) libconfig_yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner );
+ b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner );
if ( ! b )
- YY_FATAL_ERROR( "out of dynamic memory in libconfig_yy_create_buffer()" );
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
b->yy_buf_size = size;
/* yy_ch_buf has to be 2 characters longer than the size given because
* we need to put in 2 end-of-buffer characters.
*/
- b->yy_ch_buf = (char *) libconfig_yyalloc((yy_size_t) (b->yy_buf_size + 2) ,yyscanner );
+ b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) , yyscanner );
if ( ! b->yy_ch_buf )
- YY_FATAL_ERROR( "out of dynamic memory in libconfig_yy_create_buffer()" );
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
b->yy_is_our_buffer = 1;
- libconfig_yy_init_buffer(b,file ,yyscanner);
+ yy_init_buffer( b, file , yyscanner);
return b;
}
/** Destroy the buffer.
- * @param b a buffer created with libconfig_yy_create_buffer()
+ * @param b a buffer created with yy_create_buffer()
* @param yyscanner The scanner object.
*/
- void libconfig_yy_delete_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner)
+ void yy_delete_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
@@ -1799,28 +2123,28 @@ static void libconfig_yy_load_buffer_state (yyscan_t yyscanner)
YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
if ( b->yy_is_our_buffer )
- libconfig_yyfree((void *) b->yy_ch_buf ,yyscanner );
+ yyfree( (void *) b->yy_ch_buf , yyscanner );
- libconfig_yyfree((void *) b ,yyscanner );
+ yyfree( (void *) b , yyscanner );
}
/* Initializes or reinitializes a buffer.
* This function is sometimes called more than once on the same buffer,
- * such as during a libconfig_yyrestart() or at EOF.
+ * such as during a yyrestart() or at EOF.
*/
- static void libconfig_yy_init_buffer (YY_BUFFER_STATE b, FILE * file , yyscan_t yyscanner)
+ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file , yyscan_t yyscanner)
{
int oerrno = errno;
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
- libconfig_yy_flush_buffer(b ,yyscanner);
+ yy_flush_buffer( b , yyscanner);
b->yy_input_file = file;
b->yy_fill_buffer = 1;
- /* If b is the current buffer, then libconfig_yy_init_buffer was _probably_
- * called from libconfig_yyrestart() or through yy_get_next_buffer.
+ /* If b is the current buffer, then yy_init_buffer was _probably_
+ * called from yyrestart() or through yy_get_next_buffer.
* In that case, we don't want to reset the lineno or column.
*/
if (b != YY_CURRENT_BUFFER){
@@ -1837,7 +2161,7 @@ static void libconfig_yy_load_buffer_state (yyscan_t yyscanner)
* @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
* @param yyscanner The scanner object.
*/
- void libconfig_yy_flush_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner)
+ void yy_flush_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
if ( ! b )
@@ -1858,7 +2182,7 @@ static void libconfig_yy_load_buffer_state (yyscan_t yyscanner)
b->yy_buffer_status = YY_BUFFER_NEW;
if ( b == YY_CURRENT_BUFFER )
- libconfig_yy_load_buffer_state(yyscanner );
+ yy_load_buffer_state( yyscanner );
}
/** Pushes the new state onto the stack. The new state becomes
@@ -1867,15 +2191,15 @@ static void libconfig_yy_load_buffer_state (yyscan_t yyscanner)
* @param new_buffer The new state.
* @param yyscanner The scanner object.
*/
-void libconfig_yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
+void yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
if (new_buffer == NULL)
return;
- libconfig_yyensure_buffer_stack(yyscanner);
+ yyensure_buffer_stack(yyscanner);
- /* This block is copied from libconfig_yy_switch_to_buffer. */
+ /* This block is copied from yy_switch_to_buffer. */
if ( YY_CURRENT_BUFFER )
{
/* Flush out information for old buffer. */
@@ -1889,8 +2213,8 @@ void libconfig_yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscan
yyg->yy_buffer_stack_top++;
YY_CURRENT_BUFFER_LVALUE = new_buffer;
- /* copied from libconfig_yy_switch_to_buffer. */
- libconfig_yy_load_buffer_state(yyscanner );
+ /* copied from yy_switch_to_buffer. */
+ yy_load_buffer_state( yyscanner );
yyg->yy_did_buffer_switch_on_eof = 1;
}
@@ -1898,19 +2222,19 @@ void libconfig_yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscan
* The next element becomes the new top.
* @param yyscanner The scanner object.
*/
-void libconfig_yypop_buffer_state (yyscan_t yyscanner)
+void yypop_buffer_state (yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
if (!YY_CURRENT_BUFFER)
return;
- libconfig_yy_delete_buffer(YY_CURRENT_BUFFER ,yyscanner);
+ yy_delete_buffer(YY_CURRENT_BUFFER , yyscanner);
YY_CURRENT_BUFFER_LVALUE = NULL;
if (yyg->yy_buffer_stack_top > 0)
--yyg->yy_buffer_stack_top;
if (YY_CURRENT_BUFFER) {
- libconfig_yy_load_buffer_state(yyscanner );
+ yy_load_buffer_state( yyscanner );
yyg->yy_did_buffer_switch_on_eof = 1;
}
}
@@ -1918,7 +2242,7 @@ void libconfig_yypop_buffer_state (yyscan_t yyscanner)
/* Allocates the stack if it does not exist.
* Guarantees space for at least one push.
*/
-static void libconfig_yyensure_buffer_stack (yyscan_t yyscanner)
+static void yyensure_buffer_stack (yyscan_t yyscanner)
{
yy_size_t num_to_alloc;
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
@@ -1930,14 +2254,14 @@ static void libconfig_yyensure_buffer_stack (yyscan_t yyscanner)
* immediate realloc on the next call.
*/
num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */
- yyg->yy_buffer_stack = (struct yy_buffer_state**)libconfig_yyalloc
+ yyg->yy_buffer_stack = (struct yy_buffer_state**)yyalloc
(num_to_alloc * sizeof(struct yy_buffer_state*)
, yyscanner);
if ( ! yyg->yy_buffer_stack )
- YY_FATAL_ERROR( "out of dynamic memory in libconfig_yyensure_buffer_stack()" );
-
+ YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
+
memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*));
-
+
yyg->yy_buffer_stack_max = num_to_alloc;
yyg->yy_buffer_stack_top = 0;
return;
@@ -1949,12 +2273,12 @@ static void libconfig_yyensure_buffer_stack (yyscan_t yyscanner)
yy_size_t grow_size = 8 /* arbitrary grow size */;
num_to_alloc = yyg->yy_buffer_stack_max + grow_size;
- yyg->yy_buffer_stack = (struct yy_buffer_state**)libconfig_yyrealloc
+ yyg->yy_buffer_stack = (struct yy_buffer_state**)yyrealloc
(yyg->yy_buffer_stack,
num_to_alloc * sizeof(struct yy_buffer_state*)
, yyscanner);
if ( ! yyg->yy_buffer_stack )
- YY_FATAL_ERROR( "out of dynamic memory in libconfig_yyensure_buffer_stack()" );
+ YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
/* zero only the new slots.*/
memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*));
@@ -1966,9 +2290,9 @@ static void libconfig_yyensure_buffer_stack (yyscan_t yyscanner)
* @param base the character buffer
* @param size the size in bytes of the character buffer
* @param yyscanner The scanner object.
- * @return the newly allocated buffer state object.
+ * @return the newly allocated buffer state object.
*/
-YY_BUFFER_STATE libconfig_yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner)
+YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner)
{
YY_BUFFER_STATE b;
@@ -1978,9 +2302,9 @@ YY_BUFFER_STATE libconfig_yy_scan_buffer (char * base, yy_size_t size , yyscan
/* They forgot to leave room for the EOB's. */
return NULL;
- b = (YY_BUFFER_STATE) libconfig_yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner );
+ b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner );
if ( ! b )
- YY_FATAL_ERROR( "out of dynamic memory in libconfig_yy_scan_buffer()" );
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */
b->yy_buf_pos = b->yy_ch_buf = base;
@@ -1992,33 +2316,33 @@ YY_BUFFER_STATE libconfig_yy_scan_buffer (char * base, yy_size_t size , yyscan
b->yy_fill_buffer = 0;
b->yy_buffer_status = YY_BUFFER_NEW;
- libconfig_yy_switch_to_buffer(b ,yyscanner );
+ yy_switch_to_buffer( b , yyscanner );
return b;
}
-/** Setup the input buffer state to scan a string. The next call to libconfig_yylex() will
+/** Setup the input buffer state to scan a string. The next call to yylex() will
* scan from a @e copy of @a str.
* @param yystr a NUL-terminated string to scan
* @param yyscanner The scanner object.
* @return the newly allocated buffer state object.
* @note If you want to scan bytes that may contain NUL values, then use
- * libconfig_yy_scan_bytes() instead.
+ * yy_scan_bytes() instead.
*/
-YY_BUFFER_STATE libconfig_yy_scan_string (const char * yystr , yyscan_t yyscanner)
+YY_BUFFER_STATE yy_scan_string (const char * yystr , yyscan_t yyscanner)
{
- return libconfig_yy_scan_bytes(yystr,(int) strlen(yystr) ,yyscanner);
+ return yy_scan_bytes( yystr, (int) strlen(yystr) , yyscanner);
}
-/** Setup the input buffer state to scan the given bytes. The next call to libconfig_yylex() will
+/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
* scan from a @e copy of @a bytes.
* @param yybytes the byte buffer to scan
* @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
* @param yyscanner The scanner object.
* @return the newly allocated buffer state object.
*/
-YY_BUFFER_STATE libconfig_yy_scan_bytes (const char * yybytes, int _yybytes_len , yyscan_t yyscanner)
+YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len , yyscan_t yyscanner)
{
YY_BUFFER_STATE b;
char *buf;
@@ -2027,18 +2351,18 @@ YY_BUFFER_STATE libconfig_yy_scan_bytes (const char * yybytes, int _yybytes_le
/* Get memory for full buffer, including space for trailing EOB's. */
n = (yy_size_t) (_yybytes_len + 2);
- buf = (char *) libconfig_yyalloc(n ,yyscanner );
+ buf = (char *) yyalloc( n , yyscanner );
if ( ! buf )
- YY_FATAL_ERROR( "out of dynamic memory in libconfig_yy_scan_bytes()" );
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
for ( i = 0; i < _yybytes_len; ++i )
buf[i] = yybytes[i];
buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
- b = libconfig_yy_scan_buffer(buf,n ,yyscanner);
+ b = yy_scan_buffer( buf, n , yyscanner);
if ( ! b )
- YY_FATAL_ERROR( "bad buffer in libconfig_yy_scan_bytes()" );
+ YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
/* It's okay to grow etc. this buffer, and we should throw it
* away when we're done.
@@ -2056,7 +2380,7 @@ static void yynoreturn yy_fatal_error (const char* msg , yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
(void)yyg;
- (void) fprintf( stderr, "%s\n", msg );
+ fprintf( stderr, "%s\n", msg );
exit( YY_EXIT_FAILURE );
}
@@ -2082,7 +2406,7 @@ static void yynoreturn yy_fatal_error (const char* msg , yyscan_t yyscanner)
/** Get the user-defined data for this scanner.
* @param yyscanner The scanner object.
*/
-YY_EXTRA_TYPE libconfig_yyget_extra (yyscan_t yyscanner)
+YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
return yyextra;
@@ -2091,10 +2415,10 @@ YY_EXTRA_TYPE libconfig_yyget_extra (yyscan_t yyscanner)
/** Get the current line number.
* @param yyscanner The scanner object.
*/
-int libconfig_yyget_lineno (yyscan_t yyscanner)
+int yyget_lineno (yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
+
if (! YY_CURRENT_BUFFER)
return 0;
@@ -2104,10 +2428,10 @@ int libconfig_yyget_lineno (yyscan_t yyscanner)
/** Get the current column number.
* @param yyscanner The scanner object.
*/
-int libconfig_yyget_column (yyscan_t yyscanner)
+int yyget_column (yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
+
if (! YY_CURRENT_BUFFER)
return 0;
@@ -2117,7 +2441,7 @@ int libconfig_yyget_column (yyscan_t yyscanner)
/** Get the input stream.
* @param yyscanner The scanner object.
*/
-FILE *libconfig_yyget_in (yyscan_t yyscanner)
+FILE *yyget_in (yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
return yyin;
@@ -2126,7 +2450,7 @@ FILE *libconfig_yyget_in (yyscan_t yyscanner)
/** Get the output stream.
* @param yyscanner The scanner object.
*/
-FILE *libconfig_yyget_out (yyscan_t yyscanner)
+FILE *yyget_out (yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
return yyout;
@@ -2135,7 +2459,7 @@ FILE *libconfig_yyget_out (yyscan_t yyscanner)
/** Get the length of the current token.
* @param yyscanner The scanner object.
*/
-int libconfig_yyget_leng (yyscan_t yyscanner)
+int yyget_leng (yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
return yyleng;
@@ -2145,7 +2469,7 @@ int libconfig_yyget_leng (yyscan_t yyscanner)
* @param yyscanner The scanner object.
*/
-char *libconfig_yyget_text (yyscan_t yyscanner)
+char *yyget_text (yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
return yytext;
@@ -2155,7 +2479,7 @@ char *libconfig_yyget_text (yyscan_t yyscanner)
* @param user_defined The data to be associated with this scanner.
* @param yyscanner The scanner object.
*/
-void libconfig_yyset_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner)
+void yyset_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
yyextra = user_defined ;
@@ -2165,13 +2489,13 @@ void libconfig_yyset_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner)
* @param _line_number line number
* @param yyscanner The scanner object.
*/
-void libconfig_yyset_lineno (int _line_number , yyscan_t yyscanner)
+void yyset_lineno (int _line_number , yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
/* lineno is only valid if an input buffer exists. */
if (! YY_CURRENT_BUFFER )
- YY_FATAL_ERROR( "libconfig_yyset_lineno called with no buffer" );
+ YY_FATAL_ERROR( "yyset_lineno called with no buffer" );
yylineno = _line_number;
}
@@ -2180,13 +2504,13 @@ void libconfig_yyset_lineno (int _line_number , yyscan_t yyscanner)
* @param _column_no column number
* @param yyscanner The scanner object.
*/
-void libconfig_yyset_column (int _column_no , yyscan_t yyscanner)
+void yyset_column (int _column_no , yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
/* column is only valid if an input buffer exists. */
if (! YY_CURRENT_BUFFER )
- YY_FATAL_ERROR( "libconfig_yyset_column called with no buffer" );
+ YY_FATAL_ERROR( "yyset_column called with no buffer" );
yycolumn = _column_no;
}
@@ -2195,27 +2519,27 @@ void libconfig_yyset_column (int _column_no , yyscan_t yyscanner)
* input buffer.
* @param _in_str A readable stream.
* @param yyscanner The scanner object.
- * @see libconfig_yy_switch_to_buffer
+ * @see yy_switch_to_buffer
*/
-void libconfig_yyset_in (FILE * _in_str , yyscan_t yyscanner)
+void yyset_in (FILE * _in_str , yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
yyin = _in_str ;
}
-void libconfig_yyset_out (FILE * _out_str , yyscan_t yyscanner)
+void yyset_out (FILE * _out_str , yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
yyout = _out_str ;
}
-int libconfig_yyget_debug (yyscan_t yyscanner)
+int yyget_debug (yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
return yy_flex_debug;
}
-void libconfig_yyset_debug (int _bdebug , yyscan_t yyscanner)
+void yyset_debug (int _bdebug , yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
yy_flex_debug = _bdebug ;
@@ -2223,13 +2547,13 @@ void libconfig_yyset_debug (int _bdebug , yyscan_t yyscanner)
/* Accessor methods for yylval and yylloc */
-YYSTYPE * libconfig_yyget_lval (yyscan_t yyscanner)
+YYSTYPE * yyget_lval (yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
return yylval;
}
-void libconfig_yyset_lval (YYSTYPE * yylval_param , yyscan_t yyscanner)
+void yyset_lval (YYSTYPE * yylval_param , yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
yylval = yylval_param;
@@ -2237,18 +2561,18 @@ void libconfig_yyset_lval (YYSTYPE * yylval_param , yyscan_t yyscanner)
/* User-visible API */
-/* libconfig_yylex_init is special because it creates the scanner itself, so it is
+/* yylex_init is special because it creates the scanner itself, so it is
* the ONLY reentrant function that doesn't take the scanner as the last argument.
* That's why we explicitly handle the declaration, instead of using our macros.
*/
-int libconfig_yylex_init(yyscan_t* ptr_yy_globals)
+int yylex_init(yyscan_t* ptr_yy_globals)
{
if (ptr_yy_globals == NULL){
errno = EINVAL;
return 1;
}
- *ptr_yy_globals = (yyscan_t) libconfig_yyalloc ( sizeof( struct yyguts_t ), NULL );
+ *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), NULL );
if (*ptr_yy_globals == NULL){
errno = ENOMEM;
@@ -2261,37 +2585,37 @@ int libconfig_yylex_init(yyscan_t* ptr_yy_globals)
return yy_init_globals ( *ptr_yy_globals );
}
-/* libconfig_yylex_init_extra has the same functionality as libconfig_yylex_init, but follows the
+/* yylex_init_extra has the same functionality as yylex_init, but follows the
* convention of taking the scanner as the last argument. Note however, that
* this is a *pointer* to a scanner, as it will be allocated by this call (and
* is the reason, too, why this function also must handle its own declaration).
- * The user defined value in the first argument will be available to libconfig_yyalloc in
+ * The user defined value in the first argument will be available to yyalloc in
* the yyextra field.
*/
-int libconfig_yylex_init_extra(YY_EXTRA_TYPE yy_user_defined,yyscan_t* ptr_yy_globals )
+int yylex_init_extra( YY_EXTRA_TYPE yy_user_defined, yyscan_t* ptr_yy_globals )
{
struct yyguts_t dummy_yyguts;
- libconfig_yyset_extra (yy_user_defined, &dummy_yyguts);
+ yyset_extra (yy_user_defined, &dummy_yyguts);
if (ptr_yy_globals == NULL){
errno = EINVAL;
return 1;
}
-
- *ptr_yy_globals = (yyscan_t) libconfig_yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts );
-
+
+ *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts );
+
if (*ptr_yy_globals == NULL){
errno = ENOMEM;
return 1;
}
-
+
/* By setting to 0xAA, we expose bugs in
yy_init_globals. Leave at 0x00 for releases. */
memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));
-
- libconfig_yyset_extra (yy_user_defined, *ptr_yy_globals);
-
+
+ yyset_extra (yy_user_defined, *ptr_yy_globals);
+
return yy_init_globals ( *ptr_yy_globals );
}
@@ -2299,7 +2623,7 @@ static int yy_init_globals (yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
/* Initialization is the same as for the non-reentrant scanner.
- * This function is called from libconfig_yylex_destroy(), so don't allocate here.
+ * This function is called from yylex_destroy(), so don't allocate here.
*/
yyg->yy_buffer_stack = NULL;
@@ -2323,37 +2647,37 @@ static int yy_init_globals (yyscan_t yyscanner)
#endif
/* For future reference: Set errno on error, since we are called by
- * libconfig_yylex_init()
+ * yylex_init()
*/
return 0;
}
-/* libconfig_yylex_destroy is for both reentrant and non-reentrant scanners. */
-int libconfig_yylex_destroy (yyscan_t yyscanner)
+/* yylex_destroy is for both reentrant and non-reentrant scanners. */
+int yylex_destroy (yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
/* Pop the buffer stack, destroying each element. */
while(YY_CURRENT_BUFFER){
- libconfig_yy_delete_buffer(YY_CURRENT_BUFFER ,yyscanner );
+ yy_delete_buffer( YY_CURRENT_BUFFER , yyscanner );
YY_CURRENT_BUFFER_LVALUE = NULL;
- libconfig_yypop_buffer_state(yyscanner);
+ yypop_buffer_state(yyscanner);
}
/* Destroy the stack itself. */
- libconfig_yyfree(yyg->yy_buffer_stack ,yyscanner);
+ yyfree(yyg->yy_buffer_stack , yyscanner);
yyg->yy_buffer_stack = NULL;
/* Destroy the start condition stack. */
- libconfig_yyfree(yyg->yy_start_stack ,yyscanner );
+ yyfree( yyg->yy_start_stack , yyscanner );
yyg->yy_start_stack = NULL;
/* Reset the globals. This is important in a non-reentrant scanner so the next time
- * libconfig_yylex() is called, initialization will occur. */
+ * yylex() is called, initialization will occur. */
yy_init_globals( yyscanner);
/* Destroy the main struct (reentrant only). */
- libconfig_yyfree ( yyscanner , yyscanner );
+ yyfree ( yyscanner , yyscanner );
yyscanner = NULL;
return 0;
}
@@ -2385,14 +2709,14 @@ static int yy_flex_strlen (const char * s , yyscan_t yyscanner)
}
#endif
-void *libconfig_yyalloc (yy_size_t size , yyscan_t yyscanner)
+void *yyalloc (yy_size_t size , yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
(void)yyg;
return malloc(size);
}
-void *libconfig_yyrealloc (void * ptr, yy_size_t size , yyscan_t yyscanner)
+void *yyrealloc (void * ptr, yy_size_t size , yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
(void)yyg;
@@ -2407,13 +2731,13 @@ void *libconfig_yyrealloc (void * ptr, yy_size_t size , yyscan_t yyscanner)
return realloc(ptr, size);
}
-void libconfig_yyfree (void * ptr , yyscan_t yyscanner)
+void yyfree (void * ptr , yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
(void)yyg;
- free( (char *) ptr ); /* see libconfig_yyrealloc() for (char *) cast */
+ free( (char *) ptr ); /* see yyrealloc() for (char *) cast */
}
#define YYTABLES_NAME "yytables"
-#line 219 "scanner.l"
+#line 273 "scanner.l"
diff --git a/3rdparty/libconfig/scanner.h b/3rdparty/libconfig/scanner.h
index c1d295594..92e55d04b 100644
--- a/3rdparty/libconfig/scanner.h
+++ b/3rdparty/libconfig/scanner.h
@@ -2,9 +2,9 @@
#define libconfig_yyHEADER_H 1
#define libconfig_yyIN_HEADER 1
-#line 5 "scanner.h"
+#line 6 "scanner.h"
-#line 7 "scanner.h"
+#line 8 "scanner.h"
#define YY_INT_ALIGNED short int
@@ -13,11 +13,233 @@
#define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2
#define YY_FLEX_MINOR_VERSION 6
-#define YY_FLEX_SUBMINOR_VERSION 2
+#define YY_FLEX_SUBMINOR_VERSION 4
#if YY_FLEX_SUBMINOR_VERSION > 0
#define FLEX_BETA
#endif
+#ifdef yy_create_buffer
+#define libconfig_yy_create_buffer_ALREADY_DEFINED
+#else
+#define yy_create_buffer libconfig_yy_create_buffer
+#endif
+
+#ifdef yy_delete_buffer
+#define libconfig_yy_delete_buffer_ALREADY_DEFINED
+#else
+#define yy_delete_buffer libconfig_yy_delete_buffer
+#endif
+
+#ifdef yy_scan_buffer
+#define libconfig_yy_scan_buffer_ALREADY_DEFINED
+#else
+#define yy_scan_buffer libconfig_yy_scan_buffer
+#endif
+
+#ifdef yy_scan_string
+#define libconfig_yy_scan_string_ALREADY_DEFINED
+#else
+#define yy_scan_string libconfig_yy_scan_string
+#endif
+
+#ifdef yy_scan_bytes
+#define libconfig_yy_scan_bytes_ALREADY_DEFINED
+#else
+#define yy_scan_bytes libconfig_yy_scan_bytes
+#endif
+
+#ifdef yy_init_buffer
+#define libconfig_yy_init_buffer_ALREADY_DEFINED
+#else
+#define yy_init_buffer libconfig_yy_init_buffer
+#endif
+
+#ifdef yy_flush_buffer
+#define libconfig_yy_flush_buffer_ALREADY_DEFINED
+#else
+#define yy_flush_buffer libconfig_yy_flush_buffer
+#endif
+
+#ifdef yy_load_buffer_state
+#define libconfig_yy_load_buffer_state_ALREADY_DEFINED
+#else
+#define yy_load_buffer_state libconfig_yy_load_buffer_state
+#endif
+
+#ifdef yy_switch_to_buffer
+#define libconfig_yy_switch_to_buffer_ALREADY_DEFINED
+#else
+#define yy_switch_to_buffer libconfig_yy_switch_to_buffer
+#endif
+
+#ifdef yypush_buffer_state
+#define libconfig_yypush_buffer_state_ALREADY_DEFINED
+#else
+#define yypush_buffer_state libconfig_yypush_buffer_state
+#endif
+
+#ifdef yypop_buffer_state
+#define libconfig_yypop_buffer_state_ALREADY_DEFINED
+#else
+#define yypop_buffer_state libconfig_yypop_buffer_state
+#endif
+
+#ifdef yyensure_buffer_stack
+#define libconfig_yyensure_buffer_stack_ALREADY_DEFINED
+#else
+#define yyensure_buffer_stack libconfig_yyensure_buffer_stack
+#endif
+
+#ifdef yylex
+#define libconfig_yylex_ALREADY_DEFINED
+#else
+#define yylex libconfig_yylex
+#endif
+
+#ifdef yyrestart
+#define libconfig_yyrestart_ALREADY_DEFINED
+#else
+#define yyrestart libconfig_yyrestart
+#endif
+
+#ifdef yylex_init
+#define libconfig_yylex_init_ALREADY_DEFINED
+#else
+#define yylex_init libconfig_yylex_init
+#endif
+
+#ifdef yylex_init_extra
+#define libconfig_yylex_init_extra_ALREADY_DEFINED
+#else
+#define yylex_init_extra libconfig_yylex_init_extra
+#endif
+
+#ifdef yylex_destroy
+#define libconfig_yylex_destroy_ALREADY_DEFINED
+#else
+#define yylex_destroy libconfig_yylex_destroy
+#endif
+
+#ifdef yyget_debug
+#define libconfig_yyget_debug_ALREADY_DEFINED
+#else
+#define yyget_debug libconfig_yyget_debug
+#endif
+
+#ifdef yyset_debug
+#define libconfig_yyset_debug_ALREADY_DEFINED
+#else
+#define yyset_debug libconfig_yyset_debug
+#endif
+
+#ifdef yyget_extra
+#define libconfig_yyget_extra_ALREADY_DEFINED
+#else
+#define yyget_extra libconfig_yyget_extra
+#endif
+
+#ifdef yyset_extra
+#define libconfig_yyset_extra_ALREADY_DEFINED
+#else
+#define yyset_extra libconfig_yyset_extra
+#endif
+
+#ifdef yyget_in
+#define libconfig_yyget_in_ALREADY_DEFINED
+#else
+#define yyget_in libconfig_yyget_in
+#endif
+
+#ifdef yyset_in
+#define libconfig_yyset_in_ALREADY_DEFINED
+#else
+#define yyset_in libconfig_yyset_in
+#endif
+
+#ifdef yyget_out
+#define libconfig_yyget_out_ALREADY_DEFINED
+#else
+#define yyget_out libconfig_yyget_out
+#endif
+
+#ifdef yyset_out
+#define libconfig_yyset_out_ALREADY_DEFINED
+#else
+#define yyset_out libconfig_yyset_out
+#endif
+
+#ifdef yyget_leng
+#define libconfig_yyget_leng_ALREADY_DEFINED
+#else
+#define yyget_leng libconfig_yyget_leng
+#endif
+
+#ifdef yyget_text
+#define libconfig_yyget_text_ALREADY_DEFINED
+#else
+#define yyget_text libconfig_yyget_text
+#endif
+
+#ifdef yyget_lineno
+#define libconfig_yyget_lineno_ALREADY_DEFINED
+#else
+#define yyget_lineno libconfig_yyget_lineno
+#endif
+
+#ifdef yyset_lineno
+#define libconfig_yyset_lineno_ALREADY_DEFINED
+#else
+#define yyset_lineno libconfig_yyset_lineno
+#endif
+
+#ifdef yyget_column
+#define libconfig_yyget_column_ALREADY_DEFINED
+#else
+#define yyget_column libconfig_yyget_column
+#endif
+
+#ifdef yyset_column
+#define libconfig_yyset_column_ALREADY_DEFINED
+#else
+#define yyset_column libconfig_yyset_column
+#endif
+
+#ifdef yywrap
+#define libconfig_yywrap_ALREADY_DEFINED
+#else
+#define yywrap libconfig_yywrap
+#endif
+
+#ifdef yyget_lval
+#define libconfig_yyget_lval_ALREADY_DEFINED
+#else
+#define yyget_lval libconfig_yyget_lval
+#endif
+
+#ifdef yyset_lval
+#define libconfig_yyset_lval_ALREADY_DEFINED
+#else
+#define yyset_lval libconfig_yyset_lval
+#endif
+
+#ifdef yyalloc
+#define libconfig_yyalloc_ALREADY_DEFINED
+#else
+#define yyalloc libconfig_yyalloc
+#endif
+
+#ifdef yyrealloc
+#define libconfig_yyrealloc_ALREADY_DEFINED
+#else
+#define yyrealloc libconfig_yyrealloc
+#endif
+
+#ifdef yyfree
+#define libconfig_yyfree_ALREADY_DEFINED
+#else
+#define yyfree libconfig_yyfree
+#endif
+
/* First, we deal with platform-specific or compiler-specific issues. */
/* begin standard C headers. */
@@ -88,10 +310,16 @@ typedef unsigned int flex_uint32_t;
#define UINT32_MAX (4294967295U)
#endif
+#ifndef SIZE_MAX
+#define SIZE_MAX (~(size_t)0)
+#endif
+
#endif /* ! C99 */
#endif /* ! FLEXINT_H */
+/* begin standard C++ headers. */
+
/* TODO: this is always defined, so inline it */
#define yyconst const
@@ -181,7 +409,7 @@ struct yy_buffer_state
int yy_bs_lineno; /**< The line count. */
int yy_bs_column; /**< The column count. */
-
+
/* Whether to try to fill the input buffer when we reach the
* end of it.
*/
@@ -192,21 +420,21 @@ struct yy_buffer_state
};
#endif /* !YY_STRUCT_YY_BUFFER_STATE */
-void libconfig_yyrestart ( FILE *input_file , yyscan_t yyscanner );
-void libconfig_yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner );
-YY_BUFFER_STATE libconfig_yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner );
-void libconfig_yy_delete_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );
-void libconfig_yy_flush_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );
-void libconfig_yypush_buffer_state ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner );
-void libconfig_yypop_buffer_state ( yyscan_t yyscanner );
+void yyrestart ( FILE *input_file , yyscan_t yyscanner );
+void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner );
+YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner );
+void yy_delete_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );
+void yy_flush_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );
+void yypush_buffer_state ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner );
+void yypop_buffer_state ( yyscan_t yyscanner );
-YY_BUFFER_STATE libconfig_yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner );
-YY_BUFFER_STATE libconfig_yy_scan_string ( const char *yy_str , yyscan_t yyscanner );
-YY_BUFFER_STATE libconfig_yy_scan_bytes ( const char *bytes, int len , yyscan_t yyscanner );
+YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner );
+YY_BUFFER_STATE yy_scan_string ( const char *yy_str , yyscan_t yyscanner );
+YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len , yyscan_t yyscanner );
-void *libconfig_yyalloc ( yy_size_t , yyscan_t yyscanner );
-void *libconfig_yyrealloc ( void *, yy_size_t , yyscan_t yyscanner );
-void libconfig_yyfree ( void * , yyscan_t yyscanner );
+void *yyalloc ( yy_size_t , yyscan_t yyscanner );
+void *yyrealloc ( void *, yy_size_t , yyscan_t yyscanner );
+void yyfree ( void * , yyscan_t yyscanner );
#define libconfig_yywrap(yyscanner) (/*CONSTCOND*/1)
#define YY_SKIP_YYWRAP
@@ -224,46 +452,46 @@ void libconfig_yyfree ( void * , yyscan_t yyscanner );
#define YY_EXTRA_TYPE struct scan_context *
-int libconfig_yylex_init (yyscan_t* scanner);
+int yylex_init (yyscan_t* scanner);
-int libconfig_yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t* scanner);
+int yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t* scanner);
/* Accessor methods to globals.
These are made visible to non-reentrant scanners for convenience. */
-int libconfig_yylex_destroy ( yyscan_t yyscanner );
+int yylex_destroy ( yyscan_t yyscanner );
-int libconfig_yyget_debug ( yyscan_t yyscanner );
+int yyget_debug ( yyscan_t yyscanner );
-void libconfig_yyset_debug ( int debug_flag , yyscan_t yyscanner );
+void yyset_debug ( int debug_flag , yyscan_t yyscanner );
-YY_EXTRA_TYPE libconfig_yyget_extra ( yyscan_t yyscanner );
+YY_EXTRA_TYPE yyget_extra ( yyscan_t yyscanner );
-void libconfig_yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t yyscanner );
+void yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t yyscanner );
-FILE *libconfig_yyget_in ( yyscan_t yyscanner );
+FILE *yyget_in ( yyscan_t yyscanner );
-void libconfig_yyset_in ( FILE * _in_str , yyscan_t yyscanner );
+void yyset_in ( FILE * _in_str , yyscan_t yyscanner );
-FILE *libconfig_yyget_out ( yyscan_t yyscanner );
+FILE *yyget_out ( yyscan_t yyscanner );
-void libconfig_yyset_out ( FILE * _out_str , yyscan_t yyscanner );
+void yyset_out ( FILE * _out_str , yyscan_t yyscanner );
- int libconfig_yyget_leng ( yyscan_t yyscanner );
+ int yyget_leng ( yyscan_t yyscanner );
-char *libconfig_yyget_text ( yyscan_t yyscanner );
+char *yyget_text ( yyscan_t yyscanner );
-int libconfig_yyget_lineno ( yyscan_t yyscanner );
+int yyget_lineno ( yyscan_t yyscanner );
-void libconfig_yyset_lineno ( int _line_number , yyscan_t yyscanner );
+void yyset_lineno ( int _line_number , yyscan_t yyscanner );
-int libconfig_yyget_column ( yyscan_t yyscanner );
+int yyget_column ( yyscan_t yyscanner );
-void libconfig_yyset_column ( int _column_no , yyscan_t yyscanner );
+void yyset_column ( int _column_no , yyscan_t yyscanner );
-YYSTYPE * libconfig_yyget_lval ( yyscan_t yyscanner );
+YYSTYPE * yyget_lval ( yyscan_t yyscanner );
-void libconfig_yyset_lval ( YYSTYPE * yylval_param , yyscan_t yyscanner );
+void yyset_lval ( YYSTYPE * yylval_param , yyscan_t yyscanner );
/* Macros after this point can all be overridden by user definitions in
* section 1.
@@ -271,9 +499,9 @@ void libconfig_yyset_lval ( YYSTYPE * yylval_param , yyscan_t yyscanner );
#ifndef YY_SKIP_YYWRAP
#ifdef __cplusplus
-extern "C" int libconfig_yywrap ( yyscan_t yyscanner );
+extern "C" int yywrap ( yyscan_t yyscanner );
#else
-extern int libconfig_yywrap ( yyscan_t yyscanner );
+extern int yywrap ( yyscan_t yyscanner );
#endif
#endif
@@ -310,10 +538,10 @@ static int yy_flex_strlen ( const char * , yyscan_t yyscanner);
#ifndef YY_DECL
#define YY_DECL_IS_OURS 1
-extern int libconfig_yylex \
+extern int yylex \
(YYSTYPE * yylval_param , yyscan_t yyscanner);
-#define YY_DECL int libconfig_yylex \
+#define YY_DECL int yylex \
(YYSTYPE * yylval_param , yyscan_t yyscanner)
#endif /* !YY_DECL */
@@ -331,8 +559,153 @@ extern int libconfig_yylex \
#undef YY_DECL
#endif
-#line 219 "scanner.l"
+#ifndef libconfig_yy_create_buffer_ALREADY_DEFINED
+#undef yy_create_buffer
+#endif
+#ifndef libconfig_yy_delete_buffer_ALREADY_DEFINED
+#undef yy_delete_buffer
+#endif
+#ifndef libconfig_yy_scan_buffer_ALREADY_DEFINED
+#undef yy_scan_buffer
+#endif
+#ifndef libconfig_yy_scan_string_ALREADY_DEFINED
+#undef yy_scan_string
+#endif
+#ifndef libconfig_yy_scan_bytes_ALREADY_DEFINED
+#undef yy_scan_bytes
+#endif
+#ifndef libconfig_yy_init_buffer_ALREADY_DEFINED
+#undef yy_init_buffer
+#endif
+#ifndef libconfig_yy_flush_buffer_ALREADY_DEFINED
+#undef yy_flush_buffer
+#endif
+#ifndef libconfig_yy_load_buffer_state_ALREADY_DEFINED
+#undef yy_load_buffer_state
+#endif
+#ifndef libconfig_yy_switch_to_buffer_ALREADY_DEFINED
+#undef yy_switch_to_buffer
+#endif
+#ifndef libconfig_yypush_buffer_state_ALREADY_DEFINED
+#undef yypush_buffer_state
+#endif
+#ifndef libconfig_yypop_buffer_state_ALREADY_DEFINED
+#undef yypop_buffer_state
+#endif
+#ifndef libconfig_yyensure_buffer_stack_ALREADY_DEFINED
+#undef yyensure_buffer_stack
+#endif
+#ifndef libconfig_yylex_ALREADY_DEFINED
+#undef yylex
+#endif
+#ifndef libconfig_yyrestart_ALREADY_DEFINED
+#undef yyrestart
+#endif
+#ifndef libconfig_yylex_init_ALREADY_DEFINED
+#undef yylex_init
+#endif
+#ifndef libconfig_yylex_init_extra_ALREADY_DEFINED
+#undef yylex_init_extra
+#endif
+#ifndef libconfig_yylex_destroy_ALREADY_DEFINED
+#undef yylex_destroy
+#endif
+#ifndef libconfig_yyget_debug_ALREADY_DEFINED
+#undef yyget_debug
+#endif
+#ifndef libconfig_yyset_debug_ALREADY_DEFINED
+#undef yyset_debug
+#endif
+#ifndef libconfig_yyget_extra_ALREADY_DEFINED
+#undef yyget_extra
+#endif
+#ifndef libconfig_yyset_extra_ALREADY_DEFINED
+#undef yyset_extra
+#endif
+#ifndef libconfig_yyget_in_ALREADY_DEFINED
+#undef yyget_in
+#endif
+#ifndef libconfig_yyset_in_ALREADY_DEFINED
+#undef yyset_in
+#endif
+#ifndef libconfig_yyget_out_ALREADY_DEFINED
+#undef yyget_out
+#endif
+#ifndef libconfig_yyset_out_ALREADY_DEFINED
+#undef yyset_out
+#endif
+#ifndef libconfig_yyget_leng_ALREADY_DEFINED
+#undef yyget_leng
+#endif
+#ifndef libconfig_yyget_text_ALREADY_DEFINED
+#undef yyget_text
+#endif
+#ifndef libconfig_yyget_lineno_ALREADY_DEFINED
+#undef yyget_lineno
+#endif
+#ifndef libconfig_yyset_lineno_ALREADY_DEFINED
+#undef yyset_lineno
+#endif
+#ifndef libconfig_yyget_column_ALREADY_DEFINED
+#undef yyget_column
+#endif
+#ifndef libconfig_yyset_column_ALREADY_DEFINED
+#undef yyset_column
+#endif
+#ifndef libconfig_yywrap_ALREADY_DEFINED
+#undef yywrap
+#endif
+#ifndef libconfig_yyget_lval_ALREADY_DEFINED
+#undef yyget_lval
+#endif
+#ifndef libconfig_yyset_lval_ALREADY_DEFINED
+#undef yyset_lval
+#endif
+#ifndef libconfig_yyget_lloc_ALREADY_DEFINED
+#undef yyget_lloc
+#endif
+#ifndef libconfig_yyset_lloc_ALREADY_DEFINED
+#undef yyset_lloc
+#endif
+#ifndef libconfig_yyalloc_ALREADY_DEFINED
+#undef yyalloc
+#endif
+#ifndef libconfig_yyrealloc_ALREADY_DEFINED
+#undef yyrealloc
+#endif
+#ifndef libconfig_yyfree_ALREADY_DEFINED
+#undef yyfree
+#endif
+#ifndef libconfig_yytext_ALREADY_DEFINED
+#undef yytext
+#endif
+#ifndef libconfig_yyleng_ALREADY_DEFINED
+#undef yyleng
+#endif
+#ifndef libconfig_yyin_ALREADY_DEFINED
+#undef yyin
+#endif
+#ifndef libconfig_yyout_ALREADY_DEFINED
+#undef yyout
+#endif
+#ifndef libconfig_yy_flex_debug_ALREADY_DEFINED
+#undef yy_flex_debug
+#endif
+#ifndef libconfig_yylineno_ALREADY_DEFINED
+#undef yylineno
+#endif
+#ifndef libconfig_yytables_fload_ALREADY_DEFINED
+#undef yytables_fload
+#endif
+#ifndef libconfig_yytables_destroy_ALREADY_DEFINED
+#undef yytables_destroy
+#endif
+#ifndef libconfig_yyTABLES_NAME_ALREADY_DEFINED
+#undef yyTABLES_NAME
+#endif
+
+#line 273 "scanner.l"
-#line 336 "scanner.h"
+#line 710 "scanner.h"
#undef libconfig_yyIN_HEADER
#endif /* libconfig_yyHEADER_H */
diff --git a/3rdparty/libconfig/wincompat.h b/3rdparty/libconfig/wincompat.h
index f0719ea5f..cceb6f866 100644
--- a/3rdparty/libconfig/wincompat.h
+++ b/3rdparty/libconfig/wincompat.h
@@ -60,6 +60,8 @@
#define INT64_HEX_FMT "%I64X"
+#define INT64_OCT_FMT "%I64o"
+
#define FILE_SEPARATOR "\\"
#else /* defined(WIN32) || defined(__MINGW32__) */
@@ -69,6 +71,8 @@
#define INT64_HEX_FMT "%llX"
+#define INT64_OCT_FMT "%llo"
+
#define FILE_SEPARATOR "/"
#endif /* defined(WIN32) || defined(__MINGW32__) */
diff --git a/db/constants.conf b/db/constants.conf
index 6f8030a45..70f5569b4 100644
--- a/db/constants.conf
+++ b/db/constants.conf
@@ -29,12 +29,24 @@
constants_db: {
/************* Entry structure (short) ************************************
- Identifier: value // (int)
+ Identifier: value // (integer literal)
************* Entry structure (full) *************************************
Identifier: {
- Value: value // (int)
+ Value: value // (integer literal)
Deprecated: true // (boolean) Defaults to false.
}
+ ************* Supported integer literals *********************************
+ decimal: 1337 // no prefix
+ hexadecimal: 0x1337 // prefix: 0x
+ octal: 0o1337 // prefix: 0o
+ binary: 0b101101 // prefix: 0b
+
+ Underscores can also be used as visual separators for digit grouping purposes:
+ 2_147_483_647
+ 0x7FFF_FFFF
+
+ Keep in mind that number literals cannot start or end with a separator and no
+ more than one separator can be used in a row (so 12_3___456 is illegal).
**************************************************************************/
comment__: "Weekdays"
diff --git a/doc/script_commands.txt b/doc/script_commands.txt
index a597dfaa2..707aab9d6 100644
--- a/doc/script_commands.txt
+++ b/doc/script_commands.txt
@@ -434,17 +434,39 @@ marked as usable in pet scripts to work in there reliably.
Numbers
-------
+The Hercules scripting engine supports 4 types of number literals:
+
+type base syntax
+----------------------------------------------
+decimal 10 255
+hexadecimal 16 0xFF
+octal 8 0o377
+binary 2 0b11111111
+
Beside the common decimal numbers, which are nothing special whatsoever
(though do not expect to use fractions, since ALL numbers are integer in
this language), the script engine also handles hexadecimal numbers, which
are otherwise identical. Writing a number like '0x<hex digits>' will make
it recognized as a hexadecimal value. Notice that 0x10 is equal to 16.
-Also notice that if you try to 'mes 0x10' it will print '16'.
+Also notice that if you try to 'mes 0x10' it will print '16'. If you wish
+to make calculations in base 8, you can also use the octal notation like
+'0o<octal digits>'. To make calculations in base 2 (binary), you can use
+the binary notation like '0b<binary digits>'.
+
+The following are all equivalent:
+ 255 == 0xFF == 0o377 == 0b11111111
Number values can't exceed the limits of an integer variable: Any number
greater than INT_MAX (2147483647) or smaller than INT_MIN (-2147483648) will
be capped to those values and will cause a warning to be reported.
+Underscores can also be used as visual separators for digit grouping purposes:
+ 2_147_483_647
+ 0x7FFF_FFFF
+
+Keep in mind that number literals cannot start or end with a separator and no
+more than one separator can be used in a row (so 12_3___456 is illegal).
+
Variables
---------
diff --git a/npc/dev/test.txt b/npc/dev/test.txt
index c8c842055..291671913 100644
--- a/npc/dev/test.txt
+++ b/npc/dev/test.txt
@@ -156,6 +156,15 @@ function script HerculesSelfTestHelper {
.once = 1;
.errors = 0;
+ // number literals
+ callsub(OnCheck, "decimal number literal", 255, 255);
+ callsub(OnCheck, "hexadecimal number literal", 0xFF, 255);
+ callsub(OnCheck, "octal number literal", 0o377, 255);
+ callsub(OnCheck, "binary number literal", 0b11111111, 255);
+ callsub(OnCheck, "binary literal bitwise OR", 0b11110000 | 0xF, 255);
+ callsub(OnCheck, "decimal literal with separator", 2_5_5, 255);
+ callsub(OnCheck, "binary literal with separator", 0b_1111_1111, 255);
+
// Callsub (basic)
callsub(OnCheck, "Callsub", 1, 1);
callsub(OnCheck, "Callsub (getarg default values)", 1);
diff --git a/src/common/cbasetypes.h b/src/common/cbasetypes.h
index 6053d86d9..31d89d66b 100644
--- a/src/common/cbasetypes.h
+++ b/src/common/cbasetypes.h
@@ -410,13 +410,16 @@ typedef char bool;
#define ISALPHA(c) (isalpha((unsigned char)(c)))
#define ISCNTRL(c) (iscntrl((unsigned char)(c)))
#define ISDIGIT(c) (isdigit((unsigned char)(c)))
+#define ISXDIGIT(c) (isxdigit((unsigned char)(c)))
+#define ISBDIGIT(c) ((unsigned char)(c) == '0' || (unsigned char)(c) == '1')
+#define ISODIGIT(c) ((unsigned char)(c) >= '0' && (unsigned char)(c) <= '7')
+#define ISNSEPARATOR(c) ((unsigned char)(c) == '_')
#define ISGRAPH(c) (isgraph((unsigned char)(c)))
#define ISLOWER(c) (islower((unsigned char)(c)))
#define ISPRINT(c) (isprint((unsigned char)(c)))
#define ISPUNCT(c) (ispunct((unsigned char)(c)))
#define ISSPACE(c) (isspace((unsigned char)(c)))
#define ISUPPER(c) (isupper((unsigned char)(c)))
-#define ISXDIGIT(c) (isxdigit((unsigned char)(c)))
#define TOASCII(c) (toascii((unsigned char)(c)))
#define TOLOWER(c) (tolower((unsigned char)(c)))
#define TOUPPER(c) (toupper((unsigned char)(c)))
diff --git a/src/map/script.c b/src/map/script.c
index 09e4f3301..0d04ea31b 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -1240,6 +1240,80 @@ static const char *parse_variable(const char *p)
return p;
}
+/**
+ * Converts a number expression literal to an actual integer.
+ * Number separators are skipped.
+ *
+ * expects these formats:
+ * 1337
+ * 0x1337
+ * 0b1001
+ * 0o1337
+ *
+ * example with separating nibbles of a binary literal:
+ * 0b1101_0111_1001_1111
+ *
+ * @param p - a pointer to the first char of the number literal
+ * @param lli - a pointer to the resulting long long integer
+ * @returns a pointer to the first char after the parsed number
+*/
+static const char *parse_number(const char *p, long long *lli) {
+ nullpo_retr(NULL, p);
+
+ const bool unary_plus = (*p == '+');
+ const bool unary_minus = (*p == '-');
+
+ if (unary_plus || unary_minus) {
+ p++;
+ }
+
+ if (ISNSEPARATOR(*p)) {
+ disp_error_message("parse_number: number literals cannot begin with a separator", p);
+ }
+
+#define PARSENUMBER(skip, func, radix) \
+ for (p += skip; func(*p) || (ISNSEPARATOR(*p) && (func(p[1]) || ISNSEPARATOR(p[1]))); ++p) { \
+ if (func(*p)) { \
+ *lli *= radix; \
+ *lli += (*p < 'A') ? (*p & 0xF) : (9 + (*p & 0x7)); \
+ } else if (ISNSEPARATOR(p[1])) { \
+ disp_error_message("parse_number: number literals cannot contain two separators in a row", p + 1); \
+ } \
+ }
+
+ if (*p == '0' && p[1] == 'x') {
+ PARSENUMBER(2, ISXDIGIT, 16);
+ } else if (*p == '0' && p[1] == 'o') {
+ PARSENUMBER(2, ISODIGIT, 8);
+ } else if (*p == '0' && p[1] == 'b') {
+ PARSENUMBER(2, ISBDIGIT, 2);
+ } else {
+ PARSENUMBER(0, ISDIGIT, 10);
+ }
+
+#undef PARSENUMBER
+
+ if (ISNSEPARATOR(*p)) {
+ disp_error_message("parse_number: number literals cannot end with a separator", p);
+ }
+
+ if (unary_minus) {
+ // reverse the sign
+ *lli = -(*lli);
+ }
+
+ // make sure we can't underflow/overflow
+ if (*lli < INT_MIN) {
+ *lli = INT_MIN;
+ script->disp_warning_message("parse_number: underflow detected, capping value to INT_MIN", p);
+ } else if (*lli > INT_MAX) {
+ *lli = INT_MAX;
+ script->disp_warning_message("parse_number: overflow detected, capping value to INT_MAX", p);
+ }
+
+ return p;
+}
+
/*
* Checks whether the gives string is a number literal
*
@@ -1256,24 +1330,44 @@ static const char *parse_variable(const char *p)
static bool is_number(const char *p)
{
const char *np;
- if (!p)
- return false;
- if (*p == '-' || *p == '+')
+ nullpo_retr(false, p);
+
+ if (*p == '-' || *p == '+') {
p++;
+ }
+
np = p;
+
if (*p == '0' && p[1] == 'x') {
- p+=2;
- np = p;
- // Hexadecimal
- while (ISXDIGIT(*np))
+ // Hexadecimal: 0xFFFF
+ np = (p += 2);
+ while (ISXDIGIT(*np) || ISNSEPARATOR(*np)) {
np++;
- } else {
- // Decimal
- while (ISDIGIT(*np))
+ }
+ } else if (*p == '0' && p[1] == 'b') {
+ // Binary: 0b0001
+ np = (p += 2);
+ while (ISBDIGIT(*np) || ISNSEPARATOR(*np)) {
+ np++;
+ }
+ } else if (*p == '0' && p[1] == 'o') {
+ // Octal: 0o1500
+ np = (p += 2);
+ while (ISODIGIT(*np) || ISNSEPARATOR(*np)) {
np++;
+ }
+ } else if (ISDIGIT(*p)) {
+ // Decimal: 1234
+ while (ISDIGIT(*np) || ISNSEPARATOR(*np)) {
+ np++;
+ }
}
- if (p != np && *np != '_' && !ISALPHA(*np)) // At least one digit, and next isn't a letter or _
+
+ if (p != np && *np != '_' && !ISALPHA(*np)) {
+ // At least one digit, and next isn't a letter or _
return true;
+ }
+
return false;
}
@@ -1367,21 +1461,9 @@ static const char *parse_simpleexpr_paren(const char *p)
static const char *parse_simpleexpr_number(const char *p)
{
- char *np = NULL;
- long long lli;
+ long long lli = 0;
+ const char *np = parse_number(p, &lli);
- nullpo_retr(NULL, p);
- while (*p == '0' && ISDIGIT(p[1]))
- p++; // Skip leading zeros, we don't support octal literals
-
- lli = strtoll(p, &np, 0);
- if (lli < INT_MIN) {
- lli = INT_MIN;
- script->disp_warning_message("parse_simpleexpr: underflow detected, capping value to INT_MIN", p);
- } else if (lli > INT_MAX) {
- lli = INT_MAX;
- script->disp_warning_message("parse_simpleexpr: overflow detected, capping value to INT_MAX", p);
- }
script->addi((int)lli); // Cast is safe, as it's already been checked for overflows
return np;
diff --git a/tools/utils/libconf.py b/tools/utils/libconf.py
index 3858b93b5..d40418a02 100644
--- a/tools/utils/libconf.py
+++ b/tools/utils/libconf.py
@@ -141,7 +141,9 @@ class IntToken(Token):
super(IntToken, self).__init__(*args, **kwargs)
self.is_long = self.text.endswith('L')
self.is_hex = (self.text[1:2].lower() == 'x')
- self.value = int(self.text.rstrip('L'), 0)
+ self.is_oct = (self.text[1:2].lower() == 'o')
+ self.is_bin = (self.text[1:2].lower() == 'b')
+ self.value = int(self.text.replace('_', '').rstrip('L'), 0)
class BoolToken(Token):
@@ -182,14 +184,18 @@ class Tokenizer:
token_map = compile_regexes([
(FltToken, 'float', r'([-+]?(\d+)?\.\d*([eE][-+]?\d+)?)|'
r'([-+]?(\d+)(\.\d*)?[eE][-+]?\d+)'),
- (IntToken, 'hex64', r'0[Xx][0-9A-Fa-f]+(L(L)?)'),
- (IntToken, 'hex', r'0[Xx][0-9A-Fa-f]+'),
+ (IntToken, 'hex64', r'0[Xx][0-9A-Fa-f_]+(L(L)?)'),
+ (IntToken, 'hex', r'0[Xx][0-9A-Fa-f_]+'),
+ (IntToken, 'oct64', r'0[Oo][0-7_]+(L(L)?)'),
+ (IntToken, 'oct', r'0[Oo][0-7_]+'),
+ (IntToken, 'bin64', r'0[Bb][01_]+(L(L)?)'),
+ (IntToken, 'bin', r'0[Bb][01_]+'),
(BoolToken, 'boolean', r'(?i)(true|false)\b'),
(StrToken, 'string', r'"([^"\\]|\\.)*"'),
(StrToken, 'string', r'<"(?<=<")([\S\s]*?)(?=">)">'),
(Token, 'name', r'[0-9]*[A-Za-z\*][-A-Za-z0-9_\*]*'),
- (IntToken, 'integer64', r'[-+]?[0-9]+L(L)?'),
- (IntToken, 'integer', r'[-+]?[0-9]+'),
+ (IntToken, 'integer64', r'[-+]?[0-9_]+L(L)?'),
+ (IntToken, 'integer', r'[-+]?[0-9_]+'),
(Token, '}', r'\}'),
(Token, '{', r'\{'),
(Token, ')', r'\)'),
@@ -422,7 +428,8 @@ class Parser:
def scalar_value(self):
# This list is ordered so that more common tokens are checked first.
acceptable = [self.string, self.boolean, self.integer, self.float,
- self.hex, self.integer64, self.hex64]
+ self.hex, self.oct, self.bin, self.integer64, self.hex64,
+ self.oct64, self.bin64]
return self._parse_any_of(acceptable)
def value_list_or_empty(self):
@@ -455,6 +462,18 @@ class Parser:
def hex64(self):
return self._create_value_node('hex64')
+ def oct(self):
+ return self._create_value_node('oct')
+
+ def oct64(self):
+ return self._create_value_node('oct64')
+
+ def bin(self):
+ return self._create_value_node('bin')
+
+ def bin64(self):
+ return self._create_value_node('bin64')
+
def float(self):
return self._create_value_node('float')