diff options
-rw-r--r-- | src/misc1.c | 91 | ||||
-rw-r--r-- | src/testdir/test_let.vim | 5 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 54 insertions, 44 deletions
diff --git a/src/misc1.c b/src/misc1.c index 960f63805..48509dbe4 100644 --- a/src/misc1.c +++ b/src/misc1.c @@ -4301,41 +4301,46 @@ expand_env_esc( char_u * vim_getenv(char_u *name, int *mustfree) { - char_u *p; + char_u *p = NULL; char_u *pend; int vimruntime; +#ifdef MSWIN + WCHAR *wn, *wp; -#if defined(MSWIN) - /* use "C:/" when $HOME is not set */ + // use "C:/" when $HOME is not set if (STRCMP(name, "HOME") == 0) return homedir; -#endif - p = mch_getenv(name); - if (p != NULL && *p == NUL) /* empty is the same as not set */ - p = NULL; + // Use Wide function + wn = enc_to_utf16(name, NULL); + if (wn == NULL) + return NULL; - if (p != NULL) + wp = _wgetenv(wn); + vim_free(wn); + + if (wp != NULL && *wp == NUL) // empty is the same as not set + wp = NULL; + + if (wp != NULL) { -#if defined(MSWIN) - if (enc_utf8) - { - int len; - char_u *pp = NULL; + p = utf16_to_enc(wp, NULL); + if (p == NULL) + return NULL; - /* Convert from active codepage to UTF-8. Other conversions are - * not done, because they would fail for non-ASCII characters. */ - acp_to_enc(p, (int)STRLEN(p), &pp, &len); - if (pp != NULL) - { - p = pp; - *mustfree = TRUE; - } - } -#endif + *mustfree = TRUE; return p; } +#else + p = mch_getenv(name); + if (p != NULL && *p == NUL) // empty is the same as not set + p = NULL; + + if (p != NULL) + return p; +#endif + // handling $VIMRUNTIME and $VIM is below, bail out if it's another name. vimruntime = (STRCMP(name, "VIMRUNTIME") == 0); if (!vimruntime && STRCMP(name, "VIM") != 0) return NULL; @@ -4350,8 +4355,25 @@ vim_getenv(char_u *name, int *mustfree) #endif ) { +#ifdef MSWIN + // Use Wide function + wp = _wgetenv(L"VIM"); + if (wp != NULL && *wp == NUL) // empty is the same as not set + wp = NULL; + if (wp != NULL) + { + char_u *q = utf16_to_enc(wp, NULL); + if (q != NULL) + { + p = vim_version_dir(q); + *mustfree = TRUE; + if (p == NULL) + p = q; + } + } +#else p = mch_getenv((char_u *)"VIM"); - if (p != NULL && *p == NUL) /* empty is the same as not set */ + if (p != NULL && *p == NUL) // empty is the same as not set p = NULL; if (p != NULL) { @@ -4360,27 +4382,8 @@ vim_getenv(char_u *name, int *mustfree) *mustfree = TRUE; else p = mch_getenv((char_u *)"VIM"); - -#if defined(MSWIN) - if (enc_utf8) - { - int len; - char_u *pp = NULL; - - /* Convert from active codepage to UTF-8. Other conversions - * are not done, because they would fail for non-ASCII - * characters. */ - acp_to_enc(p, (int)STRLEN(p), &pp, &len); - if (pp != NULL) - { - if (*mustfree) - vim_free(p); - p = pp; - *mustfree = TRUE; - } - } -#endif } +#endif } /* diff --git a/src/testdir/test_let.vim b/src/testdir/test_let.vim index 40eabb8cf..0ff281fe5 100644 --- a/src/testdir/test_let.vim +++ b/src/testdir/test_let.vim @@ -146,3 +146,8 @@ func Test_let_varg_fail() call assert_fails('call s:set_varg8(1)', 'E742:') call s:set_varg9([0]) endfunction + +func Test_let_utf8_environment() + let $a = 'ĀĒĪŌŪあいうえお' + call assert_equal('ĀĒĪŌŪあいうえお', $a) +endfunc diff --git a/src/version.c b/src/version.c index 0f62b83a4..c9987d2c4 100644 --- a/src/version.c +++ b/src/version.c @@ -776,6 +776,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1091, +/**/ 1090, /**/ 1089, |