File:  [Research Unix] / researchv9 / libc / gen / getfields.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 17:22:00 2018 UTC (8 years, 1 month ago) by root
Branches: belllabs, MAIN
CVS tags: researchv9-SUN3_old, researchv9-SUN3, HEAD
researchv9-SUN3(old)

#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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.