vt: handle ':'-separated sub parameters correctly

This commit is contained in:
Daniel Eklöf 2019-07-15 12:34:51 +02:00
parent 6ac115bffd
commit 6550285cf6
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F

28
vt.c
View file

@ -229,8 +229,7 @@ static const struct state_transition state_csi_entry[256] = {
[0x1c ... 0x1f] = {.action = ACTION_EXECUTE}, [0x1c ... 0x1f] = {.action = ACTION_EXECUTE},
[0x20 ... 0x2f] = {.action = ACTION_COLLECT, .state = STATE_CSI_INTERMEDIATE}, [0x20 ... 0x2f] = {.action = ACTION_COLLECT, .state = STATE_CSI_INTERMEDIATE},
[0x30 ... 0x39] = {.action = ACTION_PARAM, .state = STATE_CSI_PARAM}, [0x30 ... 0x39] = {.action = ACTION_PARAM, .state = STATE_CSI_PARAM},
[0x3a] = { .state = STATE_CSI_IGNORE}, [0x3a ... 0x3b] = { .state = STATE_CSI_PARAM},
[0x3b] = {.action = ACTION_PARAM, .state = STATE_CSI_PARAM},
[0x3c ... 0x3f] = {.action = ACTION_COLLECT, .state = STATE_CSI_PARAM}, [0x3c ... 0x3f] = {.action = ACTION_COLLECT, .state = STATE_CSI_PARAM},
[0x40 ... 0x7e] = {.action = ACTION_CSI_DISPATCH, .state = STATE_GROUND}, [0x40 ... 0x7e] = {.action = ACTION_CSI_DISPATCH, .state = STATE_GROUND},
[0x7f] = {.action = ACTION_IGNORE}, [0x7f] = {.action = ACTION_IGNORE},
@ -257,8 +256,7 @@ static const struct state_transition state_csi_param[256] = {
[0x1c ... 0x1f] = {.action = ACTION_EXECUTE}, [0x1c ... 0x1f] = {.action = ACTION_EXECUTE},
[0x20 ... 0x2f] = {.action = ACTION_COLLECT, .state = STATE_CSI_INTERMEDIATE}, [0x20 ... 0x2f] = {.action = ACTION_COLLECT, .state = STATE_CSI_INTERMEDIATE},
[0x30 ... 0x39] = {.action = ACTION_PARAM}, [0x30 ... 0x39] = {.action = ACTION_PARAM},
[0x3a] = { .state = STATE_CSI_IGNORE}, [0x3a ... 0x3b] = {.action = ACTION_PARAM},
[0x3b] = {.action = ACTION_PARAM},
[0x3c ... 0x3f] = { .state = STATE_CSI_IGNORE}, [0x3c ... 0x3f] = { .state = STATE_CSI_IGNORE},
[0x40 ... 0x7e] = {.action = ACTION_CSI_DISPATCH, .state = STATE_GROUND}, [0x40 ... 0x7e] = {.action = ACTION_CSI_DISPATCH, .state = STATE_GROUND},
[0x7f] = {.action = ACTION_IGNORE}, [0x7f] = {.action = ACTION_IGNORE},
@ -843,28 +841,26 @@ action(struct terminal *term, enum action _action, uint8_t c)
action_print_utf8(term); action_print_utf8(term);
break; break;
case ACTION_PARAM:{ case ACTION_PARAM:
if (term->vt.params.idx == 0) if (term->vt.params.idx == 0)
term->vt.params.idx = 1; term->vt.params.idx = 1;
if (c == ';') { if (c == ';') {
term->vt.params.idx++; term->vt.params.idx++;
} else if (c == ':') { } else if (c == ':') {
if (term->vt.params.v[term->vt.params.idx - 1].sub.idx == 0) term->vt.params.v[term->vt.params.idx - 1].sub.idx++;
term->vt.params.v[term->vt.params.idx - 1].sub.idx = 1;
} else { } else {
if (term->vt.params.v[term->vt.params.idx - 1].sub.idx > 0) assert(term->vt.params.idx >= 0);
term->vt.params.v[term->vt.params.idx - 1].sub.value[term->vt.params.v[term->vt.params.idx - 1].sub.idx] *= 10; struct vt_param *param = &term->vt.params.v[term->vt.params.idx - 1];
else
term->vt.params.v[term->vt.params.idx - 1].value *= 10;
if (term->vt.params.v[term->vt.params.idx - 1].sub.idx > 0) unsigned *value = param->sub.idx > 0
term->vt.params.v[term->vt.params.idx - 1].sub.value[term->vt.params.v[term->vt.params.idx - 1].sub.idx] += c - '0'; ? &param->sub.value[param->sub.idx - 1]
else : &param->value;
term->vt.params.v[term->vt.params.idx - 1].value += c - '0';
*value *= 10;
*value += c - '0';
} }
break; break;
}
case ACTION_COLLECT: case ACTION_COLLECT:
LOG_DBG("collect"); LOG_DBG("collect");