Kconfig: sync with linux kernel v2.6.36-rc1-168-ge36c886
this will add also the support of the new ncurse interface nconfig Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
This commit is contained in:
parent
77df62be5d
commit
7167eb8c0b
2
Makefile
2
Makefile
|
@ -305,7 +305,7 @@ KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
|
||||||
KERNELVERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
|
KERNELVERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
|
||||||
|
|
||||||
export VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE KERNELVERSION
|
export VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE KERNELVERSION
|
||||||
export ARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC
|
export ARCH SRCARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC
|
||||||
export CPP AR NM STRIP OBJCOPY OBJDUMP MAKE AWK GENKSYMS PERL UTS_MACHINE
|
export CPP AR NM STRIP OBJCOPY OBJDUMP MAKE AWK GENKSYMS PERL UTS_MACHINE
|
||||||
export HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS
|
export HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,16 @@
|
||||||
|
config ARCH
|
||||||
|
string
|
||||||
|
option env="ARCH"
|
||||||
|
|
||||||
|
config KERNELVERSION
|
||||||
|
string
|
||||||
|
option env="KERNELVERSION"
|
||||||
|
|
||||||
|
config DEFCONFIG_LIST
|
||||||
|
string
|
||||||
|
option defconfig_list
|
||||||
|
default "$ARCH_DEFCONFIG"
|
||||||
|
default "arch/$ARCH/defconfig"
|
||||||
|
|
||||||
config GREGORIAN_CALENDER
|
config GREGORIAN_CALENDER
|
||||||
bool
|
bool
|
||||||
|
|
|
@ -8,12 +8,16 @@ lex.*.c
|
||||||
zconf.hash.c
|
zconf.hash.c
|
||||||
*.moc
|
*.moc
|
||||||
lkc_defs.h
|
lkc_defs.h
|
||||||
|
gconf.glade.h
|
||||||
|
*.pot
|
||||||
|
*.mo
|
||||||
|
|
||||||
#
|
#
|
||||||
# configuration programs
|
# configuration programs
|
||||||
#
|
#
|
||||||
conf
|
conf
|
||||||
mconf
|
mconf
|
||||||
|
nconf
|
||||||
qconf
|
qconf
|
||||||
gconf
|
gconf
|
||||||
kxgettext
|
kxgettext
|
||||||
|
|
|
@ -2,106 +2,161 @@
|
||||||
# Kernel configuration targets
|
# Kernel configuration targets
|
||||||
# These targets are used from top-level makefile
|
# These targets are used from top-level makefile
|
||||||
|
|
||||||
PHONY += oldconfig xconfig gconfig menuconfig config silentoldconfig update-po-config
|
PHONY += oldconfig xconfig gconfig menuconfig config silentoldconfig update-po-config \
|
||||||
|
localmodconfig localyesconfig
|
||||||
|
|
||||||
|
ifdef KBUILD_KCONFIG
|
||||||
|
Kconfig := $(KBUILD_KCONFIG)
|
||||||
|
else
|
||||||
|
Kconfig := arch/$(SRCARCH)/Kconfig
|
||||||
|
endif
|
||||||
|
|
||||||
xconfig: $(obj)/qconf
|
xconfig: $(obj)/qconf
|
||||||
$< arch/$(ARCH)/Kconfig
|
$< $(Kconfig)
|
||||||
|
|
||||||
gconfig: $(obj)/gconf
|
gconfig: $(obj)/gconf
|
||||||
$< arch/$(ARCH)/Kconfig
|
$< $(Kconfig)
|
||||||
|
|
||||||
menuconfig: $(obj)/mconf
|
menuconfig: $(obj)/mconf
|
||||||
$< arch/$(ARCH)/Kconfig
|
$< $(Kconfig)
|
||||||
|
|
||||||
config: $(obj)/conf
|
config: $(obj)/conf
|
||||||
$< arch/$(ARCH)/Kconfig
|
$< --oldaskconfig $(Kconfig)
|
||||||
|
|
||||||
|
nconfig: $(obj)/nconf
|
||||||
|
$< $(Kconfig)
|
||||||
|
|
||||||
oldconfig: $(obj)/conf
|
oldconfig: $(obj)/conf
|
||||||
$< -o arch/$(ARCH)/Kconfig
|
$< --$@ $(Kconfig)
|
||||||
|
|
||||||
silentoldconfig: $(obj)/conf
|
silentoldconfig: $(obj)/conf
|
||||||
$< -s arch/$(ARCH)/Kconfig
|
$(Q)mkdir -p include/generated
|
||||||
|
$< --$@ $(Kconfig)
|
||||||
|
|
||||||
# Create new linux.po file
|
# if no path is given, then use src directory to find file
|
||||||
|
ifdef LSMOD
|
||||||
|
LSMOD_F := $(LSMOD)
|
||||||
|
ifeq ($(findstring /,$(LSMOD)),)
|
||||||
|
LSMOD_F := $(objtree)/$(LSMOD)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
localmodconfig: $(obj)/streamline_config.pl $(obj)/conf
|
||||||
|
$(Q)mkdir -p include/generated
|
||||||
|
$(Q)perl $< $(srctree) $(Kconfig) $(LSMOD_F) > .tmp.config
|
||||||
|
$(Q)if [ -f .config ]; then \
|
||||||
|
cmp -s .tmp.config .config || \
|
||||||
|
(mv -f .config .config.old.1; \
|
||||||
|
mv -f .tmp.config .config; \
|
||||||
|
$(obj)/conf --silentoldconfig $(Kconfig); \
|
||||||
|
mv -f .config.old.1 .config.old) \
|
||||||
|
else \
|
||||||
|
mv -f .tmp.config .config; \
|
||||||
|
$(obj)/conf --silentoldconfig $(Kconfig); \
|
||||||
|
fi
|
||||||
|
$(Q)rm -f .tmp.config
|
||||||
|
|
||||||
|
localyesconfig: $(obj)/streamline_config.pl $(obj)/conf
|
||||||
|
$(Q)mkdir -p include/generated
|
||||||
|
$(Q)perl $< $(srctree) $(Kconfig) $(LSMOD_F) > .tmp.config
|
||||||
|
$(Q)sed -i s/=m/=y/ .tmp.config
|
||||||
|
$(Q)if [ -f .config ]; then \
|
||||||
|
cmp -s .tmp.config .config || \
|
||||||
|
(mv -f .config .config.old.1; \
|
||||||
|
mv -f .tmp.config .config; \
|
||||||
|
$(obj)/conf --silentoldconfig $(Kconfig); \
|
||||||
|
mv -f .config.old.1 .config.old) \
|
||||||
|
else \
|
||||||
|
mv -f .tmp.config .config; \
|
||||||
|
$(obj)/conf --silentoldconfig $(Kconfig); \
|
||||||
|
fi
|
||||||
|
$(Q)rm -f .tmp.config
|
||||||
|
|
||||||
|
# Create new linux.pot file
|
||||||
# Adjust charset to UTF-8 in .po file to accept UTF-8 in Kconfig files
|
# Adjust charset to UTF-8 in .po file to accept UTF-8 in Kconfig files
|
||||||
# The symlink is used to repair a deficiency in arch/um
|
# The symlink is used to repair a deficiency in arch/um
|
||||||
update-po-config: $(obj)/kxgettext
|
update-po-config: $(obj)/kxgettext $(obj)/gconf.glade.h
|
||||||
xgettext --default-domain=linux \
|
$(Q)echo " GEN config"
|
||||||
|
$(Q)xgettext --default-domain=linux \
|
||||||
--add-comments --keyword=_ --keyword=N_ \
|
--add-comments --keyword=_ --keyword=N_ \
|
||||||
--from-code=UTF-8 \
|
--from-code=UTF-8 \
|
||||||
--files-from=scripts/kconfig/POTFILES.in \
|
--files-from=scripts/kconfig/POTFILES.in \
|
||||||
--output $(obj)/config.pot
|
--output $(obj)/config.pot
|
||||||
$(Q)sed -i s/CHARSET/UTF-8/ $(obj)/config.pot
|
$(Q)sed -i s/CHARSET/UTF-8/ $(obj)/config.pot
|
||||||
$(Q)ln -fs Kconfig.i386 arch/um/Kconfig.arch
|
$(Q)ln -fs Kconfig.i386 arch/um/Kconfig.arch
|
||||||
(for i in `ls arch/`; \
|
$(Q)(for i in `ls arch/*/Kconfig`; \
|
||||||
do \
|
do \
|
||||||
$(obj)/kxgettext arch/$$i/Kconfig; \
|
echo " GEN $$i"; \
|
||||||
done ) >> $(obj)/config.pot
|
$(obj)/kxgettext $$i \
|
||||||
msguniq --sort-by-file --to-code=UTF-8 $(obj)/config.pot \
|
>> $(obj)/config.pot; \
|
||||||
|
done )
|
||||||
|
$(Q)msguniq --sort-by-file --to-code=UTF-8 $(obj)/config.pot \
|
||||||
--output $(obj)/linux.pot
|
--output $(obj)/linux.pot
|
||||||
$(Q)rm -f arch/um/Kconfig.arch
|
$(Q)rm -f arch/um/Kconfig.arch
|
||||||
$(Q)rm -f $(obj)/config.pot
|
$(Q)rm -f $(obj)/config.pot
|
||||||
|
|
||||||
PHONY += randconfig allyesconfig allnoconfig allmodconfig defconfig
|
PHONY += allnoconfig allyesconfig allmodconfig alldefconfig randconfig
|
||||||
|
|
||||||
randconfig: $(obj)/conf
|
allnoconfig allyesconfig allmodconfig alldefconfig randconfig: $(obj)/conf
|
||||||
$< -r arch/$(ARCH)/Kconfig
|
$< --$@ $(Kconfig)
|
||||||
|
|
||||||
allyesconfig: $(obj)/conf
|
PHONY += listnewconfig oldnoconfig savedefconfig defconfig
|
||||||
$< -y arch/$(ARCH)/Kconfig
|
|
||||||
|
|
||||||
allnoconfig: $(obj)/conf
|
listnewconfig oldnoconfig: $(obj)/conf
|
||||||
$< -n arch/$(ARCH)/Kconfig
|
$< --$@ $(Kconfig)
|
||||||
|
|
||||||
allmodconfig: $(obj)/conf
|
savedefconfig: $(obj)/conf
|
||||||
$< -m arch/$(ARCH)/Kconfig
|
$< --$@=defconfig $(Kconfig)
|
||||||
|
|
||||||
defconfig: $(obj)/conf
|
defconfig: $(obj)/conf
|
||||||
ifeq ($(KBUILD_DEFCONFIG),)
|
ifeq ($(KBUILD_DEFCONFIG),)
|
||||||
$< -d arch/$(ARCH)/Kconfig
|
$< --defconfig $(Kconfig)
|
||||||
else
|
else
|
||||||
@echo *** Default configuration is based on '$(KBUILD_DEFCONFIG)'
|
@echo "*** Default configuration is based on '$(KBUILD_DEFCONFIG)'"
|
||||||
$(Q)$< -D arch/$(ARCH)/configs/$(KBUILD_DEFCONFIG) arch/$(ARCH)/Kconfig
|
$(Q)$< --defconfig=arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
%_defconfig: $(obj)/conf
|
%_defconfig: $(obj)/conf
|
||||||
$(Q)$< -D arch/$(ARCH)/configs/$@ arch/$(ARCH)/Kconfig
|
$(Q)$< --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
|
||||||
|
|
||||||
# Help text used by make help
|
# Help text used by make help
|
||||||
help:
|
help:
|
||||||
@echo ' config - Update current config utilising a line-oriented program'
|
@echo ' config - Update current config utilising a line-oriented program'
|
||||||
|
@echo ' nconfig - Update current config utilising a ncurses menu based program'
|
||||||
@echo ' menuconfig - Update current config utilising a menu based program'
|
@echo ' menuconfig - Update current config utilising a menu based program'
|
||||||
@echo ' xconfig - Update current config utilising a QT based front-end'
|
@echo ' xconfig - Update current config utilising a QT based front-end'
|
||||||
@echo ' gconfig - Update current config utilising a GTK based front-end'
|
@echo ' gconfig - Update current config utilising a GTK based front-end'
|
||||||
@echo ' oldconfig - Update current config utilising a provided .config as base'
|
@echo ' oldconfig - Update current config utilising a provided .config as base'
|
||||||
@echo ' silentoldconfig - Same as oldconfig, but quietly'
|
@echo ' localmodconfig - Update current config disabling modules not loaded'
|
||||||
@echo ' randconfig - New config with random answer to all options'
|
@echo ' localyesconfig - Update current config converting local mods to core'
|
||||||
@echo ' defconfig - New config with default answer to all options'
|
@echo ' silentoldconfig - Same as oldconfig, but quietly, additionally update deps'
|
||||||
@echo ' allmodconfig - New config selecting modules when possible'
|
@echo ' defconfig - New config with default from ARCH supplied defconfig'
|
||||||
@echo ' allyesconfig - New config where all options are accepted with yes'
|
@echo ' savedefconfig - Save current config as ./defconfig (minimal config)'
|
||||||
@echo ' allnoconfig - New config where all options are answered with no'
|
@echo ' allnoconfig - New config where all options are answered with no'
|
||||||
|
@echo ' allyesconfig - New config where all options are accepted with yes'
|
||||||
|
@echo ' allmodconfig - New config selecting modules when possible'
|
||||||
|
@echo ' alldefconfig - New config with all symbols set to default'
|
||||||
|
@echo ' randconfig - New config with random answer to all options'
|
||||||
|
@echo ' listnewconfig - List new options'
|
||||||
|
@echo ' oldnoconfig - Same as silentoldconfig but set new symbols to n (unset)'
|
||||||
|
|
||||||
# lxdialog stuff
|
# lxdialog stuff
|
||||||
check-lxdialog := $(srctree)/$(src)/lxdialog/check-lxdialog.sh
|
check-lxdialog := $(srctree)/$(src)/lxdialog/check-lxdialog.sh
|
||||||
|
|
||||||
# Use reursively expanded variables so we do not call gcc unless
|
# Use recursively expanded variables so we do not call gcc unless
|
||||||
# we really need to do so. (Do not call gcc as part of make mrproper)
|
# we really need to do so. (Do not call gcc as part of make mrproper)
|
||||||
HOST_EXTRACFLAGS = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ccflags)
|
HOST_EXTRACFLAGS = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ccflags)
|
||||||
HOST_LOADLIBES = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ldflags $(HOSTCC))
|
HOST_LOADLIBES = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ldflags $(HOSTCC))
|
||||||
|
|
||||||
HOST_EXTRACFLAGS += -DLOCALE
|
HOST_EXTRACFLAGS += -DLOCALE
|
||||||
|
|
||||||
PHONY += $(obj)/dochecklxdialog
|
|
||||||
$(obj)/dochecklxdialog:
|
|
||||||
$(Q)$(CONFIG_SHELL) $(check-lxdialog) -check $(HOSTCC) $(HOST_LOADLIBES)
|
|
||||||
|
|
||||||
always := dochecklxdialog
|
|
||||||
|
|
||||||
|
|
||||||
# ===========================================================================
|
# ===========================================================================
|
||||||
# Shared Makefile for the various kconfig executables:
|
# Shared Makefile for the various kconfig executables:
|
||||||
# conf: Used for defconfig, oldconfig and related targets
|
# conf: Used for defconfig, oldconfig and related targets
|
||||||
# mconf: Used for the mconfig target.
|
# nconf: Used for the nconfig target.
|
||||||
|
# Utilizes ncurses
|
||||||
|
# mconf: Used for the menuconfig target
|
||||||
# Utilizes the lxdialog package
|
# Utilizes the lxdialog package
|
||||||
# qconf: Used for the xconfig target
|
# qconf: Used for the xconfig target
|
||||||
# Based on QT which needs to be installed to compile it
|
# Based on QT which needs to be installed to compile it
|
||||||
|
@ -114,10 +169,15 @@ lxdialog += lxdialog/textbox.o lxdialog/yesno.o lxdialog/menubox.o
|
||||||
|
|
||||||
conf-objs := conf.o zconf.tab.o
|
conf-objs := conf.o zconf.tab.o
|
||||||
mconf-objs := mconf.o zconf.tab.o $(lxdialog)
|
mconf-objs := mconf.o zconf.tab.o $(lxdialog)
|
||||||
|
nconf-objs := nconf.o zconf.tab.o nconf.gui.o
|
||||||
kxgettext-objs := kxgettext.o zconf.tab.o
|
kxgettext-objs := kxgettext.o zconf.tab.o
|
||||||
|
|
||||||
hostprogs-y := conf qconf gconf kxgettext
|
hostprogs-y := conf qconf gconf kxgettext
|
||||||
|
|
||||||
|
ifeq ($(MAKECMDGOALS),nconfig)
|
||||||
|
hostprogs-y += nconf
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(MAKECMDGOALS),menuconfig)
|
ifeq ($(MAKECMDGOALS),menuconfig)
|
||||||
hostprogs-y += mconf
|
hostprogs-y += mconf
|
||||||
endif
|
endif
|
||||||
|
@ -140,17 +200,20 @@ gconf-objs := gconf.o kconfig_load.o zconf.tab.o
|
||||||
endif
|
endif
|
||||||
|
|
||||||
clean-files := lkc_defs.h qconf.moc .tmp_qtcheck \
|
clean-files := lkc_defs.h qconf.moc .tmp_qtcheck \
|
||||||
.tmp_gtkcheck zconf.tab.c lex.zconf.c zconf.hash.c
|
.tmp_gtkcheck zconf.tab.c lex.zconf.c zconf.hash.c gconf.glade.h
|
||||||
clean-files += mconf qconf gconf
|
clean-files += mconf qconf gconf nconf
|
||||||
|
clean-files += config.pot linux.pot
|
||||||
|
|
||||||
# Needed for systems without gettext
|
# Check that we have the required ncurses stuff installed for lxdialog (menuconfig)
|
||||||
KBUILD_HAVE_NLS := $(shell \
|
PHONY += $(obj)/dochecklxdialog
|
||||||
if echo "\#include <libintl.h>" | $(HOSTCC) $(HOSTCFLAGS) -E - > /dev/null 2>&1 ; \
|
$(addprefix $(obj)/,$(lxdialog)): $(obj)/dochecklxdialog
|
||||||
then echo yes ; \
|
$(obj)/dochecklxdialog:
|
||||||
else echo no ; fi)
|
$(Q)$(CONFIG_SHELL) $(check-lxdialog) -check $(HOSTCC) $(HOST_EXTRACFLAGS) $(HOST_LOADLIBES)
|
||||||
ifeq ($(KBUILD_HAVE_NLS),no)
|
|
||||||
HOSTCFLAGS += -DKBUILD_NO_NLS
|
always := dochecklxdialog
|
||||||
endif
|
|
||||||
|
# Add environment specific flags
|
||||||
|
HOST_EXTRACFLAGS += $(shell $(CONFIG_SHELL) $(srctree)/$(src)/check.sh $(HOSTCC) $(HOSTCFLAGS))
|
||||||
|
|
||||||
# generated files seem to need this to find local include files
|
# generated files seem to need this to find local include files
|
||||||
HOSTCFLAGS_lex.zconf.o := -I$(src)
|
HOSTCFLAGS_lex.zconf.o := -I$(src)
|
||||||
|
@ -159,10 +222,11 @@ HOSTCFLAGS_zconf.tab.o := -I$(src)
|
||||||
HOSTLOADLIBES_qconf = $(KC_QT_LIBS) -ldl
|
HOSTLOADLIBES_qconf = $(KC_QT_LIBS) -ldl
|
||||||
HOSTCXXFLAGS_qconf.o = $(KC_QT_CFLAGS) -D LKC_DIRECT_LINK
|
HOSTCXXFLAGS_qconf.o = $(KC_QT_CFLAGS) -D LKC_DIRECT_LINK
|
||||||
|
|
||||||
HOSTLOADLIBES_gconf = `pkg-config --libs gtk+-2.0 gmodule-2.0 libglade-2.0`
|
HOSTLOADLIBES_gconf = `pkg-config --libs gtk+-2.0 gmodule-2.0 libglade-2.0` -ldl
|
||||||
HOSTCFLAGS_gconf.o = `pkg-config --cflags gtk+-2.0 gmodule-2.0 libglade-2.0` \
|
HOSTCFLAGS_gconf.o = `pkg-config --cflags gtk+-2.0 gmodule-2.0 libglade-2.0` \
|
||||||
-D LKC_DIRECT_LINK
|
-D LKC_DIRECT_LINK
|
||||||
|
|
||||||
|
HOSTLOADLIBES_nconf = -lmenu -lpanel -lncurses
|
||||||
$(obj)/qconf.o: $(obj)/.tmp_qtcheck
|
$(obj)/qconf.o: $(obj)/.tmp_qtcheck
|
||||||
|
|
||||||
ifeq ($(qconf-target),1)
|
ifeq ($(qconf-target),1)
|
||||||
|
@ -252,6 +316,9 @@ $(obj)/%.moc: $(src)/%.h
|
||||||
$(obj)/lkc_defs.h: $(src)/lkc_proto.h
|
$(obj)/lkc_defs.h: $(src)/lkc_proto.h
|
||||||
sed < $< > $@ 's/P(\([^,]*\),.*/#define \1 (\*\1_p)/'
|
sed < $< > $@ 's/P(\([^,]*\),.*/#define \1 (\*\1_p)/'
|
||||||
|
|
||||||
|
# Extract gconf menu items for I18N support
|
||||||
|
$(obj)/gconf.glade.h: $(obj)/gconf.glade
|
||||||
|
intltool-extract --type=gettext/glade $(obj)/gconf.glade
|
||||||
|
|
||||||
###
|
###
|
||||||
# The following requires flex/bison/gperf
|
# The following requires flex/bison/gperf
|
||||||
|
|
|
@ -1,5 +1,12 @@
|
||||||
|
scripts/kconfig/lxdialog/checklist.c
|
||||||
|
scripts/kconfig/lxdialog/inputbox.c
|
||||||
|
scripts/kconfig/lxdialog/menubox.c
|
||||||
|
scripts/kconfig/lxdialog/textbox.c
|
||||||
|
scripts/kconfig/lxdialog/util.c
|
||||||
|
scripts/kconfig/lxdialog/yesno.c
|
||||||
scripts/kconfig/mconf.c
|
scripts/kconfig/mconf.c
|
||||||
scripts/kconfig/conf.c
|
scripts/kconfig/conf.c
|
||||||
scripts/kconfig/confdata.c
|
scripts/kconfig/confdata.c
|
||||||
scripts/kconfig/gconf.c
|
scripts/kconfig/gconf.c
|
||||||
|
scripts/kconfig/gconf.glade.h
|
||||||
scripts/kconfig/qconf.cc
|
scripts/kconfig/qconf.cc
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# Needed for systems without gettext
|
||||||
|
$* -xc -o /dev/null - > /dev/null 2>&1 << EOF
|
||||||
|
#include <libintl.h>
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
gettext("");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
if [ ! "$?" -eq "0" ]; then
|
||||||
|
echo -DKBUILD_NO_NLS;
|
||||||
|
fi
|
||||||
|
|
|
@ -3,13 +3,16 @@
|
||||||
* Released under the terms of the GNU GPL v2.0.
|
* Released under the terms of the GNU GPL v2.0.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <locale.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <getopt.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
#define LKC_DIRECT_LINK
|
#define LKC_DIRECT_LINK
|
||||||
#include "lkc.h"
|
#include "lkc.h"
|
||||||
|
@ -17,32 +20,38 @@
|
||||||
static void conf(struct menu *menu);
|
static void conf(struct menu *menu);
|
||||||
static void check_conf(struct menu *menu);
|
static void check_conf(struct menu *menu);
|
||||||
|
|
||||||
enum {
|
enum input_mode {
|
||||||
ask_all,
|
oldaskconfig,
|
||||||
ask_new,
|
silentoldconfig,
|
||||||
ask_silent,
|
oldconfig,
|
||||||
set_default,
|
allnoconfig,
|
||||||
set_yes,
|
allyesconfig,
|
||||||
set_mod,
|
allmodconfig,
|
||||||
set_no,
|
alldefconfig,
|
||||||
set_random
|
randconfig,
|
||||||
} input_mode = ask_all;
|
defconfig,
|
||||||
|
savedefconfig,
|
||||||
|
listnewconfig,
|
||||||
|
oldnoconfig,
|
||||||
|
} input_mode = oldaskconfig;
|
||||||
|
|
||||||
char *defconfig_file;
|
char *defconfig_file;
|
||||||
|
|
||||||
static int indent = 1;
|
static int indent = 1;
|
||||||
static int valid_stdin = 1;
|
static int valid_stdin = 1;
|
||||||
|
static int sync_kconfig;
|
||||||
static int conf_cnt;
|
static int conf_cnt;
|
||||||
static char line[128];
|
static char line[128];
|
||||||
static struct menu *rootEntry;
|
static struct menu *rootEntry;
|
||||||
|
|
||||||
static char nohelp_text[] = N_("Sorry, no help available for this option yet.\n");
|
static void print_help(struct menu *menu)
|
||||||
|
|
||||||
static const char *get_help(struct menu *menu)
|
|
||||||
{
|
{
|
||||||
if (menu_has_help(menu))
|
struct gstr help = str_new();
|
||||||
return menu_get_help(menu);
|
|
||||||
else
|
menu_get_ext_help(menu, &help);
|
||||||
return nohelp_text;
|
|
||||||
|
printf("\n%s\n", str_get(&help));
|
||||||
|
str_free(&help);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void strip(char *str)
|
static void strip(char *str)
|
||||||
|
@ -64,7 +73,7 @@ static void strip(char *str)
|
||||||
|
|
||||||
static void check_stdin(void)
|
static void check_stdin(void)
|
||||||
{
|
{
|
||||||
if (!valid_stdin && input_mode == ask_silent) {
|
if (!valid_stdin) {
|
||||||
printf(_("aborted!\n\n"));
|
printf(_("aborted!\n\n"));
|
||||||
printf(_("Console input/output is redirected. "));
|
printf(_("Console input/output is redirected. "));
|
||||||
printf(_("Run 'make oldconfig' to update configuration.\n\n"));
|
printf(_("Run 'make oldconfig' to update configuration.\n\n"));
|
||||||
|
@ -75,10 +84,9 @@ static void check_stdin(void)
|
||||||
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);
|
enum symbol_type type = sym_get_type(sym);
|
||||||
tristate val;
|
|
||||||
|
|
||||||
if (!sym_has_value(sym))
|
if (!sym_has_value(sym))
|
||||||
printf("(NEW) ");
|
printf(_("(NEW) "));
|
||||||
|
|
||||||
line[0] = '\n';
|
line[0] = '\n';
|
||||||
line[1] = 0;
|
line[1] = 0;
|
||||||
|
@ -91,28 +99,16 @@ static int conf_askvalue(struct symbol *sym, const char *def)
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (input_mode) {
|
switch (input_mode) {
|
||||||
case set_no:
|
case oldconfig:
|
||||||
case set_mod:
|
case silentoldconfig:
|
||||||
case set_yes:
|
|
||||||
case set_random:
|
|
||||||
if (sym_has_value(sym)) {
|
|
||||||
printf("%s\n", def);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ask_new:
|
|
||||||
case ask_silent:
|
|
||||||
if (sym_has_value(sym)) {
|
if (sym_has_value(sym)) {
|
||||||
printf("%s\n", def);
|
printf("%s\n", def);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
check_stdin();
|
check_stdin();
|
||||||
case ask_all:
|
case oldaskconfig:
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
fgets(line, 128, stdin);
|
xfgets(line, 128, stdin);
|
||||||
return 1;
|
|
||||||
case set_default:
|
|
||||||
printf("%s\n", def);
|
|
||||||
return 1;
|
return 1;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -127,63 +123,17 @@ static int conf_askvalue(struct symbol *sym, const char *def)
|
||||||
default:
|
default:
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
switch (input_mode) {
|
|
||||||
case set_yes:
|
|
||||||
if (sym_tristate_within_range(sym, yes)) {
|
|
||||||
line[0] = 'y';
|
|
||||||
line[1] = '\n';
|
|
||||||
line[2] = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case set_mod:
|
|
||||||
if (type == S_TRISTATE) {
|
|
||||||
if (sym_tristate_within_range(sym, mod)) {
|
|
||||||
line[0] = 'm';
|
|
||||||
line[1] = '\n';
|
|
||||||
line[2] = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (sym_tristate_within_range(sym, yes)) {
|
|
||||||
line[0] = 'y';
|
|
||||||
line[1] = '\n';
|
|
||||||
line[2] = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case set_no:
|
|
||||||
if (sym_tristate_within_range(sym, no)) {
|
|
||||||
line[0] = 'n';
|
|
||||||
line[1] = '\n';
|
|
||||||
line[2] = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case set_random:
|
|
||||||
do {
|
|
||||||
val = (tristate)(random() % 3);
|
|
||||||
} while (!sym_tristate_within_range(sym, val));
|
|
||||||
switch (val) {
|
|
||||||
case no: line[0] = 'n'; break;
|
|
||||||
case mod: line[0] = 'm'; break;
|
|
||||||
case yes: line[0] = 'y'; break;
|
|
||||||
}
|
|
||||||
line[1] = '\n';
|
|
||||||
line[2] = 0;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
printf("%s", line);
|
printf("%s", line);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int conf_string(struct menu *menu)
|
static int conf_string(struct menu *menu)
|
||||||
{
|
{
|
||||||
struct symbol *sym = menu->sym;
|
struct symbol *sym = menu->sym;
|
||||||
const char *def;
|
const char *def;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
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 (sym_get_string_value(sym))
|
||||||
|
@ -196,7 +146,7 @@ int conf_string(struct menu *menu)
|
||||||
case '?':
|
case '?':
|
||||||
/* print help */
|
/* print help */
|
||||||
if (line[1] == '\n') {
|
if (line[1] == '\n') {
|
||||||
printf("\n%s\n", get_help(menu));
|
print_help(menu);
|
||||||
def = NULL;
|
def = NULL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -212,14 +162,12 @@ int conf_string(struct menu *menu)
|
||||||
static int conf_sym(struct menu *menu)
|
static int conf_sym(struct menu *menu)
|
||||||
{
|
{
|
||||||
struct symbol *sym = menu->sym;
|
struct symbol *sym = menu->sym;
|
||||||
int type;
|
|
||||||
tristate oldval, newval;
|
tristate oldval, newval;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
printf("%*s%s ", indent - 1, "", menu->prompt->text);
|
printf("%*s%s ", indent - 1, "", _(menu->prompt->text));
|
||||||
if (sym->name)
|
if (sym->name)
|
||||||
printf("(%s) ", sym->name);
|
printf("(%s) ", sym->name);
|
||||||
type = sym_get_type(sym);
|
|
||||||
putchar('[');
|
putchar('[');
|
||||||
oldval = sym_get_tristate_value(sym);
|
oldval = sym_get_tristate_value(sym);
|
||||||
switch (oldval) {
|
switch (oldval) {
|
||||||
|
@ -276,7 +224,7 @@ static int conf_sym(struct menu *menu)
|
||||||
if (sym_set_tristate_value(sym, newval))
|
if (sym_set_tristate_value(sym, newval))
|
||||||
return 0;
|
return 0;
|
||||||
help:
|
help:
|
||||||
printf("\n%s\n", get_help(menu));
|
print_help(menu);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -284,11 +232,9 @@ static int conf_choice(struct menu *menu)
|
||||||
{
|
{
|
||||||
struct symbol *sym, *def_sym;
|
struct symbol *sym, *def_sym;
|
||||||
struct menu *child;
|
struct menu *child;
|
||||||
int type;
|
|
||||||
bool is_new;
|
bool is_new;
|
||||||
|
|
||||||
sym = menu->sym;
|
sym = menu->sym;
|
||||||
type = sym_get_type(sym);
|
|
||||||
is_new = !sym_has_value(sym);
|
is_new = !sym_has_value(sym);
|
||||||
if (sym_is_changable(sym)) {
|
if (sym_is_changable(sym)) {
|
||||||
conf_sym(menu);
|
conf_sym(menu);
|
||||||
|
@ -306,7 +252,7 @@ static int conf_choice(struct menu *menu)
|
||||||
case no:
|
case no:
|
||||||
return 1;
|
return 1;
|
||||||
case mod:
|
case mod:
|
||||||
printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
|
printf("%*s%s\n", indent - 1, "", _(menu_get_prompt(menu)));
|
||||||
return 0;
|
return 0;
|
||||||
case yes:
|
case yes:
|
||||||
break;
|
break;
|
||||||
|
@ -316,7 +262,7 @@ static int conf_choice(struct menu *menu)
|
||||||
while (1) {
|
while (1) {
|
||||||
int cnt, def;
|
int cnt, def;
|
||||||
|
|
||||||
printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
|
printf("%*s%s\n", indent - 1, "", _(menu_get_prompt(menu)));
|
||||||
def_sym = sym_get_choice_value(sym);
|
def_sym = sym_get_choice_value(sym);
|
||||||
cnt = def = 0;
|
cnt = def = 0;
|
||||||
line[0] = 0;
|
line[0] = 0;
|
||||||
|
@ -324,7 +270,7 @@ static int conf_choice(struct menu *menu)
|
||||||
if (!menu_is_visible(child))
|
if (!menu_is_visible(child))
|
||||||
continue;
|
continue;
|
||||||
if (!child->sym) {
|
if (!child->sym) {
|
||||||
printf("%*c %s\n", indent, '*', menu_get_prompt(child));
|
printf("%*c %s\n", indent, '*', _(menu_get_prompt(child)));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
cnt++;
|
cnt++;
|
||||||
|
@ -333,14 +279,14 @@ static int conf_choice(struct menu *menu)
|
||||||
printf("%*c", indent, '>');
|
printf("%*c", indent, '>');
|
||||||
} else
|
} else
|
||||||
printf("%*c", indent, ' ');
|
printf("%*c", indent, ' ');
|
||||||
printf(" %d. %s", cnt, menu_get_prompt(child));
|
printf(" %d. %s", cnt, _(menu_get_prompt(child)));
|
||||||
if (child->sym->name)
|
if (child->sym->name)
|
||||||
printf(" (%s)", child->sym->name);
|
printf(" (%s)", child->sym->name);
|
||||||
if (!sym_has_value(child->sym))
|
if (!sym_has_value(child->sym))
|
||||||
printf(" (NEW)");
|
printf(_(" (NEW)"));
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
printf("%*schoice", indent - 1, "");
|
printf(_("%*schoice"), indent - 1, "");
|
||||||
if (cnt == 1) {
|
if (cnt == 1) {
|
||||||
printf("[1]: 1\n");
|
printf("[1]: 1\n");
|
||||||
goto conf_childs;
|
goto conf_childs;
|
||||||
|
@ -350,20 +296,20 @@ static int conf_choice(struct menu *menu)
|
||||||
printf("?");
|
printf("?");
|
||||||
printf("]: ");
|
printf("]: ");
|
||||||
switch (input_mode) {
|
switch (input_mode) {
|
||||||
case ask_new:
|
case oldconfig:
|
||||||
case ask_silent:
|
case silentoldconfig:
|
||||||
if (!is_new) {
|
if (!is_new) {
|
||||||
cnt = def;
|
cnt = def;
|
||||||
printf("%d\n", cnt);
|
printf("%d\n", cnt);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
check_stdin();
|
check_stdin();
|
||||||
case ask_all:
|
case oldaskconfig:
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
fgets(line, 128, stdin);
|
xfgets(line, 128, stdin);
|
||||||
strip(line);
|
strip(line);
|
||||||
if (line[0] == '?') {
|
if (line[0] == '?') {
|
||||||
printf("\n%s\n", get_help(menu));
|
print_help(menu);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!line[0])
|
if (!line[0])
|
||||||
|
@ -373,14 +319,7 @@ static int conf_choice(struct menu *menu)
|
||||||
else
|
else
|
||||||
continue;
|
continue;
|
||||||
break;
|
break;
|
||||||
case set_random:
|
default:
|
||||||
def = (random() % cnt) + 1;
|
|
||||||
case set_default:
|
|
||||||
case set_yes:
|
|
||||||
case set_mod:
|
|
||||||
case set_no:
|
|
||||||
cnt = def;
|
|
||||||
printf("%d\n", cnt);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -394,13 +333,13 @@ static int conf_choice(struct menu *menu)
|
||||||
if (!child)
|
if (!child)
|
||||||
continue;
|
continue;
|
||||||
if (line[strlen(line) - 1] == '?') {
|
if (line[strlen(line) - 1] == '?') {
|
||||||
printf("\n%s\n", get_help(child));
|
print_help(child);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
sym_set_choice_value(sym, child->sym);
|
sym_set_choice_value(sym, child->sym);
|
||||||
if (child->list) {
|
for (child = child->list; child; child = child->next) {
|
||||||
indent += 2;
|
indent += 2;
|
||||||
conf(child->list);
|
conf(child);
|
||||||
indent -= 2;
|
indent -= 2;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -423,7 +362,10 @@ static void conf(struct menu *menu)
|
||||||
|
|
||||||
switch (prop->type) {
|
switch (prop->type) {
|
||||||
case P_MENU:
|
case P_MENU:
|
||||||
if (input_mode == ask_silent && rootEntry != menu) {
|
if ((input_mode == silentoldconfig ||
|
||||||
|
input_mode == listnewconfig ||
|
||||||
|
input_mode == oldnoconfig) &&
|
||||||
|
rootEntry != menu) {
|
||||||
check_conf(menu);
|
check_conf(menu);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -432,7 +374,7 @@ static void conf(struct menu *menu)
|
||||||
if (prompt)
|
if (prompt)
|
||||||
printf("%*c\n%*c %s\n%*c\n",
|
printf("%*c\n%*c %s\n%*c\n",
|
||||||
indent, '*',
|
indent, '*',
|
||||||
indent, '*', prompt,
|
indent, '*', _(prompt),
|
||||||
indent, '*');
|
indent, '*');
|
||||||
default:
|
default:
|
||||||
;
|
;
|
||||||
|
@ -481,110 +423,138 @@ static void check_conf(struct menu *menu)
|
||||||
if (sym && !sym_has_value(sym)) {
|
if (sym && !sym_has_value(sym)) {
|
||||||
if (sym_is_changable(sym) ||
|
if (sym_is_changable(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 && !sym_is_choice_value(sym)) {
|
||||||
|
printf("CONFIG_%s\n", sym->name);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
if (!conf_cnt++)
|
if (!conf_cnt++)
|
||||||
printf(_("*\n* Restart config...\n*\n"));
|
printf(_("*\n* Restart config...\n*\n"));
|
||||||
rootEntry = menu_get_parent_menu(menu);
|
rootEntry = menu_get_parent_menu(menu);
|
||||||
conf(rootEntry);
|
conf(rootEntry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (child = menu->list; child; child = child->next)
|
for (child = menu->list; child; child = child->next)
|
||||||
check_conf(child);
|
check_conf(child);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct option long_opts[] = {
|
||||||
|
{"oldaskconfig", no_argument, NULL, oldaskconfig},
|
||||||
|
{"oldconfig", no_argument, NULL, oldconfig},
|
||||||
|
{"silentoldconfig", no_argument, NULL, silentoldconfig},
|
||||||
|
{"defconfig", optional_argument, NULL, defconfig},
|
||||||
|
{"savedefconfig", required_argument, NULL, savedefconfig},
|
||||||
|
{"allnoconfig", no_argument, NULL, allnoconfig},
|
||||||
|
{"allyesconfig", no_argument, NULL, allyesconfig},
|
||||||
|
{"allmodconfig", no_argument, NULL, allmodconfig},
|
||||||
|
{"alldefconfig", no_argument, NULL, alldefconfig},
|
||||||
|
{"randconfig", no_argument, NULL, randconfig},
|
||||||
|
{"listnewconfig", no_argument, NULL, listnewconfig},
|
||||||
|
{"oldnoconfig", no_argument, NULL, oldnoconfig},
|
||||||
|
{NULL, 0, NULL, 0}
|
||||||
|
};
|
||||||
|
|
||||||
int main(int ac, char **av)
|
int main(int ac, char **av)
|
||||||
{
|
{
|
||||||
int i = 1;
|
int opt;
|
||||||
const char *name;
|
const char *name;
|
||||||
struct stat tmpstat;
|
struct stat tmpstat;
|
||||||
|
|
||||||
if (ac > i && av[i][0] == '-') {
|
setlocale(LC_ALL, "");
|
||||||
switch (av[i++][1]) {
|
bindtextdomain(PACKAGE, LOCALEDIR);
|
||||||
case 'o':
|
textdomain(PACKAGE);
|
||||||
input_mode = ask_new;
|
|
||||||
|
while ((opt = getopt_long_only(ac, av, "", long_opts, NULL)) != -1) {
|
||||||
|
input_mode = (enum input_mode)opt;
|
||||||
|
switch (opt) {
|
||||||
|
case silentoldconfig:
|
||||||
|
sync_kconfig = 1;
|
||||||
break;
|
break;
|
||||||
case 's':
|
case defconfig:
|
||||||
input_mode = ask_silent;
|
case savedefconfig:
|
||||||
valid_stdin = isatty(0) && isatty(1) && isatty(2);
|
defconfig_file = optarg;
|
||||||
break;
|
break;
|
||||||
case 'd':
|
case randconfig:
|
||||||
input_mode = set_default;
|
{
|
||||||
|
struct timeval now;
|
||||||
|
unsigned int seed;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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));
|
||||||
|
srand(seed);
|
||||||
break;
|
break;
|
||||||
case 'D':
|
|
||||||
input_mode = set_default;
|
|
||||||
defconfig_file = av[i++];
|
|
||||||
if (!defconfig_file) {
|
|
||||||
printf(_("%s: No default config file specified\n"),
|
|
||||||
av[0]);
|
|
||||||
exit(1);
|
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
case 'n':
|
|
||||||
input_mode = set_no;
|
|
||||||
break;
|
|
||||||
case 'm':
|
|
||||||
input_mode = set_mod;
|
|
||||||
break;
|
|
||||||
case 'y':
|
|
||||||
input_mode = set_yes;
|
|
||||||
break;
|
|
||||||
case 'r':
|
|
||||||
input_mode = set_random;
|
|
||||||
srandom(time(NULL));
|
|
||||||
break;
|
|
||||||
case 'h':
|
|
||||||
case '?':
|
case '?':
|
||||||
fprintf(stderr, "See README for usage info\n");
|
fprintf(stderr, _("See README for usage info\n"));
|
||||||
exit(0);
|
exit(1);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
name = av[i];
|
if (ac == optind) {
|
||||||
if (!name) {
|
|
||||||
printf(_("%s: Kconfig file missing\n"), av[0]);
|
printf(_("%s: Kconfig file missing\n"), av[0]);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
name = av[optind];
|
||||||
conf_parse(name);
|
conf_parse(name);
|
||||||
//zconfdump(stdout);
|
//zconfdump(stdout);
|
||||||
switch (input_mode) {
|
if (sync_kconfig) {
|
||||||
case set_default:
|
name = conf_get_configname();
|
||||||
if (!defconfig_file)
|
if (stat(name, &tmpstat)) {
|
||||||
defconfig_file = conf_get_default_confname();
|
fprintf(stderr, _("***\n"
|
||||||
if (conf_read(defconfig_file)) {
|
"*** You have not yet configured your barebox!\n"
|
||||||
printf("***\n"
|
"*** (missing barebox config file \"%s\")\n"
|
||||||
"*** Can't find default configuration \"%s\"!\n"
|
|
||||||
"***\n", defconfig_file);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ask_silent:
|
|
||||||
if (stat(".config", &tmpstat)) {
|
|
||||||
printf(_("***\n"
|
|
||||||
"*** You have not yet configured barebox!\n"
|
|
||||||
"*** (missing .config file)\n"
|
|
||||||
"***\n"
|
"***\n"
|
||||||
"*** Please run some configurator (e.g. \"make oldconfig\" or\n"
|
"*** Please run some configurator (e.g. \"make oldconfig\" or\n"
|
||||||
"*** \"make menuconfig\" or \"make xconfig\").\n"
|
"*** \"make menuconfig\" or \"make xconfig\").\n"
|
||||||
"***\n"));
|
"***\n"), name);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
case ask_all:
|
}
|
||||||
case ask_new:
|
|
||||||
|
switch (input_mode) {
|
||||||
|
case defconfig:
|
||||||
|
if (!defconfig_file)
|
||||||
|
defconfig_file = conf_get_default_confname();
|
||||||
|
if (conf_read(defconfig_file)) {
|
||||||
|
printf(_("***\n"
|
||||||
|
"*** Can't find default configuration \"%s\"!\n"
|
||||||
|
"***\n"), defconfig_file);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case savedefconfig:
|
||||||
conf_read(NULL);
|
conf_read(NULL);
|
||||||
break;
|
break;
|
||||||
case set_no:
|
case silentoldconfig:
|
||||||
case set_mod:
|
case oldaskconfig:
|
||||||
case set_yes:
|
case oldconfig:
|
||||||
case set_random:
|
case listnewconfig:
|
||||||
|
case oldnoconfig:
|
||||||
|
conf_read(NULL);
|
||||||
|
break;
|
||||||
|
case allnoconfig:
|
||||||
|
case allyesconfig:
|
||||||
|
case allmodconfig:
|
||||||
|
case alldefconfig:
|
||||||
|
case randconfig:
|
||||||
name = getenv("KCONFIG_ALLCONFIG");
|
name = getenv("KCONFIG_ALLCONFIG");
|
||||||
if (name && !stat(name, &tmpstat)) {
|
if (name && !stat(name, &tmpstat)) {
|
||||||
conf_read_simple(name, S_DEF_USER);
|
conf_read_simple(name, S_DEF_USER);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
switch (input_mode) {
|
switch (input_mode) {
|
||||||
case set_no: name = "allno.config"; break;
|
case allnoconfig: name = "allno.config"; break;
|
||||||
case set_mod: name = "allmod.config"; break;
|
case allyesconfig: name = "allyes.config"; break;
|
||||||
case set_yes: name = "allyes.config"; break;
|
case allmodconfig: name = "allmod.config"; break;
|
||||||
case set_random: name = "allrandom.config"; break;
|
case alldefconfig: name = "alldef.config"; break;
|
||||||
|
case randconfig: name = "allrandom.config"; break;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
if (!stat(name, &tmpstat))
|
if (!stat(name, &tmpstat))
|
||||||
|
@ -596,35 +566,92 @@ int main(int ac, char **av)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (input_mode != ask_silent) {
|
if (sync_kconfig) {
|
||||||
rootEntry = &rootmenu;
|
if (conf_get_changed()) {
|
||||||
conf(&rootmenu);
|
|
||||||
if (input_mode == ask_all) {
|
|
||||||
input_mode = ask_silent;
|
|
||||||
valid_stdin = 1;
|
|
||||||
}
|
|
||||||
} else if (conf_get_changed()) {
|
|
||||||
name = getenv("KCONFIG_NOSILENTUPDATE");
|
name = getenv("KCONFIG_NOSILENTUPDATE");
|
||||||
if (name && *name) {
|
if (name && *name) {
|
||||||
fprintf(stderr, _("\n*** Kernel configuration requires explicit update.\n\n"));
|
fprintf(stderr,
|
||||||
|
_("\n*** Barebox configuration requires explicit update.\n\n"));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
} else
|
}
|
||||||
goto skip_check;
|
valid_stdin = isatty(0) && isatty(1) && isatty(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (input_mode) {
|
||||||
|
case allnoconfig:
|
||||||
|
conf_set_all_new_symbols(def_no);
|
||||||
|
break;
|
||||||
|
case allyesconfig:
|
||||||
|
conf_set_all_new_symbols(def_yes);
|
||||||
|
break;
|
||||||
|
case allmodconfig:
|
||||||
|
conf_set_all_new_symbols(def_mod);
|
||||||
|
break;
|
||||||
|
case alldefconfig:
|
||||||
|
conf_set_all_new_symbols(def_default);
|
||||||
|
break;
|
||||||
|
case randconfig:
|
||||||
|
conf_set_all_new_symbols(def_random);
|
||||||
|
break;
|
||||||
|
case defconfig:
|
||||||
|
conf_set_all_new_symbols(def_default);
|
||||||
|
break;
|
||||||
|
case savedefconfig:
|
||||||
|
break;
|
||||||
|
case oldaskconfig:
|
||||||
|
rootEntry = &rootmenu;
|
||||||
|
conf(&rootmenu);
|
||||||
|
input_mode = silentoldconfig;
|
||||||
|
/* fall through */
|
||||||
|
case oldconfig:
|
||||||
|
case listnewconfig:
|
||||||
|
case oldnoconfig:
|
||||||
|
case silentoldconfig:
|
||||||
|
/* Update until a loop caused no more changes */
|
||||||
do {
|
do {
|
||||||
conf_cnt = 0;
|
conf_cnt = 0;
|
||||||
check_conf(&rootmenu);
|
check_conf(&rootmenu);
|
||||||
} while (conf_cnt);
|
} while (conf_cnt &&
|
||||||
if (conf_write(NULL)) {
|
(input_mode != listnewconfig &&
|
||||||
fprintf(stderr, _("\n*** Error during writing of the configuration.\n\n"));
|
input_mode != oldnoconfig));
|
||||||
return 1;
|
break;
|
||||||
}
|
|
||||||
skip_check:
|
|
||||||
if (input_mode == ask_silent && conf_write_autoconf()) {
|
|
||||||
fprintf(stderr, _("\n*** Error during writing of the configuration.\n\n"));
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sync_kconfig) {
|
||||||
|
/* silentoldconfig is used during the build so we shall update autoconf.
|
||||||
|
* All other commands are only used to generate a config.
|
||||||
|
*/
|
||||||
|
if (conf_get_changed() && conf_write(NULL)) {
|
||||||
|
fprintf(stderr, _("\n*** Error during writing of the barebox configuration.\n\n"));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if (conf_write_autoconf()) {
|
||||||
|
fprintf(stderr, _("\n*** Error during update of the barebox configuration.\n\n"));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
} else if (input_mode == savedefconfig) {
|
||||||
|
if (conf_write_defconfig(defconfig_file)) {
|
||||||
|
fprintf(stderr, _("n*** Error while saving defconfig to: %s\n\n"),
|
||||||
|
defconfig_file);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
} else if (input_mode != listnewconfig) {
|
||||||
|
if (conf_write(NULL)) {
|
||||||
|
fprintf(stderr, _("\n*** Error during writing of the barebox configuration.\n\n"));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
* Helper function to facilitate fgets() by Jean Sacren.
|
||||||
|
*/
|
||||||
|
void xfgets(str, size, in)
|
||||||
|
char *str;
|
||||||
|
int size;
|
||||||
|
FILE *in;
|
||||||
|
{
|
||||||
|
if (fgets(str, size, in) == NULL)
|
||||||
|
fprintf(stderr, "\nError in reading or end of file.\n");
|
||||||
|
}
|
||||||
|
|
|
@ -41,6 +41,13 @@ const char *conf_get_configname(void)
|
||||||
return name ? name : ".config";
|
return name ? name : ".config";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *conf_get_autoconfig_name(void)
|
||||||
|
{
|
||||||
|
char *name = getenv("KCONFIG_AUTOCONFIG");
|
||||||
|
|
||||||
|
return name ? name : "include/config/auto.conf";
|
||||||
|
}
|
||||||
|
|
||||||
static char *conf_expand_value(const char *in)
|
static char *conf_expand_value(const char *in)
|
||||||
{
|
{
|
||||||
struct symbol *sym;
|
struct symbol *sym;
|
||||||
|
@ -83,6 +90,68 @@ char *conf_get_default_confname(void)
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int conf_set_sym_val(struct symbol *sym, int def, int def_flags, char *p)
|
||||||
|
{
|
||||||
|
char *p2;
|
||||||
|
|
||||||
|
switch (sym->type) {
|
||||||
|
case S_TRISTATE:
|
||||||
|
if (p[0] == 'm') {
|
||||||
|
sym->def[def].tri = mod;
|
||||||
|
sym->flags |= def_flags;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case S_BOOLEAN:
|
||||||
|
if (p[0] == 'y') {
|
||||||
|
sym->def[def].tri = yes;
|
||||||
|
sym->flags |= def_flags;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (p[0] == 'n') {
|
||||||
|
sym->def[def].tri = no;
|
||||||
|
sym->flags |= def_flags;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
conf_warning("symbol value '%s' invalid for %s", p, sym->name);
|
||||||
|
break;
|
||||||
|
case S_OTHER:
|
||||||
|
if (*p != '"') {
|
||||||
|
for (p2 = p; *p2 && !isspace(*p2); p2++)
|
||||||
|
;
|
||||||
|
sym->type = S_STRING;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
case S_STRING:
|
||||||
|
if (*p++ != '"')
|
||||||
|
break;
|
||||||
|
for (p2 = p; (p2 = strpbrk(p2, "\"\\")); p2++) {
|
||||||
|
if (*p2 == '"') {
|
||||||
|
*p2 = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
memmove(p2, p2 + 1, strlen(p2));
|
||||||
|
}
|
||||||
|
if (!p2) {
|
||||||
|
conf_warning("invalid string found");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
case S_INT:
|
||||||
|
case S_HEX:
|
||||||
|
done:
|
||||||
|
if (sym_string_valid(sym, p)) {
|
||||||
|
sym->def[def].val = strdup(p);
|
||||||
|
sym->flags |= def_flags;
|
||||||
|
} else {
|
||||||
|
conf_warning("symbol value '%s' invalid for %s", p, sym->name);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int conf_read_simple(const char *name, int def)
|
int conf_read_simple(const char *name, int def)
|
||||||
{
|
{
|
||||||
FILE *in = NULL;
|
FILE *in = NULL;
|
||||||
|
@ -101,8 +170,11 @@ int conf_read_simple(const char *name, int def)
|
||||||
if (in)
|
if (in)
|
||||||
goto load;
|
goto load;
|
||||||
sym_add_change_count(1);
|
sym_add_change_count(1);
|
||||||
if (!sym_defconfig_list)
|
if (!sym_defconfig_list) {
|
||||||
|
if (modules_sym)
|
||||||
|
sym_calc_value(modules_sym);
|
||||||
return 1;
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
for_all_defaults(sym_defconfig_list, prop) {
|
for_all_defaults(sym_defconfig_list, prop) {
|
||||||
if (expr_calc_value(prop->visible.expr) == no ||
|
if (expr_calc_value(prop->visible.expr) == no ||
|
||||||
|
@ -161,7 +233,7 @@ load:
|
||||||
if (def == S_DEF_USER) {
|
if (def == S_DEF_USER) {
|
||||||
sym = sym_find(line + 9);
|
sym = sym_find(line + 9);
|
||||||
if (!sym) {
|
if (!sym) {
|
||||||
conf_warning("trying to assign nonexistent symbol %s", line + 9);
|
sym_add_change_count(1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -170,8 +242,7 @@ load:
|
||||||
sym->type = S_BOOLEAN;
|
sym->type = S_BOOLEAN;
|
||||||
}
|
}
|
||||||
if (sym->flags & def_flags) {
|
if (sym->flags & def_flags) {
|
||||||
conf_warning("trying to reassign symbol %s", sym->name);
|
conf_warning("override: reassigning to symbol %s", sym->name);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
switch (sym->type) {
|
switch (sym->type) {
|
||||||
case S_BOOLEAN:
|
case S_BOOLEAN:
|
||||||
|
@ -201,7 +272,7 @@ load:
|
||||||
if (def == S_DEF_USER) {
|
if (def == S_DEF_USER) {
|
||||||
sym = sym_find(line + 7);
|
sym = sym_find(line + 7);
|
||||||
if (!sym) {
|
if (!sym) {
|
||||||
conf_warning("trying to assign nonexistent symbol %s", line + 7);
|
sym_add_change_count(1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -210,64 +281,10 @@ load:
|
||||||
sym->type = S_OTHER;
|
sym->type = S_OTHER;
|
||||||
}
|
}
|
||||||
if (sym->flags & def_flags) {
|
if (sym->flags & def_flags) {
|
||||||
conf_warning("trying to reassign symbol %s", sym->name);
|
conf_warning("override: reassigning to symbol %s", sym->name);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
switch (sym->type) {
|
if (conf_set_sym_val(sym, def, def_flags, p))
|
||||||
case S_TRISTATE:
|
|
||||||
if (p[0] == 'm') {
|
|
||||||
sym->def[def].tri = mod;
|
|
||||||
sym->flags |= def_flags;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case S_BOOLEAN:
|
|
||||||
if (p[0] == 'y') {
|
|
||||||
sym->def[def].tri = yes;
|
|
||||||
sym->flags |= def_flags;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (p[0] == 'n') {
|
|
||||||
sym->def[def].tri = no;
|
|
||||||
sym->flags |= def_flags;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
conf_warning("symbol value '%s' invalid for %s", p, sym->name);
|
|
||||||
break;
|
|
||||||
case S_OTHER:
|
|
||||||
if (*p != '"') {
|
|
||||||
for (p2 = p; *p2 && !isspace(*p2); p2++)
|
|
||||||
;
|
|
||||||
sym->type = S_STRING;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
case S_STRING:
|
|
||||||
if (*p++ != '"')
|
|
||||||
break;
|
|
||||||
for (p2 = p; (p2 = strpbrk(p2, "\"\\")); p2++) {
|
|
||||||
if (*p2 == '"') {
|
|
||||||
*p2 = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
memmove(p2, p2 + 1, strlen(p2));
|
|
||||||
}
|
|
||||||
if (!p2) {
|
|
||||||
conf_warning("invalid string found");
|
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
case S_INT:
|
|
||||||
case S_HEX:
|
|
||||||
done:
|
|
||||||
if (sym_string_valid(sym, p)) {
|
|
||||||
sym->def[def].val = strdup(p);
|
|
||||||
sym->flags |= def_flags;
|
|
||||||
} else {
|
|
||||||
conf_warning("symbol value '%s' invalid for %s", p, sym->name);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case '\r':
|
case '\r':
|
||||||
case '\n':
|
case '\n':
|
||||||
|
@ -288,14 +305,12 @@ load:
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case yes:
|
case yes:
|
||||||
if (cs->def[def].tri != no) {
|
if (cs->def[def].tri != no)
|
||||||
conf_warning("%s creates inconsistent choice state", sym->name);
|
conf_warning("override: %s changes choice state", sym->name);
|
||||||
cs->flags &= ~def_flags;
|
|
||||||
} else
|
|
||||||
cs->def[def].val = sym;
|
cs->def[def].val = sym;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
cs->def[def].tri = E_OR(cs->def[def].tri, sym->def[def].tri);
|
cs->def[def].tri = EXPR_OR(cs->def[def].tri, sym->def[def].tri);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fclose(in);
|
fclose(in);
|
||||||
|
@ -307,7 +322,7 @@ load:
|
||||||
|
|
||||||
int conf_read(const char *name)
|
int conf_read(const char *name)
|
||||||
{
|
{
|
||||||
struct symbol *sym;
|
struct symbol *sym, *choice_sym;
|
||||||
struct property *prop;
|
struct property *prop;
|
||||||
struct expr *e;
|
struct expr *e;
|
||||||
int i, flags;
|
int i, flags;
|
||||||
|
@ -348,9 +363,9 @@ int conf_read(const char *name)
|
||||||
*/
|
*/
|
||||||
prop = sym_get_choice_prop(sym);
|
prop = sym_get_choice_prop(sym);
|
||||||
flags = sym->flags;
|
flags = sym->flags;
|
||||||
for (e = prop->expr; e; e = e->left.expr)
|
expr_list_for_each_sym(prop->expr, e, choice_sym)
|
||||||
if (e->right.sym->visible != no)
|
if (choice_sym->visible != no)
|
||||||
flags &= e->right.sym->flags;
|
flags &= choice_sym->flags;
|
||||||
sym->flags &= flags | ~SYMBOL_DEF_USER;
|
sym->flags &= flags | ~SYMBOL_DEF_USER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -384,15 +399,148 @@ int conf_read(const char *name)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Write a S_STRING */
|
||||||
|
static void conf_write_string(bool headerfile, const char *name,
|
||||||
|
const char *str, FILE *out)
|
||||||
|
{
|
||||||
|
int l;
|
||||||
|
if (headerfile)
|
||||||
|
fprintf(out, "#define CONFIG_%s \"", name);
|
||||||
|
else
|
||||||
|
fprintf(out, "CONFIG_%s=\"", name);
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
l = strcspn(str, "\"\\");
|
||||||
|
if (l) {
|
||||||
|
xfwrite(str, l, 1, out);
|
||||||
|
str += l;
|
||||||
|
}
|
||||||
|
if (!*str)
|
||||||
|
break;
|
||||||
|
fprintf(out, "\\%c", *str++);
|
||||||
|
}
|
||||||
|
fputs("\"\n", out);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void conf_write_symbol(struct symbol *sym, enum symbol_type type,
|
||||||
|
FILE *out, bool write_no)
|
||||||
|
{
|
||||||
|
const char *str;
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case S_BOOLEAN:
|
||||||
|
case S_TRISTATE:
|
||||||
|
switch (sym_get_tristate_value(sym)) {
|
||||||
|
case no:
|
||||||
|
if (write_no)
|
||||||
|
fprintf(out, "# CONFIG_%s is not set\n", sym->name);
|
||||||
|
break;
|
||||||
|
case mod:
|
||||||
|
fprintf(out, "CONFIG_%s=m\n", sym->name);
|
||||||
|
break;
|
||||||
|
case yes:
|
||||||
|
fprintf(out, "CONFIG_%s=y\n", sym->name);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case S_STRING:
|
||||||
|
conf_write_string(false, sym->name, sym_get_string_value(sym), out);
|
||||||
|
break;
|
||||||
|
case S_HEX:
|
||||||
|
case S_INT:
|
||||||
|
str = sym_get_string_value(sym);
|
||||||
|
fprintf(out, "CONFIG_%s=%s\n", sym->name, str);
|
||||||
|
break;
|
||||||
|
case S_OTHER:
|
||||||
|
case S_UNKNOWN:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Write out a minimal config.
|
||||||
|
* All values that has default values are skipped as this is redundant.
|
||||||
|
*/
|
||||||
|
int conf_write_defconfig(const char *filename)
|
||||||
|
{
|
||||||
|
struct symbol *sym;
|
||||||
|
struct menu *menu;
|
||||||
|
FILE *out;
|
||||||
|
|
||||||
|
out = fopen(filename, "w");
|
||||||
|
if (!out)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
sym_clear_all_valid();
|
||||||
|
|
||||||
|
/* Traverse all menus to find all relevant symbols */
|
||||||
|
menu = rootmenu.list;
|
||||||
|
|
||||||
|
while (menu != NULL)
|
||||||
|
{
|
||||||
|
sym = menu->sym;
|
||||||
|
if (sym == NULL) {
|
||||||
|
if (!menu_is_visible(menu))
|
||||||
|
goto next_menu;
|
||||||
|
} else if (!sym_is_choice(sym)) {
|
||||||
|
sym_calc_value(sym);
|
||||||
|
if (!(sym->flags & SYMBOL_WRITE))
|
||||||
|
goto next_menu;
|
||||||
|
sym->flags &= ~SYMBOL_WRITE;
|
||||||
|
/* If we cannot change the symbol - skip */
|
||||||
|
if (!sym_is_changable(sym))
|
||||||
|
goto next_menu;
|
||||||
|
/* If symbol equals to default value - skip */
|
||||||
|
if (strcmp(sym_get_string_value(sym), sym_get_string_default(sym)) == 0)
|
||||||
|
goto next_menu;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If symbol is a choice value and equals to the
|
||||||
|
* default for a choice - skip.
|
||||||
|
* But only if value is bool and equal to "y" .
|
||||||
|
*/
|
||||||
|
if (sym_is_choice_value(sym)) {
|
||||||
|
struct symbol *cs;
|
||||||
|
struct symbol *ds;
|
||||||
|
|
||||||
|
cs = prop_get_symbol(sym_get_choice_prop(sym));
|
||||||
|
ds = sym_choice_default(cs);
|
||||||
|
if (sym == ds) {
|
||||||
|
if ((sym->type == S_BOOLEAN) &&
|
||||||
|
sym_get_tristate_value(sym) == yes)
|
||||||
|
goto next_menu;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
conf_write_symbol(sym, sym->type, out, true);
|
||||||
|
}
|
||||||
|
next_menu:
|
||||||
|
if (menu->list != NULL) {
|
||||||
|
menu = menu->list;
|
||||||
|
}
|
||||||
|
else if (menu->next != NULL) {
|
||||||
|
menu = menu->next;
|
||||||
|
} else {
|
||||||
|
while ((menu = menu->parent)) {
|
||||||
|
if (menu->next != NULL) {
|
||||||
|
menu = menu->next;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose(out);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int conf_write(const char *name)
|
int conf_write(const char *name)
|
||||||
{
|
{
|
||||||
FILE *out;
|
FILE *out;
|
||||||
struct symbol *sym;
|
struct symbol *sym;
|
||||||
struct menu *menu;
|
struct menu *menu;
|
||||||
const char *basename;
|
const char *basename;
|
||||||
char dirname[128], tmpname[128], newname[128];
|
|
||||||
int type, l;
|
|
||||||
const char *str;
|
const char *str;
|
||||||
|
char dirname[128], tmpname[128], newname[128];
|
||||||
|
enum symbol_type type;
|
||||||
time_t now;
|
time_t now;
|
||||||
int use_timestamp = 1;
|
int use_timestamp = 1;
|
||||||
char *env;
|
char *env;
|
||||||
|
@ -440,7 +588,7 @@ int conf_write(const char *name)
|
||||||
|
|
||||||
fprintf(out, _("#\n"
|
fprintf(out, _("#\n"
|
||||||
"# Automatically generated make config: don't edit\n"
|
"# Automatically generated make config: don't edit\n"
|
||||||
"# barebox version: %s\n"
|
"# Linux barebox version: %s\n"
|
||||||
"%s%s"
|
"%s%s"
|
||||||
"#\n"),
|
"#\n"),
|
||||||
sym_get_string_value(sym),
|
sym_get_string_value(sym),
|
||||||
|
@ -472,47 +620,8 @@ int conf_write(const char *name)
|
||||||
if (modules_sym->curr.tri == no)
|
if (modules_sym->curr.tri == no)
|
||||||
type = S_BOOLEAN;
|
type = S_BOOLEAN;
|
||||||
}
|
}
|
||||||
switch (type) {
|
/* Write config symbol to file */
|
||||||
case S_BOOLEAN:
|
conf_write_symbol(sym, type, out, true);
|
||||||
case S_TRISTATE:
|
|
||||||
switch (sym_get_tristate_value(sym)) {
|
|
||||||
case no:
|
|
||||||
fprintf(out, "# CONFIG_%s is not set\n", sym->name);
|
|
||||||
break;
|
|
||||||
case mod:
|
|
||||||
fprintf(out, "CONFIG_%s=m\n", sym->name);
|
|
||||||
break;
|
|
||||||
case yes:
|
|
||||||
fprintf(out, "CONFIG_%s=y\n", sym->name);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case S_STRING:
|
|
||||||
str = sym_get_string_value(sym);
|
|
||||||
fprintf(out, "CONFIG_%s=\"", sym->name);
|
|
||||||
while (1) {
|
|
||||||
l = strcspn(str, "\"\\");
|
|
||||||
if (l) {
|
|
||||||
fwrite(str, l, 1, out);
|
|
||||||
str += l;
|
|
||||||
}
|
|
||||||
if (!*str)
|
|
||||||
break;
|
|
||||||
fprintf(out, "\\%c", *str++);
|
|
||||||
}
|
|
||||||
fputs("\"\n", out);
|
|
||||||
break;
|
|
||||||
case S_HEX:
|
|
||||||
str = sym_get_string_value(sym);
|
|
||||||
if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
|
|
||||||
fprintf(out, "CONFIG_%s=%s\n", sym->name, str);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case S_INT:
|
|
||||||
str = sym_get_string_value(sym);
|
|
||||||
fprintf(out, "CONFIG_%s=%s\n", sym->name, str);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
next:
|
next:
|
||||||
|
@ -548,17 +657,16 @@ int conf_write(const char *name)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int conf_split_config(void)
|
static int conf_split_config(void)
|
||||||
{
|
{
|
||||||
char *name, path[128];
|
const char *name;
|
||||||
|
char path[128];
|
||||||
char *s, *d, c;
|
char *s, *d, c;
|
||||||
struct symbol *sym;
|
struct symbol *sym;
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
int res, i, fd;
|
int res, i, fd;
|
||||||
|
|
||||||
name = getenv("KCONFIG_AUTOCONFIG");
|
name = conf_get_autoconfig_name();
|
||||||
if (!name)
|
|
||||||
name = "include/config/auto.conf";
|
|
||||||
conf_read_simple(name, S_DEF_AUTO);
|
conf_read_simple(name, S_DEF_AUTO);
|
||||||
|
|
||||||
if (chdir("include/config"))
|
if (chdir("include/config"))
|
||||||
|
@ -665,10 +773,10 @@ int conf_write_autoconf(void)
|
||||||
{
|
{
|
||||||
struct symbol *sym;
|
struct symbol *sym;
|
||||||
const char *str;
|
const char *str;
|
||||||
char *name;
|
const char *name;
|
||||||
FILE *out, *out_h;
|
FILE *out, *tristate, *out_h;
|
||||||
time_t now;
|
time_t now;
|
||||||
int i, l;
|
int i;
|
||||||
|
|
||||||
sym_clear_all_valid();
|
sym_clear_all_valid();
|
||||||
|
|
||||||
|
@ -681,9 +789,16 @@ int conf_write_autoconf(void)
|
||||||
if (!out)
|
if (!out)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
tristate = fopen(".tmpconfig_tristate", "w");
|
||||||
|
if (!tristate) {
|
||||||
|
fclose(out);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
out_h = fopen(".tmpconfig.h", "w");
|
out_h = fopen(".tmpconfig.h", "w");
|
||||||
if (!out_h) {
|
if (!out_h) {
|
||||||
fclose(out);
|
fclose(out);
|
||||||
|
fclose(tristate);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -692,13 +807,16 @@ int conf_write_autoconf(void)
|
||||||
time(&now);
|
time(&now);
|
||||||
fprintf(out, "#\n"
|
fprintf(out, "#\n"
|
||||||
"# Automatically generated make config: don't edit\n"
|
"# Automatically generated make config: don't edit\n"
|
||||||
"# barebox version: %s\n"
|
"# Linux barebox version: %s\n"
|
||||||
"# %s"
|
"# %s"
|
||||||
"#\n",
|
"#\n",
|
||||||
sym_get_string_value(sym), ctime(&now));
|
sym_get_string_value(sym), ctime(&now));
|
||||||
|
fprintf(tristate, "#\n"
|
||||||
|
"# Automatically generated - do not edit\n"
|
||||||
|
"\n");
|
||||||
fprintf(out_h, "/*\n"
|
fprintf(out_h, "/*\n"
|
||||||
" * Automatically generated C config: don't edit\n"
|
" * Automatically generated C config: don't edit\n"
|
||||||
" * barebox version: %s\n"
|
" * Linux barebox version: %s\n"
|
||||||
" * %s"
|
" * %s"
|
||||||
" */\n"
|
" */\n"
|
||||||
"#define AUTOCONF_INCLUDED\n",
|
"#define AUTOCONF_INCLUDED\n",
|
||||||
|
@ -708,6 +826,11 @@ int conf_write_autoconf(void)
|
||||||
sym_calc_value(sym);
|
sym_calc_value(sym);
|
||||||
if (!(sym->flags & SYMBOL_WRITE) || !sym->name)
|
if (!(sym->flags & SYMBOL_WRITE) || !sym->name)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
/* write symbol to config file */
|
||||||
|
conf_write_symbol(sym, sym->type, out, false);
|
||||||
|
|
||||||
|
/* update autoconf and tristate files */
|
||||||
switch (sym->type) {
|
switch (sym->type) {
|
||||||
case S_BOOLEAN:
|
case S_BOOLEAN:
|
||||||
case S_TRISTATE:
|
case S_TRISTATE:
|
||||||
|
@ -715,45 +838,28 @@ int conf_write_autoconf(void)
|
||||||
case no:
|
case no:
|
||||||
break;
|
break;
|
||||||
case mod:
|
case mod:
|
||||||
fprintf(out, "CONFIG_%s=m\n", sym->name);
|
fprintf(tristate, "CONFIG_%s=M\n", sym->name);
|
||||||
fprintf(out_h, "#define CONFIG_%s_MODULE 1\n", sym->name);
|
fprintf(out_h, "#define CONFIG_%s_MODULE 1\n", sym->name);
|
||||||
break;
|
break;
|
||||||
case yes:
|
case yes:
|
||||||
fprintf(out, "CONFIG_%s=y\n", sym->name);
|
if (sym->type == S_TRISTATE)
|
||||||
|
fprintf(tristate, "CONFIG_%s=Y\n",
|
||||||
|
sym->name);
|
||||||
fprintf(out_h, "#define CONFIG_%s 1\n", sym->name);
|
fprintf(out_h, "#define CONFIG_%s 1\n", sym->name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case S_STRING:
|
case S_STRING:
|
||||||
str = sym_get_string_value(sym);
|
conf_write_string(true, sym->name, sym_get_string_value(sym), out_h);
|
||||||
fprintf(out, "CONFIG_%s=\"", sym->name);
|
|
||||||
fprintf(out_h, "#define CONFIG_%s \"", sym->name);
|
|
||||||
while (1) {
|
|
||||||
l = strcspn(str, "\"\\");
|
|
||||||
if (l) {
|
|
||||||
fwrite(str, l, 1, out);
|
|
||||||
fwrite(str, l, 1, out_h);
|
|
||||||
str += l;
|
|
||||||
}
|
|
||||||
if (!*str)
|
|
||||||
break;
|
|
||||||
fprintf(out, "\\%c", *str);
|
|
||||||
fprintf(out_h, "\\%c", *str);
|
|
||||||
str++;
|
|
||||||
}
|
|
||||||
fputs("\"\n", out);
|
|
||||||
fputs("\"\n", out_h);
|
|
||||||
break;
|
break;
|
||||||
case S_HEX:
|
case S_HEX:
|
||||||
str = sym_get_string_value(sym);
|
str = sym_get_string_value(sym);
|
||||||
if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
|
if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
|
||||||
fprintf(out, "CONFIG_%s=%s\n", sym->name, str);
|
|
||||||
fprintf(out_h, "#define CONFIG_%s 0x%s\n", sym->name, str);
|
fprintf(out_h, "#define CONFIG_%s 0x%s\n", sym->name, str);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case S_INT:
|
case S_INT:
|
||||||
str = sym_get_string_value(sym);
|
str = sym_get_string_value(sym);
|
||||||
fprintf(out, "CONFIG_%s=%s\n", sym->name, str);
|
|
||||||
fprintf(out_h, "#define CONFIG_%s %s\n", sym->name, str);
|
fprintf(out_h, "#define CONFIG_%s %s\n", sym->name, str);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -761,16 +867,20 @@ int conf_write_autoconf(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fclose(out);
|
fclose(out);
|
||||||
|
fclose(tristate);
|
||||||
fclose(out_h);
|
fclose(out_h);
|
||||||
|
|
||||||
name = getenv("KCONFIG_AUTOHEADER");
|
name = getenv("KCONFIG_AUTOHEADER");
|
||||||
if (!name)
|
if (!name)
|
||||||
name = "include/linux/autoconf.h";
|
name = "include/generated/autoconf.h";
|
||||||
if (rename(".tmpconfig.h", name))
|
if (rename(".tmpconfig.h", name))
|
||||||
return 1;
|
return 1;
|
||||||
name = getenv("KCONFIG_AUTOCONFIG");
|
name = getenv("KCONFIG_TRISTATE");
|
||||||
if (!name)
|
if (!name)
|
||||||
name = "include/config/auto.conf";
|
name = "include/config/tristate.conf";
|
||||||
|
if (rename(".tmpconfig_tristate", name))
|
||||||
|
return 1;
|
||||||
|
name = conf_get_autoconfig_name();
|
||||||
/*
|
/*
|
||||||
* This must be the last step, kbuild has a dependency on auto.conf
|
* This must be the last step, kbuild has a dependency on auto.conf
|
||||||
* and this marks the successful completion of the previous steps.
|
* and this marks the successful completion of the previous steps.
|
||||||
|
@ -807,3 +917,126 @@ void conf_set_changed_callback(void (*fn)(void))
|
||||||
{
|
{
|
||||||
conf_changed_callback = fn;
|
conf_changed_callback = fn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void 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 slected
|
||||||
|
* and if no then no-one.
|
||||||
|
* In both cases stop.
|
||||||
|
*/
|
||||||
|
if (csym->curr.tri != yes)
|
||||||
|
return;
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
csym->flags |= SYMBOL_DEF_USER;
|
||||||
|
/* clear VALID to get value calculated */
|
||||||
|
csym->flags &= ~(SYMBOL_VALID);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void set_all_choice_values(struct symbol *csym)
|
||||||
|
{
|
||||||
|
struct property *prop;
|
||||||
|
struct symbol *sym;
|
||||||
|
struct expr *e;
|
||||||
|
|
||||||
|
prop = sym_get_choice_prop(csym);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set all non-assinged choice values to no
|
||||||
|
*/
|
||||||
|
expr_list_for_each_sym(prop->expr, e, sym) {
|
||||||
|
if (!sym_has_value(sym))
|
||||||
|
sym->def[S_DEF_USER].tri = no;
|
||||||
|
}
|
||||||
|
csym->flags |= SYMBOL_DEF_USER;
|
||||||
|
/* clear VALID to get value calculated */
|
||||||
|
csym->flags &= ~(SYMBOL_VALID);
|
||||||
|
}
|
||||||
|
|
||||||
|
void conf_set_all_new_symbols(enum conf_def_mode mode)
|
||||||
|
{
|
||||||
|
struct symbol *sym, *csym;
|
||||||
|
int i, cnt;
|
||||||
|
|
||||||
|
for_all_symbols(i, sym) {
|
||||||
|
if (sym_has_value(sym))
|
||||||
|
continue;
|
||||||
|
switch (sym_get_type(sym)) {
|
||||||
|
case S_BOOLEAN:
|
||||||
|
case S_TRISTATE:
|
||||||
|
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:
|
||||||
|
cnt = sym_get_type(sym) == S_TRISTATE ? 3 : 2;
|
||||||
|
sym->def[S_DEF_USER].tri = (tristate)(rand() % cnt);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!(sym_is_choice(sym) && mode == def_random))
|
||||||
|
sym->flags |= SYMBOL_DEF_USER;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sym_clear_all_valid();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We have different type of choice blocks.
|
||||||
|
* If curr.tri equal to mod then we can select several
|
||||||
|
* choice symbols in one block.
|
||||||
|
* In this case we do nothing.
|
||||||
|
* If curr.tri equal yes then only one symbol can be
|
||||||
|
* selected in a choice block and we set it to yes,
|
||||||
|
* and the rest to no.
|
||||||
|
*/
|
||||||
|
for_all_symbols(i, csym) {
|
||||||
|
if (sym_has_value(csym) || !sym_is_choice(csym))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
sym_calc_value(csym);
|
||||||
|
if (mode == def_random)
|
||||||
|
randomize_choice_values(csym);
|
||||||
|
else
|
||||||
|
set_all_choice_values(csym);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -87,7 +87,7 @@ struct expr *expr_copy(struct expr *org)
|
||||||
break;
|
break;
|
||||||
case E_AND:
|
case E_AND:
|
||||||
case E_OR:
|
case E_OR:
|
||||||
case E_CHOICE:
|
case E_LIST:
|
||||||
e->left.expr = expr_copy(org->left.expr);
|
e->left.expr = expr_copy(org->left.expr);
|
||||||
e->right.expr = expr_copy(org->right.expr);
|
e->right.expr = expr_copy(org->right.expr);
|
||||||
break;
|
break;
|
||||||
|
@ -217,7 +217,7 @@ int expr_eq(struct expr *e1, struct expr *e2)
|
||||||
expr_free(e2);
|
expr_free(e2);
|
||||||
trans_count = old_count;
|
trans_count = old_count;
|
||||||
return res;
|
return res;
|
||||||
case E_CHOICE:
|
case E_LIST:
|
||||||
case E_RANGE:
|
case E_RANGE:
|
||||||
case E_NONE:
|
case E_NONE:
|
||||||
/* panic */;
|
/* panic */;
|
||||||
|
@ -348,7 +348,7 @@ struct expr *expr_trans_bool(struct expr *e)
|
||||||
/*
|
/*
|
||||||
* e1 || e2 -> ?
|
* e1 || e2 -> ?
|
||||||
*/
|
*/
|
||||||
struct expr *expr_join_or(struct expr *e1, struct expr *e2)
|
static struct expr *expr_join_or(struct expr *e1, struct expr *e2)
|
||||||
{
|
{
|
||||||
struct expr *tmp;
|
struct expr *tmp;
|
||||||
struct symbol *sym1, *sym2;
|
struct symbol *sym1, *sym2;
|
||||||
|
@ -412,7 +412,7 @@ struct expr *expr_join_or(struct expr *e1, struct expr *e2)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct expr *expr_join_and(struct expr *e1, struct expr *e2)
|
static struct expr *expr_join_and(struct expr *e1, struct expr *e2)
|
||||||
{
|
{
|
||||||
struct expr *tmp;
|
struct expr *tmp;
|
||||||
struct symbol *sym1, *sym2;
|
struct symbol *sym1, *sym2;
|
||||||
|
@ -648,7 +648,7 @@ struct expr *expr_transform(struct expr *e)
|
||||||
case E_EQUAL:
|
case E_EQUAL:
|
||||||
case E_UNEQUAL:
|
case E_UNEQUAL:
|
||||||
case E_SYMBOL:
|
case E_SYMBOL:
|
||||||
case E_CHOICE:
|
case E_LIST:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
e->left.expr = expr_transform(e->left.expr);
|
e->left.expr = expr_transform(e->left.expr);
|
||||||
|
@ -932,7 +932,7 @@ struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symb
|
||||||
break;
|
break;
|
||||||
case E_SYMBOL:
|
case E_SYMBOL:
|
||||||
return expr_alloc_comp(type, e->left.sym, sym);
|
return expr_alloc_comp(type, e->left.sym, sym);
|
||||||
case E_CHOICE:
|
case E_LIST:
|
||||||
case E_RANGE:
|
case E_RANGE:
|
||||||
case E_NONE:
|
case E_NONE:
|
||||||
/* panic */;
|
/* panic */;
|
||||||
|
@ -955,14 +955,14 @@ tristate expr_calc_value(struct expr *e)
|
||||||
case E_AND:
|
case E_AND:
|
||||||
val1 = expr_calc_value(e->left.expr);
|
val1 = expr_calc_value(e->left.expr);
|
||||||
val2 = expr_calc_value(e->right.expr);
|
val2 = expr_calc_value(e->right.expr);
|
||||||
return E_AND(val1, val2);
|
return EXPR_AND(val1, val2);
|
||||||
case E_OR:
|
case E_OR:
|
||||||
val1 = expr_calc_value(e->left.expr);
|
val1 = expr_calc_value(e->left.expr);
|
||||||
val2 = expr_calc_value(e->right.expr);
|
val2 = expr_calc_value(e->right.expr);
|
||||||
return E_OR(val1, val2);
|
return EXPR_OR(val1, val2);
|
||||||
case E_NOT:
|
case E_NOT:
|
||||||
val1 = expr_calc_value(e->left.expr);
|
val1 = expr_calc_value(e->left.expr);
|
||||||
return E_NOT(val1);
|
return EXPR_NOT(val1);
|
||||||
case E_EQUAL:
|
case E_EQUAL:
|
||||||
sym_calc_value(e->left.sym);
|
sym_calc_value(e->left.sym);
|
||||||
sym_calc_value(e->right.sym);
|
sym_calc_value(e->right.sym);
|
||||||
|
@ -1000,9 +1000,9 @@ int expr_compare_type(enum expr_type t1, enum expr_type t2)
|
||||||
if (t2 == E_OR)
|
if (t2 == E_OR)
|
||||||
return 1;
|
return 1;
|
||||||
case E_OR:
|
case E_OR:
|
||||||
if (t2 == E_CHOICE)
|
if (t2 == E_LIST)
|
||||||
return 1;
|
return 1;
|
||||||
case E_CHOICE:
|
case E_LIST:
|
||||||
if (t2 == 0)
|
if (t2 == 0)
|
||||||
return 1;
|
return 1;
|
||||||
default:
|
default:
|
||||||
|
@ -1034,12 +1034,18 @@ void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *
|
||||||
expr_print(e->left.expr, fn, data, E_NOT);
|
expr_print(e->left.expr, fn, data, E_NOT);
|
||||||
break;
|
break;
|
||||||
case E_EQUAL:
|
case E_EQUAL:
|
||||||
|
if (e->left.sym->name)
|
||||||
fn(data, e->left.sym, e->left.sym->name);
|
fn(data, e->left.sym, e->left.sym->name);
|
||||||
|
else
|
||||||
|
fn(data, NULL, "<choice>");
|
||||||
fn(data, NULL, "=");
|
fn(data, NULL, "=");
|
||||||
fn(data, e->right.sym, e->right.sym->name);
|
fn(data, e->right.sym, e->right.sym->name);
|
||||||
break;
|
break;
|
||||||
case E_UNEQUAL:
|
case E_UNEQUAL:
|
||||||
|
if (e->left.sym->name)
|
||||||
fn(data, e->left.sym, e->left.sym->name);
|
fn(data, e->left.sym, e->left.sym->name);
|
||||||
|
else
|
||||||
|
fn(data, NULL, "<choice>");
|
||||||
fn(data, NULL, "!=");
|
fn(data, NULL, "!=");
|
||||||
fn(data, e->right.sym, e->right.sym->name);
|
fn(data, e->right.sym, e->right.sym->name);
|
||||||
break;
|
break;
|
||||||
|
@ -1053,11 +1059,11 @@ void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *
|
||||||
fn(data, NULL, " && ");
|
fn(data, NULL, " && ");
|
||||||
expr_print(e->right.expr, fn, data, E_AND);
|
expr_print(e->right.expr, fn, data, E_AND);
|
||||||
break;
|
break;
|
||||||
case E_CHOICE:
|
case E_LIST:
|
||||||
fn(data, e->right.sym, e->right.sym->name);
|
fn(data, e->right.sym, e->right.sym->name);
|
||||||
if (e->left.expr) {
|
if (e->left.expr) {
|
||||||
fn(data, NULL, " ^ ");
|
fn(data, NULL, " ^ ");
|
||||||
expr_print(e->left.expr, fn, data, E_CHOICE);
|
expr_print(e->left.expr, fn, data, E_LIST);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case E_RANGE:
|
case E_RANGE:
|
||||||
|
@ -1081,7 +1087,7 @@ void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *
|
||||||
|
|
||||||
static void expr_print_file_helper(void *data, struct symbol *sym, const char *str)
|
static void expr_print_file_helper(void *data, struct symbol *sym, const char *str)
|
||||||
{
|
{
|
||||||
fwrite(str, strlen(str), 1, data);
|
xfwrite(str, strlen(str), 1, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void expr_fprint(struct expr *e, FILE *out)
|
void expr_fprint(struct expr *e, FILE *out)
|
||||||
|
@ -1091,7 +1097,32 @@ void expr_fprint(struct expr *e, FILE *out)
|
||||||
|
|
||||||
static void expr_print_gstr_helper(void *data, struct symbol *sym, const char *str)
|
static void expr_print_gstr_helper(void *data, struct symbol *sym, const char *str)
|
||||||
{
|
{
|
||||||
str_append((struct gstr*)data, str);
|
struct gstr *gs = (struct gstr*)data;
|
||||||
|
const char *sym_str = NULL;
|
||||||
|
|
||||||
|
if (sym)
|
||||||
|
sym_str = sym_get_string_value(sym);
|
||||||
|
|
||||||
|
if (gs->max_width) {
|
||||||
|
unsigned extra_length = strlen(str);
|
||||||
|
const char *last_cr = strrchr(gs->s, '\n');
|
||||||
|
unsigned last_line_length;
|
||||||
|
|
||||||
|
if (sym_str)
|
||||||
|
extra_length += 4 + strlen(sym_str);
|
||||||
|
|
||||||
|
if (!last_cr)
|
||||||
|
last_cr = gs->s;
|
||||||
|
|
||||||
|
last_line_length = strlen(gs->s) - (last_cr - gs->s);
|
||||||
|
|
||||||
|
if ((last_line_length + extra_length) > gs->max_width)
|
||||||
|
str_append(gs, "\\\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
str_append(gs, str);
|
||||||
|
if (sym && sym->type != S_UNKNOWN)
|
||||||
|
str_printf(gs, " [=%s]", sym_str);
|
||||||
}
|
}
|
||||||
|
|
||||||
void expr_gstr_print(struct expr *e, struct gstr *gs)
|
void expr_gstr_print(struct expr *e, struct gstr *gs)
|
||||||
|
|
|
@ -25,14 +25,13 @@ struct file {
|
||||||
|
|
||||||
#define FILE_BUSY 0x0001
|
#define FILE_BUSY 0x0001
|
||||||
#define FILE_SCANNED 0x0002
|
#define FILE_SCANNED 0x0002
|
||||||
#define FILE_PRINTED 0x0004
|
|
||||||
|
|
||||||
typedef enum tristate {
|
typedef enum tristate {
|
||||||
no, mod, yes
|
no, mod, yes
|
||||||
} tristate;
|
} tristate;
|
||||||
|
|
||||||
enum expr_type {
|
enum expr_type {
|
||||||
E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_CHOICE, E_SYMBOL, E_RANGE
|
E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_LIST, E_SYMBOL, E_RANGE
|
||||||
};
|
};
|
||||||
|
|
||||||
union expr_data {
|
union expr_data {
|
||||||
|
@ -45,9 +44,12 @@ struct expr {
|
||||||
union expr_data left, right;
|
union expr_data left, right;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define E_OR(dep1, dep2) (((dep1)>(dep2))?(dep1):(dep2))
|
#define EXPR_OR(dep1, dep2) (((dep1)>(dep2))?(dep1):(dep2))
|
||||||
#define E_AND(dep1, dep2) (((dep1)<(dep2))?(dep1):(dep2))
|
#define EXPR_AND(dep1, dep2) (((dep1)<(dep2))?(dep1):(dep2))
|
||||||
#define E_NOT(dep) (2-(dep))
|
#define EXPR_NOT(dep) (2-(dep))
|
||||||
|
|
||||||
|
#define expr_list_for_each_sym(l, e, s) \
|
||||||
|
for (e = (l); e && (s = e->right.sym); e = e->left.expr)
|
||||||
|
|
||||||
struct expr_value {
|
struct expr_value {
|
||||||
struct expr *expr;
|
struct expr *expr;
|
||||||
|
@ -63,9 +65,13 @@ enum symbol_type {
|
||||||
S_UNKNOWN, S_BOOLEAN, S_TRISTATE, S_INT, S_HEX, S_STRING, S_OTHER
|
S_UNKNOWN, S_BOOLEAN, S_TRISTATE, S_INT, S_HEX, S_STRING, S_OTHER
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* enum values are used as index to symbol.def[] */
|
||||||
enum {
|
enum {
|
||||||
S_DEF_USER, /* main user value */
|
S_DEF_USER, /* main user value */
|
||||||
S_DEF_AUTO,
|
S_DEF_AUTO, /* values read from auto.conf */
|
||||||
|
S_DEF_DEF3, /* Reserved for UI usage */
|
||||||
|
S_DEF_DEF4, /* Reserved for UI usage */
|
||||||
|
S_DEF_COUNT
|
||||||
};
|
};
|
||||||
|
|
||||||
struct symbol {
|
struct symbol {
|
||||||
|
@ -73,51 +79,74 @@ struct symbol {
|
||||||
char *name;
|
char *name;
|
||||||
enum symbol_type type;
|
enum symbol_type type;
|
||||||
struct symbol_value curr;
|
struct symbol_value curr;
|
||||||
struct symbol_value def[4];
|
struct symbol_value def[S_DEF_COUNT];
|
||||||
tristate visible;
|
tristate visible;
|
||||||
int flags;
|
int flags;
|
||||||
struct property *prop;
|
struct property *prop;
|
||||||
|
struct expr_value dir_dep;
|
||||||
struct expr_value rev_dep;
|
struct expr_value rev_dep;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define for_all_symbols(i, sym) for (i = 0; i < 257; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER)
|
#define for_all_symbols(i, sym) for (i = 0; i < SYMBOL_HASHSIZE; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER)
|
||||||
|
|
||||||
#define SYMBOL_CONST 0x0001
|
#define SYMBOL_CONST 0x0001 /* symbol is const */
|
||||||
#define SYMBOL_CHECK 0x0008
|
#define SYMBOL_CHECK 0x0008 /* used during dependency checking */
|
||||||
#define SYMBOL_CHOICE 0x0010
|
#define SYMBOL_CHOICE 0x0010 /* start of a choice block (null name) */
|
||||||
#define SYMBOL_CHOICEVAL 0x0020
|
#define SYMBOL_CHOICEVAL 0x0020 /* used as a value in a choice block */
|
||||||
#define SYMBOL_PRINTED 0x0040
|
#define SYMBOL_VALID 0x0080 /* set when symbol.curr is calculated */
|
||||||
#define SYMBOL_VALID 0x0080
|
#define SYMBOL_OPTIONAL 0x0100 /* choice is optional - values can be 'n' */
|
||||||
#define SYMBOL_OPTIONAL 0x0100
|
#define SYMBOL_WRITE 0x0200 /* ? */
|
||||||
#define SYMBOL_WRITE 0x0200
|
#define SYMBOL_CHANGED 0x0400 /* ? */
|
||||||
#define SYMBOL_CHANGED 0x0400
|
#define SYMBOL_AUTO 0x1000 /* value from environment variable */
|
||||||
#define SYMBOL_AUTO 0x1000
|
#define SYMBOL_CHECKED 0x2000 /* used during dependency checking */
|
||||||
#define SYMBOL_CHECKED 0x2000
|
#define SYMBOL_WARNED 0x8000 /* warning has been issued */
|
||||||
#define SYMBOL_WARNED 0x8000
|
|
||||||
#define SYMBOL_DEF 0x10000
|
/* Set when symbol.def[] is used */
|
||||||
#define SYMBOL_DEF_USER 0x10000
|
#define SYMBOL_DEF 0x10000 /* First bit of SYMBOL_DEF */
|
||||||
#define SYMBOL_DEF_AUTO 0x20000
|
#define SYMBOL_DEF_USER 0x10000 /* symbol.def[S_DEF_USER] is valid */
|
||||||
#define SYMBOL_DEF3 0x40000
|
#define SYMBOL_DEF_AUTO 0x20000 /* symbol.def[S_DEF_AUTO] is valid */
|
||||||
#define SYMBOL_DEF4 0x80000
|
#define SYMBOL_DEF3 0x40000 /* symbol.def[S_DEF_3] is valid */
|
||||||
|
#define SYMBOL_DEF4 0x80000 /* symbol.def[S_DEF_4] is valid */
|
||||||
|
|
||||||
#define SYMBOL_MAXLENGTH 256
|
#define SYMBOL_MAXLENGTH 256
|
||||||
#define SYMBOL_HASHSIZE 257
|
#define SYMBOL_HASHSIZE 9973
|
||||||
#define SYMBOL_HASHMASK 0xff
|
|
||||||
|
|
||||||
|
/* A property represent the config options that can be associated
|
||||||
|
* with a config "symbol".
|
||||||
|
* Sample:
|
||||||
|
* config FOO
|
||||||
|
* default y
|
||||||
|
* prompt "foo prompt"
|
||||||
|
* select BAR
|
||||||
|
* config BAZ
|
||||||
|
* int "BAZ Value"
|
||||||
|
* range 1..255
|
||||||
|
*/
|
||||||
enum prop_type {
|
enum prop_type {
|
||||||
P_UNKNOWN, P_PROMPT, P_COMMENT, P_MENU, P_DEFAULT, P_CHOICE, P_SELECT, P_RANGE
|
P_UNKNOWN,
|
||||||
|
P_PROMPT, /* prompt "foo prompt" or "BAZ Value" */
|
||||||
|
P_COMMENT, /* text associated with a comment */
|
||||||
|
P_MENU, /* prompt associated with a menuconfig option */
|
||||||
|
P_DEFAULT, /* default y */
|
||||||
|
P_CHOICE, /* choice value */
|
||||||
|
P_SELECT, /* select BAR */
|
||||||
|
P_RANGE, /* range 7..100 (for a symbol) */
|
||||||
|
P_ENV, /* value from environment variable */
|
||||||
|
P_SYMBOL, /* where a symbol is defined */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct property {
|
struct property {
|
||||||
struct property *next;
|
struct property *next; /* next property - null if last */
|
||||||
struct symbol *sym;
|
struct symbol *sym; /* the symbol for which the property is associated */
|
||||||
enum prop_type type;
|
enum prop_type type; /* type of property */
|
||||||
const char *text;
|
const char *text; /* the prompt value - P_PROMPT, P_MENU, P_COMMENT */
|
||||||
struct expr_value visible;
|
struct expr_value visible;
|
||||||
struct expr *expr;
|
struct expr *expr; /* the optional conditional part of the property */
|
||||||
struct menu *menu;
|
struct menu *menu; /* the menu the property are associated with
|
||||||
struct file *file;
|
* valid for: P_SELECT, P_RANGE, P_CHOICE,
|
||||||
int lineno;
|
* P_PROMPT, P_DEFAULT, P_MENU, P_COMMENT */
|
||||||
|
struct file *file; /* what file was this property defined */
|
||||||
|
int lineno; /* what lineno was this property defined */
|
||||||
};
|
};
|
||||||
|
|
||||||
#define for_all_properties(sym, st, tok) \
|
#define for_all_properties(sym, st, tok) \
|
||||||
|
@ -136,6 +165,7 @@ struct menu {
|
||||||
struct symbol *sym;
|
struct symbol *sym;
|
||||||
struct property *prompt;
|
struct property *prompt;
|
||||||
struct expr *dep;
|
struct expr *dep;
|
||||||
|
struct expr *dir_dep;
|
||||||
unsigned int flags;
|
unsigned int flags;
|
||||||
char *help;
|
char *help;
|
||||||
struct file *file;
|
struct file *file;
|
||||||
|
|
|
@ -30,13 +30,16 @@ enum {
|
||||||
SINGLE_VIEW, SPLIT_VIEW, FULL_VIEW
|
SINGLE_VIEW, SPLIT_VIEW, FULL_VIEW
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
OPT_NORMAL, OPT_ALL, OPT_PROMPT
|
||||||
|
};
|
||||||
|
|
||||||
static gint view_mode = FULL_VIEW;
|
static gint view_mode = FULL_VIEW;
|
||||||
static gboolean show_name = TRUE;
|
static gboolean show_name = TRUE;
|
||||||
static gboolean show_range = TRUE;
|
static gboolean show_range = TRUE;
|
||||||
static gboolean show_value = TRUE;
|
static gboolean show_value = TRUE;
|
||||||
static gboolean show_all = FALSE;
|
|
||||||
static gboolean show_debug = FALSE;
|
|
||||||
static gboolean resizeable = FALSE;
|
static gboolean resizeable = FALSE;
|
||||||
|
static int opt_mode = OPT_NORMAL;
|
||||||
|
|
||||||
GtkWidget *main_wnd = NULL;
|
GtkWidget *main_wnd = NULL;
|
||||||
GtkWidget *tree1_w = NULL; // left frame
|
GtkWidget *tree1_w = NULL; // left frame
|
||||||
|
@ -76,36 +79,7 @@ static void conf_changed(void);
|
||||||
|
|
||||||
/* Helping/Debugging Functions */
|
/* Helping/Debugging Functions */
|
||||||
|
|
||||||
|
const char *dbg_sym_flags(int val)
|
||||||
const char *dbg_print_stype(int val)
|
|
||||||
{
|
|
||||||
static char buf[256];
|
|
||||||
|
|
||||||
bzero(buf, 256);
|
|
||||||
|
|
||||||
if (val == S_UNKNOWN)
|
|
||||||
strcpy(buf, "unknown");
|
|
||||||
if (val == S_BOOLEAN)
|
|
||||||
strcpy(buf, "boolean");
|
|
||||||
if (val == S_TRISTATE)
|
|
||||||
strcpy(buf, "tristate");
|
|
||||||
if (val == S_INT)
|
|
||||||
strcpy(buf, "int");
|
|
||||||
if (val == S_HEX)
|
|
||||||
strcpy(buf, "hex");
|
|
||||||
if (val == S_STRING)
|
|
||||||
strcpy(buf, "string");
|
|
||||||
if (val == S_OTHER)
|
|
||||||
strcpy(buf, "other");
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("%s", buf);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *dbg_print_flags(int val)
|
|
||||||
{
|
{
|
||||||
static char buf[256];
|
static char buf[256];
|
||||||
|
|
||||||
|
@ -119,8 +93,6 @@ const char *dbg_print_flags(int val)
|
||||||
strcat(buf, "choice/");
|
strcat(buf, "choice/");
|
||||||
if (val & SYMBOL_CHOICEVAL)
|
if (val & SYMBOL_CHOICEVAL)
|
||||||
strcat(buf, "choiceval/");
|
strcat(buf, "choiceval/");
|
||||||
if (val & SYMBOL_PRINTED)
|
|
||||||
strcat(buf, "printed/");
|
|
||||||
if (val & SYMBOL_VALID)
|
if (val & SYMBOL_VALID)
|
||||||
strcat(buf, "valid/");
|
strcat(buf, "valid/");
|
||||||
if (val & SYMBOL_OPTIONAL)
|
if (val & SYMBOL_OPTIONAL)
|
||||||
|
@ -133,40 +105,10 @@ const char *dbg_print_flags(int val)
|
||||||
strcat(buf, "auto/");
|
strcat(buf, "auto/");
|
||||||
|
|
||||||
buf[strlen(buf) - 1] = '\0';
|
buf[strlen(buf) - 1] = '\0';
|
||||||
#ifdef DEBUG
|
|
||||||
printf("%s", buf);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *dbg_print_ptype(int val)
|
|
||||||
{
|
|
||||||
static char buf[256];
|
|
||||||
|
|
||||||
bzero(buf, 256);
|
|
||||||
|
|
||||||
if (val == P_UNKNOWN)
|
|
||||||
strcpy(buf, "unknown");
|
|
||||||
if (val == P_PROMPT)
|
|
||||||
strcpy(buf, "prompt");
|
|
||||||
if (val == P_COMMENT)
|
|
||||||
strcpy(buf, "comment");
|
|
||||||
if (val == P_MENU)
|
|
||||||
strcpy(buf, "menu");
|
|
||||||
if (val == P_DEFAULT)
|
|
||||||
strcpy(buf, "default");
|
|
||||||
if (val == P_CHOICE)
|
|
||||||
strcpy(buf, "choice");
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("%s", buf);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void replace_button_icon(GladeXML * xml, GdkDrawable * window,
|
void replace_button_icon(GladeXML * xml, GdkDrawable * window,
|
||||||
GtkStyle * style, gchar * btn_name, gchar ** xpm)
|
GtkStyle * style, gchar * btn_name, gchar ** xpm)
|
||||||
{
|
{
|
||||||
|
@ -268,7 +210,7 @@ void init_main_window(const gchar * glade_file)
|
||||||
/*"style", PANGO_STYLE_OBLIQUE, */
|
/*"style", PANGO_STYLE_OBLIQUE, */
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
sprintf(title, _("Linux Kernel v%s Configuration"),
|
sprintf(title, _("Barebox v%s Configuration"),
|
||||||
getenv("KERNELVERSION"));
|
getenv("KERNELVERSION"));
|
||||||
gtk_window_set_title(GTK_WINDOW(main_wnd), title);
|
gtk_window_set_title(GTK_WINDOW(main_wnd), title);
|
||||||
|
|
||||||
|
@ -457,16 +399,10 @@ static void text_insert_help(struct menu *menu)
|
||||||
{
|
{
|
||||||
GtkTextBuffer *buffer;
|
GtkTextBuffer *buffer;
|
||||||
GtkTextIter start, end;
|
GtkTextIter start, end;
|
||||||
const char *prompt = menu_get_prompt(menu);
|
const char *prompt = _(menu_get_prompt(menu));
|
||||||
gchar *name;
|
struct gstr help = str_new();
|
||||||
const char *help;
|
|
||||||
|
|
||||||
help = _(menu_get_help(menu));
|
menu_get_ext_help(menu, &help);
|
||||||
|
|
||||||
if (menu->sym && menu->sym->name)
|
|
||||||
name = g_strdup_printf(_(menu->sym->name));
|
|
||||||
else
|
|
||||||
name = g_strdup("");
|
|
||||||
|
|
||||||
buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_w));
|
buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_w));
|
||||||
gtk_text_buffer_get_bounds(buffer, &start, &end);
|
gtk_text_buffer_get_bounds(buffer, &start, &end);
|
||||||
|
@ -476,14 +412,11 @@ static void text_insert_help(struct menu *menu)
|
||||||
gtk_text_buffer_get_end_iter(buffer, &end);
|
gtk_text_buffer_get_end_iter(buffer, &end);
|
||||||
gtk_text_buffer_insert_with_tags(buffer, &end, prompt, -1, tag1,
|
gtk_text_buffer_insert_with_tags(buffer, &end, prompt, -1, tag1,
|
||||||
NULL);
|
NULL);
|
||||||
gtk_text_buffer_insert_at_cursor(buffer, " ", 1);
|
|
||||||
gtk_text_buffer_get_end_iter(buffer, &end);
|
|
||||||
gtk_text_buffer_insert_with_tags(buffer, &end, name, -1, tag1,
|
|
||||||
NULL);
|
|
||||||
gtk_text_buffer_insert_at_cursor(buffer, "\n\n", 2);
|
gtk_text_buffer_insert_at_cursor(buffer, "\n\n", 2);
|
||||||
gtk_text_buffer_get_end_iter(buffer, &end);
|
gtk_text_buffer_get_end_iter(buffer, &end);
|
||||||
gtk_text_buffer_insert_with_tags(buffer, &end, help, -1, tag2,
|
gtk_text_buffer_insert_with_tags(buffer, &end, str_get(&help), -1, tag2,
|
||||||
NULL);
|
NULL);
|
||||||
|
str_free(&help);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -708,20 +641,29 @@ void on_show_data1_activate(GtkMenuItem * menuitem, gpointer user_data)
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
on_show_all_options1_activate(GtkMenuItem * menuitem, gpointer user_data)
|
on_set_option_mode1_activate(GtkMenuItem *menuitem, gpointer user_data)
|
||||||
{
|
{
|
||||||
show_all = GTK_CHECK_MENU_ITEM(menuitem)->active;
|
opt_mode = OPT_NORMAL;
|
||||||
|
|
||||||
gtk_tree_store_clear(tree2);
|
gtk_tree_store_clear(tree2);
|
||||||
display_tree(&rootmenu); // instead of update_tree to speed-up
|
display_tree(&rootmenu); /* instead of update_tree to speed-up */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
on_show_debug_info1_activate(GtkMenuItem * menuitem, gpointer user_data)
|
on_set_option_mode2_activate(GtkMenuItem *menuitem, gpointer user_data)
|
||||||
{
|
{
|
||||||
show_debug = GTK_CHECK_MENU_ITEM(menuitem)->active;
|
opt_mode = OPT_ALL;
|
||||||
update_tree(&rootmenu, NULL);
|
gtk_tree_store_clear(tree2);
|
||||||
|
display_tree(&rootmenu); /* instead of update_tree to speed-up */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
on_set_option_mode3_activate(GtkMenuItem *menuitem, gpointer user_data)
|
||||||
|
{
|
||||||
|
opt_mode = OPT_PROMPT;
|
||||||
|
gtk_tree_store_clear(tree2);
|
||||||
|
display_tree(&rootmenu); /* instead of update_tree to speed-up */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -729,7 +671,7 @@ void on_introduction1_activate(GtkMenuItem * menuitem, gpointer user_data)
|
||||||
{
|
{
|
||||||
GtkWidget *dialog;
|
GtkWidget *dialog;
|
||||||
const gchar *intro_text = _(
|
const gchar *intro_text = _(
|
||||||
"Welcome to gkc, the GTK+ graphical kernel configuration tool\n"
|
"Welcome to gkc, the GTK+ graphical barebox configuration tool\n"
|
||||||
"for Linux.\n"
|
"for Linux.\n"
|
||||||
"For each option, a blank box indicates the feature is disabled, a\n"
|
"For each option, a blank box indicates the feature is disabled, a\n"
|
||||||
"check indicates it is enabled, and a dot indicates that it is to\n"
|
"check indicates it is enabled, and a dot indicates that it is to\n"
|
||||||
|
@ -1171,10 +1113,13 @@ static gchar **fill_row(struct menu *menu)
|
||||||
bzero(row, sizeof(row));
|
bzero(row, sizeof(row));
|
||||||
|
|
||||||
row[COL_OPTION] =
|
row[COL_OPTION] =
|
||||||
g_strdup_printf("%s %s", menu_get_prompt(menu),
|
g_strdup_printf("%s %s", _(menu_get_prompt(menu)),
|
||||||
sym && sym_has_value(sym) ? "(NEW)" : "");
|
sym && !sym_has_value(sym) ? "(NEW)" : "");
|
||||||
|
|
||||||
if (show_all && !menu_is_visible(menu))
|
if (opt_mode == OPT_ALL && !menu_is_visible(menu))
|
||||||
|
row[COL_COLOR] = g_strdup("DarkGray");
|
||||||
|
else if (opt_mode == OPT_PROMPT &&
|
||||||
|
menu_has_prompt(menu) && !menu_is_visible(menu))
|
||||||
row[COL_COLOR] = g_strdup("DarkGray");
|
row[COL_COLOR] = g_strdup("DarkGray");
|
||||||
else
|
else
|
||||||
row[COL_COLOR] = g_strdup("Black");
|
row[COL_COLOR] = g_strdup("Black");
|
||||||
|
@ -1221,7 +1166,7 @@ static gchar **fill_row(struct menu *menu)
|
||||||
|
|
||||||
if (def_menu)
|
if (def_menu)
|
||||||
row[COL_VALUE] =
|
row[COL_VALUE] =
|
||||||
g_strdup(menu_get_prompt(def_menu));
|
g_strdup(_(menu_get_prompt(def_menu)));
|
||||||
}
|
}
|
||||||
if (sym->flags & SYMBOL_CHOICEVAL)
|
if (sym->flags & SYMBOL_CHOICEVAL)
|
||||||
row[COL_BTNRAD] = GINT_TO_POINTER(TRUE);
|
row[COL_BTNRAD] = GINT_TO_POINTER(TRUE);
|
||||||
|
@ -1397,16 +1342,20 @@ static void update_tree(struct menu *src, GtkTreeIter * dst)
|
||||||
menu2 ? menu_get_prompt(menu2) : "nil");
|
menu2 ? menu_get_prompt(menu2) : "nil");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!menu_is_visible(child1) && !show_all) { // remove node
|
if ((opt_mode == OPT_NORMAL && !menu_is_visible(child1)) ||
|
||||||
|
(opt_mode == OPT_PROMPT && !menu_has_prompt(child1)) ||
|
||||||
|
(opt_mode == OPT_ALL && !menu_get_prompt(child1))) {
|
||||||
|
|
||||||
|
/* remove node */
|
||||||
if (gtktree_iter_find_node(dst, menu1) != NULL) {
|
if (gtktree_iter_find_node(dst, menu1) != NULL) {
|
||||||
memcpy(&tmp, child2, sizeof(GtkTreeIter));
|
memcpy(&tmp, child2, sizeof(GtkTreeIter));
|
||||||
valid = gtk_tree_model_iter_next(model2,
|
valid = gtk_tree_model_iter_next(model2,
|
||||||
child2);
|
child2);
|
||||||
gtk_tree_store_remove(tree2, &tmp);
|
gtk_tree_store_remove(tree2, &tmp);
|
||||||
if (!valid)
|
if (!valid)
|
||||||
return; // next parent
|
return; /* next parent */
|
||||||
else
|
else
|
||||||
goto reparse; // next child
|
goto reparse; /* next child */
|
||||||
} else
|
} else
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -1475,17 +1424,19 @@ static void display_tree(struct menu *menu)
|
||||||
&& (tree == tree2))
|
&& (tree == tree2))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (menu_is_visible(child) || show_all)
|
if ((opt_mode == OPT_NORMAL && menu_is_visible(child)) ||
|
||||||
|
(opt_mode == OPT_PROMPT && menu_has_prompt(child)) ||
|
||||||
|
(opt_mode == OPT_ALL && menu_get_prompt(child)))
|
||||||
place_node(child, fill_row(child));
|
place_node(child, fill_row(child));
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf("%*c%s: ", indent, ' ', menu_get_prompt(child));
|
printf("%*c%s: ", indent, ' ', menu_get_prompt(child));
|
||||||
printf("%s", child->flags & MENU_ROOT ? "rootmenu | " : "");
|
printf("%s", child->flags & MENU_ROOT ? "rootmenu | " : "");
|
||||||
dbg_print_ptype(ptype);
|
printf("%s", prop_get_type_name(ptype));
|
||||||
printf(" | ");
|
printf(" | ");
|
||||||
if (sym) {
|
if (sym) {
|
||||||
dbg_print_stype(sym->type);
|
printf("%s", sym_type_name(sym->type));
|
||||||
printf(" | ");
|
printf(" | ");
|
||||||
dbg_print_flags(sym->flags);
|
printf("%s", dbg_sym_flags(sym->flags));
|
||||||
printf("\n");
|
printf("\n");
|
||||||
} else
|
} else
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
|
@ -190,26 +190,40 @@
|
||||||
</child>
|
</child>
|
||||||
|
|
||||||
<child>
|
<child>
|
||||||
<widget class="GtkCheckMenuItem" id="show_all_options1">
|
<widget class="GtkRadioMenuItem" id="set_option_mode1">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="tooltip" translatable="yes">Show normal options</property>
|
||||||
|
<property name="label" translatable="yes">Show normal options</property>
|
||||||
|
<property name="use_underline">True</property>
|
||||||
|
<property name="active">True</property>
|
||||||
|
<signal name="activate" handler="on_set_option_mode1_activate"/>
|
||||||
|
</widget>
|
||||||
|
</child>
|
||||||
|
|
||||||
|
<child>
|
||||||
|
<widget class="GtkRadioMenuItem" id="set_option_mode2">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="tooltip" translatable="yes">Show all options</property>
|
<property name="tooltip" translatable="yes">Show all options</property>
|
||||||
<property name="label" translatable="yes">Show all _options</property>
|
<property name="label" translatable="yes">Show all _options</property>
|
||||||
<property name="use_underline">True</property>
|
<property name="use_underline">True</property>
|
||||||
<property name="active">False</property>
|
<property name="active">False</property>
|
||||||
<signal name="activate" handler="on_show_all_options1_activate"/>
|
<property name="group">set_option_mode1</property>
|
||||||
|
<signal name="activate" handler="on_set_option_mode2_activate"/>
|
||||||
</widget>
|
</widget>
|
||||||
</child>
|
</child>
|
||||||
|
|
||||||
<child>
|
<child>
|
||||||
<widget class="GtkCheckMenuItem" id="show_debug_info1">
|
<widget class="GtkRadioMenuItem" id="set_option_mode3">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="tooltip" translatable="yes">Show masked options</property>
|
<property name="tooltip" translatable="yes">Show all options with prompts</property>
|
||||||
<property name="label" translatable="yes">Show _debug info</property>
|
<property name="label" translatable="yes">Show all prompt options</property>
|
||||||
<property name="use_underline">True</property>
|
<property name="use_underline">True</property>
|
||||||
<property name="active">False</property>
|
<property name="active">False</property>
|
||||||
<signal name="activate" handler="on_show_debug_info1_activate"/>
|
<property name="group">set_option_mode1</property>
|
||||||
|
<signal name="activate" handler="on_set_option_mode3_activate"/>
|
||||||
</widget>
|
</widget>
|
||||||
</child>
|
</child>
|
||||||
|
|
||||||
</widget>
|
</widget>
|
||||||
</child>
|
</child>
|
||||||
</widget>
|
</widget>
|
||||||
|
@ -547,7 +561,7 @@
|
||||||
<property name="headers_visible">True</property>
|
<property name="headers_visible">True</property>
|
||||||
<property name="rules_hint">False</property>
|
<property name="rules_hint">False</property>
|
||||||
<property name="reorderable">False</property>
|
<property name="reorderable">False</property>
|
||||||
<property name="enable_search">True</property>
|
<property name="enable_search">False</property>
|
||||||
<signal name="cursor_changed" handler="on_treeview2_cursor_changed" last_modification_time="Sun, 12 Jan 2003 15:58:22 GMT"/>
|
<signal name="cursor_changed" handler="on_treeview2_cursor_changed" last_modification_time="Sun, 12 Jan 2003 15:58:22 GMT"/>
|
||||||
<signal name="button_press_event" handler="on_treeview1_button_press_event" last_modification_time="Sun, 12 Jan 2003 16:03:52 GMT"/>
|
<signal name="button_press_event" handler="on_treeview1_button_press_event" last_modification_time="Sun, 12 Jan 2003 16:03:52 GMT"/>
|
||||||
<signal name="key_press_event" handler="on_treeview2_key_press_event" last_modification_time="Sun, 12 Jan 2003 16:11:44 GMT"/>
|
<signal name="key_press_event" handler="on_treeview2_key_press_event" last_modification_time="Sun, 12 Jan 2003 16:11:44 GMT"/>
|
||||||
|
@ -582,7 +596,7 @@
|
||||||
<property name="headers_visible">True</property>
|
<property name="headers_visible">True</property>
|
||||||
<property name="rules_hint">False</property>
|
<property name="rules_hint">False</property>
|
||||||
<property name="reorderable">False</property>
|
<property name="reorderable">False</property>
|
||||||
<property name="enable_search">True</property>
|
<property name="enable_search">False</property>
|
||||||
<signal name="cursor_changed" handler="on_treeview2_cursor_changed" last_modification_time="Sun, 12 Jan 2003 15:57:55 GMT"/>
|
<signal name="cursor_changed" handler="on_treeview2_cursor_changed" last_modification_time="Sun, 12 Jan 2003 15:57:55 GMT"/>
|
||||||
<signal name="button_press_event" handler="on_treeview2_button_press_event" last_modification_time="Sun, 12 Jan 2003 15:57:58 GMT"/>
|
<signal name="button_press_event" handler="on_treeview2_button_press_event" last_modification_time="Sun, 12 Jan 2003 15:57:58 GMT"/>
|
||||||
<signal name="key_press_event" handler="on_treeview2_key_press_event" last_modification_time="Sun, 12 Jan 2003 15:58:01 GMT"/>
|
<signal name="key_press_event" handler="on_treeview2_key_press_event" last_modification_time="Sun, 12 Jan 2003 15:58:01 GMT"/>
|
||||||
|
|
|
@ -43,6 +43,10 @@ static char *escape(const char* text, char *bf, int len)
|
||||||
++text;
|
++text;
|
||||||
goto next;
|
goto next;
|
||||||
}
|
}
|
||||||
|
else if (*text == '\\') {
|
||||||
|
*bfp++ = '\\';
|
||||||
|
len--;
|
||||||
|
}
|
||||||
*bfp++ = *text++;
|
*bfp++ = *text++;
|
||||||
next:
|
next:
|
||||||
--len;
|
--len;
|
||||||
|
@ -162,7 +166,7 @@ static int message__add(const char *msg, char *option, char *file, int lineno)
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
void menu_build_message_list(struct menu *menu)
|
static void menu_build_message_list(struct menu *menu)
|
||||||
{
|
{
|
||||||
struct menu *child;
|
struct menu *child;
|
||||||
|
|
||||||
|
@ -207,7 +211,7 @@ static void message__print_gettext_msgid_msgstr(struct message *self)
|
||||||
"msgstr \"\"\n", self->msg);
|
"msgstr \"\"\n", self->msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void menu__xgettext(void)
|
static void menu__xgettext(void)
|
||||||
{
|
{
|
||||||
struct message *m = message__list;
|
struct message *m = message__list;
|
||||||
|
|
||||||
|
|
|
@ -5,10 +5,29 @@
|
||||||
|
|
||||||
/* A lexical scanner generated by flex */
|
/* A lexical scanner generated by flex */
|
||||||
|
|
||||||
|
#define yy_create_buffer zconf_create_buffer
|
||||||
|
#define yy_delete_buffer zconf_delete_buffer
|
||||||
|
#define yy_flex_debug zconf_flex_debug
|
||||||
|
#define yy_init_buffer zconf_init_buffer
|
||||||
|
#define yy_flush_buffer zconf_flush_buffer
|
||||||
|
#define yy_load_buffer_state zconf_load_buffer_state
|
||||||
|
#define yy_switch_to_buffer zconf_switch_to_buffer
|
||||||
|
#define yyin zconfin
|
||||||
|
#define yyleng zconfleng
|
||||||
|
#define yylex zconflex
|
||||||
|
#define yylineno zconflineno
|
||||||
|
#define yyout zconfout
|
||||||
|
#define yyrestart zconfrestart
|
||||||
|
#define yytext zconftext
|
||||||
|
#define yywrap zconfwrap
|
||||||
|
#define yyalloc zconfalloc
|
||||||
|
#define yyrealloc zconfrealloc
|
||||||
|
#define yyfree zconffree
|
||||||
|
|
||||||
#define FLEX_SCANNER
|
#define FLEX_SCANNER
|
||||||
#define YY_FLEX_MAJOR_VERSION 2
|
#define YY_FLEX_MAJOR_VERSION 2
|
||||||
#define YY_FLEX_MINOR_VERSION 5
|
#define YY_FLEX_MINOR_VERSION 5
|
||||||
#define YY_FLEX_SUBMINOR_VERSION 33
|
#define YY_FLEX_SUBMINOR_VERSION 35
|
||||||
#if YY_FLEX_SUBMINOR_VERSION > 0
|
#if YY_FLEX_SUBMINOR_VERSION > 0
|
||||||
#define FLEX_BETA
|
#define FLEX_BETA
|
||||||
#endif
|
#endif
|
||||||
|
@ -30,7 +49,7 @@
|
||||||
|
|
||||||
/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
|
/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
|
||||||
|
|
||||||
#if __STDC_VERSION__ >= 199901L
|
#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
|
||||||
|
|
||||||
/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
|
/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
|
||||||
* if you want the limit (max/min) macros for int types.
|
* if you want the limit (max/min) macros for int types.
|
||||||
|
@ -53,7 +72,6 @@ typedef int flex_int32_t;
|
||||||
typedef unsigned char flex_uint8_t;
|
typedef unsigned char flex_uint8_t;
|
||||||
typedef unsigned short int flex_uint16_t;
|
typedef unsigned short int flex_uint16_t;
|
||||||
typedef unsigned int flex_uint32_t;
|
typedef unsigned int flex_uint32_t;
|
||||||
#endif /* ! C99 */
|
|
||||||
|
|
||||||
/* Limits of integral types. */
|
/* Limits of integral types. */
|
||||||
#ifndef INT8_MIN
|
#ifndef INT8_MIN
|
||||||
|
@ -84,6 +102,8 @@ typedef unsigned int flex_uint32_t;
|
||||||
#define UINT32_MAX (4294967295U)
|
#define UINT32_MAX (4294967295U)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#endif /* ! C99 */
|
||||||
|
|
||||||
#endif /* ! FLEXINT_H */
|
#endif /* ! FLEXINT_H */
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -93,11 +113,12 @@ typedef unsigned int flex_uint32_t;
|
||||||
|
|
||||||
#else /* ! __cplusplus */
|
#else /* ! __cplusplus */
|
||||||
|
|
||||||
#if __STDC__
|
/* C99 requires __STDC__ to be defined as 1. */
|
||||||
|
#if defined (__STDC__)
|
||||||
|
|
||||||
#define YY_USE_CONST
|
#define YY_USE_CONST
|
||||||
|
|
||||||
#endif /* __STDC__ */
|
#endif /* defined (__STDC__) */
|
||||||
#endif /* ! __cplusplus */
|
#endif /* ! __cplusplus */
|
||||||
|
|
||||||
#ifdef YY_USE_CONST
|
#ifdef YY_USE_CONST
|
||||||
|
@ -139,7 +160,15 @@ typedef unsigned int flex_uint32_t;
|
||||||
|
|
||||||
/* Size of default input buffer. */
|
/* Size of default input buffer. */
|
||||||
#ifndef YY_BUF_SIZE
|
#ifndef YY_BUF_SIZE
|
||||||
|
#ifdef __ia64__
|
||||||
|
/* On IA-64, the buffer size is 16k, not 8k.
|
||||||
|
* Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
|
||||||
|
* Ditto for the __ia64__ case accordingly.
|
||||||
|
*/
|
||||||
|
#define YY_BUF_SIZE 32768
|
||||||
|
#else
|
||||||
#define YY_BUF_SIZE 16384
|
#define YY_BUF_SIZE 16384
|
||||||
|
#endif /* __ia64__ */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* The state buf must be large enough to hold one state per character in the main buffer.
|
/* The state buf must be large enough to hold one state per character in the main buffer.
|
||||||
|
@ -177,14 +206,9 @@ extern FILE *zconfin, *zconfout;
|
||||||
|
|
||||||
#define unput(c) yyunput( c, (yytext_ptr) )
|
#define unput(c) yyunput( c, (yytext_ptr) )
|
||||||
|
|
||||||
/* The following is because we cannot portably get our hands on size_t
|
|
||||||
* (without autoconf's help, which isn't available because we want
|
|
||||||
* flex-generated scanners to compile on their own).
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef YY_TYPEDEF_YY_SIZE_T
|
#ifndef YY_TYPEDEF_YY_SIZE_T
|
||||||
#define YY_TYPEDEF_YY_SIZE_T
|
#define YY_TYPEDEF_YY_SIZE_T
|
||||||
typedef unsigned int yy_size_t;
|
typedef size_t yy_size_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef YY_STRUCT_YY_BUFFER_STATE
|
#ifndef YY_STRUCT_YY_BUFFER_STATE
|
||||||
|
@ -335,7 +359,7 @@ void zconffree (void * );
|
||||||
|
|
||||||
/* Begin user sect3 */
|
/* Begin user sect3 */
|
||||||
|
|
||||||
#define zconfwrap() 1
|
#define zconfwrap(n) 1
|
||||||
#define YY_SKIP_YYWRAP
|
#define YY_SKIP_YYWRAP
|
||||||
|
|
||||||
typedef unsigned char YY_CHAR;
|
typedef unsigned char YY_CHAR;
|
||||||
|
@ -748,6 +772,7 @@ int zconf_flex_debug = 0;
|
||||||
#define YY_MORE_ADJ 0
|
#define YY_MORE_ADJ 0
|
||||||
#define YY_RESTORE_YY_MORE_OFFSET
|
#define YY_RESTORE_YY_MORE_OFFSET
|
||||||
char *zconftext;
|
char *zconftext;
|
||||||
|
#define YY_NO_INPUT 1
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
|
* Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
|
||||||
|
@ -785,7 +810,7 @@ static int last_ts, first_ts;
|
||||||
static void zconf_endhelp(void);
|
static void zconf_endhelp(void);
|
||||||
static void zconf_endfile(void);
|
static void zconf_endfile(void);
|
||||||
|
|
||||||
void new_string(void)
|
static void new_string(void)
|
||||||
{
|
{
|
||||||
text = malloc(START_STRSIZE);
|
text = malloc(START_STRSIZE);
|
||||||
text_asize = START_STRSIZE;
|
text_asize = START_STRSIZE;
|
||||||
|
@ -793,7 +818,7 @@ void new_string(void)
|
||||||
*text = 0;
|
*text = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void append_string(const char *str, int size)
|
static void append_string(const char *str, int size)
|
||||||
{
|
{
|
||||||
int new_size = text_size + size + 1;
|
int new_size = text_size + size + 1;
|
||||||
if (new_size > text_asize) {
|
if (new_size > text_asize) {
|
||||||
|
@ -807,7 +832,7 @@ void append_string(const char *str, int size)
|
||||||
text[text_size] = 0;
|
text[text_size] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void alloc_string(const char *str, int size)
|
static void alloc_string(const char *str, int size)
|
||||||
{
|
{
|
||||||
text = malloc(size + 1);
|
text = malloc(size + 1);
|
||||||
memcpy(text, str, size);
|
memcpy(text, str, size);
|
||||||
|
@ -834,6 +859,35 @@ void alloc_string(const char *str, int size)
|
||||||
|
|
||||||
static int yy_init_globals (void );
|
static int yy_init_globals (void );
|
||||||
|
|
||||||
|
/* Accessor methods to globals.
|
||||||
|
These are made visible to non-reentrant scanners for convenience. */
|
||||||
|
|
||||||
|
int zconflex_destroy (void );
|
||||||
|
|
||||||
|
int zconfget_debug (void );
|
||||||
|
|
||||||
|
void zconfset_debug (int debug_flag );
|
||||||
|
|
||||||
|
YY_EXTRA_TYPE zconfget_extra (void );
|
||||||
|
|
||||||
|
void zconfset_extra (YY_EXTRA_TYPE user_defined );
|
||||||
|
|
||||||
|
FILE *zconfget_in (void );
|
||||||
|
|
||||||
|
void zconfset_in (FILE * in_str );
|
||||||
|
|
||||||
|
FILE *zconfget_out (void );
|
||||||
|
|
||||||
|
void zconfset_out (FILE * out_str );
|
||||||
|
|
||||||
|
int zconfget_leng (void );
|
||||||
|
|
||||||
|
char *zconfget_text (void );
|
||||||
|
|
||||||
|
int zconfget_lineno (void );
|
||||||
|
|
||||||
|
void zconfset_lineno (int line_number );
|
||||||
|
|
||||||
/* Macros after this point can all be overridden by user definitions in
|
/* Macros after this point can all be overridden by user definitions in
|
||||||
* section 1.
|
* section 1.
|
||||||
*/
|
*/
|
||||||
|
@ -868,7 +922,12 @@ static int input (void );
|
||||||
|
|
||||||
/* Amount of stuff to slurp up with each read. */
|
/* Amount of stuff to slurp up with each read. */
|
||||||
#ifndef YY_READ_BUF_SIZE
|
#ifndef YY_READ_BUF_SIZE
|
||||||
|
#ifdef __ia64__
|
||||||
|
/* On IA-64, the buffer size is 16k, not 8k */
|
||||||
|
#define YY_READ_BUF_SIZE 16384
|
||||||
|
#else
|
||||||
#define YY_READ_BUF_SIZE 8192
|
#define YY_READ_BUF_SIZE 8192
|
||||||
|
#endif /* __ia64__ */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Copy whatever the last rule matched to the standard output. */
|
/* Copy whatever the last rule matched to the standard output. */
|
||||||
|
@ -876,7 +935,7 @@ static int input (void );
|
||||||
/* This used to be an fputs(), but since the string might contain NUL's,
|
/* This used to be an fputs(), but since the string might contain NUL's,
|
||||||
* we now use fwrite().
|
* we now use fwrite().
|
||||||
*/
|
*/
|
||||||
#define ECHO (void) fwrite( zconftext, zconfleng, 1, zconfout )
|
#define ECHO do { if (fwrite( zconftext, zconfleng, 1, zconfout )) {} } while (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
|
/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
|
||||||
|
@ -1256,6 +1315,11 @@ YY_RULE_SETUP
|
||||||
case 32:
|
case 32:
|
||||||
YY_RULE_SETUP
|
YY_RULE_SETUP
|
||||||
{
|
{
|
||||||
|
while (zconfleng) {
|
||||||
|
if ((zconftext[zconfleng-1] != ' ') && (zconftext[zconfleng-1] != '\t'))
|
||||||
|
break;
|
||||||
|
zconfleng--;
|
||||||
|
}
|
||||||
append_string(zconftext, zconfleng);
|
append_string(zconftext, zconfleng);
|
||||||
if (!first_ts)
|
if (!first_ts)
|
||||||
first_ts = last_ts;
|
first_ts = last_ts;
|
||||||
|
@ -1511,7 +1575,7 @@ static int yy_get_next_buffer (void)
|
||||||
|
|
||||||
/* Read in more data. */
|
/* Read in more data. */
|
||||||
YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
|
YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
|
||||||
(yy_n_chars), num_to_read );
|
(yy_n_chars), (size_t) num_to_read );
|
||||||
|
|
||||||
YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
|
YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
|
||||||
}
|
}
|
||||||
|
@ -1535,6 +1599,14 @@ static int yy_get_next_buffer (void)
|
||||||
else
|
else
|
||||||
ret_val = EOB_ACT_CONTINUE_SCAN;
|
ret_val = EOB_ACT_CONTINUE_SCAN;
|
||||||
|
|
||||||
|
if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
|
||||||
|
/* Extend the array by 50%, plus the number we really need. */
|
||||||
|
yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
|
||||||
|
YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) zconfrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size );
|
||||||
|
if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
|
||||||
|
YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
|
||||||
|
}
|
||||||
|
|
||||||
(yy_n_chars) += number_to_move;
|
(yy_n_chars) += number_to_move;
|
||||||
YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
|
YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
|
||||||
YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
|
YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
|
||||||
|
@ -1921,6 +1993,8 @@ static void zconfensure_buffer_stack (void)
|
||||||
(yy_buffer_stack) = (struct yy_buffer_state**)zconfalloc
|
(yy_buffer_stack) = (struct yy_buffer_state**)zconfalloc
|
||||||
(num_to_alloc * sizeof(struct yy_buffer_state*)
|
(num_to_alloc * sizeof(struct yy_buffer_state*)
|
||||||
);
|
);
|
||||||
|
if ( ! (yy_buffer_stack) )
|
||||||
|
YY_FATAL_ERROR( "out of dynamic memory in zconfensure_buffer_stack()" );
|
||||||
|
|
||||||
memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
|
memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
|
||||||
|
|
||||||
|
@ -1939,6 +2013,8 @@ static void zconfensure_buffer_stack (void)
|
||||||
((yy_buffer_stack),
|
((yy_buffer_stack),
|
||||||
num_to_alloc * sizeof(struct yy_buffer_state*)
|
num_to_alloc * sizeof(struct yy_buffer_state*)
|
||||||
);
|
);
|
||||||
|
if ( ! (yy_buffer_stack) )
|
||||||
|
YY_FATAL_ERROR( "out of dynamic memory in zconfensure_buffer_stack()" );
|
||||||
|
|
||||||
/* zero only the new slots.*/
|
/* zero only the new slots.*/
|
||||||
memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
|
memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
|
||||||
|
@ -1997,8 +2073,8 @@ YY_BUFFER_STATE zconf_scan_string (yyconst char * yystr )
|
||||||
|
|
||||||
/** Setup the input buffer state to scan the given bytes. The next call to zconflex() will
|
/** Setup the input buffer state to scan the given bytes. The next call to zconflex() will
|
||||||
* scan from a @e copy of @a bytes.
|
* scan from a @e copy of @a bytes.
|
||||||
* @param bytes the byte buffer to scan
|
* @param yybytes the byte buffer to scan
|
||||||
* @param len the number of bytes in the buffer pointed to by @a bytes.
|
* @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
|
||||||
*
|
*
|
||||||
* @return the newly allocated buffer state object.
|
* @return the newly allocated buffer state object.
|
||||||
*/
|
*/
|
||||||
|
@ -2255,7 +2331,7 @@ static void zconf_endhelp(void)
|
||||||
* ./name
|
* ./name
|
||||||
* $(srctree)/name
|
* $(srctree)/name
|
||||||
* The latter is used when srctree is separate from objtree
|
* The latter is used when srctree is separate from objtree
|
||||||
* when compiling the kernel.
|
* when compiling the barebox.
|
||||||
* Return NULL if file is not found.
|
* Return NULL if file is not found.
|
||||||
*/
|
*/
|
||||||
FILE *zconf_fopen(const char *name)
|
FILE *zconf_fopen(const char *name)
|
||||||
|
@ -2307,11 +2383,14 @@ void zconf_nextfile(const char *name)
|
||||||
current_buf = buf;
|
current_buf = buf;
|
||||||
|
|
||||||
if (file->flags & FILE_BUSY) {
|
if (file->flags & FILE_BUSY) {
|
||||||
printf("recursive scan (%s)?\n", name);
|
printf("%s:%d: do not source '%s' from itself\n",
|
||||||
|
zconf_curname(), zconf_lineno(), name);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
if (file->flags & FILE_SCANNED) {
|
if (file->flags & FILE_SCANNED) {
|
||||||
printf("file %s already scanned?\n", name);
|
printf("%s:%d: file '%s' is already sourced from '%s'\n",
|
||||||
|
zconf_curname(), zconf_lineno(), name,
|
||||||
|
file->parent->name);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
file->flags |= FILE_BUSY;
|
file->flags |= FILE_BUSY;
|
||||||
|
|
|
@ -11,9 +11,9 @@
|
||||||
#ifndef KBUILD_NO_NLS
|
#ifndef KBUILD_NO_NLS
|
||||||
# include <libintl.h>
|
# include <libintl.h>
|
||||||
#else
|
#else
|
||||||
# define gettext(Msgid) ((const char *) (Msgid))
|
static inline const char *gettext(const char *txt) { return txt; }
|
||||||
# define textdomain(Domainname) ((const char *) (Domainname))
|
static inline void textdomain(const char *domainname) {}
|
||||||
# define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname))
|
static inline void bindtextdomain(const char *name, const char *dir) {}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -42,8 +42,17 @@ extern "C" {
|
||||||
#define TF_PARAM 0x0002
|
#define TF_PARAM 0x0002
|
||||||
#define TF_OPTION 0x0004
|
#define TF_OPTION 0x0004
|
||||||
|
|
||||||
|
enum conf_def_mode {
|
||||||
|
def_default,
|
||||||
|
def_yes,
|
||||||
|
def_mod,
|
||||||
|
def_no,
|
||||||
|
def_random
|
||||||
|
};
|
||||||
|
|
||||||
#define T_OPT_MODULES 1
|
#define T_OPT_MODULES 1
|
||||||
#define T_OPT_DEFCONFIG_LIST 2
|
#define T_OPT_DEFCONFIG_LIST 2
|
||||||
|
#define T_OPT_ENV 3
|
||||||
|
|
||||||
struct kconf_id {
|
struct kconf_id {
|
||||||
int name;
|
int name;
|
||||||
|
@ -63,17 +72,30 @@ void zconf_nextfile(const char *name);
|
||||||
int zconf_lineno(void);
|
int zconf_lineno(void);
|
||||||
char *zconf_curname(void);
|
char *zconf_curname(void);
|
||||||
|
|
||||||
|
/* conf.c */
|
||||||
|
void xfgets(char *str, int size, FILE *in);
|
||||||
|
|
||||||
/* confdata.c */
|
/* confdata.c */
|
||||||
const char *conf_get_configname(void);
|
const char *conf_get_configname(void);
|
||||||
|
const char *conf_get_autoconfig_name(void);
|
||||||
char *conf_get_default_confname(void);
|
char *conf_get_default_confname(void);
|
||||||
void sym_set_change_count(int count);
|
void sym_set_change_count(int count);
|
||||||
void sym_add_change_count(int count);
|
void sym_add_change_count(int count);
|
||||||
|
void conf_set_all_new_symbols(enum conf_def_mode mode);
|
||||||
|
|
||||||
|
/* confdata.c and expr.c */
|
||||||
|
static inline void xfwrite(const void *str, size_t len, size_t count, FILE *out)
|
||||||
|
{
|
||||||
|
if (fwrite(str, len, count, out) < count)
|
||||||
|
fprintf(stderr, "\nError in writing or end of file.\n");
|
||||||
|
}
|
||||||
|
|
||||||
/* kconfig_load.c */
|
/* kconfig_load.c */
|
||||||
void kconfig_load(void);
|
void kconfig_load(void);
|
||||||
|
|
||||||
/* menu.c */
|
/* menu.c */
|
||||||
void menu_init(void);
|
void _menu_init(void);
|
||||||
|
void menu_warn(struct menu *menu, const char *fmt, ...);
|
||||||
struct menu *menu_add_menu(void);
|
struct menu *menu_add_menu(void);
|
||||||
void menu_end_menu(void);
|
void menu_end_menu(void);
|
||||||
void menu_add_entry(struct symbol *sym);
|
void menu_add_entry(struct symbol *sym);
|
||||||
|
@ -94,6 +116,11 @@ int file_write_dep(const char *name);
|
||||||
struct gstr {
|
struct gstr {
|
||||||
size_t len;
|
size_t len;
|
||||||
char *s;
|
char *s;
|
||||||
|
/*
|
||||||
|
* when max_width is not zero long lines in string s (if any) get
|
||||||
|
* wrapped not to exceed the max_width value
|
||||||
|
*/
|
||||||
|
int max_width;
|
||||||
};
|
};
|
||||||
struct gstr str_new(void);
|
struct gstr str_new(void);
|
||||||
struct gstr str_assign(const char *s);
|
struct gstr str_assign(const char *s);
|
||||||
|
@ -103,13 +130,18 @@ void str_printf(struct gstr *gs, const char *fmt, ...);
|
||||||
const char *str_get(struct gstr *gs);
|
const char *str_get(struct gstr *gs);
|
||||||
|
|
||||||
/* symbol.c */
|
/* symbol.c */
|
||||||
|
extern struct expr *sym_env_list;
|
||||||
|
|
||||||
void sym_init(void);
|
void sym_init(void);
|
||||||
void sym_clear_all_valid(void);
|
void sym_clear_all_valid(void);
|
||||||
void sym_set_all_changed(void);
|
void sym_set_all_changed(void);
|
||||||
void sym_set_changed(struct symbol *sym);
|
void sym_set_changed(struct symbol *sym);
|
||||||
|
struct symbol *sym_choice_default(struct symbol *sym);
|
||||||
|
const char *sym_get_string_default(struct symbol *sym);
|
||||||
struct symbol *sym_check_deps(struct symbol *sym);
|
struct symbol *sym_check_deps(struct symbol *sym);
|
||||||
struct property *prop_alloc(enum prop_type type, struct symbol *sym);
|
struct property *prop_alloc(enum prop_type type, struct symbol *sym);
|
||||||
struct symbol *prop_get_symbol(struct property *prop);
|
struct symbol *prop_get_symbol(struct property *prop);
|
||||||
|
struct property *sym_get_env_prop(struct symbol *sym);
|
||||||
|
|
||||||
static inline tristate sym_get_tristate_value(struct symbol *sym)
|
static inline tristate sym_get_tristate_value(struct symbol *sym)
|
||||||
{
|
{
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
P(conf_parse,void,(const char *name));
|
P(conf_parse,void,(const char *name));
|
||||||
P(conf_read,int,(const char *name));
|
P(conf_read,int,(const char *name));
|
||||||
P(conf_read_simple,int,(const char *name, int));
|
P(conf_read_simple,int,(const char *name, int));
|
||||||
|
P(conf_write_defconfig,int,(const char *name));
|
||||||
P(conf_write,int,(const char *name));
|
P(conf_write,int,(const char *name));
|
||||||
P(conf_write_autoconf,int,(void));
|
P(conf_write_autoconf,int,(void));
|
||||||
P(conf_get_changed,bool,(void));
|
P(conf_get_changed,bool,(void));
|
||||||
|
@ -12,16 +13,20 @@ P(conf_set_changed_callback, void,(void (*fn)(void)));
|
||||||
P(rootmenu,struct menu,);
|
P(rootmenu,struct menu,);
|
||||||
|
|
||||||
P(menu_is_visible, bool, (struct menu *menu));
|
P(menu_is_visible, bool, (struct menu *menu));
|
||||||
|
P(menu_has_prompt, bool, (struct menu *menu));
|
||||||
P(menu_get_prompt,const char *,(struct menu *menu));
|
P(menu_get_prompt,const char *,(struct menu *menu));
|
||||||
P(menu_get_root_menu,struct menu *,(struct menu *menu));
|
P(menu_get_root_menu,struct menu *,(struct menu *menu));
|
||||||
P(menu_get_parent_menu,struct menu *,(struct menu *menu));
|
P(menu_get_parent_menu,struct menu *,(struct menu *menu));
|
||||||
P(menu_has_help,bool,(struct menu *menu));
|
P(menu_has_help,bool,(struct menu *menu));
|
||||||
P(menu_get_help,const char *,(struct menu *menu));
|
P(menu_get_help,const char *,(struct menu *menu));
|
||||||
|
P(get_symbol_str, void, (struct gstr *r, struct symbol *sym));
|
||||||
|
P(get_relations_str, struct gstr, (struct symbol **sym_arr));
|
||||||
|
P(menu_get_ext_help,void,(struct menu *menu, struct gstr *help));
|
||||||
|
|
||||||
/* symbol.c */
|
/* symbol.c */
|
||||||
P(symbol_hash,struct symbol *,[SYMBOL_HASHSIZE]);
|
P(symbol_hash,struct symbol *,[SYMBOL_HASHSIZE]);
|
||||||
|
|
||||||
P(sym_lookup,struct symbol *,(const char *name, int isconst));
|
P(sym_lookup,struct symbol *,(const char *name, int flags));
|
||||||
P(sym_find,struct symbol *,(const char *name));
|
P(sym_find,struct symbol *,(const char *name));
|
||||||
P(sym_re_search,struct symbol **,(const char *pattern));
|
P(sym_re_search,struct symbol **,(const char *pattern));
|
||||||
P(sym_type_name,const char *,(enum symbol_type type));
|
P(sym_type_name,const char *,(enum symbol_type type));
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
This is NOT the official version of dialog. This version has been
|
This is NOT the official version of dialog. This version has been
|
||||||
significantly modified from the original. It is for use by the Linux
|
significantly modified from the original. It is for use by the Linux
|
||||||
kernel configuration script. Please do not bother Savio Lam with
|
barebox configuration script. Please do not bother Savio Lam with
|
||||||
questions about this program.
|
questions about this program.
|
||||||
|
|
|
@ -36,19 +36,23 @@ trap "rm -f $tmp" 0 1 2 3 15
|
||||||
|
|
||||||
# Check if we can link to ncurses
|
# Check if we can link to ncurses
|
||||||
check() {
|
check() {
|
||||||
echo "main() {}" | $cc -xc - -o $tmp 2> /dev/null
|
$cc -xc - -o $tmp 2>/dev/null <<'EOF'
|
||||||
|
#include CURSES_LOC
|
||||||
|
main() {}
|
||||||
|
EOF
|
||||||
if [ $? != 0 ]; then
|
if [ $? != 0 ]; then
|
||||||
echo " *** Unable to find the ncurses libraries." 1>&2
|
echo " *** Unable to find the ncurses libraries or the" 1>&2
|
||||||
echo " *** make menuconfig require the ncurses libraries" 1>&2
|
echo " *** required header files." 1>&2
|
||||||
|
echo " *** 'make menuconfig' requires the ncurses libraries." 1>&2
|
||||||
echo " *** " 1>&2
|
echo " *** " 1>&2
|
||||||
echo " *** Install ncurses (ncurses-devel) and try again" 1>&2
|
echo " *** Install ncurses (ncurses-devel) and try again." 1>&2
|
||||||
echo " *** " 1>&2
|
echo " *** " 1>&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
usage() {
|
usage() {
|
||||||
printf "Usage: $0 [-check compiler options|-header|-library]\n"
|
printf "Usage: $0 [-check compiler options|-ccflags|-ldflags compiler options]\n"
|
||||||
}
|
}
|
||||||
|
|
||||||
if [ $# -eq 0 ]; then
|
if [ $# -eq 0 ]; then
|
||||||
|
|
|
@ -31,6 +31,10 @@ static int list_width, check_x, item_x;
|
||||||
static void print_item(WINDOW * win, int choice, int selected)
|
static void print_item(WINDOW * win, int choice, int selected)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
char *list_item = malloc(list_width + 1);
|
||||||
|
|
||||||
|
strncpy(list_item, item_str(), list_width - item_x);
|
||||||
|
list_item[list_width - item_x] = '\0';
|
||||||
|
|
||||||
/* Clear 'residue' of last item */
|
/* Clear 'residue' of last item */
|
||||||
wattrset(win, dlg.menubox.atr);
|
wattrset(win, dlg.menubox.atr);
|
||||||
|
@ -41,16 +45,18 @@ static void print_item(WINDOW * win, int choice, int selected)
|
||||||
wmove(win, choice, check_x);
|
wmove(win, choice, check_x);
|
||||||
wattrset(win, selected ? dlg.check_selected.atr
|
wattrset(win, selected ? dlg.check_selected.atr
|
||||||
: dlg.check.atr);
|
: dlg.check.atr);
|
||||||
|
if (!item_is_tag(':'))
|
||||||
wprintw(win, "(%c)", item_is_tag('X') ? 'X' : ' ');
|
wprintw(win, "(%c)", item_is_tag('X') ? 'X' : ' ');
|
||||||
|
|
||||||
wattrset(win, selected ? dlg.tag_selected.atr : dlg.tag.atr);
|
wattrset(win, selected ? dlg.tag_selected.atr : dlg.tag.atr);
|
||||||
mvwaddch(win, choice, item_x, item_str()[0]);
|
mvwaddch(win, choice, item_x, list_item[0]);
|
||||||
wattrset(win, selected ? dlg.item_selected.atr : dlg.item.atr);
|
wattrset(win, selected ? dlg.item_selected.atr : dlg.item.atr);
|
||||||
waddstr(win, (char *)item_str() + 1);
|
waddstr(win, list_item + 1);
|
||||||
if (selected) {
|
if (selected) {
|
||||||
wmove(win, choice, check_x + 1);
|
wmove(win, choice, check_x + 1);
|
||||||
wrefresh(win);
|
wrefresh(win);
|
||||||
}
|
}
|
||||||
|
free(list_item);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -97,8 +103,8 @@ static void print_buttons(WINDOW * dialog, int height, int width, int selected)
|
||||||
int x = width / 2 - 11;
|
int x = width / 2 - 11;
|
||||||
int y = height - 2;
|
int y = height - 2;
|
||||||
|
|
||||||
print_button(dialog, "Select", y, x, selected == 0);
|
print_button(dialog, gettext("Select"), y, x, selected == 0);
|
||||||
print_button(dialog, " Help ", y, x + 14, selected == 1);
|
print_button(dialog, gettext(" Help "), y, x + 14, selected == 1);
|
||||||
|
|
||||||
wmove(dialog, y, x + 1 + 14 * selected);
|
wmove(dialog, y, x + 1 + 14 * selected);
|
||||||
wrefresh(dialog);
|
wrefresh(dialog);
|
||||||
|
@ -174,6 +180,7 @@ do_resize:
|
||||||
check_x = 0;
|
check_x = 0;
|
||||||
item_foreach()
|
item_foreach()
|
||||||
check_x = MAX(check_x, strlen(item_str()) + 4);
|
check_x = MAX(check_x, strlen(item_str()) + 4);
|
||||||
|
check_x = MIN(check_x, list_width);
|
||||||
|
|
||||||
check_x = (list_width - check_x) / 2;
|
check_x = (list_width - check_x) / 2;
|
||||||
item_x = check_x + 4;
|
item_x = check_x + 4;
|
||||||
|
|
|
@ -26,6 +26,12 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#ifndef KBUILD_NO_NLS
|
||||||
|
# include <libintl.h>
|
||||||
|
#else
|
||||||
|
# define gettext(Msgid) ((const char *) (Msgid))
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __sun__
|
#ifdef __sun__
|
||||||
#define CURS_MACROS
|
#define CURS_MACROS
|
||||||
#endif
|
#endif
|
||||||
|
@ -187,10 +193,9 @@ int item_is_tag(char tag);
|
||||||
int on_key_esc(WINDOW *win);
|
int on_key_esc(WINDOW *win);
|
||||||
int on_key_resize(void);
|
int on_key_resize(void);
|
||||||
|
|
||||||
void init_dialog(const char *backtitle);
|
int init_dialog(const char *backtitle);
|
||||||
void set_dialog_backtitle(const char *backtitle);
|
void set_dialog_backtitle(const char *backtitle);
|
||||||
void reset_dialog(void);
|
void end_dialog(int x, int y);
|
||||||
void end_dialog(void);
|
|
||||||
void attr_clear(WINDOW * win, int height, int width, chtype attr);
|
void attr_clear(WINDOW * win, int height, int width, chtype attr);
|
||||||
void dialog_clear(void);
|
void dialog_clear(void);
|
||||||
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);
|
||||||
|
|
|
@ -31,8 +31,8 @@ static void print_buttons(WINDOW * dialog, int height, int width, int selected)
|
||||||
int x = width / 2 - 11;
|
int x = width / 2 - 11;
|
||||||
int y = height - 2;
|
int y = height - 2;
|
||||||
|
|
||||||
print_button(dialog, " Ok ", y, x, selected == 0);
|
print_button(dialog, gettext(" Ok "), y, x, selected == 0);
|
||||||
print_button(dialog, " Help ", y, x + 14, selected == 1);
|
print_button(dialog, gettext(" Help "), y, x + 14, selected == 1);
|
||||||
|
|
||||||
wmove(dialog, y, x + 1 + 14 * selected);
|
wmove(dialog, y, x + 1 + 14 * selected);
|
||||||
wrefresh(dialog);
|
wrefresh(dialog);
|
||||||
|
@ -89,7 +89,7 @@ do_resize:
|
||||||
box_y = y + 2;
|
box_y = y + 2;
|
||||||
box_x = (width - box_width) / 2;
|
box_x = (width - box_width) / 2;
|
||||||
draw_box(dialog, y + 1, box_x - 1, 3, box_width + 2,
|
draw_box(dialog, y + 1, box_x - 1, 3, box_width + 2,
|
||||||
dlg.border.atr, dlg.dialog.atr);
|
dlg.dialog.atr, dlg.border.atr);
|
||||||
|
|
||||||
print_buttons(dialog, height, width, 0);
|
print_buttons(dialog, height, width, 0);
|
||||||
|
|
||||||
|
@ -180,7 +180,7 @@ do_resize:
|
||||||
case KEY_LEFT:
|
case KEY_LEFT:
|
||||||
switch (button) {
|
switch (button) {
|
||||||
case -1:
|
case -1:
|
||||||
button = 1; /* Indicates "Cancel" button is selected */
|
button = 1; /* Indicates "Help" button is selected */
|
||||||
print_buttons(dialog, height, width, 1);
|
print_buttons(dialog, height, width, 1);
|
||||||
break;
|
break;
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -204,7 +204,7 @@ do_resize:
|
||||||
print_buttons(dialog, height, width, 0);
|
print_buttons(dialog, height, width, 0);
|
||||||
break;
|
break;
|
||||||
case 0:
|
case 0:
|
||||||
button = 1; /* Indicates "Cancel" button is selected */
|
button = 1; /* Indicates "Help" button is selected */
|
||||||
print_buttons(dialog, height, width, 1);
|
print_buttons(dialog, height, width, 1);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
|
|
|
@ -157,9 +157,9 @@ static void print_buttons(WINDOW * win, int height, int width, int selected)
|
||||||
int x = width / 2 - 16;
|
int x = width / 2 - 16;
|
||||||
int y = height - 2;
|
int y = height - 2;
|
||||||
|
|
||||||
print_button(win, "Select", y, x, selected == 0);
|
print_button(win, gettext("Select"), y, x, selected == 0);
|
||||||
print_button(win, " Exit ", y, x + 12, selected == 1);
|
print_button(win, gettext(" Exit "), y, x + 12, selected == 1);
|
||||||
print_button(win, " Help ", y, x + 24, selected == 2);
|
print_button(win, gettext(" Help "), y, x + 24, selected == 2);
|
||||||
|
|
||||||
wmove(win, y, x + 1 + 12 * selected);
|
wmove(win, y, x + 1 + 12 * selected);
|
||||||
wrefresh(win);
|
wrefresh(win);
|
||||||
|
@ -383,6 +383,10 @@ do_resize:
|
||||||
case 'n':
|
case 'n':
|
||||||
case 'm':
|
case 'm':
|
||||||
case '/':
|
case '/':
|
||||||
|
case 'h':
|
||||||
|
case '?':
|
||||||
|
case 'z':
|
||||||
|
case '\n':
|
||||||
/* save scroll info */
|
/* save scroll info */
|
||||||
*s_scroll = scroll;
|
*s_scroll = scroll;
|
||||||
delwin(menu);
|
delwin(menu);
|
||||||
|
@ -390,8 +394,10 @@ do_resize:
|
||||||
item_set(scroll + choice);
|
item_set(scroll + choice);
|
||||||
item_set_selected(1);
|
item_set_selected(1);
|
||||||
switch (key) {
|
switch (key) {
|
||||||
|
case 'h':
|
||||||
|
case '?':
|
||||||
|
return 2;
|
||||||
case 's':
|
case 's':
|
||||||
return 3;
|
|
||||||
case 'y':
|
case 'y':
|
||||||
return 3;
|
return 3;
|
||||||
case 'n':
|
case 'n':
|
||||||
|
@ -402,18 +408,12 @@ do_resize:
|
||||||
return 6;
|
return 6;
|
||||||
case '/':
|
case '/':
|
||||||
return 7;
|
return 7;
|
||||||
|
case 'z':
|
||||||
|
return 8;
|
||||||
|
case '\n':
|
||||||
|
return button;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
case 'h':
|
|
||||||
case '?':
|
|
||||||
button = 2;
|
|
||||||
case '\n':
|
|
||||||
*s_scroll = scroll;
|
|
||||||
delwin(menu);
|
|
||||||
delwin(dialog);
|
|
||||||
item_set(scroll + choice);
|
|
||||||
item_set_selected(1);
|
|
||||||
return button;
|
|
||||||
case 'e':
|
case 'e':
|
||||||
case 'x':
|
case 'x':
|
||||||
key = KEY_ESC;
|
key = KEY_ESC;
|
||||||
|
|
|
@ -114,7 +114,7 @@ do_resize:
|
||||||
|
|
||||||
print_title(dialog, title, width);
|
print_title(dialog, title, width);
|
||||||
|
|
||||||
print_button(dialog, " Exit ", height - 2, width / 2 - 4, TRUE);
|
print_button(dialog, gettext(" Exit "), height - 2, width / 2 - 4, TRUE);
|
||||||
wnoutrefresh(dialog);
|
wnoutrefresh(dialog);
|
||||||
getyx(dialog, cur_y, cur_x); /* Save cursor position */
|
getyx(dialog, cur_y, cur_x); /* Save cursor position */
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,8 @@
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
#include "dialog.h"
|
#include "dialog.h"
|
||||||
|
|
||||||
struct dialog_info dlg;
|
struct dialog_info dlg;
|
||||||
|
@ -266,10 +268,26 @@ void dialog_clear(void)
|
||||||
/*
|
/*
|
||||||
* Do some initialization for dialog
|
* Do some initialization for dialog
|
||||||
*/
|
*/
|
||||||
void init_dialog(const char *backtitle)
|
int init_dialog(const char *backtitle)
|
||||||
{
|
{
|
||||||
|
int height, width;
|
||||||
|
|
||||||
|
initscr(); /* Init curses */
|
||||||
|
getmaxyx(stdscr, height, width);
|
||||||
|
if (height < 19 || width < 80) {
|
||||||
|
endwin();
|
||||||
|
return -ERRDISPLAYTOOSMALL;
|
||||||
|
}
|
||||||
|
|
||||||
dlg.backtitle = backtitle;
|
dlg.backtitle = backtitle;
|
||||||
color_setup(getenv("MENUCONFIG_COLOR"));
|
color_setup(getenv("MENUCONFIG_COLOR"));
|
||||||
|
|
||||||
|
keypad(stdscr, TRUE);
|
||||||
|
cbreak();
|
||||||
|
noecho();
|
||||||
|
dialog_clear();
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_dialog_backtitle(const char *backtitle)
|
void set_dialog_backtitle(const char *backtitle)
|
||||||
|
@ -277,20 +295,14 @@ void set_dialog_backtitle(const char *backtitle)
|
||||||
dlg.backtitle = backtitle;
|
dlg.backtitle = backtitle;
|
||||||
}
|
}
|
||||||
|
|
||||||
void reset_dialog(void)
|
|
||||||
{
|
|
||||||
initscr(); /* Init curses */
|
|
||||||
keypad(stdscr, TRUE);
|
|
||||||
cbreak();
|
|
||||||
noecho();
|
|
||||||
dialog_clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* End using dialog functions.
|
* End using dialog functions.
|
||||||
*/
|
*/
|
||||||
void end_dialog(void)
|
void end_dialog(int x, int y)
|
||||||
{
|
{
|
||||||
|
/* move cursor back to original position */
|
||||||
|
move(y, x);
|
||||||
|
refresh();
|
||||||
endwin();
|
endwin();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,8 +29,8 @@ static void print_buttons(WINDOW * dialog, int height, int width, int selected)
|
||||||
int x = width / 2 - 10;
|
int x = width / 2 - 10;
|
||||||
int y = height - 2;
|
int y = height - 2;
|
||||||
|
|
||||||
print_button(dialog, " Yes ", y, x, selected == 0);
|
print_button(dialog, gettext(" Yes "), y, x, selected == 0);
|
||||||
print_button(dialog, " No ", y, x + 13, selected == 1);
|
print_button(dialog, gettext(" No "), y, x + 13, selected == 1);
|
||||||
|
|
||||||
wmove(dialog, y, x + 1 + 13 * selected);
|
wmove(dialog, y, x + 1 + 13 * selected);
|
||||||
wrefresh(dialog);
|
wrefresh(dialog);
|
||||||
|
|
|
@ -8,17 +8,13 @@
|
||||||
* i18n, 2005, Arnaldo Carvalho de Melo <acme@conectiva.com.br>
|
* i18n, 2005, Arnaldo Carvalho de Melo <acme@conectiva.com.br>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
#include <sys/wait.h>
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <signal.h>
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <termios.h>
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
|
|
||||||
|
@ -29,15 +25,19 @@
|
||||||
static const char mconf_readme[] = N_(
|
static const char mconf_readme[] = N_(
|
||||||
"Overview\n"
|
"Overview\n"
|
||||||
"--------\n"
|
"--------\n"
|
||||||
"Some barebox features may be built directly into barebox.\n"
|
"Some barebox features may be built directly into the barebox.\n"
|
||||||
"Some may be made into loadable runtime modules. Some features\n"
|
"Some may be made into loadable runtime modules. Some features\n"
|
||||||
"may be completely removed altogether. There are also certain\n"
|
"may be completely removed altogether. There are also certain\n"
|
||||||
"barebox parameters which are not really features, but must be\n"
|
"barebox parameters which are not really features, but must be\n"
|
||||||
"entered in as decimal or hexadecimal numbers or possibly text.\n"
|
"entered in as decimal or hexadecimal numbers or possibly text.\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Menu items beginning with [*], <M> or [ ] represent features\n"
|
"Menu items beginning with following braces represent features that\n"
|
||||||
"configured to be built in, modularized or removed respectively.\n"
|
" [ ] can be built in or removed\n"
|
||||||
"Pointed brackets <> represent module capable features.\n"
|
" < > can be built in, modularized or removed\n"
|
||||||
|
" { } can be built in or modularized (selected by other feature)\n"
|
||||||
|
" - - are selected by other feature,\n"
|
||||||
|
"while *, M or whitespace inside braces means to build in, build as\n"
|
||||||
|
"a module or to exclude the feature respectively.\n"
|
||||||
"\n"
|
"\n"
|
||||||
"To change any of these features, highlight it with the cursor\n"
|
"To change any of these features, highlight it with the cursor\n"
|
||||||
"keys and press <Y> to build it in, <M> to make it a module or\n"
|
"keys and press <Y> to build it in, <M> to make it a module or\n"
|
||||||
|
@ -67,13 +67,15 @@ static const char mconf_readme[] = N_(
|
||||||
" there is a delayed response which you may find annoying.\n"
|
" there is a delayed response which you may find annoying.\n"
|
||||||
"\n"
|
"\n"
|
||||||
" Also, the <TAB> and cursor keys will cycle between <Select>,\n"
|
" Also, the <TAB> and cursor keys will cycle between <Select>,\n"
|
||||||
" <Exit> and <Help>\n"
|
" <Exit> and <Help>.\n"
|
||||||
"\n"
|
"\n"
|
||||||
"o To get help with an item, use the cursor keys to highlight <Help>\n"
|
"o To get help with an item, use the cursor keys to highlight <Help>\n"
|
||||||
" and Press <ENTER>.\n"
|
" and press <ENTER>.\n"
|
||||||
"\n"
|
"\n"
|
||||||
" Shortcut: Press <H> or <?>.\n"
|
" Shortcut: Press <H> or <?>.\n"
|
||||||
"\n"
|
"\n"
|
||||||
|
"o To toggle the display of hidden options, press <Z>.\n"
|
||||||
|
"\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Radiolists (Choice lists)\n"
|
"Radiolists (Choice lists)\n"
|
||||||
"-----------\n"
|
"-----------\n"
|
||||||
|
@ -199,8 +201,6 @@ inputbox_instructions_string[] = N_(
|
||||||
setmod_text[] = N_(
|
setmod_text[] = N_(
|
||||||
"This feature depends on another which has been configured as a module.\n"
|
"This feature depends on another which has been configured as a module.\n"
|
||||||
"As a result, this feature will be built as a module."),
|
"As a result, this feature will be built as a module."),
|
||||||
nohelp_text[] = N_(
|
|
||||||
"There is no help available for this barebox option.\n"),
|
|
||||||
load_config_text[] = N_(
|
load_config_text[] = N_(
|
||||||
"Enter the name of the configuration file you wish to load. "
|
"Enter the name of the configuration file you wish to load. "
|
||||||
"Accept the name shown to restore the configuration you "
|
"Accept the name shown to restore the configuration you "
|
||||||
|
@ -215,7 +215,7 @@ load_config_help[] = N_(
|
||||||
"to modify that configuration.\n"
|
"to modify that configuration.\n"
|
||||||
"\n"
|
"\n"
|
||||||
"If you are uncertain, then you have probably never used alternate\n"
|
"If you are uncertain, then you have probably never used alternate\n"
|
||||||
"configuration files. You should therefor leave this blank to abort.\n"),
|
"configuration files. You should therefore leave this blank to abort.\n"),
|
||||||
save_config_text[] = N_(
|
save_config_text[] = N_(
|
||||||
"Enter a filename to which this configuration should be saved "
|
"Enter a filename to which this configuration should be saved "
|
||||||
"as an alternate. Leave blank to abort."),
|
"as an alternate. Leave blank to abort."),
|
||||||
|
@ -271,11 +271,10 @@ search_help[] = N_(
|
||||||
"\n");
|
"\n");
|
||||||
|
|
||||||
static int indent;
|
static int indent;
|
||||||
static struct termios ios_org;
|
|
||||||
static int rows = 0, cols = 0;
|
|
||||||
static struct menu *current_menu;
|
static struct menu *current_menu;
|
||||||
static int child_count;
|
static int child_count;
|
||||||
static int single_menu_mode;
|
static int single_menu_mode;
|
||||||
|
static int show_all_options;
|
||||||
|
|
||||||
static void conf(struct menu *menu);
|
static void conf(struct menu *menu);
|
||||||
static void conf_choice(struct menu *menu);
|
static void conf_choice(struct menu *menu);
|
||||||
|
@ -286,113 +285,6 @@ static void show_textbox(const char *title, const char *text, int r, int c);
|
||||||
static void show_helptext(const char *title, const char *text);
|
static void show_helptext(const char *title, const char *text);
|
||||||
static void show_help(struct menu *menu);
|
static void show_help(struct menu *menu);
|
||||||
|
|
||||||
static void init_wsize(void)
|
|
||||||
{
|
|
||||||
struct winsize ws;
|
|
||||||
char *env;
|
|
||||||
|
|
||||||
if (!ioctl(STDIN_FILENO, TIOCGWINSZ, &ws)) {
|
|
||||||
rows = ws.ws_row;
|
|
||||||
cols = ws.ws_col;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!rows) {
|
|
||||||
env = getenv("LINES");
|
|
||||||
if (env)
|
|
||||||
rows = atoi(env);
|
|
||||||
if (!rows)
|
|
||||||
rows = 24;
|
|
||||||
}
|
|
||||||
if (!cols) {
|
|
||||||
env = getenv("COLUMNS");
|
|
||||||
if (env)
|
|
||||||
cols = atoi(env);
|
|
||||||
if (!cols)
|
|
||||||
cols = 80;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rows < 19 || cols < 80) {
|
|
||||||
fprintf(stderr, N_("Your display is too small to run Menuconfig!\n"));
|
|
||||||
fprintf(stderr, N_("It must be at least 19 lines by 80 columns.\n"));
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
rows -= 4;
|
|
||||||
cols -= 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void get_prompt_str(struct gstr *r, struct property *prop)
|
|
||||||
{
|
|
||||||
int i, j;
|
|
||||||
struct menu *submenu[8], *menu;
|
|
||||||
|
|
||||||
str_printf(r, "Prompt: %s\n", prop->text);
|
|
||||||
str_printf(r, " Defined at %s:%d\n", prop->menu->file->name,
|
|
||||||
prop->menu->lineno);
|
|
||||||
if (!expr_is_yes(prop->visible.expr)) {
|
|
||||||
str_append(r, " Depends on: ");
|
|
||||||
expr_gstr_print(prop->visible.expr, r);
|
|
||||||
str_append(r, "\n");
|
|
||||||
}
|
|
||||||
menu = prop->menu->parent;
|
|
||||||
for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent)
|
|
||||||
submenu[i++] = menu;
|
|
||||||
if (i > 0) {
|
|
||||||
str_printf(r, " Location:\n");
|
|
||||||
for (j = 4; --i >= 0; j += 2) {
|
|
||||||
menu = submenu[i];
|
|
||||||
str_printf(r, "%*c-> %s", j, ' ', menu_get_prompt(menu));
|
|
||||||
if (menu->sym) {
|
|
||||||
str_printf(r, " (%s [=%s])", menu->sym->name ?
|
|
||||||
menu->sym->name : "<choice>",
|
|
||||||
sym_get_string_value(menu->sym));
|
|
||||||
}
|
|
||||||
str_append(r, "\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void get_symbol_str(struct gstr *r, struct symbol *sym)
|
|
||||||
{
|
|
||||||
bool hit;
|
|
||||||
struct property *prop;
|
|
||||||
|
|
||||||
str_printf(r, "Symbol: %s [=%s]\n", sym->name,
|
|
||||||
sym_get_string_value(sym));
|
|
||||||
for_all_prompts(sym, prop)
|
|
||||||
get_prompt_str(r, prop);
|
|
||||||
hit = false;
|
|
||||||
for_all_properties(sym, prop, P_SELECT) {
|
|
||||||
if (!hit) {
|
|
||||||
str_append(r, " Selects: ");
|
|
||||||
hit = true;
|
|
||||||
} else
|
|
||||||
str_printf(r, " && ");
|
|
||||||
expr_gstr_print(prop->expr, r);
|
|
||||||
}
|
|
||||||
if (hit)
|
|
||||||
str_append(r, "\n");
|
|
||||||
if (sym->rev_dep.expr) {
|
|
||||||
str_append(r, " Selected by: ");
|
|
||||||
expr_gstr_print(sym->rev_dep.expr, r);
|
|
||||||
str_append(r, "\n");
|
|
||||||
}
|
|
||||||
str_append(r, "\n\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct gstr get_relations_str(struct symbol **sym_arr)
|
|
||||||
{
|
|
||||||
struct symbol *sym;
|
|
||||||
struct gstr res = str_new();
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; sym_arr && (sym = sym_arr[i]); i++)
|
|
||||||
get_symbol_str(&res, sym);
|
|
||||||
if (!i)
|
|
||||||
str_append(&res, "No matches found.\n");
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
static char filename[PATH_MAX+1];
|
static char filename[PATH_MAX+1];
|
||||||
static void set_config_filename(const char *config_filename)
|
static void set_config_filename(const char *config_filename)
|
||||||
{
|
{
|
||||||
|
@ -403,7 +295,7 @@ static void set_config_filename(const char *config_filename)
|
||||||
sym = sym_lookup("KERNELVERSION", 0);
|
sym = sym_lookup("KERNELVERSION", 0);
|
||||||
sym_calc_value(sym);
|
sym_calc_value(sym);
|
||||||
size = snprintf(menu_backtitle, sizeof(menu_backtitle),
|
size = snprintf(menu_backtitle, sizeof(menu_backtitle),
|
||||||
_("%s - barebox v%s Configuration"),
|
_("%s - Barebox v%s Configuration"),
|
||||||
config_filename, sym_get_string_value(sym));
|
config_filename, sym_get_string_value(sym));
|
||||||
if (size >= sizeof(menu_backtitle))
|
if (size >= sizeof(menu_backtitle))
|
||||||
menu_backtitle[sizeof(menu_backtitle)-1] = '\0';
|
menu_backtitle[sizeof(menu_backtitle)-1] = '\0';
|
||||||
|
@ -457,8 +349,16 @@ static void build_conf(struct menu *menu)
|
||||||
int type, tmp, doint = 2;
|
int type, tmp, doint = 2;
|
||||||
tristate val;
|
tristate val;
|
||||||
char ch;
|
char ch;
|
||||||
|
bool visible;
|
||||||
|
|
||||||
if (!menu_is_visible(menu))
|
/*
|
||||||
|
* note: menu_is_visible() has side effect that it will
|
||||||
|
* recalc the value of the symbol.
|
||||||
|
*/
|
||||||
|
visible = menu_is_visible(menu);
|
||||||
|
if (show_all_options && !menu_has_prompt(menu))
|
||||||
|
return;
|
||||||
|
else if (!show_all_options && !visible)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
sym = menu->sym;
|
sym = menu->sym;
|
||||||
|
@ -469,6 +369,7 @@ static void build_conf(struct menu *menu)
|
||||||
switch (prop->type) {
|
switch (prop->type) {
|
||||||
case P_MENU:
|
case P_MENU:
|
||||||
child_count++;
|
child_count++;
|
||||||
|
prompt = _(prompt);
|
||||||
if (single_menu_mode) {
|
if (single_menu_mode) {
|
||||||
item_make("%s%*c%s",
|
item_make("%s%*c%s",
|
||||||
menu->data ? "-->" : "++>",
|
menu->data ? "-->" : "++>",
|
||||||
|
@ -481,10 +382,18 @@ static void build_conf(struct menu *menu)
|
||||||
if (single_menu_mode && menu->data)
|
if (single_menu_mode && menu->data)
|
||||||
goto conf_childs;
|
goto conf_childs;
|
||||||
return;
|
return;
|
||||||
|
case P_COMMENT:
|
||||||
|
if (prompt) {
|
||||||
|
child_count++;
|
||||||
|
item_make(" %*c*** %s ***", indent + 1, ' ', _(prompt));
|
||||||
|
item_set_tag(':');
|
||||||
|
item_set_data(menu);
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
if (prompt) {
|
if (prompt) {
|
||||||
child_count++;
|
child_count++;
|
||||||
item_make("---%*c%s", indent + 1, ' ', prompt);
|
item_make("---%*c%s", indent + 1, ' ', _(prompt));
|
||||||
item_set_tag(':');
|
item_set_tag(':');
|
||||||
item_set_data(menu);
|
item_set_data(menu);
|
||||||
}
|
}
|
||||||
|
@ -528,10 +437,10 @@ static void build_conf(struct menu *menu)
|
||||||
item_set_data(menu);
|
item_set_data(menu);
|
||||||
}
|
}
|
||||||
|
|
||||||
item_add_str("%*c%s", indent + 1, ' ', menu_get_prompt(menu));
|
item_add_str("%*c%s", indent + 1, ' ', _(menu_get_prompt(menu)));
|
||||||
if (val == yes) {
|
if (val == yes) {
|
||||||
if (def_menu) {
|
if (def_menu) {
|
||||||
item_add_str(" (%s)", menu_get_prompt(def_menu));
|
item_add_str(" (%s)", _(menu_get_prompt(def_menu)));
|
||||||
item_add_str(" --->");
|
item_add_str(" --->");
|
||||||
if (def_menu->list) {
|
if (def_menu->list) {
|
||||||
indent += 2;
|
indent += 2;
|
||||||
|
@ -543,7 +452,7 @@ static void build_conf(struct menu *menu)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (menu == current_menu) {
|
if (menu == current_menu) {
|
||||||
item_make("---%*c%s", indent + 1, ' ', menu_get_prompt(menu));
|
item_make("---%*c%s", indent + 1, ' ', _(menu_get_prompt(menu)));
|
||||||
item_set_tag(':');
|
item_set_tag(':');
|
||||||
item_set_data(menu);
|
item_set_data(menu);
|
||||||
goto conf_childs;
|
goto conf_childs;
|
||||||
|
@ -560,7 +469,7 @@ static void build_conf(struct menu *menu)
|
||||||
if (sym_is_changable(sym))
|
if (sym_is_changable(sym))
|
||||||
item_make("[%c]", val == no ? ' ' : '*');
|
item_make("[%c]", val == no ? ' ' : '*');
|
||||||
else
|
else
|
||||||
item_make("---");
|
item_make("-%c-", val == no ? ' ' : '*');
|
||||||
item_set_tag('t');
|
item_set_tag('t');
|
||||||
item_set_data(menu);
|
item_set_data(menu);
|
||||||
break;
|
break;
|
||||||
|
@ -570,10 +479,13 @@ static void build_conf(struct menu *menu)
|
||||||
case mod: ch = 'M'; break;
|
case mod: ch = 'M'; break;
|
||||||
default: ch = ' '; break;
|
default: ch = ' '; break;
|
||||||
}
|
}
|
||||||
if (sym_is_changable(sym))
|
if (sym_is_changable(sym)) {
|
||||||
item_make("<%c>", ch);
|
if (sym->rev_dep.tri == mod)
|
||||||
|
item_make("{%c}", ch);
|
||||||
else
|
else
|
||||||
item_make("---");
|
item_make("<%c>", ch);
|
||||||
|
} else
|
||||||
|
item_make("-%c-", ch);
|
||||||
item_set_tag('t');
|
item_set_tag('t');
|
||||||
item_set_data(menu);
|
item_set_data(menu);
|
||||||
break;
|
break;
|
||||||
|
@ -583,17 +495,17 @@ static void build_conf(struct menu *menu)
|
||||||
tmp = indent - tmp + 4;
|
tmp = indent - tmp + 4;
|
||||||
if (tmp < 0)
|
if (tmp < 0)
|
||||||
tmp = 0;
|
tmp = 0;
|
||||||
item_add_str("%*c%s%s", tmp, ' ', menu_get_prompt(menu),
|
item_add_str("%*c%s%s", tmp, ' ', _(menu_get_prompt(menu)),
|
||||||
(sym_has_value(sym) || !sym_is_changable(sym)) ?
|
(sym_has_value(sym) || !sym_is_changable(sym)) ?
|
||||||
"" : " (NEW)");
|
"" : _(" (NEW)"));
|
||||||
item_set_tag('s');
|
item_set_tag('s');
|
||||||
item_set_data(menu);
|
item_set_data(menu);
|
||||||
goto conf_childs;
|
goto conf_childs;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
item_add_str("%*c%s%s", indent + 1, ' ', menu_get_prompt(menu),
|
item_add_str("%*c%s%s", indent + 1, ' ', _(menu_get_prompt(menu)),
|
||||||
(sym_has_value(sym) || !sym_is_changable(sym)) ?
|
(sym_has_value(sym) || !sym_is_changable(sym)) ?
|
||||||
"" : " (NEW)");
|
"" : _(" (NEW)"));
|
||||||
if (menu->prompt->type == P_MENU) {
|
if (menu->prompt->type == P_MENU) {
|
||||||
item_add_str(" --->");
|
item_add_str(" --->");
|
||||||
return;
|
return;
|
||||||
|
@ -631,7 +543,7 @@ static void conf(struct menu *menu)
|
||||||
item_set_tag('S');
|
item_set_tag('S');
|
||||||
}
|
}
|
||||||
dialog_clear();
|
dialog_clear();
|
||||||
res = dialog_menu(prompt ? prompt : _("Main Menu"),
|
res = dialog_menu(prompt ? _(prompt) : _("Main Menu"),
|
||||||
_(menu_instructions),
|
_(menu_instructions),
|
||||||
active_menu, &s_scroll);
|
active_menu, &s_scroll);
|
||||||
if (res == 1 || res == KEY_ESC || res == -ERRDISPLAYTOOSMALL)
|
if (res == 1 || res == KEY_ESC || res == -ERRDISPLAYTOOSMALL)
|
||||||
|
@ -678,7 +590,7 @@ static void conf(struct menu *menu)
|
||||||
if (sym)
|
if (sym)
|
||||||
show_help(submenu);
|
show_help(submenu);
|
||||||
else
|
else
|
||||||
show_helptext("README", _(mconf_readme));
|
show_helptext(_("README"), _(mconf_readme));
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
if (item_is_tag('t')) {
|
if (item_is_tag('t')) {
|
||||||
|
@ -705,6 +617,9 @@ static void conf(struct menu *menu)
|
||||||
case 7:
|
case 7:
|
||||||
search_conf();
|
search_conf();
|
||||||
break;
|
break;
|
||||||
|
case 8:
|
||||||
|
show_all_options = !show_all_options;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -723,26 +638,17 @@ static void show_helptext(const char *title, const char *text)
|
||||||
static void show_help(struct menu *menu)
|
static void show_help(struct menu *menu)
|
||||||
{
|
{
|
||||||
struct gstr help = str_new();
|
struct gstr help = str_new();
|
||||||
struct symbol *sym = menu->sym;
|
|
||||||
|
|
||||||
if (menu_has_help(menu))
|
help.max_width = getmaxx(stdscr) - 10;
|
||||||
{
|
menu_get_ext_help(menu, &help);
|
||||||
if (sym->name) {
|
|
||||||
str_printf(&help, "CONFIG_%s:\n\n", sym->name);
|
show_helptext(_(menu_get_prompt(menu)), str_get(&help));
|
||||||
str_append(&help, _(menu_get_help(menu)));
|
|
||||||
str_append(&help, "\n");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
str_append(&help, nohelp_text);
|
|
||||||
}
|
|
||||||
get_symbol_str(&help, sym);
|
|
||||||
show_helptext(menu_get_prompt(menu), str_get(&help));
|
|
||||||
str_free(&help);
|
str_free(&help);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void conf_choice(struct menu *menu)
|
static void conf_choice(struct menu *menu)
|
||||||
{
|
{
|
||||||
const char *prompt = menu_get_prompt(menu);
|
const char *prompt = _(menu_get_prompt(menu));
|
||||||
struct menu *child;
|
struct menu *child;
|
||||||
struct symbol *active;
|
struct symbol *active;
|
||||||
|
|
||||||
|
@ -756,7 +662,12 @@ static void conf_choice(struct menu *menu)
|
||||||
for (child = menu->list; child; child = child->next) {
|
for (child = menu->list; child; child = child->next) {
|
||||||
if (!menu_is_visible(child))
|
if (!menu_is_visible(child))
|
||||||
continue;
|
continue;
|
||||||
item_make("%s", menu_get_prompt(child));
|
if (child->sym)
|
||||||
|
item_make("%s", _(menu_get_prompt(child)));
|
||||||
|
else {
|
||||||
|
item_make("*** %s ***", _(menu_get_prompt(child)));
|
||||||
|
item_set_tag(':');
|
||||||
|
}
|
||||||
item_set_data(child);
|
item_set_data(child);
|
||||||
if (child->sym == active)
|
if (child->sym == active)
|
||||||
item_set_selected(1);
|
item_set_selected(1);
|
||||||
|
@ -764,7 +675,7 @@ static void conf_choice(struct menu *menu)
|
||||||
item_set_tag('X');
|
item_set_tag('X');
|
||||||
}
|
}
|
||||||
dialog_clear();
|
dialog_clear();
|
||||||
res = dialog_checklist(prompt ? prompt : _("Main Menu"),
|
res = dialog_checklist(prompt ? _(prompt) : _("Main Menu"),
|
||||||
_(radiolist_instructions),
|
_(radiolist_instructions),
|
||||||
15, 70, 6);
|
15, 70, 6);
|
||||||
selected = item_activate_selected();
|
selected = item_activate_selected();
|
||||||
|
@ -772,6 +683,9 @@ static void conf_choice(struct menu *menu)
|
||||||
case 0:
|
case 0:
|
||||||
if (selected) {
|
if (selected) {
|
||||||
child = item_data();
|
child = item_data();
|
||||||
|
if (!child->sym)
|
||||||
|
break;
|
||||||
|
|
||||||
sym_set_tristate_value(child->sym, yes);
|
sym_set_tristate_value(child->sym, yes);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
@ -797,7 +711,7 @@ static void conf_string(struct menu *menu)
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
int res;
|
int res;
|
||||||
char *heading;
|
const char *heading;
|
||||||
|
|
||||||
switch (sym_get_type(menu->sym)) {
|
switch (sym_get_type(menu->sym)) {
|
||||||
case S_INT:
|
case S_INT:
|
||||||
|
@ -810,10 +724,10 @@ static void conf_string(struct menu *menu)
|
||||||
heading = _(inputbox_instructions_string);
|
heading = _(inputbox_instructions_string);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
heading = "Internal mconf error!";
|
heading = _("Internal mconf error!");
|
||||||
}
|
}
|
||||||
dialog_clear();
|
dialog_clear();
|
||||||
res = dialog_inputbox(prompt ? prompt : _("Main Menu"),
|
res = dialog_inputbox(prompt ? _(prompt) : _("Main Menu"),
|
||||||
heading, 10, 75,
|
heading, 10, 75,
|
||||||
sym_get_string_value(menu->sym));
|
sym_get_string_value(menu->sym));
|
||||||
switch (res) {
|
switch (res) {
|
||||||
|
@ -845,6 +759,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);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
show_textbox(NULL, _("File does not exist!"), 5, 38);
|
show_textbox(NULL, _("File does not exist!"), 5, 38);
|
||||||
|
@ -884,13 +799,9 @@ static void conf_save(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void conf_cleanup(void)
|
|
||||||
{
|
|
||||||
tcsetattr(1, TCSAFLUSH, &ios_org);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int ac, char **av)
|
int main(int ac, char **av)
|
||||||
{
|
{
|
||||||
|
int saved_x, saved_y;
|
||||||
char *mode;
|
char *mode;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
|
@ -907,11 +818,15 @@ int main(int ac, char **av)
|
||||||
single_menu_mode = 1;
|
single_menu_mode = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
tcgetattr(1, &ios_org);
|
initscr();
|
||||||
atexit(conf_cleanup);
|
|
||||||
init_wsize();
|
getyx(stdscr, saved_y, saved_x);
|
||||||
reset_dialog();
|
if (init_dialog(NULL)) {
|
||||||
init_dialog(NULL);
|
fprintf(stderr, N_("Your display is too small to run Menuconfig!\n"));
|
||||||
|
fprintf(stderr, N_("It must be at least 19 lines by 80 columns.\n"));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
set_config_filename(conf_get_configname());
|
set_config_filename(conf_get_configname());
|
||||||
do {
|
do {
|
||||||
conf(&rootmenu);
|
conf(&rootmenu);
|
||||||
|
@ -925,7 +840,7 @@ int main(int ac, char **av)
|
||||||
else
|
else
|
||||||
res = -1;
|
res = -1;
|
||||||
} while (res == KEY_ESC);
|
} while (res == KEY_ESC);
|
||||||
end_dialog();
|
end_dialog(saved_x, saved_y);
|
||||||
|
|
||||||
switch (res) {
|
switch (res) {
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -938,8 +853,8 @@ int main(int ac, char **av)
|
||||||
}
|
}
|
||||||
case -1:
|
case -1:
|
||||||
printf(_("\n\n"
|
printf(_("\n\n"
|
||||||
"*** End of barebox configuration.\n"
|
"*** End of Linux barebox configuration.\n"
|
||||||
"*** Execute 'make' to build barebox or try 'make help'."
|
"*** Execute 'make' to build the barebox or try 'make help'."
|
||||||
"\n\n"));
|
"\n\n"));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -950,3 +865,4 @@ int main(int ac, char **av)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,13 +9,16 @@
|
||||||
#define LKC_DIRECT_LINK
|
#define LKC_DIRECT_LINK
|
||||||
#include "lkc.h"
|
#include "lkc.h"
|
||||||
|
|
||||||
|
static const char nohelp_text[] = N_(
|
||||||
|
"There is no help available for this barebox option.\n");
|
||||||
|
|
||||||
struct menu rootmenu;
|
struct menu rootmenu;
|
||||||
static struct menu **last_entry_ptr;
|
static struct menu **last_entry_ptr;
|
||||||
|
|
||||||
struct file *file_list;
|
struct file *file_list;
|
||||||
struct file *current_file;
|
struct file *current_file;
|
||||||
|
|
||||||
static void menu_warn(struct menu *menu, const char *fmt, ...)
|
void menu_warn(struct menu *menu, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
|
@ -35,7 +38,7 @@ static void prop_warn(struct property *prop, const char *fmt, ...)
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
void menu_init(void)
|
void _menu_init(void)
|
||||||
{
|
{
|
||||||
current_entry = current_menu = &rootmenu;
|
current_entry = current_menu = &rootmenu;
|
||||||
last_entry_ptr = &rootmenu.list;
|
last_entry_ptr = &rootmenu.list;
|
||||||
|
@ -55,6 +58,8 @@ void menu_add_entry(struct symbol *sym)
|
||||||
*last_entry_ptr = menu;
|
*last_entry_ptr = menu;
|
||||||
last_entry_ptr = &menu->next;
|
last_entry_ptr = &menu->next;
|
||||||
current_entry = menu;
|
current_entry = menu;
|
||||||
|
if (sym)
|
||||||
|
menu_add_symbol(P_SYMBOL, sym, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void menu_end_entry(void)
|
void menu_end_entry(void)
|
||||||
|
@ -74,7 +79,7 @@ void menu_end_menu(void)
|
||||||
current_menu = current_menu->parent;
|
current_menu = current_menu->parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct expr *menu_check_dep(struct expr *e)
|
static struct expr *menu_check_dep(struct expr *e)
|
||||||
{
|
{
|
||||||
if (!e)
|
if (!e)
|
||||||
return e;
|
return e;
|
||||||
|
@ -102,6 +107,7 @@ struct expr *menu_check_dep(struct expr *e)
|
||||||
void menu_add_dep(struct expr *dep)
|
void menu_add_dep(struct expr *dep)
|
||||||
{
|
{
|
||||||
current_entry->dep = expr_alloc_and(current_entry->dep, menu_check_dep(dep));
|
current_entry->dep = expr_alloc_and(current_entry->dep, menu_check_dep(dep));
|
||||||
|
current_entry->dir_dep = current_entry->dep;
|
||||||
}
|
}
|
||||||
|
|
||||||
void menu_set_type(int type)
|
void menu_set_type(int type)
|
||||||
|
@ -172,6 +178,9 @@ void menu_add_option(int token, char *arg)
|
||||||
else if (sym_defconfig_list != current_entry->sym)
|
else if (sym_defconfig_list != current_entry->sym)
|
||||||
zconf_error("trying to redefine defconfig symbol");
|
zconf_error("trying to redefine defconfig symbol");
|
||||||
break;
|
break;
|
||||||
|
case T_OPT_ENV:
|
||||||
|
prop_add_env(arg);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -181,7 +190,7 @@ static int menu_range_valid_sym(struct symbol *sym, struct symbol *sym2)
|
||||||
(sym2->type == S_UNKNOWN && sym_string_valid(sym, sym2->name));
|
(sym2->type == S_UNKNOWN && sym_string_valid(sym, sym2->name));
|
||||||
}
|
}
|
||||||
|
|
||||||
void sym_check_prop(struct symbol *sym)
|
static void sym_check_prop(struct symbol *sym)
|
||||||
{
|
{
|
||||||
struct property *prop;
|
struct property *prop;
|
||||||
struct symbol *sym2;
|
struct symbol *sym2;
|
||||||
|
@ -191,7 +200,7 @@ void sym_check_prop(struct symbol *sym)
|
||||||
if ((sym->type == S_STRING || sym->type == S_INT || sym->type == S_HEX) &&
|
if ((sym->type == S_STRING || sym->type == S_INT || sym->type == S_HEX) &&
|
||||||
prop->expr->type != E_SYMBOL)
|
prop->expr->type != E_SYMBOL)
|
||||||
prop_warn(prop,
|
prop_warn(prop,
|
||||||
"default for config symbol '%'"
|
"default for config symbol '%s'"
|
||||||
" must be a single symbol", sym->name);
|
" must be a single symbol", sym->name);
|
||||||
break;
|
break;
|
||||||
case P_SELECT:
|
case P_SELECT:
|
||||||
|
@ -200,12 +209,9 @@ void sym_check_prop(struct symbol *sym)
|
||||||
prop_warn(prop,
|
prop_warn(prop,
|
||||||
"config symbol '%s' uses select, but is "
|
"config symbol '%s' uses select, but is "
|
||||||
"not boolean or tristate", sym->name);
|
"not boolean or tristate", sym->name);
|
||||||
else if (sym2->type == S_UNKNOWN)
|
else if (sym2->type != S_UNKNOWN &&
|
||||||
prop_warn(prop,
|
sym2->type != S_BOOLEAN &&
|
||||||
"'select' used by config symbol '%s' "
|
sym2->type != S_TRISTATE)
|
||||||
"refers to undefined symbol '%s'",
|
|
||||||
sym->name, sym2->name);
|
|
||||||
else if (sym2->type != S_BOOLEAN && sym2->type != S_TRISTATE)
|
|
||||||
prop_warn(prop,
|
prop_warn(prop,
|
||||||
"'%s' has wrong type. 'select' only "
|
"'%s' has wrong type. 'select' only "
|
||||||
"accept arguments of boolean and "
|
"accept arguments of boolean and "
|
||||||
|
@ -235,16 +241,22 @@ void menu_finalize(struct menu *parent)
|
||||||
sym = parent->sym;
|
sym = parent->sym;
|
||||||
if (parent->list) {
|
if (parent->list) {
|
||||||
if (sym && sym_is_choice(sym)) {
|
if (sym && sym_is_choice(sym)) {
|
||||||
/* find the first choice value and find out choice type */
|
if (sym->type == S_UNKNOWN) {
|
||||||
for (menu = parent->list; menu; menu = menu->next) {
|
/* find the first choice value to find out choice type */
|
||||||
if (menu->sym) {
|
|
||||||
current_entry = parent;
|
current_entry = parent;
|
||||||
|
for (menu = parent->list; menu; menu = menu->next) {
|
||||||
|
if (menu->sym && menu->sym->type != S_UNKNOWN) {
|
||||||
menu_set_type(menu->sym->type);
|
menu_set_type(menu->sym->type);
|
||||||
current_entry = menu;
|
|
||||||
menu_set_type(sym->type);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
/* set the type of the remaining choice values */
|
||||||
|
for (menu = parent->list; menu; menu = menu->next) {
|
||||||
|
current_entry = menu;
|
||||||
|
if (menu->sym && menu->sym->type == S_UNKNOWN)
|
||||||
|
menu_set_type(sym->type);
|
||||||
|
}
|
||||||
parentdep = expr_alloc_symbol(sym);
|
parentdep = expr_alloc_symbol(sym);
|
||||||
} else if (parent->prompt)
|
} else if (parent->prompt)
|
||||||
parentdep = parent->prompt->visible.expr;
|
parentdep = parent->prompt->visible.expr;
|
||||||
|
@ -279,6 +291,10 @@ void menu_finalize(struct menu *parent)
|
||||||
for (menu = parent->list; menu; menu = menu->next)
|
for (menu = parent->list; menu; menu = menu->next)
|
||||||
menu_finalize(menu);
|
menu_finalize(menu);
|
||||||
} else if (sym) {
|
} else if (sym) {
|
||||||
|
/* ignore inherited dependencies for dir_dep */
|
||||||
|
sym->dir_dep.expr = expr_transform(expr_copy(parent->dir_dep));
|
||||||
|
sym->dir_dep.expr = expr_eliminate_dups(sym->dir_dep.expr);
|
||||||
|
|
||||||
basedep = parent->prompt ? parent->prompt->visible.expr : NULL;
|
basedep = parent->prompt ? parent->prompt->visible.expr : NULL;
|
||||||
basedep = expr_trans_compare(basedep, E_UNEQUAL, &symbol_no);
|
basedep = expr_trans_compare(basedep, E_UNEQUAL, &symbol_no);
|
||||||
basedep = expr_eliminate_dups(expr_transform(basedep));
|
basedep = expr_eliminate_dups(expr_transform(basedep));
|
||||||
|
@ -311,27 +327,43 @@ void menu_finalize(struct menu *parent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (menu = parent->list; menu; menu = menu->next) {
|
for (menu = parent->list; menu; menu = menu->next) {
|
||||||
if (sym && sym_is_choice(sym) && menu->sym) {
|
if (sym && sym_is_choice(sym) &&
|
||||||
|
menu->sym && !sym_is_choice_value(menu->sym)) {
|
||||||
|
current_entry = menu;
|
||||||
menu->sym->flags |= SYMBOL_CHOICEVAL;
|
menu->sym->flags |= SYMBOL_CHOICEVAL;
|
||||||
if (!menu->prompt)
|
if (!menu->prompt)
|
||||||
menu_warn(menu, "choice value must have a prompt");
|
menu_warn(menu, "choice value must have a prompt");
|
||||||
for (prop = menu->sym->prop; prop; prop = prop->next) {
|
for (prop = menu->sym->prop; prop; prop = prop->next) {
|
||||||
if (prop->type == P_PROMPT && prop->menu != menu) {
|
|
||||||
prop_warn(prop, "choice values "
|
|
||||||
"currently only support a "
|
|
||||||
"single prompt");
|
|
||||||
}
|
|
||||||
if (prop->type == P_DEFAULT)
|
if (prop->type == P_DEFAULT)
|
||||||
prop_warn(prop, "defaults for choice "
|
prop_warn(prop, "defaults for choice "
|
||||||
"values not supported");
|
"values not supported");
|
||||||
|
if (prop->menu == menu)
|
||||||
|
continue;
|
||||||
|
if (prop->type == P_PROMPT &&
|
||||||
|
prop->menu->parent->sym != sym)
|
||||||
|
prop_warn(prop, "choice value used outside its choice group");
|
||||||
|
}
|
||||||
|
/* Non-tristate choice values of tristate choices must
|
||||||
|
* depend on the choice being set to Y. The choice
|
||||||
|
* values' dependencies were propagated to their
|
||||||
|
* properties above, so the change here must be re-
|
||||||
|
* propagated.
|
||||||
|
*/
|
||||||
|
if (sym->type == S_TRISTATE && menu->sym->type != S_TRISTATE) {
|
||||||
|
basedep = expr_alloc_comp(E_EQUAL, sym, &symbol_yes);
|
||||||
|
menu->dep = expr_alloc_and(basedep, menu->dep);
|
||||||
|
for (prop = menu->sym->prop; prop; prop = prop->next) {
|
||||||
|
if (prop->menu != menu)
|
||||||
|
continue;
|
||||||
|
prop->visible.expr = expr_alloc_and(expr_copy(basedep),
|
||||||
|
prop->visible.expr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
current_entry = menu;
|
|
||||||
menu_set_type(sym->type);
|
|
||||||
menu_add_symbol(P_CHOICE, sym, NULL);
|
menu_add_symbol(P_CHOICE, sym, NULL);
|
||||||
prop = sym_get_choice_prop(sym);
|
prop = sym_get_choice_prop(sym);
|
||||||
for (ep = &prop->expr; *ep; ep = &(*ep)->left.expr)
|
for (ep = &prop->expr; *ep; ep = &(*ep)->left.expr)
|
||||||
;
|
;
|
||||||
*ep = expr_alloc_one(E_CHOICE, NULL);
|
*ep = expr_alloc_one(E_LIST, NULL);
|
||||||
(*ep)->right.sym = menu->sym;
|
(*ep)->right.sym = menu->sym;
|
||||||
}
|
}
|
||||||
if (menu->list && (!menu->prompt || !menu->prompt->text)) {
|
if (menu->list && (!menu->prompt || !menu->prompt->text)) {
|
||||||
|
@ -365,6 +397,13 @@ void menu_finalize(struct menu *parent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool menu_has_prompt(struct menu *menu)
|
||||||
|
{
|
||||||
|
if (!menu->prompt)
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool menu_is_visible(struct menu *menu)
|
bool menu_is_visible(struct menu *menu)
|
||||||
{
|
{
|
||||||
struct menu *child;
|
struct menu *child;
|
||||||
|
@ -373,6 +412,7 @@ bool menu_is_visible(struct menu *menu)
|
||||||
|
|
||||||
if (!menu->prompt)
|
if (!menu->prompt)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
sym = menu->sym;
|
sym = menu->sym;
|
||||||
if (sym) {
|
if (sym) {
|
||||||
sym_calc_value(sym);
|
sym_calc_value(sym);
|
||||||
|
@ -382,21 +422,27 @@ bool menu_is_visible(struct menu *menu)
|
||||||
|
|
||||||
if (visible != no)
|
if (visible != no)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (!sym || sym_get_tristate_value(menu->sym) == no)
|
if (!sym || sym_get_tristate_value(menu->sym) == no)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
for (child = menu->list; child; child = child->next)
|
for (child = menu->list; child; child = child->next) {
|
||||||
if (menu_is_visible(child))
|
if (menu_is_visible(child)) {
|
||||||
|
if (sym)
|
||||||
|
sym->flags |= SYMBOL_DEF_USER;
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *menu_get_prompt(struct menu *menu)
|
const char *menu_get_prompt(struct menu *menu)
|
||||||
{
|
{
|
||||||
if (menu->prompt)
|
if (menu->prompt)
|
||||||
return _(menu->prompt->text);
|
return menu->prompt->text;
|
||||||
else if (menu->sym)
|
else if (menu->sym)
|
||||||
return _(menu->sym->name);
|
return menu->sym->name;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -429,3 +475,104 @@ const char *menu_get_help(struct menu *menu)
|
||||||
else
|
else
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void get_prompt_str(struct gstr *r, struct property *prop)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
struct menu *submenu[8], *menu;
|
||||||
|
|
||||||
|
str_printf(r, _("Prompt: %s\n"), _(prop->text));
|
||||||
|
str_printf(r, _(" Defined at %s:%d\n"), prop->menu->file->name,
|
||||||
|
prop->menu->lineno);
|
||||||
|
if (!expr_is_yes(prop->visible.expr)) {
|
||||||
|
str_append(r, _(" Depends on: "));
|
||||||
|
expr_gstr_print(prop->visible.expr, r);
|
||||||
|
str_append(r, "\n");
|
||||||
|
}
|
||||||
|
menu = prop->menu->parent;
|
||||||
|
for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent)
|
||||||
|
submenu[i++] = menu;
|
||||||
|
if (i > 0) {
|
||||||
|
str_printf(r, _(" Location:\n"));
|
||||||
|
for (j = 4; --i >= 0; j += 2) {
|
||||||
|
menu = submenu[i];
|
||||||
|
str_printf(r, "%*c-> %s", j, ' ', _(menu_get_prompt(menu)));
|
||||||
|
if (menu->sym) {
|
||||||
|
str_printf(r, " (%s [=%s])", menu->sym->name ?
|
||||||
|
menu->sym->name : _("<choice>"),
|
||||||
|
sym_get_string_value(menu->sym));
|
||||||
|
}
|
||||||
|
str_append(r, "\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void get_symbol_str(struct gstr *r, struct symbol *sym)
|
||||||
|
{
|
||||||
|
bool hit;
|
||||||
|
struct property *prop;
|
||||||
|
|
||||||
|
if (sym && sym->name) {
|
||||||
|
str_printf(r, "Symbol: %s [=%s]\n", sym->name,
|
||||||
|
sym_get_string_value(sym));
|
||||||
|
str_printf(r, "Type : %s\n", sym_type_name(sym->type));
|
||||||
|
if (sym->type == S_INT || sym->type == S_HEX) {
|
||||||
|
prop = sym_get_range_prop(sym);
|
||||||
|
if (prop) {
|
||||||
|
str_printf(r, "Range : ");
|
||||||
|
expr_gstr_print(prop->expr, r);
|
||||||
|
str_append(r, "\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for_all_prompts(sym, prop)
|
||||||
|
get_prompt_str(r, prop);
|
||||||
|
hit = false;
|
||||||
|
for_all_properties(sym, prop, P_SELECT) {
|
||||||
|
if (!hit) {
|
||||||
|
str_append(r, " Selects: ");
|
||||||
|
hit = true;
|
||||||
|
} else
|
||||||
|
str_printf(r, " && ");
|
||||||
|
expr_gstr_print(prop->expr, r);
|
||||||
|
}
|
||||||
|
if (hit)
|
||||||
|
str_append(r, "\n");
|
||||||
|
if (sym->rev_dep.expr) {
|
||||||
|
str_append(r, _(" Selected by: "));
|
||||||
|
expr_gstr_print(sym->rev_dep.expr, r);
|
||||||
|
str_append(r, "\n");
|
||||||
|
}
|
||||||
|
str_append(r, "\n\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
struct gstr get_relations_str(struct symbol **sym_arr)
|
||||||
|
{
|
||||||
|
struct symbol *sym;
|
||||||
|
struct gstr res = str_new();
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; sym_arr && (sym = sym_arr[i]); i++)
|
||||||
|
get_symbol_str(&res, sym);
|
||||||
|
if (!i)
|
||||||
|
str_append(&res, _("No matches found.\n"));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void menu_get_ext_help(struct menu *menu, struct gstr *help)
|
||||||
|
{
|
||||||
|
struct symbol *sym = menu->sym;
|
||||||
|
|
||||||
|
if (menu_has_help(menu)) {
|
||||||
|
if (sym->name) {
|
||||||
|
str_printf(help, "CONFIG_%s:\n\n", sym->name);
|
||||||
|
str_append(help, _(menu_get_help(menu)));
|
||||||
|
str_append(help, "\n");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
str_append(help, nohelp_text);
|
||||||
|
}
|
||||||
|
if (sym)
|
||||||
|
get_symbol_str(help, sym);
|
||||||
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,617 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2008 Nir Tzachar <nir.tzachar@gmail.com?
|
||||||
|
* Released under the terms of the GNU GPL v2.0.
|
||||||
|
*
|
||||||
|
* Derived from menuconfig.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#include "nconf.h"
|
||||||
|
|
||||||
|
/* a list of all the different widgets we use */
|
||||||
|
attributes_t attributes[ATTR_MAX+1] = {0};
|
||||||
|
|
||||||
|
/* available colors:
|
||||||
|
COLOR_BLACK 0
|
||||||
|
COLOR_RED 1
|
||||||
|
COLOR_GREEN 2
|
||||||
|
COLOR_YELLOW 3
|
||||||
|
COLOR_BLUE 4
|
||||||
|
COLOR_MAGENTA 5
|
||||||
|
COLOR_CYAN 6
|
||||||
|
COLOR_WHITE 7
|
||||||
|
*/
|
||||||
|
static void set_normal_colors(void)
|
||||||
|
{
|
||||||
|
init_pair(NORMAL, -1, -1);
|
||||||
|
init_pair(MAIN_HEADING, COLOR_MAGENTA, -1);
|
||||||
|
|
||||||
|
/* FORE is for the selected item */
|
||||||
|
init_pair(MAIN_MENU_FORE, -1, -1);
|
||||||
|
/* BACK for all the rest */
|
||||||
|
init_pair(MAIN_MENU_BACK, -1, -1);
|
||||||
|
init_pair(MAIN_MENU_GREY, -1, -1);
|
||||||
|
init_pair(MAIN_MENU_HEADING, COLOR_GREEN, -1);
|
||||||
|
init_pair(MAIN_MENU_BOX, COLOR_YELLOW, -1);
|
||||||
|
|
||||||
|
init_pair(SCROLLWIN_TEXT, -1, -1);
|
||||||
|
init_pair(SCROLLWIN_HEADING, COLOR_GREEN, -1);
|
||||||
|
init_pair(SCROLLWIN_BOX, COLOR_YELLOW, -1);
|
||||||
|
|
||||||
|
init_pair(DIALOG_TEXT, -1, -1);
|
||||||
|
init_pair(DIALOG_BOX, COLOR_YELLOW, -1);
|
||||||
|
init_pair(DIALOG_MENU_BACK, COLOR_YELLOW, -1);
|
||||||
|
init_pair(DIALOG_MENU_FORE, COLOR_RED, -1);
|
||||||
|
|
||||||
|
init_pair(INPUT_BOX, COLOR_YELLOW, -1);
|
||||||
|
init_pair(INPUT_HEADING, COLOR_GREEN, -1);
|
||||||
|
init_pair(INPUT_TEXT, -1, -1);
|
||||||
|
init_pair(INPUT_FIELD, -1, -1);
|
||||||
|
|
||||||
|
init_pair(FUNCTION_HIGHLIGHT, -1, -1);
|
||||||
|
init_pair(FUNCTION_TEXT, COLOR_BLUE, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* available attributes:
|
||||||
|
A_NORMAL Normal display (no highlight)
|
||||||
|
A_STANDOUT Best highlighting mode of the terminal.
|
||||||
|
A_UNDERLINE Underlining
|
||||||
|
A_REVERSE Reverse video
|
||||||
|
A_BLINK Blinking
|
||||||
|
A_DIM Half bright
|
||||||
|
A_BOLD Extra bright or bold
|
||||||
|
A_PROTECT Protected mode
|
||||||
|
A_INVIS Invisible or blank mode
|
||||||
|
A_ALTCHARSET Alternate character set
|
||||||
|
A_CHARTEXT Bit-mask to extract a character
|
||||||
|
COLOR_PAIR(n) Color-pair number n
|
||||||
|
*/
|
||||||
|
static void normal_color_theme(void)
|
||||||
|
{
|
||||||
|
/* automatically add color... */
|
||||||
|
#define mkattr(name, attr) do { \
|
||||||
|
attributes[name] = attr | COLOR_PAIR(name); } while (0)
|
||||||
|
mkattr(NORMAL, NORMAL);
|
||||||
|
mkattr(MAIN_HEADING, A_BOLD | A_UNDERLINE);
|
||||||
|
|
||||||
|
mkattr(MAIN_MENU_FORE, A_REVERSE);
|
||||||
|
mkattr(MAIN_MENU_BACK, A_NORMAL);
|
||||||
|
mkattr(MAIN_MENU_GREY, A_NORMAL);
|
||||||
|
mkattr(MAIN_MENU_HEADING, A_BOLD);
|
||||||
|
mkattr(MAIN_MENU_BOX, A_NORMAL);
|
||||||
|
|
||||||
|
mkattr(SCROLLWIN_TEXT, A_NORMAL);
|
||||||
|
mkattr(SCROLLWIN_HEADING, A_BOLD);
|
||||||
|
mkattr(SCROLLWIN_BOX, A_BOLD);
|
||||||
|
|
||||||
|
mkattr(DIALOG_TEXT, A_BOLD);
|
||||||
|
mkattr(DIALOG_BOX, A_BOLD);
|
||||||
|
mkattr(DIALOG_MENU_FORE, A_STANDOUT);
|
||||||
|
mkattr(DIALOG_MENU_BACK, A_NORMAL);
|
||||||
|
|
||||||
|
mkattr(INPUT_BOX, A_NORMAL);
|
||||||
|
mkattr(INPUT_HEADING, A_BOLD);
|
||||||
|
mkattr(INPUT_TEXT, A_NORMAL);
|
||||||
|
mkattr(INPUT_FIELD, A_UNDERLINE);
|
||||||
|
|
||||||
|
mkattr(FUNCTION_HIGHLIGHT, A_BOLD);
|
||||||
|
mkattr(FUNCTION_TEXT, A_REVERSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void no_colors_theme(void)
|
||||||
|
{
|
||||||
|
/* automatically add highlight, no color */
|
||||||
|
#define mkattrn(name, attr) { attributes[name] = attr; }
|
||||||
|
|
||||||
|
mkattrn(NORMAL, NORMAL);
|
||||||
|
mkattrn(MAIN_HEADING, A_BOLD | A_UNDERLINE);
|
||||||
|
|
||||||
|
mkattrn(MAIN_MENU_FORE, A_STANDOUT);
|
||||||
|
mkattrn(MAIN_MENU_BACK, A_NORMAL);
|
||||||
|
mkattrn(MAIN_MENU_GREY, A_NORMAL);
|
||||||
|
mkattrn(MAIN_MENU_HEADING, A_BOLD);
|
||||||
|
mkattrn(MAIN_MENU_BOX, A_NORMAL);
|
||||||
|
|
||||||
|
mkattrn(SCROLLWIN_TEXT, A_NORMAL);
|
||||||
|
mkattrn(SCROLLWIN_HEADING, A_BOLD);
|
||||||
|
mkattrn(SCROLLWIN_BOX, A_BOLD);
|
||||||
|
|
||||||
|
mkattrn(DIALOG_TEXT, A_NORMAL);
|
||||||
|
mkattrn(DIALOG_BOX, A_BOLD);
|
||||||
|
mkattrn(DIALOG_MENU_FORE, A_STANDOUT);
|
||||||
|
mkattrn(DIALOG_MENU_BACK, A_NORMAL);
|
||||||
|
|
||||||
|
mkattrn(INPUT_BOX, A_BOLD);
|
||||||
|
mkattrn(INPUT_HEADING, A_BOLD);
|
||||||
|
mkattrn(INPUT_TEXT, A_NORMAL);
|
||||||
|
mkattrn(INPUT_FIELD, A_UNDERLINE);
|
||||||
|
|
||||||
|
mkattrn(FUNCTION_HIGHLIGHT, A_BOLD);
|
||||||
|
mkattrn(FUNCTION_TEXT, A_REVERSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_colors()
|
||||||
|
{
|
||||||
|
start_color();
|
||||||
|
use_default_colors();
|
||||||
|
set_normal_colors();
|
||||||
|
if (has_colors()) {
|
||||||
|
normal_color_theme();
|
||||||
|
} else {
|
||||||
|
/* give deafults */
|
||||||
|
no_colors_theme();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* this changes the windows attributes !!! */
|
||||||
|
void print_in_middle(WINDOW *win,
|
||||||
|
int starty,
|
||||||
|
int startx,
|
||||||
|
int width,
|
||||||
|
const char *string,
|
||||||
|
chtype color)
|
||||||
|
{ int length, x, y;
|
||||||
|
float temp;
|
||||||
|
|
||||||
|
|
||||||
|
if (win == NULL)
|
||||||
|
win = stdscr;
|
||||||
|
getyx(win, y, x);
|
||||||
|
if (startx != 0)
|
||||||
|
x = startx;
|
||||||
|
if (starty != 0)
|
||||||
|
y = starty;
|
||||||
|
if (width == 0)
|
||||||
|
width = 80;
|
||||||
|
|
||||||
|
length = strlen(string);
|
||||||
|
temp = (width - length) / 2;
|
||||||
|
x = startx + (int)temp;
|
||||||
|
wattrset(win, color);
|
||||||
|
mvwprintw(win, y, x, "%s", string);
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_line_no(const char *text)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int total = 1;
|
||||||
|
|
||||||
|
if (!text)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
for (i = 0; text[i] != '\0'; i++)
|
||||||
|
if (text[i] == '\n')
|
||||||
|
total++;
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *get_line(const char *text, int line_no)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int lines = 0;
|
||||||
|
|
||||||
|
if (!text)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
for (i = 0; text[i] != '\0' && lines < line_no; i++)
|
||||||
|
if (text[i] == '\n')
|
||||||
|
lines++;
|
||||||
|
return text+i;
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_line_length(const char *line)
|
||||||
|
{
|
||||||
|
int res = 0;
|
||||||
|
while (*line != '\0' && *line != '\n') {
|
||||||
|
line++;
|
||||||
|
res++;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* print all lines to the window. */
|
||||||
|
void fill_window(WINDOW *win, const char *text)
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
int total_lines = get_line_no(text);
|
||||||
|
int i;
|
||||||
|
|
||||||
|
getmaxyx(win, y, x);
|
||||||
|
/* do not go over end of line */
|
||||||
|
total_lines = min(total_lines, y);
|
||||||
|
for (i = 0; i < total_lines; i++) {
|
||||||
|
char tmp[x+10];
|
||||||
|
const char *line = get_line(text, i);
|
||||||
|
int len = get_line_length(line);
|
||||||
|
strncpy(tmp, line, min(len, x));
|
||||||
|
tmp[len] = '\0';
|
||||||
|
mvwprintw(win, i, 0, "%s", tmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get the message, and buttons.
|
||||||
|
* each button must be a char*
|
||||||
|
* return the selected button
|
||||||
|
*
|
||||||
|
* this dialog is used for 2 different things:
|
||||||
|
* 1) show a text box, no buttons.
|
||||||
|
* 2) show a dialog, with horizontal buttons
|
||||||
|
*/
|
||||||
|
int btn_dialog(WINDOW *main_window, const char *msg, int btn_num, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
char *btn;
|
||||||
|
int btns_width = 0;
|
||||||
|
int msg_lines = 0;
|
||||||
|
int msg_width = 0;
|
||||||
|
int total_width;
|
||||||
|
int win_rows = 0;
|
||||||
|
WINDOW *win;
|
||||||
|
WINDOW *msg_win;
|
||||||
|
WINDOW *menu_win;
|
||||||
|
MENU *menu;
|
||||||
|
ITEM *btns[btn_num+1];
|
||||||
|
int i, x, y;
|
||||||
|
int res = -1;
|
||||||
|
|
||||||
|
|
||||||
|
va_start(ap, btn_num);
|
||||||
|
for (i = 0; i < btn_num; i++) {
|
||||||
|
btn = va_arg(ap, char *);
|
||||||
|
btns[i] = new_item(btn, "");
|
||||||
|
btns_width += strlen(btn)+1;
|
||||||
|
}
|
||||||
|
va_end(ap);
|
||||||
|
btns[btn_num] = NULL;
|
||||||
|
|
||||||
|
/* find the widest line of msg: */
|
||||||
|
msg_lines = get_line_no(msg);
|
||||||
|
for (i = 0; i < msg_lines; i++) {
|
||||||
|
const char *line = get_line(msg, i);
|
||||||
|
int len = get_line_length(line);
|
||||||
|
if (msg_width < len)
|
||||||
|
msg_width = len;
|
||||||
|
}
|
||||||
|
|
||||||
|
total_width = max(msg_width, btns_width);
|
||||||
|
/* place dialog in middle of screen */
|
||||||
|
y = (LINES-(msg_lines+4))/2;
|
||||||
|
x = (COLS-(total_width+4))/2;
|
||||||
|
|
||||||
|
|
||||||
|
/* create the windows */
|
||||||
|
if (btn_num > 0)
|
||||||
|
win_rows = msg_lines+4;
|
||||||
|
else
|
||||||
|
win_rows = msg_lines+2;
|
||||||
|
|
||||||
|
win = newwin(win_rows, total_width+4, y, x);
|
||||||
|
keypad(win, TRUE);
|
||||||
|
menu_win = derwin(win, 1, btns_width, win_rows-2,
|
||||||
|
1+(total_width+2-btns_width)/2);
|
||||||
|
menu = new_menu(btns);
|
||||||
|
msg_win = derwin(win, win_rows-2, msg_width, 1,
|
||||||
|
1+(total_width+2-msg_width)/2);
|
||||||
|
|
||||||
|
set_menu_fore(menu, attributes[DIALOG_MENU_FORE]);
|
||||||
|
set_menu_back(menu, attributes[DIALOG_MENU_BACK]);
|
||||||
|
|
||||||
|
wattrset(win, attributes[DIALOG_BOX]);
|
||||||
|
box(win, 0, 0);
|
||||||
|
|
||||||
|
/* print message */
|
||||||
|
wattrset(msg_win, attributes[DIALOG_TEXT]);
|
||||||
|
fill_window(msg_win, msg);
|
||||||
|
|
||||||
|
set_menu_win(menu, win);
|
||||||
|
set_menu_sub(menu, menu_win);
|
||||||
|
set_menu_format(menu, 1, btn_num);
|
||||||
|
menu_opts_off(menu, O_SHOWDESC);
|
||||||
|
menu_opts_off(menu, O_SHOWMATCH);
|
||||||
|
menu_opts_on(menu, O_ONEVALUE);
|
||||||
|
menu_opts_on(menu, O_NONCYCLIC);
|
||||||
|
set_menu_mark(menu, "");
|
||||||
|
post_menu(menu);
|
||||||
|
|
||||||
|
|
||||||
|
touchwin(win);
|
||||||
|
refresh_all_windows(main_window);
|
||||||
|
while ((res = wgetch(win))) {
|
||||||
|
switch (res) {
|
||||||
|
case KEY_LEFT:
|
||||||
|
menu_driver(menu, REQ_LEFT_ITEM);
|
||||||
|
break;
|
||||||
|
case KEY_RIGHT:
|
||||||
|
menu_driver(menu, REQ_RIGHT_ITEM);
|
||||||
|
break;
|
||||||
|
case 10: /* ENTER */
|
||||||
|
case 27: /* ESCAPE */
|
||||||
|
case ' ':
|
||||||
|
case KEY_F(F_BACK):
|
||||||
|
case KEY_F(F_EXIT):
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
touchwin(win);
|
||||||
|
refresh_all_windows(main_window);
|
||||||
|
|
||||||
|
if (res == 10 || res == ' ') {
|
||||||
|
res = item_index(current_item(menu));
|
||||||
|
break;
|
||||||
|
} else if (res == 27 || res == KEY_F(F_BACK) ||
|
||||||
|
res == KEY_F(F_EXIT)) {
|
||||||
|
res = KEY_EXIT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unpost_menu(menu);
|
||||||
|
free_menu(menu);
|
||||||
|
for (i = 0; i < btn_num; i++)
|
||||||
|
free_item(btns[i]);
|
||||||
|
|
||||||
|
delwin(win);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
int dialog_inputbox(WINDOW *main_window,
|
||||||
|
const char *title, const char *prompt,
|
||||||
|
const char *init, char *result, int result_len)
|
||||||
|
{
|
||||||
|
int prompt_lines = 0;
|
||||||
|
int prompt_width = 0;
|
||||||
|
WINDOW *win;
|
||||||
|
WINDOW *prompt_win;
|
||||||
|
WINDOW *form_win;
|
||||||
|
PANEL *panel;
|
||||||
|
int i, x, y;
|
||||||
|
int res = -1;
|
||||||
|
int cursor_position = strlen(init);
|
||||||
|
|
||||||
|
|
||||||
|
/* find the widest line of msg: */
|
||||||
|
prompt_lines = get_line_no(prompt);
|
||||||
|
for (i = 0; i < prompt_lines; i++) {
|
||||||
|
const char *line = get_line(prompt, i);
|
||||||
|
int len = get_line_length(line);
|
||||||
|
prompt_width = max(prompt_width, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (title)
|
||||||
|
prompt_width = max(prompt_width, strlen(title));
|
||||||
|
|
||||||
|
/* place dialog in middle of screen */
|
||||||
|
y = (LINES-(prompt_lines+4))/2;
|
||||||
|
x = (COLS-(prompt_width+4))/2;
|
||||||
|
|
||||||
|
strncpy(result, init, result_len);
|
||||||
|
|
||||||
|
/* create the windows */
|
||||||
|
win = newwin(prompt_lines+6, prompt_width+7, y, x);
|
||||||
|
prompt_win = derwin(win, prompt_lines+1, prompt_width, 2, 2);
|
||||||
|
form_win = derwin(win, 1, prompt_width, prompt_lines+3, 2);
|
||||||
|
keypad(form_win, TRUE);
|
||||||
|
|
||||||
|
wattrset(form_win, attributes[INPUT_FIELD]);
|
||||||
|
|
||||||
|
wattrset(win, attributes[INPUT_BOX]);
|
||||||
|
box(win, 0, 0);
|
||||||
|
wattrset(win, attributes[INPUT_HEADING]);
|
||||||
|
if (title)
|
||||||
|
mvwprintw(win, 0, 3, "%s", title);
|
||||||
|
|
||||||
|
/* print message */
|
||||||
|
wattrset(prompt_win, attributes[INPUT_TEXT]);
|
||||||
|
fill_window(prompt_win, prompt);
|
||||||
|
|
||||||
|
mvwprintw(form_win, 0, 0, "%*s", prompt_width, " ");
|
||||||
|
mvwprintw(form_win, 0, 0, "%s", result);
|
||||||
|
|
||||||
|
/* create panels */
|
||||||
|
panel = new_panel(win);
|
||||||
|
|
||||||
|
/* show the cursor */
|
||||||
|
curs_set(1);
|
||||||
|
|
||||||
|
touchwin(win);
|
||||||
|
refresh_all_windows(main_window);
|
||||||
|
while ((res = wgetch(form_win))) {
|
||||||
|
int len = strlen(result);
|
||||||
|
switch (res) {
|
||||||
|
case 10: /* ENTER */
|
||||||
|
case 27: /* ESCAPE */
|
||||||
|
case KEY_F(F_HELP):
|
||||||
|
case KEY_F(F_EXIT):
|
||||||
|
case KEY_F(F_BACK):
|
||||||
|
break;
|
||||||
|
case 127:
|
||||||
|
case KEY_BACKSPACE:
|
||||||
|
if (cursor_position > 0) {
|
||||||
|
memmove(&result[cursor_position-1],
|
||||||
|
&result[cursor_position],
|
||||||
|
len-cursor_position+1);
|
||||||
|
cursor_position--;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case KEY_DC:
|
||||||
|
if (cursor_position >= 0 && cursor_position < len) {
|
||||||
|
memmove(&result[cursor_position],
|
||||||
|
&result[cursor_position+1],
|
||||||
|
len-cursor_position+1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case KEY_UP:
|
||||||
|
case KEY_RIGHT:
|
||||||
|
if (cursor_position < len &&
|
||||||
|
cursor_position < min(result_len, prompt_width))
|
||||||
|
cursor_position++;
|
||||||
|
break;
|
||||||
|
case KEY_DOWN:
|
||||||
|
case KEY_LEFT:
|
||||||
|
if (cursor_position > 0)
|
||||||
|
cursor_position--;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if ((isgraph(res) || isspace(res)) &&
|
||||||
|
len-2 < result_len) {
|
||||||
|
/* insert the char at the proper position */
|
||||||
|
memmove(&result[cursor_position+1],
|
||||||
|
&result[cursor_position],
|
||||||
|
len+1);
|
||||||
|
result[cursor_position] = res;
|
||||||
|
cursor_position++;
|
||||||
|
} else {
|
||||||
|
mvprintw(0, 0, "unknow key: %d\n", res);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
wmove(form_win, 0, 0);
|
||||||
|
wclrtoeol(form_win);
|
||||||
|
mvwprintw(form_win, 0, 0, "%*s", prompt_width, " ");
|
||||||
|
mvwprintw(form_win, 0, 0, "%s", result);
|
||||||
|
wmove(form_win, 0, cursor_position);
|
||||||
|
touchwin(win);
|
||||||
|
refresh_all_windows(main_window);
|
||||||
|
|
||||||
|
if (res == 10) {
|
||||||
|
res = 0;
|
||||||
|
break;
|
||||||
|
} else if (res == 27 || res == KEY_F(F_BACK) ||
|
||||||
|
res == KEY_F(F_EXIT)) {
|
||||||
|
res = KEY_EXIT;
|
||||||
|
break;
|
||||||
|
} else if (res == KEY_F(F_HELP)) {
|
||||||
|
res = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* hide the cursor */
|
||||||
|
curs_set(0);
|
||||||
|
del_panel(panel);
|
||||||
|
delwin(prompt_win);
|
||||||
|
delwin(form_win);
|
||||||
|
delwin(win);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* refresh all windows in the correct order */
|
||||||
|
void refresh_all_windows(WINDOW *main_window)
|
||||||
|
{
|
||||||
|
update_panels();
|
||||||
|
touchwin(main_window);
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* layman's scrollable window... */
|
||||||
|
void show_scroll_win(WINDOW *main_window,
|
||||||
|
const char *title,
|
||||||
|
const char *text)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
int total_lines = get_line_no(text);
|
||||||
|
int x, y;
|
||||||
|
int start_x = 0, start_y = 0;
|
||||||
|
int text_lines = 0, text_cols = 0;
|
||||||
|
int total_cols = 0;
|
||||||
|
int win_cols = 0;
|
||||||
|
int win_lines = 0;
|
||||||
|
int i = 0;
|
||||||
|
WINDOW *win;
|
||||||
|
WINDOW *pad;
|
||||||
|
PANEL *panel;
|
||||||
|
|
||||||
|
/* find the widest line of msg: */
|
||||||
|
total_lines = get_line_no(text);
|
||||||
|
for (i = 0; i < total_lines; i++) {
|
||||||
|
const char *line = get_line(text, i);
|
||||||
|
int len = get_line_length(line);
|
||||||
|
total_cols = max(total_cols, len+2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* create the pad */
|
||||||
|
pad = newpad(total_lines+10, total_cols+10);
|
||||||
|
wattrset(pad, attributes[SCROLLWIN_TEXT]);
|
||||||
|
fill_window(pad, text);
|
||||||
|
|
||||||
|
win_lines = min(total_lines+4, LINES-2);
|
||||||
|
win_cols = min(total_cols+2, COLS-2);
|
||||||
|
text_lines = max(win_lines-4, 0);
|
||||||
|
text_cols = max(win_cols-2, 0);
|
||||||
|
|
||||||
|
/* place window in middle of screen */
|
||||||
|
y = (LINES-win_lines)/2;
|
||||||
|
x = (COLS-win_cols)/2;
|
||||||
|
|
||||||
|
win = newwin(win_lines, win_cols, y, x);
|
||||||
|
keypad(win, TRUE);
|
||||||
|
/* show the help in the help window, and show the help panel */
|
||||||
|
wattrset(win, attributes[SCROLLWIN_BOX]);
|
||||||
|
box(win, 0, 0);
|
||||||
|
wattrset(win, attributes[SCROLLWIN_HEADING]);
|
||||||
|
mvwprintw(win, 0, 3, " %s ", title);
|
||||||
|
panel = new_panel(win);
|
||||||
|
|
||||||
|
/* handle scrolling */
|
||||||
|
do {
|
||||||
|
|
||||||
|
copywin(pad, win, start_y, start_x, 2, 2, text_lines,
|
||||||
|
text_cols, 0);
|
||||||
|
print_in_middle(win,
|
||||||
|
text_lines+2,
|
||||||
|
0,
|
||||||
|
text_cols,
|
||||||
|
"<OK>",
|
||||||
|
attributes[DIALOG_MENU_FORE]);
|
||||||
|
wrefresh(win);
|
||||||
|
|
||||||
|
res = wgetch(win);
|
||||||
|
switch (res) {
|
||||||
|
case KEY_NPAGE:
|
||||||
|
case ' ':
|
||||||
|
start_y += text_lines-2;
|
||||||
|
break;
|
||||||
|
case KEY_PPAGE:
|
||||||
|
start_y -= text_lines+2;
|
||||||
|
break;
|
||||||
|
case KEY_HOME:
|
||||||
|
start_y = 0;
|
||||||
|
break;
|
||||||
|
case KEY_END:
|
||||||
|
start_y = total_lines-text_lines;
|
||||||
|
break;
|
||||||
|
case KEY_DOWN:
|
||||||
|
case 'j':
|
||||||
|
start_y++;
|
||||||
|
break;
|
||||||
|
case KEY_UP:
|
||||||
|
case 'k':
|
||||||
|
start_y--;
|
||||||
|
break;
|
||||||
|
case KEY_LEFT:
|
||||||
|
case 'h':
|
||||||
|
start_x--;
|
||||||
|
break;
|
||||||
|
case KEY_RIGHT:
|
||||||
|
case 'l':
|
||||||
|
start_x++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (res == 10 || res == 27 || res == 'q'
|
||||||
|
|| res == KEY_F(F_BACK) || res == KEY_F(F_EXIT)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (start_y < 0)
|
||||||
|
start_y = 0;
|
||||||
|
if (start_y >= total_lines-text_lines)
|
||||||
|
start_y = total_lines-text_lines;
|
||||||
|
if (start_x < 0)
|
||||||
|
start_x = 0;
|
||||||
|
if (start_x >= total_cols-text_cols)
|
||||||
|
start_x = total_cols-text_cols;
|
||||||
|
} while (res);
|
||||||
|
|
||||||
|
del_panel(panel);
|
||||||
|
delwin(win);
|
||||||
|
refresh_all_windows(main_window);
|
||||||
|
}
|
|
@ -0,0 +1,95 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2008 Nir Tzachar <nir.tzachar@gmail.com?
|
||||||
|
* Released under the terms of the GNU GPL v2.0.
|
||||||
|
*
|
||||||
|
* Derived from menuconfig.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <locale.h>
|
||||||
|
#include <curses.h>
|
||||||
|
#include <menu.h>
|
||||||
|
#include <panel.h>
|
||||||
|
#include <form.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
|
#include "ncurses.h"
|
||||||
|
|
||||||
|
#define max(a, b) ({\
|
||||||
|
typeof(a) _a = a;\
|
||||||
|
typeof(b) _b = b;\
|
||||||
|
_a > _b ? _a : _b; })
|
||||||
|
|
||||||
|
#define min(a, b) ({\
|
||||||
|
typeof(a) _a = a;\
|
||||||
|
typeof(b) _b = b;\
|
||||||
|
_a < _b ? _a : _b; })
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
NORMAL = 1,
|
||||||
|
MAIN_HEADING,
|
||||||
|
MAIN_MENU_BOX,
|
||||||
|
MAIN_MENU_FORE,
|
||||||
|
MAIN_MENU_BACK,
|
||||||
|
MAIN_MENU_GREY,
|
||||||
|
MAIN_MENU_HEADING,
|
||||||
|
SCROLLWIN_TEXT,
|
||||||
|
SCROLLWIN_HEADING,
|
||||||
|
SCROLLWIN_BOX,
|
||||||
|
DIALOG_TEXT,
|
||||||
|
DIALOG_MENU_FORE,
|
||||||
|
DIALOG_MENU_BACK,
|
||||||
|
DIALOG_BOX,
|
||||||
|
INPUT_BOX,
|
||||||
|
INPUT_HEADING,
|
||||||
|
INPUT_TEXT,
|
||||||
|
INPUT_FIELD,
|
||||||
|
FUNCTION_TEXT,
|
||||||
|
FUNCTION_HIGHLIGHT,
|
||||||
|
ATTR_MAX
|
||||||
|
} attributes_t;
|
||||||
|
extern attributes_t attributes[];
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
F_HELP = 1,
|
||||||
|
F_SYMBOL = 2,
|
||||||
|
F_INSTS = 3,
|
||||||
|
F_CONF = 4,
|
||||||
|
F_BACK = 5,
|
||||||
|
F_SAVE = 6,
|
||||||
|
F_LOAD = 7,
|
||||||
|
F_EXIT = 8
|
||||||
|
} function_key;
|
||||||
|
|
||||||
|
void set_colors(void);
|
||||||
|
|
||||||
|
/* this changes the windows attributes !!! */
|
||||||
|
void print_in_middle(WINDOW *win,
|
||||||
|
int starty,
|
||||||
|
int startx,
|
||||||
|
int width,
|
||||||
|
const char *string,
|
||||||
|
chtype color);
|
||||||
|
int get_line_length(const char *line);
|
||||||
|
int get_line_no(const char *text);
|
||||||
|
const char *get_line(const char *text, int line_no);
|
||||||
|
void fill_window(WINDOW *win, const char *text);
|
||||||
|
int btn_dialog(WINDOW *main_window, const char *msg, int btn_num, ...);
|
||||||
|
int dialog_inputbox(WINDOW *main_window,
|
||||||
|
const char *title, const char *prompt,
|
||||||
|
const char *init, char *result, int result_len);
|
||||||
|
void refresh_all_windows(WINDOW *main_window);
|
||||||
|
void show_scroll_win(WINDOW *main_window,
|
||||||
|
const char *title,
|
||||||
|
const char *text);
|
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
#include <qapplication.h>
|
#include <qapplication.h>
|
||||||
#include <qmainwindow.h>
|
#include <qmainwindow.h>
|
||||||
|
#include <qdesktopwidget.h>
|
||||||
#include <qtoolbar.h>
|
#include <qtoolbar.h>
|
||||||
#include <qlayout.h>
|
#include <qlayout.h>
|
||||||
#include <qvbox.h>
|
#include <qvbox.h>
|
||||||
|
@ -57,11 +58,10 @@ QValueList<int> ConfigSettings::readSizes(const QString& key, bool *ok)
|
||||||
{
|
{
|
||||||
QValueList<int> result;
|
QValueList<int> result;
|
||||||
QStringList entryList = readListEntry(key, ok);
|
QStringList entryList = readListEntry(key, ok);
|
||||||
if (ok) {
|
|
||||||
QStringList::Iterator it;
|
QStringList::Iterator it;
|
||||||
|
|
||||||
for (it = entryList.begin(); it != entryList.end(); ++it)
|
for (it = entryList.begin(); it != entryList.end(); ++it)
|
||||||
result.push_back((*it).toInt());
|
result.push_back((*it).toInt());
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -114,7 +114,7 @@ void ConfigItem::updateMenu(void)
|
||||||
|
|
||||||
sym = menu->sym;
|
sym = menu->sym;
|
||||||
prop = menu->prompt;
|
prop = menu->prompt;
|
||||||
prompt = QString::fromLocal8Bit(menu_get_prompt(menu));
|
prompt = _(menu_get_prompt(menu));
|
||||||
|
|
||||||
if (prop) switch (prop->type) {
|
if (prop) switch (prop->type) {
|
||||||
case P_MENU:
|
case P_MENU:
|
||||||
|
@ -148,7 +148,7 @@ void ConfigItem::updateMenu(void)
|
||||||
case S_TRISTATE:
|
case S_TRISTATE:
|
||||||
char ch;
|
char ch;
|
||||||
|
|
||||||
if (!sym_is_changable(sym) && !list->showAll) {
|
if (!sym_is_changable(sym) && list->optMode == normalOpt) {
|
||||||
setPixmap(promptColIdx, 0);
|
setPixmap(promptColIdx, 0);
|
||||||
setText(noColIdx, QString::null);
|
setText(noColIdx, QString::null);
|
||||||
setText(modColIdx, QString::null);
|
setText(modColIdx, QString::null);
|
||||||
|
@ -208,7 +208,7 @@ void ConfigItem::updateMenu(void)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (!sym_has_value(sym) && visible)
|
if (!sym_has_value(sym) && visible)
|
||||||
prompt += " (NEW)";
|
prompt += _(" (NEW)");
|
||||||
set_prompt:
|
set_prompt:
|
||||||
setText(promptColIdx, prompt);
|
setText(promptColIdx, prompt);
|
||||||
}
|
}
|
||||||
|
@ -297,10 +297,10 @@ void ConfigLineEdit::show(ConfigItem* i)
|
||||||
void ConfigLineEdit::keyPressEvent(QKeyEvent* e)
|
void ConfigLineEdit::keyPressEvent(QKeyEvent* e)
|
||||||
{
|
{
|
||||||
switch (e->key()) {
|
switch (e->key()) {
|
||||||
case Key_Escape:
|
case Qt::Key_Escape:
|
||||||
break;
|
break;
|
||||||
case Key_Return:
|
case Qt::Key_Return:
|
||||||
case Key_Enter:
|
case Qt::Key_Enter:
|
||||||
sym_set_string_value(item->menu->sym, text().latin1());
|
sym_set_string_value(item->menu->sym, text().latin1());
|
||||||
parent()->updateList(item);
|
parent()->updateList(item);
|
||||||
break;
|
break;
|
||||||
|
@ -319,7 +319,7 @@ ConfigList::ConfigList(ConfigView* p, const char *name)
|
||||||
symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no),
|
symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no),
|
||||||
choiceYesPix(xpm_choice_yes), choiceNoPix(xpm_choice_no),
|
choiceYesPix(xpm_choice_yes), choiceNoPix(xpm_choice_no),
|
||||||
menuPix(xpm_menu), menuInvPix(xpm_menu_inv), menuBackPix(xpm_menuback), voidPix(xpm_void),
|
menuPix(xpm_menu), menuInvPix(xpm_menu_inv), menuBackPix(xpm_menuback), voidPix(xpm_void),
|
||||||
showAll(false), showName(false), showRange(false), showData(false),
|
showName(false), showRange(false), showData(false), optMode(normalOpt),
|
||||||
rootEntry(0), headerPopup(0)
|
rootEntry(0), headerPopup(0)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -336,21 +336,32 @@ ConfigList::ConfigList(ConfigView* p, const char *name)
|
||||||
|
|
||||||
if (name) {
|
if (name) {
|
||||||
configSettings->beginGroup(name);
|
configSettings->beginGroup(name);
|
||||||
showAll = configSettings->readBoolEntry("/showAll", false);
|
|
||||||
showName = configSettings->readBoolEntry("/showName", false);
|
showName = configSettings->readBoolEntry("/showName", false);
|
||||||
showRange = configSettings->readBoolEntry("/showRange", false);
|
showRange = configSettings->readBoolEntry("/showRange", false);
|
||||||
showData = configSettings->readBoolEntry("/showData", false);
|
showData = configSettings->readBoolEntry("/showData", false);
|
||||||
|
optMode = (enum optionMode)configSettings->readNumEntry("/optionMode", false);
|
||||||
configSettings->endGroup();
|
configSettings->endGroup();
|
||||||
connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
|
connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < colNr; i++)
|
for (i = 0; i < colNr; i++)
|
||||||
colMap[i] = colRevMap[i] = -1;
|
colMap[i] = colRevMap[i] = -1;
|
||||||
addColumn(promptColIdx, "Option");
|
addColumn(promptColIdx, _("Option"));
|
||||||
|
|
||||||
reinit();
|
reinit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ConfigList::menuSkip(struct menu *menu)
|
||||||
|
{
|
||||||
|
if (optMode == normalOpt && menu_is_visible(menu))
|
||||||
|
return false;
|
||||||
|
if (optMode == promptOpt && menu_has_prompt(menu))
|
||||||
|
return false;
|
||||||
|
if (optMode == allOpt)
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void ConfigList::reinit(void)
|
void ConfigList::reinit(void)
|
||||||
{
|
{
|
||||||
removeColumn(dataColIdx);
|
removeColumn(dataColIdx);
|
||||||
|
@ -360,14 +371,14 @@ void ConfigList::reinit(void)
|
||||||
removeColumn(nameColIdx);
|
removeColumn(nameColIdx);
|
||||||
|
|
||||||
if (showName)
|
if (showName)
|
||||||
addColumn(nameColIdx, "Name");
|
addColumn(nameColIdx, _("Name"));
|
||||||
if (showRange) {
|
if (showRange) {
|
||||||
addColumn(noColIdx, "N");
|
addColumn(noColIdx, "N");
|
||||||
addColumn(modColIdx, "M");
|
addColumn(modColIdx, "M");
|
||||||
addColumn(yesColIdx, "Y");
|
addColumn(yesColIdx, "Y");
|
||||||
}
|
}
|
||||||
if (showData)
|
if (showData)
|
||||||
addColumn(dataColIdx, "Value");
|
addColumn(dataColIdx, _("Value"));
|
||||||
|
|
||||||
updateListAll();
|
updateListAll();
|
||||||
}
|
}
|
||||||
|
@ -379,7 +390,7 @@ void ConfigList::saveSettings(void)
|
||||||
configSettings->writeEntry("/showName", showName);
|
configSettings->writeEntry("/showName", showName);
|
||||||
configSettings->writeEntry("/showRange", showRange);
|
configSettings->writeEntry("/showRange", showRange);
|
||||||
configSettings->writeEntry("/showData", showData);
|
configSettings->writeEntry("/showData", showData);
|
||||||
configSettings->writeEntry("/showAll", showAll);
|
configSettings->writeEntry("/optionMode", (int)optMode);
|
||||||
configSettings->endGroup();
|
configSettings->endGroup();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -605,7 +616,7 @@ void ConfigList::updateMenuList(P* parent, struct menu* menu)
|
||||||
}
|
}
|
||||||
|
|
||||||
visible = menu_is_visible(child);
|
visible = menu_is_visible(child);
|
||||||
if (showAll || visible) {
|
if (!menuSkip(child)) {
|
||||||
if (!child->sym && !child->list && !child->prompt)
|
if (!child->sym && !child->list && !child->prompt)
|
||||||
continue;
|
continue;
|
||||||
if (!item || item->menu != child)
|
if (!item || item->menu != child)
|
||||||
|
@ -639,7 +650,7 @@ void ConfigList::keyPressEvent(QKeyEvent* ev)
|
||||||
struct menu *menu;
|
struct menu *menu;
|
||||||
enum prop_type type;
|
enum prop_type type;
|
||||||
|
|
||||||
if (ev->key() == Key_Escape && mode != fullMode && mode != listMode) {
|
if (ev->key() == Qt::Key_Escape && mode != fullMode && mode != listMode) {
|
||||||
emit parentSelected();
|
emit parentSelected();
|
||||||
ev->accept();
|
ev->accept();
|
||||||
return;
|
return;
|
||||||
|
@ -652,8 +663,8 @@ void ConfigList::keyPressEvent(QKeyEvent* ev)
|
||||||
item = (ConfigItem*)i;
|
item = (ConfigItem*)i;
|
||||||
|
|
||||||
switch (ev->key()) {
|
switch (ev->key()) {
|
||||||
case Key_Return:
|
case Qt::Key_Return:
|
||||||
case Key_Enter:
|
case Qt::Key_Enter:
|
||||||
if (item->goParent) {
|
if (item->goParent) {
|
||||||
emit parentSelected();
|
emit parentSelected();
|
||||||
break;
|
break;
|
||||||
|
@ -667,16 +678,16 @@ void ConfigList::keyPressEvent(QKeyEvent* ev)
|
||||||
emit menuSelected(menu);
|
emit menuSelected(menu);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Key_Space:
|
case Qt::Key_Space:
|
||||||
changeValue(item);
|
changeValue(item);
|
||||||
break;
|
break;
|
||||||
case Key_N:
|
case Qt::Key_N:
|
||||||
setValue(item, no);
|
setValue(item, no);
|
||||||
break;
|
break;
|
||||||
case Key_M:
|
case Qt::Key_M:
|
||||||
setValue(item, mod);
|
setValue(item, mod);
|
||||||
break;
|
break;
|
||||||
case Key_Y:
|
case Qt::Key_Y:
|
||||||
setValue(item, yes);
|
setValue(item, yes);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -803,7 +814,7 @@ void ConfigList::contextMenuEvent(QContextMenuEvent *e)
|
||||||
QAction *action;
|
QAction *action;
|
||||||
|
|
||||||
headerPopup = new QPopupMenu(this);
|
headerPopup = new QPopupMenu(this);
|
||||||
action = new QAction(NULL, "Show Name", 0, this);
|
action = new QAction(NULL, _("Show Name"), 0, this);
|
||||||
action->setToggleAction(TRUE);
|
action->setToggleAction(TRUE);
|
||||||
connect(action, SIGNAL(toggled(bool)),
|
connect(action, SIGNAL(toggled(bool)),
|
||||||
parent(), SLOT(setShowName(bool)));
|
parent(), SLOT(setShowName(bool)));
|
||||||
|
@ -811,7 +822,7 @@ void ConfigList::contextMenuEvent(QContextMenuEvent *e)
|
||||||
action, SLOT(setOn(bool)));
|
action, SLOT(setOn(bool)));
|
||||||
action->setOn(showName);
|
action->setOn(showName);
|
||||||
action->addTo(headerPopup);
|
action->addTo(headerPopup);
|
||||||
action = new QAction(NULL, "Show Range", 0, this);
|
action = new QAction(NULL, _("Show Range"), 0, this);
|
||||||
action->setToggleAction(TRUE);
|
action->setToggleAction(TRUE);
|
||||||
connect(action, SIGNAL(toggled(bool)),
|
connect(action, SIGNAL(toggled(bool)),
|
||||||
parent(), SLOT(setShowRange(bool)));
|
parent(), SLOT(setShowRange(bool)));
|
||||||
|
@ -819,7 +830,7 @@ void ConfigList::contextMenuEvent(QContextMenuEvent *e)
|
||||||
action, SLOT(setOn(bool)));
|
action, SLOT(setOn(bool)));
|
||||||
action->setOn(showRange);
|
action->setOn(showRange);
|
||||||
action->addTo(headerPopup);
|
action->addTo(headerPopup);
|
||||||
action = new QAction(NULL, "Show Data", 0, this);
|
action = new QAction(NULL, _("Show Data"), 0, this);
|
||||||
action->setToggleAction(TRUE);
|
action->setToggleAction(TRUE);
|
||||||
connect(action, SIGNAL(toggled(bool)),
|
connect(action, SIGNAL(toggled(bool)),
|
||||||
parent(), SLOT(setShowData(bool)));
|
parent(), SLOT(setShowData(bool)));
|
||||||
|
@ -835,6 +846,9 @@ void ConfigList::contextMenuEvent(QContextMenuEvent *e)
|
||||||
}
|
}
|
||||||
|
|
||||||
ConfigView*ConfigView::viewList;
|
ConfigView*ConfigView::viewList;
|
||||||
|
QAction *ConfigView::showNormalAction;
|
||||||
|
QAction *ConfigView::showAllAction;
|
||||||
|
QAction *ConfigView::showPromptAction;
|
||||||
|
|
||||||
ConfigView::ConfigView(QWidget* parent, const char *name)
|
ConfigView::ConfigView(QWidget* parent, const char *name)
|
||||||
: Parent(parent, name)
|
: Parent(parent, name)
|
||||||
|
@ -859,13 +873,16 @@ ConfigView::~ConfigView(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfigView::setShowAll(bool b)
|
void ConfigView::setOptionMode(QAction *act)
|
||||||
{
|
{
|
||||||
if (list->showAll != b) {
|
if (act == showNormalAction)
|
||||||
list->showAll = b;
|
list->optMode = normalOpt;
|
||||||
|
else if (act == showAllAction)
|
||||||
|
list->optMode = allOpt;
|
||||||
|
else
|
||||||
|
list->optMode = promptOpt;
|
||||||
|
|
||||||
list->updateListAll();
|
list->updateListAll();
|
||||||
emit showAllChanged(b);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfigView::setShowName(bool b)
|
void ConfigView::setShowName(bool b)
|
||||||
|
@ -920,7 +937,7 @@ void ConfigView::updateListAll(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
ConfigInfoView::ConfigInfoView(QWidget* parent, const char *name)
|
ConfigInfoView::ConfigInfoView(QWidget* parent, const char *name)
|
||||||
: Parent(parent, name), menu(0), sym(0)
|
: Parent(parent, name), sym(0), menu(0)
|
||||||
{
|
{
|
||||||
if (name) {
|
if (name) {
|
||||||
configSettings->beginGroup(name);
|
configSettings->beginGroup(name);
|
||||||
|
@ -963,34 +980,6 @@ void ConfigInfoView::setInfo(struct menu *m)
|
||||||
menuInfo();
|
menuInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfigInfoView::setSource(const QString& name)
|
|
||||||
{
|
|
||||||
const char *p = name.latin1();
|
|
||||||
|
|
||||||
menu = NULL;
|
|
||||||
sym = NULL;
|
|
||||||
|
|
||||||
switch (p[0]) {
|
|
||||||
case 'm':
|
|
||||||
struct menu *m;
|
|
||||||
|
|
||||||
if (sscanf(p, "m%p", &m) == 1 && menu != m) {
|
|
||||||
menu = m;
|
|
||||||
menuInfo();
|
|
||||||
emit menuSelected(menu);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 's':
|
|
||||||
struct symbol *s;
|
|
||||||
|
|
||||||
if (sscanf(p, "s%p", &s) == 1 && sym != s) {
|
|
||||||
sym = s;
|
|
||||||
symbolInfo();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConfigInfoView::symbolInfo(void)
|
void ConfigInfoView::symbolInfo(void)
|
||||||
{
|
{
|
||||||
QString str;
|
QString str;
|
||||||
|
@ -1041,7 +1030,10 @@ void ConfigInfoView::menuInfo(void)
|
||||||
if (showDebug())
|
if (showDebug())
|
||||||
debug = debug_info(sym);
|
debug = debug_info(sym);
|
||||||
|
|
||||||
help = print_filter(_(menu_get_help(menu)));
|
struct gstr help_gstr = str_new();
|
||||||
|
menu_get_ext_help(menu, &help_gstr);
|
||||||
|
help = print_filter(str_get(&help_gstr));
|
||||||
|
str_free(&help_gstr);
|
||||||
} else if (menu->prompt) {
|
} else if (menu->prompt) {
|
||||||
head += "<big><b>";
|
head += "<big><b>";
|
||||||
head += print_filter(_(menu->prompt->text));
|
head += print_filter(_(menu->prompt->text));
|
||||||
|
@ -1083,7 +1075,11 @@ QString ConfigInfoView::debug_info(struct symbol *sym)
|
||||||
debug += "</a><br>";
|
debug += "</a><br>";
|
||||||
break;
|
break;
|
||||||
case P_DEFAULT:
|
case P_DEFAULT:
|
||||||
debug += "default: ";
|
case P_SELECT:
|
||||||
|
case P_RANGE:
|
||||||
|
case P_ENV:
|
||||||
|
debug += prop_get_type_name(prop->type);
|
||||||
|
debug += ": ";
|
||||||
expr_print(prop->expr, expr_print_help, &debug, E_NONE);
|
expr_print(prop->expr, expr_print_help, &debug, E_NONE);
|
||||||
debug += "<br>";
|
debug += "<br>";
|
||||||
break;
|
break;
|
||||||
|
@ -1094,16 +1090,6 @@ QString ConfigInfoView::debug_info(struct symbol *sym)
|
||||||
debug += "<br>";
|
debug += "<br>";
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case P_SELECT:
|
|
||||||
debug += "select: ";
|
|
||||||
expr_print(prop->expr, expr_print_help, &debug, E_NONE);
|
|
||||||
debug += "<br>";
|
|
||||||
break;
|
|
||||||
case P_RANGE:
|
|
||||||
debug += "range: ";
|
|
||||||
expr_print(prop->expr, expr_print_help, &debug, E_NONE);
|
|
||||||
debug += "<br>";
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
debug += "unknown property: ";
|
debug += "unknown property: ";
|
||||||
debug += prop_get_type_name(prop->type);
|
debug += prop_get_type_name(prop->type);
|
||||||
|
@ -1167,7 +1153,7 @@ void ConfigInfoView::expr_print_help(void *data, struct symbol *sym, const char
|
||||||
QPopupMenu* ConfigInfoView::createPopupMenu(const QPoint& pos)
|
QPopupMenu* ConfigInfoView::createPopupMenu(const QPoint& pos)
|
||||||
{
|
{
|
||||||
QPopupMenu* popup = Parent::createPopupMenu(pos);
|
QPopupMenu* popup = Parent::createPopupMenu(pos);
|
||||||
QAction* action = new QAction(NULL,"Show Debug Info", 0, popup);
|
QAction* action = new QAction(NULL, _("Show Debug Info"), 0, popup);
|
||||||
action->setToggleAction(TRUE);
|
action->setToggleAction(TRUE);
|
||||||
connect(action, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool)));
|
connect(action, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool)));
|
||||||
connect(this, SIGNAL(showDebugChanged(bool)), action, SLOT(setOn(bool)));
|
connect(this, SIGNAL(showDebugChanged(bool)), action, SLOT(setOn(bool)));
|
||||||
|
@ -1189,18 +1175,18 @@ ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow* parent, const char *nam
|
||||||
|
|
||||||
QVBoxLayout* layout1 = new QVBoxLayout(this, 11, 6);
|
QVBoxLayout* layout1 = new QVBoxLayout(this, 11, 6);
|
||||||
QHBoxLayout* layout2 = new QHBoxLayout(0, 0, 6);
|
QHBoxLayout* layout2 = new QHBoxLayout(0, 0, 6);
|
||||||
layout2->addWidget(new QLabel("Find:", this));
|
layout2->addWidget(new QLabel(_("Find:"), this));
|
||||||
editField = new QLineEdit(this);
|
editField = new QLineEdit(this);
|
||||||
connect(editField, SIGNAL(returnPressed()), SLOT(search()));
|
connect(editField, SIGNAL(returnPressed()), SLOT(search()));
|
||||||
layout2->addWidget(editField);
|
layout2->addWidget(editField);
|
||||||
searchButton = new QPushButton("Search", this);
|
searchButton = new QPushButton(_("Search"), this);
|
||||||
searchButton->setAutoDefault(FALSE);
|
searchButton->setAutoDefault(FALSE);
|
||||||
connect(searchButton, SIGNAL(clicked()), SLOT(search()));
|
connect(searchButton, SIGNAL(clicked()), SLOT(search()));
|
||||||
layout2->addWidget(searchButton);
|
layout2->addWidget(searchButton);
|
||||||
layout1->addLayout(layout2);
|
layout1->addLayout(layout2);
|
||||||
|
|
||||||
split = new QSplitter(this);
|
split = new QSplitter(this);
|
||||||
split->setOrientation(QSplitter::Vertical);
|
split->setOrientation(Qt::Vertical);
|
||||||
list = new ConfigView(split, name);
|
list = new ConfigView(split, name);
|
||||||
list->list->mode = listMode;
|
list->list->mode = listMode;
|
||||||
info = new ConfigInfoView(split, name);
|
info = new ConfigInfoView(split, name);
|
||||||
|
@ -1274,8 +1260,12 @@ ConfigMainWindow::ConfigMainWindow(void)
|
||||||
QMenuBar* menu;
|
QMenuBar* menu;
|
||||||
bool ok;
|
bool ok;
|
||||||
int x, y, width, height;
|
int x, y, width, height;
|
||||||
|
char title[256];
|
||||||
|
|
||||||
QWidget *d = configApp->desktop();
|
QDesktopWidget *d = configApp->desktop();
|
||||||
|
snprintf(title, sizeof(title), _("Barebox v%s Configuration"),
|
||||||
|
getenv("KERNELVERSION"));
|
||||||
|
setCaption(title);
|
||||||
|
|
||||||
width = configSettings->readNumEntry("/window width", d->width() - 64);
|
width = configSettings->readNumEntry("/window width", d->width() - 64);
|
||||||
height = configSettings->readNumEntry("/window height", d->height() - 64);
|
height = configSettings->readNumEntry("/window height", d->height() - 64);
|
||||||
|
@ -1287,14 +1277,14 @@ ConfigMainWindow::ConfigMainWindow(void)
|
||||||
move(x, y);
|
move(x, y);
|
||||||
|
|
||||||
split1 = new QSplitter(this);
|
split1 = new QSplitter(this);
|
||||||
split1->setOrientation(QSplitter::Horizontal);
|
split1->setOrientation(Qt::Horizontal);
|
||||||
setCentralWidget(split1);
|
setCentralWidget(split1);
|
||||||
|
|
||||||
menuView = new ConfigView(split1, "menu");
|
menuView = new ConfigView(split1, "menu");
|
||||||
menuList = menuView->list;
|
menuList = menuView->list;
|
||||||
|
|
||||||
split2 = new QSplitter(split1);
|
split2 = new QSplitter(split1);
|
||||||
split2->setOrientation(QSplitter::Vertical);
|
split2->setOrientation(Qt::Vertical);
|
||||||
|
|
||||||
// create config tree
|
// create config tree
|
||||||
configView = new ConfigView(split2, "config");
|
configView = new ConfigView(split2, "config");
|
||||||
|
@ -1309,58 +1299,71 @@ ConfigMainWindow::ConfigMainWindow(void)
|
||||||
menu = menuBar();
|
menu = menuBar();
|
||||||
toolBar = new QToolBar("Tools", this);
|
toolBar = new QToolBar("Tools", this);
|
||||||
|
|
||||||
backAction = new QAction("Back", QPixmap(xpm_back), "Back", 0, this);
|
backAction = new QAction("Back", QPixmap(xpm_back), _("Back"), 0, this);
|
||||||
connect(backAction, SIGNAL(activated()), SLOT(goBack()));
|
connect(backAction, SIGNAL(activated()), SLOT(goBack()));
|
||||||
backAction->setEnabled(FALSE);
|
backAction->setEnabled(FALSE);
|
||||||
QAction *quitAction = new QAction("Quit", "&Quit", CTRL+Key_Q, this);
|
QAction *quitAction = new QAction("Quit", _("&Quit"), Qt::CTRL + Qt::Key_Q, this);
|
||||||
connect(quitAction, SIGNAL(activated()), SLOT(close()));
|
connect(quitAction, SIGNAL(activated()), SLOT(close()));
|
||||||
QAction *loadAction = new QAction("Load", QPixmap(xpm_load), "&Load", CTRL+Key_L, this);
|
QAction *loadAction = new QAction("Load", QPixmap(xpm_load), _("&Load"), Qt::CTRL + Qt::Key_L, this);
|
||||||
connect(loadAction, SIGNAL(activated()), SLOT(loadConfig()));
|
connect(loadAction, SIGNAL(activated()), SLOT(loadConfig()));
|
||||||
saveAction = new QAction("Save", QPixmap(xpm_save), "&Save", CTRL+Key_S, this);
|
saveAction = new QAction("Save", QPixmap(xpm_save), _("&Save"), Qt::CTRL + Qt::Key_S, this);
|
||||||
connect(saveAction, SIGNAL(activated()), SLOT(saveConfig()));
|
connect(saveAction, SIGNAL(activated()), SLOT(saveConfig()));
|
||||||
conf_set_changed_callback(conf_changed);
|
conf_set_changed_callback(conf_changed);
|
||||||
// Set saveAction's initial state
|
// Set saveAction's initial state
|
||||||
conf_changed();
|
conf_changed();
|
||||||
QAction *saveAsAction = new QAction("Save As...", "Save &As...", 0, this);
|
QAction *saveAsAction = new QAction("Save As...", _("Save &As..."), 0, this);
|
||||||
connect(saveAsAction, SIGNAL(activated()), SLOT(saveConfigAs()));
|
connect(saveAsAction, SIGNAL(activated()), SLOT(saveConfigAs()));
|
||||||
QAction *searchAction = new QAction("Find", "&Find", CTRL+Key_F, this);
|
QAction *searchAction = new QAction("Find", _("&Find"), Qt::CTRL + Qt::Key_F, this);
|
||||||
connect(searchAction, SIGNAL(activated()), SLOT(searchConfig()));
|
connect(searchAction, SIGNAL(activated()), SLOT(searchConfig()));
|
||||||
QAction *singleViewAction = new QAction("Single View", QPixmap(xpm_single_view), "Split View", 0, this);
|
QAction *singleViewAction = new QAction("Single View", QPixmap(xpm_single_view), _("Single View"), 0, this);
|
||||||
connect(singleViewAction, SIGNAL(activated()), SLOT(showSingleView()));
|
connect(singleViewAction, SIGNAL(activated()), SLOT(showSingleView()));
|
||||||
QAction *splitViewAction = new QAction("Split View", QPixmap(xpm_split_view), "Split View", 0, this);
|
QAction *splitViewAction = new QAction("Split View", QPixmap(xpm_split_view), _("Split View"), 0, this);
|
||||||
connect(splitViewAction, SIGNAL(activated()), SLOT(showSplitView()));
|
connect(splitViewAction, SIGNAL(activated()), SLOT(showSplitView()));
|
||||||
QAction *fullViewAction = new QAction("Full View", QPixmap(xpm_tree_view), "Full View", 0, this);
|
QAction *fullViewAction = new QAction("Full View", QPixmap(xpm_tree_view), _("Full View"), 0, this);
|
||||||
connect(fullViewAction, SIGNAL(activated()), SLOT(showFullView()));
|
connect(fullViewAction, SIGNAL(activated()), SLOT(showFullView()));
|
||||||
|
|
||||||
QAction *showNameAction = new QAction(NULL, "Show Name", 0, this);
|
QAction *showNameAction = new QAction(NULL, _("Show Name"), 0, this);
|
||||||
showNameAction->setToggleAction(TRUE);
|
showNameAction->setToggleAction(TRUE);
|
||||||
connect(showNameAction, SIGNAL(toggled(bool)), configView, SLOT(setShowName(bool)));
|
connect(showNameAction, SIGNAL(toggled(bool)), configView, SLOT(setShowName(bool)));
|
||||||
connect(configView, SIGNAL(showNameChanged(bool)), showNameAction, SLOT(setOn(bool)));
|
connect(configView, SIGNAL(showNameChanged(bool)), showNameAction, SLOT(setOn(bool)));
|
||||||
showNameAction->setOn(configView->showName());
|
showNameAction->setOn(configView->showName());
|
||||||
QAction *showRangeAction = new QAction(NULL, "Show Range", 0, this);
|
QAction *showRangeAction = new QAction(NULL, _("Show Range"), 0, this);
|
||||||
showRangeAction->setToggleAction(TRUE);
|
showRangeAction->setToggleAction(TRUE);
|
||||||
connect(showRangeAction, SIGNAL(toggled(bool)), configView, SLOT(setShowRange(bool)));
|
connect(showRangeAction, SIGNAL(toggled(bool)), configView, SLOT(setShowRange(bool)));
|
||||||
connect(configView, SIGNAL(showRangeChanged(bool)), showRangeAction, SLOT(setOn(bool)));
|
connect(configView, SIGNAL(showRangeChanged(bool)), showRangeAction, SLOT(setOn(bool)));
|
||||||
showRangeAction->setOn(configList->showRange);
|
showRangeAction->setOn(configList->showRange);
|
||||||
QAction *showDataAction = new QAction(NULL, "Show Data", 0, this);
|
QAction *showDataAction = new QAction(NULL, _("Show Data"), 0, this);
|
||||||
showDataAction->setToggleAction(TRUE);
|
showDataAction->setToggleAction(TRUE);
|
||||||
connect(showDataAction, SIGNAL(toggled(bool)), configView, SLOT(setShowData(bool)));
|
connect(showDataAction, SIGNAL(toggled(bool)), configView, SLOT(setShowData(bool)));
|
||||||
connect(configView, SIGNAL(showDataChanged(bool)), showDataAction, SLOT(setOn(bool)));
|
connect(configView, SIGNAL(showDataChanged(bool)), showDataAction, SLOT(setOn(bool)));
|
||||||
showDataAction->setOn(configList->showData);
|
showDataAction->setOn(configList->showData);
|
||||||
QAction *showAllAction = new QAction(NULL, "Show All Options", 0, this);
|
|
||||||
showAllAction->setToggleAction(TRUE);
|
QActionGroup *optGroup = new QActionGroup(this);
|
||||||
connect(showAllAction, SIGNAL(toggled(bool)), configView, SLOT(setShowAll(bool)));
|
optGroup->setExclusive(TRUE);
|
||||||
connect(showAllAction, SIGNAL(toggled(bool)), menuView, SLOT(setShowAll(bool)));
|
connect(optGroup, SIGNAL(selected(QAction *)), configView,
|
||||||
showAllAction->setOn(configList->showAll);
|
SLOT(setOptionMode(QAction *)));
|
||||||
QAction *showDebugAction = new QAction(NULL, "Show Debug Info", 0, this);
|
connect(optGroup, SIGNAL(selected(QAction *)), menuView,
|
||||||
|
SLOT(setOptionMode(QAction *)));
|
||||||
|
|
||||||
|
configView->showNormalAction = new QAction(NULL, _("Show Normal Options"), 0, optGroup);
|
||||||
|
configView->showAllAction = new QAction(NULL, _("Show All Options"), 0, optGroup);
|
||||||
|
configView->showPromptAction = new QAction(NULL, _("Show Prompt Options"), 0, optGroup);
|
||||||
|
configView->showNormalAction->setToggleAction(TRUE);
|
||||||
|
configView->showNormalAction->setOn(configList->optMode == normalOpt);
|
||||||
|
configView->showAllAction->setToggleAction(TRUE);
|
||||||
|
configView->showAllAction->setOn(configList->optMode == allOpt);
|
||||||
|
configView->showPromptAction->setToggleAction(TRUE);
|
||||||
|
configView->showPromptAction->setOn(configList->optMode == promptOpt);
|
||||||
|
|
||||||
|
QAction *showDebugAction = new QAction(NULL, _("Show Debug Info"), 0, this);
|
||||||
showDebugAction->setToggleAction(TRUE);
|
showDebugAction->setToggleAction(TRUE);
|
||||||
connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool)));
|
connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool)));
|
||||||
connect(helpText, SIGNAL(showDebugChanged(bool)), showDebugAction, SLOT(setOn(bool)));
|
connect(helpText, SIGNAL(showDebugChanged(bool)), showDebugAction, SLOT(setOn(bool)));
|
||||||
showDebugAction->setOn(helpText->showDebug());
|
showDebugAction->setOn(helpText->showDebug());
|
||||||
|
|
||||||
QAction *showIntroAction = new QAction(NULL, "Introduction", 0, this);
|
QAction *showIntroAction = new QAction(NULL, _("Introduction"), 0, this);
|
||||||
connect(showIntroAction, SIGNAL(activated()), SLOT(showIntro()));
|
connect(showIntroAction, SIGNAL(activated()), SLOT(showIntro()));
|
||||||
QAction *showAboutAction = new QAction(NULL, "About", 0, this);
|
QAction *showAboutAction = new QAction(NULL, _("About"), 0, this);
|
||||||
connect(showAboutAction, SIGNAL(activated()), SLOT(showAbout()));
|
connect(showAboutAction, SIGNAL(activated()), SLOT(showAbout()));
|
||||||
|
|
||||||
// init tool bar
|
// init tool bar
|
||||||
|
@ -1375,7 +1378,7 @@ ConfigMainWindow::ConfigMainWindow(void)
|
||||||
|
|
||||||
// create config menu
|
// create config menu
|
||||||
QPopupMenu* config = new QPopupMenu(this);
|
QPopupMenu* config = new QPopupMenu(this);
|
||||||
menu->insertItem("&File", config);
|
menu->insertItem(_("&File"), config);
|
||||||
loadAction->addTo(config);
|
loadAction->addTo(config);
|
||||||
saveAction->addTo(config);
|
saveAction->addTo(config);
|
||||||
saveAsAction->addTo(config);
|
saveAsAction->addTo(config);
|
||||||
|
@ -1384,23 +1387,24 @@ ConfigMainWindow::ConfigMainWindow(void)
|
||||||
|
|
||||||
// create edit menu
|
// create edit menu
|
||||||
QPopupMenu* editMenu = new QPopupMenu(this);
|
QPopupMenu* editMenu = new QPopupMenu(this);
|
||||||
menu->insertItem("&Edit", editMenu);
|
menu->insertItem(_("&Edit"), editMenu);
|
||||||
searchAction->addTo(editMenu);
|
searchAction->addTo(editMenu);
|
||||||
|
|
||||||
// create options menu
|
// create options menu
|
||||||
QPopupMenu* optionMenu = new QPopupMenu(this);
|
QPopupMenu* optionMenu = new QPopupMenu(this);
|
||||||
menu->insertItem("&Option", optionMenu);
|
menu->insertItem(_("&Option"), optionMenu);
|
||||||
showNameAction->addTo(optionMenu);
|
showNameAction->addTo(optionMenu);
|
||||||
showRangeAction->addTo(optionMenu);
|
showRangeAction->addTo(optionMenu);
|
||||||
showDataAction->addTo(optionMenu);
|
showDataAction->addTo(optionMenu);
|
||||||
optionMenu->insertSeparator();
|
optionMenu->insertSeparator();
|
||||||
showAllAction->addTo(optionMenu);
|
optGroup->addTo(optionMenu);
|
||||||
|
optionMenu->insertSeparator();
|
||||||
showDebugAction->addTo(optionMenu);
|
showDebugAction->addTo(optionMenu);
|
||||||
|
|
||||||
// create help menu
|
// create help menu
|
||||||
QPopupMenu* helpMenu = new QPopupMenu(this);
|
QPopupMenu* helpMenu = new QPopupMenu(this);
|
||||||
menu->insertSeparator();
|
menu->insertSeparator();
|
||||||
menu->insertItem("&Help", helpMenu);
|
menu->insertItem(_("&Help"), helpMenu);
|
||||||
showIntroAction->addTo(helpMenu);
|
showIntroAction->addTo(helpMenu);
|
||||||
showAboutAction->addTo(helpMenu);
|
showAboutAction->addTo(helpMenu);
|
||||||
|
|
||||||
|
@ -1444,27 +1448,27 @@ ConfigMainWindow::ConfigMainWindow(void)
|
||||||
|
|
||||||
void ConfigMainWindow::loadConfig(void)
|
void ConfigMainWindow::loadConfig(void)
|
||||||
{
|
{
|
||||||
QString s = QFileDialog::getOpenFileName(".config", NULL, this);
|
QString s = QFileDialog::getOpenFileName(conf_get_configname(), NULL, this);
|
||||||
if (s.isNull())
|
if (s.isNull())
|
||||||
return;
|
return;
|
||||||
if (conf_read(QFile::encodeName(s)))
|
if (conf_read(QFile::encodeName(s)))
|
||||||
QMessageBox::information(this, "qconf", "Unable to load configuration!");
|
QMessageBox::information(this, "qconf", _("Unable to load configuration!"));
|
||||||
ConfigView::updateListAll();
|
ConfigView::updateListAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfigMainWindow::saveConfig(void)
|
void ConfigMainWindow::saveConfig(void)
|
||||||
{
|
{
|
||||||
if (conf_write(NULL))
|
if (conf_write(NULL))
|
||||||
QMessageBox::information(this, "qconf", "Unable to save configuration!");
|
QMessageBox::information(this, "qconf", _("Unable to save configuration!"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfigMainWindow::saveConfigAs(void)
|
void ConfigMainWindow::saveConfigAs(void)
|
||||||
{
|
{
|
||||||
QString s = QFileDialog::getSaveFileName(".config", NULL, this);
|
QString s = QFileDialog::getSaveFileName(conf_get_configname(), NULL, this);
|
||||||
if (s.isNull())
|
if (s.isNull())
|
||||||
return;
|
return;
|
||||||
if (conf_write(QFile::encodeName(s)))
|
if (conf_write(QFile::encodeName(s)))
|
||||||
QMessageBox::information(this, "qconf", "Unable to save configuration!");
|
QMessageBox::information(this, "qconf", _("Unable to save configuration!"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfigMainWindow::searchConfig(void)
|
void ConfigMainWindow::searchConfig(void)
|
||||||
|
@ -1489,7 +1493,7 @@ void ConfigMainWindow::setMenuLink(struct menu *menu)
|
||||||
ConfigList* list = NULL;
|
ConfigList* list = NULL;
|
||||||
ConfigItem* item;
|
ConfigItem* item;
|
||||||
|
|
||||||
if (!menu_is_visible(menu) && !configView->showAll())
|
if (configList->menuSkip(menu))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
switch (configList->mode) {
|
switch (configList->mode) {
|
||||||
|
@ -1521,6 +1525,8 @@ void ConfigMainWindow::setMenuLink(struct menu *menu)
|
||||||
case fullMode:
|
case fullMode:
|
||||||
list = configList;
|
list = configList;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (list) {
|
if (list) {
|
||||||
|
@ -1608,11 +1614,11 @@ void ConfigMainWindow::closeEvent(QCloseEvent* e)
|
||||||
e->accept();
|
e->accept();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
QMessageBox mb("qconf", "Save configuration?", QMessageBox::Warning,
|
QMessageBox mb("qconf", _("Save configuration?"), QMessageBox::Warning,
|
||||||
QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape);
|
QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape);
|
||||||
mb.setButtonText(QMessageBox::Yes, "&Save Changes");
|
mb.setButtonText(QMessageBox::Yes, _("&Save Changes"));
|
||||||
mb.setButtonText(QMessageBox::No, "&Discard Changes");
|
mb.setButtonText(QMessageBox::No, _("&Discard Changes"));
|
||||||
mb.setButtonText(QMessageBox::Cancel, "Cancel Exit");
|
mb.setButtonText(QMessageBox::Cancel, _("Cancel Exit"));
|
||||||
switch (mb.exec()) {
|
switch (mb.exec()) {
|
||||||
case QMessageBox::Yes:
|
case QMessageBox::Yes:
|
||||||
conf_write(NULL);
|
conf_write(NULL);
|
||||||
|
@ -1627,7 +1633,7 @@ void ConfigMainWindow::closeEvent(QCloseEvent* e)
|
||||||
|
|
||||||
void ConfigMainWindow::showIntro(void)
|
void ConfigMainWindow::showIntro(void)
|
||||||
{
|
{
|
||||||
static char str[] = "Welcome to the qconf graphical kernel configuration tool for Linux.\n\n"
|
static const QString str = _("Welcome to the qconf graphical barebox configuration tool for Linux.\n\n"
|
||||||
"For each option, a blank box indicates the feature is disabled, a check\n"
|
"For each option, a blank box indicates the feature is disabled, a check\n"
|
||||||
"indicates it is enabled, and a dot indicates that it is to be compiled\n"
|
"indicates it is enabled, and a dot indicates that it is to be compiled\n"
|
||||||
"as a module. Clicking on the box will cycle through the three states.\n\n"
|
"as a module. Clicking on the box will cycle through the three states.\n\n"
|
||||||
|
@ -1637,15 +1643,15 @@ void ConfigMainWindow::showIntro(void)
|
||||||
"options must be enabled to support the option you are interested in, you can\n"
|
"options must be enabled to support the option you are interested in, you can\n"
|
||||||
"still view the help of a grayed-out option.\n\n"
|
"still view the help of a grayed-out option.\n\n"
|
||||||
"Toggling Show Debug Info under the Options menu will show the dependencies,\n"
|
"Toggling Show Debug Info under the Options menu will show the dependencies,\n"
|
||||||
"which you can then match by examining other options.\n\n";
|
"which you can then match by examining other options.\n\n");
|
||||||
|
|
||||||
QMessageBox::information(this, "qconf", str);
|
QMessageBox::information(this, "qconf", str);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfigMainWindow::showAbout(void)
|
void ConfigMainWindow::showAbout(void)
|
||||||
{
|
{
|
||||||
static char str[] = "qconf is Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>.\n\n"
|
static const QString str = _("qconf is Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>.\n\n"
|
||||||
"Bug reports and feature request can also be entered at http://bugzilla.kernel.org/\n";
|
"Bug reports and feature request can also be entered at http://bugzilla.barebox.org/\n");
|
||||||
|
|
||||||
QMessageBox::information(this, "qconf", str);
|
QMessageBox::information(this, "qconf", str);
|
||||||
}
|
}
|
||||||
|
@ -1670,6 +1676,9 @@ void ConfigMainWindow::saveSettings(void)
|
||||||
case fullMode :
|
case fullMode :
|
||||||
entry = "full";
|
entry = "full";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
configSettings->writeEntry("/listMode", entry);
|
configSettings->writeEntry("/listMode", entry);
|
||||||
|
|
||||||
|
@ -1703,7 +1712,7 @@ static const char *progname;
|
||||||
|
|
||||||
static void usage(void)
|
static void usage(void)
|
||||||
{
|
{
|
||||||
printf("%s <config>\n", progname);
|
printf(_("%s <config>\n"), progname);
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,9 @@ enum colIdx {
|
||||||
enum listMode {
|
enum listMode {
|
||||||
singleMode, menuMode, symbolMode, fullMode, listMode
|
singleMode, menuMode, symbolMode, fullMode, listMode
|
||||||
};
|
};
|
||||||
|
enum optionMode {
|
||||||
|
normalOpt = 0, allOpt, promptOpt
|
||||||
|
};
|
||||||
|
|
||||||
class ConfigList : public QListView {
|
class ConfigList : public QListView {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
@ -115,6 +118,8 @@ public:
|
||||||
void setAllOpen(bool open);
|
void setAllOpen(bool open);
|
||||||
void setParentMenu(void);
|
void setParentMenu(void);
|
||||||
|
|
||||||
|
bool menuSkip(struct menu *);
|
||||||
|
|
||||||
template <class P>
|
template <class P>
|
||||||
void updateMenuList(P*, struct menu*);
|
void updateMenuList(P*, struct menu*);
|
||||||
|
|
||||||
|
@ -124,8 +129,9 @@ public:
|
||||||
QPixmap choiceYesPix, choiceNoPix;
|
QPixmap choiceYesPix, choiceNoPix;
|
||||||
QPixmap menuPix, menuInvPix, menuBackPix, voidPix;
|
QPixmap menuPix, menuInvPix, menuBackPix, voidPix;
|
||||||
|
|
||||||
bool showAll, showName, showRange, showData;
|
bool showName, showRange, showData;
|
||||||
enum listMode mode;
|
enum listMode mode;
|
||||||
|
enum optionMode optMode;
|
||||||
struct menu *rootEntry;
|
struct menu *rootEntry;
|
||||||
QColorGroup disabledColorGroup;
|
QColorGroup disabledColorGroup;
|
||||||
QColorGroup inactivedColorGroup;
|
QColorGroup inactivedColorGroup;
|
||||||
|
@ -222,17 +228,15 @@ public:
|
||||||
static void updateList(ConfigItem* item);
|
static void updateList(ConfigItem* item);
|
||||||
static void updateListAll(void);
|
static void updateListAll(void);
|
||||||
|
|
||||||
bool showAll(void) const { return list->showAll; }
|
|
||||||
bool showName(void) const { return list->showName; }
|
bool showName(void) const { return list->showName; }
|
||||||
bool showRange(void) const { return list->showRange; }
|
bool showRange(void) const { return list->showRange; }
|
||||||
bool showData(void) const { return list->showData; }
|
bool showData(void) const { return list->showData; }
|
||||||
public slots:
|
public slots:
|
||||||
void setShowAll(bool);
|
|
||||||
void setShowName(bool);
|
void setShowName(bool);
|
||||||
void setShowRange(bool);
|
void setShowRange(bool);
|
||||||
void setShowData(bool);
|
void setShowData(bool);
|
||||||
|
void setOptionMode(QAction *);
|
||||||
signals:
|
signals:
|
||||||
void showAllChanged(bool);
|
|
||||||
void showNameChanged(bool);
|
void showNameChanged(bool);
|
||||||
void showRangeChanged(bool);
|
void showRangeChanged(bool);
|
||||||
void showDataChanged(bool);
|
void showDataChanged(bool);
|
||||||
|
@ -242,6 +246,10 @@ public:
|
||||||
|
|
||||||
static ConfigView* viewList;
|
static ConfigView* viewList;
|
||||||
ConfigView* nextView;
|
ConfigView* nextView;
|
||||||
|
|
||||||
|
static QAction *showNormalAction;
|
||||||
|
static QAction *showAllAction;
|
||||||
|
static QAction *showPromptAction;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ConfigInfoView : public QTextBrowser {
|
class ConfigInfoView : public QTextBrowser {
|
||||||
|
@ -254,7 +262,6 @@ public:
|
||||||
public slots:
|
public slots:
|
||||||
void setInfo(struct menu *menu);
|
void setInfo(struct menu *menu);
|
||||||
void saveSettings(void);
|
void saveSettings(void);
|
||||||
void setSource(const QString& name);
|
|
||||||
void setShowDebug(bool);
|
void setShowDebug(bool);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|
|
@ -0,0 +1,422 @@
|
||||||
|
#!/usr/bin/perl -w
|
||||||
|
#
|
||||||
|
# Copywrite 2005-2009 - Steven Rostedt
|
||||||
|
# Licensed under the terms of the GNU GPL License version 2
|
||||||
|
#
|
||||||
|
# It's simple enough to figure out how this works.
|
||||||
|
# If not, then you can ask me at stripconfig@goodmis.org
|
||||||
|
#
|
||||||
|
# What it does?
|
||||||
|
#
|
||||||
|
# If you have installed a Linux barebox from a distribution
|
||||||
|
# that turns on way too many modules than you need, and
|
||||||
|
# you only want the modules you use, then this program
|
||||||
|
# is perfect for you.
|
||||||
|
#
|
||||||
|
# It gives you the ability to turn off all the modules that are
|
||||||
|
# not loaded on your system.
|
||||||
|
#
|
||||||
|
# Howto:
|
||||||
|
#
|
||||||
|
# 1. Boot up the barebox that you want to stream line the config on.
|
||||||
|
# 2. Change directory to the directory holding the source of the
|
||||||
|
# barebox that you just booted.
|
||||||
|
# 3. Copy the configuraton file to this directory as .config
|
||||||
|
# 4. Have all your devices that you need modules for connected and
|
||||||
|
# operational (make sure that their corresponding modules are loaded)
|
||||||
|
# 5. Run this script redirecting the output to some other file
|
||||||
|
# like config_strip.
|
||||||
|
# 6. Back up your old config (if you want too).
|
||||||
|
# 7. copy the config_strip file to .config
|
||||||
|
# 8. Run "make oldconfig"
|
||||||
|
#
|
||||||
|
# Now your barebox is ready to be built with only the modules that
|
||||||
|
# are loaded.
|
||||||
|
#
|
||||||
|
# Here's what I did with my Debian distribution.
|
||||||
|
#
|
||||||
|
# cd /usr/src/linux-2.6.10
|
||||||
|
# cp /boot/config-2.6.10-1-686-smp .config
|
||||||
|
# ~/bin/streamline_config > config_strip
|
||||||
|
# mv .config config_sav
|
||||||
|
# mv config_strip .config
|
||||||
|
# make oldconfig
|
||||||
|
#
|
||||||
|
my $config = ".config";
|
||||||
|
|
||||||
|
my $uname = `uname -r`;
|
||||||
|
chomp $uname;
|
||||||
|
|
||||||
|
my @searchconfigs = (
|
||||||
|
{
|
||||||
|
"file" => ".config",
|
||||||
|
"exec" => "cat",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file" => "/proc/config.gz",
|
||||||
|
"exec" => "zcat",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file" => "/boot/config-$uname",
|
||||||
|
"exec" => "cat",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file" => "/boot/vmlinuz-$uname",
|
||||||
|
"exec" => "scripts/extract-ikconfig",
|
||||||
|
"test" => "scripts/extract-ikconfig",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file" => "vmlinux",
|
||||||
|
"exec" => "scripts/extract-ikconfig",
|
||||||
|
"test" => "scripts/extract-ikconfig",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file" => "/lib/modules/$uname/barebox/barebox/configs.ko",
|
||||||
|
"exec" => "scripts/extract-ikconfig",
|
||||||
|
"test" => "scripts/extract-ikconfig",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file" => "barebox/configs.ko",
|
||||||
|
"exec" => "scripts/extract-ikconfig",
|
||||||
|
"test" => "scripts/extract-ikconfig",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file" => "barebox/configs.o",
|
||||||
|
"exec" => "scripts/extract-ikconfig",
|
||||||
|
"test" => "scripts/extract-ikconfig",
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
sub find_config {
|
||||||
|
foreach my $conf (@searchconfigs) {
|
||||||
|
my $file = $conf->{"file"};
|
||||||
|
|
||||||
|
next if ( ! -f "$file");
|
||||||
|
|
||||||
|
if (defined($conf->{"test"})) {
|
||||||
|
`$conf->{"test"} $conf->{"file"} 2>/dev/null`;
|
||||||
|
next if ($?);
|
||||||
|
}
|
||||||
|
|
||||||
|
my $exec = $conf->{"exec"};
|
||||||
|
|
||||||
|
print STDERR "using config: '$file'\n";
|
||||||
|
|
||||||
|
open(CIN, "$exec $file |") || die "Failed to run $exec $file";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
die "No config file found";
|
||||||
|
}
|
||||||
|
|
||||||
|
find_config;
|
||||||
|
|
||||||
|
# Get the build source and top level Kconfig file (passed in)
|
||||||
|
my $ksource = $ARGV[0];
|
||||||
|
my $kconfig = $ARGV[1];
|
||||||
|
my $lsmod_file = $ARGV[2];
|
||||||
|
|
||||||
|
my @makefiles = `find $ksource -name Makefile 2>/dev/null`;
|
||||||
|
chomp @makefiles;
|
||||||
|
|
||||||
|
my %depends;
|
||||||
|
my %selects;
|
||||||
|
my %prompts;
|
||||||
|
my %objects;
|
||||||
|
my $var;
|
||||||
|
my $cont = 0;
|
||||||
|
my $iflevel = 0;
|
||||||
|
my @ifdeps;
|
||||||
|
|
||||||
|
# prevent recursion
|
||||||
|
my %read_kconfigs;
|
||||||
|
|
||||||
|
sub read_kconfig {
|
||||||
|
my ($kconfig) = @_;
|
||||||
|
|
||||||
|
my $state = "NONE";
|
||||||
|
my $config;
|
||||||
|
my @kconfigs;
|
||||||
|
|
||||||
|
open(KIN, "$ksource/$kconfig") || die "Can't open $kconfig";
|
||||||
|
while (<KIN>) {
|
||||||
|
chomp;
|
||||||
|
|
||||||
|
# collect any Kconfig sources
|
||||||
|
if (/^source\s*"(.*)"/) {
|
||||||
|
$kconfigs[$#kconfigs+1] = $1;
|
||||||
|
}
|
||||||
|
|
||||||
|
# configs found
|
||||||
|
if (/^\s*config\s+(\S+)\s*$/) {
|
||||||
|
$state = "NEW";
|
||||||
|
$config = $1;
|
||||||
|
|
||||||
|
for (my $i = 0; $i < $iflevel; $i++) {
|
||||||
|
if ($i) {
|
||||||
|
$depends{$config} .= " " . $ifdeps[$i];
|
||||||
|
} else {
|
||||||
|
$depends{$config} = $ifdeps[$i];
|
||||||
|
}
|
||||||
|
$state = "DEP";
|
||||||
|
}
|
||||||
|
|
||||||
|
# collect the depends for the config
|
||||||
|
} elsif ($state eq "NEW" && /^\s*depends\s+on\s+(.*)$/) {
|
||||||
|
$state = "DEP";
|
||||||
|
$depends{$config} = $1;
|
||||||
|
} elsif ($state eq "DEP" && /^\s*depends\s+on\s+(.*)$/) {
|
||||||
|
$depends{$config} .= " " . $1;
|
||||||
|
|
||||||
|
# Get the configs that select this config
|
||||||
|
} elsif ($state ne "NONE" && /^\s*select\s+(\S+)/) {
|
||||||
|
if (defined($selects{$1})) {
|
||||||
|
$selects{$1} .= " " . $config;
|
||||||
|
} else {
|
||||||
|
$selects{$1} = $config;
|
||||||
|
}
|
||||||
|
|
||||||
|
# configs without prompts must be selected
|
||||||
|
} elsif ($state ne "NONE" && /^\s*tristate\s\S/) {
|
||||||
|
# note if the config has a prompt
|
||||||
|
$prompt{$config} = 1;
|
||||||
|
|
||||||
|
# Check for if statements
|
||||||
|
} elsif (/^if\s+(.*\S)\s*$/) {
|
||||||
|
my $deps = $1;
|
||||||
|
# remove beginning and ending non text
|
||||||
|
$deps =~ s/^[^a-zA-Z0-9_]*//;
|
||||||
|
$deps =~ s/[^a-zA-Z0-9_]*$//;
|
||||||
|
|
||||||
|
my @deps = split /[^a-zA-Z0-9_]+/, $deps;
|
||||||
|
|
||||||
|
$ifdeps[$iflevel++] = join ':', @deps;
|
||||||
|
|
||||||
|
} elsif (/^endif/) {
|
||||||
|
|
||||||
|
$iflevel-- if ($iflevel);
|
||||||
|
|
||||||
|
# stop on "help"
|
||||||
|
} elsif (/^\s*help\s*$/) {
|
||||||
|
$state = "NONE";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(KIN);
|
||||||
|
|
||||||
|
# read in any configs that were found.
|
||||||
|
foreach $kconfig (@kconfigs) {
|
||||||
|
if (!defined($read_kconfigs{$kconfig})) {
|
||||||
|
$read_kconfigs{$kconfig} = 1;
|
||||||
|
read_kconfig($kconfig);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($kconfig) {
|
||||||
|
read_kconfig($kconfig);
|
||||||
|
}
|
||||||
|
|
||||||
|
# Read all Makefiles to map the configs to the objects
|
||||||
|
foreach my $makefile (@makefiles) {
|
||||||
|
|
||||||
|
open(MIN,$makefile) || die "Can't open $makefile";
|
||||||
|
while (<MIN>) {
|
||||||
|
my $objs;
|
||||||
|
|
||||||
|
# is this a line after a line with a backslash?
|
||||||
|
if ($cont && /(\S.*)$/) {
|
||||||
|
$objs = $1;
|
||||||
|
}
|
||||||
|
$cont = 0;
|
||||||
|
|
||||||
|
# collect objects after obj-$(CONFIG_FOO_BAR)
|
||||||
|
if (/obj-\$\((CONFIG_[^\)]*)\)\s*[+:]?=\s*(.*)/) {
|
||||||
|
$var = $1;
|
||||||
|
$objs = $2;
|
||||||
|
}
|
||||||
|
if (defined($objs)) {
|
||||||
|
# test if the line ends with a backslash
|
||||||
|
if ($objs =~ m,(.*)\\$,) {
|
||||||
|
$objs = $1;
|
||||||
|
$cont = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach my $obj (split /\s+/,$objs) {
|
||||||
|
$obj =~ s/-/_/g;
|
||||||
|
if ($obj =~ /(.*)\.o$/) {
|
||||||
|
# Objects may be enabled by more than one config.
|
||||||
|
# Store configs in an array.
|
||||||
|
my @arr;
|
||||||
|
|
||||||
|
if (defined($objects{$1})) {
|
||||||
|
@arr = @{$objects{$1}};
|
||||||
|
}
|
||||||
|
|
||||||
|
$arr[$#arr+1] = $var;
|
||||||
|
|
||||||
|
# The objects have a hash mapping to a reference
|
||||||
|
# of an array of configs.
|
||||||
|
$objects{$1} = \@arr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(MIN);
|
||||||
|
}
|
||||||
|
|
||||||
|
my %modules;
|
||||||
|
|
||||||
|
if (defined($lsmod_file)) {
|
||||||
|
if ( ! -f $lsmod_file) {
|
||||||
|
die "$lsmod_file not found";
|
||||||
|
}
|
||||||
|
if ( -x $lsmod_file) {
|
||||||
|
# the file is executable, run it
|
||||||
|
open(LIN, "$lsmod_file|");
|
||||||
|
} else {
|
||||||
|
# Just read the contents
|
||||||
|
open(LIN, "$lsmod_file");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
|
||||||
|
# see what modules are loaded on this system
|
||||||
|
my $lsmod;
|
||||||
|
|
||||||
|
foreach $dir ( ("/sbin", "/bin", "/usr/sbin", "/usr/bin") ) {
|
||||||
|
if ( -x "$dir/lsmod" ) {
|
||||||
|
$lsmod = "$dir/lsmod";
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!defined($lsmod)) {
|
||||||
|
# try just the path
|
||||||
|
$lsmod = "lsmod";
|
||||||
|
}
|
||||||
|
|
||||||
|
open(LIN,"$lsmod|") || die "Can not call lsmod with $lsmod";
|
||||||
|
}
|
||||||
|
|
||||||
|
while (<LIN>) {
|
||||||
|
next if (/^Module/); # Skip the first line.
|
||||||
|
if (/^(\S+)/) {
|
||||||
|
$modules{$1} = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close (LIN);
|
||||||
|
|
||||||
|
# add to the configs hash all configs that are needed to enable
|
||||||
|
# a loaded module.
|
||||||
|
my %configs;
|
||||||
|
foreach my $module (keys(%modules)) {
|
||||||
|
if (defined($objects{$module})) {
|
||||||
|
my @arr = @{$objects{$module}};
|
||||||
|
foreach my $conf (@arr) {
|
||||||
|
$configs{$conf} = $module;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
# Most likely, someone has a custom (binary?) module loaded.
|
||||||
|
print STDERR "$module config not found!!\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
my $valid = "A-Za-z_0-9";
|
||||||
|
my $repeat = 1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Note, we do not care about operands (like: &&, ||, !) we want to add any
|
||||||
|
# config that is in the depend list of another config. This script does
|
||||||
|
# not enable configs that are not already enabled. If we come across a
|
||||||
|
# config A that depends on !B, we can still add B to the list of depends
|
||||||
|
# to keep on. If A was on in the original config, B would not have been
|
||||||
|
# and B would not be turned on by this script.
|
||||||
|
#
|
||||||
|
sub parse_config_dep_select
|
||||||
|
{
|
||||||
|
my ($p) = @_;
|
||||||
|
|
||||||
|
while ($p =~ /[$valid]/) {
|
||||||
|
|
||||||
|
if ($p =~ /^[^$valid]*([$valid]+)/) {
|
||||||
|
my $conf = "CONFIG_" . $1;
|
||||||
|
|
||||||
|
$p =~ s/^[^$valid]*[$valid]+//;
|
||||||
|
|
||||||
|
if (!defined($configs{$conf})) {
|
||||||
|
# We must make sure that this config has its
|
||||||
|
# dependencies met.
|
||||||
|
$repeat = 1; # do again
|
||||||
|
$configs{$conf} = 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
die "this should never happen";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while ($repeat) {
|
||||||
|
$repeat = 0;
|
||||||
|
|
||||||
|
foreach my $config (keys %configs) {
|
||||||
|
$config =~ s/^CONFIG_//;
|
||||||
|
|
||||||
|
if (defined($depends{$config})) {
|
||||||
|
# This config has dependencies. Make sure they are also included
|
||||||
|
parse_config_dep_select $depends{$config};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (defined($prompt{$config}) || !defined($selects{$config})) {
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
# config has no prompt and must be selected.
|
||||||
|
parse_config_dep_select $selects{$config};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
my %setconfigs;
|
||||||
|
|
||||||
|
# Finally, read the .config file and turn off any module enabled that
|
||||||
|
# we could not find a reason to keep enabled.
|
||||||
|
while(<CIN>) {
|
||||||
|
|
||||||
|
if (/CONFIG_IKCONFIG/) {
|
||||||
|
if (/# CONFIG_IKCONFIG is not set/) {
|
||||||
|
# enable IKCONFIG at least as a module
|
||||||
|
print "CONFIG_IKCONFIG=m\n";
|
||||||
|
# don't ask about PROC
|
||||||
|
print "# CONFIG_IKCONFIG_PROC is not set\n";
|
||||||
|
} else {
|
||||||
|
print;
|
||||||
|
}
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (/^(CONFIG.*)=(m|y)/) {
|
||||||
|
if (defined($configs{$1})) {
|
||||||
|
$setconfigs{$1} = $2;
|
||||||
|
} elsif ($2 eq "m") {
|
||||||
|
print "# $1 is not set\n";
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print;
|
||||||
|
}
|
||||||
|
close(CIN);
|
||||||
|
|
||||||
|
# Integrity check, make sure all modules that we want enabled do
|
||||||
|
# indeed have their configs set.
|
||||||
|
loop:
|
||||||
|
foreach my $module (keys(%modules)) {
|
||||||
|
if (defined($objects{$module})) {
|
||||||
|
my @arr = @{$objects{$module}};
|
||||||
|
foreach my $conf (@arr) {
|
||||||
|
if (defined($setconfigs{$conf})) {
|
||||||
|
next loop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print STDERR "module $module did not have configs";
|
||||||
|
foreach my $conf (@arr) {
|
||||||
|
print STDERR " " , $conf;
|
||||||
|
}
|
||||||
|
print STDERR "\n";
|
||||||
|
}
|
||||||
|
}
|
|
@ -34,18 +34,19 @@ struct symbol *sym_defconfig_list;
|
||||||
struct symbol *modules_sym;
|
struct symbol *modules_sym;
|
||||||
tristate modules_val;
|
tristate modules_val;
|
||||||
|
|
||||||
void sym_add_default(struct symbol *sym, const char *def)
|
struct expr *sym_env_list;
|
||||||
|
|
||||||
|
static void sym_add_default(struct symbol *sym, const char *def)
|
||||||
{
|
{
|
||||||
struct property *prop = prop_alloc(P_DEFAULT, sym);
|
struct property *prop = prop_alloc(P_DEFAULT, sym);
|
||||||
|
|
||||||
prop->expr = expr_alloc_symbol(sym_lookup(def, 1));
|
prop->expr = expr_alloc_symbol(sym_lookup(def, SYMBOL_CONST));
|
||||||
}
|
}
|
||||||
|
|
||||||
void sym_init(void)
|
void sym_init(void)
|
||||||
{
|
{
|
||||||
struct symbol *sym;
|
struct symbol *sym;
|
||||||
struct utsname uts;
|
struct utsname uts;
|
||||||
char *p;
|
|
||||||
static bool inited = false;
|
static bool inited = false;
|
||||||
|
|
||||||
if (inited)
|
if (inited)
|
||||||
|
@ -54,20 +55,6 @@ void sym_init(void)
|
||||||
|
|
||||||
uname(&uts);
|
uname(&uts);
|
||||||
|
|
||||||
sym = sym_lookup("ARCH", 0);
|
|
||||||
sym->type = S_STRING;
|
|
||||||
sym->flags |= SYMBOL_AUTO;
|
|
||||||
p = getenv("ARCH");
|
|
||||||
if (p)
|
|
||||||
sym_add_default(sym, p);
|
|
||||||
|
|
||||||
sym = sym_lookup("KERNELVERSION", 0);
|
|
||||||
sym->type = S_STRING;
|
|
||||||
sym->flags |= SYMBOL_AUTO;
|
|
||||||
p = getenv("KERNELVERSION");
|
|
||||||
if (p)
|
|
||||||
sym_add_default(sym, p);
|
|
||||||
|
|
||||||
sym = sym_lookup("UNAME_RELEASE", 0);
|
sym = sym_lookup("UNAME_RELEASE", 0);
|
||||||
sym->type = S_STRING;
|
sym->type = S_STRING;
|
||||||
sym->flags |= SYMBOL_AUTO;
|
sym->flags |= SYMBOL_AUTO;
|
||||||
|
@ -117,6 +104,15 @@ struct property *sym_get_choice_prop(struct symbol *sym)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct property *sym_get_env_prop(struct symbol *sym)
|
||||||
|
{
|
||||||
|
struct property *prop;
|
||||||
|
|
||||||
|
for_all_properties(sym, prop, P_ENV)
|
||||||
|
return prop;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
struct property *sym_get_default_prop(struct symbol *sym)
|
struct property *sym_get_default_prop(struct symbol *sym)
|
||||||
{
|
{
|
||||||
struct property *prop;
|
struct property *prop;
|
||||||
|
@ -129,7 +125,7 @@ struct property *sym_get_default_prop(struct symbol *sym)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct property *sym_get_range_prop(struct symbol *sym)
|
static struct property *sym_get_range_prop(struct symbol *sym)
|
||||||
{
|
{
|
||||||
struct property *prop;
|
struct property *prop;
|
||||||
|
|
||||||
|
@ -199,7 +195,7 @@ static void sym_calc_visibility(struct symbol *sym)
|
||||||
tri = no;
|
tri = no;
|
||||||
for_all_prompts(sym, prop) {
|
for_all_prompts(sym, prop) {
|
||||||
prop->visible.tri = expr_calc_value(prop->visible.expr);
|
prop->visible.tri = expr_calc_value(prop->visible.expr);
|
||||||
tri = E_OR(tri, prop->visible.tri);
|
tri = EXPR_OR(tri, prop->visible.tri);
|
||||||
}
|
}
|
||||||
if (tri == mod && (sym->type != S_TRISTATE || modules_val == no))
|
if (tri == mod && (sym->type != S_TRISTATE || modules_val == no))
|
||||||
tri = yes;
|
tri = yes;
|
||||||
|
@ -209,6 +205,16 @@ static void sym_calc_visibility(struct symbol *sym)
|
||||||
}
|
}
|
||||||
if (sym_is_choice_value(sym))
|
if (sym_is_choice_value(sym))
|
||||||
return;
|
return;
|
||||||
|
/* defaulting to "yes" if no explicit "depends on" are given */
|
||||||
|
tri = yes;
|
||||||
|
if (sym->dir_dep.expr)
|
||||||
|
tri = expr_calc_value(sym->dir_dep.expr);
|
||||||
|
if (tri == mod)
|
||||||
|
tri = yes;
|
||||||
|
if (sym->dir_dep.tri != tri) {
|
||||||
|
sym->dir_dep.tri = tri;
|
||||||
|
sym_set_changed(sym);
|
||||||
|
}
|
||||||
tri = no;
|
tri = no;
|
||||||
if (sym->rev_dep.expr)
|
if (sym->rev_dep.expr)
|
||||||
tri = expr_calc_value(sym->rev_dep.expr);
|
tri = expr_calc_value(sym->rev_dep.expr);
|
||||||
|
@ -220,43 +226,61 @@ static void sym_calc_visibility(struct symbol *sym)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct symbol *sym_calc_choice(struct symbol *sym)
|
/*
|
||||||
|
* Find the default symbol for a choice.
|
||||||
|
* First try the default values for the choice symbol
|
||||||
|
* Next locate the first visible choice value
|
||||||
|
* Return NULL if none was found
|
||||||
|
*/
|
||||||
|
struct symbol *sym_choice_default(struct symbol *sym)
|
||||||
{
|
{
|
||||||
struct symbol *def_sym;
|
struct symbol *def_sym;
|
||||||
struct property *prop;
|
struct property *prop;
|
||||||
struct expr *e;
|
struct expr *e;
|
||||||
|
|
||||||
/* is the user choice visible? */
|
|
||||||
def_sym = sym->def[S_DEF_USER].val;
|
|
||||||
if (def_sym) {
|
|
||||||
sym_calc_visibility(def_sym);
|
|
||||||
if (def_sym->visible != no)
|
|
||||||
return def_sym;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* any of the defaults visible? */
|
/* any of the defaults visible? */
|
||||||
for_all_defaults(sym, prop) {
|
for_all_defaults(sym, prop) {
|
||||||
prop->visible.tri = expr_calc_value(prop->visible.expr);
|
prop->visible.tri = expr_calc_value(prop->visible.expr);
|
||||||
if (prop->visible.tri == no)
|
if (prop->visible.tri == no)
|
||||||
continue;
|
continue;
|
||||||
def_sym = prop_get_symbol(prop);
|
def_sym = prop_get_symbol(prop);
|
||||||
sym_calc_visibility(def_sym);
|
|
||||||
if (def_sym->visible != no)
|
if (def_sym->visible != no)
|
||||||
return def_sym;
|
return def_sym;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* just get the first visible value */
|
/* just get the first visible value */
|
||||||
prop = sym_get_choice_prop(sym);
|
prop = sym_get_choice_prop(sym);
|
||||||
for (e = prop->expr; e; e = e->left.expr) {
|
expr_list_for_each_sym(prop->expr, e, def_sym)
|
||||||
def_sym = e->right.sym;
|
|
||||||
sym_calc_visibility(def_sym);
|
|
||||||
if (def_sym->visible != no)
|
if (def_sym->visible != no)
|
||||||
return def_sym;
|
return def_sym;
|
||||||
|
|
||||||
|
/* failed to locate any defaults */
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct symbol *sym_calc_choice(struct symbol *sym)
|
||||||
|
{
|
||||||
|
struct symbol *def_sym;
|
||||||
|
struct property *prop;
|
||||||
|
struct expr *e;
|
||||||
|
|
||||||
|
/* first calculate all choice values' visibilities */
|
||||||
|
prop = sym_get_choice_prop(sym);
|
||||||
|
expr_list_for_each_sym(prop->expr, e, def_sym)
|
||||||
|
sym_calc_visibility(def_sym);
|
||||||
|
|
||||||
|
/* is the user choice visible? */
|
||||||
|
def_sym = sym->def[S_DEF_USER].val;
|
||||||
|
if (def_sym && def_sym->visible != no)
|
||||||
|
return def_sym;
|
||||||
|
|
||||||
|
def_sym = sym_choice_default(sym);
|
||||||
|
|
||||||
|
if (def_sym == NULL)
|
||||||
/* no choice? reset tristate value */
|
/* no choice? reset tristate value */
|
||||||
sym->curr.tri = no;
|
sym->curr.tri = no;
|
||||||
return NULL;
|
|
||||||
|
return def_sym;
|
||||||
}
|
}
|
||||||
|
|
||||||
void sym_calc_value(struct symbol *sym)
|
void sym_calc_value(struct symbol *sym)
|
||||||
|
@ -303,23 +327,39 @@ void sym_calc_value(struct symbol *sym)
|
||||||
if (sym_is_choice_value(sym) && sym->visible == yes) {
|
if (sym_is_choice_value(sym) && sym->visible == yes) {
|
||||||
prop = sym_get_choice_prop(sym);
|
prop = sym_get_choice_prop(sym);
|
||||||
newval.tri = (prop_get_symbol(prop)->curr.val == sym) ? yes : no;
|
newval.tri = (prop_get_symbol(prop)->curr.val == sym) ? yes : no;
|
||||||
} else if (E_OR(sym->visible, sym->rev_dep.tri) != no) {
|
} else {
|
||||||
|
if (sym->visible != no) {
|
||||||
|
/* if the symbol is visible use the user value
|
||||||
|
* if available, otherwise try the default value
|
||||||
|
*/
|
||||||
sym->flags |= SYMBOL_WRITE;
|
sym->flags |= SYMBOL_WRITE;
|
||||||
if (sym_has_value(sym))
|
if (sym_has_value(sym)) {
|
||||||
newval.tri = sym->def[S_DEF_USER].tri;
|
newval.tri = EXPR_AND(sym->def[S_DEF_USER].tri,
|
||||||
else if (!sym_is_choice(sym)) {
|
sym->visible);
|
||||||
prop = sym_get_default_prop(sym);
|
goto calc_newval;
|
||||||
if (prop)
|
|
||||||
newval.tri = expr_calc_value(prop->expr);
|
|
||||||
}
|
}
|
||||||
newval.tri = E_OR(E_AND(newval.tri, sym->visible), sym->rev_dep.tri);
|
}
|
||||||
} else if (!sym_is_choice(sym)) {
|
if (sym->rev_dep.tri != no)
|
||||||
|
sym->flags |= SYMBOL_WRITE;
|
||||||
|
if (!sym_is_choice(sym)) {
|
||||||
prop = sym_get_default_prop(sym);
|
prop = sym_get_default_prop(sym);
|
||||||
if (prop) {
|
if (prop) {
|
||||||
sym->flags |= SYMBOL_WRITE;
|
sym->flags |= SYMBOL_WRITE;
|
||||||
newval.tri = expr_calc_value(prop->expr);
|
newval.tri = EXPR_AND(expr_calc_value(prop->expr),
|
||||||
|
prop->visible.tri);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
calc_newval:
|
||||||
|
if (sym->dir_dep.tri == no && sym->rev_dep.tri != no) {
|
||||||
|
fprintf(stderr, "warning: (");
|
||||||
|
expr_fprint(sym->rev_dep.expr, stderr);
|
||||||
|
fprintf(stderr, ") selects %s which has unmet direct dependencies (",
|
||||||
|
sym->name);
|
||||||
|
expr_fprint(sym->dir_dep.expr, stderr);
|
||||||
|
fprintf(stderr, ")\n");
|
||||||
|
}
|
||||||
|
newval.tri = EXPR_OR(newval.tri, sym->rev_dep.tri);
|
||||||
|
}
|
||||||
if (newval.tri == mod && sym_get_type(sym) == S_BOOLEAN)
|
if (newval.tri == mod && sym_get_type(sym) == S_BOOLEAN)
|
||||||
newval.tri = yes;
|
newval.tri = yes;
|
||||||
break;
|
break;
|
||||||
|
@ -361,14 +401,20 @@ void sym_calc_value(struct symbol *sym)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sym_is_choice(sym)) {
|
if (sym_is_choice(sym)) {
|
||||||
int flags = sym->flags & (SYMBOL_CHANGED | SYMBOL_WRITE);
|
struct symbol *choice_sym;
|
||||||
|
|
||||||
prop = sym_get_choice_prop(sym);
|
prop = sym_get_choice_prop(sym);
|
||||||
for (e = prop->expr; e; e = e->left.expr) {
|
expr_list_for_each_sym(prop->expr, e, choice_sym) {
|
||||||
e->right.sym->flags |= flags;
|
if ((sym->flags & SYMBOL_WRITE) &&
|
||||||
if (flags & SYMBOL_CHANGED)
|
choice_sym->visible != no)
|
||||||
sym_set_changed(e->right.sym);
|
choice_sym->flags |= SYMBOL_WRITE;
|
||||||
|
if (sym->flags & SYMBOL_CHANGED)
|
||||||
|
sym_set_changed(choice_sym);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sym->flags & SYMBOL_AUTO)
|
||||||
|
sym->flags &= ~SYMBOL_WRITE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void sym_clear_all_valid(void)
|
void sym_clear_all_valid(void)
|
||||||
|
@ -615,6 +661,80 @@ bool sym_set_string_value(struct symbol *sym, const char *newval)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Find the default value associated to a symbol.
|
||||||
|
* For tristate symbol handle the modules=n case
|
||||||
|
* in which case "m" becomes "y".
|
||||||
|
* If the symbol does not have any default then fallback
|
||||||
|
* to the fixed default values.
|
||||||
|
*/
|
||||||
|
const char *sym_get_string_default(struct symbol *sym)
|
||||||
|
{
|
||||||
|
struct property *prop;
|
||||||
|
struct symbol *ds;
|
||||||
|
const char *str;
|
||||||
|
tristate val;
|
||||||
|
|
||||||
|
sym_calc_visibility(sym);
|
||||||
|
sym_calc_value(modules_sym);
|
||||||
|
val = symbol_no.curr.tri;
|
||||||
|
str = symbol_empty.curr.val;
|
||||||
|
|
||||||
|
/* If symbol has a default value look it up */
|
||||||
|
prop = sym_get_default_prop(sym);
|
||||||
|
if (prop != NULL) {
|
||||||
|
switch (sym->type) {
|
||||||
|
case S_BOOLEAN:
|
||||||
|
case S_TRISTATE:
|
||||||
|
/* The visibility imay limit the value from yes => mod */
|
||||||
|
val = EXPR_AND(expr_calc_value(prop->expr), prop->visible.tri);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/*
|
||||||
|
* The following fails to handle the situation
|
||||||
|
* where a default value is further limited by
|
||||||
|
* the valid range.
|
||||||
|
*/
|
||||||
|
ds = prop_get_symbol(prop);
|
||||||
|
if (ds != NULL) {
|
||||||
|
sym_calc_value(ds);
|
||||||
|
str = (const char *)ds->curr.val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Handle select statements */
|
||||||
|
val = EXPR_OR(val, sym->rev_dep.tri);
|
||||||
|
|
||||||
|
/* transpose mod to yes if modules are not enabled */
|
||||||
|
if (val == mod)
|
||||||
|
if (!sym_is_choice_value(sym) && modules_sym->curr.tri == no)
|
||||||
|
val = yes;
|
||||||
|
|
||||||
|
/* transpose mod to yes if type is bool */
|
||||||
|
if (sym->type == S_BOOLEAN && val == mod)
|
||||||
|
val = yes;
|
||||||
|
|
||||||
|
switch (sym->type) {
|
||||||
|
case S_BOOLEAN:
|
||||||
|
case S_TRISTATE:
|
||||||
|
switch (val) {
|
||||||
|
case no: return "n";
|
||||||
|
case mod: return "m";
|
||||||
|
case yes: return "y";
|
||||||
|
}
|
||||||
|
case S_INT:
|
||||||
|
case S_HEX:
|
||||||
|
return str;
|
||||||
|
case S_STRING:
|
||||||
|
return str;
|
||||||
|
case S_OTHER:
|
||||||
|
case S_UNKNOWN:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
const char *sym_get_string_value(struct symbol *sym)
|
const char *sym_get_string_value(struct symbol *sym)
|
||||||
{
|
{
|
||||||
tristate val;
|
tristate val;
|
||||||
|
@ -643,12 +763,20 @@ bool sym_is_changable(struct symbol *sym)
|
||||||
return sym->visible > sym->rev_dep.tri;
|
return sym->visible > sym->rev_dep.tri;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct symbol *sym_lookup(const char *name, int isconst)
|
static unsigned strhash(const char *s)
|
||||||
|
{
|
||||||
|
/* fnv32 hash */
|
||||||
|
unsigned hash = 2166136261U;
|
||||||
|
for (; *s; s++)
|
||||||
|
hash = (hash ^ *s) * 0x01000193;
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct symbol *sym_lookup(const char *name, int flags)
|
||||||
{
|
{
|
||||||
struct symbol *symbol;
|
struct symbol *symbol;
|
||||||
const char *ptr;
|
|
||||||
char *new_name;
|
char *new_name;
|
||||||
int hash = 0;
|
int hash;
|
||||||
|
|
||||||
if (name) {
|
if (name) {
|
||||||
if (name[0] && !name[1]) {
|
if (name[0] && !name[1]) {
|
||||||
|
@ -658,29 +786,26 @@ struct symbol *sym_lookup(const char *name, int isconst)
|
||||||
case 'n': return &symbol_no;
|
case 'n': return &symbol_no;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (ptr = name; *ptr; ptr++)
|
hash = strhash(name) % SYMBOL_HASHSIZE;
|
||||||
hash += *ptr;
|
|
||||||
hash &= 0xff;
|
|
||||||
|
|
||||||
for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
|
for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
|
||||||
if (!strcmp(symbol->name, name)) {
|
if (symbol->name &&
|
||||||
if ((isconst && symbol->flags & SYMBOL_CONST) ||
|
!strcmp(symbol->name, name) &&
|
||||||
(!isconst && !(symbol->flags & SYMBOL_CONST)))
|
(flags ? symbol->flags & flags
|
||||||
|
: !(symbol->flags & (SYMBOL_CONST|SYMBOL_CHOICE))))
|
||||||
return symbol;
|
return symbol;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
new_name = strdup(name);
|
new_name = strdup(name);
|
||||||
} else {
|
} else {
|
||||||
new_name = NULL;
|
new_name = NULL;
|
||||||
hash = 256;
|
hash = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
symbol = malloc(sizeof(*symbol));
|
symbol = malloc(sizeof(*symbol));
|
||||||
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;
|
||||||
if (isconst)
|
symbol->flags |= flags;
|
||||||
symbol->flags |= SYMBOL_CONST;
|
|
||||||
|
|
||||||
symbol->next = symbol_hash[hash];
|
symbol->next = symbol_hash[hash];
|
||||||
symbol_hash[hash] = symbol;
|
symbol_hash[hash] = symbol;
|
||||||
|
@ -691,7 +816,6 @@ struct symbol *sym_lookup(const char *name, int isconst)
|
||||||
struct symbol *sym_find(const char *name)
|
struct symbol *sym_find(const char *name)
|
||||||
{
|
{
|
||||||
struct symbol *symbol = NULL;
|
struct symbol *symbol = NULL;
|
||||||
const char *ptr;
|
|
||||||
int hash = 0;
|
int hash = 0;
|
||||||
|
|
||||||
if (!name)
|
if (!name)
|
||||||
|
@ -704,12 +828,11 @@ struct symbol *sym_find(const char *name)
|
||||||
case 'n': return &symbol_no;
|
case 'n': return &symbol_no;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (ptr = name; *ptr; ptr++)
|
hash = strhash(name) % SYMBOL_HASHSIZE;
|
||||||
hash += *ptr;
|
|
||||||
hash &= 0xff;
|
|
||||||
|
|
||||||
for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
|
for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
|
||||||
if (!strcmp(symbol->name, name) &&
|
if (symbol->name &&
|
||||||
|
!strcmp(symbol->name, name) &&
|
||||||
!(symbol->flags & SYMBOL_CONST))
|
!(symbol->flags & SYMBOL_CONST))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -744,6 +867,7 @@ struct symbol **sym_re_search(const char *pattern)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
sym_calc_value(sym);
|
||||||
sym_arr[cnt++] = sym;
|
sym_arr[cnt++] = sym;
|
||||||
}
|
}
|
||||||
if (sym_arr)
|
if (sym_arr)
|
||||||
|
@ -753,8 +877,110 @@ struct symbol **sym_re_search(const char *pattern)
|
||||||
return sym_arr;
|
return sym_arr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When we check for recursive dependencies we use a stack to save
|
||||||
|
* current state so we can print out relevant info to user.
|
||||||
|
* The entries are located on the call stack so no need to free memory.
|
||||||
|
* Note inser() remove() must always match to properly clear the stack.
|
||||||
|
*/
|
||||||
|
static struct dep_stack {
|
||||||
|
struct dep_stack *prev, *next;
|
||||||
|
struct symbol *sym;
|
||||||
|
struct property *prop;
|
||||||
|
struct expr *expr;
|
||||||
|
} *check_top;
|
||||||
|
|
||||||
struct symbol *sym_check_deps(struct symbol *sym);
|
static void dep_stack_insert(struct dep_stack *stack, struct symbol *sym)
|
||||||
|
{
|
||||||
|
memset(stack, 0, sizeof(*stack));
|
||||||
|
if (check_top)
|
||||||
|
check_top->next = stack;
|
||||||
|
stack->prev = check_top;
|
||||||
|
stack->sym = sym;
|
||||||
|
check_top = stack;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dep_stack_remove(void)
|
||||||
|
{
|
||||||
|
check_top = check_top->prev;
|
||||||
|
if (check_top)
|
||||||
|
check_top->next = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Called when we have detected a recursive dependency.
|
||||||
|
* check_top point to the top of the stact so we use
|
||||||
|
* the ->prev pointer to locate the bottom of the stack.
|
||||||
|
*/
|
||||||
|
static void sym_check_print_recursive(struct symbol *last_sym)
|
||||||
|
{
|
||||||
|
struct dep_stack *stack;
|
||||||
|
struct symbol *sym, *next_sym;
|
||||||
|
struct menu *menu = NULL;
|
||||||
|
struct property *prop;
|
||||||
|
struct dep_stack cv_stack;
|
||||||
|
|
||||||
|
if (sym_is_choice_value(last_sym)) {
|
||||||
|
dep_stack_insert(&cv_stack, last_sym);
|
||||||
|
last_sym = prop_get_symbol(sym_get_choice_prop(last_sym));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (stack = check_top; stack != NULL; stack = stack->prev)
|
||||||
|
if (stack->sym == last_sym)
|
||||||
|
break;
|
||||||
|
if (!stack) {
|
||||||
|
fprintf(stderr, "unexpected recursive dependency error\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (; stack; stack = stack->next) {
|
||||||
|
sym = stack->sym;
|
||||||
|
next_sym = stack->next ? stack->next->sym : last_sym;
|
||||||
|
prop = stack->prop;
|
||||||
|
|
||||||
|
/* for choice values find the menu entry (used below) */
|
||||||
|
if (sym_is_choice(sym) || sym_is_choice_value(sym)) {
|
||||||
|
for (prop = sym->prop; prop; prop = prop->next) {
|
||||||
|
menu = prop->menu;
|
||||||
|
if (prop->menu)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (stack->sym == last_sym)
|
||||||
|
fprintf(stderr, "%s:%d:error: recursive dependency detected!\n",
|
||||||
|
prop->file->name, prop->lineno);
|
||||||
|
if (stack->expr) {
|
||||||
|
fprintf(stderr, "%s:%d:\tsymbol %s %s value contains %s\n",
|
||||||
|
prop->file->name, prop->lineno,
|
||||||
|
sym->name ? sym->name : "<choice>",
|
||||||
|
prop_get_type_name(prop->type),
|
||||||
|
next_sym->name ? next_sym->name : "<choice>");
|
||||||
|
} else if (stack->prop) {
|
||||||
|
fprintf(stderr, "%s:%d:\tsymbol %s depends on %s\n",
|
||||||
|
prop->file->name, prop->lineno,
|
||||||
|
sym->name ? sym->name : "<choice>",
|
||||||
|
next_sym->name ? next_sym->name : "<choice>");
|
||||||
|
} else if (sym_is_choice(sym)) {
|
||||||
|
fprintf(stderr, "%s:%d:\tchoice %s contains symbol %s\n",
|
||||||
|
menu->file->name, menu->lineno,
|
||||||
|
sym->name ? sym->name : "<choice>",
|
||||||
|
next_sym->name ? next_sym->name : "<choice>");
|
||||||
|
} else if (sym_is_choice_value(sym)) {
|
||||||
|
fprintf(stderr, "%s:%d:\tsymbol %s is part of choice %s\n",
|
||||||
|
menu->file->name, menu->lineno,
|
||||||
|
sym->name ? sym->name : "<choice>",
|
||||||
|
next_sym->name ? next_sym->name : "<choice>");
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "%s:%d:\tsymbol %s is selected by %s\n",
|
||||||
|
prop->file->name, prop->lineno,
|
||||||
|
sym->name ? sym->name : "<choice>",
|
||||||
|
next_sym->name ? next_sym->name : "<choice>");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (check_top == &cv_stack)
|
||||||
|
dep_stack_remove();
|
||||||
|
}
|
||||||
|
|
||||||
static struct symbol *sym_check_expr_deps(struct expr *e)
|
static struct symbol *sym_check_expr_deps(struct expr *e)
|
||||||
{
|
{
|
||||||
|
@ -787,20 +1013,14 @@ static struct symbol *sym_check_expr_deps(struct expr *e)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* return NULL when dependencies are OK */
|
/* return NULL when dependencies are OK */
|
||||||
struct symbol *sym_check_deps(struct symbol *sym)
|
static struct symbol *sym_check_sym_deps(struct symbol *sym)
|
||||||
{
|
{
|
||||||
struct symbol *sym2;
|
struct symbol *sym2;
|
||||||
struct property *prop;
|
struct property *prop;
|
||||||
|
struct dep_stack stack;
|
||||||
|
|
||||||
if (sym->flags & SYMBOL_CHECK) {
|
dep_stack_insert(&stack, sym);
|
||||||
fprintf(stderr, "%s:%d:error: found recursive dependency: %s",
|
|
||||||
sym->prop->file->name, sym->prop->lineno, sym->name);
|
|
||||||
return sym;
|
|
||||||
}
|
|
||||||
if (sym->flags & SYMBOL_CHECKED)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
sym->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED);
|
|
||||||
sym2 = sym_check_expr_deps(sym->rev_dep.expr);
|
sym2 = sym_check_expr_deps(sym->rev_dep.expr);
|
||||||
if (sym2)
|
if (sym2)
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -808,19 +1028,93 @@ struct symbol *sym_check_deps(struct symbol *sym)
|
||||||
for (prop = sym->prop; prop; prop = prop->next) {
|
for (prop = sym->prop; prop; prop = prop->next) {
|
||||||
if (prop->type == P_CHOICE || prop->type == P_SELECT)
|
if (prop->type == P_CHOICE || prop->type == P_SELECT)
|
||||||
continue;
|
continue;
|
||||||
|
stack.prop = prop;
|
||||||
sym2 = sym_check_expr_deps(prop->visible.expr);
|
sym2 = sym_check_expr_deps(prop->visible.expr);
|
||||||
if (sym2)
|
if (sym2)
|
||||||
goto out;
|
break;
|
||||||
if (prop->type != P_DEFAULT || sym_is_choice(sym))
|
if (prop->type != P_DEFAULT || sym_is_choice(sym))
|
||||||
continue;
|
continue;
|
||||||
|
stack.expr = prop->expr;
|
||||||
sym2 = sym_check_expr_deps(prop->expr);
|
sym2 = sym_check_expr_deps(prop->expr);
|
||||||
|
if (sym2)
|
||||||
|
break;
|
||||||
|
stack.expr = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
dep_stack_remove();
|
||||||
|
|
||||||
|
return sym2;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct symbol *sym_check_choice_deps(struct symbol *choice)
|
||||||
|
{
|
||||||
|
struct symbol *sym, *sym2;
|
||||||
|
struct property *prop;
|
||||||
|
struct expr *e;
|
||||||
|
struct dep_stack stack;
|
||||||
|
|
||||||
|
dep_stack_insert(&stack, choice);
|
||||||
|
|
||||||
|
prop = sym_get_choice_prop(choice);
|
||||||
|
expr_list_for_each_sym(prop->expr, e, sym)
|
||||||
|
sym->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED);
|
||||||
|
|
||||||
|
choice->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED);
|
||||||
|
sym2 = sym_check_sym_deps(choice);
|
||||||
|
choice->flags &= ~SYMBOL_CHECK;
|
||||||
if (sym2)
|
if (sym2)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
expr_list_for_each_sym(prop->expr, e, sym) {
|
||||||
|
sym2 = sym_check_sym_deps(sym);
|
||||||
|
if (sym2)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
if (sym2)
|
expr_list_for_each_sym(prop->expr, e, sym)
|
||||||
fprintf(stderr, " -> %s%s", sym->name, sym2 == sym? "\n": "");
|
|
||||||
sym->flags &= ~SYMBOL_CHECK;
|
sym->flags &= ~SYMBOL_CHECK;
|
||||||
|
|
||||||
|
if (sym2 && sym_is_choice_value(sym2) &&
|
||||||
|
prop_get_symbol(sym_get_choice_prop(sym2)) == choice)
|
||||||
|
sym2 = choice;
|
||||||
|
|
||||||
|
dep_stack_remove();
|
||||||
|
|
||||||
|
return sym2;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct symbol *sym_check_deps(struct symbol *sym)
|
||||||
|
{
|
||||||
|
struct symbol *sym2;
|
||||||
|
struct property *prop;
|
||||||
|
|
||||||
|
if (sym->flags & SYMBOL_CHECK) {
|
||||||
|
sym_check_print_recursive(sym);
|
||||||
|
return sym;
|
||||||
|
}
|
||||||
|
if (sym->flags & SYMBOL_CHECKED)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (sym_is_choice_value(sym)) {
|
||||||
|
struct dep_stack stack;
|
||||||
|
|
||||||
|
/* for choice groups start the check with main choice symbol */
|
||||||
|
dep_stack_insert(&stack, sym);
|
||||||
|
prop = sym_get_choice_prop(sym);
|
||||||
|
sym2 = sym_check_deps(prop_get_symbol(prop));
|
||||||
|
dep_stack_remove();
|
||||||
|
} else if (sym_is_choice(sym)) {
|
||||||
|
sym2 = sym_check_choice_deps(sym);
|
||||||
|
} else {
|
||||||
|
sym->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED);
|
||||||
|
sym2 = sym_check_sym_deps(sym);
|
||||||
|
sym->flags &= ~SYMBOL_CHECK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sym2 && sym2 == sym)
|
||||||
|
sym2 = NULL;
|
||||||
|
|
||||||
return sym2;
|
return sym2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -849,7 +1143,7 @@ struct property *prop_alloc(enum prop_type type, struct symbol *sym)
|
||||||
struct symbol *prop_get_symbol(struct property *prop)
|
struct symbol *prop_get_symbol(struct property *prop)
|
||||||
{
|
{
|
||||||
if (prop->expr && (prop->expr->type == E_SYMBOL ||
|
if (prop->expr && (prop->expr->type == E_SYMBOL ||
|
||||||
prop->expr->type == E_CHOICE))
|
prop->expr->type == E_LIST))
|
||||||
return prop->expr->left.sym;
|
return prop->expr->left.sym;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -859,6 +1153,8 @@ const char *prop_get_type_name(enum prop_type type)
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case P_PROMPT:
|
case P_PROMPT:
|
||||||
return "prompt";
|
return "prompt";
|
||||||
|
case P_ENV:
|
||||||
|
return "env";
|
||||||
case P_COMMENT:
|
case P_COMMENT:
|
||||||
return "comment";
|
return "comment";
|
||||||
case P_MENU:
|
case P_MENU:
|
||||||
|
@ -871,8 +1167,39 @@ const char *prop_get_type_name(enum prop_type type)
|
||||||
return "select";
|
return "select";
|
||||||
case P_RANGE:
|
case P_RANGE:
|
||||||
return "range";
|
return "range";
|
||||||
|
case P_SYMBOL:
|
||||||
|
return "symbol";
|
||||||
case P_UNKNOWN:
|
case P_UNKNOWN:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return "unknown";
|
return "unknown";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void prop_add_env(const char *env)
|
||||||
|
{
|
||||||
|
struct symbol *sym, *sym2;
|
||||||
|
struct property *prop;
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
sym = current_entry->sym;
|
||||||
|
sym->flags |= SYMBOL_AUTO;
|
||||||
|
for_all_properties(sym, prop, P_ENV) {
|
||||||
|
sym2 = prop_get_symbol(prop);
|
||||||
|
if (strcmp(sym2->name, env))
|
||||||
|
menu_warn(current_entry, "redefining environment symbol from %s",
|
||||||
|
sym2->name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
prop = prop_alloc(P_ENV, sym);
|
||||||
|
prop->expr = expr_alloc_symbol(sym_lookup(env, SYMBOL_CONST));
|
||||||
|
|
||||||
|
sym_env_list = expr_alloc_one(E_LIST, sym_env_list);
|
||||||
|
sym_env_list->right.sym = sym;
|
||||||
|
|
||||||
|
p = getenv(env);
|
||||||
|
if (p)
|
||||||
|
sym_add_default(sym, p);
|
||||||
|
else
|
||||||
|
menu_warn(current_entry, "environment variable %s undefined", env);
|
||||||
|
}
|
||||||
|
|
|
@ -29,6 +29,8 @@ struct file *file_lookup(const char *name)
|
||||||
/* write a dependency file as used by kbuild to track dependencies */
|
/* write a dependency file as used by kbuild to track dependencies */
|
||||||
int file_write_dep(const char *name)
|
int file_write_dep(const char *name)
|
||||||
{
|
{
|
||||||
|
struct symbol *sym, *env_sym;
|
||||||
|
struct expr *e;
|
||||||
struct file *file;
|
struct file *file;
|
||||||
FILE *out;
|
FILE *out;
|
||||||
|
|
||||||
|
@ -44,21 +46,39 @@ int file_write_dep(const char *name)
|
||||||
else
|
else
|
||||||
fprintf(out, "\t%s\n", file->name);
|
fprintf(out, "\t%s\n", file->name);
|
||||||
}
|
}
|
||||||
fprintf(out, "\ninclude/config/auto.conf: \\\n"
|
fprintf(out, "\n%s: \\\n"
|
||||||
"\t$(deps_config)\n\n"
|
"\t$(deps_config)\n\n", conf_get_autoconfig_name());
|
||||||
"$(deps_config): ;\n");
|
|
||||||
|
expr_list_for_each_sym(sym_env_list, e, sym) {
|
||||||
|
struct property *prop;
|
||||||
|
const char *value;
|
||||||
|
|
||||||
|
prop = sym_get_env_prop(sym);
|
||||||
|
env_sym = prop_get_symbol(prop);
|
||||||
|
if (!env_sym)
|
||||||
|
continue;
|
||||||
|
value = getenv(env_sym->name);
|
||||||
|
if (!value)
|
||||||
|
value = "";
|
||||||
|
fprintf(out, "ifneq \"$(%s)\" \"%s\"\n", env_sym->name, value);
|
||||||
|
fprintf(out, "%s: FORCE\n", conf_get_autoconfig_name());
|
||||||
|
fprintf(out, "endif\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(out, "\n$(deps_config): ;\n");
|
||||||
fclose(out);
|
fclose(out);
|
||||||
rename("..config.tmp", name);
|
rename("..config.tmp", name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Allocate initial growable sting */
|
/* Allocate initial growable string */
|
||||||
struct gstr str_new(void)
|
struct gstr str_new(void)
|
||||||
{
|
{
|
||||||
struct gstr gs;
|
struct gstr gs;
|
||||||
gs.s = malloc(sizeof(char) * 64);
|
gs.s = malloc(sizeof(char) * 64);
|
||||||
gs.len = 16;
|
gs.len = 64;
|
||||||
|
gs.max_width = 0;
|
||||||
strcpy(gs.s, "\0");
|
strcpy(gs.s, "\0");
|
||||||
return gs;
|
return gs;
|
||||||
}
|
}
|
||||||
|
@ -69,6 +89,7 @@ struct gstr str_assign(const char *s)
|
||||||
struct gstr gs;
|
struct gstr gs;
|
||||||
gs.s = strdup(s);
|
gs.s = strdup(s);
|
||||||
gs.len = strlen(s) + 1;
|
gs.len = strlen(s) + 1;
|
||||||
|
gs.max_width = 0;
|
||||||
return gs;
|
return gs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,13 +105,16 @@ void str_free(struct gstr *gs)
|
||||||
/* Append to growable string */
|
/* Append to growable string */
|
||||||
void str_append(struct gstr *gs, const char *s)
|
void str_append(struct gstr *gs, const char *s)
|
||||||
{
|
{
|
||||||
size_t l = strlen(gs->s) + strlen(s) + 1;
|
size_t l;
|
||||||
|
if (s) {
|
||||||
|
l = strlen(gs->s) + strlen(s) + 1;
|
||||||
if (l > gs->len) {
|
if (l > gs->len) {
|
||||||
gs->s = realloc(gs->s, l);
|
gs->s = realloc(gs->s, l);
|
||||||
gs->len = l;
|
gs->len = l;
|
||||||
}
|
}
|
||||||
strcat(gs->s, s);
|
strcat(gs->s, s);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Append printf formatted string to growable string */
|
/* Append printf formatted string to growable string */
|
||||||
void str_printf(struct gstr *gs, const char *fmt, ...)
|
void str_printf(struct gstr *gs, const char *fmt, ...)
|
||||||
|
|
|
@ -9,6 +9,8 @@
|
||||||
|
|
||||||
struct kconf_id;
|
struct kconf_id;
|
||||||
|
|
||||||
|
static struct kconf_id *kconf_id_lookup(register const char *str, register unsigned int len);
|
||||||
|
|
||||||
%%
|
%%
|
||||||
mainmenu, T_MAINMENU, TF_COMMAND
|
mainmenu, T_MAINMENU, TF_COMMAND
|
||||||
menu, T_MENU, TF_COMMAND
|
menu, T_MENU, TF_COMMAND
|
||||||
|
@ -23,7 +25,6 @@ help, T_HELP, TF_COMMAND
|
||||||
if, T_IF, TF_COMMAND|TF_PARAM
|
if, T_IF, TF_COMMAND|TF_PARAM
|
||||||
endif, T_ENDIF, TF_COMMAND
|
endif, T_ENDIF, TF_COMMAND
|
||||||
depends, T_DEPENDS, TF_COMMAND
|
depends, T_DEPENDS, TF_COMMAND
|
||||||
requires, T_REQUIRES, TF_COMMAND
|
|
||||||
optional, T_OPTIONAL, TF_COMMAND
|
optional, T_OPTIONAL, TF_COMMAND
|
||||||
default, T_DEFAULT, TF_COMMAND, S_UNKNOWN
|
default, T_DEFAULT, TF_COMMAND, S_UNKNOWN
|
||||||
prompt, T_PROMPT, TF_COMMAND
|
prompt, T_PROMPT, TF_COMMAND
|
||||||
|
@ -32,15 +33,14 @@ def_tristate, T_DEFAULT, TF_COMMAND, S_TRISTATE
|
||||||
bool, T_TYPE, TF_COMMAND, S_BOOLEAN
|
bool, T_TYPE, TF_COMMAND, S_BOOLEAN
|
||||||
boolean, T_TYPE, TF_COMMAND, S_BOOLEAN
|
boolean, T_TYPE, TF_COMMAND, S_BOOLEAN
|
||||||
def_bool, T_DEFAULT, TF_COMMAND, S_BOOLEAN
|
def_bool, T_DEFAULT, TF_COMMAND, S_BOOLEAN
|
||||||
def_boolean, T_DEFAULT, TF_COMMAND, S_BOOLEAN
|
|
||||||
int, T_TYPE, TF_COMMAND, S_INT
|
int, T_TYPE, TF_COMMAND, S_INT
|
||||||
hex, T_TYPE, TF_COMMAND, S_HEX
|
hex, T_TYPE, TF_COMMAND, S_HEX
|
||||||
string, T_TYPE, TF_COMMAND, S_STRING
|
string, T_TYPE, TF_COMMAND, S_STRING
|
||||||
select, T_SELECT, TF_COMMAND
|
select, T_SELECT, TF_COMMAND
|
||||||
enable, T_SELECT, TF_COMMAND
|
|
||||||
range, T_RANGE, TF_COMMAND
|
range, T_RANGE, TF_COMMAND
|
||||||
option, T_OPTION, TF_COMMAND
|
option, T_OPTION, TF_COMMAND
|
||||||
on, T_ON, TF_PARAM
|
on, T_ON, TF_PARAM
|
||||||
modules, T_OPT_MODULES, TF_OPTION
|
modules, T_OPT_MODULES, TF_OPTION
|
||||||
defconfig_list, T_OPT_DEFCONFIG_LIST,TF_OPTION
|
defconfig_list, T_OPT_DEFCONFIG_LIST,TF_OPTION
|
||||||
|
env, T_OPT_ENV, TF_OPTION
|
||||||
%%
|
%%
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* ANSI-C code produced by gperf version 3.0.1 */
|
/* ANSI-C code produced by gperf version 3.0.3 */
|
||||||
/* Command-line: gperf */
|
/* Command-line: gperf */
|
||||||
/* Computed positions: -k'1,3' */
|
/* Computed positions: -k'1,3' */
|
||||||
|
|
||||||
|
@ -30,7 +30,9 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct kconf_id;
|
struct kconf_id;
|
||||||
/* maximum key range = 45, duplicates = 0 */
|
|
||||||
|
static struct kconf_id *kconf_id_lookup(register const char *str, register unsigned int len);
|
||||||
|
/* maximum key range = 47, duplicates = 0 */
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
__inline
|
__inline
|
||||||
|
@ -44,32 +46,32 @@ kconf_id_hash (register const char *str, register unsigned int len)
|
||||||
{
|
{
|
||||||
static unsigned char asso_values[] =
|
static unsigned char asso_values[] =
|
||||||
{
|
{
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
|
||||||
47, 47, 47, 47, 47, 47, 47, 25, 30, 15,
|
49, 49, 49, 49, 49, 49, 49, 49, 11, 5,
|
||||||
0, 15, 0, 47, 5, 15, 47, 47, 30, 20,
|
0, 0, 5, 49, 5, 20, 49, 49, 5, 20,
|
||||||
5, 0, 25, 15, 0, 0, 10, 35, 47, 47,
|
5, 0, 30, 49, 0, 15, 0, 10, 0, 49,
|
||||||
5, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
25, 49, 49, 49, 49, 49, 49, 49, 49, 49,
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
|
||||||
47, 47, 47, 47, 47, 47
|
49, 49, 49, 49, 49, 49
|
||||||
};
|
};
|
||||||
register int hval = len;
|
register int hval = len;
|
||||||
|
|
||||||
|
@ -89,136 +91,131 @@ kconf_id_hash (register const char *str, register unsigned int len)
|
||||||
struct kconf_id_strings_t
|
struct kconf_id_strings_t
|
||||||
{
|
{
|
||||||
char kconf_id_strings_str2[sizeof("on")];
|
char kconf_id_strings_str2[sizeof("on")];
|
||||||
char kconf_id_strings_str6[sizeof("string")];
|
char kconf_id_strings_str3[sizeof("env")];
|
||||||
char kconf_id_strings_str7[sizeof("default")];
|
char kconf_id_strings_str5[sizeof("endif")];
|
||||||
char kconf_id_strings_str8[sizeof("def_bool")];
|
char kconf_id_strings_str6[sizeof("option")];
|
||||||
|
char kconf_id_strings_str7[sizeof("endmenu")];
|
||||||
|
char kconf_id_strings_str8[sizeof("optional")];
|
||||||
|
char kconf_id_strings_str9[sizeof("endchoice")];
|
||||||
char kconf_id_strings_str10[sizeof("range")];
|
char kconf_id_strings_str10[sizeof("range")];
|
||||||
char kconf_id_strings_str11[sizeof("def_boolean")];
|
char kconf_id_strings_str11[sizeof("choice")];
|
||||||
char kconf_id_strings_str12[sizeof("def_tristate")];
|
char kconf_id_strings_str12[sizeof("default")];
|
||||||
char kconf_id_strings_str13[sizeof("hex")];
|
char kconf_id_strings_str13[sizeof("def_bool")];
|
||||||
char kconf_id_strings_str14[sizeof("defconfig_list")];
|
char kconf_id_strings_str14[sizeof("help")];
|
||||||
char kconf_id_strings_str16[sizeof("option")];
|
char kconf_id_strings_str15[sizeof("bool")];
|
||||||
char kconf_id_strings_str17[sizeof("if")];
|
char kconf_id_strings_str16[sizeof("config")];
|
||||||
char kconf_id_strings_str18[sizeof("optional")];
|
char kconf_id_strings_str17[sizeof("def_tristate")];
|
||||||
char kconf_id_strings_str20[sizeof("endif")];
|
char kconf_id_strings_str18[sizeof("boolean")];
|
||||||
char kconf_id_strings_str21[sizeof("choice")];
|
char kconf_id_strings_str19[sizeof("defconfig_list")];
|
||||||
char kconf_id_strings_str22[sizeof("endmenu")];
|
char kconf_id_strings_str21[sizeof("string")];
|
||||||
char kconf_id_strings_str23[sizeof("requires")];
|
char kconf_id_strings_str22[sizeof("if")];
|
||||||
char kconf_id_strings_str24[sizeof("endchoice")];
|
char kconf_id_strings_str23[sizeof("int")];
|
||||||
char kconf_id_strings_str26[sizeof("config")];
|
char kconf_id_strings_str26[sizeof("select")];
|
||||||
char kconf_id_strings_str27[sizeof("modules")];
|
char kconf_id_strings_str27[sizeof("modules")];
|
||||||
char kconf_id_strings_str28[sizeof("int")];
|
char kconf_id_strings_str28[sizeof("tristate")];
|
||||||
char kconf_id_strings_str29[sizeof("menu")];
|
char kconf_id_strings_str29[sizeof("menu")];
|
||||||
char kconf_id_strings_str31[sizeof("prompt")];
|
char kconf_id_strings_str31[sizeof("source")];
|
||||||
char kconf_id_strings_str32[sizeof("depends")];
|
char kconf_id_strings_str32[sizeof("comment")];
|
||||||
char kconf_id_strings_str33[sizeof("tristate")];
|
char kconf_id_strings_str33[sizeof("hex")];
|
||||||
char kconf_id_strings_str34[sizeof("bool")];
|
|
||||||
char kconf_id_strings_str35[sizeof("menuconfig")];
|
char kconf_id_strings_str35[sizeof("menuconfig")];
|
||||||
char kconf_id_strings_str36[sizeof("select")];
|
char kconf_id_strings_str36[sizeof("prompt")];
|
||||||
char kconf_id_strings_str37[sizeof("boolean")];
|
char kconf_id_strings_str37[sizeof("depends")];
|
||||||
char kconf_id_strings_str39[sizeof("help")];
|
char kconf_id_strings_str48[sizeof("mainmenu")];
|
||||||
char kconf_id_strings_str41[sizeof("source")];
|
|
||||||
char kconf_id_strings_str42[sizeof("comment")];
|
|
||||||
char kconf_id_strings_str43[sizeof("mainmenu")];
|
|
||||||
char kconf_id_strings_str46[sizeof("enable")];
|
|
||||||
};
|
};
|
||||||
static struct kconf_id_strings_t kconf_id_strings_contents =
|
static struct kconf_id_strings_t kconf_id_strings_contents =
|
||||||
{
|
{
|
||||||
"on",
|
"on",
|
||||||
"string",
|
"env",
|
||||||
|
"endif",
|
||||||
|
"option",
|
||||||
|
"endmenu",
|
||||||
|
"optional",
|
||||||
|
"endchoice",
|
||||||
|
"range",
|
||||||
|
"choice",
|
||||||
"default",
|
"default",
|
||||||
"def_bool",
|
"def_bool",
|
||||||
"range",
|
|
||||||
"def_boolean",
|
|
||||||
"def_tristate",
|
|
||||||
"hex",
|
|
||||||
"defconfig_list",
|
|
||||||
"option",
|
|
||||||
"if",
|
|
||||||
"optional",
|
|
||||||
"endif",
|
|
||||||
"choice",
|
|
||||||
"endmenu",
|
|
||||||
"requires",
|
|
||||||
"endchoice",
|
|
||||||
"config",
|
|
||||||
"modules",
|
|
||||||
"int",
|
|
||||||
"menu",
|
|
||||||
"prompt",
|
|
||||||
"depends",
|
|
||||||
"tristate",
|
|
||||||
"bool",
|
|
||||||
"menuconfig",
|
|
||||||
"select",
|
|
||||||
"boolean",
|
|
||||||
"help",
|
"help",
|
||||||
|
"bool",
|
||||||
|
"config",
|
||||||
|
"def_tristate",
|
||||||
|
"boolean",
|
||||||
|
"defconfig_list",
|
||||||
|
"string",
|
||||||
|
"if",
|
||||||
|
"int",
|
||||||
|
"select",
|
||||||
|
"modules",
|
||||||
|
"tristate",
|
||||||
|
"menu",
|
||||||
"source",
|
"source",
|
||||||
"comment",
|
"comment",
|
||||||
"mainmenu",
|
"hex",
|
||||||
"enable"
|
"menuconfig",
|
||||||
|
"prompt",
|
||||||
|
"depends",
|
||||||
|
"mainmenu"
|
||||||
};
|
};
|
||||||
#define kconf_id_strings ((const char *) &kconf_id_strings_contents)
|
#define kconf_id_strings ((const char *) &kconf_id_strings_contents)
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
__inline
|
__inline
|
||||||
|
#ifdef __GNUC_STDC_INLINE__
|
||||||
|
__attribute__ ((__gnu_inline__))
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
struct kconf_id *
|
struct kconf_id *
|
||||||
kconf_id_lookup (register const char *str, register unsigned int len)
|
kconf_id_lookup (register const char *str, register unsigned int len)
|
||||||
{
|
{
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
TOTAL_KEYWORDS = 33,
|
TOTAL_KEYWORDS = 31,
|
||||||
MIN_WORD_LENGTH = 2,
|
MIN_WORD_LENGTH = 2,
|
||||||
MAX_WORD_LENGTH = 14,
|
MAX_WORD_LENGTH = 14,
|
||||||
MIN_HASH_VALUE = 2,
|
MIN_HASH_VALUE = 2,
|
||||||
MAX_HASH_VALUE = 46
|
MAX_HASH_VALUE = 48
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct kconf_id wordlist[] =
|
static struct kconf_id wordlist[] =
|
||||||
{
|
{
|
||||||
{-1}, {-1},
|
{-1}, {-1},
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str2, T_ON, TF_PARAM},
|
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str2, T_ON, TF_PARAM},
|
||||||
{-1}, {-1}, {-1},
|
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str3, T_OPT_ENV, TF_OPTION},
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str6, T_TYPE, TF_COMMAND, S_STRING},
|
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str7, T_DEFAULT, TF_COMMAND, S_UNKNOWN},
|
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str8, T_DEFAULT, TF_COMMAND, S_BOOLEAN},
|
|
||||||
{-1},
|
{-1},
|
||||||
|
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str5, T_ENDIF, TF_COMMAND},
|
||||||
|
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str6, T_OPTION, TF_COMMAND},
|
||||||
|
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str7, T_ENDMENU, TF_COMMAND},
|
||||||
|
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str8, T_OPTIONAL, TF_COMMAND},
|
||||||
|
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str9, T_ENDCHOICE, TF_COMMAND},
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str10, T_RANGE, TF_COMMAND},
|
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str10, T_RANGE, TF_COMMAND},
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str11, T_DEFAULT, TF_COMMAND, S_BOOLEAN},
|
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str11, T_CHOICE, TF_COMMAND},
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str12, T_DEFAULT, TF_COMMAND, S_TRISTATE},
|
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str12, T_DEFAULT, TF_COMMAND, S_UNKNOWN},
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str13, T_TYPE, TF_COMMAND, S_HEX},
|
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str13, T_DEFAULT, TF_COMMAND, S_BOOLEAN},
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str14, T_OPT_DEFCONFIG_LIST,TF_OPTION},
|
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str14, T_HELP, TF_COMMAND},
|
||||||
|
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str15, T_TYPE, TF_COMMAND, S_BOOLEAN},
|
||||||
|
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str16, T_CONFIG, TF_COMMAND},
|
||||||
|
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str17, T_DEFAULT, TF_COMMAND, S_TRISTATE},
|
||||||
|
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str18, T_TYPE, TF_COMMAND, S_BOOLEAN},
|
||||||
|
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str19, T_OPT_DEFCONFIG_LIST,TF_OPTION},
|
||||||
{-1},
|
{-1},
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str16, T_OPTION, TF_COMMAND},
|
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str21, T_TYPE, TF_COMMAND, S_STRING},
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str17, T_IF, TF_COMMAND|TF_PARAM},
|
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str22, T_IF, TF_COMMAND|TF_PARAM},
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str18, T_OPTIONAL, TF_COMMAND},
|
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str23, T_TYPE, TF_COMMAND, S_INT},
|
||||||
{-1},
|
{-1}, {-1},
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str20, T_ENDIF, TF_COMMAND},
|
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str26, T_SELECT, TF_COMMAND},
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str21, T_CHOICE, TF_COMMAND},
|
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str22, T_ENDMENU, TF_COMMAND},
|
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str23, T_REQUIRES, TF_COMMAND},
|
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str24, T_ENDCHOICE, TF_COMMAND},
|
|
||||||
{-1},
|
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str26, T_CONFIG, TF_COMMAND},
|
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str27, T_OPT_MODULES, TF_OPTION},
|
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str27, T_OPT_MODULES, TF_OPTION},
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str28, T_TYPE, TF_COMMAND, S_INT},
|
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str28, T_TYPE, TF_COMMAND, S_TRISTATE},
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str29, T_MENU, TF_COMMAND},
|
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str29, T_MENU, TF_COMMAND},
|
||||||
{-1},
|
{-1},
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str31, T_PROMPT, TF_COMMAND},
|
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str31, T_SOURCE, TF_COMMAND},
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str32, T_DEPENDS, TF_COMMAND},
|
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str32, T_COMMENT, TF_COMMAND},
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str33, T_TYPE, TF_COMMAND, S_TRISTATE},
|
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str33, T_TYPE, TF_COMMAND, S_HEX},
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str34, T_TYPE, TF_COMMAND, S_BOOLEAN},
|
{-1},
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str35, T_MENUCONFIG, TF_COMMAND},
|
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str35, T_MENUCONFIG, TF_COMMAND},
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str36, T_SELECT, TF_COMMAND},
|
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str36, T_PROMPT, TF_COMMAND},
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str37, T_TYPE, TF_COMMAND, S_BOOLEAN},
|
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str37, T_DEPENDS, TF_COMMAND},
|
||||||
|
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
|
||||||
{-1},
|
{-1},
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str39, T_HELP, TF_COMMAND},
|
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str48, T_MAINMENU, TF_COMMAND}
|
||||||
{-1},
|
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str41, T_SOURCE, TF_COMMAND},
|
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str42, T_COMMENT, TF_COMMAND},
|
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str43, T_MAINMENU, TF_COMMAND},
|
|
||||||
{-1}, {-1},
|
|
||||||
{(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str46, T_SELECT, TF_COMMAND}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
|
if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
%option backup nostdinit noyywrap never-interactive full ecs
|
%option backup nostdinit noyywrap never-interactive full ecs
|
||||||
%option 8bit backup nodefault perf-report perf-report
|
%option 8bit backup nodefault perf-report perf-report
|
||||||
|
%option noinput
|
||||||
%x COMMAND HELP STRING PARAM
|
%x COMMAND HELP STRING PARAM
|
||||||
%{
|
%{
|
||||||
/*
|
/*
|
||||||
|
@ -38,7 +39,7 @@ static int last_ts, first_ts;
|
||||||
static void zconf_endhelp(void);
|
static void zconf_endhelp(void);
|
||||||
static void zconf_endfile(void);
|
static void zconf_endfile(void);
|
||||||
|
|
||||||
void new_string(void)
|
static void new_string(void)
|
||||||
{
|
{
|
||||||
text = malloc(START_STRSIZE);
|
text = malloc(START_STRSIZE);
|
||||||
text_asize = START_STRSIZE;
|
text_asize = START_STRSIZE;
|
||||||
|
@ -46,7 +47,7 @@ void new_string(void)
|
||||||
*text = 0;
|
*text = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void append_string(const char *str, int size)
|
static void append_string(const char *str, int size)
|
||||||
{
|
{
|
||||||
int new_size = text_size + size + 1;
|
int new_size = text_size + size + 1;
|
||||||
if (new_size > text_asize) {
|
if (new_size > text_asize) {
|
||||||
|
@ -60,7 +61,7 @@ void append_string(const char *str, int size)
|
||||||
text[text_size] = 0;
|
text[text_size] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void alloc_string(const char *str, int size)
|
static void alloc_string(const char *str, int size)
|
||||||
{
|
{
|
||||||
text = malloc(size + 1);
|
text = malloc(size + 1);
|
||||||
memcpy(text, str, size);
|
memcpy(text, str, size);
|
||||||
|
@ -217,6 +218,11 @@ n [A-Za-z0-9_]
|
||||||
append_string("\n", 1);
|
append_string("\n", 1);
|
||||||
}
|
}
|
||||||
[^ \t\n].* {
|
[^ \t\n].* {
|
||||||
|
while (yyleng) {
|
||||||
|
if ((yytext[yyleng-1] != ' ') && (yytext[yyleng-1] != '\t'))
|
||||||
|
break;
|
||||||
|
yyleng--;
|
||||||
|
}
|
||||||
append_string(yytext, yyleng);
|
append_string(yytext, yyleng);
|
||||||
if (!first_ts)
|
if (!first_ts)
|
||||||
first_ts = last_ts;
|
first_ts = last_ts;
|
||||||
|
@ -256,7 +262,7 @@ static void zconf_endhelp(void)
|
||||||
* ./name
|
* ./name
|
||||||
* $(srctree)/name
|
* $(srctree)/name
|
||||||
* The latter is used when srctree is separate from objtree
|
* The latter is used when srctree is separate from objtree
|
||||||
* when compiling the kernel.
|
* when compiling the barebox.
|
||||||
* Return NULL if file is not found.
|
* Return NULL if file is not found.
|
||||||
*/
|
*/
|
||||||
FILE *zconf_fopen(const char *name)
|
FILE *zconf_fopen(const char *name)
|
||||||
|
@ -308,11 +314,14 @@ void zconf_nextfile(const char *name)
|
||||||
current_buf = buf;
|
current_buf = buf;
|
||||||
|
|
||||||
if (file->flags & FILE_BUSY) {
|
if (file->flags & FILE_BUSY) {
|
||||||
printf("recursive scan (%s)?\n", name);
|
printf("%s:%d: do not source '%s' from itself\n",
|
||||||
|
zconf_curname(), zconf_lineno(), name);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
if (file->flags & FILE_SCANNED) {
|
if (file->flags & FILE_SCANNED) {
|
||||||
printf("file %s already scanned?\n", name);
|
printf("%s:%d: file '%s' is already sourced from '%s'\n",
|
||||||
|
zconf_curname(), zconf_lineno(), name,
|
||||||
|
file->parent->name);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
file->flags |= FILE_BUSY;
|
file->flags |= FILE_BUSY;
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -14,8 +14,6 @@
|
||||||
#define LKC_DIRECT_LINK
|
#define LKC_DIRECT_LINK
|
||||||
#include "lkc.h"
|
#include "lkc.h"
|
||||||
|
|
||||||
#include "zconf.hash.c"
|
|
||||||
|
|
||||||
#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)
|
#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)
|
||||||
|
|
||||||
#define PRINTD 0x0001
|
#define PRINTD 0x0001
|
||||||
|
@ -29,7 +27,7 @@ static void zconf_error(const char *err, ...);
|
||||||
static void zconferror(const char *err);
|
static void zconferror(const char *err);
|
||||||
static bool zconf_endtoken(struct kconf_id *id, int starttoken, int endtoken);
|
static bool zconf_endtoken(struct kconf_id *id, int starttoken, int endtoken);
|
||||||
|
|
||||||
struct symbol *symbol_hash[257];
|
struct symbol *symbol_hash[SYMBOL_HASHSIZE];
|
||||||
|
|
||||||
static struct menu *current_menu, *current_entry;
|
static struct menu *current_menu, *current_entry;
|
||||||
|
|
||||||
|
@ -64,7 +62,6 @@ static struct menu *current_menu, *current_entry;
|
||||||
%token <id>T_IF
|
%token <id>T_IF
|
||||||
%token <id>T_ENDIF
|
%token <id>T_ENDIF
|
||||||
%token <id>T_DEPENDS
|
%token <id>T_DEPENDS
|
||||||
%token <id>T_REQUIRES
|
|
||||||
%token <id>T_OPTIONAL
|
%token <id>T_OPTIONAL
|
||||||
%token <id>T_PROMPT
|
%token <id>T_PROMPT
|
||||||
%token <id>T_TYPE
|
%token <id>T_TYPE
|
||||||
|
@ -92,7 +89,7 @@ static struct menu *current_menu, *current_entry;
|
||||||
%type <id> end
|
%type <id> end
|
||||||
%type <id> option_name
|
%type <id> option_name
|
||||||
%type <menu> if_entry menu_entry choice_entry
|
%type <menu> if_entry menu_entry choice_entry
|
||||||
%type <string> symbol_option_arg
|
%type <string> symbol_option_arg word_opt
|
||||||
|
|
||||||
%destructor {
|
%destructor {
|
||||||
fprintf(stderr, "%s:%d: missing end statement for this entry\n",
|
fprintf(stderr, "%s:%d: missing end statement for this entry\n",
|
||||||
|
@ -101,6 +98,11 @@ static struct menu *current_menu, *current_entry;
|
||||||
menu_end_menu();
|
menu_end_menu();
|
||||||
} if_entry menu_entry choice_entry
|
} if_entry menu_entry choice_entry
|
||||||
|
|
||||||
|
%{
|
||||||
|
/* Include zconf.hash.c here so it can see the token constants. */
|
||||||
|
#include "zconf.hash.c"
|
||||||
|
%}
|
||||||
|
|
||||||
%%
|
%%
|
||||||
input: stmt_list;
|
input: stmt_list;
|
||||||
|
|
||||||
|
@ -240,10 +242,10 @@ symbol_option_arg:
|
||||||
|
|
||||||
/* choice entry */
|
/* choice entry */
|
||||||
|
|
||||||
choice: T_CHOICE T_EOL
|
choice: T_CHOICE word_opt T_EOL
|
||||||
{
|
{
|
||||||
struct symbol *sym = sym_lookup(NULL, 0);
|
struct symbol *sym = sym_lookup($2, SYMBOL_CHOICE);
|
||||||
sym->flags |= SYMBOL_CHOICE;
|
sym->flags |= SYMBOL_AUTO;
|
||||||
menu_add_entry(sym);
|
menu_add_entry(sym);
|
||||||
menu_add_expr(P_CHOICE, NULL, NULL);
|
menu_add_expr(P_CHOICE, NULL, NULL);
|
||||||
printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno());
|
printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno());
|
||||||
|
@ -418,16 +420,6 @@ depends: T_DEPENDS T_ON expr T_EOL
|
||||||
{
|
{
|
||||||
menu_add_dep($3);
|
menu_add_dep($3);
|
||||||
printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno());
|
printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno());
|
||||||
}
|
|
||||||
| T_DEPENDS expr T_EOL
|
|
||||||
{
|
|
||||||
menu_add_dep($2);
|
|
||||||
printd(DEBUG_PARSE, "%s:%d:depends\n", zconf_curname(), zconf_lineno());
|
|
||||||
}
|
|
||||||
| T_REQUIRES expr T_EOL
|
|
||||||
{
|
|
||||||
menu_add_dep($2);
|
|
||||||
printd(DEBUG_PARSE, "%s:%d:requires\n", zconf_curname(), zconf_lineno());
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* prompt statement */
|
/* prompt statement */
|
||||||
|
@ -467,9 +459,12 @@ expr: symbol { $$ = expr_alloc_symbol($1); }
|
||||||
;
|
;
|
||||||
|
|
||||||
symbol: T_WORD { $$ = sym_lookup($1, 0); free($1); }
|
symbol: T_WORD { $$ = sym_lookup($1, 0); free($1); }
|
||||||
| T_WORD_QUOTE { $$ = sym_lookup($1, 1); free($1); }
|
| T_WORD_QUOTE { $$ = sym_lookup($1, SYMBOL_CONST); free($1); }
|
||||||
;
|
;
|
||||||
|
|
||||||
|
word_opt: /* empty */ { $$ = NULL; }
|
||||||
|
| T_WORD
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
void conf_parse(const char *name)
|
void conf_parse(const char *name)
|
||||||
|
@ -480,7 +475,7 @@ void conf_parse(const char *name)
|
||||||
zconf_initscan(name);
|
zconf_initscan(name);
|
||||||
|
|
||||||
sym_init();
|
sym_init();
|
||||||
menu_init();
|
_menu_init();
|
||||||
modules_sym = sym_lookup(NULL, 0);
|
modules_sym = sym_lookup(NULL, 0);
|
||||||
modules_sym->type = S_BOOLEAN;
|
modules_sym->type = S_BOOLEAN;
|
||||||
modules_sym->flags |= SYMBOL_AUTO;
|
modules_sym->flags |= SYMBOL_AUTO;
|
||||||
|
@ -509,7 +504,7 @@ void conf_parse(const char *name)
|
||||||
sym_set_change_count(1);
|
sym_set_change_count(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *zconf_tokenname(int token)
|
static const char *zconf_tokenname(int token)
|
||||||
{
|
{
|
||||||
switch (token) {
|
switch (token) {
|
||||||
case T_MENU: return "menu";
|
case T_MENU: return "menu";
|
||||||
|
@ -573,7 +568,7 @@ static void zconferror(const char *err)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_quoted_string(FILE *out, const char *str)
|
static void print_quoted_string(FILE *out, const char *str)
|
||||||
{
|
{
|
||||||
const char *p;
|
const char *p;
|
||||||
int len;
|
int len;
|
||||||
|
@ -590,15 +585,15 @@ void print_quoted_string(FILE *out, const char *str)
|
||||||
putc('"', out);
|
putc('"', out);
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_symbol(FILE *out, struct menu *menu)
|
static void print_symbol(FILE *out, struct menu *menu)
|
||||||
{
|
{
|
||||||
struct symbol *sym = menu->sym;
|
struct symbol *sym = menu->sym;
|
||||||
struct property *prop;
|
struct property *prop;
|
||||||
|
|
||||||
if (sym_is_choice(sym))
|
if (sym_is_choice(sym))
|
||||||
fprintf(out, "choice\n");
|
fprintf(out, "\nchoice\n");
|
||||||
else
|
else
|
||||||
fprintf(out, "config %s\n", sym->name);
|
fprintf(out, "\nconfig %s\n", sym->name);
|
||||||
switch (sym->type) {
|
switch (sym->type) {
|
||||||
case S_BOOLEAN:
|
case S_BOOLEAN:
|
||||||
fputs(" boolean\n", out);
|
fputs(" boolean\n", out);
|
||||||
|
@ -644,6 +639,21 @@ void print_symbol(FILE *out, struct menu *menu)
|
||||||
case P_CHOICE:
|
case P_CHOICE:
|
||||||
fputs(" #choice value\n", out);
|
fputs(" #choice value\n", out);
|
||||||
break;
|
break;
|
||||||
|
case P_SELECT:
|
||||||
|
fputs( " select ", out);
|
||||||
|
expr_fprint(prop->expr, out);
|
||||||
|
fputc('\n', out);
|
||||||
|
break;
|
||||||
|
case P_RANGE:
|
||||||
|
fputs( " range ", out);
|
||||||
|
expr_fprint(prop->expr, out);
|
||||||
|
fputc('\n', out);
|
||||||
|
break;
|
||||||
|
case P_MENU:
|
||||||
|
fputs( " menu ", out);
|
||||||
|
print_quoted_string(out, prop->text);
|
||||||
|
fputc('\n', out);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(out, " unknown prop %d!\n", prop->type);
|
fprintf(out, " unknown prop %d!\n", prop->type);
|
||||||
break;
|
break;
|
||||||
|
@ -655,7 +665,6 @@ void print_symbol(FILE *out, struct menu *menu)
|
||||||
menu->help[len] = 0;
|
menu->help[len] = 0;
|
||||||
fprintf(out, " help\n%s\n", menu->help);
|
fprintf(out, " help\n%s\n", menu->help);
|
||||||
}
|
}
|
||||||
fputc('\n', out);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void zconfdump(FILE *out)
|
void zconfdump(FILE *out)
|
||||||
|
@ -688,7 +697,6 @@ void zconfdump(FILE *out)
|
||||||
expr_fprint(prop->visible.expr, out);
|
expr_fprint(prop->visible.expr, out);
|
||||||
fputc('\n', out);
|
fputc('\n', out);
|
||||||
}
|
}
|
||||||
fputs("\n", out);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (menu->list)
|
if (menu->list)
|
||||||
|
|
Loading…
Reference in New Issue