#include "pmake.h" duk_context* js_ctx; LOAD(js_core); LOAD(js_cmdline); static duk_ret_t js_console_log(duk_context* self) { printf("%s\n", duk_to_string(self, 0)); return 0; } static void js_argv_init(int argc, char** argv) { int arr; int i; duk_push_global_object(js_ctx); arr = duk_push_array(js_ctx); for(i = 0; i < argc; i++) { duk_push_string(js_ctx, argv[i]); duk_put_prop_index(js_ctx, arr, i); } duk_put_prop_string(js_ctx, 0, "ARGV"); duk_pop(js_ctx); } static void js_console_init(void) { int obj; duk_push_global_object(js_ctx); obj = duk_push_object(js_ctx); duk_push_c_function(js_ctx, js_console_log, 1); duk_put_prop_string(js_ctx, obj, "log"); duk_put_prop_string(js_ctx, 0, "console"); duk_pop(js_ctx); } static duk_ret_t js_process_exit(duk_context* self) { duk_idx_t argc = duk_get_top(self); int ex; if(argc > 1) { return duk_error(self, DUK_ERR_TYPE_ERROR, "needs 0 or 1 argument(s)"); } if(argc == 1) { ex = duk_to_number(self, 0); } else { ex = 0; } exit(ex); } static void js_process_init(void) { int obj; duk_push_global_object(js_ctx); obj = duk_push_object(js_ctx); duk_push_c_function(js_ctx, js_process_exit, DUK_VARARGS); duk_put_prop_string(js_ctx, obj, "exit"); duk_put_prop_string(js_ctx, 0, "process"); duk_pop(js_ctx); } int js_init(int argc, char** argv) { js_ctx = duk_create_heap_default(); js_argv_init(argc, argv); js_console_init(); js_process_init(); if(duk_peval_lstring(js_ctx, js_core, js_core_len) != 0) { printf("error: js/core.js: %s\n", duk_safe_to_string(js_ctx, -1)); return 1; } #define X(name, prefix) \ if(duk_peval_lstring(js_ctx, prefix##_##name, prefix##_##name##_len) != 0) { \ printf("error: %s: %s\n", #prefix "/" #name ".js", duk_safe_to_string(js_ctx, -1)); \ return 1; \ } JS; #undef X if(duk_peval_lstring(js_ctx, js_cmdline, js_cmdline_len) != 0) { printf("error: js/cmdline.js: %s\n", duk_safe_to_string(js_ctx, -1)); return 1; } return 0; } void js_uninit(void) { duk_destroy_heap(js_ctx); }