aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2018-02-01 14:45:49 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2018-02-01 14:45:49 -0500
commit562f36ed28e6faa4245ea2ca1392d90ab98ebbe8 (patch)
tree85a5d50df8a72cb98c9096a57b2ab25721603115
parenta659f1598585071eed5c39485840b0f018c9f457 (diff)
parentcedd55d49dee941d0e4fabb2f2f555d50c53fad7 (diff)
Merge tag 'kconfig-v4.16' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild
Pull Kconfig updates from Masahiro Yamada: "A pretty big batch of Kconfig updates. I have to mention the lexer and parser of Kconfig are now built from real .l and .y sources. So, flex and bison are the requirement for building the kernel. Both of them (unlike gperf) have been stable for a long time. This change has been tested several weeks in linux-next, and I did not receive any problem report about this. Summary: - add checks for mistakes, like the choice default is not in choice, help is doubled - document data structure and complex code - fix various memory leaks - change Makefile to build lexer and parser instead of using pre-generated C files - drop 'boolean' keyword, which is equivalent to 'bool' - use default 'yy' prefix and remove unneeded Make variables - fix gettext() check for xconfig - announce that oldnoconfig will be finally removed - make 'Selected by:' and 'Implied by' readable in help and search result - hide silentoldconfig from 'make help' to stop confusing people - fix misc things and cleanups" * tag 'kconfig-v4.16' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild: (37 commits) kconfig: Remove silentoldconfig from help and docs; fix kconfig/conf's help kconfig: make "Selected by:" and "Implied by:" readable kconfig: announce removal of oldnoconfig if used kconfig: fix make xconfig when gettext is missing kconfig: Clarify menu and 'if' dependency propagation kconfig: Document 'if' flattening logic kconfig: Clarify choice dependency propagation kconfig: Document SYMBOL_OPTIONAL logic kbuild: remove unnecessary LEX_PREFIX and YACC_PREFIX kconfig: use default 'yy' prefix for lexer and parser kconfig: make conf_unsaved a local variable of conf_read() kconfig: make xfgets() really static kconfig: make input_mode static kconfig: Warn if there is more than one help text kconfig: drop 'boolean' keyword kconfig: use bool instead of boolean for type definition attributes, again kconfig: Remove menu_end_entry() kconfig: Document important expression functions kconfig: Document automatic submenu creation code kconfig: Fix choice symbol expression leak ...
-rw-r--r--Documentation/admin-guide/README.rst5
-rw-r--r--Documentation/process/changes.rst25
-rw-r--r--Makefile4
-rw-r--r--drivers/firmware/efi/Kconfig2
-rw-r--r--drivers/staging/rtlwifi/Kconfig2
-rw-r--r--scripts/Makefile.lib28
-rw-r--r--scripts/kconfig/Makefile14
-rw-r--r--scripts/kconfig/conf.c25
-rw-r--r--scripts/kconfig/confdata.c6
-rw-r--r--scripts/kconfig/expr.c136
-rw-r--r--scripts/kconfig/expr.h91
-rw-r--r--scripts/kconfig/kconf_id.c1
-rw-r--r--scripts/kconfig/lkc.h1
-rw-r--r--scripts/kconfig/mconf.c2
-rw-r--r--scripts/kconfig/menu.c186
-rw-r--r--scripts/kconfig/symbol.c14
-rw-r--r--scripts/kconfig/zconf.l16
-rw-r--r--scripts/kconfig/zconf.lex.c_shipped2473
-rw-r--r--scripts/kconfig/zconf.tab.c_shipped2471
-rw-r--r--scripts/kconfig/zconf.y111
20 files changed, 548 insertions, 5065 deletions
diff --git a/Documentation/admin-guide/README.rst b/Documentation/admin-guide/README.rst
index 63066db39910..af5a437198d0 100644
--- a/Documentation/admin-guide/README.rst
+++ b/Documentation/admin-guide/README.rst
@@ -170,11 +170,6 @@ Configuring the kernel
170 your existing ./.config file and asking about 170 your existing ./.config file and asking about
171 new config symbols. 171 new config symbols.
172 172
173 "make silentoldconfig"
174 Like above, but avoids cluttering the screen
175 with questions already answered.
176 Additionally updates the dependencies.
177
178 "make olddefconfig" 173 "make olddefconfig"
179 Like above, but sets new symbols to their default 174 Like above, but sets new symbols to their default
180 values without prompting. 175 values without prompting.
diff --git a/Documentation/process/changes.rst b/Documentation/process/changes.rst
index 560beaef5a7c..81cdb528ad46 100644
--- a/Documentation/process/changes.rst
+++ b/Documentation/process/changes.rst
@@ -32,6 +32,8 @@ you probably needn't concern yourself with isdn4k-utils.
32GNU C 3.2 gcc --version 32GNU C 3.2 gcc --version
33GNU make 3.81 make --version 33GNU make 3.81 make --version
34binutils 2.20 ld -v 34binutils 2.20 ld -v
35flex 2.5.35 flex --version
36bison 2.0 bison --version
35util-linux 2.10o fdformat --version 37util-linux 2.10o fdformat --version
36module-init-tools 0.9.10 depmod -V 38module-init-tools 0.9.10 depmod -V
37e2fsprogs 1.41.4 e2fsck -V 39e2fsprogs 1.41.4 e2fsck -V
@@ -79,6 +81,19 @@ The build system has, as of 4.13, switched to using thin archives (`ar T`)
79rather than incremental linking (`ld -r`) for built-in.o intermediate steps. 81rather than incremental linking (`ld -r`) for built-in.o intermediate steps.
80This requires binutils 2.20 or newer. 82This requires binutils 2.20 or newer.
81 83
84Flex
85----
86
87Since Linux 4.16, the build system generates lexical analyzers
88during build. This requires flex 2.5.35 or later.
89
90
91Bison
92-----
93
94Since Linux 4.16, the build system generates parsers
95during build. This requires bison 2.0 or later.
96
82Perl 97Perl
83---- 98----
84 99
@@ -333,6 +348,16 @@ Binutils
333 348
334- <https://www.kernel.org/pub/linux/devel/binutils/> 349- <https://www.kernel.org/pub/linux/devel/binutils/>
335 350
351Flex
352----
353
354- <https://github.com/westes/flex/releases>
355
356Bison
357-----
358
359- <ftp://ftp.gnu.org/gnu/bison/>
360
336OpenSSL 361OpenSSL
337------- 362-------
338 363
diff --git a/Makefile b/Makefile
index c8b8e902d5a4..11aff0f9e105 100644
--- a/Makefile
+++ b/Makefile
@@ -377,6 +377,8 @@ NM = $(CROSS_COMPILE)nm
377STRIP = $(CROSS_COMPILE)strip 377STRIP = $(CROSS_COMPILE)strip
378OBJCOPY = $(CROSS_COMPILE)objcopy 378OBJCOPY = $(CROSS_COMPILE)objcopy
379OBJDUMP = $(CROSS_COMPILE)objdump 379OBJDUMP = $(CROSS_COMPILE)objdump
380LEX = flex
381YACC = bison
380AWK = awk 382AWK = awk
381GENKSYMS = scripts/genksyms/genksyms 383GENKSYMS = scripts/genksyms/genksyms
382INSTALLKERNEL := installkernel 384INSTALLKERNEL := installkernel
@@ -428,7 +430,7 @@ GCC_PLUGINS_CFLAGS :=
428 430
429export ARCH SRCARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC 431export ARCH SRCARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC
430export CPP AR NM STRIP OBJCOPY OBJDUMP HOSTLDFLAGS HOST_LOADLIBES 432export CPP AR NM STRIP OBJCOPY OBJDUMP HOSTLDFLAGS HOST_LOADLIBES
431export MAKE AWK GENKSYMS INSTALLKERNEL PERL PYTHON UTS_MACHINE 433export MAKE LEX YACC AWK GENKSYMS INSTALLKERNEL PERL PYTHON UTS_MACHINE
432export HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS 434export HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS
433 435
434export KBUILD_CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS LDFLAGS 436export KBUILD_CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS LDFLAGS
diff --git a/drivers/firmware/efi/Kconfig b/drivers/firmware/efi/Kconfig
index 6047ed4e8a3d..3098410abad8 100644
--- a/drivers/firmware/efi/Kconfig
+++ b/drivers/firmware/efi/Kconfig
@@ -113,7 +113,7 @@ config EFI_CAPSULE_LOADER
113 Most users should say N. 113 Most users should say N.
114 114
115config EFI_CAPSULE_QUIRK_QUARK_CSH 115config EFI_CAPSULE_QUIRK_QUARK_CSH
116 boolean "Add support for Quark capsules with non-standard headers" 116 bool "Add support for Quark capsules with non-standard headers"
117 depends on X86 && !64BIT 117 depends on X86 && !64BIT
118 select EFI_CAPSULE_LOADER 118 select EFI_CAPSULE_LOADER
119 default y 119 default y
diff --git a/drivers/staging/rtlwifi/Kconfig b/drivers/staging/rtlwifi/Kconfig
index b6b03950987b..7b4276f5c41f 100644
--- a/drivers/staging/rtlwifi/Kconfig
+++ b/drivers/staging/rtlwifi/Kconfig
@@ -7,6 +7,6 @@ config R8822BE
7 wireless network adapters. 7 wireless network adapters.
8 8
9config RTLWIFI_DEBUG_ST 9config RTLWIFI_DEBUG_ST
10 boolean 10 bool
11 depends on R8822BE 11 depends on R8822BE
12 default y 12 default y
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
index 7dee1da83e2a..5fdc1a19b02c 100644
--- a/scripts/Makefile.lib
+++ b/scripts/Makefile.lib
@@ -186,39 +186,49 @@ $(foreach m, $(notdir $1), \
186 $(addprefix $(obj)/, $(foreach s, $3, $($(m:%$(strip $2)=%$(s))))))) 186 $(addprefix $(obj)/, $(foreach s, $3, $($(m:%$(strip $2)=%$(s)))))))
187endef 187endef
188 188
189ifdef REGENERATE_PARSERS
190
191# LEX 189# LEX
192# --------------------------------------------------------------------------- 190# ---------------------------------------------------------------------------
193LEX_PREFIX = $(if $(LEX_PREFIX_${baseprereq}),$(LEX_PREFIX_${baseprereq}),yy)
194
195quiet_cmd_flex = LEX $@ 191quiet_cmd_flex = LEX $@
196 cmd_flex = flex -o$@ -L -P $(LEX_PREFIX) $< 192 cmd_flex = $(LEX) -o$@ -L $<
197 193
194ifdef REGENERATE_PARSERS
198.PRECIOUS: $(src)/%.lex.c_shipped 195.PRECIOUS: $(src)/%.lex.c_shipped
199$(src)/%.lex.c_shipped: $(src)/%.l 196$(src)/%.lex.c_shipped: $(src)/%.l
200 $(call cmd,flex) 197 $(call cmd,flex)
198endif
199
200.PRECIOUS: $(obj)/%.lex.c
201$(filter %.lex.c,$(targets)): $(obj)/%.lex.c: $(src)/%.l FORCE
202 $(call if_changed,flex)
201 203
202# YACC 204# YACC
203# --------------------------------------------------------------------------- 205# ---------------------------------------------------------------------------
204YACC_PREFIX = $(if $(YACC_PREFIX_${baseprereq}),$(YACC_PREFIX_${baseprereq}),yy)
205
206quiet_cmd_bison = YACC $@ 206quiet_cmd_bison = YACC $@
207 cmd_bison = bison -o$@ -t -l -p $(YACC_PREFIX) $< 207 cmd_bison = $(YACC) -o$@ -t -l $<
208 208
209ifdef REGENERATE_PARSERS
209.PRECIOUS: $(src)/%.tab.c_shipped 210.PRECIOUS: $(src)/%.tab.c_shipped
210$(src)/%.tab.c_shipped: $(src)/%.y 211$(src)/%.tab.c_shipped: $(src)/%.y
211 $(call cmd,bison) 212 $(call cmd,bison)
213endif
214
215.PRECIOUS: $(obj)/%.tab.c
216$(filter %.tab.c,$(targets)): $(obj)/%.tab.c: $(src)/%.y FORCE
217 $(call if_changed,bison)
212 218
213quiet_cmd_bison_h = YACC $@ 219quiet_cmd_bison_h = YACC $@
214 cmd_bison_h = bison -o/dev/null --defines=$@ -t -l -p $(YACC_PREFIX) $< 220 cmd_bison_h = bison -o/dev/null --defines=$@ -t -l -p $(YACC_PREFIX) $<
215 221
222ifdef REGENERATE_PARSERS
216.PRECIOUS: $(src)/%.tab.h_shipped 223.PRECIOUS: $(src)/%.tab.h_shipped
217$(src)/%.tab.h_shipped: $(src)/%.y 224$(src)/%.tab.h_shipped: $(src)/%.y
218 $(call cmd,bison_h) 225 $(call cmd,bison_h)
219
220endif 226endif
221 227
228.PRECIOUS: $(obj)/%.tab.h
229$(filter %.tab.h,$(targets)): $(obj)/%.tab.h: $(src)/%.y FORCE
230 $(call if_changed,bison_h)
231
222# Shipped files 232# Shipped files
223# =========================================================================== 233# ===========================================================================
224 234
diff --git a/scripts/kconfig/Makefile b/scripts/kconfig/Makefile
index 297c1bf35140..cb3ec53a7c29 100644
--- a/scripts/kconfig/Makefile
+++ b/scripts/kconfig/Makefile
@@ -34,6 +34,8 @@ config: $(obj)/conf
34nconfig: $(obj)/nconf 34nconfig: $(obj)/nconf
35 $< $(silent) $(Kconfig) 35 $< $(silent) $(Kconfig)
36 36
37# This has become an internal implementation detail and is now deprecated
38# for external use.
37silentoldconfig: $(obj)/conf 39silentoldconfig: $(obj)/conf
38 $(Q)mkdir -p include/config include/generated 40 $(Q)mkdir -p include/config include/generated
39 $(Q)test -e include/generated/autoksyms.h || \ 41 $(Q)test -e include/generated/autoksyms.h || \
@@ -92,6 +94,8 @@ PHONY += oldnoconfig savedefconfig defconfig
92# on its behavior (sets new symbols to their default value but not 'n') with the 94# on its behavior (sets new symbols to their default value but not 'n') with the
93# counter-intuitive name. 95# counter-intuitive name.
94oldnoconfig: olddefconfig 96oldnoconfig: olddefconfig
97 @echo " WARNING: \"oldnoconfig\" target will be removed after Linux 4.19"
98 @echo " Please use \"olddefconfig\" instead, which is an alias."
95 99
96savedefconfig: $(obj)/conf 100savedefconfig: $(obj)/conf
97 $< $(silent) --$@=defconfig $(Kconfig) 101 $< $(silent) --$@=defconfig $(Kconfig)
@@ -142,7 +146,6 @@ help:
142 @echo ' oldconfig - Update current config utilising a provided .config as base' 146 @echo ' oldconfig - Update current config utilising a provided .config as base'
143 @echo ' localmodconfig - Update current config disabling modules not loaded' 147 @echo ' localmodconfig - Update current config disabling modules not loaded'
144 @echo ' localyesconfig - Update current config converting local mods to core' 148 @echo ' localyesconfig - Update current config converting local mods to core'
145 @echo ' silentoldconfig - Same as oldconfig, but quietly, additionally update deps'
146 @echo ' defconfig - New config with default from ARCH supplied defconfig' 149 @echo ' defconfig - New config with default from ARCH supplied defconfig'
147 @echo ' savedefconfig - Save current config as ./defconfig (minimal config)' 150 @echo ' savedefconfig - Save current config as ./defconfig (minimal config)'
148 @echo ' allnoconfig - New config where all options are answered with no' 151 @echo ' allnoconfig - New config where all options are answered with no'
@@ -151,8 +154,8 @@ help:
151 @echo ' alldefconfig - New config with all symbols set to default' 154 @echo ' alldefconfig - New config with all symbols set to default'
152 @echo ' randconfig - New config with random answer to all options' 155 @echo ' randconfig - New config with random answer to all options'
153 @echo ' listnewconfig - List new options' 156 @echo ' listnewconfig - List new options'
154 @echo ' olddefconfig - Same as silentoldconfig but sets new symbols to their' 157 @echo ' olddefconfig - Same as oldconfig but sets new symbols to their'
155 @echo ' default value' 158 @echo ' default value without prompting'
156 @echo ' kvmconfig - Enable additional options for kvm guest kernel support' 159 @echo ' kvmconfig - Enable additional options for kvm guest kernel support'
157 @echo ' xenconfig - Enable additional options for xen dom0 and guest kernel support' 160 @echo ' xenconfig - Enable additional options for xen dom0 and guest kernel support'
158 @echo ' tinyconfig - Configure the tiniest possible kernel' 161 @echo ' tinyconfig - Configure the tiniest possible kernel'
@@ -191,6 +194,7 @@ gconf-objs := gconf.o zconf.tab.o
191 194
192hostprogs-y := conf nconf mconf kxgettext qconf gconf 195hostprogs-y := conf nconf mconf kxgettext qconf gconf
193 196
197targets += zconf.tab.c zconf.lex.c
194clean-files := qconf.moc .tmp_qtcheck .tmp_gtkcheck 198clean-files := qconf.moc .tmp_qtcheck .tmp_gtkcheck
195clean-files += zconf.tab.c zconf.lex.c gconf.glade.h 199clean-files += zconf.tab.c zconf.lex.c gconf.glade.h
196clean-files += config.pot linux.pot 200clean-files += config.pot linux.pot
@@ -205,14 +209,12 @@ always := dochecklxdialog
205 209
206# Add environment specific flags 210# Add environment specific flags
207HOST_EXTRACFLAGS += $(shell $(CONFIG_SHELL) $(srctree)/$(src)/check.sh $(HOSTCC) $(HOSTCFLAGS)) 211HOST_EXTRACFLAGS += $(shell $(CONFIG_SHELL) $(srctree)/$(src)/check.sh $(HOSTCC) $(HOSTCFLAGS))
212HOST_EXTRACXXFLAGS += $(shell $(CONFIG_SHELL) $(srctree)/$(src)/check.sh $(HOSTCXX) $(HOSTCXXFLAGS))
208 213
209# generated files seem to need this to find local include files 214# generated files seem to need this to find local include files
210HOSTCFLAGS_zconf.lex.o := -I$(src) 215HOSTCFLAGS_zconf.lex.o := -I$(src)
211HOSTCFLAGS_zconf.tab.o := -I$(src) 216HOSTCFLAGS_zconf.tab.o := -I$(src)
212 217
213LEX_PREFIX_zconf := zconf
214YACC_PREFIX_zconf := zconf
215
216HOSTLOADLIBES_qconf = $(KC_QT_LIBS) 218HOSTLOADLIBES_qconf = $(KC_QT_LIBS)
217HOSTCXXFLAGS_qconf.o = $(KC_QT_CFLAGS) 219HOSTCXXFLAGS_qconf.o = $(KC_QT_CFLAGS)
218 220
diff --git a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c
index 866369f10ff8..307bc3f7b945 100644
--- a/scripts/kconfig/conf.c
+++ b/scripts/kconfig/conf.c
@@ -20,7 +20,6 @@
20 20
21static void conf(struct menu *menu); 21static void conf(struct menu *menu);
22static void check_conf(struct menu *menu); 22static void check_conf(struct menu *menu);
23static void xfgets(char *str, int size, FILE *in);
24 23
25enum input_mode { 24enum input_mode {
26 oldaskconfig, 25 oldaskconfig,
@@ -35,7 +34,8 @@ enum input_mode {
35 savedefconfig, 34 savedefconfig,
36 listnewconfig, 35 listnewconfig,
37 olddefconfig, 36 olddefconfig,
38} input_mode = oldaskconfig; 37};
38static enum input_mode input_mode = oldaskconfig;
39 39
40static int indent = 1; 40static int indent = 1;
41static int tty_stdio; 41static int tty_stdio;
@@ -82,6 +82,13 @@ static void check_stdin(void)
82 } 82 }
83} 83}
84 84
85/* Helper function to facilitate fgets() by Jean Sacren. */
86static void xfgets(char *str, int size, FILE *in)
87{
88 if (!fgets(str, size, in))
89 fprintf(stderr, "\nError in reading or end of file.\n");
90}
91
85static int conf_askvalue(struct symbol *sym, const char *def) 92static int conf_askvalue(struct symbol *sym, const char *def)
86{ 93{
87 enum symbol_type type = sym_get_type(sym); 94 enum symbol_type type = sym_get_type(sym);
@@ -477,8 +484,9 @@ static void conf_usage(const char *progname)
477 printf(" --listnewconfig List new options\n"); 484 printf(" --listnewconfig List new options\n");
478 printf(" --oldaskconfig Start a new configuration using a line-oriented program\n"); 485 printf(" --oldaskconfig Start a new configuration using a line-oriented program\n");
479 printf(" --oldconfig Update a configuration using a provided .config as base\n"); 486 printf(" --oldconfig Update a configuration using a provided .config as base\n");
480 printf(" --silentoldconfig Same as oldconfig, but quietly, additionally update deps\n"); 487 printf(" --silentoldconfig Similar to oldconfig but generates configuration in\n"
481 printf(" --olddefconfig Same as silentoldconfig but sets new symbols to their default value\n"); 488 " include/{generated/,config/} (oldconfig used to be more verbose)\n");
489 printf(" --olddefconfig Same as oldconfig but sets new symbols to their default value\n");
482 printf(" --oldnoconfig An alias of olddefconfig\n"); 490 printf(" --oldnoconfig An alias of olddefconfig\n");
483 printf(" --defconfig <file> New config with default defined in <file>\n"); 491 printf(" --defconfig <file> New config with default defined in <file>\n");
484 printf(" --savedefconfig <file> Save the minimal current configuration to <file>\n"); 492 printf(" --savedefconfig <file> Save the minimal current configuration to <file>\n");
@@ -712,12 +720,3 @@ int main(int ac, char **av)
712 } 720 }
713 return 0; 721 return 0;
714} 722}
715
716/*
717 * Helper function to facilitate fgets() by Jean Sacren.
718 */
719void xfgets(char *str, int size, FILE *in)
720{
721 if (fgets(str, size, in) == NULL)
722 fprintf(stderr, "\nError in reading or end of file.\n");
723}
diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
index 297b079ae4d9..f7927391de30 100644
--- a/scripts/kconfig/confdata.c
+++ b/scripts/kconfig/confdata.c
@@ -28,7 +28,7 @@ static void conf_message(const char *fmt, ...)
28 __attribute__ ((format (printf, 1, 2))); 28 __attribute__ ((format (printf, 1, 2)));
29 29
30static const char *conf_filename; 30static const char *conf_filename;
31static int conf_lineno, conf_warnings, conf_unsaved; 31static int conf_lineno, conf_warnings;
32 32
33const char conf_defname[] = "arch/$ARCH/defconfig"; 33const char conf_defname[] = "arch/$ARCH/defconfig";
34 34
@@ -290,7 +290,6 @@ load:
290 conf_filename = name; 290 conf_filename = name;
291 conf_lineno = 0; 291 conf_lineno = 0;
292 conf_warnings = 0; 292 conf_warnings = 0;
293 conf_unsaved = 0;
294 293
295 def_flags = SYMBOL_DEF << def; 294 def_flags = SYMBOL_DEF << def;
296 for_all_symbols(i, sym) { 295 for_all_symbols(i, sym) {
@@ -409,6 +408,7 @@ setsym:
409int conf_read(const char *name) 408int conf_read(const char *name)
410{ 409{
411 struct symbol *sym; 410 struct symbol *sym;
411 int conf_unsaved = 0;
412 int i; 412 int i;
413 413
414 sym_set_change_count(0); 414 sym_set_change_count(0);
@@ -1123,7 +1123,7 @@ void set_all_choice_values(struct symbol *csym)
1123bool conf_set_all_new_symbols(enum conf_def_mode mode) 1123bool conf_set_all_new_symbols(enum conf_def_mode mode)
1124{ 1124{
1125 struct symbol *sym, *csym; 1125 struct symbol *sym, *csym;
1126 int i, cnt, pby, pty, ptm; /* pby: probability of boolean = y 1126 int i, cnt, pby, pty, ptm; /* pby: probability of bool = y
1127 * pty: probability of tristate = y 1127 * pty: probability of tristate = y
1128 * ptm: probability of tristate = m 1128 * ptm: probability of tristate = m
1129 */ 1129 */
diff --git a/scripts/kconfig/expr.c b/scripts/kconfig/expr.c
index 8cee597d33a5..2ba332b3fed7 100644
--- a/scripts/kconfig/expr.c
+++ b/scripts/kconfig/expr.c
@@ -113,7 +113,7 @@ void expr_free(struct expr *e)
113 break; 113 break;
114 case E_NOT: 114 case E_NOT:
115 expr_free(e->left.expr); 115 expr_free(e->left.expr);
116 return; 116 break;
117 case E_EQUAL: 117 case E_EQUAL:
118 case E_GEQ: 118 case E_GEQ:
119 case E_GTH: 119 case E_GTH:
@@ -138,8 +138,18 @@ static int trans_count;
138#define e1 (*ep1) 138#define e1 (*ep1)
139#define e2 (*ep2) 139#define e2 (*ep2)
140 140
141/*
142 * expr_eliminate_eq() helper.
143 *
144 * Walks the two expression trees given in 'ep1' and 'ep2'. Any node that does
145 * not have type 'type' (E_OR/E_AND) is considered a leaf, and is compared
146 * against all other leaves. Two equal leaves are both replaced with either 'y'
147 * or 'n' as appropriate for 'type', to be eliminated later.
148 */
141static void __expr_eliminate_eq(enum expr_type type, struct expr **ep1, struct expr **ep2) 149static void __expr_eliminate_eq(enum expr_type type, struct expr **ep1, struct expr **ep2)
142{ 150{
151 /* Recurse down to leaves */
152
143 if (e1->type == type) { 153 if (e1->type == type) {
144 __expr_eliminate_eq(type, &e1->left.expr, &e2); 154 __expr_eliminate_eq(type, &e1->left.expr, &e2);
145 __expr_eliminate_eq(type, &e1->right.expr, &e2); 155 __expr_eliminate_eq(type, &e1->right.expr, &e2);
@@ -150,12 +160,18 @@ static void __expr_eliminate_eq(enum expr_type type, struct expr **ep1, struct e
150 __expr_eliminate_eq(type, &e1, &e2->right.expr); 160 __expr_eliminate_eq(type, &e1, &e2->right.expr);
151 return; 161 return;
152 } 162 }
163
164 /* e1 and e2 are leaves. Compare them. */
165
153 if (e1->type == E_SYMBOL && e2->type == E_SYMBOL && 166 if (e1->type == E_SYMBOL && e2->type == E_SYMBOL &&
154 e1->left.sym == e2->left.sym && 167 e1->left.sym == e2->left.sym &&
155 (e1->left.sym == &symbol_yes || e1->left.sym == &symbol_no)) 168 (e1->left.sym == &symbol_yes || e1->left.sym == &symbol_no))
156 return; 169 return;
157 if (!expr_eq(e1, e2)) 170 if (!expr_eq(e1, e2))
158 return; 171 return;
172
173 /* e1 and e2 are equal leaves. Prepare them for elimination. */
174
159 trans_count++; 175 trans_count++;
160 expr_free(e1); expr_free(e2); 176 expr_free(e1); expr_free(e2);
161 switch (type) { 177 switch (type) {
@@ -172,6 +188,35 @@ static void __expr_eliminate_eq(enum expr_type type, struct expr **ep1, struct e
172 } 188 }
173} 189}
174 190
191/*
192 * Rewrites the expressions 'ep1' and 'ep2' to remove operands common to both.
193 * Example reductions:
194 *
195 * ep1: A && B -> ep1: y
196 * ep2: A && B && C -> ep2: C
197 *
198 * ep1: A || B -> ep1: n
199 * ep2: A || B || C -> ep2: C
200 *
201 * ep1: A && (B && FOO) -> ep1: FOO
202 * ep2: (BAR && B) && A -> ep2: BAR
203 *
204 * ep1: A && (B || C) -> ep1: y
205 * ep2: (C || B) && A -> ep2: y
206 *
207 * Comparisons are done between all operands at the same "level" of && or ||.
208 * For example, in the expression 'e1 && (e2 || e3) && (e4 || e5)', the
209 * following operands will be compared:
210 *
211 * - 'e1', 'e2 || e3', and 'e4 || e5', against each other
212 * - e2 against e3
213 * - e4 against e5
214 *
215 * Parentheses are irrelevant within a single level. 'e1 && (e2 && e3)' and
216 * '(e1 && e2) && e3' are both a single level.
217 *
218 * See __expr_eliminate_eq() as well.
219 */
175void expr_eliminate_eq(struct expr **ep1, struct expr **ep2) 220void expr_eliminate_eq(struct expr **ep1, struct expr **ep2)
176{ 221{
177 if (!e1 || !e2) 222 if (!e1 || !e2)
@@ -197,6 +242,12 @@ void expr_eliminate_eq(struct expr **ep1, struct expr **ep2)
197#undef e1 242#undef e1
198#undef e2 243#undef e2
199 244
245/*
246 * Returns true if 'e1' and 'e2' are equal, after minor simplification. Two
247 * &&/|| expressions are considered equal if every operand in one expression
248 * equals some operand in the other (operands do not need to appear in the same
249 * order), recursively.
250 */
200static int expr_eq(struct expr *e1, struct expr *e2) 251static int expr_eq(struct expr *e1, struct expr *e2)
201{ 252{
202 int res, old_count; 253 int res, old_count;
@@ -243,6 +294,17 @@ static int expr_eq(struct expr *e1, struct expr *e2)
243 return 0; 294 return 0;
244} 295}
245 296
297/*
298 * Recursively performs the following simplifications in-place (as well as the
299 * corresponding simplifications with swapped operands):
300 *
301 * expr && n -> n
302 * expr && y -> expr
303 * expr || n -> expr
304 * expr || y -> y
305 *
306 * Returns the optimized expression.
307 */
246static struct expr *expr_eliminate_yn(struct expr *e) 308static struct expr *expr_eliminate_yn(struct expr *e)
247{ 309{
248 struct expr *tmp; 310 struct expr *tmp;
@@ -516,12 +578,21 @@ static struct expr *expr_join_and(struct expr *e1, struct expr *e2)
516 return NULL; 578 return NULL;
517} 579}
518 580
581/*
582 * expr_eliminate_dups() helper.
583 *
584 * Walks the two expression trees given in 'ep1' and 'ep2'. Any node that does
585 * not have type 'type' (E_OR/E_AND) is considered a leaf, and is compared
586 * against all other leaves to look for simplifications.
587 */
519static void expr_eliminate_dups1(enum expr_type type, struct expr **ep1, struct expr **ep2) 588static void expr_eliminate_dups1(enum expr_type type, struct expr **ep1, struct expr **ep2)
520{ 589{
521#define e1 (*ep1) 590#define e1 (*ep1)
522#define e2 (*ep2) 591#define e2 (*ep2)
523 struct expr *tmp; 592 struct expr *tmp;
524 593
594 /* Recurse down to leaves */
595
525 if (e1->type == type) { 596 if (e1->type == type) {
526 expr_eliminate_dups1(type, &e1->left.expr, &e2); 597 expr_eliminate_dups1(type, &e1->left.expr, &e2);
527 expr_eliminate_dups1(type, &e1->right.expr, &e2); 598 expr_eliminate_dups1(type, &e1->right.expr, &e2);
@@ -532,6 +603,9 @@ static void expr_eliminate_dups1(enum expr_type type, struct expr **ep1, struct
532 expr_eliminate_dups1(type, &e1, &e2->right.expr); 603 expr_eliminate_dups1(type, &e1, &e2->right.expr);
533 return; 604 return;
534 } 605 }
606
607 /* e1 and e2 are leaves. Compare and process them. */
608
535 if (e1 == e2) 609 if (e1 == e2)
536 return; 610 return;
537 611
@@ -568,6 +642,17 @@ static void expr_eliminate_dups1(enum expr_type type, struct expr **ep1, struct
568#undef e2 642#undef e2
569} 643}
570 644
645/*
646 * Rewrites 'e' in-place to remove ("join") duplicate and other redundant
647 * operands.
648 *
649 * Example simplifications:
650 *
651 * A || B || A -> A || B
652 * A && B && A=y -> A=y && B
653 *
654 * Returns the deduplicated expression.
655 */
571struct expr *expr_eliminate_dups(struct expr *e) 656struct expr *expr_eliminate_dups(struct expr *e)
572{ 657{
573 int oldcount; 658 int oldcount;
@@ -584,6 +669,7 @@ struct expr *expr_eliminate_dups(struct expr *e)
584 ; 669 ;
585 } 670 }
586 if (!trans_count) 671 if (!trans_count)
672 /* No simplifications done in this pass. We're done */
587 break; 673 break;
588 e = expr_eliminate_yn(e); 674 e = expr_eliminate_yn(e);
589 } 675 }
@@ -591,6 +677,12 @@ struct expr *expr_eliminate_dups(struct expr *e)
591 return e; 677 return e;
592} 678}
593 679
680/*
681 * Performs various simplifications involving logical operators and
682 * comparisons.
683 *
684 * Allocates and returns a new expression.
685 */
594struct expr *expr_transform(struct expr *e) 686struct expr *expr_transform(struct expr *e)
595{ 687{
596 struct expr *tmp; 688 struct expr *tmp;
@@ -805,6 +897,20 @@ bool expr_depends_symbol(struct expr *dep, struct symbol *sym)
805 return false; 897 return false;
806} 898}
807 899
900/*
901 * Inserts explicit comparisons of type 'type' to symbol 'sym' into the
902 * expression 'e'.
903 *
904 * Examples transformations for type == E_UNEQUAL, sym == &symbol_no:
905 *
906 * A -> A!=n
907 * !A -> A=n
908 * A && B -> !(A=n || B=n)
909 * A || B -> !(A=n && B=n)
910 * A && (B || C) -> !(A=n || (B=n && C=n))
911 *
912 * Allocates and returns a new expression.
913 */
808struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym) 914struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym)
809{ 915{
810 struct expr *e1, *e2; 916 struct expr *e1, *e2;
@@ -1073,7 +1179,7 @@ struct expr *expr_simplify_unmet_dep(struct expr *e1, struct expr *e2)
1073 return expr_get_leftmost_symbol(ret); 1179 return expr_get_leftmost_symbol(ret);
1074} 1180}
1075 1181
1076void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken) 1182static void __expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken, bool revdep)
1077{ 1183{
1078 if (!e) { 1184 if (!e) {
1079 fn(data, NULL, "y"); 1185 fn(data, NULL, "y");
@@ -1128,9 +1234,14 @@ void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *
1128 fn(data, e->right.sym, e->right.sym->name); 1234 fn(data, e->right.sym, e->right.sym->name);
1129 break; 1235 break;
1130 case E_OR: 1236 case E_OR:
1131 expr_print(e->left.expr, fn, data, E_OR); 1237 if (revdep && e->left.expr->type != E_OR)
1132 fn(data, NULL, " || "); 1238 fn(data, NULL, "\n - ");
1133 expr_print(e->right.expr, fn, data, E_OR); 1239 __expr_print(e->left.expr, fn, data, E_OR, revdep);
1240 if (revdep)
1241 fn(data, NULL, "\n - ");
1242 else
1243 fn(data, NULL, " || ");
1244 __expr_print(e->right.expr, fn, data, E_OR, revdep);
1134 break; 1245 break;
1135 case E_AND: 1246 case E_AND:
1136 expr_print(e->left.expr, fn, data, E_AND); 1247 expr_print(e->left.expr, fn, data, E_AND);
@@ -1163,6 +1274,11 @@ void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *
1163 fn(data, NULL, ")"); 1274 fn(data, NULL, ")");
1164} 1275}
1165 1276
1277void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken)
1278{
1279 __expr_print(e, fn, data, prevtoken, false);
1280}
1281
1166static void expr_print_file_helper(void *data, struct symbol *sym, const char *str) 1282static void expr_print_file_helper(void *data, struct symbol *sym, const char *str)
1167{ 1283{
1168 xfwrite(str, strlen(str), 1, data); 1284 xfwrite(str, strlen(str), 1, data);
@@ -1207,3 +1323,13 @@ void expr_gstr_print(struct expr *e, struct gstr *gs)
1207{ 1323{
1208 expr_print(e, expr_print_gstr_helper, gs, E_NONE); 1324 expr_print(e, expr_print_gstr_helper, gs, E_NONE);
1209} 1325}
1326
1327/*
1328 * Transform the top level "||" tokens into newlines and prepend each
1329 * line with a minus. This makes expressions much easier to read.
1330 * Suitable for reverse dependency expressions.
1331 */
1332void expr_gstr_print_revdep(struct expr *e, struct gstr *gs)
1333{
1334 __expr_print(e, expr_print_gstr_helper, gs, E_NONE, true);
1335}
diff --git a/scripts/kconfig/expr.h b/scripts/kconfig/expr.h
index a73f762c48d6..c16e82e302a2 100644
--- a/scripts/kconfig/expr.h
+++ b/scripts/kconfig/expr.h
@@ -74,17 +74,60 @@ enum {
74 S_DEF_COUNT 74 S_DEF_COUNT
75}; 75};
76 76
77/*
78 * Represents a configuration symbol.
79 *
80 * Choices are represented as a special kind of symbol and have the
81 * SYMBOL_CHOICE bit set in 'flags'.
82 */
77struct symbol { 83struct symbol {
84 /* The next symbol in the same bucket in the symbol hash table */
78 struct symbol *next; 85 struct symbol *next;
86
87 /* The name of the symbol, e.g. "FOO" for 'config FOO' */
79 char *name; 88 char *name;
89
90 /* S_BOOLEAN, S_TRISTATE, ... */
80 enum symbol_type type; 91 enum symbol_type type;
92
93 /*
94 * The calculated value of the symbol. The SYMBOL_VALID bit is set in
95 * 'flags' when this is up to date. Note that this value might differ
96 * from the user value set in e.g. a .config file, due to visibility.
97 */
81 struct symbol_value curr; 98 struct symbol_value curr;
99
100 /*
101 * Values for the symbol provided from outside. def[S_DEF_USER] holds
102 * the .config value.
103 */
82 struct symbol_value def[S_DEF_COUNT]; 104 struct symbol_value def[S_DEF_COUNT];
105
106 /*
107 * An upper bound on the tristate value the user can set for the symbol
108 * if it is a boolean or tristate. Calculated from prompt dependencies,
109 * which also inherit dependencies from enclosing menus, choices, and
110 * ifs. If 'n', the user value will be ignored.
111 *
112 * Symbols lacking prompts always have visibility 'n'.
113 */
83 tristate visible; 114 tristate visible;
115
116 /* SYMBOL_* flags */
84 int flags; 117 int flags;
118
119 /* List of properties. See prop_type. */
85 struct property *prop; 120 struct property *prop;
121
122 /* Dependencies from enclosing menus, choices, and ifs */
86 struct expr_value dir_dep; 123 struct expr_value dir_dep;
124
125 /* Reverse dependencies through being selected by other symbols */
87 struct expr_value rev_dep; 126 struct expr_value rev_dep;
127
128 /*
129 * "Weak" reverse dependencies through being implied by other symbols
130 */
88 struct expr_value implied; 131 struct expr_value implied;
89}; 132};
90 133
@@ -133,7 +176,7 @@ enum prop_type {
133 P_UNKNOWN, 176 P_UNKNOWN,
134 P_PROMPT, /* prompt "foo prompt" or "BAZ Value" */ 177 P_PROMPT, /* prompt "foo prompt" or "BAZ Value" */
135 P_COMMENT, /* text associated with a comment */ 178 P_COMMENT, /* text associated with a comment */
136 P_MENU, /* prompt associated with a menuconfig option */ 179 P_MENU, /* prompt associated with a menu or menuconfig symbol */
137 P_DEFAULT, /* default y */ 180 P_DEFAULT, /* default y */
138 P_CHOICE, /* choice value */ 181 P_CHOICE, /* choice value */
139 P_SELECT, /* select BAR */ 182 P_SELECT, /* select BAR */
@@ -166,22 +209,67 @@ struct property {
166 for (st = sym->prop; st; st = st->next) \ 209 for (st = sym->prop; st; st = st->next) \
167 if (st->text) 210 if (st->text)
168 211
212/*
213 * Represents a node in the menu tree, as seen in e.g. menuconfig (though used
214 * for all front ends). Each symbol, menu, etc. defined in the Kconfig files
215 * gets a node. A symbol defined in multiple locations gets one node at each
216 * location.
217 */
169struct menu { 218struct menu {
219 /* The next menu node at the same level */
170 struct menu *next; 220 struct menu *next;
221
222 /* The parent menu node, corresponding to e.g. a menu or choice */
171 struct menu *parent; 223 struct menu *parent;
224
225 /* The first child menu node, for e.g. menus and choices */
172 struct menu *list; 226 struct menu *list;
227
228 /*
229 * The symbol associated with the menu node. Choices are implemented as
230 * a special kind of symbol. NULL for menus, comments, and ifs.
231 */
173 struct symbol *sym; 232 struct symbol *sym;
233
234 /*
235 * The prompt associated with the node. This holds the prompt for a
236 * symbol as well as the text for a menu or comment, along with the
237 * type (P_PROMPT, P_MENU, etc.)
238 */
174 struct property *prompt; 239 struct property *prompt;
240
241 /*
242 * 'visible if' dependencies. If more than one is given, they will be
243 * ANDed together.
244 */
175 struct expr *visibility; 245 struct expr *visibility;
246
247 /*
248 * Ordinary dependencies from e.g. 'depends on' and 'if', ANDed
249 * together
250 */
176 struct expr *dep; 251 struct expr *dep;
252
253 /* MENU_* flags */
177 unsigned int flags; 254 unsigned int flags;
255
256 /* Any help text associated with the node */
178 char *help; 257 char *help;
258
259 /* The location where the menu node appears in the Kconfig files */
179 struct file *file; 260 struct file *file;
180 int lineno; 261 int lineno;
262
263 /* For use by front ends that need to store auxiliary data */
181 void *data; 264 void *data;
182}; 265};
183 266
267/*
268 * Set on a menu node when the corresponding symbol changes state in some way.
269 * Can be checked by front ends.
270 */
184#define MENU_CHANGED 0x0001 271#define MENU_CHANGED 0x0001
272
185#define MENU_ROOT 0x0002 273#define MENU_ROOT 0x0002
186 274
187struct jump_key { 275struct jump_key {
@@ -222,6 +310,7 @@ struct expr *expr_simplify_unmet_dep(struct expr *e1, struct expr *e2);
222void expr_fprint(struct expr *e, FILE *out); 310void expr_fprint(struct expr *e, FILE *out);
223struct gstr; /* forward */ 311struct gstr; /* forward */
224void expr_gstr_print(struct expr *e, struct gstr *gs); 312void expr_gstr_print(struct expr *e, struct gstr *gs);
313void expr_gstr_print_revdep(struct expr *e, struct gstr *gs);
225 314
226static inline int expr_is_yes(struct expr *e) 315static inline int expr_is_yes(struct expr *e)
227{ 316{
diff --git a/scripts/kconfig/kconf_id.c b/scripts/kconfig/kconf_id.c
index 5abbc728fbc4..3ea9c5f9f730 100644
--- a/scripts/kconfig/kconf_id.c
+++ b/scripts/kconfig/kconf_id.c
@@ -20,7 +20,6 @@ static struct kconf_id kconf_id_array[] = {
20 { "tristate", T_TYPE, TF_COMMAND, S_TRISTATE }, 20 { "tristate", T_TYPE, TF_COMMAND, S_TRISTATE },
21 { "def_tristate", T_DEFAULT, TF_COMMAND, S_TRISTATE }, 21 { "def_tristate", T_DEFAULT, TF_COMMAND, S_TRISTATE },
22 { "bool", T_TYPE, TF_COMMAND, S_BOOLEAN }, 22 { "bool", T_TYPE, TF_COMMAND, S_BOOLEAN },
23 { "boolean", T_TYPE, TF_COMMAND, S_BOOLEAN },
24 { "def_bool", T_DEFAULT, TF_COMMAND, S_BOOLEAN }, 23 { "def_bool", T_DEFAULT, TF_COMMAND, S_BOOLEAN },
25 { "int", T_TYPE, TF_COMMAND, S_INT }, 24 { "int", T_TYPE, TF_COMMAND, S_INT },
26 { "hex", T_TYPE, TF_COMMAND, S_HEX }, 25 { "hex", T_TYPE, TF_COMMAND, S_HEX },
diff --git a/scripts/kconfig/lkc.h b/scripts/kconfig/lkc.h
index cdcbe43e87b3..16cb62b92650 100644
--- a/scripts/kconfig/lkc.h
+++ b/scripts/kconfig/lkc.h
@@ -100,7 +100,6 @@ void menu_warn(struct menu *menu, const char *fmt, ...);
100struct menu *menu_add_menu(void); 100struct menu *menu_add_menu(void);
101void menu_end_menu(void); 101void menu_end_menu(void);
102void menu_add_entry(struct symbol *sym); 102void menu_add_entry(struct symbol *sym);
103void menu_end_entry(void);
104void menu_add_dep(struct expr *dep); 103void menu_add_dep(struct expr *dep);
105void menu_add_visibility(struct expr *dep); 104void menu_add_visibility(struct expr *dep);
106struct property *menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep); 105struct property *menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep);
diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c
index 315ce2c7cb9d..c829be8bb19f 100644
--- a/scripts/kconfig/mconf.c
+++ b/scripts/kconfig/mconf.c
@@ -246,7 +246,7 @@ search_help[] = N_(
246 " Selected by: BAR [=n]\n" 246 " Selected by: BAR [=n]\n"
247 "-----------------------------------------------------------------\n" 247 "-----------------------------------------------------------------\n"
248 "o The line 'Type:' shows the type of the configuration option for\n" 248 "o The line 'Type:' shows the type of the configuration option for\n"
249 " this symbol (boolean, tristate, string, ...)\n" 249 " this symbol (bool, tristate, string, ...)\n"
250 "o The line 'Prompt:' shows the text used in the menu structure for\n" 250 "o The line 'Prompt:' shows the text used in the menu structure for\n"
251 " this symbol\n" 251 " this symbol\n"
252 "o The 'Defined at' line tells at what file / line number the symbol\n" 252 "o The 'Defined at' line tells at what file / line number the symbol\n"
diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c
index e9357931b47d..99222855544c 100644
--- a/scripts/kconfig/menu.c
+++ b/scripts/kconfig/menu.c
@@ -62,13 +62,8 @@ void menu_add_entry(struct symbol *sym)
62 menu_add_symbol(P_SYMBOL, sym, NULL); 62 menu_add_symbol(P_SYMBOL, sym, NULL);
63} 63}
64 64
65void menu_end_entry(void)
66{
67}
68
69struct menu *menu_add_menu(void) 65struct menu *menu_add_menu(void)
70{ 66{
71 menu_end_entry();
72 last_entry_ptr = &current_entry->list; 67 last_entry_ptr = &current_entry->list;
73 return current_menu = current_entry; 68 return current_menu = current_entry;
74} 69}
@@ -79,19 +74,23 @@ void menu_end_menu(void)
79 current_menu = current_menu->parent; 74 current_menu = current_menu->parent;
80} 75}
81 76
82static struct expr *menu_check_dep(struct expr *e) 77/*
78 * Rewrites 'm' to 'm' && MODULES, so that it evaluates to 'n' when running
79 * without modules
80 */
81static struct expr *rewrite_m(struct expr *e)
83{ 82{
84 if (!e) 83 if (!e)
85 return e; 84 return e;
86 85
87 switch (e->type) { 86 switch (e->type) {
88 case E_NOT: 87 case E_NOT:
89 e->left.expr = menu_check_dep(e->left.expr); 88 e->left.expr = rewrite_m(e->left.expr);
90 break; 89 break;
91 case E_OR: 90 case E_OR:
92 case E_AND: 91 case E_AND:
93 e->left.expr = menu_check_dep(e->left.expr); 92 e->left.expr = rewrite_m(e->left.expr);
94 e->right.expr = menu_check_dep(e->right.expr); 93 e->right.expr = rewrite_m(e->right.expr);
95 break; 94 break;
96 case E_SYMBOL: 95 case E_SYMBOL:
97 /* change 'm' into 'm' && MODULES */ 96 /* change 'm' into 'm' && MODULES */
@@ -106,7 +105,7 @@ static struct expr *menu_check_dep(struct expr *e)
106 105
107void menu_add_dep(struct expr *dep) 106void menu_add_dep(struct expr *dep)
108{ 107{
109 current_entry->dep = expr_alloc_and(current_entry->dep, menu_check_dep(dep)); 108 current_entry->dep = expr_alloc_and(current_entry->dep, dep);
110} 109}
111 110
112void menu_set_type(int type) 111void menu_set_type(int type)
@@ -131,7 +130,7 @@ static struct property *menu_add_prop(enum prop_type type, char *prompt, struct
131 130
132 prop->menu = current_entry; 131 prop->menu = current_entry;
133 prop->expr = expr; 132 prop->expr = expr;
134 prop->visible.expr = menu_check_dep(dep); 133 prop->visible.expr = dep;
135 134
136 if (prompt) { 135 if (prompt) {
137 if (isspace(*prompt)) { 136 if (isspace(*prompt)) {
@@ -252,6 +251,16 @@ static void sym_check_prop(struct symbol *sym)
252 "'%s': number is invalid", 251 "'%s': number is invalid",
253 sym->name); 252 sym->name);
254 } 253 }
254 if (sym_is_choice(sym)) {
255 struct property *choice_prop =
256 sym_get_choice_prop(sym2);
257
258 if (!choice_prop ||
259 prop_get_symbol(choice_prop) != sym)
260 prop_warn(prop,
261 "choice default symbol '%s' is not contained in the choice",
262 sym2->name);
263 }
255 break; 264 break;
256 case P_SELECT: 265 case P_SELECT:
257 case P_IMPLY: 266 case P_IMPLY:
@@ -260,13 +269,13 @@ static void sym_check_prop(struct symbol *sym)
260 if (sym->type != S_BOOLEAN && sym->type != S_TRISTATE) 269 if (sym->type != S_BOOLEAN && sym->type != S_TRISTATE)
261 prop_warn(prop, 270 prop_warn(prop,
262 "config symbol '%s' uses %s, but is " 271 "config symbol '%s' uses %s, but is "
263 "not boolean or tristate", sym->name, use); 272 "not bool or tristate", sym->name, use);
264 else if (sym2->type != S_UNKNOWN && 273 else if (sym2->type != S_UNKNOWN &&
265 sym2->type != S_BOOLEAN && 274 sym2->type != S_BOOLEAN &&
266 sym2->type != S_TRISTATE) 275 sym2->type != S_TRISTATE)
267 prop_warn(prop, 276 prop_warn(prop,
268 "'%s' has wrong type. '%s' only " 277 "'%s' has wrong type. '%s' only "
269 "accept arguments of boolean and " 278 "accept arguments of bool and "
270 "tristate type", sym2->name, use); 279 "tristate type", sym2->name, use);
271 break; 280 break;
272 case P_RANGE: 281 case P_RANGE:
@@ -292,6 +301,11 @@ void menu_finalize(struct menu *parent)
292 301
293 sym = parent->sym; 302 sym = parent->sym;
294 if (parent->list) { 303 if (parent->list) {
304 /*
305 * This menu node has children. We (recursively) process them
306 * and propagate parent dependencies before moving on.
307 */
308
295 if (sym && sym_is_choice(sym)) { 309 if (sym && sym_is_choice(sym)) {
296 if (sym->type == S_UNKNOWN) { 310 if (sym->type == S_UNKNOWN) {
297 /* find the first choice value to find out choice type */ 311 /* find the first choice value to find out choice type */
@@ -309,30 +323,83 @@ void menu_finalize(struct menu *parent)
309 if (menu->sym && menu->sym->type == S_UNKNOWN) 323 if (menu->sym && menu->sym->type == S_UNKNOWN)
310 menu_set_type(sym->type); 324 menu_set_type(sym->type);
311 } 325 }
326
327 /*
328 * Use the choice itself as the parent dependency of
329 * the contained items. This turns the mode of the
330 * choice into an upper bound on the visibility of the
331 * choice value symbols.
332 */
312 parentdep = expr_alloc_symbol(sym); 333 parentdep = expr_alloc_symbol(sym);
313 } else if (parent->prompt) 334 } else if (parent->prompt)
335 /* Menu node for 'menu' */
314 parentdep = parent->prompt->visible.expr; 336 parentdep = parent->prompt->visible.expr;
315 else 337 else
338 /* Menu node for 'if' */
316 parentdep = parent->dep; 339 parentdep = parent->dep;
317 340
341 /* For each child menu node... */
318 for (menu = parent->list; menu; menu = menu->next) { 342 for (menu = parent->list; menu; menu = menu->next) {
319 basedep = expr_transform(menu->dep); 343 /*
344 * Propagate parent dependencies to the child menu
345 * node, also rewriting and simplifying expressions
346 */
347 basedep = rewrite_m(menu->dep);
348 basedep = expr_transform(basedep);
320 basedep = expr_alloc_and(expr_copy(parentdep), basedep); 349 basedep = expr_alloc_and(expr_copy(parentdep), basedep);
321 basedep = expr_eliminate_dups(basedep); 350 basedep = expr_eliminate_dups(basedep);
322 menu->dep = basedep; 351 menu->dep = basedep;
352
323 if (menu->sym) 353 if (menu->sym)
354 /*
355 * Note: For symbols, all prompts are included
356 * too in the symbol's own property list
357 */
324 prop = menu->sym->prop; 358 prop = menu->sym->prop;
325 else 359 else
360 /*
361 * For non-symbol menu nodes, we just need to
362 * handle the prompt
363 */
326 prop = menu->prompt; 364 prop = menu->prompt;
365
366 /* For each property... */
327 for (; prop; prop = prop->next) { 367 for (; prop; prop = prop->next) {
328 if (prop->menu != menu) 368 if (prop->menu != menu)
369 /*
370 * Two possibilities:
371 *
372 * 1. The property lacks dependencies
373 * and so isn't location-specific,
374 * e.g. an 'option'
375 *
376 * 2. The property belongs to a symbol
377 * defined in multiple locations and
378 * is from some other location. It
379 * will be handled there in that
380 * case.
381 *
382 * Skip the property.
383 */
329 continue; 384 continue;
330 dep = expr_transform(prop->visible.expr); 385
386 /*
387 * Propagate parent dependencies to the
388 * property's condition, rewriting and
389 * simplifying expressions at the same time
390 */
391 dep = rewrite_m(prop->visible.expr);
392 dep = expr_transform(dep);
331 dep = expr_alloc_and(expr_copy(basedep), dep); 393 dep = expr_alloc_and(expr_copy(basedep), dep);
332 dep = expr_eliminate_dups(dep); 394 dep = expr_eliminate_dups(dep);
333 if (menu->sym && menu->sym->type != S_TRISTATE) 395 if (menu->sym && menu->sym->type != S_TRISTATE)
334 dep = expr_trans_bool(dep); 396 dep = expr_trans_bool(dep);
335 prop->visible.expr = dep; 397 prop->visible.expr = dep;
398
399 /*
400 * Handle selects and implies, which modify the
401 * dependencies of the selected/implied symbol
402 */
336 if (prop->type == P_SELECT) { 403 if (prop->type == P_SELECT) {
337 struct symbol *es = prop_get_symbol(prop); 404 struct symbol *es = prop_get_symbol(prop);
338 es->rev_dep.expr = expr_alloc_or(es->rev_dep.expr, 405 es->rev_dep.expr = expr_alloc_or(es->rev_dep.expr,
@@ -344,34 +411,81 @@ void menu_finalize(struct menu *parent)
344 } 411 }
345 } 412 }
346 } 413 }
414
415 if (sym && sym_is_choice(sym))
416 expr_free(parentdep);
417
418 /*
419 * Recursively process children in the same fashion before
420 * moving on
421 */
347 for (menu = parent->list; menu; menu = menu->next) 422 for (menu = parent->list; menu; menu = menu->next)
348 menu_finalize(menu); 423 menu_finalize(menu);
349 } else if (sym) { 424 } else if (sym) {
425 /*
426 * Automatic submenu creation. If sym is a symbol and A, B, C,
427 * ... are consecutive items (symbols, menus, ifs, etc.) that
428 * all depend on sym, then the following menu structure is
429 * created:
430 *
431 * sym
432 * +-A
433 * +-B
434 * +-C
435 * ...
436 *
437 * This also works recursively, giving the following structure
438 * if A is a symbol and B depends on A:
439 *
440 * sym
441 * +-A
442 * | +-B
443 * +-C
444 * ...
445 */
446
350 basedep = parent->prompt ? parent->prompt->visible.expr : NULL; 447 basedep = parent->prompt ? parent->prompt->visible.expr : NULL;
351 basedep = expr_trans_compare(basedep, E_UNEQUAL, &symbol_no); 448 basedep = expr_trans_compare(basedep, E_UNEQUAL, &symbol_no);
352 basedep = expr_eliminate_dups(expr_transform(basedep)); 449 basedep = expr_eliminate_dups(expr_transform(basedep));
450
451 /* Examine consecutive elements after sym */
353 last_menu = NULL; 452 last_menu = NULL;
354 for (menu = parent->next; menu; menu = menu->next) { 453 for (menu = parent->next; menu; menu = menu->next) {
355 dep = menu->prompt ? menu->prompt->visible.expr : menu->dep; 454 dep = menu->prompt ? menu->prompt->visible.expr : menu->dep;
356 if (!expr_contains_symbol(dep, sym)) 455 if (!expr_contains_symbol(dep, sym))
456 /* No dependency, quit */
357 break; 457 break;
358 if (expr_depends_symbol(dep, sym)) 458 if (expr_depends_symbol(dep, sym))
459 /* Absolute dependency, put in submenu */
359 goto next; 460 goto next;
461
462 /*
463 * Also consider it a dependency on sym if our
464 * dependencies contain sym and are a "superset" of
465 * sym's dependencies, e.g. '(sym || Q) && R' when sym
466 * depends on R.
467 *
468 * Note that 'R' might be from an enclosing menu or if,
469 * making this a more common case than it might seem.
470 */
360 dep = expr_trans_compare(dep, E_UNEQUAL, &symbol_no); 471 dep = expr_trans_compare(dep, E_UNEQUAL, &symbol_no);
361 dep = expr_eliminate_dups(expr_transform(dep)); 472 dep = expr_eliminate_dups(expr_transform(dep));
362 dep2 = expr_copy(basedep); 473 dep2 = expr_copy(basedep);
363 expr_eliminate_eq(&dep, &dep2); 474 expr_eliminate_eq(&dep, &dep2);
364 expr_free(dep); 475 expr_free(dep);
365 if (!expr_is_yes(dep2)) { 476 if (!expr_is_yes(dep2)) {
477 /* Not superset, quit */
366 expr_free(dep2); 478 expr_free(dep2);
367 break; 479 break;
368 } 480 }
481 /* Superset, put in submenu */
369 expr_free(dep2); 482 expr_free(dep2);
370 next: 483 next:
371 menu_finalize(menu); 484 menu_finalize(menu);
372 menu->parent = parent; 485 menu->parent = parent;
373 last_menu = menu; 486 last_menu = menu;
374 } 487 }
488 expr_free(basedep);
375 if (last_menu) { 489 if (last_menu) {
376 parent->list = parent->next; 490 parent->list = parent->next;
377 parent->next = last_menu->next; 491 parent->next = last_menu->next;
@@ -420,6 +534,35 @@ void menu_finalize(struct menu *parent)
420 *ep = expr_alloc_one(E_LIST, NULL); 534 *ep = expr_alloc_one(E_LIST, NULL);
421 (*ep)->right.sym = menu->sym; 535 (*ep)->right.sym = menu->sym;
422 } 536 }
537
538 /*
539 * This code serves two purposes:
540 *
541 * (1) Flattening 'if' blocks, which do not specify a submenu
542 * and only add dependencies.
543 *
544 * (Automatic submenu creation might still create a submenu
545 * from an 'if' before this code runs.)
546 *
547 * (2) "Undoing" any automatic submenus created earlier below
548 * promptless symbols.
549 *
550 * Before:
551 *
552 * A
553 * if ... (or promptless symbol)
554 * +-B
555 * +-C
556 * D
557 *
558 * After:
559 *
560 * A
561 * if ... (or promptless symbol)
562 * B
563 * C
564 * D
565 */
423 if (menu->list && (!menu->prompt || !menu->prompt->text)) { 566 if (menu->list && (!menu->prompt || !menu->prompt->text)) {
424 for (last_menu = menu->list; ; last_menu = last_menu->next) { 567 for (last_menu = menu->list; ; last_menu = last_menu->next) {
425 last_menu->parent = parent; 568 last_menu->parent = parent;
@@ -444,6 +587,15 @@ void menu_finalize(struct menu *parent)
444 sym->flags |= SYMBOL_WARNED; 587 sym->flags |= SYMBOL_WARNED;
445 } 588 }
446 589
590 /*
591 * For non-optional choices, add a reverse dependency (corresponding to
592 * a select) of '<visibility> && m'. This prevents the user from
593 * setting the choice mode to 'n' when the choice is visible.
594 *
595 * This would also work for non-choice symbols, but only non-optional
596 * choices clear SYMBOL_OPTIONAL as of writing. Choices are implemented
597 * as a type of symbol.
598 */
447 if (sym && !sym_is_optional(sym) && parent->prompt) { 599 if (sym && !sym_is_optional(sym) && parent->prompt) {
448 sym->rev_dep.expr = expr_alloc_or(sym->rev_dep.expr, 600 sym->rev_dep.expr = expr_alloc_or(sym->rev_dep.expr,
449 expr_alloc_and(parent->prompt->visible.expr, 601 expr_alloc_and(parent->prompt->visible.expr,
@@ -676,14 +828,14 @@ static void get_symbol_str(struct gstr *r, struct symbol *sym,
676 get_symbol_props_str(r, sym, P_SELECT, _(" Selects: ")); 828 get_symbol_props_str(r, sym, P_SELECT, _(" Selects: "));
677 if (sym->rev_dep.expr) { 829 if (sym->rev_dep.expr) {
678 str_append(r, _(" Selected by: ")); 830 str_append(r, _(" Selected by: "));
679 expr_gstr_print(sym->rev_dep.expr, r); 831 expr_gstr_print_revdep(sym->rev_dep.expr, r);
680 str_append(r, "\n"); 832 str_append(r, "\n");
681 } 833 }
682 834
683 get_symbol_props_str(r, sym, P_IMPLY, _(" Implies: ")); 835 get_symbol_props_str(r, sym, P_IMPLY, _(" Implies: "));
684 if (sym->implied.expr) { 836 if (sym->implied.expr) {
685 str_append(r, _(" Implied by: ")); 837 str_append(r, _(" Implied by: "));
686 expr_gstr_print(sym->implied.expr, r); 838 expr_gstr_print_revdep(sym->implied.expr, r);
687 str_append(r, "\n"); 839 str_append(r, "\n");
688 } 840 }
689 841
diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c
index 3c8bd9bb4267..c9123ed2b791 100644
--- a/scripts/kconfig/symbol.c
+++ b/scripts/kconfig/symbol.c
@@ -77,7 +77,7 @@ const char *sym_type_name(enum symbol_type type)
77{ 77{
78 switch (type) { 78 switch (type) {
79 case S_BOOLEAN: 79 case S_BOOLEAN:
80 return "boolean"; 80 return "bool";
81 case S_TRISTATE: 81 case S_TRISTATE:
82 return "tristate"; 82 return "tristate";
83 case S_INT: 83 case S_INT:
@@ -907,6 +907,10 @@ const char *sym_expand_string_value(const char *in)
907 char *res; 907 char *res;
908 size_t reslen; 908 size_t reslen;
909 909
910 /*
911 * Note: 'in' might come from a token that's about to be
912 * freed, so make sure to always allocate a new string
913 */
910 reslen = strlen(in) + 1; 914 reslen = strlen(in) + 1;
911 res = xmalloc(reslen); 915 res = xmalloc(reslen);
912 res[0] = '\0'; 916 res[0] = '\0';
@@ -1150,8 +1154,7 @@ static void sym_check_print_recursive(struct symbol *last_sym)
1150 if (stack->sym == last_sym) 1154 if (stack->sym == last_sym)
1151 fprintf(stderr, "%s:%d:error: recursive dependency detected!\n", 1155 fprintf(stderr, "%s:%d:error: recursive dependency detected!\n",
1152 prop->file->name, prop->lineno); 1156 prop->file->name, prop->lineno);
1153 fprintf(stderr, "For a resolution refer to Documentation/kbuild/kconfig-language.txt\n"); 1157
1154 fprintf(stderr, "subsection \"Kconfig recursive dependency limitations\"\n");
1155 if (stack->expr) { 1158 if (stack->expr) {
1156 fprintf(stderr, "%s:%d:\tsymbol %s %s value contains %s\n", 1159 fprintf(stderr, "%s:%d:\tsymbol %s %s value contains %s\n",
1157 prop->file->name, prop->lineno, 1160 prop->file->name, prop->lineno,
@@ -1181,6 +1184,11 @@ static void sym_check_print_recursive(struct symbol *last_sym)
1181 } 1184 }
1182 } 1185 }
1183 1186
1187 fprintf(stderr,
1188 "For a resolution refer to Documentation/kbuild/kconfig-language.txt\n"
1189 "subsection \"Kconfig recursive dependency limitations\"\n"
1190 "\n");
1191
1184 if (check_top == &cv_stack) 1192 if (check_top == &cv_stack)
1185 dep_stack_remove(); 1193 dep_stack_remove();
1186} 1194}
diff --git a/scripts/kconfig/zconf.l b/scripts/kconfig/zconf.l
index c410d257da06..07e074dc68a1 100644
--- a/scripts/kconfig/zconf.l
+++ b/scripts/kconfig/zconf.l
@@ -106,11 +106,11 @@ n [A-Za-z0-9_-]
106 current_pos.file = current_file; 106 current_pos.file = current_file;
107 current_pos.lineno = current_file->lineno; 107 current_pos.lineno = current_file->lineno;
108 if (id && id->flags & TF_COMMAND) { 108 if (id && id->flags & TF_COMMAND) {
109 zconflval.id = id; 109 yylval.id = id;
110 return id->token; 110 return id->token;
111 } 111 }
112 alloc_string(yytext, yyleng); 112 alloc_string(yytext, yyleng);
113 zconflval.string = text; 113 yylval.string = text;
114 return T_WORD; 114 return T_WORD;
115 } 115 }
116 . warn_ignored_character(*yytext); 116 . warn_ignored_character(*yytext);
@@ -142,11 +142,11 @@ n [A-Za-z0-9_-]
142 ({n}|[/.])+ { 142 ({n}|[/.])+ {
143 const struct kconf_id *id = kconf_id_lookup(yytext, yyleng); 143 const struct kconf_id *id = kconf_id_lookup(yytext, yyleng);
144 if (id && id->flags & TF_PARAM) { 144 if (id && id->flags & TF_PARAM) {
145 zconflval.id = id; 145 yylval.id = id;
146 return id->token; 146 return id->token;
147 } 147 }
148 alloc_string(yytext, yyleng); 148 alloc_string(yytext, yyleng);
149 zconflval.string = text; 149 yylval.string = text;
150 return T_WORD; 150 return T_WORD;
151 } 151 }
152 #.* /* comment */ 152 #.* /* comment */
@@ -161,7 +161,7 @@ n [A-Za-z0-9_-]
161<STRING>{ 161<STRING>{
162 [^'"\\\n]+/\n { 162 [^'"\\\n]+/\n {
163 append_string(yytext, yyleng); 163 append_string(yytext, yyleng);
164 zconflval.string = text; 164 yylval.string = text;
165 return T_WORD_QUOTE; 165 return T_WORD_QUOTE;
166 } 166 }
167 [^'"\\\n]+ { 167 [^'"\\\n]+ {
@@ -169,7 +169,7 @@ n [A-Za-z0-9_-]
169 } 169 }
170 \\.?/\n { 170 \\.?/\n {
171 append_string(yytext + 1, yyleng - 1); 171 append_string(yytext + 1, yyleng - 1);
172 zconflval.string = text; 172 yylval.string = text;
173 return T_WORD_QUOTE; 173 return T_WORD_QUOTE;
174 } 174 }
175 \\.? { 175 \\.? {
@@ -178,7 +178,7 @@ n [A-Za-z0-9_-]
178 \'|\" { 178 \'|\" {
179 if (str == yytext[0]) { 179 if (str == yytext[0]) {
180 BEGIN(PARAM); 180 BEGIN(PARAM);
181 zconflval.string = text; 181 yylval.string = text;
182 return T_WORD_QUOTE; 182 return T_WORD_QUOTE;
183 } else 183 } else
184 append_string(yytext, 1); 184 append_string(yytext, 1);
@@ -261,7 +261,7 @@ void zconf_starthelp(void)
261 261
262static void zconf_endhelp(void) 262static void zconf_endhelp(void)
263{ 263{
264 zconflval.string = text; 264 yylval.string = text;
265 BEGIN(INITIAL); 265 BEGIN(INITIAL);
266} 266}
267 267
diff --git a/scripts/kconfig/zconf.lex.c_shipped b/scripts/kconfig/zconf.lex.c_shipped
deleted file mode 100644
index 37fdf6123505..000000000000
--- a/scripts/kconfig/zconf.lex.c_shipped
+++ /dev/null
@@ -1,2473 +0,0 @@
1
2#line 3 "scripts/kconfig/zconf.lex.c_shipped"
3
4#define YY_INT_ALIGNED short int
5
6/* A lexical scanner generated by flex */
7
8#define yy_create_buffer zconf_create_buffer
9#define yy_delete_buffer zconf_delete_buffer
10#define yy_flex_debug zconf_flex_debug
11#define yy_init_buffer zconf_init_buffer
12#define yy_flush_buffer zconf_flush_buffer
13#define yy_load_buffer_state zconf_load_buffer_state
14#define yy_switch_to_buffer zconf_switch_to_buffer
15#define yyin zconfin
16#define yyleng zconfleng
17#define yylex zconflex
18#define yylineno zconflineno
19#define yyout zconfout
20#define yyrestart zconfrestart
21#define yytext zconftext
22#define yywrap zconfwrap
23#define yyalloc zconfalloc
24#define yyrealloc zconfrealloc
25#define yyfree zconffree
26
27#define FLEX_SCANNER
28#define YY_FLEX_MAJOR_VERSION 2
29#define YY_FLEX_MINOR_VERSION 5
30#define YY_FLEX_SUBMINOR_VERSION 35
31#if YY_FLEX_SUBMINOR_VERSION > 0
32#define FLEX_BETA
33#endif
34
35/* First, we deal with platform-specific or compiler-specific issues. */
36
37/* begin standard C headers. */
38#include <stdio.h>
39#include <string.h>
40#include <errno.h>
41#include <stdlib.h>
42
43/* end standard C headers. */
44
45/* flex integer type definitions */
46
47#ifndef FLEXINT_H
48#define FLEXINT_H
49
50/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
51
52#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
53
54/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
55 * if you want the limit (max/min) macros for int types.
56 */
57#ifndef __STDC_LIMIT_MACROS
58#define __STDC_LIMIT_MACROS 1
59#endif
60
61#include <inttypes.h>
62typedef int8_t flex_int8_t;
63typedef uint8_t flex_uint8_t;
64typedef int16_t flex_int16_t;
65typedef uint16_t flex_uint16_t;
66typedef int32_t flex_int32_t;
67typedef uint32_t flex_uint32_t;
68#else
69typedef signed char flex_int8_t;
70typedef short int flex_int16_t;
71typedef int flex_int32_t;
72typedef unsigned char flex_uint8_t;
73typedef unsigned short int flex_uint16_t;
74typedef unsigned int flex_uint32_t;
75
76/* Limits of integral types. */
77#ifndef INT8_MIN
78#define INT8_MIN (-128)
79#endif
80#ifndef INT16_MIN
81#define INT16_MIN (-32767-1)
82#endif
83#ifndef INT32_MIN
84#define INT32_MIN (-2147483647-1)
85#endif
86#ifndef INT8_MAX
87#define INT8_MAX (127)
88#endif
89#ifndef INT16_MAX
90#define INT16_MAX (32767)
91#endif
92#ifndef INT32_MAX
93#define INT32_MAX (2147483647)
94#endif
95#ifndef UINT8_MAX
96#define UINT8_MAX (255U)
97#endif
98#ifndef UINT16_MAX
99#define UINT16_MAX (65535U)
100#endif
101#ifndef UINT32_MAX
102#define UINT32_MAX (4294967295U)
103#endif
104
105#endif /* ! C99 */
106
107#endif /* ! FLEXINT_H */
108
109#ifdef __cplusplus
110
111/* The "const" storage-class-modifier is valid. */
112#define YY_USE_CONST
113
114#else /* ! __cplusplus */
115
116/* C99 requires __STDC__ to be defined as 1. */
117#if defined (__STDC__)
118
119#define YY_USE_CONST
120
121#endif /* defined (__STDC__) */
122#endif /* ! __cplusplus */
123
124#ifdef YY_USE_CONST
125#define yyconst const
126#else
127#define yyconst
128#endif
129
130/* Returned upon end-of-file. */
131#define YY_NULL 0
132
133/* Promotes a possibly negative, possibly signed char to an unsigned
134 * integer for use as an array index. If the signed char is negative,
135 * we want to instead treat it as an 8-bit unsigned char, hence the
136 * double cast.
137 */
138#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
139
140/* Enter a start condition. This macro really ought to take a parameter,
141 * but we do it the disgusting crufty way forced on us by the ()-less
142 * definition of BEGIN.
143 */
144#define BEGIN (yy_start) = 1 + 2 *
145
146/* Translate the current start state into a value that can be later handed
147 * to BEGIN to return to the state. The YYSTATE alias is for lex
148 * compatibility.
149 */
150#define YY_START (((yy_start) - 1) / 2)
151#define YYSTATE YY_START
152
153/* Action number for EOF rule of a given start state. */
154#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
155
156/* Special action meaning "start processing a new file". */
157#define YY_NEW_FILE zconfrestart(zconfin )
158
159#define YY_END_OF_BUFFER_CHAR 0
160
161/* Size of default input buffer. */
162#ifndef YY_BUF_SIZE
163#ifdef __ia64__
164/* On IA-64, the buffer size is 16k, not 8k.
165 * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
166 * Ditto for the __ia64__ case accordingly.
167 */
168#define YY_BUF_SIZE 32768
169#else
170#define YY_BUF_SIZE 16384
171#endif /* __ia64__ */
172#endif
173
174/* The state buf must be large enough to hold one state per character in the main buffer.
175 */
176#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
177
178#ifndef YY_TYPEDEF_YY_BUFFER_STATE
179#define YY_TYPEDEF_YY_BUFFER_STATE
180typedef struct yy_buffer_state *YY_BUFFER_STATE;
181#endif
182
183extern int zconfleng;
184
185extern FILE *zconfin, *zconfout;
186
187#define EOB_ACT_CONTINUE_SCAN 0
188#define EOB_ACT_END_OF_FILE 1
189#define EOB_ACT_LAST_MATCH 2
190
191 #define YY_LESS_LINENO(n)
192
193/* Return all but the first "n" matched characters back to the input stream. */
194#define yyless(n) \
195 do \
196 { \
197 /* Undo effects of setting up zconftext. */ \
198 int yyless_macro_arg = (n); \
199 YY_LESS_LINENO(yyless_macro_arg);\
200 *yy_cp = (yy_hold_char); \
201 YY_RESTORE_YY_MORE_OFFSET \
202 (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
203 YY_DO_BEFORE_ACTION; /* set up zconftext again */ \
204 } \
205 while ( 0 )
206
207#define unput(c) yyunput( c, (yytext_ptr) )
208
209#ifndef YY_TYPEDEF_YY_SIZE_T
210#define YY_TYPEDEF_YY_SIZE_T
211typedef size_t yy_size_t;
212#endif
213
214#ifndef YY_STRUCT_YY_BUFFER_STATE
215#define YY_STRUCT_YY_BUFFER_STATE
216struct yy_buffer_state
217 {
218 FILE *yy_input_file;
219
220 char *yy_ch_buf; /* input buffer */
221 char *yy_buf_pos; /* current position in input buffer */
222
223 /* Size of input buffer in bytes, not including room for EOB
224 * characters.
225 */
226 yy_size_t yy_buf_size;
227
228 /* Number of characters read into yy_ch_buf, not including EOB
229 * characters.
230 */
231 int yy_n_chars;
232
233 /* Whether we "own" the buffer - i.e., we know we created it,
234 * and can realloc() it to grow it, and should free() it to
235 * delete it.
236 */
237 int yy_is_our_buffer;
238
239 /* Whether this is an "interactive" input source; if so, and
240 * if we're using stdio for input, then we want to use getc()
241 * instead of fread(), to make sure we stop fetching input after
242 * each newline.
243 */
244 int yy_is_interactive;
245
246 /* Whether we're considered to be at the beginning of a line.
247 * If so, '^' rules will be active on the next match, otherwise
248 * not.
249 */
250 int yy_at_bol;
251
252 int yy_bs_lineno; /**< The line count. */
253 int yy_bs_column; /**< The column count. */
254
255 /* Whether to try to fill the input buffer when we reach the
256 * end of it.
257 */
258 int yy_fill_buffer;
259
260 int yy_buffer_status;
261
262#define YY_BUFFER_NEW 0
263#define YY_BUFFER_NORMAL 1
264 /* When an EOF's been seen but there's still some text to process
265 * then we mark the buffer as YY_EOF_PENDING, to indicate that we
266 * shouldn't try reading from the input source any more. We might
267 * still have a bunch of tokens to match, though, because of
268 * possible backing-up.
269 *
270 * When we actually see the EOF, we change the status to "new"
271 * (via zconfrestart()), so that the user can continue scanning by
272 * just pointing zconfin at a new input file.
273 */
274#define YY_BUFFER_EOF_PENDING 2
275
276 };
277#endif /* !YY_STRUCT_YY_BUFFER_STATE */
278
279/* Stack of input buffers. */
280static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
281static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
282static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
283
284/* We provide macros for accessing buffer states in case in the
285 * future we want to put the buffer states in a more general
286 * "scanner state".
287 *
288 * Returns the top of the stack, or NULL.
289 */
290#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
291 ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
292 : NULL)
293
294/* Same as previous macro, but useful when we know that the buffer stack is not
295 * NULL or when we need an lvalue. For internal use only.
296 */
297#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
298
299/* yy_hold_char holds the character lost when zconftext is formed. */
300static char yy_hold_char;
301static int yy_n_chars; /* number of characters read into yy_ch_buf */
302int zconfleng;
303
304/* Points to current character in buffer. */
305static char *yy_c_buf_p = (char *) 0;
306static int yy_init = 0; /* whether we need to initialize */
307static int yy_start = 0; /* start state number */
308
309/* Flag which is used to allow zconfwrap()'s to do buffer switches
310 * instead of setting up a fresh zconfin. A bit of a hack ...
311 */
312static int yy_did_buffer_switch_on_eof;
313
314void zconfrestart (FILE *input_file );
315void zconf_switch_to_buffer (YY_BUFFER_STATE new_buffer );
316YY_BUFFER_STATE zconf_create_buffer (FILE *file,int size );
317void zconf_delete_buffer (YY_BUFFER_STATE b );
318void zconf_flush_buffer (YY_BUFFER_STATE b );
319void zconfpush_buffer_state (YY_BUFFER_STATE new_buffer );
320void zconfpop_buffer_state (void );
321
322static void zconfensure_buffer_stack (void );
323static void zconf_load_buffer_state (void );
324static void zconf_init_buffer (YY_BUFFER_STATE b,FILE *file );
325
326#define YY_FLUSH_BUFFER zconf_flush_buffer(YY_CURRENT_BUFFER )
327
328YY_BUFFER_STATE zconf_scan_buffer (char *base,yy_size_t size );
329YY_BUFFER_STATE zconf_scan_string (yyconst char *yy_str );
330YY_BUFFER_STATE zconf_scan_bytes (yyconst char *bytes,int len );
331
332void *zconfalloc (yy_size_t );
333void *zconfrealloc (void *,yy_size_t );
334void zconffree (void * );
335
336#define yy_new_buffer zconf_create_buffer
337
338#define yy_set_interactive(is_interactive) \
339 { \
340 if ( ! YY_CURRENT_BUFFER ){ \
341 zconfensure_buffer_stack (); \
342 YY_CURRENT_BUFFER_LVALUE = \
343 zconf_create_buffer(zconfin,YY_BUF_SIZE ); \
344 } \
345 YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
346 }
347
348#define yy_set_bol(at_bol) \
349 { \
350 if ( ! YY_CURRENT_BUFFER ){\
351 zconfensure_buffer_stack (); \
352 YY_CURRENT_BUFFER_LVALUE = \
353 zconf_create_buffer(zconfin,YY_BUF_SIZE ); \
354 } \
355 YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
356 }
357
358#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
359
360/* Begin user sect3 */
361
362#define zconfwrap(n) 1
363#define YY_SKIP_YYWRAP
364
365typedef unsigned char YY_CHAR;
366
367FILE *zconfin = (FILE *) 0, *zconfout = (FILE *) 0;
368
369typedef int yy_state_type;
370
371extern int zconflineno;
372
373int zconflineno = 1;
374
375extern char *zconftext;
376#define yytext_ptr zconftext
377static yyconst flex_int16_t yy_nxt[][18] =
378 {
379 {
380 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
381 0, 0, 0, 0, 0, 0, 0, 0
382 },
383
384 {
385 11, 12, 13, 14, 12, 12, 15, 12, 12, 12,
386 12, 12, 12, 12, 12, 12, 12, 12
387 },
388
389 {
390 11, 12, 13, 14, 12, 12, 15, 12, 12, 12,
391 12, 12, 12, 12, 12, 12, 12, 12
392 },
393
394 {
395 11, 16, 16, 17, 16, 16, 16, 16, 16, 16,
396 16, 18, 16, 16, 16, 16, 16, 16
397 },
398
399 {
400 11, 16, 16, 17, 16, 16, 16, 16, 16, 16,
401 16, 18, 16, 16, 16, 16, 16, 16
402
403 },
404
405 {
406 11, 19, 20, 21, 19, 19, 19, 19, 19, 19,
407 19, 19, 19, 19, 19, 19, 19, 19
408 },
409
410 {
411 11, 19, 20, 21, 19, 19, 19, 19, 19, 19,
412 19, 19, 19, 19, 19, 19, 19, 19
413 },
414
415 {
416 11, 22, 22, 23, 22, 24, 22, 22, 24, 22,
417 22, 22, 22, 22, 22, 22, 25, 22
418 },
419
420 {
421 11, 22, 22, 23, 22, 24, 22, 22, 24, 22,
422 22, 22, 22, 22, 22, 22, 25, 22
423 },
424
425 {
426 11, 26, 27, 28, 29, 30, 31, 32, 30, 33,
427 34, 35, 35, 36, 37, 38, 39, 40
428
429 },
430
431 {
432 11, 26, 27, 28, 29, 30, 31, 32, 30, 33,
433 34, 35, 35, 36, 37, 38, 39, 40
434 },
435
436 {
437 -11, -11, -11, -11, -11, -11, -11, -11, -11, -11,
438 -11, -11, -11, -11, -11, -11, -11, -11
439 },
440
441 {
442 11, -12, -12, -12, -12, -12, -12, -12, -12, -12,
443 -12, -12, -12, -12, -12, -12, -12, -12
444 },
445
446 {
447 11, -13, 41, 42, -13, -13, 43, -13, -13, -13,
448 -13, -13, -13, -13, -13, -13, -13, -13
449 },
450
451 {
452 11, -14, -14, -14, -14, -14, -14, -14, -14, -14,
453 -14, -14, -14, -14, -14, -14, -14, -14
454
455 },
456
457 {
458 11, 44, 44, 45, 44, 44, 44, 44, 44, 44,
459 44, 44, 44, 44, 44, 44, 44, 44
460 },
461
462 {
463 11, -16, -16, -16, -16, -16, -16, -16, -16, -16,
464 -16, -16, -16, -16, -16, -16, -16, -16
465 },
466
467 {
468 11, -17, -17, -17, -17, -17, -17, -17, -17, -17,
469 -17, -17, -17, -17, -17, -17, -17, -17
470 },
471
472 {
473 11, -18, -18, -18, -18, -18, -18, -18, -18, -18,
474 -18, 46, -18, -18, -18, -18, -18, -18
475 },
476
477 {
478 11, 47, 47, -19, 47, 47, 47, 47, 47, 47,
479 47, 47, 47, 47, 47, 47, 47, 47
480
481 },
482
483 {
484 11, -20, 48, 49, -20, -20, -20, -20, -20, -20,
485 -20, -20, -20, -20, -20, -20, -20, -20
486 },
487
488 {
489 11, 50, -21, -21, 50, 50, 50, 50, 50, 50,
490 50, 50, 50, 50, 50, 50, 50, 50
491 },
492
493 {
494 11, 51, 51, 52, 51, -22, 51, 51, -22, 51,
495 51, 51, 51, 51, 51, 51, -22, 51
496 },
497
498 {
499 11, -23, -23, -23, -23, -23, -23, -23, -23, -23,
500 -23, -23, -23, -23, -23, -23, -23, -23
501 },
502
503 {
504 11, -24, -24, -24, -24, -24, -24, -24, -24, -24,
505 -24, -24, -24, -24, -24, -24, -24, -24
506
507 },
508
509 {
510 11, 53, 53, 54, 53, 53, 53, 53, 53, 53,
511 53, 53, 53, 53, 53, 53, 53, 53
512 },
513
514 {
515 11, -26, -26, -26, -26, -26, -26, -26, -26, -26,
516 -26, -26, -26, -26, -26, -26, -26, -26
517 },
518
519 {
520 11, -27, 55, -27, -27, -27, -27, -27, -27, -27,
521 -27, -27, -27, -27, -27, -27, -27, -27
522 },
523
524 {
525 11, -28, -28, -28, -28, -28, -28, -28, -28, -28,
526 -28, -28, -28, -28, -28, -28, -28, -28
527 },
528
529 {
530 11, -29, -29, -29, -29, -29, -29, -29, -29, -29,
531 -29, -29, -29, -29, 56, -29, -29, -29
532
533 },
534
535 {
536 11, -30, -30, -30, -30, -30, -30, -30, -30, -30,
537 -30, -30, -30, -30, -30, -30, -30, -30
538 },
539
540 {
541 11, 57, 57, -31, 57, 57, 57, 57, 57, 57,
542 57, 57, 57, 57, 57, 57, 57, 57
543 },
544
545 {
546 11, -32, -32, -32, -32, -32, -32, 58, -32, -32,
547 -32, -32, -32, -32, -32, -32, -32, -32
548 },
549
550 {
551 11, -33, -33, -33, -33, -33, -33, -33, -33, -33,
552 -33, -33, -33, -33, -33, -33, -33, -33
553 },
554
555 {
556 11, -34, -34, -34, -34, -34, -34, -34, -34, -34,
557 -34, -34, -34, -34, -34, -34, -34, -34
558
559 },
560
561 {
562 11, -35, -35, -35, -35, -35, -35, -35, -35, -35,
563 -35, 59, 59, -35, -35, -35, -35, -35
564 },
565
566 {
567 11, -36, -36, -36, -36, -36, -36, -36, -36, -36,
568 -36, -36, -36, -36, 60, -36, -36, -36
569 },
570
571 {
572 11, -37, -37, -37, -37, -37, -37, -37, -37, -37,
573 -37, -37, -37, -37, -37, -37, -37, -37
574 },
575
576 {
577 11, -38, -38, -38, -38, -38, -38, -38, -38, -38,
578 -38, -38, -38, -38, 61, -38, -38, -38
579 },
580
581 {
582 11, -39, -39, 62, -39, -39, -39, -39, -39, -39,
583 -39, -39, -39, -39, -39, -39, -39, -39
584
585 },
586
587 {
588 11, -40, -40, -40, -40, -40, -40, -40, -40, -40,
589 -40, -40, -40, -40, -40, -40, -40, 63
590 },
591
592 {
593 11, -41, 41, 42, -41, -41, 43, -41, -41, -41,
594 -41, -41, -41, -41, -41, -41, -41, -41
595 },
596
597 {
598 11, -42, -42, -42, -42, -42, -42, -42, -42, -42,
599 -42, -42, -42, -42, -42, -42, -42, -42
600 },
601
602 {
603 11, 44, 44, 45, 44, 44, 44, 44, 44, 44,
604 44, 44, 44, 44, 44, 44, 44, 44
605 },
606
607 {
608 11, 44, 44, 45, 44, 44, 44, 44, 44, 44,
609 44, 44, 44, 44, 44, 44, 44, 44
610
611 },
612
613 {
614 11, -45, -45, -45, -45, -45, -45, -45, -45, -45,
615 -45, -45, -45, -45, -45, -45, -45, -45
616 },
617
618 {
619 11, -46, -46, -46, -46, -46, -46, -46, -46, -46,
620 -46, 46, -46, -46, -46, -46, -46, -46
621 },
622
623 {
624 11, 47, 47, -47, 47, 47, 47, 47, 47, 47,
625 47, 47, 47, 47, 47, 47, 47, 47
626 },
627
628 {
629 11, -48, 48, 49, -48, -48, -48, -48, -48, -48,
630 -48, -48, -48, -48, -48, -48, -48, -48
631 },
632
633 {
634 11, 50, -49, -49, 50, 50, 50, 50, 50, 50,
635 50, 50, 50, 50, 50, 50, 50, 50
636
637 },
638
639 {
640 11, -50, -50, -50, -50, -50, -50, -50, -50, -50,
641 -50, -50, -50, -50, -50, -50, -50, -50
642 },
643
644 {
645 11, 51, 51, 52, 51, -51, 51, 51, -51, 51,
646 51, 51, 51, 51, 51, 51, -51, 51
647 },
648
649 {
650 11, -52, -52, -52, -52, -52, -52, -52, -52, -52,
651 -52, -52, -52, -52, -52, -52, -52, -52
652 },
653
654 {
655 11, -53, -53, 54, -53, -53, -53, -53, -53, -53,
656 -53, -53, -53, -53, -53, -53, -53, -53
657 },
658
659 {
660 11, -54, -54, -54, -54, -54, -54, -54, -54, -54,
661 -54, -54, -54, -54, -54, -54, -54, -54
662
663 },
664
665 {
666 11, -55, 55, -55, -55, -55, -55, -55, -55, -55,
667 -55, -55, -55, -55, -55, -55, -55, -55
668 },
669
670 {
671 11, -56, -56, -56, -56, -56, -56, -56, -56, -56,
672 -56, -56, -56, -56, -56, -56, -56, -56
673 },
674
675 {
676 11, 57, 57, -57, 57, 57, 57, 57, 57, 57,
677 57, 57, 57, 57, 57, 57, 57, 57
678 },
679
680 {
681 11, -58, -58, -58, -58, -58, -58, -58, -58, -58,
682 -58, -58, -58, -58, -58, -58, -58, -58
683 },
684
685 {
686 11, -59, -59, -59, -59, -59, -59, -59, -59, -59,
687 -59, 59, 59, -59, -59, -59, -59, -59
688
689 },
690
691 {
692 11, -60, -60, -60, -60, -60, -60, -60, -60, -60,
693 -60, -60, -60, -60, -60, -60, -60, -60
694 },
695
696 {
697 11, -61, -61, -61, -61, -61, -61, -61, -61, -61,
698 -61, -61, -61, -61, -61, -61, -61, -61
699 },
700
701 {
702 11, -62, -62, -62, -62, -62, -62, -62, -62, -62,
703 -62, -62, -62, -62, -62, -62, -62, -62
704 },
705
706 {
707 11, -63, -63, -63, -63, -63, -63, -63, -63, -63,
708 -63, -63, -63, -63, -63, -63, -63, -63
709 },
710
711 } ;
712
713static yy_state_type yy_get_previous_state (void );
714static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
715static int yy_get_next_buffer (void );
716static void yy_fatal_error (yyconst char msg[] );
717
718/* Done after the current pattern has been matched and before the
719 * corresponding action - sets up zconftext.
720 */
721#define YY_DO_BEFORE_ACTION \
722 (yytext_ptr) = yy_bp; \
723 zconfleng = (size_t) (yy_cp - yy_bp); \
724 (yy_hold_char) = *yy_cp; \
725 *yy_cp = '\0'; \
726 (yy_c_buf_p) = yy_cp;
727
728#define YY_NUM_RULES 37
729#define YY_END_OF_BUFFER 38
730/* This struct is not used in this scanner,
731 but its presence is necessary. */
732struct yy_trans_info
733 {
734 flex_int32_t yy_verify;
735 flex_int32_t yy_nxt;
736 };
737static yyconst flex_int16_t yy_accept[64] =
738 { 0,
739 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
740 38, 5, 4, 2, 3, 7, 8, 6, 36, 33,
741 35, 28, 32, 31, 30, 26, 25, 21, 13, 20,
742 23, 26, 11, 12, 22, 18, 14, 19, 26, 26,
743 4, 2, 3, 3, 1, 6, 36, 33, 35, 34,
744 28, 27, 30, 29, 25, 15, 23, 9, 22, 16,
745 17, 24, 10
746 } ;
747
748static yyconst flex_int32_t yy_ec[256] =
749 { 0,
750 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
751 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
752 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
753 1, 2, 4, 5, 6, 1, 1, 7, 8, 9,
754 10, 1, 1, 1, 11, 12, 12, 11, 11, 11,
755 11, 11, 11, 11, 11, 11, 11, 1, 1, 13,
756 14, 15, 1, 1, 11, 11, 11, 11, 11, 11,
757 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
758 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
759 1, 16, 1, 1, 11, 1, 11, 11, 11, 11,
760
761 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
762 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
763 11, 11, 1, 17, 1, 1, 1, 1, 1, 1,
764 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
765 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
766 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
767 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
768 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
769 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
770 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
771
772 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
773 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
774 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
775 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
776 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
777 1, 1, 1, 1, 1
778 } ;
779
780extern int zconf_flex_debug;
781int zconf_flex_debug = 0;
782
783/* The intent behind this definition is that it'll catch
784 * any uses of REJECT which flex missed.
785 */
786#define REJECT reject_used_but_not_detected
787#define yymore() yymore_used_but_not_detected
788#define YY_MORE_ADJ 0
789#define YY_RESTORE_YY_MORE_OFFSET
790char *zconftext;
791#define YY_NO_INPUT 1
792
793/*
794 * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
795 * Released under the terms of the GNU GPL v2.0.
796 */
797
798#include <limits.h>
799#include <stdio.h>
800#include <stdlib.h>
801#include <string.h>
802#include <unistd.h>
803
804#include "lkc.h"
805
806#define START_STRSIZE 16
807
808static struct {
809 struct file *file;
810 int lineno;
811} current_pos;
812
813static char *text;
814static int text_size, text_asize;
815
816struct buffer {
817 struct buffer *parent;
818 YY_BUFFER_STATE state;
819};
820
821struct buffer *current_buf;
822
823static int last_ts, first_ts;
824
825static void zconf_endhelp(void);
826static void zconf_endfile(void);
827
828static void new_string(void)
829{
830 text = xmalloc(START_STRSIZE);
831 text_asize = START_STRSIZE;
832 text_size = 0;
833 *text = 0;
834}
835
836static void append_string(const char *str, int size)
837{
838 int new_size = text_size + size + 1;
839 if (new_size > text_asize) {
840 new_size += START_STRSIZE - 1;
841 new_size &= -START_STRSIZE;
842 text = realloc(text, new_size);
843 text_asize = new_size;
844 }
845 memcpy(text + text_size, str, size);
846 text_size += size;
847 text[text_size] = 0;
848}
849
850static void alloc_string(const char *str, int size)
851{
852 text = xmalloc(size + 1);
853 memcpy(text, str, size);
854 text[size] = 0;
855}
856
857static void warn_ignored_character(char chr)
858{
859 fprintf(stderr,
860 "%s:%d:warning: ignoring unsupported character '%c'\n",
861 zconf_curname(), zconf_lineno(), chr);
862}
863
864#define INITIAL 0
865#define COMMAND 1
866#define HELP 2
867#define STRING 3
868#define PARAM 4
869
870#ifndef YY_NO_UNISTD_H
871/* Special case for "unistd.h", since it is non-ANSI. We include it way
872 * down here because we want the user's section 1 to have been scanned first.
873 * The user has a chance to override it with an option.
874 */
875#include <unistd.h>
876#endif
877
878#ifndef YY_EXTRA_TYPE
879#define YY_EXTRA_TYPE void *
880#endif
881
882static int yy_init_globals (void );
883
884/* Accessor methods to globals.
885 These are made visible to non-reentrant scanners for convenience. */
886
887int zconflex_destroy (void );
888
889int zconfget_debug (void );
890
891void zconfset_debug (int debug_flag );
892
893YY_EXTRA_TYPE zconfget_extra (void );
894
895void zconfset_extra (YY_EXTRA_TYPE user_defined );
896
897FILE *zconfget_in (void );
898
899void zconfset_in (FILE * in_str );
900
901FILE *zconfget_out (void );
902
903void zconfset_out (FILE * out_str );
904
905int zconfget_leng (void );
906
907char *zconfget_text (void );
908
909int zconfget_lineno (void );
910
911void zconfset_lineno (int line_number );
912
913/* Macros after this point can all be overridden by user definitions in
914 * section 1.
915 */
916
917#ifndef YY_SKIP_YYWRAP
918#ifdef __cplusplus
919extern "C" int zconfwrap (void );
920#else
921extern int zconfwrap (void );
922#endif
923#endif
924
925 static void yyunput (int c,char *buf_ptr );
926
927#ifndef yytext_ptr
928static void yy_flex_strncpy (char *,yyconst char *,int );
929#endif
930
931#ifdef YY_NEED_STRLEN
932static int yy_flex_strlen (yyconst char * );
933#endif
934
935#ifndef YY_NO_INPUT
936
937#ifdef __cplusplus
938static int yyinput (void );
939#else
940static int input (void );
941#endif
942
943#endif
944
945/* Amount of stuff to slurp up with each read. */
946#ifndef YY_READ_BUF_SIZE
947#ifdef __ia64__
948/* On IA-64, the buffer size is 16k, not 8k */
949#define YY_READ_BUF_SIZE 16384
950#else
951#define YY_READ_BUF_SIZE 8192
952#endif /* __ia64__ */
953#endif
954
955/* Copy whatever the last rule matched to the standard output. */
956#ifndef ECHO
957/* This used to be an fputs(), but since the string might contain NUL's,
958 * we now use fwrite().
959 */
960#define ECHO do { if (fwrite( zconftext, zconfleng, 1, zconfout )) {} } while (0)
961#endif
962
963/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
964 * is returned in "result".
965 */
966#ifndef YY_INPUT
967#define YY_INPUT(buf,result,max_size) \
968 errno=0; \
969 while ( (result = read( fileno(zconfin), (char *) buf, max_size )) < 0 ) \
970 { \
971 if( errno != EINTR) \
972 { \
973 YY_FATAL_ERROR( "input in flex scanner failed" ); \
974 break; \
975 } \
976 errno=0; \
977 clearerr(zconfin); \
978 }\
979\
980
981#endif
982
983/* No semi-colon after return; correct usage is to write "yyterminate();" -
984 * we don't want an extra ';' after the "return" because that will cause
985 * some compilers to complain about unreachable statements.
986 */
987#ifndef yyterminate
988#define yyterminate() return YY_NULL
989#endif
990
991/* Number of entries by which start-condition stack grows. */
992#ifndef YY_START_STACK_INCR
993#define YY_START_STACK_INCR 25
994#endif
995
996/* Report a fatal error. */
997#ifndef YY_FATAL_ERROR
998#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
999#endif
1000
1001/* end tables serialization structures and prototypes */
1002
1003/* Default declaration of generated scanner - a define so the user can
1004 * easily add parameters.
1005 */
1006#ifndef YY_DECL
1007#define YY_DECL_IS_OURS 1
1008
1009extern int zconflex (void);
1010
1011#define YY_DECL int zconflex (void)
1012#endif /* !YY_DECL */
1013
1014/* Code executed at the beginning of each rule, after zconftext and zconfleng
1015 * have been set up.
1016 */
1017#ifndef YY_USER_ACTION
1018#define YY_USER_ACTION
1019#endif
1020
1021/* Code executed at the end of each rule. */
1022#ifndef YY_BREAK
1023#define YY_BREAK break;
1024#endif
1025
1026#define YY_RULE_SETUP \
1027 YY_USER_ACTION
1028
1029/** The main scanner function which does all the work.
1030 */
1031YY_DECL
1032{
1033 register yy_state_type yy_current_state;
1034 register char *yy_cp, *yy_bp;
1035 register int yy_act;
1036
1037 int str = 0;
1038 int ts, i;
1039
1040 if ( !(yy_init) )
1041 {
1042 (yy_init) = 1;
1043
1044#ifdef YY_USER_INIT
1045 YY_USER_INIT;
1046#endif
1047
1048 if ( ! (yy_start) )
1049 (yy_start) = 1; /* first start state */
1050
1051 if ( ! zconfin )
1052 zconfin = stdin;
1053
1054 if ( ! zconfout )
1055 zconfout = stdout;
1056
1057 if ( ! YY_CURRENT_BUFFER ) {
1058 zconfensure_buffer_stack ();
1059 YY_CURRENT_BUFFER_LVALUE =
1060 zconf_create_buffer(zconfin,YY_BUF_SIZE );
1061 }
1062
1063 zconf_load_buffer_state( );
1064 }
1065
1066 while ( 1 ) /* loops until end-of-file is reached */
1067 {
1068 yy_cp = (yy_c_buf_p);
1069
1070 /* Support of zconftext. */
1071 *yy_cp = (yy_hold_char);
1072
1073 /* yy_bp points to the position in yy_ch_buf of the start of
1074 * the current run.
1075 */
1076 yy_bp = yy_cp;
1077
1078 yy_current_state = (yy_start);
1079yy_match:
1080 while ( (yy_current_state = yy_nxt[yy_current_state][ yy_ec[YY_SC_TO_UI(*yy_cp)] ]) > 0 )
1081 ++yy_cp;
1082
1083 yy_current_state = -yy_current_state;
1084
1085yy_find_action:
1086 yy_act = yy_accept[yy_current_state];
1087
1088 YY_DO_BEFORE_ACTION;
1089
1090do_action: /* This label is used only to access EOF actions. */
1091
1092 switch ( yy_act )
1093 { /* beginning of action switch */
1094case 1:
1095/* rule 1 can match eol */
1096case 2:
1097/* rule 2 can match eol */
1098YY_RULE_SETUP
1099{
1100 current_file->lineno++;
1101 return T_EOL;
1102}
1103 YY_BREAK
1104case 3:
1105YY_RULE_SETUP
1106
1107 YY_BREAK
1108case 4:
1109YY_RULE_SETUP
1110{
1111 BEGIN(COMMAND);
1112}
1113 YY_BREAK
1114case 5:
1115YY_RULE_SETUP
1116{
1117 unput(zconftext[0]);
1118 BEGIN(COMMAND);
1119}
1120 YY_BREAK
1121
1122case 6:
1123YY_RULE_SETUP
1124{
1125 const struct kconf_id *id = kconf_id_lookup(zconftext, zconfleng);
1126 BEGIN(PARAM);
1127 current_pos.file = current_file;
1128 current_pos.lineno = current_file->lineno;
1129 if (id && id->flags & TF_COMMAND) {
1130 zconflval.id = id;
1131 return id->token;
1132 }
1133 alloc_string(zconftext, zconfleng);
1134 zconflval.string = text;
1135 return T_WORD;
1136 }
1137 YY_BREAK
1138case 7:
1139YY_RULE_SETUP
1140warn_ignored_character(*zconftext);
1141 YY_BREAK
1142case 8:
1143/* rule 8 can match eol */
1144YY_RULE_SETUP
1145{
1146 BEGIN(INITIAL);
1147 current_file->lineno++;
1148 return T_EOL;
1149 }
1150 YY_BREAK
1151
1152case 9:
1153YY_RULE_SETUP
1154return T_AND;
1155 YY_BREAK
1156case 10:
1157YY_RULE_SETUP
1158return T_OR;
1159 YY_BREAK
1160case 11:
1161YY_RULE_SETUP
1162return T_OPEN_PAREN;
1163 YY_BREAK
1164case 12:
1165YY_RULE_SETUP
1166return T_CLOSE_PAREN;
1167 YY_BREAK
1168case 13:
1169YY_RULE_SETUP
1170return T_NOT;
1171 YY_BREAK
1172case 14:
1173YY_RULE_SETUP
1174return T_EQUAL;
1175 YY_BREAK
1176case 15:
1177YY_RULE_SETUP
1178return T_UNEQUAL;
1179 YY_BREAK
1180case 16:
1181YY_RULE_SETUP
1182return T_LESS_EQUAL;
1183 YY_BREAK
1184case 17:
1185YY_RULE_SETUP
1186return T_GREATER_EQUAL;
1187 YY_BREAK
1188case 18:
1189YY_RULE_SETUP
1190return T_LESS;
1191 YY_BREAK
1192case 19:
1193YY_RULE_SETUP
1194return T_GREATER;
1195 YY_BREAK
1196case 20:
1197YY_RULE_SETUP
1198{
1199 str = zconftext[0];
1200 new_string();
1201 BEGIN(STRING);
1202 }
1203 YY_BREAK
1204case 21:
1205/* rule 21 can match eol */
1206YY_RULE_SETUP
1207BEGIN(INITIAL); current_file->lineno++; return T_EOL;
1208 YY_BREAK
1209case 22:
1210YY_RULE_SETUP
1211{
1212 const struct kconf_id *id = kconf_id_lookup(zconftext, zconfleng);
1213 if (id && id->flags & TF_PARAM) {
1214 zconflval.id = id;
1215 return id->token;
1216 }
1217 alloc_string(zconftext, zconfleng);
1218 zconflval.string = text;
1219 return T_WORD;
1220 }
1221 YY_BREAK
1222case 23:
1223YY_RULE_SETUP
1224/* comment */
1225 YY_BREAK
1226case 24:
1227/* rule 24 can match eol */
1228YY_RULE_SETUP
1229current_file->lineno++;
1230 YY_BREAK
1231case 25:
1232YY_RULE_SETUP
1233
1234 YY_BREAK
1235case 26:
1236YY_RULE_SETUP
1237warn_ignored_character(*zconftext);
1238 YY_BREAK
1239case YY_STATE_EOF(PARAM):
1240{
1241 BEGIN(INITIAL);
1242 }
1243 YY_BREAK
1244
1245case 27:
1246/* rule 27 can match eol */
1247*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */
1248(yy_c_buf_p) = yy_cp -= 1;
1249YY_DO_BEFORE_ACTION; /* set up zconftext again */
1250YY_RULE_SETUP
1251{
1252 append_string(zconftext, zconfleng);
1253 zconflval.string = text;
1254 return T_WORD_QUOTE;
1255 }
1256 YY_BREAK
1257case 28:
1258YY_RULE_SETUP
1259{
1260 append_string(zconftext, zconfleng);
1261 }
1262 YY_BREAK
1263case 29:
1264/* rule 29 can match eol */
1265*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */
1266(yy_c_buf_p) = yy_cp -= 1;
1267YY_DO_BEFORE_ACTION; /* set up zconftext again */
1268YY_RULE_SETUP
1269{
1270 append_string(zconftext + 1, zconfleng - 1);
1271 zconflval.string = text;
1272 return T_WORD_QUOTE;
1273 }
1274 YY_BREAK
1275case 30:
1276YY_RULE_SETUP
1277{
1278 append_string(zconftext + 1, zconfleng - 1);
1279 }
1280 YY_BREAK
1281case 31:
1282YY_RULE_SETUP
1283{
1284 if (str == zconftext[0]) {
1285 BEGIN(PARAM);
1286 zconflval.string = text;
1287 return T_WORD_QUOTE;
1288 } else
1289 append_string(zconftext, 1);
1290 }
1291 YY_BREAK
1292case 32:
1293/* rule 32 can match eol */
1294YY_RULE_SETUP
1295{
1296 printf("%s:%d:warning: multi-line strings not supported\n", zconf_curname(), zconf_lineno());
1297 current_file->lineno++;
1298 BEGIN(INITIAL);
1299 return T_EOL;
1300 }
1301 YY_BREAK
1302case YY_STATE_EOF(STRING):
1303{
1304 BEGIN(INITIAL);
1305 }
1306 YY_BREAK
1307
1308case 33:
1309YY_RULE_SETUP
1310{
1311 ts = 0;
1312 for (i = 0; i < zconfleng; i++) {
1313 if (zconftext[i] == '\t')
1314 ts = (ts & ~7) + 8;
1315 else
1316 ts++;
1317 }
1318 last_ts = ts;
1319 if (first_ts) {
1320 if (ts < first_ts) {
1321 zconf_endhelp();
1322 return T_HELPTEXT;
1323 }
1324 ts -= first_ts;
1325 while (ts > 8) {
1326 append_string(" ", 8);
1327 ts -= 8;
1328 }
1329 append_string(" ", ts);
1330 }
1331 }
1332 YY_BREAK
1333case 34:
1334/* rule 34 can match eol */
1335*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */
1336(yy_c_buf_p) = yy_cp -= 1;
1337YY_DO_BEFORE_ACTION; /* set up zconftext again */
1338YY_RULE_SETUP
1339{
1340 current_file->lineno++;
1341 zconf_endhelp();
1342 return T_HELPTEXT;
1343 }
1344 YY_BREAK
1345case 35:
1346/* rule 35 can match eol */
1347YY_RULE_SETUP
1348{
1349 current_file->lineno++;
1350 append_string("\n", 1);
1351 }
1352 YY_BREAK
1353case 36:
1354YY_RULE_SETUP
1355{
1356 while (zconfleng) {
1357 if ((zconftext[zconfleng-1] != ' ') && (zconftext[zconfleng-1] != '\t'))
1358 break;
1359 zconfleng--;
1360 }
1361 append_string(zconftext, zconfleng);
1362 if (!first_ts)
1363 first_ts = last_ts;
1364 }
1365 YY_BREAK
1366case YY_STATE_EOF(HELP):
1367{
1368 zconf_endhelp();
1369 return T_HELPTEXT;
1370 }
1371 YY_BREAK
1372
1373case YY_STATE_EOF(INITIAL):
1374case YY_STATE_EOF(COMMAND):
1375{
1376 if (current_file) {
1377 zconf_endfile();
1378 return T_EOL;
1379 }
1380 fclose(zconfin);
1381 yyterminate();
1382}
1383 YY_BREAK
1384case 37:
1385YY_RULE_SETUP
1386YY_FATAL_ERROR( "flex scanner jammed" );
1387 YY_BREAK
1388
1389 case YY_END_OF_BUFFER:
1390 {
1391 /* Amount of text matched not including the EOB char. */
1392 int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
1393
1394 /* Undo the effects of YY_DO_BEFORE_ACTION. */
1395 *yy_cp = (yy_hold_char);
1396 YY_RESTORE_YY_MORE_OFFSET
1397
1398 if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
1399 {
1400 /* We're scanning a new file or input source. It's
1401 * possible that this happened because the user
1402 * just pointed zconfin at a new source and called
1403 * zconflex(). If so, then we have to assure
1404 * consistency between YY_CURRENT_BUFFER and our
1405 * globals. Here is the right place to do so, because
1406 * this is the first action (other than possibly a
1407 * back-up) that will match for the new input source.
1408 */
1409 (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
1410 YY_CURRENT_BUFFER_LVALUE->yy_input_file = zconfin;
1411 YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
1412 }
1413
1414 /* Note that here we test for yy_c_buf_p "<=" to the position
1415 * of the first EOB in the buffer, since yy_c_buf_p will
1416 * already have been incremented past the NUL character
1417 * (since all states make transitions on EOB to the
1418 * end-of-buffer state). Contrast this with the test
1419 * in input().
1420 */
1421 if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
1422 { /* This was really a NUL. */
1423 yy_state_type yy_next_state;
1424
1425 (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
1426
1427 yy_current_state = yy_get_previous_state( );
1428
1429 /* Okay, we're now positioned to make the NUL
1430 * transition. We couldn't have
1431 * yy_get_previous_state() go ahead and do it
1432 * for us because it doesn't know how to deal
1433 * with the possibility of jamming (and we don't
1434 * want to build jamming into it because then it
1435 * will run more slowly).
1436 */
1437
1438 yy_next_state = yy_try_NUL_trans( yy_current_state );
1439
1440 yy_bp = (yytext_ptr) + YY_MORE_ADJ;
1441
1442 if ( yy_next_state )
1443 {
1444 /* Consume the NUL. */
1445 yy_cp = ++(yy_c_buf_p);
1446 yy_current_state = yy_next_state;
1447 goto yy_match;
1448 }
1449
1450 else
1451 {
1452 yy_cp = (yy_c_buf_p);
1453 goto yy_find_action;
1454 }
1455 }
1456
1457 else switch ( yy_get_next_buffer( ) )
1458 {
1459 case EOB_ACT_END_OF_FILE:
1460 {
1461 (yy_did_buffer_switch_on_eof) = 0;
1462
1463 if ( zconfwrap( ) )
1464 {
1465 /* Note: because we've taken care in
1466 * yy_get_next_buffer() to have set up
1467 * zconftext, we can now set up
1468 * yy_c_buf_p so that if some total
1469 * hoser (like flex itself) wants to
1470 * call the scanner after we return the
1471 * YY_NULL, it'll still work - another
1472 * YY_NULL will get returned.
1473 */
1474 (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
1475
1476 yy_act = YY_STATE_EOF(YY_START);
1477 goto do_action;
1478 }
1479
1480 else
1481 {
1482 if ( ! (yy_did_buffer_switch_on_eof) )
1483 YY_NEW_FILE;
1484 }
1485 break;
1486 }
1487
1488 case EOB_ACT_CONTINUE_SCAN:
1489 (yy_c_buf_p) =
1490 (yytext_ptr) + yy_amount_of_matched_text;
1491
1492 yy_current_state = yy_get_previous_state( );
1493
1494 yy_cp = (yy_c_buf_p);
1495 yy_bp = (yytext_ptr) + YY_MORE_ADJ;
1496 goto yy_match;
1497
1498 case EOB_ACT_LAST_MATCH:
1499 (yy_c_buf_p) =
1500 &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
1501
1502 yy_current_state = yy_get_previous_state( );
1503
1504 yy_cp = (yy_c_buf_p);
1505 yy_bp = (yytext_ptr) + YY_MORE_ADJ;
1506 goto yy_find_action;
1507 }
1508 break;
1509 }
1510
1511 default:
1512 YY_FATAL_ERROR(
1513 "fatal flex scanner internal error--no action found" );
1514 } /* end of action switch */
1515 } /* end of scanning one token */
1516} /* end of zconflex */
1517
1518/* yy_get_next_buffer - try to read in a new buffer
1519 *
1520 * Returns a code representing an action:
1521 * EOB_ACT_LAST_MATCH -
1522 * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
1523 * EOB_ACT_END_OF_FILE - end of file
1524 */
1525static int yy_get_next_buffer (void)
1526{
1527 register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
1528 register char *source = (yytext_ptr);
1529 register int number_to_move, i;
1530 int ret_val;
1531
1532 if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
1533 YY_FATAL_ERROR(
1534 "fatal flex scanner internal error--end of buffer missed" );
1535
1536 if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
1537 { /* Don't try to fill the buffer, so this is an EOF. */
1538 if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
1539 {
1540 /* We matched a single character, the EOB, so
1541 * treat this as a final EOF.
1542 */
1543 return EOB_ACT_END_OF_FILE;
1544 }
1545
1546 else
1547 {
1548 /* We matched some text prior to the EOB, first
1549 * process it.
1550 */
1551 return EOB_ACT_LAST_MATCH;
1552 }
1553 }
1554
1555 /* Try to read more data. */
1556
1557 /* First move last chars to start of buffer. */
1558 number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
1559
1560 for ( i = 0; i < number_to_move; ++i )
1561 *(dest++) = *(source++);
1562
1563 if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
1564 /* don't do the read, it's not guaranteed to return an EOF,
1565 * just force an EOF
1566 */
1567 YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
1568
1569 else
1570 {
1571 int num_to_read =
1572 YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
1573
1574 while ( num_to_read <= 0 )
1575 { /* Not enough room in the buffer - grow it. */
1576
1577 /* just a shorter name for the current buffer */
1578 YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
1579
1580 int yy_c_buf_p_offset =
1581 (int) ((yy_c_buf_p) - b->yy_ch_buf);
1582
1583 if ( b->yy_is_our_buffer )
1584 {
1585 int new_size = b->yy_buf_size * 2;
1586
1587 if ( new_size <= 0 )
1588 b->yy_buf_size += b->yy_buf_size / 8;
1589 else
1590 b->yy_buf_size *= 2;
1591
1592 b->yy_ch_buf = (char *)
1593 /* Include room in for 2 EOB chars. */
1594 zconfrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 );
1595 }
1596 else
1597 /* Can't grow it, we don't own it. */
1598 b->yy_ch_buf = 0;
1599
1600 if ( ! b->yy_ch_buf )
1601 YY_FATAL_ERROR(
1602 "fatal error - scanner input buffer overflow" );
1603
1604 (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
1605
1606 num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
1607 number_to_move - 1;
1608
1609 }
1610
1611 if ( num_to_read > YY_READ_BUF_SIZE )
1612 num_to_read = YY_READ_BUF_SIZE;
1613
1614 /* Read in more data. */
1615 YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
1616 (yy_n_chars), (size_t) num_to_read );
1617
1618 YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
1619 }
1620
1621 if ( (yy_n_chars) == 0 )
1622 {
1623 if ( number_to_move == YY_MORE_ADJ )
1624 {
1625 ret_val = EOB_ACT_END_OF_FILE;
1626 zconfrestart(zconfin );
1627 }
1628
1629 else
1630 {
1631 ret_val = EOB_ACT_LAST_MATCH;
1632 YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
1633 YY_BUFFER_EOF_PENDING;
1634 }
1635 }
1636
1637 else
1638 ret_val = EOB_ACT_CONTINUE_SCAN;
1639
1640 if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
1641 /* Extend the array by 50%, plus the number we really need. */
1642 yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
1643 YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) zconfrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size );
1644 if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
1645 YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
1646 }
1647
1648 (yy_n_chars) += number_to_move;
1649 YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
1650 YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
1651
1652 (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
1653
1654 return ret_val;
1655}
1656
1657/* yy_get_previous_state - get the state just before the EOB char was reached */
1658
1659 static yy_state_type yy_get_previous_state (void)
1660{
1661 register yy_state_type yy_current_state;
1662 register char *yy_cp;
1663
1664 yy_current_state = (yy_start);
1665
1666 for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
1667 {
1668 yy_current_state = yy_nxt[yy_current_state][(*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1)];
1669 }
1670
1671 return yy_current_state;
1672}
1673
1674/* yy_try_NUL_trans - try to make a transition on the NUL character
1675 *
1676 * synopsis
1677 * next_state = yy_try_NUL_trans( current_state );
1678 */
1679 static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
1680{
1681 register int yy_is_jam;
1682
1683 yy_current_state = yy_nxt[yy_current_state][1];
1684 yy_is_jam = (yy_current_state <= 0);
1685
1686 return yy_is_jam ? 0 : yy_current_state;
1687}
1688
1689 static void yyunput (int c, register char * yy_bp )
1690{
1691 register char *yy_cp;
1692
1693 yy_cp = (yy_c_buf_p);
1694
1695 /* undo effects of setting up zconftext */
1696 *yy_cp = (yy_hold_char);
1697
1698 if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
1699 { /* need to shift things up to make room */
1700 /* +2 for EOB chars. */
1701 register int number_to_move = (yy_n_chars) + 2;
1702 register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
1703 YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
1704 register char *source =
1705 &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
1706
1707 while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
1708 *--dest = *--source;
1709
1710 yy_cp += (int) (dest - source);
1711 yy_bp += (int) (dest - source);
1712 YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
1713 (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
1714
1715 if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
1716 YY_FATAL_ERROR( "flex scanner push-back overflow" );
1717 }
1718
1719 *--yy_cp = (char) c;
1720
1721 (yytext_ptr) = yy_bp;
1722 (yy_hold_char) = *yy_cp;
1723 (yy_c_buf_p) = yy_cp;
1724}
1725
1726#ifndef YY_NO_INPUT
1727#ifdef __cplusplus
1728 static int yyinput (void)
1729#else
1730 static int input (void)
1731#endif
1732
1733{
1734 int c;
1735
1736 *(yy_c_buf_p) = (yy_hold_char);
1737
1738 if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
1739 {
1740 /* yy_c_buf_p now points to the character we want to return.
1741 * If this occurs *before* the EOB characters, then it's a
1742 * valid NUL; if not, then we've hit the end of the buffer.
1743 */
1744 if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
1745 /* This was really a NUL. */
1746 *(yy_c_buf_p) = '\0';
1747
1748 else
1749 { /* need more input */
1750 int offset = (yy_c_buf_p) - (yytext_ptr);
1751 ++(yy_c_buf_p);
1752
1753 switch ( yy_get_next_buffer( ) )
1754 {
1755 case EOB_ACT_LAST_MATCH:
1756 /* This happens because yy_g_n_b()
1757 * sees that we've accumulated a
1758 * token and flags that we need to
1759 * try matching the token before
1760 * proceeding. But for input(),
1761 * there's no matching to consider.
1762 * So convert the EOB_ACT_LAST_MATCH
1763 * to EOB_ACT_END_OF_FILE.
1764 */
1765
1766 /* Reset buffer status. */
1767 zconfrestart(zconfin );
1768
1769 /*FALLTHROUGH*/
1770
1771 case EOB_ACT_END_OF_FILE:
1772 {
1773 if ( zconfwrap( ) )
1774 return EOF;
1775
1776 if ( ! (yy_did_buffer_switch_on_eof) )
1777 YY_NEW_FILE;
1778#ifdef __cplusplus
1779 return yyinput();
1780#else
1781 return input();
1782#endif
1783 }
1784
1785 case EOB_ACT_CONTINUE_SCAN:
1786 (yy_c_buf_p) = (yytext_ptr) + offset;
1787 break;
1788 }
1789 }
1790 }
1791
1792 c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
1793 *(yy_c_buf_p) = '\0'; /* preserve zconftext */
1794 (yy_hold_char) = *++(yy_c_buf_p);
1795
1796 return c;
1797}
1798#endif /* ifndef YY_NO_INPUT */
1799
1800/** Immediately switch to a different input stream.
1801 * @param input_file A readable stream.
1802 *
1803 * @note This function does not reset the start condition to @c INITIAL .
1804 */
1805 void zconfrestart (FILE * input_file )
1806{
1807
1808 if ( ! YY_CURRENT_BUFFER ){
1809 zconfensure_buffer_stack ();
1810 YY_CURRENT_BUFFER_LVALUE =
1811 zconf_create_buffer(zconfin,YY_BUF_SIZE );
1812 }
1813
1814 zconf_init_buffer(YY_CURRENT_BUFFER,input_file );
1815 zconf_load_buffer_state( );
1816}
1817
1818/** Switch to a different input buffer.
1819 * @param new_buffer The new input buffer.
1820 *
1821 */
1822 void zconf_switch_to_buffer (YY_BUFFER_STATE new_buffer )
1823{
1824
1825 /* TODO. We should be able to replace this entire function body
1826 * with
1827 * zconfpop_buffer_state();
1828 * zconfpush_buffer_state(new_buffer);
1829 */
1830 zconfensure_buffer_stack ();
1831 if ( YY_CURRENT_BUFFER == new_buffer )
1832 return;
1833
1834 if ( YY_CURRENT_BUFFER )
1835 {
1836 /* Flush out information for old buffer. */
1837 *(yy_c_buf_p) = (yy_hold_char);
1838 YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
1839 YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
1840 }
1841
1842 YY_CURRENT_BUFFER_LVALUE = new_buffer;
1843 zconf_load_buffer_state( );
1844
1845 /* We don't actually know whether we did this switch during
1846 * EOF (zconfwrap()) processing, but the only time this flag
1847 * is looked at is after zconfwrap() is called, so it's safe
1848 * to go ahead and always set it.
1849 */
1850 (yy_did_buffer_switch_on_eof) = 1;
1851}
1852
1853static void zconf_load_buffer_state (void)
1854{
1855 (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
1856 (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
1857 zconfin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
1858 (yy_hold_char) = *(yy_c_buf_p);
1859}
1860
1861/** Allocate and initialize an input buffer state.
1862 * @param file A readable stream.
1863 * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
1864 *
1865 * @return the allocated buffer state.
1866 */
1867 YY_BUFFER_STATE zconf_create_buffer (FILE * file, int size )
1868{
1869 YY_BUFFER_STATE b;
1870
1871 b = (YY_BUFFER_STATE) zconfalloc(sizeof( struct yy_buffer_state ) );
1872 if ( ! b )
1873 YY_FATAL_ERROR( "out of dynamic memory in zconf_create_buffer()" );
1874
1875 b->yy_buf_size = size;
1876
1877 /* yy_ch_buf has to be 2 characters longer than the size given because
1878 * we need to put in 2 end-of-buffer characters.
1879 */
1880 b->yy_ch_buf = (char *) zconfalloc(b->yy_buf_size + 2 );
1881 if ( ! b->yy_ch_buf )
1882 YY_FATAL_ERROR( "out of dynamic memory in zconf_create_buffer()" );
1883
1884 b->yy_is_our_buffer = 1;
1885
1886 zconf_init_buffer(b,file );
1887
1888 return b;
1889}
1890
1891/** Destroy the buffer.
1892 * @param b a buffer created with zconf_create_buffer()
1893 *
1894 */
1895 void zconf_delete_buffer (YY_BUFFER_STATE b )
1896{
1897
1898 if ( ! b )
1899 return;
1900
1901 if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
1902 YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
1903
1904 if ( b->yy_is_our_buffer )
1905 zconffree((void *) b->yy_ch_buf );
1906
1907 zconffree((void *) b );
1908}
1909
1910/* Initializes or reinitializes a buffer.
1911 * This function is sometimes called more than once on the same buffer,
1912 * such as during a zconfrestart() or at EOF.
1913 */
1914 static void zconf_init_buffer (YY_BUFFER_STATE b, FILE * file )
1915
1916{
1917 int oerrno = errno;
1918
1919 zconf_flush_buffer(b );
1920
1921 b->yy_input_file = file;
1922 b->yy_fill_buffer = 1;
1923
1924 /* If b is the current buffer, then zconf_init_buffer was _probably_
1925 * called from zconfrestart() or through yy_get_next_buffer.
1926 * In that case, we don't want to reset the lineno or column.
1927 */
1928 if (b != YY_CURRENT_BUFFER){
1929 b->yy_bs_lineno = 1;
1930 b->yy_bs_column = 0;
1931 }
1932
1933 b->yy_is_interactive = 0;
1934
1935 errno = oerrno;
1936}
1937
1938/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
1939 * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
1940 *
1941 */
1942 void zconf_flush_buffer (YY_BUFFER_STATE b )
1943{
1944 if ( ! b )
1945 return;
1946
1947 b->yy_n_chars = 0;
1948
1949 /* We always need two end-of-buffer characters. The first causes
1950 * a transition to the end-of-buffer state. The second causes
1951 * a jam in that state.
1952 */
1953 b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
1954 b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
1955
1956 b->yy_buf_pos = &b->yy_ch_buf[0];
1957
1958 b->yy_at_bol = 1;
1959 b->yy_buffer_status = YY_BUFFER_NEW;
1960
1961 if ( b == YY_CURRENT_BUFFER )
1962 zconf_load_buffer_state( );
1963}
1964
1965/** Pushes the new state onto the stack. The new state becomes
1966 * the current state. This function will allocate the stack
1967 * if necessary.
1968 * @param new_buffer The new state.
1969 *
1970 */
1971void zconfpush_buffer_state (YY_BUFFER_STATE new_buffer )
1972{
1973 if (new_buffer == NULL)
1974 return;
1975
1976 zconfensure_buffer_stack();
1977
1978 /* This block is copied from zconf_switch_to_buffer. */
1979 if ( YY_CURRENT_BUFFER )
1980 {
1981 /* Flush out information for old buffer. */
1982 *(yy_c_buf_p) = (yy_hold_char);
1983 YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
1984 YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
1985 }
1986
1987 /* Only push if top exists. Otherwise, replace top. */
1988 if (YY_CURRENT_BUFFER)
1989 (yy_buffer_stack_top)++;
1990 YY_CURRENT_BUFFER_LVALUE = new_buffer;
1991
1992 /* copied from zconf_switch_to_buffer. */
1993 zconf_load_buffer_state( );
1994 (yy_did_buffer_switch_on_eof) = 1;
1995}
1996
1997/** Removes and deletes the top of the stack, if present.
1998 * The next element becomes the new top.
1999 *
2000 */
2001void zconfpop_buffer_state (void)
2002{
2003 if (!YY_CURRENT_BUFFER)
2004 return;
2005
2006 zconf_delete_buffer(YY_CURRENT_BUFFER );
2007 YY_CURRENT_BUFFER_LVALUE = NULL;
2008 if ((yy_buffer_stack_top) > 0)
2009 --(yy_buffer_stack_top);
2010
2011 if (YY_CURRENT_BUFFER) {
2012 zconf_load_buffer_state( );
2013 (yy_did_buffer_switch_on_eof) = 1;
2014 }
2015}
2016
2017/* Allocates the stack if it does not exist.
2018 * Guarantees space for at least one push.
2019 */
2020static void zconfensure_buffer_stack (void)
2021{
2022 int num_to_alloc;
2023
2024 if (!(yy_buffer_stack)) {
2025
2026 /* First allocation is just for 2 elements, since we don't know if this
2027 * scanner will even need a stack. We use 2 instead of 1 to avoid an
2028 * immediate realloc on the next call.
2029 */
2030 num_to_alloc = 1;
2031 (yy_buffer_stack) = (struct yy_buffer_state**)zconfalloc
2032 (num_to_alloc * sizeof(struct yy_buffer_state*)
2033 );
2034 if ( ! (yy_buffer_stack) )
2035 YY_FATAL_ERROR( "out of dynamic memory in zconfensure_buffer_stack()" );
2036
2037 memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
2038
2039 (yy_buffer_stack_max) = num_to_alloc;
2040 (yy_buffer_stack_top) = 0;
2041 return;
2042 }
2043
2044 if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
2045
2046 /* Increase the buffer to prepare for a possible push. */
2047 int grow_size = 8 /* arbitrary grow size */;
2048
2049 num_to_alloc = (yy_buffer_stack_max) + grow_size;
2050 (yy_buffer_stack) = (struct yy_buffer_state**)zconfrealloc
2051 ((yy_buffer_stack),
2052 num_to_alloc * sizeof(struct yy_buffer_state*)
2053 );
2054 if ( ! (yy_buffer_stack) )
2055 YY_FATAL_ERROR( "out of dynamic memory in zconfensure_buffer_stack()" );
2056
2057 /* zero only the new slots.*/
2058 memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
2059 (yy_buffer_stack_max) = num_to_alloc;
2060 }
2061}
2062
2063/** Setup the input buffer state to scan directly from a user-specified character buffer.
2064 * @param base the character buffer
2065 * @param size the size in bytes of the character buffer
2066 *
2067 * @return the newly allocated buffer state object.
2068 */
2069YY_BUFFER_STATE zconf_scan_buffer (char * base, yy_size_t size )
2070{
2071 YY_BUFFER_STATE b;
2072
2073 if ( size < 2 ||
2074 base[size-2] != YY_END_OF_BUFFER_CHAR ||
2075 base[size-1] != YY_END_OF_BUFFER_CHAR )
2076 /* They forgot to leave room for the EOB's. */
2077 return 0;
2078
2079 b = (YY_BUFFER_STATE) zconfalloc(sizeof( struct yy_buffer_state ) );
2080 if ( ! b )
2081 YY_FATAL_ERROR( "out of dynamic memory in zconf_scan_buffer()" );
2082
2083 b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
2084 b->yy_buf_pos = b->yy_ch_buf = base;
2085 b->yy_is_our_buffer = 0;
2086 b->yy_input_file = 0;
2087 b->yy_n_chars = b->yy_buf_size;
2088 b->yy_is_interactive = 0;
2089 b->yy_at_bol = 1;
2090 b->yy_fill_buffer = 0;
2091 b->yy_buffer_status = YY_BUFFER_NEW;
2092
2093 zconf_switch_to_buffer(b );
2094
2095 return b;
2096}
2097
2098/** Setup the input buffer state to scan a string. The next call to zconflex() will
2099 * scan from a @e copy of @a str.
2100 * @param yystr a NUL-terminated string to scan
2101 *
2102 * @return the newly allocated buffer state object.
2103 * @note If you want to scan bytes that may contain NUL values, then use
2104 * zconf_scan_bytes() instead.
2105 */
2106YY_BUFFER_STATE zconf_scan_string (yyconst char * yystr )
2107{
2108
2109 return zconf_scan_bytes(yystr,strlen(yystr) );
2110}
2111
2112/** Setup the input buffer state to scan the given bytes. The next call to zconflex() will
2113 * scan from a @e copy of @a bytes.
2114 * @param yybytes the byte buffer to scan
2115 * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
2116 *
2117 * @return the newly allocated buffer state object.
2118 */
2119YY_BUFFER_STATE zconf_scan_bytes (yyconst char * yybytes, int _yybytes_len )
2120{
2121 YY_BUFFER_STATE b;
2122 char *buf;
2123 yy_size_t n;
2124 int i;
2125
2126 /* Get memory for full buffer, including space for trailing EOB's. */
2127 n = _yybytes_len + 2;
2128 buf = (char *) zconfalloc(n );
2129 if ( ! buf )
2130 YY_FATAL_ERROR( "out of dynamic memory in zconf_scan_bytes()" );
2131
2132 for ( i = 0; i < _yybytes_len; ++i )
2133 buf[i] = yybytes[i];
2134
2135 buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
2136
2137 b = zconf_scan_buffer(buf,n );
2138 if ( ! b )
2139 YY_FATAL_ERROR( "bad buffer in zconf_scan_bytes()" );
2140
2141 /* It's okay to grow etc. this buffer, and we should throw it
2142 * away when we're done.
2143 */
2144 b->yy_is_our_buffer = 1;
2145
2146 return b;
2147}
2148
2149#ifndef YY_EXIT_FAILURE
2150#define YY_EXIT_FAILURE 2
2151#endif
2152
2153static void yy_fatal_error (yyconst char* msg )
2154{
2155 (void) fprintf( stderr, "%s\n", msg );
2156 exit( YY_EXIT_FAILURE );
2157}
2158
2159/* Redefine yyless() so it works in section 3 code. */
2160
2161#undef yyless
2162#define yyless(n) \
2163 do \
2164 { \
2165 /* Undo effects of setting up zconftext. */ \
2166 int yyless_macro_arg = (n); \
2167 YY_LESS_LINENO(yyless_macro_arg);\
2168 zconftext[zconfleng] = (yy_hold_char); \
2169 (yy_c_buf_p) = zconftext + yyless_macro_arg; \
2170 (yy_hold_char) = *(yy_c_buf_p); \
2171 *(yy_c_buf_p) = '\0'; \
2172 zconfleng = yyless_macro_arg; \
2173 } \
2174 while ( 0 )
2175
2176/* Accessor methods (get/set functions) to struct members. */
2177
2178/** Get the current line number.
2179 *
2180 */
2181int zconfget_lineno (void)
2182{
2183
2184 return zconflineno;
2185}
2186
2187/** Get the input stream.
2188 *
2189 */
2190FILE *zconfget_in (void)
2191{
2192 return zconfin;
2193}
2194
2195/** Get the output stream.
2196 *
2197 */
2198FILE *zconfget_out (void)
2199{
2200 return zconfout;
2201}
2202
2203/** Get the length of the current token.
2204 *
2205 */
2206int zconfget_leng (void)
2207{
2208 return zconfleng;
2209}
2210
2211/** Get the current token.
2212 *
2213 */
2214
2215char *zconfget_text (void)
2216{
2217 return zconftext;
2218}
2219
2220/** Set the current line number.
2221 * @param line_number
2222 *
2223 */
2224void zconfset_lineno (int line_number )
2225{
2226
2227 zconflineno = line_number;
2228}
2229
2230/** Set the input stream. This does not discard the current
2231 * input buffer.
2232 * @param in_str A readable stream.
2233 *
2234 * @see zconf_switch_to_buffer
2235 */
2236void zconfset_in (FILE * in_str )
2237{
2238 zconfin = in_str ;
2239}
2240
2241void zconfset_out (FILE * out_str )
2242{
2243 zconfout = out_str ;
2244}
2245
2246int zconfget_debug (void)
2247{
2248 return zconf_flex_debug;
2249}
2250
2251void zconfset_debug (int bdebug )
2252{
2253 zconf_flex_debug = bdebug ;
2254}
2255
2256static int yy_init_globals (void)
2257{
2258 /* Initialization is the same as for the non-reentrant scanner.
2259 * This function is called from zconflex_destroy(), so don't allocate here.
2260 */
2261
2262 (yy_buffer_stack) = 0;
2263 (yy_buffer_stack_top) = 0;
2264 (yy_buffer_stack_max) = 0;
2265 (yy_c_buf_p) = (char *) 0;
2266 (yy_init) = 0;
2267 (yy_start) = 0;
2268
2269/* Defined in main.c */
2270#ifdef YY_STDINIT
2271 zconfin = stdin;
2272 zconfout = stdout;
2273#else
2274 zconfin = (FILE *) 0;
2275 zconfout = (FILE *) 0;
2276#endif
2277
2278 /* For future reference: Set errno on error, since we are called by
2279 * zconflex_init()
2280 */
2281 return 0;
2282}
2283
2284/* zconflex_destroy is for both reentrant and non-reentrant scanners. */
2285int zconflex_destroy (void)
2286{
2287
2288 /* Pop the buffer stack, destroying each element. */
2289 while(YY_CURRENT_BUFFER){
2290 zconf_delete_buffer(YY_CURRENT_BUFFER );
2291 YY_CURRENT_BUFFER_LVALUE = NULL;
2292 zconfpop_buffer_state();
2293 }
2294
2295 /* Destroy the stack itself. */
2296 zconffree((yy_buffer_stack) );
2297 (yy_buffer_stack) = NULL;
2298
2299 /* Reset the globals. This is important in a non-reentrant scanner so the next time
2300 * zconflex() is called, initialization will occur. */
2301 yy_init_globals( );
2302
2303 return 0;
2304}
2305
2306/*
2307 * Internal utility routines.
2308 */
2309
2310#ifndef yytext_ptr
2311static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
2312{
2313 register int i;
2314 for ( i = 0; i < n; ++i )
2315 s1[i] = s2[i];
2316}
2317#endif
2318
2319#ifdef YY_NEED_STRLEN
2320static int yy_flex_strlen (yyconst char * s )
2321{
2322 register int n;
2323 for ( n = 0; s[n]; ++n )
2324 ;
2325
2326 return n;
2327}
2328#endif
2329
2330void *zconfalloc (yy_size_t size )
2331{
2332 return (void *) malloc( size );
2333}
2334
2335void *zconfrealloc (void * ptr, yy_size_t size )
2336{
2337 /* The cast to (char *) in the following accommodates both
2338 * implementations that use char* generic pointers, and those
2339 * that use void* generic pointers. It works with the latter
2340 * because both ANSI C and C++ allow castless assignment from
2341 * any pointer type to void*, and deal with argument conversions
2342 * as though doing an assignment.
2343 */
2344 return (void *) realloc( (char *) ptr, size );
2345}
2346
2347void zconffree (void * ptr )
2348{
2349 free( (char *) ptr ); /* see zconfrealloc() for (char *) cast */
2350}
2351
2352#define YYTABLES_NAME "yytables"
2353
2354void zconf_starthelp(void)
2355{
2356 new_string();
2357 last_ts = first_ts = 0;
2358 BEGIN(HELP);
2359}
2360
2361static void zconf_endhelp(void)
2362{
2363 zconflval.string = text;
2364 BEGIN(INITIAL);
2365}
2366
2367/*
2368 * Try to open specified file with following names:
2369 * ./name
2370 * $(srctree)/name
2371 * The latter is used when srctree is separate from objtree
2372 * when compiling the kernel.
2373 * Return NULL if file is not found.
2374 */
2375FILE *zconf_fopen(const char *name)
2376{
2377 char *env, fullname[PATH_MAX+1];
2378 FILE *f;
2379
2380 f = fopen(name, "r");
2381 if (!f && name != NULL && name[0] != '/') {
2382 env = getenv(SRCTREE);
2383 if (env) {
2384 sprintf(fullname, "%s/%s", env, name);
2385 f = fopen(fullname, "r");
2386 }
2387 }
2388 return f;
2389}
2390
2391void zconf_initscan(const char *name)
2392{
2393 zconfin = zconf_fopen(name);
2394 if (!zconfin) {
2395 printf("can't find file %s\n", name);
2396 exit(1);
2397 }
2398
2399 current_buf = xmalloc(sizeof(*current_buf));
2400 memset(current_buf, 0, sizeof(*current_buf));
2401
2402 current_file = file_lookup(name);
2403 current_file->lineno = 1;
2404}
2405
2406void zconf_nextfile(const char *name)
2407{
2408 struct file *iter;
2409 struct file *file = file_lookup(name);
2410 struct buffer *buf = xmalloc(sizeof(*buf));
2411 memset(buf, 0, sizeof(*buf));
2412
2413 current_buf->state = YY_CURRENT_BUFFER;
2414 zconfin = zconf_fopen(file->name);
2415 if (!zconfin) {
2416 printf("%s:%d: can't open file \"%s\"\n",
2417 zconf_curname(), zconf_lineno(), file->name);
2418 exit(1);
2419 }
2420 zconf_switch_to_buffer(zconf_create_buffer(zconfin,YY_BUF_SIZE));
2421 buf->parent = current_buf;
2422 current_buf = buf;
2423
2424 for (iter = current_file->parent; iter; iter = iter->parent ) {
2425 if (!strcmp(current_file->name,iter->name) ) {
2426 printf("%s:%d: recursive inclusion detected. "
2427 "Inclusion path:\n current file : '%s'\n",
2428 zconf_curname(), zconf_lineno(),
2429 zconf_curname());
2430 iter = current_file->parent;
2431 while (iter && \
2432 strcmp(iter->name,current_file->name)) {
2433 printf(" included from: '%s:%d'\n",
2434 iter->name, iter->lineno-1);
2435 iter = iter->parent;
2436 }
2437 if (iter)
2438 printf(" included from: '%s:%d'\n",
2439 iter->name, iter->lineno+1);
2440 exit(1);
2441 }
2442 }
2443 file->lineno = 1;
2444 file->parent = current_file;
2445 current_file = file;
2446}
2447
2448static void zconf_endfile(void)
2449{
2450 struct buffer *parent;
2451
2452 current_file = current_file->parent;
2453
2454 parent = current_buf->parent;
2455 if (parent) {
2456 fclose(zconfin);
2457 zconf_delete_buffer(YY_CURRENT_BUFFER);
2458 zconf_switch_to_buffer(parent->state);
2459 }
2460 free(current_buf);
2461 current_buf = parent;
2462}
2463
2464int zconf_lineno(void)
2465{
2466 return current_pos.lineno;
2467}
2468
2469const char *zconf_curname(void)
2470{
2471 return current_pos.file ? current_pos.file->name : "<none>";
2472}
2473
diff --git a/scripts/kconfig/zconf.tab.c_shipped b/scripts/kconfig/zconf.tab.c_shipped
deleted file mode 100644
index a22b285d759f..000000000000
--- a/scripts/kconfig/zconf.tab.c_shipped
+++ /dev/null
@@ -1,2471 +0,0 @@
1/* A Bison parser, made by GNU Bison 3.0.4. */
2
3/* Bison implementation for Yacc-like parsers in C
4
5 Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
6
7 This program is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20/* As a special exception, you may create a larger work that contains
21 part or all of the Bison parser skeleton and distribute that work
22 under terms of your choice, so long as that work isn't itself a
23 parser generator using the skeleton or a modified version thereof
24 as a parser skeleton. Alternatively, if you modify or redistribute
25 the parser skeleton itself, you may (at your option) remove this
26 special exception, which will cause the skeleton and the resulting
27 Bison output files to be licensed under the GNU General Public
28 License without this special exception.
29
30 This special exception was added by the Free Software Foundation in
31 version 2.2 of Bison. */
32
33/* C LALR(1) parser skeleton written by Richard Stallman, by
34 simplifying the original so-called "semantic" parser. */
35
36/* All symbols defined below should begin with yy or YY, to avoid
37 infringing on user name space. This should be done even for local
38 variables, as they might otherwise be expanded by user macros.
39 There are some unavoidable exceptions within include files to
40 define necessary library symbols; they are noted "INFRINGES ON
41 USER NAME SPACE" below. */
42
43/* Identify Bison output. */
44#define YYBISON 1
45
46/* Bison version. */
47#define YYBISON_VERSION "3.0.4"
48
49/* Skeleton name. */
50#define YYSKELETON_NAME "yacc.c"
51
52/* Pure parsers. */
53#define YYPURE 0
54
55/* Push parsers. */
56#define YYPUSH 0
57
58/* Pull parsers. */
59#define YYPULL 1
60
61
62/* Substitute the variable and function names. */
63#define yyparse zconfparse
64#define yylex zconflex
65#define yyerror zconferror
66#define yydebug zconfdebug
67#define yynerrs zconfnerrs
68
69#define yylval zconflval
70#define yychar zconfchar
71
72/* Copy the first part of user declarations. */
73
74
75/*
76 * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
77 * Released under the terms of the GNU GPL v2.0.
78 */
79
80#include <ctype.h>
81#include <stdarg.h>
82#include <stdio.h>
83#include <stdlib.h>
84#include <string.h>
85#include <stdbool.h>
86
87#include "lkc.h"
88
89#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)
90
91#define PRINTD 0x0001
92#define DEBUG_PARSE 0x0002
93
94int cdebug = PRINTD;
95
96extern int zconflex(void);
97static void zconfprint(const char *err, ...);
98static void zconf_error(const char *err, ...);
99static void zconferror(const char *err);
100static bool zconf_endtoken(const struct kconf_id *id, int starttoken, int endtoken);
101
102struct symbol *symbol_hash[SYMBOL_HASHSIZE];
103
104static struct menu *current_menu, *current_entry;
105
106
107
108
109# ifndef YY_NULLPTR
110# if defined __cplusplus && 201103L <= __cplusplus
111# define YY_NULLPTR nullptr
112# else
113# define YY_NULLPTR 0
114# endif
115# endif
116
117/* Enabling verbose error messages. */
118#ifdef YYERROR_VERBOSE
119# undef YYERROR_VERBOSE
120# define YYERROR_VERBOSE 1
121#else
122# define YYERROR_VERBOSE 0
123#endif
124
125
126/* Debug traces. */
127#ifndef YYDEBUG
128# define YYDEBUG 1
129#endif
130#if YYDEBUG
131extern int zconfdebug;
132#endif
133
134/* Token type. */
135#ifndef YYTOKENTYPE
136# define YYTOKENTYPE
137 enum yytokentype
138 {
139 T_MAINMENU = 258,
140 T_MENU = 259,
141 T_ENDMENU = 260,
142 T_SOURCE = 261,
143 T_CHOICE = 262,
144 T_ENDCHOICE = 263,
145 T_COMMENT = 264,
146 T_CONFIG = 265,
147 T_MENUCONFIG = 266,
148 T_HELP = 267,
149 T_HELPTEXT = 268,
150 T_IF = 269,
151 T_ENDIF = 270,
152 T_DEPENDS = 271,
153 T_OPTIONAL = 272,
154 T_PROMPT = 273,
155 T_TYPE = 274,
156 T_DEFAULT = 275,
157 T_SELECT = 276,
158 T_IMPLY = 277,
159 T_RANGE = 278,
160 T_VISIBLE = 279,
161 T_OPTION = 280,
162 T_ON = 281,
163 T_WORD = 282,
164 T_WORD_QUOTE = 283,
165 T_UNEQUAL = 284,
166 T_LESS = 285,
167 T_LESS_EQUAL = 286,
168 T_GREATER = 287,
169 T_GREATER_EQUAL = 288,
170 T_CLOSE_PAREN = 289,
171 T_OPEN_PAREN = 290,
172 T_EOL = 291,
173 T_OR = 292,
174 T_AND = 293,
175 T_EQUAL = 294,
176 T_NOT = 295
177 };
178#endif
179
180/* Value type. */
181#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
182
183union YYSTYPE
184{
185
186
187 char *string;
188 struct file *file;
189 struct symbol *symbol;
190 struct expr *expr;
191 struct menu *menu;
192 const struct kconf_id *id;
193
194
195};
196
197typedef union YYSTYPE YYSTYPE;
198# define YYSTYPE_IS_TRIVIAL 1
199# define YYSTYPE_IS_DECLARED 1
200#endif
201
202
203extern YYSTYPE zconflval;
204
205int zconfparse (void);
206
207
208
209/* Copy the second part of user declarations. */
210
211
212/* Include kconf_id.c here so it can see the token constants. */
213#include "kconf_id.c"
214
215
216
217#ifdef short
218# undef short
219#endif
220
221#ifdef YYTYPE_UINT8
222typedef YYTYPE_UINT8 yytype_uint8;
223#else
224typedef unsigned char yytype_uint8;
225#endif
226
227#ifdef YYTYPE_INT8
228typedef YYTYPE_INT8 yytype_int8;
229#else
230typedef signed char yytype_int8;
231#endif
232
233#ifdef YYTYPE_UINT16
234typedef YYTYPE_UINT16 yytype_uint16;
235#else
236typedef unsigned short int yytype_uint16;
237#endif
238
239#ifdef YYTYPE_INT16
240typedef YYTYPE_INT16 yytype_int16;
241#else
242typedef short int yytype_int16;
243#endif
244
245#ifndef YYSIZE_T
246# ifdef __SIZE_TYPE__
247# define YYSIZE_T __SIZE_TYPE__
248# elif defined size_t
249# define YYSIZE_T size_t
250# elif ! defined YYSIZE_T
251# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
252# define YYSIZE_T size_t
253# else
254# define YYSIZE_T unsigned int
255# endif
256#endif
257
258#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
259
260#ifndef YY_
261# if defined YYENABLE_NLS && YYENABLE_NLS
262# if ENABLE_NLS
263# include <libintl.h> /* INFRINGES ON USER NAME SPACE */
264# define YY_(Msgid) dgettext ("bison-runtime", Msgid)
265# endif
266# endif
267# ifndef YY_
268# define YY_(Msgid) Msgid
269# endif
270#endif
271
272#ifndef YY_ATTRIBUTE
273# if (defined __GNUC__ \
274 && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \
275 || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C
276# define YY_ATTRIBUTE(Spec) __attribute__(Spec)
277# else
278# define YY_ATTRIBUTE(Spec) /* empty */
279# endif
280#endif
281
282#ifndef YY_ATTRIBUTE_PURE
283# define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__))
284#endif
285
286#ifndef YY_ATTRIBUTE_UNUSED
287# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__))
288#endif
289
290#if !defined _Noreturn \
291 && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112)
292# if defined _MSC_VER && 1200 <= _MSC_VER
293# define _Noreturn __declspec (noreturn)
294# else
295# define _Noreturn YY_ATTRIBUTE ((__noreturn__))
296# endif
297#endif
298
299/* Suppress unused-variable warnings by "using" E. */
300#if ! defined lint || defined __GNUC__
301# define YYUSE(E) ((void) (E))
302#else
303# define YYUSE(E) /* empty */
304#endif
305
306#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
307/* Suppress an incorrect diagnostic about yylval being uninitialized. */
308# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
309 _Pragma ("GCC diagnostic push") \
310 _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\
311 _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
312# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
313 _Pragma ("GCC diagnostic pop")
314#else
315# define YY_INITIAL_VALUE(Value) Value
316#endif
317#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
318# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
319# define YY_IGNORE_MAYBE_UNINITIALIZED_END
320#endif
321#ifndef YY_INITIAL_VALUE
322# define YY_INITIAL_VALUE(Value) /* Nothing. */
323#endif
324
325
326#if ! defined yyoverflow || YYERROR_VERBOSE
327
328/* The parser invokes alloca or malloc; define the necessary symbols. */
329
330# ifdef YYSTACK_USE_ALLOCA
331# if YYSTACK_USE_ALLOCA
332# ifdef __GNUC__
333# define YYSTACK_ALLOC __builtin_alloca
334# elif defined __BUILTIN_VA_ARG_INCR
335# include <alloca.h> /* INFRINGES ON USER NAME SPACE */
336# elif defined _AIX
337# define YYSTACK_ALLOC __alloca
338# elif defined _MSC_VER
339# include <malloc.h> /* INFRINGES ON USER NAME SPACE */
340# define alloca _alloca
341# else
342# define YYSTACK_ALLOC alloca
343# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS
344# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
345 /* Use EXIT_SUCCESS as a witness for stdlib.h. */
346# ifndef EXIT_SUCCESS
347# define EXIT_SUCCESS 0
348# endif
349# endif
350# endif
351# endif
352# endif
353
354# ifdef YYSTACK_ALLOC
355 /* Pacify GCC's 'empty if-body' warning. */
356# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
357# ifndef YYSTACK_ALLOC_MAXIMUM
358 /* The OS might guarantee only one guard page at the bottom of the stack,
359 and a page size can be as small as 4096 bytes. So we cannot safely
360 invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
361 to allow for a few compiler-allocated temporary stack slots. */
362# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
363# endif
364# else
365# define YYSTACK_ALLOC YYMALLOC
366# define YYSTACK_FREE YYFREE
367# ifndef YYSTACK_ALLOC_MAXIMUM
368# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
369# endif
370# if (defined __cplusplus && ! defined EXIT_SUCCESS \
371 && ! ((defined YYMALLOC || defined malloc) \
372 && (defined YYFREE || defined free)))
373# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
374# ifndef EXIT_SUCCESS
375# define EXIT_SUCCESS 0
376# endif
377# endif
378# ifndef YYMALLOC
379# define YYMALLOC malloc
380# if ! defined malloc && ! defined EXIT_SUCCESS
381void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
382# endif
383# endif
384# ifndef YYFREE
385# define YYFREE free
386# if ! defined free && ! defined EXIT_SUCCESS
387void free (void *); /* INFRINGES ON USER NAME SPACE */
388# endif
389# endif
390# endif
391#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
392
393
394#if (! defined yyoverflow \
395 && (! defined __cplusplus \
396 || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
397
398/* A type that is properly aligned for any stack member. */
399union yyalloc
400{
401 yytype_int16 yyss_alloc;
402 YYSTYPE yyvs_alloc;
403};
404
405/* The size of the maximum gap between one aligned stack and the next. */
406# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
407
408/* The size of an array large to enough to hold all stacks, each with
409 N elements. */
410# define YYSTACK_BYTES(N) \
411 ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
412 + YYSTACK_GAP_MAXIMUM)
413
414# define YYCOPY_NEEDED 1
415
416/* Relocate STACK from its old location to the new one. The
417 local variables YYSIZE and YYSTACKSIZE give the old and new number of
418 elements in the stack, and YYPTR gives the new location of the
419 stack. Advance YYPTR to a properly aligned location for the next
420 stack. */
421# define YYSTACK_RELOCATE(Stack_alloc, Stack) \
422 do \
423 { \
424 YYSIZE_T yynewbytes; \
425 YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \
426 Stack = &yyptr->Stack_alloc; \
427 yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
428 yyptr += yynewbytes / sizeof (*yyptr); \
429 } \
430 while (0)
431
432#endif
433
434#if defined YYCOPY_NEEDED && YYCOPY_NEEDED
435/* Copy COUNT objects from SRC to DST. The source and destination do
436 not overlap. */
437# ifndef YYCOPY
438# if defined __GNUC__ && 1 < __GNUC__
439# define YYCOPY(Dst, Src, Count) \
440 __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src)))
441# else
442# define YYCOPY(Dst, Src, Count) \
443 do \
444 { \
445 YYSIZE_T yyi; \
446 for (yyi = 0; yyi < (Count); yyi++) \
447 (Dst)[yyi] = (Src)[yyi]; \
448 } \
449 while (0)
450# endif
451# endif
452#endif /* !YYCOPY_NEEDED */
453
454/* YYFINAL -- State number of the termination state. */
455#define YYFINAL 11
456/* YYLAST -- Last index in YYTABLE. */
457#define YYLAST 301
458
459/* YYNTOKENS -- Number of terminals. */
460#define YYNTOKENS 41
461/* YYNNTS -- Number of nonterminals. */
462#define YYNNTS 50
463/* YYNRULES -- Number of rules. */
464#define YYNRULES 124
465/* YYNSTATES -- Number of states. */
466#define YYNSTATES 204
467
468/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
469 by yylex, with out-of-bounds checking. */
470#define YYUNDEFTOK 2
471#define YYMAXUTOK 295
472
473#define YYTRANSLATE(YYX) \
474 ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
475
476/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
477 as returned by yylex, without out-of-bounds checking. */
478static const yytype_uint8 yytranslate[] =
479{
480 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
481 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
482 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
483 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
484 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
485 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
486 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
487 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
488 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
489 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
490 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
491 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
492 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
493 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
494 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
495 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
496 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
497 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
498 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
499 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
500 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
501 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
502 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
503 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
504 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
505 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
506 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
507 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
508 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
509 35, 36, 37, 38, 39, 40
510};
511
512#if YYDEBUG
513 /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
514static const yytype_uint16 yyrline[] =
515{
516 0, 109, 109, 109, 111, 111, 113, 115, 116, 117,
517 118, 119, 120, 124, 128, 128, 128, 128, 128, 128,
518 128, 128, 128, 132, 133, 134, 135, 136, 137, 141,
519 142, 148, 156, 162, 170, 180, 182, 183, 184, 185,
520 186, 187, 190, 198, 204, 214, 220, 226, 232, 235,
521 237, 248, 249, 254, 263, 268, 276, 279, 281, 282,
522 283, 284, 285, 288, 294, 305, 311, 321, 323, 328,
523 336, 344, 347, 349, 350, 351, 356, 363, 370, 375,
524 383, 386, 388, 389, 390, 393, 401, 408, 415, 421,
525 428, 430, 431, 432, 435, 443, 445, 446, 449, 456,
526 458, 463, 464, 467, 468, 469, 473, 474, 477, 478,
527 481, 482, 483, 484, 485, 486, 487, 488, 489, 490,
528 491, 494, 495, 498, 499
529};
530#endif
531
532#if YYDEBUG || YYERROR_VERBOSE || 0
533/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
534 First, the terminals, then, starting at YYNTOKENS, nonterminals. */
535static const char *const yytname[] =
536{
537 "$end", "error", "$undefined", "T_MAINMENU", "T_MENU", "T_ENDMENU",
538 "T_SOURCE", "T_CHOICE", "T_ENDCHOICE", "T_COMMENT", "T_CONFIG",
539 "T_MENUCONFIG", "T_HELP", "T_HELPTEXT", "T_IF", "T_ENDIF", "T_DEPENDS",
540 "T_OPTIONAL", "T_PROMPT", "T_TYPE", "T_DEFAULT", "T_SELECT", "T_IMPLY",
541 "T_RANGE", "T_VISIBLE", "T_OPTION", "T_ON", "T_WORD", "T_WORD_QUOTE",
542 "T_UNEQUAL", "T_LESS", "T_LESS_EQUAL", "T_GREATER", "T_GREATER_EQUAL",
543 "T_CLOSE_PAREN", "T_OPEN_PAREN", "T_EOL", "T_OR", "T_AND", "T_EQUAL",
544 "T_NOT", "$accept", "input", "start", "stmt_list", "option_name",
545 "common_stmt", "option_error", "config_entry_start", "config_stmt",
546 "menuconfig_entry_start", "menuconfig_stmt", "config_option_list",
547 "config_option", "symbol_option", "symbol_option_list",
548 "symbol_option_arg", "choice", "choice_entry", "choice_end",
549 "choice_stmt", "choice_option_list", "choice_option", "choice_block",
550 "if_entry", "if_end", "if_stmt", "if_block", "mainmenu_stmt", "menu",
551 "menu_entry", "menu_end", "menu_stmt", "menu_block", "source_stmt",
552 "comment", "comment_stmt", "help_start", "help", "depends_list",
553 "depends", "visibility_list", "visible", "prompt_stmt_opt", "prompt",
554 "end", "nl", "if_expr", "expr", "symbol", "word_opt", YY_NULLPTR
555};
556#endif
557
558# ifdef YYPRINT
559/* YYTOKNUM[NUM] -- (External) token number corresponding to the
560 (internal) symbol number NUM (which must be that of a token). */
561static const yytype_uint16 yytoknum[] =
562{
563 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
564 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
565 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
566 285, 286, 287, 288, 289, 290, 291, 292, 293, 294,
567 295
568};
569# endif
570
571#define YYPACT_NINF -92
572
573#define yypact_value_is_default(Yystate) \
574 (!!((Yystate) == (-92)))
575
576#define YYTABLE_NINF -88
577
578#define yytable_value_is_error(Yytable_value) \
579 0
580
581 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
582 STATE-NUM. */
583static const yytype_int16 yypact[] =
584{
585 17, 41, -92, 15, -92, 150, -92, 19, -92, -92,
586 -13, -92, 28, 41, 38, 41, 50, 47, 41, 79,
587 82, 44, 76, -92, -92, -92, -92, -92, -92, -92,
588 -92, -92, 118, -92, 129, -92, -92, -92, -92, -92,
589 -92, -92, -92, -92, -92, -92, -92, -92, -92, -92,
590 -92, -92, 184, -92, -92, 107, -92, 111, -92, 113,
591 -92, 116, -92, 139, 140, 151, -92, -92, 44, 44,
592 142, 256, -92, 160, 173, 27, 117, 80, 51, 255,
593 -15, 255, 217, -92, -92, -92, -92, -92, -92, -8,
594 -92, 44, 44, 107, 87, 87, 87, 87, 87, 87,
595 -92, -92, 174, 176, 187, 41, 41, 44, 188, 189,
596 87, -92, 213, -92, -92, -92, -92, 206, -92, -92,
597 193, 41, 41, 203, -92, -92, -92, -92, -92, -92,
598 -92, -92, -92, -92, -92, -92, -92, 229, -92, 241,
599 -92, -92, -92, -92, -92, -92, -92, -92, -92, -92,
600 216, -92, -92, -92, -92, -92, -92, -92, -92, -92,
601 44, 229, 222, 229, 64, 229, 229, 87, 31, 231,
602 -92, -92, 229, 236, 229, 44, -92, 145, 242, -92,
603 -92, 243, 244, 245, 229, 251, -92, -92, 247, -92,
604 257, 125, -92, -92, -92, -92, -92, 260, 41, -92,
605 -92, -92, -92, -92
606};
607
608 /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
609 Performed when YYTABLE does not specify something else to do. Zero
610 means the default is an error. */
611static const yytype_uint8 yydefact[] =
612{
613 6, 0, 106, 0, 3, 0, 6, 6, 101, 102,
614 0, 1, 0, 0, 0, 0, 123, 0, 0, 0,
615 0, 0, 0, 14, 19, 15, 16, 21, 17, 18,
616 20, 22, 0, 23, 0, 7, 35, 26, 35, 27,
617 57, 67, 8, 72, 24, 95, 81, 9, 28, 90,
618 25, 10, 0, 107, 2, 76, 13, 0, 103, 0,
619 124, 0, 104, 0, 0, 0, 121, 122, 0, 0,
620 0, 110, 105, 0, 0, 0, 0, 0, 0, 0,
621 90, 0, 0, 77, 85, 53, 86, 31, 33, 0,
622 118, 0, 0, 69, 0, 0, 0, 0, 0, 0,
623 11, 12, 0, 0, 0, 0, 99, 0, 0, 0,
624 0, 49, 0, 41, 40, 36, 37, 0, 39, 38,
625 0, 0, 99, 0, 61, 62, 58, 60, 59, 68,
626 56, 55, 73, 75, 71, 74, 70, 108, 97, 0,
627 96, 82, 84, 80, 83, 79, 92, 93, 91, 117,
628 119, 120, 116, 111, 112, 113, 114, 115, 30, 88,
629 0, 108, 0, 108, 108, 108, 108, 0, 0, 0,
630 89, 65, 108, 0, 108, 0, 98, 0, 0, 42,
631 100, 0, 0, 0, 108, 51, 48, 29, 0, 64,
632 0, 109, 94, 43, 44, 45, 46, 0, 0, 50,
633 63, 66, 47, 52
634};
635
636 /* YYPGOTO[NTERM-NUM]. */
637static const yytype_int16 yypgoto[] =
638{
639 -92, -92, 285, 291, -92, 32, -66, -92, -92, -92,
640 -92, 261, -92, -92, -92, -92, -92, -92, -92, 1,
641 -92, -92, -92, -92, -92, -92, -92, -92, -92, -92,
642 -92, 24, -92, -92, -92, -92, -92, 221, 220, -64,
643 -92, -92, 179, -1, 67, 0, 110, -67, -91, -92
644};
645
646 /* YYDEFGOTO[NTERM-NUM]. */
647static const yytype_int16 yydefgoto[] =
648{
649 -1, 3, 4, 5, 34, 35, 114, 36, 37, 38,
650 39, 75, 115, 116, 168, 199, 40, 41, 130, 42,
651 77, 126, 78, 43, 134, 44, 79, 6, 45, 46,
652 143, 47, 81, 48, 49, 50, 117, 118, 82, 119,
653 80, 140, 162, 163, 51, 7, 176, 70, 71, 61
654};
655
656 /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
657 positive, shift that token. If negative, reduce the rule whose
658 number is the opposite. If YYTABLE_NINF, syntax error. */
659static const yytype_int16 yytable[] =
660{
661 10, 89, 90, 152, 153, 154, 155, 156, 157, 137,
662 55, 125, 57, 128, 59, 11, 147, 63, 148, 167,
663 1, 138, 1, 2, 150, 151, 149, -32, 102, 91,
664 92, -32, -32, -32, -32, -32, -32, -32, -32, 103,
665 164, -32, -32, 104, -32, 105, 106, 107, 108, 109,
666 110, -32, 111, 2, 112, 53, 14, 15, 185, 17,
667 18, 19, 20, 113, 56, 21, 22, 186, 8, 9,
668 93, 66, 67, 147, 58, 148, 184, 60, 175, 68,
669 133, 102, 142, 62, 69, -54, -54, 33, -54, -54,
670 -54, -54, 103, 177, -54, -54, 104, 120, 121, 122,
671 123, 91, 92, 135, 161, 144, 64, 112, 191, 65,
672 129, 132, 72, 141, 66, 67, 124, -34, 102, 73,
673 172, -34, -34, -34, -34, -34, -34, -34, -34, 103,
674 74, -34, -34, 104, -34, 105, 106, 107, 108, 109,
675 110, -34, 111, 53, 112, 131, 136, 83, 145, 84,
676 -5, 12, 85, 113, 13, 14, 15, 16, 17, 18,
677 19, 20, 91, 92, 21, 22, 23, 24, 25, 26,
678 27, 28, 29, 30, 31, 86, 87, 32, 2, 91,
679 92, 192, 91, 92, -4, 12, 33, 88, 13, 14,
680 15, 16, 17, 18, 19, 20, 100, 203, 21, 22,
681 23, 24, 25, 26, 27, 28, 29, 30, 31, 101,
682 158, 32, 159, 160, 169, 165, 166, -87, 102, 170,
683 33, -87, -87, -87, -87, -87, -87, -87, -87, 171,
684 174, -87, -87, 104, -87, -87, -87, -87, -87, -87,
685 -87, -87, 102, 175, 112, -78, -78, -78, -78, -78,
686 -78, -78, -78, 146, 92, -78, -78, 104, 179, 13,
687 14, 15, 16, 17, 18, 19, 20, 187, 112, 21,
688 22, 178, 189, 180, 181, 182, 183, 146, 193, 194,
689 195, 196, 188, 200, 190, 94, 95, 96, 97, 98,
690 198, 33, 54, 201, 197, 99, 202, 52, 127, 76,
691 139, 173
692};
693
694static const yytype_uint8 yycheck[] =
695{
696 1, 68, 69, 94, 95, 96, 97, 98, 99, 24,
697 10, 77, 13, 77, 15, 0, 82, 18, 82, 110,
698 3, 36, 3, 36, 91, 92, 34, 0, 1, 37,
699 38, 4, 5, 6, 7, 8, 9, 10, 11, 12,
700 107, 14, 15, 16, 17, 18, 19, 20, 21, 22,
701 23, 24, 25, 36, 27, 36, 5, 6, 27, 8,
702 9, 10, 11, 36, 36, 14, 15, 36, 27, 28,
703 70, 27, 28, 139, 36, 139, 167, 27, 14, 35,
704 79, 1, 81, 36, 40, 5, 6, 36, 8, 9,
705 10, 11, 12, 160, 14, 15, 16, 17, 18, 19,
706 20, 37, 38, 79, 105, 81, 27, 27, 175, 27,
707 78, 79, 36, 81, 27, 28, 36, 0, 1, 1,
708 121, 4, 5, 6, 7, 8, 9, 10, 11, 12,
709 1, 14, 15, 16, 17, 18, 19, 20, 21, 22,
710 23, 24, 25, 36, 27, 78, 79, 36, 81, 36,
711 0, 1, 36, 36, 4, 5, 6, 7, 8, 9,
712 10, 11, 37, 38, 14, 15, 16, 17, 18, 19,
713 20, 21, 22, 23, 24, 36, 36, 27, 36, 37,
714 38, 36, 37, 38, 0, 1, 36, 36, 4, 5,
715 6, 7, 8, 9, 10, 11, 36, 198, 14, 15,
716 16, 17, 18, 19, 20, 21, 22, 23, 24, 36,
717 36, 27, 36, 26, 1, 27, 27, 0, 1, 13,
718 36, 4, 5, 6, 7, 8, 9, 10, 11, 36,
719 27, 14, 15, 16, 17, 18, 19, 20, 21, 22,
720 23, 24, 1, 14, 27, 4, 5, 6, 7, 8,
721 9, 10, 11, 36, 38, 14, 15, 16, 36, 4,
722 5, 6, 7, 8, 9, 10, 11, 36, 27, 14,
723 15, 161, 36, 163, 164, 165, 166, 36, 36, 36,
724 36, 36, 172, 36, 174, 29, 30, 31, 32, 33,
725 39, 36, 7, 36, 184, 39, 36, 6, 77, 38,
726 80, 122
727};
728
729 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
730 symbol of state STATE-NUM. */
731static const yytype_uint8 yystos[] =
732{
733 0, 3, 36, 42, 43, 44, 68, 86, 27, 28,
734 84, 0, 1, 4, 5, 6, 7, 8, 9, 10,
735 11, 14, 15, 16, 17, 18, 19, 20, 21, 22,
736 23, 24, 27, 36, 45, 46, 48, 49, 50, 51,
737 57, 58, 60, 64, 66, 69, 70, 72, 74, 75,
738 76, 85, 44, 36, 43, 86, 36, 84, 36, 84,
739 27, 90, 36, 84, 27, 27, 27, 28, 35, 40,
740 88, 89, 36, 1, 1, 52, 52, 61, 63, 67,
741 81, 73, 79, 36, 36, 36, 36, 36, 36, 88,
742 88, 37, 38, 86, 29, 30, 31, 32, 33, 39,
743 36, 36, 1, 12, 16, 18, 19, 20, 21, 22,
744 23, 25, 27, 36, 47, 53, 54, 77, 78, 80,
745 17, 18, 19, 20, 36, 47, 62, 78, 80, 46,
746 59, 85, 46, 60, 65, 72, 85, 24, 36, 79,
747 82, 46, 60, 71, 72, 85, 36, 47, 80, 34,
748 88, 88, 89, 89, 89, 89, 89, 89, 36, 36,
749 26, 84, 83, 84, 88, 27, 27, 89, 55, 1,
750 13, 36, 84, 83, 27, 14, 87, 88, 87, 36,
751 87, 87, 87, 87, 89, 27, 36, 36, 87, 36,
752 87, 88, 36, 36, 36, 36, 36, 87, 39, 56,
753 36, 36, 36, 84
754};
755
756 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
757static const yytype_uint8 yyr1[] =
758{
759 0, 41, 42, 42, 43, 43, 44, 44, 44, 44,
760 44, 44, 44, 44, 45, 45, 45, 45, 45, 45,
761 45, 45, 45, 46, 46, 46, 46, 46, 46, 47,
762 47, 48, 49, 50, 51, 52, 52, 52, 52, 52,
763 52, 52, 53, 53, 53, 53, 53, 53, 54, 55,
764 55, 56, 56, 57, 58, 59, 60, 61, 61, 61,
765 61, 61, 61, 62, 62, 62, 62, 63, 63, 64,
766 65, 66, 67, 67, 67, 67, 68, 69, 70, 71,
767 72, 73, 73, 73, 73, 74, 75, 76, 77, 78,
768 79, 79, 79, 79, 80, 81, 81, 81, 82, 83,
769 83, 84, 84, 85, 85, 85, 86, 86, 87, 87,
770 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
771 88, 89, 89, 90, 90
772};
773
774 /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */
775static const yytype_uint8 yyr2[] =
776{
777 0, 2, 2, 1, 2, 1, 0, 2, 2, 2,
778 2, 4, 4, 3, 1, 1, 1, 1, 1, 1,
779 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
780 2, 3, 2, 3, 2, 0, 2, 2, 2, 2,
781 2, 2, 3, 4, 4, 4, 4, 5, 3, 0,
782 3, 0, 2, 3, 2, 1, 3, 0, 2, 2,
783 2, 2, 2, 4, 3, 2, 4, 0, 2, 3,
784 1, 3, 0, 2, 2, 2, 3, 3, 3, 1,
785 3, 0, 2, 2, 2, 3, 3, 2, 2, 2,
786 0, 2, 2, 2, 4, 0, 2, 2, 2, 0,
787 2, 1, 1, 2, 2, 2, 1, 2, 0, 2,
788 1, 3, 3, 3, 3, 3, 3, 3, 2, 3,
789 3, 1, 1, 0, 1
790};
791
792
793#define yyerrok (yyerrstatus = 0)
794#define yyclearin (yychar = YYEMPTY)
795#define YYEMPTY (-2)
796#define YYEOF 0
797
798#define YYACCEPT goto yyacceptlab
799#define YYABORT goto yyabortlab
800#define YYERROR goto yyerrorlab
801
802
803#define YYRECOVERING() (!!yyerrstatus)
804
805#define YYBACKUP(Token, Value) \
806do \
807 if (yychar == YYEMPTY) \
808 { \
809 yychar = (Token); \
810 yylval = (Value); \
811 YYPOPSTACK (yylen); \
812 yystate = *yyssp; \
813 goto yybackup; \
814 } \
815 else \
816 { \
817 yyerror (YY_("syntax error: cannot back up")); \
818 YYERROR; \
819 } \
820while (0)
821
822/* Error token number */
823#define YYTERROR 1
824#define YYERRCODE 256
825
826
827
828/* Enable debugging if requested. */
829#if YYDEBUG
830
831# ifndef YYFPRINTF
832# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
833# define YYFPRINTF fprintf
834# endif
835
836# define YYDPRINTF(Args) \
837do { \
838 if (yydebug) \
839 YYFPRINTF Args; \
840} while (0)
841
842/* This macro is provided for backward compatibility. */
843#ifndef YY_LOCATION_PRINT
844# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
845#endif
846
847
848# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
849do { \
850 if (yydebug) \
851 { \
852 YYFPRINTF (stderr, "%s ", Title); \
853 yy_symbol_print (stderr, \
854 Type, Value); \
855 YYFPRINTF (stderr, "\n"); \
856 } \
857} while (0)
858
859
860/*----------------------------------------.
861| Print this symbol's value on YYOUTPUT. |
862`----------------------------------------*/
863
864static void
865yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
866{
867 FILE *yyo = yyoutput;
868 YYUSE (yyo);
869 if (!yyvaluep)
870 return;
871# ifdef YYPRINT
872 if (yytype < YYNTOKENS)
873 YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
874# endif
875 YYUSE (yytype);
876}
877
878
879/*--------------------------------.
880| Print this symbol on YYOUTPUT. |
881`--------------------------------*/
882
883static void
884yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
885{
886 YYFPRINTF (yyoutput, "%s %s (",
887 yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]);
888
889 yy_symbol_value_print (yyoutput, yytype, yyvaluep);
890 YYFPRINTF (yyoutput, ")");
891}
892
893/*------------------------------------------------------------------.
894| yy_stack_print -- Print the state stack from its BOTTOM up to its |
895| TOP (included). |
896`------------------------------------------------------------------*/
897
898static void
899yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
900{
901 YYFPRINTF (stderr, "Stack now");
902 for (; yybottom <= yytop; yybottom++)
903 {
904 int yybot = *yybottom;
905 YYFPRINTF (stderr, " %d", yybot);
906 }
907 YYFPRINTF (stderr, "\n");
908}
909
910# define YY_STACK_PRINT(Bottom, Top) \
911do { \
912 if (yydebug) \
913 yy_stack_print ((Bottom), (Top)); \
914} while (0)
915
916
917/*------------------------------------------------.
918| Report that the YYRULE is going to be reduced. |
919`------------------------------------------------*/
920
921static void
922yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule)
923{
924 unsigned long int yylno = yyrline[yyrule];
925 int yynrhs = yyr2[yyrule];
926 int yyi;
927 YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
928 yyrule - 1, yylno);
929 /* The symbols being reduced. */
930 for (yyi = 0; yyi < yynrhs; yyi++)
931 {
932 YYFPRINTF (stderr, " $%d = ", yyi + 1);
933 yy_symbol_print (stderr,
934 yystos[yyssp[yyi + 1 - yynrhs]],
935 &(yyvsp[(yyi + 1) - (yynrhs)])
936 );
937 YYFPRINTF (stderr, "\n");
938 }
939}
940
941# define YY_REDUCE_PRINT(Rule) \
942do { \
943 if (yydebug) \
944 yy_reduce_print (yyssp, yyvsp, Rule); \
945} while (0)
946
947/* Nonzero means print parse trace. It is left uninitialized so that
948 multiple parsers can coexist. */
949int yydebug;
950#else /* !YYDEBUG */
951# define YYDPRINTF(Args)
952# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
953# define YY_STACK_PRINT(Bottom, Top)
954# define YY_REDUCE_PRINT(Rule)
955#endif /* !YYDEBUG */
956
957
958/* YYINITDEPTH -- initial size of the parser's stacks. */
959#ifndef YYINITDEPTH
960# define YYINITDEPTH 200
961#endif
962
963/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
964 if the built-in stack extension method is used).
965
966 Do not make this value too large; the results are undefined if
967 YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
968 evaluated with infinite-precision integer arithmetic. */
969
970#ifndef YYMAXDEPTH
971# define YYMAXDEPTH 10000
972#endif
973
974
975#if YYERROR_VERBOSE
976
977# ifndef yystrlen
978# if defined __GLIBC__ && defined _STRING_H
979# define yystrlen strlen
980# else
981/* Return the length of YYSTR. */
982static YYSIZE_T
983yystrlen (const char *yystr)
984{
985 YYSIZE_T yylen;
986 for (yylen = 0; yystr[yylen]; yylen++)
987 continue;
988 return yylen;
989}
990# endif
991# endif
992
993# ifndef yystpcpy
994# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
995# define yystpcpy stpcpy
996# else
997/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
998 YYDEST. */
999static char *
1000yystpcpy (char *yydest, const char *yysrc)
1001{
1002 char *yyd = yydest;
1003 const char *yys = yysrc;
1004
1005 while ((*yyd++ = *yys++) != '\0')
1006 continue;
1007
1008 return yyd - 1;
1009}
1010# endif
1011# endif
1012
1013# ifndef yytnamerr
1014/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
1015 quotes and backslashes, so that it's suitable for yyerror. The
1016 heuristic is that double-quoting is unnecessary unless the string
1017 contains an apostrophe, a comma, or backslash (other than
1018 backslash-backslash). YYSTR is taken from yytname. If YYRES is
1019 null, do not copy; instead, return the length of what the result
1020 would have been. */
1021static YYSIZE_T
1022yytnamerr (char *yyres, const char *yystr)
1023{
1024 if (*yystr == '"')
1025 {
1026 YYSIZE_T yyn = 0;
1027 char const *yyp = yystr;
1028
1029 for (;;)
1030 switch (*++yyp)
1031 {
1032 case '\'':
1033 case ',':
1034 goto do_not_strip_quotes;
1035
1036 case '\\':
1037 if (*++yyp != '\\')
1038 goto do_not_strip_quotes;
1039 /* Fall through. */
1040 default:
1041 if (yyres)
1042 yyres[yyn] = *yyp;
1043 yyn++;
1044 break;
1045
1046 case '"':
1047 if (yyres)
1048 yyres[yyn] = '\0';
1049 return yyn;
1050 }
1051 do_not_strip_quotes: ;
1052 }
1053
1054 if (! yyres)
1055 return yystrlen (yystr);
1056
1057 return yystpcpy (yyres, yystr) - yyres;
1058}
1059# endif
1060
1061/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message
1062 about the unexpected token YYTOKEN for the state stack whose top is
1063 YYSSP.
1064
1065 Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is
1066 not large enough to hold the message. In that case, also set
1067 *YYMSG_ALLOC to the required number of bytes. Return 2 if the
1068 required number of bytes is too large to store. */
1069static int
1070yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
1071 yytype_int16 *yyssp, int yytoken)
1072{
1073 YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]);
1074 YYSIZE_T yysize = yysize0;
1075 enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
1076 /* Internationalized format string. */
1077 const char *yyformat = YY_NULLPTR;
1078 /* Arguments of yyformat. */
1079 char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
1080 /* Number of reported tokens (one for the "unexpected", one per
1081 "expected"). */
1082 int yycount = 0;
1083
1084 /* There are many possibilities here to consider:
1085 - If this state is a consistent state with a default action, then
1086 the only way this function was invoked is if the default action
1087 is an error action. In that case, don't check for expected
1088 tokens because there are none.
1089 - The only way there can be no lookahead present (in yychar) is if
1090 this state is a consistent state with a default action. Thus,
1091 detecting the absence of a lookahead is sufficient to determine
1092 that there is no unexpected or expected token to report. In that
1093 case, just report a simple "syntax error".
1094 - Don't assume there isn't a lookahead just because this state is a
1095 consistent state with a default action. There might have been a
1096 previous inconsistent state, consistent state with a non-default
1097 action, or user semantic action that manipulated yychar.
1098 - Of course, the expected token list depends on states to have
1099 correct lookahead information, and it depends on the parser not
1100 to perform extra reductions after fetching a lookahead from the
1101 scanner and before detecting a syntax error. Thus, state merging
1102 (from LALR or IELR) and default reductions corrupt the expected
1103 token list. However, the list is correct for canonical LR with
1104 one exception: it will still contain any token that will not be
1105 accepted due to an error action in a later state.
1106 */
1107 if (yytoken != YYEMPTY)
1108 {
1109 int yyn = yypact[*yyssp];
1110 yyarg[yycount++] = yytname[yytoken];
1111 if (!yypact_value_is_default (yyn))
1112 {
1113 /* Start YYX at -YYN if negative to avoid negative indexes in
1114 YYCHECK. In other words, skip the first -YYN actions for
1115 this state because they are default actions. */
1116 int yyxbegin = yyn < 0 ? -yyn : 0;
1117 /* Stay within bounds of both yycheck and yytname. */
1118 int yychecklim = YYLAST - yyn + 1;
1119 int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
1120 int yyx;
1121
1122 for (yyx = yyxbegin; yyx < yyxend; ++yyx)
1123 if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR
1124 && !yytable_value_is_error (yytable[yyx + yyn]))
1125 {
1126 if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
1127 {
1128 yycount = 1;
1129 yysize = yysize0;
1130 break;
1131 }
1132 yyarg[yycount++] = yytname[yyx];
1133 {
1134 YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]);
1135 if (! (yysize <= yysize1
1136 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
1137 return 2;
1138 yysize = yysize1;
1139 }
1140 }
1141 }
1142 }
1143
1144 switch (yycount)
1145 {
1146# define YYCASE_(N, S) \
1147 case N: \
1148 yyformat = S; \
1149 break
1150 YYCASE_(0, YY_("syntax error"));
1151 YYCASE_(1, YY_("syntax error, unexpected %s"));
1152 YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
1153 YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
1154 YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
1155 YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
1156# undef YYCASE_
1157 }
1158
1159 {
1160 YYSIZE_T yysize1 = yysize + yystrlen (yyformat);
1161 if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
1162 return 2;
1163 yysize = yysize1;
1164 }
1165
1166 if (*yymsg_alloc < yysize)
1167 {
1168 *yymsg_alloc = 2 * yysize;
1169 if (! (yysize <= *yymsg_alloc
1170 && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM))
1171 *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM;
1172 return 1;
1173 }
1174
1175 /* Avoid sprintf, as that infringes on the user's name space.
1176 Don't have undefined behavior even if the translation
1177 produced a string with the wrong number of "%s"s. */
1178 {
1179 char *yyp = *yymsg;
1180 int yyi = 0;
1181 while ((*yyp = *yyformat) != '\0')
1182 if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount)
1183 {
1184 yyp += yytnamerr (yyp, yyarg[yyi++]);
1185 yyformat += 2;
1186 }
1187 else
1188 {
1189 yyp++;
1190 yyformat++;
1191 }
1192 }
1193 return 0;
1194}
1195#endif /* YYERROR_VERBOSE */
1196
1197/*-----------------------------------------------.
1198| Release the memory associated to this symbol. |
1199`-----------------------------------------------*/
1200
1201static void
1202yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
1203{
1204 YYUSE (yyvaluep);
1205 if (!yymsg)
1206 yymsg = "Deleting";
1207 YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
1208
1209 YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
1210 switch (yytype)
1211 {
1212 case 58: /* choice_entry */
1213
1214 {
1215 fprintf(stderr, "%s:%d: missing end statement for this entry\n",
1216 ((*yyvaluep).menu)->file->name, ((*yyvaluep).menu)->lineno);
1217 if (current_menu == ((*yyvaluep).menu))
1218 menu_end_menu();
1219}
1220
1221 break;
1222
1223 case 64: /* if_entry */
1224
1225 {
1226 fprintf(stderr, "%s:%d: missing end statement for this entry\n",
1227 ((*yyvaluep).menu)->file->name, ((*yyvaluep).menu)->lineno);
1228 if (current_menu == ((*yyvaluep).menu))
1229 menu_end_menu();
1230}
1231
1232 break;
1233
1234 case 70: /* menu_entry */
1235
1236 {
1237 fprintf(stderr, "%s:%d: missing end statement for this entry\n",
1238 ((*yyvaluep).menu)->file->name, ((*yyvaluep).menu)->lineno);
1239 if (current_menu == ((*yyvaluep).menu))
1240 menu_end_menu();
1241}
1242
1243 break;
1244
1245
1246 default:
1247 break;
1248 }
1249 YY_IGNORE_MAYBE_UNINITIALIZED_END
1250}
1251
1252
1253
1254
1255/* The lookahead symbol. */
1256int yychar;
1257
1258/* The semantic value of the lookahead symbol. */
1259YYSTYPE yylval;
1260/* Number of syntax errors so far. */
1261int yynerrs;
1262
1263
1264/*----------.
1265| yyparse. |
1266`----------*/
1267
1268int
1269yyparse (void)
1270{
1271 int yystate;
1272 /* Number of tokens to shift before error messages enabled. */
1273 int yyerrstatus;
1274
1275 /* The stacks and their tools:
1276 'yyss': related to states.
1277 'yyvs': related to semantic values.
1278
1279 Refer to the stacks through separate pointers, to allow yyoverflow
1280 to reallocate them elsewhere. */
1281
1282 /* The state stack. */
1283 yytype_int16 yyssa[YYINITDEPTH];
1284 yytype_int16 *yyss;
1285 yytype_int16 *yyssp;
1286
1287 /* The semantic value stack. */
1288 YYSTYPE yyvsa[YYINITDEPTH];
1289 YYSTYPE *yyvs;
1290 YYSTYPE *yyvsp;
1291
1292 YYSIZE_T yystacksize;
1293
1294 int yyn;
1295 int yyresult;
1296 /* Lookahead token as an internal (translated) token number. */
1297 int yytoken = 0;
1298 /* The variables used to return semantic value and location from the
1299 action routines. */
1300 YYSTYPE yyval;
1301
1302#if YYERROR_VERBOSE
1303 /* Buffer for error messages, and its allocated size. */
1304 char yymsgbuf[128];
1305 char *yymsg = yymsgbuf;
1306 YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
1307#endif
1308
1309#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
1310
1311 /* The number of symbols on the RHS of the reduced rule.
1312 Keep to zero when no symbol should be popped. */
1313 int yylen = 0;
1314
1315 yyssp = yyss = yyssa;
1316 yyvsp = yyvs = yyvsa;
1317 yystacksize = YYINITDEPTH;
1318
1319 YYDPRINTF ((stderr, "Starting parse\n"));
1320
1321 yystate = 0;
1322 yyerrstatus = 0;
1323 yynerrs = 0;
1324 yychar = YYEMPTY; /* Cause a token to be read. */
1325 goto yysetstate;
1326
1327/*------------------------------------------------------------.
1328| yynewstate -- Push a new state, which is found in yystate. |
1329`------------------------------------------------------------*/
1330 yynewstate:
1331 /* In all cases, when you get here, the value and location stacks
1332 have just been pushed. So pushing a state here evens the stacks. */
1333 yyssp++;
1334
1335 yysetstate:
1336 *yyssp = yystate;
1337
1338 if (yyss + yystacksize - 1 <= yyssp)
1339 {
1340 /* Get the current used size of the three stacks, in elements. */
1341 YYSIZE_T yysize = yyssp - yyss + 1;
1342
1343#ifdef yyoverflow
1344 {
1345 /* Give user a chance to reallocate the stack. Use copies of
1346 these so that the &'s don't force the real ones into
1347 memory. */
1348 YYSTYPE *yyvs1 = yyvs;
1349 yytype_int16 *yyss1 = yyss;
1350
1351 /* Each stack pointer address is followed by the size of the
1352 data in use in that stack, in bytes. This used to be a
1353 conditional around just the two extra args, but that might
1354 be undefined if yyoverflow is a macro. */
1355 yyoverflow (YY_("memory exhausted"),
1356 &yyss1, yysize * sizeof (*yyssp),
1357 &yyvs1, yysize * sizeof (*yyvsp),
1358 &yystacksize);
1359
1360 yyss = yyss1;
1361 yyvs = yyvs1;
1362 }
1363#else /* no yyoverflow */
1364# ifndef YYSTACK_RELOCATE
1365 goto yyexhaustedlab;
1366# else
1367 /* Extend the stack our own way. */
1368 if (YYMAXDEPTH <= yystacksize)
1369 goto yyexhaustedlab;
1370 yystacksize *= 2;
1371 if (YYMAXDEPTH < yystacksize)
1372 yystacksize = YYMAXDEPTH;
1373
1374 {
1375 yytype_int16 *yyss1 = yyss;
1376 union yyalloc *yyptr =
1377 (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
1378 if (! yyptr)
1379 goto yyexhaustedlab;
1380 YYSTACK_RELOCATE (yyss_alloc, yyss);
1381 YYSTACK_RELOCATE (yyvs_alloc, yyvs);
1382# undef YYSTACK_RELOCATE
1383 if (yyss1 != yyssa)
1384 YYSTACK_FREE (yyss1);
1385 }
1386# endif
1387#endif /* no yyoverflow */
1388
1389 yyssp = yyss + yysize - 1;
1390 yyvsp = yyvs + yysize - 1;
1391
1392 YYDPRINTF ((stderr, "Stack size increased to %lu\n",
1393 (unsigned long int) yystacksize));
1394
1395 if (yyss + yystacksize - 1 <= yyssp)
1396 YYABORT;
1397 }
1398
1399 YYDPRINTF ((stderr, "Entering state %d\n", yystate));
1400
1401 if (yystate == YYFINAL)
1402 YYACCEPT;
1403
1404 goto yybackup;
1405
1406/*-----------.
1407| yybackup. |
1408`-----------*/
1409yybackup:
1410
1411 /* Do appropriate processing given the current state. Read a
1412 lookahead token if we need one and don't already have one. */
1413
1414 /* First try to decide what to do without reference to lookahead token. */
1415 yyn = yypact[yystate];
1416 if (yypact_value_is_default (yyn))
1417 goto yydefault;
1418
1419 /* Not known => get a lookahead token if don't already have one. */
1420
1421 /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */
1422 if (yychar == YYEMPTY)
1423 {
1424 YYDPRINTF ((stderr, "Reading a token: "));
1425 yychar = yylex ();
1426 }
1427
1428 if (yychar <= YYEOF)
1429 {
1430 yychar = yytoken = YYEOF;
1431 YYDPRINTF ((stderr, "Now at end of input.\n"));
1432 }
1433 else
1434 {
1435 yytoken = YYTRANSLATE (yychar);
1436 YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
1437 }
1438
1439 /* If the proper action on seeing token YYTOKEN is to reduce or to
1440 detect an error, take that action. */
1441 yyn += yytoken;
1442 if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
1443 goto yydefault;
1444 yyn = yytable[yyn];
1445 if (yyn <= 0)
1446 {
1447 if (yytable_value_is_error (yyn))
1448 goto yyerrlab;
1449 yyn = -yyn;
1450 goto yyreduce;
1451 }
1452
1453 /* Count tokens shifted since error; after three, turn off error
1454 status. */
1455 if (yyerrstatus)
1456 yyerrstatus--;
1457
1458 /* Shift the lookahead token. */
1459 YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
1460
1461 /* Discard the shifted token. */
1462 yychar = YYEMPTY;
1463
1464 yystate = yyn;
1465 YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
1466 *++yyvsp = yylval;
1467 YY_IGNORE_MAYBE_UNINITIALIZED_END
1468
1469 goto yynewstate;
1470
1471
1472/*-----------------------------------------------------------.
1473| yydefault -- do the default action for the current state. |
1474`-----------------------------------------------------------*/
1475yydefault:
1476 yyn = yydefact[yystate];
1477 if (yyn == 0)
1478 goto yyerrlab;
1479 goto yyreduce;
1480
1481
1482/*-----------------------------.
1483| yyreduce -- Do a reduction. |
1484`-----------------------------*/
1485yyreduce:
1486 /* yyn is the number of a rule to reduce with. */
1487 yylen = yyr2[yyn];
1488
1489 /* If YYLEN is nonzero, implement the default value of the action:
1490 '$$ = $1'.
1491
1492 Otherwise, the following line sets YYVAL to garbage.
1493 This behavior is undocumented and Bison
1494 users should not rely upon it. Assigning to YYVAL
1495 unconditionally makes the parser a bit smaller, and it avoids a
1496 GCC warning that YYVAL may be used uninitialized. */
1497 yyval = yyvsp[1-yylen];
1498
1499
1500 YY_REDUCE_PRINT (yyn);
1501 switch (yyn)
1502 {
1503 case 10:
1504
1505 { zconf_error("unexpected end statement"); }
1506
1507 break;
1508
1509 case 11:
1510
1511 { zconf_error("unknown statement \"%s\"", (yyvsp[-2].string)); }
1512
1513 break;
1514
1515 case 12:
1516
1517 {
1518 zconf_error("unexpected option \"%s\"", (yyvsp[-2].id)->name);
1519}
1520
1521 break;
1522
1523 case 13:
1524
1525 { zconf_error("invalid statement"); }
1526
1527 break;
1528
1529 case 29:
1530
1531 { zconf_error("unknown option \"%s\"", (yyvsp[-2].string)); }
1532
1533 break;
1534
1535 case 30:
1536
1537 { zconf_error("invalid option"); }
1538
1539 break;
1540
1541 case 31:
1542
1543 {
1544 struct symbol *sym = sym_lookup((yyvsp[-1].string), 0);
1545 sym->flags |= SYMBOL_OPTIONAL;
1546 menu_add_entry(sym);
1547 printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string));
1548}
1549
1550 break;
1551
1552 case 32:
1553
1554 {
1555 menu_end_entry();
1556 printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
1557}
1558
1559 break;
1560
1561 case 33:
1562
1563 {
1564 struct symbol *sym = sym_lookup((yyvsp[-1].string), 0);
1565 sym->flags |= SYMBOL_OPTIONAL;
1566 menu_add_entry(sym);
1567 printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string));
1568}
1569
1570 break;
1571
1572 case 34:
1573
1574 {
1575 if (current_entry->prompt)
1576 current_entry->prompt->type = P_MENU;
1577 else
1578 zconfprint("warning: menuconfig statement without prompt");
1579 menu_end_entry();
1580 printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
1581}
1582
1583 break;
1584
1585 case 42:
1586
1587 {
1588 menu_set_type((yyvsp[-2].id)->stype);
1589 printd(DEBUG_PARSE, "%s:%d:type(%u)\n",
1590 zconf_curname(), zconf_lineno(),
1591 (yyvsp[-2].id)->stype);
1592}
1593
1594 break;
1595
1596 case 43:
1597
1598 {
1599 menu_add_prompt(P_PROMPT, (yyvsp[-2].string), (yyvsp[-1].expr));
1600 printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
1601}
1602
1603 break;
1604
1605 case 44:
1606
1607 {
1608 menu_add_expr(P_DEFAULT, (yyvsp[-2].expr), (yyvsp[-1].expr));
1609 if ((yyvsp[-3].id)->stype != S_UNKNOWN)
1610 menu_set_type((yyvsp[-3].id)->stype);
1611 printd(DEBUG_PARSE, "%s:%d:default(%u)\n",
1612 zconf_curname(), zconf_lineno(),
1613 (yyvsp[-3].id)->stype);
1614}
1615
1616 break;
1617
1618 case 45:
1619
1620 {
1621 menu_add_symbol(P_SELECT, sym_lookup((yyvsp[-2].string), 0), (yyvsp[-1].expr));
1622 printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno());
1623}
1624
1625 break;
1626
1627 case 46:
1628
1629 {
1630 menu_add_symbol(P_IMPLY, sym_lookup((yyvsp[-2].string), 0), (yyvsp[-1].expr));
1631 printd(DEBUG_PARSE, "%s:%d:imply\n", zconf_curname(), zconf_lineno());
1632}
1633
1634 break;
1635
1636 case 47:
1637
1638 {
1639 menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,(yyvsp[-3].symbol), (yyvsp[-2].symbol)), (yyvsp[-1].expr));
1640 printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno());
1641}
1642
1643 break;
1644
1645 case 50:
1646
1647 {
1648 const struct kconf_id *id = kconf_id_lookup((yyvsp[-1].string), strlen((yyvsp[-1].string)));
1649 if (id && id->flags & TF_OPTION)
1650 menu_add_option(id->token, (yyvsp[0].string));
1651 else
1652 zconfprint("warning: ignoring unknown option %s", (yyvsp[-1].string));
1653 free((yyvsp[-1].string));
1654}
1655
1656 break;
1657
1658 case 51:
1659
1660 { (yyval.string) = NULL; }
1661
1662 break;
1663
1664 case 52:
1665
1666 { (yyval.string) = (yyvsp[0].string); }
1667
1668 break;
1669
1670 case 53:
1671
1672 {
1673 struct symbol *sym = sym_lookup((yyvsp[-1].string), SYMBOL_CHOICE);
1674 sym->flags |= SYMBOL_AUTO;
1675 menu_add_entry(sym);
1676 menu_add_expr(P_CHOICE, NULL, NULL);
1677 printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno());
1678}
1679
1680 break;
1681
1682 case 54:
1683
1684 {
1685 (yyval.menu) = menu_add_menu();
1686}
1687
1688 break;
1689
1690 case 55:
1691
1692 {
1693 if (zconf_endtoken((yyvsp[0].id), T_CHOICE, T_ENDCHOICE)) {
1694 menu_end_menu();
1695 printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno());
1696 }
1697}
1698
1699 break;
1700
1701 case 63:
1702
1703 {
1704 menu_add_prompt(P_PROMPT, (yyvsp[-2].string), (yyvsp[-1].expr));
1705 printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
1706}
1707
1708 break;
1709
1710 case 64:
1711
1712 {
1713 if ((yyvsp[-2].id)->stype == S_BOOLEAN || (yyvsp[-2].id)->stype == S_TRISTATE) {
1714 menu_set_type((yyvsp[-2].id)->stype);
1715 printd(DEBUG_PARSE, "%s:%d:type(%u)\n",
1716 zconf_curname(), zconf_lineno(),
1717 (yyvsp[-2].id)->stype);
1718 } else
1719 YYERROR;
1720}
1721
1722 break;
1723
1724 case 65:
1725
1726 {
1727 current_entry->sym->flags |= SYMBOL_OPTIONAL;
1728 printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno());
1729}
1730
1731 break;
1732
1733 case 66:
1734
1735 {
1736 if ((yyvsp[-3].id)->stype == S_UNKNOWN) {
1737 menu_add_symbol(P_DEFAULT, sym_lookup((yyvsp[-2].string), 0), (yyvsp[-1].expr));
1738 printd(DEBUG_PARSE, "%s:%d:default\n",
1739 zconf_curname(), zconf_lineno());
1740 } else
1741 YYERROR;
1742}
1743
1744 break;
1745
1746 case 69:
1747
1748 {
1749 printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
1750 menu_add_entry(NULL);
1751 menu_add_dep((yyvsp[-1].expr));
1752 (yyval.menu) = menu_add_menu();
1753}
1754
1755 break;
1756
1757 case 70:
1758
1759 {
1760 if (zconf_endtoken((yyvsp[0].id), T_IF, T_ENDIF)) {
1761 menu_end_menu();
1762 printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno());
1763 }
1764}
1765
1766 break;
1767
1768 case 76:
1769
1770 {
1771 menu_add_prompt(P_MENU, (yyvsp[-1].string), NULL);
1772}
1773
1774 break;
1775
1776 case 77:
1777
1778 {
1779 menu_add_entry(NULL);
1780 menu_add_prompt(P_MENU, (yyvsp[-1].string), NULL);
1781 printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno());
1782}
1783
1784 break;
1785
1786 case 78:
1787
1788 {
1789 (yyval.menu) = menu_add_menu();
1790}
1791
1792 break;
1793
1794 case 79:
1795
1796 {
1797 if (zconf_endtoken((yyvsp[0].id), T_MENU, T_ENDMENU)) {
1798 menu_end_menu();
1799 printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno());
1800 }
1801}
1802
1803 break;
1804
1805 case 85:
1806
1807 {
1808 printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string));
1809 zconf_nextfile((yyvsp[-1].string));
1810}
1811
1812 break;
1813
1814 case 86:
1815
1816 {
1817 menu_add_entry(NULL);
1818 menu_add_prompt(P_COMMENT, (yyvsp[-1].string), NULL);
1819 printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno());
1820}
1821
1822 break;
1823
1824 case 87:
1825
1826 {
1827 menu_end_entry();
1828}
1829
1830 break;
1831
1832 case 88:
1833
1834 {
1835 printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno());
1836 zconf_starthelp();
1837}
1838
1839 break;
1840
1841 case 89:
1842
1843 {
1844 current_entry->help = (yyvsp[0].string);
1845}
1846
1847 break;
1848
1849 case 94:
1850
1851 {
1852 menu_add_dep((yyvsp[-1].expr));
1853 printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno());
1854}
1855
1856 break;
1857
1858 case 98:
1859
1860 {
1861 menu_add_visibility((yyvsp[0].expr));
1862}
1863
1864 break;
1865
1866 case 100:
1867
1868 {
1869 menu_add_prompt(P_PROMPT, (yyvsp[-1].string), (yyvsp[0].expr));
1870}
1871
1872 break;
1873
1874 case 103:
1875
1876 { (yyval.id) = (yyvsp[-1].id); }
1877
1878 break;
1879
1880 case 104:
1881
1882 { (yyval.id) = (yyvsp[-1].id); }
1883
1884 break;
1885
1886 case 105:
1887
1888 { (yyval.id) = (yyvsp[-1].id); }
1889
1890 break;
1891
1892 case 108:
1893
1894 { (yyval.expr) = NULL; }
1895
1896 break;
1897
1898 case 109:
1899
1900 { (yyval.expr) = (yyvsp[0].expr); }
1901
1902 break;
1903
1904 case 110:
1905
1906 { (yyval.expr) = expr_alloc_symbol((yyvsp[0].symbol)); }
1907
1908 break;
1909
1910 case 111:
1911
1912 { (yyval.expr) = expr_alloc_comp(E_LTH, (yyvsp[-2].symbol), (yyvsp[0].symbol)); }
1913
1914 break;
1915
1916 case 112:
1917
1918 { (yyval.expr) = expr_alloc_comp(E_LEQ, (yyvsp[-2].symbol), (yyvsp[0].symbol)); }
1919
1920 break;
1921
1922 case 113:
1923
1924 { (yyval.expr) = expr_alloc_comp(E_GTH, (yyvsp[-2].symbol), (yyvsp[0].symbol)); }
1925
1926 break;
1927
1928 case 114:
1929
1930 { (yyval.expr) = expr_alloc_comp(E_GEQ, (yyvsp[-2].symbol), (yyvsp[0].symbol)); }
1931
1932 break;
1933
1934 case 115:
1935
1936 { (yyval.expr) = expr_alloc_comp(E_EQUAL, (yyvsp[-2].symbol), (yyvsp[0].symbol)); }
1937
1938 break;
1939
1940 case 116:
1941
1942 { (yyval.expr) = expr_alloc_comp(E_UNEQUAL, (yyvsp[-2].symbol), (yyvsp[0].symbol)); }
1943
1944 break;
1945
1946 case 117:
1947
1948 { (yyval.expr) = (yyvsp[-1].expr); }
1949
1950 break;
1951
1952 case 118:
1953
1954 { (yyval.expr) = expr_alloc_one(E_NOT, (yyvsp[0].expr)); }
1955
1956 break;
1957
1958 case 119:
1959
1960 { (yyval.expr) = expr_alloc_two(E_OR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
1961
1962 break;
1963
1964 case 120:
1965
1966 { (yyval.expr) = expr_alloc_two(E_AND, (yyvsp[-2].expr), (yyvsp[0].expr)); }
1967
1968 break;
1969
1970 case 121:
1971
1972 { (yyval.symbol) = sym_lookup((yyvsp[0].string), 0); free((yyvsp[0].string)); }
1973
1974 break;
1975
1976 case 122:
1977
1978 { (yyval.symbol) = sym_lookup((yyvsp[0].string), SYMBOL_CONST); free((yyvsp[0].string)); }
1979
1980 break;
1981
1982 case 123:
1983
1984 { (yyval.string) = NULL; }
1985
1986 break;
1987
1988
1989
1990 default: break;
1991 }
1992 /* User semantic actions sometimes alter yychar, and that requires
1993 that yytoken be updated with the new translation. We take the
1994 approach of translating immediately before every use of yytoken.
1995 One alternative is translating here after every semantic action,
1996 but that translation would be missed if the semantic action invokes
1997 YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or
1998 if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an
1999 incorrect destructor might then be invoked immediately. In the
2000 case of YYERROR or YYBACKUP, subsequent parser actions might lead
2001 to an incorrect destructor call or verbose syntax error message
2002 before the lookahead is translated. */
2003 YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
2004
2005 YYPOPSTACK (yylen);
2006 yylen = 0;
2007 YY_STACK_PRINT (yyss, yyssp);
2008
2009 *++yyvsp = yyval;
2010
2011 /* Now 'shift' the result of the reduction. Determine what state
2012 that goes to, based on the state we popped back to and the rule
2013 number reduced by. */
2014
2015 yyn = yyr1[yyn];
2016
2017 yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
2018 if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
2019 yystate = yytable[yystate];
2020 else
2021 yystate = yydefgoto[yyn - YYNTOKENS];
2022
2023 goto yynewstate;
2024
2025
2026/*--------------------------------------.
2027| yyerrlab -- here on detecting error. |
2028`--------------------------------------*/
2029yyerrlab:
2030 /* Make sure we have latest lookahead translation. See comments at
2031 user semantic actions for why this is necessary. */
2032 yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);
2033
2034 /* If not already recovering from an error, report this error. */
2035 if (!yyerrstatus)
2036 {
2037 ++yynerrs;
2038#if ! YYERROR_VERBOSE
2039 yyerror (YY_("syntax error"));
2040#else
2041# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \
2042 yyssp, yytoken)
2043 {
2044 char const *yymsgp = YY_("syntax error");
2045 int yysyntax_error_status;
2046 yysyntax_error_status = YYSYNTAX_ERROR;
2047 if (yysyntax_error_status == 0)
2048 yymsgp = yymsg;
2049 else if (yysyntax_error_status == 1)
2050 {
2051 if (yymsg != yymsgbuf)
2052 YYSTACK_FREE (yymsg);
2053 yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc);
2054 if (!yymsg)
2055 {
2056 yymsg = yymsgbuf;
2057 yymsg_alloc = sizeof yymsgbuf;
2058 yysyntax_error_status = 2;
2059 }
2060 else
2061 {
2062 yysyntax_error_status = YYSYNTAX_ERROR;
2063 yymsgp = yymsg;
2064 }
2065 }
2066 yyerror (yymsgp);
2067 if (yysyntax_error_status == 2)
2068 goto yyexhaustedlab;
2069 }
2070# undef YYSYNTAX_ERROR
2071#endif
2072 }
2073
2074
2075
2076 if (yyerrstatus == 3)
2077 {
2078 /* If just tried and failed to reuse lookahead token after an
2079 error, discard it. */
2080
2081 if (yychar <= YYEOF)
2082 {
2083 /* Return failure if at end of input. */
2084 if (yychar == YYEOF)
2085 YYABORT;
2086 }
2087 else
2088 {
2089 yydestruct ("Error: discarding",
2090 yytoken, &yylval);
2091 yychar = YYEMPTY;
2092 }
2093 }
2094
2095 /* Else will try to reuse lookahead token after shifting the error
2096 token. */
2097 goto yyerrlab1;
2098
2099
2100/*---------------------------------------------------.
2101| yyerrorlab -- error raised explicitly by YYERROR. |
2102`---------------------------------------------------*/
2103yyerrorlab:
2104
2105 /* Pacify compilers like GCC when the user code never invokes
2106 YYERROR and the label yyerrorlab therefore never appears in user
2107 code. */
2108 if (/*CONSTCOND*/ 0)
2109 goto yyerrorlab;
2110
2111 /* Do not reclaim the symbols of the rule whose action triggered
2112 this YYERROR. */
2113 YYPOPSTACK (yylen);
2114 yylen = 0;
2115 YY_STACK_PRINT (yyss, yyssp);
2116 yystate = *yyssp;
2117 goto yyerrlab1;
2118
2119
2120/*-------------------------------------------------------------.
2121| yyerrlab1 -- common code for both syntax error and YYERROR. |
2122`-------------------------------------------------------------*/
2123yyerrlab1:
2124 yyerrstatus = 3; /* Each real token shifted decrements this. */
2125
2126 for (;;)
2127 {
2128 yyn = yypact[yystate];
2129 if (!yypact_value_is_default (yyn))
2130 {
2131 yyn += YYTERROR;
2132 if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
2133 {
2134 yyn = yytable[yyn];
2135 if (0 < yyn)
2136 break;
2137 }
2138 }
2139
2140 /* Pop the current state because it cannot handle the error token. */
2141 if (yyssp == yyss)
2142 YYABORT;
2143
2144
2145 yydestruct ("Error: popping",
2146 yystos[yystate], yyvsp);
2147 YYPOPSTACK (1);
2148 yystate = *yyssp;
2149 YY_STACK_PRINT (yyss, yyssp);
2150 }
2151
2152 YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
2153 *++yyvsp = yylval;
2154 YY_IGNORE_MAYBE_UNINITIALIZED_END
2155
2156
2157 /* Shift the error token. */
2158 YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
2159
2160 yystate = yyn;
2161 goto yynewstate;
2162
2163
2164/*-------------------------------------.
2165| yyacceptlab -- YYACCEPT comes here. |
2166`-------------------------------------*/
2167yyacceptlab:
2168 yyresult = 0;
2169 goto yyreturn;
2170
2171/*-----------------------------------.
2172| yyabortlab -- YYABORT comes here. |
2173`-----------------------------------*/
2174yyabortlab:
2175 yyresult = 1;
2176 goto yyreturn;
2177
2178#if !defined yyoverflow || YYERROR_VERBOSE
2179/*-------------------------------------------------.
2180| yyexhaustedlab -- memory exhaustion comes here. |
2181`-------------------------------------------------*/
2182yyexhaustedlab:
2183 yyerror (YY_("memory exhausted"));
2184 yyresult = 2;
2185 /* Fall through. */
2186#endif
2187
2188yyreturn:
2189 if (yychar != YYEMPTY)
2190 {
2191 /* Make sure we have latest lookahead translation. See comments at
2192 user semantic actions for why this is necessary. */
2193 yytoken = YYTRANSLATE (yychar);
2194 yydestruct ("Cleanup: discarding lookahead",
2195 yytoken, &yylval);
2196 }
2197 /* Do not reclaim the symbols of the rule whose action triggered
2198 this YYABORT or YYACCEPT. */
2199 YYPOPSTACK (yylen);
2200 YY_STACK_PRINT (yyss, yyssp);
2201 while (yyssp != yyss)
2202 {
2203 yydestruct ("Cleanup: popping",
2204 yystos[*yyssp], yyvsp);
2205 YYPOPSTACK (1);
2206 }
2207#ifndef yyoverflow
2208 if (yyss != yyssa)
2209 YYSTACK_FREE (yyss);
2210#endif
2211#if YYERROR_VERBOSE
2212 if (yymsg != yymsgbuf)
2213 YYSTACK_FREE (yymsg);
2214#endif
2215 return yyresult;
2216}
2217
2218
2219
2220void conf_parse(const char *name)
2221{
2222 struct symbol *sym;
2223 int i;
2224
2225 zconf_initscan(name);
2226
2227 sym_init();
2228 _menu_init();
2229 rootmenu.prompt = menu_add_prompt(P_MENU, "Linux Kernel Configuration", NULL);
2230
2231 if (getenv("ZCONF_DEBUG"))
2232 zconfdebug = 1;
2233 zconfparse();
2234 if (zconfnerrs)
2235 exit(1);
2236 if (!modules_sym)
2237 modules_sym = sym_find( "n" );
2238
2239 rootmenu.prompt->text = _(rootmenu.prompt->text);
2240 rootmenu.prompt->text = sym_expand_string_value(rootmenu.prompt->text);
2241
2242 menu_finalize(&rootmenu);
2243 for_all_symbols(i, sym) {
2244 if (sym_check_deps(sym))
2245 zconfnerrs++;
2246 }
2247 if (zconfnerrs)
2248 exit(1);
2249 sym_set_change_count(1);
2250}
2251
2252static const char *zconf_tokenname(int token)
2253{
2254 switch (token) {
2255 case T_MENU: return "menu";
2256 case T_ENDMENU: return "endmenu";
2257 case T_CHOICE: return "choice";
2258 case T_ENDCHOICE: return "endchoice";
2259 case T_IF: return "if";
2260 case T_ENDIF: return "endif";
2261 case T_DEPENDS: return "depends";
2262 case T_VISIBLE: return "visible";
2263 }
2264 return "<token>";
2265}
2266
2267static bool zconf_endtoken(const struct kconf_id *id, int starttoken, int endtoken)
2268{
2269 if (id->token != endtoken) {
2270 zconf_error("unexpected '%s' within %s block",
2271 id->name, zconf_tokenname(starttoken));
2272 zconfnerrs++;
2273 return false;
2274 }
2275 if (current_menu->file != current_file) {
2276 zconf_error("'%s' in different file than '%s'",
2277 id->name, zconf_tokenname(starttoken));
2278 fprintf(stderr, "%s:%d: location of the '%s'\n",
2279 current_menu->file->name, current_menu->lineno,
2280 zconf_tokenname(starttoken));
2281 zconfnerrs++;
2282 return false;
2283 }
2284 return true;
2285}
2286
2287static void zconfprint(const char *err, ...)
2288{
2289 va_list ap;
2290
2291 fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno());
2292 va_start(ap, err);
2293 vfprintf(stderr, err, ap);
2294 va_end(ap);
2295 fprintf(stderr, "\n");
2296}
2297
2298static void zconf_error(const char *err, ...)
2299{
2300 va_list ap;
2301
2302 zconfnerrs++;
2303 fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno());
2304 va_start(ap, err);
2305 vfprintf(stderr, err, ap);
2306 va_end(ap);
2307 fprintf(stderr, "\n");
2308}
2309
2310static void zconferror(const char *err)
2311{
2312 fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err);
2313}
2314
2315static void print_quoted_string(FILE *out, const char *str)
2316{
2317 const char *p;
2318 int len;
2319
2320 putc('"', out);
2321 while ((p = strchr(str, '"'))) {
2322 len = p - str;
2323 if (len)
2324 fprintf(out, "%.*s", len, str);
2325 fputs("\\\"", out);
2326 str = p + 1;
2327 }
2328 fputs(str, out);
2329 putc('"', out);
2330}
2331
2332static void print_symbol(FILE *out, struct menu *menu)
2333{
2334 struct symbol *sym = menu->sym;
2335 struct property *prop;
2336
2337 if (sym_is_choice(sym))
2338 fprintf(out, "\nchoice\n");
2339 else
2340 fprintf(out, "\nconfig %s\n", sym->name);
2341 switch (sym->type) {
2342 case S_BOOLEAN:
2343 fputs(" boolean\n", out);
2344 break;
2345 case S_TRISTATE:
2346 fputs(" tristate\n", out);
2347 break;
2348 case S_STRING:
2349 fputs(" string\n", out);
2350 break;
2351 case S_INT:
2352 fputs(" integer\n", out);
2353 break;
2354 case S_HEX:
2355 fputs(" hex\n", out);
2356 break;
2357 default:
2358 fputs(" ???\n", out);
2359 break;
2360 }
2361 for (prop = sym->prop; prop; prop = prop->next) {
2362 if (prop->menu != menu)
2363 continue;
2364 switch (prop->type) {
2365 case P_PROMPT:
2366 fputs(" prompt ", out);
2367 print_quoted_string(out, prop->text);
2368 if (!expr_is_yes(prop->visible.expr)) {
2369 fputs(" if ", out);
2370 expr_fprint(prop->visible.expr, out);
2371 }
2372 fputc('\n', out);
2373 break;
2374 case P_DEFAULT:
2375 fputs( " default ", out);
2376 expr_fprint(prop->expr, out);
2377 if (!expr_is_yes(prop->visible.expr)) {
2378 fputs(" if ", out);
2379 expr_fprint(prop->visible.expr, out);
2380 }
2381 fputc('\n', out);
2382 break;
2383 case P_CHOICE:
2384 fputs(" #choice value\n", out);
2385 break;
2386 case P_SELECT:
2387 fputs( " select ", out);
2388 expr_fprint(prop->expr, out);
2389 fputc('\n', out);
2390 break;
2391 case P_IMPLY:
2392 fputs( " imply ", out);
2393 expr_fprint(prop->expr, out);
2394 fputc('\n', out);
2395 break;
2396 case P_RANGE:
2397 fputs( " range ", out);
2398 expr_fprint(prop->expr, out);
2399 fputc('\n', out);
2400 break;
2401 case P_MENU:
2402 fputs( " menu ", out);
2403 print_quoted_string(out, prop->text);
2404 fputc('\n', out);
2405 break;
2406 default:
2407 fprintf(out, " unknown prop %d!\n", prop->type);
2408 break;
2409 }
2410 }
2411 if (menu->help) {
2412 int len = strlen(menu->help);
2413 while (menu->help[--len] == '\n')
2414 menu->help[len] = 0;
2415 fprintf(out, " help\n%s\n", menu->help);
2416 }
2417}
2418
2419void zconfdump(FILE *out)
2420{
2421 struct property *prop;
2422 struct symbol *sym;
2423 struct menu *menu;
2424
2425 menu = rootmenu.list;
2426 while (menu) {
2427 if ((sym = menu->sym))
2428 print_symbol(out, menu);
2429 else if ((prop = menu->prompt)) {
2430 switch (prop->type) {
2431 case P_COMMENT:
2432 fputs("\ncomment ", out);
2433 print_quoted_string(out, prop->text);
2434 fputs("\n", out);
2435 break;
2436 case P_MENU:
2437 fputs("\nmenu ", out);
2438 print_quoted_string(out, prop->text);
2439 fputs("\n", out);
2440 break;
2441 default:
2442 ;
2443 }
2444 if (!expr_is_yes(prop->visible.expr)) {
2445 fputs(" depends ", out);
2446 expr_fprint(prop->visible.expr, out);
2447 fputc('\n', out);
2448 }
2449 }
2450
2451 if (menu->list)
2452 menu = menu->list;
2453 else if (menu->next)
2454 menu = menu->next;
2455 else while ((menu = menu->parent)) {
2456 if (menu->prompt && menu->prompt->type == P_MENU)
2457 fputs("\nendmenu\n", out);
2458 if (menu->next) {
2459 menu = menu->next;
2460 break;
2461 }
2462 }
2463 }
2464}
2465
2466#include "zconf.lex.c"
2467#include "util.c"
2468#include "confdata.c"
2469#include "expr.c"
2470#include "symbol.c"
2471#include "menu.c"
diff --git a/scripts/kconfig/zconf.y b/scripts/kconfig/zconf.y
index c8f396c3b190..21ce883e5d9e 100644
--- a/scripts/kconfig/zconf.y
+++ b/scripts/kconfig/zconf.y
@@ -20,10 +20,10 @@
20 20
21int cdebug = PRINTD; 21int cdebug = PRINTD;
22 22
23extern int zconflex(void); 23int yylex(void);
24static void yyerror(const char *err);
24static void zconfprint(const char *err, ...); 25static void zconfprint(const char *err, ...);
25static void zconf_error(const char *err, ...); 26static void zconf_error(const char *err, ...);
26static void zconferror(const char *err);
27static bool zconf_endtoken(const struct kconf_id *id, int starttoken, int endtoken); 27static bool zconf_endtoken(const struct kconf_id *id, int starttoken, int endtoken);
28 28
29struct symbol *symbol_hash[SYMBOL_HASHSIZE]; 29struct symbol *symbol_hash[SYMBOL_HASHSIZE];
@@ -85,6 +85,7 @@ static struct menu *current_menu, *current_entry;
85%nonassoc T_NOT 85%nonassoc T_NOT
86 86
87%type <string> prompt 87%type <string> prompt
88%type <symbol> nonconst_symbol
88%type <symbol> symbol 89%type <symbol> symbol
89%type <expr> expr 90%type <expr> expr
90%type <expr> if_expr 91%type <expr> if_expr
@@ -101,14 +102,34 @@ static struct menu *current_menu, *current_entry;
101} if_entry menu_entry choice_entry 102} if_entry menu_entry choice_entry
102 103
103%{ 104%{
104/* Include zconf_id.c here so it can see the token constants. */ 105/* Include kconf_id.c here so it can see the token constants. */
105#include "kconf_id.c" 106#include "kconf_id.c"
106%} 107%}
107 108
108%% 109%%
109input: nl start | start; 110input: nl start | start;
110 111
111start: mainmenu_stmt stmt_list | stmt_list; 112start: mainmenu_stmt stmt_list | no_mainmenu_stmt stmt_list;
113
114/* mainmenu entry */
115
116mainmenu_stmt: T_MAINMENU prompt nl
117{
118 menu_add_prompt(P_MENU, $2, NULL);
119};
120
121/* Default main menu, if there's no mainmenu entry */
122
123no_mainmenu_stmt: /* empty */
124{
125 /*
126 * Hack: Keep the main menu title on the heap so we can safely free it
127 * later regardless of whether it comes from the 'prompt' in
128 * mainmenu_stmt or here
129 */
130 menu_add_prompt(P_MENU, strdup("Linux Kernel Configuration"), NULL);
131};
132
112 133
113stmt_list: 134stmt_list:
114 /* empty */ 135 /* empty */
@@ -145,26 +166,23 @@ option_error:
145 166
146/* config/menuconfig entry */ 167/* config/menuconfig entry */
147 168
148config_entry_start: T_CONFIG T_WORD T_EOL 169config_entry_start: T_CONFIG nonconst_symbol T_EOL
149{ 170{
150 struct symbol *sym = sym_lookup($2, 0); 171 $2->flags |= SYMBOL_OPTIONAL;
151 sym->flags |= SYMBOL_OPTIONAL; 172 menu_add_entry($2);
152 menu_add_entry(sym); 173 printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), $2->name);
153 printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), $2);
154}; 174};
155 175
156config_stmt: config_entry_start config_option_list 176config_stmt: config_entry_start config_option_list
157{ 177{
158 menu_end_entry();
159 printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno()); 178 printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
160}; 179};
161 180
162menuconfig_entry_start: T_MENUCONFIG T_WORD T_EOL 181menuconfig_entry_start: T_MENUCONFIG nonconst_symbol T_EOL
163{ 182{
164 struct symbol *sym = sym_lookup($2, 0); 183 $2->flags |= SYMBOL_OPTIONAL;
165 sym->flags |= SYMBOL_OPTIONAL; 184 menu_add_entry($2);
166 menu_add_entry(sym); 185 printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), $2->name);
167 printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), $2);
168}; 186};
169 187
170menuconfig_stmt: menuconfig_entry_start config_option_list 188menuconfig_stmt: menuconfig_entry_start config_option_list
@@ -173,7 +191,6 @@ menuconfig_stmt: menuconfig_entry_start config_option_list
173 current_entry->prompt->type = P_MENU; 191 current_entry->prompt->type = P_MENU;
174 else 192 else
175 zconfprint("warning: menuconfig statement without prompt"); 193 zconfprint("warning: menuconfig statement without prompt");
176 menu_end_entry();
177 printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno()); 194 printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
178}; 195};
179 196
@@ -211,15 +228,15 @@ config_option: T_DEFAULT expr if_expr T_EOL
211 $1->stype); 228 $1->stype);
212}; 229};
213 230
214config_option: T_SELECT T_WORD if_expr T_EOL 231config_option: T_SELECT nonconst_symbol if_expr T_EOL
215{ 232{
216 menu_add_symbol(P_SELECT, sym_lookup($2, 0), $3); 233 menu_add_symbol(P_SELECT, $2, $3);
217 printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno()); 234 printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno());
218}; 235};
219 236
220config_option: T_IMPLY T_WORD if_expr T_EOL 237config_option: T_IMPLY nonconst_symbol if_expr T_EOL
221{ 238{
222 menu_add_symbol(P_IMPLY, sym_lookup($2, 0), $3); 239 menu_add_symbol(P_IMPLY, $2, $3);
223 printd(DEBUG_PARSE, "%s:%d:imply\n", zconf_curname(), zconf_lineno()); 240 printd(DEBUG_PARSE, "%s:%d:imply\n", zconf_curname(), zconf_lineno());
224}; 241};
225 242
@@ -237,8 +254,10 @@ symbol_option_list:
237 | symbol_option_list T_WORD symbol_option_arg 254 | symbol_option_list T_WORD symbol_option_arg
238{ 255{
239 const struct kconf_id *id = kconf_id_lookup($2, strlen($2)); 256 const struct kconf_id *id = kconf_id_lookup($2, strlen($2));
240 if (id && id->flags & TF_OPTION) 257 if (id && id->flags & TF_OPTION) {
241 menu_add_option(id->token, $3); 258 menu_add_option(id->token, $3);
259 free($3);
260 }
242 else 261 else
243 zconfprint("warning: ignoring unknown option %s", $2); 262 zconfprint("warning: ignoring unknown option %s", $2);
244 free($2); 263 free($2);
@@ -308,10 +327,10 @@ choice_option: T_OPTIONAL T_EOL
308 printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno()); 327 printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno());
309}; 328};
310 329
311choice_option: T_DEFAULT T_WORD if_expr T_EOL 330choice_option: T_DEFAULT nonconst_symbol if_expr T_EOL
312{ 331{
313 if ($1->stype == S_UNKNOWN) { 332 if ($1->stype == S_UNKNOWN) {
314 menu_add_symbol(P_DEFAULT, sym_lookup($2, 0), $3); 333 menu_add_symbol(P_DEFAULT, $2, $3);
315 printd(DEBUG_PARSE, "%s:%d:default\n", 334 printd(DEBUG_PARSE, "%s:%d:default\n",
316 zconf_curname(), zconf_lineno()); 335 zconf_curname(), zconf_lineno());
317 } else 336 } else
@@ -351,13 +370,6 @@ if_block:
351 | if_block choice_stmt 370 | if_block choice_stmt
352; 371;
353 372
354/* mainmenu entry */
355
356mainmenu_stmt: T_MAINMENU prompt nl
357{
358 menu_add_prompt(P_MENU, $2, NULL);
359};
360
361/* menu entry */ 373/* menu entry */
362 374
363menu: T_MENU prompt T_EOL 375menu: T_MENU prompt T_EOL
@@ -394,6 +406,7 @@ source_stmt: T_SOURCE prompt T_EOL
394{ 406{
395 printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), $2); 407 printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), $2);
396 zconf_nextfile($2); 408 zconf_nextfile($2);
409 free($2);
397}; 410};
398 411
399/* comment entry */ 412/* comment entry */
@@ -406,9 +419,7 @@ comment: T_COMMENT prompt T_EOL
406}; 419};
407 420
408comment_stmt: comment depends_list 421comment_stmt: comment depends_list
409{ 422;
410 menu_end_entry();
411};
412 423
413/* help option */ 424/* help option */
414 425
@@ -420,6 +431,11 @@ help_start: T_HELP T_EOL
420 431
421help: help_start T_HELPTEXT 432help: help_start T_HELPTEXT
422{ 433{
434 if (current_entry->help) {
435 free(current_entry->help);
436 zconfprint("warning: '%s' defined with more than one help text -- only the last one will be used",
437 current_entry->sym->name ?: "<choice>");
438 }
423 current_entry->help = $2; 439 current_entry->help = $2;
424}; 440};
425 441
@@ -491,7 +507,10 @@ expr: symbol { $$ = expr_alloc_symbol($1); }
491 | expr T_AND expr { $$ = expr_alloc_two(E_AND, $1, $3); } 507 | expr T_AND expr { $$ = expr_alloc_two(E_AND, $1, $3); }
492; 508;
493 509
494symbol: T_WORD { $$ = sym_lookup($1, 0); free($1); } 510/* For symbol definitions, selects, etc., where quotes are not accepted */
511nonconst_symbol: T_WORD { $$ = sym_lookup($1, 0); free($1); };
512
513symbol: nonconst_symbol
495 | T_WORD_QUOTE { $$ = sym_lookup($1, SYMBOL_CONST); free($1); } 514 | T_WORD_QUOTE { $$ = sym_lookup($1, SYMBOL_CONST); free($1); }
496; 515;
497 516
@@ -502,6 +521,7 @@ word_opt: /* empty */ { $$ = NULL; }
502 521
503void conf_parse(const char *name) 522void conf_parse(const char *name)
504{ 523{
524 const char *tmp;
505 struct symbol *sym; 525 struct symbol *sym;
506 int i; 526 int i;
507 527
@@ -509,25 +529,26 @@ void conf_parse(const char *name)
509 529
510 sym_init(); 530 sym_init();
511 _menu_init(); 531 _menu_init();
512 rootmenu.prompt = menu_add_prompt(P_MENU, "Linux Kernel Configuration", NULL);
513 532
514 if (getenv("ZCONF_DEBUG")) 533 if (getenv("ZCONF_DEBUG"))
515 zconfdebug = 1; 534 yydebug = 1;
516 zconfparse(); 535 yyparse();
517 if (zconfnerrs) 536 if (yynerrs)
518 exit(1); 537 exit(1);
519 if (!modules_sym) 538 if (!modules_sym)
520 modules_sym = sym_find( "n" ); 539 modules_sym = sym_find( "n" );
521 540
541 tmp = rootmenu.prompt->text;
522 rootmenu.prompt->text = _(rootmenu.prompt->text); 542 rootmenu.prompt->text = _(rootmenu.prompt->text);
523 rootmenu.prompt->text = sym_expand_string_value(rootmenu.prompt->text); 543 rootmenu.prompt->text = sym_expand_string_value(rootmenu.prompt->text);
544 free((char*)tmp);
524 545
525 menu_finalize(&rootmenu); 546 menu_finalize(&rootmenu);
526 for_all_symbols(i, sym) { 547 for_all_symbols(i, sym) {
527 if (sym_check_deps(sym)) 548 if (sym_check_deps(sym))
528 zconfnerrs++; 549 yynerrs++;
529 } 550 }
530 if (zconfnerrs) 551 if (yynerrs)
531 exit(1); 552 exit(1);
532 sym_set_change_count(1); 553 sym_set_change_count(1);
533} 554}
@@ -552,7 +573,7 @@ static bool zconf_endtoken(const struct kconf_id *id, int starttoken, int endtok
552 if (id->token != endtoken) { 573 if (id->token != endtoken) {
553 zconf_error("unexpected '%s' within %s block", 574 zconf_error("unexpected '%s' within %s block",
554 id->name, zconf_tokenname(starttoken)); 575 id->name, zconf_tokenname(starttoken));
555 zconfnerrs++; 576 yynerrs++;
556 return false; 577 return false;
557 } 578 }
558 if (current_menu->file != current_file) { 579 if (current_menu->file != current_file) {
@@ -561,7 +582,7 @@ static bool zconf_endtoken(const struct kconf_id *id, int starttoken, int endtok
561 fprintf(stderr, "%s:%d: location of the '%s'\n", 582 fprintf(stderr, "%s:%d: location of the '%s'\n",
562 current_menu->file->name, current_menu->lineno, 583 current_menu->file->name, current_menu->lineno,
563 zconf_tokenname(starttoken)); 584 zconf_tokenname(starttoken));
564 zconfnerrs++; 585 yynerrs++;
565 return false; 586 return false;
566 } 587 }
567 return true; 588 return true;
@@ -582,7 +603,7 @@ static void zconf_error(const char *err, ...)
582{ 603{
583 va_list ap; 604 va_list ap;
584 605
585 zconfnerrs++; 606 yynerrs++;
586 fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno()); 607 fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno());
587 va_start(ap, err); 608 va_start(ap, err);
588 vfprintf(stderr, err, ap); 609 vfprintf(stderr, err, ap);
@@ -590,7 +611,7 @@ static void zconf_error(const char *err, ...)
590 fprintf(stderr, "\n"); 611 fprintf(stderr, "\n");
591} 612}
592 613
593static void zconferror(const char *err) 614static void yyerror(const char *err)
594{ 615{
595 fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err); 616 fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err);
596} 617}
@@ -623,7 +644,7 @@ static void print_symbol(FILE *out, struct menu *menu)
623 fprintf(out, "\nconfig %s\n", sym->name); 644 fprintf(out, "\nconfig %s\n", sym->name);
624 switch (sym->type) { 645 switch (sym->type) {
625 case S_BOOLEAN: 646 case S_BOOLEAN:
626 fputs(" boolean\n", out); 647 fputs(" bool\n", out);
627 break; 648 break;
628 case S_TRISTATE: 649 case S_TRISTATE:
629 fputs(" tristate\n", out); 650 fputs(" tristate\n", out);