mirror of
				https://github.com/openwrt/openwrt.git
				synced 2025-10-30 07:49:23 +08:00 
			
		
		
		
	build: scripts/config - update to kconfig-v5.14
Functional Changes ---------- ------- - make 'imply' not impose any restrictions: allow symbols implied by y to become m - change "modules" from sub-option to first-level attribute Bugfixes -------- - nconf: fix core dump when searching in empty menu - nconf: stop endless search loops - xconfig: fix content of the main widget - xconfig: fix support for the split view mode Other Changes ----- ------- - highlight xconfig 'comment' lines with '***' - xconfig: navigate menus on hyperlinks - xconfig: drop support for Qt4 - improve host ncurses detection Update the 'option modules' usage to just 'modules' in Config.in. Signed-off-by: Eneas U de Queiroz <cotequeiroz@gmail.com>
This commit is contained in:
		 Eneas U de Queiroz
					Eneas U de Queiroz
				
			
				
					committed by
					
						 Petr Štetiar
						Petr Štetiar
					
				
			
			
				
	
			
			
			 Petr Štetiar
						Petr Štetiar
					
				
			
						parent
						
							73ea763c0d
						
					
				
				
					commit
					009293c52e
				
			| @ -5,7 +5,7 @@ | |||||||
| mainmenu "OpenWrt Configuration" | mainmenu "OpenWrt Configuration" | ||||||
|  |  | ||||||
| config MODULES | config MODULES | ||||||
| 	option modules | 	modules | ||||||
| 	bool | 	bool | ||||||
| 	default y | 	default y | ||||||
|  |  | ||||||
|  | |||||||
							
								
								
									
										30
									
								
								scripts/config/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										30
									
								
								scripts/config/.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1,22 +1,16 @@ | |||||||
| # | # SPDX-License-Identifier: GPL-2.0-only | ||||||
| # Generated files | /conf | ||||||
| # | /[gmnq]conf | ||||||
| *.moc | /[gmnq]conf-cfg | ||||||
| *conf-cfg | /qconf-moc.cc | ||||||
|  |  | ||||||
|  | # From linux kconfig parent directories | ||||||
|  | .* | ||||||
|  |  | ||||||
|  | # OpenWrt-generated files | ||||||
| mconf_check | mconf_check | ||||||
|  |  | ||||||
| # | # Temporary files from older versions.  They should be removed after the | ||||||
| # configuration programs | # end of support for OpenWrt 19.07. | ||||||
| # |  | ||||||
| conf |  | ||||||
| mconf |  | ||||||
| nconf |  | ||||||
| qconf |  | ||||||
| gconf |  | ||||||
|  |  | ||||||
| # |  | ||||||
| # temporary files from older version.  Should be removed |  | ||||||
| # |  | ||||||
| zconf.???.c | zconf.???.c | ||||||
| zconf.hash.c | zconf.hash.c | ||||||
| .tmp_qtcheck |  | ||||||
|  | |||||||
| @ -5,11 +5,11 @@ | |||||||
| .PHONY: clean all | .PHONY: clean all | ||||||
| all: conf mconf | all: conf mconf | ||||||
| clean: | clean: | ||||||
| 	rm -f *.o lxdialog/*.o *.moc $(clean-files) conf mconf qconf nconf | 	rm -f *.o lxdialog/*.o *.moc .*.cmd $(clean-files) | ||||||
|  |  | ||||||
| # This clean-files definition is here to ensure that temporary files from the | # This clean-files definition is here to ensure that temporary files from the | ||||||
| # previous version are removed by make config-clean. | # previous version are removed by make config-clean. | ||||||
| # It should be removed or emptied when this Makefile get updated again. | # It should be emptied after the end of support for OpenWrt 19.07. | ||||||
| clean-files	:= zconf.tab.c zconf.lex.c zconf.hash.c .tmp_qtcheck | clean-files	:= zconf.tab.c zconf.lex.c zconf.hash.c .tmp_qtcheck | ||||||
|  |  | ||||||
| # =========================================================================== | # =========================================================================== | ||||||
| @ -24,9 +24,11 @@ src:=. | |||||||
| obj:=. | obj:=. | ||||||
| Q:=$(if $V,,@) | Q:=$(if $V,,@) | ||||||
| cmd = $(cmd_$(1)) | cmd = $(cmd_$(1)) | ||||||
| dot-target = $(dir $@).$(notdir $@) |  | ||||||
|  |  | ||||||
| # taken from ../Kbuild.include | # some definitions taken from ../Kbuild.include | ||||||
|  | dot-target = $(dir $@).$(notdir $@) | ||||||
|  | squote  := ' | ||||||
|  | escsq = $(subst $(squote),'\$(squote)',$1) | ||||||
| define filechk | define filechk | ||||||
| 	$(Q)set -e;						\ | 	$(Q)set -e;						\ | ||||||
| 	mkdir -p $(dir $@);					\ | 	mkdir -p $(dir $@);					\ | ||||||
| @ -37,23 +39,29 @@ define filechk | |||||||
| 		mv -f $(dot-target).tmp $@;			\ | 		mv -f $(dot-target).tmp $@;			\ | ||||||
| 	fi | 	fi | ||||||
| endef | endef | ||||||
|  | cmd-check = $(if $(strip $(cmd_$@)),,1) | ||||||
|  | make-cmd = $(call escsq,$(subst $(pound),$$(pound),$(subst $$,$$$$,$(cmd_$(1))))) | ||||||
|  | newer-prereqs = $(filter-out $(PHONY),$?) | ||||||
|  | if_changed = $(if $(newer-prereqs)$(cmd-check),			\ | ||||||
|  | 	$(cmd);							\ | ||||||
|  | 	printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd, @:) | ||||||
|  |  | ||||||
| ### Stripped down upstream Makefile follows: | ### Stripped down upstream Makefile follows: | ||||||
| # =========================================================================== | # =========================================================================== | ||||||
| # object files used by all kconfig flavours | # object files used by all kconfig flavours | ||||||
| common-objs	:= confdata.o expr.o lexer.lex.o parser.tab.o preprocess.o \ | common-objs	:= confdata.o expr.o lexer.lex.o menu.o parser.tab.o \ | ||||||
| 		   symbol.o util.o | 		   preprocess.o symbol.o util.o | ||||||
|  |  | ||||||
| $(obj)/lexer.lex.o: $(obj)/parser.tab.h | $(obj)/lexer.lex.o: $(obj)/parser.tab.h | ||||||
| HOSTCFLAGS_lexer.lex.o	:= -I $(srctree)/$(src) | HOSTCFLAGS_lexer.lex.o	:= -I $(srctree)/$(src) | ||||||
| HOSTCFLAGS_parser.tab.o	:= -I $(srctree)/$(src) | HOSTCFLAGS_parser.tab.o	:= -I $(srctree)/$(src) | ||||||
|  |  | ||||||
| # conf: Used for defconfig, oldconfig and related targets | # conf: Used for defconfig, oldconfig and related targets | ||||||
| hostprogs-y	+= conf | hostprogs	+= conf | ||||||
| conf-objs	:= conf.o $(common-objs) | conf-objs	:= conf.o $(common-objs) | ||||||
|  |  | ||||||
| # nconf: Used for the nconfig target based on ncurses | # nconf: Used for the nconfig target based on ncurses | ||||||
| hostprogs-y	+= nconf | hostprogs	+= nconf | ||||||
| nconf-objs	:= nconf.o nconf.gui.o $(common-objs) | nconf-objs	:= nconf.o nconf.gui.o $(common-objs) | ||||||
|  |  | ||||||
| HOSTLDLIBS_nconf	= $(shell . $(obj)/nconf-cfg && echo $$libs) | HOSTLDLIBS_nconf	= $(shell . $(obj)/nconf-cfg && echo $$libs) | ||||||
| @ -63,7 +71,7 @@ HOSTCFLAGS_nconf.gui.o	= $(shell . $(obj)/nconf-cfg && echo $$cflags) | |||||||
| $(obj)/nconf.o $(obj)/nconf.gui.o: $(obj)/nconf-cfg | $(obj)/nconf.o $(obj)/nconf.gui.o: $(obj)/nconf-cfg | ||||||
|  |  | ||||||
| # mconf: Used for the menuconfig target based on lxdialog | # mconf: Used for the menuconfig target based on lxdialog | ||||||
| hostprogs-y	+= mconf | hostprogs	+= mconf | ||||||
| lxdialog	:= $(addprefix lxdialog/, \ | lxdialog	:= $(addprefix lxdialog/, \ | ||||||
| 		     checklist.o inputbox.o menubox.o textbox.o util.o yesno.o) | 		     checklist.o inputbox.o menubox.o textbox.o util.o yesno.o) | ||||||
| mconf-objs	:= mconf.o $(lxdialog) $(common-objs) | mconf-objs	:= mconf.o $(lxdialog) $(common-objs) | ||||||
| @ -75,20 +83,23 @@ $(foreach f, mconf.o $(lxdialog), \ | |||||||
| $(addprefix $(obj)/, mconf.o $(lxdialog)): $(obj)/mconf-cfg | $(addprefix $(obj)/, mconf.o $(lxdialog)): $(obj)/mconf-cfg | ||||||
|  |  | ||||||
| # qconf: Used for the xconfig target based on Qt | # qconf: Used for the xconfig target based on Qt | ||||||
| hostprogs-y	+= qconf | hostprogs	+= qconf | ||||||
| qconf-cxxobjs	:= qconf.o | qconf-cxxobjs	:= qconf.o qconf-moc.o | ||||||
| qconf-objs	:= images.o $(common-objs) | qconf-objs	:= images.o $(common-objs) | ||||||
|  |  | ||||||
| HOSTLDLIBS_qconf	= $(shell . $(obj)/qconf-cfg && echo $$libs) | HOSTLDLIBS_qconf	= $(shell . $(obj)/qconf-cfg && echo $$libs) | ||||||
| HOSTCXXFLAGS_qconf.o	= $(shell . $(obj)/qconf-cfg && echo $$cflags) | HOSTCXXFLAGS_qconf.o	= $(shell . $(obj)/qconf-cfg && echo $$cflags) | ||||||
|  | HOSTCXXFLAGS_qconf-moc.o = $(shell . $(obj)/qconf-cfg && echo $$cflags) | ||||||
|  |  | ||||||
| $(obj)/qconf.o: $(obj)/qconf-cfg $(obj)/qconf.moc | $(obj)/qconf.o: $(obj)/qconf-cfg | ||||||
|  |  | ||||||
| quiet_cmd_moc = MOC     $@ | quiet_cmd_moc = MOC     $@ | ||||||
|       cmd_moc = $(shell . $(obj)/qconf-cfg && echo $$moc) -i $< -o $@ |       cmd_moc = $(shell . $(obj)/qconf-cfg && echo $$moc) $< -o $@ | ||||||
|  |  | ||||||
| $(obj)/%.moc: $(src)/%.h $(obj)/qconf-cfg | $(obj)/qconf-moc.cc: $(src)/qconf.h $(obj)/qconf-cfg FORCE | ||||||
| 	$(call cmd,moc) | 	$(call if_changed,moc) | ||||||
|  |  | ||||||
|  | targets += qconf-moc.cc | ||||||
|  |  | ||||||
| # check if necessary packages are available, and configure build flags | # check if necessary packages are available, and configure build flags | ||||||
| filechk_conf_cfg = $(CONFIG_SHELL) $< | filechk_conf_cfg = $(CONFIG_SHELL) $< | ||||||
| @ -102,6 +113,8 @@ clean-files += *conf-cfg | |||||||
| # OpenWrt rules and final adjustments that need to be made after reading the | # OpenWrt rules and final adjustments that need to be made after reading the | ||||||
| # full upstream Makefile | # full upstream Makefile | ||||||
|  |  | ||||||
|  | clean-files += $(targets) $(hostprogs) | ||||||
|  |  | ||||||
| FORCE: | FORCE: | ||||||
|  |  | ||||||
| ifdef BUILD_SHIPPED_FILES | ifdef BUILD_SHIPPED_FILES | ||||||
| @ -117,24 +130,25 @@ clean-files += $(shipped-files) | |||||||
| 	flex -L -o$@ $< | 	flex -L -o$@ $< | ||||||
| endif | endif | ||||||
|  |  | ||||||
| $(foreach f, mconf.o $(lxdialog), \ | $(foreach f,$(conf-objs) $(filter-out $(common-objs),$(mconf-objs) \ | ||||||
|   $(eval $f: CFLAGS+=$$(HOSTCFLAGS_$f))) | 						     $(qconf-objs) \ | ||||||
|  | 						     $(nconf-objs)), \ | ||||||
|  |   $(eval $(obj)/$f: CFLAGS+=$$(HOSTCFLAGS_$f))) | ||||||
|  |  | ||||||
| $(obj)/lexer.lex.o: CFLAGS += $(HOSTCFLAGS_lexer.lex.o) | $(foreach f,$(qconf-cxxobjs), \ | ||||||
| $(obj)/parser.tab.o: CFLAGS += $(HOSTCFLAGS_parser.tab.o) |   $(eval $(obj)/$f: CXXFLAGS+=$$(HOSTCXXFLAGS_$f))) | ||||||
| $(obj)/qconf.o: CXXFLAGS+=$(HOSTCXXFLAGS_qconf.o) |  | ||||||
|  |  | ||||||
| conf: $(conf-objs) | $(obj)/conf: $(addprefix $(obj)/,$(conf-objs)) | ||||||
|  |  | ||||||
| # The *conf-cfg file is used (then filtered out) as the first prerequisite to | # The *conf-cfg file is used (then filtered out) as the first prerequisite to | ||||||
| # avoid sourcing it before the script is built, when trying to compute CFLAGS | # avoid sourcing it before the script is built, when trying to compute CFLAGS | ||||||
| # for the actual first prerequisite.  This avoids errors like: | # for the actual first prerequisite.  This avoids errors like: | ||||||
| # '/bin/sh: ./mconf-cfg: No such file or directory' | # '/bin/sh: ./mconf-cfg: No such file or directory' | ||||||
| mconf: mconf-cfg $(mconf-objs) | $(obj)/mconf: mconf-cfg $(addprefix $(obj)/,$(mconf-objs)) | ||||||
| 	$(CC) -o $@ $(filter-out mconf-cfg,$^) $(HOSTLDLIBS_mconf) | 	$(CC) -o $@ $(filter-out mconf-cfg,$^) $(HOSTLDLIBS_mconf) | ||||||
|  |  | ||||||
| nconf: nconf-cfg $(nconf-objs) | $(obj)/nconf: nconf-cfg $(addprefix $(obj)/,$(nconf-objs)) | ||||||
| 	$(CC) -o $@ $(filter-out nconf-cfg,$^) $(HOSTLDLIBS_nconf) | 	$(CC) -o $@ $(filter-out nconf-cfg,$^) $(HOSTLDLIBS_nconf) | ||||||
|  |  | ||||||
| qconf: qconf-cfg $(qconf-cxxobjs) $(qconf-objs) | $(obj)/qconf: qconf-cfg $(addprefix $(obj)/,$(qconf-cxxobjs) $(qconf-objs)) | ||||||
| 	$(CXX) -o $@ $(filter-out qconf-cfg,$^) $(HOSTLDLIBS_qconf) | 	$(CXX) -o $@ $(filter-out qconf-cfg,$^) $(HOSTLDLIBS_qconf) | ||||||
|  | |||||||
| @ -1,7 +1,6 @@ | |||||||
| These files were taken from the Linux Kernel Configuration System at commit | These files were taken from the Linux 5.14 Kernel Configuration System and | ||||||
| 089b7d890f972f6b649fedc9259f6b93a18fb970 (Feb 4, 2020) and modified for the | modified for the OpenWrt Buildroot: | ||||||
| OpenWrt Buildroot: |  - Removed nconf, gconf, tests and kernel configuration targets. | ||||||
|  - Removed gconf, tests and kernel configuration targets. |  | ||||||
|  - Adjusted the Makefile to compile outside the kernel. |  - Adjusted the Makefile to compile outside the kernel. | ||||||
|  - Always use default file when running make all{no,mod,yes}config. |  - Always use default file when running make all{no,mod,yes}config. | ||||||
|  - Added a 'reset' command to reset config when the target changes. |  - Added a 'reset' command to reset config when the target changes. | ||||||
| @ -24,4 +23,4 @@ OpenWrt Buildroot: | |||||||
|    BUILD_SHIPPED_FILES defined |    BUILD_SHIPPED_FILES defined | ||||||
|  |  | ||||||
| For a full list of changes, see the repository at: | For a full list of changes, see the repository at: | ||||||
| https://github.com/cotequeiroz/linux/commits/openwrt/scripts/kconfig | https://github.com/cotequeiroz/linux/commits/openwrt-5.14/scripts/kconfig | ||||||
|  | |||||||
| @ -11,7 +11,6 @@ | |||||||
| #include <time.h> | #include <time.h> | ||||||
| #include <unistd.h> | #include <unistd.h> | ||||||
| #include <getopt.h> | #include <getopt.h> | ||||||
| #include <sys/stat.h> |  | ||||||
| #include <sys/time.h> | #include <sys/time.h> | ||||||
| #include <errno.h> | #include <errno.h> | ||||||
|  |  | ||||||
| @ -39,7 +38,7 @@ enum input_mode { | |||||||
| 	fatalrecursive, | 	fatalrecursive, | ||||||
| }; | }; | ||||||
| static enum input_mode input_mode = oldaskconfig; | static enum input_mode input_mode = oldaskconfig; | ||||||
|  | static int input_mode_opt; | ||||||
| static int indent = 1; | static int indent = 1; | ||||||
| static int tty_stdio; | static int tty_stdio; | ||||||
| static int sync_kconfig; | static int sync_kconfig; | ||||||
| @ -84,10 +83,243 @@ static void xfgets(char *str, int size, FILE *in) | |||||||
| 		printf("%s", str); | 		printf("%s", str); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static void set_randconfig_seed(void) | ||||||
|  | { | ||||||
|  | 	unsigned int seed; | ||||||
|  | 	char *env; | ||||||
|  | 	bool seed_set = false; | ||||||
|  |  | ||||||
|  | 	env = getenv("KCONFIG_SEED"); | ||||||
|  | 	if (env && *env) { | ||||||
|  | 		char *endp; | ||||||
|  |  | ||||||
|  | 		seed = strtol(env, &endp, 0); | ||||||
|  | 		if (*endp == '\0') | ||||||
|  | 			seed_set = true; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if (!seed_set) { | ||||||
|  | 		struct timeval now; | ||||||
|  |  | ||||||
|  | 		/* | ||||||
|  | 		 * Use microseconds derived seed, compensate for systems where it may | ||||||
|  | 		 * be zero. | ||||||
|  | 		 */ | ||||||
|  | 		gettimeofday(&now, NULL); | ||||||
|  | 		seed = (now.tv_sec + 1) * (now.tv_usec + 1); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	printf("KCONFIG_SEED=0x%X\n", seed); | ||||||
|  | 	srand(seed); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static bool randomize_choice_values(struct symbol *csym) | ||||||
|  | { | ||||||
|  | 	struct property *prop; | ||||||
|  | 	struct symbol *sym; | ||||||
|  | 	struct expr *e; | ||||||
|  | 	int cnt, def; | ||||||
|  |  | ||||||
|  | 	/* | ||||||
|  | 	 * If choice is mod then we may have more items selected | ||||||
|  | 	 * and if no then no-one. | ||||||
|  | 	 * In both cases stop. | ||||||
|  | 	 */ | ||||||
|  | 	if (csym->curr.tri != yes) | ||||||
|  | 		return false; | ||||||
|  |  | ||||||
|  | 	prop = sym_get_choice_prop(csym); | ||||||
|  |  | ||||||
|  | 	/* count entries in choice block */ | ||||||
|  | 	cnt = 0; | ||||||
|  | 	expr_list_for_each_sym(prop->expr, e, sym) | ||||||
|  | 		cnt++; | ||||||
|  |  | ||||||
|  | 	/* | ||||||
|  | 	 * find a random value and set it to yes, | ||||||
|  | 	 * set the rest to no so we have only one set | ||||||
|  | 	 */ | ||||||
|  | 	def = rand() % cnt; | ||||||
|  |  | ||||||
|  | 	cnt = 0; | ||||||
|  | 	expr_list_for_each_sym(prop->expr, e, sym) { | ||||||
|  | 		if (def == cnt++) { | ||||||
|  | 			sym->def[S_DEF_USER].tri = yes; | ||||||
|  | 			csym->def[S_DEF_USER].val = sym; | ||||||
|  | 		} else { | ||||||
|  | 			sym->def[S_DEF_USER].tri = no; | ||||||
|  | 		} | ||||||
|  | 		sym->flags |= SYMBOL_DEF_USER; | ||||||
|  | 		/* clear VALID to get value calculated */ | ||||||
|  | 		sym->flags &= ~SYMBOL_VALID; | ||||||
|  | 	} | ||||||
|  | 	csym->flags |= SYMBOL_DEF_USER; | ||||||
|  | 	/* clear VALID to get value calculated */ | ||||||
|  | 	csym->flags &= ~SYMBOL_VALID; | ||||||
|  |  | ||||||
|  | 	return true; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | enum conf_def_mode { | ||||||
|  | 	def_default, | ||||||
|  | 	def_yes, | ||||||
|  | 	def_mod, | ||||||
|  | 	def_y2m, | ||||||
|  | 	def_m2y, | ||||||
|  | 	def_no, | ||||||
|  | 	def_random | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | static bool conf_set_all_new_symbols(enum conf_def_mode mode) | ||||||
|  | { | ||||||
|  | 	struct symbol *sym, *csym; | ||||||
|  | 	int i, cnt; | ||||||
|  | 	/* | ||||||
|  | 	 * can't go as the default in switch-case below, otherwise gcc whines | ||||||
|  | 	 * about -Wmaybe-uninitialized | ||||||
|  | 	 */ | ||||||
|  | 	int pby = 50; /* probability of bool     = y */ | ||||||
|  | 	int pty = 33; /* probability of tristate = y */ | ||||||
|  | 	int ptm = 33; /* probability of tristate = m */ | ||||||
|  | 	bool has_changed = false; | ||||||
|  |  | ||||||
|  | 	if (mode == def_random) { | ||||||
|  | 		int n, p[3]; | ||||||
|  | 		char *env = getenv("KCONFIG_PROBABILITY"); | ||||||
|  |  | ||||||
|  | 		n = 0; | ||||||
|  | 		while (env && *env) { | ||||||
|  | 			char *endp; | ||||||
|  | 			int tmp = strtol(env, &endp, 10); | ||||||
|  |  | ||||||
|  | 			if (tmp >= 0 && tmp <= 100) { | ||||||
|  | 				p[n++] = tmp; | ||||||
|  | 			} else { | ||||||
|  | 				errno = ERANGE; | ||||||
|  | 				perror("KCONFIG_PROBABILITY"); | ||||||
|  | 				exit(1); | ||||||
|  | 			} | ||||||
|  | 			env = (*endp == ':') ? endp + 1 : endp; | ||||||
|  | 			if (n >= 3) | ||||||
|  | 				break; | ||||||
|  | 		} | ||||||
|  | 		switch (n) { | ||||||
|  | 		case 1: | ||||||
|  | 			pby = p[0]; | ||||||
|  | 			ptm = pby / 2; | ||||||
|  | 			pty = pby - ptm; | ||||||
|  | 			break; | ||||||
|  | 		case 2: | ||||||
|  | 			pty = p[0]; | ||||||
|  | 			ptm = p[1]; | ||||||
|  | 			pby = pty + ptm; | ||||||
|  | 			break; | ||||||
|  | 		case 3: | ||||||
|  | 			pby = p[0]; | ||||||
|  | 			pty = p[1]; | ||||||
|  | 			ptm = p[2]; | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if (pty + ptm > 100) { | ||||||
|  | 			errno = ERANGE; | ||||||
|  | 			perror("KCONFIG_PROBABILITY"); | ||||||
|  | 			exit(1); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	sym_clear_all_valid(); | ||||||
|  |  | ||||||
|  | 	for_all_symbols(i, sym) { | ||||||
|  | 		if (sym_has_value(sym) || sym->flags & SYMBOL_VALID) | ||||||
|  | 			continue; | ||||||
|  | 		switch (sym_get_type(sym)) { | ||||||
|  | 		case S_BOOLEAN: | ||||||
|  | 		case S_TRISTATE: | ||||||
|  | 			has_changed = true; | ||||||
|  | 			switch (mode) { | ||||||
|  | 			case def_yes: | ||||||
|  | 				sym->def[S_DEF_USER].tri = yes; | ||||||
|  | 				break; | ||||||
|  | 			case def_mod: | ||||||
|  | 				sym->def[S_DEF_USER].tri = mod; | ||||||
|  | 				break; | ||||||
|  | 			case def_no: | ||||||
|  | 				sym->def[S_DEF_USER].tri = no; | ||||||
|  | 				break; | ||||||
|  | 			case def_random: | ||||||
|  | 				sym->def[S_DEF_USER].tri = no; | ||||||
|  | 				cnt = rand() % 100; | ||||||
|  | 				if (sym->type == S_TRISTATE) { | ||||||
|  | 					if (cnt < pty) | ||||||
|  | 						sym->def[S_DEF_USER].tri = yes; | ||||||
|  | 					else if (cnt < pty + ptm) | ||||||
|  | 						sym->def[S_DEF_USER].tri = mod; | ||||||
|  | 				} else if (cnt < pby) | ||||||
|  | 					sym->def[S_DEF_USER].tri = yes; | ||||||
|  | 				break; | ||||||
|  | 			default: | ||||||
|  | 				continue; | ||||||
|  | 			} | ||||||
|  | 			if (!(sym_is_choice(sym) && mode == def_random)) | ||||||
|  | 				sym->flags |= SYMBOL_DEF_USER; | ||||||
|  | 			break; | ||||||
|  | 		default: | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/* | ||||||
|  | 	 * We have different type of choice blocks. | ||||||
|  | 	 * If curr.tri equals to mod then we can select several | ||||||
|  | 	 * choice symbols in one block. | ||||||
|  | 	 * In this case we do nothing. | ||||||
|  | 	 * If curr.tri equals yes then only one symbol can be | ||||||
|  | 	 * selected in a choice block and we set it to yes, | ||||||
|  | 	 * and the rest to no. | ||||||
|  | 	 */ | ||||||
|  | 	if (mode != def_random) { | ||||||
|  | 		for_all_symbols(i, csym) { | ||||||
|  | 			if ((sym_is_choice(csym) && !sym_has_value(csym)) || | ||||||
|  | 			    sym_is_choice_value(csym)) | ||||||
|  | 				csym->flags |= SYMBOL_NEED_SET_CHOICE_VALUES; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	for_all_symbols(i, csym) { | ||||||
|  | 		if (sym_has_value(csym) || !sym_is_choice(csym)) | ||||||
|  | 			continue; | ||||||
|  |  | ||||||
|  | 		sym_calc_value(csym); | ||||||
|  | 		if (mode == def_random) | ||||||
|  | 			has_changed |= randomize_choice_values(csym); | ||||||
|  | 		else { | ||||||
|  | 			set_all_choice_values(csym); | ||||||
|  | 			has_changed = true; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return has_changed; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void conf_rewrite_mod_or_yes(enum conf_def_mode mode) | ||||||
|  | { | ||||||
|  | 	struct symbol *sym; | ||||||
|  | 	int i; | ||||||
|  | 	tristate old_val = (mode == def_y2m) ? yes : mod; | ||||||
|  | 	tristate new_val = (mode == def_y2m) ? mod : yes; | ||||||
|  |  | ||||||
|  | 	for_all_symbols(i, sym) { | ||||||
|  | 		if (sym_get_type(sym) == S_TRISTATE && | ||||||
|  | 		    sym->def[S_DEF_USER].tri == old_val) | ||||||
|  | 			sym->def[S_DEF_USER].tri = new_val; | ||||||
|  | 	} | ||||||
|  | 	sym_clear_all_valid(); | ||||||
|  | } | ||||||
|  |  | ||||||
| static int conf_askvalue(struct symbol *sym, const char *def) | static int conf_askvalue(struct symbol *sym, const char *def) | ||||||
| { | { | ||||||
| 	enum symbol_type type = sym_get_type(sym); |  | ||||||
|  |  | ||||||
| 	if (!sym_has_value(sym)) | 	if (!sym_has_value(sym)) | ||||||
| 		printf("(NEW) "); | 		printf("(NEW) "); | ||||||
|  |  | ||||||
| @ -109,24 +341,12 @@ static int conf_askvalue(struct symbol *sym, const char *def) | |||||||
| 			return 0; | 			return 0; | ||||||
| 		} | 		} | ||||||
| 		/* fall through */ | 		/* fall through */ | ||||||
| 	case oldaskconfig: | 	default: | ||||||
| 		fflush(stdout); | 		fflush(stdout); | ||||||
| 		xfgets(line, sizeof(line), stdin); | 		xfgets(line, sizeof(line), stdin); | ||||||
| 		return 1; |  | ||||||
| 	default: |  | ||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	switch (type) { |  | ||||||
| 	case S_INT: |  | ||||||
| 	case S_HEX: |  | ||||||
| 	case S_STRING: |  | ||||||
| 		printf("%s\n", def); |  | ||||||
| 		return 1; |  | ||||||
| 	default: |  | ||||||
| 		; |  | ||||||
| 	} |  | ||||||
| 	printf("%s", line); |  | ||||||
| 	return 1; | 	return 1; | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -139,7 +359,7 @@ static int conf_string(struct menu *menu) | |||||||
| 		printf("%*s%s ", indent - 1, "", menu->prompt->text); | 		printf("%*s%s ", indent - 1, "", menu->prompt->text); | ||||||
| 		printf("(%s) ", sym->name); | 		printf("(%s) ", sym->name); | ||||||
| 		def = sym_get_string_value(sym); | 		def = sym_get_string_value(sym); | ||||||
| 		if (sym_get_string_value(sym)) | 		if (def) | ||||||
| 			printf("[%s] ", def); | 			printf("[%s] ", def); | ||||||
| 		if (!conf_askvalue(sym, def)) | 		if (!conf_askvalue(sym, def)) | ||||||
| 			return 0; | 			return 0; | ||||||
| @ -421,34 +641,37 @@ static void check_conf(struct menu *menu) | |||||||
| 		return; | 		return; | ||||||
|  |  | ||||||
| 	sym = menu->sym; | 	sym = menu->sym; | ||||||
| 	if (sym && !sym_has_value(sym)) { | 	if (sym && !sym_has_value(sym) && | ||||||
| 		if (sym_is_changeable(sym) || | 	    (sym_is_changeable(sym) || | ||||||
| 		    (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) { | 	     (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes))) { | ||||||
| 			if (input_mode == listnewconfig) { |  | ||||||
| 				if (sym->name) { |  | ||||||
| 					const char *str; |  | ||||||
|  |  | ||||||
| 					if (sym->type == S_STRING) { | 		switch (input_mode) { | ||||||
| 						str = sym_get_string_value(sym); | 		case listnewconfig: | ||||||
| 						str = sym_escape_string_value(str); | 			if (sym->name) { | ||||||
| 						printf("%s%s=%s\n", CONFIG_, sym->name, str); | 				const char *str; | ||||||
| 						free((void *)str); |  | ||||||
| 					} else { | 				if (sym->type == S_STRING) { | ||||||
| 						str = sym_get_string_value(sym); | 					str = sym_get_string_value(sym); | ||||||
| 						printf("%s%s=%s\n", CONFIG_, sym->name, str); | 					str = sym_escape_string_value(str); | ||||||
| 					} | 					printf("%s%s=%s\n", CONFIG_, sym->name, str); | ||||||
|  | 					free((void *)str); | ||||||
|  | 				} else { | ||||||
|  | 					str = sym_get_string_value(sym); | ||||||
|  | 					printf("%s%s=%s\n", CONFIG_, sym->name, str); | ||||||
| 				} | 				} | ||||||
| 			} else if (input_mode == helpnewconfig) { |  | ||||||
| 				printf("-----\n"); |  | ||||||
| 				print_help(menu); |  | ||||||
| 				printf("-----\n"); |  | ||||||
|  |  | ||||||
| 			} else { |  | ||||||
| 				if (!conf_cnt++) |  | ||||||
| 					printf("*\n* Restart config...\n*\n"); |  | ||||||
| 				rootEntry = menu_get_parent_menu(menu); |  | ||||||
| 				conf(rootEntry); |  | ||||||
| 			} | 			} | ||||||
|  | 			break; | ||||||
|  | 		case helpnewconfig: | ||||||
|  | 			printf("-----\n"); | ||||||
|  | 			print_help(menu); | ||||||
|  | 			printf("-----\n"); | ||||||
|  | 			break; | ||||||
|  | 		default: | ||||||
|  | 			if (!conf_cnt++) | ||||||
|  | 				printf("*\n* Restart config...\n*\n"); | ||||||
|  | 			rootEntry = menu_get_parent_menu(menu); | ||||||
|  | 			conf(rootEntry); | ||||||
|  | 			break; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @ -456,31 +679,38 @@ static void check_conf(struct menu *menu) | |||||||
| 		check_conf(child); | 		check_conf(child); | ||||||
| } | } | ||||||
|  |  | ||||||
| static struct option long_opts[] = { | static const struct option long_opts[] = { | ||||||
| 	{"oldaskconfig",    no_argument,       NULL, oldaskconfig}, | 	{"help",          no_argument,       NULL,            'h'}, | ||||||
| 	{"oldconfig",       no_argument,       NULL, oldconfig}, | 	{"silent",        no_argument,       NULL,            's'}, | ||||||
| 	{"syncconfig",      no_argument,       NULL, syncconfig}, | 	{"oldaskconfig",  no_argument,       &input_mode_opt, oldaskconfig}, | ||||||
| 	{"defconfig",       required_argument, NULL, defconfig}, | 	{"oldconfig",     no_argument,       &input_mode_opt, oldconfig}, | ||||||
| 	{"savedefconfig",   required_argument, NULL, savedefconfig}, | 	{"syncconfig",    no_argument,       &input_mode_opt, syncconfig}, | ||||||
| 	{"allnoconfig",     no_argument,       NULL, allnoconfig}, | 	{"defconfig",     required_argument, &input_mode_opt, defconfig}, | ||||||
| 	{"allyesconfig",    no_argument,       NULL, allyesconfig}, | 	{"savedefconfig", required_argument, &input_mode_opt, savedefconfig}, | ||||||
| 	{"allmodconfig",    no_argument,       NULL, allmodconfig}, | 	{"allnoconfig",   no_argument,       &input_mode_opt, allnoconfig}, | ||||||
| 	{"alldefconfig",    no_argument,       NULL, alldefconfig}, | 	{"allyesconfig",  no_argument,       &input_mode_opt, allyesconfig}, | ||||||
| 	{"randconfig",      no_argument,       NULL, randconfig}, | 	{"allmodconfig",  no_argument,       &input_mode_opt, allmodconfig}, | ||||||
| 	{"listnewconfig",   no_argument,       NULL, listnewconfig}, | 	{"alldefconfig",  no_argument,       &input_mode_opt, alldefconfig}, | ||||||
| 	{"helpnewconfig",   no_argument,       NULL, helpnewconfig}, | 	{"randconfig",    no_argument,       &input_mode_opt, randconfig}, | ||||||
| 	{"olddefconfig",    no_argument,       NULL, olddefconfig}, | 	{"listnewconfig", no_argument,       &input_mode_opt, listnewconfig}, | ||||||
| 	{"yes2modconfig",   no_argument,       NULL, yes2modconfig}, | 	{"helpnewconfig", no_argument,       &input_mode_opt, helpnewconfig}, | ||||||
| 	{"mod2yesconfig",   no_argument,       NULL, mod2yesconfig}, | 	{"olddefconfig",  no_argument,       &input_mode_opt, olddefconfig}, | ||||||
| 	{"fatalrecursive",  no_argument,       NULL, fatalrecursive}, | 	{"yes2modconfig", no_argument,       &input_mode_opt, yes2modconfig}, | ||||||
|  | 	{"mod2yesconfig", no_argument,       &input_mode_opt, mod2yesconfig}, | ||||||
|  | 	{"fatalrecursive",no_argument,       NULL, fatalrecursive}, | ||||||
| 	{NULL, 0, NULL, 0} | 	{NULL, 0, NULL, 0} | ||||||
| }; | }; | ||||||
|  |  | ||||||
| static void conf_usage(const char *progname) | static void conf_usage(const char *progname) | ||||||
| { | { | ||||||
|  | 	printf("Usage: %s [options] <kconfig-file>\n", progname); | ||||||
| 	printf("Usage: %s [-s] [--fatalrecursive] [option] <kconfig-file>\n", progname); | 	printf("\n"); | ||||||
| 	printf("[option] is _one_ of the following:\n"); | 	printf("Generic options:\n"); | ||||||
|  | 	printf("  -h, --help              Print this message and exit.\n"); | ||||||
|  | 	printf("  -s, --silent            Do not print log.\n"); | ||||||
|  | 	printf("      --fatalrecursive    Treat recursive depenendencies as a fatal error\n"); | ||||||
|  | 	printf("\n"); | ||||||
|  | 	printf("Mode options:\n"); | ||||||
| 	printf("  --listnewconfig         List new options\n"); | 	printf("  --listnewconfig         List new options\n"); | ||||||
| 	printf("  --helpnewconfig         List new options and help text\n"); | 	printf("  --helpnewconfig         List new options and help text\n"); | ||||||
| 	printf("  --oldaskconfig          Start a new configuration using a line-oriented program\n"); | 	printf("  --oldaskconfig          Start a new configuration using a line-oriented program\n"); | ||||||
| @ -497,6 +727,7 @@ static void conf_usage(const char *progname) | |||||||
| 	printf("  --randconfig            New config with random answer to all options\n"); | 	printf("  --randconfig            New config with random answer to all options\n"); | ||||||
| 	printf("  --yes2modconfig         Change answers from yes to mod if possible\n"); | 	printf("  --yes2modconfig         Change answers from yes to mod if possible\n"); | ||||||
| 	printf("  --mod2yesconfig         Change answers from mod to yes if possible\n"); | 	printf("  --mod2yesconfig         Change answers from mod to yes if possible\n"); | ||||||
|  | 	printf("  (If none of the above is given, --oldaskconfig is the default)\n"); | ||||||
| } | } | ||||||
|  |  | ||||||
| int main(int ac, char **av) | int main(int ac, char **av) | ||||||
| @ -509,84 +740,56 @@ int main(int ac, char **av) | |||||||
|  |  | ||||||
| 	tty_stdio = isatty(0) && isatty(1); | 	tty_stdio = isatty(0) && isatty(1); | ||||||
|  |  | ||||||
| 	while ((opt = getopt_long(ac, av, "r:w:s", long_opts, NULL)) != -1) { | 	while ((opt = getopt_long(ac, av, "hr:sw:", long_opts, NULL)) != -1) { | ||||||
| 		if (opt == 's') { |  | ||||||
| 			conf_set_message_callback(NULL); |  | ||||||
| 			continue; |  | ||||||
| 		} |  | ||||||
| 		switch (opt) { | 		switch (opt) { | ||||||
| 		case syncconfig: | 		case 'h': | ||||||
| 			/* | 			conf_usage(progname); | ||||||
| 			 * syncconfig is invoked during the build stage. | 			exit(1); | ||||||
| 			 * Suppress distracting "configuration written to ..." | 			break; | ||||||
| 			 */ | 		case 's': | ||||||
| 			conf_set_message_callback(NULL); | 			conf_set_message_callback(NULL); | ||||||
| 			sync_kconfig = 1; |  | ||||||
| 			break; |  | ||||||
| 		case defconfig: |  | ||||||
| 		case savedefconfig: |  | ||||||
| 			defconfig_file = optarg; |  | ||||||
| 			break; |  | ||||||
| 		case randconfig: |  | ||||||
| 		{ |  | ||||||
| 			struct timeval now; |  | ||||||
| 			unsigned int seed; |  | ||||||
| 			char *seed_env; |  | ||||||
|  |  | ||||||
| 			/* |  | ||||||
| 			 * Use microseconds derived seed, |  | ||||||
| 			 * compensate for systems where it may be zero |  | ||||||
| 			 */ |  | ||||||
| 			gettimeofday(&now, NULL); |  | ||||||
| 			seed = (unsigned int)((now.tv_sec + 1) * (now.tv_usec + 1)); |  | ||||||
|  |  | ||||||
| 			seed_env = getenv("KCONFIG_SEED"); |  | ||||||
| 			if( seed_env && *seed_env ) { |  | ||||||
| 				char *endp; |  | ||||||
| 				int tmp = (int)strtol(seed_env, &endp, 0); |  | ||||||
| 				if (*endp == '\0') { |  | ||||||
| 					seed = tmp; |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 			fprintf( stderr, "KCONFIG_SEED=0x%X\n", seed ); |  | ||||||
| 			srand(seed); |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 		case oldaskconfig: |  | ||||||
| 		case oldconfig: |  | ||||||
| 		case allnoconfig: |  | ||||||
| 		case allyesconfig: |  | ||||||
| 		case allmodconfig: |  | ||||||
| 		case alldefconfig: |  | ||||||
| 		case listnewconfig: |  | ||||||
| 		case helpnewconfig: |  | ||||||
| 		case olddefconfig: |  | ||||||
| 		case yes2modconfig: |  | ||||||
| 		case mod2yesconfig: |  | ||||||
| 			break; | 			break; | ||||||
| 		case fatalrecursive: | 		case fatalrecursive: | ||||||
| 			recursive_is_error = 1; | 			recursive_is_error = 1; | ||||||
| 			continue; | 			continue; | ||||||
| 		case 'r': | 		case 'r': | ||||||
| 			input_file = optarg; | 			input_file = optarg; | ||||||
| 			continue; | 			break; | ||||||
| 		case 'w': | 		case 'w': | ||||||
| 			output_file = optarg; | 			output_file = optarg; | ||||||
| 			continue; | 			break; | ||||||
| 		case '?': | 		case 0: | ||||||
| 			conf_usage(progname); | 			input_mode = input_mode_opt; | ||||||
| 			exit(1); | 			switch (input_mode) { | ||||||
|  | 			case syncconfig: | ||||||
|  | 				/* | ||||||
|  | 				 * syncconfig is invoked during the build stage. | ||||||
|  | 				 * Suppress distracting | ||||||
|  | 				 *   "configuration written to ..." | ||||||
|  | 				 */ | ||||||
|  | 				conf_set_message_callback(NULL); | ||||||
|  | 				sync_kconfig = 1; | ||||||
|  | 				break; | ||||||
|  | 			case defconfig: | ||||||
|  | 			case savedefconfig: | ||||||
|  | 				defconfig_file = optarg; | ||||||
|  | 				break; | ||||||
|  | 			case randconfig: | ||||||
|  | 				set_randconfig_seed(); | ||||||
|  | 				break; | ||||||
|  | 			default: | ||||||
|  | 				break; | ||||||
|  | 			} | ||||||
|  | 		default: | ||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
| 		input_mode = (enum input_mode)opt; |  | ||||||
| 	} | 	} | ||||||
| 	if (ac == optind) { | 	if (ac == optind) { | ||||||
| 		fprintf(stderr, "%s: Kconfig file missing\n", av[0]); | 		fprintf(stderr, "%s: Kconfig file missing\n", av[0]); | ||||||
| 		conf_usage(progname); | 		conf_usage(progname); | ||||||
| 		exit(1); | 		exit(1); | ||||||
| 	} | 	} | ||||||
| 	name = av[optind]; | 	conf_parse(av[optind]); | ||||||
| 	conf_parse(name); |  | ||||||
| 	//zconfdump(stdout); | 	//zconfdump(stdout); | ||||||
|  |  | ||||||
| 	switch (input_mode) { | 	switch (input_mode) { | ||||||
|  | |||||||
| @ -5,6 +5,7 @@ | |||||||
|  |  | ||||||
| #include <sys/mman.h> | #include <sys/mman.h> | ||||||
| #include <sys/stat.h> | #include <sys/stat.h> | ||||||
|  | #include <sys/types.h> | ||||||
| #include <ctype.h> | #include <ctype.h> | ||||||
| #include <errno.h> | #include <errno.h> | ||||||
| #include <fcntl.h> | #include <fcntl.h> | ||||||
| @ -32,7 +33,7 @@ static bool is_dir(const char *path) | |||||||
| 	struct stat st; | 	struct stat st; | ||||||
|  |  | ||||||
| 	if (stat(path, &st)) | 	if (stat(path, &st)) | ||||||
| 		return 0; | 		return false; | ||||||
|  |  | ||||||
| 	return S_ISDIR(st.st_mode); | 	return S_ISDIR(st.st_mode); | ||||||
| } | } | ||||||
| @ -129,19 +130,14 @@ static size_t depfile_prefix_len; | |||||||
| static int conf_touch_dep(const char *name) | static int conf_touch_dep(const char *name) | ||||||
| { | { | ||||||
| 	int fd, ret; | 	int fd, ret; | ||||||
| 	const char *s; | 	char *d; | ||||||
| 	char *d, c; |  | ||||||
|  |  | ||||||
| 	/* check overflow: prefix + name + ".h" + '\0' must fit in buffer. */ | 	/* check overflow: prefix + name + '\0' must fit in buffer. */ | ||||||
| 	if (depfile_prefix_len + strlen(name) + 3 > sizeof(depfile_path)) | 	if (depfile_prefix_len + strlen(name) + 1 > sizeof(depfile_path)) | ||||||
| 		return -1; | 		return -1; | ||||||
|  |  | ||||||
| 	d = depfile_path + depfile_prefix_len; | 	d = depfile_path + depfile_prefix_len; | ||||||
| 	s = name; | 	strcpy(d, name); | ||||||
|  |  | ||||||
| 	while ((c = *s++)) |  | ||||||
| 		*d++ = (c == '_') ? '/' : tolower(c); |  | ||||||
| 	strcpy(d, ".h"); |  | ||||||
|  |  | ||||||
| 	/* Assume directory path already exists. */ | 	/* Assume directory path already exists. */ | ||||||
| 	fd = open(depfile_path, O_WRONLY | O_CREAT | O_TRUNC, 0644); | 	fd = open(depfile_path, O_WRONLY | O_CREAT | O_TRUNC, 0644); | ||||||
| @ -384,28 +380,46 @@ int conf_read_simple(const char *name, int def) | |||||||
| 	if (name) { | 	if (name) { | ||||||
| 		in = zconf_fopen(name); | 		in = zconf_fopen(name); | ||||||
| 	} else { | 	} else { | ||||||
| 		struct property *prop; | 		char *env; | ||||||
|  |  | ||||||
| 		name = conf_get_configname(); | 		name = conf_get_configname(); | ||||||
| 		in = zconf_fopen(name); | 		in = zconf_fopen(name); | ||||||
| 		if (in) | 		if (in) | ||||||
| 			goto load; | 			goto load; | ||||||
| 		sym_add_change_count(1); | 		conf_set_changed(true); | ||||||
| 		if (!sym_defconfig_list) |  | ||||||
|  | 		env = getenv("KCONFIG_DEFCONFIG_LIST"); | ||||||
|  | 		if (!env) | ||||||
| 			return 1; | 			return 1; | ||||||
|  |  | ||||||
| 		for_all_defaults(sym_defconfig_list, prop) { | 		while (1) { | ||||||
| 			if (expr_calc_value(prop->visible.expr) == no || | 			bool is_last; | ||||||
| 			    prop->expr->type != E_SYMBOL) |  | ||||||
| 				continue; | 			while (isspace(*env)) | ||||||
| 			sym_calc_value(prop->expr->left.sym); | 				env++; | ||||||
| 			name = sym_get_string_value(prop->expr->left.sym); |  | ||||||
| 			in = zconf_fopen(name); | 			if (!*env) | ||||||
|  | 				break; | ||||||
|  |  | ||||||
|  | 			p = env; | ||||||
|  | 			while (*p && !isspace(*p)) | ||||||
|  | 				p++; | ||||||
|  |  | ||||||
|  | 			is_last = (*p == '\0'); | ||||||
|  |  | ||||||
|  | 			*p = '\0'; | ||||||
|  |  | ||||||
|  | 			in = zconf_fopen(env); | ||||||
| 			if (in) { | 			if (in) { | ||||||
| 				conf_message("using defaults found in %s", | 				conf_message("using defaults found in %s", | ||||||
| 					 name); | 					     env); | ||||||
| 				goto load; | 				goto load; | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
|  | 			if (is_last) | ||||||
|  | 				break; | ||||||
|  |  | ||||||
|  | 			env = p + 1; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	if (!in) | 	if (!in) | ||||||
| @ -434,7 +448,7 @@ load: | |||||||
| 			if (def == S_DEF_USER) { | 			if (def == S_DEF_USER) { | ||||||
| 				sym = sym_find(line + 2 + strlen(CONFIG_)); | 				sym = sym_find(line + 2 + strlen(CONFIG_)); | ||||||
| 				if (!sym) { | 				if (!sym) { | ||||||
| 					sym_add_change_count(1); | 					conf_set_changed(true); | ||||||
| 					continue; | 					continue; | ||||||
| 				} | 				} | ||||||
| 			} else { | 			} else { | ||||||
| @ -470,11 +484,11 @@ load: | |||||||
| 					 * Reading from include/config/auto.conf | 					 * Reading from include/config/auto.conf | ||||||
| 					 * If CONFIG_FOO previously existed in | 					 * If CONFIG_FOO previously existed in | ||||||
| 					 * auto.conf but it is missing now, | 					 * auto.conf but it is missing now, | ||||||
| 					 * include/config/foo.h must be touched. | 					 * include/config/FOO must be touched. | ||||||
| 					 */ | 					 */ | ||||||
| 					conf_touch_dep(line + strlen(CONFIG_)); | 					conf_touch_dep(line + strlen(CONFIG_)); | ||||||
| 				else | 				else | ||||||
| 					sym_add_change_count(1); | 					conf_set_changed(true); | ||||||
| 				continue; | 				continue; | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| @ -519,7 +533,7 @@ int conf_read(const char *name) | |||||||
| 	int conf_unsaved = 0; | 	int conf_unsaved = 0; | ||||||
| 	int i; | 	int i; | ||||||
|  |  | ||||||
| 	sym_set_change_count(0); | 	conf_set_changed(false); | ||||||
|  |  | ||||||
| 	if (conf_read_simple(name, S_DEF_USER)) { | 	if (conf_read_simple(name, S_DEF_USER)) { | ||||||
| 		sym_calc_value(modules_sym); | 		sym_calc_value(modules_sym); | ||||||
| @ -577,7 +591,8 @@ int conf_read(const char *name) | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	sym_add_change_count(conf_warnings || conf_unsaved); | 	if (conf_warnings || conf_unsaved) | ||||||
|  | 		conf_set_changed(true); | ||||||
|  |  | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| @ -922,7 +937,7 @@ next: | |||||||
| 		if (is_same(name, tmpname)) { | 		if (is_same(name, tmpname)) { | ||||||
| 			conf_message("No change to %s", name); | 			conf_message("No change to %s", name); | ||||||
| 			unlink(tmpname); | 			unlink(tmpname); | ||||||
| 			sym_set_change_count(0); | 			conf_set_changed(false); | ||||||
| 			return 0; | 			return 0; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| @ -934,7 +949,7 @@ next: | |||||||
|  |  | ||||||
| 	conf_message("configuration written to %s", name); | 	conf_message("configuration written to %s", name); | ||||||
|  |  | ||||||
| 	sym_set_change_count(0); | 	conf_set_changed(false); | ||||||
|  |  | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| @ -1105,26 +1120,20 @@ int conf_write_autoconf(int overwrite) | |||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int sym_change_count; | static bool conf_changed; | ||||||
| static void (*conf_changed_callback)(void); | static void (*conf_changed_callback)(void); | ||||||
|  |  | ||||||
| void sym_set_change_count(int count) | void conf_set_changed(bool val) | ||||||
| { | { | ||||||
| 	int _sym_change_count = sym_change_count; | 	if (conf_changed_callback && conf_changed != val) | ||||||
| 	sym_change_count = count; |  | ||||||
| 	if (conf_changed_callback && |  | ||||||
| 	    (bool)_sym_change_count != (bool)count) |  | ||||||
| 		conf_changed_callback(); | 		conf_changed_callback(); | ||||||
| } |  | ||||||
|  |  | ||||||
| void sym_add_change_count(int count) | 	conf_changed = val; | ||||||
| { |  | ||||||
| 	sym_set_change_count(count + sym_change_count); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| bool conf_get_changed(void) | bool conf_get_changed(void) | ||||||
| { | { | ||||||
| 	return sym_change_count; | 	return conf_changed; | ||||||
| } | } | ||||||
|  |  | ||||||
| void conf_set_changed_callback(void (*fn)(void)) | void conf_set_changed_callback(void (*fn)(void)) | ||||||
| @ -1132,54 +1141,6 @@ void conf_set_changed_callback(void (*fn)(void)) | |||||||
| 	conf_changed_callback = fn; | 	conf_changed_callback = fn; | ||||||
| } | } | ||||||
|  |  | ||||||
| static bool randomize_choice_values(struct symbol *csym) |  | ||||||
| { |  | ||||||
| 	struct property *prop; |  | ||||||
| 	struct symbol *sym; |  | ||||||
| 	struct expr *e; |  | ||||||
| 	int cnt, def; |  | ||||||
|  |  | ||||||
| 	/* |  | ||||||
| 	 * If choice is mod then we may have more items selected |  | ||||||
| 	 * and if no then no-one. |  | ||||||
| 	 * In both cases stop. |  | ||||||
| 	 */ |  | ||||||
| 	if (csym->curr.tri != yes) |  | ||||||
| 		return false; |  | ||||||
|  |  | ||||||
| 	prop = sym_get_choice_prop(csym); |  | ||||||
|  |  | ||||||
| 	/* count entries in choice block */ |  | ||||||
| 	cnt = 0; |  | ||||||
| 	expr_list_for_each_sym(prop->expr, e, sym) |  | ||||||
| 		cnt++; |  | ||||||
|  |  | ||||||
| 	/* |  | ||||||
| 	 * find a random value and set it to yes, |  | ||||||
| 	 * set the rest to no so we have only one set |  | ||||||
| 	 */ |  | ||||||
| 	def = (rand() % cnt); |  | ||||||
|  |  | ||||||
| 	cnt = 0; |  | ||||||
| 	expr_list_for_each_sym(prop->expr, e, sym) { |  | ||||||
| 		if (def == cnt++) { |  | ||||||
| 			sym->def[S_DEF_USER].tri = yes; |  | ||||||
| 			csym->def[S_DEF_USER].val = sym; |  | ||||||
| 		} |  | ||||||
| 		else { |  | ||||||
| 			sym->def[S_DEF_USER].tri = no; |  | ||||||
| 		} |  | ||||||
| 		sym->flags |= SYMBOL_DEF_USER; |  | ||||||
| 		/* clear VALID to get value calculated */ |  | ||||||
| 		sym->flags &= ~SYMBOL_VALID; |  | ||||||
| 	} |  | ||||||
| 	csym->flags |= SYMBOL_DEF_USER; |  | ||||||
| 	/* clear VALID to get value calculated */ |  | ||||||
| 	csym->flags &= ~(SYMBOL_VALID); |  | ||||||
|  |  | ||||||
| 	return true; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void set_all_choice_values(struct symbol *csym) | void set_all_choice_values(struct symbol *csym) | ||||||
| { | { | ||||||
| 	struct property *prop; | 	struct property *prop; | ||||||
| @ -1199,147 +1160,3 @@ void set_all_choice_values(struct symbol *csym) | |||||||
| 	/* clear VALID to get value calculated */ | 	/* clear VALID to get value calculated */ | ||||||
| 	csym->flags &= ~(SYMBOL_VALID | SYMBOL_NEED_SET_CHOICE_VALUES); | 	csym->flags &= ~(SYMBOL_VALID | SYMBOL_NEED_SET_CHOICE_VALUES); | ||||||
| } | } | ||||||
|  |  | ||||||
| bool conf_set_all_new_symbols(enum conf_def_mode mode) |  | ||||||
| { |  | ||||||
| 	struct symbol *sym, *csym; |  | ||||||
| 	int i, cnt, pby, pty, ptm;	/* pby: probability of bool     = y |  | ||||||
| 					 * pty: probability of tristate = y |  | ||||||
| 					 * ptm: probability of tristate = m |  | ||||||
| 					 */ |  | ||||||
|  |  | ||||||
| 	pby = 50; pty = ptm = 33; /* can't go as the default in switch-case |  | ||||||
| 				   * below, otherwise gcc whines about |  | ||||||
| 				   * -Wmaybe-uninitialized */ |  | ||||||
| 	if (mode == def_random) { |  | ||||||
| 		int n, p[3]; |  | ||||||
| 		char *env = getenv("KCONFIG_PROBABILITY"); |  | ||||||
| 		n = 0; |  | ||||||
| 		while( env && *env ) { |  | ||||||
| 			char *endp; |  | ||||||
| 			int tmp = strtol( env, &endp, 10 ); |  | ||||||
| 			if( tmp >= 0 && tmp <= 100 ) { |  | ||||||
| 				p[n++] = tmp; |  | ||||||
| 			} else { |  | ||||||
| 				errno = ERANGE; |  | ||||||
| 				perror( "KCONFIG_PROBABILITY" ); |  | ||||||
| 				exit( 1 ); |  | ||||||
| 			} |  | ||||||
| 			env = (*endp == ':') ? endp+1 : endp; |  | ||||||
| 			if( n >=3 ) { |  | ||||||
| 				break; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		switch( n ) { |  | ||||||
| 		case 1: |  | ||||||
| 			pby = p[0]; ptm = pby/2; pty = pby-ptm; |  | ||||||
| 			break; |  | ||||||
| 		case 2: |  | ||||||
| 			pty = p[0]; ptm = p[1]; pby = pty + ptm; |  | ||||||
| 			break; |  | ||||||
| 		case 3: |  | ||||||
| 			pby = p[0]; pty = p[1]; ptm = p[2]; |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if( pty+ptm > 100 ) { |  | ||||||
| 			errno = ERANGE; |  | ||||||
| 			perror( "KCONFIG_PROBABILITY" ); |  | ||||||
| 			exit( 1 ); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	bool has_changed = false; |  | ||||||
|  |  | ||||||
| 	sym_clear_all_valid(); |  | ||||||
|  |  | ||||||
| 	for_all_symbols(i, sym) { |  | ||||||
| 		if (sym_has_value(sym) || (sym->flags & SYMBOL_VALID)) |  | ||||||
| 			continue; |  | ||||||
| 		switch (sym_get_type(sym)) { |  | ||||||
| 		case S_BOOLEAN: |  | ||||||
| 		case S_TRISTATE: |  | ||||||
| 			has_changed = true; |  | ||||||
| 			switch (mode) { |  | ||||||
| 			case def_yes: |  | ||||||
| 				sym->def[S_DEF_USER].tri = yes; |  | ||||||
| 				break; |  | ||||||
| 			case def_mod: |  | ||||||
| 				sym->def[S_DEF_USER].tri = mod; |  | ||||||
| 				break; |  | ||||||
| 			case def_no: |  | ||||||
| 				if (sym->flags & SYMBOL_ALLNOCONFIG_Y) |  | ||||||
| 					sym->def[S_DEF_USER].tri = yes; |  | ||||||
| 				else |  | ||||||
| 					sym->def[S_DEF_USER].tri = no; |  | ||||||
| 				break; |  | ||||||
| 			case def_random: |  | ||||||
| 				sym->def[S_DEF_USER].tri = no; |  | ||||||
| 				cnt = rand() % 100; |  | ||||||
| 				if (sym->type == S_TRISTATE) { |  | ||||||
| 					if (cnt < pty) |  | ||||||
| 						sym->def[S_DEF_USER].tri = yes; |  | ||||||
| 					else if (cnt < (pty+ptm)) |  | ||||||
| 						sym->def[S_DEF_USER].tri = mod; |  | ||||||
| 				} else if (cnt < pby) |  | ||||||
| 					sym->def[S_DEF_USER].tri = yes; |  | ||||||
| 				break; |  | ||||||
| 			default: |  | ||||||
| 				continue; |  | ||||||
| 			} |  | ||||||
| 			if (!(sym_is_choice(sym) && mode == def_random)) |  | ||||||
| 				sym->flags |= SYMBOL_DEF_USER; |  | ||||||
| 			break; |  | ||||||
| 		default: |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/* |  | ||||||
| 	 * We have different type of choice blocks. |  | ||||||
| 	 * If curr.tri equals to mod then we can select several |  | ||||||
| 	 * choice symbols in one block. |  | ||||||
| 	 * In this case we do nothing. |  | ||||||
| 	 * If curr.tri equals yes then only one symbol can be |  | ||||||
| 	 * selected in a choice block and we set it to yes, |  | ||||||
| 	 * and the rest to no. |  | ||||||
| 	 */ |  | ||||||
| 	if (mode != def_random) { |  | ||||||
| 		for_all_symbols(i, csym) { |  | ||||||
| 			if ((sym_is_choice(csym) && !sym_has_value(csym)) || |  | ||||||
| 			    sym_is_choice_value(csym)) |  | ||||||
| 				csym->flags |= SYMBOL_NEED_SET_CHOICE_VALUES; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	for_all_symbols(i, csym) { |  | ||||||
| 		if (sym_has_value(csym) || !sym_is_choice(csym)) |  | ||||||
| 			continue; |  | ||||||
|  |  | ||||||
| 		sym_calc_value(csym); |  | ||||||
| 		if (mode == def_random) |  | ||||||
| 			has_changed = randomize_choice_values(csym); |  | ||||||
| 		else { |  | ||||||
| 			set_all_choice_values(csym); |  | ||||||
| 			has_changed = true; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return has_changed; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void conf_rewrite_mod_or_yes(enum conf_def_mode mode) |  | ||||||
| { |  | ||||||
| 	struct symbol *sym; |  | ||||||
| 	int i; |  | ||||||
| 	tristate old_val = (mode == def_y2m) ? yes : mod; |  | ||||||
| 	tristate new_val = (mode == def_y2m) ? mod : yes; |  | ||||||
|  |  | ||||||
| 	for_all_symbols(i, sym) { |  | ||||||
| 		if (sym_get_type(sym) == S_TRISTATE && |  | ||||||
| 		    sym->def[S_DEF_USER].tri == old_val) { |  | ||||||
| 			sym->def[S_DEF_USER].tri = new_val; |  | ||||||
| 			sym_add_change_count(1); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  | |||||||
| @ -156,9 +156,6 @@ struct symbol { | |||||||
| /* choice values need to be set before calculating this symbol value */ | /* choice values need to be set before calculating this symbol value */ | ||||||
| #define SYMBOL_NEED_SET_CHOICE_VALUES  0x100000 | #define SYMBOL_NEED_SET_CHOICE_VALUES  0x100000 | ||||||
|  |  | ||||||
| /* Set symbol to y if allnoconfig; used for symbols that hide others */ |  | ||||||
| #define SYMBOL_ALLNOCONFIG_Y 0x200000 |  | ||||||
|  |  | ||||||
| #define SYMBOL_MAXLENGTH	256 | #define SYMBOL_MAXLENGTH	256 | ||||||
| #define SYMBOL_HASHSIZE		9973 | #define SYMBOL_HASHSIZE		9973 | ||||||
|  |  | ||||||
| @ -282,15 +279,12 @@ struct jump_key { | |||||||
| 	int index; | 	int index; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #define JUMP_NB			9 |  | ||||||
|  |  | ||||||
| extern struct file *file_list; | extern struct file *file_list; | ||||||
| extern struct file *current_file; | extern struct file *current_file; | ||||||
| struct file *lookup_file(const char *name); | struct file *lookup_file(const char *name); | ||||||
|  |  | ||||||
| extern struct symbol symbol_yes, symbol_no, symbol_mod; | extern struct symbol symbol_yes, symbol_no, symbol_mod; | ||||||
| extern struct symbol *modules_sym; | extern struct symbol *modules_sym; | ||||||
| extern struct symbol *sym_defconfig_list; |  | ||||||
| extern int cdebug; | extern int cdebug; | ||||||
| struct expr *expr_alloc_symbol(struct symbol *sym); | struct expr *expr_alloc_symbol(struct symbol *sym); | ||||||
| struct expr *expr_alloc_one(enum expr_type type, struct expr *ce); | struct expr *expr_alloc_one(enum expr_type type, struct expr *ce); | ||||||
|  | |||||||
| @ -5,7 +5,7 @@ | |||||||
|  |  | ||||||
| #include "images.h" | #include "images.h" | ||||||
|  |  | ||||||
| const char *xpm_load[] = { | const char * const xpm_load[] = { | ||||||
| "22 22 5 1", | "22 22 5 1", | ||||||
| ". c None", | ". c None", | ||||||
| "# c #000000", | "# c #000000", | ||||||
| @ -35,7 +35,7 @@ const char *xpm_load[] = { | |||||||
| "###############.......", | "###############.......", | ||||||
| "......................"}; | "......................"}; | ||||||
|  |  | ||||||
| const char *xpm_save[] = { | const char * const xpm_save[] = { | ||||||
| "22 22 5 1", | "22 22 5 1", | ||||||
| ". c None", | ". c None", | ||||||
| "# c #000000", | "# c #000000", | ||||||
| @ -65,7 +65,7 @@ const char *xpm_save[] = { | |||||||
| "..##################..", | "..##################..", | ||||||
| "......................"}; | "......................"}; | ||||||
|  |  | ||||||
| const char *xpm_back[] = { | const char * const xpm_back[] = { | ||||||
| "22 22 3 1", | "22 22 3 1", | ||||||
| ". c None", | ". c None", | ||||||
| "# c #000083", | "# c #000083", | ||||||
| @ -93,7 +93,7 @@ const char *xpm_back[] = { | |||||||
| "......................", | "......................", | ||||||
| "......................"}; | "......................"}; | ||||||
|  |  | ||||||
| const char *xpm_tree_view[] = { | const char * const xpm_tree_view[] = { | ||||||
| "22 22 2 1", | "22 22 2 1", | ||||||
| ". c None", | ". c None", | ||||||
| "# c #000000", | "# c #000000", | ||||||
| @ -120,7 +120,7 @@ const char *xpm_tree_view[] = { | |||||||
| "......................", | "......................", | ||||||
| "......................"}; | "......................"}; | ||||||
|  |  | ||||||
| const char *xpm_single_view[] = { | const char * const xpm_single_view[] = { | ||||||
| "22 22 2 1", | "22 22 2 1", | ||||||
| ". c None", | ". c None", | ||||||
| "# c #000000", | "# c #000000", | ||||||
| @ -147,7 +147,7 @@ const char *xpm_single_view[] = { | |||||||
| "......................", | "......................", | ||||||
| "......................"}; | "......................"}; | ||||||
|  |  | ||||||
| const char *xpm_split_view[] = { | const char * const xpm_split_view[] = { | ||||||
| "22 22 2 1", | "22 22 2 1", | ||||||
| ". c None", | ". c None", | ||||||
| "# c #000000", | "# c #000000", | ||||||
| @ -174,7 +174,7 @@ const char *xpm_split_view[] = { | |||||||
| "......................", | "......................", | ||||||
| "......................"}; | "......................"}; | ||||||
|  |  | ||||||
| const char *xpm_symbol_no[] = { | const char * const xpm_symbol_no[] = { | ||||||
| "12 12 2 1", | "12 12 2 1", | ||||||
| "  c white", | "  c white", | ||||||
| ". c black", | ". c black", | ||||||
| @ -191,7 +191,7 @@ const char *xpm_symbol_no[] = { | |||||||
| " .......... ", | " .......... ", | ||||||
| "            "}; | "            "}; | ||||||
|  |  | ||||||
| const char *xpm_symbol_mod[] = { | const char * const xpm_symbol_mod[] = { | ||||||
| "12 12 2 1", | "12 12 2 1", | ||||||
| "  c white", | "  c white", | ||||||
| ". c black", | ". c black", | ||||||
| @ -208,7 +208,7 @@ const char *xpm_symbol_mod[] = { | |||||||
| " .......... ", | " .......... ", | ||||||
| "            "}; | "            "}; | ||||||
|  |  | ||||||
| const char *xpm_symbol_yes[] = { | const char * const xpm_symbol_yes[] = { | ||||||
| "12 12 2 1", | "12 12 2 1", | ||||||
| "  c white", | "  c white", | ||||||
| ". c black", | ". c black", | ||||||
| @ -225,7 +225,7 @@ const char *xpm_symbol_yes[] = { | |||||||
| " .......... ", | " .......... ", | ||||||
| "            "}; | "            "}; | ||||||
|  |  | ||||||
| const char *xpm_choice_no[] = { | const char * const xpm_choice_no[] = { | ||||||
| "12 12 2 1", | "12 12 2 1", | ||||||
| "  c white", | "  c white", | ||||||
| ". c black", | ". c black", | ||||||
| @ -242,7 +242,7 @@ const char *xpm_choice_no[] = { | |||||||
| "    ....    ", | "    ....    ", | ||||||
| "            "}; | "            "}; | ||||||
|  |  | ||||||
| const char *xpm_choice_yes[] = { | const char * const xpm_choice_yes[] = { | ||||||
| "12 12 2 1", | "12 12 2 1", | ||||||
| "  c white", | "  c white", | ||||||
| ". c black", | ". c black", | ||||||
| @ -259,7 +259,7 @@ const char *xpm_choice_yes[] = { | |||||||
| "    ....    ", | "    ....    ", | ||||||
| "            "}; | "            "}; | ||||||
|  |  | ||||||
| const char *xpm_menu[] = { | const char * const xpm_menu[] = { | ||||||
| "12 12 2 1", | "12 12 2 1", | ||||||
| "  c white", | "  c white", | ||||||
| ". c black", | ". c black", | ||||||
| @ -276,7 +276,7 @@ const char *xpm_menu[] = { | |||||||
| " .......... ", | " .......... ", | ||||||
| "            "}; | "            "}; | ||||||
|  |  | ||||||
| const char *xpm_menu_inv[] = { | const char * const xpm_menu_inv[] = { | ||||||
| "12 12 2 1", | "12 12 2 1", | ||||||
| "  c white", | "  c white", | ||||||
| ". c black", | ". c black", | ||||||
| @ -293,7 +293,7 @@ const char *xpm_menu_inv[] = { | |||||||
| " .......... ", | " .......... ", | ||||||
| "            "}; | "            "}; | ||||||
|  |  | ||||||
| const char *xpm_menuback[] = { | const char * const xpm_menuback[] = { | ||||||
| "12 12 2 1", | "12 12 2 1", | ||||||
| "  c white", | "  c white", | ||||||
| ". c black", | ". c black", | ||||||
| @ -310,7 +310,7 @@ const char *xpm_menuback[] = { | |||||||
| " .......... ", | " .......... ", | ||||||
| "            "}; | "            "}; | ||||||
|  |  | ||||||
| const char *xpm_void[] = { | const char * const xpm_void[] = { | ||||||
| "12 12 2 1", | "12 12 2 1", | ||||||
| "  c white", | "  c white", | ||||||
| ". c black", | ". c black", | ||||||
|  | |||||||
| @ -10,21 +10,21 @@ | |||||||
| extern "C" { | extern "C" { | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| extern const char *xpm_load[]; | extern const char * const xpm_load[]; | ||||||
| extern const char *xpm_save[]; | extern const char * const xpm_save[]; | ||||||
| extern const char *xpm_back[]; | extern const char * const xpm_back[]; | ||||||
| extern const char *xpm_tree_view[]; | extern const char * const xpm_tree_view[]; | ||||||
| extern const char *xpm_single_view[]; | extern const char * const xpm_single_view[]; | ||||||
| extern const char *xpm_split_view[]; | extern const char * const xpm_split_view[]; | ||||||
| extern const char *xpm_symbol_no[]; | extern const char * const xpm_symbol_no[]; | ||||||
| extern const char *xpm_symbol_mod[]; | extern const char * const xpm_symbol_mod[]; | ||||||
| extern const char *xpm_symbol_yes[]; | extern const char * const xpm_symbol_yes[]; | ||||||
| extern const char *xpm_choice_no[]; | extern const char * const xpm_choice_no[]; | ||||||
| extern const char *xpm_choice_yes[]; | extern const char * const xpm_choice_yes[]; | ||||||
| extern const char *xpm_menu[]; | extern const char * const xpm_menu[]; | ||||||
| extern const char *xpm_menu_inv[]; | extern const char * const xpm_menu_inv[]; | ||||||
| extern const char *xpm_menuback[]; | extern const char * const xpm_menuback[]; | ||||||
| extern const char *xpm_void[]; | extern const char * const xpm_void[]; | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										9
									
								
								scripts/config/internal.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								scripts/config/internal.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | |||||||
|  | /* SPDX-License-Identifier: GPL-2.0-only */ | ||||||
|  | #ifndef INTERNAL_H | ||||||
|  | #define INTERNAL_H | ||||||
|  |  | ||||||
|  | struct menu; | ||||||
|  |  | ||||||
|  | extern struct menu *current_menu, *current_entry; | ||||||
|  |  | ||||||
|  | #endif /* INTERNAL_H */ | ||||||
| @ -12,7 +12,6 @@ | |||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
| #include <unistd.h> |  | ||||||
| #include <glob.h> | #include <glob.h> | ||||||
| #include <libgen.h> | #include <libgen.h> | ||||||
|  |  | ||||||
| @ -38,7 +37,7 @@ struct buffer { | |||||||
| 	YY_BUFFER_STATE state; | 	YY_BUFFER_STATE state; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| struct buffer *current_buf; | static struct buffer *current_buf; | ||||||
|  |  | ||||||
| static int last_ts, first_ts; | static int last_ts, first_ts; | ||||||
|  |  | ||||||
| @ -94,7 +93,6 @@ n	[A-Za-z0-9_-] | |||||||
| [ \t]*			/* whitespaces */ | [ \t]*			/* whitespaces */ | ||||||
| \\\n			/* escaped new line */ | \\\n			/* escaped new line */ | ||||||
| \n			return T_EOL; | \n			return T_EOL; | ||||||
| "allnoconfig_y"		return T_ALLNOCONFIG_Y; |  | ||||||
| "bool"			return T_BOOL; | "bool"			return T_BOOL; | ||||||
| "choice"		return T_CHOICE; | "choice"		return T_CHOICE; | ||||||
| "comment"		return T_COMMENT; | "comment"		return T_COMMENT; | ||||||
| @ -102,12 +100,11 @@ n	[A-Za-z0-9_-] | |||||||
| "def_bool"		return T_DEF_BOOL; | "def_bool"		return T_DEF_BOOL; | ||||||
| "def_tristate"		return T_DEF_TRISTATE; | "def_tristate"		return T_DEF_TRISTATE; | ||||||
| "default"		return T_DEFAULT; | "default"		return T_DEFAULT; | ||||||
| "defconfig_list"	return T_DEFCONFIG_LIST; |  | ||||||
| "depends"		return T_DEPENDS; | "depends"		return T_DEPENDS; | ||||||
| "endchoice"		return T_ENDCHOICE; | "endchoice"		return T_ENDCHOICE; | ||||||
| "endif"			return T_ENDIF; | "endif"			return T_ENDIF; | ||||||
| "endmenu"		return T_ENDMENU; | "endmenu"		return T_ENDMENU; | ||||||
| "help"|"---help---"	return T_HELP; | "help"			return T_HELP; | ||||||
| "hex"			return T_HEX; | "hex"			return T_HEX; | ||||||
| "if"			return T_IF; | "if"			return T_IF; | ||||||
| "imply"			return T_IMPLY; | "imply"			return T_IMPLY; | ||||||
| @ -117,7 +114,6 @@ n	[A-Za-z0-9_-] | |||||||
| "menuconfig"		return T_MENUCONFIG; | "menuconfig"		return T_MENUCONFIG; | ||||||
| "modules"		return T_MODULES; | "modules"		return T_MODULES; | ||||||
| "on"			return T_ON; | "on"			return T_ON; | ||||||
| "option"		return T_OPTION; |  | ||||||
| "optional"		return T_OPTIONAL; | "optional"		return T_OPTIONAL; | ||||||
| "prompt"		return T_PROMPT; | "prompt"		return T_PROMPT; | ||||||
| "range"			return T_RANGE; | "range"			return T_RANGE; | ||||||
|  | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -6,6 +6,10 @@ | |||||||
| #ifndef LKC_H | #ifndef LKC_H | ||||||
| #define LKC_H | #define LKC_H | ||||||
|  |  | ||||||
|  | #include <assert.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  |  | ||||||
| #include "expr.h" | #include "expr.h" | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| @ -16,10 +20,6 @@ extern "C" { | |||||||
|  |  | ||||||
| #define SRCTREE "srctree" | #define SRCTREE "srctree" | ||||||
|  |  | ||||||
| #ifndef PACKAGE |  | ||||||
| #define PACKAGE "linux" |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifndef CONFIG_ | #ifndef CONFIG_ | ||||||
| #define CONFIG_ "CONFIG_" | #define CONFIG_ "CONFIG_" | ||||||
| #endif | #endif | ||||||
| @ -30,16 +30,6 @@ static inline const char *CONFIG_prefix(void) | |||||||
| #undef CONFIG_ | #undef CONFIG_ | ||||||
| #define CONFIG_ CONFIG_prefix() | #define CONFIG_ CONFIG_prefix() | ||||||
|  |  | ||||||
| enum conf_def_mode { |  | ||||||
| 	def_default, |  | ||||||
| 	def_yes, |  | ||||||
| 	def_mod, |  | ||||||
| 	def_y2m, |  | ||||||
| 	def_m2y, |  | ||||||
| 	def_no, |  | ||||||
| 	def_random |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| extern int yylineno; | extern int yylineno; | ||||||
| void zconfdump(FILE *out); | void zconfdump(FILE *out); | ||||||
| void zconf_starthelp(void); | void zconf_starthelp(void); | ||||||
| @ -52,10 +42,6 @@ extern int recursive_is_error; | |||||||
|  |  | ||||||
| /* confdata.c */ | /* confdata.c */ | ||||||
| const char *conf_get_configname(void); | const char *conf_get_configname(void); | ||||||
| void sym_set_change_count(int count); |  | ||||||
| void sym_add_change_count(int count); |  | ||||||
| bool conf_set_all_new_symbols(enum conf_def_mode mode); |  | ||||||
| void conf_rewrite_mod_or_yes(enum conf_def_mode mode); |  | ||||||
| void set_all_choice_values(struct symbol *csym); | void set_all_choice_values(struct symbol *csym); | ||||||
|  |  | ||||||
| /* confdata.c and expr.c */ | /* confdata.c and expr.c */ | ||||||
| @ -67,24 +53,6 @@ static inline void xfwrite(const void *str, size_t len, size_t count, FILE *out) | |||||||
| 		fprintf(stderr, "Error in writing or end of file.\n"); | 		fprintf(stderr, "Error in writing or end of file.\n"); | ||||||
| } | } | ||||||
|  |  | ||||||
| /* menu.c */ |  | ||||||
| void _menu_init(void); |  | ||||||
| void menu_warn(struct menu *menu, const char *fmt, ...); |  | ||||||
| struct menu *menu_add_menu(void); |  | ||||||
| void menu_end_menu(void); |  | ||||||
| void menu_add_entry(struct symbol *sym); |  | ||||||
| void menu_add_dep(struct expr *dep); |  | ||||||
| void menu_add_visibility(struct expr *dep); |  | ||||||
| struct property *menu_add_prop(enum prop_type type, struct expr *expr, struct expr *dep); |  | ||||||
| struct property *menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep); |  | ||||||
| void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep); |  | ||||||
| void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep); |  | ||||||
| void menu_add_option_modules(void); |  | ||||||
| void menu_add_option_defconfig_list(void); |  | ||||||
| void menu_add_option_allnoconfig_y(void); |  | ||||||
| void menu_finalize(struct menu *parent); |  | ||||||
| void menu_set_type(int type); |  | ||||||
|  |  | ||||||
| /* util.c */ | /* util.c */ | ||||||
| struct file *file_lookup(const char *name); | struct file *file_lookup(const char *name); | ||||||
| void *xmalloc(size_t size); | void *xmalloc(size_t size); | ||||||
| @ -111,6 +79,34 @@ void str_append(struct gstr *gs, const char *s); | |||||||
| void str_printf(struct gstr *gs, const char *fmt, ...); | void str_printf(struct gstr *gs, const char *fmt, ...); | ||||||
| const char *str_get(struct gstr *gs); | const char *str_get(struct gstr *gs); | ||||||
|  |  | ||||||
|  | /* menu.c */ | ||||||
|  | void _menu_init(void); | ||||||
|  | void menu_warn(struct menu *menu, const char *fmt, ...); | ||||||
|  | struct menu *menu_add_menu(void); | ||||||
|  | void menu_end_menu(void); | ||||||
|  | void menu_add_entry(struct symbol *sym); | ||||||
|  | void menu_add_dep(struct expr *dep); | ||||||
|  | void menu_add_visibility(struct expr *dep); | ||||||
|  | struct property *menu_add_prop(enum prop_type type, struct expr *expr, struct expr *dep); | ||||||
|  | struct property *menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep); | ||||||
|  | void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep); | ||||||
|  | void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep); | ||||||
|  | void menu_finalize(struct menu *parent); | ||||||
|  | void menu_set_type(int type); | ||||||
|  |  | ||||||
|  | extern struct menu rootmenu; | ||||||
|  |  | ||||||
|  | bool menu_is_empty(struct menu *menu); | ||||||
|  | bool menu_is_visible(struct menu *menu); | ||||||
|  | bool menu_has_prompt(struct menu *menu); | ||||||
|  | const char *menu_get_prompt(struct menu *menu); | ||||||
|  | struct menu *menu_get_root_menu(struct menu *menu); | ||||||
|  | struct menu *menu_get_parent_menu(struct menu *menu); | ||||||
|  | bool menu_has_help(struct menu *menu); | ||||||
|  | const char *menu_get_help(struct menu *menu); | ||||||
|  | struct gstr get_relations_str(struct symbol **sym_arr, struct list_head *head); | ||||||
|  | void menu_get_ext_help(struct menu *menu, struct gstr *help); | ||||||
|  |  | ||||||
| /* symbol.c */ | /* symbol.c */ | ||||||
| void sym_clear_all_valid(void); | void sym_clear_all_valid(void); | ||||||
| struct symbol *sym_choice_default(struct symbol *sym); | struct symbol *sym_choice_default(struct symbol *sym); | ||||||
|  | |||||||
| @ -9,24 +9,11 @@ void conf_reset(int def); | |||||||
| int conf_write_defconfig(const char *name); | int conf_write_defconfig(const char *name); | ||||||
| int conf_write(const char *name); | int conf_write(const char *name); | ||||||
| int conf_write_autoconf(int overwrite); | int conf_write_autoconf(int overwrite); | ||||||
|  | void conf_set_changed(bool val); | ||||||
| bool conf_get_changed(void); | bool conf_get_changed(void); | ||||||
| void conf_set_changed_callback(void (*fn)(void)); | void conf_set_changed_callback(void (*fn)(void)); | ||||||
| void conf_set_message_callback(void (*fn)(const char *s)); | void conf_set_message_callback(void (*fn)(const char *s)); | ||||||
|  |  | ||||||
| /* menu.c */ |  | ||||||
| extern struct menu rootmenu; |  | ||||||
|  |  | ||||||
| bool menu_is_empty(struct menu *menu); |  | ||||||
| bool menu_is_visible(struct menu *menu); |  | ||||||
| bool menu_has_prompt(struct menu *menu); |  | ||||||
| const char * menu_get_prompt(struct menu *menu); |  | ||||||
| struct menu * menu_get_root_menu(struct menu *menu); |  | ||||||
| struct menu * menu_get_parent_menu(struct menu *menu); |  | ||||||
| bool menu_has_help(struct menu *menu); |  | ||||||
| const char * menu_get_help(struct menu *menu); |  | ||||||
| struct gstr get_relations_str(struct symbol **sym_arr, struct list_head *head); |  | ||||||
| void menu_get_ext_help(struct menu *menu, struct gstr *help); |  | ||||||
|  |  | ||||||
| /* symbol.c */ | /* symbol.c */ | ||||||
| extern struct symbol * symbol_hash[SYMBOL_HASHSIZE]; | extern struct symbol * symbol_hash[SYMBOL_HASHSIZE]; | ||||||
|  |  | ||||||
|  | |||||||
| @ -363,7 +363,7 @@ void print_title(WINDOW *dialog, const char *title, int width) | |||||||
| /* | /* | ||||||
|  * Print a string of text in a window, automatically wrap around to the |  * Print a string of text in a window, automatically wrap around to the | ||||||
|  * next line if the string is too long to fit on one line. Newline |  * next line if the string is too long to fit on one line. Newline | ||||||
|  * characters '\n' are propperly processed.  We start on a new line |  * characters '\n' are properly processed.  We start on a new line | ||||||
|  * if there is no room for at least 4 nonblanks following a double-space. |  * if there is no room for at least 4 nonblanks following a double-space. | ||||||
|  */ |  */ | ||||||
| void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x) | void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x) | ||||||
| @ -541,7 +541,7 @@ int first_alpha(const char *string, const char *exempt) | |||||||
|  * lxdialog suggest <ESC> <ESC> which is correctly translated to two |  * lxdialog suggest <ESC> <ESC> which is correctly translated to two | ||||||
|  * times esc. But then we need to ignore the second esc to avoid stepping |  * times esc. But then we need to ignore the second esc to avoid stepping | ||||||
|  * out one menu too much. Filter away all escaped key sequences since |  * out one menu too much. Filter away all escaped key sequences since | ||||||
|  * keypad(FALSE) turn off ncurses support for escape sequences - and thats |  * keypad(FALSE) turn off ncurses support for escape sequences - and that's | ||||||
|  * needed to make notimeout() do as expected. |  * needed to make notimeout() do as expected. | ||||||
|  */ |  */ | ||||||
| int on_key_esc(WINDOW *win) | int on_key_esc(WINDOW *win) | ||||||
|  | |||||||
| @ -33,7 +33,9 @@ if [ -f /usr/include/ncurses/ncurses.h ]; then | |||||||
| 	exit 0 | 	exit 0 | ||||||
| fi | fi | ||||||
|  |  | ||||||
| if [ -f /usr/include/ncurses.h ]; then | # As a final fallback before giving up, check if $HOSTCC knows of a default | ||||||
|  | # ncurses installation (e.g. from a vendor-specific sysroot). | ||||||
|  | if echo '#include <ncurses.h>' | ${HOSTCC} -E - >/dev/null 2>&1; then | ||||||
| 	echo cflags=\"-D_GNU_SOURCE\" | 	echo cflags=\"-D_GNU_SOURCE\" | ||||||
| 	echo libs=\"-lncurses\" | 	echo libs=\"-lncurses\" | ||||||
| 	exit 0 | 	exit 0 | ||||||
|  | |||||||
| @ -22,6 +22,8 @@ | |||||||
| #include "lkc.h" | #include "lkc.h" | ||||||
| #include "lxdialog/dialog.h" | #include "lxdialog/dialog.h" | ||||||
|  |  | ||||||
|  | #define JUMP_NB			9 | ||||||
|  |  | ||||||
| static const char mconf_readme[] = | static const char mconf_readme[] = | ||||||
| "OpenWrt config is based on Kernel kconfig\n" | "OpenWrt config is based on Kernel kconfig\n" | ||||||
| "so ipkg packages are referred here as modules.\n" | "so ipkg packages are referred here as modules.\n" | ||||||
| @ -300,17 +302,12 @@ static char filename[PATH_MAX+1]; | |||||||
| static void set_config_filename(const char *config_filename) | static void set_config_filename(const char *config_filename) | ||||||
| { | { | ||||||
| 	static char menu_backtitle[PATH_MAX+128]; | 	static char menu_backtitle[PATH_MAX+128]; | ||||||
| 	int size; |  | ||||||
|  |  | ||||||
| 	size = snprintf(menu_backtitle, sizeof(menu_backtitle), | 	snprintf(menu_backtitle, sizeof(menu_backtitle), "%s - %s", | ||||||
| 			"%s - %s", config_filename, rootmenu.prompt->text); | 		 config_filename, rootmenu.prompt->text); | ||||||
| 	if (size >= sizeof(menu_backtitle)) |  | ||||||
| 		menu_backtitle[sizeof(menu_backtitle)-1] = '\0'; |  | ||||||
| 	set_dialog_backtitle(menu_backtitle); | 	set_dialog_backtitle(menu_backtitle); | ||||||
|  |  | ||||||
| 	size = snprintf(filename, sizeof(filename), "%s", config_filename); | 	snprintf(filename, sizeof(filename), "%s", config_filename); | ||||||
| 	if (size >= sizeof(filename)) |  | ||||||
| 		filename[sizeof(filename)-1] = '\0'; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| struct subtitle_part { | struct subtitle_part { | ||||||
| @ -921,7 +918,7 @@ static void conf_load(void) | |||||||
| 				return; | 				return; | ||||||
| 			if (!conf_read(dialog_input_result)) { | 			if (!conf_read(dialog_input_result)) { | ||||||
| 				set_config_filename(dialog_input_result); | 				set_config_filename(dialog_input_result); | ||||||
| 				sym_set_change_count(1); | 				conf_set_changed(true); | ||||||
| 				return; | 				return; | ||||||
| 			} | 			} | ||||||
| 			show_textbox(NULL, "File does not exist!", 5, 38); | 			show_textbox(NULL, "File does not exist!", 5, 38); | ||||||
|  | |||||||
| @ -9,6 +9,7 @@ | |||||||
| #include <string.h> | #include <string.h> | ||||||
|  |  | ||||||
| #include "lkc.h" | #include "lkc.h" | ||||||
|  | #include "internal.h" | ||||||
|  |  | ||||||
| static const char nohelp_text[] = "There is no help available for this option."; | static const char nohelp_text[] = "There is no help available for this option."; | ||||||
|  |  | ||||||
| @ -65,7 +66,8 @@ void menu_add_entry(struct symbol *sym) | |||||||
| struct menu *menu_add_menu(void) | struct menu *menu_add_menu(void) | ||||||
| { | { | ||||||
| 	last_entry_ptr = ¤t_entry->list; | 	last_entry_ptr = ¤t_entry->list; | ||||||
| 	return current_menu = current_entry; | 	current_menu = current_entry; | ||||||
|  | 	return current_menu; | ||||||
| } | } | ||||||
|  |  | ||||||
| void menu_end_menu(void) | void menu_end_menu(void) | ||||||
| @ -210,28 +212,6 @@ void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep) | |||||||
| 	menu_add_prop(type, expr_alloc_symbol(sym), dep); | 	menu_add_prop(type, expr_alloc_symbol(sym), dep); | ||||||
| } | } | ||||||
|  |  | ||||||
| void menu_add_option_modules(void) |  | ||||||
| { |  | ||||||
| 	if (modules_sym) |  | ||||||
| 		zconf_error("symbol '%s' redefines option 'modules' already defined by symbol '%s'", |  | ||||||
| 			    current_entry->sym->name, modules_sym->name); |  | ||||||
| 	modules_sym = current_entry->sym; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void menu_add_option_defconfig_list(void) |  | ||||||
| { |  | ||||||
| 	if (!sym_defconfig_list) |  | ||||||
| 		sym_defconfig_list = current_entry->sym; |  | ||||||
| 	else if (sym_defconfig_list != current_entry->sym) |  | ||||||
| 		zconf_error("trying to redefine defconfig symbol"); |  | ||||||
| 	sym_defconfig_list->flags |= SYMBOL_NO_WRITE; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void menu_add_option_allnoconfig_y(void) |  | ||||||
| { |  | ||||||
| 	current_entry->sym->flags |= SYMBOL_ALLNOCONFIG_Y; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| static int menu_validate_number(struct symbol *sym, struct symbol *sym2) | static int menu_validate_number(struct symbol *sym, struct symbol *sym2) | ||||||
| { | { | ||||||
| 	return sym2->type == S_INT || sym2->type == S_HEX || | 	return sym2->type == S_INT || sym2->type == S_HEX || | ||||||
|  | |||||||
| @ -271,7 +271,7 @@ static int mwin_max_cols; | |||||||
| static MENU *curses_menu; | static MENU *curses_menu; | ||||||
| static ITEM *curses_menu_items[MAX_MENU_ITEMS]; | static ITEM *curses_menu_items[MAX_MENU_ITEMS]; | ||||||
| static struct mitem k_menu_items[MAX_MENU_ITEMS]; | static struct mitem k_menu_items[MAX_MENU_ITEMS]; | ||||||
| static int items_num; | static unsigned int items_num; | ||||||
| static int global_exit; | static int global_exit; | ||||||
| /* the currently selected button */ | /* the currently selected button */ | ||||||
| static const char *current_instructions = menu_instructions; | static const char *current_instructions = menu_instructions; | ||||||
| @ -373,18 +373,18 @@ static void print_function_line(void) | |||||||
| 	int lines = getmaxy(stdscr); | 	int lines = getmaxy(stdscr); | ||||||
|  |  | ||||||
| 	for (i = 0; i < function_keys_num; i++) { | 	for (i = 0; i < function_keys_num; i++) { | ||||||
| 		(void) wattrset(main_window, attributes[FUNCTION_HIGHLIGHT]); | 		wattrset(main_window, attr_function_highlight); | ||||||
| 		mvwprintw(main_window, lines-3, offset, | 		mvwprintw(main_window, lines-3, offset, | ||||||
| 				"%s", | 				"%s", | ||||||
| 				function_keys[i].key_str); | 				function_keys[i].key_str); | ||||||
| 		(void) wattrset(main_window, attributes[FUNCTION_TEXT]); | 		wattrset(main_window, attr_function_text); | ||||||
| 		offset += strlen(function_keys[i].key_str); | 		offset += strlen(function_keys[i].key_str); | ||||||
| 		mvwprintw(main_window, lines-3, | 		mvwprintw(main_window, lines-3, | ||||||
| 				offset, "%s", | 				offset, "%s", | ||||||
| 				function_keys[i].func); | 				function_keys[i].func); | ||||||
| 		offset += strlen(function_keys[i].func) + skip; | 		offset += strlen(function_keys[i].func) + skip; | ||||||
| 	} | 	} | ||||||
| 	(void) wattrset(main_window, attributes[NORMAL]); | 	wattrset(main_window, attr_normal); | ||||||
| } | } | ||||||
|  |  | ||||||
| /* help */ | /* help */ | ||||||
| @ -499,16 +499,20 @@ typedef enum {MATCH_TINKER_PATTERN_UP, MATCH_TINKER_PATTERN_DOWN, | |||||||
| /* return the index of the matched item, or -1 if no such item exists */ | /* return the index of the matched item, or -1 if no such item exists */ | ||||||
| static int get_mext_match(const char *match_str, match_f flag) | static int get_mext_match(const char *match_str, match_f flag) | ||||||
| { | { | ||||||
| 	int match_start = item_index(current_item(curses_menu)); | 	int match_start, index; | ||||||
| 	int index; |  | ||||||
|  | 	/* Do not search if the menu is empty (i.e. items_num == 0) */ | ||||||
|  | 	match_start = item_index(current_item(curses_menu)); | ||||||
|  | 	if (match_start == ERR) | ||||||
|  | 		return -1; | ||||||
|  |  | ||||||
| 	if (flag == FIND_NEXT_MATCH_DOWN) | 	if (flag == FIND_NEXT_MATCH_DOWN) | ||||||
| 		++match_start; | 		++match_start; | ||||||
| 	else if (flag == FIND_NEXT_MATCH_UP) | 	else if (flag == FIND_NEXT_MATCH_UP) | ||||||
| 		--match_start; | 		--match_start; | ||||||
|  |  | ||||||
|  | 	match_start = (match_start + items_num) % items_num; | ||||||
| 	index = match_start; | 	index = match_start; | ||||||
| 	index = (index + items_num) % items_num; |  | ||||||
| 	while (true) { | 	while (true) { | ||||||
| 		char *str = k_menu_items[index].str; | 		char *str = k_menu_items[index].str; | ||||||
| 		if (strcasestr(str, match_str) != NULL) | 		if (strcasestr(str, match_str) != NULL) | ||||||
| @ -630,19 +634,12 @@ static int item_is_tag(char tag) | |||||||
|  |  | ||||||
| static char filename[PATH_MAX+1]; | static char filename[PATH_MAX+1]; | ||||||
| static char menu_backtitle[PATH_MAX+128]; | static char menu_backtitle[PATH_MAX+128]; | ||||||
| static const char *set_config_filename(const char *config_filename) | static void set_config_filename(const char *config_filename) | ||||||
| { | { | ||||||
| 	int size; | 	snprintf(menu_backtitle, sizeof(menu_backtitle), "%s - %s", | ||||||
|  | 		 config_filename, rootmenu.prompt->text); | ||||||
|  |  | ||||||
| 	size = snprintf(menu_backtitle, sizeof(menu_backtitle), | 	snprintf(filename, sizeof(filename), "%s", config_filename); | ||||||
| 			"%s - %s", config_filename, rootmenu.prompt->text); |  | ||||||
| 	if (size >= sizeof(menu_backtitle)) |  | ||||||
| 		menu_backtitle[sizeof(menu_backtitle)-1] = '\0'; |  | ||||||
|  |  | ||||||
| 	size = snprintf(filename, sizeof(filename), "%s", config_filename); |  | ||||||
| 	if (size >= sizeof(filename)) |  | ||||||
| 		filename[sizeof(filename)-1] = '\0'; |  | ||||||
| 	return menu_backtitle; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| /* return = 0 means we are successful. | /* return = 0 means we are successful. | ||||||
| @ -758,7 +755,6 @@ static void build_conf(struct menu *menu) | |||||||
| 			switch (ptype) { | 			switch (ptype) { | ||||||
| 			case P_MENU: | 			case P_MENU: | ||||||
| 				child_count++; | 				child_count++; | ||||||
| 				prompt = prompt; |  | ||||||
| 				if (single_menu_mode) { | 				if (single_menu_mode) { | ||||||
| 					item_make(menu, 'm', | 					item_make(menu, 'm', | ||||||
| 						"%s%*c%s", | 						"%s%*c%s", | ||||||
| @ -960,16 +956,15 @@ static void show_menu(const char *prompt, const char *instructions, | |||||||
| 	current_instructions = instructions; | 	current_instructions = instructions; | ||||||
|  |  | ||||||
| 	clear(); | 	clear(); | ||||||
| 	(void) wattrset(main_window, attributes[NORMAL]); | 	print_in_middle(stdscr, 1, getmaxx(stdscr), | ||||||
| 	print_in_middle(stdscr, 1, 0, getmaxx(stdscr), |  | ||||||
| 			menu_backtitle, | 			menu_backtitle, | ||||||
| 			attributes[MAIN_HEADING]); | 			attr_main_heading); | ||||||
|  |  | ||||||
| 	(void) wattrset(main_window, attributes[MAIN_MENU_BOX]); | 	wattrset(main_window, attr_main_menu_box); | ||||||
| 	box(main_window, 0, 0); | 	box(main_window, 0, 0); | ||||||
| 	(void) wattrset(main_window, attributes[MAIN_MENU_HEADING]); | 	wattrset(main_window, attr_main_menu_heading); | ||||||
| 	mvwprintw(main_window, 0, 3, " %s ", prompt); | 	mvwprintw(main_window, 0, 3, " %s ", prompt); | ||||||
| 	(void) wattrset(main_window, attributes[NORMAL]); | 	wattrset(main_window, attr_normal); | ||||||
|  |  | ||||||
| 	set_menu_items(curses_menu, curses_menu_items); | 	set_menu_items(curses_menu, curses_menu_items); | ||||||
|  |  | ||||||
| @ -1072,7 +1067,6 @@ static int do_match(int key, struct match_state *state, int *ans) | |||||||
| static void conf(struct menu *menu) | static void conf(struct menu *menu) | ||||||
| { | { | ||||||
| 	struct menu *submenu = NULL; | 	struct menu *submenu = NULL; | ||||||
| 	const char *prompt = menu_get_prompt(menu); |  | ||||||
| 	struct symbol *sym; | 	struct symbol *sym; | ||||||
| 	int res; | 	int res; | ||||||
| 	int current_index = 0; | 	int current_index = 0; | ||||||
| @ -1090,9 +1084,8 @@ static void conf(struct menu *menu) | |||||||
| 		if (!child_count) | 		if (!child_count) | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 		show_menu(prompt ? prompt : "Main Menu", | 		show_menu(menu_get_prompt(menu), menu_instructions, | ||||||
| 				menu_instructions, | 			  current_index, &last_top_row); | ||||||
| 				current_index, &last_top_row); |  | ||||||
| 		keypad((menu_win(curses_menu)), TRUE); | 		keypad((menu_win(curses_menu)), TRUE); | ||||||
| 		while (!global_exit) { | 		while (!global_exit) { | ||||||
| 			if (match_state.in_search) { | 			if (match_state.in_search) { | ||||||
| @ -1418,7 +1411,7 @@ static void conf_load(void) | |||||||
| 				return; | 				return; | ||||||
| 			if (!conf_read(dialog_input_result)) { | 			if (!conf_read(dialog_input_result)) { | ||||||
| 				set_config_filename(dialog_input_result); | 				set_config_filename(dialog_input_result); | ||||||
| 				sym_set_change_count(1); | 				conf_set_changed(true); | ||||||
| 				return; | 				return; | ||||||
| 			} | 			} | ||||||
| 			btn_dialog(main_window, "File does not exist!", 0); | 			btn_dialog(main_window, "File does not exist!", 0); | ||||||
| @ -1537,9 +1530,9 @@ int main(int ac, char **av) | |||||||
| 	menu_opts_on(curses_menu, O_NONCYCLIC); | 	menu_opts_on(curses_menu, O_NONCYCLIC); | ||||||
| 	menu_opts_on(curses_menu, O_IGNORECASE); | 	menu_opts_on(curses_menu, O_IGNORECASE); | ||||||
| 	set_menu_mark(curses_menu, " "); | 	set_menu_mark(curses_menu, " "); | ||||||
| 	set_menu_fore(curses_menu, attributes[MAIN_MENU_FORE]); | 	set_menu_fore(curses_menu, attr_main_menu_fore); | ||||||
| 	set_menu_back(curses_menu, attributes[MAIN_MENU_BACK]); | 	set_menu_back(curses_menu, attr_main_menu_back); | ||||||
| 	set_menu_grey(curses_menu, attributes[MAIN_MENU_GREY]); | 	set_menu_grey(curses_menu, attr_main_menu_grey); | ||||||
|  |  | ||||||
| 	set_config_filename(conf_get_configname()); | 	set_config_filename(conf_get_configname()); | ||||||
| 	setup_windows(); | 	setup_windows(); | ||||||
|  | |||||||
| @ -7,169 +7,120 @@ | |||||||
| #include "nconf.h" | #include "nconf.h" | ||||||
| #include "lkc.h" | #include "lkc.h" | ||||||
|  |  | ||||||
| /* a list of all the different widgets we use */ | int attr_normal; | ||||||
| attributes_t attributes[ATTR_MAX+1] = {0}; | int attr_main_heading; | ||||||
|  | int attr_main_menu_box; | ||||||
|  | int attr_main_menu_fore; | ||||||
|  | int attr_main_menu_back; | ||||||
|  | int attr_main_menu_grey; | ||||||
|  | int attr_main_menu_heading; | ||||||
|  | int attr_scrollwin_text; | ||||||
|  | int attr_scrollwin_heading; | ||||||
|  | int attr_scrollwin_box; | ||||||
|  | int attr_dialog_text; | ||||||
|  | int attr_dialog_menu_fore; | ||||||
|  | int attr_dialog_menu_back; | ||||||
|  | int attr_dialog_box; | ||||||
|  | int attr_input_box; | ||||||
|  | int attr_input_heading; | ||||||
|  | int attr_input_text; | ||||||
|  | int attr_input_field; | ||||||
|  | int attr_function_text; | ||||||
|  | int attr_function_highlight; | ||||||
|  |  | ||||||
| /* available colors: | #define COLOR_ATTR(_at, _fg, _bg, _hl) \ | ||||||
|    COLOR_BLACK   0 | 	{ .attr = &(_at), .has_color = true, .color_fg = _fg, .color_bg = _bg, .highlight = _hl } | ||||||
|    COLOR_RED     1 | #define NO_COLOR_ATTR(_at, _hl) \ | ||||||
|    COLOR_GREEN   2 | 	{ .attr = &(_at), .has_color = false, .highlight = _hl } | ||||||
|    COLOR_YELLOW  3 | #define COLOR_DEFAULT		-1 | ||||||
|    COLOR_BLUE    4 |  | ||||||
|    COLOR_MAGENTA 5 |  | ||||||
|    COLOR_CYAN    6 |  | ||||||
|    COLOR_WHITE   7 |  | ||||||
|    */ |  | ||||||
| static void set_normal_colors(void) |  | ||||||
| { |  | ||||||
| 	init_pair(NORMAL, -1, -1); |  | ||||||
| 	init_pair(MAIN_HEADING, COLOR_MAGENTA, -1); |  | ||||||
|  |  | ||||||
| 	/* FORE is for the selected item */ | struct nconf_attr_param { | ||||||
| 	init_pair(MAIN_MENU_FORE, -1, -1); | 	int *attr; | ||||||
| 	/* BACK for all the rest */ | 	bool has_color; | ||||||
| 	init_pair(MAIN_MENU_BACK, -1, -1); | 	int color_fg; | ||||||
| 	init_pair(MAIN_MENU_GREY, -1, -1); | 	int color_bg; | ||||||
| 	init_pair(MAIN_MENU_HEADING, COLOR_GREEN, -1); | 	int highlight; | ||||||
| 	init_pair(MAIN_MENU_BOX, COLOR_YELLOW, -1); | }; | ||||||
|  |  | ||||||
| 	init_pair(SCROLLWIN_TEXT, -1, -1); | static const struct nconf_attr_param color_theme_params[] = { | ||||||
| 	init_pair(SCROLLWIN_HEADING, COLOR_GREEN, -1); | 	COLOR_ATTR(attr_normal,			COLOR_DEFAULT,	COLOR_DEFAULT,	A_NORMAL), | ||||||
| 	init_pair(SCROLLWIN_BOX, COLOR_YELLOW, -1); | 	COLOR_ATTR(attr_main_heading,		COLOR_MAGENTA,	COLOR_DEFAULT,	A_BOLD | A_UNDERLINE), | ||||||
|  | 	COLOR_ATTR(attr_main_menu_box,		COLOR_YELLOW,	COLOR_DEFAULT,	A_NORMAL), | ||||||
|  | 	COLOR_ATTR(attr_main_menu_fore,		COLOR_DEFAULT,	COLOR_DEFAULT,	A_REVERSE), | ||||||
|  | 	COLOR_ATTR(attr_main_menu_back,		COLOR_DEFAULT,	COLOR_DEFAULT,	A_NORMAL), | ||||||
|  | 	COLOR_ATTR(attr_main_menu_grey,		COLOR_DEFAULT,	COLOR_DEFAULT,	A_NORMAL), | ||||||
|  | 	COLOR_ATTR(attr_main_menu_heading,	COLOR_GREEN,	COLOR_DEFAULT,	A_BOLD), | ||||||
|  | 	COLOR_ATTR(attr_scrollwin_text,		COLOR_DEFAULT,	COLOR_DEFAULT,	A_NORMAL), | ||||||
|  | 	COLOR_ATTR(attr_scrollwin_heading,	COLOR_GREEN,	COLOR_DEFAULT,	A_BOLD), | ||||||
|  | 	COLOR_ATTR(attr_scrollwin_box,		COLOR_YELLOW,	COLOR_DEFAULT,	A_BOLD), | ||||||
|  | 	COLOR_ATTR(attr_dialog_text,		COLOR_DEFAULT,	COLOR_DEFAULT,	A_BOLD), | ||||||
|  | 	COLOR_ATTR(attr_dialog_menu_fore,	COLOR_RED,	COLOR_DEFAULT,	A_STANDOUT), | ||||||
|  | 	COLOR_ATTR(attr_dialog_menu_back,	COLOR_YELLOW,	COLOR_DEFAULT,	A_NORMAL), | ||||||
|  | 	COLOR_ATTR(attr_dialog_box,		COLOR_YELLOW,	COLOR_DEFAULT,	A_BOLD), | ||||||
|  | 	COLOR_ATTR(attr_input_box,		COLOR_YELLOW,	COLOR_DEFAULT,	A_NORMAL), | ||||||
|  | 	COLOR_ATTR(attr_input_heading,		COLOR_GREEN,	COLOR_DEFAULT,	A_BOLD), | ||||||
|  | 	COLOR_ATTR(attr_input_text,		COLOR_DEFAULT,	COLOR_DEFAULT,	A_NORMAL), | ||||||
|  | 	COLOR_ATTR(attr_input_field,		COLOR_DEFAULT,	COLOR_DEFAULT,	A_UNDERLINE), | ||||||
|  | 	COLOR_ATTR(attr_function_text,		COLOR_YELLOW,	COLOR_DEFAULT,	A_REVERSE), | ||||||
|  | 	COLOR_ATTR(attr_function_highlight,	COLOR_DEFAULT,	COLOR_DEFAULT,	A_BOLD), | ||||||
|  | 	{ /* sentinel */ } | ||||||
|  | }; | ||||||
|  |  | ||||||
| 	init_pair(DIALOG_TEXT, -1, -1); | static const struct nconf_attr_param no_color_theme_params[] = { | ||||||
| 	init_pair(DIALOG_BOX, COLOR_YELLOW, -1); | 	NO_COLOR_ATTR(attr_normal,		A_NORMAL), | ||||||
| 	init_pair(DIALOG_MENU_BACK, COLOR_YELLOW, -1); | 	NO_COLOR_ATTR(attr_main_heading,	A_BOLD | A_UNDERLINE), | ||||||
| 	init_pair(DIALOG_MENU_FORE, COLOR_RED, -1); | 	NO_COLOR_ATTR(attr_main_menu_box,	A_NORMAL), | ||||||
|  | 	NO_COLOR_ATTR(attr_main_menu_fore,	A_STANDOUT), | ||||||
| 	init_pair(INPUT_BOX, COLOR_YELLOW, -1); | 	NO_COLOR_ATTR(attr_main_menu_back,	A_NORMAL), | ||||||
| 	init_pair(INPUT_HEADING, COLOR_GREEN, -1); | 	NO_COLOR_ATTR(attr_main_menu_grey,	A_NORMAL), | ||||||
| 	init_pair(INPUT_TEXT, -1, -1); | 	NO_COLOR_ATTR(attr_main_menu_heading,	A_BOLD), | ||||||
| 	init_pair(INPUT_FIELD, -1, -1); | 	NO_COLOR_ATTR(attr_scrollwin_text,	A_NORMAL), | ||||||
|  | 	NO_COLOR_ATTR(attr_scrollwin_heading,	A_BOLD), | ||||||
| 	init_pair(FUNCTION_HIGHLIGHT, -1, -1); | 	NO_COLOR_ATTR(attr_scrollwin_box,	A_BOLD), | ||||||
| 	init_pair(FUNCTION_TEXT, COLOR_YELLOW, -1); | 	NO_COLOR_ATTR(attr_dialog_text,		A_NORMAL), | ||||||
| } | 	NO_COLOR_ATTR(attr_dialog_menu_fore,	A_STANDOUT), | ||||||
|  | 	NO_COLOR_ATTR(attr_dialog_menu_back,	A_NORMAL), | ||||||
| /* available attributes: | 	NO_COLOR_ATTR(attr_dialog_box,		A_BOLD), | ||||||
|    A_NORMAL        Normal display (no highlight) | 	NO_COLOR_ATTR(attr_input_box,		A_BOLD), | ||||||
|    A_STANDOUT      Best highlighting mode of the terminal. | 	NO_COLOR_ATTR(attr_input_heading,	A_BOLD), | ||||||
|    A_UNDERLINE     Underlining | 	NO_COLOR_ATTR(attr_input_text,		A_NORMAL), | ||||||
|    A_REVERSE       Reverse video | 	NO_COLOR_ATTR(attr_input_field,		A_UNDERLINE), | ||||||
|    A_BLINK         Blinking | 	NO_COLOR_ATTR(attr_function_text,	A_REVERSE), | ||||||
|    A_DIM           Half bright | 	NO_COLOR_ATTR(attr_function_highlight,	A_BOLD), | ||||||
|    A_BOLD          Extra bright or bold | 	{ /* sentinel */ } | ||||||
|    A_PROTECT       Protected mode | }; | ||||||
|    A_INVIS         Invisible or blank mode |  | ||||||
|    A_ALTCHARSET    Alternate character set |  | ||||||
|    A_CHARTEXT      Bit-mask to extract a character |  | ||||||
|    COLOR_PAIR(n)   Color-pair number n |  | ||||||
|    */ |  | ||||||
| static void normal_color_theme(void) |  | ||||||
| { |  | ||||||
| 	/* automatically add color... */ |  | ||||||
| #define mkattr(name, attr) do { \ |  | ||||||
| attributes[name] = attr | COLOR_PAIR(name); } while (0) |  | ||||||
| 	mkattr(NORMAL, NORMAL); |  | ||||||
| 	mkattr(MAIN_HEADING, A_BOLD | A_UNDERLINE); |  | ||||||
|  |  | ||||||
| 	mkattr(MAIN_MENU_FORE, A_REVERSE); |  | ||||||
| 	mkattr(MAIN_MENU_BACK, A_NORMAL); |  | ||||||
| 	mkattr(MAIN_MENU_GREY, A_NORMAL); |  | ||||||
| 	mkattr(MAIN_MENU_HEADING, A_BOLD); |  | ||||||
| 	mkattr(MAIN_MENU_BOX, A_NORMAL); |  | ||||||
|  |  | ||||||
| 	mkattr(SCROLLWIN_TEXT, A_NORMAL); |  | ||||||
| 	mkattr(SCROLLWIN_HEADING, A_BOLD); |  | ||||||
| 	mkattr(SCROLLWIN_BOX, A_BOLD); |  | ||||||
|  |  | ||||||
| 	mkattr(DIALOG_TEXT, A_BOLD); |  | ||||||
| 	mkattr(DIALOG_BOX, A_BOLD); |  | ||||||
| 	mkattr(DIALOG_MENU_FORE, A_STANDOUT); |  | ||||||
| 	mkattr(DIALOG_MENU_BACK, A_NORMAL); |  | ||||||
|  |  | ||||||
| 	mkattr(INPUT_BOX, A_NORMAL); |  | ||||||
| 	mkattr(INPUT_HEADING, A_BOLD); |  | ||||||
| 	mkattr(INPUT_TEXT, A_NORMAL); |  | ||||||
| 	mkattr(INPUT_FIELD, A_UNDERLINE); |  | ||||||
|  |  | ||||||
| 	mkattr(FUNCTION_HIGHLIGHT, A_BOLD); |  | ||||||
| 	mkattr(FUNCTION_TEXT, A_REVERSE); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| static void no_colors_theme(void) |  | ||||||
| { |  | ||||||
| 	/* automatically add highlight, no color */ |  | ||||||
| #define mkattrn(name, attr) { attributes[name] = attr; } |  | ||||||
|  |  | ||||||
| 	mkattrn(NORMAL, NORMAL); |  | ||||||
| 	mkattrn(MAIN_HEADING, A_BOLD | A_UNDERLINE); |  | ||||||
|  |  | ||||||
| 	mkattrn(MAIN_MENU_FORE, A_STANDOUT); |  | ||||||
| 	mkattrn(MAIN_MENU_BACK, A_NORMAL); |  | ||||||
| 	mkattrn(MAIN_MENU_GREY, A_NORMAL); |  | ||||||
| 	mkattrn(MAIN_MENU_HEADING, A_BOLD); |  | ||||||
| 	mkattrn(MAIN_MENU_BOX, A_NORMAL); |  | ||||||
|  |  | ||||||
| 	mkattrn(SCROLLWIN_TEXT, A_NORMAL); |  | ||||||
| 	mkattrn(SCROLLWIN_HEADING, A_BOLD); |  | ||||||
| 	mkattrn(SCROLLWIN_BOX, A_BOLD); |  | ||||||
|  |  | ||||||
| 	mkattrn(DIALOG_TEXT, A_NORMAL); |  | ||||||
| 	mkattrn(DIALOG_BOX, A_BOLD); |  | ||||||
| 	mkattrn(DIALOG_MENU_FORE, A_STANDOUT); |  | ||||||
| 	mkattrn(DIALOG_MENU_BACK, A_NORMAL); |  | ||||||
|  |  | ||||||
| 	mkattrn(INPUT_BOX, A_BOLD); |  | ||||||
| 	mkattrn(INPUT_HEADING, A_BOLD); |  | ||||||
| 	mkattrn(INPUT_TEXT, A_NORMAL); |  | ||||||
| 	mkattrn(INPUT_FIELD, A_UNDERLINE); |  | ||||||
|  |  | ||||||
| 	mkattrn(FUNCTION_HIGHLIGHT, A_BOLD); |  | ||||||
| 	mkattrn(FUNCTION_TEXT, A_REVERSE); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void set_colors(void) | void set_colors(void) | ||||||
| { | { | ||||||
| 	start_color(); | 	const struct nconf_attr_param *p; | ||||||
| 	use_default_colors(); | 	int pair = 0; | ||||||
| 	set_normal_colors(); |  | ||||||
| 	if (has_colors()) { | 	if (has_colors()) { | ||||||
| 		normal_color_theme(); | 		start_color(); | ||||||
|  | 		use_default_colors(); | ||||||
|  | 		p = color_theme_params; | ||||||
| 	} else { | 	} else { | ||||||
| 		/* give defaults */ | 		p = no_color_theme_params; | ||||||
| 		no_colors_theme(); | 	} | ||||||
|  |  | ||||||
|  | 	for (; p->attr; p++) { | ||||||
|  | 		int attr = p->highlight; | ||||||
|  |  | ||||||
|  | 		if (p->has_color) { | ||||||
|  | 			pair++; | ||||||
|  | 			init_pair(pair, p->color_fg, p->color_bg); | ||||||
|  | 			attr |= COLOR_PAIR(pair); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		*p->attr = attr; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* this changes the windows attributes !!! */ | /* this changes the windows attributes !!! */ | ||||||
| void print_in_middle(WINDOW *win, | void print_in_middle(WINDOW *win, int y, int width, const char *str, int attrs) | ||||||
| 		int starty, | { | ||||||
| 		int startx, | 	wattrset(win, attrs); | ||||||
| 		int width, | 	mvwprintw(win, y, (width - strlen(str)) / 2, "%s", str); | ||||||
| 		const char *string, |  | ||||||
| 		chtype color) |  | ||||||
| {      int length, x, y; |  | ||||||
| 	float temp; |  | ||||||
|  |  | ||||||
|  |  | ||||||
| 	if (win == NULL) |  | ||||||
| 		win = stdscr; |  | ||||||
| 	getyx(win, y, x); |  | ||||||
| 	if (startx != 0) |  | ||||||
| 		x = startx; |  | ||||||
| 	if (starty != 0) |  | ||||||
| 		y = starty; |  | ||||||
| 	if (width == 0) |  | ||||||
| 		width = 80; |  | ||||||
|  |  | ||||||
| 	length = strlen(string); |  | ||||||
| 	temp = (width - length) / 2; |  | ||||||
| 	x = startx + (int)temp; |  | ||||||
| 	(void) wattrset(win, color); |  | ||||||
| 	mvwprintw(win, y, x, "%s", string); |  | ||||||
| 	refresh(); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| int get_line_no(const char *text) | int get_line_no(const char *text) | ||||||
| @ -294,14 +245,14 @@ int btn_dialog(WINDOW *main_window, const char *msg, int btn_num, ...) | |||||||
| 	msg_win = derwin(win, win_rows-2, msg_width, 1, | 	msg_win = derwin(win, win_rows-2, msg_width, 1, | ||||||
| 			1+(total_width+2-msg_width)/2); | 			1+(total_width+2-msg_width)/2); | ||||||
|  |  | ||||||
| 	set_menu_fore(menu, attributes[DIALOG_MENU_FORE]); | 	set_menu_fore(menu, attr_dialog_menu_fore); | ||||||
| 	set_menu_back(menu, attributes[DIALOG_MENU_BACK]); | 	set_menu_back(menu, attr_dialog_menu_back); | ||||||
|  |  | ||||||
| 	(void) wattrset(win, attributes[DIALOG_BOX]); | 	wattrset(win, attr_dialog_box); | ||||||
| 	box(win, 0, 0); | 	box(win, 0, 0); | ||||||
|  |  | ||||||
| 	/* print message */ | 	/* print message */ | ||||||
| 	(void) wattrset(msg_win, attributes[DIALOG_TEXT]); | 	wattrset(msg_win, attr_dialog_text); | ||||||
| 	fill_window(msg_win, msg); | 	fill_window(msg_win, msg); | ||||||
|  |  | ||||||
| 	set_menu_win(menu, win); | 	set_menu_win(menu, win); | ||||||
| @ -405,16 +356,16 @@ int dialog_inputbox(WINDOW *main_window, | |||||||
| 	form_win = derwin(win, 1, prompt_width, prompt_lines+3, 2); | 	form_win = derwin(win, 1, prompt_width, prompt_lines+3, 2); | ||||||
| 	keypad(form_win, TRUE); | 	keypad(form_win, TRUE); | ||||||
|  |  | ||||||
| 	(void) wattrset(form_win, attributes[INPUT_FIELD]); | 	wattrset(form_win, attr_input_field); | ||||||
|  |  | ||||||
| 	(void) wattrset(win, attributes[INPUT_BOX]); | 	wattrset(win, attr_input_box); | ||||||
| 	box(win, 0, 0); | 	box(win, 0, 0); | ||||||
| 	(void) wattrset(win, attributes[INPUT_HEADING]); | 	wattrset(win, attr_input_heading); | ||||||
| 	if (title) | 	if (title) | ||||||
| 		mvwprintw(win, 0, 3, "%s", title); | 		mvwprintw(win, 0, 3, "%s", title); | ||||||
|  |  | ||||||
| 	/* print message */ | 	/* print message */ | ||||||
| 	(void) wattrset(prompt_win, attributes[INPUT_TEXT]); | 	wattrset(prompt_win, attr_input_text); | ||||||
| 	fill_window(prompt_win, prompt); | 	fill_window(prompt_win, prompt); | ||||||
|  |  | ||||||
| 	mvwprintw(form_win, 0, 0, "%*s", prompt_width, " "); | 	mvwprintw(form_win, 0, 0, "%*s", prompt_width, " "); | ||||||
| @ -576,7 +527,7 @@ void show_scroll_win(WINDOW *main_window, | |||||||
|  |  | ||||||
| 	/* create the pad */ | 	/* create the pad */ | ||||||
| 	pad = newpad(total_lines+10, total_cols+10); | 	pad = newpad(total_lines+10, total_cols+10); | ||||||
| 	(void) wattrset(pad, attributes[SCROLLWIN_TEXT]); | 	wattrset(pad, attr_scrollwin_text); | ||||||
| 	fill_window(pad, text); | 	fill_window(pad, text); | ||||||
|  |  | ||||||
| 	win_lines = min(total_lines+4, lines-2); | 	win_lines = min(total_lines+4, lines-2); | ||||||
| @ -591,9 +542,9 @@ void show_scroll_win(WINDOW *main_window, | |||||||
| 	win = newwin(win_lines, win_cols, y, x); | 	win = newwin(win_lines, win_cols, y, x); | ||||||
| 	keypad(win, TRUE); | 	keypad(win, TRUE); | ||||||
| 	/* show the help in the help window, and show the help panel */ | 	/* show the help in the help window, and show the help panel */ | ||||||
| 	(void) wattrset(win, attributes[SCROLLWIN_BOX]); | 	wattrset(win, attr_scrollwin_box); | ||||||
| 	box(win, 0, 0); | 	box(win, 0, 0); | ||||||
| 	(void) wattrset(win, attributes[SCROLLWIN_HEADING]); | 	wattrset(win, attr_scrollwin_heading); | ||||||
| 	mvwprintw(win, 0, 3, " %s ", title); | 	mvwprintw(win, 0, 3, " %s ", title); | ||||||
| 	panel = new_panel(win); | 	panel = new_panel(win); | ||||||
|  |  | ||||||
| @ -604,10 +555,9 @@ void show_scroll_win(WINDOW *main_window, | |||||||
| 				text_cols, 0); | 				text_cols, 0); | ||||||
| 		print_in_middle(win, | 		print_in_middle(win, | ||||||
| 				text_lines+2, | 				text_lines+2, | ||||||
| 				0, |  | ||||||
| 				text_cols, | 				text_cols, | ||||||
| 				"<OK>", | 				"<OK>", | ||||||
| 				attributes[DIALOG_MENU_FORE]); | 				attr_dialog_menu_fore); | ||||||
| 		wrefresh(win); | 		wrefresh(win); | ||||||
|  |  | ||||||
| 		res = wgetch(win); | 		res = wgetch(win); | ||||||
|  | |||||||
| @ -32,30 +32,26 @@ | |||||||
| 		typeof(b) _b = b;\ | 		typeof(b) _b = b;\ | ||||||
| 		_a < _b ? _a : _b; }) | 		_a < _b ? _a : _b; }) | ||||||
|  |  | ||||||
| typedef enum { | extern int attr_normal; | ||||||
| 	NORMAL = 1, | extern int attr_main_heading; | ||||||
| 	MAIN_HEADING, | extern int attr_main_menu_box; | ||||||
| 	MAIN_MENU_BOX, | extern int attr_main_menu_fore; | ||||||
| 	MAIN_MENU_FORE, | extern int attr_main_menu_back; | ||||||
| 	MAIN_MENU_BACK, | extern int attr_main_menu_grey; | ||||||
| 	MAIN_MENU_GREY, | extern int attr_main_menu_heading; | ||||||
| 	MAIN_MENU_HEADING, | extern int attr_scrollwin_text; | ||||||
| 	SCROLLWIN_TEXT, | extern int attr_scrollwin_heading; | ||||||
| 	SCROLLWIN_HEADING, | extern int attr_scrollwin_box; | ||||||
| 	SCROLLWIN_BOX, | extern int attr_dialog_text; | ||||||
| 	DIALOG_TEXT, | extern int attr_dialog_menu_fore; | ||||||
| 	DIALOG_MENU_FORE, | extern int attr_dialog_menu_back; | ||||||
| 	DIALOG_MENU_BACK, | extern int attr_dialog_box; | ||||||
| 	DIALOG_BOX, | extern int attr_input_box; | ||||||
| 	INPUT_BOX, | extern int attr_input_heading; | ||||||
| 	INPUT_HEADING, | extern int attr_input_text; | ||||||
| 	INPUT_TEXT, | extern int attr_input_field; | ||||||
| 	INPUT_FIELD, | extern int attr_function_text; | ||||||
| 	FUNCTION_TEXT, | extern int attr_function_highlight; | ||||||
| 	FUNCTION_HIGHLIGHT, |  | ||||||
| 	ATTR_MAX |  | ||||||
| } attributes_t; |  | ||||||
| extern attributes_t attributes[]; |  | ||||||
|  |  | ||||||
| typedef enum { | typedef enum { | ||||||
| 	F_HELP = 1, | 	F_HELP = 1, | ||||||
| @ -72,12 +68,7 @@ typedef enum { | |||||||
| void set_colors(void); | void set_colors(void); | ||||||
|  |  | ||||||
| /* this changes the windows attributes !!! */ | /* this changes the windows attributes !!! */ | ||||||
| void print_in_middle(WINDOW *win, | void print_in_middle(WINDOW *win, int y, int width, const char *str, int attrs); | ||||||
| 		int starty, |  | ||||||
| 		int startx, |  | ||||||
| 		int width, |  | ||||||
| 		const char *string, |  | ||||||
| 		chtype color); |  | ||||||
| int get_line_length(const char *line); | int get_line_length(const char *line); | ||||||
| int get_line_no(const char *text); | int get_line_no(const char *text); | ||||||
| const char *get_line(const char *text, int line_no); | const char *get_line(const char *text, int line_no); | ||||||
|  | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -1,8 +1,9 @@ | |||||||
| /* A Bison parser, made by GNU Bison 3.1.  */ | /* A Bison parser, made by GNU Bison 3.7.6.  */ | ||||||
|  |  | ||||||
| /* Bison interface for Yacc-like parsers in C | /* Bison interface for Yacc-like parsers in C | ||||||
|  |  | ||||||
|    Copyright (C) 1984, 1989-1990, 2000-2015, 2018 Free Software Foundation, Inc. |    Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, | ||||||
|  |    Inc. | ||||||
|  |  | ||||||
|    This program is free software: you can redistribute it and/or modify |    This program is free software: you can redistribute it and/or modify | ||||||
|    it under the terms of the GNU General Public License as published by |    it under the terms of the GNU General Public License as published by | ||||||
| @ -15,7 +16,7 @@ | |||||||
|    GNU General Public License for more details. |    GNU General Public License for more details. | ||||||
|  |  | ||||||
|    You should have received a copy of the GNU General Public License |    You should have received a copy of the GNU General Public License | ||||||
|    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */ |    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */ | ||||||
|  |  | ||||||
| /* As a special exception, you may create a larger work that contains | /* As a special exception, you may create a larger work that contains | ||||||
|    part or all of the Bison parser skeleton and distribute that work |    part or all of the Bison parser skeleton and distribute that work | ||||||
| @ -30,6 +31,10 @@ | |||||||
|    This special exception was added by the Free Software Foundation in |    This special exception was added by the Free Software Foundation in | ||||||
|    version 2.2 of Bison.  */ |    version 2.2 of Bison.  */ | ||||||
|  |  | ||||||
|  | /* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, | ||||||
|  |    especially those whose name start with YY_ or yy_.  They are | ||||||
|  |    private implementation details that can be changed or removed.  */ | ||||||
|  |  | ||||||
| #ifndef YY_YY_PARSER_TAB_H_INCLUDED | #ifndef YY_YY_PARSER_TAB_H_INCLUDED | ||||||
| # define YY_YY_PARSER_TAB_H_INCLUDED | # define YY_YY_PARSER_TAB_H_INCLUDED | ||||||
| /* Debug traces.  */ | /* Debug traces.  */ | ||||||
| @ -40,72 +45,72 @@ | |||||||
| extern int yydebug; | extern int yydebug; | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| /* Token type.  */ | /* Token kinds.  */ | ||||||
| #ifndef YYTOKENTYPE | #ifndef YYTOKENTYPE | ||||||
| # define YYTOKENTYPE | # define YYTOKENTYPE | ||||||
|   enum yytokentype |   enum yytokentype | ||||||
|   { |   { | ||||||
|     T_HELPTEXT = 258, |     YYEMPTY = -2, | ||||||
|     T_WORD = 259, |     YYEOF = 0,                     /* "end of file"  */ | ||||||
|     T_WORD_QUOTE = 260, |     YYerror = 256,                 /* error  */ | ||||||
|     T_ALLNOCONFIG_Y = 261, |     YYUNDEF = 257,                 /* "invalid token"  */ | ||||||
|     T_BOOL = 262, |     T_HELPTEXT = 258,              /* T_HELPTEXT  */ | ||||||
|     T_CHOICE = 263, |     T_WORD = 259,                  /* T_WORD  */ | ||||||
|     T_CLOSE_PAREN = 264, |     T_WORD_QUOTE = 260,            /* T_WORD_QUOTE  */ | ||||||
|     T_COLON_EQUAL = 265, |     T_BOOL = 261,                  /* T_BOOL  */ | ||||||
|     T_COMMENT = 266, |     T_CHOICE = 262,                /* T_CHOICE  */ | ||||||
|     T_CONFIG = 267, |     T_CLOSE_PAREN = 263,           /* T_CLOSE_PAREN  */ | ||||||
|     T_DEFAULT = 268, |     T_COLON_EQUAL = 264,           /* T_COLON_EQUAL  */ | ||||||
|     T_DEFCONFIG_LIST = 269, |     T_COMMENT = 265,               /* T_COMMENT  */ | ||||||
|     T_DEF_BOOL = 270, |     T_CONFIG = 266,                /* T_CONFIG  */ | ||||||
|     T_DEF_TRISTATE = 271, |     T_DEFAULT = 267,               /* T_DEFAULT  */ | ||||||
|     T_DEPENDS = 272, |     T_DEF_BOOL = 268,              /* T_DEF_BOOL  */ | ||||||
|     T_ENDCHOICE = 273, |     T_DEF_TRISTATE = 269,          /* T_DEF_TRISTATE  */ | ||||||
|     T_ENDIF = 274, |     T_DEPENDS = 270,               /* T_DEPENDS  */ | ||||||
|     T_ENDMENU = 275, |     T_ENDCHOICE = 271,             /* T_ENDCHOICE  */ | ||||||
|     T_HELP = 276, |     T_ENDIF = 272,                 /* T_ENDIF  */ | ||||||
|     T_HEX = 277, |     T_ENDMENU = 273,               /* T_ENDMENU  */ | ||||||
|     T_IF = 278, |     T_HELP = 274,                  /* T_HELP  */ | ||||||
|     T_IMPLY = 279, |     T_HEX = 275,                   /* T_HEX  */ | ||||||
|     T_INT = 280, |     T_IF = 276,                    /* T_IF  */ | ||||||
|     T_MAINMENU = 281, |     T_IMPLY = 277,                 /* T_IMPLY  */ | ||||||
|     T_MENU = 282, |     T_INT = 278,                   /* T_INT  */ | ||||||
|     T_MENUCONFIG = 283, |     T_MAINMENU = 279,              /* T_MAINMENU  */ | ||||||
|     T_MODULES = 284, |     T_MENU = 280,                  /* T_MENU  */ | ||||||
|     T_ON = 285, |     T_MENUCONFIG = 281,            /* T_MENUCONFIG  */ | ||||||
|     T_OPEN_PAREN = 286, |     T_MODULES = 282,               /* T_MODULES  */ | ||||||
|     T_OPTION = 287, |     T_ON = 283,                    /* T_ON  */ | ||||||
|     T_OPTIONAL = 288, |     T_OPEN_PAREN = 284,            /* T_OPEN_PAREN  */ | ||||||
|     T_PLUS_EQUAL = 289, |     T_OPTIONAL = 285,              /* T_OPTIONAL  */ | ||||||
|     T_PROMPT = 290, |     T_PLUS_EQUAL = 286,            /* T_PLUS_EQUAL  */ | ||||||
|     T_RANGE = 291, |     T_PROMPT = 287,                /* T_PROMPT  */ | ||||||
|     T_RESET = 292, |     T_RANGE = 288,                 /* T_RANGE  */ | ||||||
|     T_SELECT = 293, |     T_RESET = 289,                 /* T_RESET  */ | ||||||
|     T_SOURCE = 294, |     T_SELECT = 290,                /* T_SELECT  */ | ||||||
|     T_STRING = 295, |     T_SOURCE = 291,                /* T_SOURCE  */ | ||||||
|     T_TRISTATE = 296, |     T_STRING = 292,                /* T_STRING  */ | ||||||
|     T_VISIBLE = 297, |     T_TRISTATE = 293,              /* T_TRISTATE  */ | ||||||
|     T_EOL = 298, |     T_VISIBLE = 294,               /* T_VISIBLE  */ | ||||||
|     T_ASSIGN_VAL = 299, |     T_EOL = 295,                   /* T_EOL  */ | ||||||
|     T_OR = 300, |     T_ASSIGN_VAL = 296,            /* T_ASSIGN_VAL  */ | ||||||
|     T_AND = 301, |     T_OR = 297,                    /* T_OR  */ | ||||||
|     T_EQUAL = 302, |     T_AND = 298,                   /* T_AND  */ | ||||||
|     T_UNEQUAL = 303, |     T_EQUAL = 299,                 /* T_EQUAL  */ | ||||||
|     T_LESS = 304, |     T_UNEQUAL = 300,               /* T_UNEQUAL  */ | ||||||
|     T_LESS_EQUAL = 305, |     T_LESS = 301,                  /* T_LESS  */ | ||||||
|     T_GREATER = 306, |     T_LESS_EQUAL = 302,            /* T_LESS_EQUAL  */ | ||||||
|     T_GREATER_EQUAL = 307, |     T_GREATER = 303,               /* T_GREATER  */ | ||||||
|     T_NOT = 308 |     T_GREATER_EQUAL = 304,         /* T_GREATER_EQUAL  */ | ||||||
|  |     T_NOT = 305                    /* T_NOT  */ | ||||||
|   }; |   }; | ||||||
|  |   typedef enum yytokentype yytoken_kind_t; | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| /* Value type.  */ | /* Value type.  */ | ||||||
| #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED | #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED | ||||||
|  |  | ||||||
| union YYSTYPE | union YYSTYPE | ||||||
| { | { | ||||||
|  |  | ||||||
|  |  | ||||||
| 	char *string; | 	char *string; | ||||||
| 	struct symbol *symbol; | 	struct symbol *symbol; | ||||||
| 	struct expr *expr; | 	struct expr *expr; | ||||||
| @ -115,7 +120,6 @@ union YYSTYPE | |||||||
|  |  | ||||||
|  |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| typedef union YYSTYPE YYSTYPE; | typedef union YYSTYPE YYSTYPE; | ||||||
| # define YYSTYPE_IS_TRIVIAL 1 | # define YYSTYPE_IS_TRIVIAL 1 | ||||||
| # define YYSTYPE_IS_DECLARED 1 | # define YYSTYPE_IS_DECLARED 1 | ||||||
|  | |||||||
| @ -12,6 +12,7 @@ | |||||||
| #include <stdbool.h> | #include <stdbool.h> | ||||||
|  |  | ||||||
| #include "lkc.h" | #include "lkc.h" | ||||||
|  | #include "internal.h" | ||||||
|  |  | ||||||
| #define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt) | #define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt) | ||||||
|  |  | ||||||
| @ -28,7 +29,7 @@ static bool zconf_endtoken(const char *tokenname, | |||||||
|  |  | ||||||
| struct symbol *symbol_hash[SYMBOL_HASHSIZE]; | struct symbol *symbol_hash[SYMBOL_HASHSIZE]; | ||||||
|  |  | ||||||
| static struct menu *current_menu, *current_entry; | struct menu *current_menu, *current_entry; | ||||||
|  |  | ||||||
| %} | %} | ||||||
|  |  | ||||||
| @ -45,7 +46,6 @@ static struct menu *current_menu, *current_entry; | |||||||
| %token <string> T_HELPTEXT | %token <string> T_HELPTEXT | ||||||
| %token <string> T_WORD | %token <string> T_WORD | ||||||
| %token <string> T_WORD_QUOTE | %token <string> T_WORD_QUOTE | ||||||
| %token T_ALLNOCONFIG_Y |  | ||||||
| %token T_BOOL | %token T_BOOL | ||||||
| %token T_CHOICE | %token T_CHOICE | ||||||
| %token T_CLOSE_PAREN | %token T_CLOSE_PAREN | ||||||
| @ -53,7 +53,6 @@ static struct menu *current_menu, *current_entry; | |||||||
| %token T_COMMENT | %token T_COMMENT | ||||||
| %token T_CONFIG | %token T_CONFIG | ||||||
| %token T_DEFAULT | %token T_DEFAULT | ||||||
| %token T_DEFCONFIG_LIST |  | ||||||
| %token T_DEF_BOOL | %token T_DEF_BOOL | ||||||
| %token T_DEF_TRISTATE | %token T_DEF_TRISTATE | ||||||
| %token T_DEPENDS | %token T_DEPENDS | ||||||
| @ -71,7 +70,6 @@ static struct menu *current_menu, *current_entry; | |||||||
| %token T_MODULES | %token T_MODULES | ||||||
| %token T_ON | %token T_ON | ||||||
| %token T_OPEN_PAREN | %token T_OPEN_PAREN | ||||||
| %token T_OPTION |  | ||||||
| %token T_OPTIONAL | %token T_OPTIONAL | ||||||
| %token T_PLUS_EQUAL | %token T_PLUS_EQUAL | ||||||
| %token T_PROMPT | %token T_PROMPT | ||||||
| @ -120,20 +118,24 @@ mainmenu_stmt: T_MAINMENU T_WORD_QUOTE T_EOL | |||||||
|  |  | ||||||
| stmt_list: | stmt_list: | ||||||
| 	  /* empty */ | 	  /* empty */ | ||||||
| 	| stmt_list common_stmt | 	| stmt_list assignment_stmt | ||||||
| 	| stmt_list choice_stmt | 	| stmt_list choice_stmt | ||||||
|  | 	| stmt_list comment_stmt | ||||||
|  | 	| stmt_list config_stmt | ||||||
|  | 	| stmt_list if_stmt | ||||||
| 	| stmt_list menu_stmt | 	| stmt_list menu_stmt | ||||||
|  | 	| stmt_list menuconfig_stmt | ||||||
|  | 	| stmt_list source_stmt | ||||||
| 	| stmt_list T_WORD error T_EOL	{ zconf_error("unknown statement \"%s\"", $2); } | 	| stmt_list T_WORD error T_EOL	{ zconf_error("unknown statement \"%s\"", $2); } | ||||||
| 	| stmt_list error T_EOL		{ zconf_error("invalid statement"); } | 	| stmt_list error T_EOL		{ zconf_error("invalid statement"); } | ||||||
| ; | ; | ||||||
|  |  | ||||||
| common_stmt: | stmt_list_in_choice: | ||||||
| 	  if_stmt | 	  /* empty */ | ||||||
| 	| comment_stmt | 	| stmt_list_in_choice comment_stmt | ||||||
| 	| config_stmt | 	| stmt_list_in_choice config_stmt | ||||||
| 	| menuconfig_stmt | 	| stmt_list_in_choice if_stmt_in_choice | ||||||
| 	| source_stmt | 	| stmt_list_in_choice error T_EOL	{ zconf_error("invalid statement"); } | ||||||
| 	| assignment_stmt |  | ||||||
| ; | ; | ||||||
|  |  | ||||||
| /* config/menuconfig entry */ | /* config/menuconfig entry */ | ||||||
| @ -215,19 +217,12 @@ config_option: T_RANGE symbol symbol if_expr T_EOL | |||||||
| 	printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno()); | 	printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno()); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| config_option: T_OPTION T_MODULES T_EOL | config_option: T_MODULES T_EOL | ||||||
| { | { | ||||||
| 	menu_add_option_modules(); | 	if (modules_sym) | ||||||
| }; | 		zconf_error("symbol '%s' redefines option 'modules' already defined by symbol '%s'", | ||||||
|  | 			    current_entry->sym->name, modules_sym->name); | ||||||
| config_option: T_OPTION T_DEFCONFIG_LIST T_EOL | 	modules_sym = current_entry->sym; | ||||||
| { |  | ||||||
| 	menu_add_option_defconfig_list(); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| config_option: T_OPTION T_ALLNOCONFIG_Y T_EOL |  | ||||||
| { |  | ||||||
| 	menu_add_option_allnoconfig_y(); |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| /* choice entry */ | /* choice entry */ | ||||||
| @ -255,7 +250,7 @@ choice_end: end | |||||||
| 	} | 	} | ||||||
| }; | }; | ||||||
|  |  | ||||||
| choice_stmt: choice_entry choice_block choice_end | choice_stmt: choice_entry stmt_list_in_choice choice_end | ||||||
| ; | ; | ||||||
|  |  | ||||||
| choice_option_list: | choice_option_list: | ||||||
| @ -311,11 +306,6 @@ default: | |||||||
| 	| T_DEF_BOOL		{ $$ = S_BOOLEAN; } | 	| T_DEF_BOOL		{ $$ = S_BOOLEAN; } | ||||||
| 	| T_DEF_TRISTATE	{ $$ = S_TRISTATE; } | 	| T_DEF_TRISTATE	{ $$ = S_TRISTATE; } | ||||||
|  |  | ||||||
| choice_block: |  | ||||||
| 	  /* empty */ |  | ||||||
| 	| choice_block common_stmt |  | ||||||
| ; |  | ||||||
|  |  | ||||||
| /* if entry */ | /* if entry */ | ||||||
|  |  | ||||||
| if_entry: T_IF expr T_EOL | if_entry: T_IF expr T_EOL | ||||||
| @ -337,6 +327,9 @@ if_end: end | |||||||
| if_stmt: if_entry stmt_list if_end | if_stmt: if_entry stmt_list if_end | ||||||
| ; | ; | ||||||
|  |  | ||||||
|  | if_stmt_in_choice: if_entry stmt_list_in_choice if_end | ||||||
|  | ; | ||||||
|  |  | ||||||
| /* menu entry */ | /* menu entry */ | ||||||
|  |  | ||||||
| menu: T_MENU T_WORD_QUOTE T_EOL | menu: T_MENU T_WORD_QUOTE T_EOL | ||||||
| @ -517,7 +510,7 @@ void conf_parse(const char *name) | |||||||
| 	} | 	} | ||||||
| 	if (yynerrs) | 	if (yynerrs) | ||||||
| 		exit(1); | 		exit(1); | ||||||
| 	sym_set_change_count(1); | 	conf_set_changed(true); | ||||||
| } | } | ||||||
|  |  | ||||||
| static bool zconf_endtoken(const char *tokenname, | static bool zconf_endtoken(const char *tokenname, | ||||||
| @ -723,5 +716,3 @@ void zconfdump(FILE *out) | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| #include "menu.c" |  | ||||||
|  | |||||||
| @ -114,7 +114,7 @@ static char *do_error_if(int argc, char *argv[]) | |||||||
| 	if (!strcmp(argv[0], "y")) | 	if (!strcmp(argv[0], "y")) | ||||||
| 		pperror("%s", argv[1]); | 		pperror("%s", argv[1]); | ||||||
|  |  | ||||||
| 	return NULL; | 	return xstrdup(""); | ||||||
| } | } | ||||||
|  |  | ||||||
| static char *do_filename(int argc, char *argv[]) | static char *do_filename(int argc, char *argv[]) | ||||||
|  | |||||||
| @ -2,7 +2,6 @@ | |||||||
| # SPDX-License-Identifier: GPL-2.0-only | # SPDX-License-Identifier: GPL-2.0-only | ||||||
|  |  | ||||||
| PKG="Qt5Core Qt5Gui Qt5Widgets" | PKG="Qt5Core Qt5Gui Qt5Widgets" | ||||||
| PKG2="QtCore QtGui" |  | ||||||
|  |  | ||||||
| if [ -z "$(command -v pkg-config)" ]; then | if [ -z "$(command -v pkg-config)" ]; then | ||||||
| 	echo >&2 "*" | 	echo >&2 "*" | ||||||
| @ -12,21 +11,14 @@ if [ -z "$(command -v pkg-config)" ]; then | |||||||
| fi | fi | ||||||
|  |  | ||||||
| if pkg-config --exists $PKG; then | if pkg-config --exists $PKG; then | ||||||
| 	echo cflags=\"-std=c++11 -fPIC $(pkg-config --cflags Qt5Core Qt5Gui Qt5Widgets)\" | 	echo cflags=\"-std=c++11 -fPIC $(pkg-config --cflags $PKG)\" | ||||||
| 	echo libs=\"$(pkg-config --libs $PKG)\" | 	echo libs=\"$(pkg-config --libs $PKG)\" | ||||||
| 	echo moc=\"$(pkg-config --variable=host_bins Qt5Core)/moc\" | 	echo moc=\"$(pkg-config --variable=host_bins Qt5Core)/moc\" | ||||||
| 	exit 0 | 	exit 0 | ||||||
| fi | fi | ||||||
|  |  | ||||||
| if pkg-config --exists $PKG2; then |  | ||||||
| 	echo cflags=\"$(pkg-config --cflags $PKG2)\" |  | ||||||
| 	echo libs=\"$(pkg-config --libs $PKG2)\" |  | ||||||
| 	echo moc=\"$(pkg-config --variable=moc_location QtCore)\" |  | ||||||
| 	exit 0 |  | ||||||
| fi |  | ||||||
|  |  | ||||||
| echo >&2 "*" | echo >&2 "*" | ||||||
| echo >&2 "* Could not find Qt via pkg-config." | echo >&2 "* Could not find Qt5 via pkg-config." | ||||||
| echo >&2 "* Please install either Qt 4.8 or 5.x. and make sure it's in PKG_CONFIG_PATH" | echo >&2 "* Please install Qt5 and make sure it's in PKG_CONFIG_PATH" | ||||||
| echo >&2 "*" | echo >&2 "*" | ||||||
| exit 1 | exit 1 | ||||||
|  | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -3,23 +3,22 @@ | |||||||
|  * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> |  * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include <QTextBrowser> |  | ||||||
| #include <QTreeWidget> |  | ||||||
| #include <QMainWindow> |  | ||||||
| #include <QHeaderView> |  | ||||||
| #include <qsettings.h> |  | ||||||
| #include <QPushButton> |  | ||||||
| #include <QSettings> |  | ||||||
| #include <QLineEdit> |  | ||||||
| #include <QSplitter> |  | ||||||
| #include <QCheckBox> | #include <QCheckBox> | ||||||
| #include <QDialog> | #include <QDialog> | ||||||
|  | #include <QHeaderView> | ||||||
|  | #include <QLineEdit> | ||||||
|  | #include <QMainWindow> | ||||||
|  | #include <QPushButton> | ||||||
|  | #include <QSettings> | ||||||
|  | #include <QSplitter> | ||||||
|  | #include <QStyledItemDelegate> | ||||||
|  | #include <QTextBrowser> | ||||||
|  | #include <QTreeWidget> | ||||||
|  |  | ||||||
| #include "expr.h" | #include "expr.h" | ||||||
|  |  | ||||||
| class ConfigView; |  | ||||||
| class ConfigList; | class ConfigList; | ||||||
| class ConfigItem; | class ConfigItem; | ||||||
| class ConfigLineEdit; |  | ||||||
| class ConfigMainWindow; | class ConfigMainWindow; | ||||||
|  |  | ||||||
| class ConfigSettings : public QSettings { | class ConfigSettings : public QSettings { | ||||||
| @ -30,7 +29,7 @@ public: | |||||||
| }; | }; | ||||||
|  |  | ||||||
| enum colIdx { | enum colIdx { | ||||||
| 	promptColIdx, nameColIdx, noColIdx, modColIdx, yesColIdx, dataColIdx, colNr | 	promptColIdx, nameColIdx, dataColIdx | ||||||
| }; | }; | ||||||
| enum listMode { | enum listMode { | ||||||
| 	singleMode, menuMode, symbolMode, fullMode, listMode | 	singleMode, menuMode, symbolMode, fullMode, listMode | ||||||
| @ -43,13 +42,16 @@ class ConfigList : public QTreeWidget { | |||||||
| 	Q_OBJECT | 	Q_OBJECT | ||||||
| 	typedef class QTreeWidget Parent; | 	typedef class QTreeWidget Parent; | ||||||
| public: | public: | ||||||
| 	ConfigList(ConfigView* p, const char *name = 0); | 	ConfigList(QWidget *parent, const char *name = 0); | ||||||
|  | 	~ConfigList(); | ||||||
| 	void reinit(void); | 	void reinit(void); | ||||||
| 	ConfigView* parent(void) const |  | ||||||
| 	{ |  | ||||||
| 		return (ConfigView*)Parent::parent(); |  | ||||||
| 	} |  | ||||||
| 	ConfigItem* findConfigItem(struct menu *); | 	ConfigItem* findConfigItem(struct menu *); | ||||||
|  | 	void setSelected(QTreeWidgetItem *item, bool enable) { | ||||||
|  | 		for (int i = 0; i < selectedItems().size(); i++) | ||||||
|  | 			selectedItems().at(i)->setSelected(false); | ||||||
|  |  | ||||||
|  | 		item->setSelected(enable); | ||||||
|  | 	} | ||||||
|  |  | ||||||
| protected: | protected: | ||||||
| 	void keyPressEvent(QKeyEvent *e); | 	void keyPressEvent(QKeyEvent *e); | ||||||
| @ -63,61 +65,52 @@ protected: | |||||||
| public slots: | public slots: | ||||||
| 	void setRootMenu(struct menu *menu); | 	void setRootMenu(struct menu *menu); | ||||||
|  |  | ||||||
| 	void updateList(ConfigItem *item); | 	void updateList(); | ||||||
| 	void setValue(ConfigItem* item, tristate val); | 	void setValue(ConfigItem* item, tristate val); | ||||||
| 	void changeValue(ConfigItem* item); | 	void changeValue(ConfigItem* item); | ||||||
| 	void updateSelection(void); | 	void updateSelection(void); | ||||||
| 	void saveSettings(void); | 	void saveSettings(void); | ||||||
|  | 	void setOptionMode(QAction *action); | ||||||
|  | 	void setShowName(bool on); | ||||||
|  |  | ||||||
| signals: | signals: | ||||||
| 	void menuChanged(struct menu *menu); | 	void menuChanged(struct menu *menu); | ||||||
| 	void menuSelected(struct menu *menu); | 	void menuSelected(struct menu *menu); | ||||||
|  | 	void itemSelected(struct menu *menu); | ||||||
| 	void parentSelected(void); | 	void parentSelected(void); | ||||||
| 	void gotFocus(struct menu *); | 	void gotFocus(struct menu *); | ||||||
|  | 	void showNameChanged(bool on); | ||||||
|  |  | ||||||
| public: | public: | ||||||
| 	void updateListAll(void) | 	void updateListAll(void) | ||||||
| 	{ | 	{ | ||||||
| 		updateAll = true; | 		updateAll = true; | ||||||
| 		updateList(NULL); | 		updateList(); | ||||||
| 		updateAll = false; | 		updateAll = false; | ||||||
| 	} | 	} | ||||||
| 	ConfigList* listView() |  | ||||||
| 	{ |  | ||||||
| 		return this; |  | ||||||
| 	} |  | ||||||
| 	ConfigItem* firstChild() const |  | ||||||
| 	{ |  | ||||||
| 		return (ConfigItem *)children().first(); |  | ||||||
| 	} |  | ||||||
| 	void addColumn(colIdx idx) |  | ||||||
| 	{ |  | ||||||
| 		showColumn(idx); |  | ||||||
| 	} |  | ||||||
| 	void removeColumn(colIdx idx) |  | ||||||
| 	{ |  | ||||||
| 		hideColumn(idx); |  | ||||||
| 	} |  | ||||||
| 	void setAllOpen(bool open); | 	void setAllOpen(bool open); | ||||||
| 	void setParentMenu(void); | 	void setParentMenu(void); | ||||||
|  |  | ||||||
| 	bool menuSkip(struct menu *); | 	bool menuSkip(struct menu *); | ||||||
|  |  | ||||||
| 	void updateMenuList(ConfigItem *parent, struct menu*); | 	void updateMenuList(ConfigItem *parent, struct menu*); | ||||||
| 	void updateMenuList(ConfigList *parent, struct menu*); | 	void updateMenuList(struct menu *menu); | ||||||
|  |  | ||||||
| 	bool updateAll; | 	bool updateAll; | ||||||
|  |  | ||||||
| 	QPixmap symbolYesPix, symbolModPix, symbolNoPix; | 	bool showName; | ||||||
| 	QPixmap choiceYesPix, choiceNoPix; |  | ||||||
| 	QPixmap menuPix, menuInvPix, menuBackPix, voidPix; |  | ||||||
|  |  | ||||||
| 	bool showName, showRange, showData; |  | ||||||
| 	enum listMode mode; | 	enum listMode mode; | ||||||
| 	enum optionMode optMode; | 	enum optionMode optMode; | ||||||
| 	struct menu *rootEntry; | 	struct menu *rootEntry; | ||||||
| 	QPalette disabledColorGroup; | 	QPalette disabledColorGroup; | ||||||
| 	QPalette inactivedColorGroup; | 	QPalette inactivedColorGroup; | ||||||
| 	QMenu* headerPopup; | 	QMenu* headerPopup; | ||||||
|  |  | ||||||
|  | 	static QList<ConfigList *> allLists; | ||||||
|  | 	static void updateListForAll(); | ||||||
|  | 	static void updateListAllForAll(); | ||||||
|  |  | ||||||
|  | 	static QAction *showNormalAction, *showAllAction, *showPromptAction; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| class ConfigItem : public QTreeWidgetItem { | class ConfigItem : public QTreeWidgetItem { | ||||||
| @ -140,7 +133,6 @@ public: | |||||||
| 	} | 	} | ||||||
| 	~ConfigItem(void); | 	~ConfigItem(void); | ||||||
| 	void init(void); | 	void init(void); | ||||||
| 	void okRename(int col); |  | ||||||
| 	void updateMenu(void); | 	void updateMenu(void); | ||||||
| 	void testUpdateMenu(bool v); | 	void testUpdateMenu(bool v); | ||||||
| 	ConfigList* listView() const | 	ConfigList* listView() const | ||||||
| @ -165,82 +157,36 @@ public: | |||||||
|  |  | ||||||
| 		return ret; | 		return ret; | ||||||
| 	} | 	} | ||||||
| 	void setText(colIdx idx, const QString& text) |  | ||||||
| 	{ |  | ||||||
| 		Parent::setText(idx, text); |  | ||||||
| 	} |  | ||||||
| 	QString text(colIdx idx) const |  | ||||||
| 	{ |  | ||||||
| 		return Parent::text(idx); |  | ||||||
| 	} |  | ||||||
| 	void setPixmap(colIdx idx, const QIcon &icon) |  | ||||||
| 	{ |  | ||||||
| 		Parent::setIcon(idx, icon); |  | ||||||
| 	} |  | ||||||
| 	const QIcon pixmap(colIdx idx) const |  | ||||||
| 	{ |  | ||||||
| 		return icon(idx); |  | ||||||
| 	} |  | ||||||
| 	// TODO: Implement paintCell | 	// TODO: Implement paintCell | ||||||
|  |  | ||||||
| 	ConfigItem* nextItem; | 	ConfigItem* nextItem; | ||||||
| 	struct menu *menu; | 	struct menu *menu; | ||||||
| 	bool visible; | 	bool visible; | ||||||
| 	bool goParent; | 	bool goParent; | ||||||
|  |  | ||||||
|  | 	static QIcon symbolYesIcon, symbolModIcon, symbolNoIcon; | ||||||
|  | 	static QIcon choiceYesIcon, choiceNoIcon; | ||||||
|  | 	static QIcon menuIcon, menubackIcon; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| class ConfigLineEdit : public QLineEdit { | class ConfigItemDelegate : public QStyledItemDelegate | ||||||
| 	Q_OBJECT | { | ||||||
| 	typedef class QLineEdit Parent; | private: | ||||||
|  | 	struct menu *menu; | ||||||
| public: | public: | ||||||
| 	ConfigLineEdit(ConfigView* parent); | 	ConfigItemDelegate(QObject *parent = nullptr) | ||||||
| 	ConfigView* parent(void) const | 		: QStyledItemDelegate(parent) {} | ||||||
| 	{ | 	QWidget *createEditor(QWidget *parent, | ||||||
| 		return (ConfigView*)Parent::parent(); | 			      const QStyleOptionViewItem &option, | ||||||
| 	} | 			      const QModelIndex &index) const override; | ||||||
| 	void show(ConfigItem *i); | 	void setModelData(QWidget *editor, QAbstractItemModel *model, | ||||||
| 	void keyPressEvent(QKeyEvent *e); | 			  const QModelIndex &index) const override; | ||||||
|  |  | ||||||
| public: |  | ||||||
| 	ConfigItem *item; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| class ConfigView : public QWidget { |  | ||||||
| 	Q_OBJECT |  | ||||||
| 	typedef class QWidget Parent; |  | ||||||
| public: |  | ||||||
| 	ConfigView(QWidget* parent, const char *name = 0); |  | ||||||
| 	~ConfigView(void); |  | ||||||
| 	static void updateList(ConfigItem* item); |  | ||||||
| 	static void updateListAll(void); |  | ||||||
|  |  | ||||||
| 	bool showName(void) const { return list->showName; } |  | ||||||
| 	bool showRange(void) const { return list->showRange; } |  | ||||||
| 	bool showData(void) const { return list->showData; } |  | ||||||
| public slots: |  | ||||||
| 	void setShowName(bool); |  | ||||||
| 	void setShowRange(bool); |  | ||||||
| 	void setShowData(bool); |  | ||||||
| 	void setOptionMode(QAction *); |  | ||||||
| signals: |  | ||||||
| 	void showNameChanged(bool); |  | ||||||
| 	void showRangeChanged(bool); |  | ||||||
| 	void showDataChanged(bool); |  | ||||||
| public: |  | ||||||
| 	ConfigList* list; |  | ||||||
| 	ConfigLineEdit* lineEdit; |  | ||||||
|  |  | ||||||
| 	static ConfigView* viewList; |  | ||||||
| 	ConfigView* nextView; |  | ||||||
|  |  | ||||||
| 	static QAction *showNormalAction; |  | ||||||
| 	static QAction *showAllAction; |  | ||||||
| 	static QAction *showPromptAction; |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| class ConfigInfoView : public QTextBrowser { | class ConfigInfoView : public QTextBrowser { | ||||||
| 	Q_OBJECT | 	Q_OBJECT | ||||||
| 	typedef class QTextBrowser Parent; | 	typedef class QTextBrowser Parent; | ||||||
|  | 	QMenu *contextMenu; | ||||||
| public: | public: | ||||||
| 	ConfigInfoView(QWidget* parent, const char *name = 0); | 	ConfigInfoView(QWidget* parent, const char *name = 0); | ||||||
| 	bool showDebug(void) const { return _showDebug; } | 	bool showDebug(void) const { return _showDebug; } | ||||||
| @ -249,6 +195,7 @@ public slots: | |||||||
| 	void setInfo(struct menu *menu); | 	void setInfo(struct menu *menu); | ||||||
| 	void saveSettings(void); | 	void saveSettings(void); | ||||||
| 	void setShowDebug(bool); | 	void setShowDebug(bool); | ||||||
|  | 	void clicked (const QUrl &url); | ||||||
|  |  | ||||||
| signals: | signals: | ||||||
| 	void showDebugChanged(bool); | 	void showDebugChanged(bool); | ||||||
| @ -260,8 +207,7 @@ protected: | |||||||
| 	QString debug_info(struct symbol *sym); | 	QString debug_info(struct symbol *sym); | ||||||
| 	static QString print_filter(const QString &str); | 	static QString print_filter(const QString &str); | ||||||
| 	static void expr_print_help(void *data, struct symbol *sym, const char *str); | 	static void expr_print_help(void *data, struct symbol *sym, const char *str); | ||||||
| 	QMenu *createStandardContextMenu(const QPoint & pos); | 	void contextMenuEvent(QContextMenuEvent *event); | ||||||
| 	void contextMenuEvent(QContextMenuEvent *e); |  | ||||||
|  |  | ||||||
| 	struct symbol *sym; | 	struct symbol *sym; | ||||||
| 	struct menu *_menu; | 	struct menu *_menu; | ||||||
| @ -272,7 +218,7 @@ class ConfigSearchWindow : public QDialog { | |||||||
| 	Q_OBJECT | 	Q_OBJECT | ||||||
| 	typedef class QDialog Parent; | 	typedef class QDialog Parent; | ||||||
| public: | public: | ||||||
| 	ConfigSearchWindow(ConfigMainWindow* parent, const char *name = 0); | 	ConfigSearchWindow(ConfigMainWindow *parent); | ||||||
|  |  | ||||||
| public slots: | public slots: | ||||||
| 	void saveSettings(void); | 	void saveSettings(void); | ||||||
| @ -282,7 +228,7 @@ protected: | |||||||
| 	QLineEdit* editField; | 	QLineEdit* editField; | ||||||
| 	QPushButton* searchButton; | 	QPushButton* searchButton; | ||||||
| 	QSplitter* split; | 	QSplitter* split; | ||||||
| 	ConfigView* list; | 	ConfigList *list; | ||||||
| 	ConfigInfoView* info; | 	ConfigInfoView* info; | ||||||
|  |  | ||||||
| 	struct symbol **result; | 	struct symbol **result; | ||||||
| @ -298,6 +244,7 @@ public: | |||||||
| 	ConfigMainWindow(void); | 	ConfigMainWindow(void); | ||||||
| public slots: | public slots: | ||||||
| 	void changeMenu(struct menu *); | 	void changeMenu(struct menu *); | ||||||
|  | 	void changeItens(struct menu *); | ||||||
| 	void setMenuLink(struct menu *); | 	void setMenuLink(struct menu *); | ||||||
| 	void listFocusChanged(void); | 	void listFocusChanged(void); | ||||||
| 	void goBack(void); | 	void goBack(void); | ||||||
| @ -316,12 +263,9 @@ protected: | |||||||
| 	void closeEvent(QCloseEvent *e); | 	void closeEvent(QCloseEvent *e); | ||||||
|  |  | ||||||
| 	ConfigSearchWindow *searchWindow; | 	ConfigSearchWindow *searchWindow; | ||||||
| 	ConfigView *menuView; |  | ||||||
| 	ConfigList *menuList; | 	ConfigList *menuList; | ||||||
| 	ConfigView *configView; |  | ||||||
| 	ConfigList *configList; | 	ConfigList *configList; | ||||||
| 	ConfigInfoView *helpText; | 	ConfigInfoView *helpText; | ||||||
| 	QToolBar *toolBar; |  | ||||||
| 	QAction *backAction; | 	QAction *backAction; | ||||||
| 	QAction *singleViewAction; | 	QAction *singleViewAction; | ||||||
| 	QAction *splitViewAction; | 	QAction *splitViewAction; | ||||||
|  | |||||||
| @ -3,11 +3,11 @@ | |||||||
|  * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> |  * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
|  | #include <sys/types.h> | ||||||
| #include <ctype.h> | #include <ctype.h> | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
| #include <regex.h> | #include <regex.h> | ||||||
| #include <sys/utsname.h> |  | ||||||
|  |  | ||||||
| #include "lkc.h" | #include "lkc.h" | ||||||
|  |  | ||||||
| @ -15,23 +15,28 @@ struct symbol symbol_yes = { | |||||||
| 	.name = "y", | 	.name = "y", | ||||||
| 	.curr = { "y", yes }, | 	.curr = { "y", yes }, | ||||||
| 	.flags = SYMBOL_CONST|SYMBOL_VALID, | 	.flags = SYMBOL_CONST|SYMBOL_VALID, | ||||||
| }, symbol_mod = { | }; | ||||||
|  |  | ||||||
|  | struct symbol symbol_mod = { | ||||||
| 	.name = "m", | 	.name = "m", | ||||||
| 	.curr = { "m", mod }, | 	.curr = { "m", mod }, | ||||||
| 	.flags = SYMBOL_CONST|SYMBOL_VALID, | 	.flags = SYMBOL_CONST|SYMBOL_VALID, | ||||||
| }, symbol_no = { | }; | ||||||
|  |  | ||||||
|  | struct symbol symbol_no = { | ||||||
| 	.name = "n", | 	.name = "n", | ||||||
| 	.curr = { "n", no }, | 	.curr = { "n", no }, | ||||||
| 	.flags = SYMBOL_CONST|SYMBOL_VALID, | 	.flags = SYMBOL_CONST|SYMBOL_VALID, | ||||||
| }, symbol_empty = { | }; | ||||||
|  |  | ||||||
|  | static struct symbol symbol_empty = { | ||||||
| 	.name = "", | 	.name = "", | ||||||
| 	.curr = { "", no }, | 	.curr = { "", no }, | ||||||
| 	.flags = SYMBOL_VALID, | 	.flags = SYMBOL_VALID, | ||||||
| }; | }; | ||||||
|  |  | ||||||
| struct symbol *sym_defconfig_list; |  | ||||||
| struct symbol *modules_sym; | struct symbol *modules_sym; | ||||||
| tristate modules_val; | static tristate modules_val; | ||||||
| int recursive_is_error; | int recursive_is_error; | ||||||
|  |  | ||||||
| enum symbol_type sym_get_type(struct symbol *sym) | enum symbol_type sym_get_type(struct symbol *sym) | ||||||
| @ -222,7 +227,7 @@ static void sym_calc_visibility(struct symbol *sym) | |||||||
| 		sym_set_changed(sym); | 		sym_set_changed(sym); | ||||||
| 	} | 	} | ||||||
| 	tri = no; | 	tri = no; | ||||||
| 	if (sym->implied.expr && sym->dir_dep.tri != no) | 	if (sym->implied.expr) | ||||||
| 		tri = expr_calc_value(sym->implied.expr); | 		tri = expr_calc_value(sym->implied.expr); | ||||||
| 	if (tri == mod && sym_get_type(sym) == S_BOOLEAN) | 	if (tri == mod && sym_get_type(sym) == S_BOOLEAN) | ||||||
| 		tri = yes; | 		tri = yes; | ||||||
| @ -373,6 +378,8 @@ void sym_calc_value(struct symbol *sym) | |||||||
| 				if (sym->implied.tri != no) { | 				if (sym->implied.tri != no) { | ||||||
| 					sym->flags |= SYMBOL_WRITE; | 					sym->flags |= SYMBOL_WRITE; | ||||||
| 					newval.tri = EXPR_OR(newval.tri, sym->implied.tri); | 					newval.tri = EXPR_OR(newval.tri, sym->implied.tri); | ||||||
|  | 					newval.tri = EXPR_AND(newval.tri, | ||||||
|  | 							      sym->dir_dep.tri); | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		calc_newval: | 		calc_newval: | ||||||
| @ -381,8 +388,7 @@ void sym_calc_value(struct symbol *sym) | |||||||
| 			else | 			else | ||||||
| 				newval.tri = EXPR_OR(newval.tri, sym->rev_dep.tri); | 				newval.tri = EXPR_OR(newval.tri, sym->rev_dep.tri); | ||||||
| 		} | 		} | ||||||
| 		if (newval.tri == mod && | 		if (newval.tri == mod && sym_get_type(sym) == S_BOOLEAN) | ||||||
| 		    (sym_get_type(sym) == S_BOOLEAN || sym->implied.tri == yes)) |  | ||||||
| 			newval.tri = yes; | 			newval.tri = yes; | ||||||
| 		break; | 		break; | ||||||
| 	case S_STRING: | 	case S_STRING: | ||||||
| @ -446,7 +452,7 @@ void sym_clear_all_valid(void) | |||||||
|  |  | ||||||
| 	for_all_symbols(i, sym) | 	for_all_symbols(i, sym) | ||||||
| 		sym->flags &= ~SYMBOL_VALID; | 		sym->flags &= ~SYMBOL_VALID; | ||||||
| 	sym_add_change_count(1); | 	conf_set_changed(true); | ||||||
| 	sym_calc_value(modules_sym); | 	sym_calc_value(modules_sym); | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -464,8 +470,6 @@ bool sym_tristate_within_range(struct symbol *sym, tristate val) | |||||||
| 		return false; | 		return false; | ||||||
| 	if (sym->visible <= sym->rev_dep.tri) | 	if (sym->visible <= sym->rev_dep.tri) | ||||||
| 		return false; | 		return false; | ||||||
| 	if (sym->implied.tri == yes && val == mod) |  | ||||||
| 		return false; |  | ||||||
| 	if (sym_is_choice_value(sym) && sym->visible == yes) | 	if (sym_is_choice_value(sym) && sym->visible == yes) | ||||||
| 		return val == yes; | 		return val == yes; | ||||||
| 	return val >= sym->rev_dep.tri && val <= sym->visible; | 	return val >= sym->rev_dep.tri && val <= sym->visible; | ||||||
| @ -812,7 +816,7 @@ struct symbol *sym_lookup(const char *name, int flags) | |||||||
| 	memset(symbol, 0, sizeof(*symbol)); | 	memset(symbol, 0, sizeof(*symbol)); | ||||||
| 	symbol->name = new_name; | 	symbol->name = new_name; | ||||||
| 	symbol->type = S_UNKNOWN; | 	symbol->type = S_UNKNOWN; | ||||||
| 	symbol->flags |= flags; | 	symbol->flags = flags; | ||||||
|  |  | ||||||
| 	symbol->next = symbol_hash[hash]; | 	symbol->next = symbol_hash[hash]; | ||||||
| 	symbol_hash[hash] = symbol; | 	symbol_hash[hash] = symbol; | ||||||
|  | |||||||
| @ -130,7 +130,7 @@ config IN_SDK | |||||||
| config MODULES | config MODULES | ||||||
| 	bool | 	bool | ||||||
| 	default y | 	default y | ||||||
| 	option modules | 	modules | ||||||
|  |  | ||||||
| source "Config-build.in" | source "Config-build.in" | ||||||
| source "tmp/.config-package.in" | source "tmp/.config-package.in" | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user