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