1 #!/bin/ksh 2 # 3 # CDDL HEADER START 4 # 5 # The contents of this file are subject to the terms of the 6 # Common Development and Distribution License, Version 1.0 only 7 # (the "License"). You may not use this file except in compliance 8 # with the License. 9 # 10 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 11 # or http://www.opensolaris.org/os/licensing. 12 # See the License for the specific language governing permissions 13 # and limitations under the License. 14 # 15 # When distributing Covered Code, include this CDDL HEADER in each 16 # file and include the License file at usr/src/OPENSOLARIS.LICENSE. 17 # If applicable, add the following below this CDDL HEADER, with the 18 # fields enclosed by brackets "[]" replaced with your own identifying 19 # information: Portions Copyright [yyyy] [name of copyright owner] 20 # 21 # CDDL HEADER END 22 # 23 # 24 # Copyright 2004 Sun Microsystems, Inc. All rights reserved. 25 # Use is subject to license terms. 26 # 27 # 28 29 # 30 # Terminal Info Generator 31 # 32 # This script generates a static terminfo database for use by mdb. For each 33 # of the terminal properties used by mdb_termio.c, this script uses tput(1) 34 # to determine the value of the given attribute for each specified terminal 35 # type. The script produces an ANSI-C source file which contains a static 36 # array for each terminal type storing the properties. An additional array 37 # is then declared containing a list of the terminal types and pointers to 38 # the previous arrays. Finally, source code for several terminfo routines 39 # are included that simply access the arrays and return the saved properties. 40 # 41 42 PATH=/usr/bin; export PATH 43 44 PROGNAME=$(basename "$0") 45 46 usage() 47 { 48 echo "Usage: $PROGNAME -s skel -t termio [-v] term ..." >&2 49 exit 2 50 } 51 52 extract_section() 53 { 54 typeset skel="$1" 55 typeset secname="$2" 56 57 /usr/xpg4/bin/awk <$skel -v name=$secname -v skel=$skel ' 58 /\/\* [^ ]* [^ ]* \*\// && $3 == name { 59 if ($2 == "BEGIN") { 60 printing = 1; 61 printf("# %d \"%s\"\n", NR + 1, skel); 62 } else { 63 printing = 0; 64 } 65 next; 66 } 67 68 printing != 0 { print; } 69 ' 70 } 71 72 verbose=false 73 termio_c= 74 terminfo_skel= 75 76 while getopts s:t:v name ; do 77 case $name in 78 v) 79 verbose=true 80 ;; 81 s) 82 terminfo_skel=$OPTARG 83 ;; 84 t) 85 termio_c=$OPTARG 86 ;; 87 ?) 88 usage 89 ;; 90 esac 91 done 92 shift $(($OPTIND - 1)) 93 94 [[ -z "$terminfo_skel" || -z "$termio_c" || $# -eq 0 ]] && usage 95 96 termlist=$* 97 for term in $termlist; do 98 tput -T $term init >/dev/null 2>&1 99 if [ $? -ne 0 ]; then 100 echo "`basename $0`: invalid terminal -- $term" >& 2 101 exit 1 102 fi 103 done 104 105 # Extract the prologue from the skeleton 106 extract_section $terminfo_skel PROLOGUE 107 108 # 109 # For each terminal in the terminal list, produce a property definition array 110 # listing each property we need in mdb_termio.c and its current value. 111 # 112 for term in $termlist; do 113 # 114 # We don't want the compiler to blame the skeleton if it doesn't like 115 # the array we generate here, so point the finger elsewhere 116 # 117 echo "# 1 \"dynamic $term data from tigen\"" 118 119 cterm=$(echo "$term" |tr '-' '_') 120 121 $verbose && echo "loading terminfo for $term ... \c" >& 2 122 echo "static const termio_attr_t ${cterm}_attrs[] = {" 123 124 sed -n '/termio_attrs\[\] = /,/^}/p' $termio_c | \ 125 sed -n \ 's/{ "\([a-z0-9]*\)", \([A-Z_]*\),.*/\1 \2/p' | \ 126 while read attr type; do 127 128 case "$type" in 129 TIO_ATTR_REQSTR|TIO_ATTR_STR) 130 data="\"`tput -T $term $attr | od -bv | 131 sed 's/^[0-9]*//;s/ /\\\\\\\\/g;/^\$/d'`\"" 132 [ "$data" = '""' ] && data=NULL 133 ;; 134 TIO_ATTR_BOOL) 135 tput -T $term $attr 136 data=`expr 1 - $?` 137 ;; 138 TIO_ATTR_INT) 139 data=`tput -T $term $attr` 140 ;; 141 *) 142 echo "`basename $0`: unknown type for $attr: $type" >& 2 143 exit 1 144 esac 145 echo "\t{ \"$attr\", $type, (void *)$data }," 146 done 147 148 echo "\t{ NULL, NULL, NULL }" 149 echo "};\n" 150 151 $verbose && echo "done" >& 2 152 done 153 154 # 155 # For each terminal in the terminal list, produce an entry in the terminal 156 # database array linking this terminal to its terminfo property array. 157 # 158 echo "# 1 \"dynamic array from tigen\"" 159 echo "static const termio_desc_t termio_db[] = {" 160 for term in $termlist; do 161 cterm=$(echo "$term" |tr '-' '_') 162 echo "\t{ \"$term\", ${cterm}_attrs }," 163 done 164 echo "\t{ NULL, NULL }\n};" 165 166 extract_section $terminfo_skel EPILOGUE 167 168 exit 0