diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-01-06 08:09:46 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-01-06 08:09:46 +0900 |
| commit | 3301e36ee69a5e5e2a8d0248d94b488f9ace5cd7 (patch) | |
| tree | 74e8dd5815c366eecd94be7ab310bf933d37da41 | |
| parent | dcdbbeaf293f5c07c27f7ebcd229eb60d3b8a217 (diff) | |
| download | ducc-3301e36ee69a5e5e2a8d0248d94b488f9ace5cd7.tar.gz ducc-3301e36ee69a5e5e2a8d0248d94b488f9ace5cd7.tar.zst ducc-3301e36ee69a5e5e2a8d0248d94b488f9ace5cd7.zip | |
feat: support '\e'
| -rw-r--r-- | src/tokenize.c | 19 | ||||
| -rw-r--r-- | tests/char_literals.sh | 2 |
2 files changed, 21 insertions, 0 deletions
diff --git a/src/tokenize.c b/src/tokenize.c index 0b40f2f..864da85 100644 --- a/src/tokenize.c +++ b/src/tokenize.c @@ -427,9 +427,28 @@ TokenArray* convert_pp_tokens_to_tokens(TokenArray* pp_tokens) { ch = '\v'; } else if (ch == '0') { ch = '\0'; + } else if (ch == 'e') { + // \e is not a part of Standard C, but commonly supported. + ch = 27; } } tok->value.integer = ch; + } else if (k == TokenKind_literal_str) { + tok->kind = pp_tok->kind; + + size_t len = strlen(pp_tok->value.string); + char* buf = calloc(len + 1, sizeof(char)); + size_t j = 0; + for (size_t i = 0; i < len; i++, j++) { + if (pp_tok->value.string[i] == '\\' && pp_tok->value.string[i + 1] == 'e') { + // \e is not a part of Standard C, but commonly supported. + buf[j] = 033; + i++; + } else { + buf[j] = pp_tok->value.string[i]; + } + } + tok->value.string = buf; } else if (k == TokenKind_ident) { if (strcmp(pp_tok->value.string, "alignas") == 0) { tok->kind = TokenKind_keyword_alignas; diff --git a/tests/char_literals.sh b/tests/char_literals.sh index c883eba..64b130b 100644 --- a/tests/char_literals.sh +++ b/tests/char_literals.sh @@ -21,5 +21,7 @@ int main() { ASSERT_EQ(11, '\v'); ASSERT_EQ(0, '\0'); + + ASSERT_EQ(27, '\e'); } EOF |
