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