From a1b67576352bb55769b8be805caf1baad59f7752 Mon Sep 17 00:00:00 2001 From: servostar Date: Sun, 23 Jun 2024 15:14:42 +0200 Subject: [PATCH] added: support for basic escape sequences --- src/lex/lexer.l | 5 ++++- src/lex/util.c | 38 ++++++++++++++++++++++++++++++++++++++ src/lex/util.h | 2 ++ 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/lex/lexer.l b/src/lex/lexer.l index 0491c3b..bfde8ff 100644 --- a/src/lex/lexer.l +++ b/src/lex/lexer.l @@ -98,7 +98,10 @@ yytext = yytext +1; yytext[yyleng - 2] = 0; - DEBUG("\"%s\" tokenized with \'ValStr\'", yytext); yylval.string = mem_strdup(MemoryNamespaceLex, yytext); return(ValStr);}; + DEBUG("\"%s\" tokenized with \'ValStr\'", yytext); + yylval.string = collapse_escape_sequences(yytext); + return(ValStr); +}; \"\"\"[^\"]*\"\"\" { yytext = yytext +3; yytext[yyleng - 6] = 0; diff --git a/src/lex/util.c b/src/lex/util.c index 83966da..ab412ec 100644 --- a/src/lex/util.c +++ b/src/lex/util.c @@ -84,3 +84,41 @@ int getNextLine(void) { return 0; } + +struct ConstEscSeq { + char* esc; + char* rep; +}; + +static struct ConstEscSeq sequences[] = { + { + "\\n", + "\n" + }, + { + "\\\\", + "\\" + }, + { + "\\t", + "\t" + }, + { + "\\r", + "\r" + } +}; + +char* collapse_escape_sequences(char* string) { + GString* unesc = g_string_new(string); + + for (int i = 0; i < 4; i++) { + g_string_replace(unesc, sequences[i].esc, sequences[i].rep, 0); + } + + char* str = mem_strdup(MemoryNamespaceLex, unesc->str); + + g_string_free(unesc, TRUE); + + return str; +} diff --git a/src/lex/util.h b/src/lex/util.h index 6939526..e973a29 100644 --- a/src/lex/util.h +++ b/src/lex/util.h @@ -36,4 +36,6 @@ int nextChar(char *dst); */ int getNextLine(void); +char* collapse_escape_sequences(char* string); + #endif // LEX_UTIL_H_