changeset 15776:7f91de3f5e35 v8.1.0895

patch 8.1.0895: MS-Windows: dealing with temp name encoding not quite right commit https://github.com/vim/vim/commit/ec0f50a35e207e01ff54cef954313030e3ab42a6 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Feb 10 23:26:13 2019 +0100 patch 8.1.0895: MS-Windows: dealing with temp name encoding not quite right Problem: MS-Windows: dealing with temp name encoding not quite right. Solution: Use more wide functions. (Ken Takata, closes https://github.com/vim/vim/issues/3921)
author Bram Moolenaar <Bram@vim.org>
date Sun, 10 Feb 2019 23:30:09 +0100
parents 4bca710ededd
children 8ee4000692f3
files src/fileio.c src/version.c
diffstat 2 files changed, 21 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -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)
-    {
-	szTempFile[0] = '.';	/* GetTempPath() failed, use current dir */
-	szTempFile[1] = NUL;
-    }
-    strcpy(buf4, "VIM");
+    wcscpy(itmp, L"");
+    if (GetTempPathW(_MAX_PATH, wszTempFile) == 0)
+    {
+	wszTempFile[0] = L'.';	// GetTempPathW() failed, use current dir
+	wszTempFile[1] = NUL;
+    }
+    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);
-
-    /* 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);
+	// 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 = 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 */
--- a/src/version.c
+++ b/src/version.c
@@ -784,6 +784,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    895,
+/**/
     894,
 /**/
     893,