aboutsummaryrefslogtreecommitdiff
path: root/src/c_tokenizer.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2016-07-09 12:17:31 -0700
committerAndrew Kelley <superjoe30@gmail.com>2016-07-09 12:17:31 -0700
commita5251a1c102334a5dcb07e4fcc2b676be55fe2be (patch)
tree459d720365823b10473be028d25ad86b87b825f5 /src/c_tokenizer.cpp
parent100e8e15fa087be8975173c03a2f89b227b16730 (diff)
downloadzig-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.cpp61
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);
}