summaryrefslogtreecommitdiff
path: root/3rdparty/libconfig/extra/gen
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/libconfig/extra/gen')
-rw-r--r--3rdparty/libconfig/extra/gen/Makefile1
-rw-r--r--3rdparty/libconfig/extra/gen/Makefile.in1
-rw-r--r--3rdparty/libconfig/extra/gen/clangwarnings.patch36
-rw-r--r--3rdparty/libconfig/extra/gen/scanner.l12
4 files changed, 46 insertions, 4 deletions
diff --git a/3rdparty/libconfig/extra/gen/Makefile b/3rdparty/libconfig/extra/gen/Makefile
index b4d2db841..0b2e0655e 100644
--- a/3rdparty/libconfig/extra/gen/Makefile
+++ b/3rdparty/libconfig/extra/gen/Makefile
@@ -31,6 +31,7 @@ AM_YFLAGS = -d -p $(PARSER_PREFIX)
AM_LFLAGS = --nounistd --header-file=scanner.h --prefix=$(PARSER_PREFIX)
all: $(BUILT_SOURCES)
+ @patch -p1 < clangwarnings.patch
.SUFFIXES: .c .l .y
diff --git a/3rdparty/libconfig/extra/gen/Makefile.in b/3rdparty/libconfig/extra/gen/Makefile.in
index 5850c2392..0bd4efd62 100644
--- a/3rdparty/libconfig/extra/gen/Makefile.in
+++ b/3rdparty/libconfig/extra/gen/Makefile.in
@@ -31,6 +31,7 @@ AM_YFLAGS = -d -p $(PARSER_PREFIX)
AM_LFLAGS = --nounistd --header-file=scanner.h --prefix=$(PARSER_PREFIX)
all: $(BUILT_SOURCES)
+ @patch -p1 < clangwarnings.patch
.SUFFIXES: .c .l .y
diff --git a/3rdparty/libconfig/extra/gen/clangwarnings.patch b/3rdparty/libconfig/extra/gen/clangwarnings.patch
new file mode 100644
index 000000000..65aef9a08
--- /dev/null
+++ b/3rdparty/libconfig/extra/gen/clangwarnings.patch
@@ -0,0 +1,36 @@
+diff --git a/grammar.c b/grammar.c
+index 3595578..26444f8 100644
+--- a/grammar.c
++++ b/grammar.c
+@@ -1187,9 +1187,7 @@ void libconfig_yyerror(void *scanner, struct parse_context *ctx,
+ YYUSE (ctx);
+ YYUSE (scan_ctx);
+
+- if (!yymsg)
+- yymsg = "Deleting";
+- YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
++ YY_SYMBOL_PRINT (yymsg ? yymsg : "Deleting", yytype, yyvaluep, yylocationp);
+
+ switch (yytype)
+ {
+diff --git a/scanner.c b/scanner.c
+index aebd34c..c3a717f 100644
+--- a/scanner.c
++++ b/scanner.c
+@@ -1500,6 +1500,8 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
++#ifndef __clang_analyzer__
++ // FIXME: Clang's static analyzer complains about leaking the result of libconfig_yyrealloc
+ if ((yy_size_t) (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. */
+ yy_size_t new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1);
+@@ -1507,6 +1509,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+ }
++#endif // __clang_analyzer__
+
+ yyg->yy_n_chars += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR;
diff --git a/3rdparty/libconfig/extra/gen/scanner.l b/3rdparty/libconfig/extra/gen/scanner.l
index 4b3048fab..66364e019 100644
--- a/3rdparty/libconfig/extra/gen/scanner.l
+++ b/3rdparty/libconfig/extra/gen/scanner.l
@@ -86,6 +86,13 @@ static unsigned long long fromhex(const char *s)
#endif /* __MINGW32__ */
}
+static int fromihex(const char *s) {
+ unsigned long l = strtoul(s, NULL, 16);
+ if (l > INT32_MAX)
+ l = INT32_MAX;
+ return (int)l;
+}
+
%}
true [Tt][Rr][Uu][Ee]
@@ -178,10 +185,7 @@ include_open ^[ \t]*@include[ \t]+\"
{float} { yylval->fval = atof(yytext); return(TOK_FLOAT); }
{integer} { yylval->ival = atoi(yytext); return(TOK_INTEGER); }
{integer64} { yylval->llval = atoll(yytext); return(TOK_INTEGER64); }
-{hex} {
- yylval->ival = strtoul(yytext, NULL, 16);
- return(TOK_HEX);
- }
+{hex} { yylval->ival = fromihex(yytext); return(TOK_HEX); }
{hex64} { yylval->llval = fromhex(yytext); return(TOK_HEX64); }
\[ { return(TOK_ARRAY_START); }
\] { return(TOK_ARRAY_END); }