parseh: support octal in C macro string literal

This commit is contained in:
Andrew Kelley
2016-07-09 12:17:31 -07:00
parent 100e8e15fa
commit a5251a1c10
4 changed files with 79 additions and 6 deletions

View File

@@ -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);
}