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