Blame


1 b2cfc4e2 2003-09-30 devnull #include <lib9.h>
2 b2cfc4e2 2003-09-30 devnull
3 b2cfc4e2 2003-09-30 devnull static char qsep[] = " \t\r\n";
4 b2cfc4e2 2003-09-30 devnull
5 b2cfc4e2 2003-09-30 devnull static char*
6 b2cfc4e2 2003-09-30 devnull qtoken(char *s, char *sep)
7 b2cfc4e2 2003-09-30 devnull {
8 b2cfc4e2 2003-09-30 devnull int quoting;
9 b2cfc4e2 2003-09-30 devnull char *t;
10 b2cfc4e2 2003-09-30 devnull
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;
17 b2cfc4e2 2003-09-30 devnull }
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;
21 b2cfc4e2 2003-09-30 devnull t++;
22 b2cfc4e2 2003-09-30 devnull continue;
23 b2cfc4e2 2003-09-30 devnull }
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 */
27 b2cfc4e2 2003-09-30 devnull t++;
28 b2cfc4e2 2003-09-30 devnull quoting = 0;
29 b2cfc4e2 2003-09-30 devnull continue;
30 b2cfc4e2 2003-09-30 devnull }
31 b2cfc4e2 2003-09-30 devnull /* doubled quote; fold one quote into two */
32 b2cfc4e2 2003-09-30 devnull t++;
33 b2cfc4e2 2003-09-30 devnull *s++ = *t++;
34 b2cfc4e2 2003-09-30 devnull }
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)
38 b2cfc4e2 2003-09-30 devnull t++;
39 b2cfc4e2 2003-09-30 devnull }
40 b2cfc4e2 2003-09-30 devnull return t;
41 b2cfc4e2 2003-09-30 devnull }
42 b2cfc4e2 2003-09-30 devnull
43 b2cfc4e2 2003-09-30 devnull static char*
44 b2cfc4e2 2003-09-30 devnull etoken(char *t, char *sep)
45 b2cfc4e2 2003-09-30 devnull {
46 b2cfc4e2 2003-09-30 devnull int quoting;
47 b2cfc4e2 2003-09-30 devnull
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 != '\''){
52 b2cfc4e2 2003-09-30 devnull t++;
53 b2cfc4e2 2003-09-30 devnull continue;
54 b2cfc4e2 2003-09-30 devnull }
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;
58 b2cfc4e2 2003-09-30 devnull t++;
59 b2cfc4e2 2003-09-30 devnull continue;
60 b2cfc4e2 2003-09-30 devnull }
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 */
64 b2cfc4e2 2003-09-30 devnull t++;
65 b2cfc4e2 2003-09-30 devnull quoting = 0;
66 b2cfc4e2 2003-09-30 devnull continue;
67 b2cfc4e2 2003-09-30 devnull }
68 b2cfc4e2 2003-09-30 devnull /* doubled quote; fold one quote into two */
69 b2cfc4e2 2003-09-30 devnull t += 2;
70 b2cfc4e2 2003-09-30 devnull }
71 b2cfc4e2 2003-09-30 devnull return t;
72 b2cfc4e2 2003-09-30 devnull }
73 b2cfc4e2 2003-09-30 devnull
74 b2cfc4e2 2003-09-30 devnull int
75 b2cfc4e2 2003-09-30 devnull gettokens(char *s, char **args, int maxargs, char *sep)
76 b2cfc4e2 2003-09-30 devnull {
77 b2cfc4e2 2003-09-30 devnull int nargs;
78 b2cfc4e2 2003-09-30 devnull
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')
83 b2cfc4e2 2003-09-30 devnull break;
84 b2cfc4e2 2003-09-30 devnull args[nargs] = s;
85 b2cfc4e2 2003-09-30 devnull s = etoken(s, sep);
86 b2cfc4e2 2003-09-30 devnull }
87 b2cfc4e2 2003-09-30 devnull
88 b2cfc4e2 2003-09-30 devnull return nargs;
89 b2cfc4e2 2003-09-30 devnull }
90 b2cfc4e2 2003-09-30 devnull
91 b2cfc4e2 2003-09-30 devnull int
92 b2cfc4e2 2003-09-30 devnull tokenize(char *s, char **args, int maxargs)
93 b2cfc4e2 2003-09-30 devnull {
94 b2cfc4e2 2003-09-30 devnull int nargs;
95 b2cfc4e2 2003-09-30 devnull
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)
98 b2cfc4e2 2003-09-30 devnull s++;
99 b2cfc4e2 2003-09-30 devnull if(*s == '\0')
100 b2cfc4e2 2003-09-30 devnull break;
101 b2cfc4e2 2003-09-30 devnull args[nargs] = s;
102 b2cfc4e2 2003-09-30 devnull s = qtoken(s, qsep);
103 b2cfc4e2 2003-09-30 devnull }
104 b2cfc4e2 2003-09-30 devnull
105 b2cfc4e2 2003-09-30 devnull return nargs;
106 b2cfc4e2 2003-09-30 devnull }