From 76e465bd1d805ff96aba965885963825a2f447ae Mon Sep 17 00:00:00 2001 From: Hayodea Hakol Date: Wed, 15 Jan 2025 08:21:18 -0400 Subject: [PATCH] devSpec:lex: Allow backslash escaping of strings Now we can escape special characters without issue. --- hcore/deviceManager/deviceSpecl.ll | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/hcore/deviceManager/deviceSpecl.ll b/hcore/deviceManager/deviceSpecl.ll index 2a20642..acf8f62 100644 --- a/hcore/deviceManager/deviceSpecl.ll +++ b/hcore/deviceManager/deviceSpecl.ll @@ -26,10 +26,26 @@ "(" { return LPAREN; } ")" { return RPAREN; } [ \t]*"="[ \t]* { return EQUALS; } // Allow optional whitespace around equals -([^=\|\(\) \t\r\n]|\\[ \t])+ { +(\\.|[^=\|\(\) \t\r\n])+ { std::string token(yytext); - token.erase(std::remove(token.begin(), token.end(), '\\'), token.end()); - deviceSpecplval.str = strdup(token.c_str()); + + // Unescape logic for backslash, pipe + std::string unescaped; + unescaped.reserve(token.size()); + + for (size_t i = 0; i < token.size(); ++i) + { + if (token[i] == '\\' && i + 1 < token.size()) + { + unescaped.push_back(token[++i]); + } + else + { + unescaped.push_back(token[i]); + } + } + + deviceSpecplval.str = strdup(unescaped.c_str()); return STRING; } \r?\n { /* ignore newlines */ }