diff options
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); } |
