diff options
author | 2008-07-22 15:12:20 -0400 | |
---|---|---|
committer | 2008-07-22 15:12:20 -0400 | |
commit | e8ceaa0ae216c7c85e810998ab97989e7a83c82d (patch) | |
tree | f26deeee6825b28bb3e6005523f887de3c1a79a4 /src/c | |
parent | b1997d2e699e92e83f7130b7b4a4c5467dcdcd27 (diff) |
Simple forms work
Diffstat (limited to 'src/c')
-rw-r--r-- | src/c/driver.c | 30 | ||||
-rw-r--r-- | src/c/lacweb.c | 85 |
2 files changed, 87 insertions, 28 deletions
diff --git a/src/c/driver.c b/src/c/driver.c index ac0b0c86..af3bca08 100644 --- a/src/c/driver.c +++ b/src/c/driver.c @@ -86,9 +86,11 @@ static void *worker(void *data) { *back = 0; if (s = strstr(buf, "\r\n\r\n")) { - char *cmd, *path; + char *cmd, *path, *inputs; *s = 0; + + printf("Read: %s\n", buf); if (!(s = strstr(buf, "\r\n"))) { fprintf(stderr, "No newline in buf\n"); @@ -114,9 +116,33 @@ static void *worker(void *data) { break; } + if (inputs = strchr(path, '?')) { + char *name, *value; + *inputs++ = 0; + + while (*inputs) { + name = inputs; + if (value = strchr(inputs, '=')) { + *value++ = 0; + if (inputs = strchr(value, '&')) + *inputs++ = 0; + else + inputs = strchr(value, 0); + lw_set_input(ctx, name, value); + } + else if (inputs = strchr(value, '&')) { + *inputs++ = 0; + lw_set_input(ctx, name, ""); + } + else { + inputs = strchr(value, 0); + lw_set_input(ctx, name, ""); + } + } + } + printf("Serving URI %s....\n", path); - ctx = lw_init(1024, 1024); lw_write (ctx, "HTTP/1.1 200 OK\r\n"); lw_write(ctx, "Content-type: text/html\r\n\r\n"); lw_write(ctx, "<html>"); diff --git a/src/c/lacweb.c b/src/c/lacweb.c index 2b806f86..9543c642 100644 --- a/src/c/lacweb.c +++ b/src/c/lacweb.c @@ -11,8 +11,11 @@ lw_unit lw_unit_v = {}; 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 @@ lw_context lw_init(size_t page_len, size_t heap_len) { 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 @@ void lw_Basis_urlifyString_w(lw_context ctx, lw_Basis_string s) { } -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_int lw_unurlifyInt(char **s) { } 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 @@ lw_Basis_string lw_unurlifyString(lw_context ctx, char **s) { *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 @@ lw_Basis_string lw_unurlifyString(lw_context ctx, char **s) { } } *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; } |