]> granicus.if.org Git - vim/commitdiff
patch 8.1.0895: MS-Windows: dealing with temp name encoding not quite right v8.1.0895
authorBram Moolenaar <Bram@vim.org>
Sun, 10 Feb 2019 22:26:13 +0000 (23:26 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 10 Feb 2019 22:26:13 +0000 (23:26 +0100)
Problem:    MS-Windows: dealing with temp name encoding not quite right.
Solution:   Use more wide functions. (Ken Takata, closes #3921)

src/fileio.c
src/version.c

index c1aa1a76f94ea16164216853c5ed83f153b19170..9ab90eb39b6730a5d64e2dcdb09390a9c4f3859b 100644 (file)
@@ -7322,6 +7322,8 @@ vim_tempname(
 {
 #ifdef USE_TMPNAM
     char_u     itmp[L_tmpnam]; /* use tmpnam() */
+#elif defined(WIN3264)
+    WCHAR      itmp[TEMPNAMELEN];
 #else
     char_u     itmp[TEMPNAMELEN];
 #endif
@@ -7443,51 +7445,33 @@ vim_tempname(
 #else /* TEMPDIRNAMES */
 
 # ifdef WIN3264
-    char       szTempFile[_MAX_PATH + 1];
-    char       buf4[4];
+    WCHAR      wszTempFile[_MAX_PATH + 1];
+    WCHAR      buf4[4];
     char_u     *retval;
     char_u     *p;
 
-    STRCPY(itmp, "");
-    if (GetTempPath(_MAX_PATH, szTempFile) == 0)
+    wcscpy(itmp, L"");
+    if (GetTempPathW(_MAX_PATH, wszTempFile) == 0)
     {
-       szTempFile[0] = '.';    /* GetTempPath() failed, use current dir */
-       szTempFile[1] = NUL;
+       wszTempFile[0] = L'.';  // GetTempPathW() failed, use current dir
+       wszTempFile[1] = NUL;
     }
-    strcpy(buf4, "VIM");
+    wcscpy(buf4, L"VIM");
     buf4[2] = extra_char;   /* make it "VIa", "VIb", etc. */
-    if (GetTempFileName(szTempFile, buf4, 0, (LPSTR)itmp) == 0)
+    if (GetTempFileNameW(wszTempFile, buf4, 0, itmp) == 0)
        return NULL;
     if (!keep)
-       /* GetTempFileName() will create the file, we don't want that */
-       (void)DeleteFile((LPSTR)itmp);
+       // GetTempFileName() will create the file, we don't want that
+       (void)DeleteFileW(itmp);
 
-    /* Backslashes in a temp file name cause problems when filtering with
-     * "sh".  NOTE: This also checks 'shellcmdflag' to help those people who
-     * didn't set 'shellslash'. */
-    retval = vim_strsave(itmp);
+    // Backslashes in a temp file name cause problems when filtering with
+    // "sh".  NOTE: This also checks 'shellcmdflag' to help those people who
+    // didn't set 'shellslash'.
+    retval = utf16_to_enc(itmp, NULL);
     if (*p_shcf == '-' || p_ssl)
        for (p = retval; *p; ++p)
            if (*p == '\\')
                *p = '/';
-
-#if defined(WIN3264)
-    if (enc_utf8)
-    {
-       int     len;
-       char_u  *pp = NULL;
-
-       // Convert from active codepage to UTF-8 since mch_call_shell()
-       // converts command-line to wide string from encoding.
-       acp_to_enc(retval, (int)STRLEN(retval), &pp, &len);
-       if (pp != NULL)
-       {
-           vim_free(retval);
-           return pp;
-       }
-    }
-#endif
-
     return retval;
 
 # else /* WIN3264 */
index 2563561644560c05bf5c12a924cfc82582e887aa..33353ba845918181bc7f1a6f5c0cd9cf010c02b7 100644 (file)
@@ -783,6 +783,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    895,
 /**/
     894,
 /**/