From e40c908b95aff31a5527abbd0690cc61f5f50bd4 Mon Sep 17 00:00:00 2001
From: Adeniyi Mayokun adeniyimayokun17@gmail.com Date: Sat, 24 Mar 2018 11:07:17 +0100 Subject: [PATCH 2/2] Fixed wrc gives parse error if resource nameID has quoted & Updated parse.l file
Signed-off-by: Adeniyi Mayokun adeniyimayokun17@gmail.com
--- tools/wrc/parser.l | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 99 insertions(+), 3 deletions(-)
diff --git a/tools/wrc/parser.l b/tools/wrc/parser.l index 32a231b5a2..dfcefc069e 100644 --- a/tools/wrc/parser.l +++ b/tools/wrc/parser.l @@ -66,7 +66,10 @@ * - Rebuild string processing so that it may contain * escaped '\0'. */ - +/* Exclusive double-quoted nameID handling */ +%x tkid_dbl +/* Exclusive single-quoted nameID handling */ +%x tkid_sgl /* Exclusive string handling */ %x tkstr /* Exclusive unicode string handling */ @@ -122,6 +125,7 @@ ws [ \f\t\r] #define YY_USER_ACTION char_number+=yyleng; wanted_id = want_id; want_id = 0;
#define YY_USER_INIT current_codepage = -1; +id_initial = 1;
static void addcchar(char c); static void addwchar(WCHAR s); @@ -138,6 +142,13 @@ static int wbufalloc = 0;
static int current_codepage = -1; /* use language default */
+/* Used for differentiating between single- and double-quoted nameID's */ +static int id_dblquote = 0; +/* Used for catching first (quoted) nameID before wanted_id is set. + * This variable is reset to 0 once the first ID (quoted or not), string or + * data has been encountered */ +static int id_initial = 1; + /* * This one is a bit tricky. * We set 'want_id' in the parser to get the first @@ -402,8 +413,46 @@ static unsigned long xstrtoul(const char *nptr, char **endptr, int base) 0[oO][0-7]+[lL]? { parser_lval.num = xstrtoul(yytext+2, 0, 8); return (yytext[yyleng-1] == 'L' || yytext[yyleng-1] == 'l') ? tLNUMBER : tNUMBER; }
+<tkid_dbl>{A-Za-z_0-9./\']+" +| +<tkid_sgl>[A-Za-z_0-9./\"]+' +{ + +char *tmp; + +size_t len; + +/* Plus 1 for the initial double quote that we missed and plus 1 for a trailing NUL */ + +len = strlen(yytext) +2; + +tmp = xmalloc(len); + +/* Put the quote character that was missed */ + +tmp[0] = id_dblquote ? '"' : '''; + +id_dlquote = 0; + +strcpy(tmp + 1, yytext); + +/* Make sure we have a NUL at the end */ + +tmp[len-1] = '\0'; + +parser_lval.str = make_string(tmp); + +free(tmp); + +yy_pop_state(); + +return tIDENT; +} + + [A-Za-z_0-9./\]+ { struct keyword *tok = iskeyword(yytext); + id_initial = 0;
if(tok) { @@ -427,6 +476,9 @@ static unsigned long xstrtoul(const char *nptr, char **endptr, int base) */ L" { yy_push_state(tklstr); + + id_initial = 0; + wbufidx = 0; if(!win32) parser_warning("16bit resource contains unicode strings\n"); @@ -483,7 +535,29 @@ L" { /* * Normal string scanning */ -" yy_push_state(tkstr); cbufidx = 0; +" { + + +if (wanted_id || id_initial) + +{ + +yy_push_state(tkid_dbl); + +id_dblquote = 1; + +id_initial = 0; + +} + +else + +{ + + yy_push_state(tkstr); cbufidx = 0; + +} + } <tkstr>"{ws}+ | <tkstr>" { yy_pop_state(); @@ -528,7 +602,29 @@ L" { /* * Raw data scanning */ -' yy_push_state(tkrcd); cbufidx = 0; +' { + +if (wanted_id || id_initial) + +{ + +yy_push_state(tkid_sgl); + +id_initial = 0; + +id_dblquote = 0; + +} + +else + +{ + + + yy_push_state(tkrcd); cbufidx = 0; + +} + } <tkrcd>' { yy_pop_state(); parser_lval.raw = new_raw_data();
On 24/03/18 05:19, Adeniyi Mayokun wrote:
From e40c908b95aff31a5527abbd0690cc61f5f50bd4 Mon Sep 17 00:00:00 2001 From: Adeniyi Mayokun <adeniyimayokun17@gmail.com mailto:adeniyimayokun17@gmail.com> Date: Sat, 24 Mar 2018 11:07:17 +0100 Subject: [PATCH 2/2] Fixed wrc gives parse error if resource nameID has quoted & Updated parse.l file Signed-off-by: Adeniyi Mayokun <adeniyimayokun17@gmail.com mailto:adeniyimayokun17@gmail.com>
tools/wrc/parser.l | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 99 insertions(+), 3 deletions(-)
Hello Adeniyi,
This patch was originally submitted by Artur Świgoń:
https://www.winehq.org/pipermail/wine-patches/2017-April/160397.html
As has been said before, you must give proper attribution when sending patches, even if you make your own changes. Moreover, your changes remove some indentation, and the first line breaks a macro (the usage of both variables on one line is intentional). And in any case, as was posted to wine-devel, this is probably not the right way to go about solving this problem:
https://www.winehq.org/pipermail/wine-devel/2017-April/117313.html https://www.winehq.org/pipermail/wine-devel/2017-May/117780.html
ἔρρωσο, Zeb