1da2e3ebdSchin########################################################################
2da2e3ebdSchin#                                                                      #
3da2e3ebdSchin#               This software is part of the ast package               #
4*b30d1939SAndy Fiddaman#          Copyright (c) 1982-2012 AT&T Intellectual Property          #
5da2e3ebdSchin#                      and is licensed under the                       #
6*b30d1939SAndy Fiddaman#                 Eclipse Public License, Version 1.0                  #
77c2fbfb3SApril Chin#                    by AT&T Intellectual Property                     #
8da2e3ebdSchin#                                                                      #
9da2e3ebdSchin#                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)         #
12da2e3ebdSchin#                                                                      #
13da2e3ebdSchin#              Information and Software Systems Research               #
14da2e3ebdSchin#                            AT&T Research                             #
15da2e3ebdSchin#                           Florham Park NJ                            #
16da2e3ebdSchin#                                                                      #
17da2e3ebdSchin#                  David Korn <dgk@research.att.com>                   #
18da2e3ebdSchin#                                                                      #
19da2e3ebdSchin########################################################################
20da2e3ebdSchinfunction err_exit
21da2e3ebdSchin{
22da2e3ebdSchin	print -u2 -n "\t"
23da2e3ebdSchin	print -u2 -r ${Command}[$1]: "${@:2}"
24da2e3ebdSchin	let Errors+=1
25da2e3ebdSchin}
26da2e3ebdSchinalias err_exit='err_exit $LINENO'
27da2e3ebdSchin
28da2e3ebdSchininteger Errors=0
29da2e3ebdSchinCommand=${0##*/}
30*b30d1939SAndy Fiddamancompiled=''
31*b30d1939SAndy Fiddamanread -n4 c < $0 2> /dev/null
32*b30d1939SAndy Fiddaman[[ $c == *$'\ck'* ]] && compiled=1
337c2fbfb3SApril Chin
3434f9b3eeSRoland Mainzulimit -c 0
3534f9b3eeSRoland Mainz
3634f9b3eeSRoland Mainztmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; }
3734f9b3eeSRoland Mainztrap "cd /; rm -rf $tmp" EXIT
387c2fbfb3SApril Chin
39da2e3ebdSchininteger foo=33
40da2e3ebdSchinbar=bye
41da2e3ebdSchin# check for global variables and $0
42da2e3ebdSchinfunction foobar
43da2e3ebdSchin{
44da2e3ebdSchin	case $1 in
45da2e3ebdSchin	1) 	print -r - "$foo" "$bar";;
46da2e3ebdSchin	2)	print -r - "$0";;
47da2e3ebdSchin	3)	typeset foo=foo
48da2e3ebdSchin		integer bar=10
49da2e3ebdSchin	 	print -r - "$foo" "$bar";;
50da2e3ebdSchin	4)	trap 'foo=36' EXIT
51da2e3ebdSchin		typeset foo=20;;
52da2e3ebdSchin	esac
53da2e3ebdSchin}
54da2e3ebdSchinfunction print
55da2e3ebdSchin{
56da2e3ebdSchin	command print hi
57da2e3ebdSchin}
58da2e3ebdSchinif	[[ $(print) != hi ]]
59da2e3ebdSchinthen	err_exit "command print not working inside print function"
60da2e3ebdSchinfi
61da2e3ebdSchinunset -f print
62da2e3ebdSchin
63da2e3ebdSchinif	[[ $(foobar 1) != '33 bye' ]]
64da2e3ebdSchinthen	err_exit 'global variables not correct'
65da2e3ebdSchinfi
66da2e3ebdSchin
67da2e3ebdSchinif	[[ $(foobar 2) != 'foobar' ]]
68da2e3ebdSchinthen	err_exit '$0  not correct'
69da2e3ebdSchinfi
70da2e3ebdSchin
71da2e3ebdSchinif	[[ $(bar=foo foobar 1) != '33 foo' ]]
72da2e3ebdSchinthen	err_exit 'environment override not correct'
73da2e3ebdSchinfi
74da2e3ebdSchinif	[[ $bar == foo ]]
75da2e3ebdSchinthen	err_exit 'scoping error'
76da2e3ebdSchinfi
77da2e3ebdSchin
78da2e3ebdSchinif	[[ $(foobar 3) != 'foo 10' ]]
79da2e3ebdSchinthen	err_exit non-local variables
80da2e3ebdSchinfi
81da2e3ebdSchin
82da2e3ebdSchinfoobar 4
83da2e3ebdSchinif	[[ $foo != 36 ]]
84da2e3ebdSchinthen	err_exit EXIT trap in wrong scope
85da2e3ebdSchinfi
86da2e3ebdSchinunset -f foobar || err_exit "cannot unset function foobar"
87da2e3ebdSchintypeset -f foobar>/dev/null  && err_exit "typeset -f has incorrect exit status"
88da2e3ebdSchin
89da2e3ebdSchinfunction foobar
90da2e3ebdSchin{
91da2e3ebdSchin	(return 0)
92da2e3ebdSchin}
9334f9b3eeSRoland Mainz> $tmp/test1
94da2e3ebdSchin{
95da2e3ebdSchinfoobar
9634f9b3eeSRoland Mainzif	[ -r $tmp/test1 ]
9734f9b3eeSRoland Mainzthen	rm -r $tmp/test1
98da2e3ebdSchinelse	err_exit 'return within subshell inside function error'
99da2e3ebdSchinfi
100da2e3ebdSchin}
101da2e3ebdSchinabc() print hi
102da2e3ebdSchinif	[[ $(abc) != hi ]]
103da2e3ebdSchinthen	err_exit 'abc() print hi not working'
104da2e3ebdSchinfi
105da2e3ebdSchin( unset -f abc )
106da2e3ebdSchinif	[[ $(abc 2>/dev/null) != hi ]]
107da2e3ebdSchinthen	err_exit 'abc() print hi not working after subshell unset'
108da2e3ebdSchinfi
109da2e3ebdSchin(
110da2e3ebdSchin	function f
111da2e3ebdSchin	{
112da2e3ebdSchin		exit 1
113da2e3ebdSchin	}
114da2e3ebdSchin	f
115da2e3ebdSchin	err_exit 'exit from function not working'
116da2e3ebdSchin)
117da2e3ebdSchinunset -f foo
118da2e3ebdSchinfunction foo
119da2e3ebdSchin{
120da2e3ebdSchin	x=2
121da2e3ebdSchin	(
122da2e3ebdSchin		x=3
1237c2fbfb3SApril Chin		cd $tmp
124da2e3ebdSchin		print bar
125da2e3ebdSchin	)
126da2e3ebdSchin	if	[[ $x != 2 ]]
127da2e3ebdSchin	then	err_exit 'value of x not restored after subshell inside function'
128da2e3ebdSchin	fi
129da2e3ebdSchin}
130da2e3ebdSchinx=1
131da2e3ebdSchindir=$PWD
132da2e3ebdSchinif	[[ $(foo) != bar ]]
133da2e3ebdSchinthen	err_exit 'cd inside nested subshell not working'
134da2e3ebdSchinfi
135da2e3ebdSchinif	[[ $PWD != "$dir" ]]
136da2e3ebdSchinthen	err_exit 'cd inside nested subshell changes $PWD'
137da2e3ebdSchinfi
138da2e3ebdSchinfun() /bin/echo hello
139da2e3ebdSchinif	[[ $(fun) != hello ]]
140da2e3ebdSchinthen	err_exit one line functions not working
141da2e3ebdSchinfi
14234f9b3eeSRoland Mainzcat > $tmp/script <<-\!
143da2e3ebdSchin	print -r -- "$1"
144da2e3ebdSchin!
14534f9b3eeSRoland Mainzchmod +x $tmp/script
146da2e3ebdSchinfunction passargs
147da2e3ebdSchin{
14834f9b3eeSRoland Mainz	$tmp/script "$@"
149da2e3ebdSchin}
150da2e3ebdSchinif	[[ $(passargs one) != one ]]
151da2e3ebdSchinthen	err_exit 'passing args from functions to scripts not working'
152da2e3ebdSchinfi
15334f9b3eeSRoland Mainzcat > $tmp/script <<-\!
154da2e3ebdSchin	trap 'exit 0' EXIT
155da2e3ebdSchin	function foo
156da2e3ebdSchin	{
15734f9b3eeSRoland Mainz		/tmp > /dev/null 2>&1
158da2e3ebdSchin	}
159da2e3ebdSchin	foo
160da2e3ebdSchin!
16134f9b3eeSRoland Mainzif	! $tmp/script
16234f9b3eeSRoland Mainzthen	err_exit 'exit trap incorrectly triggered'
163da2e3ebdSchinfi
16434f9b3eeSRoland Mainzif	! $SHELL -c $tmp/script
16534f9b3eeSRoland Mainzthen	err_exit 'exit trap incorrectly triggered when invoked with -c'
166da2e3ebdSchinfi
16734f9b3eeSRoland Mainz$SHELL -c "trap 'rm $tmp/script' EXIT"
16834f9b3eeSRoland Mainzif	[[ -f $tmp/script ]]
16934f9b3eeSRoland Mainzthen	err_exit 'exit trap not triggered when invoked with -c'
170da2e3ebdSchinfi
17134f9b3eeSRoland Mainzcat > $tmp/script <<- \EOF
172da2e3ebdSchin	foobar()
173da2e3ebdSchin	{
174da2e3ebdSchin		return
175da2e3ebdSchin	}
176da2e3ebdSchin	shift
177da2e3ebdSchin	foobar
178da2e3ebdSchin	print -r -- "$1"
179da2e3ebdSchinEOF
18034f9b3eeSRoland Mainzchmod +x $tmp/script
18134f9b3eeSRoland Mainzif	[[ $( $SHELL $tmp/script arg1 arg2) != arg2 ]]
182da2e3ebdSchinthen	err_exit 'arguments not restored by posix functions'
183da2e3ebdSchinfi
184da2e3ebdSchinfunction foo
185da2e3ebdSchin{
186da2e3ebdSchin	print hello
187da2e3ebdSchin}
188da2e3ebdSchin(
189da2e3ebdSchin	function foo
190da2e3ebdSchin	{
191da2e3ebdSchin		print bar
192da2e3ebdSchin	}
193da2e3ebdSchin	if [[ $(foo) != bar ]]
194da2e3ebdSchin	then	err_exit 'function definitions inside subshells not working'
195da2e3ebdSchin	fi
196da2e3ebdSchin)
197da2e3ebdSchinif [[ $(foo) != hello ]]
198da2e3ebdSchinthen	err_exit 'function definitions inside subshells not restored'
199da2e3ebdSchinfi
200da2e3ebdSchinunset -f foo bar
201da2e3ebdSchinfunction bar
202da2e3ebdSchin{
203da2e3ebdSchin        print "$y"
204da2e3ebdSchin}
205da2e3ebdSchin
206da2e3ebdSchinfunction foo
207da2e3ebdSchin{
208da2e3ebdSchin        typeset x=3
209da2e3ebdSchin        y=$x bar
210da2e3ebdSchin}
211da2e3ebdSchinx=1
212da2e3ebdSchinif	[[ $(foo) != 3 ]]
213da2e3ebdSchinthen	err_exit 'variable assignment list not using parent scope'
214da2e3ebdSchinfi
21534f9b3eeSRoland Mainzunset -f foobar
21634f9b3eeSRoland Mainzcat > $tmp/foobar <<!
21734f9b3eeSRoland Mainzfunction foobar
218da2e3ebdSchin{
219da2e3ebdSchin	print foo
220da2e3ebdSchin}
221da2e3ebdSchin!
22234f9b3eeSRoland Mainzchmod +x $tmp/foobar
2237c2fbfb3SApril ChinFPATH=$tmp
22434f9b3eeSRoland Mainzautoload foobar
22534f9b3eeSRoland Mainzif	[[ $(foobar 2>/dev/null) != foo ]]
226da2e3ebdSchinthen	err_exit 'autoload not working'
227da2e3ebdSchinfi
228da2e3ebdSchinunset -f foobar
229da2e3ebdSchinfunction foobar
230da2e3ebdSchin{
231da2e3ebdSchin	typeset -r x=3
232da2e3ebdSchin	return 0
233da2e3ebdSchin}
234da2e3ebdSchin( foobar ) 2> /dev/null || err_exit "cannot unset readonly variable in function"
23534f9b3eeSRoland Mainzif	$SHELL -n 2> /dev/null <<-!
236da2e3ebdSchin	abc()
237da2e3ebdSchin	!
238da2e3ebdSchinthen	err_exit 'abc() without a function body is not a syntax error'
239da2e3ebdSchinfi
240da2e3ebdSchinfunction winpath
241da2e3ebdSchin{
24234f9b3eeSRoland Mainz	usage='q pathname ...'
243da2e3ebdSchin	typeset var format=s
244da2e3ebdSchin	while   getopts  "$usage" var
245da2e3ebdSchin	do      case $var in
246da2e3ebdSchin		q)      format=q;;
247da2e3ebdSchin	        esac
248da2e3ebdSchin	done
249da2e3ebdSchin	print done
250da2e3ebdSchin}
251da2e3ebdSchinif	[[ $( (winpath --man 2>/dev/null); print ok) != ok ]]
252da2e3ebdSchinthen	err_exit 'getopts --man in functions not working'
253da2e3ebdSchinfi
254da2e3ebdSchinif	[[ $( (winpath -z 2>/dev/null); print ok) != ok ]]
255da2e3ebdSchinthen	err_exit 'getopts with bad option in functions not working'
256da2e3ebdSchinfi
257da2e3ebdSchinunset -f x
258da2e3ebdSchinfunction x
259da2e3ebdSchin{
260da2e3ebdSchin        print "$@"
261da2e3ebdSchin}
262da2e3ebdSchintypeset -ft x
263da2e3ebdSchinif      [[ $(x x=y 2>/dev/null) != x=y ]]
264da2e3ebdSchinthen    err_exit 'name=value pair args not passed to traced functions'
265da2e3ebdSchinfi
266da2e3ebdSchinfunction bad
267da2e3ebdSchin{
268da2e3ebdSchin	false
269da2e3ebdSchin}
270da2e3ebdSchintrap 'val=false' ERR
271da2e3ebdSchinval=true
272da2e3ebdSchinbad
273da2e3ebdSchinif	[[ $val != false ]]
274da2e3ebdSchinthen	err_exit 'set -e not working for functions'
275da2e3ebdSchinfi
276da2e3ebdSchinfunction bad
277da2e3ebdSchin{
278da2e3ebdSchin	false
279da2e3ebdSchin	return 0
280da2e3ebdSchin}
281da2e3ebdSchinval=true
282da2e3ebdSchinbad
283da2e3ebdSchinif	[[ $val != true ]]
284da2e3ebdSchinthen	err_exit 'set -e not disabled for functions'
285da2e3ebdSchinfi
286da2e3ebdSchinbad()
287da2e3ebdSchin{
288da2e3ebdSchin	false
289da2e3ebdSchin	return 0
290da2e3ebdSchin}
291da2e3ebdSchinval=true
292da2e3ebdSchinbad
293da2e3ebdSchinif	[[ $val != false ]]
294da2e3ebdSchinthen	err_exit 'set -e not inherited for posix functions'
295da2e3ebdSchinfi
2967c2fbfb3SApril Chintrap - ERR
2977c2fbfb3SApril Chin
29834f9b3eeSRoland Mainzfunction myexport
299da2e3ebdSchin{
300da2e3ebdSchin	nameref var=$1
301da2e3ebdSchin	if	(( $# > 1 ))
302da2e3ebdSchin	then	export	$1=$2
303da2e3ebdSchin	fi
304da2e3ebdSchin	if	(( $# > 2 ))
305da2e3ebdSchin	then	print $(myexport "$1" "$3" )
306da2e3ebdSchin		return
307da2e3ebdSchin	fi
308da2e3ebdSchin	typeset val
309da2e3ebdSchin	val=$(export | grep "^$1=")
310da2e3ebdSchin	print ${val#"$1="}
311da2e3ebdSchin}
312da2e3ebdSchinexport dgk=base
3137c2fbfb3SApril Chinval=$(myexport dgk fun)
3147c2fbfb3SApril Chinif	[[ $val != fun ]]
3157c2fbfb3SApril Chinthen	err_exit "export inside function not working -- expected 'fun', got '$val'"
316da2e3ebdSchinfi
3177c2fbfb3SApril Chinval=$(export | sed -e '/^dgk=/!d' -e 's/^dgk=//')
3187c2fbfb3SApril Chinif	[[ $val != base ]]
3197c2fbfb3SApril Chinthen	err_exit "export not restored after function call -- expected 'base', got '$val'"
320da2e3ebdSchinfi
3217c2fbfb3SApril Chinval=$(myexport dgk fun fun2)
3227c2fbfb3SApril Chinif	[[ $val != fun2 ]]
3237c2fbfb3SApril Chinthen	err_exit "export inside function not working with recursive function -- expected 'fun2', got '$val'"
324da2e3ebdSchinfi
3257c2fbfb3SApril Chinval=$(export | sed -e '/^dgk=/!d' -e 's/^dgk=//')
3267c2fbfb3SApril Chinif	[[ $val != base ]]
3277c2fbfb3SApril Chinthen	err_exit "export not restored after recursive function call -- expected 'base', got '$val'"
328da2e3ebdSchinfi
3297c2fbfb3SApril Chinval=$(dgk=try3 myexport dgk)
3307c2fbfb3SApril Chinif	[[ $val != try3 ]]
3317c2fbfb3SApril Chinthen	err_exit "name=value not added to export list with function call -- expected 'try3', got '$val'"
332da2e3ebdSchinfi
3337c2fbfb3SApril Chinval=$(export | sed -e '/^dgk=/!d' -e 's/^dgk=//')
3347c2fbfb3SApril Chinif	[[ $val != base ]]
3357c2fbfb3SApril Chinthen	err_exit "export not restored name=value function call -- expected 'base', got '$val'"
336da2e3ebdSchinfi
337da2e3ebdSchinunset zzz
3387c2fbfb3SApril Chinval=$(myexport zzz fun)
3397c2fbfb3SApril Chinif	[[ $val != fun ]]
3407c2fbfb3SApril Chinthen	err_exit "export inside function not working -- expected 'fun', got '$val'"
341da2e3ebdSchinfi
3427c2fbfb3SApril Chinval=$(export | sed -e '/^zzz=/!d' -e 's/^zzz=//')
3437c2fbfb3SApril Chinif	[[ $val ]]
3447c2fbfb3SApril Chinthen	err_exit "unset varaible exported after function call -- expected '', got '$val'"
345da2e3ebdSchinfi
3467c2fbfb3SApril Chin
347da2e3ebdSchinunset zzz
348da2e3ebdSchintypeset -u zzz
349da2e3ebdSchinfunction foo
350da2e3ebdSchin{
351da2e3ebdSchin	zzz=abc
352da2e3ebdSchin	print $zzz
353da2e3ebdSchin}
354da2e3ebdSchinif	[[ $(foo)$(foo) != ABCABC ]]
355da2e3ebdSchinthen	err_exit 'attributes on unset variables not saved/restored'
356da2e3ebdSchinfi
357da2e3ebdSchinfunction xpd {
358da2e3ebdSchin	typeset i j=$1
359da2e3ebdSchin                for i
360da2e3ebdSchin                        do print i=$i j=$j
361da2e3ebdSchin                        [[ $i == a ]] && xpd b
362da2e3ebdSchin                        done
363da2e3ebdSchin                }
364da2e3ebdSchinif	[[ $(xpd a c) != $'i=a j=a\ni=b j=b\ni=c j=a' ]]
365da2e3ebdSchinthen	err_exit 'for loop function optimization error'
366da2e3ebdSchinfi
367da2e3ebdSchin
368da2e3ebdSchintypeset -A visited
369da2e3ebdSchininteger level=0
370da2e3ebdSchinfunction closure
371da2e3ebdSchin{
372da2e3ebdSchin	(( $# > 5 )) && return 1
373da2e3ebdSchin	((level < 2)) && ((level++))
374da2e3ebdSchin	typeset tmp r=0
375da2e3ebdSchin	visited[$1]=1
376da2e3ebdSchin
377da2e3ebdSchin	for tmp in $level _$level
378da2e3ebdSchin	do
379da2e3ebdSchin		[[ ${visited[$tmp]} == 1 ]] && continue
380da2e3ebdSchin		closure $tmp $* || r=1
381da2e3ebdSchin	done
382da2e3ebdSchin	return $r
383da2e3ebdSchin}
384da2e3ebdSchinclosure 0 || err_exit -u2 'for loop function optimization bug2'
38534f9b3eeSRoland Mainzdir=$tmp/dir
38634f9b3eeSRoland Mainzmkdir $dir
38734f9b3eeSRoland Mainzcd $dir || { err_exit "cd $dir failed"; exit 1; }
38834f9b3eeSRoland Mainz
38934f9b3eeSRoland Mainz(
39034f9b3eeSRoland Mainz	function a {
39134f9b3eeSRoland Mainz		print a
39234f9b3eeSRoland Mainz	}
39334f9b3eeSRoland Mainz	function b {
39434f9b3eeSRoland Mainz		print 1
39534f9b3eeSRoland Mainz		a
39634f9b3eeSRoland Mainz		print 2
39734f9b3eeSRoland Mainz	} > /dev/null
39834f9b3eeSRoland Mainz	typeset -ft a b
39934f9b3eeSRoland Mainz	PS4=X
40034f9b3eeSRoland Mainz	b
40134f9b3eeSRoland Mainz) > file 2>&1
40234f9b3eeSRoland Mainz[[ $(<file) == *'Xprint 2'* ]] ||  err_exit 'function trace disabled by function call'
40334f9b3eeSRoland Mainzrm -f file
40434f9b3eeSRoland Mainz
405da2e3ebdSchinprint 'false' > try
406da2e3ebdSchinchmod +x try
407da2e3ebdSchincat > tst <<- EOF
408da2e3ebdSchin	function ignore
409da2e3ebdSchin	{
410da2e3ebdSchin		./try
411da2e3ebdSchin		return 0
412da2e3ebdSchin	}
413da2e3ebdSchin	trap "print error; exit 1" ERR
414da2e3ebdSchin	ignore
415da2e3ebdSchinEOF
416da2e3ebdSchinif	[[ $($SHELL < tst)  == error ]]
417da2e3ebdSchinthen	err_exit 'ERR trap not cleared'
418da2e3ebdSchinfi
41934f9b3eeSRoland MainzFPATH=$dir
42034f9b3eeSRoland Mainzprint ': This does nothing' > foobar
42134f9b3eeSRoland Mainzchmod +x foobar
42234f9b3eeSRoland Mainzunset -f foobar
42334f9b3eeSRoland Mainz{ foobar; } 2>/dev/null
42434f9b3eeSRoland Mainzgot=$?
42534f9b3eeSRoland Mainzexp=126
42634f9b3eeSRoland Mainzif	[[ $got != $exp ]]
42734f9b3eeSRoland Mainzthen	err_exit "function file without function definition processes wrong error -- expected '$exp', got '$got'"
428da2e3ebdSchinfi
42934f9b3eeSRoland Mainzprint 'set a b c' > dotscript
430da2e3ebdSchin[[ $(PATH=$PATH: $SHELL -c '. dotscript;print $#') == 3 ]] || err_exit 'positional parameters not preserved with . script without arguments'
431da2e3ebdSchincd ~- || err_exit "cd back failed"
432da2e3ebdSchinfunction errcheck
433da2e3ebdSchin{
434da2e3ebdSchin	trap 'print ERR; return 1' ERR
435da2e3ebdSchin	false
436da2e3ebdSchin	print ok
437da2e3ebdSchin}
438da2e3ebdSchinerr=$(errcheck)
439da2e3ebdSchin[[ $err == ERR ]] || err_exit 'trap on ERR not working in a function'
440da2e3ebdSchinx="$(
441da2e3ebdSchin	function foobar
442da2e3ebdSchin	{
443da2e3ebdSchin		print ok
444da2e3ebdSchin	}
445da2e3ebdSchin	typeset -f foobar
446da2e3ebdSchin)"
447da2e3ebdSchineval "$x"  || err_exit 'typeset -f generates syntax error'
448da2e3ebdSchin[[ $(foobar) != ok ]] && err_exit 'typeset -f not generating function'
449da2e3ebdSchinunset -f a b c
450da2e3ebdSchina()
451da2e3ebdSchin{
452da2e3ebdSchin        b
453da2e3ebdSchin        b
454da2e3ebdSchin        print ${.sh.fun}
455da2e3ebdSchin}
456da2e3ebdSchinb() { : ;}
457da2e3ebdSchin[[ $(a) == a ]] || err_exit '.sh.fun not set correctly in a function'
458da2e3ebdSchinprint $'a(){\ndate\n}'  | $SHELL 2> /dev/null || err_exit 'parser error in a(){;date;}'
45934f9b3eeSRoland Mainzcat > $tmp/data1 << '++EOF'
460da2e3ebdSchin     1  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
461da2e3ebdSchin     2  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
462da2e3ebdSchin     3  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
463da2e3ebdSchin     4  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
464da2e3ebdSchin     5  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
465da2e3ebdSchin     6  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
466da2e3ebdSchin     7  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
467da2e3ebdSchin     8  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
468da2e3ebdSchin     9  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
469da2e3ebdSchin    10  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
470da2e3ebdSchin    11  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
471da2e3ebdSchin    12  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
472da2e3ebdSchin    13  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
473da2e3ebdSchin    14  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
474da2e3ebdSchin    15  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
475da2e3ebdSchin    16  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
476da2e3ebdSchin    17  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
477da2e3ebdSchin    18  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
478da2e3ebdSchin    19  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
479da2e3ebdSchin    20  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
480da2e3ebdSchin++EOF
48134f9b3eeSRoland Mainzcat > $tmp/script << '++EOF'
482da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
483da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
484da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
485da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
486da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
487da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
488da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
489da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
490da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
491da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
492da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
493da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
494da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
495da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
496da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
497da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
498da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
499da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
500da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
501da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
502da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
503da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
504da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
505da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
506da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
507da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
508da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
509da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
510da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
511da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
512da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
513da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
514da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
515da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
516da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
517da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
518da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
519da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
520da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
521da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
522da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
523da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
524da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
525da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
526da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
527da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
528da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
529da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
530da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
531da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
532da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
533da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
534da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
535da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
536da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
537da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
538da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
539da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
540da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
541da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
542da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
543da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
544da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
545da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
546da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
547da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
548da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
549da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
550da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
551da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
552da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
553da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
554da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
555da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
556da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
557da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
558da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
559da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
560da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
561da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
562da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
563da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
564da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
565da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
566da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
567da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
568da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
569da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
570da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
571da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
572da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
573da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
574da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
575da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
576da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
577da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
578da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
579da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
580da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
581da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
582da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
583da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
584da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
585da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
586da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
587da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
588da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
589da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
590da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
591da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
592da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
593da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
594da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
595da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
596da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
597da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
598da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
599da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
600da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
601da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
602da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
603da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
604da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
605da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
606da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
607da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
608da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
609da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
610da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
611da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
612da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
613da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
614da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
615da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
616da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
617da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
618da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
619da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
620da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
621da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
622da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
623da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
624da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
625da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
626da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
627da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
628da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
629da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
630da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
631da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
632da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
633da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
634da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
635da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
636da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
637da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
638da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
639da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
640da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
641da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
642da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
643da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
644da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
645da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
646da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
647da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
648da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
649da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
650da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
651da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
652da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
653da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
654da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
655da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
656da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
657da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
658da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
659da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
660da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
661da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
662da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
663da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
664da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
665da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
666da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
667da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
668da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
669da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
670da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
671da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
672da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
673da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
674da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
675da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
676da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
677da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
678da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
679da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
680da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
681da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
682da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
683da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
684da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
685da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
686da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
687da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
688da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
689da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
690da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
691da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
692da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
693da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
694da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
695da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
696da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
697da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
698da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
699da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
700da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
701da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
702da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
703da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
704da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
705da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
706da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
707da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
708da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
709da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
710da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
711da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
712da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
713da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
714da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
715da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
716da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
717da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
718da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
719da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
720da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
721da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
722da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
723da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
724da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
725da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
726da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
727da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
728da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
729da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
730da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
731da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
732da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
733da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
734da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
735da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
736da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
737da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
738da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
739da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
740da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
741da2e3ebdSchin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
742da2e3ebdSchin
743da2e3ebdSchinf()
744da2e3ebdSchin{
745da2e3ebdSchincat <<\M
746da2e3ebdSchin++EOF
74734f9b3eeSRoland Mainzcat $tmp/data1 >> $tmp/script
74834f9b3eeSRoland Mainzprintf 'M\n}\n\nf\n\n' >> $tmp/script
74934f9b3eeSRoland Mainz$SHELL -c $tmp/script  > $tmp/data2
75034f9b3eeSRoland Mainzcmp -s $tmp/data[12] || err_exit 'error with long functions'
751da2e3ebdSchinv=1
752da2e3ebdSchinfunction f
753da2e3ebdSchin{
754da2e3ebdSchin	typeset i
755da2e3ebdSchin	for i in 0 1
756da2e3ebdSchin	do	typeset v
757da2e3ebdSchin		v=$i
758da2e3ebdSchin		[[ $v == $i ]] || return 1
759da2e3ebdSchin	done
760da2e3ebdSchin}
761da2e3ebdSchinf || err_exit "typeset optimization bug"
762da2e3ebdSchinfunction f
763da2e3ebdSchin{
764da2e3ebdSchin	print -r -- "$foo$bar"
765da2e3ebdSchin}
766da2e3ebdSchinfunction g
767da2e3ebdSchin{
768da2e3ebdSchin	print -r -- $(bar=bam f)
769da2e3ebdSchin}
770da2e3ebdSchinunset foo bar
771da2e3ebdSchin[[ $(foo=hello g) == hellobam ]] || err_exit 'function exports not passed on'
772da2e3ebdSchin[[ $(bar=hello g) == bam ]] || err_exit 'function exports not overridden'
773da2e3ebdSchinunset -f foo
774da2e3ebdSchinfunction foo
775da2e3ebdSchin{
776da2e3ebdSchin	typeset line=$1
777da2e3ebdSchin	set +n
778da2e3ebdSchin	while	[[ $line ]]
779da2e3ebdSchin	do	if	[[ ! $varname ]]
780da2e3ebdSchin		then	varname=${line%% *}
781da2e3ebdSchin			line=${line##"$varname"?( )}
782da2e3ebdSchin			[[ $line ]] && continue
783da2e3ebdSchin		else	print ok
784da2e3ebdSchin			return
785da2e3ebdSchin		fi
786da2e3ebdSchin		varname=
787da2e3ebdSchin	done
788da2e3ebdSchin}
789da2e3ebdSchin[[ $(foo 'NUMBERED RECORDSIZE') == ok ]] || err_exit 'optimization error with undefined variable'
7907c2fbfb3SApril Chinunset x
7917c2fbfb3SApril Chinx=$(
7927c2fbfb3SApril Chin	set -e
7937c2fbfb3SApril Chin	integer count=0
7947c2fbfb3SApril Chin	function err_f
7957c2fbfb3SApril Chin	{
79634f9b3eeSRoland Mainz		if	((count++==3))
7977c2fbfb3SApril Chin		then	print failed
7987c2fbfb3SApril Chin		else	false
7997c2fbfb3SApril Chin		fi
8007c2fbfb3SApril Chin	}
8017c2fbfb3SApril Chin	trap 'err_f' ERR
8027c2fbfb3SApril Chin	false
8037c2fbfb3SApril Chin)
8047c2fbfb3SApril Chin[[ $x == failed ]] && err_exit 'ERR trap executed multiple times'
8057c2fbfb3SApril Chinexport environment
8067c2fbfb3SApril Chintypeset global
8077c2fbfb3SApril Chinfunction f
8087c2fbfb3SApril Chin{
8097c2fbfb3SApril Chin	typeset i t local
8107c2fbfb3SApril Chin
8117c2fbfb3SApril Chin	for i
8127c2fbfb3SApril Chin	do	case $i in
8137c2fbfb3SApril Chin		[-+]*)	set "$@"
8147c2fbfb3SApril Chin			continue
8157c2fbfb3SApril Chin			;;
8167c2fbfb3SApril Chin		local)	local=f
8177c2fbfb3SApril Chin			t=$(typeset +f $local)
8187c2fbfb3SApril Chin			;;
8197c2fbfb3SApril Chin		global)	global=f
8207c2fbfb3SApril Chin			t=$(typeset +f $global)
8217c2fbfb3SApril Chin			;;
8227c2fbfb3SApril Chin		environment)
8237c2fbfb3SApril Chin			environment=f
8247c2fbfb3SApril Chin			t=$(typeset +f $environment)
8257c2fbfb3SApril Chin			;;
8267c2fbfb3SApril Chin		literal)t=$(typeset +f f)
8277c2fbfb3SApril Chin			;;
8287c2fbfb3SApril Chin		positional)
8297c2fbfb3SApril Chin			set -- f
8307c2fbfb3SApril Chin			t=$(typeset +f $1)
8317c2fbfb3SApril Chin			;;
8327c2fbfb3SApril Chin		esac
8337c2fbfb3SApril Chin		[[ $t ]] || err_exit "typeset +f \$$i failed"
8347c2fbfb3SApril Chin	done
8357c2fbfb3SApril Chin}
8367c2fbfb3SApril Chinf local global environment literal positional
8377c2fbfb3SApril Chin$SHELL -c '
83834f9b3eeSRoland Mainz	print exit 0 > '$tmp'/script
83934f9b3eeSRoland Mainz	chmod +x '$tmp'/script
8407c2fbfb3SApril Chin	unset var
8417c2fbfb3SApril Chin	var=( ident=1 )
8427c2fbfb3SApril Chin	function fun
8437c2fbfb3SApril Chin	{
84434f9b3eeSRoland Mainz		PATH='$tmp' script
8457c2fbfb3SApril Chin	}
8467c2fbfb3SApril Chin	fun
8477c2fbfb3SApril Chin' || err_exit "compound variable cleanup before script exec failed"
84834f9b3eeSRoland Mainz( $SHELL << \++EOF++
8497c2fbfb3SApril Chinfunction main
8507c2fbfb3SApril Chin{
8517c2fbfb3SApril Chin 	typeset key
8527c2fbfb3SApril Chin 	typeset -A entry
8537c2fbfb3SApril Chin 	entry[a]=( value=aaa )
8547c2fbfb3SApril Chin}
8557c2fbfb3SApril Chinmain
8567c2fbfb3SApril Chin++EOF++
8577c2fbfb3SApril Chin) 2> /dev/null || err_exit 'function main fails'
8587c2fbfb3SApril Chinoptind=$OPTIND
8597c2fbfb3SApril Chinsub()
8607c2fbfb3SApril Chin{
8617c2fbfb3SApril Chin        (
8627c2fbfb3SApril Chin                OPTIND=1
8637c2fbfb3SApril Chin                while getopts :abc OPTION "$@"
8647c2fbfb3SApril Chin                do      print OPTIND=$OPTIND
8657c2fbfb3SApril Chin                done
8667c2fbfb3SApril Chin        )
8677c2fbfb3SApril Chin}
8687c2fbfb3SApril Chin[[ $(sub -a) == OPTIND=2 ]] || err_exit 'OPTIND should be 2'
8697c2fbfb3SApril Chin[[ $(sub -a) == OPTIND=2 ]] || err_exit 'OPTIND should be 2 again'
8707c2fbfb3SApril Chin[[ $OPTIND == "$optind" ]] || err_exit 'OPTIND should be 1'
8717c2fbfb3SApril Chin
8727c2fbfb3SApril Chinfunction bar
8737c2fbfb3SApril Chin{
8747c2fbfb3SApril Chin	[[ -o nounset ]] && err_exit  'nounset option should not be inherited'
8757c2fbfb3SApril Chin}
8767c2fbfb3SApril Chinfunction foo
8777c2fbfb3SApril Chin{
8787c2fbfb3SApril Chin	set -o nounset
8797c2fbfb3SApril Chin	bar
8807c2fbfb3SApril Chin}
8817c2fbfb3SApril Chinset +o nounset
8827c2fbfb3SApril Chinfoo
8837c2fbfb3SApril Chinfunction red
8847c2fbfb3SApril Chin{
8857c2fbfb3SApril Chin	integer -S d=0
8867c2fbfb3SApril Chin	printf 'red_one %d\n' d
8877c2fbfb3SApril Chin	(( d++ ))
8887c2fbfb3SApril Chin	return 0
8897c2fbfb3SApril Chin}
8907c2fbfb3SApril Chin[[ ${ red } != 'red_one 0' ]] && err_exit 'expected red_one 0'
8917c2fbfb3SApril Chin[[ ${ red } != 'red_one 1' ]] && err_exit 'expected red_one 1'
8927c2fbfb3SApril Chinxyz=$0
8937c2fbfb3SApril Chinfunction traceback
8947c2fbfb3SApril Chin{
8957c2fbfb3SApril Chin	integer .level=.sh.level
8967c2fbfb3SApril Chin	while((--.level>=0))
8977c2fbfb3SApril Chin	do
8987c2fbfb3SApril Chin		((.sh.level = .level))
8997c2fbfb3SApril Chin		[[ $xyz == "$0" ]] || err_exit "\$xyz=$xyz does not match $0 on level ${.level}"
9007c2fbfb3SApril Chin		[[ ${.sh.lineno} == "$1" ]] || err_exit "\${.sh.lineno}=${.sh.lineno} does not match $1 on level ${.level}"
9017c2fbfb3SApril Chin	done
9027c2fbfb3SApril Chin}
9037c2fbfb3SApril Chin
9047c2fbfb3SApril Chinfunction foo
9057c2fbfb3SApril Chin{
9067c2fbfb3SApril Chin	typeset xyz=foo
9077c2fbfb3SApril Chin	set -- $((LINENO+1))
9087c2fbfb3SApril Chin	bar $LINENO "$1"
9097c2fbfb3SApril Chin}
9107c2fbfb3SApril Chin
9117c2fbfb3SApril Chinfunction bar
9127c2fbfb3SApril Chin{
9137c2fbfb3SApril Chin    	typeset xyz=bar
9147c2fbfb3SApril Chin	set -- $((LINENO+2))
9157c2fbfb3SApril Chin	trap 'traceback $LINENO' DEBUG
9167c2fbfb3SApril Chin	: $LINENO "$1"
9177c2fbfb3SApril Chin}
9187c2fbfb3SApril Chin
9197c2fbfb3SApril Chinset -- $((LINENO+1))
9207c2fbfb3SApril Chinfoo $LINENO
9217c2fbfb3SApril Chinfunction .sh.fun.set
9227c2fbfb3SApril Chin{
9237c2fbfb3SApril Chin	print -r -- "${.sh.value}"
9247c2fbfb3SApril Chin}
9257c2fbfb3SApril Chinfunction abc
9267c2fbfb3SApril Chin{
9277c2fbfb3SApril Chin	:
9287c2fbfb3SApril Chin}
9297c2fbfb3SApril Chindef()
9307c2fbfb3SApril Chin{
9317c2fbfb3SApril Chin	:
9327c2fbfb3SApril Chin}
9337c2fbfb3SApril Chin[[ $(abc) == abc ]] || err_exit '.sh.fun.set not capturing function name'
9347c2fbfb3SApril Chin[[ $(def) == def ]] || err_exit '.sh.fun.set not capturing name()'
9357c2fbfb3SApril Chinunset -f .sh.fun.set
9367c2fbfb3SApril Chin
9377c2fbfb3SApril Chin# tests for debug functions
9387c2fbfb3SApril Chinbasefile=${.sh.file}
9397c2fbfb3SApril Chininteger baseline
94034f9b3eeSRoland Mainzcat > $tmp/debug << \+++
9417c2fbfb3SApril Chin	: line 1
9427c2fbfb3SApril Chin
9437c2fbfb3SApril Chin	: line 3
9447c2fbfb3SApril Chin+++
9457c2fbfb3SApril Chin# Print one line in a call stack
9467c2fbfb3SApril Chinfunction _Dbg_print_frame
9477c2fbfb3SApril Chin{
9487c2fbfb3SApril Chin	typeset -i pos=$1
9497c2fbfb3SApril Chin	typeset fn=$2
9507c2fbfb3SApril Chin	typeset filename="$3"
9517c2fbfb3SApril Chin	typeset -i line=$4
9527c2fbfb3SApril Chin	typeset  arg=$5
9537c2fbfb3SApril Chin	shift 5
9547c2fbfb3SApril Chin	if	((pos==0))
9557c2fbfb3SApril Chin	then	[[ $filename == "$basefile" ]] || err_exit "filename for level 0 is $filename not $basename"
9567c2fbfb3SApril Chin		[[ $arg == DEBUG  ]] && ((baseline++))
9577c2fbfb3SApril Chin		[[ $line == "$baseline" ]] || err_exit "line number for level 0 is $line not $baseline"
9587c2fbfb3SApril Chin	elif	((pos==1))
95934f9b3eeSRoland Mainz	then	[[ $filename == "$tmp/debug" ]] ||  err_exit "filename for level 1 is $filename not $tmp/debug"
9607c2fbfb3SApril Chin		[[ $* == 'foo bar' ]] || err_exit "args are '$*', not 'foo bar'"
9617c2fbfb3SApril Chin		[[ $line == $arg ]] || err_exit "line number for level 1 is $line not $arg"
9627c2fbfb3SApril Chin	else	err_exit "level should be 0 or 1 but is $pos"
9637c2fbfb3SApril Chin	fi
9647c2fbfb3SApril Chin}
9657c2fbfb3SApril Chin
9667c2fbfb3SApril Chinfunction _Dbg_debug_trap_handler
9677c2fbfb3SApril Chin{
9687c2fbfb3SApril Chin
9697c2fbfb3SApril Chin	integer .level=.sh.level .max=.sh.level-1
9707c2fbfb3SApril Chin	while((--.level>=0))
9717c2fbfb3SApril Chin	do
9727c2fbfb3SApril Chin		((.sh.level = .level))
9737c2fbfb3SApril Chin      		_Dbg_print_frame  "${.level}" "$0" "${.sh.file}" "${.sh.lineno}" "${.sh.command##* }" "$@"
9747c2fbfb3SApril Chin	done
9757c2fbfb3SApril Chin}
9767c2fbfb3SApril Chin
9777c2fbfb3SApril Chin((baseline=LINENO+2))
9787c2fbfb3SApril Chintrap '_Dbg_debug_trap_handler' DEBUG
97934f9b3eeSRoland Mainz.  $tmp/debug foo bar
9807c2fbfb3SApril Chintrap '' DEBUG
98134f9b3eeSRoland Mainz
9827c2fbfb3SApril Chincaller() {
9837c2fbfb3SApril Chin  integer .level=.sh.level .max=.sh.level-1
9847c2fbfb3SApril Chin  while((--.level>=0))
9857c2fbfb3SApril Chin  do
9867c2fbfb3SApril Chin      ((.sh.level = .level))
9877c2fbfb3SApril Chin      print -r -- "${.sh.lineno}"
9887c2fbfb3SApril Chin  done
9897c2fbfb3SApril Chin}
9907c2fbfb3SApril Chinbar() { caller;}
9917c2fbfb3SApril Chinset -- $(bar)
9927c2fbfb3SApril Chin[[ $1 == $2 ]] && err_exit ".sh.inline optimization bug"
9937c2fbfb3SApril Chin( $SHELL  -c ' function foo { typeset x=$1;print $1;};z=();z=($(foo bar)) ') 2> /dev/null ||  err_exit 'using a function to set an array in a command sub  fails'
99434f9b3eeSRoland Mainz
99534f9b3eeSRoland Mainz{
99634f9b3eeSRoland Mainzgot=$(
99734f9b3eeSRoland Mainzs=$(ulimit -s)
99834f9b3eeSRoland Mainzif	[[ $s == +([[:digit:]]) ]] && (( s < 16384 ))
99934f9b3eeSRoland Mainzthen	ulimit -s 16384 2>/dev/null
100034f9b3eeSRoland Mainzfi
100134f9b3eeSRoland Mainz$SHELL << \+++
100234f9b3eeSRoland Mainzf()
100334f9b3eeSRoland Mainz{
100434f9b3eeSRoland Mainz	if	(($1>1))
100534f9b3eeSRoland Mainz	then	x=$(f $(($1-1))) || exit 1
100634f9b3eeSRoland Mainz	fi
100734f9b3eeSRoland Mainz	return 0
100834f9b3eeSRoland Mainz}
100934f9b3eeSRoland Mainzf 257 && print ok
101034f9b3eeSRoland Mainz+++
101134f9b3eeSRoland Mainz)
101234f9b3eeSRoland Mainz} 2>/dev/null
101334f9b3eeSRoland Mainz[[ $got == ok ]] || err_exit 'cannot handle comsub depth > 256 in function'
101434f9b3eeSRoland Mainz
101534f9b3eeSRoland Mainztmp1=$tmp/job.1
101634f9b3eeSRoland Mainztmp2=$tmp/job.2
101734f9b3eeSRoland Mainzcat > $tmp1 << +++
101834f9b3eeSRoland Mainz#! $SHELL
101934f9b3eeSRoland Mainzprint \$\$
102034f9b3eeSRoland Mainz+++
102134f9b3eeSRoland Mainzchmod +x $tmp1
102234f9b3eeSRoland Mainzfunction foo
102334f9b3eeSRoland Mainz{
102434f9b3eeSRoland Mainz	typeset pid
102534f9b3eeSRoland Mainz	$tmp1 > $tmp2 & pid=$!
102634f9b3eeSRoland Mainz	wait $!
102734f9b3eeSRoland Mainz	[[ $(< $tmp2) == $pid ]] || err_exit 'wrong pid for & job in function'
102834f9b3eeSRoland Mainz}
102934f9b3eeSRoland Mainzfoo
103034f9b3eeSRoland Mainz# make sure compiled functions work
103134f9b3eeSRoland Mainz[[ $(tmp=$tmp $SHELL <<- \++++
103234f9b3eeSRoland Mainz	cat > $tmp/functions <<- \EOF
103334f9b3eeSRoland Mainz	 	function bar
103434f9b3eeSRoland Mainz	 	{
103534f9b3eeSRoland Mainz	 		print foo
103634f9b3eeSRoland Mainz	 	}
103734f9b3eeSRoland Mainz	 	function foobar
103834f9b3eeSRoland Mainz	 	{
103934f9b3eeSRoland Mainz	 		bar
104034f9b3eeSRoland Mainz	 	}
104134f9b3eeSRoland Mainz	EOF
104234f9b3eeSRoland Mainz	${SHCOMP:-${SHELL%/*}/shcomp} $tmp/functions > $tmp/foobar
104334f9b3eeSRoland Mainz	rm -f "$tmp/functions"
104434f9b3eeSRoland Mainz	chmod +x $tmp/foobar
104534f9b3eeSRoland Mainz	rm $tmp/!(dir|foobar)
104634f9b3eeSRoland Mainz	FPATH=$tmp
104734f9b3eeSRoland Mainz	PATH=$FPATH:$PATH
104834f9b3eeSRoland Mainz	foobar
104934f9b3eeSRoland Mainz++++
105034f9b3eeSRoland Mainz) == foo ]] > /dev/null  || err_exit 'functions compiled with shcomp not working'
1051*b30d1939SAndy Fiddaman# tests for compiled . scripts
1052*b30d1939SAndy Fiddamanprint $'print hello\nprint world' > $tmp/foo
1053*b30d1939SAndy Fiddaman${SHCOMP:-${SHELL%/*}/shcomp} $tmp/foo > $tmp/foo.sh
1054*b30d1939SAndy Fiddamanval=$(. $tmp/foo.sh)
1055*b30d1939SAndy Fiddaman[[ $val ==  $'hello\nworld' ]] || err_exit "processing compiled dot files not working correctly val=$val"
105634f9b3eeSRoland Mainz# test for functions in shell having side effects.
105734f9b3eeSRoland Mainzunset -f foo foobar bar
105834f9b3eeSRoland Mainzcd "$tmp"
105934f9b3eeSRoland MainzFPATH=$PWD
106034f9b3eeSRoland MainzPATH=$FPATH:$PATH
106134f9b3eeSRoland Mainzcat > foo <<- \EOF
106234f9b3eeSRoland Mainz	function bar
106334f9b3eeSRoland Mainz	{
106434f9b3eeSRoland Mainz		print foobar
106534f9b3eeSRoland Mainz	}
106634f9b3eeSRoland Mainz	function foo
106734f9b3eeSRoland Mainz	{
106834f9b3eeSRoland Mainz		bar
106934f9b3eeSRoland Mainz	}
107034f9b3eeSRoland MainzEOF
107134f9b3eeSRoland Mainzchmod +x foo
107234f9b3eeSRoland Mainz: $(foo)
107334f9b3eeSRoland Mainz[[ $(typeset +f) == *foo* ]] &&  err_exit 'function in subshell leaving side effect of function foo'
107434f9b3eeSRoland Mainzunset -f foo bar
107534f9b3eeSRoland Mainz:  $(foo)
107634f9b3eeSRoland Mainz[[ $(typeset +f) == *foo* ]] && err_exit 'function in subshell leaving side effects of function foo after reload'
107734f9b3eeSRoland Mainz[[ $(typeset +f) == *bar* ]] && err_exit 'function in subshell leaving side effects of function bar after reload'
107834f9b3eeSRoland Mainz
10793e14f97fSRoger A. Faulknerunset -f foo
10803e14f97fSRoger A. Faulknertypeset -A bar
10813e14f97fSRoger A. Faulknerfunction foo
10823e14f97fSRoger A. Faulkner{
10833e14f97fSRoger A. Faulkner	typeset -i bar[$1].x
10843e14f97fSRoger A. Faulkner	bar[$1].x=5
10853e14f97fSRoger A. Faulkner}
10863e14f97fSRoger A. Faulknerfoo sub
10873e14f97fSRoger A. Faulkner[[ ${!bar[@]} == sub ]] || err_exit 'scoping problem with compound array variables'
10883e14f97fSRoger A. Faulkner
10893e14f97fSRoger A. Faulknerfunction A
10903e14f97fSRoger A. Faulkner{
10913e14f97fSRoger A. Faulkner        trap "> /dev/null;print TRAP A" EXIT
10923e14f97fSRoger A. Faulkner	# (( stderr )) && print >&2
10933e14f97fSRoger A. Faulkner}
10943e14f97fSRoger A. Faulkner
10953e14f97fSRoger A. Faulknerfunction B
10963e14f97fSRoger A. Faulkner{
10973e14f97fSRoger A. Faulkner        trap "> /dev/null;print TRAP B" EXIT
10983e14f97fSRoger A. Faulkner        A
10993e14f97fSRoger A. Faulkner}
11003e14f97fSRoger A. Faulkner
11013e14f97fSRoger A. Faulknerx=$(B)
1102*b30d1939SAndy Fiddaman[[ $x == $'TRAP A\nTRAP B' ]] || err_exit "trap from functions in subshells fails got" $x
11033e14f97fSRoger A. Faulkner
1104*b30d1939SAndy Fiddamanfunction foo
1105*b30d1939SAndy Fiddaman{
1106*b30d1939SAndy Fiddaman	typeset bar=abc
1107*b30d1939SAndy Fiddaman	unset bar
1108*b30d1939SAndy Fiddaman#	[[ $bar == bam ]] || err_exit 'unsetting local variable does not expose global variable'
1109*b30d1939SAndy Fiddaman	[[ $bar ]] && err_exit 'unsetting local variable exposes global variable'
1110*b30d1939SAndy Fiddaman}
1111*b30d1939SAndy Fiddamanbar=bam
1112*b30d1939SAndy Fiddamanfoo
1113*b30d1939SAndy Fiddaman
1114*b30d1939SAndy Fiddamansleep=$(whence -p sleep)
1115*b30d1939SAndy Fiddamanfunction gosleep
1116*b30d1939SAndy Fiddaman{
1117*b30d1939SAndy Fiddaman	$sleep 4
1118*b30d1939SAndy Fiddaman}
1119*b30d1939SAndy Fiddamanx=$(
1120*b30d1939SAndy Fiddaman	(sleep 2; pid=; ps | grep sleep | read pid extra; [[ $pid ]] && kill -- $pid) &
1121*b30d1939SAndy Fiddaman	gosleep 2> /dev/null
1122*b30d1939SAndy Fiddaman	print ok
1123*b30d1939SAndy Fiddaman)
1124*b30d1939SAndy Fiddaman[[ $x == ok ]] || err_exit 'TERM signal sent to last process of function kills the script'
1125*b30d1939SAndy Fiddaman
1126*b30d1939SAndy Fiddaman# verify that $0 does not change with functions defined as fun()
1127*b30d1939SAndy Fiddamanfunc1()
1128*b30d1939SAndy Fiddaman{
1129*b30d1939SAndy Fiddaman	[[ $0 == "$dol0" ]] || err_exit "\$0 changed in func1() to $0"
1130*b30d1939SAndy Fiddaman}
1131*b30d1939SAndy Fiddamanfunction func2
1132*b30d1939SAndy Fiddaman{
1133*b30d1939SAndy Fiddaman	[[ $0 == func2 ]] || err_exit "\$0 changed in func2() to $0"
1134*b30d1939SAndy Fiddaman	dol0=func2
1135*b30d1939SAndy Fiddaman	func1
1136*b30d1939SAndy Fiddaman}
1137*b30d1939SAndy Fiddamanfunc2
1138*b30d1939SAndy Fiddaman
1139*b30d1939SAndy Fiddaman{ $SHELL <<- \EOF
1140*b30d1939SAndy Fiddaman	function foo
1141*b30d1939SAndy Fiddaman	{
1142*b30d1939SAndy Fiddaman	        typeset rc=0
1143*b30d1939SAndy Fiddaman		unset -f foo
1144*b30d1939SAndy Fiddaman		return $rc;
1145*b30d1939SAndy Fiddaman	}
1146*b30d1939SAndy Fiddaman	foo
1147*b30d1939SAndy FiddamanEOF
1148*b30d1939SAndy Fiddaman} 2> /dev/null || err_exit  'problem with unset -f  foo within function foo'
1149*b30d1939SAndy Fiddaman
1150*b30d1939SAndy Fiddamanval=$($SHELL 2> /dev/null <<- \EOF
1151*b30d1939SAndy Fiddaman	.sh.fun.set() { set -x; }
1152*b30d1939SAndy Fiddaman	function f1 { print -n ${.sh.fun}; set -o | grep xtrace;}
1153*b30d1939SAndy Fiddaman	function f2 { print -n ${.sh.fun}; set -o | grep xtrace;}
1154*b30d1939SAndy Fiddaman	f1
1155*b30d1939SAndy Fiddaman	set -o | grep xtrace
1156*b30d1939SAndy Fiddaman	f2
1157*b30d1939SAndy FiddamanEOF)
1158*b30d1939SAndy Fiddaman[[ $val == f1xtrace*on*off*f2xtrace*on* ]] || err_exit "'.sh.fun.set() { set -x; }' not tracing all functions"
1159*b30d1939SAndy Fiddaman
1160*b30d1939SAndy Fiddamanfunction foo
1161*b30d1939SAndy Fiddaman{
1162*b30d1939SAndy Fiddaman	typeset opt OPTIND=1 OPTARG hflag=
1163*b30d1939SAndy Fiddaman	while getopts hi: opt
1164*b30d1939SAndy Fiddaman	do	case $opt in
1165*b30d1939SAndy Fiddaman		h)	hflag=1;;
1166*b30d1939SAndy Fiddaman	        i)	[[ $OPTARG == foobar ]] || err_exit 'OPTARG should be set to foobar in function foo';;
1167*b30d1939SAndy Fiddaman		esac
1168*b30d1939SAndy Fiddaman	done
1169*b30d1939SAndy Fiddaman	shift $((OPTIND - 1))
1170*b30d1939SAndy Fiddaman	(( OPTIND == 4 )) || err_exit "OPTIND is $OPTIND at end of function foo; it should be 4"
1171*b30d1939SAndy Fiddaman	[[ $1 == foo2 ]] || err_exit "\$1 is $1, not foo after getopts in function"
1172*b30d1939SAndy Fiddaman}
1173*b30d1939SAndy FiddamanOPTIND=6 OPTARG=xxx
1174*b30d1939SAndy Fiddamanfoo -h -i foobar foo2
1175*b30d1939SAndy Fiddaman[[ $OPTARG == xxx ]] || err_exit 'getopts in function changes global OPTARG'
1176*b30d1939SAndy Fiddaman(( OPTIND == 6 )) || err_exit 'getopts in function changes global OPTIND'
1177*b30d1939SAndy Fiddaman
1178*b30d1939SAndy Fiddamanif	[[ ! $compiled ]]
1179*b30d1939SAndy Fiddamanthen	function foo { getopts --man; }
1180*b30d1939SAndy Fiddaman	[[ $(typeset -f foo) == 'function foo { getopts --man; }' ]] || err_exit 'typeset -f not work for function with getopts'
1181*b30d1939SAndy Fiddamanfi
1182*b30d1939SAndy Fiddaman
1183*b30d1939SAndy Fiddamanfunction foo
1184*b30d1939SAndy Fiddaman{
1185*b30d1939SAndy Fiddaman	let 1
1186*b30d1939SAndy Fiddaman	return $1
1187*b30d1939SAndy Fiddaman}
1188*b30d1939SAndy Fiddamaninvals=(135 255 256 267 -1)
1189*b30d1939SAndy Fiddamanoutvals=(135 255 0 267 255)
1190*b30d1939SAndy Fiddamanfor ((i=0; i < ${#invals[@]}; i++))
1191*b30d1939SAndy Fiddamando	foo ${invals[i]}
1192*b30d1939SAndy Fiddaman	[[ $? == "${outvals[i]}" ]] || err_exit "function exit ${invals[i]} should set \$? to ${outvals[i]}"
1193*b30d1939SAndy Fiddamandone
1194*b30d1939SAndy Fiddaman
1195*b30d1939SAndy Fiddamanfunction foo
1196*b30d1939SAndy Fiddaman{
1197*b30d1939SAndy Fiddaman	typeset pid
1198*b30d1939SAndy Fiddaman	sleep 2 & pid=$!
1199*b30d1939SAndy Fiddaman	sleep 1
1200*b30d1939SAndy Fiddaman	kill -TERM $pid
1201*b30d1939SAndy Fiddaman	wait $pid
1202*b30d1939SAndy Fiddaman	rc=$?
1203*b30d1939SAndy Fiddaman	return $rc
1204*b30d1939SAndy Fiddaman}
1205*b30d1939SAndy Fiddamanfoo  2> /dev/null
1206*b30d1939SAndy Fiddamanrc=$?
1207*b30d1939SAndy Fiddamanexp=$((256+$(kill -l TERM) ))
1208*b30d1939SAndy Fiddaman[[  $rc == "$exp" ]] || err_exit "expected exitval $exp got $rc"
1209*b30d1939SAndy Fiddaman
1210*b30d1939SAndy Fiddamanexit $((Errors<125?Errors:125))
1211