1*b30d1939SAndy Fiddaman########################################################################
2*b30d1939SAndy Fiddaman#                                                                      #
3*b30d1939SAndy Fiddaman#               This software is part of the ast package               #
4*b30d1939SAndy Fiddaman#          Copyright (c) 1982-2012 AT&T Intellectual Property          #
5*b30d1939SAndy Fiddaman#                      and is licensed under the                       #
6*b30d1939SAndy Fiddaman#                 Eclipse Public License, Version 1.0                  #
7*b30d1939SAndy Fiddaman#                    by AT&T Intellectual Property                     #
8*b30d1939SAndy Fiddaman#                                                                      #
9*b30d1939SAndy Fiddaman#                A copy of the License is available at                 #
10*b30d1939SAndy Fiddaman#          http://www.eclipse.org/org/documents/epl-v10.html           #
11*b30d1939SAndy Fiddaman#         (with md5 checksum b35adb5213ca9657e911e9befb180842)         #
12*b30d1939SAndy Fiddaman#                                                                      #
13*b30d1939SAndy Fiddaman#              Information and Software Systems Research               #
14*b30d1939SAndy Fiddaman#                            AT&T Research                             #
15*b30d1939SAndy Fiddaman#                           Florham Park NJ                            #
16*b30d1939SAndy Fiddaman#                                                                      #
17*b30d1939SAndy Fiddaman#                  David Korn <dgk@research.att.com>                   #
18*b30d1939SAndy Fiddaman#                                                                      #
19*b30d1939SAndy Fiddaman########################################################################
20*b30d1939SAndy Fiddamanfunction err_exit
21*b30d1939SAndy Fiddaman{
22*b30d1939SAndy Fiddaman	print -u2 -n "\t"
23*b30d1939SAndy Fiddaman	print -u2 -r ${Command}[$1]: "${@:2}"
24*b30d1939SAndy Fiddaman	let Errors+=1
25*b30d1939SAndy Fiddaman}
26*b30d1939SAndy Fiddamanalias err_exit='err_exit $LINENO'
27*b30d1939SAndy Fiddaman
28*b30d1939SAndy FiddamanCommand=${0##*/}
29*b30d1939SAndy Fiddamaninteger Errors=0
30*b30d1939SAndy Fiddaman
31*b30d1939SAndy Fiddamantmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; }
32*b30d1939SAndy Fiddamantrap "cd /; rm -rf $tmp" EXIT
33*b30d1939SAndy Fiddaman
34*b30d1939SAndy Fiddamanf=$tmp/here1
35*b30d1939SAndy Fiddamang=$tmp/here2
36*b30d1939SAndy Fiddamancat > $f <<!
37*b30d1939SAndy Fiddamanhello world
38*b30d1939SAndy Fiddaman!
39*b30d1939SAndy Fiddamanif	[[ $(<$f) != 'hello world' ]]
40*b30d1939SAndy Fiddamanthen	err_exit "'hello world' here doc not working"
41*b30d1939SAndy Fiddamanfi
42*b30d1939SAndy Fiddamancat > $g <<\!
43*b30d1939SAndy Fiddamanhello world
44*b30d1939SAndy Fiddaman!
45*b30d1939SAndy Fiddamancmp $f $g 2> /dev/null || err_exit "'hello world' quoted here doc not working"
46*b30d1939SAndy Fiddamancat > $g <<- !
47*b30d1939SAndy Fiddaman	hello world
48*b30d1939SAndy Fiddaman!
49*b30d1939SAndy Fiddamancmp $f $g 2> /dev/null || err_exit "'hello world' tabbed here doc not working"
50*b30d1939SAndy Fiddamancat > $g <<- \!
51*b30d1939SAndy Fiddaman	hello world
52*b30d1939SAndy Fiddaman!
53*b30d1939SAndy Fiddamancmp $f $g 2> /dev/null || err_exit "'hello world' quoted tabbed here doc not working"
54*b30d1939SAndy Fiddamanx=hello
55*b30d1939SAndy Fiddamancat > $g <<!
56*b30d1939SAndy Fiddaman$x world
57*b30d1939SAndy Fiddaman!
58*b30d1939SAndy Fiddamancmp $f $g 2> /dev/null || err_exit "'$x world' here doc not working"
59*b30d1939SAndy Fiddamancat > $g <<!
60*b30d1939SAndy Fiddaman$(print hello) world
61*b30d1939SAndy Fiddaman!
62*b30d1939SAndy Fiddamancmp $f $g 2> /dev/null || err_exit "'$(print hello) world' here doc not working"
63*b30d1939SAndy Fiddamancat > $f <<\!!
64*b30d1939SAndy Fiddaman!@#$%%^^&*()_+~"::~;'`<>?/.,{}[]
65*b30d1939SAndy Fiddaman!!
66*b30d1939SAndy Fiddamanif	[[ $(<$f) != '!@#$%%^^&*()_+~"::~;'\''`<>?/.,{}[]' ]]
67*b30d1939SAndy Fiddamanthen	err_exit "'hello world' here doc not working"
68*b30d1939SAndy Fiddamanfi
69*b30d1939SAndy Fiddamancat > $g <<!!
70*b30d1939SAndy Fiddaman!@#\$%%^^&*()_+~"::~;'\`<>?/.,{}[]
71*b30d1939SAndy Fiddaman!!
72*b30d1939SAndy Fiddamancmp $f $g 2> /dev/null || err_exit "unquoted here doc not working"
73*b30d1939SAndy Fiddamanexec 3<<!
74*b30d1939SAndy Fiddaman	foo
75*b30d1939SAndy Fiddaman!
76*b30d1939SAndy Fiddamanif	[[ $(<&3) != '	foo' ]]
77*b30d1939SAndy Fiddamanthen	err_exit "leading tabs stripped with <<!"
78*b30d1939SAndy Fiddamanfi
79*b30d1939SAndy Fiddaman$SHELL -c "
80*b30d1939SAndy Fiddamaneval `echo 'cat <<x'` "|| err_exit "eval `echo 'cat <<x'` core dumps"
81*b30d1939SAndy Fiddamancat > /dev/null <<EOF # comments should not cause core dumps
82*b30d1939SAndy Fiddamanabc
83*b30d1939SAndy FiddamanEOF
84*b30d1939SAndy Fiddamancat >$g << :
85*b30d1939SAndy Fiddaman:
86*b30d1939SAndy Fiddaman:
87*b30d1939SAndy Fiddamancmp /dev/null $g 2> /dev/null || err_exit "empty here doc not working"
88*b30d1939SAndy Fiddamanx=$(print $( cat <<HUP
89*b30d1939SAndy Fiddamanhello
90*b30d1939SAndy FiddamanHUP
91*b30d1939SAndy Fiddaman)
92*b30d1939SAndy Fiddaman)
93*b30d1939SAndy Fiddamanif	[[ $x != hello ]]
94*b30d1939SAndy Fiddamanthen	err_exit "here doc inside command sub not working"
95*b30d1939SAndy Fiddamanfi
96*b30d1939SAndy Fiddamany=$(cat <<!
97*b30d1939SAndy Fiddaman${x:+${x}}
98*b30d1939SAndy Fiddaman!
99*b30d1939SAndy Fiddaman)
100*b30d1939SAndy Fiddamanif	[[ $y != "${x:+${x}}" ]]
101*b30d1939SAndy Fiddamanthen	err_exit '${x:+${x}} not working in here document'
102*b30d1939SAndy Fiddamanfi
103*b30d1939SAndy Fiddaman$SHELL -c '
104*b30d1939SAndy Fiddamanx=0
105*b30d1939SAndy Fiddamanwhile (( x < 100 ))
106*b30d1939SAndy Fiddamando	((x = x+1))
107*b30d1939SAndy Fiddaman	cat << EOF
108*b30d1939SAndy FiddamanEOF
109*b30d1939SAndy Fiddamandone
110*b30d1939SAndy Fiddaman' 2> /dev/null  || err_exit '100 empty here docs fails'
111*b30d1939SAndy Fiddaman{
112*b30d1939SAndy Fiddaman	print 'builtin -d cat
113*b30d1939SAndy Fiddaman	cat <<- EOF'
114*b30d1939SAndy Fiddaman	for ((i=0; i < 100; i++))
115*b30d1939SAndy Fiddaman	do print XXXXXXXXXXXXXXXXXXXX
116*b30d1939SAndy Fiddaman	done
117*b30d1939SAndy Fiddaman	print ' XXX$(date)XXXX
118*b30d1939SAndy Fiddaman	EOF'
119*b30d1939SAndy Fiddaman} > $f
120*b30d1939SAndy Fiddamanchmod +x "$f"
121*b30d1939SAndy Fiddaman$SHELL "$f" > /dev/null  || err_exit "large here-doc with command substitution fails"
122*b30d1939SAndy Fiddamanx=$(/bin/cat <<!
123*b30d1939SAndy Fiddaman$0
124*b30d1939SAndy Fiddaman!
125*b30d1939SAndy Fiddaman)
126*b30d1939SAndy Fiddaman[[ "$x" == "$0" ]] || err_exit '$0 not correct inside here documents'
127*b30d1939SAndy Fiddaman$SHELL -c 'x=$(
128*b30d1939SAndy Fiddamancat << EOF
129*b30d1939SAndy FiddamanEOF)' 2> /dev/null || err_exit 'here-doc cannot be terminated by )'
130*b30d1939SAndy Fiddamanif	[[ $( IFS=:;cat <<-!
131*b30d1939SAndy Fiddaman			$IFS$(print hi)$IFS
132*b30d1939SAndy Fiddaman		!) != :hi: ]]
133*b30d1939SAndy Fiddamanthen	err_exit '$IFS unset by command substitution in here docs'
134*b30d1939SAndy Fiddamanfi
135*b30d1939SAndy Fiddamanif	x=$($SHELL -c 'cat <<< "hello world"' 2> /dev/null)
136*b30d1939SAndy Fiddamanthen	[[ $x == 'hello world' ]] || err_exit '<<< documents not working'
137*b30d1939SAndy Fiddaman	x=$($SHELL -c 'v="hello  world";cat <<< $v' 2> /dev/null)
138*b30d1939SAndy Fiddaman	[[ $x == 'hello  world' ]] || err_exit '<<< documents with $x not working'
139*b30d1939SAndy Fiddaman	x=$($SHELL -c 'v="hello  world";cat <<< "$v"' 2> /dev/null)
140*b30d1939SAndy Fiddaman	[[ $x == 'hello  world' ]] || err_exit '<<< documents with $x not working'
141*b30d1939SAndy Fiddamanelse	err_exit '<<< syntax not supported'
142*b30d1939SAndy Fiddamanfi
143*b30d1939SAndy Fiddamanif	[[ $(cat << EOF #testing
144*b30d1939SAndy Fiddaman#abc
145*b30d1939SAndy Fiddamanabc
146*b30d1939SAndy FiddamanEOF) != $'#abc\nabc' ]]
147*b30d1939SAndy Fiddamanthen	err_exit 'comments not preserved in here-documents'
148*b30d1939SAndy Fiddamanfi
149*b30d1939SAndy Fiddamancat  > "$f" <<- '!!!!'
150*b30d1939SAndy Fiddaman	builtin cat
151*b30d1939SAndy Fiddaman	: << EOF
152*b30d1939SAndy Fiddaman	$PWD
153*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
154*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
155*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
156*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
157*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
158*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
159*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
160*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
161*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
162*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
163*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
164*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
165*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
166*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
167*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
168*b30d1939SAndy Fiddaman	EOF
169*b30d1939SAndy Fiddaman	command exec 3>&- 4>&- 5>&- 6>&- 7>&- 8>&- 9>&-
170*b30d1939SAndy Fiddaman	x=abc
171*b30d1939SAndy Fiddaman	cat << EOF
172*b30d1939SAndy Fiddaman	$x
173*b30d1939SAndy Fiddaman	EOF
174*b30d1939SAndy Fiddaman!!!!
175*b30d1939SAndy Fiddamanchmod 755 "$f"
176*b30d1939SAndy Fiddamanif	[[ $($SHELL  "$f") != abc ]]
177*b30d1939SAndy Fiddamanthen	err_exit	'here document descritor was closed'
178*b30d1939SAndy Fiddamanfi
179*b30d1939SAndy Fiddamancat  > "$f" <<- '!!!!'
180*b30d1939SAndy Fiddaman	exec 0<&-
181*b30d1939SAndy Fiddaman	foobar()
182*b30d1939SAndy Fiddaman	{
183*b30d1939SAndy Fiddaman		/bin/cat <<- !
184*b30d1939SAndy Fiddaman		foobar
185*b30d1939SAndy Fiddaman		!
186*b30d1939SAndy Fiddaman	}
187*b30d1939SAndy Fiddaman	: << EOF
188*b30d1939SAndy Fiddaman	$PWD
189*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
190*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
191*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
192*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
193*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
194*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
195*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
196*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
197*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
198*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
199*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
200*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
201*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
202*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
203*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
204*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
205*b30d1939SAndy Fiddaman	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
206*b30d1939SAndy Fiddaman	EOF
207*b30d1939SAndy Fiddaman	print -r -- "$(foobar)"
208*b30d1939SAndy Fiddaman!!!!
209*b30d1939SAndy Fiddamanif	[[ $($SHELL  "$f") != foobar ]]
210*b30d1939SAndy Fiddamanthen	err_exit	'here document with stdin closed failed'
211*b30d1939SAndy Fiddamanfi
212*b30d1939SAndy Fiddamanprintf $'cat   <<# \\!!!\n\thello\n\t\tworld\n!!!' > $f
213*b30d1939SAndy Fiddaman[[ $($SHELL "$f") == $'hello\n\tworld' ]] || err_exit "<<# not working for quoted here documents"
214*b30d1939SAndy Fiddamanprintf $'w=world;cat   <<# !!!\n\thello\n\t\t$w\n!!!' > $f
215*b30d1939SAndy Fiddaman[[ $($SHELL "$f") == $'hello\n\tworld' ]] || err_exit "<<# not working for non-quoted here documents"
216*b30d1939SAndy Fiddaman[[ $( $SHELL  <<- \++++
217*b30d1939SAndy Fiddaman	S=( typeset a )
218*b30d1939SAndy Fiddaman	function S.a.get
219*b30d1939SAndy Fiddaman	{
220*b30d1939SAndy Fiddaman	     .sh.value=$__a
221*b30d1939SAndy Fiddaman	}
222*b30d1939SAndy Fiddaman	__a=1234
223*b30d1939SAndy Fiddaman	cat <<-EOF
224*b30d1939SAndy Fiddaman	${S.a}
225*b30d1939SAndy Fiddaman	EOF
226*b30d1939SAndy Fiddaman++++
227*b30d1939SAndy Fiddaman) == 1234 ]]  2> /dev/null || err_exit 'here document with get discipline failed'
228*b30d1939SAndy Fiddaman[[ $($SHELL -c 'g(){ print ok;}; cat <<- EOF
229*b30d1939SAndy Fiddaman	${ g;}
230*b30d1939SAndy Fiddaman	EOF
231*b30d1939SAndy Fiddaman	' 2> /dev/null) == ok ]] || err_exit '${ command;} not working in heredoc'
232*b30d1939SAndy Fiddamanscript=$f
233*b30d1939SAndy Fiddaman{
234*b30d1939SAndy Fiddamanfor ((i=0; i < 406; i++))
235*b30d1939SAndy Fiddamando	print ': 23456789012345678'
236*b30d1939SAndy Fiddamandone
237*b30d1939SAndy Fiddamanprint : 123456789123
238*b30d1939SAndy Fiddamancat <<- \EOF
239*b30d1939SAndy Fiddamaneval "$(
240*b30d1939SAndy Fiddaman	{ cat                                 ; } <<MARKER
241*b30d1939SAndy Fiddaman	  print  hello
242*b30d1939SAndy Fiddaman	MARKER
243*b30d1939SAndy Fiddaman)"
244*b30d1939SAndy FiddamanEOF
245*b30d1939SAndy Fiddaman} > $script
246*b30d1939SAndy Fiddamanchmod +x $script
247*b30d1939SAndy Fiddaman[[ $($SHELL $script) == hello ]] 2> /dev/null || err_exit 'heredoc embeded in command substitution fails at buffer boundary'
248*b30d1939SAndy Fiddaman
249*b30d1939SAndy Fiddamangot=$( cat << EOF
250*b30d1939SAndy Fiddaman\
251*b30d1939SAndy Fiddamanabc
252*b30d1939SAndy FiddamanEOF)
253*b30d1939SAndy Fiddaman[[ $got == abc ]] || err_exit 'line continuation at start of buffer not working'
254*b30d1939SAndy Fiddaman
255*b30d1939SAndy Fiddamantmpfile1=$tmp/file1
256*b30d1939SAndy Fiddamantmpfile2=$tmp/file2
257*b30d1939SAndy Fiddamanfunction gendata
258*b30d1939SAndy Fiddaman{
259*b30d1939SAndy Fiddaman	typeset -RZ3 i
260*b30d1939SAndy Fiddaman	for ((i=0; i < 500; i++))
261*b30d1939SAndy Fiddaman	do	print -r -- "=====================This is line $i============="
262*b30d1939SAndy Fiddaman	done
263*b30d1939SAndy Fiddaman}
264*b30d1939SAndy Fiddaman
265*b30d1939SAndy Fiddamancat > $tmpfile1 <<- +++
266*b30d1939SAndy Fiddaman	function foobar
267*b30d1939SAndy Fiddaman	{
268*b30d1939SAndy Fiddaman		cat << XXX
269*b30d1939SAndy Fiddaman		$(gendata)
270*b30d1939SAndy Fiddaman		XXX
271*b30d1939SAndy Fiddaman	}
272*b30d1939SAndy Fiddaman	cat > $tmpfile2 <<- EOF
273*b30d1939SAndy Fiddaman	\$(foobar)
274*b30d1939SAndy Fiddaman	$(gendata)
275*b30d1939SAndy FiddamanEOF
276*b30d1939SAndy Fiddaman+++
277*b30d1939SAndy Fiddamanchmod +x $tmpfile1
278*b30d1939SAndy Fiddaman$SHELL $tmpfile1
279*b30d1939SAndy Fiddamanset -- $(wc < $tmpfile2)
280*b30d1939SAndy Fiddaman(( $1 == 1000 )) || err_exit "heredoc $1 lines, should be 1000 lines"
281*b30d1939SAndy Fiddaman(( $2 == 4000 )) || err_exit "heredoc $2 words, should be 4000 words"
282*b30d1939SAndy Fiddaman
283*b30d1939SAndy Fiddaman# comment with here document looses line number count
284*b30d1939SAndy Fiddamaninteger line=$((LINENO+5))
285*b30d1939SAndy Fiddamanfunction tst
286*b30d1939SAndy Fiddaman{
287*b30d1939SAndy Fiddaman	[[ $1 == $2 ]] || echo expected $1, got $2
288*b30d1939SAndy Fiddaman}
289*b30d1939SAndy Fiddamantst $line $LINENO <<"!" # this comment affects LINENO #
290*b30d1939SAndy Fiddaman1
291*b30d1939SAndy Fiddaman!
292*b30d1939SAndy Fiddaman(( (line+=3) == LINENO )) ||  err_exit "line number=$LINENO should be $line"
293*b30d1939SAndy Fiddaman
294*b30d1939SAndy Fiddaman[[ $($SHELL -c 'wc -c <<< ""' 2> /dev/null) == *1 ]] || err_exit '<<< with empty string not working'
295*b30d1939SAndy Fiddaman
296*b30d1939SAndy Fiddamanmkdir $tmp/functions
297*b30d1939SAndy Fiddamancat > $tmp/functions/t2 <<\!!!
298*b30d1939SAndy Fiddamanfunction t2
299*b30d1939SAndy Fiddaman{
300*b30d1939SAndy Fiddamancat <<EOF | sed 's/1234567890/qwertyuiopasdfghj/'
301*b30d1939SAndy Fiddaman${1}
302*b30d1939SAndy FiddamanEOF
303*b30d1939SAndy Fiddaman}
304*b30d1939SAndy Fiddaman!!!
305*b30d1939SAndy Fiddaman
306*b30d1939SAndy FiddamanFPATH=$tmp/functions
307*b30d1939SAndy Fiddamanfoo=${
308*b30d1939SAndy Fiddamancat <<EOF
309*b30d1939SAndy Fiddaman1 34567890 $(t2 1234567890 ) 0123456789012345678901234567890123
310*b30d1939SAndy Fiddaman111111111111111111111111111111111111111111111111111111111111111
311*b30d1939SAndy Fiddaman111111111111111111111111111111111111111111111111111111111111111
312*b30d1939SAndy Fiddaman111111111111111111111111111111111111111111111111111111111111111
313*b30d1939SAndy Fiddaman111111111111111111111111111111111111111111111111111111111111111
314*b30d1939SAndy Fiddaman111111111111111111111111111111111111111111111111111111111111111
315*b30d1939SAndy Fiddaman111111111111111111111111111111111111111111111111111111111111111
316*b30d1939SAndy Fiddaman111111111111111111111111111111111111111111111111111111111111111
317*b30d1939SAndy Fiddaman111111111111111111111111111111111111111111111111111111111111111
318*b30d1939SAndy Fiddaman111111111111111111111111111111111111111111111111111111111111111
319*b30d1939SAndy Fiddaman111111111111111111111111111111111111111111111111111111111111111
320*b30d1939SAndy Fiddaman111111111111111111111111111111111111111111111111111111111111111
321*b30d1939SAndy Fiddaman111111111111111111111111111111111111111111111111111111111111111
322*b30d1939SAndy Fiddaman111111111111111111111111111111111111111111111111111111111111111
323*b30d1939SAndy Fiddaman111111111111111111111111111111111111111111111111111111111111111
324*b30d1939SAndy Fiddaman111111111111111111111111111111111111111111111111111111111111 1
325*b30d1939SAndy Fiddaman
326*b30d1939SAndy Fiddaman2 34567890 $(t2 1234567890 ) 0123456789012345678901234567890123
327*b30d1939SAndy Fiddaman222222222222222222222222222222222222222222222222222222222222222
328*b30d1939SAndy Fiddaman222222222222222222222222222222222222222222222222222222222222222
329*b30d1939SAndy Fiddaman222222222222222222222222222222222222222222222222222222222222222
330*b30d1939SAndy Fiddaman222222222222222222222222222222222222222222222222222222222222222
331*b30d1939SAndy Fiddaman222222222222222222222222222222222222222222222222222222222222222
332*b30d1939SAndy Fiddaman222222222222222222222222222222222222222222222222222222222222222
333*b30d1939SAndy Fiddaman222222222222222222222222222222222222222222222222222222222222222
334*b30d1939SAndy Fiddaman222222222222222222222222222222222222222222222222222222222222222
335*b30d1939SAndy Fiddaman222222222222222222222222222222222222222222222222222222222222222
336*b30d1939SAndy Fiddaman222222222222222222222222222222222222222222222222222222222222222
337*b30d1939SAndy Fiddaman222222222222222222222222222222222222222222222222222222222222222
338*b30d1939SAndy Fiddaman222222222222222222222222222222222222222222222222222222222222222
339*b30d1939SAndy Fiddaman222222222222222222222222222222222222222222222222222222222222222
340*b30d1939SAndy Fiddaman222222222222222222222222222222222222222222222222222222222222222
341*b30d1939SAndy Fiddaman222222222222222222222222222222222222222222222222222222222222 2
342*b30d1939SAndy Fiddaman
343*b30d1939SAndy Fiddaman3 34567890 $(t2 1234567890 ) 0123456789012345678901234567890123
344*b30d1939SAndy Fiddaman333333333333333333333333333333333333333333333333333333333333333
345*b30d1939SAndy Fiddaman333333333333333333333333333333333333333333333333333333333333333
346*b30d1939SAndy Fiddaman333333333333333333333333333333333333333333333333333333333333333
347*b30d1939SAndy Fiddaman333333333333333333333333333333333333333333333333333333333333333
348*b30d1939SAndy Fiddaman333333333333333333333333333333333333333333333333333333333333333
349*b30d1939SAndy Fiddaman333333333333333333333333333333333333333333333333333333333333333
350*b30d1939SAndy Fiddaman333333333333333333333333333333333333333333333333333333333333333
351*b30d1939SAndy Fiddaman333333333333333333333333333333333333333333333333333333333333333
352*b30d1939SAndy Fiddaman333333333333333333333333333333333333333333333333333333333333333
353*b30d1939SAndy Fiddaman333333333333333333333333333333333333333333333333333333333333333
354*b30d1939SAndy Fiddaman333333333333333333333333333333333333333333333333333333333333333
355*b30d1939SAndy Fiddaman333333333333333333333333333333333333333333333333333333333333333
356*b30d1939SAndy Fiddaman333333333333333333333333333333333333333333333333333333333333333
357*b30d1939SAndy Fiddaman333333333333333333333333333333333333333333333333333333333333333
358*b30d1939SAndy Fiddaman333333333333333333333333333333333333333333333333333333333333 3
359*b30d1939SAndy Fiddaman
360*b30d1939SAndy Fiddaman4 34567890 $(t2 1234567890 ) 0123456789012345678901234567890123
361*b30d1939SAndy Fiddaman444444444444444444444444444444444444444444444444444444444444444
362*b30d1939SAndy Fiddaman444444444444444444444444444444444444444444444444444444444444444
363*b30d1939SAndy Fiddaman444444444444444444444444444444444444444444444444444444444444444
364*b30d1939SAndy Fiddaman444444444444444444444444444444444444444444444444444444444444444
365*b30d1939SAndy Fiddaman444444444444444444444444444444444444444444444444444444444444444
366*b30d1939SAndy Fiddaman444444444444444444444444444444444444444444444444444444444444444
367*b30d1939SAndy Fiddaman444444444444444444444444444444444444444444444444444444444444444
368*b30d1939SAndy Fiddaman444444444444444444444444444444444444444444444444444444444444444
369*b30d1939SAndy Fiddaman444444444444444444444444444444444444444444444444444444444444444
370*b30d1939SAndy Fiddaman444444444444444444444444444444444444444444444444444444444444444
371*b30d1939SAndy Fiddaman444444444444444444444444444444444444444444444444444444444444444
372*b30d1939SAndy Fiddaman444444444444444444444444444444444444444444444444444444444444444
373*b30d1939SAndy Fiddaman444444444444444444444444444444444444444444444444444444444444444
374*b30d1939SAndy Fiddaman444444444444444444444444444444444444444444444444444444444444444
375*b30d1939SAndy Fiddaman444444444444444444444444444444444444444444444444444444444444 4
376*b30d1939SAndy Fiddaman
377*b30d1939SAndy Fiddaman5 34567890 $(t2 1234567890 ) 0123456789012345678901234567890123
378*b30d1939SAndy Fiddaman555555555555555555555555555555555555555555555555555555555555555
379*b30d1939SAndy Fiddaman555555555555555555555555555555555555555555555555555555555555555
380*b30d1939SAndy Fiddaman555555555555555555555555555555555555555555555555555555555555555
381*b30d1939SAndy Fiddaman555555555555555555555555555555555555555555555555555555555555555
382*b30d1939SAndy Fiddaman555555555555555555555555555555555555555555555555555555555555555
383*b30d1939SAndy Fiddaman555555555555555555555555555555555555555555555555555555555555555
384*b30d1939SAndy Fiddaman555555555555555555555555555555555555555555555555555555555555555
385*b30d1939SAndy Fiddaman555555555555555555555555555555555555555555555555555555555555555
386*b30d1939SAndy Fiddaman555555555555555555555555555555555555555555555555555555555555555
387*b30d1939SAndy Fiddaman555555555555555555555555555555555555555555555555555555555555555
388*b30d1939SAndy Fiddaman555555555555555555555555555555555555555555555555555555555555555
389*b30d1939SAndy Fiddaman555555555555555555555555555555555555555555555555555555555555555
390*b30d1939SAndy Fiddaman555555555555555555555555555555555555555555555555555555555555555
391*b30d1939SAndy Fiddaman555555555555555555555555555555555555555555555555555555555555555
392*b30d1939SAndy Fiddaman555555555555555555555555555555555555555555555555555555555555 5
393*b30d1939SAndy Fiddaman
394*b30d1939SAndy Fiddaman6 34567890 $(t2 1234567890 ) 0123456789012345678901234567890123
395*b30d1939SAndy Fiddaman666666666666666666666666666666666666666666666666666666666666666
396*b30d1939SAndy Fiddaman666666666666666666666666666666666666666666666666666666666666666
397*b30d1939SAndy Fiddaman666666666666666666666666666666666666666666666666666666666666666
398*b30d1939SAndy Fiddaman666666666666666666666666666666666666666666666666666666666666666
399*b30d1939SAndy Fiddaman666666666666666666666666666666666666666666666666666666666666666
400*b30d1939SAndy Fiddaman666666666666666666666666666666666666666666666666666666666666666
401*b30d1939SAndy Fiddaman666666666666666666666666666666666666666666666666666666666666666
402*b30d1939SAndy Fiddaman666666666666666666666666666666666666666666666666666666666666666
403*b30d1939SAndy Fiddaman666666666666666666666666666666666666666666666666666666666666666
404*b30d1939SAndy Fiddaman666666666666666666666666666666666666666666666666666666666666666
405*b30d1939SAndy Fiddaman666666666666666666666666666666666666666666666666666666666666666
406*b30d1939SAndy Fiddaman666666666666666666666666666666666666666666666666666666666666666
407*b30d1939SAndy Fiddaman666666666666666666666666666666666666666666666666666666666666666
408*b30d1939SAndy Fiddaman666666666666666666666666666666666666666666666666666666666666666
409*b30d1939SAndy Fiddaman666666666666666666666666666666666666666666666666666666666666 6
410*b30d1939SAndy Fiddaman
411*b30d1939SAndy Fiddaman7 34567890 $(t2 1234567890 ) 0123456789012345678901234567890123
412*b30d1939SAndy Fiddaman777777777777777777777777777777777777777777777777777777777777777
413*b30d1939SAndy Fiddaman777777777777777777777777777777777777777777777777777777777777777
414*b30d1939SAndy Fiddaman777777777777777777777777777777777777777777777777777777777777777
415*b30d1939SAndy Fiddaman777777777777777777777777777777777777777777777777777777777777777
416*b30d1939SAndy Fiddaman777777777777777777777777777777777777777777777777777777777777777
417*b30d1939SAndy Fiddaman777777777777777777777777777777777777777777777777777777777777777
418*b30d1939SAndy Fiddaman777777777777777777777777777777777777777777777777777777777777777
419*b30d1939SAndy Fiddaman777777777777777777777777777777777777777777777777777777777777777
420*b30d1939SAndy Fiddaman777777777777777777777777777777777777777777777777777777777777777
421*b30d1939SAndy Fiddaman777777777777777777777777777777777777777777777777777777777777777
422*b30d1939SAndy Fiddaman777777777777777777777777777777777777777777777777777777777777777
423*b30d1939SAndy Fiddaman777777777777777777777777777777777777777777777777777777777777777
424*b30d1939SAndy Fiddaman777777777777777777777777777777777777777777777777777777777777777
425*b30d1939SAndy Fiddaman777777777777777777777777777777777777777777777777777777777777777
426*b30d1939SAndy Fiddaman777777777777777777777777777777777777777777777777777777777777 7
427*b30d1939SAndy Fiddaman
428*b30d1939SAndy Fiddaman8 34567890 $(t2 1234567890 ) 0123456789012345678901234567890123
429*b30d1939SAndy Fiddaman888888888888888888888888888888888888888888888888888888888888888
430*b30d1939SAndy Fiddaman888888888888888888888888888888888888888888888888888888888888888
431*b30d1939SAndy Fiddaman888888888888888888888888888888888888888888888888888888888888888
432*b30d1939SAndy Fiddaman888888888888888888888888888888888888888888888888888888888888888
433*b30d1939SAndy Fiddaman888888888888888888888888888888888888888888888888888888888888888
434*b30d1939SAndy Fiddaman888888888888888888888888888888888888888888888888888888888888888
435*b30d1939SAndy Fiddaman888888888888888888888888888888888888888888888888888888888888888
436*b30d1939SAndy Fiddaman888888888888888888888888888888888888888888888888888888888888888
437*b30d1939SAndy Fiddaman888888888888888888888888888888888888888888888888888888888888888
438*b30d1939SAndy Fiddaman888888888888888888888888888888888888888888888888888888888888888
439*b30d1939SAndy Fiddaman888888888888888888888888888888888888888888888888888888888888888
440*b30d1939SAndy Fiddaman888888888888888888888888888888888888888888888888888888888888888
441*b30d1939SAndy Fiddaman888888888888888888888888888888888888888888888888888888888888888
442*b30d1939SAndy Fiddaman888888888888888888888888888888888888888888888888888888888888888
443*b30d1939SAndy Fiddaman888888888888888888888888888888888888888888888888888888888888 8
444*b30d1939SAndy Fiddaman
445*b30d1939SAndy Fiddaman9 34567890 $(t2 1234567890 ) 0123456789012345678901234567890123
446*b30d1939SAndy Fiddaman999999999999999999999999999999999999999999999999999999999999999
447*b30d1939SAndy Fiddaman999999999999999999999999999999999999999999999999999999999999999
448*b30d1939SAndy Fiddaman999999999999999999999999999999999999999999999999999999999999999
449*b30d1939SAndy Fiddaman999999999999999999999999999999999999999999999999999999999999999
450*b30d1939SAndy Fiddaman999999999999999999999999999999999999999999999999999999999999999
451*b30d1939SAndy Fiddaman999999999999999999999999999999999999999999999999999999999999999
452*b30d1939SAndy Fiddaman999999999999999999999999999999999999999999999999999999999999999
453*b30d1939SAndy Fiddaman999999999999999999999999999999999999999999999999999999999999999
454*b30d1939SAndy Fiddaman999999999999999999999999999999999999999999999999999999999999999
455*b30d1939SAndy Fiddaman999999999999999999999999999999999999999999999999999999999999999
456*b30d1939SAndy Fiddaman999999999999999999999999999999999999999999999999999999999999999
457*b30d1939SAndy Fiddaman999999999999999999999999999999999999999999999999999999999999999
458*b30d1939SAndy Fiddaman999999999999999999999999999999999999999999999999999999999999999
459*b30d1939SAndy Fiddaman999999999999999999999999999999999999999999999999999999999999999
460*b30d1939SAndy Fiddaman999999999999999999999999999999999999999999999999999999999999 9
461*b30d1939SAndy Fiddaman
462*b30d1939SAndy Fiddaman10 4567890 $(t2 1234567890 ) 0123456789012345678901234567890123
463*b30d1939SAndy Fiddaman101010101010101010101010101010101010101010101010101010101010103
464*b30d1939SAndy Fiddaman101010101010101010101010101010101010101010101010101010101010103
465*b30d1939SAndy Fiddaman101010101010101010101010101010101010101010101010101010101010103
466*b30d1939SAndy Fiddaman101010101010101010101010101010101010101010101010101010101010103
467*b30d1939SAndy Fiddaman101010101010101010101010101010101010101010101010101010101010103
468*b30d1939SAndy Fiddaman101010101010101010101010101010101010101010101010101010101010103
469*b30d1939SAndy Fiddaman101010101010101010101010101010101010101010101010101010101010103
470*b30d1939SAndy Fiddaman101010101010101010101010101010101010101010101010101010101010103
471*b30d1939SAndy Fiddaman101010101010101010101010101010101010101010101010101010101010103
472*b30d1939SAndy Fiddaman101010101010101010101010101010101010101010101010101010101010103
473*b30d1939SAndy Fiddaman101010101010101010101010101010101010101010101010101010101010103
474*b30d1939SAndy Fiddaman101010101010101010101010101010101010101010101010101010101010103
475*b30d1939SAndy Fiddaman101010101010101010101010101010101010101010101010101010101010103
476*b30d1939SAndy Fiddaman101010101010101010101010101010101010101010101010101010101010103
477*b30d1939SAndy Fiddaman1010101010101010101010101010101010101010101010101010101010 END
478*b30d1939SAndy Fiddaman
479*b30d1939SAndy FiddamanEOF
480*b30d1939SAndy Fiddaman}
481*b30d1939SAndy Fiddaman[[ ${#foo} == 10238 ]] || err_exit 'large here docs containing command subs of dynamically loaded functions fails'
482*b30d1939SAndy Fiddaman
483*b30d1939SAndy Fiddaman{
484*b30d1939SAndy Fiddaman     print $'FOO=1\nBAR=foobarbaz'
485*b30d1939SAndy Fiddaman     print -- 'cat <<#EOF'
486*b30d1939SAndy Fiddaman     integer i
487*b30d1939SAndy Fiddaman     for ((i=0; i < 50000; i++))
488*b30d1939SAndy Fiddaman     do print -r -- '    $(($FOO + 1))'
489*b30d1939SAndy Fiddaman      print -r -- '    $BAR meep'
490*b30d1939SAndy Fiddaman     done
491*b30d1939SAndy Fiddaman     print EOF
492*b30d1939SAndy Fiddaman} > $f
493*b30d1939SAndy Fiddaman$SHELL $f > $g
494*b30d1939SAndy Fiddaman[[ $(grep meep $g | grep -v foobar) != '' ]] && err_exit 'here-doc loosing $var expansions on boundaries in rare cases'
495*b30d1939SAndy Fiddaman
496*b30d1939SAndy Fiddamanprint foo > $tmp/foofile
497*b30d1939SAndy Fiddamanx=$( $SHELL 2> /dev/null 'read <<< $(<'"$tmp"'/foofile) 2> /dev/null;print -r "$REPLY"')
498*b30d1939SAndy Fiddaman[[ $x == foo ]] || err_exit '<<< $(<file) not working'
499*b30d1939SAndy Fiddaman
500*b30d1939SAndy Fiddamanexit $((Errors<125?Errors:125))
501