1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
|
/* vi:set ts=8 sts=4 sw=4 noet:
*
* VIM - Vi IMproved by Bram Moolenaar
*
* Do ":help uganda" in Vim to read copying and usage conditions.
* Do ":help credits" in Vim to see a list of people who contributed.
*/
/*
* Win32 (Windows NT and Windows 95) machine-dependent things.
*/
#include "os_dos.h" // common MS-DOS and Win32 stuff
// cproto fails on missing include files
#ifndef PROTO
# include <direct.h> // for _mkdir()
#endif
#define BINARY_FILE_IO
#define USE_EXE_NAME // use argv[0] for $VIM
#define USE_TERM_CONSOLE
#ifndef HAVE_STRING_H
# define HAVE_STRING_H
#endif
#ifndef HAVE_MATH_H
# define HAVE_MATH_H
#endif
#define HAVE_STRCSPN
#ifndef __GNUC__
#define HAVE_STRICMP
#define HAVE_STRNICMP
#endif
#ifndef HAVE_STRFTIME
# define HAVE_STRFTIME // guessed
#endif
#define HAVE_MEMSET
#ifndef HAVE_LOCALE_H
# define HAVE_LOCALE_H 1
#endif
#ifndef HAVE_FCNTL_H
# define HAVE_FCNTL_H
#endif
#define HAVE_QSORT
#define HAVE_ST_MODE // have stat.st_mode
#define FEAT_SHORTCUT // resolve shortcuts
// Access Control List (actually security info).
#define HAVE_ACL
#define USE_FNAME_CASE // adjust case of file names
#if !defined(FEAT_CLIPBOARD)
# define FEAT_CLIPBOARD // include clipboard support
#endif
#if defined(__DATE__) && defined(__TIME__)
# define HAVE_DATE_TIME
#endif
#ifndef FEAT_GUI_MSWIN // GUI works different
# define BREAKCHECK_SKIP 1 // call mch_breakcheck() each time, it's fast
#endif
#define HAVE_TOTAL_MEM
#define HAVE_PUTENV // at least Bcc 5.2 and MSC have it
#if defined(FEAT_GUI_MSWIN) && !defined(VIMDLL)
# define NO_CONSOLE // don't include console-only code
#endif
// toupper() is not really broken, but it's very slow. Probably because of
// using Unicode characters on Windows NT
#define BROKEN_TOUPPER
#define FNAME_ILLEGAL "\"*?><|" // illegal characters in a file name
#include <signal.h>
#include <stdlib.h>
#include <time.h>
#include <sys/types.h>
#ifndef STRICT
# define STRICT
#endif
#ifndef COBJMACROS
# define COBJMACROS // For OLE: Enable "friendlier" access to objects
#endif
#ifndef PROTO
// Must include winsock2.h before windows.h since it conflicts with winsock.h
// (included in windows.h).
# include <winsock2.h>
# include <ws2tcpip.h>
# include <windows.h>
// Weird: rpcndr.h defines "small" to "char", which causes trouble
#undef small
# ifndef SM_CXPADDEDBORDER
# define SM_CXPADDEDBORDER 92
# endif
#endif
typedef void (*sighandler_T)(int, int);
/*
* Win32 has plenty of memory, use large buffers
*/
#define CMDBUFFSIZE 1024 // size of the command processing buffer
// _MAX_PATH is only 260 (stdlib.h), but we want more for the 'path' option,
// thus use a larger number.
#define MAXPATHL 1024
#ifndef BASENAMELEN
# define BASENAMELEN (_MAX_PATH - 5) // length of base of file name
#endif
#define TEMPNAMELEN _MAX_PATH // length of temp file name path
#ifndef DFLT_MAXMEM
# define DFLT_MAXMEM (2*1024) // use up to 2 Mbyte for a buffer
#endif
#ifndef DFLT_MAXMEMTOT
# define DFLT_MAXMEMTOT (5*1024) // use up to 5 Mbyte for Vim
#endif
/*
* Reparse Point
*/
#ifndef FILE_ATTRIBUTE_REPARSE_POINT
# define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
#endif
#ifndef IO_REPARSE_TAG_MOUNT_POINT
# define IO_REPARSE_TAG_MOUNT_POINT 0xA0000003
#endif
#ifndef IO_REPARSE_TAG_SYMLINK
# define IO_REPARSE_TAG_SYMLINK 0xA000000C
#endif
#ifndef IO_REPARSE_TAG_APPEXECLINK
# define IO_REPARSE_TAG_APPEXECLINK 0x8000001B
#endif
/*
* Definition of the reparse point buffer.
* This is usually defined in the DDK, copy the definition here to avoid
* adding it as a dependence only for a single structure.
*/
typedef struct _REPARSE_DATA_BUFFER {
ULONG ReparseTag;
USHORT ReparseDataLength;
USHORT Reserved;
union {
struct {
USHORT SubstituteNameOffset;
USHORT SubstituteNameLength;
USHORT PrintNameOffset;
USHORT PrintNameLength;
ULONG Flags;
WCHAR PathBuffer[1];
} SymbolicLinkReparseBuffer;
struct {
USHORT SubstituteNameOffset;
USHORT SubstituteNameLength;
USHORT PrintNameOffset;
USHORT PrintNameLength;
WCHAR PathBuffer[1];
} MountPointReparseBuffer;
struct {
UCHAR DataBuffer[1];
} GenericReparseBuffer;
struct
{
ULONG StringCount;
WCHAR StringList[1];
} AppExecLinkReparseBuffer;
} DUMMYUNIONNAME;
} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
#ifdef _MSC_VER
// Support for __try / __except. All versions of MSVC are
// expected to have this. Any other compilers that support it?
# define HAVE_TRY_EXCEPT 1
# include <malloc.h> // for _resetstkoflw()
#endif
/*
* Some simple debugging macros that look and behave a lot like their
* namesakes in MFC.
*/
#ifdef _DEBUG
# include <crtdbg.h>
# define ASSERT(f) _ASSERT(f)
# define TRACE Trace
# define TRACE0(sz) Trace(_T("%s"), _T(sz))
# define TRACE1(sz, p1) Trace(_T(sz), p1)
# define TRACE2(sz, p1, p2) Trace(_T(sz), p1, p2)
# define TRACE3(sz, p1, p2, p3) Trace(_T(sz), p1, p2, p3)
# define TRACE4(sz, p1, p2, p3, p4) Trace(_T(sz), p1, p2, p3, p4)
// In debug version, writes trace messages to debug stream
void __cdecl
Trace(char *pszFormat, ...);
#else // !_DEBUG
// These macros should all compile away to nothing
# define ASSERT(f) ((void)0)
# define TRACE 1 ? (void)0 : (void)printf
# define TRACE0(sz)
# define TRACE1(sz, p1)
# define TRACE2(sz, p1, p2)
# define TRACE3(sz, p1, p2, p3)
# define TRACE4(sz, p1, p2, p3, p4)
#endif // !_DEBUG
#define ASSERT_POINTER(p, type) \
ASSERT(((p) != NULL) && IsValidAddress((p), sizeof(type), FALSE))
#define ASSERT_NULL_OR_POINTER(p, type) \
ASSERT(((p) == NULL) || IsValidAddress((p), sizeof(type), FALSE))
#ifndef HAVE_SETENV
# define HAVE_SETENV
#endif
#define mch_getenv(x) (char_u *)getenv((char *)(x))
#define vim_mkdir(x, y) mch_mkdir(x)
|