To: [email protected]
Subject: Patch 6.3a.008 (extra)
Fcc: outbox
From: Bram Moolenaar <[email protected]>
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
------------

Patch 6.3a.008 (extra)
Problem:    Windows 98: Some of the wide functions are not implemented,
           resulting in file I/O to fail.  This depends on what Unicode
           support is installed.
Solution:   Handle the failure and fall back to non-wide functions.
Files:      src/os_win32.c


*** ../vim-6.3a.007/src/os_win32.c      Fri May  7 10:59:38 2004
--- src/os_win32.c      Tue May 11 17:28:30 2004
***************
*** 2372,2377 ****
--- 2372,2397 ----
      * But the Win32s known bug list says that getcwd() doesn't work
      * so use the Win32 system call instead. <Negri>
      */
+ #ifdef FEAT_MBYTE
+     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+     {
+       WCHAR   wbuf[_MAX_PATH + 1];
+
+       if (GetCurrentDirectoryW(_MAX_PATH, wbuf) != 0)
+       {
+           char_u  *p = ucs2_to_enc(wbuf, NULL);
+
+           if (p != NULL)
+           {
+               STRNCPY(buf, p, len - 1);
+               buf[len - 1] = NUL;
+               vim_free(p);
+               return OK;
+           }
+       }
+       /* Retry with non-wide function (for Windows 98). */
+     }
+ #endif
     return (GetCurrentDirectory(len, buf) != 0 ? OK : FAIL);
 }

***************
*** 2385,2395 ****
     char_u *name)
 {
 #ifdef FEAT_MBYTE
!     /* Apparently GetFileAttributesW() exists on Win95/98/ME, but it doesn't
!      * work. */
!     PlatformId();
!     if (g_PlatformId == VER_PLATFORM_WIN32_NT
!                       && enc_codepage >= 0 && (int)GetACP() != enc_codepage)
     {
       WCHAR   *p = enc_to_ucs2(name, NULL);
       long    n;
--- 2405,2411 ----
     char_u *name)
 {
 #ifdef FEAT_MBYTE
!     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
     {
       WCHAR   *p = enc_to_ucs2(name, NULL);
       long    n;
***************
*** 2398,2404 ****
       {
           n = (long)GetFileAttributesW(p);
           vim_free(p);
!           return n;
       }
     }
 #endif
--- 2414,2422 ----
       {
           n = (long)GetFileAttributesW(p);
           vim_free(p);
!           if (n >= 0 || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
!               return n;
!           /* Retry with non-wide function (for Windows 98). */
       }
     }
 #endif
***************
*** 2425,2431 ****
       {
           n = (long)SetFileAttributesW(p, perm);
           vim_free(p);
!           return n ? OK : FAIL;
       }
     }
 #endif
--- 2443,2451 ----
       {
           n = (long)SetFileAttributesW(p, perm);
           vim_free(p);
!           if (n || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
!               return n ? OK : FAIL;
!           /* Retry with non-wide function (for Windows 98). */
       }
     }
 #endif
***************
*** 2442,2459 ****
 #ifdef FEAT_MBYTE
     WCHAR     *p = NULL;

!     /* Apparently GetFileAttributesW() exists on Win95/98/ME, but it doesn't
!      * work. */
!     PlatformId();
!     if (g_PlatformId == VER_PLATFORM_WIN32_NT
!                       && enc_codepage >= 0 && (int)GetACP() != enc_codepage)
       p = enc_to_ucs2(name, NULL);
 #endif

 #ifdef FEAT_MBYTE
     if (p != NULL)
       perm = GetFileAttributesW(p);
!     else
 #endif
       perm = GetFileAttributes((char *)name);
     if (perm >= 0)
--- 2462,2483 ----
 #ifdef FEAT_MBYTE
     WCHAR     *p = NULL;

!     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
       p = enc_to_ucs2(name, NULL);
 #endif

 #ifdef FEAT_MBYTE
     if (p != NULL)
+     {
       perm = GetFileAttributesW(p);
!       if (perm < 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
!       {
!           /* Retry with non-wide function (for Windows 98). */
!           vim_free(p);
!           p = NULL;
!       }
!     }
!     if (p == NULL)
 #endif
       perm = GetFileAttributes((char *)name);
     if (perm >= 0)
***************
*** 2461,2468 ****
       perm |= FILE_ATTRIBUTE_HIDDEN;
 #ifdef FEAT_MBYTE
       if (p != NULL)
!           SetFileAttributesW(p, perm);
!       else
 #endif
           SetFileAttributes((char *)name, perm);
     }
--- 2485,2500 ----
       perm |= FILE_ATTRIBUTE_HIDDEN;
 #ifdef FEAT_MBYTE
       if (p != NULL)
!       {
!           if (SetFileAttributesW(p, perm) == 0
!                   && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
!           {
!               /* Retry with non-wide function (for Windows 98). */
!               vim_free(p);
!               p = NULL;
!           }
!       }
!       if (p == NULL)
 #endif
           SetFileAttributes((char *)name, perm);
     }
***************
*** 4033,4038 ****
--- 4065,4071 ----

 /*
  * this version of remove is not scared by a readonly (backup) file
+  * Return 0 for success, -1 for failure.
  */
     int
 mch_remove(char_u *name)
***************
*** 4049,4055 ****
           SetFileAttributesW(wn, FILE_ATTRIBUTE_NORMAL);
           n = DeleteFileW(wn) ? 0 : -1;
           vim_free(wn);
!           return n;
       }
     }
 #endif
--- 4082,4090 ----
           SetFileAttributesW(wn, FILE_ATTRIBUTE_NORMAL);
           n = DeleteFileW(wn) ? 0 : -1;
           vim_free(wn);
!           if (n == 0 || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
!               return n;
!           /* Retry with non-wide function (for Windows 98). */
       }
     }
 #endif
***************
*** 4180,4200 ****
 #ifdef FEAT_MBYTE
     WCHAR     *wold = NULL;
     WCHAR     *wnew = NULL;
!     int               retval = 0;

     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
     {
       wold = enc_to_ucs2((char_u *)pszOldFile, NULL);
       wnew = enc_to_ucs2((char_u *)pszNewFile, NULL);
       if (wold != NULL && wnew != NULL)
-       {
           retval = mch_wrename(wold, wnew);
-           vim_free(wold);
-           vim_free(wnew);
-           return retval;
-       }
       vim_free(wold);
       vim_free(wnew);
     }
 #endif

--- 4215,4233 ----
 #ifdef FEAT_MBYTE
     WCHAR     *wold = NULL;
     WCHAR     *wnew = NULL;
!     int               retval = -1;

     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
     {
       wold = enc_to_ucs2((char_u *)pszOldFile, NULL);
       wnew = enc_to_ucs2((char_u *)pszNewFile, NULL);
       if (wold != NULL && wnew != NULL)
           retval = mch_wrename(wold, wnew);
       vim_free(wold);
       vim_free(wnew);
+       if (retval == 0 || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
+           return retval;
+       /* Retry with non-wide function (for Windows 98). */
     }
 #endif

***************
*** 4325,4334 ****

               hFile = FindFirstFileW(TempNameW, &d);
               if (hFile == INVALID_HANDLE_VALUE)
!                   goto getout;
               (void)FindClose(hFile);
           }
!           else
 #endif
           {
               char                *pch;
--- 4358,4374 ----

               hFile = FindFirstFileW(TempNameW, &d);
               if (hFile == INVALID_HANDLE_VALUE)
!               {
!                   if (GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
!                       goto getout;
!
!                   /* Retry with non-wide function (for Windows 98). */
!                   vim_free(wn);
!                   wn = NULL;
!               }
               (void)FindClose(hFile);
           }
!           if (wn == NULL)
 #endif
           {
               char                *pch;
***************
*** 4358,4367 ****
           if (wn != NULL)
           {
               if (!GetTempFileNameW(wn, L"VIM", 0, TempNameW))
!                   goto getout;
!               DeleteFileW(TempNameW);
           }
!           else
 #endif
           {
               if (!GetTempFileName(n, "VIM", 0, TempName))
--- 4398,4415 ----
           if (wn != NULL)
           {
               if (!GetTempFileNameW(wn, L"VIM", 0, TempNameW))
!               {
!                   if (GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
!                       goto getout;
!
!                   /* Retry with non-wide function (for Windows 98). */
!                   vim_free(wn);
!                   wn = NULL;
!               }
!               else
!                   DeleteFileW(TempNameW);
           }
!           if (wn == NULL)
 #endif
           {
               if (!GetTempFileName(n, "VIM", 0, TempName))
***************
*** 4378,4385 ****
               | ((p & R_OK) ? GENERIC_READ : 0);
 #ifdef FEAT_MBYTE
       if (wn != NULL)
           hFile = CreateFileW(wn, am, 0, NULL, OPEN_EXISTING, 0, NULL);
!       else
 #endif
           hFile = CreateFile(n, am, 0, NULL, OPEN_EXISTING, 0, NULL);
       if (hFile == INVALID_HANDLE_VALUE)
--- 4426,4442 ----
               | ((p & R_OK) ? GENERIC_READ : 0);
 #ifdef FEAT_MBYTE
       if (wn != NULL)
+       {
           hFile = CreateFileW(wn, am, 0, NULL, OPEN_EXISTING, 0, NULL);
!           if (hFile == INVALID_HANDLE_VALUE
!                             && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
!           {
!               /* Retry with non-wide function (for Windows 98). */
!               vim_free(wn);
!               wn = NULL;
!           }
!       }
!       if (wn == NULL)
 #endif
           hFile = CreateFile(n, am, 0, NULL, OPEN_EXISTING, 0, NULL);
       if (hFile == INVALID_HANDLE_VALUE)
*** ../vim-6.3a.007/src/version.c       Mon May 10 12:49:59 2004
--- src/version.c       Tue May 11 17:48:56 2004
***************
*** 643,644 ****
--- 643,646 ----
 {   /* Add new patch number below this line */
+ /**/
+     8,
 /**/

--
hundred-and-one symptoms of being an internet addict:
248. You sign your letters with your e-mail address instead of your name.

/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        Sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\              Project leader for A-A-P -- http://www.A-A-P.org        ///
\\\  Buy at Amazon and help AIDS victims -- http://ICCF.nl/click1.html ///