1*b30d1939SAndy Fiddaman######################################################################## 2*b30d1939SAndy Fiddaman# # 3*b30d1939SAndy Fiddaman# This software is part of the ast package # 4*b30d1939SAndy Fiddaman# Copyright (c) 1982-2012 AT&T Intellectual Property # 5*b30d1939SAndy Fiddaman# and is licensed under the # 6*b30d1939SAndy Fiddaman# Eclipse Public License, Version 1.0 # 7*b30d1939SAndy Fiddaman# by AT&T Intellectual Property # 8*b30d1939SAndy Fiddaman# # 9*b30d1939SAndy Fiddaman# A copy of the License is available at # 10*b30d1939SAndy Fiddaman# http://www.eclipse.org/org/documents/epl-v10.html # 11*b30d1939SAndy Fiddaman# (with md5 checksum b35adb5213ca9657e911e9befb180842) # 12*b30d1939SAndy Fiddaman# # 13*b30d1939SAndy Fiddaman# Information and Software Systems Research # 14*b30d1939SAndy Fiddaman# AT&T Research # 15*b30d1939SAndy Fiddaman# Florham Park NJ # 16*b30d1939SAndy Fiddaman# # 17*b30d1939SAndy Fiddaman# David Korn <dgk@research.att.com> # 18*b30d1939SAndy Fiddaman# # 19*b30d1939SAndy Fiddaman######################################################################## 20*b30d1939SAndy Fiddamanfunction err_exit 21*b30d1939SAndy Fiddaman{ 22*b30d1939SAndy Fiddaman print -u2 -n "\t" 23*b30d1939SAndy Fiddaman print -u2 -r ${Command}[$1]: "${@:2}" 24*b30d1939SAndy Fiddaman let Errors+=1 25*b30d1939SAndy Fiddaman} 26*b30d1939SAndy Fiddamanalias err_exit='err_exit $LINENO' 27*b30d1939SAndy Fiddaman 28*b30d1939SAndy FiddamanCommand=${0##*/} 29*b30d1939SAndy Fiddamaninteger Errors=0 30*b30d1939SAndy Fiddaman 31*b30d1939SAndy Fiddamantmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; } 32*b30d1939SAndy Fiddamantrap "cd /; rm -rf $tmp" EXIT 33*b30d1939SAndy Fiddaman 34*b30d1939SAndy Fiddamanfoo=abc 35*b30d1939SAndy Fiddamantypeset -C bar=(x=3 y=4 t=7) 36*b30d1939SAndy Fiddamantypeset -A z=([abc]=qqq) 37*b30d1939SAndy Fiddamaninteger r=9 38*b30d1939SAndy Fiddamanfunction fn 39*b30d1939SAndy Fiddaman{ 40*b30d1939SAndy Fiddaman print global fn $foo 41*b30d1939SAndy Fiddaman} 42*b30d1939SAndy Fiddamanfunction fun 43*b30d1939SAndy Fiddaman{ 44*b30d1939SAndy Fiddaman print global fun $foo 45*b30d1939SAndy Fiddaman} 46*b30d1939SAndy Fiddamanmkdir -p $tmp/global/bin $tmp/local/bin 47*b30d1939SAndy Fiddamancat > $tmp/global/xfun <<- \EOF 48*b30d1939SAndy Fiddaman function xfun 49*b30d1939SAndy Fiddaman { 50*b30d1939SAndy Fiddaman print xfun global $foo 51*b30d1939SAndy Fiddaman } 52*b30d1939SAndy FiddamanEOF 53*b30d1939SAndy Fiddamancat > $tmp/local/xfun <<- \EOF 54*b30d1939SAndy Fiddaman function xfun 55*b30d1939SAndy Fiddaman { 56*b30d1939SAndy Fiddaman print xfun local $foo 57*b30d1939SAndy Fiddaman } 58*b30d1939SAndy FiddamanEOF 59*b30d1939SAndy Fiddamanchmod +x "$tmp/global/xfun" "$tmp/local/xfun" 60*b30d1939SAndy Fiddamanprint 'print local prog $1' > $tmp/local/bin/run 61*b30d1939SAndy Fiddamanprint 'print global prog $1' > $tmp/global/bin/run 62*b30d1939SAndy Fiddamanchmod +x "$tmp/local/bin/run" "$tmp/global/bin/run" 63*b30d1939SAndy FiddamanPATH=$tmp/global/bin:$PATH 64*b30d1939SAndy FiddamanFPATH=$tmp/global 65*b30d1939SAndy Fiddaman 66*b30d1939SAndy Fiddamannamespace x 67*b30d1939SAndy Fiddaman{ 68*b30d1939SAndy Fiddaman foo=bar 69*b30d1939SAndy Fiddaman typeset -C bar=(x=1 y=2 z=3) 70*b30d1939SAndy Fiddaman typeset -A z=([qqq]=abc) 71*b30d1939SAndy Fiddaman function fn 72*b30d1939SAndy Fiddaman { 73*b30d1939SAndy Fiddaman print local fn $foo 74*b30d1939SAndy Fiddaman } 75*b30d1939SAndy Fiddaman [[ $(fn) == 'local fn bar' ]] || err_exit 'fn inside namespace should run local function' 76*b30d1939SAndy Fiddaman [[ $(fun) == 'global fun abc' ]] || err_exit 'global fun run from namespace not working' 77*b30d1939SAndy Fiddaman (( r == 9 )) || err_exit 'global variable r not set in namespace' 78*b30d1939SAndy Fiddamanfalse 79*b30d1939SAndy Fiddaman [[ ${z[qqq]} == abc ]] || err_exit 'local array element not correct' 80*b30d1939SAndy Fiddaman [[ ${z[abc]} == '' ]] || err_exit 'global array element should not be visible when local element exists' 81*b30d1939SAndy Fiddaman [[ ${bar.y} == 2 ]] || err_exit 'local variable bar.y not found' 82*b30d1939SAndy Fiddaman [[ ${bar.t} == '' ]] || err_exit 'global bar.t should not be visible' 83*b30d1939SAndy Fiddaman function runxrun 84*b30d1939SAndy Fiddaman { 85*b30d1939SAndy Fiddaman xfun 86*b30d1939SAndy Fiddaman } 87*b30d1939SAndy Fiddaman function runrun 88*b30d1939SAndy Fiddaman { 89*b30d1939SAndy Fiddaman run $1 90*b30d1939SAndy Fiddaman } 91*b30d1939SAndy Fiddaman PATH=$tmp/local/bin:/bin 92*b30d1939SAndy Fiddaman FPATH=$tmp/local 93*b30d1939SAndy Fiddaman [[ $(runxrun) == 'xfun local bar' ]] || err_exit 'local function on FPATH failed' 94*b30d1939SAndy Fiddaman [[ $(runrun $foo) == 'local prog bar' ]] || err_exit 'local binary on PATH failed' 95*b30d1939SAndy Fiddaman} 96*b30d1939SAndy Fiddaman[[ $(fn) == 'global fn abc' ]] || err_exit 'fn outside namespace should run global function' 97*b30d1939SAndy Fiddaman[[ $(.x.fn) == 'local fn bar' ]] || err_exit 'namespace function called from global failed' 98*b30d1939SAndy Fiddaman[[ ${z[abc]} == qqq ]] || err_exit 'global associative array should not be affected by definiton in namespace' 99*b30d1939SAndy Fiddaman[[ ${bar.y} == 4 ]] || err_exit 'global compound variable should not be affected by definiton in namespace' 100*b30d1939SAndy Fiddaman[[ ${bar.z} == '' ]] || err_exit 'global compound variable should not see elements in namespace' 101*b30d1939SAndy Fiddaman[[ $(xfun) == 'xfun global abc' ]] || err_exit 'global function on FPATH failed' 102*b30d1939SAndy Fiddaman[[ $(run $foo) == 'global prog abc' ]] || err_exit 'global binary on PATH failed' 103*b30d1939SAndy Fiddamanfalse 104*b30d1939SAndy Fiddaman[[ $(.x.runxrun) == 'xfun local bar' ]] || err_exit 'namespace function on FPATH failed' 105*b30d1939SAndy Fiddaman 106*b30d1939SAndy Fiddamanexit $((Errors<125?Errors:125)) 107