diff --git a/include/cyclone/runtime.h b/include/cyclone/runtime.h index b3a9b365..cd4c559c 100644 --- a/include/cyclone/runtime.h +++ b/include/cyclone/runtime.h @@ -47,6 +47,7 @@ extern long global_heap_size; extern const object Cyc_EOF; char **get_env_variables(); +void pack_env_variables(void *data, object k); void set_env_variables(char **vars); object cell_get(object cell); diff --git a/runtime.c b/runtime.c index 2fe37f1b..517d0073 100644 --- a/runtime.c +++ b/runtime.c @@ -158,6 +158,28 @@ char **get_env_variables() return env_variables; } +void pack_env_variables(void *data, object k) +{ + char **env = env_variables; + object tail; + object head = NULL; + tail = head; + for (; *env != NULL; env++) { + char *e = *env; + make_string_noalloc(stmp, e, strlen(e)); + make_pair(tmp, boolean_t, &stmp); + + make_pair(p, &tmp, NULL); + if (head == NULL) { + tail = head = &p; + } else { + cdr(tail) = &p; + tail = &p; + } + } + return_closcall1(data, k, &head); +} + void set_env_variables(char **vars) { env_variables = vars; diff --git a/scheme/process-context.sld b/scheme/process-context.sld index ec579955..f8ce64f2 100644 --- a/scheme/process-context.sld +++ b/scheme/process-context.sld @@ -12,7 +12,7 @@ ;exit - not needed because already defined as a primitive, at least for now emergency-exit get-environment-variable - ; TODO: get-environment-variables + get-environment-variables ) (begin (define emergency-exit exit) @@ -48,4 +48,8 @@ return_closcall1(data, k, &str); } ") + (define-c get-environment-variables + "(void *data, int argc, closure _, object k)" + "pack_env_variables(data, k); + ") ))