rewrite big staggered if() in xtversion with table #1845

pull/1859/head
nick black 3 years ago
parent 0d03e7fbbc
commit ca556c3457
No known key found for this signature in database
GPG Key ID: 5F43400C21CBFACC

@ -730,55 +730,51 @@ ruts_string(query_state* inits, initstates_e state){
// extract the terminal version from the running string, following 'prefix' // extract the terminal version from the running string, following 'prefix'
static int static int
extract_version(query_state* qstate, const char* prefix){ extract_version(query_state* qstate, size_t slen){
size_t bytes = strlen(qstate->runstring + strlen(prefix)) + 1; size_t bytes = strlen(qstate->runstring + slen) + 1;
qstate->version = malloc(bytes); qstate->version = malloc(bytes);
if(qstate->version == NULL){ if(qstate->version == NULL){
return -1; return -1;
} }
memcpy(qstate->version, qstate->runstring + strlen(prefix), bytes); memcpy(qstate->version, qstate->runstring + slen, bytes);
return 0; return 0;
} }
static int static int
extract_paren_version(query_state* qstate, const char* prefix){ extract_xtversion(query_state* qstate, size_t slen, char suffix){
if(qstate->runstring[qstate->stridx - 1] != ')'){ if(qstate->runstring[qstate->stridx - 1] != suffix){
return -1; return -1;
} }
qstate->runstring[qstate->stridx - 1] = '\0'; qstate->runstring[qstate->stridx - 1] = '\0';
extract_version(qstate, prefix); return extract_version(qstate, slen);
return 0;
} }
static int static int
stash_string(query_state* inits){ stash_string(query_state* inits){
//fprintf(stderr, "string terminator after %d [%s]\n", inits->stringstate, inits->runstring); //fprintf(stderr, "string terminator after %d [%s]\n", inits->stringstate, inits->runstring);
switch(inits->stringstate){ switch(inits->stringstate){
// FIXME replace these with some structured loop
case STATE_XTVERSION1:{ case STATE_XTVERSION1:{
#define XTERMVT "XTerm(" static const struct {
if(strncmp(inits->runstring, XTERMVT, strlen(XTERMVT)) == 0){ const char* prefix;
if(extract_paren_version(inits, XTERMVT) == 0){ char suffix;
inits->qterm = TERMINAL_XTERM; queried_terminals_e term;
} } xtvers[] = {
#undef XTERMVT { .prefix = "XTerm(", .suffix = ')', .term = TERMINAL_XTERM, },
}else if(strncmp(inits->runstring, "WezTerm ", strlen("WezTerm ")) == 0){ { .prefix = "WezTerm ", .suffix = 0, .term = TERMINAL_WEZTERM, },
extract_version(inits, "WezTerm "); { .prefix = "contour ", .suffix = 0, .term = TERMINAL_CONTOUR, },
inits->qterm = TERMINAL_WEZTERM; { .prefix = "kitty(", .suffix = ')', .term = TERMINAL_KITTY, },
}else if(strncmp(inits->runstring, "contour ", strlen("contour ")) == 0){ { .prefix = "foot(", .suffix = ')', .term = TERMINAL_FOOT, },
extract_version(inits, "contour "); { .prefix = "iTerm2 [", .suffix = ']', .term = TERMINAL_ITERM, },
inits->qterm = TERMINAL_CONTOUR; { .prefix = NULL, .suffix = 0, .term = TERMINAL_UNKNOWN, },
#define KITTYVT "kitty(" }, *xtv;
}else if(strncmp(inits->runstring, KITTYVT, strlen(KITTYVT)) == 0){ for(xtv = xtvers ; xtv->prefix ; ++xtv){
if(extract_paren_version(inits, KITTYVT) == 0){ if(strncmp(inits->runstring, xtv->prefix, strlen(xtv->prefix)) == 0){
inits->qterm = TERMINAL_KITTY; if(extract_xtversion(inits, strlen(xtv->prefix), xtv->suffix) == 0){
} inits->qterm = xtv->term;
#undef KITTYVT }
#define FOOTVT "foot(" break;
}else if(strncmp(inits->runstring, FOOTVT, strlen(FOOTVT)) == 0){
if(extract_paren_version(inits, FOOTVT) == 0){
inits->qterm = TERMINAL_FOOT;
} }
#undef FOOTVT
} }
break; break;
}case STATE_XTGETTCAP_TERMNAME1: }case STATE_XTGETTCAP_TERMNAME1:

Loading…
Cancel
Save