aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/c
diff options
context:
space:
mode:
authorGravatar Adam Chlipala <adamc@hcoop.net>2008-07-22 15:12:20 -0400
committerGravatar Adam Chlipala <adamc@hcoop.net>2008-07-22 15:12:20 -0400
commite8ceaa0ae216c7c85e810998ab97989e7a83c82d (patch)
treef26deeee6825b28bb3e6005523f887de3c1a79a4 /src/c
parentb1997d2e699e92e83f7130b7b4a4c5467dcdcd27 (diff)
Simple forms work
Diffstat (limited to 'src/c')
-rw-r--r--src/c/driver.c30
-rw-r--r--src/c/lacweb.c85
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;
}