|
diff --git a/html.c b/html.c index a1fe87d..a60bc13 100644 --- a/ html.c+++ b/ html.c |
|
@@ -152,169 +152,169 @@ void html_attr(const char *txt) |
152 | } |
152 | } |
153 | t++; |
153 | t++; |
154 | } |
154 | } |
155 | if (t!=txt) |
155 | if (t!=txt) |
156 | html(txt); |
156 | html(txt); |
157 | } |
157 | } |
158 | |
158 | |
159 | void html_url_path(const char *txt) |
159 | void html_url_path(const char *txt) |
160 | { |
160 | { |
161 | const char *t = txt; |
161 | const char *t = txt; |
162 | while(t && *t){ |
162 | while(t && *t){ |
163 | int c = *t; |
163 | int c = *t; |
164 | const char *e = url_escape_table[c]; |
164 | const char *e = url_escape_table[c]; |
165 | if (e && c!='+' && c!='&' && c!='+') { |
165 | if (e && c!='+' && c!='&' && c!='+') { |
166 | html_raw(txt, t - txt); |
166 | html_raw(txt, t - txt); |
167 | html_raw(e, 3); |
167 | html_raw(e, 3); |
168 | txt = t+1; |
168 | txt = t+1; |
169 | } |
169 | } |
170 | t++; |
170 | t++; |
171 | } |
171 | } |
172 | if (t!=txt) |
172 | if (t!=txt) |
173 | html(txt); |
173 | html(txt); |
174 | } |
174 | } |
175 | |
175 | |
176 | void html_url_arg(const char *txt) |
176 | void html_url_arg(const char *txt) |
177 | { |
177 | { |
178 | const char *t = txt; |
178 | const char *t = txt; |
179 | while(t && *t){ |
179 | while(t && *t){ |
180 | int c = *t; |
180 | int c = *t; |
181 | const char *e = url_escape_table[c]; |
181 | const char *e = url_escape_table[c]; |
182 | if (e) { |
182 | if (e) { |
183 | html_raw(txt, t - txt); |
183 | html_raw(txt, t - txt); |
184 | html_raw(e, strlen(e)); |
184 | html_raw(e, strlen(e)); |
185 | txt = t+1; |
185 | txt = t+1; |
186 | } |
186 | } |
187 | t++; |
187 | t++; |
188 | } |
188 | } |
189 | if (t!=txt) |
189 | if (t!=txt) |
190 | html(txt); |
190 | html(txt); |
191 | } |
191 | } |
192 | |
192 | |
193 | void html_hidden(const char *name, const char *value) |
193 | void html_hidden(const char *name, const char *value) |
194 | { |
194 | { |
195 | html("<input type='hidden' name='"); |
195 | html("<input type='hidden' name='"); |
196 | html_attr(name); |
196 | html_attr(name); |
197 | html("' value='"); |
197 | html("' value='"); |
198 | html_attr(value); |
198 | html_attr(value); |
199 | html("'/>"); |
199 | html("'/>"); |
200 | } |
200 | } |
201 | |
201 | |
202 | void html_option(const char *value, const char *text, const char *selected_value) |
202 | void html_option(const char *value, const char *text, const char *selected_value) |
203 | { |
203 | { |
204 | html("<option value='"); |
204 | html("<option value='"); |
205 | html_attr(value); |
205 | html_attr(value); |
206 | html("'"); |
206 | html("'"); |
207 | if (selected_value && !strcmp(selected_value, value)) |
207 | if (selected_value && !strcmp(selected_value, value)) |
208 | html(" selected='selected'"); |
208 | html(" selected='selected'"); |
209 | html(">"); |
209 | html(">"); |
210 | html_txt(text); |
210 | html_txt(text); |
211 | html("</option>\n"); |
211 | html("</option>\n"); |
212 | } |
212 | } |
213 | |
213 | |
214 | void html_link_open(const char *url, const char *title, const char *class) |
214 | void html_link_open(const char *url, const char *title, const char *class) |
215 | { |
215 | { |
216 | html("<a href='"); |
216 | html("<a href='"); |
217 | html_attr(url); |
217 | html_attr(url); |
218 | if (title) { |
218 | if (title) { |
219 | html("' title='"); |
219 | html("' title='"); |
220 | html_attr(title); |
220 | html_attr(title); |
221 | } |
221 | } |
222 | if (class) { |
222 | if (class) { |
223 | html("' class='"); |
223 | html("' class='"); |
224 | html_attr(class); |
224 | html_attr(class); |
225 | } |
225 | } |
226 | html("'>"); |
226 | html("'>"); |
227 | } |
227 | } |
228 | |
228 | |
229 | void html_link_close(void) |
229 | void html_link_close(void) |
230 | { |
230 | { |
231 | html("</a>"); |
231 | html("</a>"); |
232 | } |
232 | } |
233 | |
233 | |
234 | void html_fileperm(unsigned short mode) |
234 | void html_fileperm(unsigned short mode) |
235 | { |
235 | { |
236 | htmlf("%c%c%c", (mode & 4 ? 'r' : '-'), |
236 | htmlf("%c%c%c", (mode & 4 ? 'r' : '-'), |
237 | (mode & 2 ? 'w' : '-'), (mode & 1 ? 'x' : '-')); |
237 | (mode & 2 ? 'w' : '-'), (mode & 1 ? 'x' : '-')); |
238 | } |
238 | } |
239 | |
239 | |
240 | int html_include(const char *filename) |
240 | int html_include(const char *filename) |
241 | { |
241 | { |
242 | FILE *f; |
242 | FILE *f; |
243 | char buf[4096]; |
243 | char buf[4096]; |
244 | size_t len; |
244 | size_t len; |
245 | |
245 | |
246 | if (!(f = fopen(filename, "r"))) { |
246 | if (!(f = fopen(filename, "r"))) { |
247 | fprintf(stderr, "[cgit] Failed to include file %s: %s (%d).\n", |
247 | fprintf(stderr, "[cgit] Failed to include file %s: %s (%d).\n", |
248 | filename, strerror(errno), errno); |
248 | filename, strerror(errno), errno); |
249 | return -1; |
249 | return -1; |
250 | } |
250 | } |
251 | while((len = fread(buf, 1, 4096, f)) > 0) |
251 | while((len = fread(buf, 1, 4096, f)) > 0) |
252 | html_raw(buf, len); |
252 | html_raw(buf, len); |
253 | fclose(f); |
253 | fclose(f); |
254 | return 0; |
254 | return 0; |
255 | } |
255 | } |
256 | |
256 | |
257 | int hextoint(char c) |
257 | int hextoint(char c) |
258 | { |
258 | { |
259 | if (c >= 'a' && c <= 'f') |
259 | if (c >= 'a' && c <= 'f') |
260 | return 10 + c - 'a'; |
260 | return 10 + c - 'a'; |
261 | else if (c >= 'A' && c <= 'F') |
261 | else if (c >= 'A' && c <= 'F') |
262 | return 10 + c - 'A'; |
262 | return 10 + c - 'A'; |
263 | else if (c >= '0' && c <= '9') |
263 | else if (c >= '0' && c <= '9') |
264 | return c - '0'; |
264 | return c - '0'; |
265 | else |
265 | else |
266 | return -1; |
266 | return -1; |
267 | } |
267 | } |
268 | |
268 | |
269 | char *convert_query_hexchar(char *txt) |
269 | char *convert_query_hexchar(char *txt) |
270 | { |
270 | { |
271 | int d1, d2, n; |
271 | int d1, d2, n; |
272 | n = strlen(txt); |
272 | n = strlen(txt); |
273 | if (n < 3) { |
273 | if (n < 3) { |
274 | *txt = '\0'; |
274 | *txt = '\0'; |
275 | return txt-1; |
275 | return txt-1; |
276 | } |
276 | } |
277 | d1 = hextoint(*(txt+1)); |
277 | d1 = hextoint(*(txt+1)); |
278 | d2 = hextoint(*(txt+2)); |
278 | d2 = hextoint(*(txt+2)); |
279 | if (d1<0 || d2<0) { |
279 | if (d1<0 || d2<0) { |
280 | memmove(txt, txt+3, n-3); |
280 | memmove(txt, txt+3, n-2); |
281 | return txt-1; |
281 | return txt-1; |
282 | } else { |
282 | } else { |
283 | *txt = d1 * 16 + d2; |
283 | *txt = d1 * 16 + d2; |
284 | memmove(txt+1, txt+3, n-2); |
284 | memmove(txt+1, txt+3, n-2); |
285 | return txt; |
285 | return txt; |
286 | } |
286 | } |
287 | } |
287 | } |
288 | |
288 | |
289 | int http_parse_querystring(const char *txt_, void (*fn)(const char *name, const char *value)) |
289 | int http_parse_querystring(const char *txt_, void (*fn)(const char *name, const char *value)) |
290 | { |
290 | { |
291 | char *t, *txt, *value = NULL, c; |
291 | char *t, *txt, *value = NULL, c; |
292 | |
292 | |
293 | if (!txt_) |
293 | if (!txt_) |
294 | return 0; |
294 | return 0; |
295 | |
295 | |
296 | t = txt = strdup(txt_); |
296 | t = txt = strdup(txt_); |
297 | if (t == NULL) { |
297 | if (t == NULL) { |
298 | printf("Out of memory\n"); |
298 | printf("Out of memory\n"); |
299 | exit(1); |
299 | exit(1); |
300 | } |
300 | } |
301 | while((c=*t) != '\0') { |
301 | while((c=*t) != '\0') { |
302 | if (c=='=') { |
302 | if (c=='=') { |
303 | *t = '\0'; |
303 | *t = '\0'; |
304 | value = t+1; |
304 | value = t+1; |
305 | } else if (c=='+') { |
305 | } else if (c=='+') { |
306 | *t = ' '; |
306 | *t = ' '; |
307 | } else if (c=='%') { |
307 | } else if (c=='%') { |
308 | t = convert_query_hexchar(t); |
308 | t = convert_query_hexchar(t); |
309 | } else if (c=='&') { |
309 | } else if (c=='&') { |
310 | *t = '\0'; |
310 | *t = '\0'; |
311 | (*fn)(txt, value); |
311 | (*fn)(txt, value); |
312 | txt = t+1; |
312 | txt = t+1; |
313 | value = NULL; |
313 | value = NULL; |
314 | } |
314 | } |
315 | t++; |
315 | t++; |
316 | } |
316 | } |
317 | if (t!=txt) |
317 | if (t!=txt) |
318 | (*fn)(txt, value); |
318 | (*fn)(txt, value); |
319 | return 0; |
319 | return 0; |
320 | } |
320 | } |
|