diff --git a/src/env.c b/src/env.c index 6b05c1a..6c4c76f 100644 --- a/src/env.c +++ b/src/env.c @@ -301,3 +301,13 @@ struct Environment defaultEnv() return e; } + +int getStructIndex(struct Environment* env, const char* name) +{ + for (int i = 0; i < env->structCount; i++) { + if (strcmp(name, env->structDefs[i].name) == 0) { + return i; + } + } + return -1; +} diff --git a/src/env.h b/src/env.h index a3144c6..478f8ed 100644 --- a/src/env.h +++ b/src/env.h @@ -39,4 +39,6 @@ struct Environment defaultEnv(); struct StructDef getStructDef(struct Environment* env, const char* name); +int getStructIndex(struct Environment* env, const char* name); + #endif diff --git a/src/examples/webby.pl b/src/examples/webby.pl index 839aee5..2580f92 100755 --- a/src/examples/webby.pl +++ b/src/examples/webby.pl @@ -46,7 +46,7 @@ stuff, when you think about it." (htmlize p2))) )))) -(def revealer (fn (x) (cat "x: " x))) +(def revealer (fn (x) (cat "" x))) (get "/" homepage) (get "/x" revealer) diff --git a/src/pebblisp.c b/src/pebblisp.c index 72ad756..a05acc6 100644 --- a/src/pebblisp.c +++ b/src/pebblisp.c @@ -682,9 +682,11 @@ Object charAt(Object string, Object at, struct Environment* ignore) Object print(Object p, Object ignore, struct Environment* env) { - p = cloneObject(p); - p = eval(&p, env); - _printObj(&p, 0); + Object c = cloneObject(p); + Object e = eval(&c, env); + _printObj(&e, 0); + cleanObject(&c); + cleanObject(&e); return numberObject(0); } diff --git a/src/web.c b/src/web.c index f52c5f3..00cc872 100644 --- a/src/web.c +++ b/src/web.c @@ -15,11 +15,14 @@ #include "web.h" #include "pebblisp.h" -struct StructDef query = { - .fieldCount = 1, - .name = "", - .names = {""} -}; +#ifdef _MHD_FLAGS_ENUM +typedef enum MHD_Result HttpResult; +#else +typedef int HttpResult; +#endif + +int requestDefinition = -1; + int routeCount = 0; struct Route routes[10]; @@ -41,9 +44,9 @@ int methodMatches(const char* method, struct Route* route) } } -static int -print_out_key (void *queryParamsV, enum MHD_ValueKind kind, const char *key, - const char *value) +static HttpResult +print_out_key(void *queryParamsV, enum MHD_ValueKind kind, const char *key, + const char *value) { (void) kind; /* Unused. Silent compiler warning. */ Object* queryParams = queryParamsV; @@ -55,67 +58,83 @@ print_out_key (void *queryParamsV, enum MHD_ValueKind kind, const char *key, return MHD_YES; } -//static enum MHD_Result -static int +static HttpResult answer_to_connection(void *cls, struct MHD_Connection *connection, const char *url, const char *method, const char *version, const char *upload_data, size_t *upload_data_size, void **con_cls) { - const char *page = NULL; - printf("%s URL: '%s' :: ", method, url); - printf("version: %s\n", version); - printf("upload_data: %s\n", upload_data); - for (int i = 0; i < routeCount; i++) { - if (methodMatches(method, &routes[i]) && strcmp(url, routes[i].path) == 0) { - Object queryParams = listObject(); - MHD_get_connection_values(connection, MHD_GET_ARGUMENT_KIND, print_out_key, &queryParams); - //page = routes[i].routeAction(url); - Object lambdaList = listObject(); - nf_addToList(&lambdaList, queryParams); - Object route = cloneObject(routes[i].routeAction); - Object result = listEvalLambda(&route, &lambdaList, routes[i].env); - page = result.string; - break; + char *page = NULL; + printf("%s URL: '%s' :: ", method, url); + printf("version: %s\n", version); + printf("upload_data: %s\n", upload_data); + for (int i = 0; i < routeCount; i++) { + if (methodMatches(method, &routes[i]) && strcmp(url, routes[i].path) == 0) { + Object queryParams = listObject(); + MHD_get_connection_values(connection, MHD_GET_ARGUMENT_KIND, print_out_key, &queryParams); + + Object res = structObject(requestDefinition); + res.structObject->fields[0] = queryParams; + Object route = cloneObject(routes[i].routeAction); + + Object result = listEvalLambda(&route, &res, routes[i].env); + cleanObject(&res); + page = result.string; + break; + } } - } - if (!page) { - printf("no route found!\n"); - page = "

404, Dumbass.

"; - } + if (!page) { + printf("no route found!\n"); + page = "

404, Dumbass.

"; + } - struct MHD_Response *response; - //enum MHD_Result ret; - int ret; - (void) cls; /* Unused. Silent compiler warning. */ - (void) url; /* Unused. Silent compiler warning. */ - (void) method; /* Unused. Silent compiler warning. */ - (void) version; /* Unused. Silent compiler warning. */ - (void) upload_data; /* Unused. Silent compiler warning. */ - (void) upload_data_size; /* Unused. Silent compiler warning. */ - (void) con_cls; /* Unused. Silent compiler warning. */ + struct MHD_Response *response; + HttpResult ret; + (void) cls; /* Unused. Silent compiler warning. */ + (void) url; /* Unused. Silent compiler warning. */ + (void) method; /* Unused. Silent compiler warning. */ + (void) version; /* Unused. Silent compiler warning. */ + (void) upload_data; /* Unused. Silent compiler warning. */ + (void) upload_data_size; /* Unused. Silent compiler warning. */ + (void) con_cls; /* Unused. Silent compiler warning. */ - response = - MHD_create_response_from_buffer(strlen(page), (void *) page, - MHD_RESPMEM_PERSISTENT); - ret = MHD_queue_response(connection, MHD_HTTP_OK, response); - MHD_destroy_response(response); + response = + MHD_create_response_from_buffer(strlen(page), (void *) page, + MHD_RESPMEM_PERSISTENT); + ret = MHD_queue_response(connection, MHD_HTTP_OK, response); + MHD_destroy_response(response); - return ret; + // if (needsFree) { + // free(page); + // } + + return ret; +} + +int initialized = 0; +void initialize() +{ + if (!initialized) { + Object o = parseEval("(struct Request (queryParams))", global()); + cleanObject(&o); + requestDefinition = getStructIndex(global(), "Request"); + } + initialized = 1; } int start(int port) { - struct MHD_Daemon *daemon = MHD_start_daemon( - MHD_USE_AUTO | MHD_USE_INTERNAL_POLLING_THREAD, - port, NULL, NULL, &answer_to_connection, NULL, MHD_OPTION_END); + initialize(); + struct MHD_Daemon *daemon = MHD_start_daemon( + MHD_USE_AUTO | MHD_USE_INTERNAL_POLLING_THREAD, + port, NULL, NULL, &answer_to_connection, NULL, MHD_OPTION_END); - if (NULL == daemon) - return 1; + if (NULL == daemon) + return 1; - // (void) getchar(); + // (void) getchar(); - // MHD_stop_daemon(daemon); - return 0; + // MHD_stop_daemon(daemon); + return 0; }