diff options
author | Pierre Le Marre <dev@wismill.eu> | 2023-09-26 17:05:14 +0200 |
---|---|---|
committer | Wismill <dev@wismill.eu> | 2023-09-26 17:25:49 +0200 |
commit | 9d15c6a7a1834b02bcbabd4de736f58979759f29 (patch) | |
tree | ea9f21a774aaef89f926819742a656b9a31da40a | |
parent | 0038c866078a409b40d4d194f597768284d7ff32 (diff) | |
download | libxkbcommon-9d15c6a7a1834b02bcbabd4de736f58979759f29.tar.gz libxkbcommon-9d15c6a7a1834b02bcbabd4de736f58979759f29.tar.bz2 libxkbcommon-9d15c6a7a1834b02bcbabd4de736f58979759f29.zip |
Show invalid escape sequences
It is easier to debug when the message actually displays the offending
escape sequence.
-rw-r--r-- | src/compose/parser.c | 28 | ||||
-rw-r--r-- | 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 57be1bd..5545a33 100644 --- a/src/compose/parser.c +++ b/src/compose/parser.c @@ -171,6 +171,7 @@ skip_more_whitespace_and_comments: 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, '\\'); } @@ -181,24 +182,27 @@ skip_more_whitespace_and_comments: 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 800d2d0..57babbb 100644 --- a/src/xkbcomp/scanner.c +++ b/src/xkbcomp/scanner.c @@ -90,6 +90,7 @@ skip_more_whitespace_and_comments: 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 @@ skip_more_whitespace_and_comments: 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 { |