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 -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            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].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/20230515154222.F0EDC1C0571%40moolenaar.net.

Raspunde prin e-mail lui