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