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_exit2
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	(( Errors+=1 ))
25*8462SApril.Chin@Sun.COM}
26*8462SApril.Chin@Sun.COM
27*8462SApril.Chin@Sun.COMfunction testfunc
28*8462SApril.Chin@Sun.COM{
29*8462SApril.Chin@Sun.COM	integer line_number=$1
30*8462SApril.Chin@Sun.COM	typeset cmd="$2"
31*8462SApril.Chin@Sun.COM	typeset expected_output="$3"
32*8462SApril.Chin@Sun.COM	typeset output
33*8462SApril.Chin@Sun.COM
34*8462SApril.Chin@Sun.COM	output="$($SHELL -c "${cmd}" 2>&1 )"
35*8462SApril.Chin@Sun.COM
36*8462SApril.Chin@Sun.COM	[[ "${output}" != "${expected_output}" ]] && err_exit2 ${line_number} "${output} != ${expected_output}"
37*8462SApril.Chin@Sun.COM}
38*8462SApril.Chin@Sun.COMalias testfunc='testfunc $LINENO'
39*8462SApril.Chin@Sun.COMalias err_exit='err_exit2 $LINENO'
40*8462SApril.Chin@Sun.COM
41*8462SApril.Chin@Sun.COMCommand=${0##*/}
42*8462SApril.Chin@Sun.COMinteger Errors=0
43*8462SApril.Chin@Sun.COM
44*8462SApril.Chin@Sun.COM# string
45*8462SApril.Chin@Sun.COMtestfunc '(function l { typeset -S x ;     x+="#" ; $1 && print "$x" ; } ; l false ; l false   ; l true)'  "###"
46*8462SApril.Chin@Sun.COMtestfunc 'function  l { typeset -S x=">" ; x+="#" ; $1 && print "$x" ; } ; l false ; l false   ; l true'   ">###"
47*8462SApril.Chin@Sun.COMtestfunc 'function  l { typeset -S x=">" ; x+="#" ; $1 && print "$x" ; } ; l false ; (l false) ; l true'   ">##"
48*8462SApril.Chin@Sun.COMtestfunc 'function  l { typeset -S x=">" ; x+="#" ; $1 && print "$x" ; } ; l false; ( ulimit -c 0 ; l false) ; l true' ">##"
49*8462SApril.Chin@Sun.COM
50*8462SApril.Chin@Sun.COM# integer
51*8462SApril.Chin@Sun.COMtestfunc '(function l { typeset -S -i x ;  x+=1 ;   $1 && print "$x" ; } ; l false ; l false   ; l true )' "3"
52*8462SApril.Chin@Sun.COMtestfunc '(function l { typeset -S -i x ;  x+=1 ;   $1 && print "$x" ; } ; l false ; (l false) ; l true )' "2"
53*8462SApril.Chin@Sun.COM
54*8462SApril.Chin@Sun.COM# float
55*8462SApril.Chin@Sun.COMtestfunc '(function l { float -S x=0.5 ;  (( x+=.5 )) ;   $1 && print "$x" ; } ; l false ; l false   ; l true )' "2"
56*8462SApril.Chin@Sun.COMtestfunc '(function l { float -S x=0.5 ;  (( x+=.5 )) ;   $1 && print "$x" ; } ; l false ; (l false) ; l true )' "1.5"
57*8462SApril.Chin@Sun.COM
58*8462SApril.Chin@Sun.COM# compound variable
59*8462SApril.Chin@Sun.COM[[ "${
60*8462SApril.Chin@Sun.COM	function l
61*8462SApril.Chin@Sun.COM	{
62*8462SApril.Chin@Sun.COM		typeset -S s=( a=0 b=0 )
63*8462SApril.Chin@Sun.COM
64*8462SApril.Chin@Sun.COM		(( s.a++, s.b++ ))
65*8462SApril.Chin@Sun.COM
66*8462SApril.Chin@Sun.COM		$1 && printf 'a=%d, b=%d\n' s.a s.b
67*8462SApril.Chin@Sun.COM	}
68*8462SApril.Chin@Sun.COM	l false ; l false ; l true
69*8462SApril.Chin@Sun.COM}" != "a=3, b=3" ]] && err_exit "static compound var failed"
70*8462SApril.Chin@Sun.COM
71*8462SApril.Chin@Sun.COM
72*8462SApril.Chin@Sun.COM# array variable
73*8462SApril.Chin@Sun.COMexpected="helloan elementan elementan element"
74*8462SApril.Chin@Sun.COMgot=$(
75*8462SApril.Chin@Sun.COM	function ar
76*8462SApril.Chin@Sun.COM	{
77*8462SApril.Chin@Sun.COM		typeset -a -S s=( "hello" )
78*8462SApril.Chin@Sun.COM
79*8462SApril.Chin@Sun.COM		s+=( "an element" )
80*8462SApril.Chin@Sun.COM
81*8462SApril.Chin@Sun.COM		$1 && { printf '%s' "${s[@]}" ; printf '\n' ; }
82*8462SApril.Chin@Sun.COM	}
83*8462SApril.Chin@Sun.COM	ar false ; ar false ; ar true
84*8462SApril.Chin@Sun.COM)
85*8462SApril.Chin@Sun.COM[[ $got != $expected ]] && err_exit "static array var failed -- expected '$expected', got '$got'"
86*8462SApril.Chin@Sun.COM
87*8462SApril.Chin@Sun.COM
88*8462SApril.Chin@Sun.COM# Test visibilty of "global" vs. "static" variables. if we have a "static" variable in a
89*8462SApril.Chin@Sun.COM# function and "unset" it we should see a global variable with the same
90*8462SApril.Chin@Sun.COM# name, right ?
91*8462SApril.Chin@Sun.COMinteger hx=5
92*8462SApril.Chin@Sun.COMfunction test_hx_scope
93*8462SApril.Chin@Sun.COM{
94*8462SApril.Chin@Sun.COM	integer -S hx=9
95*8462SApril.Chin@Sun.COM	$2 && unset hx
96*8462SApril.Chin@Sun.COM	$1 && printf "hx=%d\n" hx
97*8462SApril.Chin@Sun.COM}
98*8462SApril.Chin@Sun.COMtest_hx_scope false false
99*8462SApril.Chin@Sun.COMtest_hx_scope false false
100*8462SApril.Chin@Sun.COM# first test the "unset" call in a $(...) subshell...
101*8462SApril.Chin@Sun.COM[[ "$( test_hx_scope true true  )" != "hx=5" ]] && err_exit "can't see global variable hx after unsetting static variable hx"
102*8462SApril.Chin@Sun.COM# ... end then test whether the value has changed.
103*8462SApril.Chin@Sun.COM[[ "${ test_hx_scope true false }" != "hx=9" ]] && err_exit "hx variable somehow changed"
104*8462SApril.Chin@Sun.COM
105*8462SApril.Chin@Sun.COMexit $((Errors))
106*8462SApril.Chin@Sun.COM
107