da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin########################################################################
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# This software is part of the ast package #
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# Copyright (c) 1982-2010 AT&T Intellectual Property #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# and is licensed under the #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Common Public License, Version 1.0 #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# by AT&T Intellectual Property #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# A copy of the License is available at #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# http://www.opensource.org/licenses/cpl1.0.txt #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Information and Software Systems Research #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# AT&T Research #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Florham Park NJ #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# David Korn <dgk@research.att.com> #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin########################################################################
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction err_exit
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print -u2 -n "\t"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print -u2 -r ${Command}[$1]: "${@:2}"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin let Errors+=1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinalias err_exit='err_exit $LINENO'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chininteger Errors=0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinCommand=${0##*/}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzulimit -c 0
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztrap "cd /; rm -rf $tmp" EXIT
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chininteger foo=33
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinbar=bye
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# check for global variables and $0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction foobar
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case $1 in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 1) print -r - "$foo" "$bar";;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 2) print -r - "$0";;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 3) typeset foo=foo
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin integer bar=10
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print -r - "$foo" "$bar";;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 4) trap 'foo=36' EXIT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin typeset foo=20;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction print
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin command print hi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(print) != hi ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit "command print not working inside print function"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinunset -f print
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(foobar 1) != '33 bye' ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'global variables not correct'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(foobar 2) != 'foobar' ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit '$0 not correct'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(bar=foo foobar 1) != '33 foo' ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'environment override not correct'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $bar == foo ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'scoping error'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(foobar 3) != 'foo 10' ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit non-local variables
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfoobar 4
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $foo != 36 ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit EXIT trap in wrong scope
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinunset -f foobar || err_exit "cannot unset function foobar"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypeset -f foobar>/dev/null && err_exit "typeset -f has incorrect exit status"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction foobar
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (return 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz> $tmp/test1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfoobar
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzif [ -r $tmp/test1 ]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzthen rm -r $tmp/test1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinelse err_exit 'return within subshell inside function error'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinabc() print hi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(abc) != hi ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'abc() print hi not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin( unset -f abc )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(abc 2>/dev/null) != hi ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'abc() print hi not working after subshell unset'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin(
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin function f
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin exit 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin f
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin err_exit 'exit from function not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinunset -f foo
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction foo
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin x=2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin x=3
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cd $tmp
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print bar
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if [[ $x != 2 ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin then err_exit 'value of x not restored after subshell inside function'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinx=1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindir=$PWD
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(foo) != bar ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'cd inside nested subshell not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $PWD != "$dir" ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'cd inside nested subshell changes $PWD'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfun() /bin/echo hello
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(fun) != hello ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit one line functions not working
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcat > $tmp/script <<-\!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print -r -- "$1"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzchmod +x $tmp/script
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction passargs
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz $tmp/script "$@"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(passargs one) != one ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'passing args from functions to scripts not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcat > $tmp/script <<-\!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin trap 'exit 0' EXIT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin function foo
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz /tmp > /dev/null 2>&1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin foo
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzif ! $tmp/script
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzthen err_exit 'exit trap incorrectly triggered'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzif ! $SHELL -c $tmp/script
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzthen err_exit 'exit trap incorrectly triggered when invoked with -c'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz$SHELL -c "trap 'rm $tmp/script' EXIT"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzif [[ -f $tmp/script ]]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzthen err_exit 'exit trap not triggered when invoked with -c'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcat > $tmp/script <<- \EOF
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin foobar()
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shift
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin foobar
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print -r -- "$1"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinEOF
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzchmod +x $tmp/script
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzif [[ $( $SHELL $tmp/script arg1 arg2) != arg2 ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'arguments not restored by posix functions'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction foo
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print hello
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin(
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin function foo
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print bar
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if [[ $(foo) != bar ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin then err_exit 'function definitions inside subshells not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(foo) != hello ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'function definitions inside subshells not restored'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinunset -f foo bar
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction bar
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print "$y"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction foo
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin typeset x=3
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin y=$x bar
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinx=1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(foo) != 3 ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'variable assignment list not using parent scope'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzunset -f foobar
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcat > $tmp/foobar <<!
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfunction foobar
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print foo
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzchmod +x $tmp/foobar
7c2fbfb345896881c631598ee3852ce9ce33fb07April ChinFPATH=$tmp
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzautoload foobar
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzif [[ $(foobar 2>/dev/null) != foo ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'autoload not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinunset -f foobar
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction foobar
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin typeset -r x=3
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin( foobar ) 2> /dev/null || err_exit "cannot unset readonly variable in function"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzif $SHELL -n 2> /dev/null <<-!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin abc()
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin !
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'abc() without a function body is not a syntax error'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction winpath
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz usage='q pathname ...'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin typeset var format=s
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while getopts "$usage" var
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do case $var in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin q) format=q;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin done
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print done
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $( (winpath --man 2>/dev/null); print ok) != ok ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'getopts --man in functions not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $( (winpath -z 2>/dev/null); print ok) != ok ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'getopts with bad option in functions not working'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinunset -f x
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction x
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print "$@"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypeset -ft x
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(x x=y 2>/dev/null) != x=y ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'name=value pair args not passed to traced functions'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction bad
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin false
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintrap 'val=false' ERR
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinval=true
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinbad
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $val != false ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'set -e not working for functions'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction bad
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin false
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinval=true
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinbad
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $val != true ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'set -e not disabled for functions'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinbad()
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin false
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinval=true
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinbad
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $val != false ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'set -e not inherited for posix functions'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintrap - ERR
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfunction myexport
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nameref var=$1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (( $# > 1 ))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin then export $1=$2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (( $# > 2 ))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin then print $(myexport "$1" "$3" )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin typeset val
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin val=$(export | grep "^$1=")
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print ${val#"$1="}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinexport dgk=base
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinval=$(myexport dgk fun)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinif [[ $val != fun ]]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinthen err_exit "export inside function not working -- expected 'fun', got '$val'"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinval=$(export | sed -e '/^dgk=/!d' -e 's/^dgk=//')
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinif [[ $val != base ]]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinthen err_exit "export not restored after function call -- expected 'base', got '$val'"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinval=$(myexport dgk fun fun2)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinif [[ $val != fun2 ]]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinthen err_exit "export inside function not working with recursive function -- expected 'fun2', got '$val'"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinval=$(export | sed -e '/^dgk=/!d' -e 's/^dgk=//')
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinif [[ $val != base ]]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinthen err_exit "export not restored after recursive function call -- expected 'base', got '$val'"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinval=$(dgk=try3 myexport dgk)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinif [[ $val != try3 ]]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinthen err_exit "name=value not added to export list with function call -- expected 'try3', got '$val'"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinval=$(export | sed -e '/^dgk=/!d' -e 's/^dgk=//')
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinif [[ $val != base ]]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinthen err_exit "export not restored name=value function call -- expected 'base', got '$val'"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinunset zzz
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinval=$(myexport zzz fun)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinif [[ $val != fun ]]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinthen err_exit "export inside function not working -- expected 'fun', got '$val'"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinval=$(export | sed -e '/^zzz=/!d' -e 's/^zzz=//')
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinif [[ $val ]]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinthen err_exit "unset varaible exported after function call -- expected '', got '$val'"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinunset zzz
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypeset -u zzz
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction foo
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin zzz=abc
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print $zzz
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(foo)$(foo) != ABCABC ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'attributes on unset variables not saved/restored'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction xpd {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin typeset i j=$1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for i
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do print i=$i j=$j
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ $i == a ]] && xpd b
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin done
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $(xpd a c) != $'i=a j=a\ni=b j=b\ni=c j=a' ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'for loop function optimization error'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypeset -A visited
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chininteger level=0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction closure
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (( $# > 5 )) && return 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ((level < 2)) && ((level++))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin typeset tmp r=0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin visited[$1]=1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for tmp in $level _$level
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ ${visited[$tmp]} == 1 ]] && continue
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin closure $tmp $* || r=1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin done
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return $r
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinclosure 0 || err_exit -u2 'for loop function optimization bug2'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzdir=$tmp/dir
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzmkdir $dir
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcd $dir || { err_exit "cd $dir failed"; exit 1; }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz function a {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz print a
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz function b {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz print 1
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz a
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz print 2
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz } > /dev/null
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz typeset -ft a b
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz PS4=X
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz b
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz) > file 2>&1
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $(<file) == *'Xprint 2'* ]] || err_exit 'function trace disabled by function call'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzrm -f file
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinprint 'false' > try
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinchmod +x try
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincat > tst <<- EOF
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin function ignore
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ./try
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin trap "print error; exit 1" ERR
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ignore
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinEOF
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif [[ $($SHELL < tst) == error ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen err_exit 'ERR trap not cleared'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland MainzFPATH=$dir
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzprint ': This does nothing' > foobar
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzchmod +x foobar
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzunset -f foobar
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{ foobar; } 2>/dev/null
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzgot=$?
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexp=126
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzif [[ $got != $exp ]]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzthen err_exit "function file without function definition processes wrong error -- expected '$exp', got '$got'"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzprint 'set a b c' > dotscript
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $(PATH=$PATH: $SHELL -c '. dotscript;print $#') == 3 ]] || err_exit 'positional parameters not preserved with . script without arguments'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincd ~- || err_exit "cd back failed"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction errcheck
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin trap 'print ERR; return 1' ERR
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin false
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print ok
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinerr=$(errcheck)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $err == ERR ]] || err_exit 'trap on ERR not working in a function'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinx="$(
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin function foobar
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print ok
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin typeset -f foobar
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin)"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chineval "$x" || err_exit 'typeset -f generates syntax error'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $(foobar) != ok ]] && err_exit 'typeset -f not generating function'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinunset -f a b c
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968china()
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin b
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin b
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print ${.sh.fun}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinb() { : ;}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $(a) == a ]] || err_exit '.sh.fun not set correctly in a function'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinprint $'a(){\ndate\n}' | $SHELL 2> /dev/null || err_exit 'parser error in a(){;date;}'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcat > $tmp/data1 << '++EOF'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 1 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 2 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 3 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 4 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 5 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 6 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 7 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 8 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 9 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 10 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 11 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 12 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 13 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 14 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 15 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 16 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 17 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 18 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 19 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 20 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin++EOF
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcat > $tmp/script << '++EOF'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinf()
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincat <<\M
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin++EOF
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcat $tmp/data1 >> $tmp/script
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzprintf 'M\n}\n\nf\n\n' >> $tmp/script
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz$SHELL -c $tmp/script > $tmp/data2
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcmp -s $tmp/data[12] || err_exit 'error with long functions'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinv=1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction f
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin typeset i
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for i in 0 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do typeset v
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin v=$i
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ $v == $i ]] || return 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin done
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinf || err_exit "typeset optimization bug"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction f
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print -r -- "$foo$bar"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction g
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin print -r -- $(bar=bam f)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinunset foo bar
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $(foo=hello g) == hellobam ]] || err_exit 'function exports not passed on'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $(bar=hello g) == bam ]] || err_exit 'function exports not overridden'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinunset -f foo
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfunction foo
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin typeset line=$1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set +n
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while [[ $line ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do if [[ ! $varname ]]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin then varname=${line%% *}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin line=${line##"$varname"?( )}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [[ $line ]] && continue
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else print ok
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fi
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin varname=
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin done
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[[ $(foo 'NUMBERED RECORDSIZE') == ok ]] || err_exit 'optimization error with undefined variable'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinunset x
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinx=$(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin set -e
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin integer count=0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin function err_f
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if ((count++==3))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin then print failed
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else false
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin trap 'err_f' ERR
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin false
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ $x == failed ]] && err_exit 'ERR trap executed multiple times'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinexport environment
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset global
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction f
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset i t local
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for i
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin do case $i in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [-+]*) set "$@"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin continue
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin local) local=f
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin t=$(typeset +f $local)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin global) global=f
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin t=$(typeset +f $global)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin environment)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin environment=f
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin t=$(typeset +f $environment)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin literal)t=$(typeset +f f)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin positional)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin set -- f
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin t=$(typeset +f $1)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin esac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ $t ]] || err_exit "typeset +f \$$i failed"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinf local global environment literal positional
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin$SHELL -c '
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz print exit 0 > '$tmp'/script
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz chmod +x '$tmp'/script
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin unset var
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin var=( ident=1 )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin function fun
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz PATH='$tmp' script
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fun
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin' || err_exit "compound variable cleanup before script exec failed"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz( $SHELL << \++EOF++
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction main
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset key
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -A entry
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin entry[a]=( value=aaa )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinmain
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin++EOF++
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin) 2> /dev/null || err_exit 'function main fails'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinoptind=$OPTIND
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinsub()
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin OPTIND=1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while getopts :abc OPTION "$@"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin do print OPTIND=$OPTIND
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ $(sub -a) == OPTIND=2 ]] || err_exit 'OPTIND should be 2'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ $(sub -a) == OPTIND=2 ]] || err_exit 'OPTIND should be 2 again'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ $OPTIND == "$optind" ]] || err_exit 'OPTIND should be 1'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction bar
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ -o nounset ]] && err_exit 'nounset option should not be inherited'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction foo
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin set -o nounset
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin bar
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinset +o nounset
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfoo
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction red
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin integer -S d=0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin printf 'red_one %d\n' d
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (( d++ ))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ ${ red } != 'red_one 0' ]] && err_exit 'expected red_one 0'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ ${ red } != 'red_one 1' ]] && err_exit 'expected red_one 1'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinxyz=$0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction traceback
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin integer .level=.sh.level
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while((--.level>=0))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ((.sh.level = .level))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ $xyz == "$0" ]] || err_exit "\$xyz=$xyz does not match $0 on level ${.level}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ ${.sh.lineno} == "$1" ]] || err_exit "\${.sh.lineno}=${.sh.lineno} does not match $1 on level ${.level}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction foo
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset xyz=foo
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin set -- $((LINENO+1))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin bar $LINENO "$1"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction bar
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset xyz=bar
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin set -- $((LINENO+2))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin trap 'traceback $LINENO' DEBUG
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin : $LINENO "$1"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinset -- $((LINENO+1))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfoo $LINENO
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction .sh.fun.set
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print -r -- "${.sh.value}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction abc
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin :
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chindef()
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin :
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ $(abc) == abc ]] || err_exit '.sh.fun.set not capturing function name'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ $(def) == def ]] || err_exit '.sh.fun.set not capturing name()'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinunset -f .sh.fun.set
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# tests for debug functions
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinbasefile=${.sh.file}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chininteger baseline
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcat > $tmp/debug << \+++
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin : line 1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin : line 3
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin+++
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Print one line in a call stack
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction _Dbg_print_frame
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -i pos=$1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset fn=$2
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset filename="$3"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset -i line=$4
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset arg=$5
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shift 5
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if ((pos==0))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin then [[ $filename == "$basefile" ]] || err_exit "filename for level 0 is $filename not $basename"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ $arg == DEBUG ]] && ((baseline++))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ $line == "$baseline" ]] || err_exit "line number for level 0 is $line not $baseline"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin elif ((pos==1))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz then [[ $filename == "$tmp/debug" ]] || err_exit "filename for level 1 is $filename not $tmp/debug"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ $* == 'foo bar' ]] || err_exit "args are '$*', not 'foo bar'"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ $line == $arg ]] || err_exit "line number for level 1 is $line not $arg"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else err_exit "level should be 0 or 1 but is $pos"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction _Dbg_debug_trap_handler
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin integer .level=.sh.level .max=.sh.level-1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while((--.level>=0))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ((.sh.level = .level))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin _Dbg_print_frame "${.level}" "$0" "${.sh.file}" "${.sh.lineno}" "${.sh.command##* }" "$@"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin((baseline=LINENO+2))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintrap '_Dbg_debug_trap_handler' DEBUG
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz. $tmp/debug foo bar
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintrap '' DEBUG
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chincaller() {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin integer .level=.sh.level .max=.sh.level-1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while((--.level>=0))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ((.sh.level = .level))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print -r -- "${.sh.lineno}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinbar() { caller;}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinset -- $(bar)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ $1 == $2 ]] && err_exit ".sh.inline optimization bug"
7c2fbfb345896881c631598ee3852ce9ce33fb07April 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'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzgot=$(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzs=$(ulimit -s)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzif [[ $s == +([[:digit:]]) ]] && (( s < 16384 ))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzthen ulimit -s 16384 2>/dev/null
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz$SHELL << \+++
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzf()
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (($1>1))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz then x=$(f $(($1-1))) || exit 1
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz fi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz return 0
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzf 257 && print ok
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz+++
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz} 2>/dev/null
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $got == ok ]] || err_exit 'cannot handle comsub depth > 256 in function'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztmp1=$tmp/job.1
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztmp2=$tmp/job.2
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcat > $tmp1 << +++
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#! $SHELL
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzprint \$\$
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz+++
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzchmod +x $tmp1
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfunction foo
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz typeset pid
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz $tmp1 > $tmp2 & pid=$!
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz wait $!
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(< $tmp2) == $pid ]] || err_exit 'wrong pid for & job in function'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfoo
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# make sure compiled functions work
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $(tmp=$tmp $SHELL <<- \++++
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz cat > $tmp/functions <<- \EOF
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz function bar
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz print foo
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz function foobar
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz bar
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz EOF
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ${SHCOMP:-${SHELL%/*}/shcomp} $tmp/functions > $tmp/foobar
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz rm -f "$tmp/functions"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz chmod +x $tmp/foobar
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz rm $tmp/!(dir|foobar)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz FPATH=$tmp
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz PATH=$FPATH:$PATH
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz foobar
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz++++
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz) == foo ]] > /dev/null || err_exit 'functions compiled with shcomp not working'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# test for functions in shell having side effects.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzunset -f foo foobar bar
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcd "$tmp"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland MainzFPATH=$PWD
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland MainzPATH=$FPATH:$PATH
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcat > foo <<- \EOF
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz function bar
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz print foobar
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz function foo
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz bar
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland MainzEOF
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzchmod +x foo
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz: $(foo)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $(typeset +f) == *foo* ]] && err_exit 'function in subshell leaving side effect of function foo'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzunset -f foo bar
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz: $(foo)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $(typeset +f) == *foo* ]] && err_exit 'function in subshell leaving side effects of function foo after reload'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $(typeset +f) == *bar* ]] && err_exit 'function in subshell leaving side effects of function bar after reload'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknerunset -f foo
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknertypeset -A bar
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknerfunction foo
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner{
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner typeset -i bar[$1].x
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner bar[$1].x=5
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner}
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknerfoo sub
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner[[ ${!bar[@]} == sub ]] || err_exit 'scoping problem with compound array variables'
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknerfunction A
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner{
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner trap "> /dev/null;print TRAP A" EXIT
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner # (( stderr )) && print >&2
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner}
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknerfunction B
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner{
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner trap "> /dev/null;print TRAP B" EXIT
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner A
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner}
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknerx=$(B)
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner[[ $x == $'TRAP A\nTRAP B' ]] || err_exit "trap from funtions in subshells fails got" $x
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinexit $((Errors))