9 split(
string, fields, nfields, sep)
15 register char *p = string;
17 register char sepc = sep[0];
20 register char **fp = fields;
22 register int trimtrail;
26 while ((c = *p++) ==
' ' || c ==
'\t')
48 while ((c = *p++) != sepc)
56 while ((c = *p++) != sepc)
70 while ((c = *p++) != sepc && c != sepc2)
72 if (trimtrail && **(fp-1) ==
'\0')
79 while ((c = *p++) == sepc || c == sepc2)
86 while ((c = *p++) == sepc || c == sepc2)
90 while ((c = *p++) !=
'\0' && c != sepc && c != sepc2)
96 while ((c = *--p) == sepc || c == sepc2)
119 while ((sepc = *sepp++) !=
'\0' && sepc != c)
129 while ((sepc = *sepp++) !=
'\0' && sepc != c)
161 for (n = atoi(argv[3]); n > 0; n--) {
162 (void) strcpy(buf, argv[1]);
165 for (n = atoi(argv[3]); n > 0; n--) {
166 (void) strcpy(buf, argv[1]);
167 (void) split(buf, fields, MNF, argv[2]);
170 dosplit(argv[1], argv[2]);
172 while (fgets(buf,
sizeof(buf), stdin) != NULL) {
173 buf[strlen(buf)-1] =
'\0';
174 dosplit(buf, argv[1]);
182 dosplit(
string, seps)
190 nf = split(
string, fields, NF, seps);
191 print(nf, NF, fields);
194 print(nf, nfp, fields)
202 bound = (nf > nfp) ? nfp : nf;
204 for (fn = 0; fn < bound; fn++)
205 printf(
"\"%s\"%s", fields[fn], (fn+1 < nf) ?
", " :
"\n");
216 " ",
" ", 2, {
"",
"" },
217 "x",
" ", 1, {
"x" },
218 "xy",
" ", 1, {
"xy" },
219 "x y",
" ", 2, {
"x",
"y" },
220 "abc def g ",
" ", 5, {
"abc",
"def",
"",
"g",
"" },
221 " a bcd",
" ", 4, {
"",
"",
"a",
"bcd" },
222 "a b c d e f",
" ", 6, {
"a",
"b",
"c",
"d",
"e f" },
223 " a b c d ",
" ", 6, {
"",
"a",
"b",
"c",
"d " },
226 " ",
" _", 2, {
"",
"" },
227 "x",
" _", 1, {
"x" },
228 "x y",
" _", 2, {
"x",
"y" },
229 "ab _ cd",
" _", 2, {
"ab",
"cd" },
230 " a_b c ",
" _", 5, {
"",
"a",
"b",
"c",
"" },
231 "a b c_d e f",
" _", 6, {
"a",
"b",
"c",
"d",
"e f" },
232 " a b c d ",
" _", 6, {
"",
"a",
"b",
"c",
"d " },
234 "",
" _~", 0, {
"" },
235 " ",
" _~", 2, {
"",
"" },
236 "x",
" _~", 1, {
"x" },
237 "x y",
" _~", 2, {
"x",
"y" },
238 "ab _~ cd",
" _~", 2, {
"ab",
"cd" },
239 " a_b c~",
" _~", 5, {
"",
"a",
"b",
"c",
"" },
240 "a b_c d~e f",
" _~", 6, {
"a",
"b",
"c",
"d",
"e f" },
241 "~a b c d ",
" _~", 6, {
"",
"a",
"b",
"c",
"d " },
243 "",
" _~-", 0, {
"" },
244 " ",
" _~-", 2, {
"",
"" },
245 "x",
" _~-", 1, {
"x" },
246 "x y",
" _~-", 2, {
"x",
"y" },
247 "ab _~- cd",
" _~-", 2, {
"ab",
"cd" },
248 " a_b c~",
" _~-", 5, {
"",
"a",
"b",
"c",
"" },
249 "a b_c-d~e f",
" _~-", 6, {
"a",
"b",
"c",
"d",
"e f" },
250 "~a-b c d ",
" _~-", 6, {
"",
"a",
"b",
"c",
"d " },
253 " ",
" ", 2, {
"",
"" },
254 "x",
" ", 1, {
"x" },
255 "xy",
" ", 1, {
"xy" },
256 "x y",
" ", 2, {
"x",
"y" },
257 "abc def g ",
" ", 4, {
"abc",
"def",
"g",
"" },
258 " a bcd",
" ", 3, {
"",
"a",
"bcd" },
259 "a b c d e f",
" ", 6, {
"a",
"b",
"c",
"d",
"e f" },
260 " a b c d ",
" ", 6, {
"",
"a",
"b",
"c",
"d " },
265 "xy",
"", 1, {
"xy" },
266 "x y",
"", 2, {
"x",
"y" },
267 "abc def g ",
"", 3, {
"abc",
"def",
"g" },
268 "\t a bcd",
"", 2, {
"a",
"bcd" },
269 " a \tb\t c ",
"", 3, {
"a",
"b",
"c" },
270 "a b c d e ",
"", 5, {
"a",
"b",
"c",
"d",
"e" },
271 "a b\tc d e f",
"", 6, {
"a",
"b",
"c",
"d",
"e f" },
272 " a b c d e f ",
"", 6, {
"a",
"b",
"c",
"d",
"e f " },
274 NULL, NULL, 0, { NULL },
284 register int printit;
287 for (n = 0; tests[
n].str != NULL; n++) {
288 (void) strcpy(buf, tests[n].str);
290 nf = split(buf, fields, RNF, tests[n].seps);
292 if (nf != tests[n].nf) {
293 printf(
"split `%s' by `%s' gave %d fields, not %d\n",
294 tests[n].str, tests[n].seps, nf, tests[n].nf);
296 }
else if (fields[RNF] != NULL) {
297 printf(
"split() went beyond array end\n");
300 for (i = 0; i < nf && i < RNF; i++) {
304 if (strcmp(f, tests[n].fi[i]) != 0) {
305 printf(
"split `%s' by `%s', field %d is `%s', not `%s'\n",
306 tests[n].str, tests[n].seps,
307 i, fields[i], tests[n].fi[i]);
313 print(nf, RNF, fields);