Patch 8.1.1091
Problem:    MS-Windows: cannot use multi-byte chars in environment var.
Solution:   Use the wide API. (Ken Takata, closes #4008)
Files:      src/misc1.c, src/testdir/test_let.vim


*** ../vim-8.1.1090/src/misc1.c 2019-03-30 18:46:57.356077354 +0100
--- src/misc1.c 2019-03-30 20:10:00.966173750 +0100
***************
*** 4301,4341 ****
      char_u *
  vim_getenv(char_u *name, int *mustfree)
  {
!     char_u    *p;
      char_u    *pend;
      int               vimruntime;
  
! #if defined(MSWIN)
!     /* 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;
  
!     if (p != NULL)
      {
! #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)
!           {
!               p = pp;
!               *mustfree = TRUE;
!           }
!       }
! #endif
        return p;
      }
  
      vimruntime = (STRCMP(name, "VIMRUNTIME") == 0);
      if (!vimruntime && STRCMP(name, "VIM") != 0)
        return NULL;
--- 4301,4346 ----
      char_u *
  vim_getenv(char_u *name, int *mustfree)
  {
!     char_u    *p = NULL;
      char_u    *pend;
      int               vimruntime;
+ #ifdef MSWIN
+     WCHAR     *wn, *wp;
  
!     // use "C:/" when $HOME is not set
      if (STRCMP(name, "HOME") == 0)
        return homedir;
  
!     // Use Wide function
!     wn = enc_to_utf16(name, NULL);
!     if (wn == NULL)
!       return NULL;
  
!     wp = _wgetenv(wn);
!     vim_free(wn);
! 
!     if (wp != NULL && *wp == NUL)   // empty is the same as not set
!       wp = NULL;
! 
!     if (wp != NULL)
      {
!       p = utf16_to_enc(wp, NULL);
!       if (p == NULL)
!           return NULL;
  
!       *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,4357 ****
  #endif
         )
      {
        p = mch_getenv((char_u *)"VIM");
!       if (p != NULL && *p == NUL)         /* empty is the same as not set */
            p = NULL;
        if (p != NULL)
        {
--- 4355,4379 ----
  #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
            p = NULL;
        if (p != NULL)
        {
***************
*** 4360,4386 ****
                *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
        }
      }
  
      /*
--- 4382,4389 ----
                *mustfree = TRUE;
            else
                p = mch_getenv((char_u *)"VIM");
        }
+ #endif
      }
  
      /*
*** ../vim-8.1.1090/src/testdir/test_let.vim    2019-02-11 22:00:07.671917613 
+0100
--- src/testdir/test_let.vim    2019-03-30 20:07:06.947341962 +0100
***************
*** 146,148 ****
--- 146,153 ----
    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
*** ../vim-8.1.1090/src/version.c       2019-03-30 20:04:05.024567549 +0100
--- src/version.c       2019-03-30 20:07:53.131031588 +0100
***************
*** 777,778 ****
--- 777,780 ----
  {   /* Add new patch number below this line */
+ /**/
+     1091,
  /**/

-- 
Microsoft says that MS-Windows is much better for you than Linux.
That's like the Pope saying that catholicism is much better for
you than protestantism.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui