Browse Source

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 <[email protected]>
Eneas U de Queiroz 3 years ago
parent
commit
009293c52e

+ 1 - 1
Config.in

@@ -5,7 +5,7 @@
 mainmenu "OpenWrt Configuration"
 mainmenu "OpenWrt Configuration"
 
 
 config MODULES
 config MODULES
-	option modules
+	modules
 	bool
 	bool
 	default y
 	default y
 
 

+ 12 - 18
scripts/config/.gitignore

@@ -1,22 +1,16 @@
-#
-# Generated files
-#
-*.moc
-*conf-cfg
-mconf_check
+# SPDX-License-Identifier: GPL-2.0-only
+/conf
+/[gmnq]conf
+/[gmnq]conf-cfg
+/qconf-moc.cc
+
+# From linux kconfig parent directories
+.*
 
 
-#
-# configuration programs
-#
-conf
-mconf
-nconf
-qconf
-gconf
+# OpenWrt-generated files
+mconf_check
 
 
-#
-# temporary files from older version.  Should be removed
-#
+# Temporary files from older versions.  They should be removed after the
+# end of support for OpenWrt 19.07.
 zconf.???.c
 zconf.???.c
 zconf.hash.c
 zconf.hash.c
-.tmp_qtcheck

+ 38 - 24
scripts/config/Makefile

@@ -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 \
-		   symbol.o util.o
+common-objs	:= confdata.o expr.o lexer.lex.o menu.o parser.tab.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
-qconf-cxxobjs	:= qconf.o
+hostprogs	+= qconf
+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)/qconf-moc.cc: $(src)/qconf.h $(obj)/qconf-cfg FORCE
+	$(call if_changed,moc)
 
 
-$(obj)/%.moc: $(src)/%.h $(obj)/qconf-cfg
-	$(call cmd,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), \
-  $(eval $f: CFLAGS+=$$(HOSTCFLAGS_$f)))
+$(foreach f,$(conf-objs) $(filter-out $(common-objs),$(mconf-objs) \
+						     $(qconf-objs) \
+						     $(nconf-objs)), \
+  $(eval $(obj)/$f: CFLAGS+=$$(HOSTCFLAGS_$f)))
 
 
-$(obj)/lexer.lex.o: CFLAGS += $(HOSTCFLAGS_lexer.lex.o)
-$(obj)/parser.tab.o: CFLAGS += $(HOSTCFLAGS_parser.tab.o)
-$(obj)/qconf.o: CXXFLAGS+=$(HOSTCXXFLAGS_qconf.o)
+$(foreach f,$(qconf-cxxobjs), \
+  $(eval $(obj)/$f: CXXFLAGS+=$$(HOSTCXXFLAGS_$f)))
 
 
-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)

+ 4 - 5
scripts/config/README

@@ -1,7 +1,6 @@
-These files were taken from the Linux Kernel Configuration System at commit
-089b7d890f972f6b649fedc9259f6b93a18fb970 (Feb 4, 2020) and modified for the
-OpenWrt Buildroot:
- - Removed gconf, tests and kernel configuration targets.
+These files were taken from the Linux 5.14 Kernel Configuration System and
+modified for the OpenWrt Buildroot:
+ - Removed nconf, 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

+ 327 - 124
scripts/config/conf.c

@@ -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 int conf_askvalue(struct symbol *sym, const char *def)
+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)
 {
 {
-	enum symbol_type type = sym_get_type(sym);
+	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)
+{
 	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_is_changeable(sym) ||
-		    (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) {
-						str = sym_get_string_value(sym);
-						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");
+	if (sym && !sym_has_value(sym) &&
+	    (sym_is_changeable(sym) ||
+	     (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes))) {
 
 
-			} else {
-				if (!conf_cnt++)
-					printf("*\n* Restart config...\n*\n");
-				rootEntry = menu_get_parent_menu(menu);
-				conf(rootEntry);
+		switch (input_mode) {
+		case listnewconfig:
+			if (sym->name) {
+				const char *str;
+
+				if (sym->type == S_STRING) {
+					str = sym_get_string_value(sym);
+					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);
+				}
 			}
 			}
+			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[] = {
-	{"oldaskconfig",    no_argument,       NULL, oldaskconfig},
-	{"oldconfig",       no_argument,       NULL, oldconfig},
-	{"syncconfig",      no_argument,       NULL, syncconfig},
-	{"defconfig",       required_argument, NULL, defconfig},
-	{"savedefconfig",   required_argument, NULL, savedefconfig},
-	{"allnoconfig",     no_argument,       NULL, allnoconfig},
-	{"allyesconfig",    no_argument,       NULL, allyesconfig},
-	{"allmodconfig",    no_argument,       NULL, allmodconfig},
-	{"alldefconfig",    no_argument,       NULL, alldefconfig},
-	{"randconfig",      no_argument,       NULL, randconfig},
-	{"listnewconfig",   no_argument,       NULL, listnewconfig},
-	{"helpnewconfig",   no_argument,       NULL, helpnewconfig},
-	{"olddefconfig",    no_argument,       NULL, olddefconfig},
-	{"yes2modconfig",   no_argument,       NULL, yes2modconfig},
-	{"mod2yesconfig",   no_argument,       NULL, mod2yesconfig},
-	{"fatalrecursive",  no_argument,       NULL, fatalrecursive},
+static const struct option long_opts[] = {
+	{"help",          no_argument,       NULL,            'h'},
+	{"silent",        no_argument,       NULL,            's'},
+	{"oldaskconfig",  no_argument,       &input_mode_opt, oldaskconfig},
+	{"oldconfig",     no_argument,       &input_mode_opt, oldconfig},
+	{"syncconfig",    no_argument,       &input_mode_opt, syncconfig},
+	{"defconfig",     required_argument, &input_mode_opt, defconfig},
+	{"savedefconfig", required_argument, &input_mode_opt, savedefconfig},
+	{"allnoconfig",   no_argument,       &input_mode_opt, allnoconfig},
+	{"allyesconfig",  no_argument,       &input_mode_opt, allyesconfig},
+	{"allmodconfig",  no_argument,       &input_mode_opt, allmodconfig},
+	{"alldefconfig",  no_argument,       &input_mode_opt, alldefconfig},
+	{"randconfig",    no_argument,       &input_mode_opt, randconfig},
+	{"listnewconfig", no_argument,       &input_mode_opt, listnewconfig},
+	{"helpnewconfig", no_argument,       &input_mode_opt, helpnewconfig},
+	{"olddefconfig",  no_argument,       &input_mode_opt, olddefconfig},
+	{"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 [-s] [--fatalrecursive] [option] <kconfig-file>\n", progname);
-	printf("[option] is _one_ of the following:\n");
+	printf("Usage: %s [options] <kconfig-file>\n", progname);
+	printf("\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) {
-		if (opt == 's') {
-			conf_set_message_callback(NULL);
-			continue;
-		}
+	while ((opt = getopt_long(ac, av, "hr:sw:", long_opts, NULL)) != -1) {
 		switch (opt) {
 		switch (opt) {
-		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:
-		{
-			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);
+		case 'h':
+			conf_usage(progname);
+			exit(1);
 			break;
 			break;
-		}
-		case oldaskconfig:
-		case oldconfig:
-		case allnoconfig:
-		case allyesconfig:
-		case allmodconfig:
-		case alldefconfig:
-		case listnewconfig:
-		case helpnewconfig:
-		case olddefconfig:
-		case yes2modconfig:
-		case mod2yesconfig:
+		case 's':
+			conf_set_message_callback(NULL);
 			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;
-		case '?':
-			conf_usage(progname);
-			exit(1);
+			break;
+		case 0:
+			input_mode = input_mode_opt;
+			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(name);
+	conf_parse(av[optind]);
 	//zconfdump(stdout);
 	//zconfdump(stdout);
 
 
 	switch (input_mode) {
 	switch (input_mode) {

+ 48 - 231
scripts/config/confdata.c

@@ -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, c;
+	char *d;
 
 
-	/* check overflow: prefix + name + ".h" + '\0' must fit in buffer. */
-	if (depfile_prefix_len + strlen(name) + 3 > sizeof(depfile_path))
+	/* check overflow: prefix + name + '\0' must fit in buffer. */
+	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;
-
-	while ((c = *s++))
-		*d++ = (c == '_') ? '/' : tolower(c);
-	strcpy(d, ".h");
+	strcpy(d, name);
 
 
 	/* 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);
-		if (!sym_defconfig_list)
+		conf_set_changed(true);
+
+		env = getenv("KCONFIG_DEFCONFIG_LIST");
+		if (!env)
 			return 1;
 			return 1;
 
 
-		for_all_defaults(sym_defconfig_list, prop) {
-			if (expr_calc_value(prop->visible.expr) == no ||
-			    prop->expr->type != E_SYMBOL)
-				continue;
-			sym_calc_value(prop->expr->left.sym);
-			name = sym_get_string_value(prop->expr->left.sym);
-			in = zconf_fopen(name);
+		while (1) {
+			bool is_last;
+
+			while (isspace(*env))
+				env++;
+
+			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;
-	sym_change_count = count;
-	if (conf_changed_callback &&
-	    (bool)_sym_change_count != (bool)count)
+	if (conf_changed_callback && conf_changed != val)
 		conf_changed_callback();
 		conf_changed_callback();
-}
 
 
-void sym_add_change_count(int count)
-{
-	sym_set_change_count(count + sym_change_count);
+	conf_changed = val;
 }
 }
 
 
 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);
-		}
-	}
-}

+ 0 - 6
scripts/config/expr.h

@@ -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);

+ 15 - 15
scripts/config/images.c

@@ -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",

+ 15 - 15
scripts/config/images.h

@@ -10,21 +10,21 @@
 extern "C" {
 extern "C" {
 #endif
 #endif
 
 
-extern const char *xpm_load[];
-extern const char *xpm_save[];
-extern const char *xpm_back[];
-extern const char *xpm_tree_view[];
-extern const char *xpm_single_view[];
-extern const char *xpm_split_view[];
-extern const char *xpm_symbol_no[];
-extern const char *xpm_symbol_mod[];
-extern const char *xpm_symbol_yes[];
-extern const char *xpm_choice_no[];
-extern const char *xpm_choice_yes[];
-extern const char *xpm_menu[];
-extern const char *xpm_menu_inv[];
-extern const char *xpm_menuback[];
-extern const char *xpm_void[];
+extern const char * const xpm_load[];
+extern const char * const xpm_save[];
+extern const char * const xpm_back[];
+extern const char * const xpm_tree_view[];
+extern const char * const xpm_single_view[];
+extern const char * const xpm_split_view[];
+extern const char * const xpm_symbol_no[];
+extern const char * const xpm_symbol_mod[];
+extern const char * const xpm_symbol_yes[];
+extern const char * const xpm_choice_no[];
+extern const char * const xpm_choice_yes[];
+extern const char * const xpm_menu[];
+extern const char * const xpm_menu_inv[];
+extern const char * const xpm_menuback[];
+extern const char * const xpm_void[];
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
 }
 }

+ 9 - 0
scripts/config/internal.h

@@ -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 */

+ 2 - 6
scripts/config/lexer.l

@@ -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
+ 982 - 1263
scripts/config/lexer.lex.c


+ 32 - 36
scripts/config/lkc.h

@@ -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);

+ 1 - 14
scripts/config/lkc_proto.h

@@ -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];
 
 

+ 2 - 2
scripts/config/lxdialog/util.c

@@ -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)

+ 3 - 1
scripts/config/mconf-cfg.sh

@@ -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

+ 6 - 9
scripts/config/mconf.c

@@ -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),
-			"%s - %s", config_filename, rootmenu.prompt->text);
-	if (size >= sizeof(menu_backtitle))
-		menu_backtitle[sizeof(menu_backtitle)-1] = '\0';
+	snprintf(menu_backtitle, sizeof(menu_backtitle), "%s - %s",
+		 config_filename, rootmenu.prompt->text);
 	set_dialog_backtitle(menu_backtitle);
 	set_dialog_backtitle(menu_backtitle);
 
 
-	size = snprintf(filename, sizeof(filename), "%s", config_filename);
-	if (size >= sizeof(filename))
-		filename[sizeof(filename)-1] = '\0';
+	snprintf(filename, sizeof(filename), "%s", config_filename);
 }
 }
 
 
 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);

+ 3 - 23
scripts/config/menu.c

@@ -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 = &current_entry->list;
 	last_entry_ptr = &current_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 ||

+ 26 - 33
scripts/config/nconf.c

@@ -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 index;
+	int match_start, 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),
-			"%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;
+	snprintf(filename, sizeof(filename), "%s", config_filename);
 }
 }
 
 
 /* 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, 0, getmaxx(stdscr),
+	print_in_middle(stdscr, 1, 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",
-				menu_instructions,
-				current_index, &last_top_row);
+		show_menu(menu_get_prompt(menu), menu_instructions,
+			  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_back(curses_menu, attributes[MAIN_MENU_BACK]);
-	set_menu_grey(curses_menu, attributes[MAIN_MENU_GREY]);
+	set_menu_fore(curses_menu, attr_main_menu_fore);
+	set_menu_back(curses_menu, attr_main_menu_back);
+	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();

+ 117 - 167
scripts/config/nconf.gui.c

@@ -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 */
-attributes_t attributes[ATTR_MAX+1] = {0};
-
-/* available colors:
-   COLOR_BLACK   0
-   COLOR_RED     1
-   COLOR_GREEN   2
-   COLOR_YELLOW  3
-   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 */
-	init_pair(MAIN_MENU_FORE, -1, -1);
-	/* BACK for all the rest */
-	init_pair(MAIN_MENU_BACK, -1, -1);
-	init_pair(MAIN_MENU_GREY, -1, -1);
-	init_pair(MAIN_MENU_HEADING, COLOR_GREEN, -1);
-	init_pair(MAIN_MENU_BOX, COLOR_YELLOW, -1);
-
-	init_pair(SCROLLWIN_TEXT, -1, -1);
-	init_pair(SCROLLWIN_HEADING, COLOR_GREEN, -1);
-	init_pair(SCROLLWIN_BOX, COLOR_YELLOW, -1);
-
-	init_pair(DIALOG_TEXT, -1, -1);
-	init_pair(DIALOG_BOX, COLOR_YELLOW, -1);
-	init_pair(DIALOG_MENU_BACK, COLOR_YELLOW, -1);
-	init_pair(DIALOG_MENU_FORE, COLOR_RED, -1);
-
-	init_pair(INPUT_BOX, COLOR_YELLOW, -1);
-	init_pair(INPUT_HEADING, COLOR_GREEN, -1);
-	init_pair(INPUT_TEXT, -1, -1);
-	init_pair(INPUT_FIELD, -1, -1);
-
-	init_pair(FUNCTION_HIGHLIGHT, -1, -1);
-	init_pair(FUNCTION_TEXT, COLOR_YELLOW, -1);
-}
-
-/* available attributes:
-   A_NORMAL        Normal display (no highlight)
-   A_STANDOUT      Best highlighting mode of the terminal.
-   A_UNDERLINE     Underlining
-   A_REVERSE       Reverse video
-   A_BLINK         Blinking
-   A_DIM           Half bright
-   A_BOLD          Extra bright or bold
-   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);
-}
+int attr_normal;
+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;
+
+#define COLOR_ATTR(_at, _fg, _bg, _hl) \
+	{ .attr = &(_at), .has_color = true, .color_fg = _fg, .color_bg = _bg, .highlight = _hl }
+#define NO_COLOR_ATTR(_at, _hl) \
+	{ .attr = &(_at), .has_color = false, .highlight = _hl }
+#define COLOR_DEFAULT		-1
+
+struct nconf_attr_param {
+	int *attr;
+	bool has_color;
+	int color_fg;
+	int color_bg;
+	int highlight;
+};
+
+static const struct nconf_attr_param color_theme_params[] = {
+	COLOR_ATTR(attr_normal,			COLOR_DEFAULT,	COLOR_DEFAULT,	A_NORMAL),
+	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 */ }
+};
+
+static const struct nconf_attr_param no_color_theme_params[] = {
+	NO_COLOR_ATTR(attr_normal,		A_NORMAL),
+	NO_COLOR_ATTR(attr_main_heading,	A_BOLD | A_UNDERLINE),
+	NO_COLOR_ATTR(attr_main_menu_box,	A_NORMAL),
+	NO_COLOR_ATTR(attr_main_menu_fore,	A_STANDOUT),
+	NO_COLOR_ATTR(attr_main_menu_back,	A_NORMAL),
+	NO_COLOR_ATTR(attr_main_menu_grey,	A_NORMAL),
+	NO_COLOR_ATTR(attr_main_menu_heading,	A_BOLD),
+	NO_COLOR_ATTR(attr_scrollwin_text,	A_NORMAL),
+	NO_COLOR_ATTR(attr_scrollwin_heading,	A_BOLD),
+	NO_COLOR_ATTR(attr_scrollwin_box,	A_BOLD),
+	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),
+	NO_COLOR_ATTR(attr_dialog_box,		A_BOLD),
+	NO_COLOR_ATTR(attr_input_box,		A_BOLD),
+	NO_COLOR_ATTR(attr_input_heading,	A_BOLD),
+	NO_COLOR_ATTR(attr_input_text,		A_NORMAL),
+	NO_COLOR_ATTR(attr_input_field,		A_UNDERLINE),
+	NO_COLOR_ATTR(attr_function_text,	A_REVERSE),
+	NO_COLOR_ATTR(attr_function_highlight,	A_BOLD),
+	{ /* sentinel */ }
+};
 
 
 void set_colors(void)
 void set_colors(void)
 {
 {
-	start_color();
-	use_default_colors();
-	set_normal_colors();
+	const struct nconf_attr_param *p;
+	int pair = 0;
+
 	if (has_colors()) {
 	if (has_colors()) {
-		normal_color_theme();
+		start_color();
+		use_default_colors();
+		p = color_theme_params;
 	} else {
 	} else {
-		/* give defaults */
-		no_colors_theme();
+		p = no_color_theme_params;
 	}
 	}
-}
 
 
+	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,
-		int starty,
-		int startx,
-		int width,
-		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();
+void print_in_middle(WINDOW *win, int y, int width, const char *str, int attrs)
+{
+	wattrset(win, attrs);
+	mvwprintw(win, y, (width - strlen(str)) / 2, "%s", str);
 }
 }
 
 
 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_back(menu, attributes[DIALOG_MENU_BACK]);
+	set_menu_fore(menu, attr_dialog_menu_fore);
+	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);

+ 21 - 30
scripts/config/nconf.h

@@ -32,30 +32,26 @@
 		typeof(b) _b = b;\
 		typeof(b) _b = b;\
 		_a < _b ? _a : _b; })
 		_a < _b ? _a : _b; })
 
 
-typedef enum {
-	NORMAL = 1,
-	MAIN_HEADING,
-	MAIN_MENU_BOX,
-	MAIN_MENU_FORE,
-	MAIN_MENU_BACK,
-	MAIN_MENU_GREY,
-	MAIN_MENU_HEADING,
-	SCROLLWIN_TEXT,
-	SCROLLWIN_HEADING,
-	SCROLLWIN_BOX,
-	DIALOG_TEXT,
-	DIALOG_MENU_FORE,
-	DIALOG_MENU_BACK,
-	DIALOG_BOX,
-	INPUT_BOX,
-	INPUT_HEADING,
-	INPUT_TEXT,
-	INPUT_FIELD,
-	FUNCTION_TEXT,
-	FUNCTION_HIGHLIGHT,
-	ATTR_MAX
-} attributes_t;
-extern attributes_t attributes[];
+extern int attr_normal;
+extern int attr_main_heading;
+extern int attr_main_menu_box;
+extern int attr_main_menu_fore;
+extern int attr_main_menu_back;
+extern int attr_main_menu_grey;
+extern int attr_main_menu_heading;
+extern int attr_scrollwin_text;
+extern int attr_scrollwin_heading;
+extern int attr_scrollwin_box;
+extern int attr_dialog_text;
+extern int attr_dialog_menu_fore;
+extern int attr_dialog_menu_back;
+extern int attr_dialog_box;
+extern int attr_input_box;
+extern int attr_input_heading;
+extern int attr_input_text;
+extern int attr_input_field;
+extern int attr_function_text;
+extern int attr_function_highlight;
 
 
 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,
-		int starty,
-		int startx,
-		int width,
-		const char *string,
-		chtype color);
+void print_in_middle(WINDOW *win, int y, int width, const char *str, int attrs);
 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
+ 453 - 349
scripts/config/parser.tab.c


+ 62 - 58
scripts/config/parser.tab.h

@@ -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,
-    T_WORD = 259,
-    T_WORD_QUOTE = 260,
-    T_ALLNOCONFIG_Y = 261,
-    T_BOOL = 262,
-    T_CHOICE = 263,
-    T_CLOSE_PAREN = 264,
-    T_COLON_EQUAL = 265,
-    T_COMMENT = 266,
-    T_CONFIG = 267,
-    T_DEFAULT = 268,
-    T_DEFCONFIG_LIST = 269,
-    T_DEF_BOOL = 270,
-    T_DEF_TRISTATE = 271,
-    T_DEPENDS = 272,
-    T_ENDCHOICE = 273,
-    T_ENDIF = 274,
-    T_ENDMENU = 275,
-    T_HELP = 276,
-    T_HEX = 277,
-    T_IF = 278,
-    T_IMPLY = 279,
-    T_INT = 280,
-    T_MAINMENU = 281,
-    T_MENU = 282,
-    T_MENUCONFIG = 283,
-    T_MODULES = 284,
-    T_ON = 285,
-    T_OPEN_PAREN = 286,
-    T_OPTION = 287,
-    T_OPTIONAL = 288,
-    T_PLUS_EQUAL = 289,
-    T_PROMPT = 290,
-    T_RANGE = 291,
-    T_RESET = 292,
-    T_SELECT = 293,
-    T_SOURCE = 294,
-    T_STRING = 295,
-    T_TRISTATE = 296,
-    T_VISIBLE = 297,
-    T_EOL = 298,
-    T_ASSIGN_VAL = 299,
-    T_OR = 300,
-    T_AND = 301,
-    T_EQUAL = 302,
-    T_UNEQUAL = 303,
-    T_LESS = 304,
-    T_LESS_EQUAL = 305,
-    T_GREATER = 306,
-    T_GREATER_EQUAL = 307,
-    T_NOT = 308
+    YYEMPTY = -2,
+    YYEOF = 0,                     /* "end of file"  */
+    YYerror = 256,                 /* error  */
+    YYUNDEF = 257,                 /* "invalid token"  */
+    T_HELPTEXT = 258,              /* T_HELPTEXT  */
+    T_WORD = 259,                  /* T_WORD  */
+    T_WORD_QUOTE = 260,            /* T_WORD_QUOTE  */
+    T_BOOL = 261,                  /* T_BOOL  */
+    T_CHOICE = 262,                /* T_CHOICE  */
+    T_CLOSE_PAREN = 263,           /* T_CLOSE_PAREN  */
+    T_COLON_EQUAL = 264,           /* T_COLON_EQUAL  */
+    T_COMMENT = 265,               /* T_COMMENT  */
+    T_CONFIG = 266,                /* T_CONFIG  */
+    T_DEFAULT = 267,               /* T_DEFAULT  */
+    T_DEF_BOOL = 268,              /* T_DEF_BOOL  */
+    T_DEF_TRISTATE = 269,          /* T_DEF_TRISTATE  */
+    T_DEPENDS = 270,               /* T_DEPENDS  */
+    T_ENDCHOICE = 271,             /* T_ENDCHOICE  */
+    T_ENDIF = 272,                 /* T_ENDIF  */
+    T_ENDMENU = 273,               /* T_ENDMENU  */
+    T_HELP = 274,                  /* T_HELP  */
+    T_HEX = 275,                   /* T_HEX  */
+    T_IF = 276,                    /* T_IF  */
+    T_IMPLY = 277,                 /* T_IMPLY  */
+    T_INT = 278,                   /* T_INT  */
+    T_MAINMENU = 279,              /* T_MAINMENU  */
+    T_MENU = 280,                  /* T_MENU  */
+    T_MENUCONFIG = 281,            /* T_MENUCONFIG  */
+    T_MODULES = 282,               /* T_MODULES  */
+    T_ON = 283,                    /* T_ON  */
+    T_OPEN_PAREN = 284,            /* T_OPEN_PAREN  */
+    T_OPTIONAL = 285,              /* T_OPTIONAL  */
+    T_PLUS_EQUAL = 286,            /* T_PLUS_EQUAL  */
+    T_PROMPT = 287,                /* T_PROMPT  */
+    T_RANGE = 288,                 /* T_RANGE  */
+    T_RESET = 289,                 /* T_RESET  */
+    T_SELECT = 290,                /* T_SELECT  */
+    T_SOURCE = 291,                /* T_SOURCE  */
+    T_STRING = 292,                /* T_STRING  */
+    T_TRISTATE = 293,              /* T_TRISTATE  */
+    T_VISIBLE = 294,               /* T_VISIBLE  */
+    T_EOL = 295,                   /* T_EOL  */
+    T_ASSIGN_VAL = 296,            /* T_ASSIGN_VAL  */
+    T_OR = 297,                    /* T_OR  */
+    T_AND = 298,                   /* T_AND  */
+    T_EQUAL = 299,                 /* T_EQUAL  */
+    T_UNEQUAL = 300,               /* T_UNEQUAL  */
+    T_LESS = 301,                  /* T_LESS  */
+    T_LESS_EQUAL = 302,            /* T_LESS_EQUAL  */
+    T_GREATER = 303,               /* T_GREATER  */
+    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

+ 24 - 33
scripts/config/parser.y

@@ -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:
-	  if_stmt
-	| comment_stmt
-	| config_stmt
-	| menuconfig_stmt
-	| source_stmt
-	| assignment_stmt
+stmt_list_in_choice:
+	  /* empty */
+	| stmt_list_in_choice comment_stmt
+	| stmt_list_in_choice config_stmt
+	| stmt_list_in_choice if_stmt_in_choice
+	| stmt_list_in_choice error T_EOL	{ zconf_error("invalid statement"); }
 ;
 ;
 
 
 /* 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
-{
-	menu_add_option_modules();
-};
-
-config_option: T_OPTION T_DEFCONFIG_LIST T_EOL
-{
-	menu_add_option_defconfig_list();
-};
-
-config_option: T_OPTION T_ALLNOCONFIG_Y T_EOL
+config_option: T_MODULES T_EOL
 {
 {
-	menu_add_option_allnoconfig_y();
+	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;
 };
 };
 
 
 /* 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"

+ 1 - 1
scripts/config/preprocess.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[])

+ 3 - 11
scripts/config/qconf-cfg.sh

@@ -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 "* Please install either Qt 4.8 or 5.x. and make sure it's in PKG_CONFIG_PATH"
+echo >&2 "* Could not find Qt5 via pkg-config."
+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
+ 361 - 377
scripts/config/qconf.cc


+ 52 - 108
scripts/config/qconf.h

@@ -3,23 +3,22 @@
  * Copyright (C) 2002 Roman Zippel <[email protected]>
  * Copyright (C) 2002 Roman Zippel <[email protected]>
  */
  */
 
 
-#include <QTextBrowser>
-#include <QTreeWidget>
-#include <QMainWindow>
+#include <QCheckBox>
+#include <QDialog>
 #include <QHeaderView>
 #include <QHeaderView>
-#include <qsettings.h>
+#include <QLineEdit>
+#include <QMainWindow>
 #include <QPushButton>
 #include <QPushButton>
 #include <QSettings>
 #include <QSettings>
-#include <QLineEdit>
 #include <QSplitter>
 #include <QSplitter>
-#include <QCheckBox>
-#include <QDialog>
+#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;
-	QPixmap choiceYesPix, choiceNoPix;
-	QPixmap menuPix, menuInvPix, menuBackPix, voidPix;
-
-	bool showName, showRange, showData;
+	bool showName;
 	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;
-};
 
 
-class ConfigLineEdit : public QLineEdit {
-	Q_OBJECT
-	typedef class QLineEdit Parent;
-public:
-	ConfigLineEdit(ConfigView* parent);
-	ConfigView* parent(void) const
-	{
-		return (ConfigView*)Parent::parent();
-	}
-	void show(ConfigItem *i);
-	void keyPressEvent(QKeyEvent *e);
-
-public:
-	ConfigItem *item;
+	static QIcon symbolYesIcon, symbolModIcon, symbolNoIcon;
+	static QIcon choiceYesIcon, choiceNoIcon;
+	static QIcon menuIcon, menubackIcon;
 };
 };
 
 
-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);
+class ConfigItemDelegate : public QStyledItemDelegate
+{
+private:
+	struct menu *menu;
 public:
 public:
-	ConfigList* list;
-	ConfigLineEdit* lineEdit;
-
-	static ConfigView* viewList;
-	ConfigView* nextView;
-
-	static QAction *showNormalAction;
-	static QAction *showAllAction;
-	static QAction *showPromptAction;
+	ConfigItemDelegate(QObject *parent = nullptr)
+		: QStyledItemDelegate(parent) {}
+	QWidget *createEditor(QWidget *parent,
+			      const QStyleOptionViewItem &option,
+			      const QModelIndex &index) const override;
+	void setModelData(QWidget *editor, QAbstractItemModel *model,
+			  const QModelIndex &index) const override;
 };
 };
 
 
 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 *e);
+	void contextMenuEvent(QContextMenuEvent *event);
 
 
 	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;

+ 17 - 13
scripts/config/symbol.c

@@ -3,11 +3,11 @@
  * Copyright (C) 2002 Roman Zippel <[email protected]>
  * Copyright (C) 2002 Roman Zippel <[email protected]>
  */
  */
 
 
+#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 &&
-		    (sym_get_type(sym) == S_BOOLEAN || sym->implied.tri == yes))
+		if (newval.tri == mod && sym_get_type(sym) == S_BOOLEAN)
 			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;

+ 1 - 1
target/sdk/files/Config.in

@@ -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"

Some files were not shown because too many files changed in this diff