From a575204bc77c711047740d2328d26043e8c976cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 20 Dec 2019 23:45:21 +0100 Subject: [PATCH] vt: refactor --- vt.c | 409 ++++++++++++++++++++++++++++++----------------------------- 1 file changed, 208 insertions(+), 201 deletions(-) diff --git a/vt.c b/vt.c index 114aba02..5992ee9c 100644 --- a/vt.c +++ b/vt.c @@ -567,33 +567,33 @@ action_utf8_print(struct terminal *term, uint8_t c) } static enum state -state_ground_switch(struct terminal *term, uint8_t data) +state_ground_switch(struct terminal *term, uint8_t c) { - switch (data) { + switch (c) { /* exit current enter new state */ case 0x00 ... 0x17: case 0x19: - case 0x1c ... 0x1f: action_execute(term, data); return STATE_GROUND; + case 0x1c ... 0x1f: action_execute(term, c); return STATE_GROUND; - case 0x20 ... 0x7f: action_print(term, data); return STATE_GROUND; + case 0x20 ... 0x7f: action_print(term, c); return STATE_GROUND; - case 0xc0 ... 0xdf: action_utf8_2_entry(term, data); return STATE_UTF8_COLLECT_1; - case 0xe0 ... 0xef: action_utf8_3_entry(term, data); return STATE_UTF8_COLLECT_2; - case 0xf0 ... 0xf7: action_utf8_4_entry(term, data); return STATE_UTF8_COLLECT_3; + case 0xc0 ... 0xdf: action_utf8_2_entry(term, c); return STATE_UTF8_COLLECT_1; + case 0xe0 ... 0xef: action_utf8_3_entry(term, c); return STATE_UTF8_COLLECT_2; + case 0xf0 ... 0xf7: action_utf8_4_entry(term, c); return STATE_UTF8_COLLECT_3; /* Anywhere */ - case 0x18: action_execute(term, data); return STATE_GROUND; - case 0x1a: action_execute(term, data); return STATE_GROUND; + case 0x18: action_execute(term, c); return STATE_GROUND; + case 0x1a: action_execute(term, c); return STATE_GROUND; case 0x1b: action_clear(term); return STATE_ESCAPE; - case 0x80 ... 0x8f: action_execute(term, data); return STATE_GROUND; + case 0x80 ... 0x8f: action_execute(term, c); return STATE_GROUND; case 0x90: action_clear(term); return STATE_DCS_ENTRY; - case 0x91 ... 0x97: action_execute(term, data); return STATE_GROUND; + case 0x91 ... 0x97: action_execute(term, c); return STATE_GROUND; case 0x98: return STATE_SOS_PM_APC_STRING; - case 0x99: action_execute(term, data); return STATE_GROUND; - case 0x9a: action_execute(term, data); return STATE_GROUND; + case 0x99: action_execute(term, c); return STATE_GROUND; + case 0x9a: action_execute(term, c); return STATE_GROUND; case 0x9b: action_clear(term); return STATE_CSI_ENTRY; case 0x9c: return STATE_GROUND; - case 0x9d: action_osc_start(term, data); return STATE_OSC_STRING; + case 0x9d: action_osc_start(term, c); return STATE_OSC_STRING; case 0x9e ... 0x9f: return STATE_SOS_PM_APC_STRING; default: return STATE_GROUND; @@ -601,41 +601,41 @@ state_ground_switch(struct terminal *term, uint8_t data) } static enum state -state_escape_switch(struct terminal *term, uint8_t data) +state_escape_switch(struct terminal *term, uint8_t c) { - switch (data) { + switch (c) { /* exit current enter new state */ case 0x00 ... 0x17: case 0x19: - case 0x1c ... 0x1f: action_execute(term, data); return STATE_ESCAPE; + case 0x1c ... 0x1f: action_execute(term, c); return STATE_ESCAPE; - case 0x20 ... 0x2f: action_collect(term, data); return STATE_ESCAPE_INTERMEDIATE; - case 0x30 ... 0x4f: action_esc_dispatch(term, data); return STATE_GROUND; + case 0x20 ... 0x2f: action_collect(term, c); return STATE_ESCAPE_INTERMEDIATE; + case 0x30 ... 0x4f: action_esc_dispatch(term, c); return STATE_GROUND; case 0x50: action_clear(term); return STATE_DCS_ENTRY; - case 0x51 ... 0x57: action_esc_dispatch(term, data); return STATE_GROUND; + case 0x51 ... 0x57: action_esc_dispatch(term, c); return STATE_GROUND; case 0x58: return STATE_SOS_PM_APC_STRING; - case 0x59: action_esc_dispatch(term, data); return STATE_GROUND; - case 0x5a: action_esc_dispatch(term, data); return STATE_GROUND; + case 0x59: action_esc_dispatch(term, c); return STATE_GROUND; + case 0x5a: action_esc_dispatch(term, c); return STATE_GROUND; case 0x5b: action_clear(term); return STATE_CSI_ENTRY; - case 0x5c: action_esc_dispatch(term, data); return STATE_GROUND; - case 0x5d: action_osc_start(term, data); return STATE_OSC_STRING; + case 0x5c: action_esc_dispatch(term, c); return STATE_GROUND; + case 0x5d: action_osc_start(term, c); return STATE_OSC_STRING; case 0x5e ... 0x5f: return STATE_SOS_PM_APC_STRING; - case 0x60 ... 0x7e: action_esc_dispatch(term, data); return STATE_GROUND; + case 0x60 ... 0x7e: action_esc_dispatch(term, c); return STATE_GROUND; case 0x7f: action_ignore(term); return STATE_ESCAPE; /* Anywhere */ - case 0x18: action_execute(term, data); return STATE_GROUND; - case 0x1a: action_execute(term, data); return STATE_GROUND; + case 0x18: action_execute(term, c); return STATE_GROUND; + case 0x1a: action_execute(term, c); return STATE_GROUND; case 0x1b: action_clear(term); return STATE_ESCAPE; - case 0x80 ... 0x8f: action_execute(term, data); return STATE_GROUND; + case 0x80 ... 0x8f: action_execute(term, c); return STATE_GROUND; case 0x90: action_clear(term); return STATE_DCS_ENTRY; - case 0x91 ... 0x97: action_execute(term, data); return STATE_GROUND; + case 0x91 ... 0x97: action_execute(term, c); return STATE_GROUND; case 0x98: return STATE_SOS_PM_APC_STRING; - case 0x99: action_execute(term, data); return STATE_GROUND; - case 0x9a: action_execute(term, data); return STATE_GROUND; + case 0x99: action_execute(term, c); return STATE_GROUND; + case 0x9a: action_execute(term, c); return STATE_GROUND; case 0x9b: action_clear(term); return STATE_CSI_ENTRY; case 0x9c: return STATE_GROUND; - case 0x9d: action_osc_start(term, data); return STATE_OSC_STRING; + case 0x9d: action_osc_start(term, c); return STATE_OSC_STRING; case 0x9e ... 0x9f: return STATE_SOS_PM_APC_STRING; default: return STATE_ESCAPE; @@ -643,31 +643,31 @@ state_escape_switch(struct terminal *term, uint8_t data) } static enum state -state_escape_intermediate_switch(struct terminal *term, uint8_t data) +state_escape_intermediate_switch(struct terminal *term, uint8_t c) { - switch (data) { + switch (c) { /* exit current enter new state */ case 0x00 ... 0x17: case 0x19: - case 0x1c ... 0x1f: action_execute(term, data); return STATE_ESCAPE_INTERMEDIATE; + case 0x1c ... 0x1f: action_execute(term, c); return STATE_ESCAPE_INTERMEDIATE; - case 0x20 ... 0x2f: action_collect(term, data); return STATE_ESCAPE_INTERMEDIATE; - case 0x30 ... 0x7e: action_esc_dispatch(term, data); return STATE_GROUND; + case 0x20 ... 0x2f: action_collect(term, c); return STATE_ESCAPE_INTERMEDIATE; + case 0x30 ... 0x7e: action_esc_dispatch(term, c); return STATE_GROUND; case 0x7f: action_ignore(term); return STATE_ESCAPE_INTERMEDIATE; /* Anywhere */ - case 0x18: action_execute(term, data); return STATE_GROUND; - case 0x1a: action_execute(term, data); return STATE_GROUND; + case 0x18: action_execute(term, c); return STATE_GROUND; + case 0x1a: action_execute(term, c); return STATE_GROUND; case 0x1b: action_clear(term); return STATE_ESCAPE; - case 0x80 ... 0x8f: action_execute(term, data); return STATE_GROUND; + case 0x80 ... 0x8f: action_execute(term, c); return STATE_GROUND; case 0x90: action_clear(term); return STATE_DCS_ENTRY; - case 0x91 ... 0x97: action_execute(term, data); return STATE_GROUND; + case 0x91 ... 0x97: action_execute(term, c); return STATE_GROUND; case 0x98: return STATE_SOS_PM_APC_STRING; - case 0x99: action_execute(term, data); return STATE_GROUND; - case 0x9a: action_execute(term, data); return STATE_GROUND; + case 0x99: action_execute(term, c); return STATE_GROUND; + case 0x9a: action_execute(term, c); return STATE_GROUND; case 0x9b: action_clear(term); return STATE_CSI_ENTRY; case 0x9c: return STATE_GROUND; - case 0x9d: action_osc_start(term, data); return STATE_OSC_STRING; + case 0x9d: action_osc_start(term, c); return STATE_OSC_STRING; case 0x9e ... 0x9f: return STATE_SOS_PM_APC_STRING; default: return STATE_ESCAPE_INTERMEDIATE; @@ -675,34 +675,34 @@ state_escape_intermediate_switch(struct terminal *term, uint8_t data) } static enum state -state_csi_entry_switch(struct terminal *term, uint8_t data) +state_csi_entry_switch(struct terminal *term, uint8_t c) { - switch (data) { + switch (c) { /* exit current enter new state */ case 0x00 ... 0x17: case 0x19: - case 0x1c ... 0x1f: action_execute(term, data); return STATE_CSI_ENTRY; + case 0x1c ... 0x1f: action_execute(term, c); return STATE_CSI_ENTRY; - case 0x20 ... 0x2f: action_collect(term, data); return STATE_CSI_INTERMEDIATE; - case 0x30 ... 0x39: action_param(term, data); return STATE_CSI_PARAM; + case 0x20 ... 0x2f: action_collect(term, c); return STATE_CSI_INTERMEDIATE; + case 0x30 ... 0x39: action_param(term, c); return STATE_CSI_PARAM; case 0x3a ... 0x3b: return STATE_CSI_PARAM; - case 0x3c ... 0x3f: action_collect(term, data); return STATE_CSI_PARAM; - case 0x40 ... 0x7e: action_csi_dispatch(term, data); return STATE_GROUND; + case 0x3c ... 0x3f: action_collect(term, c); return STATE_CSI_PARAM; + case 0x40 ... 0x7e: action_csi_dispatch(term, c); return STATE_GROUND; case 0x7f: action_ignore(term); return STATE_CSI_ENTRY; /* Anywhere */ - case 0x18: action_execute(term, data); return STATE_GROUND; - case 0x1a: action_execute(term, data); return STATE_GROUND; + case 0x18: action_execute(term, c); return STATE_GROUND; + case 0x1a: action_execute(term, c); return STATE_GROUND; case 0x1b: action_clear(term); return STATE_ESCAPE; - case 0x80 ... 0x8f: action_execute(term, data); return STATE_GROUND; + case 0x80 ... 0x8f: action_execute(term, c); return STATE_GROUND; case 0x90: action_clear(term); return STATE_DCS_ENTRY; - case 0x91 ... 0x97: action_execute(term, data); return STATE_GROUND; + case 0x91 ... 0x97: action_execute(term, c); return STATE_GROUND; case 0x98: return STATE_SOS_PM_APC_STRING; - case 0x99: action_execute(term, data); return STATE_GROUND; - case 0x9a: action_execute(term, data); return STATE_GROUND; + case 0x99: action_execute(term, c); return STATE_GROUND; + case 0x9a: action_execute(term, c); return STATE_GROUND; case 0x9b: action_clear(term); return STATE_CSI_ENTRY; case 0x9c: return STATE_GROUND; - case 0x9d: action_osc_start(term, data); return STATE_OSC_STRING; + case 0x9d: action_osc_start(term, c); return STATE_OSC_STRING; case 0x9e ... 0x9f: return STATE_SOS_PM_APC_STRING; default: return STATE_CSI_ENTRY; @@ -710,36 +710,36 @@ state_csi_entry_switch(struct terminal *term, uint8_t data) } static enum state -state_csi_param_switch(struct terminal *term, uint8_t data) +state_csi_param_switch(struct terminal *term, uint8_t c) { - switch (data) { + switch (c) { /* exit current enter new state */ case 0x00 ... 0x17: case 0x19: - case 0x1c ... 0x1f: action_execute(term, data); return STATE_CSI_PARAM; + case 0x1c ... 0x1f: action_execute(term, c); return STATE_CSI_PARAM; - case 0x20 ... 0x2f: action_collect(term, data); return STATE_CSI_INTERMEDIATE; + case 0x20 ... 0x2f: action_collect(term, c); return STATE_CSI_INTERMEDIATE; case 0x30 ... 0x39: - case 0x3a ... 0x3b: action_param(term, data); return STATE_CSI_PARAM; + case 0x3a ... 0x3b: action_param(term, c); return STATE_CSI_PARAM; case 0x3c ... 0x3f: return STATE_CSI_IGNORE; - case 0x40 ... 0x7e: action_csi_dispatch(term, data); return STATE_GROUND; + case 0x40 ... 0x7e: action_csi_dispatch(term, c); return STATE_GROUND; case 0x7f: action_ignore(term); return STATE_CSI_PARAM; /* Anywhere */ - case 0x18: action_execute(term, data); return STATE_GROUND; - case 0x1a: action_execute(term, data); return STATE_GROUND; + case 0x18: action_execute(term, c); return STATE_GROUND; + case 0x1a: action_execute(term, c); return STATE_GROUND; case 0x1b: action_clear(term); return STATE_ESCAPE; - case 0x80 ... 0x8f: action_execute(term, data); return STATE_GROUND; + case 0x80 ... 0x8f: action_execute(term, c); return STATE_GROUND; case 0x90: action_clear(term); return STATE_DCS_ENTRY; - case 0x91 ... 0x97: action_execute(term, data); return STATE_GROUND; + case 0x91 ... 0x97: action_execute(term, c); return STATE_GROUND; case 0x98: return STATE_SOS_PM_APC_STRING; - case 0x99: action_execute(term, data); return STATE_GROUND; - case 0x9a: action_execute(term, data); return STATE_GROUND; + case 0x99: action_execute(term, c); return STATE_GROUND; + case 0x9a: action_execute(term, c); return STATE_GROUND; case 0x9b: action_clear(term); return STATE_CSI_ENTRY; case 0x9c: return STATE_GROUND; - case 0x9d: action_osc_start(term, data); return STATE_OSC_STRING; + case 0x9d: action_osc_start(term, c); return STATE_OSC_STRING; case 0x9e ... 0x9f: return STATE_SOS_PM_APC_STRING; default: return STATE_CSI_PARAM; @@ -747,32 +747,32 @@ state_csi_param_switch(struct terminal *term, uint8_t data) } static enum state -state_csi_intermediate_switch(struct terminal *term, uint8_t data) +state_csi_intermediate_switch(struct terminal *term, uint8_t c) { - switch (data) { + switch (c) { /* exit current enter new state */ case 0x00 ... 0x17: case 0x19: - case 0x1c ... 0x1f: action_execute(term, data); return STATE_CSI_INTERMEDIATE; + case 0x1c ... 0x1f: action_execute(term, c); return STATE_CSI_INTERMEDIATE; - case 0x20 ... 0x2f: action_collect(term, data); return STATE_CSI_INTERMEDIATE; + case 0x20 ... 0x2f: action_collect(term, c); return STATE_CSI_INTERMEDIATE; case 0x30 ... 0x3f: return STATE_CSI_IGNORE; - case 0x40 ... 0x7e: action_csi_dispatch(term, data); return STATE_GROUND; + case 0x40 ... 0x7e: action_csi_dispatch(term, c); return STATE_GROUND; case 0x7f: action_ignore(term); return STATE_CSI_INTERMEDIATE; /* Anywhere */ - case 0x18: action_execute(term, data); return STATE_GROUND; - case 0x1a: action_execute(term, data); return STATE_GROUND; + case 0x18: action_execute(term, c); return STATE_GROUND; + case 0x1a: action_execute(term, c); return STATE_GROUND; case 0x1b: action_clear(term); return STATE_ESCAPE; - case 0x80 ... 0x8f: action_execute(term, data); return STATE_GROUND; + case 0x80 ... 0x8f: action_execute(term, c); return STATE_GROUND; case 0x90: action_clear(term); return STATE_DCS_ENTRY; - case 0x91 ... 0x97: action_execute(term, data); return STATE_GROUND; + case 0x91 ... 0x97: action_execute(term, c); return STATE_GROUND; case 0x98: return STATE_SOS_PM_APC_STRING; - case 0x99: action_execute(term, data); return STATE_GROUND; - case 0x9a: action_execute(term, data); return STATE_GROUND; + case 0x99: action_execute(term, c); return STATE_GROUND; + case 0x9a: action_execute(term, c); return STATE_GROUND; case 0x9b: action_clear(term); return STATE_CSI_ENTRY; case 0x9c: return STATE_GROUND; - case 0x9d: action_osc_start(term, data); return STATE_OSC_STRING; + case 0x9d: action_osc_start(term, c); return STATE_OSC_STRING; case 0x9e ... 0x9f: return STATE_SOS_PM_APC_STRING; default: return STATE_CSI_INTERMEDIATE; @@ -780,31 +780,31 @@ state_csi_intermediate_switch(struct terminal *term, uint8_t data) } static enum state -state_csi_ignore_switch(struct terminal *term, uint8_t data) +state_csi_ignore_switch(struct terminal *term, uint8_t c) { - switch (data) { + switch (c) { /* exit current enter new state */ case 0x00 ... 0x17: case 0x19: - case 0x1c ... 0x1f: action_execute(term, data); return STATE_CSI_IGNORE; + case 0x1c ... 0x1f: action_execute(term, c); return STATE_CSI_IGNORE; case 0x20 ... 0x3f: action_ignore(term); return STATE_CSI_IGNORE; case 0x40 ... 0x7e: return STATE_GROUND; case 0x7f: action_ignore(term); return STATE_CSI_IGNORE; /* Anywhere */ - case 0x18: action_execute(term, data); return STATE_GROUND; - case 0x1a: action_execute(term, data); return STATE_GROUND; + case 0x18: action_execute(term, c); return STATE_GROUND; + case 0x1a: action_execute(term, c); return STATE_GROUND; case 0x1b: action_clear(term); return STATE_ESCAPE; - case 0x80 ... 0x8f: action_execute(term, data); return STATE_GROUND; + case 0x80 ... 0x8f: action_execute(term, c); return STATE_GROUND; case 0x90: action_clear(term); return STATE_DCS_ENTRY; - case 0x91 ... 0x97: action_execute(term, data); return STATE_GROUND; + case 0x91 ... 0x97: action_execute(term, c); return STATE_GROUND; case 0x98: return STATE_SOS_PM_APC_STRING; - case 0x99: action_execute(term, data); return STATE_GROUND; - case 0x9a: action_execute(term, data); return STATE_GROUND; + case 0x99: action_execute(term, c); return STATE_GROUND; + case 0x9a: action_execute(term, c); return STATE_GROUND; case 0x9b: action_clear(term); return STATE_CSI_ENTRY; case 0x9c: return STATE_GROUND; - case 0x9d: action_osc_start(term, data); return STATE_OSC_STRING; + case 0x9d: action_osc_start(term, c); return STATE_OSC_STRING; case 0x9e ... 0x9f: return STATE_SOS_PM_APC_STRING; default: return STATE_CSI_IGNORE; @@ -812,15 +812,15 @@ state_csi_ignore_switch(struct terminal *term, uint8_t data) } static enum state -state_osc_string_switch(struct terminal *term, uint8_t data) +state_osc_string_switch(struct terminal *term, uint8_t c) { - switch (data) { + switch (c) { /* exit current enter new state */ /* Note: original was 20-7f, but I changed to 20-ff to include utf-8. Don't forget to add EXECUTE to 8-bit C1 if we implement that. */ - default: action_osc_put(term, data); return STATE_OSC_STRING; + default: action_osc_put(term, c); return STATE_OSC_STRING; - case 0x07: action_osc_end(term, data); return STATE_GROUND; + case 0x07: action_osc_end(term, c); return STATE_GROUND; case 0x00 ... 0x06: case 0x08 ... 0x17: @@ -829,42 +829,42 @@ state_osc_string_switch(struct terminal *term, uint8_t data) case 0x18: - case 0x1a: action_osc_end(term, data); action_execute(term, data); return STATE_GROUND; + case 0x1a: action_osc_end(term, c); action_execute(term, c); return STATE_GROUND; - case 0x1b: action_osc_end(term, data); action_clear(term); return STATE_ESCAPE; + case 0x1b: action_osc_end(term, c); action_clear(term); return STATE_ESCAPE; } } static enum state -state_dcs_entry_switch(struct terminal *term, uint8_t data) +state_dcs_entry_switch(struct terminal *term, uint8_t c) { - switch (data) { + switch (c) { /* exit current enter new state */ case 0x00 ... 0x17: case 0x19: case 0x1c ... 0x1f: action_ignore(term); return STATE_DCS_ENTRY; - case 0x20 ... 0x2f: action_collect(term, data); return STATE_DCS_INTERMEDIATE; - case 0x30 ... 0x39: action_param(term, data); return STATE_DCS_PARAM; + case 0x20 ... 0x2f: action_collect(term, c); return STATE_DCS_INTERMEDIATE; + case 0x30 ... 0x39: action_param(term, c); return STATE_DCS_PARAM; case 0x3a: return STATE_DCS_IGNORE; - case 0x3b: action_param(term, data); return STATE_DCS_PARAM; - case 0x3c ... 0x3f: action_collect(term, data); return STATE_DCS_PARAM; - case 0x40 ... 0x7e: action_hook(term, data); return STATE_DCS_PASSTHROUGH; + case 0x3b: action_param(term, c); return STATE_DCS_PARAM; + case 0x3c ... 0x3f: action_collect(term, c); return STATE_DCS_PARAM; + case 0x40 ... 0x7e: action_hook(term, c); return STATE_DCS_PASSTHROUGH; case 0x7f: action_ignore(term); return STATE_DCS_ENTRY; /* Anywhere */ - case 0x18: action_execute(term, data); return STATE_GROUND; - case 0x1a: action_execute(term, data); return STATE_GROUND; + case 0x18: action_execute(term, c); return STATE_GROUND; + case 0x1a: action_execute(term, c); return STATE_GROUND; case 0x1b: action_clear(term); return STATE_ESCAPE; - case 0x80 ... 0x8f: action_execute(term, data); return STATE_GROUND; + case 0x80 ... 0x8f: action_execute(term, c); return STATE_GROUND; case 0x90: action_clear(term); return STATE_DCS_ENTRY; - case 0x91 ... 0x97: action_execute(term, data); return STATE_GROUND; + case 0x91 ... 0x97: action_execute(term, c); return STATE_GROUND; case 0x98: return STATE_SOS_PM_APC_STRING; - case 0x99: action_execute(term, data); return STATE_GROUND; - case 0x9a: action_execute(term, data); return STATE_GROUND; + case 0x99: action_execute(term, c); return STATE_GROUND; + case 0x9a: action_execute(term, c); return STATE_GROUND; case 0x9b: action_clear(term); return STATE_CSI_ENTRY; case 0x9c: return STATE_GROUND; - case 0x9d: action_osc_start(term, data); return STATE_OSC_STRING; + case 0x9d: action_osc_start(term, c); return STATE_OSC_STRING; case 0x9e ... 0x9f: return STATE_SOS_PM_APC_STRING; default: return STATE_DCS_ENTRY; @@ -872,35 +872,35 @@ state_dcs_entry_switch(struct terminal *term, uint8_t data) } static enum state -state_dcs_param_switch(struct terminal *term, uint8_t data) +state_dcs_param_switch(struct terminal *term, uint8_t c) { - switch (data) { + switch (c) { /* exit current enter new state */ case 0x00 ... 0x17: case 0x19: case 0x1c ... 0x1f: action_ignore(term); return STATE_DCS_PARAM; - case 0x20 ... 0x2f: action_collect(term, data); return STATE_DCS_INTERMEDIATE; - case 0x30 ... 0x39: action_param(term, data); return STATE_DCS_PARAM; + case 0x20 ... 0x2f: action_collect(term, c); return STATE_DCS_INTERMEDIATE; + case 0x30 ... 0x39: action_param(term, c); return STATE_DCS_PARAM; case 0x3a: return STATE_DCS_IGNORE; - case 0x3b: action_param(term, data); return STATE_DCS_PARAM; + case 0x3b: action_param(term, c); return STATE_DCS_PARAM; case 0x3c ... 0x3f: return STATE_DCS_IGNORE; - case 0x40 ... 0x7e: action_hook(term, data); return STATE_DCS_PASSTHROUGH; + case 0x40 ... 0x7e: action_hook(term, c); return STATE_DCS_PASSTHROUGH; case 0x7f: action_ignore(term); return STATE_DCS_PARAM; /* Anywhere */ - case 0x18: action_execute(term, data); return STATE_GROUND; - case 0x1a: action_execute(term, data); return STATE_GROUND; + case 0x18: action_execute(term, c); return STATE_GROUND; + case 0x1a: action_execute(term, c); return STATE_GROUND; case 0x1b: action_clear(term); return STATE_ESCAPE; - case 0x80 ... 0x8f: action_execute(term, data); return STATE_GROUND; + case 0x80 ... 0x8f: action_execute(term, c); return STATE_GROUND; case 0x90: action_clear(term); return STATE_DCS_ENTRY; - case 0x91 ... 0x97: action_execute(term, data); return STATE_GROUND; + case 0x91 ... 0x97: action_execute(term, c); return STATE_GROUND; case 0x98: return STATE_SOS_PM_APC_STRING; - case 0x99: action_execute(term, data); return STATE_GROUND; - case 0x9a: action_execute(term, data); return STATE_GROUND; + case 0x99: action_execute(term, c); return STATE_GROUND; + case 0x9a: action_execute(term, c); return STATE_GROUND; case 0x9b: action_clear(term); return STATE_CSI_ENTRY; case 0x9c: return STATE_GROUND; - case 0x9d: action_osc_start(term, data); return STATE_OSC_STRING; + case 0x9d: action_osc_start(term, c); return STATE_OSC_STRING; case 0x9e ... 0x9f: return STATE_SOS_PM_APC_STRING; default: return STATE_DCS_PARAM; @@ -908,32 +908,32 @@ state_dcs_param_switch(struct terminal *term, uint8_t data) } static enum state -state_dcs_intermediate_switch(struct terminal *term, uint8_t data) +state_dcs_intermediate_switch(struct terminal *term, uint8_t c) { - switch (data) { + switch (c) { /* exit current enter new state */ case 0x00 ... 0x17: case 0x19: case 0x1c ... 0x1f: action_ignore(term); return STATE_DCS_INTERMEDIATE; - case 0x20 ... 0x2f: action_collect(term, data); return STATE_DCS_INTERMEDIATE; + case 0x20 ... 0x2f: action_collect(term, c); return STATE_DCS_INTERMEDIATE; case 0x30 ... 0x3f: return STATE_DCS_IGNORE; - case 0x40 ... 0x7e: action_hook(term, data); return STATE_DCS_PASSTHROUGH; + case 0x40 ... 0x7e: action_hook(term, c); return STATE_DCS_PASSTHROUGH; case 0x7f: action_ignore(term); return STATE_DCS_INTERMEDIATE; /* Anywhere */ - case 0x18: action_execute(term, data); return STATE_GROUND; - case 0x1a: action_execute(term, data); return STATE_GROUND; + case 0x18: action_execute(term, c); return STATE_GROUND; + case 0x1a: action_execute(term, c); return STATE_GROUND; case 0x1b: action_clear(term); return STATE_ESCAPE; - case 0x80 ... 0x8f: action_execute(term, data); return STATE_GROUND; + case 0x80 ... 0x8f: action_execute(term, c); return STATE_GROUND; case 0x90: action_clear(term); return STATE_DCS_ENTRY; - case 0x91 ... 0x97: action_execute(term, data); return STATE_GROUND; + case 0x91 ... 0x97: action_execute(term, c); return STATE_GROUND; case 0x98: return STATE_SOS_PM_APC_STRING; - case 0x99: action_execute(term, data); return STATE_GROUND; - case 0x9a: action_execute(term, data); return STATE_GROUND; + case 0x99: action_execute(term, c); return STATE_GROUND; + case 0x9a: action_execute(term, c); return STATE_GROUND; case 0x9b: action_clear(term); return STATE_CSI_ENTRY; case 0x9c: return STATE_GROUND; - case 0x9d: action_osc_start(term, data); return STATE_OSC_STRING; + case 0x9d: action_osc_start(term, c); return STATE_OSC_STRING; case 0x9e ... 0x9f: return STATE_SOS_PM_APC_STRING; default: return STATE_DCS_INTERMEDIATE; @@ -941,9 +941,9 @@ state_dcs_intermediate_switch(struct terminal *term, uint8_t data) } static enum state -state_dcs_ignore_switch(struct terminal *term, uint8_t data) +state_dcs_ignore_switch(struct terminal *term, uint8_t c) { - switch (data) { + switch (c) { /* exit current enter new state */ case 0x00 ... 0x17: case 0x19: @@ -951,18 +951,18 @@ state_dcs_ignore_switch(struct terminal *term, uint8_t data) case 0x20 ... 0x7f: action_ignore(term); return STATE_DCS_IGNORE; /* Anywhere */ - case 0x18: action_execute(term, data); return STATE_GROUND; - case 0x1a: action_execute(term, data); return STATE_GROUND; + case 0x18: action_execute(term, c); return STATE_GROUND; + case 0x1a: action_execute(term, c); return STATE_GROUND; case 0x1b: action_clear(term); return STATE_ESCAPE; - case 0x80 ... 0x8f: action_execute(term, data); return STATE_GROUND; + case 0x80 ... 0x8f: action_execute(term, c); return STATE_GROUND; case 0x90: action_clear(term); return STATE_DCS_ENTRY; - case 0x91 ... 0x97: action_execute(term, data); return STATE_GROUND; + case 0x91 ... 0x97: action_execute(term, c); return STATE_GROUND; case 0x98: return STATE_SOS_PM_APC_STRING; - case 0x99: action_execute(term, data); return STATE_GROUND; - case 0x9a: action_execute(term, data); return STATE_GROUND; + case 0x99: action_execute(term, c); return STATE_GROUND; + case 0x9a: action_execute(term, c); return STATE_GROUND; case 0x9b: action_clear(term); return STATE_CSI_ENTRY; case 0x9c: return STATE_GROUND; - case 0x9d: action_osc_start(term, data); return STATE_OSC_STRING; + case 0x9d: action_osc_start(term, c); return STATE_OSC_STRING; case 0x9e ... 0x9f: return STATE_SOS_PM_APC_STRING; default: return STATE_DCS_IGNORE; @@ -970,57 +970,57 @@ state_dcs_ignore_switch(struct terminal *term, uint8_t data) } static enum state -state_dcs_passthrough_switch(struct terminal *term, uint8_t data) +state_dcs_passthrough_switch(struct terminal *term, uint8_t c) { - switch (data) { + switch (c) { /* exit current enter new state */ case 0x00 ... 0x17: case 0x19: - case 0x1c ... 0x7e: action_put(term, data); return STATE_DCS_PASSTHROUGH; + case 0x1c ... 0x7e: action_put(term, c); return STATE_DCS_PASSTHROUGH; case 0x7f: action_ignore(term); return STATE_DCS_PASSTHROUGH; /* Anywhere */ - case 0x18: action_unhook(term, data); action_execute(term, data); return STATE_GROUND; - case 0x1a: action_unhook(term, data); action_execute(term, data); return STATE_GROUND; - case 0x1b: action_unhook(term, data); action_clear(term); return STATE_ESCAPE; - case 0x80 ... 0x8f: action_unhook(term, data); action_execute(term, data); return STATE_GROUND; - case 0x90: action_unhook(term, data); action_clear(term); return STATE_DCS_ENTRY; - case 0x91 ... 0x97: action_unhook(term, data); action_execute(term, data); return STATE_GROUND; - case 0x98: action_unhook(term, data); return STATE_SOS_PM_APC_STRING; - case 0x99: action_unhook(term, data); action_execute(term, data); return STATE_GROUND; - case 0x9a: action_unhook(term, data); action_execute(term, data); return STATE_GROUND; - case 0x9b: action_unhook(term, data); action_clear(term); return STATE_CSI_ENTRY; - case 0x9c: action_unhook(term, data); return STATE_GROUND; - case 0x9d: action_unhook(term, data); action_osc_start(term, data); return STATE_OSC_STRING; - case 0x9e ... 0x9f: action_unhook(term, data); return STATE_SOS_PM_APC_STRING; + case 0x18: action_unhook(term, c); action_execute(term, c); return STATE_GROUND; + case 0x1a: action_unhook(term, c); action_execute(term, c); return STATE_GROUND; + case 0x1b: action_unhook(term, c); action_clear(term); return STATE_ESCAPE; + case 0x80 ... 0x8f: action_unhook(term, c); action_execute(term, c); return STATE_GROUND; + case 0x90: action_unhook(term, c); action_clear(term); return STATE_DCS_ENTRY; + case 0x91 ... 0x97: action_unhook(term, c); action_execute(term, c); return STATE_GROUND; + case 0x98: action_unhook(term, c); return STATE_SOS_PM_APC_STRING; + case 0x99: action_unhook(term, c); action_execute(term, c); return STATE_GROUND; + case 0x9a: action_unhook(term, c); action_execute(term, c); return STATE_GROUND; + case 0x9b: action_unhook(term, c); action_clear(term); return STATE_CSI_ENTRY; + case 0x9c: action_unhook(term, c); return STATE_GROUND; + case 0x9d: action_unhook(term, c); action_osc_start(term, c); return STATE_OSC_STRING; + case 0x9e ... 0x9f: action_unhook(term, c); return STATE_SOS_PM_APC_STRING; default: return STATE_DCS_PASSTHROUGH; } } static enum state -state_sos_pm_apc_string_switch(struct terminal *term, uint8_t data) +state_sos_pm_apc_string_switch(struct terminal *term, uint8_t c) { - switch (data) { + switch (c) { /* exit current enter new state */ case 0x00 ... 0x17: case 0x19: case 0x1c ... 0x7f: action_ignore(term); return STATE_SOS_PM_APC_STRING; /* Anywhere */ - case 0x18: action_execute(term, data); return STATE_GROUND; - case 0x1a: action_execute(term, data); return STATE_GROUND; + case 0x18: action_execute(term, c); return STATE_GROUND; + case 0x1a: action_execute(term, c); return STATE_GROUND; case 0x1b: action_clear(term); return STATE_ESCAPE; - case 0x80 ... 0x8f: action_execute(term, data); return STATE_GROUND; + case 0x80 ... 0x8f: action_execute(term, c); return STATE_GROUND; case 0x90: action_clear(term); return STATE_DCS_ENTRY; - case 0x91 ... 0x97: action_execute(term, data); return STATE_GROUND; + case 0x91 ... 0x97: action_execute(term, c); return STATE_GROUND; case 0x98: return STATE_SOS_PM_APC_STRING; - case 0x99: action_execute(term, data); return STATE_GROUND; - case 0x9a: action_execute(term, data); return STATE_GROUND; + case 0x99: action_execute(term, c); return STATE_GROUND; + case 0x9a: action_execute(term, c); return STATE_GROUND; case 0x9b: action_clear(term); return STATE_CSI_ENTRY; case 0x9c: return STATE_GROUND; - case 0x9d: action_osc_start(term, data); return STATE_OSC_STRING; + case 0x9d: action_osc_start(term, c); return STATE_OSC_STRING; case 0x9e ... 0x9f: return STATE_SOS_PM_APC_STRING; default: return STATE_SOS_PM_APC_STRING; @@ -1028,20 +1028,20 @@ 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) +state_utf8_collect_1_switch(struct terminal *term, uint8_t c) { - term->vt.utf8.data[term->vt.utf8.idx++] = data; + term->vt.utf8.data[term->vt.utf8.idx++] = c; term->vt.utf8.left--; assert(term->vt.utf8.left == 0); - action_utf8_print(term, data); + action_utf8_print(term, c); return STATE_GROUND; } static enum state -state_utf8_collect_2_switch(struct terminal *term, uint8_t data) +state_utf8_collect_2_switch(struct terminal *term, uint8_t c) { - term->vt.utf8.data[term->vt.utf8.idx++] = data; + term->vt.utf8.data[term->vt.utf8.idx++] = c; term->vt.utf8.left--; assert(term->vt.utf8.left == 1); @@ -1049,44 +1049,51 @@ state_utf8_collect_2_switch(struct terminal *term, uint8_t data) } static enum state -state_utf8_collect_3_switch(struct terminal *term, uint8_t data) +state_utf8_collect_3_switch(struct terminal *term, uint8_t c) { - term->vt.utf8.data[term->vt.utf8.idx++] = data; + term->vt.utf8.data[term->vt.utf8.idx++] = c; term->vt.utf8.left--; assert(term->vt.utf8.left == 2); return STATE_UTF8_COLLECT_2; } +static inline enum state +vt_state_machine_progress(struct terminal *term, enum state current_state, uint8_t c) +{ + switch (current_state) { + case STATE_GROUND: return state_ground_switch(term, c); + case STATE_ESCAPE: return state_escape_switch(term, c); + case STATE_ESCAPE_INTERMEDIATE: return state_escape_intermediate_switch(term, c); + case STATE_CSI_ENTRY: return state_csi_entry_switch(term, c); + case STATE_CSI_PARAM: return state_csi_param_switch(term, c); + case STATE_CSI_INTERMEDIATE: return state_csi_intermediate_switch(term, c); + case STATE_CSI_IGNORE: return state_csi_ignore_switch(term, c); + case STATE_OSC_STRING: return state_osc_string_switch(term, c); + case STATE_DCS_ENTRY: return state_dcs_entry_switch(term, c); + case STATE_DCS_PARAM: return state_dcs_param_switch(term, c); + case STATE_DCS_INTERMEDIATE: return state_dcs_intermediate_switch(term, c); + case STATE_DCS_IGNORE: return state_dcs_ignore_switch(term, c); + case STATE_DCS_PASSTHROUGH: return state_dcs_passthrough_switch(term, c); + case STATE_SOS_PM_APC_STRING: return state_sos_pm_apc_string_switch(term, c); + + case STATE_UTF8_COLLECT_1: return state_utf8_collect_1_switch(term, c); + case STATE_UTF8_COLLECT_2: return state_utf8_collect_2_switch(term, c); + case STATE_UTF8_COLLECT_3: return state_utf8_collect_3_switch(term, c); + } + + assert(false); + return STATE_GROUND; +} + void vt_from_slave(struct terminal *term, const uint8_t *data, size_t len) { enum state current_state = term->vt.state; const uint8_t *p = data; - for (size_t i = 0; i < len; i++, p++) { - switch (current_state) { - case STATE_GROUND: current_state = state_ground_switch(term, *p); break; - case STATE_ESCAPE: current_state = state_escape_switch(term, *p); break; - case STATE_ESCAPE_INTERMEDIATE: current_state = state_escape_intermediate_switch(term, *p); break; - case STATE_CSI_ENTRY: current_state = state_csi_entry_switch(term, *p); break; - case STATE_CSI_PARAM: current_state = state_csi_param_switch(term, *p); break; - case STATE_CSI_INTERMEDIATE: current_state = state_csi_intermediate_switch(term, *p); break; - case STATE_CSI_IGNORE: current_state = state_csi_ignore_switch(term, *p); break; - case STATE_OSC_STRING: current_state = state_osc_string_switch(term, *p); break; - case STATE_DCS_ENTRY: current_state = state_dcs_entry_switch(term, *p); break; - case STATE_DCS_PARAM: current_state = state_dcs_param_switch(term, *p); break; - case STATE_DCS_INTERMEDIATE: current_state = state_dcs_intermediate_switch(term, *p); break; - case STATE_DCS_IGNORE: current_state = state_dcs_ignore_switch(term, *p); break; - case STATE_DCS_PASSTHROUGH: current_state = state_dcs_passthrough_switch(term, *p); break; - case STATE_SOS_PM_APC_STRING: current_state = state_sos_pm_apc_string_switch(term, *p); break; - - case STATE_UTF8_COLLECT_1: current_state = state_utf8_collect_1_switch(term, *p); break; - case STATE_UTF8_COLLECT_2: current_state = state_utf8_collect_2_switch(term, *p); break; - case STATE_UTF8_COLLECT_3: current_state = state_utf8_collect_3_switch(term, *p); break; - } - } - + for (size_t i = 0; i < len; i++, p++) + current_state = vt_state_machine_progress(term, current_state, *p); term->vt.state = current_state; }