pump_control_input: handle XTGETTCAP prefix

pull/1764/head
nick black 3 years ago committed by Nick Black
parent fc6bc1a3d8
commit 44ce08ecd6

@ -614,11 +614,18 @@ typedef struct init_state {
tinfo* tcache;
enum {
STATE_NULL,
STATE_ESC,
STATE_CSI,
STATE_DCS,
STATE_DA,
STATE_ESC, // escape; aborts any active sequence
STATE_CSI, // control sequence introducer
STATE_DCS, // device control string
// XTGETTCAP replies with DCS 1 + r for a good request, or 0 + r for bad
STATE_XTGETTCAP1, // XTGETTCAP, got '0/1' (DCS 0/1 + r Pt ST)
STATE_XTGETTCAP2, // XTGETTCAP, got '+' (DCS 0/1 + r Pt ST)
STATE_XTGETTCAP3, // XTGETTCAP, got 'r' (DCS 0/1 + r Pt ST)
STATE_TDA, // tertiary DA
STATE_SDA, // secondary DA (CSI > Pp ; Pv ; Pc c)
STATE_DA, // primary DA (CSI ? ... c)
} state;
bool xtgettcap_good; // high when we've received DCS 1
} init_state;
// FIXME ought implement the full Williams automaton
@ -626,7 +633,7 @@ typedef struct init_state {
// ought be fed to the machine, and -1 on an invalid state transition.
static int
pump_control_read(init_state* inits, unsigned char c){
fprintf(stderr, "char: %c %d %02x\n", c, c, c);
fprintf(stderr, "state: %2d char: %1c %3d %02x\n", inits->state, isprint(c) ? c : ' ', c, c);
if(c == NCKEY_ESC){
if(inits->state != STATE_NULL){
fprintf(stderr, "Unexpected escape in state %d\n", inits->state);
@ -645,12 +652,58 @@ pump_control_read(init_state* inits, unsigned char c){
inits->state = STATE_DCS;
}
break;
case STATE_CSI:
case STATE_CSI: // terminated by 0x40--0x7E ('@'--'~')
if(c == '?'){
inits->state = STATE_DA;
}else if(c == '>'){
inits->state = STATE_SDA;
}else if(c >= 0x40 && c <= 0x7E){
inits->state = STATE_NULL;
}
break;
case STATE_DCS: // terminated by ST
if(c == '\\'){
fprintf(stderr, "terminated DCS\n");
inits->state = STATE_NULL;
}else if(c == '1'){
inits->state = STATE_XTGETTCAP1;
inits->xtgettcap_good = true;
}else if(c == '0'){
inits->state = STATE_XTGETTCAP1;
inits->xtgettcap_good = false;
}
break;
case STATE_XTGETTCAP1:
if(c == '+'){
inits->state = STATE_XTGETTCAP2;
}else{
// FIXME malformed
}
break;
case STATE_XTGETTCAP2:
if(c == 'r'){
inits->state = STATE_XTGETTCAP3;
}else{
// FIXME malformed
}
break;
case STATE_XTGETTCAP3:
if(c == '\\'){
// FIXME done, go parse if good
inits->state = STATE_NULL;
}else{
// FIXME feed to terminfo buffer
}
break;
case STATE_TDA:
// FIXME
break;
case STATE_SDA:
if(c == 'c'){
inits->state = STATE_NULL;
}
break;
case STATE_DA:
case STATE_DA: // return success on end of DA
if(c == 'c'){
inits->state = STATE_NULL;
return 1;

Loading…
Cancel
Save