Blame


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