da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin########################################################################
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# This software is part of the ast package #
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# Copyright (c) 1986-2009 AT&T Intellectual Property #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# and is licensed under the #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Common Public License, Version 1.0 #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# by AT&T Intellectual Property #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# A copy of the License is available at #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# http://www.opensource.org/licenses/cpl1.0.txt #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Information and Software Systems Research #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# AT&T Research #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Florham Park NJ #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Glenn Fowler <gsf@research.att.com> #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin########################################################################
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Glenn Fowler
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# AT&T Bell Laboratories
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# @(#)gentab (gsf@research.att.com) 07/17/94
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# C table generator
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# %flags [ prefix=<prefix> ] [ index=<index> ] [ init=<init> ]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# %keyword <name> [ prefix=<prefix> ] [ index=<index> ] [ init=<init> ] [ first=<id> ] [ last=<id> ]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# %sequence [ prefix=<prefix> ] [ index=<index> ] [ init=<init> ]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincase `(typeset -u s=a n=0; ((n=n+1)); print $s$n) 2>/dev/null` in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinA1) shell=ksh
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin typeset -u ID
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin typeset -i counter err_line
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin*) shell=bsh
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinesac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincommand=$0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincounter=0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindefine=1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinerr_line=0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintype=""
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinindex=""
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfirst=""
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinlast=""
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintable=1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinwhile :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindo case $1 in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin -d) table=0 ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin -t) define=0 ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *) break ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shift
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindone
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincase $1 in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"") err_file=""
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin*) exec <$1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_file="\"$1\", "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinesac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinwhile read line
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindo case $shell in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ksh) ((err_line=err_line+1)) ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *) err_line=`expr $err_line + 1` ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set '' $line
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shift
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case $1 in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [#]*) echo "/*"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do case $1 in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [#]*) shift
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin echo " * $*"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin read line
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set '' $line
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shift
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *) break
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin done
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin echo " */"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin echo
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin eval set '""' $line
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shift
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case $1 in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "") ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin %flags|%keywords|%sequence)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case $define:$last in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 1:?*) case $shell in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ksh) ((n=counter-1)) ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *) n=`expr $counter - 1` ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin echo "#define $prefix$last $n"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case $type in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin %flags|%sequence)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if test $define = 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin then echo
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin %keywords)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if test $table = 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin then echo " 0, 0"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin echo "};"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin echo
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin elif test $define = 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin then echo
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case $index in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ?*) eval $index=$counter ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin type=$1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shift
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin name=""
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin prefix=""
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin index=""
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin init=""
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin first=""
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin last=""
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case $type in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin %keywords)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case $1 in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "") echo "$command: ${err_file}line $err_line: $type table name omitted" >&2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin exit 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin name=$1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shift
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if test $table = 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin then echo "$name"'[] ='
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin echo "{"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin eval "$@"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case $init in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "") case $type in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin %flags|%sequence)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin init=0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *) init=1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case $index in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "") counter=$init
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *) eval value=\$$index
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case $value in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "") counter=$init ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [0123456789]*) counter=$value ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case $define:$first in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 1:?*) echo "#define $prefix$first $counter" ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin %*) echo "$command: ${err_file}line $err_line: $1: unknown keyword" >&2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin exit 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *) while :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do case $1 in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "") break
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *) case $shell in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ksh) ID=${1#[!abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_]} ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *) ID=`echo $1 | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | sed 's/^[^ABCDEFGHIJKLMNOPQRSTUVWXYZ_]//'` ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case $type in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin %flags) if test $define = 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin then case $counter in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 32) echo "$command: ${err_file}line $err_line: warning: $1: too many flag bits" >&2 ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 1[56789]|[23][0123456789]) long=L ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *) long= ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin echo "#define $prefix$ID (1$long<<$counter)"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin %keywords)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if test $define = 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin then echo "#define $prefix$ID $counter"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if test $table = 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin then echo " \"$1\", $prefix$ID,"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin %sequence)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if test $define = 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin then echo "#define $prefix$ID $counter"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case $shell in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ksh) ((counter=counter+1)) ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *) counter=`expr $counter + 1` ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shift
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin done
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindone
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincase $define:$last in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin1:?*) case $shell in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ksh) ((n=counter-1)) ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *) n=`expr $counter - 1` ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin echo "#define $prefix$last $n"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinesac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincase $type in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin%keywords)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if test $table = 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin then echo " 0, 0"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin echo "};"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinesac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinexit 0