/* Number of keywords */
static int nKeyword = (sizeof(aKeywordTable)/sizeof(aKeywordTable[0]));
-/* An array to map all upper-case characters into their corresponding
-** lower-case character.
-*/
-const unsigned char sqlite3UpperToLower[] = {
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
- 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
- 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
- 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 97, 98, 99,100,101,102,103,
- 104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,
- 122, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103,104,105,106,107,
- 108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,
- 126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
- 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,
- 162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,
- 180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,
- 198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,
- 216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,
- 234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,
- 252,253,254,255
-};
-#define UpperToLower sqlite3UpperToLower
+/* Map all alphabetic characters into the same case */
+#define charMap(X) (0x20|(X))
/*
** Comparision function for two Keyword records
** output.
*/
int main(int argc, char **argv){
- int i, j, k, h;
+ int i, j, k, h, m;
int bestSize, bestCount;
int count;
int nChar;
assert( p->len<sizeof(p->zOrigName) );
memcpy(p->zOrigName, p->zName, p->len+1);
totalLen += p->len;
- p->hash = (UpperToLower[(int)p->zName[0]]*4) ^
- (UpperToLower[(int)p->zName[p->len-1]]*3) ^ p->len;
+ p->hash = (charMap(p->zName[0])*4) ^
+ (charMap(p->zName[p->len-1])*3) ^ (p->len*1);
p->id = i+1;
}
/* Begin generating code */
printf("%s", zHdr);
printf("/* Hash score: %d */\n", bestCount);
- printf("static int keywordCode(const char *z, int n){\n");
+ printf("static int keywordCode(const char *z, int n, int *pType){\n");
printf(" /* zText[] encodes %d bytes of keywords in %d bytes */\n",
totalLen + nKeyword, nChar+1 );
for(i=j=k=0; i<nKeyword; i++){
printf("%s };\n", j==0 ? "" : "\n");
printf(" int h, i;\n");
- printf(" if( n<2 ) return TK_ID;\n");
- printf(" h = ((charMap(z[0])*4) ^\n"
- " (charMap(z[n-1])*3) ^\n"
- " n) %% %d;\n", bestSize);
- printf(" for(i=((int)aHash[h])-1; i>=0; i=((int)aNext[i])-1){\n");
- printf(" if( aLen[i]==n &&"
- " sqlite3StrNICmp(&zText[aOffset[i]],z,n)==0 ){\n");
+ printf(" if( n>=2 ){\n");
+ printf(" h = ((charMap(z[0])*4) ^ (charMap(z[n-1])*3) ^ n) %% %d;\n",
+ bestSize);
+ printf(" for(i=((int)aHash[h])-1; i>=0; i=((int)aNext[i])-1){\n");
+ printf(" if( aLen[i]==n &&"
+ " sqlite3StrNICmp(&zText[aOffset[i]],z,n)==0 ){\n");
for(i=0; i<nKeyword; i++){
- printf(" testcase( i==%d ); /* %s */\n",
+ printf(" testcase( i==%d ); /* %s */\n",
i, aKeywordTable[i].zOrigName);
}
- printf(" return aCode[i];\n");
+ printf(" *pType = aCode[i];\n");
+ printf(" break;\n");
+ printf(" }\n");
printf(" }\n");
printf(" }\n");
- printf(" return TK_ID;\n");
+ printf(" return n;\n");
printf("}\n");
printf("int sqlite3KeywordCode(const unsigned char *z, int n){\n");
- printf(" return keywordCode((char*)z, n);\n");
+ printf(" int id = TK_ID;\n");
+ printf(" keywordCode((char*)z, n, &id);\n");
+ printf(" return id;\n");
printf("}\n");
printf("#define SQLITE_N_KEYWORD %d\n", nKeyword);