1
0
forked from aniani/vim

patch 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var

Problem:    MS-Windows: cannot use multi-byte chars in environment var.
Solution:   Use the wide API. (Ken Takata, closes #4008)
This commit is contained in:
Bram Moolenaar
2019-03-30 20:11:50 +01:00
parent 2d04a91d69
commit f0908e6fe1
3 changed files with 54 additions and 44 deletions

View 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
// 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 */
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;
}
#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
}
/*