18462SApril.Chin@Sun.COM######################################################################## 28462SApril.Chin@Sun.COM# # 38462SApril.Chin@Sun.COM# This software is part of the ast package # 4*12068SRoger.Faulkner@Oracle.COM# Copyright (c) 1982-2010 AT&T Intellectual Property # 58462SApril.Chin@Sun.COM# and is licensed under the # 68462SApril.Chin@Sun.COM# Common Public License, Version 1.0 # 78462SApril.Chin@Sun.COM# by AT&T Intellectual Property # 88462SApril.Chin@Sun.COM# # 98462SApril.Chin@Sun.COM# A copy of the License is available at # 108462SApril.Chin@Sun.COM# http://www.opensource.org/licenses/cpl1.0.txt # 118462SApril.Chin@Sun.COM# (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) # 128462SApril.Chin@Sun.COM# # 138462SApril.Chin@Sun.COM# Information and Software Systems Research # 148462SApril.Chin@Sun.COM# AT&T Research # 158462SApril.Chin@Sun.COM# Florham Park NJ # 168462SApril.Chin@Sun.COM# # 178462SApril.Chin@Sun.COM# David Korn <dgk@research.att.com> # 188462SApril.Chin@Sun.COM# # 198462SApril.Chin@Sun.COM######################################################################## 208462SApril.Chin@Sun.COMfunction err_exit2 218462SApril.Chin@Sun.COM{ 228462SApril.Chin@Sun.COM print -u2 -n "\t" 238462SApril.Chin@Sun.COM print -u2 -r ${Command}[$1]: "${@:2}" 248462SApril.Chin@Sun.COM (( Errors+=1 )) 258462SApril.Chin@Sun.COM} 268462SApril.Chin@Sun.COM 278462SApril.Chin@Sun.COMfunction testfunc 288462SApril.Chin@Sun.COM{ 298462SApril.Chin@Sun.COM integer line_number=$1 308462SApril.Chin@Sun.COM typeset cmd="$2" 318462SApril.Chin@Sun.COM typeset expected_output="$3" 328462SApril.Chin@Sun.COM typeset output 3310898Sroland.mainz@nrubsig.org 348462SApril.Chin@Sun.COM output="$($SHELL -c "${cmd}" 2>&1 )" 3510898Sroland.mainz@nrubsig.org 368462SApril.Chin@Sun.COM [[ "${output}" != "${expected_output}" ]] && err_exit2 ${line_number} "${output} != ${expected_output}" 378462SApril.Chin@Sun.COM} 388462SApril.Chin@Sun.COMalias testfunc='testfunc $LINENO' 398462SApril.Chin@Sun.COMalias err_exit='err_exit2 $LINENO' 408462SApril.Chin@Sun.COM 418462SApril.Chin@Sun.COMCommand=${0##*/} 428462SApril.Chin@Sun.COMinteger Errors=0 438462SApril.Chin@Sun.COM 448462SApril.Chin@Sun.COM# string 458462SApril.Chin@Sun.COMtestfunc '(function l { typeset -S x ; x+="#" ; $1 && print "$x" ; } ; l false ; l false ; l true)' "###" 468462SApril.Chin@Sun.COMtestfunc 'function l { typeset -S x=">" ; x+="#" ; $1 && print "$x" ; } ; l false ; l false ; l true' ">###" 478462SApril.Chin@Sun.COMtestfunc 'function l { typeset -S x=">" ; x+="#" ; $1 && print "$x" ; } ; l false ; (l false) ; l true' ">##" 488462SApril.Chin@Sun.COMtestfunc 'function l { typeset -S x=">" ; x+="#" ; $1 && print "$x" ; } ; l false; ( ulimit -c 0 ; l false) ; l true' ">##" 498462SApril.Chin@Sun.COM 508462SApril.Chin@Sun.COM# integer 518462SApril.Chin@Sun.COMtestfunc '(function l { typeset -S -i x ; x+=1 ; $1 && print "$x" ; } ; l false ; l false ; l true )' "3" 528462SApril.Chin@Sun.COMtestfunc '(function l { typeset -S -i x ; x+=1 ; $1 && print "$x" ; } ; l false ; (l false) ; l true )' "2" 538462SApril.Chin@Sun.COM 548462SApril.Chin@Sun.COM# float 558462SApril.Chin@Sun.COMtestfunc '(function l { float -S x=0.5 ; (( x+=.5 )) ; $1 && print "$x" ; } ; l false ; l false ; l true )' "2" 568462SApril.Chin@Sun.COMtestfunc '(function l { float -S x=0.5 ; (( x+=.5 )) ; $1 && print "$x" ; } ; l false ; (l false) ; l true )' "1.5" 578462SApril.Chin@Sun.COM 588462SApril.Chin@Sun.COM# compound variable 598462SApril.Chin@Sun.COM[[ "${ 608462SApril.Chin@Sun.COM function l 618462SApril.Chin@Sun.COM { 628462SApril.Chin@Sun.COM typeset -S s=( a=0 b=0 ) 6310898Sroland.mainz@nrubsig.org 648462SApril.Chin@Sun.COM (( s.a++, s.b++ )) 6510898Sroland.mainz@nrubsig.org 668462SApril.Chin@Sun.COM $1 && printf 'a=%d, b=%d\n' s.a s.b 678462SApril.Chin@Sun.COM } 688462SApril.Chin@Sun.COM l false ; l false ; l true 698462SApril.Chin@Sun.COM}" != "a=3, b=3" ]] && err_exit "static compound var failed" 708462SApril.Chin@Sun.COM 718462SApril.Chin@Sun.COM 728462SApril.Chin@Sun.COM# array variable 738462SApril.Chin@Sun.COMexpected="helloan elementan elementan element" 748462SApril.Chin@Sun.COMgot=$( 758462SApril.Chin@Sun.COM function ar 768462SApril.Chin@Sun.COM { 778462SApril.Chin@Sun.COM typeset -a -S s=( "hello" ) 7810898Sroland.mainz@nrubsig.org 798462SApril.Chin@Sun.COM s+=( "an element" ) 8010898Sroland.mainz@nrubsig.org 818462SApril.Chin@Sun.COM $1 && { printf '%s' "${s[@]}" ; printf '\n' ; } 828462SApril.Chin@Sun.COM } 838462SApril.Chin@Sun.COM ar false ; ar false ; ar true 848462SApril.Chin@Sun.COM) 858462SApril.Chin@Sun.COM[[ $got != $expected ]] && err_exit "static array var failed -- expected '$expected', got '$got'" 868462SApril.Chin@Sun.COM 878462SApril.Chin@Sun.COM 888462SApril.Chin@Sun.COM# Test visibilty of "global" vs. "static" variables. if we have a "static" variable in a 898462SApril.Chin@Sun.COM# function and "unset" it we should see a global variable with the same 908462SApril.Chin@Sun.COM# name, right ? 918462SApril.Chin@Sun.COMinteger hx=5 928462SApril.Chin@Sun.COMfunction test_hx_scope 938462SApril.Chin@Sun.COM{ 948462SApril.Chin@Sun.COM integer -S hx=9 958462SApril.Chin@Sun.COM $2 && unset hx 968462SApril.Chin@Sun.COM $1 && printf "hx=%d\n" hx 978462SApril.Chin@Sun.COM} 988462SApril.Chin@Sun.COMtest_hx_scope false false 998462SApril.Chin@Sun.COMtest_hx_scope false false 1008462SApril.Chin@Sun.COM# first test the "unset" call in a $(...) subshell... 1018462SApril.Chin@Sun.COM[[ "$( test_hx_scope true true )" != "hx=5" ]] && err_exit "can't see global variable hx after unsetting static variable hx" 1028462SApril.Chin@Sun.COM# ... end then test whether the value has changed. 1038462SApril.Chin@Sun.COM[[ "${ test_hx_scope true false }" != "hx=9" ]] && err_exit "hx variable somehow changed" 1048462SApril.Chin@Sun.COM 1058462SApril.Chin@Sun.COMexit $((Errors)) 1068462SApril.Chin@Sun.COM 107