escapes: pretty-print some escapse and avoid ESC in debug logs

ERR("Hello '%c'", ESC) would result in "Hello '\033'" which means
the parent terminal (another terminology, maybe) would then try to
interpret ' as an escape char (ESC is \033 or 0x1b), and so it would
then forward more escapes to the parent.

Also, avoid printing BEL (and, well, beeping) when we are just
printing an error log.

I believe all those "Unhandled escape" logs should go to WRN or higher
log levels. Any thoughts, @billiob ?

See T2506 (for the test file)
This commit is contained in:
Jean-Philippe Andre 2015-06-24 13:46:48 +09:00
parent 0fa0a5d9c8
commit 09b4fddf84
1 changed files with 66 additions and 12 deletions

View File

@ -25,11 +25,67 @@
#define ST 0x9c // String Terminator
#define BEL 0x07 // Bell
#define ESC 033 // Escape
#define DEL 127
/* XXX: all handle_ functions return the number of bytes successfully read, 0
* if not enough bytes could be read
*/
static const char *ASCII_CHARS_TABLE[] =
{
"NUL", // '\0'
"SOH", // '\001'
"STX", // '\002'
"ETX", // '\003'
"EOT", // '\004'
"ENQ", // '\005'
"ACK", // '\006'
"BEL", // '\007'
"BS", // '\010'
"HT", // '\011'
"LF", // '\012'
"VT", // '\013'
"FF", // '\014'
"CR" , // '\015'
"SO", // '\016'
"SI", // '\017'
"DLE", // '\020'
"DC1", // '\021'
"DC2", // '\022'
"DC3", // '\023'
"DC4", // '\024'
"NAK", // '\025'
"SYN", // '\026'
"ETB", // '\027'
"CAN", // '\030'
"EM", // '\031'
"SUB", // '\032'
"ESC", // '\033'
"FS", // '\034'
"GS", // '\035'
"RS", // '\036'
"US" // '\037'
};
static const char *
_safechar(unsigned int c)
{
static char _str[9];
// This should avoid 'BEL' and 'ESC' in particular, which would
// have side effects in the parent terminal (esp. ESC).
if (c < (sizeof(ASCII_CHARS_TABLE) / sizeof(ASCII_CHARS_TABLE[0])))
return ASCII_CHARS_TABLE[c];
if (c == DEL)
return "DEL";
// The rest should be safe (?)
snprintf(_str, 9, "%c", c);
_str[8] = '\0';
return _str;
}
static int
_csi_arg_get(Eina_Unicode **ptr)
{
@ -660,7 +716,7 @@ _handle_esc_csi(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce)
if (cc == ce) return 0;
*b = 0;
b = buf;
DBG(" CSI: '%c' args '%s'", (int) *cc, (char *) buf);
DBG(" CSI: '%s' args '%s'", _safechar(*cc), (char *) buf);
switch (*cc)
{
case 'm': // color set
@ -1052,7 +1108,7 @@ unhandled:
else
eina_strbuf_append_char(bf, c[i]);
}
ERR("unhandled CSI '%c': %s", (int) *cc, eina_strbuf_string_get(bf));
ERR("unhandled CSI '%s': %s", _safechar(*cc), eina_strbuf_string_get(bf));
eina_strbuf_free(bf);
}
cc++;
@ -1491,8 +1547,7 @@ _handle_esc_dcs(Termpty *ty EINA_UNUSED, const Eina_Unicode *c, const Eina_Unico
/* Request status string */
if (len > 1 && buf[1] != 'q')
{
ERR("invalid/unhandled dsc esc '$%c' (expected '$q')",
(int) buf[1]);
ERR("invalid/unhandled dsc esc '$%s' (expected '$q')", _safechar(buf[1]));
goto end;
}
if (len < 4)
@ -1513,7 +1568,7 @@ _handle_esc_dcs(Termpty *ty EINA_UNUSED, const Eina_Unicode *c, const Eina_Unico
}
else
{
ERR("invalid/unhandled dsc esc '$q\"%c'", (int) buf[3]);
ERR("invalid/unhandled dsc esc '$q\"%s'", _safechar(buf[3]));
goto end;
}
break;
@ -1522,15 +1577,14 @@ _handle_esc_dcs(Termpty *ty EINA_UNUSED, const Eina_Unicode *c, const Eina_Unico
case 'r': /* DECSTBM */
/* TODO: */
default:
ERR("unhandled dsc request status string '$q%c'",
(int) buf[2]);
ERR("unhandled dsc request status string '$q%s'", _safechar(buf[2]));
goto end;
}
/* TODO */
break;
default:
// many others
ERR("Unhandled DCS escape '%c'", (int) buf[0]);
ERR("Unhandled DCS escape '%s'", _safechar(buf[0]));
break;
}
end:
@ -1543,7 +1597,7 @@ _handle_esc(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce)
int len = ce - c;
if (len < 1) return 0;
DBG("ESC: '%c'", (int) c[0]);
DBG("ESC: '%s'", _safechar(c[0]));
switch (c[0])
{
case '[':
@ -1664,7 +1718,7 @@ _handle_esc(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce)
return 1;
*/
default:
ERR("Unhandled escape '%c' (0x%02x)", (int) c[0], (unsigned int) c[0]);
ERR("Unhandled escape '%s' (0x%02x)", _safechar(c[0]), (unsigned int) c[0]);
return 1;
}
return 0;
@ -1685,7 +1739,7 @@ termpty_handle_seq(Termpty *ty, Eina_Unicode *c, Eina_Unicode *ce)
if ((c[j] < ' ') || (c[j] >= 0x7f))
printf("\033[35m%08x\033[0m", c[j]);
else
printf("%c", c[j]);
printf("%s", _safechar(c[j]));
}
printf("\n");
*/
@ -1839,7 +1893,7 @@ termpty_handle_seq(Termpty *ty, Eina_Unicode *c, Eina_Unicode *ce)
DBG("txt: [");
while ((cc < ce) && (*cc >= 0x20) && (*cc != 0x7f))
{
DBG("%c", (int) *cc);
DBG("%s", _safechar(*cc));
cc++;
len++;
}