msi: Use a binary search to find sql keywords.

This commit is contained in:
Mike McCormack 2006-08-30 20:07:44 +09:00 committed by Alexandre Julliard
parent a8ae03f2d8
commit f9042ec9e8
1 changed files with 23 additions and 8 deletions

View File

@ -39,6 +39,8 @@ struct Keyword {
int tokenType; /* The token value for this keyword */
};
#define MAX_TOKEN_LEN 11
static const WCHAR ABORT_W[] = { 'A','B','O','R','T',0 };
static const WCHAR AFTER_W[] = { 'A','F','T','E','R',0 };
static const WCHAR ALTER_W[] = { 'A','L','T','E','R',0 };
@ -263,21 +265,34 @@ static const Keyword aKeywordTable[] = {
#define KEYWORD_COUNT ( sizeof aKeywordTable/sizeof (Keyword) )
/*
** Comparison function for binary search.
*/
static int compKeyword(const void *m1, const void *m2){
const Keyword *k1 = m1, *k2 = m2;
return strcmpiW( k1->zName, k2->zName );
}
/*
** This function looks up an identifier to determine if it is a
** keyword. If it is a keyword, the token code of that keyword is
** returned. If the input is not a keyword, TK_ID is returned.
*/
static int sqliteKeywordCode(const WCHAR *z, int n){
UINT i;
WCHAR str[MAX_TOKEN_LEN+1];
Keyword key, *r;
for(i=0; i<KEYWORD_COUNT; i++)
{
if(strncmpiW(z, aKeywordTable[i].zName, n))
continue;
if(lstrlenW(aKeywordTable[i].zName) == n )
return aKeywordTable[i].tokenType;
}
if( n>MAX_TOKEN_LEN )
return TK_ID;
memcpy( str, z, n*sizeof (WCHAR) );
str[n] = 0;
key.tokenType = 0;
key.zName = str;
r = bsearch( &key, aKeywordTable, KEYWORD_COUNT, sizeof (Keyword), compKeyword );
if( r )
return r->tokenType;
return TK_ID;
}