xref: /inferno-os/lib9/getfields.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsyth #include	"lib9.h"
2*37da2899SCharles.Forsyth int
getfields(char * str,char ** args,int max,int mflag,char * set)3*37da2899SCharles.Forsyth getfields(char *str, char **args, int max, int mflag, char *set)
4*37da2899SCharles.Forsyth {
5*37da2899SCharles.Forsyth 	Rune r;
6*37da2899SCharles.Forsyth 	int nr, intok, narg;
7*37da2899SCharles.Forsyth 
8*37da2899SCharles.Forsyth 	if(max <= 0)
9*37da2899SCharles.Forsyth 		return 0;
10*37da2899SCharles.Forsyth 
11*37da2899SCharles.Forsyth 	narg = 0;
12*37da2899SCharles.Forsyth 	args[narg] = str;
13*37da2899SCharles.Forsyth 	if(!mflag)
14*37da2899SCharles.Forsyth 		narg++;
15*37da2899SCharles.Forsyth 	intok = 0;
16*37da2899SCharles.Forsyth 	for(;; str += nr) {
17*37da2899SCharles.Forsyth 		nr = chartorune(&r, str);
18*37da2899SCharles.Forsyth 		if(r == 0)
19*37da2899SCharles.Forsyth 			break;
20*37da2899SCharles.Forsyth 		if(utfrune(set, r)) {
21*37da2899SCharles.Forsyth 			if(narg >= max)
22*37da2899SCharles.Forsyth 				break;
23*37da2899SCharles.Forsyth 			*str = 0;
24*37da2899SCharles.Forsyth 			intok = 0;
25*37da2899SCharles.Forsyth 			args[narg] = str + nr;
26*37da2899SCharles.Forsyth 			if(!mflag)
27*37da2899SCharles.Forsyth 				narg++;
28*37da2899SCharles.Forsyth 		} else {
29*37da2899SCharles.Forsyth 			if(!intok && mflag)
30*37da2899SCharles.Forsyth 				narg++;
31*37da2899SCharles.Forsyth 			intok = 1;
32*37da2899SCharles.Forsyth 		}
33*37da2899SCharles.Forsyth 	}
34*37da2899SCharles.Forsyth 	return narg;
35*37da2899SCharles.Forsyth }
36