vt: handle up to two private characters

This commit is contained in:
Daniel Eklöf 2019-07-19 09:56:59 +02:00
parent a5737a63b8
commit 24e9477174
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
3 changed files with 24 additions and 13 deletions

12
csi.c
View file

@ -121,8 +121,11 @@ csi_as_string(struct terminal *term, uint8_t final)
static char msg[1024]; static char msg[1024];
int c = snprintf(msg, sizeof(msg), "CSI: "); int c = snprintf(msg, sizeof(msg), "CSI: ");
if (term->vt.private != 0) for (size_t i = 0; i < sizeof(term->vt.private) / sizeof(term->vt.private[0]); i++) {
c += snprintf(&msg[c], sizeof(msg) - c, "%c", term->vt.private); 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++){ for (size_t i = 0; i < term->vt.params.idx; i++){
c += snprintf(&msg[c], sizeof(msg) - c, "%d", 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)); LOG_DBG("%s", csi_as_string(term, final));
switch (term->vt.private) { switch (term->vt.private[0]) {
case 0: { case 0: {
switch (final) { switch (final) {
case 'c': case 'c':
@ -845,8 +848,9 @@ csi_dispatch(struct terminal *term, uint8_t final)
break; break;
default: default:
LOG_ERR("unimplemented: CSI %s", csi_as_string(term, final)); LOG_ERR("unimplemented: %s", csi_as_string(term, final));
abort(); abort();
break;
} }
} }
break; break;

View file

@ -123,7 +123,7 @@ struct vt {
struct vt_param v[16]; struct vt_param v[16];
size_t idx; size_t idx;
} params; } params;
char private; char private[2];
struct { struct {
uint8_t *data; uint8_t *data;
size_t size; size_t size;

23
vt.c
View file

@ -573,8 +573,11 @@ esc_as_string(struct terminal *term, uint8_t final)
static char msg[1024]; static char msg[1024];
int c = snprintf(msg, sizeof(msg), "\\E"); int c = snprintf(msg, sizeof(msg), "\\E");
if (term->vt.private != 0) for (size_t i = 0; i < sizeof(term->vt.private) / sizeof(term->vt.private[0]); i++) {
c += snprintf(&msg[c], sizeof(msg) - c, "%c", term->vt.private); 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); assert(term->vt.params.idx == 0);
@ -605,7 +608,7 @@ esc_dispatch(struct terminal *term, uint8_t final)
case 'B': { case 'B': {
/* Configure G0-G3 to use ASCII */ /* 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) { switch (param) {
case '(': term->charset[0] = CHARSET_ASCII; break; case '(': term->charset[0] = CHARSET_ASCII; break;
@ -650,7 +653,7 @@ esc_dispatch(struct terminal *term, uint8_t final)
case '0': { case '0': {
/* Configure G0-G3 to use special chars + line drawing */ /* 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) { switch (param) {
case '(': term->charset[0] = CHARSET_GRAPHIC; break; case '(': term->charset[0] = CHARSET_GRAPHIC; break;
@ -854,7 +857,8 @@ action(struct terminal *term, enum action _action, uint8_t c)
case ACTION_CLEAR: case ACTION_CLEAR:
memset(&term->vt.params, 0, sizeof(term->vt.params)); 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.osc.idx = 0;
term->vt.utf8.idx = 0; term->vt.utf8.idx = 0;
break; break;
@ -890,11 +894,14 @@ action(struct terminal *term, enum action _action, uint8_t c)
case ACTION_COLLECT: case ACTION_COLLECT:
LOG_DBG("collect"); LOG_DBG("collect");
if (term->vt.private != 0) { if (term->vt.private[0] == 0)
LOG_ERR("only one private/intermediate characters supported"); 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(); abort();
} }
term->vt.private = c;
break; break;
case ACTION_ESC_DISPATCH: case ACTION_ESC_DISPATCH: