Commit 9d15c6a7a1834b02bcbabd4de736f58979759f29

Pierre Le Marre 2023-09-26T17:05:14

Show invalid escape sequences It is easier to debug when the message actually displays the offending escape sequence.

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 {