diff options
-rw-r--r-- | src/nvim/eval.c | 52 | ||||
-rw-r--r-- | src/nvim/os/env.c | 1 | ||||
-rw-r--r-- | test/functional/eval/environ_spec.lua | 12 |
3 files changed, 24 insertions, 41 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 91c82a393e..7ffa59f298 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -8498,48 +8498,19 @@ static void f_empty(typval_T *argvars, typval_T *rettv, FunPtr fptr) /// "environ()" function static void f_environ(typval_T *argvars, typval_T *rettv, FunPtr fptr) { - int i = 0; - char_u *entry, *value; -# ifdef WIN32 - extern wchar_t **_wenviron; -# else - extern char **environ; -# endif - tv_dict_alloc_ret(rettv); -# ifdef WIN32 - if (*_wenviron == NULL) { - return; - } -# else - if (*environ == NULL) { - return; - } -# endif - - for (i = 0; ; i++) { -# ifdef WIN32 - uint16_t *p; - - if ((p = (uint16_t *)_wenviron[i]) == NULL) { - return; - } - entry = utf16_to_enc(p, NULL); -# else - if ((entry = (char_u *)environ[i]) == NULL) { - return; - } - entry = vim_strsave(entry); -# endif - if ((value = vim_strchr(entry, '=')) == NULL) { - xfree(entry); - continue; + for (int i = 0; ; i++) { + // TODO(justinmk): use os_copyfullenv from #7202 ? + char *envname = os_getenvname_at_index((size_t)i); + if (envname == NULL) { + break; } - *value++ = NUL; - tv_dict_add_str(rettv->vval.v_dict, (char *)entry, STRLEN((char *)entry), - (const char *)value); - xfree(entry); + const char *value = os_getenv(envname); + tv_dict_add_str(rettv->vval.v_dict, + (char *)envname, STRLEN((char *)envname), + value == NULL ? "" : value); + xfree(envname); } } @@ -8561,12 +8532,11 @@ static void f_getenv(typval_T *argvars, typval_T *rettv, FunPtr fptr) { char_u *p = (char_u *)vim_getenv(tv_get_string(&argvars[0])); - if (p == NULL || *p == NUL) { + if (p == NULL) { rettv->v_type = VAR_SPECIAL; rettv->vval.v_number = kSpecialVarNull; return; } - p = vim_strsave(p); rettv->vval.v_string = p; rettv->v_type = VAR_STRING; } diff --git a/src/nvim/os/env.c b/src/nvim/os/env.c index 2278c325ea..bef78d8cc8 100644 --- a/src/nvim/os/env.c +++ b/src/nvim/os/env.c @@ -45,6 +45,7 @@ void env_init(void) } /// Like getenv(), but returns NULL if the variable is empty. +/// @see os_env_exists const char *os_getenv(const char *name) FUNC_ATTR_NONNULL_ALL { diff --git a/test/functional/eval/environ_spec.lua b/test/functional/eval/environ_spec.lua new file mode 100644 index 0000000000..eb52f9e2da --- /dev/null +++ b/test/functional/eval/environ_spec.lua @@ -0,0 +1,12 @@ +local helpers = require('test.functional.helpers')(after_each) +local clear = helpers.clear +local eq = helpers.eq +local environ = helpers.funcs.environ + +describe('environ()', function() + it('handles empty env variable', function() + clear({env={EMPTY_VAR=""}}) + eq("", environ()['EMPTY_VAR']) + eq(nil, environ()['DOES_NOT_EXIST']) + end) +end) |