From cfc6523619c62d3eee505f53e7a18b253742961a Mon Sep 17 00:00:00 2001 From: David Gibson Date: Sat, 4 Jan 2014 10:03:55 +1100 Subject: 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 --- dtc-lexer.l | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) (limited to 'dtc-lexer.l') 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; } -- cgit v1.2.1