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