91 writer_put_lit(out, "=\""); |
91 writer_put_lit(out, "=\""); |
92 writer_put_str(out, (char*)ns->href); |
92 writer_put_str(out, (char*)ns->href); |
93 writer_putc (out, '\"'); |
93 writer_putc (out, '\"'); |
94 } |
94 } |
95 |
95 |
|
96 |
|
97 // html escape |
|
98 /* |
96 static void send_string_escaped(Writer *out, cxmutstr str) { |
99 static void send_string_escaped(Writer *out, cxmutstr str) { |
97 char *begin = str.ptr; |
100 char *begin = str.ptr; |
98 char *end = begin; |
101 char *end = begin; |
99 char *escape = NULL; |
102 char *escape = NULL; |
100 int esclen; |
103 int esclen; |
101 for(size_t i=0;i<str.length;i++) { |
104 for(size_t i=0;i<str.length;i++) { |
102 char c = str.ptr[i]; |
105 char c = str.ptr[i]; |
103 end = str.ptr + i; |
106 end = str.ptr + i; |
104 switch(c) { |
107 switch(c) { |
105 /* |
|
106 case '"': { |
108 case '"': { |
107 escape = """; |
109 escape = """; |
108 esclen = 6; |
110 esclen = 6; |
109 break; |
111 break; |
110 } |
112 } |
126 case '>': { |
128 case '>': { |
127 escape = ">"; |
129 escape = ">"; |
128 esclen = 4; |
130 esclen = 4; |
129 break; |
131 break; |
130 } |
132 } |
131 */ |
|
132 case ' ': { |
|
133 escape = "%20"; |
|
134 esclen = 3; |
|
135 break; |
|
136 } |
|
137 case '&': { |
|
138 escape = "%26"; |
|
139 esclen = 3; |
|
140 break; |
|
141 } |
|
142 default: continue; |
133 default: continue; |
143 } |
134 } |
144 ptrdiff_t len = end - begin; |
135 ptrdiff_t len = end - begin; |
145 if(len > 0) { |
136 if(len > 0) { |
146 writer_put(out, begin, len); |
137 writer_put(out, begin, len); |
147 begin = end + 1; |
138 begin = end + 1; |
148 } |
139 } |
149 writer_put(out, escape, esclen); |
140 writer_put(out, escape, esclen); |
|
141 } |
|
142 ptrdiff_t len = end - begin; |
|
143 if(len > 0) { |
|
144 writer_put(out, begin, len + 1); |
|
145 begin = end + 1; |
|
146 } |
|
147 } |
|
148 */ |
|
149 |
|
150 static const char hex_ch[] = "0123456789ABCDEF"; |
|
151 |
|
152 static void send_string_escaped(Writer *out, cxmutstr str) { |
|
153 char *begin = str.ptr; |
|
154 char *end = begin; |
|
155 |
|
156 char escape[4]; |
|
157 escape[0] = '%'; |
|
158 |
|
159 for(size_t i=0;i<str.length;i++) { |
|
160 unsigned char c = (unsigned char)str.ptr[i]; |
|
161 end = str.ptr + i; |
|
162 |
|
163 // check if the character must be escaped |
|
164 if( (c >= 'A' && c <= 'Z') || |
|
165 (c >= 'a' && c <= 'z') || |
|
166 (c >= '/' && c <= '9') || |
|
167 (strchr("_.\\-~", c) != NULL)) |
|
168 { |
|
169 continue; |
|
170 } |
|
171 |
|
172 // convert char to hex number, escape[0] always contains '%' |
|
173 escape[1] = hex_ch[(c >> 4) & 0x0F]; |
|
174 escape[2] = hex_ch[c & 0x0F]; |
|
175 |
|
176 // write previous unescaped chars, if available |
|
177 ptrdiff_t len = end - begin; |
|
178 if(len > 0) { |
|
179 writer_put(out, begin, len); |
|
180 } |
|
181 |
|
182 // write escaped char |
|
183 writer_put(out, escape, 3); |
|
184 |
|
185 // begin next chunk |
|
186 begin = end + 1; |
150 } |
187 } |
151 ptrdiff_t len = end - begin; |
188 ptrdiff_t len = end - begin; |
152 if(len > 0) { |
189 if(len > 0) { |
153 writer_put(out, begin, len + 1); |
190 writer_put(out, begin, len + 1); |
154 begin = end + 1; |
191 begin = end + 1; |