diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 08:50:31 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 08:50:31 +0000 |
commit | aed8ce9da277f5ecffe968b324f242c41c3b752a (patch) | |
tree | d2e538394cb7a8a7c42a4aac6ccf1a8e3256999b /src/vimrun.c | |
parent | Initial commit. (diff) | |
download | vim-aed8ce9da277f5ecffe968b324f242c41c3b752a.tar.xz vim-aed8ce9da277f5ecffe968b324f242c41c3b752a.zip |
Adding upstream version 2:9.0.1378.upstream/2%9.0.1378upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/vimrun.c')
-rw-r--r-- | src/vimrun.c | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/src/vimrun.c b/src/vimrun.c new file mode 100644 index 0000000..9a4c076 --- /dev/null +++ b/src/vimrun.c @@ -0,0 +1,113 @@ +/* vi:set ts=8 sts=4 sw=4 noet: + * + * VIM - Vi IMproved by Bram Moolenaar + * this file by Vince Negri + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +/* + * vimrun.c - Tiny Win32 program to safely run an external command in a + * DOS console. + * This program is required to avoid that typing CTRL-C in the DOS + * console kills Vim. Now it only kills vimrun. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <conio.h> +#ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +#endif +#include <windows.h> + + int +main(void) +{ + const wchar_t *p; + wchar_t *cmd; + size_t cmdlen; + int retval; + int inquote = 0; + int silent = 0; + HANDLE hstdout; + DWORD written; + + p = (const wchar_t *)GetCommandLineW(); + + /* + * Skip the executable name, which might be in "". + */ + while (*p) + { + if (*p == L'"') + inquote = !inquote; + else if (!inquote && *p == L' ') + { + ++p; + break; + } + ++p; + } + while (*p == L' ') + ++p; + + /* + * "-s" argument: don't wait for a key hit. + */ + if (p[0] == L'-' && p[1] == L's' && p[2] == L' ') + { + silent = 1; + p += 3; + while (*p == L' ') + ++p; + } + + // Print the command, including quotes and redirection. + hstdout = GetStdHandle(STD_OUTPUT_HANDLE); + WriteConsoleW(hstdout, p, wcslen(p), &written, NULL); + WriteConsoleW(hstdout, L"\r\n", 2, &written, NULL); + + // If the command starts and ends with double quotes, + // Enclose the command in parentheses. + cmd = NULL; + cmdlen = wcslen(p); + if (cmdlen >= 2 && p[0] == L'"' && p[cmdlen - 1] == L'"') + { + cmdlen += 3; + cmd = malloc(cmdlen * sizeof(wchar_t)); + if (cmd == NULL) + { + perror("vimrun malloc(): "); + return -1; + } + _snwprintf(cmd, cmdlen, L"(%s)", p); + p = cmd; + } + + /* + * Do it! + */ + retval = _wsystem(p); + + if (cmd) + free(cmd); + + if (retval == -1) + perror("vimrun system(): "); + else if (retval != 0) + printf("shell returned %d\n", retval); + + if (!silent) + { + puts("Hit any key to close this window..."); + + while (_kbhit()) + (void)_getch(); + (void)_getch(); + } + + return retval; +} |