#! /bin/sh
#
# This script is used to configure BusyBox.
#
# It was inspired by a desire to not have to hit <enter> 9 million times
# or startup the X server just to change a single kernel parameter.  
#
# This script attempts to parse the configuration files, which are
# scattered throughout the kernel source tree, and creates a temporary
# set of mini scripts which are in turn used to create nested menus and
# radiolists.
#
# It uses a very modified/mutilated version of the "dialog" utility
# written by Savio Lam (lam836@cs.cuhk.hk). Savio is not responsible
# for this script or the version of dialog used by this script.
# Please do not contact him with questions. The official version of 
# dialog is available at sunsite.unc.edu or a sunsite mirror.
#
# Portions of this script were borrowed from the original Configure
# script.
#
# William Roadcap was the original author of Menuconfig.
# Michael Elizabeth Chastain (mec@shout.net) is the current maintainer.
#
# 070497 Bernhard Kaindl (bkaindl@netway.at) - get default values for
# new bool, tristate and dep_tristate parameters from the defconfig file.
# new configuration parameters are marked with '(NEW)' as in make config.
#
# 180697 Bernhard Kaindl (bkaindl@netway.at) - added the needed support
# for string options. They are handled like the int and hex options.
#
# 081297 Pavel Machek (pavel@atrey.karlin.mff.cuni.cz) - better error 
# handling
#
# 131197 Michael Chastain (mec@shout.net) - output all lines for a
# choice list, not just the selected one.  This makes the output
# the same as Configure output, which is important for smart config
# dependencies.
#
# 101297 Michael Chastain (mec@shout.net) - remove sound driver cruft.
#
# 221297 Michael Chastain (mec@shout.net) - make define_bool actually
# define its arguments so that later tests on them work right.
#
# 160198 Michael Chastain (mec@shout.net) - fix bug with 'c' command
# (complement existing value) when used on virgin uninitialized variables.
#
# 090398 Axel Boldt (boldt@math.ucsb.edu) - allow for empty lines in help
# texts.
#
# 12 Dec 1998, Michael Elizabeth Chastain (mec@shout.net)
# Remove a /tmp security hole in get_def (also makes it faster).
# Give uninitialized variables canonical values rather than null value.
# Change a lot of places to call set_x_info uniformly.
# Take out message about preparing version (old sound driver cruft).
#
# 13 Dec 1998, Riley H Williams <rhw@memalpha.cx>
# When an error occurs, actually display the error message as well as
# our comments thereon.
#
# 31 Dec 1998, Michael Elizabeth Chastain (mec@shout.net)
# Fix mod_bool to honor $CONFIG_MODULES.
# Fix dep_tristate to call define_bool when dependency is "n".
#
# 02 January 1999, Michael Elizabeth Chastain (mec@shout.net)
# Blow away lxdialog.scrltmp on entry to activate_menu.  This protects
# against people who use commands like ' ' to select menus.
#
# 24 January 1999, Michael Elizabeth Chastain, <mec@shout.net>
# - Improve the exit message (Jeff Ronne).
#
# 06 July 1999, Andrzej M. Krzysztofowicz, <ankry@mif.pg.gda.pl>
# - Support for multiple conditions in dep_tristate().
# - Implemented new functions: define_tristate(), define_int(), define_hex(),
#   define_string(), dep_bool().
# 
# 22 October 2001, Erik Andersen <andersee@debian.org>
# - Adjusted for busybox (modified hard coded kernel specific paths, 
#   and everything to do with modules (tristates, modbools, etc).


#
# Change this to TRUE if you prefer all options listed
# in a single menu rather than the standard menu hierarchy.
#
single_menu_mode=

#
# Make sure we're really running bash.
#
[ -z "$BASH" ] && { echo "Menuconfig requires bash" 1>&2; exit 1; }

#
# Cache function definitions, turn off posix compliance
#
set -h +o posix



# Given a configuration variable, set the global variable $x to its value,
# and the global variable $info to the string " (NEW)" if this is a new
# variable.
#
# This function looks for: (1) the current value, or (2) the default value
# from the arch-dependent defconfig file, or (3) a default passed by the caller.

function set_x_info () {
    eval x=\$$1
    if [ -z "$x" ]; then
	eval `sed -n -e 's/# \(.*\) is not set.*/\1=n/' -e "/^$1=/p" sysdeps/$TARGET_OS/defconfig`
	eval x=\${$1:-"$2"}
	eval $1=$x
	eval INFO_$1="' (NEW)'"
    fi
    eval info="\$INFO_$1"
}

#
# Load the functions used by the config.in files.
#
# I do this because these functions must be redefined depending
# on whether they are being called for interactive use or for
# saving a configuration to a file.
#
# Thank the heavens bash supports nesting function definitions.
#
load_functions () {

#
# Additional comments
#
function comment () {
	comment_ctr=$[ comment_ctr + 1 ]
	echo -ne "': $comment_ctr' '--- $1' " >>MCmenu
}

#
# Define a boolean to a specific value.
#
function define_bool () {
	eval $1=$2
}

function define_hex () {
	eval $1=$2
}

function define_int () {
	eval $1=$2
}

function define_string () {
	eval $1="$2"
}

#
# Create a boolean (Yes/No) function for our current menu
# which calls our local bool function.
#
function bool () {
	set_x_info "$2" "n"

	case $x in
	y|m)	flag="*" ;;
	n)	flag=" " ;;
	esac

	echo -ne "'$2' '[$flag] $1$info' " >>MCmenu

	echo -e "function $2 () { l_bool '$2' \"\$1\" ;}\n" >>MCradiolists
}

#
#   Same as above, but now only Y and N are allowed as dependency
#   (i.e. third and next arguments).
#
function dep_bool () {
	ques="$1"
	var="$2"
	dep=y
	shift 2
	while [ $# -gt 0 ]; do
		if [ "$1" = y ]; then
			shift
		else
			dep=n
			shift $#
		fi
	done
	if [ "$dep" = y ]; then
	    bool "$ques" "$var"
	else 
	    define_bool "$var" n
	fi
}

function dep_mbool () {
	ques="$1"
	var="$2"
	dep=y
	shift 2
	while [ $# -gt 0 ]; do
		if [ "$1" = y -o "$1" = m ]; then
			shift
		else
			dep=n
			shift $#
		fi
	done
	if [ "$dep" = y ]; then
	    bool "$ques" "$var"
	else 
	    define_bool "$var" n
	fi
}

#
# Add a menu item which will call our local int function.
# 
function int () {
	set_x_info "$2" "$3"

	echo -ne "'$2' '($x) $1$info' " >>MCmenu

	echo -e "function $2 () { l_int '$1' '$2' '$3' '$x' ;}" >>MCradiolists
}

#
# Add a menu item which will call our local hex function.
# 
function hex () {
	set_x_info "$2" "$3"
	x=${x##*[x,X]}

	echo -ne "'$2' '($x) $1$info' " >>MCmenu

	echo -e "function $2 () { l_hex '$1' '$2' '$3' '$x' ;}" >>MCradiolists
}

#
# Add a menu item which will call our local string function.
# 
function string () {
	set_x_info "$2" "$3"

	echo -ne "'$2' '     $1: \"$x\"$info' " >>MCmenu

	echo -e "function $2 () { l_string '$1' '$2' '$3' '$x' ;}" >>MCradiolists
}

#
# Add a menu item which will call our local One-of-Many choice list.
#
function choice () {
	#
	# Need to remember params cause they're gonna get reset.
	#
	title=$1
	choices=$2
	default=$3
	current=

	#
	# Find out if one of the choices is already set.
	# If it's not then make it the default.
	#
	set -- $choices
	firstchoice=$2

	while [ -n "$2" ]
	do
		if eval [ "_\$$2" = "_y" ]
		then
			current=$1
			break
		fi
		shift ; shift
	done

	: ${current:=$default}

	echo -ne "'$firstchoice' '($current) $title' " >>MCmenu

	echo -e "
	function $firstchoice () \
		{ l_choice '$title' \"$choices\" \"$current\" ;}" >>MCradiolists
}

} # END load_functions()





#
# Extract available help for an option from Configure.help
# and send it to standard output.
#
# Most of this function was borrowed from the original kernel
# Configure script.
#
function extract_help () {
  if [ -f docs/Configure.help ]
  then
     #first escape regexp special characters in the argument:
     var=$(echo "$1"|sed 's/[][\/.^$*]/\\&/g')
     #now pick out the right help text:
     text=$(sed -n "/^$var[ 	]*\$/,\${
                        /^$var[ 	]*\$/c\\
${var}:\\

                        /^#/b
                        /^[^ 	]/q
                        s/^  //
			/<file:\\([^>]*\\)>/s//\\1/g
                        p
		    }" docs/Configure.help)

     if [ -z "$text" ]
     then
          echo "There is no help available for this option."
	  return 1
     else
	  echo "$text"
     fi
  else
	 echo "There is no help available for this option."
         return 1
  fi
}

#
# Activate a help dialog.
#
function help () {
	if extract_help $1 >help.out
	then
		$DIALOG	--backtitle "$backtitle" --title "$2"\
			--textbox help.out $ROWS $COLS
	else
		$DIALOG	--backtitle "$backtitle" \
			--textbox help.out $ROWS $COLS
	fi
	rm -f help.out
}

#
# Show the README file.
#
function show_readme () {
	$DIALOG --backtitle "$backtitle" \
		--textbox scripts/README.Menuconfig $ROWS $COLS
}

#
# Begin building the dialog menu command and Initialize the 
# Radiolist function file.
#
function menu_name () {
	echo -ne "$DIALOG --title '$1'\
			--backtitle '$backtitle' \
			--menu '$menu_instructions' \
			$ROWS $COLS $((ROWS-10)) \
			'$default' " >MCmenu
	>MCradiolists
}

#
# Add a submenu option to the menu currently under construction.
#
function submenu () {
	echo -ne "'activate_menu $2' '$1  --->' " >>MCmenu
}

#
# Handle a boolean (Yes/No) option.
#
function l_bool () {
	if [ -n "$2" ]
	then
		case "$2" in
		y|m)	eval $1=y ;;
		c)	eval x=\$$1
		   	case $x in
		   	y) eval $1=n ;;
		   	n) eval $1=y ;;
			*) eval $1=y ;;
		   	esac ;;
		*)	eval $1=n ;;
		esac
	else
		echo -ne "\007"
	fi
}

#
# Create a dialog for entering an integer into a option.
#
function l_int () {
	while true
	do
		if $DIALOG --title "$1" \
			--backtitle "$backtitle" \
			--inputbox "$inputbox_instructions_int" \
			10 75 "$4" 2>MCdialog.out
		then
			answer="`cat MCdialog.out`"
			answer="${answer:-$3}"

			# Semantics of + and ? in GNU expr changed, so
			# we avoid them:
			if expr "$answer" : '0$' '|' "$answer" : '[1-9][0-9]*$' '|' "$answer" : '-[1-9][0-9]*$' >/dev/null
			then
				eval $2="$answer"
			else
				eval $2="$3"
				echo -en "\007"
				${DIALOG} --backtitle "$backtitle" \
					--infobox "You have made an invalid entry." 3 43
				sleep 2
			fi

			break
		fi

		help "$2" "$1"
	done
}

#
# Create a dialog for entering a hexadecimal into an option.
#
function l_hex () {
	while true
	do
		if $DIALOG --title "$1" \
			--backtitle "$backtitle" \
			--inputbox "$inputbox_instructions_hex" \
			10 75 "$4" 2>MCdialog.out
		then
			answer="`cat MCdialog.out`"
			answer="${answer:-$3}"
			answer="${answer##*[x,X]}"

			if expr "$answer" : '[0-9a-fA-F][0-9a-fA-F]*$' >/dev/null
			then
				eval $2="$answer"
			else
				eval $2="$3"
				echo -en "\007"
				${DIALOG} --backtitle "$backtitle" \
					--infobox "You have made an invalid entry." 3 43
				sleep 2
			fi

			break
		fi

		help "$2" "$1"
	done
}

#
# Create a dialog for entering a string into an option.
#
function l_string () {
	while true
	do
		if $DIALOG --title "$1" \
			--backtitle "$backtitle" \
			--inputbox "$inputbox_instructions_string" \
			10 75 "$4" 2>MCdialog.out
		then
			answer="`cat MCdialog.out`"
			answer="${answer:-$3}"

			#
			# Someone may add a nice check for the entered
			# string here...
			#
			eval $2=\"$answer\"

			break
		fi

		help "$2" "$1"
	done
}


#
# Handle a one-of-many choice list.
#
function l_choice () {
	#
	# Need to remember params cause they're gonna get reset.
	#
	title="$1"
	choices="$2"
	current="$3"
        chosen=

	#
	# Scan current value of choices and set radiolist switches.
	#
	list=
	set -- $choices
	firstchoice=$2
	while [ -n "$2" ]
	do
		case "$1" in
		"$current"*)	if [ -z "$chosen" ]; then
					list="$list $2 $1 ON "
					chosen=1
				else
					list="$list $2 $1 OFF "
				fi  ;;
		*)		list="$list $2 $1 OFF " ;;
		esac
			
		shift ; shift
	done

	while true
	do
		if $DIALOG --title "$title" \
			--backtitle "$backtitle" \
			--radiolist "$radiolist_instructions" \
			15 70 6 $list 2>MCdialog.out
		then
			choice=`cat MCdialog.out`
			break
		fi

		help "$firstchoice" "$title"
	done

	#
	# Now set the boolean value of each option based on
	# the selection made from the radiolist.
	#
	set -- $choices
	while [ -n "$2" ]
	do
		if [ "$2" = "$choice" ]
		then
			eval $2="y"
		else
			eval $2="n"
		fi
		
		shift ; shift
	done
}

#
# Call awk, and watch for error codes, etc.
#
function callawk () {
awk "$1" || echo "Awk died with error code $?. Giving up." || exit 1
}

#
# A faster awk based recursive parser. (I hope)
#
function parser1 () {
callawk '
BEGIN {
	menu_no = 0
	comment_is_option = 0
	parser("'$CONFIG_IN'","MCmenu0")
}

function parser(ifile,menu) {

	while (getline <ifile) {
		if ($1 == "mainmenu_option") {
			comment_is_option = "1"
		}
		else if ($1 == "comment" && comment_is_option == "1") {
			comment_is_option= "0"
			sub($1,"",$0)
			++menu_no

			printf("submenu %s MCmenu%s\n", $0, menu_no) >>menu

			newmenu = sprintf("MCmenu%d", menu_no);
			printf( "function MCmenu%s () {\n"\
				"default=$1\n"\
				"menu_name %s\n",\
				 menu_no, $0) >newmenu

			parser(ifile, newmenu)
		}
		else if ($0 ~ /^#|\$MAKE|mainmenu_name/) {
			printf("") >>menu
		}
		else if ($1 ~ "endmenu") {
			printf("}\n") >>menu
			return
		} 
		else if ($1 == "source") {
			parser($2,menu)
		}
		else {
			print >>menu
		}
	}
}'
}

#
# Secondary parser for single menu mode.
#
function parser2 () {
callawk '
BEGIN {
	parser("'$CONFIG_IN'","MCmenu0")
}

function parser(ifile,menu) {

	while (getline <ifile) {
		if ($0 ~ /^#|$MAKE|mainmenu_name/) {
			printf("") >>menu
		}
		else if ($1 ~ /mainmenu_option|endmenu/) {
			printf("") >>menu
		} 
		else if ($1 == "source") {
			parser($2,menu)
		}
		else {
			print >>menu
		}
	}
}'
}

#
# Parse all the config.in files into mini scripts.
#
function parse_config_files () {
	rm -f MCmenu*

	echo "function MCmenu0 () {" >MCmenu0
	echo 'default=$1' >>MCmenu0
	echo "menu_name 'Main Menu'" >>MCmenu0

	if [ "_$single_menu_mode" = "_TRUE" ]
	then
		parser2
	else
		parser1
	fi

	echo "comment ''"	>>MCmenu0
	echo "g_alt_config" 	>>MCmenu0
	echo "s_alt_config" 	>>MCmenu0

	echo "}" >>MCmenu0

	#
	# These mini scripts must be sourced into the current
	# environment in order for all of this to work.  Leaving
	# them on the disk as executables screws up the recursion
	# in activate_menu(), among other things.  Once they are
	# sourced we can discard them.
	#
	for i in MCmenu*
	do
		echo -n "."
		source ./$i
	done
	rm -f MCmenu*
}

#
# This is the menu tree's bootstrap.
#
# Executes the parsed menus on demand and creates a set of functions,
# one per configuration option.  These functions will in turn execute
# dialog commands or recursively call other menus.
#
function activate_menu () {
	rm -f lxdialog.scrltmp
	while true
	do
		comment_ctr=0		#So comment lines get unique tags

		$1 "$default" 2> MCerror #Create the lxdialog menu & functions

		if [ "$?" != "0" ]
		then
			clear
			cat <<EOM

Menuconfig has encountered a possible error in one of BusyBox's
configuration files and is unable to continue.  Here is the error
report:

EOM
			sed 's/^/ Q> /' MCerror
			cat <<EOM

Please report this to the maintainer <mec@shout.net>.  You may also
send a problem report to <busybox@oss.lineo.com>.

Please indicate the BusyBox version you are trying to configure and
which menu you were trying to enter when this error occurred.

EOM
			cleanup
			exit 1
		fi
		rm -f MCerror

		. ./MCradiolists		#Source the menu's functions

		. ./MCmenu 2>MCdialog.out	#Activate the lxdialog menu
		ret=$?

		read selection <MCdialog.out

		case "$ret" in
		0|3|4|5|6)
			defaults="$selection$defaults"  #pseudo stack
			case "$ret" in
			0) eval $selection   ;;
			3) eval $selection y ;;
			4) eval $selection n ;;
			5) eval $selection m ;;
			6) eval $selection c ;;
			esac
			default="${defaults%%*}" defaults="${defaults#*}"
			;;
		2)	
			default="${selection%%\ *}"

			case "$selection" in
			*"-->"*|*"alt_config"*)
				show_readme ;;
			*)
				eval help $selection ;;
			esac
			;;
		255|1)
			break
			;;
		139)
			stty sane
			clear
			cat <<EOM

There seems to be a problem with the lxdialog companion utility which is
built prior to running Menuconfig.  Usually this is an indicator that you
have upgraded/downgraded your ncurses libraries and did not remove the 
old ncurses header file(s) in /usr/include or /usr/include/ncurses.

It is VERY important that you have only one set of ncurses header files
and that those files are properly version matched to the ncurses libraries 
installed on your machine.

You may also need to rebuild lxdialog.  This can be done by moving to
the /usr/src/linux/scripts/lxdialog directory and issuing the 
"make clean all" command.

If you have verified that your ncurses install is correct, you may email
the maintainer <andersen@codepoet.org> or post a message to
<busybox@oss.lineo.com> for additional assistance. 

EOM
			cleanup
			exit 139
			;;
		esac
	done
}

#
# Create a menu item to load an alternate configuration file.
#
g_alt_config () {
	echo -n "get_alt_config 'Load an Alternate Configuration File' "\
		>>MCmenu
}

#
# Get alternate config file name and load the 
# configuration from it.
#
get_alt_config () {
	set -f ## Switch file expansion OFF

	while true
	do
		ALT_CONFIG="${ALT_CONFIG:-$DEFAULTS}"

		$DIALOG --backtitle "$backtitle" \
			--inputbox "\
Enter the name of the configuration file you wish to load.  \
Accept the name shown to restore the configuration you \
last retrieved.  Leave blank to abort."\
			11 55 "$ALT_CONFIG" 2>MCdialog.out

		if [ "$?" = "0" ]
		then
			ALT_CONFIG=`cat MCdialog.out`

			[ "_" = "_$ALT_CONFIG" ] && break

			if eval [ -r "$ALT_CONFIG" ]
			then
				eval load_config_file "$ALT_CONFIG"
				break
			else
				echo -ne "\007"
				$DIALOG	--backtitle "$backtitle" \
					--infobox "File does not exist!"  3 38
				sleep 2
			fi
		else
			cat <<EOM >help.out

For various reasons, one may wish to keep several different BusyBox
configurations available on a single machine.  

If you have saved a previous configuration in a file other than the
busybox default, entering the name of the file here will allow you
to modify that configuration.

If you are uncertain, then you have probably never used alternate 
configuration files.  You should therefor leave this blank to abort.

EOM
			$DIALOG	--backtitle "$backtitle"\
				--title "Load Alternate Configuration"\
				--textbox help.out $ROWS $COLS
		fi
	done

	set +f ## Switch file expansion ON
	rm -f help.out MCdialog.out
}

#
# Create a menu item to store an alternate config file.
#
s_alt_config () {
	echo -n "save_alt_config 'Save Configuration to an Alternate File' "\
		 >>MCmenu
}

#
# Get an alternate config file name and save the current
# configuration to it.
#
save_alt_config () {
	set -f  ## Switch file expansion OFF
			
	while true
	do
		$DIALOG --backtitle "$backtitle" \
			--inputbox "\
Enter a filename to which this configuration should be saved \
as an alternate.  Leave blank to abort."\
			10 55 "$ALT_CONFIG" 2>MCdialog.out

		if [ "$?" = "0" ]
		then
			ALT_CONFIG=`cat MCdialog.out`

			[ "_" = "_$ALT_CONFIG" ] && break

			if eval touch $ALT_CONFIG 2>/dev/null
			then
				eval save_configuration $ALT_CONFIG
				load_functions  ## RELOAD
				break
			else
				echo -ne "\007"
				$DIALOG	--backtitle "$backtitle" \
					--infobox "Can't create file!  Probably a nonexistent directory." 3 60
				sleep 2
			fi
		else
			cat <<EOM >help.out

For various reasons, one may wish to keep different BusyBox
configurations available on a single machine.  

Entering a file name here will allow you to later retrieve, modify
and use the current configuration as an alternate to whatever 
configuration options you have selected at that time.

If you are uncertain what all this means then you should probably
leave this blank.
EOM
			$DIALOG	--backtitle "$backtitle"\
				--title "Save Alternate Configuration"\
				--textbox help.out $ROWS $COLS
		fi
	done

	set +f  ## Switch file expansion ON
	rm -f help.out MCdialog.out
}

#
# Load config options from a file.
# Converts all "# OPTION is not set" lines to "OPTION=n" lines
#
function load_config_file () {
	awk '
	  /# .* is not set.*/ { printf("%s=n\n", $2) }
	! /# .* is not set.*/ { print }
	' $1 >.tmpconfig

	source ./.tmpconfig
	rm -f .tmpconfig
}

#
# Just what it says.
#
save_configuration () {
        echo
	echo -n "Saving your BusyBox configuration."

	#
	# Now, let's redefine the configuration functions for final
	# output to the config files.
	#
	# Nested function definitions, YIPEE!
	#
	function bool () {
		set_x_info "$2" "n"
		eval define_bool "$2" "$x"
	}

	function dep_bool () {
		set_x_info "$2" "n"
		var="$2"
		shift 2
		while [ $# -gt 0 ]; do
			if   [ "$1" = y ]; then
				shift
			else 
				x=n; shift $#
			fi
		done
		define_bool "$var" "$x"
	}

	function int () {
		set_x_info "$2" "$3"
		echo "$2=$x" 		>>$CONFIG
		echo "#define $2 ($x)"	>>$CONFIG_H
	}

	function hex () {
		set_x_info "$2" "$3"
		echo "$2=$x" 			 >>$CONFIG
		echo "#define $2 0x${x##*[x,X]}" >>$CONFIG_H
	}

	function string () {
		set_x_info "$2" "$3"
		echo "$2=\"$x\"" 			 >>$CONFIG
		echo "#define $2 \"$x\""	>>$CONFIG_H
	}

	function define_hex () {
		eval $1="$2"
               	echo "$1=$2"			>>$CONFIG
		echo "#define $1 0x${2##*[x,X]}"	>>$CONFIG_H
	}

	function define_int () {
		eval $1="$2"
		echo "$1=$2" 			>>$CONFIG
		echo "#define $1 ($2)"		>>$CONFIG_H
	}

	function define_string () {
		eval $1="$2"
		echo "$1=\"$2\""		>>$CONFIG
		echo "#define $1 \"$2\""	>>$CONFIG_H
	}

	function define_bool () {
		define_tristate "$1" "$2"
	}

	function define_tristate () {
		eval $1="$2"

   		case "$2" in
         	y)
                	echo "$1=y" 		>>$CONFIG
                	echo "#define $1 1"	>>$CONFIG_H
                	;;

         	n)
			echo "# $1 is not set"	>>$CONFIG
                	echo "#undef  $1"	>>$CONFIG_H
                	;;
        	esac
	}

	function choice () {
		#
		# Find the first choice that's already set to 'y'
		#
		choices="$2"
		default="$3"
		current=
		chosen=

		set -- $choices
		while [ -n "$2" ]
		do
			if eval [ "_\$$2" = "_y" ]
			then
				current=$1
				break
			fi
			shift ; shift
		done

		#
		# Use the default if none were set.  
		#
		: ${current:=$default}

		#
		# Output all choices (to be compatible with other configs).
		#
		set -- $choices
		while [ -n "$2" ]
		do
			case "$1" in
			"$current"*)	if [ -z "$chosen" ]; then
						define_bool "$2" "y"
						chosen=1
					else
						define_bool "$2" "n"
					fi ;;
			*)		define_bool "$2" "n" ;;
			esac
			shift ; shift
		done
	}

	function mainmenu_name () {
		:
	}

	function mainmenu_option () {
		comment_is_option=TRUE
	}

	function endmenu () {
		:
	}

	function comment () {
		if [ "$comment_is_option" ]
		then
			comment_is_option=
			echo        >>$CONFIG
			echo "#"    >>$CONFIG
			echo "# $1" >>$CONFIG
			echo "#"    >>$CONFIG

			echo         >>$CONFIG_H
			echo "/*"    >>$CONFIG_H
			echo " * $1" >>$CONFIG_H
			echo " */"   >>$CONFIG_H
		fi
	}

	echo -n "."

	DEF_CONFIG="${1:-.config}"
	DEF_CONFIG_H="include/config.h"

	CONFIG=.tmpconfig
	CONFIG_H=.tmpconfig.h

	echo "#" >$CONFIG
	echo "# Automatically generated by make menuconfig: don't edit" >>$CONFIG
	echo "#" >>$CONFIG

	echo "/*" >$CONFIG_H
	echo " * Automatically generated by make menuconfig: don't edit" >>$CONFIG_H
	echo " */" >>$CONFIG_H
	echo "#define AUTOCONF_INCLUDED" >> $CONFIG_H

	echo -n "."
	if . $CONFIG_IN >>.menuconfig.log 2>&1
	then
		if [ "$DEF_CONFIG" = ".config" ]
		then
			mv $CONFIG_H $DEF_CONFIG_H
		fi

		if [ -f "$DEF_CONFIG" ]
		then
			rm -f ${DEF_CONFIG}.old
			mv $DEF_CONFIG ${DEF_CONFIG}.old
		fi

		mv $CONFIG $DEF_CONFIG
			
		return 0
	else
		return 1
	fi
}

#
# Remove temporary files
#
cleanup () {
	cleanup1
	cleanup2
}

cleanup1 () {
	rm -f MCmenu* MCradiolists MCdialog.out help.out
}

cleanup2 () {
	rm -f .tmpconfig .tmpconfig.h
}

set_geometry () {
	# Some distributions export these with incorrect values
	# which can really screw up some ncurses programs.
	LINES=  COLUMNS=

	ROWS=${1:-24}  COLS=${2:-80} 

	# Just in case the nasty rlogin bug returns.
	#
	[ $ROWS = 0 ] && ROWS=24
	[ $COLS = 0 ] && COLS=80

	if [ $ROWS -lt 19 -o $COLS -lt 80 ]
	then
		echo -e "\n\007Your display is too small to run Menuconfig!"
		echo "It must be at least 19 lines by 80 columns."
		exit 1
	fi 

	ROWS=$((ROWS-4))  COLS=$((COLS-5))
}


set_geometry `stty size 2>/dev/null`

menu_instructions="\
Enabling options will increase the size of busybox.  \
Arrow keys navigate the menu.  \
Pressing <Enter> selects submenus --->.  \
Highlighted letters are hotkeys.  \
Pressing <Y> includes, and <N> excludes.  \
Press <Esc><Esc> to exit, <?> for Help.  \
Legend: [*] built-in  [ ] excluded"


radiolist_instructions="\
Use the arrow keys to navigate this window or \
press the hotkey of the item you wish to select \
followed by the <SPACE BAR>.
Press <?> for additional information about this option."

inputbox_instructions_int="\
Please enter a decimal value. \
Fractions will not be accepted.  \
Use the <TAB> key to move from the input field to the buttons below it."

inputbox_instructions_hex="\
Please enter a hexadecimal value. \
Use the <TAB> key to move from the input field to the buttons below it."

inputbox_instructions_string="\
Please enter a string value. \
Use the <TAB> key to move from the input field to the buttons below it."

DIALOG="./scripts/lxdialog/lxdialog"

bb_version="${VERSION}"
backtitle="BusyBox v$bb_version Configuration"

trap "cleanup ; exit 1" 1 2 15


#
# Locate default files.
#
CONFIG_IN=./config.in
if [ "$1" != "" ] ; then
	CONFIG_IN=$1
fi

DEFAULTS=sysdeps/$TARGET_OS/defconfig
if [ -f .config ]; then
  DEFAULTS=.config
fi

if [ -f $DEFAULTS ]
then
  echo "Using defaults found in" $DEFAULTS
  load_config_file $DEFAULTS
else
  echo "No defaults found"
fi


# Fresh new log.
>.menuconfig.log

# Load the functions used by the config.in files.
echo -n "Preparing scripts: functions" 
load_functions

if [ ! -e $CONFIG_IN ]
then
	echo "Your main config.in file ($CONFIG_IN) does not exist"
	exit 1
fi

if [ ! -x $DIALOG ]
then
	echo "Your lxdialog utility does not exist"
	exit 1
fi

#
# Read config.in files and parse them into one shell function per menu.
#
echo -n ", parsing"
parse_config_files $CONFIG_IN

echo "done."
#
# Start the ball rolling from the top.
#
activate_menu MCmenu0

#
# All done!
#
cleanup1

#
# Confirm and Save
#
if $DIALOG --backtitle "$backtitle" \
	   --yesno "Do you wish to save your new BusyBox configuration?" 5 60
then
	save_configuration
	echo
	echo
	echo "*** End of BusyBox configuration."
	echo "*** Check the top-level Makefile for additional configuration."
	if [ ! -f .hdepend ] ; then
	    echo "*** Next, you must run 'make dep'."
	else
	    echo "*** Next, you should run 'make' or 'make install'."
	fi
	echo
else
	echo
    	echo 
	echo Your BusyBox configuration changes were NOT saved.
	echo
fi

# Remove log if empty.
if [ ! -s .menuconfig.log ] ; then
	rm -f .menuconfig.log
fi

exit 0
