1*8462SApril.Chin@Sun.COM########################################################################
2*8462SApril.Chin@Sun.COM#                                                                      #
3*8462SApril.Chin@Sun.COM#               This software is part of the ast package               #
4*8462SApril.Chin@Sun.COM#          Copyright (c) 1982-2008 AT&T Intellectual Property          #
5*8462SApril.Chin@Sun.COM#                      and is licensed under the                       #
6*8462SApril.Chin@Sun.COM#                  Common Public License, Version 1.0                  #
7*8462SApril.Chin@Sun.COM#                    by AT&T Intellectual Property                     #
8*8462SApril.Chin@Sun.COM#                                                                      #
9*8462SApril.Chin@Sun.COM#                A copy of the License is available at                 #
10*8462SApril.Chin@Sun.COM#            http://www.opensource.org/licenses/cpl1.0.txt             #
11*8462SApril.Chin@Sun.COM#         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         #
12*8462SApril.Chin@Sun.COM#                                                                      #
13*8462SApril.Chin@Sun.COM#              Information and Software Systems Research               #
14*8462SApril.Chin@Sun.COM#                            AT&T Research                             #
15*8462SApril.Chin@Sun.COM#                           Florham Park NJ                            #
16*8462SApril.Chin@Sun.COM#                                                                      #
17*8462SApril.Chin@Sun.COM#                  David Korn <dgk@research.att.com>                   #
18*8462SApril.Chin@Sun.COM#                                                                      #
19*8462SApril.Chin@Sun.COM########################################################################
20*8462SApril.Chin@Sun.COMfunction err_exit
21*8462SApril.Chin@Sun.COM{
22*8462SApril.Chin@Sun.COM	print -u2 -n "\t"
23*8462SApril.Chin@Sun.COM	print -u2 -r ${Command}[$1]: "${@:2}"
24*8462SApril.Chin@Sun.COM	let Errors+=1
25*8462SApril.Chin@Sun.COM}
26*8462SApril.Chin@Sun.COMalias err_exit='err_exit $LINENO'
27*8462SApril.Chin@Sun.COM
28*8462SApril.Chin@Sun.COMCommand=${0##*/}
29*8462SApril.Chin@Sun.COMinteger Errors=0
30*8462SApril.Chin@Sun.COMfor	((i=0; i < 4; i++ ))
31*8462SApril.Chin@Sun.COMdo	for	((j=0; j < 5; j++ ))
32*8462SApril.Chin@Sun.COM	do	a[i][j]=$i$j
33*8462SApril.Chin@Sun.COM	done
34*8462SApril.Chin@Sun.COMdone
35*8462SApril.Chin@Sun.COMfor	((i=0; i < 4; i++ ))
36*8462SApril.Chin@Sun.COMdo	for	((j=0; j < 5; j++ ))
37*8462SApril.Chin@Sun.COM	do	[[ ${a[i][j]} == "$i$j" ]] || err_exit "\${a[$i][$j]} != $i$j"
38*8462SApril.Chin@Sun.COM	done
39*8462SApril.Chin@Sun.COMdone
40*8462SApril.Chin@Sun.COMfor	((i=0; i < 4; i++ ))
41*8462SApril.Chin@Sun.COMdo	j=0;for k in ${a[i][@]}
42*8462SApril.Chin@Sun.COM	do	[[ $k == "$i$j" ]] || err_exit "\${a[i][@]} != $i$j"
43*8462SApril.Chin@Sun.COM		(( j++ ))
44*8462SApril.Chin@Sun.COM	done
45*8462SApril.Chin@Sun.COMdone
46*8462SApril.Chin@Sun.COMunset a
47*8462SApril.Chin@Sun.COMa=(
48*8462SApril.Chin@Sun.COM	( 00 01 02 03 04 )
49*8462SApril.Chin@Sun.COM	( 10 11 12 13 14 15)
50*8462SApril.Chin@Sun.COM	( 20 21 22 23 24 )
51*8462SApril.Chin@Sun.COM	( 30 31 32 33 34 )
52*8462SApril.Chin@Sun.COM)
53*8462SApril.Chin@Sun.COM
54*8462SApril.Chin@Sun.COMfunction check
55*8462SApril.Chin@Sun.COM{
56*8462SApril.Chin@Sun.COM	nameref a=$1
57*8462SApril.Chin@Sun.COM	nameref b=a[2]
58*8462SApril.Chin@Sun.COM	typeset c=$1
59*8462SApril.Chin@Sun.COM	integer i j
60*8462SApril.Chin@Sun.COM	for	((i=0; i < 4; i++ ))
61*8462SApril.Chin@Sun.COM	do	for	((j=0; j < 5; j++ ))
62*8462SApril.Chin@Sun.COM		do	[[ ${a[$i][$j]} == "$i$j" ]] || err_exit "\${$c[$i][$j]} != $i$j"
63*8462SApril.Chin@Sun.COM		done
64*8462SApril.Chin@Sun.COM	done
65*8462SApril.Chin@Sun.COM	(( ${#a[@]} == 4 )) || err_exit "\${#$c[@]} not 4"
66*8462SApril.Chin@Sun.COM	(( ${#a[0][@]} == 5 )) || err_exit "\${#$c[0][@]} not 5"
67*8462SApril.Chin@Sun.COM	(( ${#a[1][@]} == 6 )) || err_exit "\${#$c[1][@]} not 6"
68*8462SApril.Chin@Sun.COM	set -s -- ${!a[@]}
69*8462SApril.Chin@Sun.COM	[[ ${@} == '0 1 2 3' ]] || err_exit "\${!$c[@]} not 0 1 2 3"
70*8462SApril.Chin@Sun.COM	set -s -- ${!a[0][@]}
71*8462SApril.Chin@Sun.COM	[[ ${@} == '0 1 2 3 4' ]] || err_exit "\${!$c[0][@]} not 0 1 2 3 4"
72*8462SApril.Chin@Sun.COM	set -s -- ${!a[1][@]}
73*8462SApril.Chin@Sun.COM	[[ ${@} == '0 1 2 3 4 5' ]] || err_exit "\${!$c[1][@]} not 0 1 2 3 4 5"
74*8462SApril.Chin@Sun.COM	[[ $a == 00 ]] || err_exit  "\$$c is not 00"
75*8462SApril.Chin@Sun.COM	[[ ${a[0]} == 00 ]] || err_exit  "\${$a[0]} is not 00"
76*8462SApril.Chin@Sun.COM	[[ ${a[0][0]} == 00 ]] || err_exit  "${a[0][0]} is not 00"
77*8462SApril.Chin@Sun.COM	[[ ${a[0][0][0]} == 00 ]] || err_exit  "\${$c[0][0][0]} is not 00"
78*8462SApril.Chin@Sun.COM	[[ ${a[0][0][1]} == '' ]] || err_exit  "\${$c[0][0][1]} is not empty"
79*8462SApril.Chin@Sun.COM	[[ ${b[3]} == 23 ]] || err_exit "${!b}[3] not = 23"
80*8462SApril.Chin@Sun.COM}
81*8462SApril.Chin@Sun.COM
82*8462SApril.Chin@Sun.COMcheck a
83*8462SApril.Chin@Sun.COM
84*8462SApril.Chin@Sun.COMunset a
85*8462SApril.Chin@Sun.COMtypeset -A a
86*8462SApril.Chin@Sun.COMfor	((i=0; i < 4; i++ ))
87*8462SApril.Chin@Sun.COMdo	for	((j=0; j < 5; j++ ))
88*8462SApril.Chin@Sun.COM	do	a[$i][j]=$i$j
89*8462SApril.Chin@Sun.COM	done
90*8462SApril.Chin@Sun.COMdone
91*8462SApril.Chin@Sun.COMfor	((i=0; i < 4; i++ ))
92*8462SApril.Chin@Sun.COMdo	for	((j=0; j < 5; j++ ))
93*8462SApril.Chin@Sun.COM	do	[[ ${a[$i][j]} == "$i$j" ]] || err_exit "\${a[$i][$j]} == $i$j"
94*8462SApril.Chin@Sun.COM	done
95*8462SApril.Chin@Sun.COMdone
96*8462SApril.Chin@Sun.COMa[1][5]=15
97*8462SApril.Chin@Sun.COMb=(
98*8462SApril.Chin@Sun.COM	[0]=( 00 01 02 03 04 )
99*8462SApril.Chin@Sun.COM	[1]=( 10 11 12 13 14 15)
100*8462SApril.Chin@Sun.COM	[2]=( 20 21 22 23 24 )
101*8462SApril.Chin@Sun.COM	[3]=( 30 31 32 33 34 )
102*8462SApril.Chin@Sun.COM)
103*8462SApril.Chin@Sun.COMcheck b
104*8462SApril.Chin@Sun.COM[[ ${a[1][@]} == "${b[1][@]}" ]] || err_exit "a[1] not equal to b[1]"
105*8462SApril.Chin@Sun.COMc=(
106*8462SApril.Chin@Sun.COM	[0]=( [0]=00 [1]=01 [2]=02 [3]=03 [4]=04 )
107*8462SApril.Chin@Sun.COM	[1]=( [0]=10 [1]=11 [2]=12 [3]=13 [4]=14 [5]=15)
108*8462SApril.Chin@Sun.COM	[2]=( [0]=20 [1]=21 [2]=22 [3]=23 [4]=24 )
109*8462SApril.Chin@Sun.COM	[3]=( [0]=30 [1]=31 [2]=32 [3]=33 [4]=34 )
110*8462SApril.Chin@Sun.COM)
111*8462SApril.Chin@Sun.COMcheck c
112*8462SApril.Chin@Sun.COMtypeset -A d
113*8462SApril.Chin@Sun.COMd[0]=( [0]=00 [1]=01 [2]=02 [3]=03 [4]=04 )
114*8462SApril.Chin@Sun.COMd[1]=( [0]=10 [1]=11 [2]=12 [3]=13 [4]=14 [5]=15)
115*8462SApril.Chin@Sun.COMd[2]=( [0]=20 [1]=21 [2]=22 [3]=23 [4]=24 )
116*8462SApril.Chin@Sun.COMd[3]=( [0]=30 [1]=31 [2]=32 [3]=33 [4]=34 )
117*8462SApril.Chin@Sun.COMcheck d
118*8462SApril.Chin@Sun.COMunset a b c d
119*8462SApril.Chin@Sun.COM[[ ${a-set} ]] || err_exit "a is set after unset"
120*8462SApril.Chin@Sun.COM[[ ${b-set} ]] || err_exit "b is set after unset"
121*8462SApril.Chin@Sun.COM[[ ${c-set} ]] || err_exit "c is set after unset"
122*8462SApril.Chin@Sun.COM[[ ${d-set} ]] || err_exit "c is set after unset"
123*8462SApril.Chin@Sun.COMexit $((Errors))
124