1 b2cfc4e2 2003-09-30 devnull #include <lib9.h>
3 b2cfc4e2 2003-09-30 devnull static char qsep[] = " \t\r\n";
5 b2cfc4e2 2003-09-30 devnull static char*
6 b2cfc4e2 2003-09-30 devnull qtoken(char *s, char *sep)
8 b2cfc4e2 2003-09-30 devnull int quoting;
11 b2cfc4e2 2003-09-30 devnull quoting = 0;
12 b2cfc4e2 2003-09-30 devnull t = s; /* s is output string, t is input string */
13 b2cfc4e2 2003-09-30 devnull while(*t!='\0' && (quoting || utfrune(sep, *t)==nil)){
14 b2cfc4e2 2003-09-30 devnull if(*t != '\''){
15 b2cfc4e2 2003-09-30 devnull *s++ = *t++;
16 b2cfc4e2 2003-09-30 devnull continue;
18 b2cfc4e2 2003-09-30 devnull /* *t is a quote */
19 b2cfc4e2 2003-09-30 devnull if(!quoting){
20 b2cfc4e2 2003-09-30 devnull quoting = 1;
22 b2cfc4e2 2003-09-30 devnull continue;
24 b2cfc4e2 2003-09-30 devnull /* quoting and we're on a quote */
25 b2cfc4e2 2003-09-30 devnull if(t[1] != '\''){
26 b2cfc4e2 2003-09-30 devnull /* end of quoted section; absorb closing quote */
28 b2cfc4e2 2003-09-30 devnull quoting = 0;
29 b2cfc4e2 2003-09-30 devnull continue;
31 b2cfc4e2 2003-09-30 devnull /* doubled quote; fold one quote into two */
33 b2cfc4e2 2003-09-30 devnull *s++ = *t++;
35 b2cfc4e2 2003-09-30 devnull if(*s != '\0'){
36 b2cfc4e2 2003-09-30 devnull *s = '\0';
37 b2cfc4e2 2003-09-30 devnull if(t == s)
40 b2cfc4e2 2003-09-30 devnull return t;
43 b2cfc4e2 2003-09-30 devnull static char*
44 b2cfc4e2 2003-09-30 devnull etoken(char *t, char *sep)
46 b2cfc4e2 2003-09-30 devnull int quoting;
48 b2cfc4e2 2003-09-30 devnull /* move to end of next token */
49 b2cfc4e2 2003-09-30 devnull quoting = 0;
50 b2cfc4e2 2003-09-30 devnull while(*t!='\0' && (quoting || utfrune(sep, *t)==nil)){
51 b2cfc4e2 2003-09-30 devnull if(*t != '\''){
53 b2cfc4e2 2003-09-30 devnull continue;
55 b2cfc4e2 2003-09-30 devnull /* *t is a quote */
56 b2cfc4e2 2003-09-30 devnull if(!quoting){
57 b2cfc4e2 2003-09-30 devnull quoting = 1;
59 b2cfc4e2 2003-09-30 devnull continue;
61 b2cfc4e2 2003-09-30 devnull /* quoting and we're on a quote */
62 b2cfc4e2 2003-09-30 devnull if(t[1] != '\''){
63 b2cfc4e2 2003-09-30 devnull /* end of quoted section; absorb closing quote */
65 b2cfc4e2 2003-09-30 devnull quoting = 0;
66 b2cfc4e2 2003-09-30 devnull continue;
68 b2cfc4e2 2003-09-30 devnull /* doubled quote; fold one quote into two */
71 b2cfc4e2 2003-09-30 devnull return t;
75 b2cfc4e2 2003-09-30 devnull gettokens(char *s, char **args, int maxargs, char *sep)
77 b2cfc4e2 2003-09-30 devnull int nargs;
79 b2cfc4e2 2003-09-30 devnull for(nargs=0; nargs<maxargs; nargs++){
80 b2cfc4e2 2003-09-30 devnull while(*s!='\0' && utfrune(sep, *s)!=nil)
81 b2cfc4e2 2003-09-30 devnull *s++ = '\0';
82 b2cfc4e2 2003-09-30 devnull if(*s == '\0')
84 b2cfc4e2 2003-09-30 devnull args[nargs] = s;
85 b2cfc4e2 2003-09-30 devnull s = etoken(s, sep);
88 b2cfc4e2 2003-09-30 devnull return nargs;
92 b2cfc4e2 2003-09-30 devnull tokenize(char *s, char **args, int maxargs)
94 b2cfc4e2 2003-09-30 devnull int nargs;
96 b2cfc4e2 2003-09-30 devnull for(nargs=0; nargs<maxargs; nargs++){
97 b2cfc4e2 2003-09-30 devnull while(*s!='\0' && utfrune(qsep, *s)!=nil)
99 b2cfc4e2 2003-09-30 devnull if(*s == '\0')
101 b2cfc4e2 2003-09-30 devnull args[nargs] = s;
102 b2cfc4e2 2003-09-30 devnull s = qtoken(s, qsep);
105 b2cfc4e2 2003-09-30 devnull return nargs;