blob: c423e6cc5fb72b2040361021124c9e5edd3ba70f [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001/* 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__
25extern 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
46extern char *_acmdln;
47# endif
48# endif
49#endif
50
51 int
52main(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
Bram Moolenaar9964e462007-05-05 17:54:07 +0000102 if (retval == -1)
103 perror("vimrun system(): ");
104 else if (retval != 0)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000105 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}