From: Wolfgang Bumiller Date: Sat, 29 Dec 2012 18:11:06 +0000 (+0100) Subject: improvie/fix \{x...} char parsing X-Git-Tag: before-library~429 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=432a29e4d961d54dd8ad2fde73174569f15bca1e;p=xonotic%2Fgmqcc.git improvie/fix \{x...} char parsing --- diff --git a/lexer.c b/lexer.c index 43182c3..ca013d5 100644 --- a/lexer.c +++ b/lexer.c @@ -742,6 +742,7 @@ static bool lex_finish_frames(lex_file *lex) static int GMQCC_WARN lex_finish_string(lex_file *lex, int quote) { + uchar_t chr; int ch = 0; int nextch; bool hex; @@ -827,7 +828,7 @@ static int GMQCC_WARN lex_finish_string(lex_file *lex, int quote) case '[': ch = 16; break; case ']': ch = 17; break; case '{': - ch = 0; + chr = 0; nextch = lex_getch(lex); hex = (nextch == 'x'); if (!hex) @@ -835,32 +836,31 @@ static int GMQCC_WARN lex_finish_string(lex_file *lex, int quote) for (nextch = lex_getch(lex); nextch != '}'; nextch = lex_getch(lex)) { if (!hex) { if (nextch >= '0' && nextch <= '9') - ch = ch * 10 + nextch - '0'; + chr = chr * 10 + nextch - '0'; else { lexerror(lex, "bad character code"); return (lex->tok.ttype = TOKEN_ERROR); } } else { - if (nextch >= '0' || nextch <= '9') - ch = ch * 16 + nextch - '0'; + if (nextch >= '0' && nextch <= '9') + chr = chr * 0x10 + nextch - '0'; else if (nextch >= 'a' && nextch <= 'f') - ch = ch * 16 + nextch - 'a' + 10; + chr = chr * 0x10 + nextch - 'a' + 10; else if (nextch >= 'A' && nextch <= 'F') - ch = ch * 16 + nextch - 'A' + 10; + chr = chr * 0x10 + nextch - 'A' + 10; else { lexerror(lex, "bad character code"); return (lex->tok.ttype = TOKEN_ERROR); } } - if ( (!OPTS_FLAG(UTF8) && ch > 255) || - ( OPTS_FLAG(UTF8) && ch > 0x10FFFF) ) + if (chr > 0x10FFFF || (!OPTS_FLAG(UTF8) && chr > 255)) { lexerror(lex, "character code out of range"); return (lex->tok.ttype = TOKEN_ERROR); } } - if (OPTS_FLAG(UTF8) && ch >= 128) { - u8len = u8_fromchar((uchar_t)ch, u8buf, sizeof(u8buf)); + if (OPTS_FLAG(UTF8) && chr >= 128) { + u8len = u8_fromchar(chr, u8buf, sizeof(u8buf)); if (!u8len) ch = 0; else { @@ -873,6 +873,8 @@ static int GMQCC_WARN lex_finish_string(lex_file *lex, int quote) ch = u8buf[uc]; } } + else + ch = chr; break; case '\n': ch = '\n'; break;