1e6d6c189SCody Peter Mello#!/bin/bash
2e6d6c189SCody Peter Mello
3e6d6c189SCody Peter Melloif [[ -z "$AWK" ]]; then
4e6d6c189SCody Peter Mello    printf '$AWK must be set\n' >&2
5e6d6c189SCody Peter Mello    exit 1
6e6d6c189SCody Peter Mellofi
7e6d6c189SCody Peter Mello
8e6d6c189SCody Peter Melloecho T.sub: tests of sub and gsub code
9e6d6c189SCody Peter Mello
10e6d6c189SCody Peter Mello# input lines are of form
11e6d6c189SCody Peter Mello#	pattern  replacement  input-string  sub-output  gsub-output
12e6d6c189SCody Peter Mello
13e6d6c189SCody Peter Mello$AWK '
14e6d6c189SCody Peter MelloBEGIN {
15e6d6c189SCody Peter Mello	FS = "\t"
16e6d6c189SCody Peter Mello	awk = ENVIRON["AWK"]
17e6d6c189SCody Peter Mello}
18e6d6c189SCody Peter MelloNF == 0		{ next }
19e6d6c189SCody Peter Mello$1 ~ /^#/	{ next }
20e6d6c189SCody Peter Mello
21e6d6c189SCody Peter Mello$1 != "" {	# new pattern
22e6d6c189SCody Peter Mello	pat = $1
23e6d6c189SCody Peter Mello}
24e6d6c189SCody Peter Mello$2 != "" {	# new replacement
25e6d6c189SCody Peter Mello	repl = $2
26e6d6c189SCody Peter Mello}
27e6d6c189SCody Peter Mello$3 != "" {	# new input string
28e6d6c189SCody Peter Mello	str = $3
29e6d6c189SCody Peter Mello}
30e6d6c189SCody Peter Mello$4 != "" {	# new sub output
31e6d6c189SCody Peter Mello	subout = $4
32e6d6c189SCody Peter Mello}
33e6d6c189SCody Peter Mello$5 != "" {	# new gsub output
34e6d6c189SCody Peter Mello	gsubout = $5
35e6d6c189SCody Peter Mello}
36e6d6c189SCody Peter MelloNF < 5 {	# weird input line
37e6d6c189SCody Peter Mello	printf("weird test spec `%s` ignored\n", $0) | "cat 1>&2"
38e6d6c189SCody Peter Mello	next
39e6d6c189SCody Peter Mello}
40e6d6c189SCody Peter Mello{		# "" => explicitly empty
41e6d6c189SCody Peter Mello	# printf(" %3d:   %s %s %s %s %s:\n", NR, pat, repl, str, subout, gsubout)
42e6d6c189SCody Peter Mello	if (pat == "\"\"") pat = ""
43e6d6c189SCody Peter Mello	if (repl == "\"\"") repl = ""
44e6d6c189SCody Peter Mello	if (str == "\"\"") str = ""
45e6d6c189SCody Peter Mello	if (subout == "\"\"") subout = ""
46e6d6c189SCody Peter Mello	if (gsubout == "\"\"") gsubout = ""
47e6d6c189SCody Peter Mello}
48e6d6c189SCody Peter Mello{		# generate a test
49e6d6c189SCody Peter Mello	nt++
50e6d6c189SCody Peter Mello	gsub(/\\/, "&&", repl)	# in case of \ enclosed
51e6d6c189SCody Peter Mello	test = sprintf("echo '"'"'%s'"'"' | %s '"'\n"'", str, awk) \
52e6d6c189SCody Peter Mello	  sprintf("{ temp = $0; sub(/%s/, \"%s\", temp)\n", pat, repl) \
53e6d6c189SCody Peter Mello	  sprintf("  if (temp != \"%s\") print \" sub %d fails:\", temp, \"should be %s in %s\"\n",
54e6d6c189SCody Peter Mello		subout, nt, subout, (pat " " repl " " str " " subout)) \
55e6d6c189SCody Peter Mello	  sprintf("  gsub(/%s/, \"%s\")\n", pat, repl) \
56e6d6c189SCody Peter Mello	  sprintf("  if ($0 != \"%s\") print \"gsub %d fails:\", $0, \"should be %s in %s\"\n}",
57e6d6c189SCody Peter Mello		gsubout, nt, gsubout, (pat " " repl " " str " " gsubout)) \
58e6d6c189SCody Peter Mello	  "'" '"'"
59e6d6c189SCody Peter Mello	# if (nt >= 55) print "test is: " test
60e6d6c189SCody Peter Mello	tcode = system(test)
61e6d6c189SCody Peter Mello	if (tcode > 0) {
62e6d6c189SCody Peter Mello		ecode = 1
63e6d6c189SCody Peter Mello	}
64e6d6c189SCody Peter Mello	# system("bprint -c ../a.out")
65e6d6c189SCody Peter Mello}
66e6d6c189SCody Peter MelloEND {
67e6d6c189SCody Peter Mello	print nt, "tests"
68e6d6c189SCody Peter Mello	exit ecode
69e6d6c189SCody Peter Mello}
70e6d6c189SCody Peter Mello
71e6d6c189SCody Peter Mello' <<\!!!!
72e6d6c189SCody Peter Melloa	x	aaa	xaa	xxx
73e6d6c189SCody Peter Mello		axa	xxa	xxx
74e6d6c189SCody Peter Mello		bbb	bbb	bbb
75e6d6c189SCody Peter Mello		""	""	""
76e6d6c189SCody Peter Melloa	xy	aaa	xyaa	xyxyxy
77e6d6c189SCody Peter Mello		axa	xyxa	xyxxy
78e6d6c189SCody Peter Mello		bbb	bbb	bbb
79e6d6c189SCody Peter Mello		""	""	""
80e6d6c189SCody Peter Mello.	x	aaa	xaa	xxx
81e6d6c189SCody Peter Mello		axa	xxa	xxx
82e6d6c189SCody Peter Mello		bbb	xbb	xxx
83e6d6c189SCody Peter Mello		""	""	""
84e6d6c189SCody Peter Mello.a	x	a	a	a
85e6d6c189SCody Peter Mello		ax	ax	ax
86e6d6c189SCody Peter Mello		aa	x	x
87e6d6c189SCody Peter Mello		aaab	xab	xab
88e6d6c189SCody Peter Mello		aaaa	xaa	xx
89e6d6c189SCody Peter Mello		""	""	""
90e6d6c189SCody Peter Mello$	x	a	ax	ax
91e6d6c189SCody Peter Mello		""	x	x
92e6d6c189SCody Peter Mello.$	x	""	""	""
93e6d6c189SCody Peter Mello		a	x	x
94e6d6c189SCody Peter Mello		ab	ax	ax
95e6d6c189SCody Peter Melloa$	x	""	""	""
96e6d6c189SCody Peter Mello		a	x	x
97e6d6c189SCody Peter Mello		b	b	b
98e6d6c189SCody Peter Mello		ab	ab	ab
99e6d6c189SCody Peter Mello^	x	""	x	x
100e6d6c189SCody Peter Mello		a	xa	xa
101e6d6c189SCody Peter Mello^a$	xx	a	xx	xx
102e6d6c189SCody Peter Mello		""	""	""
103e6d6c189SCody Peter Mello		b	b	b
104e6d6c189SCody Peter Mello		aa	aa	aa
105e6d6c189SCody Peter Mello^a.$	xy	a	a	a
106e6d6c189SCody Peter Mello		""	""	""
107e6d6c189SCody Peter Mello		ab	xy	xy
108e6d6c189SCody Peter Mello		ba	ba	ba
109e6d6c189SCody Peter Mello^$	x	""	x	x
110e6d6c189SCody Peter Mello		a	a	a
111e6d6c189SCody Peter Mello^.a	x	aa	x	x
112e6d6c189SCody Peter Mello		ba	x	x
113e6d6c189SCody Peter Mello		ab	ab	ab
114e6d6c189SCody Peter Mello		a	a	a
115e6d6c189SCody Peter Mello^.*a	xy	""	""	""
116e6d6c189SCody Peter Mello		a	xy	xy
117e6d6c189SCody Peter Mello		b	b	b
118e6d6c189SCody Peter Mello		ba	xy	xy
119e6d6c189SCody Peter Mello^.+a	xy	""	""	""
120e6d6c189SCody Peter Mello		a	a	a
121e6d6c189SCody Peter Mello		bb	bb	bb
122e6d6c189SCody Peter Mello		ba	xy	xy
123e6d6c189SCody Peter Melloa	&x&y	a	axay	axay
124e6d6c189SCody Peter Mello		aa	axaya	axayaxay
125e6d6c189SCody Peter Mello
126e6d6c189SCody Peter Melloa*	x	""	x	x
127e6d6c189SCody Peter Mello		z	xz	xzx
128e6d6c189SCody Peter Mello		az	xz	xzx
129e6d6c189SCody Peter Mello		aza	xza	xzx
130e6d6c189SCody Peter Mello	b	xxx	bxxx	bxbxbxb
131e6d6c189SCody Peter Mello	x&	paq	xpaq	xpxaqx
132e6d6c189SCody Peter Mello	x\&	paq	x&paq	x&px&qx&
133e6d6c189SCody Peter Mello	x&y	paq	xypaq	xypxayqxy
134e6d6c189SCody Peter Mello	x\&y	paq	x&ypaq	x&ypx&yqx&y
135e6d6c189SCody Peter Melloa+	x&	paq	pxaq	pxaq
136e6d6c189SCody Peter Mello	x\&	paq	px&q	px&q
137e6d6c189SCody Peter Mello	x&y	paq	pxayq	pxayq
138e6d6c189SCody Peter Mello	x\&y	paq	px&yq	px&yq
139e6d6c189SCody Peter Melloaa*	x	a	x	x
140e6d6c189SCody Peter Mello		aa	x	x
141e6d6c189SCody Peter Mello		wawa	wxwa	wxwx
142e6d6c189SCody Peter Mello\$	x	""	""	""
143e6d6c189SCody Peter Mello		a	a	a
144e6d6c189SCody Peter Mello		a$	ax	ax
145e6d6c189SCody Peter Mello		$$$	x$$	xxx
146e6d6c189SCody Peter Mello		z$z$z	zxz$z	zxzxz
147e6d6c189SCody Peter Mello\.	x	""	""	""
148e6d6c189SCody Peter Mello		a	a	a
149e6d6c189SCody Peter Mello		a.	ax	ax
150e6d6c189SCody Peter Mello		...	x..	xxx
151e6d6c189SCody Peter Mello		z.z.z	zxz.z	zxzxz
152e6d6c189SCody Peter Melloxr+y	q	xy	xy	xy
153e6d6c189SCody Peter Mello		xry	q	q
154e6d6c189SCody Peter Mello		xrry	q	q
155e6d6c189SCody Peter Mello		xryWxry	qWxry	qWq
156e6d6c189SCody Peter Melloxr?y	q	AxyB	AqB	AqB
157e6d6c189SCody Peter Mello		AxryB	AqB	AqB
158e6d6c189SCody Peter Mello		Axrry	Axrry	Axrry
159e6d6c189SCody Peter Melloa?b?c?	x	""	x	x
160e6d6c189SCody Peter Mello		a	x	x
161e6d6c189SCody Peter Mello		b	x	x
162e6d6c189SCody Peter Mello		c	x	x
163e6d6c189SCody Peter Mello		ac	x	x
164e6d6c189SCody Peter Mello		acc	xc	xx
165e6d6c189SCody Peter Mello^a?b?q	x	""	""	""
166e6d6c189SCody Peter Mello		q	x	x
167e6d6c189SCody Peter Mello		a	a	a
168e6d6c189SCody Peter Mello		aq	x	x
169e6d6c189SCody Peter Mello		bq	x	x
170e6d6c189SCody Peter Mello		abq	x	x
171e6d6c189SCody Peter Mello		qab	xab	xab
172e6d6c189SCody Peter Mello		abqabq	xabq	xabq
173e6d6c189SCody Peter Mello[0-9]	xyz	0	xyz	xyz
174e6d6c189SCody Peter Mello		00	xyz0	xyzxyz
175e6d6c189SCody Peter Mello		000	xyz00	xyzxyzxyz
176e6d6c189SCody Peter Mello		0a	xyza	xyza
177e6d6c189SCody Peter Mello		a0	axyz	axyz
178e6d6c189SCody Peter Mello		0a0	xyza0	xyzaxyz
179e6d6c189SCody Peter Mello		xx	xx	xx
180e6d6c189SCody Peter Mello		""	""	""
181e6d6c189SCody Peter Mello^[0-9]	xyz	0	xyz	xyz
182e6d6c189SCody Peter Mello		00	xyz0	xyz0
183e6d6c189SCody Peter Mello		000	xyz00	xyz00
184e6d6c189SCody Peter Mello		0a	xyza	xyza
185e6d6c189SCody Peter Mello		a0	a0	a0
186e6d6c189SCody Peter Mello		xx	xx	xx
187e6d6c189SCody Peter Mello		""	""	""
188e6d6c189SCody Peter Mello[0-9]$	xyz	0	xyz	xyz
189e6d6c189SCody Peter Mello		00	0xyz	0xyz
190e6d6c189SCody Peter Mello		000	00xyz	00xyz
191e6d6c189SCody Peter Mello		0a	0a	0a
192e6d6c189SCody Peter Mello		a0	axyz	axyz
193e6d6c189SCody Peter Mello		xx	xx	xx
194e6d6c189SCody Peter Mello		""	""	""
195e6d6c189SCody Peter Mello[0-9]*	xyz	0	xyz	xyz
196e6d6c189SCody Peter Mello		000	xyz	xyz
197e6d6c189SCody Peter Mello		0a	xyza	xyzaxyz
198e6d6c189SCody Peter Mello		a0	xyza0	xyzaxyz
199e6d6c189SCody Peter Mello		0a0	xyza0	xyzaxyz
200e6d6c189SCody Peter Mello		pq	xyzpq	xyzpxyzqxyz
201e6d6c189SCody Peter Mello		""	xyz	xyz
202e6d6c189SCody Peter Mello
203*3ee4fc2aSCody Peter Mello""	<&>	abc	<>abc	<>a<>b<>c<>	fixed 2/07, we think
204*3ee4fc2aSCody Peter Mello""	<\&>	abc	<&>abc	<&>a<&>b<&>c<&>
205*3ee4fc2aSCody Peter Mello""	<&&>	abc	<>abc	<>a<>b<>c<>
206*3ee4fc2aSCody Peter Mello""	<&>	""	<>	<>
207*3ee4fc2aSCody Peter Mello
208e6d6c189SCody Peter Mellod?abc	<&>	abc	<abc>	<abc>
209e6d6c189SCody Peter Mellod?	<&>	abc	<>abc	<>a<>b<>c<>
210e6d6c189SCody Peter Mello
211e6d6c189SCody Peter Mellox[0-9]+y	Q	xy	xy	xy	no change
212e6d6c189SCody Peter Mello		x0y	Q	Q
213e6d6c189SCody Peter Mello		x12y	Q	Q
214e6d6c189SCody Peter Mello		x1y2	Q2	Q2
215e6d6c189SCody Peter Mello		x1yax23y	Qax23y	QaQ
216e6d6c189SCody Peter Mello
217e6d6c189SCody Peter Mello# x[0-9]?y	~	xy
218e6d6c189SCody Peter Mello# 		x1y
219e6d6c189SCody Peter Mello# 	!~	x23y
220e6d6c189SCody Peter Mello# x[[]y	~	x[y
221e6d6c189SCody Peter Mello# 	!~	xy
222e6d6c189SCody Peter Mello# 		x[[]y
223e6d6c189SCody Peter Mello# 		x]y
224e6d6c189SCody Peter Mello# x[^[]y	~	xay
225e6d6c189SCody Peter Mello# 	!~	x[y
226e6d6c189SCody Peter Mello# x[-]y	~	x-y
227e6d6c189SCody Peter Mello# 	!~	xy
228e6d6c189SCody Peter Mello# 		x+y
229e6d6c189SCody Peter Mello# x[^-]y	~	x+y
230e6d6c189SCody Peter Mello# 	!~	x-y
231e6d6c189SCody Peter Mello# 		xy
232e6d6c189SCody Peter Mello# [0\-9]	~	0
233e6d6c189SCody Peter Mello# 		-
234e6d6c189SCody Peter Mello# 		9
235e6d6c189SCody Peter Mello# 	!~	1
236e6d6c189SCody Peter Mello# 		""
237e6d6c189SCody Peter Mello# [-1]	~	-
238e6d6c189SCody Peter Mello# 		1
239e6d6c189SCody Peter Mello# 	!~	0
240e6d6c189SCody Peter Mello# [0-]	~	0
241e6d6c189SCody Peter Mello# 		-
242e6d6c189SCody Peter Mello# 	!~	1
243e6d6c189SCody Peter Mello# [^-0]	~	x
244e6d6c189SCody Peter Mello# 		^
245e6d6c189SCody Peter Mello# 	!~	-
246e6d6c189SCody Peter Mello# 		0
247e6d6c189SCody Peter Mello# 		""
248e6d6c189SCody Peter Mello# [^0-]	~	x
249e6d6c189SCody Peter Mello# 		^
250e6d6c189SCody Peter Mello# 	!~	-
251e6d6c189SCody Peter Mello# 		0
252e6d6c189SCody Peter Mello# 		""
253e6d6c189SCody Peter Mello# x|y	~	x
254e6d6c189SCody Peter Mello# 		y
255e6d6c189SCody Peter Mello# 		xy
256e6d6c189SCody Peter Mello# 	!~	a
257e6d6c189SCody Peter Mello# 		""
258e6d6c189SCody Peter Mello# ^abc|xyz$	~	abc
259e6d6c189SCody Peter Mello# 		abcd
260e6d6c189SCody Peter Mello# 		axyz
261e6d6c189SCody Peter Mello# 		xyz
262e6d6c189SCody Peter Mello# 	!~	xabc
263e6d6c189SCody Peter Mello# 		xyza
264e6d6c189SCody Peter Mello# ^(abc|xyz)$	~	abc
265e6d6c189SCody Peter Mello# 		xyz
266e6d6c189SCody Peter Mello# 	!~	abcxyz
267e6d6c189SCody Peter Mello# 		abcx
268e6d6c189SCody Peter Mello# 		cxyz
269e6d6c189SCody Peter Mello# ^x\|y$	~	x|y
270e6d6c189SCody Peter Mello# 	!~	xy
271e6d6c189SCody Peter Mello# ^x\\y$	~	x\y
272e6d6c189SCody Peter Mello# 	!~	xy
273e6d6c189SCody Peter Mello# 		x\\y
274e6d6c189SCody Peter Mello# 		xay
275e6d6c189SCody Peter Mello# \141\142	~	ab
276e6d6c189SCody Peter Mello# 		xab
277e6d6c189SCody Peter Mello# 		abx
278e6d6c189SCody Peter Mello# 	!~	a
279e6d6c189SCody Peter Mello# 		b
280e6d6c189SCody Peter Mello# 		ax
281e6d6c189SCody Peter Mello# 		axb
282e6d6c189SCody Peter Mello# x\056y	~	x.y
283e6d6c189SCody Peter Mello# 	!~	x.
284e6d6c189SCody Peter Mello# 		.x
285e6d6c189SCody Peter Mello# 		xxx
286e6d6c189SCody Peter Mello# 		xby  because \056 is not the metacharacter .
287e6d6c189SCody Peter Mello# 		xcy  ditto
288e6d6c189SCody Peter Mello# [\60-\62\65-6\71]	~	0
289e6d6c189SCody Peter Mello# 		1
290e6d6c189SCody Peter Mello# 		2
291e6d6c189SCody Peter Mello# 		5
292e6d6c189SCody Peter Mello# 		6
293e6d6c189SCody Peter Mello# 		9
294e6d6c189SCody Peter Mello# 	!~	3
295e6d6c189SCody Peter Mello# 		4
296e6d6c189SCody Peter Mello# 		7
297e6d6c189SCody Peter Mello# 		8
298e6d6c189SCody Peter Mello# [\60-2\65-6\71]	~	0
299e6d6c189SCody Peter Mello# 		1
300e6d6c189SCody Peter Mello# 		2
301e6d6c189SCody Peter Mello# 		5
302e6d6c189SCody Peter Mello# 		6
303e6d6c189SCody Peter Mello# 		9
304e6d6c189SCody Peter Mello# 	!~	3
305e6d6c189SCody Peter Mello# 		4
306e6d6c189SCody Peter Mello# 		7
307e6d6c189SCody Peter Mello# 		8
308e6d6c189SCody Peter Mello# [\x30-\x32\x35-6\71]	~	0
309e6d6c189SCody Peter Mello# 		1
310e6d6c189SCody Peter Mello# 		2
311e6d6c189SCody Peter Mello# 		5
312e6d6c189SCody Peter Mello# 		6
313e6d6c189SCody Peter Mello# 		9
314e6d6c189SCody Peter Mello# 	!~	3
315e6d6c189SCody Peter Mello# 		4
316e6d6c189SCody Peter Mello# 		7
317e6d6c189SCody Peter Mello# 		8
318e6d6c189SCody Peter Mello# [\x30-2\x35-6\x39]	~	0
319e6d6c189SCody Peter Mello# 		1
320e6d6c189SCody Peter Mello# 		2
321e6d6c189SCody Peter Mello# 		5
322e6d6c189SCody Peter Mello# 		6
323e6d6c189SCody Peter Mello# 		9
324e6d6c189SCody Peter Mello# 	!~	3
325e6d6c189SCody Peter Mello# 		4
326e6d6c189SCody Peter Mello# 		7
327e6d6c189SCody Peter Mello# 		8
328e6d6c189SCody Peter Mello!!!!
329