build: scripts/config - update to kconfig-v5.14

Functional Changes
---------- -------
- make 'imply' not impose any restrictions: allow symbols implied by y
  to become m
- change "modules" from sub-option to first-level attribute

Bugfixes
--------
- nconf: fix core dump when searching in empty menu
- nconf: stop endless search loops
- xconfig: fix content of the main widget
- xconfig: fix support for the split view mode

Other Changes
----- -------
- highlight xconfig 'comment' lines with '***'
- xconfig: navigate menus on hyperlinks
- xconfig: drop support for Qt4
- improve host ncurses detection

Update the 'option modules' usage to just 'modules' in Config.in.

Signed-off-by: Eneas U de Queiroz <cotequeiroz@gmail.com>
This commit is contained in:
Eneas U de Queiroz 2021-11-24 18:25:43 -03:00 committed by Petr Štetiar
parent 73ea763c0d
commit 009293c52e
30 changed files with 3218 additions and 3931 deletions

View File

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

View File

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

View File

@ -5,11 +5,11 @@
.PHONY: clean all .PHONY: clean all
all: conf mconf all: conf mconf
clean: clean:
rm -f *.o lxdialog/*.o *.moc $(clean-files) conf mconf qconf nconf rm -f *.o lxdialog/*.o *.moc .*.cmd $(clean-files)
# This clean-files definition is here to ensure that temporary files from the # This clean-files definition is here to ensure that temporary files from the
# previous version are removed by make config-clean. # previous version are removed by make config-clean.
# It should be removed or emptied when this Makefile get updated again. # It should be emptied after the end of support for OpenWrt 19.07.
clean-files := zconf.tab.c zconf.lex.c zconf.hash.c .tmp_qtcheck clean-files := zconf.tab.c zconf.lex.c zconf.hash.c .tmp_qtcheck
# =========================================================================== # ===========================================================================
@ -24,9 +24,11 @@ src:=.
obj:=. obj:=.
Q:=$(if $V,,@) Q:=$(if $V,,@)
cmd = $(cmd_$(1)) cmd = $(cmd_$(1))
dot-target = $(dir $@).$(notdir $@)
# taken from ../Kbuild.include # some definitions taken from ../Kbuild.include
dot-target = $(dir $@).$(notdir $@)
squote := '
escsq = $(subst $(squote),'\$(squote)',$1)
define filechk define filechk
$(Q)set -e; \ $(Q)set -e; \
mkdir -p $(dir $@); \ mkdir -p $(dir $@); \
@ -37,23 +39,29 @@ define filechk
mv -f $(dot-target).tmp $@; \ mv -f $(dot-target).tmp $@; \
fi fi
endef endef
cmd-check = $(if $(strip $(cmd_$@)),,1)
make-cmd = $(call escsq,$(subst $(pound),$$(pound),$(subst $$,$$$$,$(cmd_$(1)))))
newer-prereqs = $(filter-out $(PHONY),$?)
if_changed = $(if $(newer-prereqs)$(cmd-check), \
$(cmd); \
printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd, @:)
### Stripped down upstream Makefile follows: ### Stripped down upstream Makefile follows:
# =========================================================================== # ===========================================================================
# object files used by all kconfig flavours # object files used by all kconfig flavours
common-objs := confdata.o expr.o lexer.lex.o parser.tab.o preprocess.o \ common-objs := confdata.o expr.o lexer.lex.o menu.o parser.tab.o \
symbol.o util.o preprocess.o symbol.o util.o
$(obj)/lexer.lex.o: $(obj)/parser.tab.h $(obj)/lexer.lex.o: $(obj)/parser.tab.h
HOSTCFLAGS_lexer.lex.o := -I $(srctree)/$(src) HOSTCFLAGS_lexer.lex.o := -I $(srctree)/$(src)
HOSTCFLAGS_parser.tab.o := -I $(srctree)/$(src) HOSTCFLAGS_parser.tab.o := -I $(srctree)/$(src)
# conf: Used for defconfig, oldconfig and related targets # conf: Used for defconfig, oldconfig and related targets
hostprogs-y += conf hostprogs += conf
conf-objs := conf.o $(common-objs) conf-objs := conf.o $(common-objs)
# nconf: Used for the nconfig target based on ncurses # nconf: Used for the nconfig target based on ncurses
hostprogs-y += nconf hostprogs += nconf
nconf-objs := nconf.o nconf.gui.o $(common-objs) nconf-objs := nconf.o nconf.gui.o $(common-objs)
HOSTLDLIBS_nconf = $(shell . $(obj)/nconf-cfg && echo $$libs) HOSTLDLIBS_nconf = $(shell . $(obj)/nconf-cfg && echo $$libs)
@ -63,7 +71,7 @@ HOSTCFLAGS_nconf.gui.o = $(shell . $(obj)/nconf-cfg && echo $$cflags)
$(obj)/nconf.o $(obj)/nconf.gui.o: $(obj)/nconf-cfg $(obj)/nconf.o $(obj)/nconf.gui.o: $(obj)/nconf-cfg
# mconf: Used for the menuconfig target based on lxdialog # mconf: Used for the menuconfig target based on lxdialog
hostprogs-y += mconf hostprogs += mconf
lxdialog := $(addprefix lxdialog/, \ lxdialog := $(addprefix lxdialog/, \
checklist.o inputbox.o menubox.o textbox.o util.o yesno.o) checklist.o inputbox.o menubox.o textbox.o util.o yesno.o)
mconf-objs := mconf.o $(lxdialog) $(common-objs) mconf-objs := mconf.o $(lxdialog) $(common-objs)
@ -75,20 +83,23 @@ $(foreach f, mconf.o $(lxdialog), \
$(addprefix $(obj)/, mconf.o $(lxdialog)): $(obj)/mconf-cfg $(addprefix $(obj)/, mconf.o $(lxdialog)): $(obj)/mconf-cfg
# qconf: Used for the xconfig target based on Qt # qconf: Used for the xconfig target based on Qt
hostprogs-y += qconf hostprogs += qconf
qconf-cxxobjs := qconf.o qconf-cxxobjs := qconf.o qconf-moc.o
qconf-objs := images.o $(common-objs) qconf-objs := images.o $(common-objs)
HOSTLDLIBS_qconf = $(shell . $(obj)/qconf-cfg && echo $$libs) HOSTLDLIBS_qconf = $(shell . $(obj)/qconf-cfg && echo $$libs)
HOSTCXXFLAGS_qconf.o = $(shell . $(obj)/qconf-cfg && echo $$cflags) HOSTCXXFLAGS_qconf.o = $(shell . $(obj)/qconf-cfg && echo $$cflags)
HOSTCXXFLAGS_qconf-moc.o = $(shell . $(obj)/qconf-cfg && echo $$cflags)
$(obj)/qconf.o: $(obj)/qconf-cfg $(obj)/qconf.moc $(obj)/qconf.o: $(obj)/qconf-cfg
quiet_cmd_moc = MOC $@ quiet_cmd_moc = MOC $@
cmd_moc = $(shell . $(obj)/qconf-cfg && echo $$moc) -i $< -o $@ cmd_moc = $(shell . $(obj)/qconf-cfg && echo $$moc) $< -o $@
$(obj)/%.moc: $(src)/%.h $(obj)/qconf-cfg $(obj)/qconf-moc.cc: $(src)/qconf.h $(obj)/qconf-cfg FORCE
$(call cmd,moc) $(call if_changed,moc)
targets += qconf-moc.cc
# check if necessary packages are available, and configure build flags # check if necessary packages are available, and configure build flags
filechk_conf_cfg = $(CONFIG_SHELL) $< filechk_conf_cfg = $(CONFIG_SHELL) $<
@ -102,6 +113,8 @@ clean-files += *conf-cfg
# OpenWrt rules and final adjustments that need to be made after reading the # OpenWrt rules and final adjustments that need to be made after reading the
# full upstream Makefile # full upstream Makefile
clean-files += $(targets) $(hostprogs)
FORCE: FORCE:
ifdef BUILD_SHIPPED_FILES ifdef BUILD_SHIPPED_FILES
@ -117,24 +130,25 @@ clean-files += $(shipped-files)
flex -L -o$@ $< flex -L -o$@ $<
endif endif
$(foreach f, mconf.o $(lxdialog), \ $(foreach f,$(conf-objs) $(filter-out $(common-objs),$(mconf-objs) \
$(eval $f: CFLAGS+=$$(HOSTCFLAGS_$f))) $(qconf-objs) \
$(nconf-objs)), \
$(eval $(obj)/$f: CFLAGS+=$$(HOSTCFLAGS_$f)))
$(obj)/lexer.lex.o: CFLAGS += $(HOSTCFLAGS_lexer.lex.o) $(foreach f,$(qconf-cxxobjs), \
$(obj)/parser.tab.o: CFLAGS += $(HOSTCFLAGS_parser.tab.o) $(eval $(obj)/$f: CXXFLAGS+=$$(HOSTCXXFLAGS_$f)))
$(obj)/qconf.o: CXXFLAGS+=$(HOSTCXXFLAGS_qconf.o)
conf: $(conf-objs) $(obj)/conf: $(addprefix $(obj)/,$(conf-objs))
# The *conf-cfg file is used (then filtered out) as the first prerequisite to # The *conf-cfg file is used (then filtered out) as the first prerequisite to
# avoid sourcing it before the script is built, when trying to compute CFLAGS # avoid sourcing it before the script is built, when trying to compute CFLAGS
# for the actual first prerequisite. This avoids errors like: # for the actual first prerequisite. This avoids errors like:
# '/bin/sh: ./mconf-cfg: No such file or directory' # '/bin/sh: ./mconf-cfg: No such file or directory'
mconf: mconf-cfg $(mconf-objs) $(obj)/mconf: mconf-cfg $(addprefix $(obj)/,$(mconf-objs))
$(CC) -o $@ $(filter-out mconf-cfg,$^) $(HOSTLDLIBS_mconf) $(CC) -o $@ $(filter-out mconf-cfg,$^) $(HOSTLDLIBS_mconf)
nconf: nconf-cfg $(nconf-objs) $(obj)/nconf: nconf-cfg $(addprefix $(obj)/,$(nconf-objs))
$(CC) -o $@ $(filter-out nconf-cfg,$^) $(HOSTLDLIBS_nconf) $(CC) -o $@ $(filter-out nconf-cfg,$^) $(HOSTLDLIBS_nconf)
qconf: qconf-cfg $(qconf-cxxobjs) $(qconf-objs) $(obj)/qconf: qconf-cfg $(addprefix $(obj)/,$(qconf-cxxobjs) $(qconf-objs))
$(CXX) -o $@ $(filter-out qconf-cfg,$^) $(HOSTLDLIBS_qconf) $(CXX) -o $@ $(filter-out qconf-cfg,$^) $(HOSTLDLIBS_qconf)

View File

@ -1,7 +1,6 @@
These files were taken from the Linux Kernel Configuration System at commit These files were taken from the Linux 5.14 Kernel Configuration System and
089b7d890f972f6b649fedc9259f6b93a18fb970 (Feb 4, 2020) and modified for the modified for the OpenWrt Buildroot:
OpenWrt Buildroot: - Removed nconf, gconf, tests and kernel configuration targets.
- Removed gconf, tests and kernel configuration targets.
- Adjusted the Makefile to compile outside the kernel. - Adjusted the Makefile to compile outside the kernel.
- Always use default file when running make all{no,mod,yes}config. - Always use default file when running make all{no,mod,yes}config.
- Added a 'reset' command to reset config when the target changes. - Added a 'reset' command to reset config when the target changes.
@ -24,4 +23,4 @@ OpenWrt Buildroot:
BUILD_SHIPPED_FILES defined BUILD_SHIPPED_FILES defined
For a full list of changes, see the repository at: For a full list of changes, see the repository at:
https://github.com/cotequeiroz/linux/commits/openwrt/scripts/kconfig https://github.com/cotequeiroz/linux/commits/openwrt-5.14/scripts/kconfig

View File

@ -11,7 +11,6 @@
#include <time.h> #include <time.h>
#include <unistd.h> #include <unistd.h>
#include <getopt.h> #include <getopt.h>
#include <sys/stat.h>
#include <sys/time.h> #include <sys/time.h>
#include <errno.h> #include <errno.h>
@ -39,7 +38,7 @@ enum input_mode {
fatalrecursive, fatalrecursive,
}; };
static enum input_mode input_mode = oldaskconfig; static enum input_mode input_mode = oldaskconfig;
static int input_mode_opt;
static int indent = 1; static int indent = 1;
static int tty_stdio; static int tty_stdio;
static int sync_kconfig; static int sync_kconfig;
@ -84,10 +83,243 @@ static void xfgets(char *str, int size, FILE *in)
printf("%s", str); printf("%s", str);
} }
static void set_randconfig_seed(void)
{
unsigned int seed;
char *env;
bool seed_set = false;
env = getenv("KCONFIG_SEED");
if (env && *env) {
char *endp;
seed = strtol(env, &endp, 0);
if (*endp == '\0')
seed_set = true;
}
if (!seed_set) {
struct timeval now;
/*
* Use microseconds derived seed, compensate for systems where it may
* be zero.
*/
gettimeofday(&now, NULL);
seed = (now.tv_sec + 1) * (now.tv_usec + 1);
}
printf("KCONFIG_SEED=0x%X\n", seed);
srand(seed);
}
static bool randomize_choice_values(struct symbol *csym)
{
struct property *prop;
struct symbol *sym;
struct expr *e;
int cnt, def;
/*
* If choice is mod then we may have more items selected
* and if no then no-one.
* In both cases stop.
*/
if (csym->curr.tri != yes)
return false;
prop = sym_get_choice_prop(csym);
/* count entries in choice block */
cnt = 0;
expr_list_for_each_sym(prop->expr, e, sym)
cnt++;
/*
* find a random value and set it to yes,
* set the rest to no so we have only one set
*/
def = rand() % cnt;
cnt = 0;
expr_list_for_each_sym(prop->expr, e, sym) {
if (def == cnt++) {
sym->def[S_DEF_USER].tri = yes;
csym->def[S_DEF_USER].val = sym;
} else {
sym->def[S_DEF_USER].tri = no;
}
sym->flags |= SYMBOL_DEF_USER;
/* clear VALID to get value calculated */
sym->flags &= ~SYMBOL_VALID;
}
csym->flags |= SYMBOL_DEF_USER;
/* clear VALID to get value calculated */
csym->flags &= ~SYMBOL_VALID;
return true;
}
enum conf_def_mode {
def_default,
def_yes,
def_mod,
def_y2m,
def_m2y,
def_no,
def_random
};
static bool conf_set_all_new_symbols(enum conf_def_mode mode)
{
struct symbol *sym, *csym;
int i, cnt;
/*
* can't go as the default in switch-case below, otherwise gcc whines
* about -Wmaybe-uninitialized
*/
int pby = 50; /* probability of bool = y */
int pty = 33; /* probability of tristate = y */
int ptm = 33; /* probability of tristate = m */
bool has_changed = false;
if (mode == def_random) {
int n, p[3];
char *env = getenv("KCONFIG_PROBABILITY");
n = 0;
while (env && *env) {
char *endp;
int tmp = strtol(env, &endp, 10);
if (tmp >= 0 && tmp <= 100) {
p[n++] = tmp;
} else {
errno = ERANGE;
perror("KCONFIG_PROBABILITY");
exit(1);
}
env = (*endp == ':') ? endp + 1 : endp;
if (n >= 3)
break;
}
switch (n) {
case 1:
pby = p[0];
ptm = pby / 2;
pty = pby - ptm;
break;
case 2:
pty = p[0];
ptm = p[1];
pby = pty + ptm;
break;
case 3:
pby = p[0];
pty = p[1];
ptm = p[2];
break;
}
if (pty + ptm > 100) {
errno = ERANGE;
perror("KCONFIG_PROBABILITY");
exit(1);
}
}
sym_clear_all_valid();
for_all_symbols(i, sym) {
if (sym_has_value(sym) || sym->flags & SYMBOL_VALID)
continue;
switch (sym_get_type(sym)) {
case S_BOOLEAN:
case S_TRISTATE:
has_changed = true;
switch (mode) {
case def_yes:
sym->def[S_DEF_USER].tri = yes;
break;
case def_mod:
sym->def[S_DEF_USER].tri = mod;
break;
case def_no:
sym->def[S_DEF_USER].tri = no;
break;
case def_random:
sym->def[S_DEF_USER].tri = no;
cnt = rand() % 100;
if (sym->type == S_TRISTATE) {
if (cnt < pty)
sym->def[S_DEF_USER].tri = yes;
else if (cnt < pty + ptm)
sym->def[S_DEF_USER].tri = mod;
} else if (cnt < pby)
sym->def[S_DEF_USER].tri = yes;
break;
default:
continue;
}
if (!(sym_is_choice(sym) && mode == def_random))
sym->flags |= SYMBOL_DEF_USER;
break;
default:
break;
}
}
/*
* We have different type of choice blocks.
* If curr.tri equals to mod then we can select several
* choice symbols in one block.
* In this case we do nothing.
* If curr.tri equals yes then only one symbol can be
* selected in a choice block and we set it to yes,
* and the rest to no.
*/
if (mode != def_random) {
for_all_symbols(i, csym) {
if ((sym_is_choice(csym) && !sym_has_value(csym)) ||
sym_is_choice_value(csym))
csym->flags |= SYMBOL_NEED_SET_CHOICE_VALUES;
}
}
for_all_symbols(i, csym) {
if (sym_has_value(csym) || !sym_is_choice(csym))
continue;
sym_calc_value(csym);
if (mode == def_random)
has_changed |= randomize_choice_values(csym);
else {
set_all_choice_values(csym);
has_changed = true;
}
}
return has_changed;
}
static void conf_rewrite_mod_or_yes(enum conf_def_mode mode)
{
struct symbol *sym;
int i;
tristate old_val = (mode == def_y2m) ? yes : mod;
tristate new_val = (mode == def_y2m) ? mod : yes;
for_all_symbols(i, sym) {
if (sym_get_type(sym) == S_TRISTATE &&
sym->def[S_DEF_USER].tri == old_val)
sym->def[S_DEF_USER].tri = new_val;
}
sym_clear_all_valid();
}
static int conf_askvalue(struct symbol *sym, const char *def) static int conf_askvalue(struct symbol *sym, const char *def)
{ {
enum symbol_type type = sym_get_type(sym);
if (!sym_has_value(sym)) if (!sym_has_value(sym))
printf("(NEW) "); printf("(NEW) ");
@ -109,24 +341,12 @@ static int conf_askvalue(struct symbol *sym, const char *def)
return 0; return 0;
} }
/* fall through */ /* fall through */
case oldaskconfig: default:
fflush(stdout); fflush(stdout);
xfgets(line, sizeof(line), stdin); xfgets(line, sizeof(line), stdin);
return 1;
default:
break; break;
} }
switch (type) {
case S_INT:
case S_HEX:
case S_STRING:
printf("%s\n", def);
return 1;
default:
;
}
printf("%s", line);
return 1; return 1;
} }
@ -139,7 +359,7 @@ static int conf_string(struct menu *menu)
printf("%*s%s ", indent - 1, "", menu->prompt->text); printf("%*s%s ", indent - 1, "", menu->prompt->text);
printf("(%s) ", sym->name); printf("(%s) ", sym->name);
def = sym_get_string_value(sym); def = sym_get_string_value(sym);
if (sym_get_string_value(sym)) if (def)
printf("[%s] ", def); printf("[%s] ", def);
if (!conf_askvalue(sym, def)) if (!conf_askvalue(sym, def))
return 0; return 0;
@ -421,34 +641,37 @@ static void check_conf(struct menu *menu)
return; return;
sym = menu->sym; sym = menu->sym;
if (sym && !sym_has_value(sym)) { if (sym && !sym_has_value(sym) &&
if (sym_is_changeable(sym) || (sym_is_changeable(sym) ||
(sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) { (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes))) {
if (input_mode == listnewconfig) {
if (sym->name) {
const char *str;
if (sym->type == S_STRING) { switch (input_mode) {
str = sym_get_string_value(sym); case listnewconfig:
str = sym_escape_string_value(str); if (sym->name) {
printf("%s%s=%s\n", CONFIG_, sym->name, str); const char *str;
free((void *)str);
} else { if (sym->type == S_STRING) {
str = sym_get_string_value(sym); str = sym_get_string_value(sym);
printf("%s%s=%s\n", CONFIG_, sym->name, str); str = sym_escape_string_value(str);
} printf("%s%s=%s\n", CONFIG_, sym->name, str);
free((void *)str);
} else {
str = sym_get_string_value(sym);
printf("%s%s=%s\n", CONFIG_, sym->name, str);
} }
} else if (input_mode == helpnewconfig) {
printf("-----\n");
print_help(menu);
printf("-----\n");
} else {
if (!conf_cnt++)
printf("*\n* Restart config...\n*\n");
rootEntry = menu_get_parent_menu(menu);
conf(rootEntry);
} }
break;
case helpnewconfig:
printf("-----\n");
print_help(menu);
printf("-----\n");
break;
default:
if (!conf_cnt++)
printf("*\n* Restart config...\n*\n");
rootEntry = menu_get_parent_menu(menu);
conf(rootEntry);
break;
} }
} }
@ -456,31 +679,38 @@ static void check_conf(struct menu *menu)
check_conf(child); check_conf(child);
} }
static struct option long_opts[] = { static const struct option long_opts[] = {
{"oldaskconfig", no_argument, NULL, oldaskconfig}, {"help", no_argument, NULL, 'h'},
{"oldconfig", no_argument, NULL, oldconfig}, {"silent", no_argument, NULL, 's'},
{"syncconfig", no_argument, NULL, syncconfig}, {"oldaskconfig", no_argument, &input_mode_opt, oldaskconfig},
{"defconfig", required_argument, NULL, defconfig}, {"oldconfig", no_argument, &input_mode_opt, oldconfig},
{"savedefconfig", required_argument, NULL, savedefconfig}, {"syncconfig", no_argument, &input_mode_opt, syncconfig},
{"allnoconfig", no_argument, NULL, allnoconfig}, {"defconfig", required_argument, &input_mode_opt, defconfig},
{"allyesconfig", no_argument, NULL, allyesconfig}, {"savedefconfig", required_argument, &input_mode_opt, savedefconfig},
{"allmodconfig", no_argument, NULL, allmodconfig}, {"allnoconfig", no_argument, &input_mode_opt, allnoconfig},
{"alldefconfig", no_argument, NULL, alldefconfig}, {"allyesconfig", no_argument, &input_mode_opt, allyesconfig},
{"randconfig", no_argument, NULL, randconfig}, {"allmodconfig", no_argument, &input_mode_opt, allmodconfig},
{"listnewconfig", no_argument, NULL, listnewconfig}, {"alldefconfig", no_argument, &input_mode_opt, alldefconfig},
{"helpnewconfig", no_argument, NULL, helpnewconfig}, {"randconfig", no_argument, &input_mode_opt, randconfig},
{"olddefconfig", no_argument, NULL, olddefconfig}, {"listnewconfig", no_argument, &input_mode_opt, listnewconfig},
{"yes2modconfig", no_argument, NULL, yes2modconfig}, {"helpnewconfig", no_argument, &input_mode_opt, helpnewconfig},
{"mod2yesconfig", no_argument, NULL, mod2yesconfig}, {"olddefconfig", no_argument, &input_mode_opt, olddefconfig},
{"fatalrecursive", no_argument, NULL, fatalrecursive}, {"yes2modconfig", no_argument, &input_mode_opt, yes2modconfig},
{"mod2yesconfig", no_argument, &input_mode_opt, mod2yesconfig},
{"fatalrecursive",no_argument, NULL, fatalrecursive},
{NULL, 0, NULL, 0} {NULL, 0, NULL, 0}
}; };
static void conf_usage(const char *progname) static void conf_usage(const char *progname)
{ {
printf("Usage: %s [options] <kconfig-file>\n", progname);
printf("Usage: %s [-s] [--fatalrecursive] [option] <kconfig-file>\n", progname); printf("\n");
printf("[option] is _one_ of the following:\n"); printf("Generic options:\n");
printf(" -h, --help Print this message and exit.\n");
printf(" -s, --silent Do not print log.\n");
printf(" --fatalrecursive Treat recursive depenendencies as a fatal error\n");
printf("\n");
printf("Mode options:\n");
printf(" --listnewconfig List new options\n"); printf(" --listnewconfig List new options\n");
printf(" --helpnewconfig List new options and help text\n"); printf(" --helpnewconfig List new options and help text\n");
printf(" --oldaskconfig Start a new configuration using a line-oriented program\n"); printf(" --oldaskconfig Start a new configuration using a line-oriented program\n");
@ -497,6 +727,7 @@ static void conf_usage(const char *progname)
printf(" --randconfig New config with random answer to all options\n"); printf(" --randconfig New config with random answer to all options\n");
printf(" --yes2modconfig Change answers from yes to mod if possible\n"); printf(" --yes2modconfig Change answers from yes to mod if possible\n");
printf(" --mod2yesconfig Change answers from mod to yes if possible\n"); printf(" --mod2yesconfig Change answers from mod to yes if possible\n");
printf(" (If none of the above is given, --oldaskconfig is the default)\n");
} }
int main(int ac, char **av) int main(int ac, char **av)
@ -509,84 +740,56 @@ int main(int ac, char **av)
tty_stdio = isatty(0) && isatty(1); tty_stdio = isatty(0) && isatty(1);
while ((opt = getopt_long(ac, av, "r:w:s", long_opts, NULL)) != -1) { while ((opt = getopt_long(ac, av, "hr:sw:", long_opts, NULL)) != -1) {
if (opt == 's') {
conf_set_message_callback(NULL);
continue;
}
switch (opt) { switch (opt) {
case syncconfig: case 'h':
/* conf_usage(progname);
* syncconfig is invoked during the build stage. exit(1);
* Suppress distracting "configuration written to ..." break;
*/ case 's':
conf_set_message_callback(NULL); conf_set_message_callback(NULL);
sync_kconfig = 1;
break;
case defconfig:
case savedefconfig:
defconfig_file = optarg;
break;
case randconfig:
{
struct timeval now;
unsigned int seed;
char *seed_env;
/*
* Use microseconds derived seed,
* compensate for systems where it may be zero
*/
gettimeofday(&now, NULL);
seed = (unsigned int)((now.tv_sec + 1) * (now.tv_usec + 1));
seed_env = getenv("KCONFIG_SEED");
if( seed_env && *seed_env ) {
char *endp;
int tmp = (int)strtol(seed_env, &endp, 0);
if (*endp == '\0') {
seed = tmp;
}
}
fprintf( stderr, "KCONFIG_SEED=0x%X\n", seed );
srand(seed);
break;
}
case oldaskconfig:
case oldconfig:
case allnoconfig:
case allyesconfig:
case allmodconfig:
case alldefconfig:
case listnewconfig:
case helpnewconfig:
case olddefconfig:
case yes2modconfig:
case mod2yesconfig:
break; break;
case fatalrecursive: case fatalrecursive:
recursive_is_error = 1; recursive_is_error = 1;
continue; continue;
case 'r': case 'r':
input_file = optarg; input_file = optarg;
continue; break;
case 'w': case 'w':
output_file = optarg; output_file = optarg;
continue; break;
case '?': case 0:
conf_usage(progname); input_mode = input_mode_opt;
exit(1); switch (input_mode) {
case syncconfig:
/*
* syncconfig is invoked during the build stage.
* Suppress distracting
* "configuration written to ..."
*/
conf_set_message_callback(NULL);
sync_kconfig = 1;
break;
case defconfig:
case savedefconfig:
defconfig_file = optarg;
break;
case randconfig:
set_randconfig_seed();
break;
default:
break;
}
default:
break; break;
} }
input_mode = (enum input_mode)opt;
} }
if (ac == optind) { if (ac == optind) {
fprintf(stderr, "%s: Kconfig file missing\n", av[0]); fprintf(stderr, "%s: Kconfig file missing\n", av[0]);
conf_usage(progname); conf_usage(progname);
exit(1); exit(1);
} }
name = av[optind]; conf_parse(av[optind]);
conf_parse(name);
//zconfdump(stdout); //zconfdump(stdout);
switch (input_mode) { switch (input_mode) {

View File

@ -5,6 +5,7 @@
#include <sys/mman.h> #include <sys/mman.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/types.h>
#include <ctype.h> #include <ctype.h>
#include <errno.h> #include <errno.h>
#include <fcntl.h> #include <fcntl.h>
@ -32,7 +33,7 @@ static bool is_dir(const char *path)
struct stat st; struct stat st;
if (stat(path, &st)) if (stat(path, &st))
return 0; return false;
return S_ISDIR(st.st_mode); return S_ISDIR(st.st_mode);
} }
@ -129,19 +130,14 @@ static size_t depfile_prefix_len;
static int conf_touch_dep(const char *name) static int conf_touch_dep(const char *name)
{ {
int fd, ret; int fd, ret;
const char *s; char *d;
char *d, c;
/* check overflow: prefix + name + ".h" + '\0' must fit in buffer. */ /* check overflow: prefix + name + '\0' must fit in buffer. */
if (depfile_prefix_len + strlen(name) + 3 > sizeof(depfile_path)) if (depfile_prefix_len + strlen(name) + 1 > sizeof(depfile_path))
return -1; return -1;
d = depfile_path + depfile_prefix_len; d = depfile_path + depfile_prefix_len;
s = name; strcpy(d, name);
while ((c = *s++))
*d++ = (c == '_') ? '/' : tolower(c);
strcpy(d, ".h");
/* Assume directory path already exists. */ /* Assume directory path already exists. */
fd = open(depfile_path, O_WRONLY | O_CREAT | O_TRUNC, 0644); fd = open(depfile_path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
@ -384,28 +380,46 @@ int conf_read_simple(const char *name, int def)
if (name) { if (name) {
in = zconf_fopen(name); in = zconf_fopen(name);
} else { } else {
struct property *prop; char *env;
name = conf_get_configname(); name = conf_get_configname();
in = zconf_fopen(name); in = zconf_fopen(name);
if (in) if (in)
goto load; goto load;
sym_add_change_count(1); conf_set_changed(true);
if (!sym_defconfig_list)
env = getenv("KCONFIG_DEFCONFIG_LIST");
if (!env)
return 1; return 1;
for_all_defaults(sym_defconfig_list, prop) { while (1) {
if (expr_calc_value(prop->visible.expr) == no || bool is_last;
prop->expr->type != E_SYMBOL)
continue; while (isspace(*env))
sym_calc_value(prop->expr->left.sym); env++;
name = sym_get_string_value(prop->expr->left.sym);
in = zconf_fopen(name); if (!*env)
break;
p = env;
while (*p && !isspace(*p))
p++;
is_last = (*p == '\0');
*p = '\0';
in = zconf_fopen(env);
if (in) { if (in) {
conf_message("using defaults found in %s", conf_message("using defaults found in %s",
name); env);
goto load; goto load;
} }
if (is_last)
break;
env = p + 1;
} }
} }
if (!in) if (!in)
@ -434,7 +448,7 @@ load:
if (def == S_DEF_USER) { if (def == S_DEF_USER) {
sym = sym_find(line + 2 + strlen(CONFIG_)); sym = sym_find(line + 2 + strlen(CONFIG_));
if (!sym) { if (!sym) {
sym_add_change_count(1); conf_set_changed(true);
continue; continue;
} }
} else { } else {
@ -470,11 +484,11 @@ load:
* Reading from include/config/auto.conf * Reading from include/config/auto.conf
* If CONFIG_FOO previously existed in * If CONFIG_FOO previously existed in
* auto.conf but it is missing now, * auto.conf but it is missing now,
* include/config/foo.h must be touched. * include/config/FOO must be touched.
*/ */
conf_touch_dep(line + strlen(CONFIG_)); conf_touch_dep(line + strlen(CONFIG_));
else else
sym_add_change_count(1); conf_set_changed(true);
continue; continue;
} }
@ -519,7 +533,7 @@ int conf_read(const char *name)
int conf_unsaved = 0; int conf_unsaved = 0;
int i; int i;
sym_set_change_count(0); conf_set_changed(false);
if (conf_read_simple(name, S_DEF_USER)) { if (conf_read_simple(name, S_DEF_USER)) {
sym_calc_value(modules_sym); sym_calc_value(modules_sym);
@ -577,7 +591,8 @@ int conf_read(const char *name)
} }
} }
sym_add_change_count(conf_warnings || conf_unsaved); if (conf_warnings || conf_unsaved)
conf_set_changed(true);
return 0; return 0;
} }
@ -922,7 +937,7 @@ next:
if (is_same(name, tmpname)) { if (is_same(name, tmpname)) {
conf_message("No change to %s", name); conf_message("No change to %s", name);
unlink(tmpname); unlink(tmpname);
sym_set_change_count(0); conf_set_changed(false);
return 0; return 0;
} }
@ -934,7 +949,7 @@ next:
conf_message("configuration written to %s", name); conf_message("configuration written to %s", name);
sym_set_change_count(0); conf_set_changed(false);
return 0; return 0;
} }
@ -1105,26 +1120,20 @@ int conf_write_autoconf(int overwrite)
return 0; return 0;
} }
static int sym_change_count; static bool conf_changed;
static void (*conf_changed_callback)(void); static void (*conf_changed_callback)(void);
void sym_set_change_count(int count) void conf_set_changed(bool val)
{ {
int _sym_change_count = sym_change_count; if (conf_changed_callback && conf_changed != val)
sym_change_count = count;
if (conf_changed_callback &&
(bool)_sym_change_count != (bool)count)
conf_changed_callback(); conf_changed_callback();
}
void sym_add_change_count(int count) conf_changed = val;
{
sym_set_change_count(count + sym_change_count);
} }
bool conf_get_changed(void) bool conf_get_changed(void)
{ {
return sym_change_count; return conf_changed;
} }
void conf_set_changed_callback(void (*fn)(void)) void conf_set_changed_callback(void (*fn)(void))
@ -1132,54 +1141,6 @@ void conf_set_changed_callback(void (*fn)(void))
conf_changed_callback = fn; conf_changed_callback = fn;
} }
static bool randomize_choice_values(struct symbol *csym)
{
struct property *prop;
struct symbol *sym;
struct expr *e;
int cnt, def;
/*
* If choice is mod then we may have more items selected
* and if no then no-one.
* In both cases stop.
*/
if (csym->curr.tri != yes)
return false;
prop = sym_get_choice_prop(csym);
/* count entries in choice block */
cnt = 0;
expr_list_for_each_sym(prop->expr, e, sym)
cnt++;
/*
* find a random value and set it to yes,
* set the rest to no so we have only one set
*/
def = (rand() % cnt);
cnt = 0;
expr_list_for_each_sym(prop->expr, e, sym) {
if (def == cnt++) {
sym->def[S_DEF_USER].tri = yes;
csym->def[S_DEF_USER].val = sym;
}
else {
sym->def[S_DEF_USER].tri = no;
}
sym->flags |= SYMBOL_DEF_USER;
/* clear VALID to get value calculated */
sym->flags &= ~SYMBOL_VALID;
}
csym->flags |= SYMBOL_DEF_USER;
/* clear VALID to get value calculated */
csym->flags &= ~(SYMBOL_VALID);
return true;
}
void set_all_choice_values(struct symbol *csym) void set_all_choice_values(struct symbol *csym)
{ {
struct property *prop; struct property *prop;
@ -1199,147 +1160,3 @@ void set_all_choice_values(struct symbol *csym)
/* clear VALID to get value calculated */ /* clear VALID to get value calculated */
csym->flags &= ~(SYMBOL_VALID | SYMBOL_NEED_SET_CHOICE_VALUES); csym->flags &= ~(SYMBOL_VALID | SYMBOL_NEED_SET_CHOICE_VALUES);
} }
bool conf_set_all_new_symbols(enum conf_def_mode mode)
{
struct symbol *sym, *csym;
int i, cnt, pby, pty, ptm; /* pby: probability of bool = y
* pty: probability of tristate = y
* ptm: probability of tristate = m
*/
pby = 50; pty = ptm = 33; /* can't go as the default in switch-case
* below, otherwise gcc whines about
* -Wmaybe-uninitialized */
if (mode == def_random) {
int n, p[3];
char *env = getenv("KCONFIG_PROBABILITY");
n = 0;
while( env && *env ) {
char *endp;
int tmp = strtol( env, &endp, 10 );
if( tmp >= 0 && tmp <= 100 ) {
p[n++] = tmp;
} else {
errno = ERANGE;
perror( "KCONFIG_PROBABILITY" );
exit( 1 );
}
env = (*endp == ':') ? endp+1 : endp;
if( n >=3 ) {
break;
}
}
switch( n ) {
case 1:
pby = p[0]; ptm = pby/2; pty = pby-ptm;
break;
case 2:
pty = p[0]; ptm = p[1]; pby = pty + ptm;
break;
case 3:
pby = p[0]; pty = p[1]; ptm = p[2];
break;
}
if( pty+ptm > 100 ) {
errno = ERANGE;
perror( "KCONFIG_PROBABILITY" );
exit( 1 );
}
}
bool has_changed = false;
sym_clear_all_valid();
for_all_symbols(i, sym) {
if (sym_has_value(sym) || (sym->flags & SYMBOL_VALID))
continue;
switch (sym_get_type(sym)) {
case S_BOOLEAN:
case S_TRISTATE:
has_changed = true;
switch (mode) {
case def_yes:
sym->def[S_DEF_USER].tri = yes;
break;
case def_mod:
sym->def[S_DEF_USER].tri = mod;
break;
case def_no:
if (sym->flags & SYMBOL_ALLNOCONFIG_Y)
sym->def[S_DEF_USER].tri = yes;
else
sym->def[S_DEF_USER].tri = no;
break;
case def_random:
sym->def[S_DEF_USER].tri = no;
cnt = rand() % 100;
if (sym->type == S_TRISTATE) {
if (cnt < pty)
sym->def[S_DEF_USER].tri = yes;
else if (cnt < (pty+ptm))
sym->def[S_DEF_USER].tri = mod;
} else if (cnt < pby)
sym->def[S_DEF_USER].tri = yes;
break;
default:
continue;
}
if (!(sym_is_choice(sym) && mode == def_random))
sym->flags |= SYMBOL_DEF_USER;
break;
default:
break;
}
}
/*
* We have different type of choice blocks.
* If curr.tri equals to mod then we can select several
* choice symbols in one block.
* In this case we do nothing.
* If curr.tri equals yes then only one symbol can be
* selected in a choice block and we set it to yes,
* and the rest to no.
*/
if (mode != def_random) {
for_all_symbols(i, csym) {
if ((sym_is_choice(csym) && !sym_has_value(csym)) ||
sym_is_choice_value(csym))
csym->flags |= SYMBOL_NEED_SET_CHOICE_VALUES;
}
}
for_all_symbols(i, csym) {
if (sym_has_value(csym) || !sym_is_choice(csym))
continue;
sym_calc_value(csym);
if (mode == def_random)
has_changed = randomize_choice_values(csym);
else {
set_all_choice_values(csym);
has_changed = true;
}
}
return has_changed;
}
void conf_rewrite_mod_or_yes(enum conf_def_mode mode)
{
struct symbol *sym;
int i;
tristate old_val = (mode == def_y2m) ? yes : mod;
tristate new_val = (mode == def_y2m) ? mod : yes;
for_all_symbols(i, sym) {
if (sym_get_type(sym) == S_TRISTATE &&
sym->def[S_DEF_USER].tri == old_val) {
sym->def[S_DEF_USER].tri = new_val;
sym_add_change_count(1);
}
}
}

View File

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

View File

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

View File

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

View File

@ -0,0 +1,9 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef INTERNAL_H
#define INTERNAL_H
struct menu;
extern struct menu *current_menu, *current_entry;
#endif /* INTERNAL_H */

View File

@ -12,7 +12,6 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <unistd.h>
#include <glob.h> #include <glob.h>
#include <libgen.h> #include <libgen.h>
@ -38,7 +37,7 @@ struct buffer {
YY_BUFFER_STATE state; YY_BUFFER_STATE state;
}; };
struct buffer *current_buf; static struct buffer *current_buf;
static int last_ts, first_ts; static int last_ts, first_ts;
@ -94,7 +93,6 @@ n [A-Za-z0-9_-]
[ \t]* /* whitespaces */ [ \t]* /* whitespaces */
\\\n /* escaped new line */ \\\n /* escaped new line */
\n return T_EOL; \n return T_EOL;
"allnoconfig_y" return T_ALLNOCONFIG_Y;
"bool" return T_BOOL; "bool" return T_BOOL;
"choice" return T_CHOICE; "choice" return T_CHOICE;
"comment" return T_COMMENT; "comment" return T_COMMENT;
@ -102,12 +100,11 @@ n [A-Za-z0-9_-]
"def_bool" return T_DEF_BOOL; "def_bool" return T_DEF_BOOL;
"def_tristate" return T_DEF_TRISTATE; "def_tristate" return T_DEF_TRISTATE;
"default" return T_DEFAULT; "default" return T_DEFAULT;
"defconfig_list" return T_DEFCONFIG_LIST;
"depends" return T_DEPENDS; "depends" return T_DEPENDS;
"endchoice" return T_ENDCHOICE; "endchoice" return T_ENDCHOICE;
"endif" return T_ENDIF; "endif" return T_ENDIF;
"endmenu" return T_ENDMENU; "endmenu" return T_ENDMENU;
"help"|"---help---" return T_HELP; "help" return T_HELP;
"hex" return T_HEX; "hex" return T_HEX;
"if" return T_IF; "if" return T_IF;
"imply" return T_IMPLY; "imply" return T_IMPLY;
@ -117,7 +114,6 @@ n [A-Za-z0-9_-]
"menuconfig" return T_MENUCONFIG; "menuconfig" return T_MENUCONFIG;
"modules" return T_MODULES; "modules" return T_MODULES;
"on" return T_ON; "on" return T_ON;
"option" return T_OPTION;
"optional" return T_OPTIONAL; "optional" return T_OPTIONAL;
"prompt" return T_PROMPT; "prompt" return T_PROMPT;
"range" return T_RANGE; "range" return T_RANGE;

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

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

View File

@ -22,6 +22,8 @@
#include "lkc.h" #include "lkc.h"
#include "lxdialog/dialog.h" #include "lxdialog/dialog.h"
#define JUMP_NB 9
static const char mconf_readme[] = static const char mconf_readme[] =
"OpenWrt config is based on Kernel kconfig\n" "OpenWrt config is based on Kernel kconfig\n"
"so ipkg packages are referred here as modules.\n" "so ipkg packages are referred here as modules.\n"
@ -300,17 +302,12 @@ static char filename[PATH_MAX+1];
static void set_config_filename(const char *config_filename) static void set_config_filename(const char *config_filename)
{ {
static char menu_backtitle[PATH_MAX+128]; static char menu_backtitle[PATH_MAX+128];
int size;
size = snprintf(menu_backtitle, sizeof(menu_backtitle), snprintf(menu_backtitle, sizeof(menu_backtitle), "%s - %s",
"%s - %s", config_filename, rootmenu.prompt->text); config_filename, rootmenu.prompt->text);
if (size >= sizeof(menu_backtitle))
menu_backtitle[sizeof(menu_backtitle)-1] = '\0';
set_dialog_backtitle(menu_backtitle); set_dialog_backtitle(menu_backtitle);
size = snprintf(filename, sizeof(filename), "%s", config_filename); snprintf(filename, sizeof(filename), "%s", config_filename);
if (size >= sizeof(filename))
filename[sizeof(filename)-1] = '\0';
} }
struct subtitle_part { struct subtitle_part {
@ -921,7 +918,7 @@ static void conf_load(void)
return; return;
if (!conf_read(dialog_input_result)) { if (!conf_read(dialog_input_result)) {
set_config_filename(dialog_input_result); set_config_filename(dialog_input_result);
sym_set_change_count(1); conf_set_changed(true);
return; return;
} }
show_textbox(NULL, "File does not exist!", 5, 38); show_textbox(NULL, "File does not exist!", 5, 38);

View File

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

View File

@ -271,7 +271,7 @@ static int mwin_max_cols;
static MENU *curses_menu; static MENU *curses_menu;
static ITEM *curses_menu_items[MAX_MENU_ITEMS]; static ITEM *curses_menu_items[MAX_MENU_ITEMS];
static struct mitem k_menu_items[MAX_MENU_ITEMS]; static struct mitem k_menu_items[MAX_MENU_ITEMS];
static int items_num; static unsigned int items_num;
static int global_exit; static int global_exit;
/* the currently selected button */ /* the currently selected button */
static const char *current_instructions = menu_instructions; static const char *current_instructions = menu_instructions;
@ -373,18 +373,18 @@ static void print_function_line(void)
int lines = getmaxy(stdscr); int lines = getmaxy(stdscr);
for (i = 0; i < function_keys_num; i++) { for (i = 0; i < function_keys_num; i++) {
(void) wattrset(main_window, attributes[FUNCTION_HIGHLIGHT]); wattrset(main_window, attr_function_highlight);
mvwprintw(main_window, lines-3, offset, mvwprintw(main_window, lines-3, offset,
"%s", "%s",
function_keys[i].key_str); function_keys[i].key_str);
(void) wattrset(main_window, attributes[FUNCTION_TEXT]); wattrset(main_window, attr_function_text);
offset += strlen(function_keys[i].key_str); offset += strlen(function_keys[i].key_str);
mvwprintw(main_window, lines-3, mvwprintw(main_window, lines-3,
offset, "%s", offset, "%s",
function_keys[i].func); function_keys[i].func);
offset += strlen(function_keys[i].func) + skip; offset += strlen(function_keys[i].func) + skip;
} }
(void) wattrset(main_window, attributes[NORMAL]); wattrset(main_window, attr_normal);
} }
/* help */ /* help */
@ -499,16 +499,20 @@ typedef enum {MATCH_TINKER_PATTERN_UP, MATCH_TINKER_PATTERN_DOWN,
/* return the index of the matched item, or -1 if no such item exists */ /* return the index of the matched item, or -1 if no such item exists */
static int get_mext_match(const char *match_str, match_f flag) static int get_mext_match(const char *match_str, match_f flag)
{ {
int match_start = item_index(current_item(curses_menu)); int match_start, index;
int index;
/* Do not search if the menu is empty (i.e. items_num == 0) */
match_start = item_index(current_item(curses_menu));
if (match_start == ERR)
return -1;
if (flag == FIND_NEXT_MATCH_DOWN) if (flag == FIND_NEXT_MATCH_DOWN)
++match_start; ++match_start;
else if (flag == FIND_NEXT_MATCH_UP) else if (flag == FIND_NEXT_MATCH_UP)
--match_start; --match_start;
match_start = (match_start + items_num) % items_num;
index = match_start; index = match_start;
index = (index + items_num) % items_num;
while (true) { while (true) {
char *str = k_menu_items[index].str; char *str = k_menu_items[index].str;
if (strcasestr(str, match_str) != NULL) if (strcasestr(str, match_str) != NULL)
@ -630,19 +634,12 @@ static int item_is_tag(char tag)
static char filename[PATH_MAX+1]; static char filename[PATH_MAX+1];
static char menu_backtitle[PATH_MAX+128]; static char menu_backtitle[PATH_MAX+128];
static const char *set_config_filename(const char *config_filename) static void set_config_filename(const char *config_filename)
{ {
int size; snprintf(menu_backtitle, sizeof(menu_backtitle), "%s - %s",
config_filename, rootmenu.prompt->text);
size = snprintf(menu_backtitle, sizeof(menu_backtitle), snprintf(filename, sizeof(filename), "%s", config_filename);
"%s - %s", config_filename, rootmenu.prompt->text);
if (size >= sizeof(menu_backtitle))
menu_backtitle[sizeof(menu_backtitle)-1] = '\0';
size = snprintf(filename, sizeof(filename), "%s", config_filename);
if (size >= sizeof(filename))
filename[sizeof(filename)-1] = '\0';
return menu_backtitle;
} }
/* return = 0 means we are successful. /* return = 0 means we are successful.
@ -758,7 +755,6 @@ static void build_conf(struct menu *menu)
switch (ptype) { switch (ptype) {
case P_MENU: case P_MENU:
child_count++; child_count++;
prompt = prompt;
if (single_menu_mode) { if (single_menu_mode) {
item_make(menu, 'm', item_make(menu, 'm',
"%s%*c%s", "%s%*c%s",
@ -960,16 +956,15 @@ static void show_menu(const char *prompt, const char *instructions,
current_instructions = instructions; current_instructions = instructions;
clear(); clear();
(void) wattrset(main_window, attributes[NORMAL]); print_in_middle(stdscr, 1, getmaxx(stdscr),
print_in_middle(stdscr, 1, 0, getmaxx(stdscr),
menu_backtitle, menu_backtitle,
attributes[MAIN_HEADING]); attr_main_heading);
(void) wattrset(main_window, attributes[MAIN_MENU_BOX]); wattrset(main_window, attr_main_menu_box);
box(main_window, 0, 0); box(main_window, 0, 0);
(void) wattrset(main_window, attributes[MAIN_MENU_HEADING]); wattrset(main_window, attr_main_menu_heading);
mvwprintw(main_window, 0, 3, " %s ", prompt); mvwprintw(main_window, 0, 3, " %s ", prompt);
(void) wattrset(main_window, attributes[NORMAL]); wattrset(main_window, attr_normal);
set_menu_items(curses_menu, curses_menu_items); set_menu_items(curses_menu, curses_menu_items);
@ -1072,7 +1067,6 @@ static int do_match(int key, struct match_state *state, int *ans)
static void conf(struct menu *menu) static void conf(struct menu *menu)
{ {
struct menu *submenu = NULL; struct menu *submenu = NULL;
const char *prompt = menu_get_prompt(menu);
struct symbol *sym; struct symbol *sym;
int res; int res;
int current_index = 0; int current_index = 0;
@ -1090,9 +1084,8 @@ static void conf(struct menu *menu)
if (!child_count) if (!child_count)
break; break;
show_menu(prompt ? prompt : "Main Menu", show_menu(menu_get_prompt(menu), menu_instructions,
menu_instructions, current_index, &last_top_row);
current_index, &last_top_row);
keypad((menu_win(curses_menu)), TRUE); keypad((menu_win(curses_menu)), TRUE);
while (!global_exit) { while (!global_exit) {
if (match_state.in_search) { if (match_state.in_search) {
@ -1418,7 +1411,7 @@ static void conf_load(void)
return; return;
if (!conf_read(dialog_input_result)) { if (!conf_read(dialog_input_result)) {
set_config_filename(dialog_input_result); set_config_filename(dialog_input_result);
sym_set_change_count(1); conf_set_changed(true);
return; return;
} }
btn_dialog(main_window, "File does not exist!", 0); btn_dialog(main_window, "File does not exist!", 0);
@ -1537,9 +1530,9 @@ int main(int ac, char **av)
menu_opts_on(curses_menu, O_NONCYCLIC); menu_opts_on(curses_menu, O_NONCYCLIC);
menu_opts_on(curses_menu, O_IGNORECASE); menu_opts_on(curses_menu, O_IGNORECASE);
set_menu_mark(curses_menu, " "); set_menu_mark(curses_menu, " ");
set_menu_fore(curses_menu, attributes[MAIN_MENU_FORE]); set_menu_fore(curses_menu, attr_main_menu_fore);
set_menu_back(curses_menu, attributes[MAIN_MENU_BACK]); set_menu_back(curses_menu, attr_main_menu_back);
set_menu_grey(curses_menu, attributes[MAIN_MENU_GREY]); set_menu_grey(curses_menu, attr_main_menu_grey);
set_config_filename(conf_get_configname()); set_config_filename(conf_get_configname());
setup_windows(); setup_windows();

View File

@ -7,169 +7,120 @@
#include "nconf.h" #include "nconf.h"
#include "lkc.h" #include "lkc.h"
/* a list of all the different widgets we use */ int attr_normal;
attributes_t attributes[ATTR_MAX+1] = {0}; int attr_main_heading;
int attr_main_menu_box;
int attr_main_menu_fore;
int attr_main_menu_back;
int attr_main_menu_grey;
int attr_main_menu_heading;
int attr_scrollwin_text;
int attr_scrollwin_heading;
int attr_scrollwin_box;
int attr_dialog_text;
int attr_dialog_menu_fore;
int attr_dialog_menu_back;
int attr_dialog_box;
int attr_input_box;
int attr_input_heading;
int attr_input_text;
int attr_input_field;
int attr_function_text;
int attr_function_highlight;
/* available colors: #define COLOR_ATTR(_at, _fg, _bg, _hl) \
COLOR_BLACK 0 { .attr = &(_at), .has_color = true, .color_fg = _fg, .color_bg = _bg, .highlight = _hl }
COLOR_RED 1 #define NO_COLOR_ATTR(_at, _hl) \
COLOR_GREEN 2 { .attr = &(_at), .has_color = false, .highlight = _hl }
COLOR_YELLOW 3 #define COLOR_DEFAULT -1
COLOR_BLUE 4
COLOR_MAGENTA 5
COLOR_CYAN 6
COLOR_WHITE 7
*/
static void set_normal_colors(void)
{
init_pair(NORMAL, -1, -1);
init_pair(MAIN_HEADING, COLOR_MAGENTA, -1);
/* FORE is for the selected item */ struct nconf_attr_param {
init_pair(MAIN_MENU_FORE, -1, -1); int *attr;
/* BACK for all the rest */ bool has_color;
init_pair(MAIN_MENU_BACK, -1, -1); int color_fg;
init_pair(MAIN_MENU_GREY, -1, -1); int color_bg;
init_pair(MAIN_MENU_HEADING, COLOR_GREEN, -1); int highlight;
init_pair(MAIN_MENU_BOX, COLOR_YELLOW, -1); };
init_pair(SCROLLWIN_TEXT, -1, -1); static const struct nconf_attr_param color_theme_params[] = {
init_pair(SCROLLWIN_HEADING, COLOR_GREEN, -1); COLOR_ATTR(attr_normal, COLOR_DEFAULT, COLOR_DEFAULT, A_NORMAL),
init_pair(SCROLLWIN_BOX, COLOR_YELLOW, -1); COLOR_ATTR(attr_main_heading, COLOR_MAGENTA, COLOR_DEFAULT, A_BOLD | A_UNDERLINE),
COLOR_ATTR(attr_main_menu_box, COLOR_YELLOW, COLOR_DEFAULT, A_NORMAL),
COLOR_ATTR(attr_main_menu_fore, COLOR_DEFAULT, COLOR_DEFAULT, A_REVERSE),
COLOR_ATTR(attr_main_menu_back, COLOR_DEFAULT, COLOR_DEFAULT, A_NORMAL),
COLOR_ATTR(attr_main_menu_grey, COLOR_DEFAULT, COLOR_DEFAULT, A_NORMAL),
COLOR_ATTR(attr_main_menu_heading, COLOR_GREEN, COLOR_DEFAULT, A_BOLD),
COLOR_ATTR(attr_scrollwin_text, COLOR_DEFAULT, COLOR_DEFAULT, A_NORMAL),
COLOR_ATTR(attr_scrollwin_heading, COLOR_GREEN, COLOR_DEFAULT, A_BOLD),
COLOR_ATTR(attr_scrollwin_box, COLOR_YELLOW, COLOR_DEFAULT, A_BOLD),
COLOR_ATTR(attr_dialog_text, COLOR_DEFAULT, COLOR_DEFAULT, A_BOLD),
COLOR_ATTR(attr_dialog_menu_fore, COLOR_RED, COLOR_DEFAULT, A_STANDOUT),
COLOR_ATTR(attr_dialog_menu_back, COLOR_YELLOW, COLOR_DEFAULT, A_NORMAL),
COLOR_ATTR(attr_dialog_box, COLOR_YELLOW, COLOR_DEFAULT, A_BOLD),
COLOR_ATTR(attr_input_box, COLOR_YELLOW, COLOR_DEFAULT, A_NORMAL),
COLOR_ATTR(attr_input_heading, COLOR_GREEN, COLOR_DEFAULT, A_BOLD),
COLOR_ATTR(attr_input_text, COLOR_DEFAULT, COLOR_DEFAULT, A_NORMAL),
COLOR_ATTR(attr_input_field, COLOR_DEFAULT, COLOR_DEFAULT, A_UNDERLINE),
COLOR_ATTR(attr_function_text, COLOR_YELLOW, COLOR_DEFAULT, A_REVERSE),
COLOR_ATTR(attr_function_highlight, COLOR_DEFAULT, COLOR_DEFAULT, A_BOLD),
{ /* sentinel */ }
};
init_pair(DIALOG_TEXT, -1, -1); static const struct nconf_attr_param no_color_theme_params[] = {
init_pair(DIALOG_BOX, COLOR_YELLOW, -1); NO_COLOR_ATTR(attr_normal, A_NORMAL),
init_pair(DIALOG_MENU_BACK, COLOR_YELLOW, -1); NO_COLOR_ATTR(attr_main_heading, A_BOLD | A_UNDERLINE),
init_pair(DIALOG_MENU_FORE, COLOR_RED, -1); NO_COLOR_ATTR(attr_main_menu_box, A_NORMAL),
NO_COLOR_ATTR(attr_main_menu_fore, A_STANDOUT),
init_pair(INPUT_BOX, COLOR_YELLOW, -1); NO_COLOR_ATTR(attr_main_menu_back, A_NORMAL),
init_pair(INPUT_HEADING, COLOR_GREEN, -1); NO_COLOR_ATTR(attr_main_menu_grey, A_NORMAL),
init_pair(INPUT_TEXT, -1, -1); NO_COLOR_ATTR(attr_main_menu_heading, A_BOLD),
init_pair(INPUT_FIELD, -1, -1); NO_COLOR_ATTR(attr_scrollwin_text, A_NORMAL),
NO_COLOR_ATTR(attr_scrollwin_heading, A_BOLD),
init_pair(FUNCTION_HIGHLIGHT, -1, -1); NO_COLOR_ATTR(attr_scrollwin_box, A_BOLD),
init_pair(FUNCTION_TEXT, COLOR_YELLOW, -1); NO_COLOR_ATTR(attr_dialog_text, A_NORMAL),
} NO_COLOR_ATTR(attr_dialog_menu_fore, A_STANDOUT),
NO_COLOR_ATTR(attr_dialog_menu_back, A_NORMAL),
/* available attributes: NO_COLOR_ATTR(attr_dialog_box, A_BOLD),
A_NORMAL Normal display (no highlight) NO_COLOR_ATTR(attr_input_box, A_BOLD),
A_STANDOUT Best highlighting mode of the terminal. NO_COLOR_ATTR(attr_input_heading, A_BOLD),
A_UNDERLINE Underlining NO_COLOR_ATTR(attr_input_text, A_NORMAL),
A_REVERSE Reverse video NO_COLOR_ATTR(attr_input_field, A_UNDERLINE),
A_BLINK Blinking NO_COLOR_ATTR(attr_function_text, A_REVERSE),
A_DIM Half bright NO_COLOR_ATTR(attr_function_highlight, A_BOLD),
A_BOLD Extra bright or bold { /* sentinel */ }
A_PROTECT Protected mode };
A_INVIS Invisible or blank mode
A_ALTCHARSET Alternate character set
A_CHARTEXT Bit-mask to extract a character
COLOR_PAIR(n) Color-pair number n
*/
static void normal_color_theme(void)
{
/* automatically add color... */
#define mkattr(name, attr) do { \
attributes[name] = attr | COLOR_PAIR(name); } while (0)
mkattr(NORMAL, NORMAL);
mkattr(MAIN_HEADING, A_BOLD | A_UNDERLINE);
mkattr(MAIN_MENU_FORE, A_REVERSE);
mkattr(MAIN_MENU_BACK, A_NORMAL);
mkattr(MAIN_MENU_GREY, A_NORMAL);
mkattr(MAIN_MENU_HEADING, A_BOLD);
mkattr(MAIN_MENU_BOX, A_NORMAL);
mkattr(SCROLLWIN_TEXT, A_NORMAL);
mkattr(SCROLLWIN_HEADING, A_BOLD);
mkattr(SCROLLWIN_BOX, A_BOLD);
mkattr(DIALOG_TEXT, A_BOLD);
mkattr(DIALOG_BOX, A_BOLD);
mkattr(DIALOG_MENU_FORE, A_STANDOUT);
mkattr(DIALOG_MENU_BACK, A_NORMAL);
mkattr(INPUT_BOX, A_NORMAL);
mkattr(INPUT_HEADING, A_BOLD);
mkattr(INPUT_TEXT, A_NORMAL);
mkattr(INPUT_FIELD, A_UNDERLINE);
mkattr(FUNCTION_HIGHLIGHT, A_BOLD);
mkattr(FUNCTION_TEXT, A_REVERSE);
}
static void no_colors_theme(void)
{
/* automatically add highlight, no color */
#define mkattrn(name, attr) { attributes[name] = attr; }
mkattrn(NORMAL, NORMAL);
mkattrn(MAIN_HEADING, A_BOLD | A_UNDERLINE);
mkattrn(MAIN_MENU_FORE, A_STANDOUT);
mkattrn(MAIN_MENU_BACK, A_NORMAL);
mkattrn(MAIN_MENU_GREY, A_NORMAL);
mkattrn(MAIN_MENU_HEADING, A_BOLD);
mkattrn(MAIN_MENU_BOX, A_NORMAL);
mkattrn(SCROLLWIN_TEXT, A_NORMAL);
mkattrn(SCROLLWIN_HEADING, A_BOLD);
mkattrn(SCROLLWIN_BOX, A_BOLD);
mkattrn(DIALOG_TEXT, A_NORMAL);
mkattrn(DIALOG_BOX, A_BOLD);
mkattrn(DIALOG_MENU_FORE, A_STANDOUT);
mkattrn(DIALOG_MENU_BACK, A_NORMAL);
mkattrn(INPUT_BOX, A_BOLD);
mkattrn(INPUT_HEADING, A_BOLD);
mkattrn(INPUT_TEXT, A_NORMAL);
mkattrn(INPUT_FIELD, A_UNDERLINE);
mkattrn(FUNCTION_HIGHLIGHT, A_BOLD);
mkattrn(FUNCTION_TEXT, A_REVERSE);
}
void set_colors(void) void set_colors(void)
{ {
start_color(); const struct nconf_attr_param *p;
use_default_colors(); int pair = 0;
set_normal_colors();
if (has_colors()) { if (has_colors()) {
normal_color_theme(); start_color();
use_default_colors();
p = color_theme_params;
} else { } else {
/* give defaults */ p = no_color_theme_params;
no_colors_theme(); }
for (; p->attr; p++) {
int attr = p->highlight;
if (p->has_color) {
pair++;
init_pair(pair, p->color_fg, p->color_bg);
attr |= COLOR_PAIR(pair);
}
*p->attr = attr;
} }
} }
/* this changes the windows attributes !!! */ /* this changes the windows attributes !!! */
void print_in_middle(WINDOW *win, void print_in_middle(WINDOW *win, int y, int width, const char *str, int attrs)
int starty, {
int startx, wattrset(win, attrs);
int width, mvwprintw(win, y, (width - strlen(str)) / 2, "%s", str);
const char *string,
chtype color)
{ int length, x, y;
float temp;
if (win == NULL)
win = stdscr;
getyx(win, y, x);
if (startx != 0)
x = startx;
if (starty != 0)
y = starty;
if (width == 0)
width = 80;
length = strlen(string);
temp = (width - length) / 2;
x = startx + (int)temp;
(void) wattrset(win, color);
mvwprintw(win, y, x, "%s", string);
refresh();
} }
int get_line_no(const char *text) int get_line_no(const char *text)
@ -294,14 +245,14 @@ int btn_dialog(WINDOW *main_window, const char *msg, int btn_num, ...)
msg_win = derwin(win, win_rows-2, msg_width, 1, msg_win = derwin(win, win_rows-2, msg_width, 1,
1+(total_width+2-msg_width)/2); 1+(total_width+2-msg_width)/2);
set_menu_fore(menu, attributes[DIALOG_MENU_FORE]); set_menu_fore(menu, attr_dialog_menu_fore);
set_menu_back(menu, attributes[DIALOG_MENU_BACK]); set_menu_back(menu, attr_dialog_menu_back);
(void) wattrset(win, attributes[DIALOG_BOX]); wattrset(win, attr_dialog_box);
box(win, 0, 0); box(win, 0, 0);
/* print message */ /* print message */
(void) wattrset(msg_win, attributes[DIALOG_TEXT]); wattrset(msg_win, attr_dialog_text);
fill_window(msg_win, msg); fill_window(msg_win, msg);
set_menu_win(menu, win); set_menu_win(menu, win);
@ -405,16 +356,16 @@ int dialog_inputbox(WINDOW *main_window,
form_win = derwin(win, 1, prompt_width, prompt_lines+3, 2); form_win = derwin(win, 1, prompt_width, prompt_lines+3, 2);
keypad(form_win, TRUE); keypad(form_win, TRUE);
(void) wattrset(form_win, attributes[INPUT_FIELD]); wattrset(form_win, attr_input_field);
(void) wattrset(win, attributes[INPUT_BOX]); wattrset(win, attr_input_box);
box(win, 0, 0); box(win, 0, 0);
(void) wattrset(win, attributes[INPUT_HEADING]); wattrset(win, attr_input_heading);
if (title) if (title)
mvwprintw(win, 0, 3, "%s", title); mvwprintw(win, 0, 3, "%s", title);
/* print message */ /* print message */
(void) wattrset(prompt_win, attributes[INPUT_TEXT]); wattrset(prompt_win, attr_input_text);
fill_window(prompt_win, prompt); fill_window(prompt_win, prompt);
mvwprintw(form_win, 0, 0, "%*s", prompt_width, " "); mvwprintw(form_win, 0, 0, "%*s", prompt_width, " ");
@ -576,7 +527,7 @@ void show_scroll_win(WINDOW *main_window,
/* create the pad */ /* create the pad */
pad = newpad(total_lines+10, total_cols+10); pad = newpad(total_lines+10, total_cols+10);
(void) wattrset(pad, attributes[SCROLLWIN_TEXT]); wattrset(pad, attr_scrollwin_text);
fill_window(pad, text); fill_window(pad, text);
win_lines = min(total_lines+4, lines-2); win_lines = min(total_lines+4, lines-2);
@ -591,9 +542,9 @@ void show_scroll_win(WINDOW *main_window,
win = newwin(win_lines, win_cols, y, x); win = newwin(win_lines, win_cols, y, x);
keypad(win, TRUE); keypad(win, TRUE);
/* show the help in the help window, and show the help panel */ /* show the help in the help window, and show the help panel */
(void) wattrset(win, attributes[SCROLLWIN_BOX]); wattrset(win, attr_scrollwin_box);
box(win, 0, 0); box(win, 0, 0);
(void) wattrset(win, attributes[SCROLLWIN_HEADING]); wattrset(win, attr_scrollwin_heading);
mvwprintw(win, 0, 3, " %s ", title); mvwprintw(win, 0, 3, " %s ", title);
panel = new_panel(win); panel = new_panel(win);
@ -604,10 +555,9 @@ void show_scroll_win(WINDOW *main_window,
text_cols, 0); text_cols, 0);
print_in_middle(win, print_in_middle(win,
text_lines+2, text_lines+2,
0,
text_cols, text_cols,
"<OK>", "<OK>",
attributes[DIALOG_MENU_FORE]); attr_dialog_menu_fore);
wrefresh(win); wrefresh(win);
res = wgetch(win); res = wgetch(win);

View File

@ -32,30 +32,26 @@
typeof(b) _b = b;\ typeof(b) _b = b;\
_a < _b ? _a : _b; }) _a < _b ? _a : _b; })
typedef enum { extern int attr_normal;
NORMAL = 1, extern int attr_main_heading;
MAIN_HEADING, extern int attr_main_menu_box;
MAIN_MENU_BOX, extern int attr_main_menu_fore;
MAIN_MENU_FORE, extern int attr_main_menu_back;
MAIN_MENU_BACK, extern int attr_main_menu_grey;
MAIN_MENU_GREY, extern int attr_main_menu_heading;
MAIN_MENU_HEADING, extern int attr_scrollwin_text;
SCROLLWIN_TEXT, extern int attr_scrollwin_heading;
SCROLLWIN_HEADING, extern int attr_scrollwin_box;
SCROLLWIN_BOX, extern int attr_dialog_text;
DIALOG_TEXT, extern int attr_dialog_menu_fore;
DIALOG_MENU_FORE, extern int attr_dialog_menu_back;
DIALOG_MENU_BACK, extern int attr_dialog_box;
DIALOG_BOX, extern int attr_input_box;
INPUT_BOX, extern int attr_input_heading;
INPUT_HEADING, extern int attr_input_text;
INPUT_TEXT, extern int attr_input_field;
INPUT_FIELD, extern int attr_function_text;
FUNCTION_TEXT, extern int attr_function_highlight;
FUNCTION_HIGHLIGHT,
ATTR_MAX
} attributes_t;
extern attributes_t attributes[];
typedef enum { typedef enum {
F_HELP = 1, F_HELP = 1,
@ -72,12 +68,7 @@ typedef enum {
void set_colors(void); void set_colors(void);
/* this changes the windows attributes !!! */ /* this changes the windows attributes !!! */
void print_in_middle(WINDOW *win, void print_in_middle(WINDOW *win, int y, int width, const char *str, int attrs);
int starty,
int startx,
int width,
const char *string,
chtype color);
int get_line_length(const char *line); int get_line_length(const char *line);
int get_line_no(const char *text); int get_line_no(const char *text);
const char *get_line(const char *text, int line_no); const char *get_line(const char *text, int line_no);

File diff suppressed because it is too large Load Diff

View File

@ -1,8 +1,9 @@
/* A Bison parser, made by GNU Bison 3.1. */ /* A Bison parser, made by GNU Bison 3.7.6. */
/* Bison interface for Yacc-like parsers in C /* Bison interface for Yacc-like parsers in C
Copyright (C) 1984, 1989-1990, 2000-2015, 2018 Free Software Foundation, Inc. Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation,
Inc.
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
@ -15,7 +16,7 @@
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */ along with this program. If not, see <https://www.gnu.org/licenses/>. */
/* As a special exception, you may create a larger work that contains /* As a special exception, you may create a larger work that contains
part or all of the Bison parser skeleton and distribute that work part or all of the Bison parser skeleton and distribute that work
@ -30,6 +31,10 @@
This special exception was added by the Free Software Foundation in This special exception was added by the Free Software Foundation in
version 2.2 of Bison. */ version 2.2 of Bison. */
/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
especially those whose name start with YY_ or yy_. They are
private implementation details that can be changed or removed. */
#ifndef YY_YY_PARSER_TAB_H_INCLUDED #ifndef YY_YY_PARSER_TAB_H_INCLUDED
# define YY_YY_PARSER_TAB_H_INCLUDED # define YY_YY_PARSER_TAB_H_INCLUDED
/* Debug traces. */ /* Debug traces. */
@ -40,72 +45,72 @@
extern int yydebug; extern int yydebug;
#endif #endif
/* Token type. */ /* Token kinds. */
#ifndef YYTOKENTYPE #ifndef YYTOKENTYPE
# define YYTOKENTYPE # define YYTOKENTYPE
enum yytokentype enum yytokentype
{ {
T_HELPTEXT = 258, YYEMPTY = -2,
T_WORD = 259, YYEOF = 0, /* "end of file" */
T_WORD_QUOTE = 260, YYerror = 256, /* error */
T_ALLNOCONFIG_Y = 261, YYUNDEF = 257, /* "invalid token" */
T_BOOL = 262, T_HELPTEXT = 258, /* T_HELPTEXT */
T_CHOICE = 263, T_WORD = 259, /* T_WORD */
T_CLOSE_PAREN = 264, T_WORD_QUOTE = 260, /* T_WORD_QUOTE */
T_COLON_EQUAL = 265, T_BOOL = 261, /* T_BOOL */
T_COMMENT = 266, T_CHOICE = 262, /* T_CHOICE */
T_CONFIG = 267, T_CLOSE_PAREN = 263, /* T_CLOSE_PAREN */
T_DEFAULT = 268, T_COLON_EQUAL = 264, /* T_COLON_EQUAL */
T_DEFCONFIG_LIST = 269, T_COMMENT = 265, /* T_COMMENT */
T_DEF_BOOL = 270, T_CONFIG = 266, /* T_CONFIG */
T_DEF_TRISTATE = 271, T_DEFAULT = 267, /* T_DEFAULT */
T_DEPENDS = 272, T_DEF_BOOL = 268, /* T_DEF_BOOL */
T_ENDCHOICE = 273, T_DEF_TRISTATE = 269, /* T_DEF_TRISTATE */
T_ENDIF = 274, T_DEPENDS = 270, /* T_DEPENDS */
T_ENDMENU = 275, T_ENDCHOICE = 271, /* T_ENDCHOICE */
T_HELP = 276, T_ENDIF = 272, /* T_ENDIF */
T_HEX = 277, T_ENDMENU = 273, /* T_ENDMENU */
T_IF = 278, T_HELP = 274, /* T_HELP */
T_IMPLY = 279, T_HEX = 275, /* T_HEX */
T_INT = 280, T_IF = 276, /* T_IF */
T_MAINMENU = 281, T_IMPLY = 277, /* T_IMPLY */
T_MENU = 282, T_INT = 278, /* T_INT */
T_MENUCONFIG = 283, T_MAINMENU = 279, /* T_MAINMENU */
T_MODULES = 284, T_MENU = 280, /* T_MENU */
T_ON = 285, T_MENUCONFIG = 281, /* T_MENUCONFIG */
T_OPEN_PAREN = 286, T_MODULES = 282, /* T_MODULES */
T_OPTION = 287, T_ON = 283, /* T_ON */
T_OPTIONAL = 288, T_OPEN_PAREN = 284, /* T_OPEN_PAREN */
T_PLUS_EQUAL = 289, T_OPTIONAL = 285, /* T_OPTIONAL */
T_PROMPT = 290, T_PLUS_EQUAL = 286, /* T_PLUS_EQUAL */
T_RANGE = 291, T_PROMPT = 287, /* T_PROMPT */
T_RESET = 292, T_RANGE = 288, /* T_RANGE */
T_SELECT = 293, T_RESET = 289, /* T_RESET */
T_SOURCE = 294, T_SELECT = 290, /* T_SELECT */
T_STRING = 295, T_SOURCE = 291, /* T_SOURCE */
T_TRISTATE = 296, T_STRING = 292, /* T_STRING */
T_VISIBLE = 297, T_TRISTATE = 293, /* T_TRISTATE */
T_EOL = 298, T_VISIBLE = 294, /* T_VISIBLE */
T_ASSIGN_VAL = 299, T_EOL = 295, /* T_EOL */
T_OR = 300, T_ASSIGN_VAL = 296, /* T_ASSIGN_VAL */
T_AND = 301, T_OR = 297, /* T_OR */
T_EQUAL = 302, T_AND = 298, /* T_AND */
T_UNEQUAL = 303, T_EQUAL = 299, /* T_EQUAL */
T_LESS = 304, T_UNEQUAL = 300, /* T_UNEQUAL */
T_LESS_EQUAL = 305, T_LESS = 301, /* T_LESS */
T_GREATER = 306, T_LESS_EQUAL = 302, /* T_LESS_EQUAL */
T_GREATER_EQUAL = 307, T_GREATER = 303, /* T_GREATER */
T_NOT = 308 T_GREATER_EQUAL = 304, /* T_GREATER_EQUAL */
T_NOT = 305 /* T_NOT */
}; };
typedef enum yytokentype yytoken_kind_t;
#endif #endif
/* Value type. */ /* Value type. */
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
union YYSTYPE union YYSTYPE
{ {
char *string; char *string;
struct symbol *symbol; struct symbol *symbol;
struct expr *expr; struct expr *expr;
@ -115,7 +120,6 @@ union YYSTYPE
}; };
typedef union YYSTYPE YYSTYPE; typedef union YYSTYPE YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_TRIVIAL 1
# define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_DECLARED 1

View File

@ -12,6 +12,7 @@
#include <stdbool.h> #include <stdbool.h>
#include "lkc.h" #include "lkc.h"
#include "internal.h"
#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt) #define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)
@ -28,7 +29,7 @@ static bool zconf_endtoken(const char *tokenname,
struct symbol *symbol_hash[SYMBOL_HASHSIZE]; struct symbol *symbol_hash[SYMBOL_HASHSIZE];
static struct menu *current_menu, *current_entry; struct menu *current_menu, *current_entry;
%} %}
@ -45,7 +46,6 @@ static struct menu *current_menu, *current_entry;
%token <string> T_HELPTEXT %token <string> T_HELPTEXT
%token <string> T_WORD %token <string> T_WORD
%token <string> T_WORD_QUOTE %token <string> T_WORD_QUOTE
%token T_ALLNOCONFIG_Y
%token T_BOOL %token T_BOOL
%token T_CHOICE %token T_CHOICE
%token T_CLOSE_PAREN %token T_CLOSE_PAREN
@ -53,7 +53,6 @@ static struct menu *current_menu, *current_entry;
%token T_COMMENT %token T_COMMENT
%token T_CONFIG %token T_CONFIG
%token T_DEFAULT %token T_DEFAULT
%token T_DEFCONFIG_LIST
%token T_DEF_BOOL %token T_DEF_BOOL
%token T_DEF_TRISTATE %token T_DEF_TRISTATE
%token T_DEPENDS %token T_DEPENDS
@ -71,7 +70,6 @@ static struct menu *current_menu, *current_entry;
%token T_MODULES %token T_MODULES
%token T_ON %token T_ON
%token T_OPEN_PAREN %token T_OPEN_PAREN
%token T_OPTION
%token T_OPTIONAL %token T_OPTIONAL
%token T_PLUS_EQUAL %token T_PLUS_EQUAL
%token T_PROMPT %token T_PROMPT
@ -120,20 +118,24 @@ mainmenu_stmt: T_MAINMENU T_WORD_QUOTE T_EOL
stmt_list: stmt_list:
/* empty */ /* empty */
| stmt_list common_stmt | stmt_list assignment_stmt
| stmt_list choice_stmt | stmt_list choice_stmt
| stmt_list comment_stmt
| stmt_list config_stmt
| stmt_list if_stmt
| stmt_list menu_stmt | stmt_list menu_stmt
| stmt_list menuconfig_stmt
| stmt_list source_stmt
| stmt_list T_WORD error T_EOL { zconf_error("unknown statement \"%s\"", $2); } | stmt_list T_WORD error T_EOL { zconf_error("unknown statement \"%s\"", $2); }
| stmt_list error T_EOL { zconf_error("invalid statement"); } | stmt_list error T_EOL { zconf_error("invalid statement"); }
; ;
common_stmt: stmt_list_in_choice:
if_stmt /* empty */
| comment_stmt | stmt_list_in_choice comment_stmt
| config_stmt | stmt_list_in_choice config_stmt
| menuconfig_stmt | stmt_list_in_choice if_stmt_in_choice
| source_stmt | stmt_list_in_choice error T_EOL { zconf_error("invalid statement"); }
| assignment_stmt
; ;
/* config/menuconfig entry */ /* config/menuconfig entry */
@ -215,19 +217,12 @@ config_option: T_RANGE symbol symbol if_expr T_EOL
printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno()); printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno());
}; };
config_option: T_OPTION T_MODULES T_EOL config_option: T_MODULES T_EOL
{ {
menu_add_option_modules(); if (modules_sym)
}; zconf_error("symbol '%s' redefines option 'modules' already defined by symbol '%s'",
current_entry->sym->name, modules_sym->name);
config_option: T_OPTION T_DEFCONFIG_LIST T_EOL modules_sym = current_entry->sym;
{
menu_add_option_defconfig_list();
};
config_option: T_OPTION T_ALLNOCONFIG_Y T_EOL
{
menu_add_option_allnoconfig_y();
}; };
/* choice entry */ /* choice entry */
@ -255,7 +250,7 @@ choice_end: end
} }
}; };
choice_stmt: choice_entry choice_block choice_end choice_stmt: choice_entry stmt_list_in_choice choice_end
; ;
choice_option_list: choice_option_list:
@ -311,11 +306,6 @@ default:
| T_DEF_BOOL { $$ = S_BOOLEAN; } | T_DEF_BOOL { $$ = S_BOOLEAN; }
| T_DEF_TRISTATE { $$ = S_TRISTATE; } | T_DEF_TRISTATE { $$ = S_TRISTATE; }
choice_block:
/* empty */
| choice_block common_stmt
;
/* if entry */ /* if entry */
if_entry: T_IF expr T_EOL if_entry: T_IF expr T_EOL
@ -337,6 +327,9 @@ if_end: end
if_stmt: if_entry stmt_list if_end if_stmt: if_entry stmt_list if_end
; ;
if_stmt_in_choice: if_entry stmt_list_in_choice if_end
;
/* menu entry */ /* menu entry */
menu: T_MENU T_WORD_QUOTE T_EOL menu: T_MENU T_WORD_QUOTE T_EOL
@ -517,7 +510,7 @@ void conf_parse(const char *name)
} }
if (yynerrs) if (yynerrs)
exit(1); exit(1);
sym_set_change_count(1); conf_set_changed(true);
} }
static bool zconf_endtoken(const char *tokenname, static bool zconf_endtoken(const char *tokenname,
@ -723,5 +716,3 @@ void zconfdump(FILE *out)
} }
} }
} }
#include "menu.c"

View File

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

View File

@ -2,7 +2,6 @@
# SPDX-License-Identifier: GPL-2.0-only # SPDX-License-Identifier: GPL-2.0-only
PKG="Qt5Core Qt5Gui Qt5Widgets" PKG="Qt5Core Qt5Gui Qt5Widgets"
PKG2="QtCore QtGui"
if [ -z "$(command -v pkg-config)" ]; then if [ -z "$(command -v pkg-config)" ]; then
echo >&2 "*" echo >&2 "*"
@ -12,21 +11,14 @@ if [ -z "$(command -v pkg-config)" ]; then
fi fi
if pkg-config --exists $PKG; then if pkg-config --exists $PKG; then
echo cflags=\"-std=c++11 -fPIC $(pkg-config --cflags Qt5Core Qt5Gui Qt5Widgets)\" echo cflags=\"-std=c++11 -fPIC $(pkg-config --cflags $PKG)\"
echo libs=\"$(pkg-config --libs $PKG)\" echo libs=\"$(pkg-config --libs $PKG)\"
echo moc=\"$(pkg-config --variable=host_bins Qt5Core)/moc\" echo moc=\"$(pkg-config --variable=host_bins Qt5Core)/moc\"
exit 0 exit 0
fi fi
if pkg-config --exists $PKG2; then
echo cflags=\"$(pkg-config --cflags $PKG2)\"
echo libs=\"$(pkg-config --libs $PKG2)\"
echo moc=\"$(pkg-config --variable=moc_location QtCore)\"
exit 0
fi
echo >&2 "*" echo >&2 "*"
echo >&2 "* Could not find Qt via pkg-config." echo >&2 "* Could not find Qt5 via pkg-config."
echo >&2 "* Please install either Qt 4.8 or 5.x. and make sure it's in PKG_CONFIG_PATH" echo >&2 "* Please install Qt5 and make sure it's in PKG_CONFIG_PATH"
echo >&2 "*" echo >&2 "*"
exit 1 exit 1

File diff suppressed because it is too large Load Diff

View File

@ -3,23 +3,22 @@
* Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
*/ */
#include <QTextBrowser>
#include <QTreeWidget>
#include <QMainWindow>
#include <QHeaderView>
#include <qsettings.h>
#include <QPushButton>
#include <QSettings>
#include <QLineEdit>
#include <QSplitter>
#include <QCheckBox> #include <QCheckBox>
#include <QDialog> #include <QDialog>
#include <QHeaderView>
#include <QLineEdit>
#include <QMainWindow>
#include <QPushButton>
#include <QSettings>
#include <QSplitter>
#include <QStyledItemDelegate>
#include <QTextBrowser>
#include <QTreeWidget>
#include "expr.h" #include "expr.h"
class ConfigView;
class ConfigList; class ConfigList;
class ConfigItem; class ConfigItem;
class ConfigLineEdit;
class ConfigMainWindow; class ConfigMainWindow;
class ConfigSettings : public QSettings { class ConfigSettings : public QSettings {
@ -30,7 +29,7 @@ public:
}; };
enum colIdx { enum colIdx {
promptColIdx, nameColIdx, noColIdx, modColIdx, yesColIdx, dataColIdx, colNr promptColIdx, nameColIdx, dataColIdx
}; };
enum listMode { enum listMode {
singleMode, menuMode, symbolMode, fullMode, listMode singleMode, menuMode, symbolMode, fullMode, listMode
@ -43,13 +42,16 @@ class ConfigList : public QTreeWidget {
Q_OBJECT Q_OBJECT
typedef class QTreeWidget Parent; typedef class QTreeWidget Parent;
public: public:
ConfigList(ConfigView* p, const char *name = 0); ConfigList(QWidget *parent, const char *name = 0);
~ConfigList();
void reinit(void); void reinit(void);
ConfigView* parent(void) const
{
return (ConfigView*)Parent::parent();
}
ConfigItem* findConfigItem(struct menu *); ConfigItem* findConfigItem(struct menu *);
void setSelected(QTreeWidgetItem *item, bool enable) {
for (int i = 0; i < selectedItems().size(); i++)
selectedItems().at(i)->setSelected(false);
item->setSelected(enable);
}
protected: protected:
void keyPressEvent(QKeyEvent *e); void keyPressEvent(QKeyEvent *e);
@ -63,61 +65,52 @@ protected:
public slots: public slots:
void setRootMenu(struct menu *menu); void setRootMenu(struct menu *menu);
void updateList(ConfigItem *item); void updateList();
void setValue(ConfigItem* item, tristate val); void setValue(ConfigItem* item, tristate val);
void changeValue(ConfigItem* item); void changeValue(ConfigItem* item);
void updateSelection(void); void updateSelection(void);
void saveSettings(void); void saveSettings(void);
void setOptionMode(QAction *action);
void setShowName(bool on);
signals: signals:
void menuChanged(struct menu *menu); void menuChanged(struct menu *menu);
void menuSelected(struct menu *menu); void menuSelected(struct menu *menu);
void itemSelected(struct menu *menu);
void parentSelected(void); void parentSelected(void);
void gotFocus(struct menu *); void gotFocus(struct menu *);
void showNameChanged(bool on);
public: public:
void updateListAll(void) void updateListAll(void)
{ {
updateAll = true; updateAll = true;
updateList(NULL); updateList();
updateAll = false; updateAll = false;
} }
ConfigList* listView()
{
return this;
}
ConfigItem* firstChild() const
{
return (ConfigItem *)children().first();
}
void addColumn(colIdx idx)
{
showColumn(idx);
}
void removeColumn(colIdx idx)
{
hideColumn(idx);
}
void setAllOpen(bool open); void setAllOpen(bool open);
void setParentMenu(void); void setParentMenu(void);
bool menuSkip(struct menu *); bool menuSkip(struct menu *);
void updateMenuList(ConfigItem *parent, struct menu*); void updateMenuList(ConfigItem *parent, struct menu*);
void updateMenuList(ConfigList *parent, struct menu*); void updateMenuList(struct menu *menu);
bool updateAll; bool updateAll;
QPixmap symbolYesPix, symbolModPix, symbolNoPix; bool showName;
QPixmap choiceYesPix, choiceNoPix;
QPixmap menuPix, menuInvPix, menuBackPix, voidPix;
bool showName, showRange, showData;
enum listMode mode; enum listMode mode;
enum optionMode optMode; enum optionMode optMode;
struct menu *rootEntry; struct menu *rootEntry;
QPalette disabledColorGroup; QPalette disabledColorGroup;
QPalette inactivedColorGroup; QPalette inactivedColorGroup;
QMenu* headerPopup; QMenu* headerPopup;
static QList<ConfigList *> allLists;
static void updateListForAll();
static void updateListAllForAll();
static QAction *showNormalAction, *showAllAction, *showPromptAction;
}; };
class ConfigItem : public QTreeWidgetItem { class ConfigItem : public QTreeWidgetItem {
@ -140,7 +133,6 @@ public:
} }
~ConfigItem(void); ~ConfigItem(void);
void init(void); void init(void);
void okRename(int col);
void updateMenu(void); void updateMenu(void);
void testUpdateMenu(bool v); void testUpdateMenu(bool v);
ConfigList* listView() const ConfigList* listView() const
@ -165,82 +157,36 @@ public:
return ret; return ret;
} }
void setText(colIdx idx, const QString& text)
{
Parent::setText(idx, text);
}
QString text(colIdx idx) const
{
return Parent::text(idx);
}
void setPixmap(colIdx idx, const QIcon &icon)
{
Parent::setIcon(idx, icon);
}
const QIcon pixmap(colIdx idx) const
{
return icon(idx);
}
// TODO: Implement paintCell // TODO: Implement paintCell
ConfigItem* nextItem; ConfigItem* nextItem;
struct menu *menu; struct menu *menu;
bool visible; bool visible;
bool goParent; bool goParent;
static QIcon symbolYesIcon, symbolModIcon, symbolNoIcon;
static QIcon choiceYesIcon, choiceNoIcon;
static QIcon menuIcon, menubackIcon;
}; };
class ConfigLineEdit : public QLineEdit { class ConfigItemDelegate : public QStyledItemDelegate
Q_OBJECT {
typedef class QLineEdit Parent; private:
struct menu *menu;
public: public:
ConfigLineEdit(ConfigView* parent); ConfigItemDelegate(QObject *parent = nullptr)
ConfigView* parent(void) const : QStyledItemDelegate(parent) {}
{ QWidget *createEditor(QWidget *parent,
return (ConfigView*)Parent::parent(); const QStyleOptionViewItem &option,
} const QModelIndex &index) const override;
void show(ConfigItem *i); void setModelData(QWidget *editor, QAbstractItemModel *model,
void keyPressEvent(QKeyEvent *e); const QModelIndex &index) const override;
public:
ConfigItem *item;
};
class ConfigView : public QWidget {
Q_OBJECT
typedef class QWidget Parent;
public:
ConfigView(QWidget* parent, const char *name = 0);
~ConfigView(void);
static void updateList(ConfigItem* item);
static void updateListAll(void);
bool showName(void) const { return list->showName; }
bool showRange(void) const { return list->showRange; }
bool showData(void) const { return list->showData; }
public slots:
void setShowName(bool);
void setShowRange(bool);
void setShowData(bool);
void setOptionMode(QAction *);
signals:
void showNameChanged(bool);
void showRangeChanged(bool);
void showDataChanged(bool);
public:
ConfigList* list;
ConfigLineEdit* lineEdit;
static ConfigView* viewList;
ConfigView* nextView;
static QAction *showNormalAction;
static QAction *showAllAction;
static QAction *showPromptAction;
}; };
class ConfigInfoView : public QTextBrowser { class ConfigInfoView : public QTextBrowser {
Q_OBJECT Q_OBJECT
typedef class QTextBrowser Parent; typedef class QTextBrowser Parent;
QMenu *contextMenu;
public: public:
ConfigInfoView(QWidget* parent, const char *name = 0); ConfigInfoView(QWidget* parent, const char *name = 0);
bool showDebug(void) const { return _showDebug; } bool showDebug(void) const { return _showDebug; }
@ -249,6 +195,7 @@ public slots:
void setInfo(struct menu *menu); void setInfo(struct menu *menu);
void saveSettings(void); void saveSettings(void);
void setShowDebug(bool); void setShowDebug(bool);
void clicked (const QUrl &url);
signals: signals:
void showDebugChanged(bool); void showDebugChanged(bool);
@ -260,8 +207,7 @@ protected:
QString debug_info(struct symbol *sym); QString debug_info(struct symbol *sym);
static QString print_filter(const QString &str); static QString print_filter(const QString &str);
static void expr_print_help(void *data, struct symbol *sym, const char *str); static void expr_print_help(void *data, struct symbol *sym, const char *str);
QMenu *createStandardContextMenu(const QPoint & pos); void contextMenuEvent(QContextMenuEvent *event);
void contextMenuEvent(QContextMenuEvent *e);
struct symbol *sym; struct symbol *sym;
struct menu *_menu; struct menu *_menu;
@ -272,7 +218,7 @@ class ConfigSearchWindow : public QDialog {
Q_OBJECT Q_OBJECT
typedef class QDialog Parent; typedef class QDialog Parent;
public: public:
ConfigSearchWindow(ConfigMainWindow* parent, const char *name = 0); ConfigSearchWindow(ConfigMainWindow *parent);
public slots: public slots:
void saveSettings(void); void saveSettings(void);
@ -282,7 +228,7 @@ protected:
QLineEdit* editField; QLineEdit* editField;
QPushButton* searchButton; QPushButton* searchButton;
QSplitter* split; QSplitter* split;
ConfigView* list; ConfigList *list;
ConfigInfoView* info; ConfigInfoView* info;
struct symbol **result; struct symbol **result;
@ -298,6 +244,7 @@ public:
ConfigMainWindow(void); ConfigMainWindow(void);
public slots: public slots:
void changeMenu(struct menu *); void changeMenu(struct menu *);
void changeItens(struct menu *);
void setMenuLink(struct menu *); void setMenuLink(struct menu *);
void listFocusChanged(void); void listFocusChanged(void);
void goBack(void); void goBack(void);
@ -316,12 +263,9 @@ protected:
void closeEvent(QCloseEvent *e); void closeEvent(QCloseEvent *e);
ConfigSearchWindow *searchWindow; ConfigSearchWindow *searchWindow;
ConfigView *menuView;
ConfigList *menuList; ConfigList *menuList;
ConfigView *configView;
ConfigList *configList; ConfigList *configList;
ConfigInfoView *helpText; ConfigInfoView *helpText;
QToolBar *toolBar;
QAction *backAction; QAction *backAction;
QAction *singleViewAction; QAction *singleViewAction;
QAction *splitViewAction; QAction *splitViewAction;

View File

@ -3,11 +3,11 @@
* Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
*/ */
#include <sys/types.h>
#include <ctype.h> #include <ctype.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <regex.h> #include <regex.h>
#include <sys/utsname.h>
#include "lkc.h" #include "lkc.h"
@ -15,23 +15,28 @@ struct symbol symbol_yes = {
.name = "y", .name = "y",
.curr = { "y", yes }, .curr = { "y", yes },
.flags = SYMBOL_CONST|SYMBOL_VALID, .flags = SYMBOL_CONST|SYMBOL_VALID,
}, symbol_mod = { };
struct symbol symbol_mod = {
.name = "m", .name = "m",
.curr = { "m", mod }, .curr = { "m", mod },
.flags = SYMBOL_CONST|SYMBOL_VALID, .flags = SYMBOL_CONST|SYMBOL_VALID,
}, symbol_no = { };
struct symbol symbol_no = {
.name = "n", .name = "n",
.curr = { "n", no }, .curr = { "n", no },
.flags = SYMBOL_CONST|SYMBOL_VALID, .flags = SYMBOL_CONST|SYMBOL_VALID,
}, symbol_empty = { };
static struct symbol symbol_empty = {
.name = "", .name = "",
.curr = { "", no }, .curr = { "", no },
.flags = SYMBOL_VALID, .flags = SYMBOL_VALID,
}; };
struct symbol *sym_defconfig_list;
struct symbol *modules_sym; struct symbol *modules_sym;
tristate modules_val; static tristate modules_val;
int recursive_is_error; int recursive_is_error;
enum symbol_type sym_get_type(struct symbol *sym) enum symbol_type sym_get_type(struct symbol *sym)
@ -222,7 +227,7 @@ static void sym_calc_visibility(struct symbol *sym)
sym_set_changed(sym); sym_set_changed(sym);
} }
tri = no; tri = no;
if (sym->implied.expr && sym->dir_dep.tri != no) if (sym->implied.expr)
tri = expr_calc_value(sym->implied.expr); tri = expr_calc_value(sym->implied.expr);
if (tri == mod && sym_get_type(sym) == S_BOOLEAN) if (tri == mod && sym_get_type(sym) == S_BOOLEAN)
tri = yes; tri = yes;
@ -373,6 +378,8 @@ void sym_calc_value(struct symbol *sym)
if (sym->implied.tri != no) { if (sym->implied.tri != no) {
sym->flags |= SYMBOL_WRITE; sym->flags |= SYMBOL_WRITE;
newval.tri = EXPR_OR(newval.tri, sym->implied.tri); newval.tri = EXPR_OR(newval.tri, sym->implied.tri);
newval.tri = EXPR_AND(newval.tri,
sym->dir_dep.tri);
} }
} }
calc_newval: calc_newval:
@ -381,8 +388,7 @@ void sym_calc_value(struct symbol *sym)
else else
newval.tri = EXPR_OR(newval.tri, sym->rev_dep.tri); newval.tri = EXPR_OR(newval.tri, sym->rev_dep.tri);
} }
if (newval.tri == mod && if (newval.tri == mod && sym_get_type(sym) == S_BOOLEAN)
(sym_get_type(sym) == S_BOOLEAN || sym->implied.tri == yes))
newval.tri = yes; newval.tri = yes;
break; break;
case S_STRING: case S_STRING:
@ -446,7 +452,7 @@ void sym_clear_all_valid(void)
for_all_symbols(i, sym) for_all_symbols(i, sym)
sym->flags &= ~SYMBOL_VALID; sym->flags &= ~SYMBOL_VALID;
sym_add_change_count(1); conf_set_changed(true);
sym_calc_value(modules_sym); sym_calc_value(modules_sym);
} }
@ -464,8 +470,6 @@ bool sym_tristate_within_range(struct symbol *sym, tristate val)
return false; return false;
if (sym->visible <= sym->rev_dep.tri) if (sym->visible <= sym->rev_dep.tri)
return false; return false;
if (sym->implied.tri == yes && val == mod)
return false;
if (sym_is_choice_value(sym) && sym->visible == yes) if (sym_is_choice_value(sym) && sym->visible == yes)
return val == yes; return val == yes;
return val >= sym->rev_dep.tri && val <= sym->visible; return val >= sym->rev_dep.tri && val <= sym->visible;
@ -812,7 +816,7 @@ struct symbol *sym_lookup(const char *name, int flags)
memset(symbol, 0, sizeof(*symbol)); memset(symbol, 0, sizeof(*symbol));
symbol->name = new_name; symbol->name = new_name;
symbol->type = S_UNKNOWN; symbol->type = S_UNKNOWN;
symbol->flags |= flags; symbol->flags = flags;
symbol->next = symbol_hash[hash]; symbol->next = symbol_hash[hash];
symbol_hash[hash] = symbol; symbol_hash[hash] = symbol;

View File

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