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