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