- char buf[] = "syntax error, unexpected #";
- *strchr(buf, '#') = *yytext;
- lex_error(buf);
+ char buf[5] = { yytext[0] };
+ unsigned char c = buf[0];
+
+ if (!isprint(c) || c == '\\' || c == '\'') {
+ /* Encode nonprinting characters with C-style escapes */
+ buf[0] = '\\';
+ switch (c) {
+ case '\a': buf[1] = 'a'; break;
+ case '\b': buf[1] = 'b'; break;
+ case '\f': buf[1] = 'f'; break;
+ case '\n': buf[1] = 'n'; break;
+ case '\r': buf[1] = 'r'; break;
+ case '\t': buf[1] = 't'; break;
+ case '\v': buf[1] = 'v'; break;
+ case '\\': buf[1] = '\\'; break;
+ case '\'': buf[1] = '\''; break;
+ default:
+ buf[1] = '0' + ((c >> 6) & 3);
+ buf[2] = '0' + ((c >> 3) & 7);
+ buf[3] = '0' + ((c >> 0) & 7);
+ }
+ }
+
+ lex_error(_("syntax error, unexpected '%s'"), buf);