Mercurial > urweb
diff 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 |
line wrap: on
line diff
--- a/src/c/lacweb.c Sun Jul 20 13:30:19 2008 -0400 +++ b/src/c/lacweb.c Tue Jul 22 15:12:20 2008 -0400 @@ -11,8 +11,11 @@ struct lw_context { char *page, *page_front, *page_back; char *heap, *heap_front, *heap_back; + char **inputs; }; +extern int lw_inputs_len; + lw_context lw_init(size_t page_len, size_t heap_len) { lw_context ctx = malloc(sizeof(struct lw_context)); @@ -22,18 +25,45 @@ ctx->heap_front = ctx->heap = malloc(heap_len); ctx->heap_back = ctx->heap_front + heap_len; + ctx->inputs = calloc(lw_inputs_len, sizeof(char *)); + return ctx; } void lw_free(lw_context ctx) { free(ctx->page); free(ctx->heap); + free(ctx->inputs); free(ctx); } void lw_reset(lw_context ctx) { ctx->page_front = ctx->page; ctx->heap_front = ctx->heap; + memset(ctx->inputs, 0, lw_inputs_len * sizeof(char *)); +} + +int lw_input_num(char*); + +void lw_set_input(lw_context ctx, char *name, char *value) { + int n = lw_input_num(name); + + if (n < 0) { + printf("Bad input name"); + exit(1); + } + + assert(n < lw_inputs_len); + ctx->inputs[n] = value; + + printf("[%d] %s = %s\n", n, name, value); +} + +char *lw_get_input(lw_context ctx, int n) { + assert(n >= 0); + assert(n < lw_inputs_len); + printf("[%d] = %s\n", n, ctx->inputs[n]); + return ctx->inputs[n]; } static void lw_check_heap(lw_context ctx, size_t extra) { @@ -294,14 +324,20 @@ } -lw_Basis_int lw_unurlifyInt(char **s) { - char *new_s = strchr(*s, '/'); - int r; +static char *lw_unurlify_advance(char *s) { + char *new_s = strchr(s, '/'); if (new_s) *new_s++ = 0; else - new_s = strchr(*s, 0); + new_s = strchr(s, 0); + + return new_s; +} + +lw_Basis_int lw_unurlifyInt(char **s) { + char *new_s = lw_unurlify_advance(*s); + int r; r = atoi(*s); *s = new_s; @@ -309,34 +345,19 @@ } lw_Basis_float lw_unurlifyFloat(char **s) { - char *new_s = strchr(*s, '/'); + char *new_s = lw_unurlify_advance(*s); int r; - if (new_s) - *new_s++ = 0; - else - new_s = strchr(*s, 0); - r = atof(*s); *s = new_s; return r; } -lw_Basis_string lw_unurlifyString(lw_context ctx, char **s) { - char *new_s = strchr(*s, '/'); - char *r, *s1, *s2; - int len, n; +static lw_Basis_string lw_unurlifyString_to(char *r, char *s) { + char *s1, *s2; + int n; - if (new_s) - *new_s++ = 0; - else - new_s = strchr(*s, 0); - - len = strlen(*s); - lw_check_heap(ctx, len + 1); - - r = ctx->heap_front; - for (s1 = r, s2 = *s; *s2; ++s1, ++s2) { + for (s1 = r, s2 = s; *s2; ++s1, ++s2) { char c = *s2; switch (c) { @@ -344,7 +365,7 @@ *s1 = ' '; break; case '%': - assert(s2 + 2 < new_s); + assert(s2[1] != 0 && s2[2] != 0); sscanf(s2+1, "%02X", &n); *s1 = n; s2 += 2; @@ -354,7 +375,19 @@ } } *s1++ = 0; - ctx->heap_front = s1; + return s1; +} + +lw_Basis_string lw_unurlifyString(lw_context ctx, char **s) { + char *new_s = lw_unurlify_advance(*s); + char *r, *s1, *s2; + int len, n; + + len = strlen(*s); + lw_check_heap(ctx, len + 1); + + r = ctx->heap_front; + ctx->heap_front = lw_unurlifyString_to(ctx->heap_front, *s); *s = new_s; return r; }