diff options
author | Roman Zippel <zippel@linux-m68k.org> | 2005-11-09 00:34:51 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-11-09 10:55:53 -0500 |
commit | 7a88488bbc231e48a4a88ee2569bc0cc5d706f0a (patch) | |
tree | 2fd6b51b5cf76dd37a2a369a29c50b5121c12a92 /scripts/kconfig/zconf.l | |
parent | 491d711035dc08071ed58cf470f15efadb67cb1c (diff) |
[PATCH] kconfig: use gperf for kconfig keywords
Use gperf to generate a hash for the kconfig keywords. This greatly reduces
the size of the generated scanner and makes it easier to extend kconfig.
Signed-off-by: Roman Zippel <zippel@linux-m68k.org>
Cc: Sam Ravnborg <sam@ravnborg.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'scripts/kconfig/zconf.l')
-rw-r--r-- | scripts/kconfig/zconf.l | 53 |
1 files changed, 14 insertions, 39 deletions
diff --git a/scripts/kconfig/zconf.l b/scripts/kconfig/zconf.l index 55517b2877cd..ec902091be97 100644 --- a/scripts/kconfig/zconf.l +++ b/scripts/kconfig/zconf.l | |||
@@ -18,8 +18,7 @@ | |||
18 | 18 | ||
19 | #define START_STRSIZE 16 | 19 | #define START_STRSIZE 16 |
20 | 20 | ||
21 | char *text; | 21 | static char *text; |
22 | static char *text_ptr; | ||
23 | static int text_size, text_asize; | 22 | static int text_size, text_asize; |
24 | 23 | ||
25 | struct buffer { | 24 | struct buffer { |
@@ -38,23 +37,22 @@ void new_string(void) | |||
38 | { | 37 | { |
39 | text = malloc(START_STRSIZE); | 38 | text = malloc(START_STRSIZE); |
40 | text_asize = START_STRSIZE; | 39 | text_asize = START_STRSIZE; |
41 | text_ptr = text; | ||
42 | text_size = 0; | 40 | text_size = 0; |
43 | *text_ptr = 0; | 41 | *text = 0; |
44 | } | 42 | } |
45 | 43 | ||
46 | void append_string(const char *str, int size) | 44 | void append_string(const char *str, int size) |
47 | { | 45 | { |
48 | int new_size = text_size + size + 1; | 46 | int new_size = text_size + size + 1; |
49 | if (new_size > text_asize) { | 47 | if (new_size > text_asize) { |
48 | new_size += START_STRSIZE - 1; | ||
49 | new_size &= -START_STRSIZE; | ||
50 | text = realloc(text, new_size); | 50 | text = realloc(text, new_size); |
51 | text_asize = new_size; | 51 | text_asize = new_size; |
52 | text_ptr = text + text_size; | ||
53 | } | 52 | } |
54 | memcpy(text_ptr, str, size); | 53 | memcpy(text + text_size, str, size); |
55 | text_ptr += size; | ||
56 | text_size += size; | 54 | text_size += size; |
57 | *text_ptr = 0; | 55 | text[text_size] = 0; |
58 | } | 56 | } |
59 | 57 | ||
60 | void alloc_string(const char *str, int size) | 58 | void alloc_string(const char *str, int size) |
@@ -88,36 +86,12 @@ n [A-Za-z0-9_] | |||
88 | 86 | ||
89 | 87 | ||
90 | <COMMAND>{ | 88 | <COMMAND>{ |
91 | "mainmenu" BEGIN(PARAM); return T_MAINMENU; | ||
92 | "menu" BEGIN(PARAM); return T_MENU; | ||
93 | "endmenu" BEGIN(PARAM); return T_ENDMENU; | ||
94 | "source" BEGIN(PARAM); return T_SOURCE; | ||
95 | "choice" BEGIN(PARAM); return T_CHOICE; | ||
96 | "endchoice" BEGIN(PARAM); return T_ENDCHOICE; | ||
97 | "comment" BEGIN(PARAM); return T_COMMENT; | ||
98 | "config" BEGIN(PARAM); return T_CONFIG; | ||
99 | "menuconfig" BEGIN(PARAM); return T_MENUCONFIG; | ||
100 | "help" BEGIN(PARAM); return T_HELP; | ||
101 | "if" BEGIN(PARAM); return T_IF; | ||
102 | "endif" BEGIN(PARAM); return T_ENDIF; | ||
103 | "depends" BEGIN(PARAM); return T_DEPENDS; | ||
104 | "requires" BEGIN(PARAM); return T_REQUIRES; | ||
105 | "optional" BEGIN(PARAM); return T_OPTIONAL; | ||
106 | "default" BEGIN(PARAM); return T_DEFAULT; | ||
107 | "prompt" BEGIN(PARAM); return T_PROMPT; | ||
108 | "tristate" BEGIN(PARAM); return T_TRISTATE; | ||
109 | "def_tristate" BEGIN(PARAM); return T_DEF_TRISTATE; | ||
110 | "bool" BEGIN(PARAM); return T_BOOLEAN; | ||
111 | "boolean" BEGIN(PARAM); return T_BOOLEAN; | ||
112 | "def_bool" BEGIN(PARAM); return T_DEF_BOOLEAN; | ||
113 | "def_boolean" BEGIN(PARAM); return T_DEF_BOOLEAN; | ||
114 | "int" BEGIN(PARAM); return T_INT; | ||
115 | "hex" BEGIN(PARAM); return T_HEX; | ||
116 | "string" BEGIN(PARAM); return T_STRING; | ||
117 | "select" BEGIN(PARAM); return T_SELECT; | ||
118 | "enable" BEGIN(PARAM); return T_SELECT; | ||
119 | "range" BEGIN(PARAM); return T_RANGE; | ||
120 | {n}+ { | 89 | {n}+ { |
90 | struct kconf_id *id = kconf_id_lookup(yytext, yyleng); | ||
91 | if (id && id->flags & TF_COMMAND) { | ||
92 | BEGIN(PARAM); | ||
93 | return id->token; | ||
94 | } | ||
121 | alloc_string(yytext, yyleng); | 95 | alloc_string(yytext, yyleng); |
122 | zconflval.string = text; | 96 | zconflval.string = text; |
123 | return T_WORD; | 97 | return T_WORD; |
@@ -134,8 +108,6 @@ n [A-Za-z0-9_] | |||
134 | "!" return T_NOT; | 108 | "!" return T_NOT; |
135 | "=" return T_EQUAL; | 109 | "=" return T_EQUAL; |
136 | "!=" return T_UNEQUAL; | 110 | "!=" return T_UNEQUAL; |
137 | "if" return T_IF; | ||
138 | "on" return T_ON; | ||
139 | \"|\' { | 111 | \"|\' { |
140 | str = yytext[0]; | 112 | str = yytext[0]; |
141 | new_string(); | 113 | new_string(); |
@@ -144,6 +116,9 @@ n [A-Za-z0-9_] | |||
144 | \n BEGIN(INITIAL); current_file->lineno++; return T_EOL; | 116 | \n BEGIN(INITIAL); current_file->lineno++; return T_EOL; |
145 | --- /* ignore */ | 117 | --- /* ignore */ |
146 | ({n}|[-/.])+ { | 118 | ({n}|[-/.])+ { |
119 | struct kconf_id *id = kconf_id_lookup(yytext, yyleng); | ||
120 | if (id && id->flags & TF_PARAM) | ||
121 | return id->token; | ||
147 | alloc_string(yytext, yyleng); | 122 | alloc_string(yytext, yyleng); |
148 | zconflval.string = text; | 123 | zconflval.string = text; |
149 | return T_WORD; | 124 | return T_WORD; |