From 9c74cce2a4104244a026aa8ee27a08f7b0193bfb Mon Sep 17 00:00:00 2001 From: bog Date: Sun, 10 Dec 2023 22:43:48 +0100 Subject: [PATCH] :bug: string escape quote. --- lib/lexer.c | 41 +++++++++++++++++++++++++++++++++++++---- tests/units/lexer.c | 5 ++++- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/lib/lexer.c b/lib/lexer.c index d780f29..883c08e 100644 --- a/lib/lexer.c +++ b/lib/lexer.c @@ -184,8 +184,8 @@ node_t* lexer_try_new_str(lexer_t* lexer) { assert(lexer); - size_t cursor = lexer->cursor; - size_t len = strlen(lexer->source); + ssize_t cursor = lexer->cursor; + ssize_t len = strlen(lexer->source); str_t res_str; str_init(&res_str); @@ -201,8 +201,41 @@ node_t* lexer_try_new_str(lexer_t* lexer) while (cursor < len && lexer->source[cursor] != '"') { - str_push(&res_str, lexer->source[cursor]); - cursor++; + if (lexer->source[cursor] == '\\') + { + if (cursor + 1 < len) + { + switch (lexer->source[cursor + 1]) + { + case '"': { + str_push(&res_str, '"'); + cursor += 2; + } break; + + case 'n': { + str_push(&res_str, '\n'); + cursor += 2; + } break; + + case 't': { + str_push(&res_str, '\t'); + cursor += 2; + } break; + + case 'r': { + str_push(&res_str, '\r'); + cursor += 2; + } break; + + default: cursor++; break; + } + } + } + else + { + str_push(&res_str, lexer->source[cursor]); + cursor++; + } } if (cursor >= len || lexer->source[cursor] != '"') diff --git a/tests/units/lexer.c b/tests/units/lexer.c index 9e36361..6c402d7 100644 --- a/tests/units/lexer.c +++ b/tests/units/lexer.c @@ -55,7 +55,7 @@ static void test_lexer(char const* source, size_t n, ...) node_str(tok, tok_str, SZ); char* oracle = va_arg(lst, char*); - cr_assert_str_eq(oracle, tok_str); + cr_assert_str_eq(tok_str, oracle); node_free(tok); } @@ -101,4 +101,7 @@ Test(lexer, str) { test_lexer(" \"bonjour\" \" monde \"", 2, "STR[bonjour]", "STR[ monde ]"); + + test_lexer("\"the \\\"cat\\\"\"", 1, "STR[the \"cat\"]"); + test_lexer("\"hello\\n\\tworld\"", 1, "STR[hello\n\tworld]"); }