diff --git a/include/modules/builtin.h b/include/modules/builtin.h new file mode 100644 index 0000000..a1e9297 --- /dev/null +++ b/include/modules/builtin.h @@ -0,0 +1,6 @@ +#ifndef BUILTIN_H +#define BUILTIN_H + +void init_builtin_module(void); + +#endif \ No newline at end of file diff --git a/include/modules/server.h b/include/modules/server.h index 18976eb..7d3e1df 100644 --- a/include/modules/server.h +++ b/include/modules/server.h @@ -1,9 +1,6 @@ #ifndef SERVER_H #define SERVER_H -#include "ant.h" - -// Ant.serve(port, handler) -jsval_t js_serve(struct js *js, jsval_t *args, int nargs); +void init_server_module(void); #endif diff --git a/meson.build b/meson.build index b27b894..ae64d6e 100644 --- a/meson.build +++ b/meson.build @@ -41,7 +41,7 @@ endif build_date = run_command('date', '+%Y-%m-%d', check: true).stdout().strip() version_conf = configuration_data() -version_conf.set('ANT_VERSION', '0.0.5.54') +version_conf.set('ANT_VERSION', '0.0.5.55') version_conf.set('ANT_GIT_HASH', git_hash) version_conf.set('ANT_BUILD_DATE', build_date) diff --git a/src/main.c b/src/main.c index abc3b18..8fb1147 100644 --- a/src/main.c +++ b/src/main.c @@ -3,14 +3,14 @@ #include #include #include -#include #include +#include #include "ant.h" #include "config.h" #include "runtime.h" -#include "argtable3.h" +#include "modules/builtin.h" #include "modules/io.h" #include "modules/crypto.h" #include "modules/server.h" @@ -26,100 +26,6 @@ static struct { static int module_count = 0; static int module_capacity = 0; -static struct { - struct js *js; - jsval_t handler; -} signal_handlers[32] = {0}; - -static jsval_t js_gc_trigger(struct js *js, jsval_t *args, int nargs) { - (void) args; (void) nargs; - size_t before_brk = js_getbrk(js); - - js_gc(js); - size_t after_brk = js_getbrk(js); - - jsval_t result = js_mkobj(js); - js_set(js, result, "before", js_mknum((double)before_brk)); - js_set(js, result, "after", js_mknum((double)after_brk)); - - return result; -} - -static jsval_t js_alloc(struct js *js, jsval_t *args, int nargs) { - (void) args; (void) nargs; - - size_t total = 0, min_free = 0, cstack = 0; - js_stats(js, &total, &min_free, &cstack); - - jsval_t result = js_mkobj(js); - js_set(js, result, "used", js_mknum((double)total)); - js_set(js, result, "minFree", js_mknum((double)min_free)); - - return result; -} - -static jsval_t js_stats_fn(struct js *js, jsval_t *args, int nargs) { - (void) args; (void) nargs; - - size_t total = 0, min_free = 0, cstack = 0; - js_stats(js, &total, &min_free, &cstack); - - jsval_t result = js_mkobj(js); - js_set(js, result, "used", js_mknum((double)total)); - js_set(js, result, "minFree", js_mknum((double)min_free)); - js_set(js, result, "cstack", js_mknum((double)cstack)); - - return result; -} - -static void general_signal_handler(int signum) { - if (signum >= 0 && signum < 32 && signal_handlers[signum].js != NULL) { - struct js *js = signal_handlers[signum].js; - jsval_t handler = signal_handlers[signum].handler; - - if (js_type(handler) != JS_UNDEF) { - jsval_t sig_num = js_mknum(signum); - jsval_t args[1] = {sig_num}; - js_call(js, handler, args, 1); - } - } - - exit(0); -} - -static jsval_t js_signal(struct js *js, jsval_t *args, int nargs) { - if (nargs < 2) { - fprintf(stderr, "Error: Ant.signal() requires 2 arguments (signal, handler)\n"); - return js_mkundef(); - } - - char *signal_name = js_getstr(js, args[0], NULL); - if (signal_name == NULL) { - return js_mkerr(js, "signal name must be a string"); - } - - int signum = -1; - if (strcmp(signal_name, "SIGINT") == 0 || strcmp(signal_name, "sigint") == 0) { - signum = SIGINT; - } else if (strcmp(signal_name, "SIGTERM") == 0 || strcmp(signal_name, "sigterm") == 0) { - signum = SIGTERM; - } else if (strcmp(signal_name, "SIGHUP") == 0 || strcmp(signal_name, "sighup") == 0) { - signum = SIGHUP; - } else if (strcmp(signal_name, "SIGUSR1") == 0 || strcmp(signal_name, "sigusr1") == 0) { - signum = SIGUSR1; - } else if (strcmp(signal_name, "SIGUSR2") == 0 || strcmp(signal_name, "sigusr2") == 0) { - signum = SIGUSR2; - } else { - return js_mkerr(js, "unsupported signal: %s", signal_name); - } - - signal_handlers[signum].js = js; - signal_handlers[signum].handler = args[1]; - signal(signum, general_signal_handler); - - return js_mkundef(); -} - static jsval_t js_require(struct js *js, jsval_t *args, int nargs) { if (nargs != 1) return js_mkundef(); @@ -295,19 +201,16 @@ int main(int argc, char *argv[]) { struct ant_runtime *rt = ant_runtime_init(js); + init_builtin_module(); init_console_module(); init_json_module(); init_fetch_module(); + init_server_module(); init_timer_module(js); init_crypto_module(js, rt->ant_obj); - js_set(js, rt->ant_obj, "serve", js_mkfun(js_serve)); js_set(js, rt->ant_obj, "require", js_mkfun(js_require)); - js_set(js, rt->ant_obj, "signal", js_mkfun(js_signal)); - js_set(js, rt->ant_obj, "gc", js_mkfun(js_gc_trigger)); - js_set(js, rt->ant_obj, "alloc", js_mkfun(js_alloc)); - js_set(js, rt->ant_obj, "stats", js_mkfun(js_stats_fn)); jsval_t exports_obj = js_mkobj(js); js_set(js, rt->ant_obj, "exports", exports_obj); diff --git a/src/modules/ant.c b/src/modules/ant.c deleted file mode 100644 index e69de29..0000000 diff --git a/src/modules/builtin.c b/src/modules/builtin.c new file mode 100644 index 0000000..5a0d58d --- /dev/null +++ b/src/modules/builtin.c @@ -0,0 +1,116 @@ +#include +#include +#include +#include + +#include "ant.h" +#include "runtime.h" +#include "modules/builtin.h" + +static struct { + struct js *js; + jsval_t handler; +} signal_handlers[32] = {0}; + +static void general_signal_handler(int signum) { + if (signum >= 0 && signum < 32 && signal_handlers[signum].js != NULL) { + struct js *js = signal_handlers[signum].js; + jsval_t handler = signal_handlers[signum].handler; + + if (js_type(handler) != JS_UNDEF) { + jsval_t sig_num = js_mknum(signum); + jsval_t args[1] = {sig_num}; + js_call(js, handler, args, 1); + } + } + + exit(0); +} + +// Ant.signal(signal, handler) +static jsval_t js_signal(struct js *js, jsval_t *args, int nargs) { + if (nargs < 2) { + fprintf(stderr, "Error: Ant.signal() requires 2 arguments (signal, handler)\n"); + return js_mkundef(); + } + + char *signal_name = js_getstr(js, args[0], NULL); + if (signal_name == NULL) { + return js_mkerr(js, "signal name must be a string"); + } + + int signum = -1; + if (strcmp(signal_name, "SIGINT") == 0 || strcmp(signal_name, "sigint") == 0) { + signum = SIGINT; + } else if (strcmp(signal_name, "SIGTERM") == 0 || strcmp(signal_name, "sigterm") == 0) { + signum = SIGTERM; + } else if (strcmp(signal_name, "SIGHUP") == 0 || strcmp(signal_name, "sighup") == 0) { + signum = SIGHUP; + } else if (strcmp(signal_name, "SIGUSR1") == 0 || strcmp(signal_name, "sigusr1") == 0) { + signum = SIGUSR1; + } else if (strcmp(signal_name, "SIGUSR2") == 0 || strcmp(signal_name, "sigusr2") == 0) { + signum = SIGUSR2; + } else { + return js_mkerr(js, "unsupported signal: %s", signal_name); + } + + signal_handlers[signum].js = js; + signal_handlers[signum].handler = args[1]; + signal(signum, general_signal_handler); + + return js_mkundef(); +} + +// Ant.gc() +static jsval_t js_gc_trigger(struct js *js, jsval_t *args, int nargs) { + (void) args; (void) nargs; + size_t before_brk = js_getbrk(js); + + js_gc(js); + size_t after_brk = js_getbrk(js); + + jsval_t result = js_mkobj(js); + js_set(js, result, "before", js_mknum((double)before_brk)); + js_set(js, result, "after", js_mknum((double)after_brk)); + + return result; +} + +// Ant.alloc() +static jsval_t js_alloc(struct js *js, jsval_t *args, int nargs) { + (void) args; (void) nargs; + + size_t total = 0, min_free = 0, cstack = 0; + js_stats(js, &total, &min_free, &cstack); + + jsval_t result = js_mkobj(js); + js_set(js, result, "used", js_mknum((double)total)); + js_set(js, result, "minFree", js_mknum((double)min_free)); + + return result; +} + +// Ant.stats() +static jsval_t js_stats_fn(struct js *js, jsval_t *args, int nargs) { + (void) args; (void) nargs; + + size_t total = 0, min_free = 0, cstack = 0; + js_stats(js, &total, &min_free, &cstack); + + jsval_t result = js_mkobj(js); + js_set(js, result, "used", js_mknum((double)total)); + js_set(js, result, "minFree", js_mknum((double)min_free)); + js_set(js, result, "cstack", js_mknum((double)cstack)); + + return result; +} + +void init_builtin_module() { + struct js *js = rt->js; + jsval_t ant_obj = rt->ant_obj; + + js_set(js, ant_obj, "gc", js_mkfun(js_gc_trigger)); + js_set(js, ant_obj, "alloc", js_mkfun(js_alloc)); + js_set(js, ant_obj, "stats", js_mkfun(js_stats_fn)); + js_set(js, rt->ant_obj, "signal", js_mkfun(js_signal)); +} \ No newline at end of file diff --git a/src/modules/server.c b/src/modules/server.c index 916439a..7dafde5 100644 --- a/src/modules/server.c +++ b/src/modules/server.c @@ -2,12 +2,13 @@ #include #include #include +#include -#include "mongoose.h" +#include "ant.h" +#include "runtime.h" #include "modules/server.h" #include "modules/timer.h" #include "modules/json.h" -#include "ant.h" typedef struct { int status; @@ -210,14 +211,12 @@ static void http_handler(struct mg_connection *c, int ev, void *ev_data) { if (res_ctx.sent) { char headers[256]; - snprintf(headers, sizeof(headers), "Content-Type: %s\r\n", - res_ctx.content_type ? res_ctx.content_type : "text/plain"); + snprintf(headers, sizeof(headers), "Content-Type: %s\r\n", res_ctx.content_type ? res_ctx.content_type : "text/plain"); mg_http_reply(c, res_ctx.status, headers, "%s", res_ctx.body ? res_ctx.body : ""); return; } } - // If we get here, no response was sent if (js_type(result) == JS_ERR) { fprintf(stderr, "Handler error: %s\n", js_str(server->js, result)); mg_http_reply(c, 500, "Content-Type: text/plain\r\n", "Internal Server Error"); @@ -227,6 +226,7 @@ static void http_handler(struct mg_connection *c, int ev, void *ev_data) { } } +// Ant.serve(port, handler) jsval_t js_serve(struct js *js, jsval_t *args, int nargs) { if (nargs < 1) { fprintf(stderr, "Error: Ant.serve() requires at least 1 argument (port)\n"); @@ -273,3 +273,7 @@ jsval_t js_serve(struct js *js, jsval_t *args, int nargs) { return js_mknum(1); } + +void init_server_module() { + js_set(rt->js, rt->ant_obj, "serve", js_mkfun(js_serve)); +} \ No newline at end of file