Pull out the dispatching of unicode characters
This commit is contained in:
parent
45a5190a0d
commit
f36aa19c3f
@ -210,7 +210,7 @@ handle_esc_mode_char(Screen *screen, uint32_t ch, PyObject DUMP_UNUSED *dump_cal
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if ((screen->parser_buf[0] == '%' && ch == 'G') || (screen->parser_buf[0] == '(' && ch == 'B')) {
|
if ((screen->parser_buf[0] == '%' && ch == 'G') || ((screen->parser_buf[0] == '(' || screen->parser_buf[0] == ')') && ch == 'B')) {
|
||||||
// switch to utf-8 or ascii, since we are always in utf-8, ignore.
|
// switch to utf-8 or ascii, since we are always in utf-8, ignore.
|
||||||
} else if (screen->parser_buf[0] == '#') {
|
} else if (screen->parser_buf[0] == '#') {
|
||||||
if (ch == '8') {
|
if (ch == '8') {
|
||||||
@ -574,29 +574,35 @@ END_ALLOW_CASE_RANGE
|
|||||||
#undef ENSURE_SPACE
|
#undef ENSURE_SPACE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
dispatch_unicode_char(Screen *screen, uint32_t codepoint, PyObject DUMP_UNUSED *dump_callback) {
|
||||||
|
#define HANDLE(name) handle_##name(screen, codepoint, dump_callback); break
|
||||||
|
switch(screen->parser_state) {
|
||||||
|
case ESC:
|
||||||
|
HANDLE(esc_mode_char);
|
||||||
|
case CSI:
|
||||||
|
if (accumulate_csi(screen, codepoint, dump_callback)) { dispatch_csi(screen, dump_callback); SET_STATE(0); }
|
||||||
|
break;
|
||||||
|
case OSC:
|
||||||
|
if (accumulate_osc(screen, codepoint, dump_callback)) { dispatch_osc(screen, dump_callback); SET_STATE(0); }
|
||||||
|
break;
|
||||||
|
case DCS:
|
||||||
|
if (accumulate_dcs(screen, codepoint, dump_callback)) { dispatch_dcs(screen, dump_callback); SET_STATE(0); }
|
||||||
|
if (screen->parser_state == ESC) { HANDLE(esc_mode_char); }
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
HANDLE(normal_mode_char);
|
||||||
|
}
|
||||||
|
#undef HANDLE
|
||||||
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
_parse_bytes(Screen *screen, uint8_t *buf, Py_ssize_t len, PyObject DUMP_UNUSED *dump_callback) {
|
_parse_bytes(Screen *screen, uint8_t *buf, Py_ssize_t len, PyObject DUMP_UNUSED *dump_callback) {
|
||||||
#define HANDLE(name) handle_##name(screen, codepoint, dump_callback); break
|
|
||||||
uint32_t prev = screen->utf8_state, codepoint = 0;
|
uint32_t prev = screen->utf8_state, codepoint = 0;
|
||||||
for (unsigned int i = 0; i < len; i++, prev = screen->utf8_state) {
|
for (unsigned int i = 0; i < len; i++, prev = screen->utf8_state) {
|
||||||
switch (decode_utf8(&screen->utf8_state, &codepoint, buf[i])) {
|
switch (decode_utf8(&screen->utf8_state, &codepoint, buf[i])) {
|
||||||
case UTF8_ACCEPT:
|
case UTF8_ACCEPT:
|
||||||
switch(screen->parser_state) {
|
dispatch_unicode_char(screen, codepoint, dump_callback);
|
||||||
case ESC:
|
|
||||||
HANDLE(esc_mode_char);
|
|
||||||
case CSI:
|
|
||||||
if (accumulate_csi(screen, codepoint, dump_callback)) { dispatch_csi(screen, dump_callback); SET_STATE(0); }
|
|
||||||
break;
|
|
||||||
case OSC:
|
|
||||||
if (accumulate_osc(screen, codepoint, dump_callback)) { dispatch_osc(screen, dump_callback); SET_STATE(0); }
|
|
||||||
break;
|
|
||||||
case DCS:
|
|
||||||
if (accumulate_dcs(screen, codepoint, dump_callback)) { dispatch_dcs(screen, dump_callback); SET_STATE(0); }
|
|
||||||
if (screen->parser_state == ESC) { HANDLE(esc_mode_char); }
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
HANDLE(normal_mode_char);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case UTF8_REJECT:
|
case UTF8_REJECT:
|
||||||
screen->utf8_state = UTF8_ACCEPT;
|
screen->utf8_state = UTF8_ACCEPT;
|
||||||
@ -605,7 +611,6 @@ _parse_bytes(Screen *screen, uint8_t *buf, Py_ssize_t len, PyObject DUMP_UNUSED
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
FLUSH_DRAW;
|
FLUSH_DRAW;
|
||||||
#undef HANDLE
|
|
||||||
}
|
}
|
||||||
// }}}
|
// }}}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user