Yet another major rework of the BusyBox config system, using the considerably
authorandersen <andersen@69ca8d6d-28ef-0310-b511-8ec308f3f277>
Thu, 5 Dec 2002 08:41:41 +0000 (08:41 +0000)
committerandersen <andersen@69ca8d6d-28ef-0310-b511-8ec308f3f277>
Thu, 5 Dec 2002 08:41:41 +0000 (08:41 +0000)
modified Kbuild system I put into uClibc.  With this, there should be no more
need to modify Rules.mak since I've moved all the interesting options into the
config system.  I think I've got everything updated, but you never know, I may
have made some mistakes, so watch closely.
 -Erik

git-svn-id: svn://busybox.net/trunk/busybox@6102 69ca8d6d-28ef-0310-b511-8ec308f3f277

69 files changed:
.cvsignore
Makefile
Rules.mak
archival/Config.in [new file with mode: 0644]
archival/config.in [deleted file]
console-tools/Config.in [new file with mode: 0644]
console-tools/config.in [deleted file]
debianutils/Config.in [new file with mode: 0644]
debianutils/config.in [deleted file]
editors/Config.in [new file with mode: 0644]
editors/config.in [deleted file]
findutils/Config.in [new file with mode: 0644]
findutils/config.in [deleted file]
init/Config.in [new file with mode: 0644]
init/config.in [deleted file]
loginutils/Config.in [new file with mode: 0644]
loginutils/config.in [deleted file]
miscutils/Config.in [new file with mode: 0644]
miscutils/config.in [deleted file]
modutils/Config.in [new file with mode: 0644]
modutils/config.in [deleted file]
networking/Config.in [new file with mode: 0644]
networking/config.in [deleted file]
networking/udhcp/Config.in [new file with mode: 0644]
networking/udhcp/Makefile.in
networking/udhcp/config.in [deleted file]
procps/Config.in [new file with mode: 0644]
procps/config.in [deleted file]
scripts/Configure [deleted file]
scripts/Menuconfig [deleted file]
scripts/config/.cvsignore [new file with mode: 0644]
scripts/config/Kconfig-language.txt [new file with mode: 0644]
scripts/config/Makefile [new file with mode: 0644]
scripts/config/checklist.c [moved from scripts/lxdialog/checklist.c with 91% similarity]
scripts/config/colors.h [moved from scripts/lxdialog/colors.h with 100% similarity]
scripts/config/conf.c [new file with mode: 0644]
scripts/config/confdata.c [new file with mode: 0644]
scripts/config/dialog.h [moved from scripts/lxdialog/dialog.h with 93% similarity]
scripts/config/expr.c [new file with mode: 0644]
scripts/config/expr.h [new file with mode: 0644]
scripts/config/inputbox.c [moved from scripts/lxdialog/inputbox.c with 100% similarity]
scripts/config/lex.zconf.c_shipped [new file with mode: 0644]
scripts/config/lkc.h [new file with mode: 0644]
scripts/config/lkc_proto.h [new file with mode: 0644]
scripts/config/mconf.c [new file with mode: 0644]
scripts/config/menu.c [new file with mode: 0644]
scripts/config/menubox.c [moved from scripts/lxdialog/menubox.c with 86% similarity]
scripts/config/msgbox.c [moved from scripts/lxdialog/msgbox.c with 100% similarity]
scripts/config/symbol.c [new file with mode: 0644]
scripts/config/textbox.c [moved from scripts/lxdialog/textbox.c with 99% similarity]
scripts/config/util.c [moved from scripts/lxdialog/util.c with 97% similarity]
scripts/config/yesno.c [moved from scripts/lxdialog/yesno.c with 100% similarity]
scripts/config/zconf.l [new file with mode: 0644]
scripts/config/zconf.tab.c_shipped [new file with mode: 0644]
scripts/config/zconf.tab.h_shipped [new file with mode: 0644]
scripts/config/zconf.y [new file with mode: 0644]
scripts/lxdialog/.cvsignore [deleted file]
scripts/lxdialog/BIG.FAT.WARNING [deleted file]
scripts/lxdialog/Makefile [deleted file]
scripts/lxdialog/Makefile-2.5 [deleted file]
scripts/lxdialog/lxdialog.c [deleted file]
shell/Config.in [new file with mode: 0644]
shell/config.in [deleted file]
sysdeps/linux/Config.in [new file with mode: 0644]
sysdeps/linux/config.in [deleted file]
sysklogd/Config.in [new file with mode: 0644]
sysklogd/config.in [deleted file]
util-linux/Config.in [new file with mode: 0644]
util-linux/config.in [deleted file]

index 9150aa5..4e4f586 100644 (file)
@@ -3,3 +3,5 @@ busybox.links
 _install
 .config
 .menuconfig.log
+.config.cmd
+.config.old
index d61d945..69ab48e 100644 (file)
--- a/Makefile
+++ b/Makefile
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 #
 
-TOPDIR:= $(shell /bin/pwd)/
-include $(TOPDIR).config
-include $(TOPDIR)Rules.mak
-SUBDIRS:=applets archival archival/libunarchive console-tools debianutils \
+#--------------------------------------------------------------
+# You shouldn't need to mess with anything beyond this point...
+#--------------------------------------------------------------
+noconfig_targets := menuconfig config oldconfig randconfig \
+       defconfig allyesconfig allnoconfig clean distclean \
+       release tags
+TOPDIR=./
+include Rules.mak
+
+DIRS:=applets archival archival/libunarchive console-tools debianutils \
        editors fileutils findutils init miscutils modutils networking \
        networking/libiproute networking/udhcp procps loginutils shell \
        shellutils sysklogd textutils util-linux libbb libpwdgrp
 
-all:    do-it-all
+ifdef include_config
 
-#
-# Make "config" the default target if there is no configuration file or
-# "depend" the target if there is no top-level dependency information.
-ifeq (.config,$(wildcard .config))
-include .config
-ifeq (.depend,$(wildcard .depend))
-include .depend 
-do-it-all:      busybox busybox.links #doc
-include $(patsubst %,%/Makefile.in, $(SUBDIRS))
-else
-CONFIGURATION = depend
-do-it-all:      depend
-endif
-else
-CONFIGURATION = menuconfig
-do-it-all:      menuconfig
-endif
+all: busybox busybox.links #doc
 
+# In this section, we need .config
+-include .config.cmd
+include $(patsubst %,%/Makefile.in, $(DIRS))
 
 busybox: depend $(libraries-y)
        $(CC) $(LDFLAGS) -o $@ $(libraries-y) $(LIBRARIES)
@@ -124,92 +117,88 @@ docs/busybox/busyboxdocumentation.html: docs/busybox.sgml
        - mkdir -p docs
        (cd docs/busybox.net; sgmltools -b html ../busybox.sgml)
 
-
-
 # The nifty new buildsystem stuff
-$(TOPDIR)scripts/mkdep: scripts/mkdep.c
+scripts/mkdep: scripts/mkdep.c
        $(HOSTCC) $(HOSTCFLAGS) -o scripts/mkdep scripts/mkdep.c
 
-$(TOPDIR)scripts/split-include: scripts/split-include.c
+scripts/split-include: scripts/split-include.c
        $(HOSTCC) $(HOSTCFLAGS) -o scripts/split-include scripts/split-include.c
 
-$(TOPDIR).depend: $(TOPDIR)scripts/mkdep
+.depend: scripts/mkdep
        rm -f .depend .hdepend;
-       mkdir -p $(TOPDIR)include/config;
+       mkdir -p include/config;
        $(HOSTCC) $(HOSTCFLAGS) -o scripts/mkdep scripts/mkdep.c
-       scripts/mkdep -I $(TOPDIR)include -- \
-               `find $(TOPDIR) -name \*.c -print` >> .depend;
-       scripts/mkdep -I $(TOPDIR)include -- \
-               `find $(TOPDIR) -name \*.h -print` >> .hdepend;
-       $(MAKE) $(patsubst %,_sfdep_%,$(SUBDIRS)) _FASTDEP_ALL_SUB_DIRS="$(SUBDIRS)" ;
-       @ echo -e "\n\nNow run 'make' to build BusyBox\n\n"
-
-depend dep: $(TOPDIR)include/config.h $(TOPDIR).depend
+       scripts/mkdep -I include -- \
+               `find . -name \*.c -print` >> .depend;
+       scripts/mkdep -I include -- \
+               `find . -name \*.h -print` >> .hdepend;
+       $(MAKE) $(patsubst %,_sfdep_%,$(DIRS)) _FASTDEP_ALL_SUB_DIRS="$(DIRS)" ;
 
-BB_SHELL := ${shell if [ -x "$$BASH" ]; then echo $$BASH; \
-       else if [ -x /bin/bash ]; then echo /bin/bash; \
-       else echo sh; fi ; fi}
+depend dep: include/config.h .depend
 
-include/config/MARKER: depend $(TOPDIR)scripts/split-include
+include/config/MARKER: depend scripts/split-include
        scripts/split-include include/config.h include/config
        @ touch include/config/MARKER
 
-$(TOPDIR)include/config.h:
-       @if [ ! -f $(TOPDIR)include/config.h ] ; then \
-               make oldconfig; \
+include/config.h: .config
+       @if [ ! -x ./scripts/config/conf ] ; then \
+           make -C scripts/config; \
        fi;
+       @./scripts/config/conf -o sysdeps/$(TARGET_OS)/Config.in
 
-$(TOPDIR).config:
-       @if [ ! -f $(TOPDIR).config ] ; then \
-           cp $(TOPDIR)sysdeps/$(TARGET_OS)/defconfig $(TOPDIR).config; \
-       fi;
+%.o: %.c
+       $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -c -o $@ $<
 
-menuconfig: $(TOPDIR).config
-       mkdir -p $(TOPDIR)include/config
-       $(MAKE) -C scripts/lxdialog all
-       $(BB_SHELL) scripts/Menuconfig sysdeps/$(TARGET_OS)/config.in
+finished2:
+       @echo
+       @echo Finished installing...
+       @echo
 
-config: $(TOPDIR).config
-       mkdir -p $(TOPDIR)include/config
-       $(BB_SHELL) scripts/Configure sysdeps/$(TARGET_OS)/config.in
+else # ifdef include_config
 
-oldconfig: $(TOPDIR).config
-       mkdir -p $(TOPDIR)include/config
-       $(BB_SHELL) scripts/Configure -d sysdeps/$(TARGET_OS)/config.in
+all: menuconfig
 
+ifeq ($(filter-out $(noconfig_targets),$(MAKECMDGOALS)),)
+# Targets which don't need .config
 
-ifdef CONFIGURATION
-..$(CONFIGURATION):
-       @echo
-       @echo "You have a bad or nonexistent" .$(CONFIGURATION) ": running 'make" $(CONFIGURATION)"'"
-       @echo
-       $(MAKE) $(CONFIGURATION)
-       @echo
-       @echo "Successful. Try re-making (ignore the error that follows)"
-       @echo
-       exit 1
+# configuration
+# ---------------------------------------------------------------------------
 
-dummy:
+scripts/config/conf scripts/config/mconf:
+       make -C scripts/config
+       -@if [ ! -f .config ] ; then \
+               cp sysdeps/$(TARGET_OS)/defconfig .config; \
+       fi
 
-else
+menuconfig: scripts/config/mconf
+       @./scripts/config/mconf sysdeps/$(TARGET_OS)/Config.in
 
-dummy:
+config: scripts/config/conf
+       @./scripts/config/conf sysdeps/$(TARGET_OS)/Config.in
 
-endif
+oldconfig: scripts/config/conf
+       @./scripts/config/conf -o sysdeps/$(TARGET_OS)/Config.in
 
+randconfig: scripts/config/conf
+       @./scripts/config/conf -r sysdeps/$(TARGET_OS)/Config.in
 
-%.o: %.c
-       $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -c -o $@ $<
+allyesconfig: scripts/config/conf
+       @./scripts/config/conf -y sysdeps/$(TARGET_OS)/Config.in
+
+allnoconfig: scripts/config/conf
+       @./scripts/config/conf -n sysdeps/$(TARGET_OS)/Config.in
 
+defconfig: scripts/config/conf
+       @./scripts/config/conf -d sysdeps/$(TARGET_OS)/Config.in
 
-# Testing...
-test tests:
-       # old way of doing it
-       #cd tests && $(MAKE) all
-       # new way of doing it
+test tests: busybox
+       # Note that 'tests' is depricated.  Use 'make check' instead
+       # To use the nice new testsuite....
        cd tests && ./tester.sh
 
-# Cleanup
+check: busybox
+       cd testsuite && ./runtest
+
 clean:
        - $(MAKE) -C tests clean
        - $(MAKE) -C scripts/lxdialog clean
@@ -227,10 +216,9 @@ clean:
        - find . -name \*.a -exec rm -f {} \;
 
 distclean: clean
-       - rm -f busybox 
-       - cd tests && $(MAKE) distclean
+       rm -f .config .config.old .config.cmd
 
-dist release: distclean doc
+release: distclean #doc
        cd ..;                                  \
        rm -rf busybox-$(VERSION);              \
        cp -a busybox busybox-$(VERSION);       \
@@ -247,13 +235,14 @@ dist release: distclean doc
                                                \
        tar -cvzf busybox-$(VERSION).tar.gz busybox-$(VERSION)/;
 
+tags:
+       ctags -R .
 
 
-.PHONY: tags check depend
+endif # ifeq ($(filter-out $(noconfig_targets),$(MAKECMDGOALS)),)
+endif # ifdef include_config
 
-tags:
-       ctags -R .
+.PHONY: dummy subdirs release distclean clean config oldconfig \
+       menuconfig tags check test tests depend
 
-check: busybox
-       cd testsuite && ./runtest
 
index 56c4025..58c03b6 100644 (file)
--- a/Rules.mak
+++ b/Rules.mak
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 #
 
+#--------------------------------------------------------
 PROG      := busybox
 VERSION   := 0.61.pre
 BUILDTIME := $(shell TZ=UTC date -u "+%Y.%m.%d-%H:%M%z")
-HOSTCC    := gcc
-HOSTCFLAGS:= -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
 
 
-# What OS are you compiling busybox for?  This allows you to include
-# OS specific things, syscall overrides, etc.
-TARGET_OS:=linux
-
+#--------------------------------------------------------
 # With a modern GNU make(1) (highly recommended, that's what all the
 # developers use), all of the following configuration values can be
 # overridden at the command line.  For example:
 #   make CROSS=powerpc-linux- BB_SRC_DIR=$HOME/busybox PREFIX=/mnt/app
+#--------------------------------------------------------
 
-# If you want to add some simple compiler switches (like -march=i686),
-# especially from the command line, use this instead of CFLAGS directly.
-# For optimization overrides, it's better still to set OPTIMIZATION.
-CFLAGS_EXTRA:=#-Werror
-# If you want a static binary, turn this on.
-DOSTATIC:=false
-
-# Set the following to `true' to make a debuggable build.
-# Leave this set to `false' for production use.
-DODEBUG:=false
-
-# This enables compiling with dmalloc ( http://dmalloc.com/ )
-# which is an excellent public domain mem leak and malloc problem
-# detector.  To enable dmalloc, before running busybox you will
-# want to first set up your environment.
-# eg: `export DMALLOC_OPTIONS=debug=0x34f47d83,inter=100,log=logfile`
-# The debug= value is generated using the following command
-# dmalloc -p log-stats -p log-non-free -p log-bad-space -p log-elapsed-time \
-#      -p check-fence -p check-heap -p check-lists -p check-blank \
-#      -p check-funcs -p realloc-copy -p allow-free-null
-# Do not enable this for production builds...
-DODMALLOC:=false
-
-# Electric-fence is another very useful malloc debugging library.
-# Do not enable this for production builds...
-DOEFENCE:=false
-
-# If you want large file summit support, turn this on.
-# This has no effect if you don't have a kernel with lfs
-# support, and a system with libc-2.1.3 or later.
-# Some of the programs that can benefit from lfs support
-# are dd, gzip, mount, tar, and mkfs_minix.
-# LFS allows you to use the above programs for files
-# larger than 2GB!
-DOLFS:=false
-
-# If you have a "pristine" source directory, point BB_SRC_DIR to it.
-# Experimental and incomplete; tell the mailing list
-# <busybox@busybox.net> if you do or don't like it so far.
-BB_SRC_DIR:=
-
-# If you are running a cross compiler, you may want to set CROSS
-# to something more interesting, like "arm-linux-".
-CROSS:=
-CC             := $(CROSS)gcc
+# If you are running a cross compiler, you will want to set 'CROSS'
+# to something more interesting...  Target architecture is determined
+# by asking the CC compiler what arch it compiles things for, so unless
+# your compiler is broken, you should not need to specify TARGET_ARCH
+CROSS           =$(subst ",, $(strip $(CROSS_COMPILER_PREFIX)))
+CC             = $(CROSS)gcc
 AR             := $(CROSS)ar
 AS             := $(CROSS)as
 LD             := $(CROSS)ld
@@ -86,12 +43,24 @@ NM             := $(CROSS)nm
 STRIP          := $(CROSS)strip
 CPP            := $(CC) -E
 MAKEFILES      := $(TOPDIR).config
-export VERSION BUILDTIME TOPDIR HOSTCC HOSTCFLAGS CROSS CC AR AS LD NM STRIP CPP
 
+# What OS are you compiling busybox for?  This allows you to include
+# OS specific things, syscall overrides, etc.
+TARGET_OS:=linux
+
+# Select the compiler needed to build binaries for your development system
+HOSTCC    := gcc
+HOSTCFLAGS:= -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
 
-# To compile vs uClibc, just use the compiler wrapper built by uClibc...
-# Everything should compile and work as expected these days...
-#CC:=/usr/i386-linux-uclibc/bin/i386-uclibc-gcc
+# If you want to add some simple compiler switches (like -march=i686),
+# especially from the command line, use this instead of CFLAGS directly.
+# For optimization overrides, it's better still to set OPTIMIZATION.
+CFLAGS_EXTRA=$(subst ",, $(strip $(EXTRA_CFLAGS_OPTIONS)))
+# If you have a "pristine" source directory, point BB_SRC_DIR to it.
+# Experimental and incomplete; tell the mailing list
+# <busybox@busybox.net> if you do or don't like it so far.
+BB_SRC_DIR:=
 
 # To compile vs some other alternative libc, you may need to use/adjust
 # the following lines to meet your needs...
@@ -115,7 +84,10 @@ WARNINGS:=-Wall -Wstrict-prototypes -Wshadow
 CFLAGS:=-I$(TOPDIR)include
 ARFLAGS:=-r
 
-TARGET_ARCH:=${shell $(CC) -dumpmachine | sed -e s'/-.*//' \
+#--------------------------------------------------------
+export VERSION BUILDTIME TOPDIR HOSTCC HOSTCFLAGS CROSS CC AR AS LD NM STRIP CPP
+ifeq ($(strip $(TARGET_ARCH)),)
+TARGET_ARCH:=$(shell $(CC) -dumpmachine | sed -e s'/-.*//' \
                -e 's/i.86/i386/' \
                -e 's/sparc.*/sparc/' \
                -e 's/arm.*/arm/g' \
@@ -123,8 +95,18 @@ TARGET_ARCH:=${shell $(CC) -dumpmachine | sed -e s'/-.*//' \
                -e 's/ppc/powerpc/g' \
                -e 's/v850.*/v850/g' \
                -e 's/sh[234]/sh/' \
-               -e 's/mips.*/mips/' \
-               }
+               -e 's/mips-.*/mips/' \
+               -e 's/mipsel-.*/mipsel/' \
+               -e 's/cris.*/cris/' \
+               )
+endif
+
+# Pull in the user's uClibc configuration
+ifeq ($(filter $(noconfig_targets),$(MAKECMDGOALS)),)
+include_config := 1
+-include $(TOPDIR).config
+endif
+
 # A nifty macro to make testing gcc features easier
 check_gcc=$(shell if $(CC) $(1) -S -o /dev/null -xc /dev/null > /dev/null 2>&1; \
        then echo "$(1)"; else echo "$(2)"; fi)
@@ -159,24 +141,20 @@ OPTIMIZATIONS:=$(OPTIMIZATION) -fomit-frame-pointer
 # prone to casual user adjustment.
 # 
 
-ifeq ($(strip $(DOLFS)),true)
+ifeq ($(strip $(DOLFS)),y)
     # For large file summit support
     CFLAGS+=-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
 endif
-ifeq ($(strip $(DODMALLOC)),true)
+ifeq ($(strip $(DODMALLOC)),y)
     # For testing mem leaks with dmalloc
     CFLAGS+=-DDMALLOC
     LIBRARIES:=-ldmalloc
-    # Force debug=true, since this is useless when not debugging...
-    DODEBUG:=true
 else
-    ifeq ($(strip $(DOEFENCE)),true)
+    ifeq ($(strip $(DOEFENCE)),y)
        LIBRARIES:=-lefence
-       # Force debug=true, since this is useless when not debugging...
-       DODEBUG:=true
     endif
 endif
-ifeq ($(strip $(DODEBUG)),true)
+ifeq ($(strip $(DODEBUG)),y)
     CFLAGS  +=$(WARNINGS) -g -D_GNU_SOURCE
     LDFLAGS +=-Wl,-warn-common
     STRIPCMD:=/bin/true -Not_stripping_since_we_are_debugging
@@ -185,7 +163,7 @@ else
     LDFLAGS += -s -Wl,-warn-common
     STRIPCMD:=$(STRIP) --remove-section=.note --remove-section=.comment
 endif
-ifeq ($(strip $(DOSTATIC)),true)
+ifeq ($(strip $(DOSTATIC)),y)
     LDFLAGS += --static
 endif
 
@@ -203,8 +181,6 @@ ifneq ($(strip $(BB_SRC_DIR)),)
     VPATH:=$(BB_SRC_DIR)
 endif
 
-CFLAGS    += -DBB_VER='"$(VERSION)"'
-CFLAGS    += -DBB_BT='"$(BUILDTIME)"'
 OBJECTS:=$(APPLET_SOURCES:.c=.o) busybox.o usage.o applets.o
 CFLAGS    += $(CROSS_CFLAGS)
 ifdef BB_INIT_SCRIPT
diff --git a/archival/Config.in b/archival/Config.in
new file mode 100644 (file)
index 0000000..ecef07f
--- /dev/null
@@ -0,0 +1,158 @@
+#
+# For a description of the syntax of this configuration file,
+# see scripts/kbuild/config-language.txt.
+#
+
+menu "Archival Utilities"
+
+config CONFIG_AR
+       bool "ar"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_AR_LONG_FILENAMES
+       bool "  Enable support for long filenames (not need for debs)"
+       default n
+       depends on CONFIG_AR
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_BUNZIP2
+       bool "bunzip2"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_CPIO
+       bool "cpio"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_DPKG
+       bool "dpkg"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_DPKG_DEB
+       bool "dpkg_deb"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY
+       bool "  extract only (-x)"
+       default n
+       depends on CONFIG_DPKG_DEB
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_DEB_TAR_GZ
+       bool "  gzip debian packages (normal)"
+       default y if CONFIG_DPKG || CONFIG_DPKG_DEB
+       depends on CONFIG_DPKG || CONFIG_DPKG_DEB
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_DEB_TAR_BZ2
+       bool "  bzip2 debian packages"
+       default n
+       depends on CONFIG_DPKG || CONFIG_DPKG_DEB
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_GUNZIP
+       bool "gunzip"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_GUNZIP_UNCOMPRESS
+       bool "  Uncompress support"
+       default n
+       depends on CONFIG_GUNZIP
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_GZIP
+       bool "gzip"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_RPM2CPIO
+       bool "rpm2cpio"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_TAR
+       bool "tar"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_TAR_CREATE
+       bool "  Enable archive creation"
+       default y
+       depends on CONFIG_TAR
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_TAR_BZIP2
+       bool "  Enable -j option to handle .tar.bz2 files"
+       default n
+       depends on CONFIG_TAR
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_TAR_EXCLUDE
+       bool "  Enable -X and --exclude options (exclude files)"
+       default n
+       depends on CONFIG_TAR
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_TAR_GZIP
+       bool "  Enable -z option"
+       default y
+       depends on CONFIG_TAR
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_TAR_OLD_FORMAT
+       bool "  Enable support for old tar header format"
+       default n
+       depends on CONFIG_TAR
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_GNUTAR_LONG_FILENAME
+       bool "  Enable support for GNU long filenames"
+       default y
+       depends on CONFIG_TAR
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_UNARCHIVE_TAPE
+       bool "  Enable tape drive support"
+       default n
+       depends on CONFIG_TAR || CONFIG_CPIO
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_UNCOMPRESS
+       bool "uncompress"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_UNZIP
+       bool "unzip"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+endmenu
diff --git a/archival/config.in b/archival/config.in
deleted file mode 100644 (file)
index 05e6dca..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-#
-# For a description of the syntax of this configuration file,
-# see scripts/kbuild/config-language.txt.
-#
-
-mainmenu_option next_comment
-comment 'Archival Utilities'
-
-bool 'ar'          CONFIG_AR
-if [ "$CONFIG_AR" = "y" ] ; then
-    bool '  Enable support for long filenames (not need for debs)'     CONFIG_FEATURE_AR_LONG_FILENAMES
-fi
-bool 'bunzip2'     CONFIG_BUNZIP2
-bool 'cpio'        CONFIG_CPIO
-bool 'dpkg'        CONFIG_DPKG
-bool 'dpkg_deb'            CONFIG_DPKG_DEB
-if [ "$CONFIG_DPKG_DEB" = "y" ] ; then
-    bool '  extract only (-x)' CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY
-fi
-if [ "$CONFIG_DPKG" = "y" ] || [ "$CONFIG_DPKG_DEB" = "y" ] ; then
-    comment 'Common dpkg/dpkg-deb options'
-    bool '  gzip debian packages (normal)'      CONFIG_FEATURE_DEB_TAR_GZ
-    bool '  bzip2 debian packages'              CONFIG_FEATURE_DEB_TAR_BZ2
-fi
-bool 'gunzip'      CONFIG_GUNZIP
-if [ "$CONFIG_GUNZIP" = "y" ]; then
-    bool '  Uncompress support'                CONFIG_FEATURE_GUNZIP_UNCOMPRESS
-fi
-bool 'gzip'        CONFIG_GZIP
-bool 'rpm2cpio'     CONFIG_RPM2CPIO
-bool 'tar'         CONFIG_TAR
-if [ "$CONFIG_TAR" = "y" ] ; then
-    bool '  Enable archive creation'   CONFIG_FEATURE_TAR_CREATE
-    bool '  Enable -j option to handle .tar.bz2 files' CONFIG_FEATURE_TAR_BZIP2
-    bool '  Enable -X and --exclude options (exclude files)'   CONFIG_FEATURE_TAR_EXCLUDE
-    bool '  Enable -z option'  CONFIG_FEATURE_TAR_GZIP
-    bool '  Enable support for old tar header format'  CONFIG_FEATURE_TAR_OLD_FORMAT
-    bool '  Enable support for GNU long filenames' CONFIG_FEATURE_GNUTAR_LONG_FILENAME
-fi
-if [ "$CONFIG_CPIO" = "y" -o "$CONFIG_TAR" = "y" ] ; then
-    bool '  Enable tape drive support' CONFIG_FEATURE_UNARCHIVE_TAPE
-fi
-bool 'uncompress'   CONFIG_UNCOMPRESS
-bool 'unzip'       CONFIG_UNZIP
-endmenu
diff --git a/console-tools/Config.in b/console-tools/Config.in
new file mode 100644 (file)
index 0000000..f10bf75
--- /dev/null
@@ -0,0 +1,68 @@
+#
+# For a description of the syntax of this configuration file,
+# see scripts/kbuild/config-language.txt.
+#
+
+menu "Console Utilities"
+
+config CONFIG_CHVT
+       bool "chvt"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_CLEAR
+       bool "clear"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_DEALLOCVT
+       bool "deallocvt"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_DUMPKMAP
+       bool "dumpkmap"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_LOADACM
+       bool "loadacm"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_LOADFONT
+       bool "loadfont"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_LOADKMAP
+       bool "loadkmap"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_OPENVT
+       bool "openvt"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_RESET
+       bool "reset"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_SETKEYCODES
+       bool "setkeycodes"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+endmenu
diff --git a/console-tools/config.in b/console-tools/config.in
deleted file mode 100644 (file)
index 2ea96ae..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# For a description of the syntax of this configuration file,
-# see scripts/kbuild/config-language.txt.
-#
-
-mainmenu_option next_comment
-comment 'Console Utilities'
-bool 'chvt'        CONFIG_CHVT
-bool 'clear'       CONFIG_CLEAR
-bool 'deallocvt'    CONFIG_DEALLOCVT
-bool 'dumpkmap'            CONFIG_DUMPKMAP
-bool 'loadacm'     CONFIG_LOADACM
-bool 'loadfont'            CONFIG_LOADFONT
-bool 'loadkmap'            CONFIG_LOADKMAP
-bool 'openvt'      CONFIG_OPENVT
-bool 'reset'       CONFIG_RESET
-bool 'setkeycodes'  CONFIG_SETKEYCODES
-
-endmenu
diff --git a/debianutils/Config.in b/debianutils/Config.in
new file mode 100644 (file)
index 0000000..9f6d840
--- /dev/null
@@ -0,0 +1,33 @@
+#
+# For a description of the syntax of this configuration file,
+# see scripts/kbuild/config-language.txt.
+#
+
+menu "Debian Utilities"
+
+config CONFIG_MKTEMP
+       bool "mktemp"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_READLINK
+       bool "readlink"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_RUN_PARTS
+       bool "run-parts"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_WHICH
+       bool "which"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+endmenu
+
diff --git a/debianutils/config.in b/debianutils/config.in
deleted file mode 100644 (file)
index 7b1d929..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-#
-# For a description of the syntax of this configuration file,
-# see scripts/kbuild/config-language.txt.
-#
-
-mainmenu_option next_comment
-comment 'Debian Utilities'
-
-bool 'mktemp'      CONFIG_MKTEMP
-bool 'readlink'            CONFIG_READLINK
-bool 'run-parts'    CONFIG_RUN_PARTS
-bool 'which'       CONFIG_WHICH
-
-endmenu
-
diff --git a/editors/Config.in b/editors/Config.in
new file mode 100644 (file)
index 0000000..4f28175
--- /dev/null
@@ -0,0 +1,104 @@
+#
+# For a description of the syntax of this configuration file,
+# see scripts/kbuild/config-language.txt.
+#
+
+menu "Editors"
+
+config CONFIG_AWK
+       bool "awk"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_AWK_MATH
+       bool "  Enable math functions (requires libm)"
+       default y
+       depends on CONFIG_AWK
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_SED
+       bool "sed"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_VI
+       bool "vi"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_VI_COLON
+       bool "  Enable \":\" colon commands (no \"ex\" mode)"
+       default y
+       depends on CONFIG_VI
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_VI_YANKMARK
+       bool "  Enable yank/put commands and mark cmds"
+       default y
+       depends on CONFIG_VI
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_VI_SEARCH
+       bool "  Enable search and replace cmds"
+       default y
+       depends on CONFIG_VI
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_VI_USE_SIGNALS
+       bool "  Catch signals"
+       default y
+       depends on CONFIG_VI
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_VI_DOT_CMD
+       bool "  Remember previous cmd and \".\" cmd"
+       default y
+       depends on CONFIG_VI
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_VI_READONLY
+       bool "  Enable -R option and \"view\" mode"
+       default y
+       depends on CONFIG_VI
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_VI_SETOPTS
+       bool "  Enable set-able options, ai ic showmatch"
+       default y
+       depends on CONFIG_VI
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_VI_SET
+       bool "  Support for :set"
+       default y
+       depends on CONFIG_VI
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_VI_WIN_RESIZE
+       bool "  Handle window resize"
+       default y
+       depends on CONFIG_VI
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_VI_OPTIMIZE_CURSOR
+       bool "  Optimize cursor movement"
+       default y
+       depends on CONFIG_VI
+       help
+         Please submit a patch to add help text for this item.
+
+endmenu
+
diff --git a/editors/config.in b/editors/config.in
deleted file mode 100644 (file)
index 54e1a90..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#
-# For a description of the syntax of this configuration file,
-# see scripts/kbuild/config-language.txt.
-#
-
-mainmenu_option next_comment
-comment 'Editors'
-
-bool 'awk'         CONFIG_AWK
-if [ "$CONFIG_AWK" = "y" ]; then
-    bool '  Enable math functions (requires libm)'      CONFIG_FEATURE_AWK_MATH
-fi
-bool 'sed'         CONFIG_SED
-bool 'vi'          CONFIG_VI
-if [ "$CONFIG_VI" = "y" ]; then
-    bool '  Enable ":" colon commands (no "ex" mode)'  CONFIG_FEATURE_VI_COLON
-    bool '  Enable yank/put commands and mark cmds'    CONFIG_FEATURE_VI_YANKMARK
-    bool '  Enable search and replace cmds'            CONFIG_FEATURE_VI_SEARCH
-    bool '  Catch signals'                             CONFIG_FEATURE_VI_USE_SIGNALS
-    bool '  Remember previous cmd and "." cmd'         CONFIG_FEATURE_VI_DOT_CMD
-    bool '  Enable -R option and "view" mode'          CONFIG_FEATURE_VI_READONLY
-    bool '  Enable set-able options, ai ic showmatch'  CONFIG_FEATURE_VI_SETOPTS
-    bool '  Support for :set'                          CONFIG_FEATURE_VI_SET
-    bool '  Handle window resize'                      CONFIG_FEATURE_VI_WIN_RESIZE
-    bool '  Optimize cursor movement'                  CONFIG_FEATURE_VI_OPTIMIZE_CURSOR
-fi
-endmenu
-
diff --git a/findutils/Config.in b/findutils/Config.in
new file mode 100644 (file)
index 0000000..42400ff
--- /dev/null
@@ -0,0 +1,70 @@
+#
+# For a description of the syntax of this configuration file,
+# see scripts/kbuild/config-language.txt.
+#
+
+menu "Finding Utilities"
+
+config CONFIG_FIND
+       bool "find"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_FIND_MTIME
+       bool "  Enable modified time matching (-mtime) option"
+       default y
+       depends on CONFIG_FIND
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_FIND_PERM
+       bool "  Enable permissions matching (-perm) option"
+       default y
+       depends on CONFIG_FIND
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_FIND_TYPE
+       bool "  Enable filetype matching (-type) option"
+       default y
+       depends on CONFIG_FIND
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_FIND_XDEV
+       bool "  Enable stay in filesystem (-xdev) option"
+       default y
+       depends on CONFIG_FIND
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_GREP
+       bool "grep"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_GREP_EGREP_ALIAS
+       bool "  Support extended regular expressions (egrep & grep -E)"
+       default y
+       depends on CONFIG_GREP
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_GREP_CONTEXT
+       bool "  Enable before and after context flags (-A, -B and -C)"
+       default y
+       depends on CONFIG_GREP
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_XARGS
+       bool "xargs"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+
+endmenu
+
diff --git a/findutils/config.in b/findutils/config.in
deleted file mode 100644 (file)
index 41a23c0..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-#
-# For a description of the syntax of this configuration file,
-# see scripts/kbuild/config-language.txt.
-#
-
-mainmenu_option next_comment
-comment 'Finding Utilities'
-
-bool 'find'        CONFIG_FIND
-if [ "$CONFIG_FIND" = "y" ] ; then
-    bool '  Enable modified time matching (-mtime) option' CONFIG_FEATURE_FIND_MTIME
-    bool '  Enable permissions matching (-perm) option' CONFIG_FEATURE_FIND_PERM
-    bool '  Enable filetype matching (-type) option' CONFIG_FEATURE_FIND_TYPE
-    bool '  Enable stay in filesystem (-xdev) option' CONFIG_FEATURE_FIND_XDEV
-fi
-bool 'grep'        CONFIG_GREP
-if [ "$CONFIG_GREP" = "y" ] ; then
-    bool '  Support extended regular expressions (egrep & grep -E)'            CONFIG_FEATURE_GREP_EGREP_ALIAS
-    bool '  Enable before and after context flags (-A, -B and -C)'     CONFIG_FEATURE_GREP_CONTEXT
-fi
-bool 'xargs'       CONFIG_XARGS
-endmenu
-
diff --git a/init/Config.in b/init/Config.in
new file mode 100644 (file)
index 0000000..90173c5
--- /dev/null
@@ -0,0 +1,78 @@
+#
+# For a description of the syntax of this configuration file,
+# see scripts/kbuild/config-language.txt.
+#
+
+menu "Init Utilities"
+
+config CONFIG_INIT
+       bool "init"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_USE_INITTAB
+       bool "  Support reading an inittab file?"
+       default y
+       depends on CONFIG_INIT
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_INITRD
+       bool "  Support running init from within an initrd?"
+       default y
+       depends on CONFIG_INIT
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_INIT_COREDUMPS
+       bool "  Support dumping core for child processes (debugging only)?"
+       default y
+       depends on CONFIG_INIT
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_EXTRA_QUIET
+       bool "  Should init be _extra_ quiet on boot?"
+       default y
+       depends on CONFIG_INIT
+       help
+         Please submit a patch to add help text for this item.
+
+# Some apps that are meaningless without BusyBox running as init
+config CONFIG_HALT
+       bool "halt"
+       default y
+       depends on CONFIG_INIT
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_POWEROFF
+       bool "poweroff"
+       default y
+       depends on CONFIG_INIT
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_REBOOT
+       bool "reboot"
+       default y
+       depends on CONFIG_INIT
+       help
+         Please submit a patch to add help text for this item.
+
+# Should start-stop-daemon be moved under debianutils?
+config CONFIG_START_STOP_DAEMON
+       bool "start-stop-daemon"
+       default y
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_MESG
+       bool "mesg"
+       default y
+       help
+         Please submit a patch to add help text for this item.
+
+endmenu
+
diff --git a/init/config.in b/init/config.in
deleted file mode 100644 (file)
index 3688eaa..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-#
-# For a description of the syntax of this configuration file,
-# see scripts/kbuild/config-language.txt.
-#
-
-mainmenu_option next_comment
-comment 'Init Utilities'
-
-
-bool 'init'        CONFIG_INIT
-if [ "$CONFIG_INIT" = "y" ]; then
-    bool '  Support reading an inittab file?'                              CONFIG_FEATURE_USE_INITTAB
-    bool '  Support running init from within an initrd?'                   CONFIG_FEATURE_INITRD
-    bool '  Support dumping core for child processes (debugging only)?'            CONFIG_FEATURE_INIT_COREDUMPS
-    bool '  Should init be _extra_ quiet on boot?'                         CONFIG_FEATURE_EXTRA_QUIET
-
-    # Some more apps that are meaningless without BusyBox running as init
-    bool 'halt'                            CONFIG_HALT
-    bool 'poweroff'                CONFIG_POWEROFF
-    bool 'reboot'                  CONFIG_REBOOT
-fi
-
-bool 'start-stop-daemon'           CONFIG_START_STOP_DAEMON
-bool 'mesg'                        CONFIG_MESG
-       
-endmenu
-
diff --git a/loginutils/Config.in b/loginutils/Config.in
new file mode 100644 (file)
index 0000000..15727d2
--- /dev/null
@@ -0,0 +1,97 @@
+#
+# For a description of the syntax of this configuration file,
+# see scripts/kbuild/config-language.txt.
+#
+
+menu "Login/Password Management Utilities"
+
+config CONFIG_USE_BB_PWD_GRP
+       bool "Use internal password and group functions rather than system functions"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_ADDGROUP
+       bool "addgroup"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_DELGROUP
+       bool "delgroup"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_ADDUSER
+       bool "adduser"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_DELUSER
+       bool "deluser"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_GETTY
+       bool "getty"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_LOGIN
+       bool "login"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_SECURETTY
+       bool "  Support for /etc/securetty"
+       default y
+       depends on CONFIG_LOGIN
+       help
+         Please submit a patch to add help text for this item.
+
+
+config CONFIG_PASSWD
+       bool "passwd"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_SU
+       bool "su"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_SHADOWPASSWDS
+       bool "Support for shadow passwords"
+       default y
+       depends on CONFIG_ADDUSER || CONFIG_DELUSER || CONFIG_LOGIN || CONFIG_SU
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_USE_BB_SHADOW
+       bool "  Use busybox shadow password functions"
+       default n
+       depends on CONFIG_USE_BB_PWD_GRP && CONFIG_FEATURE_SHADOWPASSWDS
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_SULOGIN
+       bool "sulogin"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_VLOCK
+       bool "vlock"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+endmenu
+
diff --git a/loginutils/config.in b/loginutils/config.in
deleted file mode 100644 (file)
index 6280ff2..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-#
-# For a description of the syntax of this configuration file,
-# see scripts/kbuild/config-language.txt.
-#
-
-mainmenu_option next_comment
-comment 'Login/Password Management Utilities'
-
-
-bool 'Use internal password and group functions instead of the system functions'       CONFIG_USE_BB_PWD_GRP
-bool 'addgroup'                        CONFIG_ADDGROUP
-bool 'delgroup'                        CONFIG_DELGROUP
-bool 'adduser'                 CONFIG_ADDUSER
-bool 'deluser'                 CONFIG_DELUSER
-bool 'getty'                   CONFIG_GETTY
-bool 'login'                   CONFIG_LOGIN
-if [ "$CONFIG_LOGIN" = "y" ]; then
-       bool '  Support for /etc/securetty'             CONFIG_FEATURE_SECURETTY
-fi
-bool 'passwd'                  CONFIG_PASSWD
-bool 'su'                      CONFIG_SU
-if [ "$CONFIG_ADDUSER" = "y" -o "$CONFIG_DELUSER" = "y" -o "$CONFIG_LOGIN" = "y" -o "$CONFIG_SU" = "y" ]; then
-    bool '  Support for shadow passwords'              CONFIG_FEATURE_SHADOWPASSWDS
-    if [ "$CONFIG_USE_BB_PWD_GRP" = "y" -a  "$CONFIG_FEATURE_SHADOWPASSWDS" = "y" ]; then
-       bool '  Use busybox shadow password functions'                  CONFIG_USE_BB_SHADOW
-    fi
-fi
-bool 'sulogin'                 CONFIG_SULOGIN
-bool 'vlock'                   CONFIG_VLOCK
-
-endmenu
-
diff --git a/miscutils/Config.in b/miscutils/Config.in
new file mode 100644 (file)
index 0000000..23de1dd
--- /dev/null
@@ -0,0 +1,75 @@
+#
+# For a description of the syntax of this configuration file,
+# see scripts/kbuild/config-language.txt.
+#
+
+menu "Miscellaneous Utilities"
+
+config CONFIG_ADJTIMEX
+       bool "adjtimex"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_CROND
+       bool "crond"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_CRONTAB
+       bool "crontab"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_DC
+       bool "dc"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_DUTMP
+       bool "dutmp"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_MAKEDEVS
+       bool "makedevs"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_MT
+       bool "mt"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_STRINGS
+       bool "strings"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_TIME
+       bool "time"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_UPDATE
+       bool "update"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_WATCHDOG
+       bool "watchdog"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+endmenu
+
diff --git a/miscutils/config.in b/miscutils/config.in
deleted file mode 100644 (file)
index 063e02b..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-#
-# For a description of the syntax of this configuration file,
-# see scripts/kbuild/config-language.txt.
-#
-
-mainmenu_option next_comment
-comment 'Miscellaneous Utilities'
-
-bool 'adjtimex'            CONFIG_ADJTIMEX
-bool 'crond'        CONFIG_CROND
-bool 'crontab'      CONFIG_CRONTAB
-bool 'dc'          CONFIG_DC
-bool 'dutmp'       CONFIG_DUTMP
-bool 'makedevs'            CONFIG_MAKEDEVS
-bool 'mt'          CONFIG_MT
-bool 'strings'     CONFIG_STRINGS
-bool 'time'        CONFIG_TIME
-bool 'update'      CONFIG_UPDATE
-bool 'watchdog'            CONFIG_WATCHDOG
-
-endmenu
-
diff --git a/modutils/Config.in b/modutils/Config.in
new file mode 100644 (file)
index 0000000..9af0ad6
--- /dev/null
@@ -0,0 +1,84 @@
+#
+# For a description of the syntax of this configuration file,
+# see scripts/kbuild/config-language.txt.
+#
+
+menu "Module Utilities"
+
+config CONFIG_INSMOD
+       bool "insmod"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_OLD_MODULE_INTERFACE
+       bool "  Support older (pre 2.1) Linux kernels"
+       default n
+       depends on CONFIG_INSMOD
+       help
+         Please submit a patch to add help text for this item.
+
+if CONFIG_INSMOD && !CONFIG_FEATURE_OLD_MODULE_INTERFACE
+    config CONFIG_FEATURE_NEW_MODULE_INTERFACE
+           default y
+    comment "  Support new (post 2.1) Linux kernels (Forced enabled)"
+endif
+
+if CONFIG_FEATURE_OLD_MODULE_INTERFACE
+config CONFIG_FEATURE_NEW_MODULE_INTERFACE
+       bool "  Support new (post 2.1) Linux kernels"
+       default y
+       depends on CONFIG_INSMOD
+       help
+         Please submit a patch to add help text for this item.
+endif
+
+config CONFIG_FEATURE_INSMOD_VERSION_CHECKING
+       bool "  Module version checking"
+       default n
+       depends on CONFIG_INSMOD
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_INSMOD_LOADINKMEM
+       bool "  In kernel memory optimization (uClinux only)"
+       default n
+       depends on CONFIG_INSMOD
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_LSMOD
+       bool "lsmod"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_QUERY_MODULE_INTERFACE
+       bool "  Support lsmod query_module interface (add 638 bytes)"
+       default y
+       depends on CONFIG_LSMOD && CONFIG_FEATURE_NEW_MODULE_INTERFACE
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_MODPROBE
+       bool "modprobe"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_RMMOD
+       bool "rmmod"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_CHECK_TAINTED_MODULE
+       bool "Support tainted module checking with new kernels"
+       default y
+       depends on CONFIG_INSMOD || CONFIG_LSMOD
+       help
+         Please submit a patch to add help text for this item.
+
+
+endmenu
+
diff --git a/modutils/config.in b/modutils/config.in
deleted file mode 100644 (file)
index 10b0a9c..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-#
-# For a description of the syntax of this configuration file,
-# see scripts/kbuild/config-language.txt.
-#
-
-mainmenu_option next_comment
-comment 'Module Utilities'
-
-
-bool 'insmod'      CONFIG_INSMOD
-bool 'lsmod'       CONFIG_LSMOD
-bool 'modprobe'            CONFIG_MODPROBE
-bool 'rmmod'       CONFIG_RMMOD
-
-if [ "$CONFIG_INSMOD" = "y" ]; then
-    comment 'Module support options'
-    bool 'Support for older (pre 2.1) Linux kernels'           CONFIG_FEATURE_OLD_MODULE_INTERFACE
-    if [ "$CONFIG_FEATURE_OLD_MODULE_INTERFACE" = "n" ] ; then
-           define_bool CONFIG_FEATURE_NEW_MODULE_INTERFACE     y
-    fi
-    bool 'Support for new (post 2.1) kernels'                  CONFIG_FEATURE_NEW_MODULE_INTERFACE
-    bool 'Support module version checking'                     CONFIG_FEATURE_INSMOD_VERSION_CHECKING
-    bool 'Support image in kernel memory optimization (uClinux only)'          CONFIG_FEATURE_INSMOD_LOADINKMEM
-fi
-
-if [ "$CONFIG_LSMOD" = "y" ]; then
-       if [ "$CONFIG_FEATURE_NEW_MODULE_INTERFACE" = "y" ]; then
-               bool 'Support lsmod query_module interface (add 638 bytes)'     CONFIG_FEATURE_QUERY_MODULE_INTERFACE
-       fi
-fi
-
-if [ "$CONFIG_INSMOD" = "y" -o "$CONFIG_LSMOD" = "y" ]; then
-       bool 'Support tainted module checking with new kernels'  CONFIG_FEATURE_CHECK_TAINTED_MODULE
-fi
-
-endmenu
-
diff --git a/networking/Config.in b/networking/Config.in
new file mode 100644 (file)
index 0000000..0ff3f52
--- /dev/null
@@ -0,0 +1,332 @@
+#
+# For a description of the syntax of this configuration file,
+# see scripts/kbuild/config-language.txt.
+#
+
+menu "Networking Utilities"
+
+config CONFIG_FEATURE_IPV6
+       bool "Enable IPv6 support"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_HOSTNAME
+       bool "hostname"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_IFCONFIG
+       bool "ifconfig"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_IFCONFIG_STATUS
+       bool "  Enable status reporting output (+7k)"
+       default y
+       depends on CONFIG_IFCONFIG
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_IFCONFIG_SLIP
+       bool "  Enable slip-specific options \"keepalive\" and \"outfill\""
+       default n
+       depends on CONFIG_IFCONFIG
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ
+       bool "  Enable options \"mem_start\", \"io_addr\", and \"irq\""
+       default n
+       depends on CONFIG_IFCONFIG
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_IFCONFIG_HW
+       bool "  Enable option \"hw\" (ether only)"
+       default y
+       depends on CONFIG_IFCONFIG
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS
+       bool "  Set the broadcast automatically"
+       default n
+       depends on CONFIG_IFCONFIG
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_IFUPDOWN
+       bool "ifupdown"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_IFUPDOWN_IPV4
+       bool "  Enable support for IPv4"
+       default y
+       depends on CONFIG_IFUPDOWN
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_IFUPDOWN_IPV6
+       bool "  Enable support for IPv6 (requires ip command)"
+       default n
+       depends on CONFIG_IFUPDOWN
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_IFUPDOWN_IPX
+       bool "  Enable support for IPX (requires ipx_interface command)"
+       default n
+       depends on CONFIG_IFUPDOWN
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_IP
+       bool "ip"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+if CONFIG_IP && CONFIG_IPADDR
+       config CONFIG_FEATURE_IP_ADDRESS
+               default y
+       comment "  address (forced enabled for ipaddr)"
+endif
+if ! (CONFIG_IP && CONFIG_IPADDR)
+       config CONFIG_FEATURE_IP_ADDRESS
+               bool "  address"
+               default n
+               depends on CONFIG_IP
+               help
+                 Please submit a patch to add help text for this item.
+endif
+
+if CONFIG_IP && CONFIG_IPLINK
+       config CONFIG_FEATURE_IP_LINK
+               default y
+       comment "  link (forced enabled for iplink)"
+endif
+if !(CONFIG_IP && CONFIG_IPLINK)
+       config CONFIG_FEATURE_IP_LINK
+               bool "  link"
+               default y
+               depends on CONFIG_IP
+               help
+                 Please submit a patch to add help text for this item.
+endif
+
+if CONFIG_IP && CONFIG_IPROUTE
+       config CONFIG_FEATURE_IP_ROUTE
+               default y
+       comment "  route (forced enabled for iproute)"
+endif
+if !(CONFIG_IP && CONFIG_IPROUTE)
+       config CONFIG_FEATURE_IP_ROUTE
+               bool "  route"
+               default y
+               depends on CONFIG_IP
+               help
+                 Please submit a patch to add help text for this item.
+endif
+
+if CONFIG_IP && CONFIG_IPTUNNEL
+       config CONFIG_FEATURE_IP_TUNNEL
+               default y
+       comment "  tunnel (forced enabled for iptunnel)"
+endif
+if !(CONFIG_IP && CONFIG_IPTUNNEL)
+       config CONFIG_FEATURE_IP_TUNNEL
+               bool "  tunnel"
+               default y
+               depends on CONFIG_IP
+               help
+                 Please submit a patch to add help text for this item.
+endif
+
+config CONFIG_IPCALC
+       bool "ipcalc"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_IPCALC_FANCY
+       bool "  Fancy IPCALC, more options, adds 300 bytes"
+       default y
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_IPADDR
+       bool "ipaddr"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_IPLINK
+       bool "iplink"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_IPROUTE
+       bool "iproute"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_IPTUNNEL
+       bool "iptunnel"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_NC
+       bool "nc"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_NETSTAT
+       bool "netstat"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_NSLOOKUP
+       bool "nslookup"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_PING
+       bool "ping"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_FANCY_PING
+       bool "  Enable fancy ping output"
+       default y
+       depends on CONFIG_PING
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_PING6
+       bool "ping6"
+       default n
+       depends on CONFIG_FEATURE_IPV6
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_FANCY_PING6
+       bool "  Enable fancy ping6 output"
+       default y
+       depends on CONFIG_PING6
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_ROUTE
+       bool "route"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_TELNET
+       bool "telnet"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_TELNET_TTYPE
+       bool "  Pass TERM type to remote host"
+       default y
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_TELNETD
+       bool "telnetd"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_TFTP
+       bool "tftp"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_TFTP_GET
+       bool "  Enable \"get\" command"
+       default y
+       depends on CONFIG_TFTP
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_TFTP_PUT
+       bool "  Enable \"put\" command"
+       default y
+       depends on CONFIG_TFTP
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_TFTP_BLOCKSIZE
+       bool "  Enable \"blocksize\" command"
+       default n
+       depends on CONFIG_TFTP
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_TFTP_DEBUG
+       bool "  Enable debug"
+       default y
+       depends on CONFIG_TFTP
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_TRACEROUTE
+       bool "traceroute"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_TRACEROUTE_VERBOSE
+       bool "  Enable verbose output"
+       default y
+       depends on CONFIG_TRACEROUTE
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_TRACEROUTE_SO_DEBUG
+       bool "  Enable SO_DEBUG option"
+       default y
+       depends on CONFIG_TRACEROUTE
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_WGET
+       bool "wget"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_WGET_STATUSBAR
+       bool "  Enable a nifty process meter (+2k)"
+       default y
+       depends on CONFIG_WGET
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_WGET_AUTHENTICATION
+       bool "  Enable HTTP authentication"
+       default y
+       depends on CONFIG_WGET
+       help
+         Please submit a patch to add help text for this item.
+
+source networking/udhcp/Config.in
+
+endmenu
+
diff --git a/networking/config.in b/networking/config.in
deleted file mode 100644 (file)
index de5b920..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-#
-# For a description of the syntax of this configuration file,
-# see scripts/kbuild/config-language.txt.
-#
-
-mainmenu_option next_comment
-comment 'Networking Utilities'
-
-bool 'Enable IPv6 support'                                             CONFIG_FEATURE_IPV6
-bool 'hostname'            CONFIG_HOSTNAME
-bool 'ifconfig'            CONFIG_IFCONFIG
-if [ "$CONFIG_IFCONFIG" = "y" ]; then
-    bool '  Enable status reporting output (+7k)'                                      CONFIG_FEATURE_IFCONFIG_STATUS  
-    bool '  Enable slip-specific options "keepalive" and "outfill"'    CONFIG_FEATURE_IFCONFIG_SLIP
-    bool '  Enable options "mem_start", "io_addr", and "irq"'          CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ
-    bool '  Enable option "hw" (ether only)'                                           CONFIG_FEATURE_IFCONFIG_HW 
-    bool '  Set the broadcast automatically'                                   CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS
-fi
-bool 'ifupdown'            CONFIG_IFUPDOWN
-if [ "$CONFIG_IFUPDOWN" = "y" ]; then
-    bool '  Enable support for IPv4'   CONFIG_FEATURE_IFUPDOWN_IPV4
-    bool '  Enable support for IPv6 (requires ip command)' CONFIG_FEATURE_IFUPDOWN_IPV6
-    bool '  Enable support for IPX (requires ipx_interface command)' CONFIG_FEATURE_IFUPDOWN_IPX
-fi
-bool 'ip'          CONFIG_IP
-if [ "$CONFIG_IP" = "y" ]; then
-    bool '  address'           CONFIG_FEATURE_IP_ADDRESS
-    bool '  link'              CONFIG_FEATURE_IP_LINK
-    bool '  route'             CONFIG_FEATURE_IP_ROUTE
-    bool '  tunnel'            CONFIG_FEATURE_IP_TUNNEL
-fi
-bool 'ipcalc'      CONFIG_IPCALC
-if [ "$CONFIG_IPCALC" = "y" ]; then
-    bool '  Fancy IPCALC, more options, adds 300 bytes'        CONFIG_FEATURE_IPCALC_FANCY
-fi
-bool 'ipaddr'          CONFIG_IPADDR
-if [ "$CONFIG_IP" = "y" ] && [ "$CONFIG_IPADDR" = "y" ]; then
-       define_bool     CONFIG_FEATURE_IP_ADDRESS       y
-fi
-bool 'iplink'          CONFIG_IPLINK
-if [ "$CONFIG_IP" = "y" ] && [ "$CONFIG_IPLINK" = "y" ]; then
-       define_bool     CONFIG_FEATURE_IP_LINK  y
-fi
-bool 'iproute'         CONFIG_IPROUTE
-if [ "$CONFIG_IP" = "y" ] && [ "$CONFIG_IPROUTE" = "y" ]; then
-       define_bool     CONFIG_FEATURE_IP_ROUTE y
-fi
-bool 'iptunnel'                CONFIG_IPTUNNEL
-if [ "$CONFIG_IP" = "y" ] && [ "$CONFIG_IPTUNNEL" = "y" ]; then
-       define_bool     CONFIG_FEATURE_IP_TUNNEL        y
-fi
-bool 'nc'                      CONFIG_NC
-bool 'netstat'     CONFIG_NETSTAT
-bool 'nslookup'            CONFIG_NSLOOKUP
-bool 'ping'                    CONFIG_PING
-if [ "$CONFIG_PING" = "y" ]; then
-    bool '  Enable fancy ping output'          CONFIG_FEATURE_FANCY_PING
-fi
-if [ "$CONFIG_FEATURE_IPV6" = "y" ]; then
-    bool 'ping6'           CONFIG_PING6
-    if [ "$CONFIG_PING6" = "y" ]; then
-        bool '  Enable fancy ping6 output'             CONFIG_FEATURE_FANCY_PING6
-    fi
-fi
-bool 'route'       CONFIG_ROUTE
-bool 'telnet'      CONFIG_TELNET
-if [ "$CONFIG_TELNET" = "y" ]; then
-    bool '  Pass TERM type to remote host'             CONFIG_FEATURE_TELNET_TTYPE
-fi
-bool 'telnetd'      CONFIG_TELNETD
-bool 'tftp'        CONFIG_TFTP
-if [ "$CONFIG_TFTP" = "y" ]; then
-    bool '  Enable "get" command'                      CONFIG_FEATURE_TFTP_GET
-    bool '  Enable "put" command'                      CONFIG_FEATURE_TFTP_PUT
-    bool '  Enable "blocksize" option'         CONFIG_FEATURE_TFTP_BLOCKSIZE
-    bool '  Enable debug'                                      CONFIG_FEATURE_TFTP_DEBUG
-fi
-bool 'traceroute'   CONFIG_TRACEROUTE
-if [ "$CONFIG_TRACEROUTE" = "y" ]; then
-    bool '  Enable verbose output'                     CONFIG_FEATURE_TRACEROUTE_VERBOSE
-    bool '  Enable SO_DEBUG option'    CONFIG_FEATURE_TRACEROUTE_SO_DEBUG
-fi
-bool 'wget'        CONFIG_WGET
-if [ "$CONFIG_WGET" = "y" ]; then
-    bool '  Enable a nifty process meter (+2k)'        CONFIG_FEATURE_WGET_STATUSBAR
-       bool '  Enable HTTP authentication'                     CONFIG_FEATURE_WGET_AUTHENTICATION
-fi
-
-source networking/udhcp/config.in
-
-endmenu
-
diff --git a/networking/udhcp/Config.in b/networking/udhcp/Config.in
new file mode 100644 (file)
index 0000000..5baaa6a
--- /dev/null
@@ -0,0 +1,42 @@
+#
+# For a description of the syntax of this configuration file,
+# see scripts/kbuild/config-language.txt.
+#
+
+menu "udhcp Server/Client"
+
+config CONFIG_UDHCPD
+       bool "udhcp Server (udhcpd)"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_UDHCPC
+       bool "udhcp Client (udhcpc)"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_DUMPLEASES
+       bool "Lease display utility (dumpleases)"
+       default n
+       depends on CONFIG_UDHCPD
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_UDHCP_SYSLOG
+       bool "  Log udhcp messages to syslog (instead of stdout)"
+       default n
+       depends on CONFIG_UDHCPD || CONFIG_UDHCPC
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_FEATURE_UDHCP_DEBUG
+       bool "  Compile udhcp with noisy debugging messages"
+       default n
+       depends on CONFIG_UDHCPD || CONFIG_UDHCPC
+       help
+         Please submit a patch to add help text for this item.
+
+endmenu
+
index d76715b..0b94d9c 100644 (file)
@@ -44,3 +44,9 @@ libraries-y+=$(UDHCP_DIR)$(UDHCP_AR)
 $(UDHCP_DIR)$(UDHCP_AR): $(patsubst %,$(UDHCP_DIR)%, $(UDHCP-y))
        $(AR) -ro $@ $(patsubst %,$(UDHCP_DIR)%, $(UDHCP-y))
 
+$(UDHCP_DIR)dhcpc.o: $(UDHCP_DIR)dhcpc.c
+       $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -DCOMBINED_BINARY -c $< -o $@
+
+$(UDHCP_DIR)dhcpd.o: $(UDHCP_DIR)dhcpd.c
+       $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -DCOMBINED_BINARY -c $< -o $@
+
diff --git a/networking/udhcp/config.in b/networking/udhcp/config.in
deleted file mode 100644 (file)
index ede632a..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# For a description of the syntax of this configuration file,
-# see scripts/kbuild/config-language.txt.
-#
-
-mainmenu_option next_comment
-comment 'udhcp Server/Client'
-
-bool 'udhcp Server (udhcpd)'                   CONFIG_UDHCPD
-bool 'udhcp Client (udhcpc)'                   CONFIG_UDHCPC
-bool 'Lease display utility (dumpleases)'      CONFIG_DUMPLEASES
-if [ "$CONFIG_UDHCPD" = "y" -o "$CONFIG_UDHCPC" = "y" ]; then
-    bool '  Log udhcp messages to syslog (instead of stdout)' CONFIG_FEATURE_UDHCP_SYSLOG
-    bool '  Compile udhcp with noisy debugging messages' CONFIG_FEATURE_UDHCP_DEBUG  
-fi
-
-endmenu
-
diff --git a/procps/Config.in b/procps/Config.in
new file mode 100644 (file)
index 0000000..dc8c2f2
--- /dev/null
@@ -0,0 +1,72 @@
+#
+# For a description of the syntax of this configuration file,
+# see scripts/kbuild/config-language.txt.
+#
+
+menu "Process Utilities"
+
+config CONFIG_FREE
+       bool "free"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+if CONFIG_KILLALL
+       config CONFIG_KILL
+               default y
+       comment "kill (forced enabled for killall)"
+endif
+if !CONFIG_KILLALL
+       config CONFIG_KILL
+               bool "kill"
+               default n
+               help
+                 Please submit a patch to add help text for this item.
+endif
+
+config CONFIG_KILLALL
+       bool "killall"
+       default n
+       depends on CONFIG_KILL
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_PIDOF
+       bool "pidof"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_PS
+       bool "ps"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_RENICE
+       bool "renice"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_TOP
+       bool "top"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+config FEATURE_CPU_USAGE_PERCENTAGE
+       bool "  Support show CPU usage percentage (add 2k bytes)"
+       default y
+       depends on CONFIG_TOP
+       help
+         Please submit a patch to add help text for this item.
+
+config CONFIG_UPTIME
+       bool "uptime"
+       default n
+       help
+         Please submit a patch to add help text for this item.
+
+endmenu
+
diff --git a/procps/config.in b/procps/config.in
deleted file mode 100644 (file)
index 966b115..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-#
-# For a description of the syntax of this configuration file,
-# see scripts/kbuild/config-language.txt.
-#
-
-mainmenu_option next_comment
-comment 'Process Utilities'
-
-bool 'free'        CONFIG_FREE
-bool 'kill'        CONFIG_KILL
-bool 'killall'      CONFIG_KILLALL
-if [ "$CONFIG_KILLALL" = "y" -a "$CONFIG_KILL" = "n" ] ; then
-    define_bool CONFIG_KILL    y
-fi
-bool 'pidof'       CONFIG_PIDOF
-bool 'ps'          CONFIG_PS
-if [ "$CONFIG_PS" = "y" ] ; then
-    bool '  Use devps instead of /proc (needs a patched kernel)'       CONFIG_FEATURE_USE_DEVPS_PATCH
-fi
-bool 'renice'      CONFIG_RENICE
-bool 'top'         CONFIG_TOP
-if [ "$CONFIG_TOP" = "y" ] ; then
-    bool '  Support show CPU usage percentage (add 2k bytes)'        FEATURE_CPU_USAGE_PERCENTAGE
-fi
-bool 'uptime'      CONFIG_UPTIME
-endmenu
-
diff --git a/scripts/Configure b/scripts/Configure
deleted file mode 100644 (file)
index 0a73a64..0000000
+++ /dev/null
@@ -1,705 +0,0 @@
-#! /bin/sh
-#
-# This script is used to configure BusyBox.
-#
-# It was inspired by the challenge in the original Configure script
-# to ``do something better'', combined with the actual need to ``do
-# something better'' because the old configure script wasn't flexible
-# enough.
-#
-# Raymond Chen was the original author of Configure.
-# Michael Elizabeth Chastain (mec@shout.net) is the current maintainer.
-#
-# 050793 - use IFS='@' to get around a bug in a pre-version of bash-1.13
-# with an empty IFS.
-#
-# 030995 (storner@osiris.ping.dk) - added support for tri-state answers,
-# for selecting modules to compile.
-#
-# 180995 Bernhard Kaindl (bkaindl@ping.at) - added dummy functions for
-# use with a config.in modified for make menuconfig.
-#
-# 301195 (boldt@math.ucsb.edu) - added help text support
-#
-# 281295 Paul Gortmaker - make tri_state functions collapse to boolean
-# if module support is not enabled.
-#
-# 010296 Aaron Ucko (ucko@vax1.rockhurst.edu) - fix int and hex to accept
-# arbitrary ranges
-#
-# 150296 Dick Streefland (dicks@tasking.nl) - report new configuration
-# items and ask for a value even when doing a "make oldconfig"
-#
-# 200396 Tom Dyas (tdyas@eden.rutgers.edu) - when the module option is
-# chosen for an item, define the macro <option_name>_MODULE
-#
-# 090397 Axel Boldt (boldt@math.ucsb.edu) - avoid ? and + in regular 
-# expressions for GNU expr since version 1.15 and up use \? and \+.
-#
-# 300397 Phil Blundell (pjb27@cam.ac.uk) - added support for min/max 
-# arguments to "int", allow dep_tristate to take a list of dependencies
-# rather than just one.
-#
-# 090398 Axel Boldt (boldt@math.ucsb.edu) - allow for empty lines in help
-# texts.
-#
-# 102598 Michael Chastain (mec@shout.net) - put temporary files in
-# current directory, not in /tmp.
-#
-# 24 January 1999, Michael Elizabeth Chastain, <mec@shout.net>
-# - Improve the exit message (Jeff Ronne).
-#
-# 7 October 2000, Ghozlane Toumi, <gtoumi@messel.emse.fr>
-# added switches for "random" , "all yes" and "all modules"
-#
-
-#
-# Make sure we're really running bash.
-#
-# I would really have preferred to write this script in a language with
-# better string handling, but alas, bash is the only scripting language
-# that I can be reasonable sure everybody has on their linux machine.
-#
-[ -z "$BASH" ] && { echo "Configure requires bash" 1>&2; exit 1; }
-
-# Disable filename globbing once and for all.
-# Enable function cacheing.
-set -f -h
-
-#
-# Dummy functions for use with a config.in modified for menuconf
-#
-function mainmenu_option () {
-       :
-}
-function mainmenu_name () {
-       :
-}
-function endmenu () {
-       :
-}
-
-#
-# returns a random number between 1 and $1
-#
-function rnd () {
-       rnd=$[ $RANDOM  %  $1 + 1 ]
-}
-
-#
-# randomly chose a number in a config list (LIST_CONFIG_NAME)
-# or in a range ( MIN_CONFIG_NAME MAX_CONFIG_NAME )
-# ONLY if there is no forced default (and we are in an "auto" mode)
-# we are limited by the range of values taken by  "$RANDOM"
-#
-#       rndval CONFIG_NAME
-#
-
-function rndval () {
-       [ "$AUTO" != "yes" -o -n "$old" ] && return
-       def_list=$(eval echo "\${LIST_$1}")
-       def_min=$(eval echo "\${MIN_$1}")
-       def_max=$(eval echo "\${MAX_$1}")
-
-       if [ -n "$def_list" ]; then
-         set -- $(echo $def_list | sed 's/,/ /g')
-         rnd $#
-         while [ $rnd -le $# ] ; do
-           def=$1
-           shift
-         done
-         return
-       fi
-       if [ -n "$def_min" -a -n "$def_max" ]; then
-         rnd $[ $def_max - $def_min ]
-         def=$[ $def_min + $rnd ]
-       fi
-}
-
-#
-# help prints the corresponding help text from Configure.help to stdout
-#
-#       help variable
-#
-function help () {
-  if [ -f docs/Configure.help ]
-  then
-     #first escape regexp special characters in the argument:
-     var=$(echo "$1"|sed 's/[][\/.^$*]/\\&/g')
-     #now pick out the right help text:
-     text=$(sed -n "/^$var[    ]*\$/,\${
-                       /^$var[         ]*\$/c\\
-${var}:\\
-
-                       /^#/b
-                       /^[^    ]/q
-                       /<file:\\([^>]*\\)>/s//\\1/g
-                       p
-                   }" docs/Configure.help)
-     if [ -z "$text" ]
-     then
-         echo; echo "  Sorry, no help available for this option yet.";echo
-     else
-         (echo; echo "$text") | ${PAGER:-more}
-     fi
-  else
-     echo;
-     echo "  Can't access the file docs/Configure.help which"
-     echo "  should contain the help texts."
-     echo
-  fi
-}
-
-
-#
-# readln reads a line into $ans.
-#
-#      readln prompt default oldval
-#
-function readln () {
-       if [ "$AUTO" = "yes" ]; then 
-               echo -n "$1"
-               ans=$2
-               echo $ans
-       elif [ "$DEFAULT" = "-d" -a -n "$3" ]; then
-               echo "$1"
-               ans=$2
-       else
-               echo -n "$1"
-               [ -z "$3" ] && echo -n "(NEW) "
-               IFS='@' read ans || exit 1
-               [ -z "$ans" ] && ans=$2
-       fi
-}
-
-#
-# comment does some pretty-printing
-#
-#      comment 'xxx'
-# 
-function comment () {
-       echo "*"; echo "* $1" ; echo "*"
-       (echo "" ; echo "#"; echo "# $1" ; echo "#") >>$CONFIG
-       (echo "" ; echo "/*"; echo " * $1" ; echo " */") >>$CONFIG_H
-}
-
-#
-# define_bool sets the value of a boolean argument
-#
-#      define_bool define value
-#
-function define_bool () {
-       define_tristate $1 $2
-}
-
-function define_tristate () {
-       case "$2" in
-        "y")
-               echo "$1=y" >>$CONFIG
-               echo "#define $1 1" >>$CONFIG_H
-               ;;
-
-        "m")
-               echo "$1=m" >>$CONFIG
-               echo "#undef  $1" >>$CONFIG_H
-               echo "#define $1_MODULE 1" >>$CONFIG_H
-               ;;
-
-        "n")
-               echo "# $1 is not set" >>$CONFIG
-               echo "#undef  $1" >>$CONFIG_H
-               ;;
-       esac
-       eval "$1=$2"
-}
-
-#
-# bool processes a boolean argument
-#
-#      bool question define
-#
-function bool () {
-       old=$(eval echo "\${$2}")
-       def=${old:-'n'}
-       if [ "$AUTO" = "yes" -a -z "$old" ]; then
-         if [ "$RND" = "-r" ]; then
-           rnd 2
-           case $rnd in
-             "1") def="y" ;;
-             "2") def="n" ;;
-           esac
-         else
-           def=$DEF_ANS;
-         fi
-       fi
-       case "$def" in
-        "y" | "m") defprompt="Y/n/?"
-             def="y"
-             ;;
-        "n") defprompt="N/y/?"
-             ;;
-       esac
-       while :; do
-         readln "$1 ($2) [$defprompt] " "$def" "$old"
-         case "$ans" in
-           [yY] | [yY]es ) define_bool "$2" "y"
-                           break;;
-           [nN] | [nN]o )  define_bool "$2" "n"
-                           break;;
-           * )             help "$2"
-                           ;;
-         esac
-       done
-}
-
-#
-# tristate processes a tristate argument
-#
-#      tristate question define
-#
-function tristate () {
-       if [ "$CONFIG_MODULES" != "y" ]; then
-         bool "$1" "$2"
-       else 
-         old=$(eval echo "\${$2}")
-         def=${old:-'n'}
-         if [ "$AUTO" = "yes" -a -z "$old" ]; then
-            if [ "$RND" = "-r" ]; then 
-             rnd 3
-             case $rnd in
-               "1") def="y" ;;
-               "2") def="n" ;;
-               "3") def="m" ;;
-             esac
-           else
-             def=$DEF_ANS
-           fi
-         fi
-         case "$def" in
-          "y") defprompt="Y/m/n/?"
-               ;;
-          "m") defprompt="M/n/y/?"
-               ;;
-          "n") defprompt="N/y/m/?"
-               ;;
-         esac
-         while :; do
-           readln "$1 ($2) [$defprompt] " "$def" "$old"
-           case "$ans" in
-             [yY] | [yY]es ) define_tristate "$2" "y"
-                             break ;;
-             [nN] | [nN]o )  define_tristate "$2" "n"
-                             break ;;
-             [mM] )          define_tristate "$2" "m"
-                             break ;;
-             * )             help "$2"
-                             ;;
-           esac
-         done
-       fi
-}
-
-#
-# dep_tristate processes a tristate argument that depends upon
-# another option or options.  If any of the options we depend upon is a
-# module, then the only allowable options are M or N.  If all are Y, then
-# this is a normal tristate.  This is used in cases where modules
-# are nested, and one module requires the presence of something
-# else in the kernel.
-#
-#      dep_tristate question define default ...
-#
-function dep_tristate () {
-       old=$(eval echo "\${$2}")
-       def=${old:-'n'}
-       ques=$1
-       var=$2
-       need_module=0
-       shift 2
-       while [ $# -gt 0 ]; do
-         case "$1" in
-           n)
-             define_tristate "$var" "n"
-             return
-             ;;
-           m)
-             need_module=1
-             ;;
-         esac
-         shift
-       done
-
-       if [ $need_module = 1 ]; then
-          if [ "$CONFIG_MODULES" = "y" ]; then
-               if [ "$AUTO" = "yes" -a -z "$old" ]; then
-                  if [ "$RND" = "-r" ]; then
-                     rnd 2
-                     case $rnd in
-                       "1") def="m" ;;
-                       "2") def="n" ;;
-                     esac
-                  else
-                     def=$DEF_ANS
-                  fi
-               fi
-               case "$def" in
-                "y" | "m") defprompt="M/n/?"
-                     def="m"
-                     ;;
-                "n") defprompt="N/m/?"
-                     ;;
-               esac
-               while :; do
-                 readln "$ques ($var) [$defprompt] " "$def" "$old"
-                 case "$ans" in
-                     [nN] | [nN]o )  define_tristate "$var" "n"
-                                     break ;;
-                     [mM] )          define_tristate "$var" "m"
-                                     break ;;
-                     [yY] | [yY]es ) echo 
-   echo "  This answer is not allowed, because it is not consistent with"
-   echo "  your other choices."
-   echo "  This driver depends on another one which you chose to compile"
-   echo "  as a module. This means that you can either compile this one"
-   echo "  as a module as well (with M) or leave it out altogether (N)."
-                                     echo
-                                     ;;
-                     * )             help "$var"
-                                     ;;
-                 esac
-               done
-          fi
-       else
-          tristate "$ques" "$var"
-       fi
-}
-
-function dep_bool () {
-       ques=$1
-       var=$2
-       shift 2
-       while [ $# -gt 0 ]; do
-         case "$1" in
-           m | n)
-             define_bool "$var" "n"
-             return
-             ;;
-         esac
-         shift
-       done
-
-       bool "$ques" "$var"
-}
-
-function dep_mbool () {
-       ques=$1
-       var=$2
-       shift 2
-       while [ $# -gt 0 ]; do
-         case "$1" in
-           n)
-             define_bool "$var" "n"
-             return
-             ;;
-         esac
-         shift
-       done
-
-       bool "$ques" "$var"
-}
-
-#
-# define_int sets the value of a integer argument
-#
-#      define_int define value
-#
-function define_int () {
-       echo "$1=$2" >>$CONFIG
-       echo "#define $1 ($2)" >>$CONFIG_H
-       eval "$1=$2"
-}
-
-#
-# int processes an integer argument with optional limits
-#
-#      int question define default [min max]
-#
-function int () {
-       old=$(eval echo "\${$2}")
-       def=${old:-$3}
-       if [ $# -gt 3 ]; then
-         min=$4
-       else
-         min=-10000000    # !!
-       fi
-       if [ $# -gt 4 ]; then
-         max=$5
-       else
-         max=10000000     # !!
-       fi
-       rndval $2
-       while :; do
-         readln "$1 ($2) [$def] " "$def" "$old"
-         if expr \( \( $ans + 0 \) \>= $min \) \& \( $ans \<= $max \) >/dev/null 2>&1 ; then
-            define_int "$2" "$ans"
-           break
-          else
-           help "$2"
-          fi
-       done
-}
-
-#
-# define_hex sets the value of a hexadecimal argument
-#
-#      define_hex define value
-#
-function define_hex () {
-       echo "$1=$2" >>$CONFIG
-       echo "#define $1 0x${2#*[x,X]}" >>$CONFIG_H
-       eval "$1=$2"
-}
-
-#
-# hex processes an hexadecimal argument
-#
-#      hex question define default
-#
-function hex () {
-       old=$(eval echo "\${$2}")
-       def=${old:-$3}
-       def=${def#*[x,X]}
-       rndval $2
-       while :; do
-         readln "$1 ($2) [$def] " "$def" "$old"
-         ans=${ans#*[x,X]}
-         if expr "$ans" : '[0-9a-fA-F][0-9a-fA-F]*$' > /dev/null; then
-           define_hex "$2" "$ans"
-           break
-         else
-           help "$2"
-         fi
-       done
-}
-
-#
-# define_string sets the value of a string argument
-#
-#      define_string define value
-#
-function define_string () {
-       echo "$1=\"$2\"" >>$CONFIG
-       echo "#define $1 \"$2\"" >>$CONFIG_H
-       eval "$1=\"$2\""
-}
-
-#
-# string processes a string argument
-#
-#      string question define default
-#
-function string () {
-       old=$(eval echo "\${$2}")
-       def=${old:-$3}
-       while :; do
-          if [ "$old" = "?" ]; then
-             readln "$1 ($2) [$def] " "$def" ""
-          else
-            readln "$1 ($2) [$def] " "$def" "$old"
-          fi
-         if [ "$ans" = "?" ]; then
-           help "$2"
-         else
-           break
-         fi
-       done
-       define_string "$2" "$ans"
-}
-#
-# choice processes a choice list (1-out-of-n)
-#
-#      choice question choice-list default
-#
-# The choice list has a syntax of:
-#      NAME WHITESPACE VALUE { WHITESPACE NAME WHITESPACE VALUE }
-# The user may enter any unique prefix of one of the NAMEs and
-# choice will define VALUE as if it were a boolean option.
-# VALUE must be in all uppercase.  Normally, VALUE is of the
-# form CONFIG_<something>.  Thus, if the user selects <something>,
-# the CPP symbol CONFIG_<something> will be defined and the
-# shell variable CONFIG_<something> will be set to "y".
-#
-function choice () {
-       question="$1"
-       choices="$2"
-       old=
-       def=$3
-
-       # determine default answer:
-       names=""
-       set -- $choices
-       firstvar=$2
-       while [ -n "$2" ]; do
-               if [ -n "$names" ]; then
-                       names="$names, $1"
-               else
-                       names="$1"
-               fi
-               if [ "$(eval echo \"\${$2}\")" = "y" ]; then
-                       old=$1
-                       def=$1
-               fi
-               shift; shift
-       done
-
-       if [ "$RND" = "-r" -a -z "$old" ] ; then 
-         set -- $choices
-         rnd $#
-         while [ $rnd -le $# ] ; do 
-           def=$1
-           shift ; shift
-         done
-       fi
-
-       val=""
-       while [ -z "$val" ]; do
-               ambg=n
-               readln "$question ($names) [$def] " "$def" "$old"
-               ans=$(echo $ans | tr a-z A-Z)
-               set -- $choices
-               while [ -n "$1" ]; do
-                       name=$(echo $1 | tr a-z A-Z)
-                       case "$name" in
-                               "$ans"* | */"$ans"* )
-                                       case "$name" in
-                                               "$ans" | */"$ans"/* | \
-                                               "$ans"/* | */"$ans" )
-                                                       val="$2"
-                                                       break # exact match
-                                               ;;
-                                       esac
-                                       if [ -n "$val" ]; then
-                                               echo;echo \
-               "  Sorry, \"$ans\" is ambiguous; please enter a longer string."
-                                               echo
-                                               val=""
-                                               ambg=y
-                                               break
-                                       else
-                                               val="$2"
-                                       fi;;
-                       esac
-                       shift; shift
-               done
-               if [ "$val" = "" -a "$ambg" = "n" ]; then
-                       help "$firstvar"
-               fi
-       done
-       set -- $choices
-       while [ -n "$2" ]; do
-               if [ "$2" = "$val" ]; then
-                       echo "  defined $val"
-                       define_bool "$2" "y"
-               else
-                       define_bool "$2" "n"
-               fi
-               shift; shift
-       done
-}
-
-CONFIG=.tmpconfig
-CONFIG_H=.tmpconfig.h
-FORCE_DEFAULT=.force_default
-trap "rm -f $CONFIG $CONFIG_H ; exit 1" 1 2
-
-#
-# Make sure we start out with a clean slate.
-#
-echo "#" > $CONFIG
-echo "# Automatically generated make config: don't edit" >> $CONFIG
-echo "#" >> $CONFIG
-
-echo "/*" > $CONFIG_H
-echo " * Automatically generated C config: don't edit" >> $CONFIG_H
-echo " */" >> $CONFIG_H
-echo "#define AUTOCONF_INCLUDED" >> $CONFIG_H
-
-DEFAULT=""
-if [ "$1" = "-d" ] ; then
-       DEFAULT="-d"
-       shift
-fi
-
-RND=""
-DEF_ANS=""
-AUTO=""
-case "$1" in 
-       -r) RND="-r" ; AUTO="yes" ; shift ;;
-       -y) DEF_ANS="y" ; AUTO="yes" ; shift ;;
-       -m) DEF_ANS="m" ; AUTO="yes" ; shift ;;
-       -n) DEF_ANS="n" ; AUTO="yes" ; shift ;;
-esac
-
-CONFIG_IN=./config.in
-if [ "$1" != "" ] ; then
-       CONFIG_IN=$1
-fi
-
-DEFAULTS=sysdeps/$TARGET_OS/defconfig
-if [ -f .config ]; then
-  DEFAULTS=.config
-fi
-
-if [ "$AUTO" != "yes" ]; then
-  if [ -f $DEFAULTS ]; then
-    echo "#"
-    echo "# Using defaults found in" $DEFAULTS
-    echo "#"
-    . $DEFAULTS
-    sed -e 's/# \(CONFIG_[^ ]*\) is not.*/\1=n/' <$DEFAULTS >.config-is-not.$$
-    . .config-is-not.$$
-    rm .config-is-not.$$
-  else
-    echo "#"
-    echo "# No defaults found"
-    echo "#"
-  fi
-else
-  if [ -f $FORCE_DEFAULT ]; then
-    echo "#"
-    echo "# Forcing defaults found in $FORCE_DEFAULT"
-    echo "#"
-    sed -e '
-s/# \(CONFIG_[^ ]*\) is not.*/\1=n/;
-s/# range \(CONFIG_[^ ]*\) \([^ ][^ ]*\) \([^ ][^ ]*\)/MIN_\1=\2; MAX_\1=\3/;
-s/# list \(CONFIG_[^ ]*\) \([^ ][^ ]*\)/LIST_\1=\2/
-' <$FORCE_DEFAULT >.default_val.$$
-    . .default_val.$$
-    rm .default_val.$$
-  else
-    echo "#"
-    echo "# No defaults found"
-    echo "#"
-  fi 
-fi
-
-. $CONFIG_IN
-
-rm -f .config.old
-if [ -f .config ]; then
-       mv .config .config.old
-fi
-mv .tmpconfig .config
-mv .tmpconfig.h include/config.h
-
-echo
-echo "*** End of BusyBox configuration."
-echo "*** Check the top-level Makefile for additional configuration."
-if [ ! -f .hdepend -o "$CONFIG_MODVERSIONS" = "y" ] ; then
-    echo "*** Next, you must run 'make dep'."
-else
-    echo "*** Next, you may run 'make', or 'make install'."
-fi
-echo
-
-exit 0
diff --git a/scripts/Menuconfig b/scripts/Menuconfig
deleted file mode 100644 (file)
index 30d06ee..0000000
+++ /dev/null
@@ -1,1287 +0,0 @@
-#! /bin/sh
-#
-# This script is used to configure BusyBox.
-#
-# It was inspired by a desire to not have to hit <enter> 9 million times
-# or startup the X server just to change a single kernel parameter.  
-#
-# This script attempts to parse the configuration files, which are
-# scattered throughout the kernel source tree, and creates a temporary
-# set of mini scripts which are in turn used to create nested menus and
-# radiolists.
-#
-# It uses a very modified/mutilated version of the "dialog" utility
-# written by Savio Lam (lam836@cs.cuhk.hk). Savio is not responsible
-# for this script or the version of dialog used by this script.
-# Please do not contact him with questions. The official version of 
-# dialog is available at sunsite.unc.edu or a sunsite mirror.
-#
-# Portions of this script were borrowed from the original Configure
-# script.
-#
-# William Roadcap was the original author of Menuconfig.
-# Michael Elizabeth Chastain (mec@shout.net) is the current maintainer.
-#
-# 070497 Bernhard Kaindl (bkaindl@netway.at) - get default values for
-# new bool, tristate and dep_tristate parameters from the defconfig file.
-# new configuration parameters are marked with '(NEW)' as in make config.
-#
-# 180697 Bernhard Kaindl (bkaindl@netway.at) - added the needed support
-# for string options. They are handled like the int and hex options.
-#
-# 081297 Pavel Machek (pavel@atrey.karlin.mff.cuni.cz) - better error 
-# handling
-#
-# 131197 Michael Chastain (mec@shout.net) - output all lines for a
-# choice list, not just the selected one.  This makes the output
-# the same as Configure output, which is important for smart config
-# dependencies.
-#
-# 101297 Michael Chastain (mec@shout.net) - remove sound driver cruft.
-#
-# 221297 Michael Chastain (mec@shout.net) - make define_bool actually
-# define its arguments so that later tests on them work right.
-#
-# 160198 Michael Chastain (mec@shout.net) - fix bug with 'c' command
-# (complement existing value) when used on virgin uninitialized variables.
-#
-# 090398 Axel Boldt (boldt@math.ucsb.edu) - allow for empty lines in help
-# texts.
-#
-# 12 Dec 1998, Michael Elizabeth Chastain (mec@shout.net)
-# Remove a /tmp security hole in get_def (also makes it faster).
-# Give uninitialized variables canonical values rather than null value.
-# Change a lot of places to call set_x_info uniformly.
-# Take out message about preparing version (old sound driver cruft).
-#
-# 13 Dec 1998, Riley H Williams <rhw@memalpha.cx>
-# When an error occurs, actually display the error message as well as
-# our comments thereon.
-#
-# 31 Dec 1998, Michael Elizabeth Chastain (mec@shout.net)
-# Fix mod_bool to honor $CONFIG_MODULES.
-# Fix dep_tristate to call define_bool when dependency is "n".
-#
-# 02 January 1999, Michael Elizabeth Chastain (mec@shout.net)
-# Blow away lxdialog.scrltmp on entry to activate_menu.  This protects
-# against people who use commands like ' ' to select menus.
-#
-# 24 January 1999, Michael Elizabeth Chastain, <mec@shout.net>
-# - Improve the exit message (Jeff Ronne).
-#
-# 06 July 1999, Andrzej M. Krzysztofowicz, <ankry@mif.pg.gda.pl>
-# - Support for multiple conditions in dep_tristate().
-# - Implemented new functions: define_tristate(), define_int(), define_hex(),
-#   define_string(), dep_bool().
-# 
-# 22 October 2001, Erik Andersen <andersee@debian.org>
-# - Adjusted for busybox (modified hard coded kernel specific paths, 
-#   and everything to do with modules (tristates, modbools, etc).
-
-
-#
-# Change this to TRUE if you prefer all options listed
-# in a single menu rather than the standard menu hierarchy.
-#
-single_menu_mode=
-
-#
-# Make sure we're really running bash.
-#
-[ -z "$BASH" ] && { echo "Menuconfig requires bash" 1>&2; exit 1; }
-
-#
-# Cache function definitions, turn off posix compliance
-#
-set -h +o posix
-
-
-
-# Given a configuration variable, set the global variable $x to its value,
-# and the global variable $info to the string " (NEW)" if this is a new
-# variable.
-#
-# This function looks for: (1) the current value, or (2) the default value
-# from the arch-dependent defconfig file, or (3) a default passed by the caller.
-
-function set_x_info () {
-    eval x=\$$1
-    if [ -z "$x" ]; then
-       eval `sed -n -e 's/# \(.*\) is not set.*/\1=n/' -e "/^$1=/p" sysdeps/$TARGET_OS/defconfig`
-       eval x=\${$1:-"$2"}
-       eval $1=$x
-       eval INFO_$1="' (NEW)'"
-    fi
-    eval info="\$INFO_$1"
-}
-
-#
-# Load the functions used by the config.in files.
-#
-# I do this because these functions must be redefined depending
-# on whether they are being called for interactive use or for
-# saving a configuration to a file.
-#
-# Thank the heavens bash supports nesting function definitions.
-#
-load_functions () {
-
-#
-# Additional comments
-#
-function comment () {
-       comment_ctr=$[ comment_ctr + 1 ]
-       echo -ne "': $comment_ctr' '--- $1' " >>MCmenu
-}
-
-#
-# Define a boolean to a specific value.
-#
-function define_bool () {
-       eval $1=$2
-}
-
-function define_hex () {
-       eval $1=$2
-}
-
-function define_int () {
-       eval $1=$2
-}
-
-function define_string () {
-       eval $1="$2"
-}
-
-#
-# Create a boolean (Yes/No) function for our current menu
-# which calls our local bool function.
-#
-function bool () {
-       set_x_info "$2" "n"
-
-       case $x in
-       y|m)    flag="*" ;;
-       n)      flag=" " ;;
-       esac
-
-       echo -ne "'$2' '[$flag] $1$info' " >>MCmenu
-
-       echo -e "function $2 () { l_bool '$2' \"\$1\" ;}\n" >>MCradiolists
-}
-
-#
-#   Same as above, but now only Y and N are allowed as dependency
-#   (i.e. third and next arguments).
-#
-function dep_bool () {
-       ques="$1"
-       var="$2"
-       dep=y
-       shift 2
-       while [ $# -gt 0 ]; do
-               if [ "$1" = y ]; then
-                       shift
-               else
-                       dep=n
-                       shift $#
-               fi
-       done
-       if [ "$dep" = y ]; then
-           bool "$ques" "$var"
-       else 
-           define_bool "$var" n
-       fi
-}
-
-function dep_mbool () {
-       ques="$1"
-       var="$2"
-       dep=y
-       shift 2
-       while [ $# -gt 0 ]; do
-               if [ "$1" = y -o "$1" = m ]; then
-                       shift
-               else
-                       dep=n
-                       shift $#
-               fi
-       done
-       if [ "$dep" = y ]; then
-           bool "$ques" "$var"
-       else 
-           define_bool "$var" n
-       fi
-}
-
-#
-# Add a menu item which will call our local int function.
-# 
-function int () {
-       set_x_info "$2" "$3"
-
-       echo -ne "'$2' '($x) $1$info' " >>MCmenu
-
-       echo -e "function $2 () { l_int '$1' '$2' '$3' '$x' ;}" >>MCradiolists
-}
-
-#
-# Add a menu item which will call our local hex function.
-# 
-function hex () {
-       set_x_info "$2" "$3"
-       x=${x##*[x,X]}
-
-       echo -ne "'$2' '($x) $1$info' " >>MCmenu
-
-       echo -e "function $2 () { l_hex '$1' '$2' '$3' '$x' ;}" >>MCradiolists
-}
-
-#
-# Add a menu item which will call our local string function.
-# 
-function string () {
-       set_x_info "$2" "$3"
-
-       echo -ne "'$2' '     $1: \"$x\"$info' " >>MCmenu
-
-       echo -e "function $2 () { l_string '$1' '$2' '$3' '$x' ;}" >>MCradiolists
-}
-
-#
-# Add a menu item which will call our local One-of-Many choice list.
-#
-function choice () {
-       #
-       # Need to remember params cause they're gonna get reset.
-       #
-       title=$1
-       choices=$2
-       default=$3
-       current=
-
-       #
-       # Find out if one of the choices is already set.
-       # If it's not then make it the default.
-       #
-       set -- $choices
-       firstchoice=$2
-
-       while [ -n "$2" ]
-       do
-               if eval [ "_\$$2" = "_y" ]
-               then
-                       current=$1
-                       break
-               fi
-               shift ; shift
-       done
-
-       : ${current:=$default}
-
-       echo -ne "'$firstchoice' '($current) $title' " >>MCmenu
-
-       echo -e "
-       function $firstchoice () \
-               { l_choice '$title' \"$choices\" \"$current\" ;}" >>MCradiolists
-}
-
-} # END load_functions()
-
-
-
-
-
-#
-# Extract available help for an option from Configure.help
-# and send it to standard output.
-#
-# Most of this function was borrowed from the original kernel
-# Configure script.
-#
-function extract_help () {
-  if [ -f docs/Configure.help ]
-  then
-     #first escape regexp special characters in the argument:
-     var=$(echo "$1"|sed 's/[][\/.^$*]/\\&/g')
-     #now pick out the right help text:
-     text=$(sed -n "/^$var[    ]*\$/,\${
-                        /^$var[        ]*\$/c\\
-${var}:\\
-
-                        /^#/b
-                        /^[^   ]/q
-                        s/^  //
-                       /<file:\\([^>]*\\)>/s//\\1/g
-                        p
-                   }" docs/Configure.help)
-
-     if [ -z "$text" ]
-     then
-          echo "There is no help available for this option."
-         return 1
-     else
-         echo "$text"
-     fi
-  else
-        echo "There is no help available for this option."
-         return 1
-  fi
-}
-
-#
-# Activate a help dialog.
-#
-function help () {
-       if extract_help $1 >help.out
-       then
-               $DIALOG --backtitle "$backtitle" --title "$2"\
-                       --textbox help.out $ROWS $COLS
-       else
-               $DIALOG --backtitle "$backtitle" \
-                       --textbox help.out $ROWS $COLS
-       fi
-       rm -f help.out
-}
-
-#
-# Show the README file.
-#
-function show_readme () {
-       $DIALOG --backtitle "$backtitle" \
-               --textbox scripts/README.Menuconfig $ROWS $COLS
-}
-
-#
-# Begin building the dialog menu command and Initialize the 
-# Radiolist function file.
-#
-function menu_name () {
-       echo -ne "$DIALOG --title '$1'\
-                       --backtitle '$backtitle' \
-                       --menu '$menu_instructions' \
-                       $ROWS $COLS $((ROWS-10)) \
-                       '$default' " >MCmenu
-       >MCradiolists
-}
-
-#
-# Add a submenu option to the menu currently under construction.
-#
-function submenu () {
-       echo -ne "'activate_menu $2' '$1  --->' " >>MCmenu
-}
-
-#
-# Handle a boolean (Yes/No) option.
-#
-function l_bool () {
-       if [ -n "$2" ]
-       then
-               case "$2" in
-               y|m)    eval $1=y ;;
-               c)      eval x=\$$1
-                       case $x in
-                       y) eval $1=n ;;
-                       n) eval $1=y ;;
-                       *) eval $1=y ;;
-                       esac ;;
-               *)      eval $1=n ;;
-               esac
-       else
-               echo -ne "\007"
-       fi
-}
-
-#
-# Create a dialog for entering an integer into a option.
-#
-function l_int () {
-       while true
-       do
-               if $DIALOG --title "$1" \
-                       --backtitle "$backtitle" \
-                       --inputbox "$inputbox_instructions_int" \
-                       10 75 "$4" 2>MCdialog.out
-               then
-                       answer="`cat MCdialog.out`"
-                       answer="${answer:-$3}"
-
-                       # Semantics of + and ? in GNU expr changed, so
-                       # we avoid them:
-                       if expr "$answer" : '0$' '|' "$answer" : '[1-9][0-9]*$' '|' "$answer" : '-[1-9][0-9]*$' >/dev/null
-                       then
-                               eval $2="$answer"
-                       else
-                               eval $2="$3"
-                               echo -en "\007"
-                               ${DIALOG} --backtitle "$backtitle" \
-                                       --infobox "You have made an invalid entry." 3 43
-                               sleep 2
-                       fi
-
-                       break
-               fi
-
-               help "$2" "$1"
-       done
-}
-
-#
-# Create a dialog for entering a hexadecimal into an option.
-#
-function l_hex () {
-       while true
-       do
-               if $DIALOG --title "$1" \
-                       --backtitle "$backtitle" \
-                       --inputbox "$inputbox_instructions_hex" \
-                       10 75 "$4" 2>MCdialog.out
-               then
-                       answer="`cat MCdialog.out`"
-                       answer="${answer:-$3}"
-                       answer="${answer##*[x,X]}"
-
-                       if expr "$answer" : '[0-9a-fA-F][0-9a-fA-F]*$' >/dev/null
-                       then
-                               eval $2="$answer"
-                       else
-                               eval $2="$3"
-                               echo -en "\007"
-                               ${DIALOG} --backtitle "$backtitle" \
-                                       --infobox "You have made an invalid entry." 3 43
-                               sleep 2
-                       fi
-
-                       break
-               fi
-
-               help "$2" "$1"
-       done
-}
-
-#
-# Create a dialog for entering a string into an option.
-#
-function l_string () {
-       while true
-       do
-               if $DIALOG --title "$1" \
-                       --backtitle "$backtitle" \
-                       --inputbox "$inputbox_instructions_string" \
-                       10 75 "$4" 2>MCdialog.out
-               then
-                       answer="`cat MCdialog.out`"
-                       answer="${answer:-$3}"
-
-                       #
-                       # Someone may add a nice check for the entered
-                       # string here...
-                       #
-                       eval $2=\"$answer\"
-
-                       break
-               fi
-
-               help "$2" "$1"
-       done
-}
-
-
-#
-# Handle a one-of-many choice list.
-#
-function l_choice () {
-       #
-       # Need to remember params cause they're gonna get reset.
-       #
-       title="$1"
-       choices="$2"
-       current="$3"
-        chosen=
-
-       #
-       # Scan current value of choices and set radiolist switches.
-       #
-       list=
-       set -- $choices
-       firstchoice=$2
-       while [ -n "$2" ]
-       do
-               case "$1" in
-               "$current"*)    if [ -z "$chosen" ]; then
-                                       list="$list $2 $1 ON "
-                                       chosen=1
-                               else
-                                       list="$list $2 $1 OFF "
-                               fi  ;;
-               *)              list="$list $2 $1 OFF " ;;
-               esac
-                       
-               shift ; shift
-       done
-
-       while true
-       do
-               if $DIALOG --title "$title" \
-                       --backtitle "$backtitle" \
-                       --radiolist "$radiolist_instructions" \
-                       15 70 6 $list 2>MCdialog.out
-               then
-                       choice=`cat MCdialog.out`
-                       break
-               fi
-
-               help "$firstchoice" "$title"
-       done
-
-       #
-       # Now set the boolean value of each option based on
-       # the selection made from the radiolist.
-       #
-       set -- $choices
-       while [ -n "$2" ]
-       do
-               if [ "$2" = "$choice" ]
-               then
-                       eval $2="y"
-               else
-                       eval $2="n"
-               fi
-               
-               shift ; shift
-       done
-}
-
-#
-# Call awk, and watch for error codes, etc.
-#
-function callawk () {
-awk "$1" || echo "Awk died with error code $?. Giving up." || exit 1
-}
-
-#
-# A faster awk based recursive parser. (I hope)
-#
-function parser1 () {
-callawk '
-BEGIN {
-       menu_no = 0
-       comment_is_option = 0
-       parser("'$CONFIG_IN'","MCmenu0")
-}
-
-function parser(ifile,menu) {
-
-       while (getline <ifile) {
-               if ($1 == "mainmenu_option") {
-                       comment_is_option = "1"
-               }
-               else if ($1 == "comment" && comment_is_option == "1") {
-                       comment_is_option= "0"
-                       sub($1,"",$0)
-                       ++menu_no
-
-                       printf("submenu %s MCmenu%s\n", $0, menu_no) >>menu
-
-                       newmenu = sprintf("MCmenu%d", menu_no);
-                       printf( "function MCmenu%s () {\n"\
-                               "default=$1\n"\
-                               "menu_name %s\n",\
-                                menu_no, $0) >newmenu
-
-                       parser(ifile, newmenu)
-               }
-               else if ($0 ~ /^#|\$MAKE|mainmenu_name/) {
-                       printf("") >>menu
-               }
-               else if ($1 ~ "endmenu") {
-                       printf("}\n") >>menu
-                       return
-               } 
-               else if ($1 == "source") {
-                       parser($2,menu)
-               }
-               else {
-                       print >>menu
-               }
-       }
-}'
-}
-
-#
-# Secondary parser for single menu mode.
-#
-function parser2 () {
-callawk '
-BEGIN {
-       parser("'$CONFIG_IN'","MCmenu0")
-}
-
-function parser(ifile,menu) {
-
-       while (getline <ifile) {
-               if ($0 ~ /^#|$MAKE|mainmenu_name/) {
-                       printf("") >>menu
-               }
-               else if ($1 ~ /mainmenu_option|endmenu/) {
-                       printf("") >>menu
-               } 
-               else if ($1 == "source") {
-                       parser($2,menu)
-               }
-               else {
-                       print >>menu
-               }
-       }
-}'
-}
-
-#
-# Parse all the config.in files into mini scripts.
-#
-function parse_config_files () {
-       rm -f MCmenu*
-
-       echo "function MCmenu0 () {" >MCmenu0
-       echo 'default=$1' >>MCmenu0
-       echo "menu_name 'Main Menu'" >>MCmenu0
-
-       if [ "_$single_menu_mode" = "_TRUE" ]
-       then
-               parser2
-       else
-               parser1
-       fi
-
-       echo "comment ''"       >>MCmenu0
-       echo "g_alt_config"     >>MCmenu0
-       echo "s_alt_config"     >>MCmenu0
-
-       echo "}" >>MCmenu0
-
-       #
-       # These mini scripts must be sourced into the current
-       # environment in order for all of this to work.  Leaving
-       # them on the disk as executables screws up the recursion
-       # in activate_menu(), among other things.  Once they are
-       # sourced we can discard them.
-       #
-       for i in MCmenu*
-       do
-               echo -n "."
-               source ./$i
-       done
-       rm -f MCmenu*
-}
-
-#
-# This is the menu tree's bootstrap.
-#
-# Executes the parsed menus on demand and creates a set of functions,
-# one per configuration option.  These functions will in turn execute
-# dialog commands or recursively call other menus.
-#
-function activate_menu () {
-       rm -f lxdialog.scrltmp
-       while true
-       do
-               comment_ctr=0           #So comment lines get unique tags
-
-               $1 "$default" 2> MCerror #Create the lxdialog menu & functions
-
-               if [ "$?" != "0" ]
-               then
-                       clear
-                       cat <<EOM
-
-Menuconfig has encountered a possible error in one of BusyBox's
-configuration files and is unable to continue.  Here is the error
-report:
-
-EOM
-                       sed 's/^/ Q> /' MCerror
-                       cat <<EOM
-
-Please report this to the maintainer <mec@shout.net>.  You may also
-send a problem report to <busybox@busybox.net>.
-
-Please indicate the BusyBox version you are trying to configure and
-which menu you were trying to enter when this error occurred.
-
-EOM
-                       cleanup
-                       exit 1
-               fi
-               rm -f MCerror
-
-               . ./MCradiolists                #Source the menu's functions
-
-               . ./MCmenu 2>MCdialog.out       #Activate the lxdialog menu
-               ret=$?
-
-               read selection <MCdialog.out
-
-               case "$ret" in
-               0|3|4|5|6)
-                       defaults="$selection\12$defaults"  #pseudo stack
-                       case "$ret" in
-                       0) eval $selection   ;;
-                       3) eval $selection y ;;
-                       4) eval $selection n ;;
-                       5) eval $selection m ;;
-                       6) eval $selection c ;;
-                       esac
-                       default="${defaults%%\12*}" defaults="${defaults#*\12}"
-                       ;;
-               2)      
-                       default="${selection%%\ *}"
-
-                       case "$selection" in
-                       *"-->"*|*"alt_config"*)
-                               show_readme ;;
-                       *)
-                               eval help $selection ;;
-                       esac
-                       ;;
-               255|1)
-                       break
-                       ;;
-               139)
-                       stty sane
-                       clear
-                       cat <<EOM
-
-There seems to be a problem with the lxdialog companion utility which is
-built prior to running Menuconfig.  Usually this is an indicator that you
-have upgraded/downgraded your ncurses libraries and did not remove the 
-old ncurses header file(s) in /usr/include or /usr/include/ncurses.
-
-It is VERY important that you have only one set of ncurses header files
-and that those files are properly version matched to the ncurses libraries 
-installed on your machine.
-
-You may also need to rebuild lxdialog.  This can be done by moving to
-the /usr/src/linux/scripts/lxdialog directory and issuing the 
-"make clean all" command.
-
-If you have verified that your ncurses install is correct, you may email
-the maintainer <andersen@codepoet.org> or post a message to
-<busybox@busybox.net> for additional assistance. 
-
-EOM
-                       cleanup
-                       exit 139
-                       ;;
-               esac
-       done
-}
-
-#
-# Create a menu item to load an alternate configuration file.
-#
-g_alt_config () {
-       echo -n "get_alt_config 'Load an Alternate Configuration File' "\
-               >>MCmenu
-}
-
-#
-# Get alternate config file name and load the 
-# configuration from it.
-#
-get_alt_config () {
-       set -f ## Switch file expansion OFF
-
-       while true
-       do
-               ALT_CONFIG="${ALT_CONFIG:-$DEFAULTS}"
-
-               $DIALOG --backtitle "$backtitle" \
-                       --inputbox "\
-Enter the name of the configuration file you wish to load.  \
-Accept the name shown to restore the configuration you \
-last retrieved.  Leave blank to abort."\
-                       11 55 "$ALT_CONFIG" 2>MCdialog.out
-
-               if [ "$?" = "0" ]
-               then
-                       ALT_CONFIG=`cat MCdialog.out`
-
-                       [ "_" = "_$ALT_CONFIG" ] && break
-
-                       if eval [ -r "$ALT_CONFIG" ]
-                       then
-                               eval load_config_file "$ALT_CONFIG"
-                               break
-                       else
-                               echo -ne "\007"
-                               $DIALOG --backtitle "$backtitle" \
-                                       --infobox "File does not exist!"  3 38
-                               sleep 2
-                       fi
-               else
-                       cat <<EOM >help.out
-
-For various reasons, one may wish to keep several different BusyBox
-configurations available on a single machine.  
-
-If you have saved a previous configuration in a file other than the
-busybox default, entering the name of the file here will allow you
-to modify that configuration.
-
-If you are uncertain, then you have probably never used alternate 
-configuration files.  You should therefor leave this blank to abort.
-
-EOM
-                       $DIALOG --backtitle "$backtitle"\
-                               --title "Load Alternate Configuration"\
-                               --textbox help.out $ROWS $COLS
-               fi
-       done
-
-       set +f ## Switch file expansion ON
-       rm -f help.out MCdialog.out
-}
-
-#
-# Create a menu item to store an alternate config file.
-#
-s_alt_config () {
-       echo -n "save_alt_config 'Save Configuration to an Alternate File' "\
-                >>MCmenu
-}
-
-#
-# Get an alternate config file name and save the current
-# configuration to it.
-#
-save_alt_config () {
-       set -f  ## Switch file expansion OFF
-                       
-       while true
-       do
-               $DIALOG --backtitle "$backtitle" \
-                       --inputbox "\
-Enter a filename to which this configuration should be saved \
-as an alternate.  Leave blank to abort."\
-                       10 55 "$ALT_CONFIG" 2>MCdialog.out
-
-               if [ "$?" = "0" ]
-               then
-                       ALT_CONFIG=`cat MCdialog.out`
-
-                       [ "_" = "_$ALT_CONFIG" ] && break
-
-                       if eval touch $ALT_CONFIG 2>/dev/null
-                       then
-                               eval save_configuration $ALT_CONFIG
-                               load_functions  ## RELOAD
-                               break
-                       else
-                               echo -ne "\007"
-                               $DIALOG --backtitle "$backtitle" \
-                                       --infobox "Can't create file!  Probably a nonexistent directory." 3 60
-                               sleep 2
-                       fi
-               else
-                       cat <<EOM >help.out
-
-For various reasons, one may wish to keep different BusyBox
-configurations available on a single machine.  
-
-Entering a file name here will allow you to later retrieve, modify
-and use the current configuration as an alternate to whatever 
-configuration options you have selected at that time.
-
-If you are uncertain what all this means then you should probably
-leave this blank.
-EOM
-                       $DIALOG --backtitle "$backtitle"\
-                               --title "Save Alternate Configuration"\
-                               --textbox help.out $ROWS $COLS
-               fi
-       done
-
-       set +f  ## Switch file expansion ON
-       rm -f help.out MCdialog.out
-}
-
-#
-# Load config options from a file.
-# Converts all "# OPTION is not set" lines to "OPTION=n" lines
-#
-function load_config_file () {
-       awk '
-         /# .* is not set.*/ { printf("%s=n\n", $2) }
-       ! /# .* is not set.*/ { print }
-       ' $1 >.tmpconfig
-
-       source ./.tmpconfig
-       rm -f .tmpconfig
-}
-
-#
-# Just what it says.
-#
-save_configuration () {
-        echo
-       echo -n "Saving your BusyBox configuration."
-
-       #
-       # Now, let's redefine the configuration functions for final
-       # output to the config files.
-       #
-       # Nested function definitions, YIPEE!
-       #
-       function bool () {
-               set_x_info "$2" "n"
-               eval define_bool "$2" "$x"
-       }
-
-       function dep_bool () {
-               set_x_info "$2" "n"
-               var="$2"
-               shift 2
-               while [ $# -gt 0 ]; do
-                       if   [ "$1" = y ]; then
-                               shift
-                       else 
-                               x=n; shift $#
-                       fi
-               done
-               define_bool "$var" "$x"
-       }
-
-       function int () {
-               set_x_info "$2" "$3"
-               echo "$2=$x"            >>$CONFIG
-               echo "#define $2 ($x)"  >>$CONFIG_H
-       }
-
-       function hex () {
-               set_x_info "$2" "$3"
-               echo "$2=$x"                     >>$CONFIG
-               echo "#define $2 0x${x##*[x,X]}" >>$CONFIG_H
-       }
-
-       function string () {
-               set_x_info "$2" "$3"
-               echo "$2=\"$x\""                         >>$CONFIG
-               echo "#define $2 \"$x\""        >>$CONFIG_H
-       }
-
-       function define_hex () {
-               eval $1="$2"
-                       echo "$1=$2"                    >>$CONFIG
-               echo "#define $1 0x${2##*[x,X]}"        >>$CONFIG_H
-       }
-
-       function define_int () {
-               eval $1="$2"
-               echo "$1=$2"                    >>$CONFIG
-               echo "#define $1 ($2)"          >>$CONFIG_H
-       }
-
-       function define_string () {
-               eval $1="$2"
-               echo "$1=\"$2\""                >>$CONFIG
-               echo "#define $1 \"$2\""        >>$CONFIG_H
-       }
-
-       function define_bool () {
-               define_tristate "$1" "$2"
-       }
-
-       function define_tristate () {
-               eval $1="$2"
-
-               case "$2" in
-               y)
-                       echo "$1=y"             >>$CONFIG
-                       echo "#define $1 1"     >>$CONFIG_H
-                       ;;
-
-               n)
-                       echo "# $1 is not set"  >>$CONFIG
-                       echo "#undef  $1"       >>$CONFIG_H
-                       ;;
-               esac
-       }
-
-       function choice () {
-               #
-               # Find the first choice that's already set to 'y'
-               #
-               choices="$2"
-               default="$3"
-               current=
-               chosen=
-
-               set -- $choices
-               while [ -n "$2" ]
-               do
-                       if eval [ "_\$$2" = "_y" ]
-                       then
-                               current=$1
-                               break
-                       fi
-                       shift ; shift
-               done
-
-               #
-               # Use the default if none were set.  
-               #
-               : ${current:=$default}
-
-               #
-               # Output all choices (to be compatible with other configs).
-               #
-               set -- $choices
-               while [ -n "$2" ]
-               do
-                       case "$1" in
-                       "$current"*)    if [ -z "$chosen" ]; then
-                                               define_bool "$2" "y"
-                                               chosen=1
-                                       else
-                                               define_bool "$2" "n"
-                                       fi ;;
-                       *)              define_bool "$2" "n" ;;
-                       esac
-                       shift ; shift
-               done
-       }
-
-       function mainmenu_name () {
-               :
-       }
-
-       function mainmenu_option () {
-               comment_is_option=TRUE
-       }
-
-       function endmenu () {
-               :
-       }
-
-       function comment () {
-               if [ "$comment_is_option" ]
-               then
-                       comment_is_option=
-                       echo        >>$CONFIG
-                       echo "#"    >>$CONFIG
-                       echo "# $1" >>$CONFIG
-                       echo "#"    >>$CONFIG
-
-                       echo         >>$CONFIG_H
-                       echo "/*"    >>$CONFIG_H
-                       echo " * $1" >>$CONFIG_H
-                       echo " */"   >>$CONFIG_H
-               fi
-       }
-
-       echo -n "."
-
-       DEF_CONFIG="${1:-.config}"
-       DEF_CONFIG_H="include/config.h"
-
-       CONFIG=.tmpconfig
-       CONFIG_H=.tmpconfig.h
-
-       echo "#" >$CONFIG
-       echo "# Automatically generated by make menuconfig: don't edit" >>$CONFIG
-       echo "#" >>$CONFIG
-
-       echo "/*" >$CONFIG_H
-       echo " * Automatically generated by make menuconfig: don't edit" >>$CONFIG_H
-       echo " */" >>$CONFIG_H
-       echo "#define AUTOCONF_INCLUDED" >> $CONFIG_H
-
-       echo -n "."
-       if . $CONFIG_IN >>.menuconfig.log 2>&1
-       then
-               if [ "$DEF_CONFIG" = ".config" ]
-               then
-                       mv $CONFIG_H $DEF_CONFIG_H
-               fi
-
-               if [ -f "$DEF_CONFIG" ]
-               then
-                       rm -f ${DEF_CONFIG}.old
-                       mv $DEF_CONFIG ${DEF_CONFIG}.old
-               fi
-
-               mv $CONFIG $DEF_CONFIG
-                       
-               return 0
-       else
-               return 1
-       fi
-}
-
-#
-# Remove temporary files
-#
-cleanup () {
-       cleanup1
-       cleanup2
-}
-
-cleanup1 () {
-       rm -f MCmenu* MCradiolists MCdialog.out help.out
-}
-
-cleanup2 () {
-       rm -f .tmpconfig .tmpconfig.h
-}
-
-set_geometry () {
-       # Some distributions export these with incorrect values
-       # which can really screw up some ncurses programs.
-       LINES=  COLUMNS=
-
-       ROWS=${1:-24}  COLS=${2:-80} 
-
-       # Just in case the nasty rlogin bug returns.
-       #
-       [ $ROWS = 0 ] && ROWS=24
-       [ $COLS = 0 ] && COLS=80
-
-       if [ $ROWS -lt 19 -o $COLS -lt 80 ]
-       then
-               echo -e "\n\007Your display is too small to run Menuconfig!"
-               echo "It must be at least 19 lines by 80 columns."
-               exit 1
-       fi 
-
-       ROWS=$((ROWS-4))  COLS=$((COLS-5))
-}
-
-
-set_geometry `stty size 2>/dev/null`
-
-menu_instructions="\
-Enabling options will increase the size of busybox.  \
-Arrow keys navigate the menu.  \
-Pressing <Enter> selects submenus --->.  \
-Highlighted letters are hotkeys.  \
-Pressing <Y> includes, and <N> excludes.  \
-Press <Esc><Esc> to exit, <?> for Help.  \
-Legend: [*] built-in  [ ] excluded"
-
-
-radiolist_instructions="\
-Use the arrow keys to navigate this window or \
-press the hotkey of the item you wish to select \
-followed by the <SPACE BAR>.
-Press <?> for additional information about this option."
-
-inputbox_instructions_int="\
-Please enter a decimal value. \
-Fractions will not be accepted.  \
-Use the <TAB> key to move from the input field to the buttons below it."
-
-inputbox_instructions_hex="\
-Please enter a hexadecimal value. \
-Use the <TAB> key to move from the input field to the buttons below it."
-
-inputbox_instructions_string="\
-Please enter a string value. \
-Use the <TAB> key to move from the input field to the buttons below it."
-
-DIALOG="./scripts/lxdialog/lxdialog"
-
-bb_version="${VERSION}"
-backtitle="BusyBox v$bb_version Configuration"
-
-trap "cleanup ; exit 1" 1 2 15
-
-
-#
-# Locate default files.
-#
-CONFIG_IN=./config.in
-if [ "$1" != "" ] ; then
-       CONFIG_IN=$1
-fi
-
-DEFAULTS=sysdeps/$TARGET_OS/defconfig
-if [ -f .config ]; then
-  DEFAULTS=.config
-fi
-
-if [ -f $DEFAULTS ]
-then
-  echo "Using defaults found in" $DEFAULTS
-  load_config_file $DEFAULTS
-else
-  echo "No defaults found"
-fi
-
-
-# Fresh new log.
->.menuconfig.log
-
-# Load the functions used by the config.in files.
-echo -n "Preparing scripts: functions" 
-load_functions
-
-if [ ! -e $CONFIG_IN ]
-then
-       echo "Your main config.in file ($CONFIG_IN) does not exist"
-       exit 1
-fi
-
-if [ ! -x $DIALOG ]
-then
-       echo "Your lxdialog utility does not exist"
-       exit 1
-fi
-
-#
-# Read config.in files and parse them into one shell function per menu.
-#
-echo -n ", parsing"
-parse_config_files $CONFIG_IN
-
-echo "done."
-#
-# Start the ball rolling from the top.
-#
-activate_menu MCmenu0
-
-#
-# All done!
-#
-cleanup1
-
-#
-# Confirm and Save
-#
-if $DIALOG --backtitle "$backtitle" \
-          --yesno "Do you wish to save your new BusyBox configuration?" 5 60
-then
-       save_configuration
-       echo
-       echo
-       echo "*** End of BusyBox configuration."
-       echo "*** Check the top-level Makefile for additional configuration."
-       if [ ! -f .hdepend ] ; then
-           echo "*** Next, you must run 'make dep'."
-       else
-           echo "*** Next, you should run 'make' or 'make install'."
-       fi
-       echo
-else
-       echo
-       echo 
-       echo Your BusyBox configuration changes were NOT saved.
-       echo
-fi
-
-# Remove log if empty.
-if [ ! -s .menuconfig.log ] ; then
-       rm -f .menuconfig.log
-fi
-
-exit 0
diff --git a/scripts/config/.cvsignore b/scripts/config/.cvsignore
new file mode 100644 (file)
index 0000000..e8bf7a7
--- /dev/null
@@ -0,0 +1,8 @@
+conf
+mconf
+lkc_defs.h
+lex.zconf.c
+zconf.tab.h
+zconf.tab.c
+lex.backup
+zconf.output
diff --git a/scripts/config/Kconfig-language.txt b/scripts/config/Kconfig-language.txt
new file mode 100644 (file)
index 0000000..a3037ff
--- /dev/null
@@ -0,0 +1,255 @@
+Introduction
+------------
+
+The configuration database is collection of configuration options
+organized in a tree structure:
+
+       +- Code maturity level options
+       |  +- Prompt for development and/or incomplete code/drivers
+       +- General setup
+       |  +- Networking support
+       |  +- System V IPC
+       |  +- BSD Process Accounting
+       |  +- Sysctl support
+       +- Loadable module support
+       |  +- Enable loadable module support
+       |     +- Set version information on all module symbols
+       |     +- Kernel module loader
+       +- ...
+
+Every entry has its own dependencies. These dependencies are used
+to determine the visible of an entry. Any child entry is only
+visible if its parent entry is also visible.
+
+Menu entries
+------------
+
+Most entries define a config option, all other entries help to organize
+them. A single configuration option is defined like this:
+
+config MODVERSIONS
+       bool "Set version information on all module symbols"
+       depends MODULES
+       help
+         Usually, modules have to be recompiled whenever you switch to a new
+         kernel.  ...
+
+Every line starts with a key word and can be followed by multiple
+arguments.  "config" starts a new config entry. The following lines
+define attributes for this config option. Attributes can be the type of
+the config option, input prompt, dependencies, help text and default
+values. A config option can be defined multiple times with the same
+name, but every definition can have only a single input prompt and the
+type must not conflict.
+
+Menu attributes
+---------------
+
+A menu entry can have a number of attributes. Not all of them are
+applicable everywhere (see syntax).
+
+- type definition: "bool"/"tristate"/"string"/"hex"/"integer"
+  Every config option must have a type. There are only two basic types:
+  tristate and string, the other types base on these two. The type
+  definition optionally accepts an input prompt, so these two examples
+  are equivalent:
+
+       bool "Networking support"
+  and
+       bool
+       prompt "Networking support"
+
+- input prompt: "prompt" <prompt> ["if" <expr>]
+  Every menu entry can have at most one prompt, which is used to display
+  to the user. Optionally dependencies only for this prompt can be added
+  with "if".
+
+- default value: "default" <symbol> ["if" <expr>]
+  A config option can have any number of default values. If multiple
+  default values are visible, only the first defined one is active.
+  Default values are not limited to the menu entry, where they are
+  defined, this means the default can be defined somewhere else or be
+  overriden by an earlier definition.
+  The default value is only assigned to the config symbol if no other
+  value was set by the user (via the input prompt above). If an input
+  prompt is visible the default value is presented to the user and can
+  be overridden by him.
+  Optionally dependencies only for this default value can be added with
+  "if".
+
+- dependencies: "depends on"/"requires" <expr>
+  This defines a dependency for this menu entry. If multiple
+  dependencies are defined they are connected with '&&'. Dependencies
+  are applied to all other options within this menu entry (which also
+  accept "if" expression), so these two examples are equivalent:
+
+       bool "foo" if BAR
+       default y if BAR
+  and
+       depends on BAR
+       bool "foo"
+       default y
+
+- help text: "help"
+  This defines a help text. The end of the help text is determined by
+  the level indentation, this means it ends at the first line which has
+  a smaller indentation than the first line of the help text.
+
+
+Menu dependencies
+-----------------
+
+Dependencies define the visibility of a menu entry and can also reduce
+the input range of tristate symbols. The tristate logic used in the
+expressions uses one more state than normal boolean logic to express the
+module state. Dependency expressions have the following syntax:
+
+<expr> ::= <symbol>                             (1)
+           <symbol> '=' <symbol>                (2)
+           <symbol> '!=' <symbol>               (3)
+           '(' <expr> ')'                       (4)
+           '!' <expr>                           (5)
+           <expr> '||' <expr>                   (6)
+           <expr> '&&' <expr>                   (7)
+
+Expressions are listed in decreasing order of precedence. 
+
+(1) Convert the symbol into an expression. Boolean and tristate symbols
+    are simply converted into the respective expression values. All
+    other symbol types result in 'n'.
+(2) If the values of both symbols are equal, it returns 'y',
+    otherwise 'n'.
+(3) If the values of both symbols are equal, it returns 'n',
+    otherwise 'y'.
+(4) Returns the value of the expression. Used to override precedence.
+(5) Returns the result of (2-/expr/).
+(6) Returns the result of min(/expr/, /expr/).
+(7) Returns the result of max(/expr/, /expr/).
+
+An expression can have a value of 'n', 'm' or 'y' (or 0, 1, 2
+respectively for calculations). A menu entry becomes visible when it's
+expression evaluates to 'm' or 'y'.
+
+There are two type of symbols: constant and nonconstant symbols.
+Nonconstant symbols are the most common ones and are defined with the
+'config' statement. Nonconstant symbols consist entirely of alphanumeric
+characters or underscores.
+Constant symbols are only part of expressions. Constant symbols are
+always surrounded by single or double quotes. Within the quote any
+other character is allowed and the quotes can be escaped using '\'.
+
+Menu structure
+--------------
+
+The position of a menu entry in the tree is determined in two ways. First
+it can be specified explicitely:
+
+menu "Network device support"
+       depends NET
+
+config NETDEVICES
+       ...
+
+endmenu
+
+All entries within the "menu" ... "endmenu" block become a submenu of
+"Network device support". All subentries inherit the dependencies from
+the menu entry, e.g. this means the dependency "NET" is added to the
+dependency list of the config option NETDEVICES.
+
+The other way to generate the menu structure is done by analyzing the
+dependencies. If a menu entry somehow depends on the previous entry, it
+can be made a submenu of it. First the the previous (parent) symbol must
+be part of the dependency list and then one of these two condititions
+must be true:
+- the child entry must become invisible, if the parent is set to 'n'
+- the child entry must only be visible, if the parent is visible
+
+config MODULES
+       bool "Enable loadable module support"
+
+config MODVERSIONS
+       bool "Set version information on all module symbols"
+       depends MODULES
+
+comment "module support disabled"
+       depends !MODULES
+
+MODVERSIONS directly depends on MODULES, this means it's only visible if
+MODULES is different from 'n'. The comment on the other hand is always
+visible when MODULES it's visible (the (empty) dependency of MODULES is
+also part of the comment dependencies).
+
+
+Kconfig syntax
+--------------
+
+The configuration file describes a series of menu entries, where every
+line starts with a keyword (except help texts). The following keywords
+end a menu entry:
+- config
+- choice/endchoice
+- comment
+- menu/endmenu
+- if/endif
+- source
+The first four also start the definition of a menu entry.
+
+config:
+
+       "config" <symbol>
+       <config options>
+
+This defines a config symbol <symbol> and accepts any of above
+attributes as options.
+
+choices:
+
+       "choice"
+       <choice options>
+       <choice block>
+       "endchoice"
+
+This defines a choice group and accepts any of above attributes as
+options. A choice can only be of type bool or tristate, while a boolean
+choice only allows a single config entry to be selected, a tristate
+choice also allows any number of config entries to be set to 'm'. This
+can be used if multiple drivers for a single hardware exists and only a
+single driver can be compiled/loaded into the kernel, but all drivers
+can be compiled as modules.
+A choice accepts another option "optional", which allows to set the
+choice to 'n' and no entry needs to be selected.
+
+comment:
+
+       "comment" <prompt>
+       <comment options>
+
+This defines a comment which is displayed to the user during the
+configuration process and is also echoed to the output files. The only
+possible options are dependencies.
+
+menu:
+
+       "menu" <prompt>
+       <menu options>
+       <menu block>
+       "endmenu"
+
+This defines a menu block, see "Menu structure" above for more
+information. The only possible options are dependencies.
+
+if:
+
+       "if" <expr>
+       <if block>
+       "endif"
+
+This defines an if block. The dependency expression <expr> is appended
+to all enclosed menu entries.
+
+source:
+
+       "source" <prompt>
+
+This reads the specified configuration file. This file is always parsed.
diff --git a/scripts/config/Makefile b/scripts/config/Makefile
new file mode 100644 (file)
index 0000000..d43c8b1
--- /dev/null
@@ -0,0 +1,102 @@
+# Makefile for BusyBox
+#
+# Copyright (C) 2002 Erik Andersen <andersen@codepoet.org>
+
+TOPDIR=../../
+include $(TOPDIR)Rules.mak
+
+
+all: ncurses conf mconf
+
+#HOSTCFLAGS=-Wall -g -O0
+LIBS = -lncurses
+ifeq (/usr/include/ncurses/ncurses.h, $(wildcard /usr/include/ncurses/ncurses.h))
+       HOSTCFLAGS += -I/usr/include/ncurses -DCURSES_LOC="<ncurses.h>"
+else
+ifeq (/usr/include/ncurses/curses.h, $(wildcard /usr/include/ncurses/curses.h))
+       HOSTCFLAGS += -I/usr/include/ncurses -DCURSES_LOC="<ncurses/curses.h>"
+else
+ifeq (/usr/include/ncurses.h, $(wildcard /usr/include/ncurses.h))
+       HOSTCFLAGS += -DCURSES_LOC="<ncurses.h>"
+else
+       HOSTCFLAGS += -DCURSES_LOC="<curses.h>"
+endif
+endif
+endif
+
+
+CONF_SRC  =conf.c zconf.tab.c
+MCONF_SRC =mconf.c zconf.tab.c
+LXDLG_SRC =checklist.c menubox.c textbox.c yesno.c inputbox.c util.c msgbox.c
+CONF_OBJS =$(patsubst %.c,%.o, $(CONF_SRC))
+MCONF_OBJS=$(patsubst %.c,%.o, $(MCONF_SRC))
+LXDLG_OBJS=$(patsubst %.c,%.o, $(LXDLG_SRC))
+
+conf: $(CONF_OBJS) 
+       $(HOSTCC) $(HOSTCFLAGS) $(NATIVE_LDFLAGS) $^ -o $@
+
+mconf: $(MCONF_OBJS) $(LXDLG_OBJS)
+       $(HOSTCC) $(HOSTCFLAGS) $(NATIVE_LDFLAGS) $^ -o $@ $(LIBS)
+
+lkc_deps:=lkc.h lkc_proto.h lkc_defs.h expr.h zconf.tab.h
+
+conf.o: conf.c $(lkc_deps)
+
+mconf.o: mconf.c $(lkc_deps)
+
+zconf.tab.o: zconf.tab.c lex.zconf.c confdata.c expr.c symbol.c menu.c $(lkc_deps)
+
+lex.zconf.o: lex.zconf.c $(lkc_deps)
+
+%.o : %.c
+       $(HOSTCC) $(HOSTCFLAGS) -I. -c $< -o $@
+
+lkc_defs.h: lkc_proto.h
+       @sed < $< > $@ 's/P(\([^,]*\),.*/#define \1 (\*\1_p)/'
+
+###
+# The following requires flex/bison
+# By default we use the _shipped versions, uncomment the 
+# following line if you are modifying the flex/bison src.
+#LKC_GENPARSER := 1
+
+ifdef LKC_GENPARSER
+
+%.tab.c %.tab.h: %.y
+       bison -t -d -v -b $* -p $(notdir $*) $<
+
+lex.%.c: %.l
+       flex -P$(notdir $*) -o$@ $<
+else
+
+lex.zconf.c: lex.zconf.c_shipped
+       cp lex.zconf.c_shipped lex.zconf.c
+
+zconf.tab.c: zconf.tab.c_shipped
+       cp zconf.tab.c_shipped zconf.tab.c
+
+zconf.tab.h: zconf.tab.h_shipped
+       cp zconf.tab.h_shipped zconf.tab.h
+endif
+
+.PHONY: ncurses
+
+ncurses:
+       @echo "main() {}" > lxtemp.c
+       @if $(HOSTCC) lxtemp.c $(LIBS) ; then \
+               rm -f lxtemp.c a.out; \
+       else \
+               rm -f lxtemp.c; \
+               echo -e "\007" ;\
+               echo ">> Unable to find the Ncurses libraries." ;\
+               echo ">>" ;\
+               echo ">> You must have Ncurses installed in order" ;\
+               echo ">> to use 'make menuconfig'" ;\
+               echo ;\
+               exit 1 ;\
+       fi
+
+clean:
+       rm -f *.o *~ core $(TARGETS) $(MCONF_OBJS) $(CONF_OBJS) \
+               conf mconf zconf.tab.c zconf.tab.h lex.zconf.c lkc_defs.h
+
similarity index 91%
rename from scripts/lxdialog/checklist.c
rename to scripts/config/checklist.c
index 4f78688..c4a9289 100644 (file)
@@ -118,7 +118,8 @@ print_buttons( WINDOW *dialog, int height, int width, int selected)
  */
 int
 dialog_checklist (const char *title, const char *prompt, int height, int width,
-       int list_height, int item_no, const char * const * items, int flag)
+       int list_height, int item_no, struct dialog_list_item ** items,
+       int flag)
        
 {
     int i, x, y, box_x, box_y;
@@ -137,7 +138,7 @@ dialog_checklist (const char *title, const char *prompt, int height, int width,
 
     /* Initializes status */
     for (i = 0; i < item_no; i++) {
-       status[i] = !strcasecmp (items[i * 3 + 2], "on");
+       status[i] = items[i]->selected;
        if (!choice && status[i])
             choice = i;
     }
@@ -195,7 +196,7 @@ dialog_checklist (const char *title, const char *prompt, int height, int width,
     /* Find length of longest item in order to center checklist */
     check_x = 0;
     for (i = 0; i < item_no; i++) 
-       check_x = MAX (check_x, + strlen (items[i * 3 + 1]) + 4);
+       check_x = MAX (check_x, + strlen (items[i]->name) + 4);
 
     check_x = (list_width - check_x) / 2;
     item_x = check_x + 4;
@@ -207,7 +208,7 @@ dialog_checklist (const char *title, const char *prompt, int height, int width,
 
     /* Print the list */
     for (i = 0; i < max_choice; i++) {
-       print_item (list, items[(scroll+i) * 3 + 1],
+       print_item (list, items[scroll + i]->name,
                    status[i+scroll], i, i == choice);
     }
 
@@ -224,7 +225,7 @@ dialog_checklist (const char *title, const char *prompt, int height, int width,
        key = wgetch (dialog);
 
        for (i = 0; i < max_choice; i++)
-            if (toupper(key) == toupper(items[(scroll+i)*3+1][0]))
+            if (toupper(key) == toupper(items[scroll + i]->name[0]))
                 break;
 
 
@@ -237,14 +238,14 @@ dialog_checklist (const char *title, const char *prompt, int height, int width,
                    /* Scroll list down */
                    if (list_height > 1) {
                        /* De-highlight current first item */
-                       print_item (list, items[scroll * 3 + 1],
+                       print_item (list, items[scroll]->name,
                                        status[scroll], 0, FALSE);
                        scrollok (list, TRUE);
                        wscrl (list, -1);
                        scrollok (list, FALSE);
                    }
                    scroll--;
-                   print_item (list, items[scroll * 3 + 1],
+                   print_item (list, items[scroll]->name,
                                status[scroll], 0, TRUE);
                    wnoutrefresh (list);
 
@@ -263,7 +264,7 @@ dialog_checklist (const char *title, const char *prompt, int height, int width,
                    /* Scroll list up */
                    if (list_height > 1) {
                        /* De-highlight current last item before scrolling up */
-                       print_item (list, items[(scroll + max_choice - 1) * 3 + 1],
+                       print_item (list, items[scroll + max_choice - 1]->name,
                                    status[scroll + max_choice - 1],
                                    max_choice - 1, FALSE);
                        scrollok (list, TRUE);
@@ -271,7 +272,7 @@ dialog_checklist (const char *title, const char *prompt, int height, int width,
                        scrollok (list, FALSE);
                    }
                    scroll++;
-                   print_item (list, items[(scroll + max_choice - 1) * 3 + 1],
+                   print_item (list, items[scroll + max_choice - 1]->name,
                                status[scroll + max_choice - 1],
                                max_choice - 1, TRUE);
                    wnoutrefresh (list);
@@ -287,11 +288,11 @@ dialog_checklist (const char *title, const char *prompt, int height, int width,
            }
            if (i != choice) {
                /* De-highlight current item */
-               print_item (list, items[(scroll + choice) * 3 + 1],
+               print_item (list, items[scroll + choice]->name,
                            status[scroll + choice], choice, FALSE);
                /* Highlight new item */
                choice = i;
-               print_item (list, items[(scroll + choice) * 3 + 1],
+               print_item (list, items[scroll + choice]->name,
                            status[scroll + choice], choice, TRUE);
                wnoutrefresh (list);
                wrefresh (dialog);
@@ -330,7 +331,7 @@ dialog_checklist (const char *title, const char *prompt, int height, int width,
                            status[i] = 0;
                        status[scroll + choice] = 1;
                        for (i = 0; i < max_choice; i++)
-                           print_item (list, items[(scroll + i) * 3 + 1],
+                           print_item (list, items[scroll + i]->name,
                                        status[scroll + i], i, i == choice);
                    }
                }
@@ -338,14 +339,7 @@ dialog_checklist (const char *title, const char *prompt, int height, int width,
                wrefresh (dialog);
             
                for (i = 0; i < item_no; i++) {
-                   if (status[i]) {
-                       if (flag == FLAG_CHECK) {
-                           fprintf (stderr, "\"%s\" ", items[i * 3]);
-                       } else {
-                           fprintf (stderr, "%s", items[i * 3]);
-                       }
-
-                   }
+                       items[i]->selected = status[i];
                }
             }
            delwin (dialog);
diff --git a/scripts/config/conf.c b/scripts/config/conf.c
new file mode 100644 (file)
index 0000000..884175e
--- /dev/null
@@ -0,0 +1,566 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <time.h>
+#include <sys/stat.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+static void conf(struct menu *menu);
+static void check_conf(struct menu *menu);
+
+enum {
+       ask_all,
+       ask_new,
+       ask_silent,
+       set_default,
+       set_yes,
+       set_mod,
+       set_no,
+       set_random
+} input_mode = ask_all;
+
+static int indent = 1;
+static int valid_stdin = 1;
+static int conf_cnt;
+static char line[128];
+static struct menu *rootEntry;
+
+static char nohelp_text[] = "Sorry, no help available for this option yet.\n";
+
+#if 0
+static void printc(int ch)
+{
+       static int sep = 0;
+
+       if (!sep) {
+               putchar('[');
+               sep = 1;
+       } else if (ch)
+               putchar('/');
+       if (!ch) {
+               putchar(']');
+               putchar(' ');
+               sep = 0;
+       } else
+               putchar(ch);
+}
+#endif
+
+static void printo(const char *o)
+{
+       static int sep = 0;
+
+       if (!sep) {
+               putchar('(');
+               sep = 1;
+       } else if (o) {
+               putchar(',');
+               putchar(' ');
+       }
+       if (!o) {
+               putchar(')');
+               putchar(' ');
+               sep = 0;
+       } else
+               printf("%s", o);
+}
+
+static void strip(char *str)
+{
+       char *p = str;
+       int l;
+
+       while ((isspace((int)*p)))
+               p++;
+       l = strlen(p);
+       if (p != str)
+               memmove(str, p, l + 1);
+       if (!l)
+               return;
+       p = str + l - 1;
+       while ((isspace((int)*p)))
+               *p-- = 0;
+}
+
+static void conf_askvalue(struct symbol *sym, const char *def)
+{
+       enum symbol_type type = sym_get_type(sym);
+       tristate val;
+
+       if (!sym_has_value(sym))
+               printf("(NEW) ");
+
+       line[0] = '\n';
+       line[1] = 0;
+
+       switch (input_mode) {
+       case ask_new:
+       case ask_silent:
+               if (sym_has_value(sym)) {
+                       printf("%s\n", def);
+                       return;
+               }
+               if (!valid_stdin && input_mode == ask_silent) {
+                       printf("aborted!\n\n");
+                       printf("Console input/output is redirected. ");
+                       printf("Run 'make oldconfig' to update configuration.\n\n");
+                       exit(1);
+               }
+       case ask_all:
+               fflush(stdout);
+               fgets(line, 128, stdin);
+               return;
+       case set_default:
+               printf("%s\n", def);
+               return;
+       default:
+               break;
+       }
+
+       switch (type) {
+       case S_INT:
+       case S_HEX:
+       case S_STRING:
+               printf("%s\n", def);
+               return;
+       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);
+}
+
+int conf_string(struct menu *menu)
+{
+       struct symbol *sym = menu->sym;
+       const char *def, *help;
+
+       while (1) {
+               printf("%*s%s ", indent - 1, "", menu->prompt->text);
+               printf("(%s) ", sym->name);
+               def = sym_get_string_value(sym);
+               if (sym_get_string_value(sym))
+                       printf("[%s] ", def);
+               conf_askvalue(sym, def);
+               switch (line[0]) {
+               case '\n':
+                       break;
+               case '?':
+                       /* print help */
+                       if (line[1] == 0) {
+                               help = nohelp_text;
+                               if (menu->sym->help)
+                                       help = menu->sym->help;
+                               printf("\n%s\n", menu->sym->help);
+                               def = NULL;
+                               break;
+                       }
+               default:
+                       line[strlen(line)-1] = 0;
+                       def = line;
+               }
+               if (def && sym_set_string_value(sym, def))
+                       return 0;
+       }
+}
+
+static int conf_sym(struct menu *menu)
+{
+       struct symbol *sym = menu->sym;
+       int type;
+       tristate oldval, newval;
+       const char *help;
+
+       while (1) {
+               printf("%*s%s ", indent - 1, "", menu->prompt->text);
+               if (sym->name)
+                       printf("(%s) ", sym->name);
+               type = sym_get_type(sym);
+               putchar('[');
+               oldval = sym_get_tristate_value(sym);
+               switch (oldval) {
+               case no:
+                       putchar('N');
+                       break;
+               case mod:
+                       putchar('M');
+                       break;
+               case yes:
+                       putchar('Y');
+                       break;
+               }
+               if (oldval != no && sym_tristate_within_range(sym, no))
+                       printf("/n");
+               if (oldval != mod && sym_tristate_within_range(sym, mod))
+                       printf("/m");
+               if (oldval != yes && sym_tristate_within_range(sym, yes))
+                       printf("/y");
+               if (sym->help)
+                       printf("/?");
+               printf("] ");
+               conf_askvalue(sym, sym_get_string_value(sym));
+               strip(line);
+
+               switch (line[0]) {
+               case 'n':
+               case 'N':
+                       newval = no;
+                       if (!line[1] || !strcmp(&line[1], "o"))
+                               break;
+                       continue;
+               case 'm':
+               case 'M':
+                       newval = mod;
+                       if (!line[1])
+                               break;
+                       continue;
+               case 'y':
+               case 'Y':
+                       newval = yes;
+                       if (!line[1] || !strcmp(&line[1], "es"))
+                               break;
+                       continue;
+               case 0:
+                       newval = oldval;
+                       break;
+               case '?':
+                       goto help;
+               default:
+                       continue;
+               }
+               if (sym_set_tristate_value(sym, newval))
+                       return 0;
+help:
+               help = nohelp_text;
+               if (sym->help)
+                       help = sym->help;
+               printf("\n%s\n", help);
+       }
+}
+
+static int conf_choice(struct menu *menu)
+{
+       struct symbol *sym, *def_sym;
+       struct menu *cmenu, *def_menu;
+       const char *help;
+       int type, len;
+       bool is_new;
+
+       sym = menu->sym;
+       type = sym_get_type(sym);
+       is_new = !sym_has_value(sym);
+       if (sym_is_changable(sym)) {
+               conf_sym(menu);
+               sym_calc_value(sym);
+               switch (sym_get_tristate_value(sym)) {
+               case no:
+                       return 1;
+               case mod:
+                       return 0;
+               case yes:
+                       break;
+               }
+       } else {
+               sym->def = sym->curr;
+               if (S_TRI(sym->curr) == mod) {
+                       printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
+                       return 0;
+               }
+       }
+
+       while (1) {
+               printf("%*s%s ", indent - 1, "", menu_get_prompt(menu));
+               def_sym = sym_get_choice_value(sym);
+               def_menu = NULL;
+               for (cmenu = menu->list; cmenu; cmenu = cmenu->next) {
+                       if (!menu_is_visible(cmenu))
+                               continue;
+                       printo(menu_get_prompt(cmenu));
+                       if (cmenu->sym == def_sym)
+                               def_menu = cmenu;
+               }
+               printo(NULL);
+               if (def_menu)
+                       printf("[%s] ", menu_get_prompt(def_menu));
+               else {
+                       printf("\n");
+                       return 1;
+               }
+               switch (input_mode) {
+               case ask_new:
+               case ask_silent:
+               case ask_all:
+                       conf_askvalue(sym, menu_get_prompt(def_menu));
+                       strip(line);
+                       break;
+               default:
+                       line[0] = 0;
+                       printf("\n");
+               }
+               if (line[0] == '?' && !line[1]) {
+                       help = nohelp_text;
+                       if (menu->sym->help)
+                               help = menu->sym->help;
+                       printf("\n%s\n", help);
+                       continue;
+               }
+               if (line[0]) {
+                       len = strlen(line);
+                       line[len] = 0;
+
+                       def_menu = NULL;
+                       for (cmenu = menu->list; cmenu; cmenu = cmenu->next) {
+                               if (!cmenu->sym || !menu_is_visible(cmenu))
+                                       continue;
+                               if (!strncasecmp(line, menu_get_prompt(cmenu), len)) {
+                                       def_menu = cmenu;
+                                       break;
+                               }
+                       }
+               }
+               if (def_menu) {
+                       sym_set_choice_value(sym, def_menu->sym);
+                       if (def_menu->list) {
+                               indent += 2;
+                               conf(def_menu->list);
+                               indent -= 2;
+                       }
+                       return 1;
+               }
+       }
+}
+
+static void conf(struct menu *menu)
+{
+       struct symbol *sym;
+       struct property *prop;
+       struct menu *child;
+
+       if (!menu_is_visible(menu))
+               return;
+
+       sym = menu->sym;
+       prop = menu->prompt;
+       if (prop) {
+               const char *prompt;
+
+               switch (prop->type) {
+               case P_MENU:
+                       if (input_mode == ask_silent && rootEntry != menu) {
+                               check_conf(menu);
+                               return;
+                       }
+               case P_COMMENT:
+                       prompt = menu_get_prompt(menu);
+                       if (prompt)
+                               printf("%*c\n%*c %s\n%*c\n",
+                                       indent, '*',
+                                       indent, '*', prompt,
+                                       indent, '*');
+               default:
+                       ;
+               }
+       }
+
+       if (!sym)
+               goto conf_childs;
+
+       if (sym_is_choice(sym)) {
+               conf_choice(menu);
+               if (S_TRI(sym->curr) != mod)
+                       return;
+               goto conf_childs;
+       }
+
+       switch (sym->type) {
+       case S_INT:
+       case S_HEX:
+       case S_STRING:
+               conf_string(menu);
+               break;
+       default:
+               conf_sym(menu);
+               break;
+       }
+
+conf_childs:
+       if (sym)
+               indent += 2;
+       for (child = menu->list; child; child = child->next)
+               conf(child);
+       if (sym)
+               indent -= 2;
+}
+
+static void check_conf(struct menu *menu)
+{
+       struct symbol *sym;
+       struct menu *child;
+
+       if (!menu_is_visible(menu))
+               return;
+
+       sym = menu->sym;
+       if (!sym)
+               goto conf_childs;
+
+       if (sym_is_choice(sym)) {
+               if (!sym_has_value(sym)) {
+                       if (!conf_cnt++)
+                               printf("*\n* Restart config...\n*\n");
+                       rootEntry = menu_get_parent_menu(menu);
+                       conf(rootEntry);
+               }
+               if (sym_get_tristate_value(sym) != mod)
+                       return;
+               goto conf_childs;
+       }
+
+       if (!sym_has_value(sym)) {
+               if (!conf_cnt++)
+                       printf("*\n* Restart config...\n*\n");
+               rootEntry = menu_get_parent_menu(menu);
+               conf(rootEntry);
+       }
+
+conf_childs:
+       for (child = menu->list; child; child = child->next)
+               check_conf(child);
+}
+
+int main(int ac, char **av)
+{
+       const char *name;
+       struct stat tmpstat;
+
+       if (ac > 1 && av[1][0] == '-') {
+               switch (av[1][1]) {
+               case 'o':
+                       input_mode = ask_new;
+                       break;
+               case 's':
+                       input_mode = ask_silent;
+                       valid_stdin = isatty(0) && isatty(1) && isatty(2);
+                       break;
+               case 'd':
+                       input_mode = set_default;
+                       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 '?':
+                       printf("%s [-o|-s] config\n", av[0]);
+                       exit(0);
+               }
+               name = av[2];
+       } else
+               name = av[1];
+       conf_parse(name);
+       //zconfdump(stdout);
+       switch (input_mode) {
+       case set_default:
+               name = conf_get_default_confname();
+               if (conf_read(name)) {
+                       printf("***\n"
+                               "*** Can't find default configuration \"%s\"!\n"
+                               "***\n", name);
+                       exit(1);
+               }
+               break;
+       case ask_silent:
+               if (stat(".config", &tmpstat)) {
+                       printf("***\n"
+                               "*** You have not yet configured BusyBox!\n"
+                               "***\n"
+                               "*** Please run some configurator (e.g. \"make oldconfig\"\n"
+                               "*** or \"make menuconfig\").\n"
+                               "***\n");
+                       exit(1);
+               }
+       case ask_all:
+       case ask_new:
+               conf_read(NULL);
+               break;
+       default:
+               break;
+       }
+
+       if (input_mode != ask_silent) {
+               rootEntry = &rootmenu;
+               conf(&rootmenu);
+               if (input_mode == ask_all) {
+                       input_mode = ask_silent;
+                       valid_stdin = 1;
+               }
+       }
+       do {
+               conf_cnt = 0;
+               check_conf(&rootmenu);
+       } while (conf_cnt);
+       conf_write(NULL);
+       return 0;
+}
diff --git a/scripts/config/confdata.c b/scripts/config/confdata.c
new file mode 100644 (file)
index 0000000..44835bb
--- /dev/null
@@ -0,0 +1,371 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ *
+ * Allow 'n' as a symbol value.
+ * 2002-11-05 Petr Baudis <pasky@ucw.cz>
+ */
+
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+const char conf_def_filename[] = ".config";
+
+const char conf_defname[] = "extra/Configs/Config.$TARGET_ARCH.default";
+
+const char *conf_confnames[] = {
+       ".config",
+       conf_defname,
+       NULL,
+};
+
+static char *conf_expand_value(const char *in)
+{
+       struct symbol *sym;
+       const char *src;
+       static char res_value[SYMBOL_MAXLENGTH];
+       char *dst, name[SYMBOL_MAXLENGTH];
+
+       res_value[0] = 0;
+       dst = name;
+       while ((src = strchr(in, '$'))) {
+               strncat(res_value, in, src - in);
+               src++;
+               dst = name;
+               while (isalnum((int)*src) || *src == '_')
+                       *dst++ = *src++;
+               *dst = 0;
+               sym = sym_lookup(name, 0);
+               sym_calc_value(sym);
+               strcat(res_value, sym_get_string_value(sym));
+               in = src;
+       }
+       strcat(res_value, in);
+
+       return res_value;
+}
+
+char *conf_get_default_confname(void)
+{
+       return conf_expand_value(conf_defname);
+}
+
+int conf_read(const char *name)
+{
+       FILE *in = NULL;
+       char line[1024];
+       char *p, *p2;
+       int lineno = 0;
+       struct symbol *sym;
+       struct property *prop;
+       struct expr *e;
+       int i;
+
+       if (name) {
+               in = fopen(name, "r");
+       } else {
+               const char **names = conf_confnames;
+               while ((name = *names++)) {
+                       name = conf_expand_value(name);
+                       in = fopen(name, "r");
+                       if (in) {
+                               printf("#\n"
+                                      "# using defaults found in %s\n"
+                                      "#\n", name);
+                               break;
+                       }
+               }
+       }
+
+       if (!in)
+               return 1;
+
+       for_all_symbols(i, sym) {
+               sym->flags |= SYMBOL_NEW | SYMBOL_CHANGED;
+               sym->flags &= ~SYMBOL_VALID;
+               switch (sym->type) {
+               case S_INT:
+               case S_HEX:
+               case S_STRING:
+                       if (S_VAL(sym->def))
+                               free(S_VAL(sym->def));
+               default:
+                       S_VAL(sym->def) = NULL;
+                       S_TRI(sym->def) = no;
+                       ;
+               }
+       }
+
+       while (fgets(line, sizeof(line), in)) {
+               lineno++;
+               switch (line[0]) {
+               case '\n':
+                       break;
+               case ' ':
+                       break;
+               case '#':
+                       p = strchr(line, ' ');
+                       if (!p)
+                               continue;
+                       *p++ = 0;
+                       p = strchr(p, ' ');
+                       if (!p)
+                               continue;
+                       *p++ = 0;
+                       if (strncmp(p, "is not set", 10))
+                               continue;
+                       sym = sym_lookup(line+2, 0);
+                       switch (sym->type) {
+                       case S_BOOLEAN:
+                       case S_TRISTATE:
+                               sym->def = symbol_no.curr;
+                               sym->flags &= ~SYMBOL_NEW;
+                               break;
+                       default:
+                               ;
+                       }
+                       break;
+               case 'A' ... 'Z':
+                       p = strchr(line, '=');
+                       if (!p)
+                               continue;
+                       *p++ = 0;
+                       p2 = strchr(p, '\n');
+                       if (p2)
+                               *p2 = 0;
+                       sym = sym_find(line);
+                       if (!sym) {
+                               fprintf(stderr, "%s:%d: trying to assign nonexistent symbol %s\n", name, lineno, line);
+                               break;
+                       }
+                       switch (sym->type) {
+                       case S_TRISTATE:
+                               if (p[0] == 'm') {
+                                       S_TRI(sym->def) = mod;
+                                       sym->flags &= ~SYMBOL_NEW;
+                                       break;
+                               }
+                       case S_BOOLEAN:
+                               if (p[0] == 'y') {
+                                       S_TRI(sym->def) = yes;
+                                       sym->flags &= ~SYMBOL_NEW;
+                                       break;
+                               }
+                               if (p[0] == 'n') {
+                                       S_TRI(sym->def) = no;
+                                       sym->flags &= ~SYMBOL_NEW;
+                                       break;
+                               }
+                               break;
+                       case S_STRING:
+                               if (*p++ != '"')
+                                       break;
+                               for (p2 = p; (p2 = strpbrk(p2, "\"\\")); p2++) {
+                                       if (*p2 == '"') {
+                                               *p2 = 0;
+                                               break;
+                                       }
+                                       memmove(p2, p2 + 1, strlen(p2));
+                               }
+                       case S_INT:
+                       case S_HEX:
+                               if (sym_string_valid(sym, p)) {
+                                       S_VAL(sym->def) = strdup(p);
+                                       sym->flags &= ~SYMBOL_NEW;
+                               } else
+                                       fprintf(stderr, "%s:%d:symbol value '%s' invalid for %s\n", name, lineno, p, sym->name);
+                               break;
+                       default:
+                               ;
+                       }
+                       if (sym_is_choice_value(sym)) {
+                               prop = sym_get_choice_prop(sym);
+                               switch (S_TRI(sym->def)) {
+                               case mod:
+                                       if (S_TRI(prop->def->def) == yes)
+                                               /* warn? */;
+                                       break;
+                               case yes:
+                                       if (S_TRI(prop->def->def) != no)
+                                               /* warn? */;
+                                       S_VAL(prop->def->def) = sym;
+                                       break;
+                               case no:
+                                       break;
+                               }
+                               S_TRI(prop->def->def) = S_TRI(sym->def);
+                       }
+                       break;
+               default:
+                       continue;
+               }
+       }
+       fclose(in);
+
+       for_all_symbols(i, sym) {
+               if (!sym_is_choice(sym))
+                       continue;
+               prop = sym_get_choice_prop(sym);
+               for (e = prop->dep; e; e = e->left.expr)
+                       sym->flags |= e->right.sym->flags & SYMBOL_NEW;
+               sym->flags &= ~SYMBOL_NEW;
+       }
+
+       sym_change_count = 1;
+
+       return 0;
+}
+
+int conf_write(const char *name)
+{
+       FILE *out, *out_h;
+       struct symbol *sym;
+       struct menu *menu;
+       char oldname[128];
+       int type, l;
+       const char *str;
+
+       out = fopen(".tmpconfig", "w");
+       if (!out)
+               return 1;
+       out_h = fopen(".tmpconfig.h", "w");
+       if (!out_h)
+               return 1;
+       fprintf(out, "#\n"
+                    "# Automatically generated make config: don't edit\n"
+                    "#\n");
+       fprintf(out_h, "/*\n"
+                      " * Automatically generated header file: don't edit\n"
+                      " */\n\n"
+                      "#define AUTOCONF_INCLUDED\n\n"
+                      "/* Version Number */\n"
+                      "#define BB_VER \"%s\"\n"
+                      "#define BB_BT \"%s\"\n\n",
+                      getenv("VERSION"),
+                      getenv("BUILDTIME")
+       );
+
+       if (!sym_change_count)
+               sym_clear_all_valid();
+
+       menu = rootmenu.list;
+       while (menu) {
+               sym = menu->sym;
+               if (!sym) {
+                       if (!menu_is_visible(menu))
+                               goto next;
+                       str = menu_get_prompt(menu);
+                       fprintf(out, "\n"
+                                    "#\n"
+                                    "# %s\n"
+                                    "#\n", str);
+                       fprintf(out_h, "\n"
+                                      "/*\n"
+                                      " * %s\n"
+                                      " */\n", str);
+               } else if (!(sym->flags & SYMBOL_CHOICE)) {
+                       sym_calc_value(sym);
+                       if (!(sym->flags & SYMBOL_WRITE))
+                               goto next;
+                       sym->flags &= ~SYMBOL_WRITE;
+                       type = sym->type;
+                       if (type == S_TRISTATE) {
+                               sym_calc_value(modules_sym);
+                               if (S_TRI(modules_sym->curr) == no)
+                                       type = S_BOOLEAN;
+                       }
+                       switch (type) {
+                       case S_BOOLEAN:
+                       case S_TRISTATE:
+                               switch (sym_get_tristate_value(sym)) {
+                               case no:
+                                       fprintf(out, "# %s is not set\n", sym->name);
+                                       fprintf(out_h, "#undef %s\n", sym->name);
+                                       break;
+                               case mod:
+#if 0
+                                       fprintf(out, "%s=m\n", sym->name);
+                                       fprintf(out_h, "#define __%s__MODULE 1\n", sym->name);
+#endif
+                                       break;
+                               case yes:
+                                       fprintf(out, "%s=y\n", sym->name);
+                                       fprintf(out_h, "#define %s 1\n", sym->name);
+                                       break;
+                               }
+                               break;
+                       case S_STRING:
+                               // fix me
+                               str = sym_get_string_value(sym);
+                               fprintf(out, "%s=\"", sym->name);
+                               fprintf(out_h, "#define %s \"", sym->name);
+                               do {
+                                       l = strcspn(str, "\"\\");
+                                       if (l) {
+                                               fwrite(str, l, 1, out);
+                                               fwrite(str, l, 1, out_h);
+                                       }
+                                       str += l;
+                                       while (*str == '\\' || *str == '"') {
+                                               fprintf(out, "\\%c", *str);
+                                               fprintf(out_h, "\\%c", *str);
+                                               str++;
+                                       }
+                               } while (*str);
+                               fputs("\"\n", out);
+                               fputs("\"\n", out_h);
+                               break;
+                       case S_HEX:
+                               str = sym_get_string_value(sym);
+                               if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
+                                       fprintf(out, "%s=%s\n", sym->name, str);
+                                       fprintf(out_h, "#define %s 0x%s\n", sym->name, str);
+                                       break;
+                               }
+                       case S_INT:
+                               str = sym_get_string_value(sym);
+                               fprintf(out, "%s=%s\n", sym->name, str);
+                               fprintf(out_h, "#define %s %s\n", sym->name, str);
+                               break;
+                       }
+               }
+
+       next:
+               if (menu->list) {
+                       menu = menu->list;
+                       continue;
+               }
+               if (menu->next)
+                       menu = menu->next;
+               else while ((menu = menu->parent)) {
+                       if (menu->next) {
+                               menu = menu->next;
+                               break;
+                       }
+               }
+       }
+       fclose(out);
+       fclose(out_h);
+
+       if (!name) {
+               rename(".tmpconfig.h", "include/config.h");
+               name = conf_def_filename;
+               file_write_dep(NULL);
+       } else
+               unlink(".tmpconfig.h");
+
+       sprintf(oldname, "%s.old", name);
+       rename(name, oldname);
+       if (rename(".tmpconfig", name))
+               return 1;
+
+       sym_change_count = 0;
+
+       return 0;
+}
similarity index 93%
rename from scripts/lxdialog/dialog.h
rename to scripts/config/dialog.h
index 0e30d00..8116cee 100644 (file)
@@ -26,6 +26,7 @@
 #include <stdlib.h>
 #include <string.h>
 
+#ifdef CURSES_LOC
 #include CURSES_LOC
 
 /*
  * Global variables
  */
 extern bool use_colors;
-extern bool use_shadow;
 
 extern chtype attributes[];
+#endif
+
+extern char *backtitle;
 
-extern const char *backtitle;
+struct dialog_list_item {
+       char *name;
+       int namelen;
+       char *tag;
+       int selected; /* Set to 1 by dialog_*() function. */
+};
 
 /*
  * Function prototypes
  */
-extern void create_rc (const char *filename);
-extern int parse_rc (void);
-
 
 void init_dialog (void);
 void end_dialog (void);
-void attr_clear (WINDOW * win, int height, int width, chtype attr);
 void dialog_clear (void);
+#ifdef CURSES_LOC
+void attr_clear (WINDOW * win, int height, int width, chtype attr);
 void color_setup (void);
 void print_autowrap (WINDOW * win, const char *prompt, int width, int y, int x);
 void print_button (WINDOW * win, const char *label, int y, int x, int selected);
 void draw_box (WINDOW * win, int y, int x, int height, int width, chtype box,
                chtype border);
 void draw_shadow (WINDOW * win, int y, int x, int height, int width);
+#endif
 
 int first_alpha (const char *string, const char *exempt);
 int dialog_yesno (const char *title, const char *prompt, int height, int width);
@@ -156,14 +163,17 @@ int dialog_msgbox (const char *title, const char *prompt, int height,
 int dialog_textbox (const char *title, const char *file, int height, int width);
 int dialog_menu (const char *title, const char *prompt, int height, int width,
                int menu_height, const char *choice, int item_no, 
-               const char * const * items);
+               struct dialog_list_item ** items);
 int dialog_checklist (const char *title, const char *prompt, int height,
                int width, int list_height, int item_no,
-               const char * const * items, int flag);
+               struct dialog_list_item ** items, int flag);
 extern unsigned char dialog_input_result[];
 int dialog_inputbox (const char *title, const char *prompt, int height,
                int width, const char *init);
 
+struct dialog_list_item *first_sel_item(int item_no,
+               struct dialog_list_item ** items);
+
 /*
  * This is the base for fictitious keys, which activate
  * the buttons.
@@ -173,7 +183,9 @@ int dialog_inputbox (const char *title, const char *prompt, int height,
  *   -- the lowercase are used to signal mouse-enter events (M_EVENT + 'o')
  *   -- uppercase chars are used to invoke the button (M_EVENT + 'O')
  */
+#ifdef CURSES_LOC
 #define M_EVENT (KEY_MAX+1)
+#endif
 
 
 /*
diff --git a/scripts/config/expr.c b/scripts/config/expr.c
new file mode 100644 (file)
index 0000000..d1af2a5
--- /dev/null
@@ -0,0 +1,1054 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+struct expr *expr_alloc_symbol(struct symbol *sym)
+{
+       struct expr *e = malloc(sizeof(*e));
+       memset(e, 0, sizeof(*e));
+       e->type = E_SYMBOL;
+       e->left.sym = sym;
+       return e;
+}
+
+struct expr *expr_alloc_one(enum expr_type type, struct expr *ce)
+{
+       struct expr *e = malloc(sizeof(*e));
+       memset(e, 0, sizeof(*e));
+       e->type = type;
+       e->left.expr = ce;
+       return e;
+}
+
+struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2)
+{
+       struct expr *e = malloc(sizeof(*e));
+       memset(e, 0, sizeof(*e));
+       e->type = type;
+       e->left.expr = e1;
+       e->right.expr = e2;
+       return e;
+}
+
+struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2)
+{
+       struct expr *e = malloc(sizeof(*e));
+       memset(e, 0, sizeof(*e));
+       e->type = type;
+       e->left.sym = s1;
+       e->right.sym = s2;
+       return e;
+}
+
+struct expr *expr_alloc_and(struct expr *e1, struct expr *e2)
+{
+       if (!e1)
+               return e2;
+       return e2 ? expr_alloc_two(E_AND, e1, e2) : e1;
+}
+
+struct expr *expr_copy(struct expr *org)
+{
+       struct expr *e;
+
+       if (!org)
+               return NULL;
+
+       e = malloc(sizeof(*org));
+       memcpy(e, org, sizeof(*org));
+       switch (org->type) {
+       case E_SYMBOL:
+               e->left = org->left;
+               break;
+       case E_NOT:
+               e->left.expr = expr_copy(org->left.expr);
+               break;
+       case E_EQUAL:
+       case E_UNEQUAL:
+               e->left.sym = org->left.sym;
+               e->right.sym = org->right.sym;
+               break;
+       case E_AND:
+       case E_OR:
+       case E_CHOICE:
+               e->left.expr = expr_copy(org->left.expr);
+               e->right.expr = expr_copy(org->right.expr);
+               break;
+       default:
+               printf("can't copy type %d\n", e->type);
+               free(e);
+               e = NULL;
+               break;
+       }
+
+       return e;
+}
+
+void expr_free(struct expr *e)
+{
+       if (!e)
+               return;
+
+       switch (e->type) {
+       case E_SYMBOL:
+               break;
+       case E_NOT:
+               expr_free(e->left.expr);
+               return;
+       case E_EQUAL:
+       case E_UNEQUAL:
+               break;
+       case E_OR:
+       case E_AND:
+               expr_free(e->left.expr);
+               expr_free(e->right.expr);
+               break;
+       default:
+               printf("how to free type %d?\n", e->type);
+               break;
+       }
+       free(e);
+}
+
+static int trans_count;
+
+#define e1 (*ep1)
+#define e2 (*ep2)
+
+static void __expr_eliminate_eq(enum expr_type type, struct expr **ep1, struct expr **ep2)
+{
+       if (e1->type == type) {
+               __expr_eliminate_eq(type, &e1->left.expr, &e2);
+               __expr_eliminate_eq(type, &e1->right.expr, &e2);
+               return;
+       }
+       if (e2->type == type) {
+               __expr_eliminate_eq(type, &e1, &e2->left.expr);
+               __expr_eliminate_eq(type, &e1, &e2->right.expr);
+               return;
+       }
+       if (e1->type == E_SYMBOL && e2->type == E_SYMBOL &&
+           e1->left.sym == e2->left.sym && (e1->left.sym->flags & (SYMBOL_YES|SYMBOL_NO)))
+               return;
+       if (!expr_eq(e1, e2))
+               return;
+       trans_count++;
+       expr_free(e1); expr_free(e2);
+       switch (type) {
+       case E_OR:
+               e1 = expr_alloc_symbol(&symbol_no);
+               e2 = expr_alloc_symbol(&symbol_no);
+               break;
+       case E_AND:
+               e1 = expr_alloc_symbol(&symbol_yes);
+               e2 = expr_alloc_symbol(&symbol_yes);
+               break;
+       default:
+               ;
+       }
+}
+
+void expr_eliminate_eq(struct expr **ep1, struct expr **ep2)
+{
+       if (!e1 || !e2 || e1->type != e2->type)
+               return;
+       __expr_eliminate_eq(e1->type, ep1, ep2);
+       e1 = expr_eliminate_yn(e1);
+       e2 = expr_eliminate_yn(e2);
+}
+
+#undef e1
+#undef e2
+
+int expr_eq(struct expr *e1, struct expr *e2)
+{
+       int res, old_count;
+
+       if (e1->type != e2->type)
+               return 0;
+       switch (e1->type) {
+       case E_EQUAL:
+       case E_UNEQUAL:
+               return e1->left.sym == e2->left.sym && e1->right.sym == e2->right.sym;
+       case E_SYMBOL:
+               return e1->left.sym == e2->left.sym;
+       case E_NOT:
+               return expr_eq(e1->left.expr, e2->left.expr);
+       case E_AND:
+       case E_OR:
+               e1 = expr_copy(e1);
+               e2 = expr_copy(e2);
+               old_count = trans_count;
+               expr_eliminate_eq(&e1, &e2);
+               res = (e1->type == E_SYMBOL && e2->type == E_SYMBOL &&
+                      e1->left.sym == e2->left.sym);
+               expr_free(e1);
+               expr_free(e2);
+               trans_count = old_count;
+               return res;
+       case E_CHOICE:
+       case E_NONE:
+               /* panic */;
+       }
+
+       print_expr(0, e1, 0);
+       printf(" = ");
+       print_expr(0, e2, 0);
+       printf(" ?\n");
+
+       return 0;
+}
+
+struct expr *expr_eliminate_yn(struct expr *e)
+{
+       struct expr *tmp;
+
+       if (e) switch (e->type) {
+       case E_AND:
+               e->left.expr = expr_eliminate_yn(e->left.expr);
+               e->right.expr = expr_eliminate_yn(e->right.expr);
+               if (e->left.expr->type == E_SYMBOL) {
+                       if (e->left.expr->left.sym == &symbol_no) {
+                               expr_free(e->left.expr);
+                               expr_free(e->right.expr);
+                               e->type = E_SYMBOL;
+                               e->left.sym = &symbol_no;
+                               e->right.expr = NULL;
+                               return e;
+                       } else if (e->left.expr->left.sym == &symbol_yes) {
+                               free(e->left.expr);
+                               tmp = e->right.expr;
+                               *e = *(e->right.expr);
+                               free(tmp);
+                               return e;
+                       }
+               }
+               if (e->right.expr->type == E_SYMBOL) {
+                       if (e->right.expr->left.sym == &symbol_no) {
+                               expr_free(e->left.expr);
+                               expr_free(e->right.expr);
+                               e->type = E_SYMBOL;
+                               e->left.sym = &symbol_no;
+                               e->right.expr = NULL;
+                               return e;
+                       } else if (e->right.expr->left.sym == &symbol_yes) {
+                               free(e->right.expr);
+                               tmp = e->left.expr;
+                               *e = *(e->left.expr);
+                               free(tmp);
+                               return e;
+                       }
+               }
+               break;
+       case E_OR:
+               e->left.expr = expr_eliminate_yn(e->left.expr);
+               e->right.expr = expr_eliminate_yn(e->right.expr);
+               if (e->left.expr->type == E_SYMBOL) {
+                       if (e->left.expr->left.sym == &symbol_no) {
+                               free(e->left.expr);
+                               tmp = e->right.expr;
+                               *e = *(e->right.expr);
+                               free(tmp);
+                               return e;
+                       } else if (e->left.expr->left.sym == &symbol_yes) {
+                               expr_free(e->left.expr);
+                               expr_free(e->right.expr);
+                               e->type = E_SYMBOL;
+                               e->left.sym = &symbol_yes;
+                               e->right.expr = NULL;
+                               return e;
+                       }
+               }
+               if (e->right.expr->type == E_SYMBOL) {
+                       if (e->right.expr->left.sym == &symbol_no) {
+                               free(e->right.expr);
+                               tmp = e->left.expr;
+                               *e = *(e->left.expr);
+                               free(tmp);
+                               return e;
+                       } else if (e->right.expr->left.sym == &symbol_yes) {
+                               expr_free(e->left.expr);
+                               expr_free(e->right.expr);
+                               e->type = E_SYMBOL;
+                               e->left.sym = &symbol_yes;
+                               e->right.expr = NULL;
+                               return e;
+                       }
+               }
+               break;
+       default:
+               ;
+       }
+       return e;
+}
+
+/*
+ * bool FOO!=n => FOO
+ */
+struct expr *expr_trans_bool(struct expr *e)
+{
+       if (!e)
+               return NULL;
+       switch (e->type) {
+       case E_AND:
+       case E_OR:
+       case E_NOT:
+               e->left.expr = expr_trans_bool(e->left.expr);
+               e->right.expr = expr_trans_bool(e->right.expr);
+               break;
+       case E_UNEQUAL:
+               // FOO!=n -> FOO
+               if (e->left.sym->type == S_TRISTATE) {
+                       if (e->right.sym == &symbol_no) {
+                               e->type = E_SYMBOL;
+                               e->right.sym = NULL;
+                       }
+               }
+               break;
+       default:
+               ;
+       }
+       return e;
+}
+
+/*
+ * e1 || e2 -> ?
+ */
+struct expr *expr_join_or(struct expr *e1, struct expr *e2)
+{
+       struct expr *tmp;
+       struct symbol *sym1, *sym2;
+
+       if (expr_eq(e1, e2))
+               return expr_copy(e1);
+       if (e1->type != E_EQUAL && e1->type != E_UNEQUAL && e1->type != E_SYMBOL && e1->type != E_NOT)
+               return NULL;
+       if (e2->type != E_EQUAL && e2->type != E_UNEQUAL && e2->type != E_SYMBOL && e2->type != E_NOT)
+               return NULL;
+       if (e1->type == E_NOT) {
+               tmp = e1->left.expr;
+               if (tmp->type != E_EQUAL && tmp->type != E_UNEQUAL && tmp->type != E_SYMBOL)
+                       return NULL;
+               sym1 = tmp->left.sym;
+       } else
+               sym1 = e1->left.sym;
+       if (e2->type == E_NOT) {
+               if (e2->left.expr->type != E_SYMBOL)
+                       return NULL;
+               sym2 = e2->left.expr->left.sym;
+       } else
+               sym2 = e2->left.sym;
+       if (sym1 != sym2)
+               return NULL;
+       if (sym1->type != S_BOOLEAN && sym1->type != S_TRISTATE)
+               return NULL;
+       if (sym1->type == S_TRISTATE) {
+               if (e1->type == E_EQUAL && e2->type == E_EQUAL &&
+                   ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) ||
+                    (e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes))) {
+                       // (a='y') || (a='m') -> (a!='n')
+                       return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_no);
+               }
+               if (e1->type == E_EQUAL && e2->type == E_EQUAL &&
+                   ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) ||
+                    (e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes))) {
+                       // (a='y') || (a='n') -> (a!='m')
+                       return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_mod);
+               }
+               if (e1->type == E_EQUAL && e2->type == E_EQUAL &&
+                   ((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) ||
+                    (e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod))) {
+                       // (a='m') || (a='n') -> (a!='y')
+                       return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_yes);
+               }
+       }
+       if (sym1->type == S_BOOLEAN && sym1 == sym2) {
+               if ((e1->type == E_NOT && e1->left.expr->type == E_SYMBOL && e2->type == E_SYMBOL) ||
+                   (e2->type == E_NOT && e2->left.expr->type == E_SYMBOL && e1->type == E_SYMBOL))
+                       return expr_alloc_symbol(&symbol_yes);
+       }
+
+       printf("optimize ");
+       print_expr(0, e1, 0);
+       printf(" || ");
+       print_expr(0, e2, 0);
+       printf(" ?\n");
+       return NULL;
+}
+
+struct expr *expr_join_and(struct expr *e1, struct expr *e2)
+{
+       struct expr *tmp;
+       struct symbol *sym1, *sym2;
+
+       if (expr_eq(e1, e2))
+               return expr_copy(e1);
+       if (e1->type != E_EQUAL && e1->type != E_UNEQUAL && e1->type != E_SYMBOL && e1->type != E_NOT)
+               return NULL;
+       if (e2->type != E_EQUAL && e2->type != E_UNEQUAL && e2->type != E_SYMBOL && e2->type != E_NOT)
+               return NULL;
+       if (e1->type == E_NOT) {
+               tmp = e1->left.expr;
+               if (tmp->type != E_EQUAL && tmp->type != E_UNEQUAL && tmp->type != E_SYMBOL)
+                       return NULL;
+               sym1 = tmp->left.sym;
+       } else
+               sym1 = e1->left.sym;
+       if (e2->type == E_NOT) {
+               if (e2->left.expr->type != E_SYMBOL)
+                       return NULL;
+               sym2 = e2->left.expr->left.sym;
+       } else
+               sym2 = e2->left.sym;
+       if (sym1 != sym2)
+               return NULL;
+       if (sym1->type != S_BOOLEAN && sym1->type != S_TRISTATE)
+               return NULL;
+
+       if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_yes) ||
+           (e2->type == E_SYMBOL && e1->type == E_EQUAL && e1->right.sym == &symbol_yes))
+               // (a) && (a='y') -> (a='y')
+               return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes);
+
+       if ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_no) ||
+           (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_no))
+               // (a) && (a!='n') -> (a)
+               return expr_alloc_symbol(sym1);
+
+       if (sym1->type == S_TRISTATE) {
+               if (e1->type == E_EQUAL && e2->type == E_UNEQUAL) {
+                       // (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b'
+                       sym2 = e1->right.sym;
+                       if ((e2->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST))
+                               return sym2 != e2->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2)
+                                                            : expr_alloc_symbol(&symbol_no);
+               }
+               if (e1->type == E_UNEQUAL && e2->type == E_EQUAL) {
+                       // (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b'
+                       sym2 = e2->right.sym;
+                       if ((e1->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST))
+                               return sym2 != e1->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2)
+                                                            : expr_alloc_symbol(&symbol_no);
+               }
+               if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL &&
+                          ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) ||
+                           (e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes)))
+                       // (a!='y') && (a!='n') -> (a='m')
+                       return expr_alloc_comp(E_EQUAL, sym1, &symbol_mod);
+
+               if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL &&
+                          ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) ||
+                           (e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes)))
+                       // (a!='y') && (a!='m') -> (a='n')
+                       return expr_alloc_comp(E_EQUAL, sym1, &symbol_no);
+
+               if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL &&
+                          ((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) ||
+                           (e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod)))
+                       // (a!='m') && (a!='n') -> (a='m')
+                       return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes);
+
+               if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_mod) ||
+                   (e2->type == E_SYMBOL && e1->type == E_EQUAL && e1->right.sym == &symbol_mod) ||
+                   (e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_yes) ||
+                   (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_yes))
+                       return NULL;
+       }
+       printf("optimize ");
+       print_expr(0, e1, 0);
+       printf(" && ");
+       print_expr(0, e2, 0);
+       printf(" ?\n");
+       return NULL;
+}
+
+static void expr_eliminate_dups1(enum expr_type type, struct expr **ep1, struct expr **ep2)
+{
+#define e1 (*ep1)
+#define e2 (*ep2)
+       struct expr *tmp;
+
+       if (e1->type == type) {
+               expr_eliminate_dups1(type, &e1->left.expr, &e2);
+               expr_eliminate_dups1(type, &e1->right.expr, &e2);
+               return;
+       }
+       if (e2->type == type) {
+               expr_eliminate_dups1(type, &e1, &e2->left.expr);
+               expr_eliminate_dups1(type, &e1, &e2->right.expr);
+               return;
+       }
+       if (e1 == e2)
+               return;
+
+       switch (e1->type) {
+       case E_OR: case E_AND:
+               expr_eliminate_dups1(e1->type, &e1, &e1);
+       default:
+               ;
+       }
+
+       switch (type) {
+       case E_OR:
+               tmp = expr_join_or(e1, e2);
+               if (tmp) {
+                       expr_free(e1); expr_free(e2);
+                       e1 = expr_alloc_symbol(&symbol_no);
+                       e2 = tmp;
+                       trans_count++;
+               }
+               break;
+       case E_AND:
+               tmp = expr_join_and(e1, e2);
+               if (tmp) {
+                       expr_free(e1); expr_free(e2);
+                       e1 = expr_alloc_symbol(&symbol_yes);
+                       e2 = tmp;
+                       trans_count++;
+               }
+               break;
+       default:
+               ;
+       }
+#undef e1
+#undef e2
+}
+
+static void expr_eliminate_dups2(enum expr_type type, struct expr **ep1, struct expr **ep2)
+{
+#define e1 (*ep1)
+#define e2 (*ep2)
+       struct expr *tmp, *tmp1, *tmp2;
+
+       if (e1->type == type) {
+               expr_eliminate_dups2(type, &e1->left.expr, &e2);
+               expr_eliminate_dups2(type, &e1->right.expr, &e2);
+               return;
+       }
+       if (e2->type == type) {
+               expr_eliminate_dups2(type, &e1, &e2->left.expr);
+               expr_eliminate_dups2(type, &e1, &e2->right.expr);
+       }
+       if (e1 == e2)
+               return;
+
+       switch (e1->type) {
+       case E_OR:
+               expr_eliminate_dups2(e1->type, &e1, &e1);
+               // (FOO || BAR) && (!FOO && !BAR) -> n
+               tmp1 = expr_transform(expr_alloc_one(E_NOT, expr_copy(e1)));
+               tmp2 = expr_copy(e2);
+               tmp = expr_extract_eq_and(&tmp1, &tmp2);
+               if (expr_is_yes(tmp1)) {
+                       expr_free(e1);
+                       e1 = expr_alloc_symbol(&symbol_no);
+                       trans_count++;
+               }
+               expr_free(tmp2);
+               expr_free(tmp1);
+               expr_free(tmp);
+               break;
+       case E_AND:
+               expr_eliminate_dups2(e1->type, &e1, &e1);
+               // (FOO && BAR) || (!FOO || !BAR) -> y
+               tmp1 = expr_transform(expr_alloc_one(E_NOT, expr_copy(e1)));
+               tmp2 = expr_copy(e2);
+               tmp = expr_extract_eq_or(&tmp1, &tmp2);
+               if (expr_is_no(tmp1)) {
+                       expr_free(e1);
+                       e1 = expr_alloc_symbol(&symbol_yes);
+                       trans_count++;
+               }
+               expr_free(tmp2);
+               expr_free(tmp1);
+               expr_free(tmp);
+               break;
+       default:
+               ;
+       }
+#undef e1
+#undef e2
+}
+
+struct expr *expr_eliminate_dups(struct expr *e)
+{
+       int oldcount;
+       if (!e)
+               return e;
+
+       oldcount = trans_count;
+       while (1) {
+               trans_count = 0;
+               switch (e->type) {
+               case E_OR: case E_AND:
+                       expr_eliminate_dups1(e->type, &e, &e);
+                       expr_eliminate_dups2(e->type, &e, &e);
+               default:
+                       ;
+               }
+               if (!trans_count)
+                       break;
+               e = expr_eliminate_yn(e);
+       }
+       trans_count = oldcount;
+       return e;
+}
+
+struct expr *expr_transform(struct expr *e)
+{
+       struct expr *tmp;
+
+       if (!e)
+               return NULL;
+       switch (e->type) {
+       case E_EQUAL:
+       case E_UNEQUAL:
+       case E_SYMBOL:
+       case E_CHOICE:
+               break;
+       default:
+               e->left.expr = expr_transform(e->left.expr);
+               e->right.expr = expr_transform(e->right.expr);
+       }
+
+       switch (e->type) {
+       case E_EQUAL:
+               if (e->left.sym->type != S_BOOLEAN)
+                       break;
+               if (e->right.sym == &symbol_no) {
+                       e->type = E_NOT;
+                       e->left.expr = expr_alloc_symbol(e->left.sym);
+                       e->right.sym = NULL;
+                       break;
+               }
+               if (e->right.sym == &symbol_mod) {
+                       printf("boolean symbol %s tested for 'm'? test forced to 'n'\n", e->left.sym->name);
+                       e->type = E_SYMBOL;
+                       e->left.sym = &symbol_no;
+                       e->right.sym = NULL;
+                       break;
+               }
+               if (e->right.sym == &symbol_yes) {
+                       e->type = E_SYMBOL;
+                       e->right.sym = NULL;
+                       break;
+               }
+               break;
+       case E_UNEQUAL:
+               if (e->left.sym->type != S_BOOLEAN)
+                       break;
+               if (e->right.sym == &symbol_no) {
+                       e->type = E_SYMBOL;
+                       e->right.sym = NULL;
+                       break;
+               }
+               if (e->right.sym == &symbol_mod) {
+                       printf("boolean symbol %s tested for 'm'? test forced to 'y'\n", e->left.sym->name);
+                       e->type = E_SYMBOL;
+                       e->left.sym = &symbol_yes;
+                       e->right.sym = NULL;
+                       break;
+               }
+               if (e->right.sym == &symbol_yes) {
+                       e->type = E_NOT;
+                       e->left.expr = expr_alloc_symbol(e->left.sym);
+                       e->right.sym = NULL;
+                       break;
+               }
+               break;
+       case E_NOT:
+               switch (e->left.expr->type) {
+               case E_NOT:
+                       // !!a -> a
+                       tmp = e->left.expr->left.expr;
+                       free(e->left.expr);
+                       free(e);
+                       e = tmp;
+                       e = expr_transform(e);
+                       break;
+               case E_EQUAL:
+               case E_UNEQUAL:
+                       // !a='x' -> a!='x'
+                       tmp = e->left.expr;
+                       free(e);
+                       e = tmp;
+                       e->type = e->type == E_EQUAL ? E_UNEQUAL : E_EQUAL;
+                       break;
+               case E_OR:
+                       // !(a || b) -> !a && !b
+                       tmp = e->left.expr;
+                       e->type = E_AND;
+                       e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr);
+                       tmp->type = E_NOT;
+                       tmp->right.expr = NULL;
+                       e = expr_transform(e);
+                       break;
+               case E_AND:
+                       // !(a && b) -> !a || !b
+                       tmp = e->left.expr;
+                       e->type = E_OR;
+                       e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr);
+                       tmp->type = E_NOT;
+                       tmp->right.expr = NULL;
+                       e = expr_transform(e);
+                       break;
+               case E_SYMBOL:
+                       if (e->left.expr->left.sym == &symbol_yes) {
+                               // !'y' -> 'n'
+                               tmp = e->left.expr;
+                               free(e);
+                               e = tmp;
+                               e->type = E_SYMBOL;
+                               e->left.sym = &symbol_no;
+                               break;
+                       }
+                       if (e->left.expr->left.sym == &symbol_mod) {
+                               // !'m' -> 'm'
+                               tmp = e->left.expr;
+                               free(e);
+                               e = tmp;
+                               e->type = E_SYMBOL;
+                               e->left.sym = &symbol_mod;
+                               break;
+                       }
+                       if (e->left.expr->left.sym == &symbol_no) {
+                               // !'n' -> 'y'
+                               tmp = e->left.expr;
+                               free(e);
+                               e = tmp;
+                               e->type = E_SYMBOL;
+                               e->left.sym = &symbol_yes;
+                               break;
+                       }
+                       break;
+               default:
+                       ;
+               }
+               break;
+       default:
+               ;
+       }
+       return e;
+}
+
+int expr_contains_symbol(struct expr *dep, struct symbol *sym)
+{
+       if (!dep)
+               return 0;
+
+       switch (dep->type) {
+       case E_AND:
+       case E_OR:
+               return expr_contains_symbol(dep->left.expr, sym) ||
+                      expr_contains_symbol(dep->right.expr, sym);
+       case E_SYMBOL:
+               return dep->left.sym == sym;
+       case E_EQUAL:
+       case E_UNEQUAL:
+               return dep->left.sym == sym ||
+                      dep->right.sym == sym;
+       case E_NOT:
+               return expr_contains_symbol(dep->left.expr, sym);
+       default:
+               ;
+       }
+       return 0;
+}
+
+bool expr_depends_symbol(struct expr *dep, struct symbol *sym)
+{
+       if (!dep)
+               return false;
+
+       switch (dep->type) {
+       case E_AND:
+               return expr_depends_symbol(dep->left.expr, sym) ||
+                      expr_depends_symbol(dep->right.expr, sym);
+       case E_SYMBOL:
+               return dep->left.sym == sym;
+       case E_EQUAL:
+               if (dep->left.sym == sym) {
+                       if (dep->right.sym == &symbol_yes || dep->right.sym == &symbol_mod)
+                               return true;
+               }
+               break;
+       case E_UNEQUAL:
+               if (dep->left.sym == sym) {
+                       if (dep->right.sym == &symbol_no)
+                               return true;
+               }
+               break;
+       default:
+               ;
+       }
+       return false;
+}
+
+struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2)
+{
+       struct expr *tmp = NULL;
+       expr_extract_eq(E_AND, &tmp, ep1, ep2);
+       if (tmp) {
+               *ep1 = expr_eliminate_yn(*ep1);
+               *ep2 = expr_eliminate_yn(*ep2);
+       }
+       return tmp;
+}
+
+struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2)
+{
+       struct expr *tmp = NULL;
+       expr_extract_eq(E_OR, &tmp, ep1, ep2);
+       if (tmp) {
+               *ep1 = expr_eliminate_yn(*ep1);
+               *ep2 = expr_eliminate_yn(*ep2);
+       }
+       return tmp;
+}
+
+void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2)
+{
+#define e1 (*ep1)
+#define e2 (*ep2)
+       if (e1->type == type) {
+               expr_extract_eq(type, ep, &e1->left.expr, &e2);
+               expr_extract_eq(type, ep, &e1->right.expr, &e2);
+               return;
+       }
+       if (e2->type == type) {
+               expr_extract_eq(type, ep, ep1, &e2->left.expr);
+               expr_extract_eq(type, ep, ep1, &e2->right.expr);
+               return;
+       }
+       if (expr_eq(e1, e2)) {
+               *ep = *ep ? expr_alloc_two(type, *ep, e1) : e1;
+               expr_free(e2);
+               if (type == E_AND) {
+                       e1 = expr_alloc_symbol(&symbol_yes);
+                       e2 = expr_alloc_symbol(&symbol_yes);
+               } else if (type == E_OR) {
+                       e1 = expr_alloc_symbol(&symbol_no);
+                       e2 = expr_alloc_symbol(&symbol_no);
+               }
+       }
+#undef e1
+#undef e2
+}
+
+struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym)
+{
+       struct expr *e1, *e2;
+
+       if (!e) {
+               e = expr_alloc_symbol(sym);
+               if (type == E_UNEQUAL)
+                       e = expr_alloc_one(E_NOT, e);
+               return e;
+       }
+       switch (e->type) {
+       case E_AND:
+               e1 = expr_trans_compare(e->left.expr, E_EQUAL, sym);
+               e2 = expr_trans_compare(e->right.expr, E_EQUAL, sym);
+               if (sym == &symbol_yes)
+                       e = expr_alloc_two(E_AND, e1, e2);
+               if (sym == &symbol_no)
+                       e = expr_alloc_two(E_OR, e1, e2);
+               if (type == E_UNEQUAL)
+                       e = expr_alloc_one(E_NOT, e);
+               return e;
+       case E_OR:
+               e1 = expr_trans_compare(e->left.expr, E_EQUAL, sym);
+               e2 = expr_trans_compare(e->right.expr, E_EQUAL, sym);
+               if (sym == &symbol_yes)
+                       e = expr_alloc_two(E_OR, e1, e2);
+               if (sym == &symbol_no)
+                       e = expr_alloc_two(E_AND, e1, e2);
+               if (type == E_UNEQUAL)
+                       e = expr_alloc_one(E_NOT, e);
+               return e;
+       case E_NOT:
+               return expr_trans_compare(e->left.expr, type == E_EQUAL ? E_UNEQUAL : E_EQUAL, sym);
+       case E_UNEQUAL:
+       case E_EQUAL:
+               if (type == E_EQUAL) {
+                       if (sym == &symbol_yes)
+                               return expr_copy(e);
+                       if (sym == &symbol_mod)
+                               return expr_alloc_symbol(&symbol_no);
+                       if (sym == &symbol_no)
+                               return expr_alloc_one(E_NOT, expr_copy(e));
+               } else {
+                       if (sym == &symbol_yes)
+                               return expr_alloc_one(E_NOT, expr_copy(e));
+                       if (sym == &symbol_mod)
+                               return expr_alloc_symbol(&symbol_yes);
+                       if (sym == &symbol_no)
+                               return expr_copy(e);
+               }
+               break;
+       case E_SYMBOL:
+               return expr_alloc_comp(type, e->left.sym, sym);
+       case E_CHOICE:
+       case E_NONE:
+               /* panic */;
+       }
+       return NULL;
+}
+
+tristate expr_calc_value(struct expr *e)
+{
+       tristate val1, val2;
+       const char *str1, *str2;
+
+       if (!e)
+               return yes;
+
+       switch (e->type) {
+       case E_SYMBOL:
+               sym_calc_value(e->left.sym);
+               return S_TRI(e->left.sym->curr);
+       case E_AND:
+               val1 = expr_calc_value(e->left.expr);
+               val2 = expr_calc_value(e->right.expr);
+               return E_AND(val1, val2);
+       case E_OR:
+               val1 = expr_calc_value(e->left.expr);
+               val2 = expr_calc_value(e->right.expr);
+               return E_OR(val1, val2);
+       case E_NOT:
+               val1 = expr_calc_value(e->left.expr);
+               return E_NOT(val1);
+       case E_EQUAL:
+               sym_calc_value(e->left.sym);
+               sym_calc_value(e->right.sym);
+               str1 = sym_get_string_value(e->left.sym);
+               str2 = sym_get_string_value(e->right.sym);
+               return !strcmp(str1, str2) ? yes : no;
+       case E_UNEQUAL:
+               sym_calc_value(e->left.sym);
+               sym_calc_value(e->right.sym);
+               str1 = sym_get_string_value(e->left.sym);
+               str2 = sym_get_string_value(e->right.sym);
+               return !strcmp(str1, str2) ? no : yes;
+       default:
+               printf("expr_calc_value: %d?\n", e->type);
+               return no;
+       }
+}
+
+int expr_compare_type(enum expr_type t1, enum expr_type t2)
+{
+#if 0
+       return 1;
+#else
+       if (t1 == t2)
+               return 0;
+       switch (t1) {
+       case E_EQUAL:
+       case E_UNEQUAL:
+               if (t2 == E_NOT)
+                       return 1;
+       case E_NOT:
+               if (t2 == E_AND)
+                       return 1;
+       case E_AND:
+               if (t2 == E_OR)
+                       return 1;
+       case E_OR:
+               if (t2 == E_CHOICE)
+                       return 1;
+       case E_CHOICE:
+               if (t2 == 0)
+                       return 1;
+       default:
+               return -1;
+       }
+       printf("[%dgt%d?]", t1, t2);
+       return 0;
+#endif
+}
+
+void expr_print(struct expr *e, void (*fn)(void *, const char *), void *data, int prevtoken)
+{
+       if (!e) {
+               fn(data, "y");
+               return;
+       }
+
+       if (expr_compare_type(prevtoken, e->type) > 0)
+               fn(data, "(");
+       switch (e->type) {
+       case E_SYMBOL:
+               if (e->left.sym->name)
+                       fn(data, e->left.sym->name);
+               else
+                       fn(data, "<choice>");
+               break;
+       case E_NOT:
+               fn(data, "!");
+               expr_print(e->left.expr, fn, data, E_NOT);
+               break;
+       case E_EQUAL:
+               fn(data, e->left.sym->name);
+               fn(data, "=");
+               fn(data, e->right.sym->name);
+               break;
+       case E_UNEQUAL:
+               fn(data, e->left.sym->name);
+               fn(data, "!=");
+               fn(data, e->right.sym->name);
+               break;
+       case E_OR:
+               expr_print(e->left.expr, fn, data, E_OR);
+               fn(data, " || ");
+               expr_print(e->right.expr, fn, data, E_OR);
+               break;
+       case E_AND:
+               expr_print(e->left.expr, fn, data, E_AND);
+               fn(data, " && ");
+               expr_print(e->right.expr, fn, data, E_AND);
+               break;
+       case E_CHOICE:
+               if (e->left.expr) {
+                       expr_print(e->left.expr, fn, data, E_CHOICE);
+                       fn(data, " ^ ");
+               }
+               fn(data, e->right.sym->name);
+               break;
+       default:
+         {
+               char buf[32];
+               sprintf(buf, "<unknown type %d>", e->type);
+               fn(data, buf);
+               break;
+         }
+       }
+       if (expr_compare_type(prevtoken, e->type) > 0)
+               fn(data, ")");
+}
+
+static void expr_print_file_helper(void *data, const char *str)
+{
+       fwrite(str, strlen(str), 1, data);
+}
+
+void expr_fprint(struct expr *e, FILE *out)
+{
+       expr_print(e, expr_print_file_helper, out, E_NONE);
+}
+
+void print_expr(int mask, struct expr *e, int prevtoken)
+{
+       if (!(cdebug & mask))
+               return;
+       expr_fprint(e, stdout);
+}
+
diff --git a/scripts/config/expr.h b/scripts/config/expr.h
new file mode 100644 (file)
index 0000000..e96d03b
--- /dev/null
@@ -0,0 +1,242 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#ifndef EXPR_H
+#define EXPR_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdio.h>
+#ifndef __cplusplus
+#include <stdbool.h>
+#endif
+
+struct file {
+       struct file *next;
+       struct file *parent;
+#ifdef CML1
+       struct statement *stmt;
+       struct statement *last_stmt;
+#endif
+       char *name;
+       int lineno;
+       int flags;
+};
+
+#define FILE_BUSY              0x0001
+#define FILE_SCANNED           0x0002
+#define FILE_PRINTED           0x0004
+
+typedef enum tristate {
+       no, mod, yes
+} tristate;
+
+enum expr_type {
+       E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_CHOICE, E_SYMBOL
+};
+
+union expr_data {
+       struct expr *expr;
+       struct symbol *sym;
+};
+
+struct expr {
+#ifdef CML1
+       int token;
+#else
+       enum expr_type type;
+#endif
+       union expr_data left, right;
+};
+
+#define E_TRI(ev)      ((ev).tri)
+#define E_EXPR(ev)     ((ev).expr)
+#define E_CALC(ev)     (E_TRI(ev) = expr_calc_value(E_EXPR(ev)))
+
+#define E_OR(dep1, dep2)       (((dep1)>(dep2))?(dep1):(dep2))
+#define E_AND(dep1, dep2)      (((dep1)<(dep2))?(dep1):(dep2))
+#define E_NOT(dep)             (2-(dep))
+
+struct expr_value {
+       struct expr *expr;
+       tristate tri;
+};
+
+#define S_VAL(sv)      ((sv).value)
+#define S_TRI(sv)      ((sv).tri)
+#define S_EQ(sv1, sv2) (S_VAL(sv1) == S_VAL(sv2) || !strcmp(S_VAL(sv1), S_VAL(sv2)))
+
+struct symbol_value {
+       void *value;
+       tristate tri;
+};
+
+enum symbol_type {
+       S_UNKNOWN, S_BOOLEAN, S_TRISTATE, S_INT, S_HEX, S_STRING, S_OTHER
+};
+
+struct symbol {
+       struct symbol *next;
+       char *name;
+       char *help;
+#ifdef CML1
+       int type;
+#else
+       enum symbol_type type;
+#endif
+       struct symbol_value curr, def;
+       tristate visible;
+       int flags;
+       struct property *prop;
+       struct expr *dep, *dep2;
+       struct menu *menu;
+};
+
+#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)
+
+#ifdef CML1
+#define SYMBOL_UNKNOWN         S_UNKNOWN
+#define SYMBOL_BOOLEAN         S_BOOLEAN
+#define SYMBOL_TRISTATE                S_TRISTATE
+#define SYMBOL_INT             S_INT
+#define SYMBOL_HEX             S_HEX
+#define SYMBOL_STRING          S_STRING
+#define SYMBOL_OTHER           S_OTHER
+#endif
+
+#define SYMBOL_YES             0x0001
+#define SYMBOL_MOD             0x0002
+#define SYMBOL_NO              0x0004
+#define SYMBOL_CONST           0x0007
+#define SYMBOL_CHECK           0x0008
+#define SYMBOL_CHOICE          0x0010
+#define SYMBOL_CHOICEVAL       0x0020
+#define SYMBOL_PRINTED         0x0040
+#define SYMBOL_VALID           0x0080
+#define SYMBOL_OPTIONAL                0x0100
+#define SYMBOL_WRITE           0x0200
+#define SYMBOL_CHANGED         0x0400
+#define SYMBOL_NEW             0x0800
+#define SYMBOL_AUTO            0x1000
+
+#define SYMBOL_MAXLENGTH       256
+#define SYMBOL_HASHSIZE                257
+#define SYMBOL_HASHMASK                0xff
+
+enum prop_type {
+       P_UNKNOWN, P_PROMPT, P_COMMENT, P_MENU, P_ROOTMENU, P_DEFAULT, P_CHOICE
+};
+
+struct property {
+       struct property *next;
+       struct symbol *sym;
+#ifdef CML1
+       int token;
+#else
+       enum prop_type type;
+#endif
+       const char *text;
+       struct symbol *def;
+       struct expr_value visible;
+       struct expr *dep;
+       struct expr *dep2;
+       struct menu *menu;
+       struct file *file;
+       int lineno;
+#ifdef CML1
+       struct property *next_pos;
+#endif
+};
+
+#define for_all_properties(sym, st, tok) \
+       for (st = sym->prop; st; st = st->next) \
+               if (st->type == (tok))
+#define for_all_prompts(sym, st) for_all_properties(sym, st, P_PROMPT)
+#define for_all_defaults(sym, st) for_all_properties(sym, st, P_DEFAULT)
+#define for_all_choices(sym, st) for_all_properties(sym, st, P_CHOICE)
+
+struct menu {
+       struct menu *next;
+       struct menu *parent;
+       struct menu *list;
+       struct symbol *sym;
+       struct property *prompt;
+       struct expr *dep;
+       //char *help;
+       struct file *file;
+       int lineno;
+       void *data;
+};
+
+#ifndef SWIG
+
+extern struct file *file_list;
+extern struct file *current_file;
+struct file *lookup_file(const char *name);
+
+extern struct symbol symbol_yes, symbol_no, symbol_mod;
+extern struct symbol *modules_sym;
+extern int cdebug;
+extern int print_type;
+struct expr *expr_alloc_symbol(struct symbol *sym);
+#ifdef CML1
+struct expr *expr_alloc_one(int token, struct expr *ce);
+struct expr *expr_alloc_two(int token, struct expr *e1, struct expr *e2);
+struct expr *expr_alloc_comp(int token, struct symbol *s1, struct symbol *s2);
+#else
+struct expr *expr_alloc_one(enum expr_type type, struct expr *ce);
+struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2);
+struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2);
+#endif
+struct expr *expr_alloc_and(struct expr *e1, struct expr *e2);
+struct expr *expr_copy(struct expr *org);
+void expr_free(struct expr *e);
+int expr_eq(struct expr *e1, struct expr *e2);
+void expr_eliminate_eq(struct expr **ep1, struct expr **ep2);
+tristate expr_calc_value(struct expr *e);
+struct expr *expr_eliminate_yn(struct expr *e);
+struct expr *expr_trans_bool(struct expr *e);
+struct expr *expr_eliminate_dups(struct expr *e);
+struct expr *expr_transform(struct expr *e);
+int expr_contains_symbol(struct expr *dep, struct symbol *sym);
+bool expr_depends_symbol(struct expr *dep, struct symbol *sym);
+struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2);
+struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2);
+void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2);
+struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym);
+
+void expr_fprint(struct expr *e, FILE *out);
+void print_expr(int mask, struct expr *e, int prevtoken);
+
+#ifdef CML1
+static inline int expr_is_yes(struct expr *e)
+{
+       return !e || (e->token == WORD && e->left.sym == &symbol_yes);
+}
+
+static inline int expr_is_no(struct expr *e)
+{
+       return e && (e->token == WORD && e->left.sym == &symbol_no);
+}
+#else
+static inline int expr_is_yes(struct expr *e)
+{
+       return !e || (e->type == E_SYMBOL && e->left.sym == &symbol_yes);
+}
+
+static inline int expr_is_no(struct expr *e)
+{
+       return e && (e->type == E_SYMBOL && e->left.sym == &symbol_no);
+}
+#endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* EXPR_H */
diff --git a/scripts/config/lex.zconf.c_shipped b/scripts/config/lex.zconf.c_shipped
new file mode 100644 (file)
index 0000000..df10281
--- /dev/null
@@ -0,0 +1,3280 @@
+#define yy_create_buffer zconf_create_buffer
+#define yy_delete_buffer zconf_delete_buffer
+#define yy_scan_buffer zconf_scan_buffer
+#define yy_scan_string zconf_scan_string
+#define yy_scan_bytes zconf_scan_bytes
+#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 yyout zconfout
+#define yyrestart zconfrestart
+#define yytext zconftext
+
+/* A lexical scanner generated by flex */
+
+/* Scanner skeleton version:
+ * $Header: /var/cvs/busybox/scripts/config/lex.zconf.c_shipped,v 1.1 2002/12/05 08:41:07 andersen Exp $
+ */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+
+#include <stdio.h>
+#include <errno.h>
+
+/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
+#ifdef c_plusplus
+#ifndef __cplusplus
+#define __cplusplus
+#endif
+#endif
+
+
+#ifdef __cplusplus
+
+#include <stdlib.h>
+#ifndef _WIN32
+#include <unistd.h>
+#endif
+
+/* Use prototypes in function declarations. */
+#define YY_USE_PROTOS
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else  /* ! __cplusplus */
+
+#if __STDC__
+
+#define YY_USE_PROTOS
+#define YY_USE_CONST
+
+#endif /* __STDC__ */
+#endif /* ! __cplusplus */
+
+#ifdef __TURBOC__
+ #pragma warn -rch
+ #pragma warn -use
+#include <io.h>
+#include <stdlib.h>
+#define YY_USE_CONST
+#define YY_USE_PROTOS
+#endif
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+
+#ifdef YY_USE_PROTOS
+#define YY_PROTO(proto) proto
+#else
+#define YY_PROTO(proto) ()
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index.  If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition.  This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN yy_start = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state.  The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START ((yy_start - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart( yyin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#define YY_BUF_SIZE 16384
+
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+
+extern int yyleng;
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+/* The funky do-while in the following #define is used to turn the definition
+ * int a single C statement (which needs a semi-colon terminator).  This
+ * avoids problems with code like:
+ *
+ *     if ( condition_holds )
+ *             yyless( 5 );
+ *     else
+ *             do_something_else();
+ *
+ * Prior to using the do-while the compiler would get upset at the
+ * "else" because it interpreted the "if" statement as being all
+ * done when it reached the ';' after the yyless() call.
+ */
+
+/* Return all but the first 'n' matched characters back to the input stream. */
+
+#define yyless(n) \
+       do \
+               { \
+               /* Undo effects of setting up yytext. */ \
+               *yy_cp = yy_hold_char; \
+               YY_RESTORE_YY_MORE_OFFSET \
+               yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
+               YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+               } \
+       while ( 0 )
+
+#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).
+ */
+typedef unsigned int yy_size_t;
+
+
+struct yy_buffer_state
+       {
+       FILE *yy_input_file;
+
+       char *yy_ch_buf;                /* input buffer */
+       char *yy_buf_pos;               /* current position in input buffer */
+
+       /* Size of input buffer in bytes, not including room for EOB
+        * characters.
+        */
+       yy_size_t yy_buf_size;
+
+       /* Number of characters read into yy_ch_buf, not including EOB
+        * characters.
+        */
+       int yy_n_chars;
+
+       /* Whether we "own" the buffer - i.e., we know we created it,
+        * and can realloc() it to grow it, and should free() it to
+        * delete it.
+        */
+       int yy_is_our_buffer;
+
+       /* Whether this is an "interactive" input source; if so, and
+        * if we're using stdio for input, then we want to use getc()
+        * instead of fread(), to make sure we stop fetching input after
+        * each newline.
+        */
+       int yy_is_interactive;
+
+       /* Whether we're considered to be at the beginning of a line.
+        * If so, '^' rules will be active on the next match, otherwise
+        * not.
+        */
+       int yy_at_bol;
+
+       /* Whether to try to fill the input buffer when we reach the
+        * end of it.
+        */
+       int yy_fill_buffer;
+
+       int yy_buffer_status;
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+       /* When an EOF's been seen but there's still some text to process
+        * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+        * shouldn't try reading from the input source any more.  We might
+        * still have a bunch of tokens to match, though, because of
+        * possible backing-up.
+        *
+        * When we actually see the EOF, we change the status to "new"
+        * (via yyrestart()), so that the user can continue scanning by
+        * just pointing yyin at a new input file.
+        */
+#define YY_BUFFER_EOF_PENDING 2
+       };
+
+static YY_BUFFER_STATE yy_current_buffer = 0;
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ */
+#define YY_CURRENT_BUFFER yy_current_buffer
+
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+
+static int yy_n_chars;         /* number of characters read into yy_ch_buf */
+
+
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 1;                /* whether we need to initialize */
+static int yy_start = 0;       /* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin.  A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void yyrestart YY_PROTO(( FILE *input_file ));
+
+void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
+void yy_load_buffer_state YY_PROTO(( void ));
+YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
+void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
+void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
+
+YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
+YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
+YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
+
+static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
+static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));
+static void yy_flex_free YY_PROTO(( void * ));
+
+#define yy_new_buffer yy_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+       { \
+       if ( ! yy_current_buffer ) \
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+       yy_current_buffer->yy_is_interactive = is_interactive; \
+       }
+
+#define yy_set_bol(at_bol) \
+       { \
+       if ( ! yy_current_buffer ) \
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+       yy_current_buffer->yy_at_bol = at_bol; \
+       }
+
+#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
+
+
+#define yywrap() 1
+#define YY_SKIP_YYWRAP
+typedef unsigned char YY_CHAR;
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+typedef int yy_state_type;
+extern char *yytext;
+#define yytext_ptr yytext
+static yyconst short yy_nxt[][37] =
+    {
+    {
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0
+    },
+
+    {
+       11,   12,   13,   14,   12,   12,   15,   12,   12,   12,
+       12,   12,   12,   12,   12,   12,   12,   12,   12,   12,
+       12,   12,   12,   12,   12,   12,   12,   12,   12,   12,
+       12,   12,   12,   12,   12,   12,   12
+    },
+
+    {
+       11,   12,   13,   14,   12,   12,   15,   12,   12,   12,
+       12,   12,   12,   12,   12,   12,   12,   12,   12,   12,
+
+       12,   12,   12,   12,   12,   12,   12,   12,   12,   12,
+       12,   12,   12,   12,   12,   12,   12
+    },
+
+    {
+       11,   16,   16,   17,   16,   16,   16,   16,   16,   16,
+       16,   16,   16,   18,   16,   16,   18,   19,   20,   21,
+       22,   18,   18,   23,   24,   18,   25,   18,   26,   27,
+       18,   28,   29,   30,   18,   18,   16
+    },
+
+    {
+       11,   16,   16,   17,   16,   16,   16,   16,   16,   16,
+       16,   16,   16,   18,   16,   16,   18,   19,   20,   21,
+       22,   18,   18,   23,   24,   18,   25,   18,   26,   27,
+       18,   28,   29,   30,   18,   18,   16
+
+    },
+
+    {
+       11,   31,   32,   33,   31,   31,   31,   31,   31,   31,
+       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
+       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
+       31,   31,   31,   31,   31,   31,   31
+    },
+
+    {
+       11,   31,   32,   33,   31,   31,   31,   31,   31,   31,
+       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
+       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
+       31,   31,   31,   31,   31,   31,   31
+    },
+
+    {
+       11,   34,   34,   35,   34,   36,   34,   34,   36,   34,
+       34,   34,   34,   34,   34,   37,   34,   34,   34,   34,
+
+       34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
+       34,   34,   34,   34,   34,   34,   34
+    },
+
+    {
+       11,   34,   34,   35,   34,   36,   34,   34,   36,   34,
+       34,   34,   34,   34,   34,   37,   34,   34,   34,   34,
+       34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
+       34,   34,   34,   34,   34,   34,   34
+    },
+
+    {
+       11,   38,   38,   39,   40,   41,   38,   42,   41,   43,
+       44,   45,   46,   46,   47,   38,   46,   46,   46,   46,
+       46,   46,   46,   46,   48,   46,   46,   46,   49,   46,
+       46,   46,   46,   46,   46,   46,   50
+
+    },
+
+    {
+       11,   38,   38,   39,   40,   41,   38,   42,   41,   43,
+       44,   45,   46,   46,   47,   38,   46,   46,   46,   46,
+       46,   46,   46,   46,   48,   46,   46,   46,   49,   46,
+       46,   46,   46,   46,   46,   46,   50
+    },
+
+    {
+      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,
+      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,
+      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,
+      -11,  -11,  -11,  -11,  -11,  -11,  -11
+    },
+
+    {
+       11,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,
+      -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,
+
+      -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,
+      -12,  -12,  -12,  -12,  -12,  -12,  -12
+    },
+
+    {
+       11,  -13,   51,   52,  -13,  -13,   53,  -13,  -13,  -13,
+      -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,
+      -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,
+      -13,  -13,  -13,  -13,  -13,  -13,  -13
+    },
+
+    {
+       11,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,
+      -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,
+      -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,
+      -14,  -14,  -14,  -14,  -14,  -14,  -14
+
+    },
+
+    {
+       11,   54,   54,   55,   54,   54,   54,   54,   54,   54,
+       54,   54,   54,   54,   54,   54,   54,   54,   54,   54,
+       54,   54,   54,   54,   54,   54,   54,   54,   54,   54,
+       54,   54,   54,   54,   54,   54,   54
+    },
+
+    {
+       11,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,
+      -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,
+      -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,
+      -16,  -16,  -16,  -16,  -16,  -16,  -16
+    },
+
+    {
+       11,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,
+      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,
+
+      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,
+      -17,  -17,  -17,  -17,  -17,  -17,  -17
+    },
+
+    {
+       11,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,
+      -18,  -18,  -18,   56,  -18,  -18,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,  -18
+    },
+
+    {
+       11,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,
+      -19,  -19,  -19,   56,  -19,  -19,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   57,   56,
+       56,   56,   56,   56,   56,   56,  -19
+
+    },
+
+    {
+       11,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,
+      -20,  -20,  -20,   56,  -20,  -20,   56,   56,   56,   56,
+       56,   56,   56,   58,   56,   56,   56,   56,   59,   56,
+       56,   56,   56,   56,   56,   56,  -20
+    },
+
+    {
+       11,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,
+      -21,  -21,  -21,   56,  -21,  -21,   56,   56,   56,   56,
+       60,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,  -21
+    },
+
+    {
+       11,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,
+      -22,  -22,  -22,   56,  -22,  -22,   56,   56,   56,   56,
+
+       56,   56,   56,   56,   56,   56,   56,   61,   56,   56,
+       56,   56,   56,   56,   56,   56,  -22
+    },
+
+    {
+       11,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,
+      -23,  -23,  -23,   56,  -23,  -23,   56,   56,   56,   56,
+       62,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,  -23
+    },
+
+    {
+       11,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,
+      -24,  -24,  -24,   56,  -24,  -24,   56,   56,   56,   56,
+       56,   63,   56,   56,   56,   56,   56,   64,   56,   56,
+       56,   56,   56,   56,   56,   56,  -24
+
+    },
+
+    {
+       11,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,
+      -25,  -25,  -25,   56,  -25,  -25,   65,   56,   56,   56,
+       66,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,  -25
+    },
+
+    {
+       11,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,
+      -26,  -26,  -26,   56,  -26,  -26,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   67,
+       56,   56,   56,   56,   56,   56,  -26
+    },
+
+    {
+       11,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,
+      -27,  -27,  -27,   56,  -27,  -27,   56,   56,   56,   56,
+
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   68,   56,   56,   56,   56,  -27
+    },
+
+    {
+       11,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,
+      -28,  -28,  -28,   56,  -28,  -28,   56,   56,   56,   56,
+       69,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,  -28
+    },
+
+    {
+       11,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,
+      -29,  -29,  -29,   56,  -29,  -29,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   70,   56,
+       56,   56,   56,   71,   56,   56,  -29
+
+    },
+
+    {
+       11,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,
+      -30,  -30,  -30,   56,  -30,  -30,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   72,   56,   56,   56,   56,  -30
+    },
+
+    {
+       11,   73,   73,  -31,   73,   73,   73,   73,   73,   73,
+       73,   73,   73,   73,   73,   73,   73,   73,   73,   73,
+       73,   73,   73,   73,   73,   73,   73,   73,   73,   73,
+       73,   73,   73,   73,   73,   73,   73
+    },
+
+    {
+       11,  -32,   74,   75,  -32,  -32,  -32,  -32,  -32,  -32,
+      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,
+
+      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,
+      -32,  -32,  -32,  -32,  -32,  -32,  -32
+    },
+
+    {
+       11,   76,  -33,  -33,   76,   76,   76,   76,   76,   76,
+       76,   76,   76,   76,   76,   76,   76,   76,   76,   76,
+       76,   76,   76,   76,   76,   76,   76,   76,   76,   76,
+       76,   76,   76,   76,   76,   76,   76
+    },
+
+    {
+       11,   77,   77,   78,   77,  -34,   77,   77,  -34,   77,
+       77,   77,   77,   77,   77,  -34,   77,   77,   77,   77,
+       77,   77,   77,   77,   77,   77,   77,   77,   77,   77,
+       77,   77,   77,   77,   77,   77,   77
+
+    },
+
+    {
+       11,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,
+      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,
+      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,
+      -35,  -35,  -35,  -35,  -35,  -35,  -35
+    },
+
+    {
+       11,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,
+      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,
+      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,
+      -36,  -36,  -36,  -36,  -36,  -36,  -36
+    },
+
+    {
+       11,   79,   79,   80,   79,   79,   79,   79,   79,   79,
+       79,   79,   79,   79,   79,   79,   79,   79,   79,   79,
+
+       79,   79,   79,   79,   79,   79,   79,   79,   79,   79,
+       79,   79,   79,   79,   79,   79,   79
+    },
+
+    {
+       11,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,
+      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,
+      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,
+      -38,  -38,  -38,  -38,  -38,  -38,  -38
+    },
+
+    {
+       11,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,
+      -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,
+      -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,
+      -39,  -39,  -39,  -39,  -39,  -39,  -39
+
+    },
+
+    {
+       11,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,
+      -40,  -40,  -40,  -40,   81,  -40,  -40,  -40,  -40,  -40,
+      -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,
+      -40,  -40,  -40,  -40,  -40,  -40,  -40
+    },
+
+    {
+       11,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,
+      -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,
+      -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,
+      -41,  -41,  -41,  -41,  -41,  -41,  -41
+    },
+
+    {
+       11,  -42,  -42,  -42,  -42,  -42,  -42,   82,  -42,  -42,
+      -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,
+
+      -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,
+      -42,  -42,  -42,  -42,  -42,  -42,  -42
+    },
+
+    {
+       11,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,
+      -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,
+      -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,
+      -43,  -43,  -43,  -43,  -43,  -43,  -43
+    },
+
+    {
+       11,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,
+      -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,
+      -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,
+      -44,  -44,  -44,  -44,  -44,  -44,  -44
+
+    },
+
+    {
+       11,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,
+      -45,   83,   84,   84,  -45,  -45,   84,   84,   84,   84,
+       84,   84,   84,   84,   84,   84,   84,   84,   84,   84,
+       84,   84,   84,   84,   84,   84,  -45
+    },
+
+    {
+       11,  -46,  -46,  -46,  -46,  -46,  -46,  -46,  -46,  -46,
+      -46,   84,   84,   84,  -46,  -46,   84,   84,   84,   84,
+       84,   84,   84,   84,   84,   84,   84,   84,   84,   84,
+       84,   84,   84,   84,   84,   84,  -46
+    },
+
+    {
+       11,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,
+      -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,
+
+      -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,
+      -47,  -47,  -47,  -47,  -47,  -47,  -47
+    },
+
+    {
+       11,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,
+      -48,   84,   84,   84,  -48,  -48,   84,   84,   84,   84,
+       84,   85,   84,   84,   84,   84,   84,   84,   84,   84,
+       84,   84,   84,   84,   84,   84,  -48
+    },
+
+    {
+       11,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,
+      -49,   84,   84,   84,  -49,  -49,   84,   84,   84,   84,
+       84,   84,   84,   84,   84,   84,   84,   86,   84,   84,
+       84,   84,   84,   84,   84,   84,  -49
+
+    },
+
+    {
+       11,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,
+      -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,
+      -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,
+      -50,  -50,  -50,  -50,  -50,  -50,   87
+    },
+
+    {
+       11,  -51,   51,   52,  -51,  -51,   53,  -51,  -51,  -51,
+      -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,
+      -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,
+      -51,  -51,  -51,  -51,  -51,  -51,  -51
+    },
+
+    {
+       11,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,
+      -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,
+
+      -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,
+      -52,  -52,  -52,  -52,  -52,  -52,  -52
+    },
+
+    {
+       11,   54,   54,   55,   54,   54,   54,   54,   54,   54,
+       54,   54,   54,   54,   54,   54,   54,   54,   54,   54,
+       54,   54,   54,   54,   54,   54,   54,   54,   54,   54,
+       54,   54,   54,   54,   54,   54,   54
+    },
+
+    {
+       11,   54,   54,   55,   54,   54,   54,   54,   54,   54,
+       54,   54,   54,   54,   54,   54,   54,   54,   54,   54,
+       54,   54,   54,   54,   54,   54,   54,   54,   54,   54,
+       54,   54,   54,   54,   54,   54,   54
+
+    },
+
+    {
+       11,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,
+      -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,
+      -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,
+      -55,  -55,  -55,  -55,  -55,  -55,  -55
+    },
+
+    {
+       11,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,
+      -56,  -56,  -56,   56,  -56,  -56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,  -56
+    },
+
+    {
+       11,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,
+      -57,  -57,  -57,   56,  -57,  -57,   56,   56,   56,   56,
+
+       56,   56,   56,   56,   56,   56,   56,   56,   88,   56,
+       56,   56,   56,   56,   56,   56,  -57
+    },
+
+    {
+       11,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,
+      -58,  -58,  -58,   56,  -58,  -58,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   89,   56,
+       56,   56,   56,   56,   56,   56,  -58
+    },
+
+    {
+       11,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,
+      -59,  -59,  -59,   56,  -59,  -59,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   90,   91,   56,   56,
+       56,   56,   56,   56,   56,   56,  -59
+
+    },
+
+    {
+       11,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,
+      -60,  -60,  -60,   56,  -60,  -60,   56,   56,   56,   56,
+       56,   92,   56,   56,   56,   56,   56,   56,   56,   93,
+       56,   56,   56,   56,   56,   56,  -60
+    },
+
+    {
+       11,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,
+      -61,  -61,  -61,   56,  -61,  -61,   56,   56,   56,   94,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,  -61
+    },
+
+    {
+       11,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,
+      -62,  -62,  -62,   56,  -62,  -62,   56,   56,   56,   56,
+
+       56,   56,   56,   56,   56,   95,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   96,  -62
+    },
+
+    {
+       11,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,
+      -63,  -63,  -63,   56,  -63,  -63,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,  -63
+    },
+
+    {
+       11,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,
+      -64,  -64,  -64,   56,  -64,  -64,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   97,   56,   56,  -64
+
+    },
+
+    {
+       11,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,
+      -65,  -65,  -65,   56,  -65,  -65,   56,   56,   56,   56,
+       56,   56,   56,   56,   98,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,  -65
+    },
+
+    {
+       11,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,
+      -66,  -66,  -66,   56,  -66,  -66,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   99,   56,   56,
+       56,   56,   56,   56,   56,   56,  -66
+    },
+
+    {
+       11,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,
+      -67,  -67,  -67,   56,  -67,  -67,   56,   56,   56,   56,
+
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,  100,   56,   56,  -67
+    },
+
+    {
+       11,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,
+      -68,  -68,  -68,   56,  -68,  -68,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,  101,   56,
+       56,   56,   56,   56,   56,   56,  -68
+    },
+
+    {
+       11,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,
+      -69,  -69,  -69,   56,  -69,  -69,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+      102,   56,   56,   56,   56,   56,  -69
+
+    },
+
+    {
+       11,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,
+      -70,  -70,  -70,   56,  -70,  -70,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,  103,   56,  -70
+    },
+
+    {
+       11,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,
+      -71,  -71,  -71,   56,  -71,  -71,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,  104,   56,   56,   56,   56,  -71
+    },
+
+    {
+       11,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,
+      -72,  -72,  -72,   56,  -72,  -72,   56,   56,   56,   56,
+
+       56,   56,   56,   56,  105,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,  -72
+    },
+
+    {
+       11,   73,   73,  -73,   73,   73,   73,   73,   73,   73,
+       73,   73,   73,   73,   73,   73,   73,   73,   73,   73,
+       73,   73,   73,   73,   73,   73,   73,   73,   73,   73,
+       73,   73,   73,   73,   73,   73,   73
+    },
+
+    {
+       11,  -74,   74,   75,  -74,  -74,  -74,  -74,  -74,  -74,
+      -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,
+      -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,
+      -74,  -74,  -74,  -74,  -74,  -74,  -74
+
+    },
+
+    {
+       11,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,
+      -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,
+      -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,
+      -75,  -75,  -75,  -75,  -75,  -75,  -75
+    },
+
+    {
+       11,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,
+      -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,
+      -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,
+      -76,  -76,  -76,  -76,  -76,  -76,  -76
+    },
+
+    {
+       11,   77,   77,   78,   77,  -77,   77,   77,  -77,   77,
+       77,   77,   77,   77,   77,  -77,   77,   77,   77,   77,
+
+       77,   77,   77,   77,   77,   77,   77,   77,   77,   77,
+       77,   77,   77,   77,   77,   77,   77
+    },
+
+    {
+       11,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,
+      -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,
+      -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,
+      -78,  -78,  -78,  -78,  -78,  -78,  -78
+    },
+
+    {
+       11,  -79,  -79,   80,  -79,  -79,  -79,  -79,  -79,  -79,
+      -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,
+      -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,
+      -79,  -79,  -79,  -79,  -79,  -79,  -79
+
+    },
+
+    {
+       11,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,
+      -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,
+      -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,
+      -80,  -80,  -80,  -80,  -80,  -80,  -80
+    },
+
+    {
+       11,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,
+      -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,
+      -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,
+      -81,  -81,  -81,  -81,  -81,  -81,  -81
+    },
+
+    {
+       11,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,
+      -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,
+
+      -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,
+      -82,  -82,  -82,  -82,  -82,  -82,  -82
+    },
+
+    {
+       11,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,
+      -83,  106,   84,   84,  -83,  -83,   84,   84,   84,   84,
+       84,   84,   84,   84,   84,   84,   84,   84,   84,   84,
+       84,   84,   84,   84,   84,   84,  -83
+    },
+
+    {
+       11,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,
+      -84,   84,   84,   84,  -84,  -84,   84,   84,   84,   84,
+       84,   84,   84,   84,   84,   84,   84,   84,   84,   84,
+       84,   84,   84,   84,   84,   84,  -84
+
+    },
+
+    {
+       11,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,
+      -85,   84,   84,   84,  -85,  -85,   84,   84,   84,   84,
+       84,   84,   84,   84,   84,   84,   84,   84,   84,   84,
+       84,   84,   84,   84,   84,   84,  -85
+    },
+
+    {
+       11,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,
+      -86,   84,   84,   84,  -86,  -86,   84,   84,   84,   84,
+       84,   84,   84,   84,   84,   84,   84,   84,   84,   84,
+       84,   84,   84,   84,   84,   84,  -86
+    },
+
+    {
+       11,  -87,  -87,  -87,  -87,  -87,  -87,  -87,  -87,  -87,
+      -87,  -87,  -87,  -87,  -87,  -87,  -87,  -87,  -87,  -87,
+
+      -87,  -87,  -87,  -87,  -87,  -87,  -87,  -87,  -87,  -87,
+      -87,  -87,  -87,  -87,  -87,  -87,  -87
+    },
+
+    {
+       11,  -88,  -88,  -88,  -88,  -88,  -88,  -88,  -88,  -88,
+      -88,  -88,  -88,   56,  -88,  -88,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,  107,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,  -88
+    },
+
+    {
+       11,  -89,  -89,  -89,  -89,  -89,  -89,  -89,  -89,  -89,
+      -89,  -89,  -89,   56,  -89,  -89,   56,   56,   56,   56,
+       56,   56,   56,   56,  108,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,  -89
+
+    },
+
+    {
+       11,  -90,  -90,  -90,  -90,  -90,  -90,  -90,  -90,  -90,
+      -90,  -90,  -90,   56,  -90,  -90,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,  109,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,  -90
+    },
+
+    {
+       11,  -91,  -91,  -91,  -91,  -91,  -91,  -91,  -91,  -91,
+      -91,  -91,  -91,   56,  -91,  -91,   56,   56,   56,   56,
+       56,  110,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,  -91
+    },
+
+    {
+       11,  -92,  -92,  -92,  -92,  -92,  -92,  -92,  -92,  -92,
+      -92,  -92,  -92,   56,  -92,  -92,  111,   56,   56,   56,
+
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,  -92
+    },
+
+    {
+       11,  -93,  -93,  -93,  -93,  -93,  -93,  -93,  -93,  -93,
+      -93,  -93,  -93,   56,  -93,  -93,   56,   56,   56,   56,
+      112,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,  -93
+    },
+
+    {
+       11,  -94,  -94,  -94,  -94,  -94,  -94,  -94,  -94,  -94,
+      -94,  -94,  -94,   56,  -94,  -94,   56,   56,  113,   56,
+       56,   56,   56,   56,  114,   56,  115,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,  -94
+
+    },
+
+    {
+       11,  -95,  -95,  -95,  -95,  -95,  -95,  -95,  -95,  -95,
+      -95,  -95,  -95,   56,  -95,  -95,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,  116,
+       56,   56,   56,   56,   56,   56,  -95
+    },
+
+    {
+       11,  -96,  -96,  -96,  -96,  -96,  -96,  -96,  -96,  -96,
+      -96,  -96,  -96,   56,  -96,  -96,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,  -96
+    },
+
+    {
+       11,  -97,  -97,  -97,  -97,  -97,  -97,  -97,  -97,  -97,
+      -97,  -97,  -97,   56,  -97,  -97,   56,   56,   56,   56,
+
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,  -97
+    },
+
+    {
+       11,  -98,  -98,  -98,  -98,  -98,  -98,  -98,  -98,  -98,
+      -98,  -98,  -98,   56,  -98,  -98,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,  117,   56,   56,
+       56,   56,   56,   56,   56,   56,  -98
+    },
+
+    {
+       11,  -99,  -99,  -99,  -99,  -99,  -99,  -99,  -99,  -99,
+      -99,  -99,  -99,   56,  -99,  -99,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,  118,   56,  -99
+
+    },
+
+    {
+       11, -100, -100, -100, -100, -100, -100, -100, -100, -100,
+     -100, -100, -100,   56, -100, -100,   56,   56,   56,   56,
+       56,   56,   56,   56,  119,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56, -100
+    },
+
+    {
+       11, -101, -101, -101, -101, -101, -101, -101, -101, -101,
+     -101, -101, -101,   56, -101, -101,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,  120,   56,   56,   56,
+       56,   56,   56,   56,   56,   56, -101
+    },
+
+    {
+       11, -102, -102, -102, -102, -102, -102, -102, -102, -102,
+     -102, -102, -102,   56, -102, -102,   56,   56,   56,   56,
+
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,  121,   56, -102
+    },
+
+    {
+       11, -103, -103, -103, -103, -103, -103, -103, -103, -103,
+     -103, -103, -103,   56, -103, -103,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,  122,   56,   56,   56,   56, -103
+    },
+
+    {
+       11, -104, -104, -104, -104, -104, -104, -104, -104, -104,
+     -104, -104, -104,   56, -104, -104,   56,   56,   56,   56,
+       56,   56,   56,   56,  123,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56, -104
+
+    },
+
+    {
+       11, -105, -105, -105, -105, -105, -105, -105, -105, -105,
+     -105, -105, -105,   56, -105, -105,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,  124,   56,   56,   56, -105
+    },
+
+    {
+       11, -106, -106, -106, -106, -106, -106, -106, -106, -106,
+     -106,   84,   84,   84, -106, -106,   84,   84,   84,   84,
+       84,   84,   84,   84,   84,   84,   84,   84,   84,   84,
+       84,   84,   84,   84,   84,   84, -106
+    },
+
+    {
+       11, -107, -107, -107, -107, -107, -107, -107, -107, -107,
+     -107, -107, -107,   56, -107, -107,   56,   56,   56,   56,
+
+      125,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56, -107
+    },
+
+    {
+       11, -108, -108, -108, -108, -108, -108, -108, -108, -108,
+     -108, -108, -108,   56, -108, -108,   56,   56,  126,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56, -108
+    },
+
+    {
+       11, -109, -109, -109, -109, -109, -109, -109, -109, -109,
+     -109, -109, -109,   56, -109, -109,   56,   56,   56,   56,
+      127,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56, -109
+
+    },
+
+    {
+       11, -110, -110, -110, -110, -110, -110, -110, -110, -110,
+     -110, -110, -110,   56, -110, -110,   56,   56,   56,   56,
+       56,   56,   56,   56,  128,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56, -110
+    },
+
+    {
+       11, -111, -111, -111, -111, -111, -111, -111, -111, -111,
+     -111, -111, -111,   56, -111, -111,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,  129,   56, -111
+    },
+
+    {
+       11, -112, -112, -112, -112, -112, -112, -112, -112, -112,
+     -112, -112, -112,   56, -112, -112,   56,   56,   56,   56,
+
+       56,   56,   56,   56,   56,   56,   56,  130,   56,   56,
+       56,   56,   56,   56,   56,   56, -112
+    },
+
+    {
+       11, -113, -113, -113, -113, -113, -113, -113, -113, -113,
+     -113, -113, -113,   56, -113, -113,   56,   56,   56,   56,
+       56,   56,   56,  131,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56, -113
+    },
+
+    {
+       11, -114, -114, -114, -114, -114, -114, -114, -114, -114,
+     -114, -114, -114,   56, -114, -114,   56,   56,   56,   56,
+       56,  132,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56, -114
+
+    },
+
+    {
+       11, -115, -115, -115, -115, -115, -115, -115, -115, -115,
+     -115, -115, -115,   56, -115, -115,   56,   56,   56,   56,
+      133,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56, -115
+    },
+
+    {
+       11, -116, -116, -116, -116, -116, -116, -116, -116, -116,
+     -116, -116, -116,   56, -116, -116,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56, -116
+    },
+
+    {
+       11, -117, -117, -117, -117, -117, -117, -117, -117, -117,
+     -117, -117, -117,   56, -117, -117,   56,   56,   56,   56,