xref: /plan9/sys/src/libString/s_parse.c (revision 80ee5cbfe36716af62da8896207e9763b8e3d760)
1*80ee5cbfSDavid du Colombier #include <u.h>
2*80ee5cbfSDavid du Colombier #include <libc.h>
3*80ee5cbfSDavid du Colombier #include "String.h"
4*80ee5cbfSDavid du Colombier 
5*80ee5cbfSDavid du Colombier #define isspace(c) ((c)==' ' || (c)=='\t' || (c)=='\n')
6*80ee5cbfSDavid du Colombier 
7*80ee5cbfSDavid du Colombier /* Get the next field from a String.  The field is delimited by white space,
8*80ee5cbfSDavid du Colombier  * single or double quotes.
9*80ee5cbfSDavid du Colombier  */
10*80ee5cbfSDavid du Colombier String *
s_parse(String * from,String * to)11*80ee5cbfSDavid du Colombier s_parse(String *from, String *to)
12*80ee5cbfSDavid du Colombier {
13*80ee5cbfSDavid du Colombier 	if (*from->ptr == '\0')
14*80ee5cbfSDavid du Colombier 		return 0;
15*80ee5cbfSDavid du Colombier 	if (to == 0)
16*80ee5cbfSDavid du Colombier 		to = s_new();
17*80ee5cbfSDavid du Colombier 	if (*from->ptr == '\'') {
18*80ee5cbfSDavid du Colombier 		from->ptr++;
19*80ee5cbfSDavid du Colombier 		for (;*from->ptr != '\'' && *from->ptr != '\0'; from->ptr++)
20*80ee5cbfSDavid du Colombier 			s_putc(to, *from->ptr);
21*80ee5cbfSDavid du Colombier 		if (*from->ptr == '\'')
22*80ee5cbfSDavid du Colombier 			from->ptr++;
23*80ee5cbfSDavid du Colombier 	} else if (*from->ptr == '"') {
24*80ee5cbfSDavid du Colombier 		from->ptr++;
25*80ee5cbfSDavid du Colombier 		for (;*from->ptr != '"' && *from->ptr != '\0'; from->ptr++)
26*80ee5cbfSDavid du Colombier 			s_putc(to, *from->ptr);
27*80ee5cbfSDavid du Colombier 		if (*from->ptr == '"')
28*80ee5cbfSDavid du Colombier 			from->ptr++;
29*80ee5cbfSDavid du Colombier 	} else {
30*80ee5cbfSDavid du Colombier 		for (;!isspace(*from->ptr) && *from->ptr != '\0'; from->ptr++)
31*80ee5cbfSDavid du Colombier 			s_putc(to, *from->ptr);
32*80ee5cbfSDavid du Colombier 	}
33*80ee5cbfSDavid du Colombier 	s_terminate(to);
34*80ee5cbfSDavid du Colombier 
35*80ee5cbfSDavid du Colombier 	/* crunch trailing white */
36*80ee5cbfSDavid du Colombier 	while(isspace(*from->ptr))
37*80ee5cbfSDavid du Colombier 		from->ptr++;
38*80ee5cbfSDavid du Colombier 
39*80ee5cbfSDavid du Colombier 	return to;
40*80ee5cbfSDavid du Colombier }
41