1*da2e3ebdSchin######################################################################## 2*da2e3ebdSchin# # 3*da2e3ebdSchin# This software is part of the ast package # 4*da2e3ebdSchin# Copyright (c) 1986-2007 AT&T Knowledge Ventures # 5*da2e3ebdSchin# and is licensed under the # 6*da2e3ebdSchin# Common Public License, Version 1.0 # 7*da2e3ebdSchin# by AT&T Knowledge Ventures # 8*da2e3ebdSchin# # 9*da2e3ebdSchin# A copy of the License is available at # 10*da2e3ebdSchin# http://www.opensource.org/licenses/cpl1.0.txt # 11*da2e3ebdSchin# (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) # 12*da2e3ebdSchin# # 13*da2e3ebdSchin# Information and Software Systems Research # 14*da2e3ebdSchin# AT&T Research # 15*da2e3ebdSchin# Florham Park NJ # 16*da2e3ebdSchin# # 17*da2e3ebdSchin# Glenn Fowler <gsf@research.att.com> # 18*da2e3ebdSchin# # 19*da2e3ebdSchin######################################################################## 20*da2e3ebdSchin: 21*da2e3ebdSchin# Glenn Fowler 22*da2e3ebdSchin# AT&T Bell Laboratories 23*da2e3ebdSchin# 24*da2e3ebdSchin# @(#)gentab (gsf@research.att.com) 07/17/94 25*da2e3ebdSchin# 26*da2e3ebdSchin# C table generator 27*da2e3ebdSchin# 28*da2e3ebdSchin# %flags [ prefix=<prefix> ] [ index=<index> ] [ init=<init> ] 29*da2e3ebdSchin# 30*da2e3ebdSchin# %keyword <name> [ prefix=<prefix> ] [ index=<index> ] [ init=<init> ] [ first=<id> ] [ last=<id> ] 31*da2e3ebdSchin# 32*da2e3ebdSchin# %sequence [ prefix=<prefix> ] [ index=<index> ] [ init=<init> ] 33*da2e3ebdSchin# 34*da2e3ebdSchin 35*da2e3ebdSchincase `(typeset -u s=a n=0; ((n=n+1)); print $s$n) 2>/dev/null` in 36*da2e3ebdSchinA1) shell=ksh 37*da2e3ebdSchin typeset -u ID 38*da2e3ebdSchin typeset -i counter err_line 39*da2e3ebdSchin ;; 40*da2e3ebdSchin*) shell=bsh 41*da2e3ebdSchin ;; 42*da2e3ebdSchinesac 43*da2e3ebdSchincommand=$0 44*da2e3ebdSchincounter=0 45*da2e3ebdSchindefine=1 46*da2e3ebdSchinerr_line=0 47*da2e3ebdSchintype="" 48*da2e3ebdSchinindex="" 49*da2e3ebdSchinfirst="" 50*da2e3ebdSchinlast="" 51*da2e3ebdSchintable=1 52*da2e3ebdSchinwhile : 53*da2e3ebdSchindo case $1 in 54*da2e3ebdSchin -d) table=0 ;; 55*da2e3ebdSchin -t) define=0 ;; 56*da2e3ebdSchin *) break ;; 57*da2e3ebdSchin esac 58*da2e3ebdSchin shift 59*da2e3ebdSchindone 60*da2e3ebdSchincase $1 in 61*da2e3ebdSchin"") err_file="" 62*da2e3ebdSchin ;; 63*da2e3ebdSchin*) exec <$1 64*da2e3ebdSchin err_file="\"$1\", " 65*da2e3ebdSchin ;; 66*da2e3ebdSchinesac 67*da2e3ebdSchinwhile read line 68*da2e3ebdSchindo case $shell in 69*da2e3ebdSchin ksh) ((err_line=err_line+1)) ;; 70*da2e3ebdSchin *) err_line=`expr $err_line + 1` ;; 71*da2e3ebdSchin esac 72*da2e3ebdSchin set '' $line 73*da2e3ebdSchin shift 74*da2e3ebdSchin case $1 in 75*da2e3ebdSchin [#]*) echo "/*" 76*da2e3ebdSchin while : 77*da2e3ebdSchin do case $1 in 78*da2e3ebdSchin [#]*) shift 79*da2e3ebdSchin echo " * $*" 80*da2e3ebdSchin read line 81*da2e3ebdSchin set '' $line 82*da2e3ebdSchin shift 83*da2e3ebdSchin ;; 84*da2e3ebdSchin *) break 85*da2e3ebdSchin ;; 86*da2e3ebdSchin esac 87*da2e3ebdSchin done 88*da2e3ebdSchin echo " */" 89*da2e3ebdSchin echo 90*da2e3ebdSchin ;; 91*da2e3ebdSchin esac 92*da2e3ebdSchin eval set '""' $line 93*da2e3ebdSchin shift 94*da2e3ebdSchin case $1 in 95*da2e3ebdSchin "") ;; 96*da2e3ebdSchin %flags|%keywords|%sequence) 97*da2e3ebdSchin case $define:$last in 98*da2e3ebdSchin 1:?*) case $shell in 99*da2e3ebdSchin ksh) ((n=counter-1)) ;; 100*da2e3ebdSchin *) n=`expr $counter - 1` ;; 101*da2e3ebdSchin esac 102*da2e3ebdSchin echo "#define $prefix$last $n" 103*da2e3ebdSchin ;; 104*da2e3ebdSchin esac 105*da2e3ebdSchin case $type in 106*da2e3ebdSchin %flags|%sequence) 107*da2e3ebdSchin if test $define = 1 108*da2e3ebdSchin then echo 109*da2e3ebdSchin fi 110*da2e3ebdSchin ;; 111*da2e3ebdSchin %keywords) 112*da2e3ebdSchin if test $table = 1 113*da2e3ebdSchin then echo " 0, 0" 114*da2e3ebdSchin echo "};" 115*da2e3ebdSchin echo 116*da2e3ebdSchin elif test $define = 1 117*da2e3ebdSchin then echo 118*da2e3ebdSchin fi 119*da2e3ebdSchin ;; 120*da2e3ebdSchin esac 121*da2e3ebdSchin case $index in 122*da2e3ebdSchin ?*) eval $index=$counter ;; 123*da2e3ebdSchin esac 124*da2e3ebdSchin type=$1 125*da2e3ebdSchin shift 126*da2e3ebdSchin name="" 127*da2e3ebdSchin prefix="" 128*da2e3ebdSchin index="" 129*da2e3ebdSchin init="" 130*da2e3ebdSchin first="" 131*da2e3ebdSchin last="" 132*da2e3ebdSchin case $type in 133*da2e3ebdSchin %keywords) 134*da2e3ebdSchin case $1 in 135*da2e3ebdSchin "") echo "$command: ${err_file}line $err_line: $type table name omitted" >&2 136*da2e3ebdSchin exit 1 137*da2e3ebdSchin ;; 138*da2e3ebdSchin esac 139*da2e3ebdSchin name=$1 140*da2e3ebdSchin shift 141*da2e3ebdSchin if test $table = 1 142*da2e3ebdSchin then echo "$name"'[] =' 143*da2e3ebdSchin echo "{" 144*da2e3ebdSchin fi 145*da2e3ebdSchin ;; 146*da2e3ebdSchin esac 147*da2e3ebdSchin eval "$@" 148*da2e3ebdSchin case $init in 149*da2e3ebdSchin "") case $type in 150*da2e3ebdSchin %flags|%sequence) 151*da2e3ebdSchin init=0 152*da2e3ebdSchin ;; 153*da2e3ebdSchin *) init=1 154*da2e3ebdSchin ;; 155*da2e3ebdSchin esac 156*da2e3ebdSchin ;; 157*da2e3ebdSchin esac 158*da2e3ebdSchin case $index in 159*da2e3ebdSchin "") counter=$init 160*da2e3ebdSchin ;; 161*da2e3ebdSchin *) eval value=\$$index 162*da2e3ebdSchin case $value in 163*da2e3ebdSchin "") counter=$init ;; 164*da2e3ebdSchin [0123456789]*) counter=$value ;; 165*da2e3ebdSchin esac 166*da2e3ebdSchin ;; 167*da2e3ebdSchin esac 168*da2e3ebdSchin case $define:$first in 169*da2e3ebdSchin 1:?*) echo "#define $prefix$first $counter" ;; 170*da2e3ebdSchin esac 171*da2e3ebdSchin ;; 172*da2e3ebdSchin %*) echo "$command: ${err_file}line $err_line: $1: unknown keyword" >&2 173*da2e3ebdSchin exit 1 174*da2e3ebdSchin ;; 175*da2e3ebdSchin *) while : 176*da2e3ebdSchin do case $1 in 177*da2e3ebdSchin "") break 178*da2e3ebdSchin ;; 179*da2e3ebdSchin *) case $shell in 180*da2e3ebdSchin ksh) ID=${1#[!abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_]} ;; 181*da2e3ebdSchin *) ID=`echo $1 | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | sed 's/^[^ABCDEFGHIJKLMNOPQRSTUVWXYZ_]//'` ;; 182*da2e3ebdSchin esac 183*da2e3ebdSchin case $type in 184*da2e3ebdSchin %flags) if test $define = 1 185*da2e3ebdSchin then case $counter in 186*da2e3ebdSchin 32) echo "$command: ${err_file}line $err_line: warning: $1: too many flag bits" >&2 ;; 187*da2e3ebdSchin 1[56789]|[23][0123456789]) long=L ;; 188*da2e3ebdSchin *) long= ;; 189*da2e3ebdSchin esac 190*da2e3ebdSchin echo "#define $prefix$ID (1$long<<$counter)" 191*da2e3ebdSchin fi 192*da2e3ebdSchin ;; 193*da2e3ebdSchin %keywords) 194*da2e3ebdSchin if test $define = 1 195*da2e3ebdSchin then echo "#define $prefix$ID $counter" 196*da2e3ebdSchin fi 197*da2e3ebdSchin if test $table = 1 198*da2e3ebdSchin then echo " \"$1\", $prefix$ID," 199*da2e3ebdSchin fi 200*da2e3ebdSchin ;; 201*da2e3ebdSchin %sequence) 202*da2e3ebdSchin if test $define = 1 203*da2e3ebdSchin then echo "#define $prefix$ID $counter" 204*da2e3ebdSchin fi 205*da2e3ebdSchin ;; 206*da2e3ebdSchin esac 207*da2e3ebdSchin case $shell in 208*da2e3ebdSchin ksh) ((counter=counter+1)) ;; 209*da2e3ebdSchin *) counter=`expr $counter + 1` ;; 210*da2e3ebdSchin esac 211*da2e3ebdSchin shift 212*da2e3ebdSchin ;; 213*da2e3ebdSchin esac 214*da2e3ebdSchin done 215*da2e3ebdSchin ;; 216*da2e3ebdSchin esac 217*da2e3ebdSchindone 218*da2e3ebdSchincase $define:$last in 219*da2e3ebdSchin1:?*) case $shell in 220*da2e3ebdSchin ksh) ((n=counter-1)) ;; 221*da2e3ebdSchin *) n=`expr $counter - 1` ;; 222*da2e3ebdSchin esac 223*da2e3ebdSchin echo "#define $prefix$last $n" 224*da2e3ebdSchin ;; 225*da2e3ebdSchinesac 226*da2e3ebdSchincase $type in 227*da2e3ebdSchin%keywords) 228*da2e3ebdSchin if test $table = 1 229*da2e3ebdSchin then echo " 0, 0" 230*da2e3ebdSchin echo "};" 231*da2e3ebdSchin fi 232*da2e3ebdSchin ;; 233*da2e3ebdSchinesac 234*da2e3ebdSchinexit 0 235