xref: /plan9/sys/src/ape/lib/ap/gen/strtok.c (revision 2d069fea74dfcc83c6858e715bf74862cb64720a)
13e12c5d1SDavid du Colombier #include <string.h>
23e12c5d1SDavid du Colombier 
33e12c5d1SDavid du Colombier #define	N	256
43e12c5d1SDavid du Colombier 
53e12c5d1SDavid du Colombier char*
strtok_r(char * s,const char * b,char ** last)6*2d069feaSDavid du Colombier strtok_r(char *s, const char *b, char **last)
73e12c5d1SDavid du Colombier {
83e12c5d1SDavid du Colombier 	char map[N], *os;
93e12c5d1SDavid du Colombier 
103e12c5d1SDavid du Colombier 	memset(map, 0, N);
113e12c5d1SDavid du Colombier 	while(*b)
123e12c5d1SDavid du Colombier 		map[*(unsigned char*)b++] = 1;
133e12c5d1SDavid du Colombier 	if(s == 0)
14*2d069feaSDavid du Colombier 		s = *last;
153e12c5d1SDavid du Colombier 	while(map[*(unsigned char*)s++])
163e12c5d1SDavid du Colombier 		;
173e12c5d1SDavid du Colombier 	if(*--s == 0)
183e12c5d1SDavid du Colombier 		return 0;
193e12c5d1SDavid du Colombier 	os = s;
203e12c5d1SDavid du Colombier 	while(map[*(unsigned char*)s] == 0)
213e12c5d1SDavid du Colombier 		if(*s++ == 0) {
22*2d069feaSDavid du Colombier 			*last = s-1;
233e12c5d1SDavid du Colombier 			return os;
243e12c5d1SDavid du Colombier 		}
253e12c5d1SDavid du Colombier 	*s++ = 0;
26*2d069feaSDavid du Colombier 	*last = s;
273e12c5d1SDavid du Colombier 	return os;
283e12c5d1SDavid du Colombier }
29*2d069feaSDavid du Colombier 
30*2d069feaSDavid du Colombier char*
strtok(char * s,const char * b)31*2d069feaSDavid du Colombier strtok(char *s, const char *b)
32*2d069feaSDavid du Colombier {
33*2d069feaSDavid du Colombier 	static char *under_rock;
34*2d069feaSDavid du Colombier 
35*2d069feaSDavid du Colombier 	return strtok_r(s, b, &under_rock);
36*2d069feaSDavid du Colombier }
37