xref: /plan9/sys/src/cmd/unix/u9fs/tokenize.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1*9a747e4fSDavid du Colombier #include <plan9.h>
2*9a747e4fSDavid du Colombier 
3*9a747e4fSDavid du Colombier int
getfields(char * str,char ** args,int max,int mflag,char * set)4*9a747e4fSDavid du Colombier getfields(char *str, char **args, int max, int mflag, char *set)
5*9a747e4fSDavid du Colombier {
6*9a747e4fSDavid du Colombier 	Rune r;
7*9a747e4fSDavid du Colombier 	int nr, intok, narg;
8*9a747e4fSDavid du Colombier 
9*9a747e4fSDavid du Colombier 	if(max <= 0)
10*9a747e4fSDavid du Colombier 		return 0;
11*9a747e4fSDavid du Colombier 
12*9a747e4fSDavid du Colombier 	narg = 0;
13*9a747e4fSDavid du Colombier 	args[narg] = str;
14*9a747e4fSDavid du Colombier 	if(!mflag)
15*9a747e4fSDavid du Colombier 		narg++;
16*9a747e4fSDavid du Colombier 	intok = 0;
17*9a747e4fSDavid du Colombier 	for(;; str += nr) {
18*9a747e4fSDavid du Colombier 		nr = chartorune(&r, str);
19*9a747e4fSDavid du Colombier 		if(r == 0)
20*9a747e4fSDavid du Colombier 			break;
21*9a747e4fSDavid du Colombier 		if(utfrune(set, r)) {
22*9a747e4fSDavid du Colombier 			if(narg >= max)
23*9a747e4fSDavid du Colombier 				break;
24*9a747e4fSDavid du Colombier 			*str = 0;
25*9a747e4fSDavid du Colombier 			intok = 0;
26*9a747e4fSDavid du Colombier 			args[narg] = str + nr;
27*9a747e4fSDavid du Colombier 			if(!mflag)
28*9a747e4fSDavid du Colombier 				narg++;
29*9a747e4fSDavid du Colombier 		} else {
30*9a747e4fSDavid du Colombier 			if(!intok && mflag)
31*9a747e4fSDavid du Colombier 				narg++;
32*9a747e4fSDavid du Colombier 			intok = 1;
33*9a747e4fSDavid du Colombier 		}
34*9a747e4fSDavid du Colombier 	}
35*9a747e4fSDavid du Colombier 	return narg;
36*9a747e4fSDavid du Colombier }
37*9a747e4fSDavid du Colombier 
38*9a747e4fSDavid du Colombier int
tokenize(char * str,char ** args,int max)39*9a747e4fSDavid du Colombier tokenize(char *str, char **args, int max)
40*9a747e4fSDavid du Colombier {
41*9a747e4fSDavid du Colombier 	return getfields(str, args, max, 1, " \t\n\r");
42*9a747e4fSDavid du Colombier }
43