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