From eb65410b624d3aa8c56e7f2d2e68502030f8e981 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Thu, 9 May 2019 12:48:38 -0400 Subject: translate-c: enough C tokenization/parsing to handle shifting in macros See #2451 --- src/c_tokenizer.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'src/c_tokenizer.cpp') diff --git a/src/c_tokenizer.cpp b/src/c_tokenizer.cpp index 40ae8ceafe..0c17a67c9a 100644 --- a/src/c_tokenizer.cpp +++ b/src/c_tokenizer.cpp @@ -124,6 +124,8 @@ static void begin_token(CTokenize *ctok, CTokId id) { case CTokIdAsterisk: case CTokIdBang: case CTokIdTilde: + case CTokIdShl: + case CTokIdLt: break; } } @@ -223,6 +225,10 @@ void tokenize_c_macro(CTokenize *ctok, const uint8_t *c) { begin_token(ctok, CTokIdDot); end_token(ctok); break; + case '<': + begin_token(ctok, CTokIdLt); + ctok->state = CTokStateGotLt; + break; case '(': begin_token(ctok, CTokIdLParen); end_token(ctok); @@ -251,6 +257,18 @@ void tokenize_c_macro(CTokenize *ctok, const uint8_t *c) { return mark_error(ctok); } break; + case CTokStateGotLt: + switch (*c) { + case '<': + ctok->cur_tok->id = CTokIdShl; + end_token(ctok); + ctok->state = CTokStateStart; + break; + default: + ctok->state = CTokStateStart; + continue; + } + break; case CTokStateFloat: switch (*c) { case '.': @@ -791,6 +809,7 @@ found_end_of_macro: case CTokStateNumLitIntSuffixL: case CTokStateNumLitIntSuffixUL: case CTokStateNumLitIntSuffixLL: + case CTokStateGotLt: end_token(ctok); break; case CTokStateFloat: -- cgit v1.2.3 From 09cff0d2bdc2e0787154bedb77926d69e5393b11 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Thu, 9 May 2019 20:11:56 -0400 Subject: fix translate-c regression introduced in eb65410b624d3aa8c56e7f2d2e68502030f8e981 --- src/c_tokenizer.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src/c_tokenizer.cpp') diff --git a/src/c_tokenizer.cpp b/src/c_tokenizer.cpp index 0c17a67c9a..55fde19003 100644 --- a/src/c_tokenizer.cpp +++ b/src/c_tokenizer.cpp @@ -265,6 +265,7 @@ void tokenize_c_macro(CTokenize *ctok, const uint8_t *c) { ctok->state = CTokStateStart; break; default: + end_token(ctok); ctok->state = CTokStateStart; continue; } -- cgit v1.2.3