diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-03-30 20:11:50 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-03-30 20:11:50 +0100 |
commit | f0908e6fe18943ad4453d7d6772fa43049aff4bc (patch) | |
tree | eeb9c2d4752df779505878e903be51054a564e05 /src/misc1.c | |
parent | 2d04a91d691ae1ea0c3bf9fc522c3fddc2c9746a (diff) | |
download | vim-git-f0908e6fe18943ad4453d7d6772fa43049aff4bc.tar.gz |
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)
Diffstat (limited to 'src/misc1.c')
-rw-r--r-- | src/misc1.c | 91 |
1 files changed, 47 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 } /* |