Mercurial > urweb
comparison src/c/lacweb.c @ 144:f0d3402184d1
Simple forms work
author | Adam Chlipala <adamc@hcoop.net> |
---|---|
date | Tue, 22 Jul 2008 15:12:20 -0400 |
parents | d6d78055f001 |
children | 2be573fec9a6 |
comparison
equal
deleted
inserted
replaced
143:4b9c2bd6157c | 144:f0d3402184d1 |
---|---|
9 lw_unit lw_unit_v = {}; | 9 lw_unit lw_unit_v = {}; |
10 | 10 |
11 struct lw_context { | 11 struct lw_context { |
12 char *page, *page_front, *page_back; | 12 char *page, *page_front, *page_back; |
13 char *heap, *heap_front, *heap_back; | 13 char *heap, *heap_front, *heap_back; |
14 char **inputs; | |
14 }; | 15 }; |
16 | |
17 extern int lw_inputs_len; | |
15 | 18 |
16 lw_context lw_init(size_t page_len, size_t heap_len) { | 19 lw_context lw_init(size_t page_len, size_t heap_len) { |
17 lw_context ctx = malloc(sizeof(struct lw_context)); | 20 lw_context ctx = malloc(sizeof(struct lw_context)); |
18 | 21 |
19 ctx->page_front = ctx->page = malloc(page_len); | 22 ctx->page_front = ctx->page = malloc(page_len); |
20 ctx->page_back = ctx->page_front + page_len; | 23 ctx->page_back = ctx->page_front + page_len; |
21 | 24 |
22 ctx->heap_front = ctx->heap = malloc(heap_len); | 25 ctx->heap_front = ctx->heap = malloc(heap_len); |
23 ctx->heap_back = ctx->heap_front + heap_len; | 26 ctx->heap_back = ctx->heap_front + heap_len; |
27 | |
28 ctx->inputs = calloc(lw_inputs_len, sizeof(char *)); | |
24 | 29 |
25 return ctx; | 30 return ctx; |
26 } | 31 } |
27 | 32 |
28 void lw_free(lw_context ctx) { | 33 void lw_free(lw_context ctx) { |
29 free(ctx->page); | 34 free(ctx->page); |
30 free(ctx->heap); | 35 free(ctx->heap); |
36 free(ctx->inputs); | |
31 free(ctx); | 37 free(ctx); |
32 } | 38 } |
33 | 39 |
34 void lw_reset(lw_context ctx) { | 40 void lw_reset(lw_context ctx) { |
35 ctx->page_front = ctx->page; | 41 ctx->page_front = ctx->page; |
36 ctx->heap_front = ctx->heap; | 42 ctx->heap_front = ctx->heap; |
43 memset(ctx->inputs, 0, lw_inputs_len * sizeof(char *)); | |
44 } | |
45 | |
46 int lw_input_num(char*); | |
47 | |
48 void lw_set_input(lw_context ctx, char *name, char *value) { | |
49 int n = lw_input_num(name); | |
50 | |
51 if (n < 0) { | |
52 printf("Bad input name"); | |
53 exit(1); | |
54 } | |
55 | |
56 assert(n < lw_inputs_len); | |
57 ctx->inputs[n] = value; | |
58 | |
59 printf("[%d] %s = %s\n", n, name, value); | |
60 } | |
61 | |
62 char *lw_get_input(lw_context ctx, int n) { | |
63 assert(n >= 0); | |
64 assert(n < lw_inputs_len); | |
65 printf("[%d] = %s\n", n, ctx->inputs[n]); | |
66 return ctx->inputs[n]; | |
37 } | 67 } |
38 | 68 |
39 static void lw_check_heap(lw_context ctx, size_t extra) { | 69 static void lw_check_heap(lw_context ctx, size_t extra) { |
40 if (ctx->heap_back - ctx->heap_front < extra) { | 70 if (ctx->heap_back - ctx->heap_front < extra) { |
41 size_t desired = ctx->heap_back - ctx->heap_front + extra, next; | 71 size_t desired = ctx->heap_back - ctx->heap_front + extra, next; |
292 } | 322 } |
293 } | 323 } |
294 } | 324 } |
295 | 325 |
296 | 326 |
297 lw_Basis_int lw_unurlifyInt(char **s) { | 327 static char *lw_unurlify_advance(char *s) { |
298 char *new_s = strchr(*s, '/'); | 328 char *new_s = strchr(s, '/'); |
299 int r; | |
300 | 329 |
301 if (new_s) | 330 if (new_s) |
302 *new_s++ = 0; | 331 *new_s++ = 0; |
303 else | 332 else |
304 new_s = strchr(*s, 0); | 333 new_s = strchr(s, 0); |
334 | |
335 return new_s; | |
336 } | |
337 | |
338 lw_Basis_int lw_unurlifyInt(char **s) { | |
339 char *new_s = lw_unurlify_advance(*s); | |
340 int r; | |
305 | 341 |
306 r = atoi(*s); | 342 r = atoi(*s); |
307 *s = new_s; | 343 *s = new_s; |
308 return r; | 344 return r; |
309 } | 345 } |
310 | 346 |
311 lw_Basis_float lw_unurlifyFloat(char **s) { | 347 lw_Basis_float lw_unurlifyFloat(char **s) { |
312 char *new_s = strchr(*s, '/'); | 348 char *new_s = lw_unurlify_advance(*s); |
313 int r; | 349 int r; |
314 | |
315 if (new_s) | |
316 *new_s++ = 0; | |
317 else | |
318 new_s = strchr(*s, 0); | |
319 | 350 |
320 r = atof(*s); | 351 r = atof(*s); |
321 *s = new_s; | 352 *s = new_s; |
322 return r; | 353 return r; |
323 } | 354 } |
324 | 355 |
325 lw_Basis_string lw_unurlifyString(lw_context ctx, char **s) { | 356 static lw_Basis_string lw_unurlifyString_to(char *r, char *s) { |
326 char *new_s = strchr(*s, '/'); | 357 char *s1, *s2; |
327 char *r, *s1, *s2; | 358 int n; |
328 int len, n; | 359 |
329 | 360 for (s1 = r, s2 = s; *s2; ++s1, ++s2) { |
330 if (new_s) | |
331 *new_s++ = 0; | |
332 else | |
333 new_s = strchr(*s, 0); | |
334 | |
335 len = strlen(*s); | |
336 lw_check_heap(ctx, len + 1); | |
337 | |
338 r = ctx->heap_front; | |
339 for (s1 = r, s2 = *s; *s2; ++s1, ++s2) { | |
340 char c = *s2; | 361 char c = *s2; |
341 | 362 |
342 switch (c) { | 363 switch (c) { |
343 case '+': | 364 case '+': |
344 *s1 = ' '; | 365 *s1 = ' '; |
345 break; | 366 break; |
346 case '%': | 367 case '%': |
347 assert(s2 + 2 < new_s); | 368 assert(s2[1] != 0 && s2[2] != 0); |
348 sscanf(s2+1, "%02X", &n); | 369 sscanf(s2+1, "%02X", &n); |
349 *s1 = n; | 370 *s1 = n; |
350 s2 += 2; | 371 s2 += 2; |
351 break; | 372 break; |
352 default: | 373 default: |
353 *s1 = c; | 374 *s1 = c; |
354 } | 375 } |
355 } | 376 } |
356 *s1++ = 0; | 377 *s1++ = 0; |
357 ctx->heap_front = s1; | 378 return s1; |
379 } | |
380 | |
381 lw_Basis_string lw_unurlifyString(lw_context ctx, char **s) { | |
382 char *new_s = lw_unurlify_advance(*s); | |
383 char *r, *s1, *s2; | |
384 int len, n; | |
385 | |
386 len = strlen(*s); | |
387 lw_check_heap(ctx, len + 1); | |
388 | |
389 r = ctx->heap_front; | |
390 ctx->heap_front = lw_unurlifyString_to(ctx->heap_front, *s); | |
358 *s = new_s; | 391 *s = new_s; |
359 return r; | 392 return r; |
360 } | 393 } |
361 | 394 |
362 | 395 |