vt: don't special case UTF-8 collect state

This commit is contained in:
Daniel Eklöf 2019-12-20 22:10:27 +01:00
parent 2d79497093
commit d29de6f90a
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F

79
vt.c
View file

@ -20,8 +20,6 @@
/* https://vt100.net/emu/dec_ansi_parser */ /* https://vt100.net/emu/dec_ansi_parser */
enum state { enum state {
STATE_SAME, /* For state_transition */
STATE_GROUND, STATE_GROUND,
STATE_ESCAPE, STATE_ESCAPE,
STATE_ESCAPE_INTERMEDIATE, STATE_ESCAPE_INTERMEDIATE,
@ -41,12 +39,12 @@ enum state {
STATE_SOS_PM_APC_STRING, STATE_SOS_PM_APC_STRING,
STATE_UTF8_COLLECT, STATE_UTF8_COLLECT_1,
STATE_UTF8_COLLECT_2,
STATE_UTF8_COLLECT_3,
}; };
enum action { enum action {
ACTION_NONE, /* For state_transition */
ACTION_IGNORE, ACTION_IGNORE,
ACTION_CLEAR, ACTION_CLEAR,
ACTION_EXECUTE, ACTION_EXECUTE,
@ -68,13 +66,11 @@ enum action {
ACTION_UTF8_2_ENTRY, ACTION_UTF8_2_ENTRY,
ACTION_UTF8_3_ENTRY, ACTION_UTF8_3_ENTRY,
ACTION_UTF8_4_ENTRY, ACTION_UTF8_4_ENTRY,
ACTION_UTF8_COLLECT,
ACTION_UTF8_PRINT, ACTION_UTF8_PRINT,
}; };
#if defined(_DEBUG) && defined(LOG_ENABLE_DBG) && LOG_ENABLE_DBG && 0 #if defined(_DEBUG) && defined(LOG_ENABLE_DBG) && LOG_ENABLE_DBG && 0
static const char *const state_names[] = { static const char *const state_names[] = {
[STATE_SAME] = "no change",
[STATE_GROUND] = "ground", [STATE_GROUND] = "ground",
[STATE_ESCAPE] = "escape", [STATE_ESCAPE] = "escape",
@ -95,11 +91,11 @@ static const char *const state_names[] = {
[STATE_SOS_PM_APC_STRING] = "sos/pm/apc string", [STATE_SOS_PM_APC_STRING] = "sos/pm/apc string",
[STATE_UTF8_COLLECT] = "UTF-8", [STATE_UTF8_COLLECT_1] = "UTF8 collect (1 left)",
[STATE_UTF8_COLLECT_2] = "UTF8 collect (2 left)",
[STATE_UTF8_COLLECT_3] = "UTF8 collect (3 left)",
}; };
#endif
static const char *const action_names[] __attribute__((unused)) = { static const char *const action_names[] __attribute__((unused)) = {
[ACTION_NONE] = "no action",
[ACTION_IGNORE] = "ignore", [ACTION_IGNORE] = "ignore",
[ACTION_CLEAR] = "clear", [ACTION_CLEAR] = "clear",
[ACTION_EXECUTE] = "execute", [ACTION_EXECUTE] = "execute",
@ -118,15 +114,16 @@ static const char *const action_names[] __attribute__((unused)) = {
[ACTION_UTF8_2_ENTRY] = "UTF-8 (2 chars) begin", [ACTION_UTF8_2_ENTRY] = "UTF-8 (2 chars) begin",
[ACTION_UTF8_3_ENTRY] = "UTF-8 (3 chars) begin", [ACTION_UTF8_3_ENTRY] = "UTF-8 (3 chars) begin",
[ACTION_UTF8_4_ENTRY] = "UTF-8 (4 chars) begin", [ACTION_UTF8_4_ENTRY] = "UTF-8 (4 chars) begin",
[ACTION_UTF8_COLLECT] = "UTF-8 collect",
[ACTION_UTF8_PRINT] = "UTF-8 print", [ACTION_UTF8_PRINT] = "UTF-8 print",
}; };
#endif
#if 0
struct state_transition { struct state_transition {
enum action action; enum action action;
enum state state; enum state state;
}; };
#endif
#if 0 #if 0
static const struct state_transition state_anywhere[256] = { static const struct state_transition state_anywhere[256] = {
[0x18] = {.action = ACTION_EXECUTE, .state = STATE_GROUND}, [0x18] = {.action = ACTION_EXECUTE, .state = STATE_GROUND},
@ -535,7 +532,7 @@ static const struct state_transition* states[] = {
[STATE_SOS_PM_APC_STRING] = state_sos_pm_apc_string, [STATE_SOS_PM_APC_STRING] = state_sos_pm_apc_string,
}; };
#endif #endif
#if 0
static const enum action entry_actions[] = { static const enum action entry_actions[] = {
[STATE_SAME] = ACTION_NONE, [STATE_SAME] = ACTION_NONE,
[STATE_GROUND] = ACTION_NONE, [STATE_GROUND] = ACTION_NONE,
@ -571,7 +568,7 @@ static const enum action exit_actions[] = {
[STATE_DCS_PASSTHROUGH] = ACTION_UNHOOK, [STATE_DCS_PASSTHROUGH] = ACTION_UNHOOK,
[STATE_SOS_PM_APC_STRING] = ACTION_NONE, [STATE_SOS_PM_APC_STRING] = ACTION_NONE,
}; };
#endif
#if defined(LOG_ENABLE_DBG) && LOG_ENABLE_DBG #if defined(LOG_ENABLE_DBG) && LOG_ENABLE_DBG
static const char * static const char *
esc_as_string(struct terminal *term, uint8_t final) esc_as_string(struct terminal *term, uint8_t final)
@ -845,9 +842,6 @@ static void
action(struct terminal *term, enum action _action, uint8_t c) action(struct terminal *term, enum action _action, uint8_t c)
{ {
switch (_action) { switch (_action) {
case ACTION_NONE:
break;
case ACTION_IGNORE: case ACTION_IGNORE:
break; break;
@ -1054,6 +1048,7 @@ action(struct terminal *term, enum action _action, uint8_t c)
term->vt.utf8.left--; term->vt.utf8.left--;
break; break;
#if 0
case ACTION_UTF8_COLLECT: case ACTION_UTF8_COLLECT:
term->vt.utf8.data[term->vt.utf8.idx++] = c; term->vt.utf8.data[term->vt.utf8.idx++] = c;
if (--term->vt.utf8.left == 0) { if (--term->vt.utf8.left == 0) {
@ -1061,6 +1056,7 @@ action(struct terminal *term, enum action _action, uint8_t c)
action_print_utf8(term); action_print_utf8(term);
} }
break; break;
#endif
} }
} }
@ -1075,9 +1071,9 @@ state_ground_switch(struct terminal *term, uint8_t data)
case 0x20 ... 0x7f: action(term, ACTION_PRINT, data); return STATE_GROUND; case 0x20 ... 0x7f: action(term, ACTION_PRINT, data); return STATE_GROUND;
case 0xc0 ... 0xdf: action(term, ACTION_UTF8_2_ENTRY, data); return STATE_UTF8_COLLECT; case 0xc0 ... 0xdf: action(term, ACTION_UTF8_2_ENTRY, data); return STATE_UTF8_COLLECT_1;
case 0xe0 ... 0xef: action(term, ACTION_UTF8_3_ENTRY, data); return STATE_UTF8_COLLECT; case 0xe0 ... 0xef: action(term, ACTION_UTF8_3_ENTRY, data); return STATE_UTF8_COLLECT_2;
case 0xf0 ... 0xf7: action(term, ACTION_UTF8_4_ENTRY, data); return STATE_UTF8_COLLECT; case 0xf0 ... 0xf7: action(term, ACTION_UTF8_4_ENTRY, data); return STATE_UTF8_COLLECT_3;
/* Anywhere */ /* Anywhere */
case 0x18: action(term, ACTION_EXECUTE, data); return STATE_GROUND; case 0x18: action(term, ACTION_EXECUTE, data); return STATE_GROUND;
@ -1526,6 +1522,37 @@ state_sos_pm_apc_string_switch(struct terminal *term, uint8_t data)
} }
} }
static enum state
state_utf8_collect_1_switch(struct terminal *term, uint8_t data)
{
term->vt.utf8.data[term->vt.utf8.idx++] = data;
term->vt.utf8.left--;
assert(term->vt.utf8.left == 0);
action(term, ACTION_UTF8_PRINT, data);
return STATE_GROUND;
}
static enum state
state_utf8_collect_2_switch(struct terminal *term, uint8_t data)
{
term->vt.utf8.data[term->vt.utf8.idx++] = data;
term->vt.utf8.left--;
assert(term->vt.utf8.left == 1);
return STATE_UTF8_COLLECT_1;
}
static enum state
state_utf8_collect_3_switch(struct terminal *term, uint8_t data)
{
term->vt.utf8.data[term->vt.utf8.idx++] = data;
term->vt.utf8.left--;
assert(term->vt.utf8.left == 2);
return STATE_UTF8_COLLECT_2;
}
void void
vt_from_slave(struct terminal *term, const uint8_t *data, size_t len) vt_from_slave(struct terminal *term, const uint8_t *data, size_t len)
{ {
@ -1533,15 +1560,15 @@ vt_from_slave(struct terminal *term, const uint8_t *data, size_t len)
enum state current_state = term->vt.state enum state current_state = term->vt.state
; ;
for (size_t i = 0; i < len; i++) { for (size_t i = 0; i < len; i++) {
#if 0
if (current_state == STATE_UTF8_COLLECT) { if (current_state == STATE_UTF8_COLLECT) {
action(term, ACTION_UTF8_COLLECT, data[i]); action(term, ACTION_UTF8_COLLECT, data[i]);
current_state = term->vt.state; current_state = term->vt.state;
continue; continue;
} }
const struct state_transition *table = NULL; const struct state_transition *table = NULL;
#endif
switch (current_state) { switch (current_state) {
case STATE_GROUND: term->vt.state = current_state = state_ground_switch(term, data[i]); continue; case STATE_GROUND: term->vt.state = current_state = state_ground_switch(term, data[i]); continue;
@ -1559,10 +1586,13 @@ vt_from_slave(struct terminal *term, const uint8_t *data, size_t len)
case STATE_DCS_PASSTHROUGH: term->vt.state = current_state = state_dcs_passthrough_switch(term, data[i]); continue; case STATE_DCS_PASSTHROUGH: term->vt.state = current_state = state_dcs_passthrough_switch(term, data[i]); continue;
case STATE_SOS_PM_APC_STRING: term->vt.state = current_state = state_sos_pm_apc_string_switch(term, data[i]); continue; case STATE_SOS_PM_APC_STRING: term->vt.state = current_state = state_sos_pm_apc_string_switch(term, data[i]); continue;
case STATE_SAME: case STATE_UTF8_COLLECT_1: term->vt.state = current_state = state_utf8_collect_1_switch(term, data[i]); continue;
case STATE_UTF8_COLLECT: assert(false); break; case STATE_UTF8_COLLECT_2: term->vt.state = current_state = state_utf8_collect_2_switch(term, data[i]); continue;
case STATE_UTF8_COLLECT_3: term->vt.state = current_state = state_utf8_collect_3_switch(term, data[i]); continue;
} }
#if 0
assert(table != NULL); assert(table != NULL);
const struct state_transition *transition = &table[data[i]]; const struct state_transition *transition = &table[data[i]];
@ -1584,5 +1614,6 @@ vt_from_slave(struct terminal *term, const uint8_t *data, size_t len)
enum action entry_action = entry_actions[transition->state]; enum action entry_action = entry_actions[transition->state];
action(term, entry_action, data[i]); action(term, entry_action, data[i]);
} }
#endif
} }
} }