1*80ee5cbfSDavid du Colombier #include <u.h>
2*80ee5cbfSDavid du Colombier #include <libc.h>
3*80ee5cbfSDavid du Colombier
4*80ee5cbfSDavid du Colombier int (*doquote)(int);
5*80ee5cbfSDavid du Colombier
6*80ee5cbfSDavid du Colombier extern int _needsquotes(char*, int*);
7*80ee5cbfSDavid du Colombier extern int _runeneedsquotes(Rune*, int*);
8*80ee5cbfSDavid du Colombier
9*80ee5cbfSDavid du Colombier char*
unquotestrdup(char * s)10*80ee5cbfSDavid du Colombier unquotestrdup(char *s)
11*80ee5cbfSDavid du Colombier {
12*80ee5cbfSDavid du Colombier char *t, *ret;
13*80ee5cbfSDavid du Colombier int quoting;
14*80ee5cbfSDavid du Colombier
15*80ee5cbfSDavid du Colombier ret = s = strdup(s); /* return unquoted copy */
16*80ee5cbfSDavid du Colombier if(ret == nil)
17*80ee5cbfSDavid du Colombier return ret;
18*80ee5cbfSDavid du Colombier quoting = 0;
19*80ee5cbfSDavid du Colombier t = s; /* s is output string, t is input string */
20*80ee5cbfSDavid du Colombier while(*t!='\0' && (quoting || (*t!=' ' && *t!='\t'))){
21*80ee5cbfSDavid du Colombier if(*t != '\''){
22*80ee5cbfSDavid du Colombier *s++ = *t++;
23*80ee5cbfSDavid du Colombier continue;
24*80ee5cbfSDavid du Colombier }
25*80ee5cbfSDavid du Colombier /* *t is a quote */
26*80ee5cbfSDavid du Colombier if(!quoting){
27*80ee5cbfSDavid du Colombier quoting = 1;
28*80ee5cbfSDavid du Colombier t++;
29*80ee5cbfSDavid du Colombier continue;
30*80ee5cbfSDavid du Colombier }
31*80ee5cbfSDavid du Colombier /* quoting and we're on a quote */
32*80ee5cbfSDavid du Colombier if(t[1] != '\''){
33*80ee5cbfSDavid du Colombier /* end of quoted section; absorb closing quote */
34*80ee5cbfSDavid du Colombier t++;
35*80ee5cbfSDavid du Colombier quoting = 0;
36*80ee5cbfSDavid du Colombier continue;
37*80ee5cbfSDavid du Colombier }
38*80ee5cbfSDavid du Colombier /* doubled quote; fold one quote into two */
39*80ee5cbfSDavid du Colombier t++;
40*80ee5cbfSDavid du Colombier *s++ = *t++;
41*80ee5cbfSDavid du Colombier }
42*80ee5cbfSDavid du Colombier if(t != s)
43*80ee5cbfSDavid du Colombier memmove(s, t, strlen(t)+1);
44*80ee5cbfSDavid du Colombier return ret;
45*80ee5cbfSDavid du Colombier }
46*80ee5cbfSDavid du Colombier
47*80ee5cbfSDavid du Colombier Rune*
unquoterunestrdup(Rune * s)48*80ee5cbfSDavid du Colombier unquoterunestrdup(Rune *s)
49*80ee5cbfSDavid du Colombier {
50*80ee5cbfSDavid du Colombier Rune *t, *ret;
51*80ee5cbfSDavid du Colombier int quoting;
52*80ee5cbfSDavid du Colombier
53*80ee5cbfSDavid du Colombier ret = s = runestrdup(s); /* return unquoted copy */
54*80ee5cbfSDavid du Colombier if(ret == nil)
55*80ee5cbfSDavid du Colombier return ret;
56*80ee5cbfSDavid du Colombier quoting = 0;
57*80ee5cbfSDavid du Colombier t = s; /* s is output string, t is input string */
58*80ee5cbfSDavid du Colombier while(*t!='\0' && (quoting || (*t!=' ' && *t!='\t'))){
59*80ee5cbfSDavid du Colombier if(*t != '\''){
60*80ee5cbfSDavid du Colombier *s++ = *t++;
61*80ee5cbfSDavid du Colombier continue;
62*80ee5cbfSDavid du Colombier }
63*80ee5cbfSDavid du Colombier /* *t is a quote */
64*80ee5cbfSDavid du Colombier if(!quoting){
65*80ee5cbfSDavid du Colombier quoting = 1;
66*80ee5cbfSDavid du Colombier t++;
67*80ee5cbfSDavid du Colombier continue;
68*80ee5cbfSDavid du Colombier }
69*80ee5cbfSDavid du Colombier /* quoting and we're on a quote */
70*80ee5cbfSDavid du Colombier if(t[1] != '\''){
71*80ee5cbfSDavid du Colombier /* end of quoted section; absorb closing quote */
72*80ee5cbfSDavid du Colombier t++;
73*80ee5cbfSDavid du Colombier quoting = 0;
74*80ee5cbfSDavid du Colombier continue;
75*80ee5cbfSDavid du Colombier }
76*80ee5cbfSDavid du Colombier /* doubled quote; fold one quote into two */
77*80ee5cbfSDavid du Colombier t++;
78*80ee5cbfSDavid du Colombier *s++ = *t++;
79*80ee5cbfSDavid du Colombier }
80*80ee5cbfSDavid du Colombier if(t != s)
81*80ee5cbfSDavid du Colombier memmove(s, t, (runestrlen(t)+1)*sizeof(Rune));
82*80ee5cbfSDavid du Colombier return ret;
83*80ee5cbfSDavid du Colombier }
84*80ee5cbfSDavid du Colombier
85*80ee5cbfSDavid du Colombier char*
quotestrdup(char * s)86*80ee5cbfSDavid du Colombier quotestrdup(char *s)
87*80ee5cbfSDavid du Colombier {
88*80ee5cbfSDavid du Colombier char *t, *u, *ret;
89*80ee5cbfSDavid du Colombier int quotelen;
90*80ee5cbfSDavid du Colombier Rune r;
91*80ee5cbfSDavid du Colombier
92*80ee5cbfSDavid du Colombier if(_needsquotes(s, "elen) == 0)
93*80ee5cbfSDavid du Colombier return strdup(s);
94*80ee5cbfSDavid du Colombier
95*80ee5cbfSDavid du Colombier ret = malloc(quotelen+1);
96*80ee5cbfSDavid du Colombier if(ret == nil)
97*80ee5cbfSDavid du Colombier return nil;
98*80ee5cbfSDavid du Colombier u = ret;
99*80ee5cbfSDavid du Colombier *u++ = '\'';
100*80ee5cbfSDavid du Colombier for(t=s; *t; t++){
101*80ee5cbfSDavid du Colombier r = *t;
102*80ee5cbfSDavid du Colombier if(r == L'\'')
103*80ee5cbfSDavid du Colombier *u++ = r; /* double the quote */
104*80ee5cbfSDavid du Colombier *u++ = r;
105*80ee5cbfSDavid du Colombier }
106*80ee5cbfSDavid du Colombier *u++ = '\'';
107*80ee5cbfSDavid du Colombier *u = '\0';
108*80ee5cbfSDavid du Colombier return ret;
109*80ee5cbfSDavid du Colombier }
110*80ee5cbfSDavid du Colombier
111*80ee5cbfSDavid du Colombier Rune*
quoterunestrdup(Rune * s)112*80ee5cbfSDavid du Colombier quoterunestrdup(Rune *s)
113*80ee5cbfSDavid du Colombier {
114*80ee5cbfSDavid du Colombier Rune *t, *u, *ret;
115*80ee5cbfSDavid du Colombier int quotelen;
116*80ee5cbfSDavid du Colombier Rune r;
117*80ee5cbfSDavid du Colombier
118*80ee5cbfSDavid du Colombier if(_runeneedsquotes(s, "elen) == 0)
119*80ee5cbfSDavid du Colombier return runestrdup(s);
120*80ee5cbfSDavid du Colombier
121*80ee5cbfSDavid du Colombier ret = malloc((quotelen+1)*sizeof(Rune));
122*80ee5cbfSDavid du Colombier if(ret == nil)
123*80ee5cbfSDavid du Colombier return nil;
124*80ee5cbfSDavid du Colombier u = ret;
125*80ee5cbfSDavid du Colombier *u++ = '\'';
126*80ee5cbfSDavid du Colombier for(t=s; *t; t++){
127*80ee5cbfSDavid du Colombier r = *t;
128*80ee5cbfSDavid du Colombier if(r == L'\'')
129*80ee5cbfSDavid du Colombier *u++ = r; /* double the quote */
130*80ee5cbfSDavid du Colombier *u++ = r;
131*80ee5cbfSDavid du Colombier }
132*80ee5cbfSDavid du Colombier *u++ = '\'';
133*80ee5cbfSDavid du Colombier *u = '\0';
134*80ee5cbfSDavid du Colombier return ret;
135*80ee5cbfSDavid du Colombier }
136