From 3ea08be5977f12e70e52307bcbc8ce350ecdbe79 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Mon, 22 Oct 2012 15:55:16 +0200 Subject: do not use strcmpiW --- libmsi/tokenize.c | 137 ++++++++++++++++++++++-------------------------------- 1 file changed, 55 insertions(+), 82 deletions(-) (limited to 'libmsi') diff --git a/libmsi/tokenize.c b/libmsi/tokenize.c index af073fa..ca17727 100644 --- a/libmsi/tokenize.c +++ b/libmsi/tokenize.c @@ -32,92 +32,54 @@ */ typedef struct Keyword Keyword; struct Keyword { - const WCHAR *zName; /* The keyword name */ + const char *zName; /* The keyword name */ int tokenType; /* The token value for this keyword */ }; #define MAX_TOKEN_LEN 11 -static const WCHAR ADD_W[] = { 'A','D','D',0 }; -static const WCHAR ALTER_W[] = { 'A','L','T','E','R',0 }; -static const WCHAR AND_W[] = { 'A','N','D',0 }; -static const WCHAR BY_W[] = { 'B','Y',0 }; -static const WCHAR CHAR_W[] = { 'C','H','A','R',0 }; -static const WCHAR CHARACTER_W[] = { 'C','H','A','R','A','C','T','E','R',0 }; -static const WCHAR CREATE_W[] = { 'C','R','E','A','T','E',0 }; -static const WCHAR DELETE_W[] = { 'D','E','L','E','T','E',0 }; -static const WCHAR DISTINCT_W[] = { 'D','I','S','T','I','N','C','T',0 }; -static const WCHAR DROP_W[] = { 'D','R','O','P',0 }; -static const WCHAR FREE_W[] = { 'F','R','E','E',0 }; -static const WCHAR FROM_W[] = { 'F','R','O','M',0 }; -static const WCHAR HOLD_W[] = { 'H','O','L','D',0 }; -static const WCHAR INSERT_W[] = { 'I','N','S','E','R','T',0 }; -static const WCHAR INT_W[] = { 'I','N','T',0 }; -static const WCHAR INTEGER_W[] = { 'I','N','T','E','G','E','R',0 }; -static const WCHAR INTO_W[] = { 'I','N','T','O',0 }; -static const WCHAR IS_W[] = { 'I','S',0 }; -static const WCHAR KEY_W[] = { 'K','E','Y',0 }; -static const WCHAR LIKE_W[] = { 'L','I','K','E',0 }; -static const WCHAR LOCALIZABLE_W[] = { 'L','O','C','A','L','I','Z','A','B','L','E',0 }; -static const WCHAR LONG_W[] = { 'L','O','N','G',0 }; -static const WCHAR LONGCHAR_W[] = { 'L','O','N','G','C','H','A','R',0 }; -static const WCHAR NOT_W[] = { 'N','O','T',0 }; -static const WCHAR NULL_W[] = { 'N','U','L','L',0 }; -static const WCHAR OBJECT_W[] = { 'O','B','J','E','C','T',0 }; -static const WCHAR OR_W[] = { 'O','R',0 }; -static const WCHAR ORDER_W[] = { 'O','R','D','E','R',0 }; -static const WCHAR PRIMARY_W[] = { 'P','R','I','M','A','R','Y',0 }; -static const WCHAR SELECT_W[] = { 'S','E','L','E','C','T',0 }; -static const WCHAR SET_W[] = { 'S','E','T',0 }; -static const WCHAR SHORT_W[] = { 'S','H','O','R','T',0 }; -static const WCHAR TABLE_W[] = { 'T','A','B','L','E',0 }; -static const WCHAR TEMPORARY_W[] = { 'T','E','M','P','O','R','A','R','Y',0 }; -static const WCHAR UPDATE_W[] = { 'U','P','D','A','T','E',0 }; -static const WCHAR VALUES_W[] = { 'V','A','L','U','E','S',0 }; -static const WCHAR WHERE_W[] = { 'W','H','E','R','E',0 }; - /* ** These are the keywords ** They MUST be in alphabetical order */ static const Keyword aKeywordTable[] = { - { ADD_W, TK_ADD }, - { ALTER_W, TK_ALTER }, - { AND_W, TK_AND }, - { BY_W, TK_BY }, - { CHAR_W, TK_CHAR }, - { CHARACTER_W, TK_CHAR }, - { CREATE_W, TK_CREATE }, - { DELETE_W, TK_DELETE }, - { DISTINCT_W, TK_DISTINCT }, - { DROP_W, TK_DROP }, - { FREE_W, TK_FREE }, - { FROM_W, TK_FROM }, - { HOLD_W, TK_HOLD }, - { INSERT_W, TK_INSERT }, - { INT_W, TK_INT }, - { INTEGER_W, TK_INT }, - { INTO_W, TK_INTO }, - { IS_W, TK_IS }, - { KEY_W, TK_KEY }, - { LIKE_W, TK_LIKE }, - { LOCALIZABLE_W, TK_LOCALIZABLE }, - { LONG_W, TK_LONG }, - { LONGCHAR_W, TK_LONGCHAR }, - { NOT_W, TK_NOT }, - { NULL_W, TK_NULL }, - { OBJECT_W, TK_OBJECT }, - { OR_W, TK_OR }, - { ORDER_W, TK_ORDER }, - { PRIMARY_W, TK_PRIMARY }, - { SELECT_W, TK_SELECT }, - { SET_W, TK_SET }, - { SHORT_W, TK_SHORT }, - { TABLE_W, TK_TABLE }, - { TEMPORARY_W, TK_TEMPORARY }, - { UPDATE_W, TK_UPDATE }, - { VALUES_W, TK_VALUES }, - { WHERE_W, TK_WHERE }, + { "ADD", TK_ADD }, + { "ALTER", TK_ALTER }, + { "AND", TK_AND }, + { "BY", TK_BY }, + { "CHAR", TK_CHAR }, + { "CHARACTER", TK_CHAR }, + { "CREATE", TK_CREATE }, + { "DELETE", TK_DELETE }, + { "DISTINCT", TK_DISTINCT }, + { "DROP", TK_DROP }, + { "FREE", TK_FREE }, + { "FROM", TK_FROM }, + { "HOLD", TK_HOLD }, + { "INSERT", TK_INSERT }, + { "INT", TK_INT }, + { "INTEGER", TK_INT }, + { "INTO", TK_INTO }, + { "IS", TK_IS }, + { "KEY", TK_KEY }, + { "LIKE", TK_LIKE }, + { "LOCALIZABLE", TK_LOCALIZABLE }, + { "LONG", TK_LONG }, + { "LONGCHAR", TK_LONGCHAR }, + { "NOT", TK_NOT }, + { "NULL", TK_NULL }, + { "OBJECT", TK_OBJECT }, + { "OR", TK_OR }, + { "ORDER", TK_ORDER }, + { "PRIMARY", TK_PRIMARY }, + { "SELECT", TK_SELECT }, + { "SET", TK_SET }, + { "SHORT", TK_SHORT }, + { "TABLE", TK_TABLE }, + { "TEMPORARY", TK_TEMPORARY }, + { "UPDATE", TK_UPDATE }, + { "VALUES", TK_VALUES }, + { "WHERE", TK_WHERE }, }; #define KEYWORD_COUNT ( sizeof aKeywordTable/sizeof (Keyword) ) @@ -126,9 +88,22 @@ static const Keyword aKeywordTable[] = { ** Comparison function for binary search. */ static int compKeyword(const void *m1, const void *m2){ - const Keyword *k1 = m1, *k2 = m2; + const WCHAR *p = m1; + const Keyword *k = m2; + const char *q = k->zName; + + for (; *p; p++, q++) { + CHAR c; + if ((USHORT) *p > 127) + return 1; + c = *p; + if (c >= 'a' && c <= 'z') + c ^= 'A' ^ 'a'; + if (c != *q) + return (UINT)c - (UINT)*q; + } - return strcmpiW( k1->zName, k2->zName ); + return (unsigned)*p - (unsigned)*q; } /* @@ -138,16 +113,14 @@ static int compKeyword(const void *m1, const void *m2){ */ static int sqliteKeywordCode(const WCHAR *z, int n){ WCHAR str[MAX_TOKEN_LEN+1]; - Keyword key, *r; + Keyword *r; 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 ); + r = bsearch( str, aKeywordTable, KEYWORD_COUNT, sizeof (Keyword), compKeyword ); if( r ) return r->tokenType; return TK_ID; -- cgit