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; } diff --git a/dtc-parser.y b/dtc-parser.y index 0ce0815..efe81dd 100644 --- a/dtc-parser.y +++ b/dtc-parser.y @@ -32,13 +32,10 @@ extern void yyerror(char const *s); extern struct boot_info *the_boot_info; extern bool treesource_error; - -static unsigned char eval_char_literal(const char *s); %} %union { char *propnodename; - char *literal; char *labelref; unsigned int cbase; uint8_t byte; @@ -65,7 +62,7 @@ static unsigned char eval_char_literal(const char *s); %token DT_DEL_NODE %token DT_PROPNODENAME %token DT_LITERAL -%token DT_CHAR_LITERAL +%token DT_CHAR_LITERAL %token DT_BASE %token DT_BYTE %token DT_STRING @@ -336,9 +333,6 @@ arrayprefix: integer_prim: DT_LITERAL | DT_CHAR_LITERAL - { - $$ = eval_char_literal($1); - } | '(' integer_expr ')' { $$ = $2; @@ -482,29 +476,3 @@ void print_error(char const *fmt, ...) void yyerror(char const *s) { print_error("%s", s); } - -static unsigned char eval_char_literal(const char *s) -{ - int i = 1; - char c = s[0]; - - if (c == '\0') - { - print_error("empty character literal"); - return 0; - } - - /* - * If the first character in the character literal is a \ then process - * the remaining characters as an escape encoding. If the first - * character is neither an escape or a terminator it should be the only - * character in the literal and will be returned. - */ - if (c == '\\') - c = get_escape_char(s, &i); - - if (s[i] != '\0') - print_error("malformed character literal"); - - return c; -}