xref: /titanic_51/usr/src/lib/libpp/common/gentab.sh (revision da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968)
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