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