diff options
author | ragge <ragge> | 2008-06-29 12:54:03 +0000 |
---|---|---|
committer | ragge <ragge> | 2008-06-29 12:54:03 +0000 |
commit | 0105e26990a78681d760e563f61f79f56f43072d (patch) | |
tree | 902799e5e872081179a6f1bb6c39d66589ee3a09 | |
parent | 980212211f589cdb8aedb4a70bf4b3b5483c11e3 (diff) |
Let macros inside character constants be expanded if traditional.
XXX - not a perfect solution.
-rw-r--r-- | scanner.l | 20 |
1 files changed, 11 insertions, 9 deletions
@@ -45,7 +45,7 @@ %{ static void cvtdig(int rad); -static int charcon(void); +static int charcon(usch *); static void elsestmt(void); static void ifdefstmt(void); static void ifndefstmt(void); @@ -198,11 +198,16 @@ WS [\t ] } 0{D}+{IS}? { scale = 8; goto num; } {D}+{IS}? { scale = 10; goto num; } -L?'(\\.|[^\\'])+' { if (YYSTATE) { +'(\\.|[^\\'])+' { + if (YYSTATE || slow) { yylval.node.op = NUMBER; - yylval.node.nd_val = charcon(); + yylval.node.nd_val = charcon(yytext); + return (NUMBER); } - PRTOUT(NUMBER); + if (tflag) + yyless(1); + if (!flslvl) + putstr((usch *)yytext); } <IFR>. { return yytext[0]; } @@ -556,14 +561,11 @@ cvtdig(int rad) } static int -charcon(void) +charcon(usch *p) { - usch *p = (usch *)yytext; int val, c; - if (*p == 'L') - p++; - p++; /* first ' */ + p++; /* skip first ' */ val = 0; if (*p++ == '\\') { switch (*p++) { |