#! /bin/sh
# Generate a terminfo command from a terminfo name.
#
# Copyright (C) 2002  Free Software Foundation, Inc.
#
# This file 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.

VERSION=@VERSION@

usage () {
    cat <<EOF
Usage: grub-terminfo TERMNAME
Generate a terminfo command from a terminfo name.

  -h, --help              print this message and exit
  -v, --version           print the version information and exit

Report bugs to <bug-grub@gnu.org>.
EOF
}

error () {
    echo "grub-terminfo: error: $1" 1>&2
}

termname=

for option in "$@"; do
    case "$option" in
    -h | --help)
        usage
	exit 0 ;;
    -v | --version)
	echo "grub-terminfo (GNU GRUB ${VERSION})"
	exit 0 ;;
    -*)
	error "Unrecognized option \`$option'"
	usage
	exit 1 ;;
    *)
	if test "x$termname" != x; then
	    error "More than one terminfo names?"
	    usage
	    exit 1
	fi
	termname="$option" ;;
    esac
done

if test "x$termname" = x; then
    error "termname not specified"
    usage
    exit 1
fi

get_seq () {
    infocmp -L -1 -g $termname | sed -n -e "/$1/s/^[^=]*=\\(.*\\),\$/\\1/p"
}

cursor_address="`get_seq cursor_address`"
if test "x$cursor_address" = x; then
    error "cursor_address not found"
    exit 1
fi
cursor_address="--cursor-address=$cursor_address"

clear_screen="`get_seq clear_screen`"
if test "x$clear_screen" != x; then
    clear_screen="--clear-screen=$clear_screen"
fi

enter_standout_mode="`get_seq enter_standout_mode`"
if test "x$enter_standout_mode" != x; then
    enter_standout_mode="--enter-standout-mode=$enter_standout_mode"
fi

exit_standout_mode="`get_seq exit_standout_mode`"
if test "x$exit_standout_mode" != x; then
    exit_standout_mode="--exit-standout-mode=$exit_standout_mode"
fi

echo "terminfo --name=$termname" $cursor_address $clear_screen \
    $enter_standout_mode $exit_standout_mode
