xref: /plan9/sys/src/ape/lib/v/getfields.c (revision 781103c4074deb8af160e8a0da2742ba6b29dc2b)
13e12c5d1SDavid du Colombier #define _RESEARCH_SOURCE
23e12c5d1SDavid du Colombier #include <libv.h>
33e12c5d1SDavid du Colombier #include <string.h>
43e12c5d1SDavid du Colombier 
53e12c5d1SDavid du Colombier static char is_sep[256] = {
63e12c5d1SDavid du Colombier 	0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
73e12c5d1SDavid du Colombier 	1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
83e12c5d1SDavid du Colombier 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
93e12c5d1SDavid du Colombier 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
103e12c5d1SDavid du Colombier 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
113e12c5d1SDavid du Colombier 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
123e12c5d1SDavid du Colombier 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
133e12c5d1SDavid du Colombier 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
143e12c5d1SDavid du Colombier };
153e12c5d1SDavid du Colombier static char is_field[256] = {
163e12c5d1SDavid du Colombier 	0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
173e12c5d1SDavid du Colombier 	0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
183e12c5d1SDavid du Colombier 	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
193e12c5d1SDavid du Colombier 	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
203e12c5d1SDavid du Colombier 	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
213e12c5d1SDavid du Colombier 	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
223e12c5d1SDavid du Colombier 	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
233e12c5d1SDavid du Colombier 	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
243e12c5d1SDavid du Colombier };
253e12c5d1SDavid du Colombier static char last_sep[256];
263e12c5d1SDavid du Colombier 
273e12c5d1SDavid du Colombier char *
setfields(char * arg)283e12c5d1SDavid du Colombier setfields(char *arg)
293e12c5d1SDavid du Colombier {
303e12c5d1SDavid du Colombier 	register unsigned char *s;
313e12c5d1SDavid du Colombier 	register i;
323e12c5d1SDavid du Colombier 
333e12c5d1SDavid du Colombier 	for(i = 1, s = (unsigned char *)last_sep; i < 256; i++)
343e12c5d1SDavid du Colombier 		if(is_sep[i])
353e12c5d1SDavid du Colombier 			*s++ = i;
363e12c5d1SDavid du Colombier 	*s = 0;
373e12c5d1SDavid du Colombier 	memset(is_sep, 0, sizeof is_sep);
383e12c5d1SDavid du Colombier 	memset(is_field, 1, sizeof is_field);
393e12c5d1SDavid du Colombier 	for(s = (unsigned char *)arg; *s;){
403e12c5d1SDavid du Colombier 		is_sep[*s] = 1;
413e12c5d1SDavid du Colombier 		is_field[*s++] = 0;
423e12c5d1SDavid du Colombier 	}
433e12c5d1SDavid du Colombier 	is_field[0] = 0;
443e12c5d1SDavid du Colombier 	return(last_sep);
453e12c5d1SDavid du Colombier }
463e12c5d1SDavid du Colombier 
473e12c5d1SDavid du Colombier int
getfields(char * ss,char ** sp,int nptrs)483e12c5d1SDavid du Colombier getfields(char *ss, char **sp, int nptrs)
493e12c5d1SDavid du Colombier {
503e12c5d1SDavid du Colombier 	register unsigned char *s = (unsigned char *)ss;
513e12c5d1SDavid du Colombier 	register unsigned char **p = (unsigned char **)sp;
523e12c5d1SDavid du Colombier 	register unsigned c;
533e12c5d1SDavid du Colombier 
54*781103c4SDavid du Colombier 	c = 0;
553e12c5d1SDavid du Colombier 	for(;;){
563e12c5d1SDavid du Colombier 		if(--nptrs < 0) break;
573e12c5d1SDavid du Colombier 		*p++ = s;
583e12c5d1SDavid du Colombier 		while(is_field[c = *s++])
593e12c5d1SDavid du Colombier 			;
603e12c5d1SDavid du Colombier 		if(c == 0) break;
613e12c5d1SDavid du Colombier 		s[-1] = 0;
623e12c5d1SDavid du Colombier 	}
633e12c5d1SDavid du Colombier 	if(nptrs > 0)
643e12c5d1SDavid du Colombier 		*p = 0;
653e12c5d1SDavid du Colombier 	else if(--s >= (unsigned char *)ss)
663e12c5d1SDavid du Colombier 		*s = c;
673e12c5d1SDavid du Colombier 	return(p - (unsigned char **)sp);
683e12c5d1SDavid du Colombier }
693e12c5d1SDavid du Colombier 
703e12c5d1SDavid du Colombier int
getmfields(char * ss,char ** sp,int nptrs)713e12c5d1SDavid du Colombier getmfields(char *ss, char **sp, int nptrs)
723e12c5d1SDavid du Colombier {
733e12c5d1SDavid du Colombier 	register unsigned char *s = (unsigned char *)ss;
743e12c5d1SDavid du Colombier 	register unsigned char **p = (unsigned char **)sp;
753e12c5d1SDavid du Colombier 	register unsigned c;
763e12c5d1SDavid du Colombier 
773e12c5d1SDavid du Colombier 	if(nptrs <= 0)
783e12c5d1SDavid du Colombier 		return(0);
793e12c5d1SDavid du Colombier 	goto flushdelim;
803e12c5d1SDavid du Colombier 	for(;;){
813e12c5d1SDavid du Colombier 		*p++ = s;
823e12c5d1SDavid du Colombier 		if(--nptrs == 0) break;
833e12c5d1SDavid du Colombier 		while(is_field[c = *s++])
843e12c5d1SDavid du Colombier 			;
853e12c5d1SDavid du Colombier 		/*
863e12c5d1SDavid du Colombier 		 *  s is now pointing 1 past the delimiter of the last field
873e12c5d1SDavid du Colombier 		 *  c is the delimiter
883e12c5d1SDavid du Colombier 		 */
893e12c5d1SDavid du Colombier 		if(c == 0) break;
903e12c5d1SDavid du Colombier 		s[-1] = 0;
913e12c5d1SDavid du Colombier 	flushdelim:
923e12c5d1SDavid du Colombier 		while(is_sep[c = *s++])
933e12c5d1SDavid du Colombier 			;
943e12c5d1SDavid du Colombier 		/*
953e12c5d1SDavid du Colombier 		 *  s is now pointing 1 past the beginning of the next field
963e12c5d1SDavid du Colombier 		 *  c is the first letter of the field
973e12c5d1SDavid du Colombier 		 */
983e12c5d1SDavid du Colombier 		if(c == 0) break;
993e12c5d1SDavid du Colombier 		s--;
1003e12c5d1SDavid du Colombier 		/*
1013e12c5d1SDavid du Colombier 		 *  s is now pointing to the beginning of the next field
1023e12c5d1SDavid du Colombier 		 *  c is the first letter of the field
1033e12c5d1SDavid du Colombier 		 */
1043e12c5d1SDavid du Colombier 	}
1053e12c5d1SDavid du Colombier 	if(nptrs > 0)
1063e12c5d1SDavid du Colombier 		*p = 0;
1073e12c5d1SDavid du Colombier 	return(p - (unsigned char **)sp);
1083e12c5d1SDavid du Colombier }
1093e12c5d1SDavid du Colombier 
1103e12c5d1SDavid du Colombier #ifdef	MAIN
1113e12c5d1SDavid du Colombier #include	<fio.h>
1123e12c5d1SDavid du Colombier 
main()1133e12c5d1SDavid du Colombier main()
1143e12c5d1SDavid du Colombier {
1153e12c5d1SDavid du Colombier 	char *fields[256];
1163e12c5d1SDavid du Colombier 	char *s;
1173e12c5d1SDavid du Colombier 	int n, i;
1183e12c5d1SDavid du Colombier 	char buf[1024];
1193e12c5d1SDavid du Colombier 
1203e12c5d1SDavid du Colombier 	print("go:\n");
1213e12c5d1SDavid du Colombier 	while(s = Frdline(0)){
1223e12c5d1SDavid du Colombier 		strcpy(buf, s);
1233e12c5d1SDavid du Colombier 		Fprint(1, "getf:");
1243e12c5d1SDavid du Colombier 		n = getfields(s, fields, 4);
1253e12c5d1SDavid du Colombier 		for(i = 0; i < n; i++)
1263e12c5d1SDavid du Colombier 			Fprint(1, " >%s<", fields[i]);
1273e12c5d1SDavid du Colombier 		Fputc(1, '\n');
1283e12c5d1SDavid du Colombier 		Fprint(1, "getmf:");
1293e12c5d1SDavid du Colombier 		n = getmfields(buf, fields, 4);
1303e12c5d1SDavid du Colombier 		for(i = 0; i < n; i++)
1313e12c5d1SDavid du Colombier 			Fprint(1, " >%s<", fields[i]);
1323e12c5d1SDavid du Colombier 		Fputc(1, '\n');
1333e12c5d1SDavid du Colombier 		Fflush(1);
1343e12c5d1SDavid du Colombier 	}
1353e12c5d1SDavid du Colombier 	exit(0);
1363e12c5d1SDavid du Colombier }
1373e12c5d1SDavid du Colombier #endif
138