diff --git a/config.l b/config.l index 4a88562..e4ad02e 100644 --- a/config.l +++ b/config.l @@ -14,7 +14,7 @@ unsigned int line = 1, col = 0; %} -NUMBER [0-9]+ +NUMBER -?[0-9]+ VALUE \".*\" MALSTRING \"[^\"\n]*\n WHITE [\t ]* @@ -22,7 +22,30 @@ COMMENT ^#.* %% -{NUMBER} { yylval.i = atoi(yytext); return TYPE_NUMBER; } +{NUMBER} { + unsigned int x; + errno = 0; + + if (atoi(yytext) < 0) + { + fprintf(stderr,"%s:%d: negative value not accepted! Fix it now!\n", + config, line); + graceful_exit(1); + } + + x = strtoul(yytext, NULL, 10); + + if (errno == ERANGE) + { + fprintf(stderr, "%s:%d: %s is too big! Fix it now!\n", + config, line, yytext); + graceful_exit(1); + } + + yylval.i = x; + return TYPE_NUMBER; +} + {VALUE} { yytext[yyleng - 1] = '\0'; /* Kill the trailing quote */ yylval.s = strdup(yytext + 1); /* kill leading quote */