summaryrefslogtreecommitdiffstats
path: root/src/misc1.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/misc1.c')
-rw-r--r--src/misc1.c91
1 files changed, 47 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
}
/*