kernel32: Use binary search for key lookup in terminfo generated data.
This commit is contained in:
parent
6d75a47b6d
commit
1f0e9499e5
@ -336,6 +336,13 @@ static struct dbkey_pair* TERM_dbkey;
|
|||||||
static unsigned TERM_dbkey_size;
|
static unsigned TERM_dbkey_size;
|
||||||
static unsigned TERM_dbkey_index;
|
static unsigned TERM_dbkey_index;
|
||||||
|
|
||||||
|
static int TERM_dbkey_cmp(const void* p1, const void* p2)
|
||||||
|
{
|
||||||
|
const struct dbkey_pair* kp1 = p1;
|
||||||
|
const struct dbkey_pair* kp2 = p2;
|
||||||
|
return strcmp(kp1->string, kp2->string);
|
||||||
|
}
|
||||||
|
|
||||||
static BOOL TERM_AddKeyDescr(const char* string, struct dbkey_descr* descr)
|
static BOOL TERM_AddKeyDescr(const char* string, struct dbkey_descr* descr)
|
||||||
{
|
{
|
||||||
if (!string || string == (const char*)-1) return TRUE;
|
if (!string || string == (const char*)-1) return TRUE;
|
||||||
@ -363,7 +370,7 @@ static BOOL TERM_AddKeyDescr(const char* string, struct dbkey_descr* descr)
|
|||||||
|
|
||||||
static BOOL TERM_BuildKeyDB(void)
|
static BOOL TERM_BuildKeyDB(void)
|
||||||
{
|
{
|
||||||
unsigned i, len;
|
unsigned i, j, len;
|
||||||
struct dbkey_descr descr;
|
struct dbkey_descr descr;
|
||||||
char tmp[64];
|
char tmp[64];
|
||||||
|
|
||||||
@ -388,6 +395,17 @@ static BOOL TERM_BuildKeyDB(void)
|
|||||||
#undef X
|
#undef X
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (i = 0; i < TERM_dbkey_index; i++)
|
||||||
|
{
|
||||||
|
for (j = 0; j < TERM_dbkey_index; j++)
|
||||||
|
{
|
||||||
|
if (i != j &&
|
||||||
|
TERM_dbkey[i].string_len >= TERM_dbkey[j].string_len &&
|
||||||
|
!memcmp(TERM_dbkey[i].string, TERM_dbkey[j].string, TERM_dbkey[j].string_len))
|
||||||
|
FIXME("substring %d/%s %d/%s\n", i, TERM_dbkey[i].string, j, TERM_dbkey[j].string);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
qsort(TERM_dbkey, TERM_dbkey_index, sizeof(TERM_dbkey[0]), TERM_dbkey_cmp);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -419,27 +437,30 @@ BOOL TERM_Exit(void)
|
|||||||
/* -1 not found, 0 cannot decide, > 0 found */
|
/* -1 not found, 0 cannot decide, > 0 found */
|
||||||
int TERM_FillInputRecord(const char* in, size_t len, INPUT_RECORD* ir)
|
int TERM_FillInputRecord(const char* in, size_t len, INPUT_RECORD* ir)
|
||||||
{
|
{
|
||||||
unsigned i;
|
int low = 0, high = TERM_dbkey_index - 1, mid, res;
|
||||||
struct dbkey_descr* found = NULL;
|
struct dbkey_descr* found;
|
||||||
|
|
||||||
for (i = 0; i < TERM_dbkey_index; i++)
|
while (low <= high)
|
||||||
{
|
{
|
||||||
if (!memcmp(TERM_dbkey[i].string, in, len))
|
mid = low + (high - low) / 2;
|
||||||
|
res = memcmp(in, TERM_dbkey[mid].string, len);
|
||||||
|
if (!res)
|
||||||
{
|
{
|
||||||
if (len < TERM_dbkey[i].string_len) return 0;
|
if (len < TERM_dbkey[mid].string_len) return 0;
|
||||||
if (found) return 0;
|
found = &TERM_dbkey[mid].descr;
|
||||||
found = &TERM_dbkey[i].descr;
|
switch (found->kind)
|
||||||
|
{
|
||||||
|
case dbk_simple:
|
||||||
|
return TERM_FillSimpleChar(found->p1, ir);
|
||||||
|
case dbk_complex:
|
||||||
|
init_complex_char(&ir[0], 1, found->p1, found->p2, ENHANCED_KEY | found->p3);
|
||||||
|
init_complex_char(&ir[1], 0, found->p1, found->p2, ENHANCED_KEY | found->p3);
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
else if (res < 0) high = mid - 1;
|
||||||
if (!found) return -1;
|
else low = mid + 1;
|
||||||
switch (found->kind)
|
|
||||||
{
|
|
||||||
case dbk_simple:
|
|
||||||
return TERM_FillSimpleChar(found->p1, ir);
|
|
||||||
case dbk_complex:
|
|
||||||
init_complex_char(&ir[0], 1, found->p1, found->p2, ENHANCED_KEY | found->p3);
|
|
||||||
init_complex_char(&ir[1], 0, found->p1, found->p2, ENHANCED_KEY | found->p3);
|
|
||||||
return 2;
|
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user