1#!/bin/bash
2
3if [[ -z "$AWK" || -z "$WORKDIR" ]]; then
4    printf '$AWK and $WORKDIR must be set\n' >&2
5    exit 1
6fi
7
8TEMP0=$WORKDIR/test.temp.0
9TEMP1=$WORKDIR/test.temp.1
10TEMP2=$WORKDIR/test.temp.2
11
12RESULT=0
13
14fail() {
15	echo "$1" >&2
16	RESULT=1
17}
18
19echo T.split: misc tests of field splitting and split command
20
21$AWK 'BEGIN {
22	# Assign string to $0, then change FS.
23	FS = ":";
24	$0="a:bc:def";
25	FS = "-";
26	print FS, $1, NF;
27
28	# Assign number to $0, then change FS.
29	FS = "2";
30	$0=1212121;
31	FS="3";
32	print FS, $1, NF;
33}' > $TEMP1
34echo '- a 3
353 1 4' > $TEMP2
36diff $TEMP1 $TEMP2 || fail 'BAD: T.split 0.1'
37
38$AWK 'BEGIN {
39	# FS changes after getline.
40	FS = ":";
41	"echo a:bc:def" | getline;
42	FS = "-";
43	print FS, $1, NF;
44}' > $TEMP1
45echo '- a 3' > $TEMP2
46diff $TEMP1 $TEMP2 || fail 'BAD: T.split 0.2'
47
48echo '
49a
50a:b
51c:d:e
52e:f:g:h' > $TEMP0
53$AWK 'BEGIN {
54	FS = ":"
55	while (getline <"'$TEMP0'" > 0)
56		print NF
57}' > $TEMP1
58echo '0
591
602
613
624' > $TEMP2
63diff $TEMP1 $TEMP2 || fail 'BAD: T.split 0.3'
64
65# getline var shouldn't impact fields.
66
67echo 'f b a' > $TEMP0
68$AWK '{
69	FS = ":";
70	getline a < "/etc/passwd";
71	print $1;
72}' $TEMP0 > $TEMP1
73echo 'f' > $TEMP2
74diff $TEMP1 $TEMP2 || fail 'BAD: T.split 0.4'
75
76echo 'a b c d
77foo
78e f g h i
79bar' > $TEMP0
80$AWK '{
81	FS=":";
82	getline v;
83	print $2, NF;
84	FS=" ";
85}' $TEMP0 > $TEMP1
86echo 'b 4
87f 5' > $TEMP2
88diff $TEMP1 $TEMP2 || fail 'BAD: T.split 0.5'
89
90echo 'a.b.c=d.e.f
91g.h.i=j.k.l
92m.n.o=p.q.r' > $TEMP0
93echo 'b
94h
95n' > $TEMP1
96$AWK 'BEGIN { FS="=" } { FS="."; $0=$1; print $2; FS="="; }' $TEMP0 > $TEMP2
97diff $TEMP1 $TEMP2 || fail 'BAD: T.split (record assignment 1)'
98
99echo 'a.b.c=d.e.f
100g.h.i=j.k.l
101m.n.o=p.q.r' > $TEMP0
102echo 'd.e.f
103b
104j.k.l
105h
106p.q.r
107n' > $TEMP1
108$AWK 'BEGIN { FS="=" } { print $2; FS="."; $0=$1; print $2; FS="="; }' $TEMP0 > $TEMP2
109diff $TEMP1 $TEMP2 || fail 'BAD: T.split (record assignment 2)'
110
111echo 'abc
112de
113f
114
115     ' > $TEMP0
116who | sed 10q  >> $TEMP0
117sed 10q /etc/passwd >> $TEMP0
118
119$AWK '
120{	n = split($0, x, "")
121	m = length($0)
122	if (m != n) print "error 1", NR
123	s = ""
124	for (i = 1; i <= m; i++)
125		s = s x[i]
126	if (s != $0) print "error 2", NR
127	print s
128}' $TEMP0 > $TEMP1
129
130diff $TEMP0 $TEMP1 || fail 'BAD: T.split 1'
131
132# assumes same test.temp.0!  bad design
133
134
135$AWK '
136{	n = split($0, x, //)
137	m = length($0)
138	if (m != n) print "error 1", NR
139	s = ""
140	for (i = 1; i <= m; i++)
141		s = s x[i]
142	if (s != $0) print "error 2", NR
143	print s
144}' $TEMP0 > $TEMP1
145
146diff $TEMP0 $TEMP1 || fail 'BAD: T.split //'
147
148$AWK '
149BEGIN { FS = "" }
150{	n = split($0, x)	# will be split with FS
151	m = length($0)
152	if (m != n) print "error 1", NR
153	s = ""
154	for (i = 1; i <= m; i++)
155		s = s x[i]
156	if (s != $0) print "error 2", NR
157	print s
158}' $TEMP0 > $TEMP2
159
160diff $TEMP0 $TEMP2 || fail 'BAD: T.split 2'
161
162# assumes same test.temp.0!
163
164$AWK '
165BEGIN { FS = "" }
166{	n = NF
167	m = length($0)
168	if (m != n) print "error 1", NR
169	s = ""
170	for (i = 1; i <= m; i++)
171		s = s $i
172	if (s != $0) print "error 2", NR
173	print s
174}' $TEMP0 > $TEMP2
175
176diff $TEMP0 $TEMP2 || fail 'BAD: T.split 3'
177
178
179$AWK '
180{ n = split( $0, temp, /^@@@ +/ )
181  print n
182}' > $TEMP1 <<XXX
183@@@ xxx
184@@@ xxx
185@@@ xxx
186XXX
187echo '2
1882
1892' > $TEMP2
190diff $TEMP1 $TEMP2 || fail 'BAD: T.split 4'
191
192rm -f $WORKDIR/test.temp*
193
194echo '
195a
196bc
197def' > $TEMP0
198$AWK '
199{ print split($0, x, "")
200}' $TEMP0 > $TEMP1
201echo '0
2021
2032
2043' > $TEMP2
205diff $TEMP1 $TEMP2 || fail 'BAD: T.split null 3rd arg'
206
207rm -f $WORKDIR/test.temp*
208$AWK 'BEGIN {
209  a[1]="a b"
210  print split(a[1],a),a[1],a[2]
211}' > $TEMP1
212
213echo '2 a b' > $TEMP2
214diff $TEMP1 $TEMP2 || fail 'BAD: T.split(a[1],a)'
215
216$AWK 'BEGIN {
217  a = "cat\n\n\ndog";
218  split(a, b, "[\r\n]+");
219  print b[1], b[2];
220}' > $TEMP1
221echo 'cat dog' > $TEMP2
222diff $TEMP1 $TEMP2 || fail 'BAD: T.split(a, b, "[\r\n]+")'
223
224
225exit $RESULT
226