Patch 9.0.1560
Problem: Win32: When 'encoding' is set $PATH has duplicate entries.
Solution: Only append the directory if it is not there yet. (Ken Takata,
closes #12400, closes #12372)
Files: src/os_win32.c
*** ../vim-9.0.1559/src/os_win32.c 2023-05-11 22:25:37.681434047 +0100
--- src/os_win32.c 2023-05-15 16:39:34.819978611 +0100
***************
*** 466,475 ****
mch_get_exe_name(void)
{
// Maximum length of $PATH is more than MAXPATHL. 8191 is often mentioned
! // as the maximum length that works (plus a NUL byte).
! #define MAX_ENV_PATH_LEN 8192
! char temp[MAX_ENV_PATH_LEN];
! char_u *p;
WCHAR buf[MAX_PATH];
int updated = FALSE;
static int enc_prev = -1;
--- 466,475 ----
mch_get_exe_name(void)
{
// Maximum length of $PATH is more than MAXPATHL. 8191 is often mentioned
! // as the maximum length that works. Add 1 for a NUL byte and 5 for
! // "PATH=".
! #define MAX_ENV_PATH_LEN (8191 + 1 + 5)
! WCHAR temp[MAX_ENV_PATH_LEN];
WCHAR buf[MAX_PATH];
int updated = FALSE;
static int enc_prev = -1;
***************
*** 482,497 ****
{
if (enc_codepage == -1)
enc_codepage = GetACP();
! if (exe_name != NULL)
! vim_free(exe_name);
exe_name = utf16_to_enc(buf, NULL);
enc_prev = enc_codepage;
WCHAR *wp = wcsrchr(buf, '\\');
if (wp != NULL)
*wp = NUL;
! if (exe_pathw != NULL)
! vim_free(exe_pathw);
exe_pathw = _wcsdup(buf);
updated = TRUE;
}
--- 482,495 ----
{
if (enc_codepage == -1)
enc_codepage = GetACP();
! vim_free(exe_name);
exe_name = utf16_to_enc(buf, NULL);
enc_prev = enc_codepage;
WCHAR *wp = wcsrchr(buf, '\\');
if (wp != NULL)
*wp = NUL;
! vim_free(exe_pathw);
exe_pathw = _wcsdup(buf);
updated = TRUE;
}
***************
*** 500,527 ****
if (exe_pathw == NULL || !updated)
return;
- char_u *exe_path = utf16_to_enc(exe_pathw, NULL);
- if (exe_path == NULL)
- return;
-
// Append our starting directory to $PATH, so that when doing
// "!xxd" it's found in our starting directory. Needed because
// SearchPath() also looks there.
! p = mch_getenv("PATH");
! if (p == NULL
! || STRLEN(p) + STRLEN(exe_path) + 2 < MAX_ENV_PATH_LEN)
{
if (p == NULL || *p == NUL)
! temp[0] = NUL;
else
{
! STRCPY(temp, p);
! STRCAT(temp, ";");
}
! STRCAT(temp, exe_path);
! vim_setenv((char_u *)"PATH", (char_u *)temp);
}
- vim_free(exe_path);
}
/*
--- 498,533 ----
if (exe_pathw == NULL || !updated)
return;
// Append our starting directory to $PATH, so that when doing
// "!xxd" it's found in our starting directory. Needed because
// SearchPath() also looks there.
! WCHAR *p = _wgetenv(L"PATH");
! if (p == NULL || wcslen(p) + wcslen(exe_pathw) + 2 + 5 < MAX_ENV_PATH_LEN)
{
+ wcscpy(temp, L"PATH=");
+
if (p == NULL || *p == NUL)
! wcscat(temp, exe_pathw);
else
{
! wcscat(temp, p);
!
! // Check if exe_path is already included in $PATH.
! if (wcsstr(temp, exe_pathw) == NULL)
! {
! // Append ';' if $PATH doesn't end with it.
! size_t len = wcslen(temp);
! if (temp[len - 1] != L';')
! wcscat(temp, L";");
!
! wcscat(temp, exe_pathw);
! }
}
! _wputenv(temp);
! #ifdef libintl_wputenv
! libintl_wputenv(temp);
! #endif
}
}
/*
***************
*** 558,567 ****
// NOTE: Do not use mch_dirname() and mch_chdir() here, they may call
// vimLoadLib() recursively, which causes a stack overflow.
if (exe_pathw == NULL)
mch_get_exe_name();
!
! if (exe_pathw == NULL)
! return NULL;
WCHAR old_dirw[MAXPATHL];
--- 564,574 ----
// NOTE: Do not use mch_dirname() and mch_chdir() here, they may call
// vimLoadLib() recursively, which causes a stack overflow.
if (exe_pathw == NULL)
+ {
mch_get_exe_name();
! if (exe_pathw == NULL)
! return NULL;
! }
WCHAR old_dirw[MAXPATHL];
*** ../vim-9.0.1559/src/version.c 2023-05-15 16:22:34.403075980 +0100
--- src/version.c 2023-05-15 16:41:07.460038919 +0100
***************
*** 697,698 ****
--- 697,700 ----
{ /* Add new patch number below this line */
+ /**/
+ 1560,
/**/
--
hundred-and-one symptoms of being an internet addict:
36. You miss more than five meals a week downloading the latest games from
Apogee.
/// Bram Moolenaar -- Br...@Moolenaar.net --
http://www.Moolenaar.net \\\
/// \\\
\\\ sponsor Vim, vote for features --
http://www.Vim.org/sponsor/ ///
\\\ help me help AIDS victims --
http://ICCF-Holland.org ///