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 /src/tokenize.c | |
| parent | dcdbbeaf293f5c07c27f7ebcd229eb60d3b8a217 (diff) | |
| download | ducc-3301e36ee69a5e5e2a8d0248d94b488f9ace5cd7.tar.gz ducc-3301e36ee69a5e5e2a8d0248d94b488f9ace5cd7.tar.zst ducc-3301e36ee69a5e5e2a8d0248d94b488f9ace5cd7.zip | |
feat: support '\e'
Diffstat (limited to 'src/tokenize.c')
| -rw-r--r-- | src/tokenize.c | 19 |
1 files changed, 19 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; |
