diff --git a/csi.c b/csi.c index 08e69fa5..0ab16999 100644 --- a/csi.c +++ b/csi.c @@ -255,8 +255,8 @@ csi_as_string(struct terminal *term, uint8_t final) static char msg[1024]; int c = snprintf(msg, sizeof(msg), "CSI: "); - for (size_t i = 0; i < term->vt.intermediates.idx; i++) - c += snprintf(&msg[c], sizeof(msg) - c, "%c", term->vt.intermediates.data[i]); + if (term->vt.private != 0) + c += snprintf(&msg[c], sizeof(msg) - c, "%c", term->vt.private); for (size_t i = 0; i < term->vt.params.idx; i++){ c += snprintf(&msg[c], sizeof(msg) - c, "%d", @@ -281,7 +281,8 @@ csi_dispatch(struct terminal *term, uint8_t final) { LOG_DBG("%s", csi_as_string(term, final)); - if (term->vt.intermediates.idx == 0) { + switch (term->vt.private) { + case 0: { switch (final) { case 'c': write(term->ptmx, "\033[?6c", 5); @@ -577,12 +578,13 @@ csi_dispatch(struct terminal *term, uint8_t final) default: LOG_ERR("unimplemented: %s", csi_as_string(term, final)); abort(); + break; } + + break; /* private == 0 */ } - else if (term->vt.intermediates.idx == 1 && - term->vt.intermediates.data[0] == '?') { - + case '?': { switch (final) { case 'h': { for (size_t i = 0; i < term->vt.params.idx; i++) { @@ -761,10 +763,11 @@ csi_dispatch(struct terminal *term, uint8_t final) LOG_ERR("unimplemented: %s", csi_as_string(term, final)); abort(); } + + break; /* private == '?' */ } - else if (term->vt.intermediates.idx == 1 && - term->vt.intermediates.data[0] == '>') { + case '>': { switch (final) { case 'c': { int param = param_get(term, 0, 0); @@ -784,10 +787,13 @@ csi_dispatch(struct terminal *term, uint8_t final) LOG_ERR("unimplemented: %s", csi_as_string(term, final)); abort(); } + + break; /* private == '>' */ } - else { + default: LOG_ERR("unimplemented: %s", csi_as_string(term, final)); abort(); + break; } } diff --git a/terminal.h b/terminal.h index 7d379229..0ed7bcfe 100644 --- a/terminal.h +++ b/terminal.h @@ -125,10 +125,7 @@ struct vt { struct vt_param v[16]; size_t idx; } params; - struct { - uint8_t data[2]; - size_t idx; - } intermediates; + char private; struct { uint8_t data[1024]; size_t idx; diff --git a/vt.c b/vt.c index b3f5e539..98a45dc3 100644 --- a/vt.c +++ b/vt.c @@ -573,8 +573,8 @@ esc_as_string(struct terminal *term, uint8_t final) static char msg[1024]; int c = snprintf(msg, sizeof(msg), "\E"); - for (size_t i = 0; i < term->vt.intermediates.idx; i++) - c += snprintf(&msg[c], sizeof(msg) - c, "%c", term->vt.intermediates.data[i]); + if (term->vt.private != 0) + c += snprintf(&msg[c], sizeof(msg) - c, "%c", term->vt.private); c += snprintf(&msg[c], sizeof(msg) - c, "%c", final); return msg; @@ -815,7 +815,7 @@ action(struct terminal *term, enum action _action, uint8_t c) case ACTION_CLEAR: memset(&term->vt.params, 0, sizeof(term->vt.params)); - term->vt.intermediates.idx = 0; + term->vt.private = 0; term->vt.osc.idx = 0; term->vt.utf8.idx = 0; break; @@ -853,11 +853,11 @@ action(struct terminal *term, enum action _action, uint8_t c) case ACTION_COLLECT: LOG_DBG("collect"); - term->vt.intermediates.data[term->vt.intermediates.idx++] = c; - break; - - LOG_ERR("unimplemented: action ESC dispatch"); - abort(); + if (term->vt.private != 0) { + LOG_ERR("only one private/intermediate characters supported"); + abort(); + } + term->vt.private = c; break; case ACTION_ESC_DISPATCH: