Module: wine Branch: master Commit: f9042ec9e8436f5b1614e6e9c518a8b7cd192d3d URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=f9042ec9e8436f5b1614e6e9...
Author: Mike McCormack mike@codeweavers.com Date: Wed Aug 30 20:07:44 2006 +0900
msi: Use a binary search to find sql keywords.
---
dlls/msi/tokenize.c | 31 +++++++++++++++++++++++-------- 1 files changed, 23 insertions(+), 8 deletions(-)
diff --git a/dlls/msi/tokenize.c b/dlls/msi/tokenize.c index fe13983..37c6b4a 100644 --- a/dlls/msi/tokenize.c +++ b/dlls/msi/tokenize.c @@ -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 }; @@ -264,20 +266,33 @@ 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; }