From dd68f0f15fec8e9d837fbe087016fba1c359b5ac Mon Sep 17 00:00:00 2001 From: Pierre Le Marre Date: Tue, 19 Sep 2023 17:54:35 +0200 Subject: [PATCH] Show invalid escape sequences It is easier to debug when the message actually display the offending escape sequence. --- src/compose/parser.c | 28 ++++++++++++++++------------ src/xkbcomp/scanner.c | 26 +++++++++++++------------- 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/src/compose/parser.c b/src/compose/parser.c index a13f6186a..517ea314e 100644 --- a/src/compose/parser.c +++ b/src/compose/parser.c @@ -174,6 +174,7 @@ lex(struct scanner *s, union lvalue *val) while (!scanner_eof(s) && !scanner_eol(s) && scanner_peek(s) != '\"') { if (scanner_chr(s, '\\')) { uint8_t o; + size_t start_pos = s->pos; if (scanner_chr(s, '\\')) { scanner_buf_append(s, '\\'); } @@ -184,24 +185,27 @@ lex(struct scanner *s, union lvalue *val) if (scanner_hex(s, &o) && is_valid_char((char) o)) { scanner_buf_append(s, (char) o); } else { - // [TODO] actually show the sequence scanner_warn_with_code(s, XKB_WARNING_INVALID_ESCAPE_SEQUENCE, - "illegal hexadecimal escape sequence in string literal"); + "illegal hexadecimal escape sequence (%.*s) in string literal", + (int) (s->pos - start_pos + 1), &s->s[start_pos - 1]); } } - else if (scanner_oct(s, &o)) { - if (is_valid_char((char) o)) { - scanner_buf_append(s, (char) o); - } else { - // [TODO] actually show the sequence - scanner_warn_with_code(s, - XKB_WARNING_INVALID_ESCAPE_SEQUENCE, - "illegal octal escape sequence in string literal"); - } + else if (scanner_oct(s, &o) && is_valid_char((char) o)) { + scanner_buf_append(s, (char) o); + } + else if (s->pos > start_pos) { + scanner_warn_with_code(s, + XKB_WARNING_INVALID_ESCAPE_SEQUENCE, + "illegal octal escape sequence (%.*s) in string literal", + (int) (s->pos - start_pos + 1), &s->s[start_pos - 1]); + /* Ignore. */ } else { - scanner_warn(s, "unknown escape sequence (%c) in string literal", scanner_peek(s)); + scanner_warn_with_code(s, + XKB_WARNING_UNKNOWN_CHAR_ESCAPE_SEQUENCE, + "unknown escape sequence (\\%c) in string literal", + scanner_peek(s)); /* Ignore. */ } } else { diff --git a/src/xkbcomp/scanner.c b/src/xkbcomp/scanner.c index 336b3c722..6f1450602 100644 --- a/src/xkbcomp/scanner.c +++ b/src/xkbcomp/scanner.c @@ -90,6 +90,7 @@ _xkbcommon_lex(YYSTYPE *yylval, struct scanner *s) while (!scanner_eof(s) && !scanner_eol(s) && scanner_peek(s) != '\"') { if (scanner_chr(s, '\\')) { uint8_t o; + size_t start_pos = s->pos; if (scanner_chr(s, '\\')) scanner_buf_append(s, '\\'); else if (scanner_chr(s, 'n')) scanner_buf_append(s, '\n'); else if (scanner_chr(s, 't')) scanner_buf_append(s, '\t'); @@ -98,20 +99,19 @@ _xkbcommon_lex(YYSTYPE *yylval, struct scanner *s) else if (scanner_chr(s, 'f')) scanner_buf_append(s, '\f'); else if (scanner_chr(s, 'v')) scanner_buf_append(s, '\v'); else if (scanner_chr(s, 'e')) scanner_buf_append(s, '\033'); - else if (scanner_oct(s, &o)) { - if (is_valid_char((char) o)) { - scanner_buf_append(s, (char) o); - } else { - scanner_warn_with_code(s, - XKB_WARNING_INVALID_ESCAPE_SEQUENCE, - "invalid octal escape sequence: \\%o", o); - } - } + else if (scanner_oct(s, &o) && is_valid_char((char) o)) + scanner_buf_append(s, (char) o); + else if (s->pos > start_pos) + scanner_warn_with_code(s, + XKB_WARNING_INVALID_ESCAPE_SEQUENCE, + "invalid octal escape sequence (%.*s) in string literal", + (int) (s->pos - start_pos + 1), &s->s[start_pos - 1]); + /* Ignore. */ else { - // TODO: display actual sequence! See: scanner_peek(s). - // require escaping any potential control character - scanner_warn_with_code(s, XKB_WARNING_UNKNOWN_CHAR_ESCAPE_SEQUENCE, - "unknown escape sequence in string literal"); + scanner_warn_with_code(s, + XKB_WARNING_UNKNOWN_CHAR_ESCAPE_SEQUENCE, + "unknown escape sequence (\\%c) in string literal", + scanner_peek(s)); /* Ignore. */ } } else {