X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=lexer.cpp;h=1007948958caf4103a108feb3b97633af2277af7;hp=34fc71b00bfb3600b4c2bf5ca289e5d2e23f4447;hb=031f827da5457ed969bbf66e520105f9600a1229;hpb=90b5a6538a10f60d08ee3059b8f70e4e076dc30d diff --git a/lexer.cpp b/lexer.cpp index 34fc71b..1007948 100644 --- a/lexer.cpp +++ b/lexer.cpp @@ -831,6 +831,7 @@ static int GMQCC_WARN lex_finish_string(lex_file *lex, int quote) static int GMQCC_WARN lex_finish_digit(lex_file *lex, int lastch) { bool ishex = false; + bool isoct = false; int ch = lastch; @@ -843,7 +844,16 @@ static int GMQCC_WARN lex_finish_digit(lex_file *lex, int lastch) lex_tokench(lex, ch); ch = lex_getch(lex); - if (ch != '.' && !util_isdigit(ch)) + + if (lastch == '0' && util_isdigit(ch)) { + if (ch < '0' || ch > '7') { + lexerror(lex, "invalid octal constant"); + return (lex->tok.ttype = TOKEN_ERROR); + } + isoct = true; + } + + if (!isoct && ch != '.' && !util_isdigit(ch)) { if (lastch != '0' || ch != 'x') { @@ -898,10 +908,15 @@ static int GMQCC_WARN lex_finish_digit(lex_file *lex, int lastch) lex_ungetch(lex, ch); lex_endtoken(lex); - if (lex->tok.ttype == TOKEN_FLOATCONST) + if (lex->tok.ttype == TOKEN_FLOATCONST) { lex->tok.constval.f = strtod(lex->tok.value, nullptr); - else - lex->tok.constval.i = strtol(lex->tok.value, nullptr, 0); + } else { + /* determine base for strtol */ + int base = 10; + if (ishex) base = 16; + if (isoct) base = 8; + lex->tok.constval.i = strtol(lex->tok.value, nullptr, base); + } return lex->tok.ttype; }