Make dispatch_unicode_char re-useable

This commit is contained in:
Kovid Goyal 2021-06-30 08:29:40 +05:30
parent 5932ddb0fe
commit d6b6d3f59f
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -155,7 +155,7 @@ static inline void
screen_nel(Screen *screen) { screen_carriage_return(screen); screen_linefeed(screen); } screen_nel(Screen *screen) { screen_carriage_return(screen); screen_linefeed(screen); }
static inline void static inline void
handle_normal_mode_char(Screen *screen, uint32_t ch, PyObject DUMP_UNUSED *dump_callback) { dispatch_normal_mode_char(Screen *screen, uint32_t ch, PyObject DUMP_UNUSED *dump_callback) {
#define CALL_SCREEN_HANDLER(name) REPORT_COMMAND(name); name(screen); break; #define CALL_SCREEN_HANDLER(name) REPORT_COMMAND(name); name(screen); break;
switch(ch) { switch(ch) {
case BEL: case BEL:
@ -204,7 +204,7 @@ handle_normal_mode_char(Screen *screen, uint32_t ch, PyObject DUMP_UNUSED *dump_
// Esc mode {{{ // Esc mode {{{
static inline void static inline void
handle_esc_mode_char(Screen *screen, uint32_t ch, PyObject DUMP_UNUSED *dump_callback) { dispatch_esc_mode_char(Screen *screen, uint32_t ch, PyObject DUMP_UNUSED *dump_callback) {
#define CALL_ED(name) REPORT_COMMAND(name); name(screen); SET_STATE(0); #define CALL_ED(name) REPORT_COMMAND(name); name(screen); SET_STATE(0);
#define CALL_ED1(name, ch) REPORT_COMMAND(name, ch); name(screen, ch); SET_STATE(0); #define CALL_ED1(name, ch) REPORT_COMMAND(name, ch); name(screen, ch); SET_STATE(0);
#define CALL_ED2(name, a, b) REPORT_COMMAND(name, a, b); name(screen, a, b); SET_STATE(0); #define CALL_ED2(name, a, b) REPORT_COMMAND(name, a, b); name(screen, a, b); SET_STATE(0);
@ -1223,7 +1223,7 @@ END_ALLOW_CASE_RANGE
case IND: case IND:
case RI: case RI:
case HTS: case HTS:
handle_normal_mode_char(screen, ch, dump_callback); dispatch_normal_mode_char(screen, ch, dump_callback);
break; break;
case NUL: case NUL:
case DEL: case DEL:
@ -1239,46 +1239,46 @@ END_ALLOW_CASE_RANGE
#undef ENSURE_SPACE #undef ENSURE_SPACE
} }
#define dispatch_unicode_char(codepoint, watch_for_pending) { \ #define dispatch_unicode_char(codepoint, dispatch, watch_for_pending) { \
switch(screen->parser_state) { \ switch(screen->parser_state) { \
case ESC: \ case ESC: \
handle_esc_mode_char(screen, codepoint, dump_callback); \ dispatch##_esc_mode_char(screen, codepoint, dump_callback); \
break; \ break; \
case CSI: \ case CSI: \
if (accumulate_csi(screen, codepoint, dump_callback)) { dispatch_csi(screen, dump_callback); SET_STATE(0); watch_for_pending; } \ if (accumulate_csi(screen, codepoint, dump_callback)) { dispatch##_csi(screen, dump_callback); SET_STATE(0); watch_for_pending; } \
break; \ break; \
case OSC: \ case OSC: \
if (accumulate_osc(screen, codepoint, dump_callback)) { dispatch_osc(screen, dump_callback); SET_STATE(0); } \ if (accumulate_osc(screen, codepoint, dump_callback)) { dispatch##_osc(screen, dump_callback); SET_STATE(0); } \
break; \ break; \
case APC: \ case APC: \
if (accumulate_oth(screen, codepoint, dump_callback)) { dispatch_apc(screen, dump_callback); SET_STATE(0); } \ if (accumulate_oth(screen, codepoint, dump_callback)) { dispatch##_apc(screen, dump_callback); SET_STATE(0); } \
break; \ break; \
case PM: \ case PM: \
if (accumulate_oth(screen, codepoint, dump_callback)) { dispatch_pm(screen, dump_callback); SET_STATE(0); } \ if (accumulate_oth(screen, codepoint, dump_callback)) { dispatch##_pm(screen, dump_callback); SET_STATE(0); } \
break; \ break; \
case DCS: \ case DCS: \
if (accumulate_dcs(screen, codepoint, dump_callback)) { dispatch_dcs(screen, dump_callback); SET_STATE(0); watch_for_pending; } \ if (accumulate_dcs(screen, codepoint, dump_callback)) { dispatch##_dcs(screen, dump_callback); SET_STATE(0); watch_for_pending; } \
if (screen->parser_state == ESC) { handle_esc_mode_char(screen, codepoint, dump_callback); break; } \ if (screen->parser_state == ESC) { dispatch##_esc_mode_char(screen, codepoint, dump_callback); } \
break; \ break; \
default: \ default: \
handle_normal_mode_char(screen, codepoint, dump_callback); \ dispatch##_normal_mode_char(screen, codepoint, dump_callback); \
break; \ break; \
} \ } \
} \ } \
extern uint32_t *latin1_charset; extern uint32_t *latin1_charset;
#define decode_loop(watch_for_pending) { \ #define decode_loop(dispatch, watch_for_pending) { \
i = 0; \ i = 0; \
uint32_t prev = screen->utf8_state; \ uint32_t prev = screen->utf8_state; \
while(i < (size_t)len) { \ while(i < (size_t)len) { \
uint8_t ch = buf[i++]; \ uint8_t ch = buf[i++]; \
if (screen->use_latin1) { \ if (screen->use_latin1) { \
dispatch_unicode_char(latin1_charset[ch], watch_for_pending); \ dispatch_unicode_char(latin1_charset[ch], dispatch, watch_for_pending); \
} else { \ } else { \
switch (decode_utf8(&screen->utf8_state, &screen->utf8_codepoint, ch)) { \ switch (decode_utf8(&screen->utf8_state, &screen->utf8_codepoint, ch)) { \
case UTF8_ACCEPT: \ case UTF8_ACCEPT: \
dispatch_unicode_char(screen->utf8_codepoint, watch_for_pending); \ dispatch_unicode_char(screen->utf8_codepoint, dispatch, watch_for_pending); \
break; \ break; \
case UTF8_REJECT: \ case UTF8_REJECT: \
screen->utf8_state = UTF8_ACCEPT; \ screen->utf8_state = UTF8_ACCEPT; \
@ -1293,20 +1293,19 @@ extern uint32_t *latin1_charset;
static inline void static inline void
_parse_bytes(Screen *screen, const uint8_t *buf, Py_ssize_t len, PyObject DUMP_UNUSED *dump_callback) { _parse_bytes(Screen *screen, const uint8_t *buf, Py_ssize_t len, PyObject DUMP_UNUSED *dump_callback) {
unsigned int i; unsigned int i;
decode_loop(;); decode_loop(dispatch, ;);
FLUSH_DRAW; FLUSH_DRAW;
} }
static inline size_t static inline size_t
_parse_bytes_watching_for_pending(Screen *screen, const uint8_t *buf, Py_ssize_t len, PyObject DUMP_UNUSED *dump_callback) { _parse_bytes_watching_for_pending(Screen *screen, const uint8_t *buf, Py_ssize_t len, PyObject DUMP_UNUSED *dump_callback) {
unsigned int i; unsigned int i;
decode_loop(if (screen->pending_mode.activated_at) goto end); decode_loop(dispatch, if (screen->pending_mode.activated_at) goto end);
end: end:
FLUSH_DRAW; FLUSH_DRAW;
return i; return i;
} }
static size_t static size_t
_queue_pending_bytes(Screen *screen, const uint8_t *buf, size_t len, PyObject *dump_callback DUMP_UNUSED) { _queue_pending_bytes(Screen *screen, const uint8_t *buf, size_t len, PyObject *dump_callback DUMP_UNUSED) {
size_t pos = 0; size_t pos = 0;