diff --git a/include/modules/process.h b/include/modules/process.h new file mode 100644 index 0000000..92d5a29 --- /dev/null +++ b/include/modules/process.h @@ -0,0 +1,6 @@ +#ifndef PROCESS_H +#define PROCESS_H + +void init_process_module(void); + +#endif diff --git a/meson.build b/meson.build index c958c5c..530a731 100644 --- a/meson.build +++ b/meson.build @@ -44,7 +44,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.6.17') +version_conf.set('ANT_VERSION', '0.0.6.18') 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 5b47a8b..35e6f87 100644 --- a/src/main.c +++ b/src/main.c @@ -19,6 +19,7 @@ #include "modules/json.h" #include "modules/fetch.h" #include "modules/shell.h" +#include "modules/process.h" int js_result = EXIT_SUCCESS; @@ -131,6 +132,7 @@ int main(int argc, char *argv[]) { init_json_module(); init_server_module(); init_timer_module(); + init_process_module(); ant_register_library("ant/shell", shell_library); diff --git a/src/modules/process.c b/src/modules/process.c new file mode 100644 index 0000000..26e0435 --- /dev/null +++ b/src/modules/process.c @@ -0,0 +1,100 @@ +#include +#include +#include + +#include "ant.h" +#include "runtime.h" +#include "modules/process.h" + +extern char **environ; + +static void load_dotenv_file(struct js *js, jsval_t env_obj) { + FILE *fp = fopen(".env", "r"); + if (fp == NULL) return; + + char line[1024]; + while (fgets(line, sizeof(line), fp) != NULL) { + size_t len = strlen(line); + if (len > 0 && line[len - 1] == '\n') { + line[len - 1] = '\0'; + len--; + } + if (len > 0 && line[len - 1] == '\r') { + line[len - 1] = '\0'; + len--; + } + + if (len == 0 || line[0] == '#') continue; + char *equals = strchr(line, '='); + if (equals == NULL) continue; + + *equals = '\0'; + char *key = line; + char *value = equals + 1; + + while (*key == ' ' || *key == '\t') key++; + char *key_end = key + strlen(key) - 1; + while (key_end > key && (*key_end == ' ' || *key_end == '\t')) { + *key_end = '\0'; + key_end--; + } + + while (*value == ' ' || *value == '\t') value++; + char *value_end = value + strlen(value) - 1; + while (value_end > value && (*value_end == ' ' || *value_end == '\t')) { + *value_end = '\0'; + value_end--; + } + + if (strlen(value) >= 2 && + ((value[0] == '"' && value[strlen(value) - 1] == '"') + || (value[0] == '\'' && value[strlen(value) - 1] == '\''))) { + value[strlen(value) - 1] = '\0'; + value++; + } + + js_set(js, env_obj, key, js_mkstr(js, value, strlen(value))); + } + + fclose(fp); +} + +static jsval_t process_exit(struct js *js, jsval_t *args, int nargs) { + int code = 0; + + if (nargs > 0 && js_type(args[0]) == JS_NUM) { + code = (int)js_getnum(args[0]); + } + + exit(code); + return js_mkundef(); +} + +void init_process_module(void) { + struct js *js = rt->js; + + jsval_t process_obj = js_mkobj(js); + jsval_t env_obj = js_mkobj(js); + + js_set(js, js_glob(js), "process", process_obj); + js_set(js, process_obj, "env", env_obj); + js_set(js, process_obj, "exit", js_mkfun(process_exit)); + + for (char **env = environ; *env != NULL; env++) { + char *env_copy = strdup(*env); + if (env_copy == NULL) continue; + + char *equals = strchr(env_copy, '='); + if (equals != NULL) { + *equals = '\0'; + char *key = env_copy; + char *value = equals + 1; + + js_set(js, env_obj, key, js_mkstr(js, value, strlen(value))); + } + + free(env_copy); + } + + load_dotenv_file(js, env_obj); +} diff --git a/tests/test_process_env.cjs b/tests/test_process_env.cjs new file mode 100644 index 0000000..0c32c63 --- /dev/null +++ b/tests/test_process_env.cjs @@ -0,0 +1,14 @@ +console.log('PATH:', process.env.PATH); +console.log('HOME:', process.env.HOME); +console.log('USER:', process.env.USER); + +console.log('CAT:', process.env.CAT); + +if (process.env.CAT === 'meow') { + console.log("✓ process.env.CAT is correctly set to 'meow'"); +} else { + console.log('✗ process.env.CAT is not set correctly. Got:', process.env.CAT); +} + +console.log('ANT_ENV', process.env.ANT_ENV); +process.exit(256);