Initial revision
authorMike Baker <mbm@openwrt.org>
Sun, 16 Jan 2005 11:43:02 +0000 (11:43 +0000)
committerMike Baker <mbm@openwrt.org>
Sun, 16 Jan 2005 11:43:02 +0000 (11:43 +0000)
SVN-Revision: 197

280 files changed:
openwrt/.cvsignore [new file with mode: 0644]
openwrt/.defconfig [new file with mode: 0644]
openwrt/Config.in [new file with mode: 0644]
openwrt/Makefile [new file with mode: 0644]
openwrt/docs/README [new file with mode: 0644]
openwrt/docs/buildroot-documentation.html [new file with mode: 0644]
openwrt/docs/stylesheet.css [new file with mode: 0644]
openwrt/package/Config.in [new file with mode: 0644]
openwrt/package/Makefile.in [new file with mode: 0644]
openwrt/package/bridge/Config.in [new file with mode: 0644]
openwrt/package/bridge/Makefile.in [new file with mode: 0644]
openwrt/package/bridge/bridge.mk [new file with mode: 0644]
openwrt/package/bridge/bridge.patch [new file with mode: 0644]
openwrt/package/busybox/Config.in [new file with mode: 0644]
openwrt/package/busybox/Makefile.in [new file with mode: 0644]
openwrt/package/busybox/busybox.config [new file with mode: 0644]
openwrt/package/busybox/busybox.mk [new file with mode: 0644]
openwrt/package/config/.cvsignore [new file with mode: 0644]
openwrt/package/config/Config.in [new file with mode: 0644]
openwrt/package/config/Kconfig-language.txt [new file with mode: 0644]
openwrt/package/config/Makefile [new file with mode: 0644]
openwrt/package/config/Makefile.in [new file with mode: 0644]
openwrt/package/config/checklist.c [new file with mode: 0644]
openwrt/package/config/colors.h [new file with mode: 0644]
openwrt/package/config/conf.c [new file with mode: 0644]
openwrt/package/config/confdata.c [new file with mode: 0644]
openwrt/package/config/dialog.h [new file with mode: 0644]
openwrt/package/config/expr.c [new file with mode: 0644]
openwrt/package/config/expr.h [new file with mode: 0644]
openwrt/package/config/inputbox.c [new file with mode: 0644]
openwrt/package/config/lex.zconf.c_shipped [new file with mode: 0644]
openwrt/package/config/lkc.h [new file with mode: 0644]
openwrt/package/config/lkc_proto.h [new file with mode: 0644]
openwrt/package/config/mconf.c [new file with mode: 0644]
openwrt/package/config/menu.c [new file with mode: 0644]
openwrt/package/config/menubox.c [new file with mode: 0644]
openwrt/package/config/msgbox.c [new file with mode: 0644]
openwrt/package/config/symbol.c [new file with mode: 0644]
openwrt/package/config/textbox.c [new file with mode: 0644]
openwrt/package/config/util.c [new file with mode: 0644]
openwrt/package/config/yesno.c [new file with mode: 0644]
openwrt/package/config/zconf.l [new file with mode: 0644]
openwrt/package/config/zconf.tab.c_shipped [new file with mode: 0644]
openwrt/package/config/zconf.tab.h_shipped [new file with mode: 0644]
openwrt/package/config/zconf.y [new file with mode: 0644]
openwrt/package/dnsmasq/Config.in [new file with mode: 0644]
openwrt/package/dnsmasq/Makefile.in [new file with mode: 0644]
openwrt/package/dnsmasq/dnsmasq.mk [new file with mode: 0644]
openwrt/package/dnsmasq/dnsmasq1-100-bugfix.patch [new file with mode: 0644]
openwrt/package/dnsmasq/dnsmasq2-100-config.patch [new file with mode: 0644]
openwrt/package/dropbear_sshd/Config.in [new file with mode: 0644]
openwrt/package/dropbear_sshd/Makefile.in [new file with mode: 0644]
openwrt/package/dropbear_sshd/dropbear-init.patch [new file with mode: 0644]
openwrt/package/dropbear_sshd/dropbear_sshd.mk [new file with mode: 0644]
openwrt/package/iptables/Config.in [new file with mode: 0644]
openwrt/package/iptables/Makefile.in [new file with mode: 0644]
openwrt/package/iptables/iptables.mk [new file with mode: 0644]
openwrt/package/linux/Config.in [new file with mode: 0644]
openwrt/package/linux/Makefile.in [new file with mode: 0644]
openwrt/package/linux/kernel-patches/001-linux-2.4.patch.bz2 [new file with mode: 0644]
openwrt/package/linux/kernel-patches/003_kbuild_fixes.diff.bz2 [new file with mode: 0644]
openwrt/package/linux/kernel-patches/004_386_emu.diff.bz2 [new file with mode: 0644]
openwrt/package/linux/kernel-patches/005_modularize_vesafb.diff.bz2 [new file with mode: 0644]
openwrt/package/linux/kernel-patches/006_init_unshare.diff.bz2 [new file with mode: 0644]
openwrt/package/linux/kernel-patches/007-scsi_add_remove_single.bz2 [new file with mode: 0644]
openwrt/package/linux/kernel-patches/008-ieee1394-fix.bz2 [new file with mode: 0644]
openwrt/package/linux/kernel-patches/009-always-inline.bz2 [new file with mode: 0644]
openwrt/package/linux/kernel-patches/010-optimize-for-size.bz2 [new file with mode: 0644]
openwrt/package/linux/kernel-patches/012-x86-check_gcc.bz2 [new file with mode: 0644]
openwrt/package/linux/kernel-patches/015_cramfs_initrd.diff.bz2 [new file with mode: 0644]
openwrt/package/linux/kernel-patches/017-printk.bz2 [new file with mode: 0644]
openwrt/package/linux/kernel-patches/018-slab-loop-init.bz2 [new file with mode: 0644]
openwrt/package/linux/kernel-patches/041-changeloop.patch.bz2 [new file with mode: 0644]
openwrt/package/linux/kernel-patches/042-loopfixes.patch.bz2 [new file with mode: 0644]
openwrt/package/linux/kernel-patches/044-streaming_io.bz2 [new file with mode: 0644]
openwrt/package/linux/kernel-patches/062-silence-blk-queue.bz2 [new file with mode: 0644]
openwrt/package/linux/kernel-patches/063-silence.kbd.patch.bz2 [new file with mode: 0644]
openwrt/package/linux/kernel-patches/064-shutup-md.bz2 [new file with mode: 0644]
openwrt/package/linux/kernel-patches/067-squashfs2.patch.bz2 [new file with mode: 0644]
openwrt/package/linux/kernel-patches/076-nmap-freak.bz2 [new file with mode: 0644]
openwrt/package/linux/kernel-patches/077-orinoco-0.13e.bz2 [new file with mode: 0644]
openwrt/package/linux/kernel-patches/078-hostap.bz2 [new file with mode: 0644]
openwrt/package/linux/kernel-patches/079-jiffies64.bz2 [new file with mode: 0644]
openwrt/package/linux/kernel-patches/089-no-touch-makedep.bz2 [new file with mode: 0644]
openwrt/package/linux/kernel-patches/100_VERSION.bz2 [new file with mode: 0644]
openwrt/package/linux/linux.config [new file with mode: 0644]
openwrt/package/linux/linux.mk [new file with mode: 0644]
openwrt/package/sed/Config.in [new file with mode: 0644]
openwrt/package/sed/Makefile.in [new file with mode: 0644]
openwrt/package/sed/sed.mk [new file with mode: 0644]
openwrt/package/sed/sedcheck.sh [new file with mode: 0755]
openwrt/target/Config.in [new file with mode: 0644]
openwrt/target/Makefile.in [new file with mode: 0644]
openwrt/target/default/device_table.txt [new file with mode: 0644]
openwrt/target/default/skel.tar.gz [new file with mode: 0644]
openwrt/target/default/target_skeleton/etc/TZ [new file with mode: 0644]
openwrt/target/default/target_skeleton/etc/fstab [new file with mode: 0644]
openwrt/target/default/target_skeleton/etc/group [new file with mode: 0644]
openwrt/target/default/target_skeleton/etc/hostname [new file with mode: 0644]
openwrt/target/default/target_skeleton/etc/hosts [new file with mode: 0644]
openwrt/target/default/target_skeleton/etc/init.d/S20urandom [new file with mode: 0755]
openwrt/target/default/target_skeleton/etc/init.d/S40network [new file with mode: 0755]
openwrt/target/default/target_skeleton/etc/init.d/rcS [new file with mode: 0755]
openwrt/target/default/target_skeleton/etc/inittab [new file with mode: 0644]
openwrt/target/default/target_skeleton/etc/inputrc [new file with mode: 0644]
openwrt/target/default/target_skeleton/etc/issue [new file with mode: 0644]
openwrt/target/default/target_skeleton/etc/network/interfaces [new file with mode: 0644]
openwrt/target/default/target_skeleton/etc/passwd [new file with mode: 0644]
openwrt/target/default/target_skeleton/etc/profile [new file with mode: 0644]
openwrt/target/default/target_skeleton/etc/protocols [new file with mode: 0644]
openwrt/target/default/target_skeleton/etc/random-seed [new file with mode: 0644]
openwrt/target/default/target_skeleton/etc/resolv.conf [new file with mode: 0644]
openwrt/target/default/target_skeleton/etc/securetty [new file with mode: 0644]
openwrt/target/default/target_skeleton/etc/services [new file with mode: 0644]
openwrt/target/default/target_skeleton/etc/shadow [new file with mode: 0644]
openwrt/target/default/target_skeleton/root/.bash_history [new file with mode: 0644]
openwrt/target/default/target_skeleton/root/.bash_logout [new file with mode: 0644]
openwrt/target/default/target_skeleton/root/.bash_profile [new file with mode: 0644]
openwrt/target/default/target_skeleton/root/.bashrc [new file with mode: 0644]
openwrt/target/default/target_skeleton/usr/share/terminfo/a/ansi [new file with mode: 0644]
openwrt/target/default/target_skeleton/usr/share/terminfo/d/dumb [new file with mode: 0644]
openwrt/target/default/target_skeleton/usr/share/terminfo/l/linux [new file with mode: 0644]
openwrt/target/default/target_skeleton/usr/share/terminfo/r/rxvt [new file with mode: 0644]
openwrt/target/default/target_skeleton/usr/share/terminfo/s/screen [new file with mode: 0644]
openwrt/target/default/target_skeleton/usr/share/terminfo/s/screen-w [new file with mode: 0644]
openwrt/target/default/target_skeleton/usr/share/terminfo/s/sun [new file with mode: 0644]
openwrt/target/default/target_skeleton/usr/share/terminfo/v/vt100 [new file with mode: 0644]
openwrt/target/default/target_skeleton/usr/share/terminfo/v/vt220 [new file with mode: 0644]
openwrt/target/default/target_skeleton/usr/share/terminfo/v/vt52 [new file with mode: 0644]
openwrt/target/default/target_skeleton/usr/share/terminfo/x/xterm [new file with mode: 0644]
openwrt/target/default/target_skeleton/usr/share/terminfo/x/xterm-xfree86 [new file with mode: 0644]
openwrt/target/default/target_skeleton/usr/share/udhcpc/default.script [new file with mode: 0755]
openwrt/target/jffs2/Config.in [new file with mode: 0644]
openwrt/target/jffs2/Makefile.in [new file with mode: 0644]
openwrt/target/jffs2/jffs2root.mk [new file with mode: 0644]
openwrt/toolchain/Config.in [new file with mode: 0644]
openwrt/toolchain/Makefile.in [new file with mode: 0644]
openwrt/toolchain/binutils/2.14.90.0.6/001-debian.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.14.90.0.6/100-uclibc-conf.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.14.90.0.6/200-build_modules.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.14.90.0.6/210-cflags.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.14.90.0.7/001-debian.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.14.90.0.7/100-uclibc-conf.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.14.90.0.7/200-build_modules.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.14.90.0.7/210-cflags.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.14.90.0.7/600-arm-textrel.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.14.90.0.8/001-debian.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.14.90.0.8/100-uclibc-conf.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.14.90.0.8/600-arm-textrel.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.90.0.1.1/100-uclibc-conf.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.90.0.1.1/600-arm-textrel.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.90.0.1/100-uclibc-conf.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.90.0.1/600-arm-textrel.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.90.0.2/100-uclibc-conf.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.90.0.2/600-arm-textrel.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.90.0.3/100-uclibc-conf.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.90.0.3/210-cflags.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.90.0.3/500-branch-likely.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.90.0.3/600-arm-textrel.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.91.0.1/100-uclibc-conf.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.91.0.1/600-arm-textrel.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.91.0.2/100-uclibc-conf.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.91.0.2/500-branch-likely.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.91.0.2/600-arm-textrel.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.91.0.2/700-binutils-20040817-linkonce.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.91.0.2/701-binutils-dup-sections.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.91.0.2/702-binutils-skip-comments.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.92.0.2/100-uclibc-conf.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.92.0.2/300-001_ld_makefile_patch.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.92.0.2/300-006_better_file_error.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.92.0.2/300-012_check_ldrunpath_length.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.92.0.2/300-117_mips_symbolic_link.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.92.0.2/300-120_mips_xgot_multigot_workaround.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.92.0.2/600-arm-textrel.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.92.0.2/702-binutils-skip-comments.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.94.0.1/100-uclibc-conf.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.94.0.1/300-001_ld_makefile_patch.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.94.0.1/300-006_better_file_error.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.94.0.1/300-012_check_ldrunpath_length.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.94.0.1/300-120_mips_xgot_multigot_workaround.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.94.0.1/702-binutils-skip-comments.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.94.0.2/100-uclibc-conf.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.94.0.2/300-001_ld_makefile_patch.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.94.0.2/300-006_better_file_error.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.94.0.2/300-012_check_ldrunpath_length.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.94.0.2/300-120_mips_xgot_multigot_workaround.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15.94.0.2/702-binutils-skip-comments.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15/100-uclibc-conf.patch [new file with mode: 0644]
openwrt/toolchain/binutils/2.15/600-arm-textrel.patch [new file with mode: 0644]
openwrt/toolchain/binutils/Config.in [new file with mode: 0644]
openwrt/toolchain/binutils/Makefile.in [new file with mode: 0644]
openwrt/toolchain/binutils/binutils.mk [new file with mode: 0644]
openwrt/toolchain/ccache/Config.in [new file with mode: 0644]
openwrt/toolchain/ccache/Config.in.2 [new file with mode: 0644]
openwrt/toolchain/ccache/Makefile.in [new file with mode: 0644]
openwrt/toolchain/ccache/ccache.mk [new file with mode: 0644]
openwrt/toolchain/gcc/2.95/050-debian-subset.patch.bz2 [new file with mode: 0644]
openwrt/toolchain/gcc/2.95/100-uclibc-conf.patch [new file with mode: 0644]
openwrt/toolchain/gcc/2.95/STLport-4.5.3.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.3.3/100-uclibc-conf.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.3.3/110-uclibc-conf.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.3.3/120-softfloat.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.3.3/200-uclibc-locale.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.3.3/500-loop.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.3.4/100-uclibc-conf.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.3.4/110-uclibc-conf.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.3.4/120-softfloat.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.3.4/200-uclibc-locale.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.3.4/500-loop.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.3.4/specs-arm-soft-float [new file with mode: 0644]
openwrt/toolchain/gcc/3.3.4/specs-mips-soft-float [new file with mode: 0644]
openwrt/toolchain/gcc/3.3.4/specs-mipsel-soft-float [new file with mode: 0644]
openwrt/toolchain/gcc/3.3.4/specs-powerpc-soft-float [new file with mode: 0644]
openwrt/toolchain/gcc/3.3.5/100-uclibc-conf.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.3.5/110-uclibc-conf.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.3.5/120-softfloat.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.3.5/200-uclibc-locale.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.3.5/500-loop.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.3.5/specs-arm-soft-float [new file with mode: 0644]
openwrt/toolchain/gcc/3.3.5/specs-mips-soft-float [new file with mode: 0644]
openwrt/toolchain/gcc/3.3.5/specs-mipsel-soft-float [new file with mode: 0644]
openwrt/toolchain/gcc/3.3.5/specs-powerpc-soft-float [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.0/100-uclibc-conf.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.0/200-uclibc-locale.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.0/arm-softfloat.patch.conditional [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.1/100-uclibc-conf.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.1/200-uclibc-locale.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.1/400-mips-delay-slot.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.1/800-arm-bigendian.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.1/810-arm-bigendian-uclibc.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.1/arm-softfloat.patch.conditional [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.2/100-uclibc-conf.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.2/200-uclibc-locale.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.2/300-libstdc++-pic.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.2/300-pr15526.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.2/300-pr17541.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.2/300-pr17976.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.2/400-mips-pr17565.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.2/401-ppc-eabi-typo.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.2/402-mips-pr17770.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.2/600-gcc34-arm-ldm-peephole.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.2/601-gcc34-arm-ldm.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.2/602-sdk-libstdc++-includes.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.2/700-pr15068-fix.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.2/800-arm-bigendian.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.2/810-arm-bigendian-uclibc.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.2/arm-softfloat.patch.conditional [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.3/100-uclibc-conf.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.3/200-uclibc-locale.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.3/300-libstdc++-pic.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.3/600-gcc34-arm-ldm-peephole.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.3/601-gcc34-arm-ldm.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.3/602-sdk-libstdc++-includes.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.3/700-pr15068-fix.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.3/800-arm-bigendian.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.3/810-arm-bigendian-uclibc.patch [new file with mode: 0644]
openwrt/toolchain/gcc/3.4.3/arm-softfloat.patch.conditional [new file with mode: 0644]
openwrt/toolchain/gcc/Config.in [new file with mode: 0644]
openwrt/toolchain/gcc/Config.in.2 [new file with mode: 0644]
openwrt/toolchain/gcc/Makefile.in [new file with mode: 0644]
openwrt/toolchain/gcc/gcc-uclibc-2.95.mk [new file with mode: 0644]
openwrt/toolchain/gcc/gcc-uclibc-3.x.mk [new file with mode: 0644]
openwrt/toolchain/gcc/i386-gcc-soft-float.patch [new file with mode: 0644]
openwrt/toolchain/gdb/5.3/050-debian-subset.patch [new file with mode: 0644]
openwrt/toolchain/gdb/5.3/100-uclibc.patch [new file with mode: 0644]
openwrt/toolchain/gdb/6.1.1/100-uclibc-conf.patch [new file with mode: 0644]
openwrt/toolchain/gdb/6.1.1/200-uclibc-readline-conf.patch [new file with mode: 0644]
openwrt/toolchain/gdb/6.2.1/100-uclibc-conf.patch [new file with mode: 0644]
openwrt/toolchain/gdb/6.2.1/200-uclibc-readline-conf.patch [new file with mode: 0644]
openwrt/toolchain/gdb/6.2.1/400-mips-coredump.patch [new file with mode: 0644]
openwrt/toolchain/gdb/6.2/100-uclibc-conf.patch [new file with mode: 0644]
openwrt/toolchain/gdb/6.2/200-uclibc-readline-conf.patch [new file with mode: 0644]
openwrt/toolchain/gdb/Config.in [new file with mode: 0644]
openwrt/toolchain/gdb/Makefile.in [new file with mode: 0644]
openwrt/toolchain/gdb/gdb.mk [new file with mode: 0644]
openwrt/toolchain/patch-kernel.sh [new file with mode: 0755]
openwrt/toolchain/uClibc/Config.in [new file with mode: 0644]
openwrt/toolchain/uClibc/uClibc.config [new file with mode: 0644]
openwrt/toolchain/uClibc/uClibc.config-locale [new file with mode: 0644]
openwrt/toolchain/uClibc/uclibc.mk [new file with mode: 0644]

diff --git a/openwrt/.cvsignore b/openwrt/.cvsignore
new file mode 100644 (file)
index 0000000..60e1751
--- /dev/null
@@ -0,0 +1,6 @@
+dl
+.config*
+.tmpconfig.h
+root_fs*
+build_*
+toolchain_build_*
diff --git a/openwrt/.defconfig b/openwrt/.defconfig
new file mode 100644 (file)
index 0000000..aba64ee
--- /dev/null
@@ -0,0 +1,113 @@
+#
+# Automatically generated make config: don't edit
+#
+BR2_HAVE_DOT_CONFIG=y
+# BR2_arm is not set
+# BR2_armeb is not set
+# BR2_cris is not set
+# BR2_i386 is not set
+# BR2_m68k is not set
+# BR2_mips is not set
+BR2_mipsel=y
+# BR2_powerpc is not set
+# BR2_sh3 is not set
+# BR2_sh3eb is not set
+# BR2_sh4 is not set
+# BR2_sh4eb is not set
+# BR2_sparc is not set
+BR2_ARCH="mipsel"
+
+#
+# Build options
+#
+BR2_WGET="wget --passive-ftp"
+# BR2_TAR_VERBOSITY is not set
+BR2_STAGING_DIR="$(BUILD_DIR)/staging_dir"
+BR2_JLEVEL=1
+
+#
+# Toolchain Options
+#
+
+#
+# uClibc Options
+#
+BR2_UCLIBC_VERSION_SNAPSHOT=y
+BR2_USE_UCLIBC_SNAPSHOT="snapshot"
+# BR2_ENABLE_LOCALE is not set
+
+#
+# Binutils Options
+#
+# BR2_BINUTILS_VERSION_2_14_90_0_6 is not set
+# BR2_BINUTILS_VERSION_2_14_90_0_7 is not set
+# BR2_BINUTILS_VERSION_2_14_90_0_8 is not set
+# BR2_BINUTILS_VERSION_2_15 is not set
+# BR2_BINUTILS_VERSION_2_15_90_0_1 is not set
+# BR2_BINUTILS_VERSION_2_15_90_0_1_1 is not set
+# BR2_BINUTILS_VERSION_2_15_90_0_2 is not set
+# BR2_BINUTILS_VERSION_2_15_90_0_3 is not set
+# BR2_BINUTILS_VERSION_2_15_91_0_1 is not set
+# BR2_BINUTILS_VERSION_2_15_91_0_2 is not set
+# BR2_BINUTILS_VERSION_2_15_92_0_2 is not set
+# BR2_BINUTILS_VERSION_2_15_94_0_1 is not set
+BR2_BINUTILS_VERSION_2_15_94_0_2=y
+BR2_BINUTILS_VERSION="2.15.94.0.2"
+
+#
+# Gcc Options
+#
+# BR2_GCC_VERSION_2_95 is not set
+# BR2_GCC_VERSION_3_3_3 is not set
+# BR2_GCC_VERSION_3_3_4 is not set
+# BR2_GCC_VERSION_3_3_5 is not set
+# BR2_GCC_VERSION_3_4_0 is not set
+# BR2_GCC_VERSION_3_4_1 is not set
+# BR2_GCC_VERSION_3_4_2 is not set
+BR2_GCC_VERSION_3_4_3=y
+BR2_GCC_VERSION="3.4.3"
+BR2_GCC_USE_SJLJ_EXCEPTIONS="--enable-sjlj-exceptions"
+BR2_EXTRA_GCC_CONFIG_OPTIONS=""
+# BR2_INSTALL_LIBSTDCPP is not set
+
+#
+# Ccache Options
+#
+BR2_CCACHE=y
+
+#
+# Gdb Options
+#
+# BR2_PACKAGE_GDB is not set
+# BR2_PACKAGE_GDB_SERVER is not set
+
+#
+# Common Toolchain Options
+#
+# BR2_ENABLE_MULTILIB is not set
+# BR2_LARGEFILE is not set
+BR2_TARGET_OPTIMIZATION="-Os -pipe"
+
+#
+# OpenWrt Package Selection
+#
+
+#
+# The default set
+#
+BR2_PACKAGE_BUSYBOX=y
+BR2_PACKAGE_BUSYBOX_SNAPSHOT=y
+# BR2_PACKAGE_DNSMASQ is not set
+# BR2_PACKAGE_LINUX is not set
+# BR2_PACKAGE_IPTABLES is not set
+# BR2_PACKAGE_BRIDGE is not set
+
+#
+# Suggested Extras
+#
+# BR2_PACKAGE_DROPBEAR_SSHD is not set
+
+#
+# Target Filesystem
+#
+# BR2_TARGET_ROOTFS_JFFS2 is not set
diff --git a/openwrt/Config.in b/openwrt/Config.in
new file mode 100644 (file)
index 0000000..2b335e6
--- /dev/null
@@ -0,0 +1,109 @@
+#
+
+mainmenu "Buildroot2 Configuration"
+
+config BR2_HAVE_DOT_CONFIG
+       bool
+       default y
+
+choice
+       prompt "Target Architecture"
+       default BR2_i386
+       help
+         Stuff
+
+config BR2_arm
+       bool "arm"
+
+config BR2_armeb
+       bool "armeb"
+
+config BR2_cris
+       bool "cris"
+
+config BR2_i386
+       bool "i386"
+
+config BR2_m68k
+       bool "m68k"
+
+config BR2_mips
+       bool "mips"
+
+config BR2_mipsel
+       bool "mipsel"
+
+config BR2_powerpc
+       bool "powerpc"
+
+config BR2_sh3
+       bool "sh3"
+
+config BR2_sh3eb
+       bool "sh3eb"
+
+config BR2_sh4
+       bool "sh4"
+
+config BR2_sh4eb
+       bool "sh4eb"
+
+config BR2_sparc
+       bool "sparc"
+
+endchoice
+
+config BR2_ARCH
+       string
+       default "arm"     if BR2_arm
+       default "armeb"   if BR2_armeb
+       default "cris"    if BR2_cris
+       default "i386"    if BR2_i386
+       default "m68k"    if BR2_m68k
+       default "mips"    if BR2_mips
+       default "mipsel"  if BR2_mipsel
+       default "powerpc" if BR2_powerpc
+       default "sh3"     if BR2_sh3
+       default "sh3eb"   if BR2_sh3eb
+       default "sh4"     if BR2_sh4
+       default "sh4eb"   if BR2_sh4eb
+       default "sparc"   if BR2_sparc
+
+
+menu "Build options"
+
+config BR2_WGET
+       string "Wget command"
+       default "wget --passive-ftp -nd"
+
+config BR2_TAR_VERBOSITY
+       bool "Tar verbose"
+       default n
+
+config BR2_STAGING_DIR
+       string "Toolchain and header file location?"
+       default "$(BUILD_DIR)/staging_dir"
+       help
+           This is the location where the toolchain will be installed.
+           Since the toolchain will not work if it is moved from this
+           location, it is important for people wishing to package up
+           a uClibc toolchain that this be set to the location in which
+           the toolchain will be used.
+
+           Most people will leave this set to the default value of
+           "$(BUILD_DIR)/staging_dir".
+
+config BR2_JLEVEL
+       int "Number of jobs to run simultaneously"
+       default "1"
+       help
+           Number of jobs to run simultanesouly
+
+endmenu
+
+source "toolchain/Config.in"
+
+source "package/Config.in"
+
+source "target/Config.in"
+
diff --git a/openwrt/Makefile b/openwrt/Makefile
new file mode 100644 (file)
index 0000000..5434b0e
--- /dev/null
@@ -0,0 +1,191 @@
+# Makefile for buildroot2
+#
+# Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
+#--------------------------------------------------------------
+# Just run 'make menuconfig', configure stuff, then run 'make'.
+# You shouldn't need to mess with anything beyond this point...
+#--------------------------------------------------------------
+TOPDIR=./
+CONFIG_CONFIG_IN = Config.in
+CONFIG_DEFCONFIG = .defconfig
+CONFIG = package/config
+
+noconfig_targets := menuconfig config oldconfig randconfig \
+       defconfig allyesconfig allnoconfig release tags
+
+# Pull in the user's configuration file
+ifeq ($(filter $(noconfig_targets),$(MAKECMDGOALS)),)
+-include $(TOPDIR).config
+endif
+
+ifeq ($(BR2_TAR_VERBOSITY),y)
+TAR_OPTIONS=-xvf
+else
+TAR_OPTIONS=-xf
+endif
+
+ifeq ($(strip $(BR2_HAVE_DOT_CONFIG)),y)
+
+#############################################################
+#
+# The list of stuff to build for the target toolchain
+# along with the packages to build for the target.
+#
+##############################################################
+TARGETS:=linux-headers host-sed uclibc-configured binutils gcc uclibc-target-utils
+include toolchain/Makefile.in
+include toolchain/*/Makefile.in
+include package/Makefile.in
+include package/*/Makefile.in
+include target/Makefile.in
+include target/*/Makefile.in
+
+#############################################################
+#
+# You should probably leave this stuff alone unless you know
+# what you are doing.
+#
+#############################################################
+
+
+
+all:   world
+
+# In this section, we need .config
+include .config.cmd
+
+TARGETS_CLEAN:=$(patsubst %,%-clean,$(TARGETS))
+TARGETS_SOURCE:=$(patsubst %,%-source,$(TARGETS))
+
+world: $(DL_DIR) $(BUILD_DIR) $(STAGING_DIR) $(TARGET_DIR) $(TARGETS)
+
+.PHONY: all world clean distclean source $(TARGETS) \
+       $(TARGETS_CLEAN) $(TARGETS_DIRCLEAN) $(TARGETS_SOURCE) \
+       $(DL_DIR) $(BUILD_DIR) $(TOOL_BUILD_DIR) $(STAGING_DIR)
+
+include toolchain/*/*.mk
+include package/*/*.mk
+include target/*/*.mk
+
+#############################################################
+#
+# staging and target directories do NOT list these as
+# dependancies anywhere else
+#
+#############################################################
+$(DL_DIR):
+       @mkdir -p $(DL_DIR)
+
+$(BUILD_DIR):
+       @mkdir -p $(BUILD_DIR)
+
+$(TOOL_BUILD_DIR):
+       @mkdir -p $(TOOL_BUILD_DIR)
+
+$(STAGING_DIR):
+       @mkdir -p $(STAGING_DIR)/lib
+       @mkdir -p $(STAGING_DIR)/include
+       @mkdir -p $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)
+       @ln -sf ../lib $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib
+
+$(TARGET_DIR):
+       zcat target/default/skel.tar.gz | tar -C $(BUILD_DIR) -xf -
+       cp -a target/default/target_skeleton/* $(TARGET_DIR)/
+       -find $(TARGET_DIR) -type d -name CVS -exec rm -rf {} \; > /dev/null 2>&1
+
+source: $(TARGETS_SOURCE)
+
+#############################################################
+#
+# Cleanup and misc junk
+#
+#############################################################
+clean:
+       rm -rf $(BUILD_DIR) $(IMAGE).*
+       @$(MAKE) -C $(CONFIG) clean
+
+distclean: clean
+       rm -rf $(DL_DIR) $(TOOL_BUILD_DIR) .config
+
+sourceball:
+       rm -rf $(BUILD_DIR)
+       set -e; \
+       cd ..; \
+       rm -f buildroot.tar.bz2; \
+       tar -cvf buildroot.tar buildroot; \
+       bzip2 -9 buildroot.tar; \
+
+
+else # ifeq ($(strip $(BR2_HAVE_DOT_CONFIG)),y)
+
+all: menuconfig
+
+# configuration
+# ---------------------------------------------------------------------------
+
+$(CONFIG)/conf:
+       $(MAKE) -C $(CONFIG) conf
+       -@if [ ! -f .config ] ; then \
+               cp $(CONFIG_DEFCONFIG) .config; \
+       fi
+$(CONFIG)/mconf:
+       $(MAKE) -C $(CONFIG) ncurses conf mconf
+       -@if [ ! -f .config ] ; then \
+               cp $(CONFIG_DEFCONFIG) .config; \
+       fi
+
+menuconfig: $(CONFIG)/mconf
+       @$(CONFIG)/mconf $(CONFIG_CONFIG_IN)
+
+config: $(CONFIG)/conf
+       @$(CONFIG)/conf $(CONFIG_CONFIG_IN)
+
+oldconfig: $(CONFIG)/conf
+       @$(CONFIG)/conf -o $(CONFIG_CONFIG_IN)
+
+randconfig: $(CONFIG)/conf
+       @$(CONFIG)/conf -r $(CONFIG_CONFIG_IN)
+
+allyesconfig: $(CONFIG)/conf
+       #@$(CONFIG)/conf -y $(CONFIG_CONFIG_IN)
+       #sed -i -e "s/^CONFIG_DEBUG.*/# CONFIG_DEBUG is not set/" .config
+       @$(CONFIG)/conf -o $(CONFIG_CONFIG_IN)
+
+allnoconfig: $(CONFIG)/conf
+       @$(CONFIG)/conf -n $(CONFIG_CONFIG_IN)
+
+defconfig: $(CONFIG)/conf
+       @$(CONFIG)/conf -d $(CONFIG_CONFIG_IN)
+
+#############################################################
+#
+# Cleanup and misc junk
+#
+#############################################################
+clean:
+       @$(MAKE) -C $(CONFIG) clean
+
+distclean: clean
+
+endif # ifeq ($(strip $(BR2_HAVE_DOT_CONFIG)),y)
+
+.PHONY: dummy subdirs release distclean clean config oldconfig \
+       menuconfig tags check test depend
+
+
diff --git a/openwrt/docs/README b/openwrt/docs/README
new file mode 100644 (file)
index 0000000..0c7fb4c
--- /dev/null
@@ -0,0 +1,18 @@
+To build and use the buildroot stuff, do the following:
+
+1) run 'make'
+2) select which packages you wish to compile
+3) run 'make'
+4) wait while it compiles
+5) Use your shiney new root filesystem.  Depending on which sortof
+    root filesystem you selecter, you may want to loop mount it,
+    chroot into it, loop mount it and then nfs mount that on your
+    target device, burn it to flash, or whatever is appropriate
+    for your target system.
+
+You do not need to be root to build or run buildroot.  Have fun!
+
+ -Erik
+
+Please feed suggestions, bug reports, insults, and bribes back to:
+       Erik Andersen <andersen@codepoet.org>
diff --git a/openwrt/docs/buildroot-documentation.html b/openwrt/docs/buildroot-documentation.html
new file mode 100644 (file)
index 0000000..8e6c08d
--- /dev/null
@@ -0,0 +1,644 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+  <title>Buildroot - Usage and documentation</title>
+  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+  <link rel="stylesheet" type="text/css" href="stylesheet.css" />
+</head>
+
+<body>
+  <div class="main">
+    <div class="titre">
+      <h1>Buildroot</h1>
+    </div>
+
+    <p>Usage and documentation by Thomas Petazzoni. Contributions from
+    Karsten Kruse, Ned Ludd, Martin Herren.</p>
+
+    <p><small>Last modification : $Id$</small></p>
+
+    <ul>
+      <li><a href="#about">About Buildroot</a></li>
+      <li><a href="#download">Obtaining Buildroot</a></li>
+      <li><a href="#using">Using Buildroot</a></li>
+      <li><a href="#custom_targetfs">Customizing the target filesystem</a></li>
+      <li><a href="#custom_busybox">Customizing the Busybox
+      configuration</a></li>
+      <li><a href="#custom_uclibc">Customizing the uClibc
+      configuration</a></li>
+      <li><a href="#buildroot_innards">How Buildroot works</a></li>
+      <li><a href="#using_toolchain">Using the uClibc toolchain</a></li>
+      <li><a href="#toolchain_standalone">Using the uClibc toolchain
+      outside of Buildroot</a></li>
+      <li><a href="#downloaded_packages">Location of downloaded packages</a></li>
+      <li><a href="#add_software">Extending Buildroot with more
+      Software</a></li>
+      <li><a href="#links">Ressources</a></li>
+    </ul>
+
+    <h2><a name="about" id="about"></a>About Buildroot</h2>
+
+    <p>Buildroot is a set of Makefiles and patches that allows to easily
+    generate both a cross-compilation toolchain and a root filesystem for your
+    target. The cross-compilation toolchain uses uClibc (<a href=
+    "http://www.uclibc.org/">http://www.uclibc.org/</a>), a tiny C standard
+    library.</p>
+
+    <p>Buildroot is useful mainly for people working with embedded systems.
+    Embedded systems often use processors that are not the regular x86
+    processors everyone is used to have on his PC. It can be PowerPC
+    processors, MIPS processors, ARM processors, etc.</p>
+
+    <p>A compilation toolchain is the set of tools that allows to
+    compile code for your system. It consists of a compiler (in our
+    case, <code>gcc</code>), binary utils like assembler and linker
+    (in our case, <code>binutils</code>) and a C standard library (for
+    example <a href="http://www.gnu.org/software/libc/libc.html">GNU
+    Libc</a>, <a href="http://www.uclibc.org">uClibc</a> or <a
+    href="http://www.fefe.de/dietlibc/">dietlibc</a>). The system
+    installed on your development station certainly already has a
+    compilation toolchain that you can use to compile application that
+    runs on your system. If you're using a PC, your compilation
+    toolchain runs on an x86 processor and generates code for a x86
+    processor. Under most Linux systems, the compilation toolchain
+    uses the GNU libc as C standard library.  This compilation
+    toolchain is called the "host compilation toolchain", and more
+    generally, the machine on which it is running, and on which you're
+    working is called the "host system". The compilation toolchain is
+    provided by your distribution, and Buildroot has nothing to do
+    with it.</p>
+
+    <p>As said above, the compilation toolchain that comes with your system
+    runs and generates code for the processor of your host system. As your
+    embedded system has a different processor, you need a cross-compilation
+    toolchain: it's a compilation toolchain that runs on your host system but
+    that generates code for your target system (and target processor). For
+    example, if your host system uses x86 and your target system uses ARM, the
+    regular compilation toolchain of your host runs on x86 and generates code
+    for x86, while the cross-compilation toolchain runs on x86 and generates
+    code for ARM.</p>
+
+    <p>Even if your embedded system uses a x86 processor, you might interested
+    in Buildroot, for two reasons:</p>
+
+    <ul>
+      <li>The compilation toolchain of your host certainly uses the GNU Libc
+      which is a complete but huge C standard library. Instead of using GNU
+      Libc on your target system, you can use uClibc which is a tiny C standard
+      library. If you want to use this C library, then you need a compilation
+      toolchain to generate binaries linked with it. Buildroot can do it for
+      you.</li>
+
+      <li>Buildroot automates the building of a root filesystem with all needed
+      tools like busybox. It makes it much easier than doing it by hand.</li>
+    </ul>
+
+    <p>You might wonder why such a tool is needed when you can compile
+    <code>gcc</code>, <code>binutils</code>, uClibc and all the tools by hand.
+    Of course, doing so is possible. But dealing with all configure options,
+    with all problems of every <code>gcc</code> or <code>binutils</code>
+    version it very time-consuming and uninteresting. Buildroot automates this
+    process through the use of Makefiles, and has a collection of patches for
+    each <code>gcc</code> and <code>binutils</code> version to make them work
+    on most architectures.</p>
+
+    <h2><a name="download" id="download"></a>Obtaining Buildroot</h2>
+
+    <p>Buildroot is available as daily CVS snapshots or directly using
+    CVS.</p>
+
+    <p>The latest snapshot is always available at <a
+    href="http://uclibc.org/downloads/snapshots/buildroot-snapshot.tar.bz2">http://uclibc.org/downloads/snapshots/buildroot-snapshot.tar.bz2</a>,
+    and previous snapshots are also available at <a
+    href="http://uclibc.org/downloads/snapshots/">http://uclibc.org/downloads/snapshots/</a>.</p>
+
+    <p>To download Buildroot using CVS, you can simply follow
+    the rules described on the "Accessing CVS"-page (<a href=
+    "http://www.uclibc.org/cvs_anon.html">http://www.uclibc.org/cvs_anon.html</a>)
+    of the uClibc website (<a href=
+    "http://www.uclibc.org">http://www.uclibc.org</a>), and download the
+    <code>buildroot</code> CVS module. For the impatient, here's a quick
+    recipe:</p>
+
+ <pre>
+ $ cvs -d:pserver:anonymous@uclibc.org:/var/cvs login
+ $ cvs -z3 -d:pserver:anonymous@uclibc.org:/var/cvs co buildroot
+</pre>
+
+    <h2><a name="using" id="using"></a>Using Buildroot</h2>
+
+    <p>Buildroot has a nice configuration tool similar to the one you can find
+    in the Linux Kernel (<a href=
+    "http://www.kernel.org/">http://www.kernel.org/</a>) or in Busybox
+    (<a href="http://www.busybox.org/">http://www.busybox.org/</a>). Note that
+    you can run everything as a normal user. There is no need to be root to
+    configure and use Buildroot. The first step is to run the configuration
+    assistant:</p>
+
+<pre>
+ $ make menuconfig
+</pre>
+
+    <p>For each entry of the configuration tool, you can find associated help
+    that describes the purpose of the entry.</p>
+
+    <p>Once everything is configured, the configuration tool has generated a
+    <code>.config</code> file that contains the description of your
+    configuration. It will be used by the Makefiles to do what's needed.</p>
+
+    <p>Let's go:</p>
+
+<pre>
+ $ make
+</pre>
+
+    <p>This command will download, configure and compile all the selected
+    tools, and finally generate a target filesystem. The target filesystem will
+    be named <code>root_fs_ARCH.EXT</code> where <code>ARCH</code> is your
+    architecture and <code>EXT</code> depends on the type of target filesystem
+    selected in the <code>Target options</code> section of the configuration
+    tool.</p>
+
+    <h2><a name="custom_targetfs" id="custom_targetfs"></a>Customizing the
+    target filesystem</h2>
+
+    <p>There are two ways to customize the resulting target filesystem:</p>
+
+    <ul>
+      <li>Customize the target filesystem directly, and rebuild the image. The
+      target filesystem is available under <code>build_ARCH/root/</code> where
+      <code>ARCH</code> is the chosen target architecture. You can simply make
+      your changes here, and run make afterwards, which will rebuild the target
+      filesystem image. This method allows to do everything on the target
+      filesystem, but if you decide to completely rebuild your toolchain and
+      tools, these changes will be lost.</li>
+
+      <li>Customize the target filesystem skeleton, available under
+      <code>target/default/target_skeleton/</code>. You can customize
+      configuration files or other stuff here. However, the full file hierarchy
+      is not yet present, because it's created during the compilation process.
+      So you can't do everything on this target filesystem skeleton, but
+      changes to it remains even you completely rebuild the cross-compilation
+      toolchain and the tools.<br />
+      You can also customize the <code>target/default/device_table.txt</code>
+      file which is used by the tools that generate the target filesystem image
+      to properly set permissions and create device nodes. The
+      <code>target/default/skel.tar.gz</code> file contains the main
+      directories of a root filesystem and there is no obvious reason for which
+      it should be changed. These main directories are in an tarball inside of
+      inside the skeleton because it contains symlinks that would be broken
+      otherwise.</li>
+    </ul>
+
+    <h2><a name="custom_busybox" id="custom_busybox"></a>Customizing the
+    Busybox configuration</h2>
+
+    <p>Busybox is very configurable, and you may want to customize it. You can
+    follow these simple steps to do it. It's not an optimal way, but it's
+    simple and it works.</p>
+
+    <ol>
+      <li>Make a first compilation of buildroot with busybox without trying to
+      customize it.</li>
+
+      <li>Go into <code>build_ARCH/busybox/</code> and run <code>make
+      menuconfig</code>. The nice configuration tool appears and you can
+      customize everything.</li>
+
+      <li>Copy the <code>.config</code> file to
+      <code>package/busybox/busybox.config</code> so that your customized
+      configuration will remains even if you remove the cross-compilation
+      toolchain.</li>
+
+      <li>Run the compilation of buildroot again.</li>
+    </ol>
+
+    <p>Otherwise, you can simply change the
+    <code>package/busybox/busybox.config</code> file if you know the options
+    you want to change without using the configuration tool.</p>
+
+    <h2><a name="custom_uclibc" id="custom_uclibc"></a>Customizing the uClibc
+    configuration</h2>
+
+    <p>Just like <a href="#custom_busybox">BusyBox</a>, <a
+    href="http://www.uclibc.org">uClibc</a> offers a lot of
+    configuration options. They allow to select various
+    functionalities, depending on your needs and limitations.</p>
+
+    <p>The easiest way to modify the configuration of uClibc is to
+    follow these steps :</p>
+
+    <ol>
+
+      <li>Make a first compilation of buildroot without trying to
+      customize uClibc.</li>
+
+      <li>Go into the directory
+      <code>toolchain_build_ARCH/uClibc/</code> and run <code>make
+      menuconfig</code>. The nice configuration assistant, similar to
+      the one used in the Linux Kernel or in Buildroot appears. Make
+      your configuration as appropriate.</li>
+
+      <li>Copy the <code>.config</code> file to
+      <code>toolchain/uClibc/uClibc.config</code> or
+      <code>toolchain/uClibc/uClibc.config-locale</code>. The former
+      is used if you haven't selected locale support in Buildroot
+      configuration, and the latter is used if you have selected
+      locale support.</li>
+
+      <li>Run the compilation of Buildroot again</li>
+
+    </ol>
+
+    <p>Otherwise, you can simply change
+    <code>toolchain/uClibc/uClibc.config</code> or
+    <code>toolchain/uClibc/uClibc.config-locale</code> without running
+    the configuration assistant.</p>
+
+    <h2><a name="buildroot_innards" id="buildroot_innards"></a>How Buildroot
+    works</h2>
+
+    <p>As said above, Buildroot is basically a set of Makefiles that download,
+    configure and compiles software with the correct options. It also includes
+    some patches for various software, mainly the ones involved in the
+    cross-compilation tool chain (<code>gcc</code>, <code>binutils</code> and
+    uClibc).</p>
+
+    <p>There is basically one Makefile per software, and they are named with
+    the <code>.mk</code> extension. Makefiles are split into three
+    sections:</p>
+
+    <ul>
+      <li><b>package</b> (in the <code>package/</code> directory) contains the
+      Makefiles and associated files for all user-space tools that Buildroot
+      can compile and add to the target root filesystem. There is one
+      sub-directory per tool.</li>
+
+      <li><b>toolchain</b> (in the <code>toolchain/</code> directory) contains
+      the Makefiles and associated files for all software related to the
+      cross-compilation toolchain : <code>binutils</code>, <code>ccache</code>,
+      <code>gcc</code>, <code>gdb</code>, <code>kernel-headers</code> and
+      <code>uClibc</code>.</li>
+
+      <li><b>target</b> (in the <code>target</code> directory) contains the
+      Makefiles and associated files for software related to the generation of
+      the target root filesystem image. Four types of filesystems are supported
+      : ext2, jffs2, cramfs and squashfs. For each of them, there's a
+      sub-directory with the required files. There is also a
+      <code>default/</code> directory that contains the target filesystem
+      skeleton.</li>
+    </ul>
+
+    <p>Each directory contains at least 3 files :</p>
+
+    <ul>
+      <li><code>something.mk</code> is the Makefile that downloads, configures,
+      compiles and installs the software <code>something</code>.</li>
+
+      <li><code>Config.in</code> is a part of the configuration tool
+      description file. It describes the option related to the current
+      software.</li>
+
+      <li><code>Makefile.in</code> is a part of Makefile that sets various
+      variables according to the configuration given through the configuration
+      tool. For most tools it simply involves adding the name of the tool to
+      the <code>TARGETS</code> variable.</li>
+    </ul>
+
+    <p>The main Makefile do the job through the following steps (once the
+    configuration is done):</p>
+
+    <ol>
+      <li>Create the download directory (<code>dl/</code> by default). This is
+      where the tarballs will be downloaded. It is interesting to know that the
+      tarballs are in this directory because it may be useful to save them
+      somewhere to avoid further downloads.</li>
+
+      <li>Create the build directory (<code>build_ARCH/</code> by default,
+      where <code>ARCH</code> is your architecture). This is where all
+      user-space tools while be compiled.</li>
+
+      <li>Create the toolchain build directory
+      (<code>toolchain_build_ARCH/</code> by default, where <code>ARCH</code>
+      is your architecture). This is where the cross compilation toolchain will
+      be compiled.</li>
+
+      <li>Setup the staging directory (<code>build_ARCH/staging_dir/</code> by
+      default). This is where the cross-compilation toolchain will be
+      installed. If you want to use the same cross-compilation toolchain for
+      other purposes, such as compiling third-party applications, you can add
+      <code>build_ARCH/staging_dir/bin</code> to your PATH, and then use
+      <code>arch-linux-gcc</code> to compile your application. In order to
+      setup this staging directory, it first removes it, and then it creates
+      various subdirectories and symlinks inside it.</li>
+
+      <li>Create the target directory (<code>build_ARCH/root/</code> by
+      default) and the target filesystem skeleton. This directory will contain
+      the final root filesystem. To setup it up, it first deletes it, then it
+      uncompress the <code>target/default/skel.tar.gz</code> file to create the
+      main subdirectories and symlinks, copies the skeleton available in
+      <code>target/default/target_skeleton</code> and then removes useless
+      <code>CVS/</code> directories.</li>
+
+      <li>Make the <code>TARGETS</code> dependency. This is where all the job
+      is done : all <code>Makefile.in</code> files "subscribe" targets into
+      this global variable, so that the needed tools gets compiled.</li>
+    </ol>
+
+    <h2><a name="using_toolchain" id="using_toolchain"></a>Using the
+    uClibc toolchain</h2>
+
+    <p>You may want to compile your own programs or other software
+    that are not packaged in Buildroot. In order to do this, you can
+    use the toolchain that was generated by Buildroot.</p>
+
+    <p>The toolchain generated by Buildroot by default is located in
+    <code>build_ARCH/staging_dir/</code>. The simplest way to use it
+    is to add <code>build_ARCH/staging_dir/bin/</code> to your PATH
+    environnement variable, and then to use
+    <code>arch-linux-gcc</code>, <code>arch-linux-objdump</code>,
+    <code>arch-linux-ld</code>, etc.</p>
+
+    <p>For example, you may add the following to your
+    <code>.bashrc</code> (considering you're building for the MIPS
+    architecture and that Buildroot is located in
+    <code>~/buildroot/</code>) :</p>
+
+<pre>
+export PATH=$PATH:~/buildroot/build_mips/bin/
+</pre>
+
+    <p>Then you can simply do :</p>
+
+<pre>
+mips-linux-gcc -o foo foo.c
+</pre>
+
+    <p><b>Important</b> : do not try to move the toolchain to an other
+    directory, it won't work. There are some hard-coded paths in the
+    <i>gcc</i> configuration. If the default toolchain directory
+    doesn't suit your needs, please refer to the <a
+    href="#toolchain_standalone">Using the uClibc toolchain outside of
+    buildroot</a> section.</p>
+
+    <h2><a name="toolchain_standalone" id="toolchain_standalone"></a>Using the
+    uClibc toolchain outside of buildroot</h2>
+
+    <p>By default, the cross-compilation toolchain is generated inside
+    <code>build_ARCH/staging_dir/</code>. But sometimes, it may be useful to
+    install it somewhere else, so that it can be used to compile other programs
+    or by other users. Moving the <code>build_ARCH/staging_dir/</code>
+    directory elsewhere is <b>not possible</b>, because they are some hardcoded
+    paths in the toolchain configuration.</p>
+
+    <p>If you want to use the generated toolchain for other purposes,
+    you can configure Buildroot to generate it elsewhere using the
+    option of the configuration tool : <code>Build options ->
+    Toolchain and header file location</code>, which defaults to
+    <code>$(BUILD_DIR)/staging_dir/</code>.</p>
+
+    <h2><a name="downloaded_packages"
+    id="downloaded_packages"></a>Location of downloaded packages</h2>
+
+    <p>It might be useful to know that the various tarballs that are
+    downloaded by the <i>Makefiles</i> are all stored in the
+    <code>DL_DIR</code> which by default is the <code>dl</code>
+    directory. It's useful for example if you want to keep a complete
+    version of Buildroot which is know to be working with the
+    associated tarballs. This will allow you to regenerate the
+    toolchain and the target filesystem with exactly the same
+    versions.</p>
+
+    <h2><a name="add_software" id="add_software"></a>Extending Buildroot with
+    more software</h2>
+
+    <p>This section will only consider the case in which you want to
+    add user-space software.</p>
+
+    <h3>Package directory</h3>
+
+    <p>First of all, create a directory under the <code>package</code>
+    directory for your software, for example <code>foo</code>.</p>
+
+    <h3><code>Config.in</code> file</h3>
+
+    <p>Then, create a file named <code>Config.in</code>. This file
+    will contain the portion of options description related to our
+    <code>foo</code> software that will be used and displayed in the
+    configuration tool. It should basically contain :</p>
+
+<pre>
+config BR2_PACKAGE_FOO
+        bool "foo"
+        default n
+        help
+            This is a comment that explains what foo is.
+</pre>
+
+    <p>Of course, you can add other options to configure particular
+    things in your software.</p>
+
+    <h3><code>Makefile.in</code> file</h3>
+
+    <p>Then, write a <code>Makefile.in</code> file. Basically, this is
+    a very short <i>Makefile</i> that adds the name of the software to
+    the list of <code>TARGETS</code> that Buildroot will generate. In
+    fact, the name of the software is the the identifier of the target
+    inside the real <i>Makefile</i> that will do everything (download,
+    compile, install), and that we study below. Back to
+    <code>Makefile.in</code>, here is an example :</p>
+
+<pre>
+ifeq ($(strip $(BR2_PACKAGE_FOO)),y)
+TARGETS+=foo
+endif
+</pre>
+
+   <p>As you can see, this short <i>Makefile</i> simply adds the
+   target <code>foo</code> to the list of targets handled by Buildroot
+   if software <i>foo</i> was selected using the configuration tool.</p>
+
+   <h3>The real <i>Makefile</i></h3>
+
+   <p>Finally, here's the hardest part. Create a file named
+   <code>foo.mk</code>. It will contain the <i>Makefile</i> rules that
+   are in charge of downloading, configuring, compiling and installing
+   the software. Below is an example that we will comment
+   afterwards.</p>
+
+<pre>
+     1  #############################################################
+     2  #
+     3  # foo
+     4  #
+     5  #############################################################
+     6  FOO_VERSION:=1.0
+     7  FOO_SOURCE:=less-$(FOO_VERSION).tar.gz
+     8  FOO_SITE:=http://www.foosoftware.org/downloads
+     9  FOO_DIR:=$(BUILD_DIR)/less-$(FOO_VERSION)
+    10  FOO_BINARY:=foo
+    11  FOO_TARGET_BINARY:=usr/bin/foo
+    12
+    13  $(DL_DIR)/$(FOO_SOURCE):
+    14          $(WGET) -P $(DL_DIR) $(FOO_SITE)/$(FOO_SOURCE)
+    15
+    16  $(FOO_DIR)/.source: $(DL_DIR)/$(FOO_SOURCE)
+    17          zcat $(DL_DIR)/$(FOO_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
+    18          touch $(FOO_DIR)/.source
+    19
+    20  $(FOO_DIR)/.configured: $(FOO_DIR)/.source
+    21          (cd $(FOO_DIR); \
+    22                  $(TARGET_CONFIGURE_OPTS) \
+    23                  CFLAGS="$(TARGET_CFLAGS)" \
+    24                  ./configure \
+    25                  --target=$(GNU_TARGET_NAME) \
+    26                  --host=$(GNU_TARGET_NAME) \
+    27                  --build=$(GNU_HOST_NAME) \
+    28                  --prefix=/usr \
+    29                  --sysconfdir=/etc \
+    30          );
+    31          touch $(FOO_DIR)/.configured;
+    32
+    33  $(FOO_DIR)/$(FOO_BINARY): $(FOO_DIR)/.configured
+    34          $(MAKE) CC=$(TARGET_CC) -C $(FOO_DIR)
+    35
+    36  $(TARGET_DIR)/$(FOO_TARGET_BINARY): $(FOO_DIR)/$(FOO_BINARY)
+    37          $(MAKE) prefix=$(TARGET_DIR)/usr -C $(FOO_DIR) install
+    38          rm -Rf $(TARGET_DIR)/usr/man
+    39
+    40  foo: uclibc ncurses $(TARGET_DIR)/$(FOO_TARGET_BINARY)
+    41
+    42  foo-source: $(DL_DIR)/$(FOO_SOURCE)
+    43
+    44  foo-clean:
+    45          $(MAKE) prefix=$(TARGET_DIR)/usr -C $(FOO_DIR) uninstall
+    46          -$(MAKE) -C $(FOO_DIR) clean
+    47
+    48  foo-dirclean:
+    49          rm -rf $(FOO_DIR)
+    50
+</pre>
+
+    <p>First of all, this <i>Makefile</i> example works for a single
+    binary software. For other software such as libraries or more
+    complex stuff with multiple binaries, it should be adapted. Look at
+    the other <code>*.mk</code> files in the <code>package</code>
+    directory.</p>
+
+    <p>At lines 6-11, a couple of useful variables are defined :</p>
+
+    <ul>
+
+     <li><code>FOO_VERSION</code> : The version of <i>foo</i> that
+     should be downloaded.</li>
+
+     <li><code>FOO_SOURCE</code> : The name of the tarball of
+     <i>foo</i> on the download website of FTP site. As you can see
+     <code>FOO_VERSION</code> is used.</li>
+
+     <li><code>FOO_SITE</code> : The HTTP or FTP site from which
+     <i>foo</i> archive is downloaded. It must include the complete
+     path to the directory where <code>FOO_SOURCE</code> can be
+     found.</li>
+
+     <li><code>FOO_DIR</code> : The directory into which the software
+     will be configured and compiled. Basically, it's a subdirectory
+     of <code>BUILD_DIR</code> which is created upon decompression of
+     the tarball.</li>
+
+     <li><code>FOO_BINARY</code> : Software binary name. As said
+     previously, this is an example for a single binary software.</li>
+
+     <li><code>FOO_TARGET_BINARY</code> : The full path of the binary
+     inside the target filesystem.</li>
+
+    </ul>
+
+    <p>Lines 13-14 defines a target that downloads the tarball from
+    the remote site to the download directory
+    (<code>DL_DIR</code>).</p>
+
+    <p>Lines 16-18 defines a target and associated rules that
+    uncompress the downloaded tarball. As you can see, this target
+    depends on the tarball file, so that the previous target (line
+    13-14) is called before executing the rules of the current
+    target. Uncompressing is followed by <i>touching</i> a hidden file
+    to mark the software has having been uncompressed. This trick is
+    used everywhere in Buildroot <i>Makefile</i> to split steps
+    (download, uncompress, configure, compile, install) while still
+    having correct dependencies.</p>
+
+    <p>Lines 20-31 defines a target and associated rules that
+    configures the software. It depends on the previous target (the
+    hidden <code>.source</code> file) so that we are sure the software has
+    been uncompressed. In order to configure it, it basically runs the
+    well-known <code>./configure</code>script. As we may be doing
+    cross-compilation, <code>target</code>, <code>host</code> and
+    <code>build</code> arguments are given. The prefix is also set to
+    <code>/usr</code>, not because the software will be installed in
+    <code>/usr</code> on your host system, but in the target
+    filesystem. Finally it creates a <code>.configured</code> file to
+    mark the software as configured.</p>
+
+    <p>Lines 33-34 defines a target and a rule that compiles the
+    software. This target will create the binary file in the
+    compilation directory, and depends on the software being already
+    configured (hence the reference to the <code>.configured</code>
+    file). It basically runs <code>make</code> inside the source
+    directory.</p>
+
+    <p>Lines 36-38 defines a target and associated rules that install
+    the software inside the target filesystem. It depends on the
+    binary file in the source directory, to make sure the software has
+    been compiled. It uses the <code>install</code> target of the
+    software <code>Makefile</code> by passing a <code>prefix</code>
+    argument, so that the <code>Makefile</code> doesn't try to install
+    the software inside host <code>/usr</code> but inside target
+    <code>/usr</code>. After the installation, the
+    <code>/usr/man</code> directory inside the target filesystem is
+    removed to save space.</p>
+
+    <p>Line 40 defines the main target of the software, the one
+    referenced in the <code>Makefile.in</code> file. This targets
+    should first of all depends on the dependecies of the software (in
+    our example, <i>uclibc</i> and <i>ncurses</i>), and then to the
+    final binary. This last dependency will call all previous
+    dependencies in the right order. </p>
+
+    <p>Line 42 defines a simple target that only downloads the code
+    source. This is not used during normal operation of Buildroot, but
+    might be useful.</p>
+
+    <p>Lignes 44-46 define a simple target to clean the software build
+    by calling the <i>Makefiles</i> with the appropriate option.</p>
+
+    <p>Lines 48-49 define a simple target to completely remove the
+    directory in which the software was uncompressed, configured and
+    compiled.</p>
+
+    <h3>Conclusion</h3>
+
+    <p>As you can see, adding a software to buildroot is simply a
+    matter of writing a <i>Makefile</i> using an already existing
+    example and to modify it according to the compilation process of
+    the software.</p>
+
+    <p>If you package software that might be useful for other persons,
+    don't forget to send a patch to Buildroot developers !</p>
+
+     <h2><a name="links" id="links"></a>Ressources</h2>
+
+    <p>To learn more about Buildroot you can visit these
+    websites:</p>
+
+    <ul>
+      <li><a href="http://www.uclibc.org/">http://www.uclibc.org/</a></li>
+      <li><a href="http://www.busybox.net/">http://www.busybox.net/</a></li>
+    </ul>
+
+  </div>
+</body>
+</html>
diff --git a/openwrt/docs/stylesheet.css b/openwrt/docs/stylesheet.css
new file mode 100644 (file)
index 0000000..2c36417
--- /dev/null
@@ -0,0 +1,65 @@
+body {
+       margin: 0px 0px 0px 0px;
+       color: white;
+       background-color: #93c6f9;
+       font: 12pt/18pt georgia;
+}
+
+div.main {
+       margin: 10px 10px 10px 10px;
+       padding: 10px 10px 10px 10px;
+       color: black;
+       background-color: white;
+}
+
+div.titre {
+       text-align: center;
+       background-color: #336699;
+       color: white;
+       padding: 10px 10px 10px 10px;
+}
+
+h1 {
+       text-align: center;
+       font: 26pt georgia; 
+       letter-spacing: 3px; 
+}
+
+h2 {
+       padding: 5px 5px 5px 5px;
+       background-color: #c2e0ff;
+       color: #336699;
+}
+
+a:link, a:visited { 
+       font-weight: bold; 
+       text-decoration: none; 
+       color: #336699;
+}
+
+a:hover, a:active { 
+       text-decoration: underline; 
+       color: #9685BA;
+}
+
+h3 { 
+       font: italic normal 14pt georgia; 
+       letter-spacing: 1px; 
+       margin-bottom: 0px; 
+       margin-left: 10px;
+       margin-right: 10px;
+       color: #336699;
+}
+
+p {
+       margin-left: 10px;
+       margin-right: 10px;
+       text-align: justify;
+}
+
+pre {
+  border-left: 3px #aaa solid;
+  margin-left: 1em;
+  padding: 0 1em;
+  color: #888;
+}
\ No newline at end of file
diff --git a/openwrt/package/Config.in b/openwrt/package/Config.in
new file mode 100644 (file)
index 0000000..30f45ad
--- /dev/null
@@ -0,0 +1,15 @@
+#
+
+menu "OpenWrt Package Selection"
+
+comment "The default set"
+source "package/busybox/Config.in"
+source "package/dnsmasq/Config.in"
+source "package/linux/Config.in"
+source "package/iptables/Config.in"
+source "package/bridge/Config.in"
+
+comment "Suggested Extras"
+source "package/dropbear_sshd/Config.in"
+
+endmenu
diff --git a/openwrt/package/Makefile.in b/openwrt/package/Makefile.in
new file mode 100644 (file)
index 0000000..a59ab97
--- /dev/null
@@ -0,0 +1,64 @@
+MAKE1=make
+MAKE=make -j$(BR2_JLEVEL)
+
+# Strip off the annoying quoting
+ARCH:=$(strip $(subst ",, $(BR2_ARCH)))
+#"
+WGET:=$(strip $(subst ",, $(BR2_WGET)))
+#"
+
+ifneq ($(BR2_LARGEFILE),y)
+DISABLE_LARGEFILE= --disable-largefile
+endif
+TARGET_CFLAGS=$(TARGET_OPTIMIZATION) $(TARGET_DEBUGGING)
+
+HOSTCC:=gcc
+BASE_DIR:=${shell pwd}
+DL_DIR:=$(BASE_DIR)/dl
+#PATCH_DIR=$(BASE_DIR)/sources/patches
+BUILD_DIR:=$(BASE_DIR)/build_$(ARCH)$(ARCH_FPU_SUFFIX)
+TARGET_DIR:=$(BUILD_DIR)/root
+TOOL_BUILD_DIR=$(BASE_DIR)/toolchain_build_$(ARCH)$(ARCH_FPU_SUFFIX)
+# Strip off the annoying quoting
+STAGING_DIR:=$(strip $(subst ",, $(BR2_STAGING_DIR)))
+#"
+TARGET_PATH=$(STAGING_DIR)/bin:/bin:/sbin:/usr/bin:/usr/sbin
+IMAGE:=$(BASE_DIR)/root_fs_$(ARCH)$(ARCH_FPU_SUFFIX)
+REAL_GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)-linux-uclibc
+GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)-linux
+KERNEL_CROSS=$(STAGING_DIR)/bin/$(OPTIMIZE_FOR_CPU)-linux-uclibc-
+TARGET_CROSS=$(STAGING_DIR)/bin/$(OPTIMIZE_FOR_CPU)-linux-uclibc-
+TARGET_CC=$(TARGET_CROSS)gcc
+STRIP=$(TARGET_CROSS)strip --remove-section=.comment --remove-section=.note
+
+
+HOST_ARCH:=$(shell $(HOSTCC) -dumpmachine | sed -e s'/-.*//' \
+       -e 's/sparc.*/sparc/' \
+       -e 's/arm.*/arm/g' \
+       -e 's/m68k.*/m68k/' \
+       -e 's/ppc/powerpc/g' \
+       -e 's/v850.*/v850/g' \
+       -e 's/sh[234]/sh/' \
+       -e 's/mips-.*/mips/' \
+       -e 's/mipsel-.*/mipsel/' \
+       -e 's/cris.*/cris/' \
+       -e 's/i[3-9]86/i386/' \
+       )
+GNU_HOST_NAME:=$(HOST_ARCH)-pc-linux-gnu
+TARGET_CONFIGURE_OPTS=PATH=$(TARGET_PATH) \
+               AR=$(TARGET_CROSS)ar \
+               AS=$(TARGET_CROSS)as \
+               LD=$(TARGET_CROSS)ld \
+               NM=$(TARGET_CROSS)nm \
+               CC=$(TARGET_CROSS)gcc \
+               GCC=$(TARGET_CROSS)gcc \
+               CXX=$(TARGET_CROSS)g++ \
+               RANLIB=$(TARGET_CROSS)ranlib
+
+ifeq ($(ENABLE_LOCALE),true)
+DISABLE_NLS:=
+else
+DISABLE_NLS:=--disable-nls
+endif
+
+
diff --git a/openwrt/package/bridge/Config.in b/openwrt/package/bridge/Config.in
new file mode 100644 (file)
index 0000000..8a5ebce
--- /dev/null
@@ -0,0 +1,8 @@
+config BR2_PACKAGE_BRIDGE
+       bool "bridge"
+       default n
+       help
+         Manage ethernet bridging; a way to connect networks together to 
+         form a larger network.
+
+         http://bridge.sourceforge.net/
diff --git a/openwrt/package/bridge/Makefile.in b/openwrt/package/bridge/Makefile.in
new file mode 100644 (file)
index 0000000..5636052
--- /dev/null
@@ -0,0 +1,3 @@
+ifeq ($(strip $(BR2_PACKAGE_BRIDGE)),y)
+TARGETS+=bridge
+endif
diff --git a/openwrt/package/bridge/bridge.mk b/openwrt/package/bridge/bridge.mk
new file mode 100644 (file)
index 0000000..7865b6e
--- /dev/null
@@ -0,0 +1,61 @@
+#############################################################
+#
+# bridgeutils - User Space Program For Controling Bridging
+#
+#############################################################
+#
+BRIDGE_SOURCE_URL=http://umn.dl.sourceforge.net/sourceforge/bridge/
+BRIDGE_SOURCE=bridge-utils-1.0.4.tar.gz
+BRIDGE_BUILD_DIR=$(BUILD_DIR)/bridge-utils-1.0.4
+BRIDGE_TARGET_BINARY:=usr/sbin/brctl
+
+$(DL_DIR)/$(BRIDGE_SOURCE):
+        $(WGET) -P $(DL_DIR) $(BRIDGE_SOURCE_URL)/$(BRIDGE_SOURCE)
+
+$(BRIDGE_BUILD_DIR)/.unpacked: $(DL_DIR)/$(BRIDGE_SOURCE)
+       zcat $(DL_DIR)/$(BRIDGE_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
+       patch -p1 -d $(BRIDGE_BUILD_DIR) < package/bridge/bridge.patch
+       touch $(BRIDGE_BUILD_DIR)/.unpacked
+
+$(BRIDGE_BUILD_DIR)/.configured: $(BRIDGE_BUILD_DIR)/.unpacked
+       (cd $(BRIDGE_BUILD_DIR); rm -rf config.cache; \
+               $(TARGET_CONFIGURE_OPTS) \
+               CFLAGS="$(TARGET_CFLAGS)" \
+               ./configure \
+               --target=$(GNU_TARGET_NAME) \
+               --host=$(GNU_TARGET_NAME) \
+               --build=$(GNU_HOST_NAME) \
+               --prefix=/usr \
+               --exec-prefix=/usr \
+               --bindir=/usr/bin \
+               --sbindir=/usr/sbin \
+               --libexecdir=/usr/lib \
+               --sysconfdir=/etc \
+               --datadir=/usr/share \
+               --localstatedir=/var \
+               --mandir=/usr/man \
+               --infodir=/usr/info \
+               $(DISABLE_NLS) \
+               --with-linux=$(LINUX_DIR) \
+       );
+       touch  $(BRIDGE_BUILD_DIR)/.configured
+
+$(BRIDGE_BUILD_DIR)/brctl/brctl: $(BRIDGE_BUILD_DIR)/.configured
+       $(MAKE) -C $(BRIDGE_BUILD_DIR)
+
+$(TARGET_DIR)/$(BRIDGE_TARGET_BINARY): $(BRIDGE_BUILD_DIR)/brctl/brctl
+       cp -af $(BRIDGE_BUILD_DIR)/brctl/brctl $(TARGET_DIR)/$(BRIDGE_TARGET_BINARY)
+       $(STRIP) $(TARGET_DIR)/$(BRIDGE_TARGET_BINARY)
+       #cp -af $(BRIDGE_BUILD_DIR)/brctl/brctld $(TARGET_DIR)/usr/sbin/
+       #$(STRIP) $(TARGET_DIR)/usr/sbin/brctld
+
+bridge: linux $(TARGET_DIR)/$(BRIDGE_TARGET_BINARY)
+
+bridge-source: $(DL_DIR)/$(BRIDGE_SOURCE)
+
+bridge-clean:
+       #$(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(BRIDGE_BUILD_DIR) uninstall
+       -$(MAKE) -C $(BRIDGE_BUILD_DIR) clean
+
+bridge-dirclean:
+       rm -rf $(BRIDGE_BUILD_DIR)
diff --git a/openwrt/package/bridge/bridge.patch b/openwrt/package/bridge/bridge.patch
new file mode 100644 (file)
index 0000000..f447377
--- /dev/null
@@ -0,0 +1,11 @@
+--- bridge-utils-0.9.6/libbridge/Makefile.in.dist      2004-03-01 20:55:52.000000000 -0600
++++ bridge-utils-0.9.6/libbridge/Makefile.in   2004-03-01 20:56:23.000000000 -0600
+@@ -5,7 +5,7 @@
+ RANLIB=@RANLIB@
+ CC=@CC@
+-CFLAGS = -Wall -g $(KERNEL_HEADERS)
++CFLAGS = -Wall -g @CFLAGS@ $(KERNEL_HEADERS)
+ prefix=@prefix@
+ exec_prefix=@exec_prefix@
diff --git a/openwrt/package/busybox/Config.in b/openwrt/package/busybox/Config.in
new file mode 100644 (file)
index 0000000..320cb9b
--- /dev/null
@@ -0,0 +1,19 @@
+config BR2_PACKAGE_BUSYBOX
+       bool "busybox"
+       default y
+       help
+         The Swiss Army Knife of embedded Linux.  It slices, it dices, it
+         makes Julian Fries.
+
+         http://busybox.net/
+
+         Most people will answer Y.
+
+config BR2_PACKAGE_BUSYBOX_SNAPSHOT
+       bool "Use the daily snapshot of busybox?"
+       depends BR2_PACKAGE_BUSYBOX
+       default y
+       help
+         Use the latest busybox CVS snapshot instead of release.
+
+         For fun, you should say Y.
diff --git a/openwrt/package/busybox/Makefile.in b/openwrt/package/busybox/Makefile.in
new file mode 100644 (file)
index 0000000..a8efafb
--- /dev/null
@@ -0,0 +1,3 @@
+ifeq ($(strip $(BR2_PACKAGE_BUSYBOX)),y)
+TARGETS+=busybox
+endif
diff --git a/openwrt/package/busybox/busybox.config b/openwrt/package/busybox/busybox.config
new file mode 100644 (file)
index 0000000..7335635
--- /dev/null
@@ -0,0 +1,464 @@
+#
+# Automatically generated make config: don't edit
+#
+HAVE_DOT_CONFIG=y
+
+#
+# General Configuration
+#
+# CONFIG_FEATURE_BUFFERS_USE_MALLOC is not set
+CONFIG_FEATURE_BUFFERS_GO_ON_STACK=y
+# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set
+CONFIG_FEATURE_VERBOSE_USAGE=y
+# CONFIG_FEATURE_INSTALLER is not set
+# CONFIG_LOCALE_SUPPORT is not set
+# CONFIG_FEATURE_DEVFS is not set
+CONFIG_FEATURE_DEVPTS=y
+# CONFIG_FEATURE_CLEAN_UP is not set
+CONFIG_FEATURE_SUID=y
+# CONFIG_FEATURE_SUID_CONFIG is not set
+# CONFIG_SELINUX is not set
+
+#
+# Build Options
+#
+# CONFIG_STATIC is not set
+CONFIG_LFS=y
+# USING_CROSS_COMPILER is not set
+EXTRA_CFLAGS_OPTIONS=""
+
+#
+# Installation Options
+#
+# CONFIG_INSTALL_NO_USR is not set
+PREFIX="./_install"
+
+#
+# Archival Utilities
+#
+# CONFIG_AR is not set
+CONFIG_BUNZIP2=y
+# CONFIG_CPIO is not set
+# CONFIG_DPKG is not set
+# CONFIG_DPKG_DEB is not set
+CONFIG_GUNZIP=y
+# CONFIG_FEATURE_GUNZIP_UNCOMPRESS is not set
+CONFIG_GZIP=y
+# CONFIG_RPM2CPIO is not set
+# CONFIG_RPM is not set
+CONFIG_TAR=y
+CONFIG_FEATURE_TAR_CREATE=y
+CONFIG_FEATURE_TAR_BZIP2=y
+# CONFIG_FEATURE_TAR_FROM is not set
+CONFIG_FEATURE_TAR_GZIP=y
+# CONFIG_FEATURE_TAR_COMPRESS is not set
+# CONFIG_FEATURE_TAR_OLDGNU_COMPATABILITY is not set
+CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y
+# CONFIG_FEATURE_TAR_LONG_OPTIONS is not set
+# CONFIG_UNCOMPRESS is not set
+CONFIG_UNZIP=y
+
+#
+# Common options for cpio and tar
+#
+# CONFIG_FEATURE_UNARCHIVE_TAPE is not set
+
+#
+# Coreutils
+#
+CONFIG_BASENAME=y
+# CONFIG_CAL is not set
+CONFIG_CAT=y
+CONFIG_CHGRP=y
+CONFIG_CHMOD=y
+CONFIG_CHOWN=y
+CONFIG_CHROOT=y
+CONFIG_CMP=y
+CONFIG_CP=y
+CONFIG_CUT=y
+CONFIG_DATE=y
+CONFIG_FEATURE_DATE_ISOFMT=y
+CONFIG_DD=y
+CONFIG_DF=y
+CONFIG_DIRNAME=y
+CONFIG_DOS2UNIX=y
+CONFIG_UNIX2DOS=y
+CONFIG_DU=y
+CONFIG_FEATURE_DU_DEFALT_BLOCKSIZE_1K=y
+CONFIG_ECHO=y
+CONFIG_FEATURE_FANCY_ECHO=y
+CONFIG_ENV=y
+CONFIG_EXPR=y
+CONFIG_FALSE=y
+# CONFIG_FOLD is not set
+CONFIG_HEAD=y
+# CONFIG_FEATURE_FANCY_HEAD is not set
+CONFIG_HOSTID=y
+CONFIG_ID=y
+CONFIG_INSTALL=y
+# CONFIG_LENGTH is not set
+CONFIG_LN=y
+CONFIG_LOGNAME=y
+CONFIG_LS=y
+CONFIG_FEATURE_LS_FILETYPES=y
+CONFIG_FEATURE_LS_FOLLOWLINKS=y
+CONFIG_FEATURE_LS_RECURSIVE=y
+CONFIG_FEATURE_LS_SORTFILES=y
+CONFIG_FEATURE_LS_TIMESTAMPS=y
+CONFIG_FEATURE_LS_USERNAME=y
+CONFIG_FEATURE_LS_COLOR=y
+CONFIG_MD5SUM=y
+CONFIG_MKDIR=y
+# CONFIG_MKFIFO is not set
+CONFIG_MKNOD=y
+CONFIG_MV=y
+# CONFIG_OD is not set
+# CONFIG_PRINTF is not set
+CONFIG_PWD=y
+# CONFIG_REALPATH is not set
+CONFIG_RM=y
+CONFIG_RMDIR=y
+# CONFIG_SEQ is not set
+CONFIG_SHA1SUM=y
+CONFIG_SLEEP=y
+# CONFIG_FEATURE_FANCY_SLEEP is not set
+CONFIG_SORT=y
+CONFIG_STTY=y
+CONFIG_SYNC=y
+CONFIG_TAIL=y
+CONFIG_FEATURE_FANCY_TAIL=y
+CONFIG_TEE=y
+CONFIG_FEATURE_TEE_USE_BLOCK_IO=y
+CONFIG_TEST=y
+CONFIG_FEATURE_TEST_64=y
+
+#
+# test (forced enabled for use with shell)
+#
+CONFIG_TOUCH=y
+# CONFIG_TR is not set
+CONFIG_TRUE=y
+CONFIG_TTY=y
+CONFIG_UNAME=y
+CONFIG_UNIQ=y
+CONFIG_USLEEP=y
+CONFIG_UUDECODE=y
+CONFIG_UUENCODE=y
+# CONFIG_WATCH is not set
+CONFIG_WC=y
+# CONFIG_WHO is not set
+CONFIG_WHOAMI=y
+CONFIG_YES=y
+
+#
+# Common options for cp and mv
+#
+CONFIG_FEATURE_PRESERVE_HARDLINKS=y
+
+#
+# Common options for ls and more
+#
+CONFIG_FEATURE_AUTOWIDTH=y
+
+#
+# Common options for df, du, ls
+#
+CONFIG_FEATURE_HUMAN_READABLE=y
+
+#
+# Common options for md5sum, sha1sum
+#
+CONFIG_FEATURE_MD5_SHA1_SUM_CHECK=y
+
+#
+# Console Utilities
+#
+CONFIG_CHVT=y
+CONFIG_CLEAR=y
+CONFIG_DEALLOCVT=y
+# CONFIG_DUMPKMAP is not set
+# CONFIG_LOADFONT is not set
+# CONFIG_LOADKMAP is not set
+CONFIG_OPENVT=y
+CONFIG_RESET=y
+# CONFIG_SETKEYCODES is not set
+
+#
+# Debian Utilities
+#
+CONFIG_MKTEMP=y
+# CONFIG_PIPE_PROGRESS is not set
+CONFIG_READLINK=y
+CONFIG_FEATURE_READLINK_FOLLOW=y
+CONFIG_RUN_PARTS=y
+CONFIG_START_STOP_DAEMON=y
+CONFIG_WHICH=y
+
+#
+# Editors
+#
+# CONFIG_AWK is not set
+# CONFIG_PATCH is not set
+CONFIG_SED=y
+CONFIG_VI=y
+CONFIG_FEATURE_VI_COLON=y
+CONFIG_FEATURE_VI_YANKMARK=y
+CONFIG_FEATURE_VI_SEARCH=y
+CONFIG_FEATURE_VI_USE_SIGNALS=y
+CONFIG_FEATURE_VI_DOT_CMD=y
+CONFIG_FEATURE_VI_READONLY=y
+CONFIG_FEATURE_VI_SETOPTS=y
+CONFIG_FEATURE_VI_SET=y
+CONFIG_FEATURE_VI_WIN_RESIZE=y
+CONFIG_FEATURE_VI_OPTIMIZE_CURSOR=y
+
+#
+# Finding Utilities
+#
+CONFIG_FIND=y
+CONFIG_FEATURE_FIND_MTIME=y
+CONFIG_FEATURE_FIND_PERM=y
+CONFIG_FEATURE_FIND_TYPE=y
+CONFIG_FEATURE_FIND_XDEV=y
+# CONFIG_FEATURE_FIND_NEWER is not set
+# CONFIG_FEATURE_FIND_INUM is not set
+CONFIG_GREP=y
+CONFIG_FEATURE_GREP_EGREP_ALIAS=y
+CONFIG_FEATURE_GREP_FGREP_ALIAS=y
+CONFIG_FEATURE_GREP_CONTEXT=y
+CONFIG_XARGS=y
+# CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION is not set
+CONFIG_FEATURE_XARGS_SUPPORT_QUOTES=y
+CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT=y
+CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM=y
+
+#
+# Init Utilities
+#
+CONFIG_INIT=y
+CONFIG_FEATURE_USE_INITTAB=y
+CONFIG_FEATURE_INITRD=y
+# CONFIG_FEATURE_INIT_COREDUMPS is not set
+CONFIG_FEATURE_EXTRA_QUIET=y
+CONFIG_HALT=y
+CONFIG_POWEROFF=y
+CONFIG_REBOOT=y
+# CONFIG_MESG is not set
+
+#
+# Login/Password Management Utilities
+#
+# CONFIG_USE_BB_PWD_GRP is not set
+CONFIG_ADDGROUP=y
+CONFIG_DELGROUP=y
+CONFIG_ADDUSER=y
+CONFIG_DELUSER=y
+CONFIG_GETTY=y
+# CONFIG_FEATURE_U_W_TMP is not set
+CONFIG_LOGIN=y
+CONFIG_FEATURE_SECURETTY=y
+CONFIG_PASSWD=y
+CONFIG_SU=y
+CONFIG_SULOGIN=y
+CONFIG_VLOCK=y
+
+#
+# Common options for adduser, deluser, login, su
+#
+CONFIG_FEATURE_SHADOWPASSWDS=y
+
+#
+# Miscellaneous Utilities
+#
+# CONFIG_ADJTIMEX is not set
+# CONFIG_CROND is not set
+# CONFIG_CRONTAB is not set
+CONFIG_DC=y
+# CONFIG_DEVFSD is not set
+# CONFIG_LAST is not set
+# CONFIG_HDPARM is not set
+# CONFIG_MAKEDEVS is not set
+CONFIG_MT=y
+# CONFIG_RX is not set
+CONFIG_STRINGS=y
+CONFIG_TIME=y
+# CONFIG_WATCHDOG is not set
+
+#
+# Linux Module Utilities
+#
+CONFIG_INSMOD=y
+CONFIG_FEATURE_2_4_MODULES=y
+# CONFIG_FEATURE_2_6_MODULES is not set
+# CONFIG_FEATURE_INSMOD_VERSION_CHECKING is not set
+# CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS is not set
+# CONFIG_FEATURE_INSMOD_LOADINKMEM is not set
+# CONFIG_FEATURE_INSMOD_LOAD_MAP is not set
+CONFIG_LSMOD=y
+CONFIG_FEATURE_QUERY_MODULE_INTERFACE=y
+CONFIG_MODPROBE=y
+CONFIG_RMMOD=y
+CONFIG_FEATURE_CHECK_TAINTED_MODULE=y
+
+#
+# Networking Utilities
+#
+# CONFIG_FEATURE_IPV6 is not set
+# CONFIG_ARPING is not set
+# CONFIG_FTPGET is not set
+# CONFIG_FTPPUT is not set
+CONFIG_HOSTNAME=y
+# CONFIG_HTTPD is not set
+CONFIG_IFCONFIG=y
+CONFIG_FEATURE_IFCONFIG_STATUS=y
+# CONFIG_FEATURE_IFCONFIG_SLIP is not set
+# CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ is not set
+# CONFIG_FEATURE_IFCONFIG_HW is not set
+# CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS is not set
+CONFIG_IFUPDOWN=y
+# CONFIG_FEATURE_IFUPDOWN_IP is not set
+CONFIG_FEATURE_IFUPDOWN_IP_BUILTIN=y
+CONFIG_FEATURE_IFUPDOWN_IPV4=y
+# CONFIG_FEATURE_IFUPDOWN_IPV6 is not set
+# CONFIG_FEATURE_IFUPDOWN_IPX is not set
+# CONFIG_FEATURE_IFUPDOWN_MAPPING is not set
+# CONFIG_INETD is not set
+# CONFIG_IP is not set
+# CONFIG_IPCALC is not set
+# CONFIG_IPADDR is not set
+# CONFIG_IPLINK is not set
+# CONFIG_IPROUTE is not set
+# CONFIG_IPTUNNEL is not set
+# CONFIG_NAMEIF is not set
+# CONFIG_NC is not set
+CONFIG_NETSTAT=y
+CONFIG_NSLOOKUP=y
+CONFIG_PING=y
+CONFIG_FEATURE_FANCY_PING=y
+CONFIG_ROUTE=y
+CONFIG_TELNET=y
+CONFIG_FEATURE_TELNET_TTYPE=y
+# CONFIG_FEATURE_TELNET_AUTOLOGIN is not set
+# CONFIG_TELNETD is not set
+# CONFIG_TFTP is not set
+# CONFIG_TRACEROUTE is not set
+# CONFIG_VCONFIG is not set
+CONFIG_WGET=y
+CONFIG_FEATURE_WGET_STATUSBAR=y
+CONFIG_FEATURE_WGET_AUTHENTICATION=y
+# CONFIG_FEATURE_WGET_IP6_LITERAL is not set
+
+#
+# udhcp Server/Client
+#
+CONFIG_UDHCPD=y
+CONFIG_UDHCPC=y
+CONFIG_DUMPLEASES=y
+CONFIG_FEATURE_UDHCP_SYSLOG=y
+# CONFIG_FEATURE_UDHCP_DEBUG is not set
+
+#
+# Process Utilities
+#
+CONFIG_FREE=y
+CONFIG_KILL=y
+CONFIG_KILLALL=y
+CONFIG_PIDOF=y
+CONFIG_PS=y
+# CONFIG_RENICE is not set
+# CONFIG_TOP is not set
+CONFIG_UPTIME=y
+# CONFIG_SYSCTL is not set
+
+#
+# Another Bourne-like Shell
+#
+CONFIG_FEATURE_SH_IS_ASH=y
+# CONFIG_FEATURE_SH_IS_HUSH is not set
+# CONFIG_FEATURE_SH_IS_LASH is not set
+# CONFIG_FEATURE_SH_IS_MSH is not set
+# CONFIG_FEATURE_SH_IS_NONE is not set
+CONFIG_ASH=y
+
+#
+# Ash Shell Options
+#
+CONFIG_ASH_JOB_CONTROL=y
+CONFIG_ASH_ALIAS=y
+CONFIG_ASH_MATH_SUPPORT=y
+CONFIG_ASH_MATH_SUPPORT_64=y
+# CONFIG_ASH_GETOPTS is not set
+# CONFIG_ASH_CMDCMD is not set
+# CONFIG_ASH_MAIL is not set
+CONFIG_ASH_OPTIMIZE_FOR_SIZE=y
+# CONFIG_ASH_RANDOM_SUPPORT is not set
+# CONFIG_HUSH is not set
+# CONFIG_LASH is not set
+# CONFIG_MSH is not set
+
+#
+# Bourne Shell Options
+#
+# CONFIG_FEATURE_SH_EXTRA_QUIET is not set
+# CONFIG_FEATURE_SH_STANDALONE_SHELL is not set
+CONFIG_FEATURE_COMMAND_EDITING=y
+CONFIG_FEATURE_COMMAND_HISTORY=15
+CONFIG_FEATURE_COMMAND_SAVEHISTORY=y
+CONFIG_FEATURE_COMMAND_TAB_COMPLETION=y
+# CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION is not set
+CONFIG_FEATURE_SH_FANCY_PROMPT=y
+
+#
+# System Logging Utilities
+#
+CONFIG_SYSLOGD=y
+CONFIG_FEATURE_ROTATE_LOGFILE=y
+# CONFIG_FEATURE_REMOTE_LOG is not set
+# CONFIG_FEATURE_IPC_SYSLOG is not set
+CONFIG_KLOGD=y
+CONFIG_LOGGER=y
+
+#
+# Linux System Utilities
+#
+CONFIG_DMESG=y
+# CONFIG_FBSET is not set
+# CONFIG_FDFLUSH is not set
+CONFIG_FDFORMAT=y
+CONFIG_FDISK=y
+FDISK_SUPPORT_LARGE_DISKS=y
+CONFIG_FEATURE_FDISK_WRITABLE=y
+# CONFIG_FEATURE_AIX_LABEL is not set
+# CONFIG_FEATURE_SGI_LABEL is not set
+# CONFIG_FEATURE_SUN_LABEL is not set
+# CONFIG_FEATURE_OSF_LABEL is not set
+# CONFIG_FEATURE_FDISK_ADVANCED is not set
+# CONFIG_FREERAMDISK is not set
+# CONFIG_FSCK_MINIX is not set
+# CONFIG_MKFS_MINIX is not set
+CONFIG_GETOPT=y
+CONFIG_HEXDUMP=y
+CONFIG_HWCLOCK=y
+CONFIG_FEATURE_HWCLOCK_LONGOPTIONS=y
+# CONFIG_LOSETUP is not set
+# CONFIG_MKSWAP is not set
+CONFIG_MORE=y
+CONFIG_FEATURE_USE_TERMIOS=y
+CONFIG_PIVOT_ROOT=y
+CONFIG_RDATE=y
+CONFIG_SWAPONOFF=y
+CONFIG_MOUNT=y
+# CONFIG_NFSMOUNT is not set
+CONFIG_UMOUNT=y
+# CONFIG_FEATURE_MOUNT_FORCE is not set
+
+#
+# Common options for mount/umount
+#
+CONFIG_FEATURE_MOUNT_LOOP=y
+# CONFIG_FEATURE_MTAB_SUPPORT is not set
+
+#
+# Debugging Options
+#
+# CONFIG_DEBUG is not set
diff --git a/openwrt/package/busybox/busybox.mk b/openwrt/package/busybox/busybox.mk
new file mode 100644 (file)
index 0000000..ae9abf1
--- /dev/null
@@ -0,0 +1,62 @@
+#############################################################
+#
+# busybox
+#
+#############################################################
+
+ifeq ($(strip $(BR2_PACKAGE_BUSYBOX_SNAPSHOT)),y)
+# Be aware that this changes daily....
+BUSYBOX_DIR:=$(BUILD_DIR)/busybox
+BUSYBOX_SOURCE:=busybox-snapshot.tar.bz2
+BUSYBOX_SITE:=http://www.busybox.net/downloads/snapshots
+else
+BUSYBOX_VER:=1.00
+BUSYBOX_DIR:=$(BUILD_DIR)/busybox-$(BUSYBOX_VER)
+BUSYBOX_SOURCE:=busybox-$(BUSYBOX_VER).tar.bz2
+BUSYBOX_SITE:=http://www.busybox.net/downloads
+endif
+BUSYBOX_UNZIP=bzcat
+BUSYBOX_CONFIG:=package/busybox/busybox.config
+
+$(DL_DIR)/$(BUSYBOX_SOURCE):
+        $(WGET) -P $(DL_DIR) $(BUSYBOX_SITE)/$(BUSYBOX_SOURCE)
+
+busybox-source: $(DL_DIR)/$(BUSYBOX_SOURCE) $(BUSYBOX_CONFIG)
+
+$(BUSYBOX_DIR)/.unpacked: $(DL_DIR)/$(BUSYBOX_SOURCE)
+       $(BUSYBOX_UNZIP) $(DL_DIR)/$(BUSYBOX_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
+       # Allow busybox patches.
+       toolchain/patch-kernel.sh $(BUSYBOX_DIR) package/busybox busybox-\*.patch
+       touch $(BUSYBOX_DIR)/.unpacked
+
+$(BUSYBOX_DIR)/.configured: $(BUSYBOX_DIR)/.unpacked $(BUSYBOX_CONFIG)
+       cp $(BUSYBOX_CONFIG) $(BUSYBOX_DIR)/.config
+       $(SED) "s,^CROSS.*,CROSS=$(TARGET_CROSS)\n\
+               PREFIX=$(TARGET_DIR),;" $(BUSYBOX_DIR)/Rules.mak
+ifeq ($(BR2_LARGEFILE),y)
+       $(SED) "s/^.*CONFIG_LFS.*/CONFIG_LFS=y/;" $(BUSYBOX_DIR)/.config
+else
+       $(SED) "s/^.*CONFIG_LFS.*/CONFIG_LFS=n/;" $(BUSYBOX_DIR)/.config
+       $(SED) "s/^.*FDISK_SUPPORT_LARGE_DISKS.*/FDISK_SUPPORT_LARGE_DISKS=n/;" $(BUSYBOX_DIR)/.config
+endif
+       $(MAKE) CC=$(TARGET_CC) CROSS="$(TARGET_CROSS)" -C $(BUSYBOX_DIR) oldconfig
+       touch $(BUSYBOX_DIR)/.configured
+
+$(BUSYBOX_DIR)/busybox: $(BUSYBOX_DIR)/.configured
+       $(MAKE) CC=$(TARGET_CC) CROSS="$(TARGET_CROSS)" PREFIX="$(TARGET_DIR)" \
+               EXTRA_CFLAGS="$(TARGET_CFLAGS)" -C $(BUSYBOX_DIR)
+
+$(TARGET_DIR)/bin/busybox: $(BUSYBOX_DIR)/busybox
+       $(MAKE) CC=$(TARGET_CC) CROSS="$(TARGET_CROSS)" PREFIX="$(TARGET_DIR)" \
+               EXTRA_CFLAGS="$(TARGET_CFLAGS)" -C $(BUSYBOX_DIR) install
+       # Just in case
+       -chmod a+x $(TARGET_DIR)/usr/share/udhcpc/default.script
+
+busybox: uclibc $(TARGET_DIR)/bin/busybox
+
+busybox-clean:
+       rm -f $(TARGET_DIR)/bin/busybox
+       -$(MAKE) -C $(BUSYBOX_DIR) clean
+
+busybox-dirclean:
+       rm -rf $(BUSYBOX_DIR)
diff --git a/openwrt/package/config/.cvsignore b/openwrt/package/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/openwrt/package/config/Config.in b/openwrt/package/config/Config.in
new file mode 100644 (file)
index 0000000..7b114d9
--- /dev/null
@@ -0,0 +1,8 @@
+#
+
+config BR2_PACKAGE_CONFIG
+       bool"config"
+       default n
+       help
+         Add help text here.
+
diff --git a/openwrt/package/config/Kconfig-language.txt b/openwrt/package/config/Kconfig-language.txt
new file mode 100644 (file)
index 0000000..493749b
--- /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/openwrt/package/config/Makefile b/openwrt/package/config/Makefile
new file mode 100644 (file)
index 0000000..455a33d
--- /dev/null
@@ -0,0 +1,112 @@
+# Makefile for buildroot2
+#
+# Copyright (C) 2002-2004 Erik Andersen <andersen@codepoet.org>
+
+
+# Select the compiler needed to build binaries for your development system
+HOSTCC    = gcc
+HOSTCFLAGS= -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
+# Ensure consistent sort order, 'gcc -print-search-dirs' behavior, etc.
+LC_ALL:= C
+
+
+all: ncurses conf mconf
+
+LIBS = -lncurses
+ifeq (/usr/include/ncurses/ncurses.h, $(wildcard /usr/include/ncurses/ncurses.h))
+       HOSTNCURSES += -I/usr/include/ncurses -DCURSES_LOC="<ncurses.h>"
+else
+ifeq (/usr/include/ncurses/curses.h, $(wildcard /usr/include/ncurses/curses.h))
+       HOSTNCURSES += -I/usr/include/ncurses -DCURSES_LOC="<ncurses/curses.h>"
+else
+ifeq (/usr/local/include/ncurses/ncurses.h, $(wildcard /usr/local/include/ncurses/ncurses.h))
+       HOSTCFLAGS += -I/usr/local/include/ncurses -DCURSES_LOC="<ncurses.h>"
+else
+ifeq (/usr/local/include/ncurses/curses.h, $(wildcard /usr/local/include/ncurses/curses.h))
+       HOSTCFLAGS += -I/usr/local/include/ncurses -DCURSES_LOC="<ncurses/curses.h>"
+else
+ifeq (/usr/include/ncurses.h, $(wildcard /usr/include/ncurses.h))
+       HOSTNCURSES += -DCURSES_LOC="<ncurses.h>"
+else
+       HOSTNCURSES += -DCURSES_LOC="<curses.h>"
+endif
+endif
+endif
+endif
+endif
+
+CONF_SRC  =conf.c
+MCONF_SRC =mconf.c checklist.c menubox.c textbox.c yesno.c inputbox.c util.c msgbox.c
+SHARED_SRC=zconf.tab.c
+SHARED_DEPS:=lkc.h lkc_proto.h lkc_defs.h expr.h zconf.tab.h
+CONF_OBJS =$(patsubst %.c,%.o, $(CONF_SRC))
+MCONF_OBJS=$(patsubst %.c,%.o, $(MCONF_SRC))
+SHARED_OBJS=$(patsubst %.c,%.o, $(SHARED_SRC))
+
+conf: $(CONF_OBJS) $(SHARED_OBJS)
+       $(HOSTCC) $(NATIVE_LDFLAGS) $^ -o $@
+
+mconf: $(MCONF_OBJS) $(SHARED_OBJS)
+       $(HOSTCC) $(NATIVE_LDFLAGS) $^ -o $@ $(LIBS)
+
+$(CONF_OBJS): %.o : %.c $(SHARED_DEPS)
+       $(HOSTCC) $(HOSTCFLAGS) -I. -c $< -o $@
+
+$(MCONF_OBJS): %.o : %.c $(SHARED_DEPS)
+       $(HOSTCC) $(HOSTCFLAGS) $(HOSTNCURSES) -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.o: lex.zconf.c $(SHARED_DEPS)
+       $(HOSTCC) $(HOSTCFLAGS) -I. -c $< -o $@
+
+lex.zconf.c: lex.zconf.c_shipped
+       cp lex.zconf.c_shipped lex.zconf.c
+
+zconf.tab.o: zconf.tab.c lex.zconf.c confdata.c expr.c symbol.c menu.c $(SHARED_DEPS)
+       $(HOSTCC) $(HOSTCFLAGS) -I. -c $< -o $@
+
+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
+
diff --git a/openwrt/package/config/Makefile.in b/openwrt/package/config/Makefile.in
new file mode 100644 (file)
index 0000000..addf1b9
--- /dev/null
@@ -0,0 +1,3 @@
+ifeq ($(strip $(BR2_PACKAGE_CONFIG)),y)
+TARGETS+=config
+endif
diff --git a/openwrt/package/config/checklist.c b/openwrt/package/config/checklist.c
new file mode 100644 (file)
index 0000000..4dbd166
--- /dev/null
@@ -0,0 +1,372 @@
+/*
+ *  checklist.c -- implements the checklist box
+ *
+ *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *     Stuart Herbert - S.Herbert@sheffield.ac.uk: radiolist extension
+ *     Alessandro Rubini - rubini@ipvvis.unipv.it: merged the two
+ *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "dialog.h"
+
+static int list_width, check_x, item_x, checkflag;
+
+/*
+ * Print list item
+ */
+static void
+print_item (WINDOW * win, const char *item, int status,
+           int choice, int selected)
+{
+    int i;
+
+    /* Clear 'residue' of last item */
+    wattrset (win, menubox_attr);
+    wmove (win, choice, 0);
+    for (i = 0; i < list_width; i++)
+       waddch (win, ' ');
+
+    wmove (win, choice, check_x);
+    wattrset (win, selected ? check_selected_attr : check_attr);
+    if (checkflag == FLAG_CHECK)
+       wprintw (win, "[%c]", status ? 'X' : ' ');
+    else
+       wprintw (win, "(%c)", status ? 'X' : ' ');
+
+    wattrset (win, selected ? tag_selected_attr : tag_attr);
+    mvwaddch(win, choice, item_x, item[0]);
+    wattrset (win, selected ? item_selected_attr : item_attr);
+    waddstr (win, (char *)item+1);
+    if (selected) {
+       wmove (win, choice, check_x+1);
+       wrefresh (win);
+    }
+}
+
+/*
+ * Print the scroll indicators.
+ */
+static void
+print_arrows (WINDOW * win, int choice, int item_no, int scroll,
+               int y, int x, int height)
+{
+    wmove(win, y, x);
+
+    if (scroll > 0) {
+       wattrset (win, uarrow_attr);
+       waddch (win, ACS_UARROW);
+       waddstr (win, "(-)");
+    }
+    else {
+       wattrset (win, menubox_attr);
+       waddch (win, ACS_HLINE);
+       waddch (win, ACS_HLINE);
+       waddch (win, ACS_HLINE);
+       waddch (win, ACS_HLINE);
+    }
+
+   y = y + height + 1;
+   wmove(win, y, x);
+
+   if ((height < item_no) && (scroll + choice < item_no - 1)) {
+       wattrset (win, darrow_attr);
+       waddch (win, ACS_DARROW);
+       waddstr (win, "(+)");
+    }
+    else {
+       wattrset (win, menubox_border_attr);
+       waddch (win, ACS_HLINE);
+       waddch (win, ACS_HLINE);
+       waddch (win, ACS_HLINE);
+       waddch (win, ACS_HLINE);
+   }
+}
+
+/*
+ *  Display the termination buttons
+ */
+static void
+print_buttons( WINDOW *dialog, int height, int width, int selected)
+{
+    int x = width / 2 - 11;
+    int y = height - 2;
+
+    print_button (dialog, "Select", y, x, selected == 0);
+    print_button (dialog, " Help ", y, x + 14, selected == 1);
+
+    wmove(dialog, y, x+1 + 14*selected);
+    wrefresh (dialog);
+}
+
+/*
+ * Display a dialog box with a list of options that can be turned on or off
+ * The `flag' parameter is used to select between radiolist and checklist.
+ */
+int
+dialog_checklist (const char *title, const char *prompt, int height, int width,
+       int list_height, int item_no, struct dialog_list_item ** items,
+       int flag)
+
+{
+    int i, x, y, box_x, box_y;
+    int key = 0, button = 0, choice = 0, scroll = 0, max_choice, *status;
+    WINDOW *dialog, *list;
+
+    checkflag = flag;
+
+    /* Allocate space for storing item on/off status */
+    if ((status = malloc (sizeof (int) * item_no)) == NULL) {
+       endwin ();
+       fprintf (stderr,
+                "\nCan't allocate memory in dialog_checklist().\n");
+       exit (-1);
+    }
+
+    /* Initializes status */
+    for (i = 0; i < item_no; i++) {
+       status[i] = (items[i]->selected == 1); /* ON */
+       if ((!choice && status[i]) || items[i]->selected == 2) /* SELECTED */
+            choice = i + 1;
+    }
+    if (choice)
+           choice--;
+
+    max_choice = MIN (list_height, item_no);
+
+    /* center dialog box on screen */
+    x = (COLS - width) / 2;
+    y = (LINES - height) / 2;
+
+    draw_shadow (stdscr, y, x, height, width);
+
+    dialog = newwin (height, width, y, x);
+    keypad (dialog, TRUE);
+
+    draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
+    wattrset (dialog, border_attr);
+    mvwaddch (dialog, height-3, 0, ACS_LTEE);
+    for (i = 0; i < width - 2; i++)
+       waddch (dialog, ACS_HLINE);
+    wattrset (dialog, dialog_attr);
+    waddch (dialog, ACS_RTEE);
+
+    if (title != NULL && strlen(title) >= width-2 ) {
+       /* truncate long title -- mec */
+       char * title2 = malloc(width-2+1);
+       memcpy( title2, title, width-2 );
+       title2[width-2] = '\0';
+       title = title2;
+    }
+
+    if (title != NULL) {
+       wattrset (dialog, title_attr);
+       mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
+       waddstr (dialog, (char *)title);
+       waddch (dialog, ' ');
+    }
+
+    wattrset (dialog, dialog_attr);
+    print_autowrap (dialog, prompt, width - 2, 1, 3);
+
+    list_width = width - 6;
+    box_y = height - list_height - 5;
+    box_x = (width - list_width) / 2 - 1;
+
+    /* create new window for the list */
+    list = subwin (dialog, list_height, list_width, y+box_y+1, x+box_x+1);
+
+    keypad (list, TRUE);
+
+    /* draw a box around the list items */
+    draw_box (dialog, box_y, box_x, list_height + 2, list_width + 2,
+             menubox_border_attr, menubox_attr);
+
+    /* 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]->name) + 4);
+
+    check_x = (list_width - check_x) / 2;
+    item_x = check_x + 4;
+
+    if (choice >= list_height) {
+       scroll = choice - list_height + 1;
+       choice -= scroll;
+    }
+
+    /* Print the list */
+    for (i = 0; i < max_choice; i++) {
+       print_item (list, items[scroll + i]->name,
+                   status[i+scroll], i, i == choice);
+    }
+
+    print_arrows(dialog, choice, item_no, scroll,
+                       box_y, box_x + check_x + 5, list_height);
+
+    print_buttons(dialog, height, width, 0);
+
+    wnoutrefresh (list);
+    wnoutrefresh (dialog);
+    doupdate ();
+
+    while (key != ESC) {
+       key = wgetch (dialog);
+
+       for (i = 0; i < max_choice; i++)
+            if (toupper(key) == toupper(items[scroll + i]->name[0]))
+                break;
+
+
+       if ( i < max_choice || key == KEY_UP || key == KEY_DOWN ||
+           key == '+' || key == '-' ) {
+           if (key == KEY_UP || key == '-') {
+               if (!choice) {
+                   if (!scroll)
+                       continue;
+                   /* Scroll list down */
+                   if (list_height > 1) {
+                       /* De-highlight current first item */
+                       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]->name,
+                               status[scroll], 0, TRUE);
+                   wnoutrefresh (list);
+
+                   print_arrows(dialog, choice, item_no, scroll,
+                               box_y, box_x + check_x + 5, list_height);
+
+                   wrefresh (dialog);
+
+                   continue;   /* wait for another key press */
+               } else
+                   i = choice - 1;
+           } else if (key == KEY_DOWN || key == '+') {
+               if (choice == max_choice - 1) {
+                   if (scroll + choice >= item_no - 1)
+                       continue;
+                   /* Scroll list up */
+                   if (list_height > 1) {
+                       /* De-highlight current last item before scrolling up */
+                       print_item (list, items[scroll + max_choice - 1]->name,
+                                   status[scroll + max_choice - 1],
+                                   max_choice - 1, FALSE);
+                       scrollok (list, TRUE);
+                       scroll (list);
+                       scrollok (list, FALSE);
+                   }
+                   scroll++;
+                   print_item (list, items[scroll + max_choice - 1]->name,
+                               status[scroll + max_choice - 1],
+                               max_choice - 1, TRUE);
+                   wnoutrefresh (list);
+
+                   print_arrows(dialog, choice, item_no, scroll,
+                               box_y, box_x + check_x + 5, list_height);
+
+                   wrefresh (dialog);
+
+                   continue;   /* wait for another key press */
+               } else
+                   i = choice + 1;
+           }
+           if (i != choice) {
+               /* De-highlight current item */
+               print_item (list, items[scroll + choice]->name,
+                           status[scroll + choice], choice, FALSE);
+               /* Highlight new item */
+               choice = i;
+               print_item (list, items[scroll + choice]->name,
+                           status[scroll + choice], choice, TRUE);
+               wnoutrefresh (list);
+               wrefresh (dialog);
+           }
+           continue;           /* wait for another key press */
+       }
+       switch (key) {
+       case 'H':
+       case 'h':
+       case '?':
+           for (i = 0; i < item_no; i++)
+               items[i]->selected = 0;
+           items[scroll + choice]->selected = 1;
+           delwin (dialog);
+           free (status);
+           return 1;
+       case TAB:
+       case KEY_LEFT:
+       case KEY_RIGHT:
+           button = ((key == KEY_LEFT ? --button : ++button) < 0)
+                       ? 1 : (button > 1 ? 0 : button);
+
+           print_buttons(dialog, height, width, button);
+           wrefresh (dialog);
+           break;
+       case 'S':
+       case 's':
+       case ' ':
+       case '\n':
+           if (!button) {
+               if (flag == FLAG_CHECK) {
+                   status[scroll + choice] = !status[scroll + choice];
+                   wmove (list, choice, check_x);
+                   wattrset (list, check_selected_attr);
+                   wprintw (list, "[%c]", status[scroll + choice] ? 'X' : ' ');
+               } else {
+                   if (!status[scroll + choice]) {
+                       for (i = 0; i < item_no; i++)
+                           status[i] = 0;
+                       status[scroll + choice] = 1;
+                       for (i = 0; i < max_choice; i++)
+                           print_item (list, items[scroll + i]->name,
+                                       status[scroll + i], i, i == choice);
+                   }
+               }
+               wnoutrefresh (list);
+               wrefresh (dialog);
+
+               for (i = 0; i < item_no; i++) {
+                       items[i]->selected = status[i];
+               }
+            } else {
+                   for (i = 0; i < item_no; i++)
+                           items[i]->selected = 0;
+                   items[scroll + choice]->selected = 1;
+           }
+           delwin (dialog);
+           free (status);
+           return button;
+       case 'X':
+       case 'x':
+           key = ESC;
+       case ESC:
+           break;
+       }
+
+       /* Now, update everything... */
+       doupdate ();
+    }
+
+
+    delwin (dialog);
+    free (status);
+    return -1;                 /* ESC pressed */
+}
diff --git a/openwrt/package/config/colors.h b/openwrt/package/config/colors.h
new file mode 100644 (file)
index 0000000..d34dd37
--- /dev/null
@@ -0,0 +1,161 @@
+/*
+ *  colors.h -- color attribute definitions
+ *
+ *  AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+/*
+ *   Default color definitions
+ *
+ *   *_FG = foreground
+ *   *_BG = background
+ *   *_HL = highlight?
+ */
+#define SCREEN_FG                    COLOR_CYAN
+#define SCREEN_BG                    COLOR_BLUE
+#define SCREEN_HL                    TRUE
+
+#define SHADOW_FG                    COLOR_BLACK
+#define SHADOW_BG                    COLOR_BLACK
+#define SHADOW_HL                    TRUE
+
+#define DIALOG_FG                    COLOR_BLACK
+#define DIALOG_BG                    COLOR_WHITE
+#define DIALOG_HL                    FALSE
+
+#define TITLE_FG                     COLOR_YELLOW
+#define TITLE_BG                     COLOR_WHITE
+#define TITLE_HL                     TRUE
+
+#define BORDER_FG                    COLOR_WHITE
+#define BORDER_BG                    COLOR_WHITE
+#define BORDER_HL                    TRUE
+
+#define BUTTON_ACTIVE_FG             COLOR_WHITE
+#define BUTTON_ACTIVE_BG             COLOR_BLUE
+#define BUTTON_ACTIVE_HL             TRUE
+
+#define BUTTON_INACTIVE_FG           COLOR_BLACK
+#define BUTTON_INACTIVE_BG           COLOR_WHITE
+#define BUTTON_INACTIVE_HL           FALSE
+
+#define BUTTON_KEY_ACTIVE_FG         COLOR_WHITE
+#define BUTTON_KEY_ACTIVE_BG         COLOR_BLUE
+#define BUTTON_KEY_ACTIVE_HL         TRUE
+
+#define BUTTON_KEY_INACTIVE_FG       COLOR_RED
+#define BUTTON_KEY_INACTIVE_BG       COLOR_WHITE
+#define BUTTON_KEY_INACTIVE_HL       FALSE
+
+#define BUTTON_LABEL_ACTIVE_FG       COLOR_YELLOW
+#define BUTTON_LABEL_ACTIVE_BG       COLOR_BLUE
+#define BUTTON_LABEL_ACTIVE_HL       TRUE
+
+#define BUTTON_LABEL_INACTIVE_FG     COLOR_BLACK
+#define BUTTON_LABEL_INACTIVE_BG     COLOR_WHITE
+#define BUTTON_LABEL_INACTIVE_HL     TRUE
+
+#define INPUTBOX_FG                  COLOR_BLACK
+#define INPUTBOX_BG                  COLOR_WHITE
+#define INPUTBOX_HL                  FALSE
+
+#define INPUTBOX_BORDER_FG           COLOR_BLACK
+#define INPUTBOX_BORDER_BG           COLOR_WHITE
+#define INPUTBOX_BORDER_HL           FALSE
+
+#define SEARCHBOX_FG                 COLOR_BLACK
+#define SEARCHBOX_BG                 COLOR_WHITE
+#define SEARCHBOX_HL                 FALSE
+
+#define SEARCHBOX_TITLE_FG           COLOR_YELLOW
+#define SEARCHBOX_TITLE_BG           COLOR_WHITE
+#define SEARCHBOX_TITLE_HL           TRUE
+
+#define SEARCHBOX_BORDER_FG          COLOR_WHITE
+#define SEARCHBOX_BORDER_BG          COLOR_WHITE
+#define SEARCHBOX_BORDER_HL          TRUE
+
+#define POSITION_INDICATOR_FG        COLOR_YELLOW
+#define POSITION_INDICATOR_BG        COLOR_WHITE
+#define POSITION_INDICATOR_HL        TRUE
+
+#define MENUBOX_FG                   COLOR_BLACK
+#define MENUBOX_BG                   COLOR_WHITE
+#define MENUBOX_HL                   FALSE
+
+#define MENUBOX_BORDER_FG            COLOR_WHITE
+#define MENUBOX_BORDER_BG            COLOR_WHITE
+#define MENUBOX_BORDER_HL            TRUE
+
+#define ITEM_FG                      COLOR_BLACK
+#define ITEM_BG                      COLOR_WHITE
+#define ITEM_HL                      FALSE
+
+#define ITEM_SELECTED_FG             COLOR_WHITE
+#define ITEM_SELECTED_BG             COLOR_BLUE
+#define ITEM_SELECTED_HL             TRUE
+
+#define TAG_FG                       COLOR_YELLOW
+#define TAG_BG                       COLOR_WHITE
+#define TAG_HL                       TRUE
+
+#define TAG_SELECTED_FG              COLOR_YELLOW
+#define TAG_SELECTED_BG              COLOR_BLUE
+#define TAG_SELECTED_HL              TRUE
+
+#define TAG_KEY_FG                   COLOR_YELLOW
+#define TAG_KEY_BG                   COLOR_WHITE
+#define TAG_KEY_HL                   TRUE
+
+#define TAG_KEY_SELECTED_FG          COLOR_YELLOW
+#define TAG_KEY_SELECTED_BG          COLOR_BLUE
+#define TAG_KEY_SELECTED_HL          TRUE
+
+#define CHECK_FG                     COLOR_BLACK
+#define CHECK_BG                     COLOR_WHITE
+#define CHECK_HL                     FALSE
+
+#define CHECK_SELECTED_FG            COLOR_WHITE
+#define CHECK_SELECTED_BG            COLOR_BLUE
+#define CHECK_SELECTED_HL            TRUE
+
+#define UARROW_FG                    COLOR_GREEN
+#define UARROW_BG                    COLOR_WHITE
+#define UARROW_HL                    TRUE
+
+#define DARROW_FG                    COLOR_GREEN
+#define DARROW_BG                    COLOR_WHITE
+#define DARROW_HL                    TRUE
+
+/* End of default color definitions */
+
+#define C_ATTR(x,y)                  ((x ? A_BOLD : 0) | COLOR_PAIR((y)))
+#define COLOR_NAME_LEN               10
+#define COLOR_COUNT                  8
+
+/*
+ * Global variables
+ */
+
+typedef struct {
+    char name[COLOR_NAME_LEN];
+    int value;
+} color_names_st;
+
+extern color_names_st color_names[];
+extern int color_table[][3];
diff --git a/openwrt/package/config/conf.c b/openwrt/package/config/conf.c
new file mode 100644 (file)
index 0000000..46b7e08
--- /dev/null
@@ -0,0 +1,583 @@
+/*
+ * 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;
+char *defconfig_file;
+
+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";
+
+static void strip(char *str)
+{
+       char *p = str;
+       int l;
+
+       while ((isspace(*p)))
+               p++;
+       l = strlen(p);
+       if (p != str)
+               memmove(str, p, l + 1);
+       if (!l)
+               return;
+       p = str + l - 1;
+       while ((isspace(*p)))
+               *p-- = 0;
+}
+
+static void check_stdin(void)
+{
+       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);
+       }
+}
+
+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;
+
+       if (!sym_is_changable(sym)) {
+               printf("%s\n", def);
+               line[0] = '\n';
+               line[1] = 0;
+               return;
+       }
+
+       switch (input_mode) {
+       case ask_new:
+       case ask_silent:
+               if (sym_has_value(sym)) {
+                       printf("%s\n", def);
+                       return;
+               }
+               check_stdin();
+       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] == '\n') {
+                               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 *child;
+       int type;
+       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 {
+               switch (sym_get_tristate_value(sym)) {
+               case no:
+                       return 1;
+               case mod:
+                       printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
+                       return 0;
+               case yes:
+                       break;
+               }
+       }
+
+       while (1) {
+               int cnt, def;
+
+               printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
+               def_sym = sym_get_choice_value(sym);
+               cnt = def = 0;
+               line[0] = '0';
+               line[1] = 0;
+               for (child = menu->list; child; child = child->next) {
+                       if (!menu_is_visible(child))
+                               continue;
+                       if (!child->sym) {
+                               printf("%*c %s\n", indent, '*', menu_get_prompt(child));
+                               continue;
+                       }
+                       cnt++;
+                       if (child->sym == def_sym) {
+                               def = cnt;
+                               printf("%*c", indent, '>');
+                       } else
+                               printf("%*c", indent, ' ');
+                       printf(" %d. %s", cnt, menu_get_prompt(child));
+                       if (child->sym->name)
+                               printf(" (%s)", child->sym->name);
+                       if (!sym_has_value(child->sym))
+                               printf(" (NEW)");
+                       printf("\n");
+               }
+               printf("%*schoice", indent - 1, "");
+               if (cnt == 1) {
+                       printf("[1]: 1\n");
+                       goto conf_childs;
+               }
+               printf("[1-%d", cnt);
+               if (sym->help)
+                       printf("?");
+               printf("]: ");
+               switch (input_mode) {
+               case ask_new:
+               case ask_silent:
+                       if (!is_new) {
+                               cnt = def;
+                               printf("%d\n", cnt);
+                               break;
+                       }
+                       check_stdin();
+               case ask_all:
+                       fflush(stdout);
+                       fgets(line, 128, stdin);
+                       strip(line);
+                       if (line[0] == '?') {
+                               printf("\n%s\n", menu->sym->help ?
+                                       menu->sym->help : nohelp_text);
+                               continue;
+                       }
+                       if (!line[0])
+                               cnt = def;
+                       else if (isdigit(line[0]))
+                               cnt = atoi(line);
+                       else
+                               continue;
+                       break;
+               case set_random:
+                       def = (random() % cnt) + 1;
+               case set_default:
+               case set_yes:
+               case set_mod:
+               case set_no:
+                       cnt = def;
+                       printf("%d\n", cnt);
+                       break;
+               }
+
+       conf_childs:
+               for (child = menu->list; child; child = child->next) {
+                       if (!child->sym || !menu_is_visible(child))
+                               continue;
+                       if (!--cnt)
+                               break;
+               }
+               if (!child)
+                       continue;
+               if (line[strlen(line) - 1] == '?') {
+                       printf("\n%s\n", child->sym->help ?
+                               child->sym->help : nohelp_text);
+                       continue;
+               }
+               sym_set_choice_value(sym, child->sym);
+               if (child->list) {
+                       indent += 2;
+                       conf(child->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 (sym->curr.tri != 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) {
+               if (sym_is_changable(sym) && !sym_has_value(sym)) {
+                       if (!conf_cnt++)
+                               printf("*\n* Restart config...\n*\n");
+                       rootEntry = menu_get_parent_menu(menu);
+                       conf(rootEntry);
+               }
+               if (sym_is_choice(sym) && sym_get_tristate_value(sym) != mod)
+                       return;
+       }
+
+       for (child = menu->list; child; child = child->next)
+               check_conf(child);
+}
+
+int main(int ac, char **av)
+{
+       int i = 1;
+       const char *name;
+       struct stat tmpstat;
+
+       if (ac > i && av[i][0] == '-') {
+               switch (av[i++][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 'D':
+                       input_mode = set_default;
+                       defconfig_file = av[i++];
+                       if (!defconfig_file) {
+                               printf("%s: No default config file specified\n",
+                                       av[0]);
+                               exit(1);
+                       }
+                       break;
+               case 'n':
+                       input_mode = set_no;
+                       break;
+               case 'm':
+                       input_mode = set_mod;
+                       break;
+               case 'y':
+                       input_mode = set_yes;
+                       break;
+               case 'r':
+                       input_mode = set_random;
+                       srandom(time(NULL));
+                       break;
+               case 'h':
+               case '?':
+                       printf("%s [-o|-s] config\n", av[0]);
+                       exit(0);
+               }
+       }
+       name = av[i];
+       if (!name) {
+               printf("%s: configuration file missing\n", av[0]);
+       }
+       conf_parse(name);
+       //zconfdump(stdout);
+       switch (input_mode) {
+       case set_default:
+               if (!defconfig_file)
+                       defconfig_file = conf_get_default_confname();
+               if (conf_read(defconfig_file)) {
+                       printf("***\n"
+                               "*** Can't find default configuration \"%s\"!\n"
+                               "***\n", defconfig_file);
+                       exit(1);
+               }
+               break;
+       case ask_silent:
+               if (stat(".config", &tmpstat)) {
+                       printf("***\n"
+                               "*** You have not yet configured Buildroot!\n"
+                               "***\n"
+                               "*** Please run some configurator (e.g. \"make oldconfig\" or\n"
+                               "*** \"make menuconfig\" or \"make config\").\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);
+       if (conf_write(NULL)) {
+               fprintf(stderr, "\n*** Error during writing of the Buildroot configuration.\n\n");
+               return 1;
+       }
+       return 0;
+}
diff --git a/openwrt/package/config/confdata.c b/openwrt/package/config/confdata.c
new file mode 100644 (file)
index 0000000..fd3a345
--- /dev/null
@@ -0,0 +1,447 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <sys/stat.h>
+#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[] = "sysdeps/linux/defconfig";
+
+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(*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)
+{
+       struct stat buf;
+       static char fullname[PATH_MAX+1];
+       char *env, *name;
+
+       name = conf_expand_value(conf_defname);
+       env = getenv(SRCTREE);
+       if (env) {
+               sprintf(fullname, "%s/%s", env, name);
+               if (!stat(fullname, &buf))
+                       return fullname;
+       }
+       return name;
+}
+
+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 = zconf_fopen(name);
+       } else {
+               const char **names = conf_confnames;
+               while ((name = *names++)) {
+                       name = conf_expand_value(name);
+                       in = zconf_fopen(name);
+                       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 (sym->user.val)
+                               free(sym->user.val);
+               default:
+                       sym->user.val = NULL;
+                       sym->user.tri = no;
+               }
+       }
+
+       while (fgets(line, sizeof(line), in)) {
+               lineno++;
+               sym = NULL;
+               switch (line[0]) {
+               case '#':
+                       if (line[1]!=' ')
+                               continue;
+                       p = strchr(line + 2, ' ');
+                       if (!p)
+                               continue;
+                       *p++ = 0;
+                       if (strncmp(p, "is not set", 10))
+                               continue;
+                       sym = sym_find(line + 2);
+                       if (!sym) {
+                               fprintf(stderr, "%s:%d: trying to assign nonexistent symbol %s\n", name, lineno, line + 2);
+                               break;
+                       }
+                       switch (sym->type) {
+                       case S_BOOLEAN:
+                       case S_TRISTATE:
+                               sym->user.tri = no;
+                               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') {
+                                       sym->user.tri = mod;
+                                       sym->flags &= ~SYMBOL_NEW;
+                                       break;
+                               }
+                       case S_BOOLEAN:
+                               if (p[0] == 'y') {
+                                       sym->user.tri = yes;
+                                       sym->flags &= ~SYMBOL_NEW;
+                                       break;
+                               }
+                               if (p[0] == 'n') {
+                                       sym->user.tri = 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));
+                               }
+                               if (!p2) {
+                                       fprintf(stderr, "%s:%d: invalid string found\n", name, lineno);
+                                       exit(1);
+                               }
+                       case S_INT:
+                       case S_HEX:
+                               if (sym_string_valid(sym, p)) {
+                                       sym->user.val = strdup(p);
+                                       sym->flags &= ~SYMBOL_NEW;
+                               } else {
+                                       fprintf(stderr, "%s:%d: symbol value '%s' invalid for %s\n", name, lineno, p, sym->name);
+                                       exit(1);
+                               }
+                               break;
+                       default:
+                               ;
+                       }
+                       break;
+               case '\n':
+                       break;
+               default:
+                       continue;
+               }
+               if (sym && sym_is_choice_value(sym)) {
+                       struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym));
+                       switch (sym->user.tri) {
+                       case no:
+                               break;
+                       case mod:
+                               if (cs->user.tri == yes)
+                                       /* warn? */;
+                               break;
+                       case yes:
+                               if (cs->user.tri != no)
+                                       /* warn? */;
+                               cs->user.val = sym;
+                               break;
+                       }
+                       cs->user.tri = E_OR(cs->user.tri, sym->user.tri);
+                       cs->flags &= ~SYMBOL_NEW;
+               }
+       }
+       fclose(in);
+
+       if (modules_sym)
+               sym_calc_value(modules_sym);
+       for_all_symbols(i, sym) {
+               sym_calc_value(sym);
+               if (sym_has_value(sym) && !sym_is_choice_value(sym)) {
+                       if (sym->visible == no)
+                               sym->flags |= SYMBOL_NEW;
+                       switch (sym->type) {
+                       case S_STRING:
+                       case S_INT:
+                       case S_HEX:
+                               if (!sym_string_within_range(sym, sym->user.val))
+                                       sym->flags |= SYMBOL_NEW;
+                       default:
+                               break;
+                       }
+               }
+               if (!sym_is_choice(sym))
+                       continue;
+               prop = sym_get_choice_prop(sym);
+               for (e = prop->expr; e; e = e->left.expr)
+                       if (e->right.sym->visible != no)
+                               sym->flags |= e->right.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;
+       const char *basename;
+       char dirname[128], tmpname[128], newname[128];
+       int type, l;
+       const char *str;
+
+       dirname[0] = 0;
+       if (name && name[0]) {
+               struct stat st;
+               char *slash;
+
+               if (!stat(name, &st) && S_ISDIR(st.st_mode)) {
+                       strcpy(dirname, name);
+                       strcat(dirname, "/");
+                       basename = conf_def_filename;
+               } else if ((slash = strrchr(name, '/'))) {
+                       int size = slash - name + 1;
+                       memcpy(dirname, name, size);
+                       dirname[size] = 0;
+                       if (slash[1])
+                               basename = slash + 1;
+                       else
+                               basename = conf_def_filename;
+               } else
+                       basename = name;
+       } else
+               basename = conf_def_filename;
+
+       sprintf(newname, "%s.tmpconfig.%d", dirname, getpid());
+       out = fopen(newname, "w");
+       if (!out)
+               return 1;
+       out_h = NULL;
+       if (!name) {
+               out_h = fopen(".tmpconfig.h", "w");
+               if (!out_h)
+                       return 1;
+       }
+       fprintf(out, "#\n"
+                    "# Automatically generated make config: don't edit\n"
+                    "#\n");
+       if (out_h) {
+               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",
+                            getenv("VERSION"),
+                            getenv("BUILDTIME"));
+               if (getenv("EXTRA_VERSION"))
+                       fprintf(out_h, "#define BB_EXTRA_VERSION \"%s\"\n",
+                                    getenv("EXTRA_VERSION"));
+               fprintf(out_h, "\n");
+       }
+
+       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);
+                       if (out_h)
+                               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 (modules_sym->curr.tri == 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);
+                                       if (out_h)
+                                               fprintf(out_h, "#undef %s\n", sym->name);
+                                       break;
+                               case mod:
+#if 0
+                                       fprintf(out, "%s=m\n", sym->name);
+                                       if (out_h)
+                                               fprintf(out_h, "#define %s_MODULE 1\n", sym->name);
+#endif
+                                       break;
+                               case yes:
+                                       fprintf(out, "%s=y\n", sym->name);
+                                       if (out_h)
+                                               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);
+                               if (out_h)
+                                       fprintf(out_h, "#define %s \"", sym->name);
+                               do {
+                                       l = strcspn(str, "\"\\");
+                                       if (l) {
+                                               fwrite(str, l, 1, out);
+                                               if (out_h)
+                                                       fwrite(str, l, 1, out_h);
+                                       }
+                                       str += l;
+                                       while (*str == '\\' || *str == '"') {
+                                               fprintf(out, "\\%c", *str);
+                                               if (out_h)
+                                                       fprintf(out_h, "\\%c", *str);
+                                               str++;
+                                       }
+                               } while (*str);
+                               fputs("\"\n", out);
+                               if (out_h)
+                                       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);
+                                       if (out_h)
+                                               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);
+                               if (out_h)
+                                       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);
+       if (out_h) {
+               fclose(out_h);
+               rename(".tmpconfig.h", "include/config.h");
+               file_write_dep(NULL);
+       }
+       if (!name || basename != conf_def_filename) {
+               if (!name)
+                       name = conf_def_filename;
+               sprintf(tmpname, "%s.old", name);
+               rename(name, tmpname);
+       }
+       sprintf(tmpname, "%s%s", dirname, basename);
+       if (rename(newname, tmpname))
+               return 1;
+
+       sym_change_count = 0;
+
+       return 0;
+}
diff --git a/openwrt/package/config/dialog.h b/openwrt/package/config/dialog.h
new file mode 100644 (file)
index 0000000..6486cc8
--- /dev/null
@@ -0,0 +1,196 @@
+
+/*
+ *  dialog.h -- common declarations for all dialog modules
+ *
+ *  AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <sys/types.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef CURSES_LOC
+#include CURSES_LOC
+
+/*
+ * Colors in ncurses 1.9.9e do not work properly since foreground and
+ * background colors are OR'd rather than separately masked.  This version
+ * of dialog was hacked to work with ncurses 1.9.9e, making it incompatible
+ * with standard curses.  The simplest fix (to make this work with standard
+ * curses) uses the wbkgdset() function, not used in the original hack.
+ * Turn it off if we're building with 1.9.9e, since it just confuses things.
+ */
+#if defined(NCURSES_VERSION) && defined(_NEED_WRAP) && !defined(GCC_PRINTFLIKE)
+#define OLD_NCURSES 1
+#undef  wbkgdset
+#define wbkgdset(w,p) /*nothing*/
+#else
+#define OLD_NCURSES 0
+#endif
+
+#define TR(params) _tracef params
+
+#define ESC 27
+#define TAB 9
+#define MAX_LEN 2048
+#define BUF_SIZE (10*1024)
+#define MIN(x,y) (x < y ? x : y)
+#define MAX(x,y) (x > y ? x : y)
+
+
+#ifndef ACS_ULCORNER
+#define ACS_ULCORNER '+'
+#endif
+#ifndef ACS_LLCORNER
+#define ACS_LLCORNER '+'
+#endif
+#ifndef ACS_URCORNER
+#define ACS_URCORNER '+'
+#endif
+#ifndef ACS_LRCORNER
+#define ACS_LRCORNER '+'
+#endif
+#ifndef ACS_HLINE
+#define ACS_HLINE '-'
+#endif
+#ifndef ACS_VLINE
+#define ACS_VLINE '|'
+#endif
+#ifndef ACS_LTEE
+#define ACS_LTEE '+'
+#endif
+#ifndef ACS_RTEE
+#define ACS_RTEE '+'
+#endif
+#ifndef ACS_UARROW
+#define ACS_UARROW '^'
+#endif
+#ifndef ACS_DARROW
+#define ACS_DARROW 'v'
+#endif
+
+/*
+ * Attribute names
+ */
+#define screen_attr                   attributes[0]
+#define shadow_attr                   attributes[1]
+#define dialog_attr                   attributes[2]
+#define title_attr                    attributes[3]
+#define border_attr                   attributes[4]
+#define button_active_attr            attributes[5]
+#define button_inactive_attr          attributes[6]
+#define button_key_active_attr        attributes[7]
+#define button_key_inactive_attr      attributes[8]
+#define button_label_active_attr      attributes[9]
+#define button_label_inactive_attr    attributes[10]
+#define inputbox_attr                 attributes[11]
+#define inputbox_border_attr          attributes[12]
+#define searchbox_attr                attributes[13]
+#define searchbox_title_attr          attributes[14]
+#define searchbox_border_attr         attributes[15]
+#define position_indicator_attr       attributes[16]
+#define menubox_attr                  attributes[17]
+#define menubox_border_attr           attributes[18]
+#define item_attr                     attributes[19]
+#define item_selected_attr            attributes[20]
+#define tag_attr                      attributes[21]
+#define tag_selected_attr             attributes[22]
+#define tag_key_attr                  attributes[23]
+#define tag_key_selected_attr         attributes[24]
+#define check_attr                    attributes[25]
+#define check_selected_attr           attributes[26]
+#define uarrow_attr                   attributes[27]
+#define darrow_attr                   attributes[28]
+
+/* number of attributes */
+#define ATTRIBUTE_COUNT               29
+
+/*
+ * Global variables
+ */
+extern bool use_colors;
+
+extern chtype attributes[];
+#endif
+
+extern char *backtitle;
+
+struct dialog_list_item {
+       char *name;
+       int namelen;
+       char *tag;
+       int selected; /* Set to 1 by dialog_*() function. */
+};
+
+/*
+ * Function prototypes
+ */
+
+void init_dialog (void);
+void end_dialog (void);
+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);
+int dialog_msgbox (const char *title, const char *prompt, int height,
+               int width, int pause);
+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,
+               struct dialog_list_item ** items);
+int dialog_checklist (const char *title, const char *prompt, int height,
+               int width, int list_height, int item_no,
+               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.
+ *
+ * Mouse-generated keys are the following:
+ *   -- the first 32 are used as numbers, in addition to '0'-'9'
+ *   -- 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
+
+
+/*
+ * The `flag' parameter in checklist is used to select between
+ * radiolist and checklist
+ */
+#define FLAG_CHECK 1
+#define FLAG_RADIO 0
diff --git a/openwrt/package/config/expr.c b/openwrt/package/config/expr.c
new file mode 100644 (file)
index 0000000..10f4523
--- /dev/null
@@ -0,0 +1,1089 @@
+/*
+ * 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"
+
+#define DEBUG_EXPR     0
+
+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_alloc_or(struct expr *e1, struct expr *e2)
+{
+       if (!e1)
+               return e2;
+       return e2 ? expr_alloc_two(E_OR, 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)
+               return;
+       switch (e1->type) {
+       case E_OR:
+       case E_AND:
+               __expr_eliminate_eq(e1->type, ep1, ep2);
+       default:
+               ;
+       }
+       if (e1->type != e2->type) switch (e2->type) {
+       case E_OR:
+       case E_AND:
+               __expr_eliminate_eq(e2->type, ep1, ep2);
+       default:
+               ;
+       }
+       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_RANGE:
+       case E_NONE:
+               /* panic */;
+       }
+
+       if (DEBUG_EXPR) {
+               expr_fprint(e1, stdout);
+               printf(" = ");
+               expr_fprint(e2, stdout);
+               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);
+       }
+
+       if (DEBUG_EXPR) {
+               printf("optimize (");
+               expr_fprint(e1, stdout);
+               printf(") || (");
+               expr_fprint(e2, stdout);
+               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 ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_mod) ||
+           (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_mod))
+               // (a) && (a!='m') -> (a='y')
+               return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes);
+
+       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;
+       }
+
+       if (DEBUG_EXPR) {
+               printf("optimize (");
+               expr_fprint(e1, stdout);
+               printf(") && (");
+               expr_fprint(e2, stdout);
+               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_RANGE:
+       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 e->left.sym->curr.tri;
+       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:
+               fn(data, e->right.sym->name);
+               if (e->left.expr) {
+                       fn(data, " ^ ");
+                       expr_print(e->left.expr, fn, data, E_CHOICE);
+               }
+               break;
+       case E_RANGE:
+               fn(data, "[");
+               fn(data, e->left.sym->name);
+               fn(data, " ");
+               fn(data, e->right.sym->name);
+               fn(data, "]");
+               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);
+}
diff --git a/openwrt/package/config/expr.h b/openwrt/package/config/expr.h
new file mode 100644 (file)
index 0000000..cac51f6
--- /dev/null
@@ -0,0 +1,193 @@
+/*
+ * 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;
+       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, E_RANGE
+};
+
+union expr_data {
+       struct expr *expr;
+       struct symbol *sym;
+};
+
+struct expr {
+       enum expr_type type;
+       union expr_data left, right;
+};
+
+#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;
+};
+
+struct symbol_value {
+       void *val;
+       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;
+       enum symbol_type type;
+       struct symbol_value curr, user;
+       tristate visible;
+       int flags;
+       struct property *prop;
+       struct expr *dep, *dep2;
+       struct expr_value rev_dep;
+};
+
+#define for_all_symbols(i, sym) for (i = 0; i < 257; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER)
+
+#define 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_CHECKED         0x2000
+#define SYMBOL_CHECK_DONE      0x4000
+#define SYMBOL_WARNED          0x8000
+
+#define SYMBOL_MAXLENGTH       256
+#define SYMBOL_HASHSIZE                257
+#define SYMBOL_HASHMASK                0xff
+
+enum prop_type {
+       P_UNKNOWN, P_PROMPT, P_COMMENT, P_MENU, P_DEFAULT, P_CHOICE, P_SELECT, P_RANGE
+};
+
+struct property {
+       struct property *next;
+       struct symbol *sym;
+       enum prop_type type;
+       const char *text;
+       struct expr_value visible;
+       struct expr *expr;
+       struct menu *menu;
+       struct file *file;
+       int lineno;
+};
+
+#define for_all_properties(sym, st, tok) \
+       for (st = sym->prop; st; st = st->next) \
+               if (st->type == (tok))
+#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)
+#define for_all_prompts(sym, st) \
+       for (st = sym->prop; st; st = st->next) \
+               if (st->text)
+
+struct menu {
+       struct menu *next;
+       struct menu *parent;
+       struct menu *list;
+       struct symbol *sym;
+       struct property *prompt;
+       struct expr *dep;
+       unsigned int flags;
+       //char *help;
+       struct file *file;
+       int lineno;
+       void *data;
+};
+
+#define MENU_CHANGED           0x0001
+#define MENU_ROOT              0x0002
+
+#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;
+struct expr *expr_alloc_symbol(struct symbol *sym);
+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);
+struct expr *expr_alloc_and(struct expr *e1, struct expr *e2);
+struct expr *expr_alloc_or(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);
+
+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
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* EXPR_H */
diff --git a/openwrt/package/config/inputbox.c b/openwrt/package/config/inputbox.c
new file mode 100644 (file)
index 0000000..fa7bebc
--- /dev/null
@@ -0,0 +1,240 @@
+/*
+ *  inputbox.c -- implements the input box
+ *
+ *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "dialog.h"
+
+unsigned char dialog_input_result[MAX_LEN + 1];
+
+/*
+ *  Print the termination buttons
+ */
+static void
+print_buttons(WINDOW *dialog, int height, int width, int selected)
+{
+    int x = width / 2 - 11;
+    int y = height - 2;
+
+    print_button (dialog, "  Ok  ", y, x, selected==0);
+    print_button (dialog, " Help ", y, x + 14, selected==1);
+
+    wmove(dialog, y, x+1+14*selected);
+    wrefresh(dialog);
+}
+
+/*
+ * Display a dialog box for inputing a string
+ */
+int
+dialog_inputbox (const char *title, const char *prompt, int height, int width,
+                const char *init)
+{
+    int i, x, y, box_y, box_x, box_width;
+    int input_x = 0, scroll = 0, key = 0, button = -1;
+    unsigned char *instr = dialog_input_result;
+    WINDOW *dialog;
+
+    /* center dialog box on screen */
+    x = (COLS - width) / 2;
+    y = (LINES - height) / 2;
+
+
+    draw_shadow (stdscr, y, x, height, width);
+
+    dialog = newwin (height, width, y, x);
+    keypad (dialog, TRUE);
+
+    draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
+    wattrset (dialog, border_attr);
+    mvwaddch (dialog, height-3, 0, ACS_LTEE);
+    for (i = 0; i < width - 2; i++)
+       waddch (dialog, ACS_HLINE);
+    wattrset (dialog, dialog_attr);
+    waddch (dialog, ACS_RTEE);
+
+    if (title != NULL && strlen(title) >= width-2 ) {
+       /* truncate long title -- mec */
+       char * title2 = malloc(width-2+1);
+       memcpy( title2, title, width-2 );
+       title2[width-2] = '\0';
+       title = title2;
+    }
+
+    if (title != NULL) {
+       wattrset (dialog, title_attr);
+       mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
+       waddstr (dialog, (char *)title);
+       waddch (dialog, ' ');
+    }
+
+    wattrset (dialog, dialog_attr);
+    print_autowrap (dialog, prompt, width - 2, 1, 3);
+
+    /* Draw the input field box */
+    box_width = width - 6;
+    getyx (dialog, y, x);
+    box_y = y + 2;
+    box_x = (width - box_width) / 2;
+    draw_box (dialog, y + 1, box_x - 1, 3, box_width + 2,
+             border_attr, dialog_attr);
+
+    print_buttons(dialog, height, width, 0);
+
+    /* Set up the initial value */
+    wmove (dialog, box_y, box_x);
+    wattrset (dialog, inputbox_attr);
+
+    if (!init)
+       instr[0] = '\0';
+    else
+       strcpy (instr, init);
+
+    input_x = strlen (instr);
+
+    if (input_x >= box_width) {
+       scroll = input_x - box_width + 1;
+       input_x = box_width - 1;
+       for (i = 0; i < box_width - 1; i++)
+           waddch (dialog, instr[scroll + i]);
+    } else
+       waddstr (dialog, instr);
+
+    wmove (dialog, box_y, box_x + input_x);
+
+    wrefresh (dialog);
+
+    while (key != ESC) {
+       key = wgetch (dialog);
+
+       if (button == -1) {     /* Input box selected */
+           switch (key) {
+           case TAB:
+           case KEY_UP:
+           case KEY_DOWN:
+               break;
+           case KEY_LEFT:
+               continue;
+           case KEY_RIGHT:
+               continue;
+           case KEY_BACKSPACE:
+           case 127:
+               if (input_x || scroll) {
+                   wattrset (dialog, inputbox_attr);
+                   if (!input_x) {
+                       scroll = scroll < box_width - 1 ?
+                           0 : scroll - (box_width - 1);
+                       wmove (dialog, box_y, box_x);
+                       for (i = 0; i < box_width; i++)
+                           waddch (dialog, instr[scroll + input_x + i] ?
+                                   instr[scroll + input_x + i] : ' ');
+                       input_x = strlen (instr) - scroll;
+                   } else
+                       input_x--;
+                   instr[scroll + input_x] = '\0';
+                   mvwaddch (dialog, box_y, input_x + box_x, ' ');
+                   wmove (dialog, box_y, input_x + box_x);
+                   wrefresh (dialog);
+               }
+               continue;
+           default:
+               if (key < 0x100 && isprint (key)) {
+                   if (scroll + input_x < MAX_LEN) {
+                       wattrset (dialog, inputbox_attr);
+                       instr[scroll + input_x] = key;
+                       instr[scroll + input_x + 1] = '\0';
+                       if (input_x == box_width - 1) {
+                           scroll++;
+                           wmove (dialog, box_y, box_x);
+                           for (i = 0; i < box_width - 1; i++)
+                               waddch (dialog, instr[scroll + i]);
+                       } else {
+                           wmove (dialog, box_y, input_x++ + box_x);
+                           waddch (dialog, key);
+                       }
+                       wrefresh (dialog);
+                   } else
+                       flash ();       /* Alarm user about overflow */
+                   continue;
+               }
+           }
+       }
+       switch (key) {
+       case 'O':
+       case 'o':
+           delwin (dialog);
+           return 0;
+       case 'H':
+       case 'h':
+           delwin (dialog);
+           return 1;
+       case KEY_UP:
+       case KEY_LEFT:
+           switch (button) {
+           case -1:
+               button = 1;     /* Indicates "Cancel" button is selected */
+               print_buttons(dialog, height, width, 1);
+               break;
+           case 0:
+               button = -1;    /* Indicates input box is selected */
+               print_buttons(dialog, height, width, 0);
+               wmove (dialog, box_y, box_x + input_x);
+               wrefresh (dialog);
+               break;
+           case 1:
+               button = 0;     /* Indicates "OK" button is selected */
+               print_buttons(dialog, height, width, 0);
+               break;
+           }
+           break;
+       case TAB:
+       case KEY_DOWN:
+       case KEY_RIGHT:
+           switch (button) {
+           case -1:
+               button = 0;     /* Indicates "OK" button is selected */
+               print_buttons(dialog, height, width, 0);
+               break;
+           case 0:
+               button = 1;     /* Indicates "Cancel" button is selected */
+               print_buttons(dialog, height, width, 1);
+               break;
+           case 1:
+               button = -1;    /* Indicates input box is selected */
+               print_buttons(dialog, height, width, 0);
+               wmove (dialog, box_y, box_x + input_x);
+               wrefresh (dialog);
+               break;
+           }
+           break;
+       case ' ':
+       case '\n':
+           delwin (dialog);
+           return (button == -1 ? 0 : button);
+       case 'X':
+       case 'x':
+           key = ESC;
+       case ESC:
+           break;
+       }
+    }
+
+    delwin (dialog);
+    return -1;                 /* ESC pressed */
+}
diff --git a/openwrt/package/config/lex.zconf.c_shipped b/openwrt/package/config/lex.zconf.c_shipped
new file mode 100644 (file)
index 0000000..b877bb6
--- /dev/null
@@ -0,0 +1,3688 @@
+
+#line 3 "lex.zconf.c"
+
+#define  YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 31
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with  platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN               (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN              (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN              (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX               (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX              (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX              (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX              (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX             (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX             (4294967295U)
+#endif
+
+#endif /* ! FLEXINT_H */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else  /* ! __cplusplus */
+
+#if __STDC__
+
+#define YY_USE_CONST
+
+#endif /* __STDC__ */
+#endif /* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#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 zconfrestart(zconfin  )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 16384
+#endif
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+extern int zconfleng;
+
+extern FILE *zconfin, *zconfout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+    #define YY_LESS_LINENO(n)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+       do \
+               { \
+               /* Undo effects of setting up zconftext. */ \
+        int yyless_macro_arg = (n); \
+        YY_LESS_LINENO(yyless_macro_arg);\
+               *yy_cp = (yy_hold_char); \
+               YY_RESTORE_YY_MORE_OFFSET \
+               (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+               YY_DO_BEFORE_ACTION; /* set up zconftext 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).
+ */
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef unsigned int yy_size_t;
+#endif
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+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;
+
+    int yy_bs_lineno; /**< The line count. */
+    int yy_bs_column; /**< The column count. */
+
+       /* 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 zconfrestart()), so that the user can continue scanning by
+        * just pointing zconfin at a new input file.
+        */
+#define YY_BUFFER_EOF_PENDING 2
+
+       };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
+
+/* 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".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+                          ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+                          : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when zconftext is formed. */
+static char yy_hold_char;
+static int yy_n_chars;         /* number of characters read into yy_ch_buf */
+int zconfleng;
+
+/* 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 zconfwrap()'s to do buffer switches
+ * instead of setting up a fresh zconfin.  A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void zconfrestart (FILE *input_file  );
+void zconf_switch_to_buffer (YY_BUFFER_STATE new_buffer  );
+YY_BUFFER_STATE zconf_create_buffer (FILE *file,int size  );
+void zconf_delete_buffer (YY_BUFFER_STATE b  );
+void zconf_flush_buffer (YY_BUFFER_STATE b  );
+void zconfpush_buffer_state (YY_BUFFER_STATE new_buffer  );
+void zconfpop_buffer_state (void );
+
+static void zconfensure_buffer_stack (void );
+static void zconf_load_buffer_state (void );
+static void zconf_init_buffer (YY_BUFFER_STATE b,FILE *file  );
+
+#define YY_FLUSH_BUFFER zconf_flush_buffer(YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE zconf_scan_buffer (char *base,yy_size_t size  );
+YY_BUFFER_STATE zconf_scan_string (yyconst char *yy_str  );
+YY_BUFFER_STATE zconf_scan_bytes (yyconst char *bytes,int len  );
+
+void *zconfalloc (yy_size_t  );
+void *zconfrealloc (void *,yy_size_t  );
+void zconffree (void *  );
+
+#define yy_new_buffer zconf_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+       { \
+       if ( ! YY_CURRENT_BUFFER ){ \
+        zconfensure_buffer_stack (); \
+               YY_CURRENT_BUFFER_LVALUE =    \
+            zconf_create_buffer(zconfin,YY_BUF_SIZE ); \
+       } \
+       YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+       }
+
+#define yy_set_bol(at_bol) \
+       { \
+       if ( ! YY_CURRENT_BUFFER ){\
+        zconfensure_buffer_stack (); \
+               YY_CURRENT_BUFFER_LVALUE =    \
+            zconf_create_buffer(zconfin,YY_BUF_SIZE ); \
+       } \
+       YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+       }
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define zconfwrap(n) 1
+#define YY_SKIP_YYWRAP
+
+typedef unsigned char YY_CHAR;
+
+FILE *zconfin = (FILE *) 0, *zconfout = (FILE *) 0;
+
+typedef int yy_state_type;
+
+extern int zconflineno;
+
+int zconflineno = 1;
+
+extern char *zconftext;
+#define yytext_ptr zconftext
+static yyconst flex_int16_t yy_nxt[][38] =
+    {
+    {
+        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,    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,   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,   12
+    },
+
+    {
+       11,   16,   16,   17,   16,   16,   16,   16,   16,   16,
+       16,   16,   16,   18,   16,   16,   18,   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,   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,   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,   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,   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,   34
+    },
+
+    {
+       11,   38,   38,   39,   40,   41,   42,   43,   41,   44,
+       45,   46,   47,   47,   48,   49,   47,   47,   47,   47,
+       47,   47,   47,   47,   47,   50,   47,   47,   47,   51,
+       47,   47,   47,   47,   47,   47,   47,   52
+
+    },
+
+    {
+       11,   38,   38,   39,   40,   41,   42,   43,   41,   44,
+       45,   46,   47,   47,   48,   49,   47,   47,   47,   47,
+       47,   47,   47,   47,   47,   50,   47,   47,   47,   51,
+       47,   47,   47,   47,   47,   47,   47,   52
+    },
+
+    {
+      -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
+    },
+
+    {
+       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,  -12
+    },
+
+    {
+       11,  -13,   53,   54,  -13,  -13,   55,  -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,  -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,  -14
+
+    },
+
+    {
+       11,   56,   56,   57,   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,  -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,  -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,  -17
+    },
+
+    {
+       11,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,
+      -18,  -18,  -18,   58,  -18,  -18,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -18
+    },
+
+    {
+       11,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,
+      -19,  -19,  -19,   58,  -19,  -19,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   59,
+       58,   58,   58,   58,   58,   58,   58,  -19
+
+    },
+
+    {
+       11,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,
+      -20,  -20,  -20,   58,  -20,  -20,   58,   58,   58,   58,
+       58,   58,   58,   58,   60,   58,   58,   58,   58,   61,
+       58,   58,   58,   58,   58,   58,   58,  -20
+    },
+
+    {
+       11,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,
+      -21,  -21,  -21,   58,  -21,  -21,   58,   58,   58,   58,
+       58,   62,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -21
+    },
+
+    {
+       11,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,
+      -22,  -22,  -22,   58,  -22,  -22,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,   58,   58,   58,   63,   58,
+       58,   58,   58,   58,   58,   58,   58,  -22
+    },
+
+    {
+       11,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,
+      -23,  -23,  -23,   58,  -23,  -23,   58,   58,   58,   58,
+       58,   64,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -23
+    },
+
+    {
+       11,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,
+      -24,  -24,  -24,   58,  -24,  -24,   58,   58,   58,   58,
+       58,   58,   65,   58,   58,   58,   58,   58,   66,   58,
+       58,   58,   58,   58,   58,   58,   58,  -24
+
+    },
+
+    {
+       11,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,
+      -25,  -25,  -25,   58,  -25,  -25,   58,   67,   58,   58,
+       58,   68,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -25
+    },
+
+    {
+       11,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,
+      -26,  -26,  -26,   58,  -26,  -26,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       69,   58,   58,   58,   58,   58,   58,  -26
+    },
+
+    {
+       11,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,
+      -27,  -27,  -27,   58,  -27,  -27,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   70,   58,   58,   58,   58,  -27
+    },
+
+    {
+       11,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,
+      -28,  -28,  -28,   58,  -28,  -28,   58,   71,   58,   58,
+       58,   72,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -28
+    },
+
+    {
+       11,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,
+      -29,  -29,  -29,   58,  -29,  -29,   58,   58,   58,   58,
+       58,   73,   58,   58,   58,   58,   58,   58,   58,   74,
+       58,   58,   58,   58,   75,   58,   58,  -29
+
+    },
+
+    {
+       11,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,
+      -30,  -30,  -30,   58,  -30,  -30,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   76,   58,   58,   58,   58,  -30
+    },
+
+    {
+       11,   77,   77,  -31,   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,   77
+    },
+
+    {
+       11,  -32,   78,   79,  -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,  -32
+    },
+
+    {
+       11,   80,  -33,  -33,   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,   82,   81,  -34,   81,   81,  -34,   81,
+       81,   81,   81,   81,   81,  -34,   81,   81,   81,   81,
+       81,   81,   81,   81,   81,   81,   81,   81,   81,   81,
+       81,   81,   81,   81,   81,   81,   81,   81
+
+    },
+
+    {
+       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,  -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,  -36
+    },
+
+    {
+       11,   83,   83,   84,   83,   83,   83,   83,   83,   83,
+       83,   83,   83,   83,   83,   83,   83,   83,   83,   83,
+
+       83,   83,   83,   83,   83,   83,   83,   83,   83,   83,
+       83,   83,   83,   83,   83,   83,   83,   83
+    },
+
+    {
+       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,  -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,  -39
+
+    },
+
+    {
+       11,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,
+      -40,  -40,  -40,  -40,   85,  -40,  -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,  -41
+    },
+
+    {
+       11,   86,   86,  -42,   86,   86,   86,   86,   86,   86,
+       86,   86,   86,   86,   86,   86,   86,   86,   86,   86,
+
+       86,   86,   86,   86,   86,   86,   86,   86,   86,   86,
+       86,   86,   86,   86,   86,   86,   86,   86
+    },
+
+    {
+       11,  -43,  -43,  -43,  -43,  -43,  -43,   87,  -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,  -44
+
+    },
+
+    {
+       11,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,
+      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,
+      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,
+      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45
+    },
+
+    {
+       11,  -46,  -46,  -46,  -46,  -46,  -46,  -46,  -46,  -46,
+      -46,   88,   89,   89,  -46,  -46,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,  -46
+    },
+
+    {
+       11,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,
+      -47,   89,   89,   89,  -47,  -47,   89,   89,   89,   89,
+
+       89,   89,   89,   89,   89,   89,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,  -47
+    },
+
+    {
+       11,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,
+      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,
+      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,
+      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48
+    },
+
+    {
+       11,  -49,  -49,   90,  -49,  -49,  -49,  -49,  -49,  -49,
+      -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,
+      -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,
+      -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49
+
+    },
+
+    {
+       11,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,
+      -50,   89,   89,   89,  -50,  -50,   89,   89,   89,   89,
+       89,   89,   91,   89,   89,   89,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,  -50
+    },
+
+    {
+       11,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,
+      -51,   89,   89,   89,  -51,  -51,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,   89,   92,   89,
+       89,   89,   89,   89,   89,   89,   89,  -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,   93
+    },
+
+    {
+       11,  -53,   53,   54,  -53,  -53,   55,  -53,  -53,  -53,
+      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,
+      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,
+      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53
+    },
+
+    {
+       11,  -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,  -54,  -54,  -54,  -54
+
+    },
+
+    {
+       11,   56,   56,   57,   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,   56,   56,   57,   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,  -57,  -57,  -57,  -57,  -57,  -57,  -57,
+
+      -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,
+      -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57
+    },
+
+    {
+       11,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,
+      -58,  -58,  -58,   58,  -58,  -58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -58
+    },
+
+    {
+       11,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,
+      -59,  -59,  -59,   58,  -59,  -59,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   94,
+       58,   58,   58,   58,   58,   58,   58,  -59
+
+    },
+
+    {
+       11,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,
+      -60,  -60,  -60,   58,  -60,  -60,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   95,
+       58,   58,   58,   58,   58,   58,   58,  -60
+    },
+
+    {
+       11,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,
+      -61,  -61,  -61,   58,  -61,  -61,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   96,   97,   58,
+       58,   58,   58,   58,   58,   58,   58,  -61
+    },
+
+    {
+       11,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,
+      -62,  -62,  -62,   58,  -62,  -62,   58,   58,   58,   58,
+
+       58,   58,   98,   58,   58,   58,   58,   58,   58,   58,
+       99,   58,   58,   58,   58,   58,   58,  -62
+    },
+
+    {
+       11,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,
+      -63,  -63,  -63,   58,  -63,  -63,   58,  100,   58,   58,
+      101,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -63
+    },
+
+    {
+       11,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,
+      -64,  -64,  -64,   58,  -64,  -64,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,  102,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,  103,  -64
+
+    },
+
+    {
+       11,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,
+      -65,  -65,  -65,   58,  -65,  -65,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -65
+    },
+
+    {
+       11,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,
+      -66,  -66,  -66,   58,  -66,  -66,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,  104,   58,   58,  -66
+    },
+
+    {
+       11,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,
+      -67,  -67,  -67,   58,  -67,  -67,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,  105,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -67
+    },
+
+    {
+       11,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,
+      -68,  -68,  -68,   58,  -68,  -68,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,  106,   58,
+       58,   58,   58,   58,   58,   58,   58,  -68
+    },
+
+    {
+       11,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,
+      -69,  -69,  -69,   58,  -69,  -69,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,  107,   58,   58,  -69
+
+    },
+
+    {
+       11,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,
+      -70,  -70,  -70,   58,  -70,  -70,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,  108,
+       58,   58,   58,   58,   58,   58,   58,  -70
+    },
+
+    {
+       11,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,
+      -71,  -71,  -71,   58,  -71,  -71,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,  109,   58,
+       58,   58,   58,   58,   58,   58,   58,  -71
+    },
+
+    {
+       11,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,
+      -72,  -72,  -72,   58,  -72,  -72,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,  110,   58,   58,   58,   58,   58,  -72
+    },
+
+    {
+       11,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,
+      -73,  -73,  -73,   58,  -73,  -73,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,  111,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -73
+    },
+
+    {
+       11,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,
+      -74,  -74,  -74,   58,  -74,  -74,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  112,   58,  -74
+
+    },
+
+    {
+       11,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,
+      -75,  -75,  -75,   58,  -75,  -75,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,  113,   58,   58,   58,   58,  -75
+    },
+
+    {
+       11,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,
+      -76,  -76,  -76,   58,  -76,  -76,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  114,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -76
+    },
+
+    {
+       11,   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,   77,   77,   77,   77
+    },
+
+    {
+       11,  -78,   78,   79,  -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,   80,  -79,  -79,   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,  -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,  -80
+    },
+
+    {
+       11,   81,   81,   82,   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,  -82
+    },
+
+    {
+       11,  -83,  -83,   84,  -83,  -83,  -83,  -83,  -83,  -83,
+      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,
+      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,
+      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -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,  -84
+
+    },
+
+    {
+       11,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,
+      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,
+      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,
+      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85
+    },
+
+    {
+       11,   86,   86,  -86,   86,   86,   86,   86,   86,   86,
+       86,   86,   86,   86,   86,   86,   86,   86,   86,   86,
+       86,   86,   86,   86,   86,   86,   86,   86,   86,   86,
+       86,   86,   86,   86,   86,   86,   86,   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,  -87
+    },
+
+    {
+       11,  -88,  -88,  -88,  -88,  -88,  -88,  -88,  -88,  -88,
+      -88,  115,   89,   89,  -88,  -88,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,  -88
+    },
+
+    {
+       11,  -89,  -89,  -89,  -89,  -89,  -89,  -89,  -89,  -89,
+      -89,   89,   89,   89,  -89,  -89,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,  -89
+
+    },
+
+    {
+       11,  -90,  -90,  -90,  -90,  -90,  -90,  -90,  -90,  -90,
+      -90,  -90,  -90,  -90,  -90,  -90,  -90,  -90,  -90,  -90,
+      -90,  -90,  -90,  -90,  -90,  -90,  -90,  -90,  -90,  -90,
+      -90,  -90,  -90,  -90,  -90,  -90,  -90,  -90
+    },
+
+    {
+       11,  -91,  -91,  -91,  -91,  -91,  -91,  -91,  -91,  -91,
+      -91,   89,   89,   89,  -91,  -91,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,  -91
+    },
+
+    {
+       11,  -92,  -92,  -92,  -92,  -92,  -92,  -92,  -92,  -92,
+      -92,   89,   89,   89,  -92,  -92,   89,   89,   89,   89,
+
+       89,   89,   89,   89,   89,   89,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,  -92
+    },
+
+    {
+       11,  -93,  -93,  -93,  -93,  -93,  -93,  -93,  -93,  -93,
+      -93,  -93,  -93,  -93,  -93,  -93,  -93,  -93,  -93,  -93,
+      -93,  -93,  -93,  -93,  -93,  -93,  -93,  -93,  -93,  -93,
+      -93,  -93,  -93,  -93,  -93,  -93,  -93,  -93
+    },
+
+    {
+       11,  -94,  -94,  -94,  -94,  -94,  -94,  -94,  -94,  -94,
+      -94,  -94,  -94,   58,  -94,  -94,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,  116,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -94
+
+    },
+
+    {
+       11,  -95,  -95,  -95,  -95,  -95,  -95,  -95,  -95,  -95,
+      -95,  -95,  -95,   58,  -95,  -95,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  117,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -95
+    },
+
+    {
+       11,  -96,  -96,  -96,  -96,  -96,  -96,  -96,  -96,  -96,
+      -96,  -96,  -96,   58,  -96,  -96,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  118,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -96
+    },
+
+    {
+       11,  -97,  -97,  -97,  -97,  -97,  -97,  -97,  -97,  -97,
+      -97,  -97,  -97,   58,  -97,  -97,   58,   58,   58,   58,
+
+       58,   58,  119,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -97
+    },
+
+    {
+       11,  -98,  -98,  -98,  -98,  -98,  -98,  -98,  -98,  -98,
+      -98,  -98,  -98,   58,  -98,  -98,  120,  121,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -98
+    },
+
+    {
+       11,  -99,  -99,  -99,  -99,  -99,  -99,  -99,  -99,  -99,
+      -99,  -99,  -99,   58,  -99,  -99,   58,   58,   58,   58,
+       58,  122,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -99
+
+    },
+
+    {
+       11, -100, -100, -100, -100, -100, -100, -100, -100, -100,
+     -100, -100, -100,   58, -100, -100,   58,   58,  123,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -100
+    },
+
+    {
+       11, -101, -101, -101, -101, -101, -101, -101, -101, -101,
+     -101, -101, -101,   58, -101, -101,   58,   58,   58,  124,
+       58,   58,   58,   58,   58,  125,   58,  126,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -101
+    },
+
+    {
+       11, -102, -102, -102, -102, -102, -102, -102, -102, -102,
+     -102, -102, -102,   58, -102, -102,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+      127,   58,   58,   58,   58,   58,   58, -102
+    },
+
+    {
+       11, -103, -103, -103, -103, -103, -103, -103, -103, -103,
+     -103, -103, -103,   58, -103, -103,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -103
+    },
+
+    {
+       11, -104, -104, -104, -104, -104, -104, -104, -104, -104,
+     -104, -104, -104,   58, -104, -104,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -104
+
+    },
+
+    {
+       11, -105, -105, -105, -105, -105, -105, -105, -105, -105,
+     -105, -105, -105,   58, -105, -105,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,  128,   58,
+       58,   58,   58,   58,   58,   58,   58, -105
+    },
+
+    {
+       11, -106, -106, -106, -106, -106, -106, -106, -106, -106,
+     -106, -106, -106,   58, -106, -106,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  129,   58, -106
+    },
+
+    {
+       11, -107, -107, -107, -107, -107, -107, -107, -107, -107,
+     -107, -107, -107,   58, -107, -107,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,  130,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -107
+    },
+
+    {
+       11, -108, -108, -108, -108, -108, -108, -108, -108, -108,
+     -108, -108, -108,   58, -108, -108,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  131,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -108
+    },
+
+    {
+       11, -109, -109, -109, -109, -109, -109, -109, -109, -109,
+     -109, -109, -109,   58, -109, -109,   58,   58,   58,   58,
+       58,   58,   58,  132,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -109
+
+    },
+
+    {
+       11, -110, -110, -110, -110, -110, -110, -110, -110, -110,
+     -110, -110, -110,   58, -110, -110,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  133,   58, -110
+    },
+
+    {
+       11, -111, -111, -111, -111, -111, -111, -111, -111, -111,
+     -111, -111, -111,   58, -111, -111,   58,   58,   58,   58,
+       58,  134,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -111
+    },
+
+    {
+       11, -112, -112, -112, -112, -112, -112, -112, -112, -112,
+     -112, -112, -112,   58, -112, -112,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,  135,   58,   58,   58,   58, -112
+    },
+
+    {
+       11, -113, -113, -113, -113, -113, -113, -113, -113, -113,
+     -113, -113, -113,   58, -113, -113,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  136,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -113
+    },
+
+    {
+       11, -114, -114, -114, -114, -114, -114, -114, -114, -114,
+     -114, -114, -114,   58, -114, -114,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,  137,   58,   58,   58, -114
+
+    },
+
+    {
+       11, -115, -115, -115, -115, -115, -115, -115, -115, -115,
+     -115,   89,   89,   89, -115, -115,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89, -115
+    },
+
+    {
+       11, -116, -116, -116, -116, -116, -116, -116, -116, -116,
+     -116, -116, -116,   58, -116, -116,   58,   58,   58,   58,
+       58,  138,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -116
+    },
+
+    {
+       11, -117, -117, -117, -117, -117, -117, -117, -117, -117,
+     -117, -117, -117,   58, -117, -117,   58,   58,   58,  139,
+
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -117
+    },
+
+    {
+       11, -118, -118, -118, -118, -118, -118, -118, -118, -118,
+     -118, -118, -118,   58, -118, -118,   58,   58,   58,   58,
+       58,  140,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -118
+    },
+
+    {
+       11, -119, -119, -119, -119, -119, -119, -119, -119, -119,
+     -119, -119, -119,   58, -119, -119,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  141,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -119
+
+    },
+
+    {
+       11, -120, -120, -120, -120, -120, -120, -120, -120, -120,
+     -120, -120, -120,   58, -120, -120,   58,   58,  142,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,  143,   58,   58, -120
+    },
+
+    {
+       11, -121, -121, -121, -121, -121, -121, -121, -121, -121,
+     -121, -121, -121,   58, -121, -121,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  144,   58, -121
+    },
+
+    {
+       11, -122, -122, -122, -122, -122, -122, -122, -122, -122,
+     -122, -122, -122,   58, -122, -122,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,   58,   58,   58,  145,   58,
+       58,   58,   58,   58,   58,   58,   58, -122
+    },
+
+    {
+       11, -123, -123, -123, -123, -123, -123, -123, -123, -123,
+     -123, -123, -123,   58, -123, -123,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,  146,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -123
+    },
+
+    {
+       11, -124, -124, -124, -124, -124, -124, -124, -124, -124,
+     -124, -124, -124,   58, -124, -124,   58,   58,   58,   58,
+       58,   58,   58,   58,  147,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -124
+
+    },
+
+    {
+       11, -125, -125, -125, -125, -125, -125, -125, -125, -125,
+     -125, -125, -125,   58, -125, -125,   58,   58,   58,   58,
+       58,   58,  148,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -125
+    },
+
+    {
+       11, -126, -126, -126, -126, -126, -126, -126, -126, -126,
+     -126, -126, -126,   58, -126, -126,   58,   58,   58,   58,
+       58,  149,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -126
+    },
+
+    {
+       11, -127, -127, -127, -127, -127, -127, -127, -127, -127,
+     -127, -127, -127,   58, -127, -127,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -127
+    },
+
+    {
+       11, -128, -128, -128, -128, -128, -128, -128, -128, -128,
+     -128, -128, -128,   58, -128, -128,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  150,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -128
+    },
+
+    {
+       11, -129, -129, -129, -129, -129, -129, -129, -129, -129,
+     -129, -129, -129,   58, -129, -129,   58,   58,   58,  151,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,  &n