From 24e9477174b57edb9d6bd2271493675566d1745f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 19 Jul 2019 09:56:59 +0200 Subject: [PATCH] vt: handle up to two private characters --- csi.c | 12 ++++++++---- terminal.h | 2 +- vt.c | 23 +++++++++++++++-------- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/csi.c b/csi.c index 44e1841a..9a30bcab 100644 --- a/csi.c +++ b/csi.c @@ -121,8 +121,11 @@ csi_as_string(struct terminal *term, uint8_t final) static char msg[1024]; int c = snprintf(msg, sizeof(msg), "CSI: "); - if (term->vt.private != 0) - c += snprintf(&msg[c], sizeof(msg) - c, "%c", term->vt.private); + for (size_t i = 0; i < sizeof(term->vt.private) / sizeof(term->vt.private[0]); i++) { + if (term->vt.private[i] == 0) + break; + c += snprintf(&msg[c], sizeof(msg) - c, "%c", term->vt.private[i]); + } for (size_t i = 0; i < term->vt.params.idx; i++){ c += snprintf(&msg[c], sizeof(msg) - c, "%d", @@ -339,7 +342,7 @@ csi_dispatch(struct terminal *term, uint8_t final) { LOG_DBG("%s", csi_as_string(term, final)); - switch (term->vt.private) { + switch (term->vt.private[0]) { case 0: { switch (final) { case 'c': @@ -845,8 +848,9 @@ csi_dispatch(struct terminal *term, uint8_t final) break; default: - LOG_ERR("unimplemented: CSI %s", csi_as_string(term, final)); + LOG_ERR("unimplemented: %s", csi_as_string(term, final)); abort(); + break; } } break; diff --git a/terminal.h b/terminal.h index 2af1af53..cfe20cc3 100644 --- a/terminal.h +++ b/terminal.h @@ -123,7 +123,7 @@ struct vt { struct vt_param v[16]; size_t idx; } params; - char private; + char private[2]; struct { uint8_t *data; size_t size; diff --git a/vt.c b/vt.c index 585e9cde..9e02df87 100644 --- a/vt.c +++ b/vt.c @@ -573,8 +573,11 @@ esc_as_string(struct terminal *term, uint8_t final) static char msg[1024]; int c = snprintf(msg, sizeof(msg), "\\E"); - if (term->vt.private != 0) - c += snprintf(&msg[c], sizeof(msg) - c, "%c", term->vt.private); + for (size_t i = 0; i < sizeof(term->vt.private) / sizeof(term->vt.private[0]); i++) { + if (term->vt.private[i] == 0) + break; + c += snprintf(&msg[c], sizeof(msg) - c, "%c", term->vt.private[i]); + } assert(term->vt.params.idx == 0); @@ -605,7 +608,7 @@ esc_dispatch(struct terminal *term, uint8_t final) case 'B': { /* Configure G0-G3 to use ASCII */ - char param = term->vt.private != 0 ? term->vt.private : '('; + char param = term->vt.private[0] != 0 ? term->vt.private[0] : '('; switch (param) { case '(': term->charset[0] = CHARSET_ASCII; break; @@ -650,7 +653,7 @@ esc_dispatch(struct terminal *term, uint8_t final) case '0': { /* Configure G0-G3 to use special chars + line drawing */ - char param = term->vt.private != 0 ? term->vt.private : '('; + char param = term->vt.private[0] != 0 ? term->vt.private[0] : '('; switch (param) { case '(': term->charset[0] = CHARSET_GRAPHIC; break; @@ -854,7 +857,8 @@ action(struct terminal *term, enum action _action, uint8_t c) case ACTION_CLEAR: memset(&term->vt.params, 0, sizeof(term->vt.params)); - term->vt.private = 0; + term->vt.private[0] = 0; + term->vt.private[1] = 0; term->vt.osc.idx = 0; term->vt.utf8.idx = 0; break; @@ -890,11 +894,14 @@ action(struct terminal *term, enum action _action, uint8_t c) case ACTION_COLLECT: LOG_DBG("collect"); - if (term->vt.private != 0) { - LOG_ERR("only one private/intermediate characters supported"); + if (term->vt.private[0] == 0) + term->vt.private[0] = c; + else if (term->vt.private[1] == 0) + term->vt.private[1] = c; + else { + LOG_ERR("only two private/intermediate characters supported"); abort(); } - term->vt.private = c; break; case ACTION_ESC_DISPATCH: