Skip to content

Instantly share code, notes, and snippets.

@mattn
Last active January 15, 2020 01:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mattn/6153332 to your computer and use it in GitHub Desktop.
Save mattn/6153332 to your computer and use it in GitHub Desktop.
diff -r 5bb04d03dfa8 src/os_win32.c
--- a/src/os_win32.c Tue Jul 09 21:57:52 2013 +0200
+++ b/src/os_win32.c Mon Aug 05 16:03:05 2013 +0900
@@ -3619,6 +3619,45 @@
}
#endif /* FEAT_GUI_W32 */
+ static BOOL
+_create_process(const char* cmd, DWORD flags, BOOL inherit_handles,
+ STARTUPINFO* si, PROCESS_INFORMATION* pi)
+{
+# ifdef FEAT_MBYTE
+ if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+ {
+ WCHAR *wcmd = enc_to_utf16(cmd, NULL);
+ if (wcmd != NULL)
+ {
+ BOOL ret;
+ ret = CreateProcessW(
+ NULL, /* Executable name */
+ wcmd, /* Command to execute */
+ NULL, /* Process security attributes */
+ NULL, /* Thread security attributes */
+ inherit_handles, /* Inherit handles */
+ flags, /* Creation flags */
+ NULL, /* Environment */
+ NULL, /* Current directory */
+ si, /* Startup information */
+ pi); /* Process information */
+ vim_free(wcmd);
+ return ret;
+ }
+ }
+#endif
+ return CreateProcess(
+ NULL, /* Executable name */
+ cmd, /* Command to execute */
+ NULL, /* Process security attributes */
+ NULL, /* Thread security attributes */
+ inherit_handles, /* Inherit handles */
+ flags, /* Creation flags */
+ NULL, /* Environment */
+ NULL, /* Current directory */
+ si, /* Startup information */
+ pi); /* Process information */
+}
#if defined(FEAT_GUI_W32) || defined(PROTO)
@@ -3665,18 +3704,8 @@
cmd += 3;
/* Now, run the command */
- CreateProcess(NULL, /* Executable name */
- cmd, /* Command to execute */
- NULL, /* Process security attributes */
- NULL, /* Thread security attributes */
- FALSE, /* Inherit handles */
- CREATE_DEFAULT_ERROR_MODE | /* Creation flags */
- CREATE_NEW_CONSOLE,
- NULL, /* Environment */
- NULL, /* Current directory */
- &si, /* Startup information */
- &pi); /* Process information */
-
+ _create_process(cmd, FALSE,
+ CREATE_DEFAULT_ERROR_MODE | CREATE_NEW_CONSOLE, &si, &pi);
/* Wait for the command to terminate before continuing */
if (g_PlatformId != VER_PLATFORM_WIN32s)
@@ -4009,21 +4038,7 @@
}
/* Now, run the command */
- CreateProcess(NULL, /* Executable name */
- p, /* Command to execute */
- NULL, /* Process security attributes */
- NULL, /* Thread security attributes */
-
- // this command can be litigious, handle inheritance was
- // deactivated for pending temp file, but, if we deactivate
- // it, the pipes don't work for some reason.
- TRUE, /* Inherit handles, first deactivated,
- * but needed */
- CREATE_DEFAULT_ERROR_MODE, /* Creation flags */
- NULL, /* Environment */
- NULL, /* Current directory */
- &si, /* Startup information */
- &pi); /* Process information */
+ _create_process(p, TRUE, CREATE_DEFAULT_ERROR_MODE, &si, &pi);
if (p != cmd)
vim_free(p);
@@ -4241,7 +4256,25 @@
}
#else
-# define mch_system(c, o) system(c)
+# ifdef FEAT_MBYTE
+ static int
+mch_system(char *cmd, int options)
+{
+ if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+ {
+ WCHAR *wcmd = enc_to_utf16(cmd, NULL);
+ if (wcmd != NULL)
+ {
+ int ret = _wsystem(wcmd);
+ vim_free(wcmd);
+ return ret;
+ }
+ }
+ return system(cmd);
+}
+# else
+# define mch_system(c, o) system(c)
+# endif
#endif
@@ -4409,16 +4442,7 @@
* inherit our handles which causes unpleasant dangling swap
* files if we exit before the spawned process
*/
- if (CreateProcess(NULL, // Executable name
- newcmd, // Command to execute
- NULL, // Process security attributes
- NULL, // Thread security attributes
- FALSE, // Inherit handles
- flags, // Creation flags
- NULL, // Environment
- NULL, // Current directory
- &si, // Startup information
- &pi)) // Process information
+ if (_create_process(newcmd, FALSE, flags, &si, &pi))
x = 0;
else
{
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment