summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-03-30 20:11:50 +0100
committerBram Moolenaar <Bram@vim.org>2019-03-30 20:11:50 +0100
commitf0908e6fe18943ad4453d7d6772fa43049aff4bc (patch)
treeeeb9c2d4752df779505878e903be51054a564e05
parent2d04a91d691ae1ea0c3bf9fc522c3fddc2c9746a (diff)
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment varv8.1.1091
Problem: MS-Windows: cannot use multi-byte chars in environment var. Solution: Use the wide API. (Ken Takata, closes #4008)
-rw-r--r--src/misc1.c91
-rw-r--r--src/testdir/test_let.vim5
-rw-r--r--src/version.c2
3 files changed, 54 insertions, 44 deletions
diff --git a/src/misc1.c b/src/misc1.c
index 960f63805d..48509dbe4e 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 40eabb8cf0..0ff281fe50 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 0f62b83a4d..c9987d2c40 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,