mirror of
https://github.com/sqlite/sqlite.git
synced 2025-11-11 01:42:22 +03:00
The makefile now runs mkkeywordhash.c. Keywords that are unused are
omitted from the keyword hash table. (CVS 2045) FossilOrigin-Name: 007aec11333432e08d1091b728773011e9078bc3
This commit is contained in:
19
Makefile.in
19
Makefile.in
@@ -77,6 +77,8 @@ TEMP_STORE = -DTEMP_STORE=@TEMP_STORE@
|
|||||||
# You should not have to change anything below this line
|
# You should not have to change anything below this line
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
|
BEXE = @BUILD_EXEEXT@
|
||||||
|
|
||||||
# Object files for the SQLite library.
|
# Object files for the SQLite library.
|
||||||
#
|
#
|
||||||
LIBOBJ = attach.lo auth.lo btree.lo build.lo date.lo delete.lo \
|
LIBOBJ = attach.lo auth.lo btree.lo build.lo date.lo delete.lo \
|
||||||
@@ -211,17 +213,17 @@ sqlite3@TARGET_EXEEXT@: $(TOP)/src/shell.c libsqlite3.la sqlite3.h
|
|||||||
# files are automatically generated. This target takes care of
|
# files are automatically generated. This target takes care of
|
||||||
# all that automatic generation.
|
# all that automatic generation.
|
||||||
#
|
#
|
||||||
target_source: $(SRC) $(VDBEHDR)
|
target_source: $(SRC) parse.c opcodes.c keywordhash.c $(VDBEHDR)
|
||||||
rm -rf tsrc
|
rm -rf tsrc
|
||||||
mkdir -p tsrc
|
mkdir -p tsrc
|
||||||
cp $(SRC) $(VDBEHDR) tsrc
|
cp $(SRC) $(VDBEHDR) tsrc
|
||||||
rm tsrc/sqlite.h.in tsrc/parse.y
|
rm tsrc/sqlite.h.in tsrc/parse.y
|
||||||
cp parse.c opcodes.c tsrc
|
cp parse.c opcodes.c keywordhash.c tsrc
|
||||||
cp $(TOP)/sqlite3.def tsrc
|
cp $(TOP)/sqlite3.def tsrc
|
||||||
|
|
||||||
# Rules to build the LEMON compiler generator
|
# Rules to build the LEMON compiler generator
|
||||||
#
|
#
|
||||||
lemon@BUILD_EXEEXT@: $(TOP)/tool/lemon.c $(TOP)/tool/lempar.c
|
lemon$(BEXE): $(TOP)/tool/lemon.c $(TOP)/tool/lempar.c
|
||||||
$(BCC) -o lemon $(TOP)/tool/lemon.c
|
$(BCC) -o lemon $(TOP)/tool/lemon.c
|
||||||
cp $(TOP)/tool/lempar.c .
|
cp $(TOP)/tool/lempar.c .
|
||||||
|
|
||||||
@@ -306,7 +308,7 @@ parse.lo: parse.c $(HDR)
|
|||||||
|
|
||||||
parse.h: parse.c
|
parse.h: parse.c
|
||||||
|
|
||||||
parse.c: $(TOP)/src/parse.y lemon@BUILD_EXEEXT@
|
parse.c: $(TOP)/src/parse.y lemon$(BEXE)
|
||||||
cp $(TOP)/src/parse.y .
|
cp $(TOP)/src/parse.y .
|
||||||
./lemon $(OPTS) parse.y
|
./lemon $(OPTS) parse.y
|
||||||
|
|
||||||
@@ -332,9 +334,13 @@ table.lo: $(TOP)/src/table.c $(HDR)
|
|||||||
tclsqlite.lo: $(TOP)/src/tclsqlite.c $(HDR)
|
tclsqlite.lo: $(TOP)/src/tclsqlite.c $(HDR)
|
||||||
$(LTCOMPILE) $(TCL_FLAGS) -c $(TOP)/src/tclsqlite.c
|
$(LTCOMPILE) $(TCL_FLAGS) -c $(TOP)/src/tclsqlite.c
|
||||||
|
|
||||||
tokenize.lo: $(TOP)/src/tokenize.c $(HDR)
|
tokenize.lo: $(TOP)/src/tokenize.c keywordhash.c $(HDR)
|
||||||
$(LTCOMPILE) -c $(TOP)/src/tokenize.c
|
$(LTCOMPILE) -c $(TOP)/src/tokenize.c
|
||||||
|
|
||||||
|
keywordhash.c: $(TOP)/tool/mkkeywordhash.c
|
||||||
|
$(BCC) -o mkkeywordhash$(BEXE) $(OPTS) $(TOP)/tool/mkkeywordhash.c
|
||||||
|
./mkkeywordhash$(BEXE) >keywordhash.c
|
||||||
|
|
||||||
trigger.lo: $(TOP)/src/trigger.c $(HDR)
|
trigger.lo: $(TOP)/src/trigger.c $(HDR)
|
||||||
$(LTCOMPILE) -c $(TOP)/src/trigger.c
|
$(LTCOMPILE) -c $(TOP)/src/trigger.c
|
||||||
|
|
||||||
@@ -554,7 +560,8 @@ clean:
|
|||||||
rm -f *.lo *.la *.o sqlite3@TARGET_EXEEXT@ libsqlite3.la
|
rm -f *.lo *.la *.o sqlite3@TARGET_EXEEXT@ libsqlite3.la
|
||||||
rm -f sqlite3.h opcodes.*
|
rm -f sqlite3.h opcodes.*
|
||||||
rm -rf .libs .deps
|
rm -rf .libs .deps
|
||||||
rm -f lemon@BUILD_EXEEXT@ lempar.c parse.* sqlite*.tar.gz
|
rm -f lemon$(BEXE) lempar.c parse.* sqlite*.tar.gz
|
||||||
|
rm -f mkkeywordhash$(BEXE) keywordhash.c
|
||||||
rm -f $(PUBLISH)
|
rm -f $(PUBLISH)
|
||||||
rm -f *.da *.bb *.bbg gmon.out
|
rm -f *.da *.bb *.bbg gmon.out
|
||||||
rm -f testfixture@TARGET_EXEEXT@ test.db
|
rm -f testfixture@TARGET_EXEEXT@ test.db
|
||||||
|
|||||||
12
main.mk
12
main.mk
@@ -181,12 +181,12 @@ objects: $(LIBOBJ_ORIG)
|
|||||||
# files are automatically generated. This target takes care of
|
# files are automatically generated. This target takes care of
|
||||||
# all that automatic generation.
|
# all that automatic generation.
|
||||||
#
|
#
|
||||||
target_source: $(SRC) $(VDBEHDR) opcodes.c
|
target_source: $(SRC) $(VDBEHDR) opcodes.c keyworkhash.c
|
||||||
rm -rf tsrc
|
rm -rf tsrc
|
||||||
mkdir tsrc
|
mkdir tsrc
|
||||||
cp $(SRC) $(VDBEHDR) tsrc
|
cp $(SRC) $(VDBEHDR) tsrc
|
||||||
rm tsrc/sqlite.h.in tsrc/parse.y
|
rm tsrc/sqlite.h.in tsrc/parse.y
|
||||||
cp parse.c opcodes.c tsrc
|
cp parse.c opcodes.c keywordhash.c tsrc
|
||||||
cp $(TOP)/sqlite3.def tsrc
|
cp $(TOP)/sqlite3.def tsrc
|
||||||
|
|
||||||
# Rules to build the LEMON compiler generator
|
# Rules to build the LEMON compiler generator
|
||||||
@@ -302,9 +302,13 @@ table.o: $(TOP)/src/table.c $(HDR)
|
|||||||
tclsqlite.o: $(TOP)/src/tclsqlite.c $(HDR)
|
tclsqlite.o: $(TOP)/src/tclsqlite.c $(HDR)
|
||||||
$(TCCX) $(TCL_FLAGS) -c $(TOP)/src/tclsqlite.c
|
$(TCCX) $(TCL_FLAGS) -c $(TOP)/src/tclsqlite.c
|
||||||
|
|
||||||
tokenize.o: $(TOP)/src/tokenize.c $(HDR)
|
tokenize.o: $(TOP)/src/tokenize.c keywordhash.c $(HDR)
|
||||||
$(TCCX) -c $(TOP)/src/tokenize.c
|
$(TCCX) -c $(TOP)/src/tokenize.c
|
||||||
|
|
||||||
|
keywordhash.c: $(TOP)/tool/mkkeywordhash.c
|
||||||
|
$(BCC) -o mkkeywordhash $(OPTS) $(TOP)/tool/mkkeywordhash.c
|
||||||
|
./mkkeywordhash >keywordhash.c
|
||||||
|
|
||||||
trigger.o: $(TOP)/src/trigger.c $(HDR)
|
trigger.o: $(TOP)/src/trigger.c $(HDR)
|
||||||
$(TCCX) -c $(TOP)/src/trigger.c
|
$(TCCX) -c $(TOP)/src/trigger.c
|
||||||
|
|
||||||
@@ -527,7 +531,7 @@ install: sqlite3 libsqlite3.a sqlite3.h
|
|||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f *.o sqlite3 libsqlite3.a sqlite3.h opcodes.*
|
rm -f *.o sqlite3 libsqlite3.a sqlite3.h opcodes.*
|
||||||
rm -f lemon lempar.c parse.* sqlite*.tar.gz
|
rm -f lemon lempar.c parse.* sqlite*.tar.gz mkkeywordhash keywordhash.c
|
||||||
rm -f $(PUBLISH)
|
rm -f $(PUBLISH)
|
||||||
rm -f *.da *.bb *.bbg gmon.out
|
rm -f *.da *.bb *.bbg gmon.out
|
||||||
rm -rf tsrc
|
rm -rf tsrc
|
||||||
|
|||||||
22
manifest
22
manifest
@@ -1,6 +1,6 @@
|
|||||||
C Auto-vacuum\sbugfix:\sDo\snot\sattempt\sto\smove\sa\spointer-map\spage\sduring\sauto-vacuum.\s(CVS\s2044)
|
C The\smakefile\snow\sruns\smkkeywordhash.c.\s\sKeywords\sthat\sare\sunused\sare\nomitted\sfrom\sthe\skeyword\shash\stable.\s(CVS\s2045)
|
||||||
D 2004-11-03T03:52:37
|
D 2004-11-03T03:59:57
|
||||||
F Makefile.in 9e90c685d69f09039015a6b1f3b0a48e9738c9e5
|
F Makefile.in c4d2416860f472a1e3393714d0372074197565df
|
||||||
F Makefile.linux-gcc a9e5a0d309fa7c38e7c14d3ecf7690879d3a5457
|
F Makefile.linux-gcc a9e5a0d309fa7c38e7c14d3ecf7690879d3a5457
|
||||||
F README a01693e454a00cc117967e3f9fdab2d4d52e9bc1
|
F README a01693e454a00cc117967e3f9fdab2d4d52e9bc1
|
||||||
F VERSION 342b6d5fde93b6d45023e2fee0163dda6464b9d6
|
F VERSION 342b6d5fde93b6d45023e2fee0163dda6464b9d6
|
||||||
@@ -16,7 +16,7 @@ F doc/lemon.html f0f682f50210928c07e562621c3b7e8ab912a538
|
|||||||
F doc/report1.txt a031aaf37b185e4fa540223cb516d3bccec7eeac
|
F doc/report1.txt a031aaf37b185e4fa540223cb516d3bccec7eeac
|
||||||
F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895
|
F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895
|
||||||
F ltmain.sh f6b283068efa69f06eb8aa1fe4bddfdbdeb35826
|
F ltmain.sh f6b283068efa69f06eb8aa1fe4bddfdbdeb35826
|
||||||
F main.mk c7c97f809e5e7897bc843db64f692c7ef9013a92
|
F main.mk 594a756a761111da9415ca4b1ca7cbf3d269a3a3
|
||||||
F mkdll.sh 468d4f41d3ea98221371df4825cfbffbaac4d7e4
|
F mkdll.sh 468d4f41d3ea98221371df4825cfbffbaac4d7e4
|
||||||
F mkopcodec.awk 14a794f7b206976afc416b30fe8e0fc97f3434e9
|
F mkopcodec.awk 14a794f7b206976afc416b30fe8e0fc97f3434e9
|
||||||
F mkopcodeh.awk 4090944e4de0a2ccb99aa0083290f73bce4db406
|
F mkopcodeh.awk 4090944e4de0a2ccb99aa0083290f73bce4db406
|
||||||
@@ -54,7 +54,7 @@ F src/os_win.c 9482dfc92f289b68205bb2c9315757c7e3946bfb
|
|||||||
F src/os_win.h 41a946bea10f61c158ce8645e7646b29d44f122b
|
F src/os_win.h 41a946bea10f61c158ce8645e7646b29d44f122b
|
||||||
F src/pager.c 6b00c0d5aac601b9f556b8fdba25e69438245f1a
|
F src/pager.c 6b00c0d5aac601b9f556b8fdba25e69438245f1a
|
||||||
F src/pager.h cbe4ba356d9dd3f30260f322b3dc77408164df14
|
F src/pager.h cbe4ba356d9dd3f30260f322b3dc77408164df14
|
||||||
F src/parse.y 08f4971f89e651f47b3f83fe7369c7edde254331
|
F src/parse.y 625750bf4b01a7c2b4c15e5367a7539a66e6c909
|
||||||
F src/pragma.c 44e192eb5928157bdb015926f858a7c6e3ef6c98
|
F src/pragma.c 44e192eb5928157bdb015926f858a7c6e3ef6c98
|
||||||
F src/printf.c 7a92adc00b758cd5ce087dae80181a8bbdb70ed2
|
F src/printf.c 7a92adc00b758cd5ce087dae80181a8bbdb70ed2
|
||||||
F src/random.c eff68e3f257e05e81eae6c4d50a51eb88beb4ff3
|
F src/random.c eff68e3f257e05e81eae6c4d50a51eb88beb4ff3
|
||||||
@@ -69,7 +69,7 @@ F src/test2.c b11fa244fff02190707dd0879987c37c75e61fc8
|
|||||||
F src/test3.c f423597e220b3d446a65c9cc0c49cb4eb00c0215
|
F src/test3.c f423597e220b3d446a65c9cc0c49cb4eb00c0215
|
||||||
F src/test4.c 7c6b9fc33dd1f3f93c7f1ee6e5e6d016afa6c1df
|
F src/test4.c 7c6b9fc33dd1f3f93c7f1ee6e5e6d016afa6c1df
|
||||||
F src/test5.c b001fa7f1b9e2dc5c2331de62fc641b5ab2bd7a1
|
F src/test5.c b001fa7f1b9e2dc5c2331de62fc641b5ab2bd7a1
|
||||||
F src/tokenize.c a0a999bf4800e7295ac66c8694f84414ceff1755
|
F src/tokenize.c bf9de9689b3bb813d65784bf54472804bf9595e6
|
||||||
F src/trigger.c f9a0a8d3a87238de1a934eeb7d0b6b1f13e6a55b
|
F src/trigger.c f9a0a8d3a87238de1a934eeb7d0b6b1f13e6a55b
|
||||||
F src/update.c ee15b7ba712c2292802eba2d465f039b5deada39
|
F src/update.c ee15b7ba712c2292802eba2d465f039b5deada39
|
||||||
F src/utf.c f4f83acd73389090e32d6589d307fc55d794c7ed
|
F src/utf.c f4f83acd73389090e32d6589d307fc55d794c7ed
|
||||||
@@ -201,7 +201,7 @@ F tool/lempar.c 1e61d2b6cb9d8affa264a13336bc0c088498caa4
|
|||||||
F tool/memleak.awk b744b6109566206c746d826f6ecdba34662216bc
|
F tool/memleak.awk b744b6109566206c746d826f6ecdba34662216bc
|
||||||
F tool/memleak2.awk 9cc20c8e8f3c675efac71ea0721ee6874a1566e8
|
F tool/memleak2.awk 9cc20c8e8f3c675efac71ea0721ee6874a1566e8
|
||||||
F tool/memleak3.tcl 336eb50b0849dbf99b1d5462d9c37291b01b2b43
|
F tool/memleak3.tcl 336eb50b0849dbf99b1d5462d9c37291b01b2b43
|
||||||
F tool/mkkeywordhash.c ed1f2a21a4e7f2757281c4cf7a8392c0e0ad2d5d
|
F tool/mkkeywordhash.c f1cb22f47cc6c60d50ac4af19a55c0e8757ac92c
|
||||||
F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e x
|
F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e x
|
||||||
F tool/opcodeDoc.awk b3a2a3d5d3075b8bd90b7afe24283efdd586659c
|
F tool/opcodeDoc.awk b3a2a3d5d3075b8bd90b7afe24283efdd586659c
|
||||||
F tool/report1.txt 9eae07f26a8fc53889b45fc833a66a33daa22816
|
F tool/report1.txt 9eae07f26a8fc53889b45fc833a66a33daa22816
|
||||||
@@ -252,7 +252,7 @@ F www/tclsqlite.tcl 560ecd6a916b320e59f2917317398f3d59b7cc25
|
|||||||
F www/vdbe.tcl 59288db1ac5c0616296b26dce071c36cb611dfe9
|
F www/vdbe.tcl 59288db1ac5c0616296b26dce071c36cb611dfe9
|
||||||
F www/version3.tcl 092a01f5ef430d2c4acc0ae558d74c4bb89638a0
|
F www/version3.tcl 092a01f5ef430d2c4acc0ae558d74c4bb89638a0
|
||||||
F www/whentouse.tcl fdacb0ba2d39831e8a6240d05a490026ad4c4e4c
|
F www/whentouse.tcl fdacb0ba2d39831e8a6240d05a490026ad4c4e4c
|
||||||
P b7d953e1195897de4869ec241a65e8a3d1320efb
|
P bd50fbb5fecd1829c87e8ca72c458c71f590274b
|
||||||
R e185cf7676cc794eee9060c09350688b
|
R c93f4ae3ede116e4f0e25ff57fd95e47
|
||||||
U danielk1977
|
U drh
|
||||||
Z 0648ce34f782ce635735be96e8684487
|
Z 2a91aed8200460991cb047467354dda3
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
bd50fbb5fecd1829c87e8ca72c458c71f590274b
|
007aec11333432e08d1091b728773011e9078bc3
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
** the parser. Lemon will also generate a header file containing
|
** the parser. Lemon will also generate a header file containing
|
||||||
** numeric codes for all of the tokens.
|
** numeric codes for all of the tokens.
|
||||||
**
|
**
|
||||||
** @(#) $Id: parse.y,v 1.145 2004/10/31 02:22:49 drh Exp $
|
** @(#) $Id: parse.y,v 1.146 2004/11/03 03:59:57 drh Exp $
|
||||||
*/
|
*/
|
||||||
%token_prefix TK_
|
%token_prefix TK_
|
||||||
%token_type {Token}
|
%token_type {Token}
|
||||||
@@ -150,6 +150,7 @@ id(A) ::= ID(X). {A = X;}
|
|||||||
%ifdef SQLITE_OMIT_COMPOUND_SELECT
|
%ifdef SQLITE_OMIT_COMPOUND_SELECT
|
||||||
EXCEPT INTERSECT UNION
|
EXCEPT INTERSECT UNION
|
||||||
%endif
|
%endif
|
||||||
|
REINDEX RENAME AUTOINCR CDATE CTIME CTIMESTAMP ALTER
|
||||||
.
|
.
|
||||||
|
|
||||||
// Define operator precedence early so that this is the first occurance
|
// Define operator precedence early so that this is the first occurance
|
||||||
|
|||||||
101
src/tokenize.c
101
src/tokenize.c
@@ -15,7 +15,7 @@
|
|||||||
** individual tokens and sends those tokens one-by-one over to the
|
** individual tokens and sends those tokens one-by-one over to the
|
||||||
** parser for analysis.
|
** parser for analysis.
|
||||||
**
|
**
|
||||||
** $Id: tokenize.c,v 1.93 2004/10/31 02:22:49 drh Exp $
|
** $Id: tokenize.c,v 1.94 2004/11/03 03:59:58 drh Exp $
|
||||||
*/
|
*/
|
||||||
#include "sqliteInt.h"
|
#include "sqliteInt.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
@@ -23,104 +23,17 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** This function looks up an identifier to determine if it is a
|
** The sqlite3KeywordCode function looks up an identifier to determine if
|
||||||
** keyword. If it is a keyword, the token code of that keyword is
|
** 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.
|
** returned. If the input is not a keyword, TK_ID is returned.
|
||||||
**
|
**
|
||||||
** The implementation of this routine was generated by a program,
|
** The implementation of this routine was generated by a program,
|
||||||
** mkkeywordhash.c, located in the tool subdirectory of the distribution.
|
** mkkeywordhash.c, located in the tool subdirectory of the distribution.
|
||||||
** The output of the mkkeywordhash.c program was manually cut and pasted
|
** The output of the mkkeywordhash.c program is written into a file
|
||||||
** into this file. When the set of keywords for SQLite changes, you
|
** named keywordhash.c and then included into this source file by
|
||||||
** must modify the mkkeywordhash.c program (to add or remove keywords from
|
** the #include below.
|
||||||
** the data tables) then rerun that program to regenerate this function.
|
|
||||||
*/
|
*/
|
||||||
int sqlite3KeywordCode(const char *z, int n){
|
#include "keywordhash.c"
|
||||||
static const char zText[443] =
|
|
||||||
"ABORTABLEFTEMPORARYAFTERAISELECTHENDATABASEACHECKEYANDEFAULTRANSACTION"
|
|
||||||
"ATURALIKELSEXCEPTRIGGEREFERENCESTATEMENTATTACHAVINGLOBEFOREIGN"
|
|
||||||
"OREPLACEXCLUSIVEXPLAINDEXBEGINITIALLYBETWEENOTNULLIMITBYCASCADE"
|
|
||||||
"FERRABLECASECOLLATECOMMITCONFLICTCONSTRAINTERSECTCREATECROSSDEFERRED"
|
|
||||||
"ELETEDESCDETACHDISTINCTDROPRAGMATCHFAILFROMFULLGROUPDATEIMMEDIATE"
|
|
||||||
"INNERESTRICTINSERTINSTEADINTOFFSETISNULLJOINORDERIGHTOUTEROLLBACK"
|
|
||||||
"PRIMARYROWHENUNIONUNIQUEUSINGVACUUMVALUESVIEWHERE";
|
|
||||||
static const unsigned char aHash[154] = {
|
|
||||||
0, 26, 82, 0, 0, 91, 90, 0, 27, 0, 0, 0, 0,
|
|
||||||
0, 0, 49, 0, 96, 17, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 97, 5, 31, 0, 62, 51, 28, 58, 52, 0, 0, 60,
|
|
||||||
61, 0, 12, 41, 50, 0, 0, 0, 36, 63, 0, 0, 15,
|
|
||||||
0, 0, 0, 39, 0, 42, 0, 0, 0, 0, 78, 0, 34,
|
|
||||||
29, 0, 74, 71, 0, 66, 70, 37, 0, 0, 59, 0, 33,
|
|
||||||
0, 53, 0, 54, 0, 55, 0, 83, 72, 67, 0, 24, 0,
|
|
||||||
0, 79, 80, 84, 0, 0, 0, 0, 0, 0, 0, 75, 0,
|
|
||||||
0, 0, 0, 0, 45, 77, 35, 44, 57, 0, 0, 0, 0,
|
|
||||||
20, 2, 0, 38, 0, 3, 46, 93, 0, 0, 40, 0, 94,
|
|
||||||
0, 43, 87, 98, 0, 0, 0, 0, 0, 81, 0, 0, 0,
|
|
||||||
0, 10, 0, 0, 0, 0, 0, 92, 19, 0, 95,
|
|
||||||
};
|
|
||||||
static const unsigned char aNext[98] = {
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,
|
|
||||||
0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0,
|
|
||||||
0, 0, 0, 0, 0, 18, 22, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 23, 0, 16, 21, 8, 0, 32, 0, 0, 30, 0, 48,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0,
|
|
||||||
0, 56, 0, 1, 0, 69, 64, 0, 0, 65, 0, 0, 13,
|
|
||||||
68, 0, 0, 76, 47, 0, 0, 0, 85, 6, 0, 89, 25,
|
|
||||||
4, 73, 88, 86, 0, 0, 0,
|
|
||||||
};
|
|
||||||
static const unsigned char aLen[98] = {
|
|
||||||
5, 5, 4, 4, 9, 2, 5, 5, 6, 4, 3, 8, 2,
|
|
||||||
4, 5, 3, 3, 7, 11, 2, 7, 4, 4, 6, 7, 10,
|
|
||||||
9, 6, 6, 4, 6, 3, 7, 6, 7, 9, 7, 5, 5,
|
|
||||||
9, 3, 7, 3, 7, 4, 5, 2, 7, 3, 10, 4, 7,
|
|
||||||
6, 8, 10, 2, 9, 6, 5, 8, 6, 4, 6, 8, 2,
|
|
||||||
4, 6, 5, 4, 4, 4, 5, 6, 9, 5, 8, 6, 7,
|
|
||||||
4, 2, 6, 3, 6, 4, 5, 5, 5, 8, 7, 3, 4,
|
|
||||||
5, 6, 5, 6, 6, 4, 5,
|
|
||||||
};
|
|
||||||
static const unsigned short int aOffset[98] = {
|
|
||||||
0, 4, 7, 10, 10, 14, 19, 23, 26, 31, 33, 35, 40,
|
|
||||||
42, 44, 48, 51, 53, 59, 68, 69, 75, 78, 81, 86, 92,
|
|
||||||
101, 110, 115, 120, 123, 125, 125, 129, 133, 139, 147, 152, 157,
|
|
||||||
160, 165, 169, 175, 175, 178, 181, 186, 188, 189, 193, 203, 207,
|
|
||||||
214, 220, 228, 235, 235, 244, 250, 255, 262, 268, 272, 278, 279,
|
|
||||||
286, 289, 293, 298, 302, 306, 310, 313, 319, 328, 332, 340, 346,
|
|
||||||
353, 356, 356, 359, 362, 368, 372, 376, 381, 385, 393, 400, 402,
|
|
||||||
406, 411, 417, 422, 428, 434, 437,
|
|
||||||
};
|
|
||||||
static const unsigned char aCode[98] = {
|
|
||||||
TK_ABORT, TK_TABLE, TK_JOIN_KW, TK_TEMP, TK_TEMP,
|
|
||||||
TK_OR, TK_AFTER, TK_RAISE, TK_SELECT, TK_THEN,
|
|
||||||
TK_END, TK_DATABASE, TK_AS, TK_EACH, TK_CHECK,
|
|
||||||
TK_KEY, TK_AND, TK_DEFAULT, TK_TRANSACTION,TK_ON,
|
|
||||||
TK_JOIN_KW, TK_LIKE, TK_ELSE, TK_EXCEPT, TK_TRIGGER,
|
|
||||||
TK_REFERENCES, TK_STATEMENT, TK_ATTACH, TK_HAVING, TK_GLOB,
|
|
||||||
TK_BEFORE, TK_FOR, TK_FOREIGN, TK_IGNORE, TK_REPLACE,
|
|
||||||
TK_EXCLUSIVE, TK_EXPLAIN, TK_INDEX, TK_BEGIN, TK_INITIALLY,
|
|
||||||
TK_ALL, TK_BETWEEN, TK_NOT, TK_NOTNULL, TK_NULL,
|
|
||||||
TK_LIMIT, TK_BY, TK_CASCADE, TK_ASC, TK_DEFERRABLE,
|
|
||||||
TK_CASE, TK_COLLATE, TK_COMMIT, TK_CONFLICT, TK_CONSTRAINT,
|
|
||||||
TK_IN, TK_INTERSECT, TK_CREATE, TK_JOIN_KW, TK_DEFERRED,
|
|
||||||
TK_DELETE, TK_DESC, TK_DETACH, TK_DISTINCT, TK_IS,
|
|
||||||
TK_DROP, TK_PRAGMA, TK_MATCH, TK_FAIL, TK_FROM,
|
|
||||||
TK_JOIN_KW, TK_GROUP, TK_UPDATE, TK_IMMEDIATE, TK_JOIN_KW,
|
|
||||||
TK_RESTRICT, TK_INSERT, TK_INSTEAD, TK_INTO, TK_OF,
|
|
||||||
TK_OFFSET, TK_SET, TK_ISNULL, TK_JOIN, TK_ORDER,
|
|
||||||
TK_JOIN_KW, TK_JOIN_KW, TK_ROLLBACK, TK_PRIMARY, TK_ROW,
|
|
||||||
TK_WHEN, TK_UNION, TK_UNIQUE, TK_USING, TK_VACUUM,
|
|
||||||
TK_VALUES, TK_VIEW, TK_WHERE,
|
|
||||||
};
|
|
||||||
int h, i;
|
|
||||||
if( n<2 ) return TK_ID;
|
|
||||||
h = (sqlite3UpperToLower[((unsigned char*)z)[0]]*5 +
|
|
||||||
sqlite3UpperToLower[((unsigned char*)z)[n-1]]*3 +
|
|
||||||
n) % 154;
|
|
||||||
for(i=((int)aHash[h])-1; i>=0; i=((int)aNext[i])-1){
|
|
||||||
if( aLen[i]==n && sqlite3StrNICmp(&zText[aOffset[i]],z,n)==0 ){
|
|
||||||
return aCode[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return TK_ID;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ typedef struct Keyword Keyword;
|
|||||||
struct Keyword {
|
struct Keyword {
|
||||||
char *zName; /* The keyword name */
|
char *zName; /* The keyword name */
|
||||||
char *zTokenType; /* Token value for this keyword */
|
char *zTokenType; /* Token value for this keyword */
|
||||||
|
int mask; /* Code this keyword if non-zero */
|
||||||
int id; /* Unique ID for this record */
|
int id; /* Unique ID for this record */
|
||||||
int hash; /* Hash on the keyword */
|
int hash; /* Hash on the keyword */
|
||||||
int offset; /* Offset to start of name string */
|
int offset; /* Offset to start of name string */
|
||||||
@@ -25,112 +26,185 @@ struct Keyword {
|
|||||||
int substrOffset; /* Offset into substrId for start of this keyword */
|
int substrOffset; /* Offset into substrId for start of this keyword */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Define masks used to determine which keywords are allowed
|
||||||
|
*/
|
||||||
|
#ifdef SQLITE_OMIT_ALTER_TABLE
|
||||||
|
# define ALTER 0
|
||||||
|
#else
|
||||||
|
# define ALTER 1
|
||||||
|
#endif
|
||||||
|
#define ALWAYS 2
|
||||||
|
#ifdef SQLITE_OMIT_ATTACH
|
||||||
|
# define ATTACH 0
|
||||||
|
#else
|
||||||
|
# define ATTACH 4
|
||||||
|
#endif
|
||||||
|
#ifdef SQLITE_OMIT_AUTOINCREMENT
|
||||||
|
# define AUTOINCR 0
|
||||||
|
#else
|
||||||
|
# define AUTOINCR 8
|
||||||
|
#endif
|
||||||
|
#ifdef SQLITE_OMIT_COMPOUND_SELECT
|
||||||
|
# define COMPOUND 0
|
||||||
|
#else
|
||||||
|
# define COMPOUND 16
|
||||||
|
#endif
|
||||||
|
#ifdef SQLITE_OMIT_CONFLICT_CLAUSE
|
||||||
|
# define CONFLICT 0
|
||||||
|
#else
|
||||||
|
# define CONFLICT 32
|
||||||
|
#endif
|
||||||
|
#ifdef SQLITE_OMIT_EXPLAIN
|
||||||
|
# define EXPLAIN 0
|
||||||
|
#else
|
||||||
|
# define EXPLAIN 64
|
||||||
|
#endif
|
||||||
|
#ifdef SQLITE_OMIT_FOREIGN_KEY
|
||||||
|
# define FKEY 0
|
||||||
|
#else
|
||||||
|
# define FKEY 128
|
||||||
|
#endif
|
||||||
|
#ifdef SQLITE_OMIT_PRAGMA
|
||||||
|
# define PRAGMA 0
|
||||||
|
#else
|
||||||
|
# define PRAGMA 256
|
||||||
|
#endif
|
||||||
|
#ifdef SQLITE_OMIT_REINDEX
|
||||||
|
# define REINDEX 0
|
||||||
|
#else
|
||||||
|
# define REINDEX 512
|
||||||
|
#endif
|
||||||
|
#ifdef SQLITE_OMIT_TRIGGER
|
||||||
|
# define TRIGGER 0
|
||||||
|
#else
|
||||||
|
# define TRIGGER 1024
|
||||||
|
#endif
|
||||||
|
#ifdef SQLITE_OMIT_VACUUM
|
||||||
|
# define VACUUM 0
|
||||||
|
#else
|
||||||
|
# define VACUUM 2048
|
||||||
|
#endif
|
||||||
|
#ifdef SQLITE_OMIT_VIEW
|
||||||
|
# define VIEW 0
|
||||||
|
#else
|
||||||
|
# define VIEW 4096
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** These are the keywords
|
** These are the keywords
|
||||||
*/
|
*/
|
||||||
static Keyword aKeywordTable[] = {
|
static Keyword aKeywordTable[] = {
|
||||||
{ "ABORT", "TK_ABORT", },
|
{ "ABORT", "TK_ABORT", CONFLICT|TRIGGER },
|
||||||
{ "AFTER", "TK_AFTER", },
|
{ "AFTER", "TK_AFTER", TRIGGER },
|
||||||
{ "ALL", "TK_ALL", },
|
{ "ALL", "TK_ALL", ALWAYS },
|
||||||
{ "AND", "TK_AND", },
|
{ "ALTER", "TK_ALTER", ALTER },
|
||||||
{ "AS", "TK_AS", },
|
{ "AND", "TK_AND", ALWAYS },
|
||||||
{ "ASC", "TK_ASC", },
|
{ "AS", "TK_AS", ALWAYS },
|
||||||
{ "ATTACH", "TK_ATTACH", },
|
{ "ASC", "TK_ASC", ALWAYS },
|
||||||
{ "BEFORE", "TK_BEFORE", },
|
{ "ATTACH", "TK_ATTACH", ATTACH },
|
||||||
{ "BEGIN", "TK_BEGIN", },
|
{ "AUTOINCREMENT", "TK_AUTOINCR", AUTOINCR },
|
||||||
{ "BETWEEN", "TK_BETWEEN", },
|
{ "BEFORE", "TK_BEFORE", TRIGGER },
|
||||||
{ "BY", "TK_BY", },
|
{ "BEGIN", "TK_BEGIN", ALWAYS },
|
||||||
{ "CASCADE", "TK_CASCADE", },
|
{ "BETWEEN", "TK_BETWEEN", ALWAYS },
|
||||||
{ "CASE", "TK_CASE", },
|
{ "BY", "TK_BY", ALWAYS },
|
||||||
{ "CHECK", "TK_CHECK", },
|
{ "CASCADE", "TK_CASCADE", FKEY },
|
||||||
{ "COLLATE", "TK_COLLATE", },
|
{ "CASE", "TK_CASE", ALWAYS },
|
||||||
{ "COMMIT", "TK_COMMIT", },
|
{ "CHECK", "TK_CHECK", ALWAYS },
|
||||||
{ "CONFLICT", "TK_CONFLICT", },
|
{ "COLLATE", "TK_COLLATE", ALWAYS },
|
||||||
{ "CONSTRAINT", "TK_CONSTRAINT", },
|
{ "COMMIT", "TK_COMMIT", ALWAYS },
|
||||||
{ "CREATE", "TK_CREATE", },
|
{ "CONFLICT", "TK_CONFLICT", CONFLICT },
|
||||||
{ "CROSS", "TK_JOIN_KW", },
|
{ "CONSTRAINT", "TK_CONSTRAINT", ALWAYS },
|
||||||
{ "DATABASE", "TK_DATABASE", },
|
{ "CREATE", "TK_CREATE", ALWAYS },
|
||||||
{ "DEFAULT", "TK_DEFAULT", },
|
{ "CROSS", "TK_JOIN_KW", ALWAYS },
|
||||||
{ "DEFERRED", "TK_DEFERRED", },
|
{ "CURRENT_DATE", "TK_CDATE", ALWAYS },
|
||||||
{ "DEFERRABLE", "TK_DEFERRABLE", },
|
{ "CURRENT_TIME", "TK_CTIME", ALWAYS },
|
||||||
{ "DELETE", "TK_DELETE", },
|
{ "CURRENT_TIMESTAMP","TK_CTIMESTAMP", ALWAYS },
|
||||||
{ "DESC", "TK_DESC", },
|
{ "DATABASE", "TK_DATABASE", ATTACH },
|
||||||
{ "DETACH", "TK_DETACH", },
|
{ "DEFAULT", "TK_DEFAULT", ALWAYS },
|
||||||
{ "DISTINCT", "TK_DISTINCT", },
|
{ "DEFERRED", "TK_DEFERRED", FKEY },
|
||||||
{ "DROP", "TK_DROP", },
|
{ "DEFERRABLE", "TK_DEFERRABLE", FKEY },
|
||||||
{ "END", "TK_END", },
|
{ "DELETE", "TK_DELETE", ALWAYS },
|
||||||
{ "EACH", "TK_EACH", },
|
{ "DESC", "TK_DESC", ALWAYS },
|
||||||
{ "ELSE", "TK_ELSE", },
|
{ "DETACH", "TK_DETACH", ATTACH },
|
||||||
{ "EXCEPT", "TK_EXCEPT", },
|
{ "DISTINCT", "TK_DISTINCT", ALWAYS },
|
||||||
{ "EXCLUSIVE", "TK_EXCLUSIVE", },
|
{ "DROP", "TK_DROP", ALWAYS },
|
||||||
{ "EXPLAIN", "TK_EXPLAIN", },
|
{ "END", "TK_END", ALWAYS },
|
||||||
{ "FAIL", "TK_FAIL", },
|
{ "EACH", "TK_EACH", TRIGGER },
|
||||||
{ "FOR", "TK_FOR", },
|
{ "ELSE", "TK_ELSE", ALWAYS },
|
||||||
{ "FOREIGN", "TK_FOREIGN", },
|
{ "EXCEPT", "TK_EXCEPT", COMPOUND },
|
||||||
{ "FROM", "TK_FROM", },
|
{ "EXCLUSIVE", "TK_EXCLUSIVE", ALWAYS },
|
||||||
{ "FULL", "TK_JOIN_KW", },
|
{ "EXPLAIN", "TK_EXPLAIN", EXPLAIN },
|
||||||
{ "GLOB", "TK_GLOB", },
|
{ "FAIL", "TK_FAIL", CONFLICT|TRIGGER },
|
||||||
{ "GROUP", "TK_GROUP", },
|
{ "FOR", "TK_FOR", TRIGGER },
|
||||||
{ "HAVING", "TK_HAVING", },
|
{ "FOREIGN", "TK_FOREIGN", FKEY },
|
||||||
{ "IGNORE", "TK_IGNORE", },
|
{ "FROM", "TK_FROM", ALWAYS },
|
||||||
{ "IMMEDIATE", "TK_IMMEDIATE", },
|
{ "FULL", "TK_JOIN_KW", ALWAYS },
|
||||||
{ "IN", "TK_IN", },
|
{ "GLOB", "TK_GLOB", ALWAYS },
|
||||||
{ "INDEX", "TK_INDEX", },
|
{ "GROUP", "TK_GROUP", ALWAYS },
|
||||||
{ "INITIALLY", "TK_INITIALLY", },
|
{ "HAVING", "TK_HAVING", ALWAYS },
|
||||||
{ "INNER", "TK_JOIN_KW", },
|
{ "IGNORE", "TK_IGNORE", CONFLICT|TRIGGER },
|
||||||
{ "INSERT", "TK_INSERT", },
|
{ "IMMEDIATE", "TK_IMMEDIATE", FKEY },
|
||||||
{ "INSTEAD", "TK_INSTEAD", },
|
{ "IN", "TK_IN", ALWAYS },
|
||||||
{ "INTERSECT", "TK_INTERSECT", },
|
{ "INDEX", "TK_INDEX", ALWAYS },
|
||||||
{ "INTO", "TK_INTO", },
|
{ "INITIALLY", "TK_INITIALLY", FKEY },
|
||||||
{ "IS", "TK_IS", },
|
{ "INNER", "TK_JOIN_KW", ALWAYS },
|
||||||
{ "ISNULL", "TK_ISNULL", },
|
{ "INSERT", "TK_INSERT", ALWAYS },
|
||||||
{ "JOIN", "TK_JOIN", },
|
{ "INSTEAD", "TK_INSTEAD", TRIGGER },
|
||||||
{ "KEY", "TK_KEY", },
|
{ "INTERSECT", "TK_INTERSECT", COMPOUND },
|
||||||
{ "LEFT", "TK_JOIN_KW", },
|
{ "INTO", "TK_INTO", ALWAYS },
|
||||||
{ "LIKE", "TK_LIKE", },
|
{ "IS", "TK_IS", ALWAYS },
|
||||||
{ "LIMIT", "TK_LIMIT", },
|
{ "ISNULL", "TK_ISNULL", ALWAYS },
|
||||||
{ "MATCH", "TK_MATCH", },
|
{ "JOIN", "TK_JOIN", ALWAYS },
|
||||||
{ "NATURAL", "TK_JOIN_KW", },
|
{ "KEY", "TK_KEY", ALWAYS },
|
||||||
{ "NOT", "TK_NOT", },
|
{ "LEFT", "TK_JOIN_KW", ALWAYS },
|
||||||
{ "NOTNULL", "TK_NOTNULL", },
|
{ "LIKE", "TK_LIKE", ALWAYS },
|
||||||
{ "NULL", "TK_NULL", },
|
{ "LIMIT", "TK_LIMIT", ALWAYS },
|
||||||
{ "OF", "TK_OF", },
|
{ "MATCH", "TK_MATCH", ALWAYS },
|
||||||
{ "OFFSET", "TK_OFFSET", },
|
{ "NATURAL", "TK_JOIN_KW", ALWAYS },
|
||||||
{ "ON", "TK_ON", },
|
{ "NOT", "TK_NOT", ALWAYS },
|
||||||
{ "OR", "TK_OR", },
|
{ "NOTNULL", "TK_NOTNULL", ALWAYS },
|
||||||
{ "ORDER", "TK_ORDER", },
|
{ "NULL", "TK_NULL", ALWAYS },
|
||||||
{ "OUTER", "TK_JOIN_KW", },
|
{ "OF", "TK_OF", ALWAYS },
|
||||||
{ "PRAGMA", "TK_PRAGMA", },
|
{ "OFFSET", "TK_OFFSET", ALWAYS },
|
||||||
{ "PRIMARY", "TK_PRIMARY", },
|
{ "ON", "TK_ON", ALWAYS },
|
||||||
{ "RAISE", "TK_RAISE", },
|
{ "OR", "TK_OR", ALWAYS },
|
||||||
{ "REFERENCES", "TK_REFERENCES", },
|
{ "ORDER", "TK_ORDER", ALWAYS },
|
||||||
{ "REPLACE", "TK_REPLACE", },
|
{ "OUTER", "TK_JOIN_KW", ALWAYS },
|
||||||
{ "RESTRICT", "TK_RESTRICT", },
|
{ "PRAGMA", "TK_PRAGMA", PRAGMA },
|
||||||
{ "RIGHT", "TK_JOIN_KW", },
|
{ "PRIMARY", "TK_PRIMARY", ALWAYS },
|
||||||
{ "ROLLBACK", "TK_ROLLBACK", },
|
{ "RAISE", "TK_RAISE", TRIGGER },
|
||||||
{ "ROW", "TK_ROW", },
|
{ "REFERENCES", "TK_REFERENCES", FKEY },
|
||||||
{ "SELECT", "TK_SELECT", },
|
{ "REINDEX", "TK_REINDEX", REINDEX },
|
||||||
{ "SET", "TK_SET", },
|
{ "RENAME", "TK_RENAME", ALTER },
|
||||||
{ "STATEMENT", "TK_STATEMENT", },
|
{ "REPLACE", "TK_REPLACE", CONFLICT },
|
||||||
{ "TABLE", "TK_TABLE", },
|
{ "RESTRICT", "TK_RESTRICT", FKEY },
|
||||||
{ "TEMP", "TK_TEMP", },
|
{ "RIGHT", "TK_JOIN_KW", ALWAYS },
|
||||||
{ "TEMPORARY", "TK_TEMP", },
|
{ "ROLLBACK", "TK_ROLLBACK", ALWAYS },
|
||||||
{ "THEN", "TK_THEN", },
|
{ "ROW", "TK_ROW", TRIGGER },
|
||||||
{ "TRANSACTION", "TK_TRANSACTION", },
|
{ "SELECT", "TK_SELECT", ALWAYS },
|
||||||
{ "TRIGGER", "TK_TRIGGER", },
|
{ "SET", "TK_SET", ALWAYS },
|
||||||
{ "UNION", "TK_UNION", },
|
{ "STATEMENT", "TK_STATEMENT", TRIGGER },
|
||||||
{ "UNIQUE", "TK_UNIQUE", },
|
{ "TABLE", "TK_TABLE", ALWAYS },
|
||||||
{ "UPDATE", "TK_UPDATE", },
|
{ "TEMP", "TK_TEMP", ALWAYS },
|
||||||
{ "USING", "TK_USING", },
|
{ "TEMPORARY", "TK_TEMP", ALWAYS },
|
||||||
{ "VACUUM", "TK_VACUUM", },
|
{ "THEN", "TK_THEN", ALWAYS },
|
||||||
{ "VALUES", "TK_VALUES", },
|
{ "TRANSACTION", "TK_TRANSACTION", ALWAYS },
|
||||||
{ "VIEW", "TK_VIEW", },
|
{ "TRIGGER", "TK_TRIGGER", TRIGGER },
|
||||||
{ "WHEN", "TK_WHEN", },
|
{ "UNION", "TK_UNION", COMPOUND },
|
||||||
{ "WHERE", "TK_WHERE", },
|
{ "UNIQUE", "TK_UNIQUE", ALWAYS },
|
||||||
|
{ "UPDATE", "TK_UPDATE", ALWAYS },
|
||||||
|
{ "USING", "TK_USING", ALWAYS },
|
||||||
|
{ "VACUUM", "TK_VACUUM", VACUUM },
|
||||||
|
{ "VALUES", "TK_VALUES", ALWAYS },
|
||||||
|
{ "VIEW", "TK_VIEW", VIEW },
|
||||||
|
{ "WHEN", "TK_WHEN", ALWAYS },
|
||||||
|
{ "WHERE", "TK_WHERE", ALWAYS },
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Number of keywords */
|
/* Number of keywords */
|
||||||
#define NKEYWORD (sizeof(aKeywordTable)/sizeof(aKeywordTable[0]))
|
static int NKEYWORD = (sizeof(aKeywordTable)/sizeof(aKeywordTable[0]));
|
||||||
|
|
||||||
/* An array to map all upper-case characters into their corresponding
|
/* An array to map all upper-case characters into their corresponding
|
||||||
** lower-case character.
|
** lower-case character.
|
||||||
@@ -201,6 +275,16 @@ int main(int argc, char **argv){
|
|||||||
int nChar;
|
int nChar;
|
||||||
int aHash[1000]; /* 1000 is much bigger than NKEYWORD */
|
int aHash[1000]; /* 1000 is much bigger than NKEYWORD */
|
||||||
|
|
||||||
|
/* Remove entries from the list of keywords that have mask==0 */
|
||||||
|
for(i=j=0; i<NKEYWORD; i++){
|
||||||
|
if( aKeywordTable[i].mask==0 ) continue;
|
||||||
|
if( j<i ){
|
||||||
|
aKeywordTable[j] = aKeywordTable[i];
|
||||||
|
}
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
NKEYWORD = j;
|
||||||
|
|
||||||
/* Fill in the lengths of strings and hashes for all entries. */
|
/* Fill in the lengths of strings and hashes for all entries. */
|
||||||
for(i=0; i<NKEYWORD; i++){
|
for(i=0; i<NKEYWORD; i++){
|
||||||
Keyword *p = &aKeywordTable[i];
|
Keyword *p = &aKeywordTable[i];
|
||||||
|
|||||||
Reference in New Issue
Block a user