|
|
1.1 root 1: static char is_sep[256], is_field[256];
2: static init = 0;
3:
4: void
5: setfields(arg)
6: char *arg;
7: {
8: register unsigned char *s = (unsigned char *)arg;
9:
10: memset(is_sep, 0, sizeof is_sep);
11: memset(is_field, 1, sizeof is_field);
12: while(*s){
13: is_sep[*s] = 1;
14: is_field[*s++] = 0;
15: }
16: is_field[0] = 0;
17: init = 1;
18: }
19:
20: getfields(ss, sp, nptrs)
21: char *ss;
22: char **sp;
23: {
24: register unsigned char *s = (unsigned char *)ss;
25: register unsigned char **p = (unsigned char **)sp;
26: register unsigned c;
27:
28: if(init == 0)
29: setfields(" \t");
30: for(;;){
31: if(*s == 0) break;
32: if(--nptrs < 0) break;
33: *p++ = s;
34: while(is_field[c = *s++]);
35: if(c == 0) break;
36: s[-1] = 0;
37: }
38: if(nptrs > 0)
39: *p = 0;
40: else if(--s >= (unsigned char *)ss)
41: *s = c;
42: return(p - (unsigned char **)sp);
43: }
44:
45: getmfields(ss, sp, nptrs)
46: char *ss;
47: char **sp;
48: {
49: register unsigned char *s = (unsigned char *)ss;
50: register unsigned char **p = (unsigned char **)sp;
51: register unsigned c;
52: unsigned char *goo;
53:
54: if(init == 0)
55: setfields(" \t");
56: if(*s){
57: while(nptrs-- > 0){
58: *p++ = s;
59: while(is_field[*s++]);
60: goo = s-1;
61: if((c = *goo) == 0)
62: break;
63: *goo = 0;
64: while(is_sep[*s]) s++;
65: if(*s == 0) break;
66: }
67: }
68: if(nptrs > 0) /* plenty of room */
69: *p = 0;
70: else if(*s) /* no room and we found a trailing non-is_seper */
71: *goo = c;
72: return(p - (unsigned char **)sp);
73: }
74:
75: #ifdef MAIN
76: #include <fio.h>
77:
78: main()
79: {
80: char *fields[256];
81: char *s;
82: int n, i;
83:
84: print("go:\n");
85: while(s = Frdline(0)){
86: n = getmfields(s, fields, 3);
87: for(i = 0; i < n; i++)
88: Fprint(1, ">%s< ", fields[i]);
89: Fputc(1, '\n');
90: Fflush(1);
91: }
92: exit(0);
93: }
94: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.