xref: /plan9/sys/src/ape/lib/v/getfields.c (revision 781103c4074deb8af160e8a0da2742ba6b29dc2b)
1 #define _RESEARCH_SOURCE
2 #include <libv.h>
3 #include <string.h>
4 
5 static char is_sep[256] = {
6 	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,
7 	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,
8 	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,
9 	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,
10 	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,
11 	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,
12 	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,
13 	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,
14 };
15 static char is_field[256] = {
16 	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,
17 	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,
18 	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,
19 	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,
20 	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,
21 	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,
22 	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,
23 	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,
24 };
25 static char last_sep[256];
26 
27 char *
setfields(char * arg)28 setfields(char *arg)
29 {
30 	register unsigned char *s;
31 	register i;
32 
33 	for(i = 1, s = (unsigned char *)last_sep; i < 256; i++)
34 		if(is_sep[i])
35 			*s++ = i;
36 	*s = 0;
37 	memset(is_sep, 0, sizeof is_sep);
38 	memset(is_field, 1, sizeof is_field);
39 	for(s = (unsigned char *)arg; *s;){
40 		is_sep[*s] = 1;
41 		is_field[*s++] = 0;
42 	}
43 	is_field[0] = 0;
44 	return(last_sep);
45 }
46 
47 int
getfields(char * ss,char ** sp,int nptrs)48 getfields(char *ss, char **sp, int nptrs)
49 {
50 	register unsigned char *s = (unsigned char *)ss;
51 	register unsigned char **p = (unsigned char **)sp;
52 	register unsigned c;
53 
54 	c = 0;
55 	for(;;){
56 		if(--nptrs < 0) break;
57 		*p++ = s;
58 		while(is_field[c = *s++])
59 			;
60 		if(c == 0) break;
61 		s[-1] = 0;
62 	}
63 	if(nptrs > 0)
64 		*p = 0;
65 	else if(--s >= (unsigned char *)ss)
66 		*s = c;
67 	return(p - (unsigned char **)sp);
68 }
69 
70 int
getmfields(char * ss,char ** sp,int nptrs)71 getmfields(char *ss, char **sp, int nptrs)
72 {
73 	register unsigned char *s = (unsigned char *)ss;
74 	register unsigned char **p = (unsigned char **)sp;
75 	register unsigned c;
76 
77 	if(nptrs <= 0)
78 		return(0);
79 	goto flushdelim;
80 	for(;;){
81 		*p++ = s;
82 		if(--nptrs == 0) break;
83 		while(is_field[c = *s++])
84 			;
85 		/*
86 		 *  s is now pointing 1 past the delimiter of the last field
87 		 *  c is the delimiter
88 		 */
89 		if(c == 0) break;
90 		s[-1] = 0;
91 	flushdelim:
92 		while(is_sep[c = *s++])
93 			;
94 		/*
95 		 *  s is now pointing 1 past the beginning of the next field
96 		 *  c is the first letter of the field
97 		 */
98 		if(c == 0) break;
99 		s--;
100 		/*
101 		 *  s is now pointing to the beginning of the next field
102 		 *  c is the first letter of the field
103 		 */
104 	}
105 	if(nptrs > 0)
106 		*p = 0;
107 	return(p - (unsigned char **)sp);
108 }
109 
110 #ifdef	MAIN
111 #include	<fio.h>
112 
main()113 main()
114 {
115 	char *fields[256];
116 	char *s;
117 	int n, i;
118 	char buf[1024];
119 
120 	print("go:\n");
121 	while(s = Frdline(0)){
122 		strcpy(buf, s);
123 		Fprint(1, "getf:");
124 		n = getfields(s, fields, 4);
125 		for(i = 0; i < n; i++)
126 			Fprint(1, " >%s<", fields[i]);
127 		Fputc(1, '\n');
128 		Fprint(1, "getmf:");
129 		n = getmfields(buf, fields, 4);
130 		for(i = 0; i < n; i++)
131 			Fprint(1, " >%s<", fields[i]);
132 		Fputc(1, '\n');
133 		Fflush(1);
134 	}
135 	exit(0);
136 }
137 #endif
138