:
#
#
#
init() {
	TMP=/tmp/keyconfig$$
	VARS="
			kdch1 kcud1 kel kf1 kf2 kf3 kf4 kf5 kf6 kf7 kf8 khome
			kich1 kcub1 kll knp kpp kcuf1 kcuu1
		"
	 Nkdch1="Delete Character Key    "; Ikdch1="kdch1|del*|Del*"
	 Nkcud1="Down Arrow Key          "; Ikcud1="kcud1|down*|Down*"
	   Nkel="Clear to End of Line Key"; Ikel="kel|clear*|Clear*"
	   Nkf1="F1 Function Key         "; Ikf1="kf1|f1*|F1*"
	   Nkf2="F2 Function Key         "; Ikf2="kf2|f2*|F2*"
	   Nkf3="F3 Function Key         "; Ikf3="kf3|f3*|F3*"
	   Nkf4="F4 Function Key         "; Ikf4="kf4|f4*|F4*"
	   Nkf5="F5 Function Key         "; Ikf5="kf5|f5*|F5*"
	   Nkf6="F6 Function Key         "; Ikf6="kf6|f6*|F6*"
	   Nkf7="F7 Function Key         "; Ikf7="kf7|f7*|F7*"
	   Nkf8="F8 Function Key         "; Ikf8="kf8|f8*|F8*"
	 Nkhome="Home Key                "; Ikhome="khome|home*|Home*"
	 Nkich1="Insert Character Key    "; Ikich1="kich1|ins*|Ins*"
	 Nkcub1="Left Arrow Key          "; Ikcub1="kcub1|left*|Left*"
	   Nkll="End Key                 "; Ikll="kll|[Ee]nd*"
	   Nknp="Page Down Key           "; Iknp="knp|[Pp]age [Dd]*"
	   Nkpp="Page Up Key             "; Ikpp="kpp|[Pp]age [Uu]*"
	 Nkcuf1="Right Arrow Key         "; Ikcuf1="kcuf1|right*|Right*"
	 Nkcuu1="Up Arrow Key            "; Ikcuu1="kcuu1|up*|Up*"
	if [ "Q$TERM" = Q ]
	then
		echo "TERM variable not set"
		exit 1
	fi

	if [ -x /usr/bin/infocmp ]
	then
		INFOCMP="/usr/bin/infocmp -1"
		MASSAGE="sed 's/^[ 	]*//'"
	elif [ -x /usr/lib/terminfo/untic ]
	then
		INFOCMP="/usr/lib/terminfo/untic -1"
		MASSAGE="sed 's/^[ 	]*//'"
	else
		echo "Can't find infocmp or untic programs"
		exit 2
	fi
	TIGETKEY=/usr/lib/terminfo/tigetkey
	if [ ! -x $TIGETKEY ]
	then
		TIGETKEY=/usr/share/lib/terminfo/tigetkey
		if [ ! -x $TIGETKEY ]
		then
			echo "Can't find $TIGETKEY"
			exit 2
		fi
	fi
	changes=0
}

getyn() {
	while echo "\n$* (y/n)? \c"
	do
		read yn rest
		case "$yn" in
		[yY])	return 0;;
		[nN])	return 1;;
		*)	echo "Please answer y or n";;
		esac
	done
}

first_letter() {
	echo "$1" | sed 's/\(.\).*/\1/'
}

read_description() {
	tput clear
	tput home
	subdir=`first_letter $TERM`
	if [ -f "$TERMINFO/$subdir/$TERM" ]
	then
		TERMPATH="$TERMINFO/$subdir/$TERM"
		TINFO=$TERMINFO
	elif [ -f "/usr/lib/terminfo/$subdir/$TERM" ]
	then
		TERMPATH="/usr/lib/terminfo/$subdir/$TERM"
		TINFO=/usr/lib/terminfo
	else
		echo "Can't find description for $TERM"
		exit 1
	fi
	echo "READ DESCRIPTION FOR TERMINAL \"$TERM\" from $TERMPATH"
	echo
	if [ ! -w $TERMPATH ]
	then
		echo "$TERMPATH is not writable by you."
		echo "Any changes in this session will be saved to"
		echo "$HOME/terminfo/$subdir/$TERM instead."
		getyn "Continue" || exit 1
		TINFO=$HOME/terminfo
	fi
	$INFOCMP $TERM | eval "$MASSAGE" > $TMP
	for i in $VARS
	do
		value=`grep "^$i=" $TMP |
			sed -e 's/[^=]*=//' -e 's/,$//' \
				-e 's/\\\\/\\\\\\\\\\\\\\\\/g'`
		eval $i="\"$value\""
	done
	read desc <$TMP
	short=`echo "$desc" | sed 's/|[^|]*$//'`
	long=`echo "$desc" | sed 's/[|,].*$//'`
}

check_dir() {
	:
}

paint_screen() {
	tput clear
	tput home
	echo "SET TERMINFO KEY DEFINITIONS FOR TERMINAL \"$TERM\""
	for i in $VARS
	do
		eval n="\$N$i"
		eval v="\$$i"
		if [ "Q$v" = Q ]
		then
			echo "	$n	$i	=	(not defined)"
		else
			echo "	$n	$i	=	$v"
		fi
	done
}

query_names() {
	while true
	do
		echo
		echo "Current short name(s) for this terminal:"
		echo "	$short"
		echo "Current long name for this terminal:"
		echo "	$long"
		getyn "Do you want to change the name of this terminal" ||
			return
		echo
		echo "Enter new short name(s) (use | to separate): \c"
		read short
		echo "Enter new long name: \c"
		read long
		line1="$short|$long,"
		ed - <<-EOF $TMP
			1d
			i
			$line1
			.
			w
			q
		EOF
	done
}

write_description() {
	if [ $changes = 0 ]
	then
		rm $TMP
		return;
	fi
	tput clear
	tput home
	echo "WRITE TERMINFO DEFINITIONS FOR TERMINAL \"$TERM\""
	echo
	cp $TERMPATH /tmp/$TERM
	echo "A copy of $TERMPATH has been made in /tmp/$TERM"
	echo "(in case something goes wrong)."
	
	query_names

	getyn "Really write the changes" || { rm $TMP; return; }

	for i in $VARS
	do
		v=`eval echo "\\$$i" | sed 's/\\\\/\\\\\\\\/g'`
		if grep -c "^$i=" $TMP >/dev/null
		then
			if [ "Q$v" != Q ]
			then
				ed - <<-EOF $TMP
					/^$i=/s/=.*/=$v,/
					w
					q
				EOF
			else
				ed - <<-EOF $TMP
					/^$i=/d
					w
					q
				EOF
			fi
		else
			if [ "Q$v" != Q ]
			then
				echo "$i=$v," >> $TMP
			fi
		fi
	done
	ed - <<-EOF $TMP
		2,\$s/^/	/
		w
		q
	EOF
	if [ ! -d $TINFO ]; then mkdir $TINFO; fi
	TERMINFO=$TINFO tic $TMP
	rm $TMP
}

invalid_key(){
	echo "Invalid key entered"
	sleep 3
}

define_key() {
	tput home
	tput clear
	i=$1
	eval v="\$$i"
	eval n="\$N$i"
	echo "DEFINE SEQUENCE EMITTED BY KEY \"$i\""
	echo
	if [ "Q$v" = Q ]
	then
		echo "Old sequence	=	(not defined)"
	else
		echo "Old sequence	=	$v"
	fi
	echo
	echo "Press the $n: \c"
	v=`$TIGETKEY | sed 's/\\\\/\\\\\\\\\\\\\\\\/g'`
	eval $i="\"$v\""
	changes=1
}

process_input() {
	while true
	do
		paint_screen
		echo "Enter key name to change, "q" when done: \c"
		read keyname
		case "$keyname" in

		kdch1|del*|Del*)	define_key kdch1;;
		kcud1|down*|Down*)	define_key kcud1;;
		kel|clear*|Clear*)	define_key kel;;
		kf1|f1*|F1*)		define_key kf1;;
		kf2|f2*|F2*)		define_key kf2;;
		kf3|f3*|F3*)		define_key kf3;;
		kf4|f4*|F4*)		define_key kf4;;
		kf5|f5*|F5*)		define_key kf5;;
		kf6|f6*|F6*)		define_key kf6;;
		kf7|f7*|F7*)		define_key kf7;;
		kf8|f8*|F8*)		define_key kf8;;
		khome|home*|Home*)	define_key khome;;
		kich1|ins*|Ins*)	define_key kich1;;
		kcub1|left*|Left*)	define_key kcub1;;
		kll|[Ee]nd*)		define_key kll;;
		knp|'[Pp]age [Dd]*')	define_key knp;;
		kpp|'[Pp]age [Uu]*')	define_key kpp;;
		kcuf1|right*|Right*)	define_key kcuf1;;
		kcuu1|up*|Up*)		define_key kcuu1;;

		q|Q)			write_description; exit 0;;
		*)			invalid_key;;
		esac
	done
}

init
read_description
process_input
