]> granicus.if.org Git - vim/commitdiff
patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var v8.1.1091
authorBram Moolenaar <Bram@vim.org>
Sat, 30 Mar 2019 19:11:50 +0000 (20:11 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 30 Mar 2019 19:11:50 +0000 (20:11 +0100)
Problem:    MS-Windows: cannot use multi-byte chars in environment var.
Solution:   Use the wide API. (Ken Takata, closes #4008)

src/misc1.c
src/testdir/test_let.vim
src/version.c

index 960f63805da9d93d5b0c9425ef3c624713cec44b..48509dbe4eb2699ce5e62272dd43727bb8a404dd 100644 (file)
@@ -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
     }
 
     /*
index 40eabb8cf0d568c2dde296d132320334b644f9a4..0ff281fe50f2194511c68003c79ab858aedb17ec 100644 (file)
@@ -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
index 0f62b83a4df10038db40b01bfc4550386a921436..c9987d2c4027429ccede3c56c755fa112ada4183 100644 (file)
@@ -775,6 +775,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1091,
 /**/
     1090,
 /**/