diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2016-07-09 12:17:31 -0700 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2016-07-09 12:17:31 -0700 |
| commit | a5251a1c102334a5dcb07e4fcc2b676be55fe2be (patch) | |
| tree | 459d720365823b10473be028d25ad86b87b825f5 /src/c_tokenizer.cpp | |
| parent | 100e8e15fa087be8975173c03a2f89b227b16730 (diff) | |
| download | zig-a5251a1c102334a5dcb07e4fcc2b676be55fe2be.tar.gz zig-a5251a1c102334a5dcb07e4fcc2b676be55fe2be.zip | |
parseh: support octal in C macro string literal
Diffstat (limited to 'src/c_tokenizer.cpp')
| -rw-r--r-- | src/c_tokenizer.cpp | 61 |
1 files changed, 59 insertions, 2 deletions
diff --git a/src/c_tokenizer.cpp b/src/c_tokenizer.cpp index ddcb5ba152..e29cf485e6 100644 --- a/src/c_tokenizer.cpp +++ b/src/c_tokenizer.cpp @@ -539,8 +539,17 @@ void tokenize_c_macro(CTokenize *ctok, const uint8_t *c) { case 'v': add_char(ctok, '\v'); break; - case DIGIT: - zig_panic("TODO octal"); + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + ctok->state = CTokStateStrOctal; + ctok->cur_char = *c - '0'; + ctok->octal_index = 1; break; case 'x': zig_panic("TODO hex"); @@ -555,6 +564,53 @@ void tokenize_c_macro(CTokenize *ctok, const uint8_t *c) { return mark_error(ctok); } break; + case CTokStateStrOctal: + switch (*c) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + // TODO @mul_with_overflow + if (((long)ctok->cur_char) * 8 >= 256) { + zig_panic("TODO"); + } + ctok->cur_char *= 8; + // TODO @add_with_overflow + if (((long)ctok->cur_char) + (long)(*c - '0') >= 256) { + zig_panic("TODO"); + } + ctok->cur_char += *c - '0'; + ctok->octal_index += 1; + if (ctok->octal_index == 3) { + if (ctok->cur_tok->id == CTokIdStrLit) { + add_char(ctok, ctok->cur_char); + ctok->state = CTokStateString; + } else if (ctok->cur_tok->id == CTokIdCharLit) { + ctok->cur_tok->data.char_lit = ctok->cur_char; + ctok->state = CTokStateExpectEndQuot; + } else { + zig_unreachable(); + } + } + break; + default: + c -= 1; + if (ctok->cur_tok->id == CTokIdStrLit) { + add_char(ctok, ctok->cur_char); + ctok->state = CTokStateString; + } else if (ctok->cur_tok->id == CTokIdCharLit) { + ctok->cur_tok->data.char_lit = ctok->cur_char; + ctok->state = CTokStateExpectEndQuot; + } else { + zig_unreachable(); + } + continue; + } + break; case CTokStateExpectEndQuot: switch (*c) { case '\'': @@ -644,6 +700,7 @@ found_end_of_macro: case CTokStateString: case CTokStateExpSign: case CTokStateFloatExpFirst: + case CTokStateStrOctal: return mark_error(ctok); } |
