diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2014-01-04 10:03:55 +1100 |
---|---|---|
committer | David Gibson <david@gibson.dropbear.id.au> | 2014-01-04 10:03:55 +1100 |
commit | cfc6523619c62d3eee505f53e7a18b253742961a (patch) | |
tree | 328d3ecc4e0c9e46388386c2ba35d84aded4f398 /dtc-lexer.l | |
parent | b82b9776140a077db723f13832afd7e279a45184 (diff) | |
download | device-tree-compiler-cfc6523619c62d3eee505f53e7a18b253742961a.tar.gz |
Move character literal processing to the lexer
To match the processing of integer literals, character literals are passed
as a string from lexer to parser then interpreted there. This is just as
awkward as it was for integer literals, without the excuse that we used to
need the information about the dts version to process them correctly.
So, move character literal processing back to the lexer as well, cleaning
things up.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Diffstat (limited to 'dtc-lexer.l')
-rw-r--r-- | dtc-lexer.l | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/dtc-lexer.l b/dtc-lexer.l index ba5d150..0821bde 100644 --- a/dtc-lexer.l +++ b/dtc-lexer.l @@ -167,9 +167,23 @@ static void lexical_error(const char *fmt, ...); } <*>{CHAR_LITERAL} { - yytext[yyleng-1] = '\0'; - yylval.literal = xstrdup(yytext+1); - DPRINT("Character literal: %s\n", yylval.literal); + struct data d; + DPRINT("Character literal: %s\n", yytext); + + d = data_copy_escape_string(yytext+1, yyleng-2); + if (d.len == 1) { + lexical_error("Empty character literal"); + yylval.integer = 0; + return DT_CHAR_LITERAL; + } + + yylval.integer = (unsigned char)d.val[0]; + + if (d.len > 2) + lexical_error("Character literal has %d" + " characters instead of 1", + d.len - 1); + return DT_CHAR_LITERAL; } |