diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2020-10-16 06:36:41 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2020-10-16 06:36:41 -0700 |
commit | de8bd6233c62718c592694a2b8463e329567d85f (patch) | |
tree | 5423d47105d75a96946677a1086c2eb6d412df7f /sysif.c | |
parent | cd22aba61b64883e6026cd1fc31cc2f5a426f314 (diff) | |
download | txr-de8bd6233c62718c592694a2b8463e329567d85f.tar.gz txr-de8bd6233c62718c592694a2b8463e329567d85f.tar.bz2 txr-de8bd6233c62718c592694a2b8463e329567d85f.zip |
env: move function to sysif.c
* lib.c (env_list): Static variable removed; now appears in
sysif.c
(env): Function removed; now in sysif.c.
(obj_init): Don't gc-protect env_list here any more.
* lib.h (env): Declaration removed.
* match.c: Must include "sysif.h" now for env.
* sysif.c (env_list): Static variable moved here.
(env): Function moved here.
(sysif_init): env_list gc-protected here.
* sysif.h (env): Declared.
Diffstat (limited to 'sysif.c')
-rw-r--r-- | sysif.c | 38 |
1 files changed, 36 insertions, 2 deletions
@@ -148,6 +148,8 @@ static val at_exit_list; static val dirent_st; +static val env_list; + static val errno_wrap(val newval) { val self = lit("errno"); @@ -287,6 +289,39 @@ static val getppid_wrap(void) #endif +val env(void) +{ + if (env_list) { + return env_list; + } else { + list_collect_decl (out, ptail); +#if HAVE_ENVIRON + extern char **environ; + char **iter = environ; + + for (; *iter != 0; iter++) + ptail = list_collect(ptail, string_utf8(*iter)); + + return env_list = out; +#elif HAVE_GETENVIRONMENTSTRINGS + wchar_t *env = GetEnvironmentStringsW(); + wchar_t *iter = env; + + if (iter == 0) + oom(); + + for (; *iter; iter += wcslen(iter) + 1) + ptail = list_collect(ptail, string(iter)); + + FreeEnvironmentStringsW(env); + + return env_list = out; +#else + uw_throwf(error_s, lit("environment strings not available"), nao); +#endif + } +} + static val env_hash(void) { val env_strings = env(); @@ -2354,8 +2389,7 @@ static val dirstat(val dirent, val dir_path, val stat_opt) void sysif_init(void) { - prot1(&at_exit_list); - prot1(&dirent_st); + protect(&at_exit_list, dirent_st, &env_list, convert(val *, 0)); atexit(at_exit_handler); |