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