- if (chr(s, '\\')) buf_append(s, '\\');
- else if (chr(s, 'n')) buf_append(s, '\n');
- else if (chr(s, 't')) buf_append(s, '\t');
- else if (chr(s, 'r')) buf_append(s, '\r');
- else if (chr(s, 'b')) buf_append(s, '\b');
- else if (chr(s, 'f')) buf_append(s, '\f');
- else if (chr(s, 'v')) buf_append(s, '\v');
- else if (chr(s, 'e')) buf_append(s, '\033');
- else if (oct(s, &o)) buf_append(s, (char) 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');
+ else if (scanner_chr(s, 'r')) scanner_buf_append(s, '\r');
+ else if (scanner_chr(s, 'b')) scanner_buf_append(s, '\b');
+ 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) && 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. */