From: Dale Weiler Date: Tue, 30 Oct 2018 21:32:21 +0000 (-0400) Subject: fix octals X-Git-Tag: xonotic-v0.8.5~18 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=2d99ce609dfae77f31f791766f9186382b233525;p=xonotic%2Fgmqcc.git fix octals --- 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; }