diff --git a/tools/wrc/parser.l b/tools/wrc/parser.l index aea3fb85a6e..9ad1751862c 100644 --- a/tools/wrc/parser.l +++ b/tools/wrc/parser.l @@ -68,11 +68,11 @@ */ /* Exclusive string handling */ -%x yystr +%x tkstr /* Exclusive unicode string handling */ -%x yylstr +%x tklstr /* Exclusive rcdata single quoted data handling */ -%x yyrcd +%x tkrcd /* Exclusive comment eating... */ %x comment /* Set when stripping c-junk */ @@ -428,102 +428,102 @@ static struct keyword *iskeyword(char *kw) * Wide string scanning */ L\" { - yy_push_state(yylstr); + yy_push_state(tklstr); wbufidx = 0; if(!win32) yywarning("16bit resource contains unicode strings\n"); } -\"{ws}+ | -\" { +\"{ws}+ | +\" { yy_pop_state(); yylval.str = get_buffered_wstring(); return tSTRING; } -\\[0-7]{1,6} { /* octal escape sequence */ +\\[0-7]{1,6} { /* octal escape sequence */ unsigned int result; result = strtoul(yytext+1, 0, 8); if ( result > 0xffff ) yyerror("Character constant out of range"); addwchar((WCHAR)result); } -\\x[0-9a-fA-F]{4} { /* hex escape sequence */ +\\x[0-9a-fA-F]{4} { /* hex escape sequence */ unsigned int result; result = strtoul(yytext+2, 0, 16); addwchar((WCHAR)result); } -\\x[0-9a-fA-F]{1,3} { yyerror("Invalid hex escape sequence '%s'", yytext); } +\\x[0-9a-fA-F]{1,3} { yyerror("Invalid hex escape sequence '%s'", yytext); } -\\[0-9]+ yyerror("Bad escape sequence"); -\\\n{ws}* line_number++; char_number = 1; /* backslash at EOL continues string after leading whitespace on next line */ -\\a addwchar('\a'); -\\b addwchar('\b'); -\\f addwchar('\f'); -\\n addwchar('\n'); -\\r addwchar('\r'); -\\t addwchar('\t'); -\\v addwchar('\v'); -\\. addwchar(yytext[1]); -\\\r\n addwchar(yytext[2]); line_number++; char_number = 1; -\"\" addwchar('\"'); /* "bla""bla" -> "bla\"bla" */ -\\\"\" addwchar('\"'); /* "bla\""bla" -> "bla\"bla" */ -\"{ws}+\" ; /* "bla" "bla" -> "blabla" */ -[^\\\n\"]+ { +\\[0-9]+ yyerror("Bad escape sequence"); +\\\n{ws}* line_number++; char_number = 1; /* backslash at EOL continues string after leading whitespace on next line */ +\\a addwchar('\a'); +\\b addwchar('\b'); +\\f addwchar('\f'); +\\n addwchar('\n'); +\\r addwchar('\r'); +\\t addwchar('\t'); +\\v addwchar('\v'); +\\. addwchar(yytext[1]); +\\\r\n addwchar(yytext[2]); line_number++; char_number = 1; +\"\" addwchar('\"'); /* "bla""bla" -> "bla\"bla" */ +\\\"\" addwchar('\"'); /* "bla\""bla" -> "bla\"bla" */ +\"{ws}+\" ; /* "bla" "bla" -> "blabla" */ +[^\\\n\"]+ { char *yptr = yytext; while(*yptr) /* FIXME: codepage translation */ addwchar(*yptr++ & 0xff); } -\n yyerror("Unterminated string"); +\n yyerror("Unterminated string"); /* * Normal string scanning */ -\" yy_push_state(yystr); cbufidx = 0; -\"{ws}+ | -\" { +\" yy_push_state(tkstr); cbufidx = 0; +\"{ws}+ | +\" { yy_pop_state(); yylval.str = get_buffered_cstring(); return tSTRING; } -\\[0-7]{1,3} { /* octal escape sequence */ +\\[0-7]{1,3} { /* octal escape sequence */ int result; result = strtol(yytext+1, 0, 8); if ( result > 0xff ) yyerror("Character constant out of range"); addcchar((char)result); } -\\x[0-9a-fA-F]{2} { /* hex escape sequence */ +\\x[0-9a-fA-F]{2} { /* hex escape sequence */ int result; result = strtol(yytext+2, 0, 16); addcchar((char)result); } -\\x[0-9a-fA-F] { yyerror("Invalid hex escape sequence '%s'", yytext); } +\\x[0-9a-fA-F] { yyerror("Invalid hex escape sequence '%s'", yytext); } -\\[0-9]+ yyerror("Bad escape sequence"); -\\\n{ws}* line_number++; char_number = 1; /* backslash at EOL continues string after leading whitespace on next line */ -\\a addcchar('\a'); -\\b addcchar('\b'); -\\f addcchar('\f'); -\\n addcchar('\n'); -\\r addcchar('\r'); -\\t addcchar('\t'); -\\v addcchar('\v'); -\\. addcchar(yytext[1]); -\\\r\n addcchar(yytext[2]); line_number++; char_number = 1; -[^\\\n\"]+ { +\\[0-9]+ yyerror("Bad escape sequence"); +\\\n{ws}* line_number++; char_number = 1; /* backslash at EOL continues string after leading whitespace on next line */ +\\a addcchar('\a'); +\\b addcchar('\b'); +\\f addcchar('\f'); +\\n addcchar('\n'); +\\r addcchar('\r'); +\\t addcchar('\t'); +\\v addcchar('\v'); +\\. addcchar(yytext[1]); +\\\r\n addcchar(yytext[2]); line_number++; char_number = 1; +[^\\\n\"]+ { char *yptr = yytext; while(*yptr) addcchar(*yptr++); } -\"\" addcchar('\"'); /* "bla""bla" -> "bla\"bla" */ -\\\"\" addcchar('\"'); /* "bla\""bla" -> "bla\"bla" */ -\"{ws}+\" ; /* "bla" "bla" -> "blabla" */ -\n yyerror("Unterminated string"); +\"\" addcchar('\"'); /* "bla""bla" -> "bla\"bla" */ +\\\"\" addcchar('\"'); /* "bla\""bla" -> "bla\"bla" */ +\"{ws}+\" ; /* "bla" "bla" -> "blabla" */ +\n yyerror("Unterminated string"); /* * Raw data scanning */ -\' yy_push_state(yyrcd); cbufidx = 0; -\' { +\' yy_push_state(tkrcd); cbufidx = 0; +\' { yy_pop_state(); yylval.raw = new_raw_data(); yylval.raw->size = cbufidx; @@ -531,14 +531,14 @@ L\" { memcpy(yylval.raw->data, cbuffer, yylval.raw->size); return tRAWDATA; } -[0-9a-fA-F]{2} { +[0-9a-fA-F]{2} { int result; result = strtol(yytext, 0, 16); addcchar((char)result); } -{ws}+ ; /* Ignore space */ -\n line_number++; char_number = 1; -. yyerror("Malformed data-line"); +{ws}+ ; /* Ignore space */ +\n line_number++; char_number = 1; +. yyerror("Malformed data-line"); /* * Comment stripping