Eric Pouech : winedbg: Properly handle escaped characters inside strings.
Alexandre Julliard
julliard at winehq.org
Wed Dec 1 15:23:51 CST 2021
Module: wine
Branch: master
Commit: d331d9cb936f047fd94c4b30b16f81d549c131ac
URL: https://source.winehq.org/git/wine.git/?a=commit;h=d331d9cb936f047fd94c4b30b16f81d549c131ac
Author: Eric Pouech <eric.pouech at gmail.com>
Date: Wed Dec 1 15:30:23 2021 +0100
winedbg: Properly handle escaped characters inside strings.
Signed-off-by: Eric Pouech <eric.pouech at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
programs/winedbg/debug.l | 32 ++++++++++++++++++++++++++++++--
1 file changed, 30 insertions(+), 2 deletions(-)
diff --git a/programs/winedbg/debug.l b/programs/winedbg/debug.l
index a497f34e6b0..280dcbfbc6b 100644
--- a/programs/winedbg/debug.l
+++ b/programs/winedbg/debug.l
@@ -60,6 +60,34 @@ void lexeme_flush(void)
next_lexeme = 0;
}
+/* called with quoted string, unescape all elements inside the quotes */
+static char* unescape_string(const char* str)
+{
+ size_t len = strlen(str) - 2;
+ char* ret = lexeme_alloc_size(len + 1);
+ char* dst = ret;
+ const char* ptr;
+ for (ptr = str + 1; ptr < str + 1 + len; ptr++)
+ {
+ if (*ptr == '\\')
+ {
+ switch (*++ptr)
+ {
+ case 't': *dst++ = '\t'; break;
+ case 'r': *dst++ = '\r'; break;
+ case 'n': *dst++ = '\n'; break;
+ case '\\': *dst++ = '\\'; break;
+ case '"': *dst++ = '"'; break;
+ default: *dst++ = '\\'; *dst++ = *ptr; /* not handled, don't change */
+ }
+ }
+ else
+ *dst++ = *ptr;
+ }
+ *dst = '\0';
+ return ret;
+}
+
#define YY_INPUT(buf,result,max_size) \
(result = input_lex_read_buffer(buf, max_size))
@@ -72,7 +100,7 @@ HEXDIGIT [0-9a-fA-F]
FORMAT [ubcdgiswxa]
IDENTIFIER [_a-zA-Z~?][_a-zA-Z0-9~?@]*
PATHNAME [\\/_a-zA-Z0-9\.~@][\\/\-_a-zA-Z0-9\.~@]*
-STRING \"[^\n"]+\"
+STRING \"(\\[^\n]|[^\\"\n])*\"
%s FORMAT_EXPECTED
%s INFO_CMD
@@ -125,7 +153,7 @@ STRING \"[^\n"]+\"
<FORMAT_EXPECTED>"/"{FORMAT} { dbg_lval.integer = (1 << 8) | yytext[1]; return tFORMAT; }
-{STRING} { dbg_lval.string = lexeme_alloc(yytext + 1); dbg_lval.string[strlen(dbg_lval.string) - 1] = '\0'; return tSTRING; }
+{STRING} { dbg_lval.string = unescape_string(yytext); return tSTRING;}
<ASTRING_EXPECTED>[^\n]+ { char* p = yytext; while (*p == ' ' || *p == '\t') p++;
dbg_lval.string = lexeme_alloc(p); return tSTRING; }
More information about the wine-cvs
mailing list