parseh: support octal in C macro string literal
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user