|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.