V9/libc/gen/getfields.c

Compare this file to the similar file:
Show the results in this format:

#include	<libc.h>

static char is_sep[256], is_field[256];
static init = 0;

void
setfields(arg)
	char *arg;
{
	register unsigned char *s = (unsigned char *)arg;

	memset(is_sep, 0, sizeof is_sep);
	memset(is_field, 1, sizeof is_field);
	while(*s){
		is_sep[*s] = 1;
		is_field[*s++] = 0;
	}
	is_field[0] = 0;
	init = 1;
}

getfields(ss, sp, nptrs)
	char *ss;
	char **sp;
{
	register unsigned char *s = (unsigned char *)ss;
	register unsigned char **p = (unsigned char **)sp;
	register unsigned c;

	if(init == 0)
		setfields(" \t");
	for(;;){
		if(*s == 0) break;
		if(--nptrs < 0) break;
		*p++ = s;
		while(is_field[c = *s++]);
		if(c == 0) break;
		s[-1] = 0;
	}
	if(nptrs > 0)
		*p = 0;
	else if(--s >= (unsigned char *)ss)
		*s = c;
	return(p - (unsigned char **)sp);
}

getmfields(ss, sp, nptrs)
	char *ss;
	char **sp;
{
	register unsigned char *s = (unsigned char *)ss;
	register unsigned char **p = (unsigned char **)sp;
	register unsigned c;
	unsigned char *goo;

	if(init == 0)
		setfields(" \t");
	if(*s){
		while(nptrs-- > 0){
			*p++ = s;
			while(is_field[*s++]);
			goo = s-1;
			if((c = *goo) == 0)
				break;
			*goo = 0;
			while(is_sep[*s]) s++;
			if(*s == 0) break;
		}
	}
	if(nptrs > 0)	/* plenty of room */
		*p = 0;
	else if(*s)	/* no room and we found a trailing non-is_seper */
		*goo = c;
	return(p - (unsigned char **)sp);
}

#ifdef	MAIN
#include	<fio.h>

main()
{
	char *fields[256];
	char *s;
	int n, i;

	print("go:\n");
	while(s = Frdline(0)){
		n = getmfields(s, fields, 3);
		for(i = 0; i < n; i++)
			Fprint(1, ">%s< ", fields[i]);
		Fputc(1, '\n');
		Fflush(1);
	}
	exit(0);
}
#endif