|  | #include <u.h> | 
|  | #include <libc.h> | 
|  | #include "libString.h" | 
|  |  | 
|  | #undef isspace | 
|  | #define isspace(c) ((c)==' ' || (c)=='\t' || (c)=='\n') | 
|  |  | 
|  | /* Get the next field from a String.  The field is delimited by white space, | 
|  | * single or double quotes. | 
|  | */ | 
|  | String * | 
|  | s_parse(String *from, String *to) | 
|  | { | 
|  | if (*from->ptr == '\0') | 
|  | return 0; | 
|  | if (to == 0) | 
|  | to = s_new(); | 
|  | if (*from->ptr == '\'') { | 
|  | from->ptr++; | 
|  | for (;*from->ptr != '\'' && *from->ptr != '\0'; from->ptr++) | 
|  | s_putc(to, *from->ptr); | 
|  | if (*from->ptr == '\'') | 
|  | from->ptr++; | 
|  | } else if (*from->ptr == '"') { | 
|  | from->ptr++; | 
|  | for (;*from->ptr != '"' && *from->ptr != '\0'; from->ptr++) | 
|  | s_putc(to, *from->ptr); | 
|  | if (*from->ptr == '"') | 
|  | from->ptr++; | 
|  | } else { | 
|  | for (;!isspace(*from->ptr) && *from->ptr != '\0'; from->ptr++) | 
|  | s_putc(to, *from->ptr); | 
|  | } | 
|  | s_terminate(to); | 
|  |  | 
|  | /* crunch trailing white */ | 
|  | while(isspace(*from->ptr)) | 
|  | from->ptr++; | 
|  |  | 
|  | return to; | 
|  | } |