xref: /illumos-gate/usr/src/test/util-tests/tests/sed/bsd/multi_test.ksh (revision b15548ab7300ec8625be47442fd92b71ed91c2cd)
1cd94aa94SAndy Fiddaman#!/bin/ksh -p
2cd94aa94SAndy Fiddaman#
3cd94aa94SAndy Fiddaman# Copyright (c) 1992 Diomidis Spinellis.
4cd94aa94SAndy Fiddaman# Copyright (c) 1992, 1993
5cd94aa94SAndy Fiddaman#	The Regents of the University of California.  All rights reserved.
6cd94aa94SAndy Fiddaman#
7cd94aa94SAndy Fiddaman# Redistribution and use in source and binary forms, with or without
8cd94aa94SAndy Fiddaman# modification, are permitted provided that the following conditions
9cd94aa94SAndy Fiddaman# are met:
10cd94aa94SAndy Fiddaman# 1. Redistributions of source code must retain the above copyright
11cd94aa94SAndy Fiddaman#    notice, this list of conditions and the following disclaimer.
12cd94aa94SAndy Fiddaman# 2. Redistributions in binary form must reproduce the above copyright
13cd94aa94SAndy Fiddaman#    notice, this list of conditions and the following disclaimer in the
14cd94aa94SAndy Fiddaman#    documentation and/or other materials provided with the distribution.
15cd94aa94SAndy Fiddaman# 3. Neither the name of the University nor the names of its contributors
16cd94aa94SAndy Fiddaman#    may be used to endorse or promote products derived from this software
17cd94aa94SAndy Fiddaman#    without specific prior written permission.
18cd94aa94SAndy Fiddaman#
19cd94aa94SAndy Fiddaman# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20cd94aa94SAndy Fiddaman# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21cd94aa94SAndy Fiddaman# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22cd94aa94SAndy Fiddaman# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23cd94aa94SAndy Fiddaman# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24cd94aa94SAndy Fiddaman# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25cd94aa94SAndy Fiddaman# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26cd94aa94SAndy Fiddaman# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27cd94aa94SAndy Fiddaman# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28cd94aa94SAndy Fiddaman# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29cd94aa94SAndy Fiddaman# SUCH DAMAGE.
30cd94aa94SAndy Fiddaman#
31cd94aa94SAndy Fiddaman#	@(#)sed.test	8.1 (Berkeley) 6/6/93
32cd94aa94SAndy Fiddaman#
33cd94aa94SAndy Fiddaman#	$FreeBSD$
34cd94aa94SAndy Fiddaman#
35cd94aa94SAndy Fiddaman
36cd94aa94SAndy Fiddaman# sed Regression Tests
37cd94aa94SAndy Fiddaman#
38cd94aa94SAndy Fiddaman# The directory regress.test.out contains the expected test results
39cd94aa94SAndy Fiddaman#
40cd94aa94SAndy Fiddaman# These are the regression tests mostly created during the development
41cd94aa94SAndy Fiddaman# of the BSD sed.  Each test should have a unique mark name, which is
42cd94aa94SAndy Fiddaman# used for naming the corresponding file in regress.multitest.out.
43cd94aa94SAndy Fiddaman
44cd94aa94SAndy FiddamanSRCDIR=$(dirname $0)
45cd94aa94SAndy Fiddaman
46cd94aa94SAndy FiddamanSED=${SED:=/usr/bin/sed}
47cd94aa94SAndy Fiddaman
48*b15548abSRobert Mustacchi#
49*b15548abSRobert Mustacchi# Sanitize the environment so we're able to operate with known good
50*b15548abSRobert Mustacchi# defaults. Note, tests such as 7.1 require that we're in the C locale.
51*b15548abSRobert Mustacchi#
52*b15548abSRobert Mustacchiunalias -a
53*b15548abSRobert Mustacchiexport LANG=C
54*b15548abSRobert Mustacchi
55cd94aa94SAndy Fiddamantypeset -i err=0
56cd94aa94SAndy Fiddamantypeset -i pass=0
57cd94aa94SAndy Fiddamantypeset -i fail=0
58cd94aa94SAndy Fiddaman
59cd94aa94SAndy Fiddamanfatal() {
60cd94aa94SAndy Fiddaman	echo "[FATAL] $*" > /dev/stderr
61cd94aa94SAndy Fiddaman	exit 1
62cd94aa94SAndy Fiddaman}
63cd94aa94SAndy Fiddaman
64cd94aa94SAndy Fiddamanmain()
65cd94aa94SAndy Fiddaman{
66cd94aa94SAndy Fiddaman	REGRESS=${SRCDIR}/regress.multitest.out
67cd94aa94SAndy Fiddaman	[[ -d $REGRESS ]] || fatal "Could not locate regress directory"
68cd94aa94SAndy Fiddaman
69cd94aa94SAndy Fiddaman	DICT=/usr/share/lib/dict/words
70cd94aa94SAndy Fiddaman	[[ -r $DICT ]] || fatal "Coult not read dictionary $DICT"
71cd94aa94SAndy Fiddaman
72cd94aa94SAndy Fiddaman	OPDIR=$(mktemp -d)
73cd94aa94SAndy Fiddaman	[[ -n "$OPDIR" && -d "$OPDIR" ]] || \
74cd94aa94SAndy Fiddaman	    fatal "Could not create output directory"
75cd94aa94SAndy Fiddaman
76cd94aa94SAndy Fiddaman	awk 'END { for (i = 1; i < 15; i++) print "l1_" i}' \
77cd94aa94SAndy Fiddaman	    </dev/null >$OPDIR/lines1
78cd94aa94SAndy Fiddaman	awk 'END { for (i = 1; i < 10; i++) print "l2_" i}' \
79cd94aa94SAndy Fiddaman	    </dev/null >$OPDIR/lines2
80cd94aa94SAndy Fiddaman	[[ -s $OPDIR/lines1 && -s $OPDIR/lines2 ]] || \
81cd94aa94SAndy Fiddaman	    fatal "Could not seed lines files"
82cd94aa94SAndy Fiddaman
83cd94aa94SAndy Fiddaman	lines1=$OPDIR/lines1
84cd94aa94SAndy Fiddaman	lines2=$OPDIR/lines2
85cd94aa94SAndy Fiddaman	lines3=$OPDIR/lines3
86cd94aa94SAndy Fiddaman	lines4=$OPDIR/lines4
87cd94aa94SAndy Fiddaman	script1=$OPDIR/script1
88cd94aa94SAndy Fiddaman	script2=$OPDIR/script2
89cd94aa94SAndy Fiddaman
90cd94aa94SAndy Fiddaman	exec 4>&1 5>&2
91cd94aa94SAndy Fiddaman	tests
92cd94aa94SAndy Fiddaman	exec 1>&4 2>&5
93cd94aa94SAndy Fiddaman
94cd94aa94SAndy Fiddaman	# Remove temporary files
95cd94aa94SAndy Fiddaman	rm -rf $OPDIR/
96cd94aa94SAndy Fiddaman}
97cd94aa94SAndy Fiddaman
98cd94aa94SAndy Fiddamantests()
99cd94aa94SAndy Fiddaman{
100cd94aa94SAndy Fiddaman	MARK=0
101cd94aa94SAndy Fiddaman
102cd94aa94SAndy Fiddaman	test_args
103cd94aa94SAndy Fiddaman	test_addr
104cd94aa94SAndy Fiddaman	test_group
105cd94aa94SAndy Fiddaman	test_acid
106cd94aa94SAndy Fiddaman	test_branch
107cd94aa94SAndy Fiddaman	test_pattern
108cd94aa94SAndy Fiddaman	test_print
109cd94aa94SAndy Fiddaman	test_subst
110cd94aa94SAndy Fiddaman	test_error
111cd94aa94SAndy Fiddaman	# Handle the result of the last test
112cd94aa94SAndy Fiddaman	result
113cd94aa94SAndy Fiddaman}
114cd94aa94SAndy Fiddaman
115cd94aa94SAndy Fiddaman# Display a test's result
116cd94aa94SAndy Fiddamanresult()
117cd94aa94SAndy Fiddaman{
118cd94aa94SAndy Fiddaman	if [ "$TODO" = '1' ] ; then
119cd94aa94SAndy Fiddaman		TODO='TODO '
120cd94aa94SAndy Fiddaman	else
121cd94aa94SAndy Fiddaman		TODO=''
122cd94aa94SAndy Fiddaman	fi
123cd94aa94SAndy Fiddaman	if ! [ -r $REGRESS/${TESTNAME} ] ; then
124cd94aa94SAndy Fiddaman		echo "Seeding $REGRESS/${TESTNAME} with current result" 1>&2
125cd94aa94SAndy Fiddaman		cp $OPDIR/current.out $REGRESS/${TESTNAME}
126cd94aa94SAndy Fiddaman	fi
127cd94aa94SAndy Fiddaman	if cmp -s $REGRESS/${TESTNAME} $OPDIR/current.out ; then
128cd94aa94SAndy Fiddaman		echo "[PASS] $MARK $TESTNAME # $TODO$OCOMMENT"
129cd94aa94SAndy Fiddaman		((pass++))
130cd94aa94SAndy Fiddaman	else
131cd94aa94SAndy Fiddaman		echo "[FAIL] $MARK $TESTNAME # $TODO$OCOMMENT"
132cd94aa94SAndy Fiddaman		if [[ -z "$TODO" ]]; then
133cd94aa94SAndy Fiddaman			diff -u $REGRESS/${TESTNAME} $OPDIR/current.out
134cd94aa94SAndy Fiddaman			((fail++))
135cd94aa94SAndy Fiddaman			err=1
136cd94aa94SAndy Fiddaman		fi
137cd94aa94SAndy Fiddaman	fi 1>&4 2>&5
138cd94aa94SAndy Fiddaman}
139cd94aa94SAndy Fiddaman
140cd94aa94SAndy Fiddaman# Mark the beginning of each test
141cd94aa94SAndy Fiddamanmark()
142cd94aa94SAndy Fiddaman{
143cd94aa94SAndy Fiddaman	[ $MARK -gt 0 ] && result
144cd94aa94SAndy Fiddaman	OCOMMENT=$COMMENT
145cd94aa94SAndy Fiddaman	MARK=`expr $MARK + 1`
146cd94aa94SAndy Fiddaman	TESTNAME=$1
147cd94aa94SAndy Fiddaman	exec 1>&4 2>&5
148cd94aa94SAndy Fiddaman	exec >"$OPDIR/current.out"
149cd94aa94SAndy Fiddaman}
150cd94aa94SAndy Fiddaman
151cd94aa94SAndy Fiddamantest_args()
152cd94aa94SAndy Fiddaman{
153cd94aa94SAndy Fiddaman	COMMENT='Argument parsing - first type'
154cd94aa94SAndy Fiddaman	mark '1.1'
155cd94aa94SAndy Fiddaman	$SED 's/^/e1_/p' $lines1
156cd94aa94SAndy Fiddaman	mark '1.2' ; $SED -n 's/^/e1_/p' $lines1
157cd94aa94SAndy Fiddaman	mark '1.3'
158cd94aa94SAndy Fiddaman	$SED 's/^/e1_/p' <$lines1
159cd94aa94SAndy Fiddaman	mark '1.4' ; $SED -n 's/^/e1_/p' <$lines1
160cd94aa94SAndy Fiddaman	COMMENT='Argument parsing - second type'
161cd94aa94SAndy Fiddaman	mark '1.4.1'
162cd94aa94SAndy Fiddaman	$SED -e '' <$lines1
163cd94aa94SAndy Fiddaman	echo 's/^/s1_/p' >$script1
164cd94aa94SAndy Fiddaman	echo 's/^/s2_/p' >$script2
165cd94aa94SAndy Fiddaman	mark '1.5'
166cd94aa94SAndy Fiddaman	$SED -f $script1 $lines1
167cd94aa94SAndy Fiddaman	mark '1.6'
168cd94aa94SAndy Fiddaman	$SED -f $script1 <$lines1
169cd94aa94SAndy Fiddaman	mark '1.7'
170cd94aa94SAndy Fiddaman	$SED -e 's/^/e1_/p' $lines1
171cd94aa94SAndy Fiddaman	mark '1.8'
172cd94aa94SAndy Fiddaman	$SED -e 's/^/e1_/p' <$lines1
173cd94aa94SAndy Fiddaman	mark '1.9' ; $SED -n -f $script1 $lines1
174cd94aa94SAndy Fiddaman	mark '1.10' ; $SED -n -f $script1 <$lines1
175cd94aa94SAndy Fiddaman	mark '1.11' ; $SED -n -e 's/^/e1_/p' $lines1
176cd94aa94SAndy Fiddaman	mark '1.12'
177cd94aa94SAndy Fiddaman	$SED -n -e 's/^/e1_/p' <$lines1
178cd94aa94SAndy Fiddaman	mark '1.13'
179cd94aa94SAndy Fiddaman	$SED -e 's/^/e1_/p' -e 's/^/e2_/p' $lines1
180cd94aa94SAndy Fiddaman	mark '1.14'
181cd94aa94SAndy Fiddaman	$SED -f $script1 -f $script2 $lines1
182cd94aa94SAndy Fiddaman	mark '1.15'
183cd94aa94SAndy Fiddaman	$SED -e 's/^/e1_/p' -f $script1 $lines1
184cd94aa94SAndy Fiddaman	mark '1.16'
185cd94aa94SAndy Fiddaman	$SED -e 's/^/e1_/p' $lines1 $lines1
186cd94aa94SAndy Fiddaman	# POSIX D11.2:11251
187cd94aa94SAndy Fiddaman	mark '1.17' ; $SED p <$lines1 $lines1
188cd94aa94SAndy Fiddamancat >$script1 <<EOF
189cd94aa94SAndy Fiddaman#n
190cd94aa94SAndy Fiddaman# A comment
191cd94aa94SAndy Fiddaman
192cd94aa94SAndy Fiddamanp
193cd94aa94SAndy FiddamanEOF
194cd94aa94SAndy Fiddaman	mark '1.18' ; $SED -f $script1 <$lines1 $lines1
195cd94aa94SAndy Fiddaman}
196cd94aa94SAndy Fiddaman
197cd94aa94SAndy Fiddamantest_addr()
198cd94aa94SAndy Fiddaman{
199cd94aa94SAndy Fiddaman	COMMENT='Address ranges'
200cd94aa94SAndy Fiddaman	mark '2.1' ; $SED -n -e '4p' $lines1
201cd94aa94SAndy Fiddaman	mark '2.2' ; $SED -n -e '20p' $lines1 $lines2
202cd94aa94SAndy Fiddaman	mark '2.3' ; $SED -n -e '$p' $lines1
203cd94aa94SAndy Fiddaman	mark '2.4' ; $SED -n -e '$p' $lines1 $lines2
204cd94aa94SAndy Fiddaman	mark '2.5' ; $SED -n -e '$a\
205cd94aa94SAndy Fiddamanhello' /dev/null
206cd94aa94SAndy Fiddaman	mark '2.6' ; $SED -n -e '$p' $lines1 /dev/null $lines2
207cd94aa94SAndy Fiddaman	# Should not print anything
208cd94aa94SAndy Fiddaman	mark '2.7' ; $SED -n -e '20p' $lines1
209cd94aa94SAndy Fiddaman	mark '2.8' ; $SED -n -e '/NOTFOUND/p' $lines1
210cd94aa94SAndy Fiddaman	mark '2.9' ; $SED -n '/l1_7/p' $lines1
211cd94aa94SAndy Fiddaman	mark '2.10' ; $SED -n ' /l1_7/ p' $lines1
212cd94aa94SAndy Fiddaman	mark '2.11' ; $SED -n '\_l1\_7_p' $lines1
213cd94aa94SAndy Fiddaman	mark '2.12' ; $SED -n '1,4p' $lines1
214cd94aa94SAndy Fiddaman	mark '2.13' ; $SED -n '1,$p' $lines1 $lines2
215cd94aa94SAndy Fiddaman	mark '2.14' ; $SED -n '1,/l2_9/p' $lines1 $lines2
216cd94aa94SAndy Fiddaman	mark '2.15' ; $SED -n '/4/,$p' $lines1 $lines2
217cd94aa94SAndy Fiddaman	mark '2.16' ; $SED -n '/4/,20p' $lines1 $lines2
218cd94aa94SAndy Fiddaman	mark '2.17' ; $SED -n '/4/,/10/p' $lines1 $lines2
219cd94aa94SAndy Fiddaman	mark '2.18' ; $SED -n '/l2_3/,/l1_8/p' $lines1 $lines2
220cd94aa94SAndy Fiddaman	mark '2.19' ; $SED -n '12,3p' $lines1 $lines2
221cd94aa94SAndy Fiddaman	mark '2.20' ; $SED -n '/l1_7/,3p' $lines1 $lines2
222cd94aa94SAndy Fiddaman	mark '2.21' ; $SED -n '13,+4p' $lines1 $lines2
223cd94aa94SAndy Fiddaman	mark '2.22' ; $SED -n '/l1_6/,+2p' $lines1 $lines2
224cd94aa94SAndy Fiddaman	# For PR bin/192108
225cd94aa94SAndy Fiddaman	mark '2.23'; $SED -n '12,+1p' $lines1
226cd94aa94SAndy Fiddaman}
227cd94aa94SAndy Fiddaman
228cd94aa94SAndy Fiddamantest_group()
229cd94aa94SAndy Fiddaman{
230cd94aa94SAndy Fiddaman	COMMENT='Brace and other grouping'
231cd94aa94SAndy Fiddaman	mark '3.1' ; $SED -e '
232cd94aa94SAndy Fiddaman4,12 {
233cd94aa94SAndy Fiddaman	s/^/^/
234cd94aa94SAndy Fiddaman	s/$/$/
235cd94aa94SAndy Fiddaman	s/_/T/
236cd94aa94SAndy Fiddaman}' $lines1
237cd94aa94SAndy Fiddaman	mark '3.2' ; $SED -e '
238cd94aa94SAndy Fiddaman4,12 {
239cd94aa94SAndy Fiddaman	s/^/^/
240cd94aa94SAndy Fiddaman	/6/,/10/ {
241cd94aa94SAndy Fiddaman		s/$/$/
242cd94aa94SAndy Fiddaman		/8/ s/_/T/
243cd94aa94SAndy Fiddaman	}
244cd94aa94SAndy Fiddaman}' $lines1
245cd94aa94SAndy Fiddaman	mark '3.3' ; $SED -e '
246cd94aa94SAndy Fiddaman4,12 !{
247cd94aa94SAndy Fiddaman	s/^/^/
248cd94aa94SAndy Fiddaman	/6/,/10/ !{
249cd94aa94SAndy Fiddaman		s/$/$/
250cd94aa94SAndy Fiddaman		/8/ !s/_/T/
251cd94aa94SAndy Fiddaman	}
252cd94aa94SAndy Fiddaman}' $lines1
253cd94aa94SAndy Fiddaman	mark '3.4' ; $SED -e '4,12!s/^/^/' $lines1
254cd94aa94SAndy Fiddaman}
255cd94aa94SAndy Fiddaman
256cd94aa94SAndy Fiddamantest_acid()
257cd94aa94SAndy Fiddaman{
258cd94aa94SAndy Fiddaman	COMMENT='Commands a c d and i'
259cd94aa94SAndy Fiddaman	mark '4.1' ; $SED -n -e '
260cd94aa94SAndy Fiddamans/^/before_i/p
261cd94aa94SAndy Fiddaman20i\
262cd94aa94SAndy Fiddamaninserted
263cd94aa94SAndy Fiddamans/^/after_i/p
264cd94aa94SAndy Fiddaman' $lines1 $lines2
265cd94aa94SAndy Fiddaman	mark '4.2' ; $SED -n -e '
266cd94aa94SAndy Fiddaman5,12s/^/5-12/
267cd94aa94SAndy Fiddamans/^/before_a/p
268cd94aa94SAndy Fiddaman/5-12/a\
269cd94aa94SAndy Fiddamanappended
270cd94aa94SAndy Fiddamans/^/after_a/p
271cd94aa94SAndy Fiddaman' $lines1 $lines2
272cd94aa94SAndy Fiddaman	mark '4.3'
273cd94aa94SAndy Fiddaman	$SED -n -e '
274cd94aa94SAndy Fiddamans/^/^/p
275cd94aa94SAndy Fiddaman/l1_/a\
276cd94aa94SAndy Fiddamanappended
277cd94aa94SAndy Fiddaman8,10N
278cd94aa94SAndy Fiddamans/$/$/p
279cd94aa94SAndy Fiddaman' $lines1 $lines2
280cd94aa94SAndy Fiddaman	mark '4.4' ; $SED -n -e '
281cd94aa94SAndy Fiddamanc\
282cd94aa94SAndy Fiddamanhello
283cd94aa94SAndy Fiddaman' $lines1
284cd94aa94SAndy Fiddaman	mark '4.5' ; $SED -n -e '
285cd94aa94SAndy Fiddaman8c\
286cd94aa94SAndy Fiddamanhello
287cd94aa94SAndy Fiddaman' $lines1
288cd94aa94SAndy Fiddaman	mark '4.6' ; $SED -n -e '
289cd94aa94SAndy Fiddaman3,14c\
290cd94aa94SAndy Fiddamanhello
291cd94aa94SAndy Fiddaman' $lines1
292cd94aa94SAndy Fiddaman# SunOS and GNU sed behave differently.   We follow POSIX
293cd94aa94SAndy Fiddaman	mark '4.7' ; $SED -n -e '
294cd94aa94SAndy Fiddaman8,3c\
295cd94aa94SAndy Fiddamanhello
296cd94aa94SAndy Fiddaman' $lines1
297cd94aa94SAndy Fiddaman	mark '4.8' ; $SED d <$lines1
298cd94aa94SAndy Fiddaman}
299cd94aa94SAndy Fiddaman
300cd94aa94SAndy Fiddamantest_branch()
301cd94aa94SAndy Fiddaman{
302cd94aa94SAndy Fiddaman	COMMENT='Labels and branching'
303cd94aa94SAndy Fiddaman	mark '5.1' ; $SED -n -e '
304cd94aa94SAndy Fiddamanb label4
305cd94aa94SAndy Fiddaman:label3
306cd94aa94SAndy Fiddamans/^/label3_/p
307cd94aa94SAndy Fiddamanb end
308cd94aa94SAndy Fiddaman:label4
309cd94aa94SAndy Fiddaman2,12b label1
310cd94aa94SAndy Fiddamanb label2
311cd94aa94SAndy Fiddaman:label1
312cd94aa94SAndy Fiddamans/^/label1_/p
313cd94aa94SAndy Fiddamanb
314cd94aa94SAndy Fiddaman:label2
315cd94aa94SAndy Fiddamans/^/label2_/p
316cd94aa94SAndy Fiddamanb label3
317cd94aa94SAndy Fiddaman:end
318cd94aa94SAndy Fiddaman' $lines1
319cd94aa94SAndy Fiddaman	mark '5.2'
320cd94aa94SAndy Fiddaman	$SED -n -e '
321cd94aa94SAndy Fiddamans/l1_/l2_/
322cd94aa94SAndy Fiddamant ok
323cd94aa94SAndy Fiddamanb
324cd94aa94SAndy Fiddaman:ok
325cd94aa94SAndy Fiddamans/^/tested /p
326cd94aa94SAndy Fiddaman' $lines1 $lines2
327cd94aa94SAndy Fiddaman# SunOS and GNU sed behave as follows: lines 9-$ aren't printed at all
328cd94aa94SAndy Fiddaman	mark '5.3' ; $SED -n -e '
329cd94aa94SAndy Fiddaman5,8b inside
330cd94aa94SAndy Fiddaman1,5 {
331cd94aa94SAndy Fiddaman	s/^/^/p
332cd94aa94SAndy Fiddaman	:inside
333cd94aa94SAndy Fiddaman	s/$/$/p
334cd94aa94SAndy Fiddaman}
335cd94aa94SAndy Fiddaman' $lines1
336cd94aa94SAndy Fiddaman# Check that t clears the substitution done flag
337cd94aa94SAndy Fiddaman	mark '5.4' ; $SED -n -e '
338cd94aa94SAndy Fiddaman1,8s/^/^/
339cd94aa94SAndy Fiddamant l1
340cd94aa94SAndy Fiddaman:l1
341cd94aa94SAndy Fiddamant l2
342cd94aa94SAndy Fiddamans/$/$/p
343cd94aa94SAndy Fiddamanb
344cd94aa94SAndy Fiddaman:l2
345cd94aa94SAndy Fiddamans/^/ERROR/
346cd94aa94SAndy Fiddaman' $lines1
347cd94aa94SAndy Fiddaman# Check that reading a line clears the substitution done flag
348cd94aa94SAndy Fiddaman	mark '5.5'
349cd94aa94SAndy Fiddaman	$SED -n -e '
350cd94aa94SAndy Fiddamant l2
351cd94aa94SAndy Fiddaman1,8s/^/^/p
352cd94aa94SAndy Fiddaman2,7N
353cd94aa94SAndy Fiddamanb
354cd94aa94SAndy Fiddaman:l2
355cd94aa94SAndy Fiddamans/^/ERROR/p
356cd94aa94SAndy Fiddaman' $lines1
357cd94aa94SAndy Fiddaman	mark '5.6' ; $SED 5q $lines1
358cd94aa94SAndy Fiddaman	mark '5.7' ; $SED -e '
359cd94aa94SAndy Fiddaman5i\
360cd94aa94SAndy Fiddamanhello
361cd94aa94SAndy Fiddaman5q' $lines1
362cd94aa94SAndy Fiddaman# Branch across block boundary
363cd94aa94SAndy Fiddaman	mark '5.8' ; $SED -e '
364cd94aa94SAndy Fiddaman{
365cd94aa94SAndy Fiddaman:b
366cd94aa94SAndy Fiddaman}
367cd94aa94SAndy Fiddamans/l/m/
368cd94aa94SAndy Fiddamantb' $lines1
369cd94aa94SAndy Fiddaman}
370cd94aa94SAndy Fiddaman
371cd94aa94SAndy Fiddamantest_pattern()
372cd94aa94SAndy Fiddaman{
373cd94aa94SAndy FiddamanCOMMENT='Pattern space commands'
374cd94aa94SAndy Fiddaman# Check that the pattern space is deleted
375cd94aa94SAndy Fiddaman	mark '6.1' ; $SED -n -e '
376cd94aa94SAndy Fiddamanc\
377cd94aa94SAndy Fiddamanchanged
378cd94aa94SAndy Fiddamanp
379cd94aa94SAndy Fiddaman' $lines1
380cd94aa94SAndy Fiddaman	mark '6.2' ; $SED -n -e '
381cd94aa94SAndy Fiddaman4d
382cd94aa94SAndy Fiddamanp
383cd94aa94SAndy Fiddaman' $lines1
384cd94aa94SAndy Fiddaman	mark '6.3'
385cd94aa94SAndy Fiddaman	$SED -e 'N;N;N;D' $lines1
386cd94aa94SAndy Fiddaman	mark '6.4' ; $SED -e '
387cd94aa94SAndy Fiddaman2h
388cd94aa94SAndy Fiddaman3H
389cd94aa94SAndy Fiddaman4g
390cd94aa94SAndy Fiddaman5G
391cd94aa94SAndy Fiddaman6x
392cd94aa94SAndy Fiddaman6p
393cd94aa94SAndy Fiddaman6x
394cd94aa94SAndy Fiddaman6p
395cd94aa94SAndy Fiddaman' $lines1
396cd94aa94SAndy Fiddaman	mark '6.5' ; $SED -e '4n' $lines1
397cd94aa94SAndy Fiddaman	mark '6.6' ; $SED -n -e '4n' $lines1
398cd94aa94SAndy Fiddaman}
399cd94aa94SAndy Fiddaman
400cd94aa94SAndy Fiddamantest_print()
401cd94aa94SAndy Fiddaman{
402cd94aa94SAndy Fiddaman	COMMENT='Print and file routines'
403cd94aa94SAndy Fiddaman	awk 'END {for (i = 1; i < 256; i++) printf("%c", i);print "\n"}' \
404cd94aa94SAndy Fiddaman		</dev/null >$lines3
405cd94aa94SAndy Fiddaman	# GNU and SunOS sed behave differently here
406cd94aa94SAndy Fiddaman	mark '7.1'
407cd94aa94SAndy Fiddaman	$SED -n l $lines3
408cd94aa94SAndy Fiddaman	mark '7.2' ; $SED -e '/l2_/=' $lines1 $lines2
409cd94aa94SAndy Fiddaman	rm -f $lines4
410cd94aa94SAndy Fiddaman	mark '7.3' ; $SED -e "3,12w $lines4" $lines1
411cd94aa94SAndy Fiddaman	COMMENT='w results'
412cd94aa94SAndy Fiddaman	cat $lines4
413cd94aa94SAndy Fiddaman	mark '7.4' ; $SED -e "4r $lines2" $lines1
414cd94aa94SAndy Fiddaman	mark '7.5' ; $SED -e '5r /dev/dds' $lines1
415cd94aa94SAndy Fiddaman	mark '7.6' ; $SED -e '6r /dev/null' $lines1
416cd94aa94SAndy Fiddaman	mark '7.7'
417cd94aa94SAndy Fiddaman	$SED '200q' $DICT | $SED 's$.*$s/^/&/w tmpdir/&$' >$script1
418cd94aa94SAndy Fiddaman	rm -rf tmpdir
419cd94aa94SAndy Fiddaman	mkdir tmpdir
420cd94aa94SAndy Fiddaman	$SED -f $script1 $lines1
421cd94aa94SAndy Fiddaman	cat tmpdir/*
422cd94aa94SAndy Fiddaman	rm -rf tmpdir
423cd94aa94SAndy Fiddaman	mark '7.8'
424cd94aa94SAndy Fiddaman	echo line1 > $lines3
425cd94aa94SAndy Fiddaman	echo "" >> $lines3
426cd94aa94SAndy Fiddaman	$SED -n -e '$p' $lines3 /dev/null
427cd94aa94SAndy Fiddaman
428cd94aa94SAndy Fiddaman}
429cd94aa94SAndy Fiddaman
430cd94aa94SAndy Fiddamantest_subst()
431cd94aa94SAndy Fiddaman{
432cd94aa94SAndy Fiddaman	COMMENT='Substitution commands'
433cd94aa94SAndy Fiddaman	mark '8.1' ; $SED -e 's/./X/g' $lines1
434cd94aa94SAndy Fiddaman	mark '8.2' ; $SED -e 's,.,X,g' $lines1
435cd94aa94SAndy Fiddaman# SunOS sed thinks we are escaping . as wildcard, not as separator
436cd94aa94SAndy Fiddaman	mark '8.3'
437cd94aa94SAndy Fiddaman	$SED -e 's.\..X.g' $lines1
438cd94aa94SAndy Fiddaman	mark '8.4' ; $SED -e 's/[\/]/Q/' $lines1
439cd94aa94SAndy Fiddaman	mark '8.5' ; $SED -e 's_\__X_' $lines1
440cd94aa94SAndy Fiddaman	mark '8.6' ; $SED -e 's/./(&)/g' $lines1
441cd94aa94SAndy Fiddaman	mark '8.7' ; $SED -e 's/./(\&)/g' $lines1
442cd94aa94SAndy Fiddaman	mark '8.8' ; $SED -e 's/\(.\)\(.\)\(.\)/x\3x\2x\1/g' $lines1
443cd94aa94SAndy Fiddaman	mark '8.9' ; $SED -e 's/_/u0\
444cd94aa94SAndy Fiddamanu1\
445cd94aa94SAndy Fiddamanu2/g' $lines1
446cd94aa94SAndy Fiddaman	mark '8.10'
447cd94aa94SAndy Fiddaman	$SED -e 's/./X/4' $lines1
448cd94aa94SAndy Fiddaman	rm -f $lines4
449cd94aa94SAndy Fiddaman	mark '8.11' ; $SED -e "s/1/X/w $lines4" $lines1
450cd94aa94SAndy Fiddaman	COMMENT='s wfile results'
451cd94aa94SAndy Fiddaman	cat $lines4
452cd94aa94SAndy Fiddaman	mark '8.12' ; $SED -e 's/[123]/X/g' $lines1
453cd94aa94SAndy Fiddaman	mark '8.13' ; $SED -e 'y/0123456789/9876543210/' $lines1
454cd94aa94SAndy Fiddaman	mark '8.14' ;
455cd94aa94SAndy Fiddaman	$SED -e 'y10\123456789198765432\101' $lines1
456cd94aa94SAndy Fiddaman	mark '8.15' ; $SED -e '1N;2y/\n/X/' $lines1
457cd94aa94SAndy Fiddaman	mark '8.16'
458cd94aa94SAndy Fiddaman	echo 'eeefff' | $SED -e '
459cd94aa94SAndy Fiddaman		p
460cd94aa94SAndy Fiddaman		s/e/X/p
461cd94aa94SAndy Fiddaman		:x
462cd94aa94SAndy Fiddaman		s//Y/p
463cd94aa94SAndy Fiddaman		# Establish limit counter in the hold space
464cd94aa94SAndy Fiddaman		# GNU sed version 3.02 enters into an infinite loop here
465cd94aa94SAndy Fiddaman		x
466cd94aa94SAndy Fiddaman		/.\{10\}/ {
467cd94aa94SAndy Fiddaman			s/.*/ERROR/
468cd94aa94SAndy Fiddaman			b
469cd94aa94SAndy Fiddaman		}
470cd94aa94SAndy Fiddaman		s/.*/&./
471cd94aa94SAndy Fiddaman		x
472cd94aa94SAndy Fiddaman		/f/bx
473cd94aa94SAndy Fiddaman	'
474cd94aa94SAndy Fiddaman	# POSIX does not say that this should work,
475cd94aa94SAndy Fiddaman	# but it does for GNU, BSD, and SunOS
476cd94aa94SAndy Fiddaman	mark '8.17' ; $SED -e 's/[/]/Q/' $lines1
477cd94aa94SAndy Fiddaman
478cd94aa94SAndy Fiddaman	COMMENT='[ as an s delimiter and its escapes'
479cd94aa94SAndy Fiddaman	mark '8.18' ; $SED -e 's[_[X[' $lines1
480cd94aa94SAndy Fiddaman	# This is a matter of interpretation
481cd94aa94SAndy Fiddaman	# POSIX 1003.1, 2004 says "Within the BRE and the replacement,
482cd94aa94SAndy Fiddaman	# the BRE delimiter itself can be used as a *literal* character
483cd94aa94SAndy Fiddaman	# if it is preceded by a backslash"
484cd94aa94SAndy Fiddaman	# SunOS 5.1 /usr/bin/sed and Mac OS X follow the literal POSIX
485cd94aa94SAndy Fiddaman	# interpretation.
486cd94aa94SAndy Fiddaman	# GNU sed version 4.1.5 treats \[ as the beginning of a character
487cd94aa94SAndy Fiddaman	# set specification (both with --posix and without).
488cd94aa94SAndy Fiddaman	mark '8.19' ; $SED 's/l/[/' $lines1 | $SED -e 's[\[.[X['
489cd94aa94SAndy Fiddaman	mark '8.20' ; $SED 's/l/[/' $lines1 | $SED -e 's[\[.[X\[['
490cd94aa94SAndy Fiddaman	COMMENT='\\ in y command'
491cd94aa94SAndy Fiddaman	mark '8.21'
492cd94aa94SAndy Fiddaman	echo 'a\\b(c' | \
493cd94aa94SAndy Fiddaman	$SED 'y%ABCDEFGHIJKLMNOPQRSTUVWXYZ, /\\()"%abcdefghijklmnopqrstuvwxyz,------%'
494cd94aa94SAndy Fiddaman	COMMENT='\\n in a character class'
495cd94aa94SAndy Fiddaman	mark '8.22' ; (echo 1; echo 2) | $SED -n '1{;N;s/[\n]/X/;p;}'
496cd94aa94SAndy Fiddaman	COMMENT='\\n in a BRE'
497cd94aa94SAndy Fiddaman	mark '8.23' ; (echo 1; echo 2) | $SED -n '1{;N;s/\n/X/;p;}'
498cd94aa94SAndy Fiddaman}
499cd94aa94SAndy Fiddaman
500cd94aa94SAndy Fiddamantest_error()
501cd94aa94SAndy Fiddaman{
502cd94aa94SAndy Fiddaman	COMMENT='Error cases'
503cd94aa94SAndy Fiddaman	mark '9.1' ; $SED -x 2>/dev/null ; echo $?
504cd94aa94SAndy Fiddaman	mark '9.2' ; $SED -f 2>/dev/null ; echo $?
505cd94aa94SAndy Fiddaman	mark '9.3' ; $SED -e 2>/dev/null ; echo $?
506cd94aa94SAndy Fiddaman	mark '9.4' ; $SED -f /dev/xyzzyxyzy 2>/dev/null ; echo $?
507cd94aa94SAndy Fiddaman	mark '9.5' ; $SED p /dev/xyzzyxyzy 2>/dev/null ; echo $?
508cd94aa94SAndy Fiddaman	mark '9.6' ; $SED -f /bin/sh 2>/dev/null ; echo $?
509cd94aa94SAndy Fiddaman	mark '9.7' ; $SED '{' 2>/dev/null ; echo $?
510cd94aa94SAndy Fiddaman	mark '9.8' ; $SED '{' 2>/dev/null ; echo $?
511cd94aa94SAndy Fiddaman	mark '9.9' ; $SED '/hello/' 2>/dev/null ; echo $?
512cd94aa94SAndy Fiddaman	mark '9.10' ; $SED '1,/hello/' 2>/dev/null ; echo $?
513cd94aa94SAndy Fiddaman	mark '9.11' ; $SED -e '-5p' 2>/dev/null ; echo $?
514cd94aa94SAndy Fiddaman	mark '9.12' ; $SED '/jj' 2>/dev/null ; echo $?
515cd94aa94SAndy Fiddaman	mark '9.13' ; $SED 'a hello' 2>/dev/null ; echo $?
516cd94aa94SAndy Fiddaman	mark '9.14' ; $SED 'a \ hello' 2>/dev/null ; echo $?
517cd94aa94SAndy Fiddaman	mark '9.15' ; $SED 'b foo' 2>/dev/null ; echo $?
518cd94aa94SAndy Fiddaman	mark '9.16' ; $SED 'd hello' 2>/dev/null ; echo $?
519cd94aa94SAndy Fiddaman	mark '9.17' ; $SED 's/aa' 2>/dev/null ; echo $?
520cd94aa94SAndy Fiddaman	mark '9.18' ; $SED 's/aa/' 2>/dev/null ; echo $?
521cd94aa94SAndy Fiddaman	mark '9.19' ; $SED 's/a/b' 2>/dev/null ; echo $?
522cd94aa94SAndy Fiddaman	mark '9.20' ; $SED 's/a/b/c/d' 2>/dev/null ; echo $?
523cd94aa94SAndy Fiddaman	mark '9.21' ; $SED 's/a/b/ 1 2' 2>/dev/null ; echo $?
524cd94aa94SAndy Fiddaman	mark '9.22' ; $SED 's/a/b/ 1 g' 2>/dev/null ; echo $?
525cd94aa94SAndy Fiddaman	mark '9.23' ; $SED 's/a/b/w' 2>/dev/null ; echo $?
526cd94aa94SAndy Fiddaman	mark '9.24' ; $SED 'y/aa' 2>/dev/null ; echo $?
527cd94aa94SAndy Fiddaman	mark '9.25' ; $SED 'y/aa/b/' 2>/dev/null ; echo $?
528cd94aa94SAndy Fiddaman	mark '9.26' ; $SED 'y/aa/' 2>/dev/null ; echo $?
529cd94aa94SAndy Fiddaman	mark '9.27' ; $SED 'y/a/b' 2>/dev/null ; echo $?
530cd94aa94SAndy Fiddaman	mark '9.28' ; $SED 'y/a/b/c/d' 2>/dev/null ; echo $?
531cd94aa94SAndy Fiddaman	mark '9.29' ; $SED '!' 2>/dev/null ; echo $?
532cd94aa94SAndy Fiddaman	mark '9.30' ; $SED supercalifrangolisticexprialidociussupercalifrangolisticexcius 2>/dev/null ; echo $?
533cd94aa94SAndy Fiddaman	mark '9.31' ; $SED '' /dev/null 2>/dev/null ; echo $?
534cd94aa94SAndy Fiddaman}
535cd94aa94SAndy Fiddaman
536cd94aa94SAndy Fiddamanmain
537cd94aa94SAndy Fiddamanecho "Pass/fail - $pass/$fail"
538cd94aa94SAndy Fiddamanexit $err
539