#include #include #include #include #include #include #include "ant.h" #include "config.h" #include "runtime.h" #include "repl.h" #include "modules/builtin.h" #include "modules/io.h" #include "modules/fs.h" #include "modules/crypto.h" #include "modules/server.h" #include "modules/timer.h" #include "modules/json.h" #include "modules/fetch.h" #include "modules/shell.h" #include "modules/process.h" #include "modules/path.h" #include "modules/ffi.h" int js_result = EXIT_SUCCESS; static void eval_code(struct js *js, struct arg_str *eval, struct arg_lit *print) { const char *script = eval->sval[0]; size_t len = strlen(script); js_set_filename(js, ""); js_mkscope(js); js_protect_init_memory(js); jsval_t result = js_eval(js, script, len); if (js_type(result) == JS_ERR) { fprintf(stderr, "%s\n", js_str(js, result)); js_result = EXIT_FAILURE; } else if (print->count > 0) { const char *str = js_str(js, result); if (str && strcmp(str, "undefined") != 0) printf("%s\n", str); } js_run_event_loop(js); } static int execute_module(struct js *js, const char *filename) { char *filename_copy = strdup(filename); char *dir = dirname(filename_copy); js_set(js, js_glob(js), "__dirname", js_mkstr(js, dir, strlen(dir))); free(filename_copy); FILE *fp = fopen(filename, "rb"); if (fp == NULL) { fprintf(stderr, "Error: Could not open file '%s'\n", filename); return EXIT_FAILURE; } fseek(fp, 0, SEEK_END); long file_size = ftell(fp); fseek(fp, 0, SEEK_SET); char *buffer = malloc(file_size + 1); if (buffer == NULL) { fprintf(stderr, "Error: Memory allocation failed\n"); fclose(fp); return EXIT_FAILURE; } size_t len = fread(buffer, 1, file_size, fp); fclose(fp); buffer[len] = '\0'; js_set_filename(js, filename); js_setup_import_meta(js, filename); js_mkscope(js); js_protect_init_memory(js); jsval_t result = js_eval(js, buffer, len); free(buffer); if (js_type(result) == JS_ERR) { fprintf(stderr, "%s\n", js_str(js, result)); return EXIT_FAILURE; } return EXIT_SUCCESS; } int main(int argc, char *argv[]) { char dump = 0; struct arg_lit *help = arg_lit0("h", "help", "display this help and exit"); struct arg_lit *version = arg_lit0("v", "version", "display version information and exit"); struct arg_lit *debug = arg_litn("d", "debug", 0, 10, "dump VM state (can be repeated for more detail)"); struct arg_str *eval = arg_str0("e", "eval", "