#!/bin/ksh # # CDDL HEADER START # # The contents of this file are subject to the terms of the # Common Development and Distribution License, Version 1.0 only # (the "License"). You may not use this file except in compliance # with the License. # # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE # or http://www.opensolaris.org/os/licensing. # See the License for the specific language governing permissions # and limitations under the License. # # When distributing Covered Code, include this CDDL HEADER in each # file and include the License file at usr/src/OPENSOLARIS.LICENSE. # If applicable, add the following below this CDDL HEADER, with the # fields enclosed by brackets "[]" replaced with your own identifying # information: Portions Copyright [yyyy] [name of copyright owner] # # CDDL HEADER END # # # Copyright 2004 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # # # Terminal Info Generator # # This script generates a static terminfo database for use by mdb. For each # of the terminal properties used by mdb_termio.c, this script uses tput(1) # to determine the value of the given attribute for each specified terminal # type. The script produces an ANSI-C source file which contains a static # array for each terminal type storing the properties. An additional array # is then declared containing a list of the terminal types and pointers to # the previous arrays. Finally, source code for several terminfo routines # are included that simply access the arrays and return the saved properties. # PATH=/usr/bin; export PATH PROGNAME=$(basename "$0") usage() { echo "Usage: $PROGNAME -s skel -t termio [-v] term ..." >&2 exit 2 } extract_section() { typeset skel="$1" typeset secname="$2" nawk <$skel -v name=$secname -v skel=$skel ' /\/\* [^ ]* [^ ]* \*\// && $3 == name { if ($2 == "BEGIN") { printing = 1; printf("# %d \"%s\"\n", NR + 1, skel); } else { printing = 0; } next; } printing != 0 { print; } ' } verbose=false termio_c= terminfo_skel= while getopts s:t:v name ; do case $name in v) verbose=true ;; s) terminfo_skel=$OPTARG ;; t) termio_c=$OPTARG ;; ?) usage ;; esac done shift $(($OPTIND - 1)) [[ -z "$terminfo_skel" || -z "$termio_c" || $# -eq 0 ]] && usage termlist=$* for term in $termlist; do tput -T $term init >/dev/null 2>&1 if [ $? -ne 0 ]; then echo "`basename $0`: invalid terminal -- $term" >& 2 exit 1 fi done # Extract the prologue from the skeleton extract_section $terminfo_skel PROLOGUE # # For each terminal in the terminal list, produce a property definition array # listing each property we need in mdb_termio.c and its current value. # for term in $termlist; do # # We don't want the compiler to blame the skeleton if it doesn't like # the array we generate here, so point the finger elsewhere # echo "# 1 \"dynamic $term data from tigen\"" cterm=$(echo "$term" |tr '-' '_') $verbose && echo "loading terminfo for $term ... \c" >& 2 echo "static const termio_attr_t ${cterm}_attrs[] = {" sed -n '/termio_attrs\[\] = /,/^}/p' $termio_c | \ sed -n \ 's/{ "\([a-z0-9]*\)", \([A-Z_]*\),.*/\1 \2/p' | \ while read attr type; do case "$type" in TIO_ATTR_REQSTR|TIO_ATTR_STR) data="\"`tput -T $term $attr | od -bv | sed 's/^[0-9]*//;s/ /\\\\\\\\/g;/^\$/d'`\"" [ "$data" = '""' ] && data=NULL ;; TIO_ATTR_BOOL) tput -T $term $attr data=`expr 1 - $?` ;; TIO_ATTR_INT) data=`tput -T $term $attr` ;; *) echo "`basename $0`: unknown type for $attr: $type" >& 2 exit 1 esac echo "\t{ \"$attr\", $type, (void *)$data }," done echo "\t{ NULL, NULL, NULL }" echo "};\n" $verbose && echo "done" >& 2 done # # For each terminal in the terminal list, produce an entry in the terminal # database array linking this terminal to its terminfo property array. # echo "# 1 \"dynamic array from tigen\"" echo "static const termio_desc_t termio_db[] = {" for term in $termlist; do cterm=$(echo "$term" |tr '-' '_') echo "\t{ \"$term\", ${cterm}_attrs }," done echo "\t{ NULL, NULL }\n};" extract_section $terminfo_skel EPILOGUE exit 0