xref: /vim-8.2.3635/src/vimrun.c (revision 00a927d6)
1 /* vi:set ts=8 sts=4 sw=4:
2  *
3  * VIM - Vi IMproved	by Bram Moolenaar
4  *			this file by Vince Negri
5  *
6  * Do ":help uganda"  in Vim to read copying and usage conditions.
7  * Do ":help credits" in Vim to see a list of people who contributed.
8  * See README.txt for an overview of the Vim source code.
9  */
10 
11 /*
12  * vimrun.c - Tiny Win32 program to safely run an external command in a
13  *	      DOS console.
14  *	      This program is required to avoid that typing CTRL-C in the DOS
15  *	      console kills Vim.  Now it only kills vimrun.
16  */
17 
18 #include <stdio.h>
19 #include <stdlib.h>
20 #ifndef __CYGWIN__
21 # include <conio.h>
22 #endif
23 
24 #ifdef __BORLANDC__
25 extern char *
26 #ifdef _RTLDLL
27 __import
28 #endif
29 _oscmd;
30 # define _kbhit kbhit
31 # define _getch getch
32 #else
33 # ifdef __MINGW32__
34 #  ifndef WIN32_LEAN_AND_MEAN
35 #   define WIN32_LEAN_AND_MEAN
36 #  endif
37 #  include <windows.h>
38 # else
39 #  ifdef __CYGWIN__
40 #   ifndef WIN32_LEAN_AND_MEAN
41 #    define WIN32_LEAN_AND_MEAN
42 #   endif
43 #   include <windows.h>
44 #   define _getch getchar
45 #  else
46 extern char *_acmdln;
47 #  endif
48 # endif
49 #endif
50 
51     int
52 main(void)
53 {
54     const char	*p;
55     int		retval;
56     int		inquote = 0;
57     int		silent = 0;
58 
59 #ifdef __BORLANDC__
60     p = _oscmd;
61 #else
62 # if defined(__MINGW32__) || defined(__CYGWIN__)
63     p = (const char *)GetCommandLine();
64 # else
65     p = _acmdln;
66 # endif
67 #endif
68     /*
69      * Skip the executable name, which might be in "".
70      */
71     while (*p)
72     {
73 	if (*p == '"')
74 	    inquote = !inquote;
75 	else if (!inquote && *p == ' ')
76 	{
77 	    ++p;
78 	    break;
79 	}
80 	++p;
81     }
82 
83     /*
84      * "-s" argument: don't wait for a key hit.
85      */
86     if (p[0] == '-' && p[1] == 's' && p[2] == ' ')
87     {
88 	silent = 1;
89 	p += 3;
90 	while (*p == ' ')
91 	    ++p;
92     }
93 
94     /* Print the command, including quotes and redirection. */
95     puts(p);
96 
97     /*
98      * Do it!
99      */
100     retval = system(p);
101 
102     if (retval == -1)
103 	perror("vimrun system(): ");
104     else if (retval != 0)
105 	printf("shell returned %d\n", retval);
106 
107     if (!silent)
108     {
109 	puts("Hit any key to close this window...");
110 
111 #ifndef __CYGWIN__
112 	while (_kbhit())
113 	    (void)_getch();
114 #endif
115 	(void)_getch();
116     }
117 
118     return retval;
119 }
120