Binary search terminfo funcname => termkey sym conversion, rather than linear
This commit is contained in:
parent
fd769d621e
commit
2ceb64261a
21
driver-ti.c
21
driver-ti.c
|
@ -125,6 +125,7 @@ static struct {
|
||||||
int mods;
|
int mods;
|
||||||
} funcs[] =
|
} funcs[] =
|
||||||
{
|
{
|
||||||
|
/* THIS LIST MUST REMAIN SORTED! */
|
||||||
{ "backspace", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_BACKSPACE, 0 },
|
{ "backspace", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_BACKSPACE, 0 },
|
||||||
{ "begin", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_BEGIN, 0 },
|
{ "begin", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_BEGIN, 0 },
|
||||||
{ "btab", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_TAB, TERMKEY_KEYMOD_SHIFT },
|
{ "btab", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_TAB, TERMKEY_KEYMOD_SHIFT },
|
||||||
|
@ -147,15 +148,29 @@ static struct {
|
||||||
|
|
||||||
static int funcname2keysym(const char *funcname, termkey_type *typep, termkey_keysym *symp, int *modmaskp, int *modsetp)
|
static int funcname2keysym(const char *funcname, termkey_type *typep, termkey_keysym *symp, int *modmaskp, int *modsetp)
|
||||||
{
|
{
|
||||||
int i;
|
// Binary search
|
||||||
for(i = 0; funcs[i].funcname; i++) {
|
|
||||||
if(strcmp(funcname, funcs[i].funcname) == 0) {
|
int start = 0;
|
||||||
|
int end = sizeof(funcs)/sizeof(funcs[0]); // is "one past" the end of the range
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
int i = (start+end) / 2;
|
||||||
|
int cmp = strcmp(funcname, funcs[i].funcname);
|
||||||
|
|
||||||
|
if(cmp == 0) {
|
||||||
*typep = funcs[i].type;
|
*typep = funcs[i].type;
|
||||||
*symp = funcs[i].sym;
|
*symp = funcs[i].sym;
|
||||||
*modmaskp = funcs[i].mods;
|
*modmaskp = funcs[i].mods;
|
||||||
*modsetp = funcs[i].mods;
|
*modsetp = funcs[i].mods;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
else if(end == start + 1)
|
||||||
|
// That was our last choice and it wasn't it - not found
|
||||||
|
break;
|
||||||
|
else if(cmp > 0)
|
||||||
|
start = i;
|
||||||
|
else
|
||||||
|
end = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(funcname[0] == 'f' && isdigit(funcname[1])) {
|
if(funcname[0] == 'f' && isdigit(funcname[1])) {
|
||||||
|
|
Loading…
Reference in New Issue