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