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 * NextStep has a problem with configure, undefine a few things: 11 */ 12 #ifdef NeXT 13 # ifdef HAVE_UTIME 14 # undef HAVE_UTIME 15 # endif 16 # ifdef HAVE_SYS_UTSNAME_H 17 # undef HAVE_SYS_UTSNAME_H 18 # endif 19 #endif 20 21 #include <stdio.h> 22 #include <ctype.h> 23 24 #ifdef VAXC 25 # include <types.h> 26 # include <stat.h> 27 #else 28 # include <sys/types.h> 29 # include <sys/stat.h> 30 #endif 31 32 #ifdef HAVE_STDLIB_H 33 # include <stdlib.h> 34 #endif 35 36 #ifdef __CYGWIN__ 37 # define WIN32UNIX // Compiling for Win32 using Unix files. 38 # define BINARY_FILE_IO 39 40 # define CASE_INSENSITIVE_FILENAME 41 # define USE_FNAME_CASE // Fix filename case differences. 42 #endif 43 44 // On AIX 4.2 there is a conflicting prototype for ioctl() in stropts.h and 45 // unistd.h. This hack should fix that (suggested by Jeff George). 46 // But on AIX 4.3 it's alright (suggested by Jake Hamby). 47 #if defined(FEAT_GUI) && defined(_AIX) && !defined(_AIX43) && !defined(_NO_PROTO) 48 # define _NO_PROTO 49 #endif 50 51 #ifdef HAVE_UNISTD_H 52 # include <unistd.h> 53 #endif 54 55 #ifdef HAVE_LIBC_H 56 # include <libc.h> // for NeXT 57 #endif 58 59 #ifdef HAVE_SYS_PARAM_H 60 # include <sys/param.h> // defines BSD, if it's a BSD system 61 #endif 62 63 /* 64 * Using getcwd() is preferred, because it checks for a buffer overflow. 65 * Don't use getcwd() on systems do use system("sh -c pwd"). There is an 66 * autoconf check for this. 67 * Use getcwd() anyway if getwd() isn't present. 68 */ 69 #if defined(HAVE_GETCWD) && !(defined(BAD_GETCWD) && defined(HAVE_GETWD)) 70 # define USE_GETCWD 71 #endif 72 73 // always use unlink() to remove files 74 #ifndef PROTO 75 # ifdef VMS 76 # define vim_mkdir(x, y) mkdir((char *)vms_fixfilename(x), y) 77 # define mch_rmdir(x) delete((char *)vms_fixfilename(x)) 78 # define mch_remove(x) delete((char *)vms_fixfilename(x)) 79 # else 80 # define vim_mkdir(x, y) mkdir((char *)(x), y) 81 # define mch_rmdir(x) rmdir((char *)(x)) 82 # define mch_remove(x) unlink((char *)(x)) 83 # endif 84 #endif 85 86 // The number of arguments to a signal handler is configured here. 87 // It used to be a long list of almost all systems. Any system that doesn't 88 // have an argument??? 89 #define SIGHASARG 90 91 // List 3 arg systems here. I guess __sgi, please test and correct me. jw. 92 #if defined(__sgi) && defined(HAVE_SIGCONTEXT) 93 # define SIGHAS3ARGS 94 #endif 95 96 #ifdef SIGHASARG 97 # ifdef SIGHAS3ARGS 98 # define SIGPROTOARG (int, int, struct sigcontext *) 99 # define SIGDEFARG(s) (int s, int sig2, struct sigcontext *scont) 100 # define SIGDUMMYARG 0, 0, (struct sigcontext *)0 101 # else 102 # define SIGPROTOARG (int) 103 # define SIGDEFARG(s) (int s UNUSED) 104 # define SIGDUMMYARG 0 105 # endif 106 #else 107 # define SIGPROTOARG (void) 108 # define SIGDEFARG(s) () 109 # define SIGDUMMYARG 110 #endif 111 112 #ifdef HAVE_DIRENT_H 113 # include <dirent.h> 114 # ifndef NAMLEN 115 # define NAMLEN(dirent) strlen((dirent)->d_name) 116 # endif 117 #else 118 # define dirent direct 119 # define NAMLEN(dirent) (dirent)->d_namlen 120 # if HAVE_SYS_NDIR_H 121 # include <sys/ndir.h> 122 # endif 123 # if HAVE_SYS_DIR_H 124 # include <sys/dir.h> 125 # endif 126 # if HAVE_NDIR_H 127 # include <ndir.h> 128 # endif 129 #endif 130 131 // on some systems time.h should not be included together with sys/time.h 132 #if !defined(HAVE_SYS_TIME_H) || defined(TIME_WITH_SYS_TIME) 133 # include <time.h> 134 #endif 135 #ifdef HAVE_SYS_TIME_H 136 # include <sys/time.h> 137 #endif 138 139 #include <signal.h> 140 141 #if defined(DIRSIZ) && !defined(MAXNAMLEN) 142 # define MAXNAMLEN DIRSIZ 143 #endif 144 145 #if defined(UFS_MAXNAMLEN) && !defined(MAXNAMLEN) 146 # define MAXNAMLEN UFS_MAXNAMLEN // for dynix/ptx 147 #endif 148 149 #if defined(NAME_MAX) && !defined(MAXNAMLEN) 150 # define MAXNAMLEN NAME_MAX // for Linux before .99p3 151 #endif 152 153 /* 154 * Note: if MAXNAMLEN has the wrong value, you will get error messages 155 * for not being able to open the swap file. 156 */ 157 #if !defined(MAXNAMLEN) 158 # define MAXNAMLEN 512 // for all other Unix 159 #endif 160 161 #define BASENAMELEN (MAXNAMLEN - 5) 162 163 #ifdef HAVE_PWD_H 164 # include <pwd.h> 165 #endif 166 167 #if (defined(HAVE_SYS_RESOURCE_H) && defined(HAVE_GETRLIMIT)) \ 168 || (defined(HAVE_SYS_SYSINFO_H) && defined(HAVE_SYSINFO)) \ 169 || defined(HAVE_SYSCTL) || defined(HAVE_SYSCONF) 170 # define HAVE_TOTAL_MEM 171 #endif 172 173 174 #ifndef PROTO 175 176 #ifdef VMS 177 # include <unixio.h> 178 # include <unixlib.h> 179 # include <signal.h> 180 # include <file.h> 181 # include <ssdef.h> 182 # include <descrip.h> 183 # include <libclidef.h> 184 # include <lnmdef.h> 185 # include <psldef.h> 186 # include <prvdef.h> 187 # include <dvidef.h> 188 # include <dcdef.h> 189 # include <stsdef.h> 190 # include <iodef.h> 191 # include <ttdef.h> 192 # include <tt2def.h> 193 # include <jpidef.h> 194 # include <rms.h> 195 # include <trmdef.h> 196 # include <string.h> 197 # include <starlet.h> 198 # include <socket.h> 199 # include <lib$routines.h> 200 # include <libdef.h> 201 # include <libdtdef.h> 202 203 # if defined(FEAT_GUI_MOTIF) 204 # define XFree XFREE 205 # define XmRepTypeInstallTearOffModelCon XMREPTYPEINSTALLTEAROFFMODELCON 206 # endif 207 #endif // VMS 208 209 #ifdef HAVE_FLOCK 210 # include <sys/file.h> 211 #endif 212 213 #endif // PROTO 214 215 #ifdef VMS 216 typedef struct dsc$descriptor DESC; 217 #endif 218 219 /* 220 * Unix system-dependent file names 221 */ 222 #ifndef SYS_VIMRC_FILE 223 # define SYS_VIMRC_FILE "$VIM/vimrc" 224 #endif 225 #ifndef SYS_GVIMRC_FILE 226 # define SYS_GVIMRC_FILE "$VIM/gvimrc" 227 #endif 228 #ifndef DFLT_HELPFILE 229 # define DFLT_HELPFILE "$VIMRUNTIME/doc/help.txt" 230 #endif 231 #ifndef FILETYPE_FILE 232 # define FILETYPE_FILE "filetype.vim" 233 #endif 234 #ifndef FTPLUGIN_FILE 235 # define FTPLUGIN_FILE "ftplugin.vim" 236 #endif 237 #ifndef INDENT_FILE 238 # define INDENT_FILE "indent.vim" 239 #endif 240 #ifndef FTOFF_FILE 241 # define FTOFF_FILE "ftoff.vim" 242 #endif 243 #ifndef FTPLUGOF_FILE 244 # define FTPLUGOF_FILE "ftplugof.vim" 245 #endif 246 #ifndef INDOFF_FILE 247 # define INDOFF_FILE "indoff.vim" 248 #endif 249 #ifndef SYS_MENU_FILE 250 # define SYS_MENU_FILE "$VIMRUNTIME/menu.vim" 251 #endif 252 253 #ifndef USR_EXRC_FILE 254 # ifdef VMS 255 # define USR_EXRC_FILE "sys$login:.exrc" 256 # else 257 # define USR_EXRC_FILE "$HOME/.exrc" 258 # endif 259 #endif 260 261 #if !defined(USR_EXRC_FILE2) && defined(VMS) 262 # define USR_EXRC_FILE2 "sys$login:_exrc" 263 #endif 264 265 #ifndef USR_VIMRC_FILE 266 # ifdef VMS 267 # define USR_VIMRC_FILE "sys$login:.vimrc" 268 # else 269 # define USR_VIMRC_FILE "$HOME/.vimrc" 270 # endif 271 #endif 272 273 274 #if !defined(USR_VIMRC_FILE2) 275 # ifdef VMS 276 # define USR_VIMRC_FILE2 "sys$login:vimfiles/vimrc" 277 # else 278 # define USR_VIMRC_FILE2 "~/.vim/vimrc" 279 # endif 280 #endif 281 282 #if !defined(USR_VIMRC_FILE3) && defined(VMS) 283 # define USR_VIMRC_FILE3 "sys$login:_vimrc" 284 #endif 285 286 #ifndef USR_GVIMRC_FILE 287 # ifdef VMS 288 # define USR_GVIMRC_FILE "sys$login:.gvimrc" 289 # else 290 # define USR_GVIMRC_FILE "$HOME/.gvimrc" 291 # endif 292 #endif 293 294 #ifndef USR_GVIMRC_FILE2 295 # ifdef VMS 296 # define USR_GVIMRC_FILE2 "sys$login:vimfiles/gvimrc" 297 # else 298 # define USR_GVIMRC_FILE2 "~/.vim/gvimrc" 299 # endif 300 #endif 301 302 #ifdef VMS 303 # ifndef USR_GVIMRC_FILE3 304 # define USR_GVIMRC_FILE3 "sys$login:_gvimrc" 305 # endif 306 #endif 307 308 #ifndef VIM_DEFAULTS_FILE 309 # define VIM_DEFAULTS_FILE "$VIMRUNTIME/defaults.vim" 310 #endif 311 312 #ifndef EVIM_FILE 313 # define EVIM_FILE "$VIMRUNTIME/evim.vim" 314 #endif 315 316 #ifdef FEAT_VIMINFO 317 # ifndef VIMINFO_FILE 318 # ifdef VMS 319 # define VIMINFO_FILE "sys$login:.viminfo" 320 # else 321 # define VIMINFO_FILE "$HOME/.viminfo" 322 # endif 323 # endif 324 # if !defined(VIMINFO_FILE2) && defined(VMS) 325 # define VIMINFO_FILE2 "sys$login:_viminfo" 326 # endif 327 #endif 328 329 #ifndef EXRC_FILE 330 # define EXRC_FILE ".exrc" 331 #endif 332 333 #ifndef VIMRC_FILE 334 # define VIMRC_FILE ".vimrc" 335 #endif 336 337 #ifdef FEAT_GUI 338 # ifndef GVIMRC_FILE 339 # define GVIMRC_FILE ".gvimrc" 340 # endif 341 #endif 342 343 #ifndef SYNTAX_FNAME 344 # define SYNTAX_FNAME "$VIMRUNTIME/syntax/%s.vim" 345 #endif 346 347 #ifndef DFLT_BDIR 348 # ifdef VMS 349 # define DFLT_BDIR "./,sys$login:,tmp:" 350 # else 351 # define DFLT_BDIR ".,~/tmp,~/" // default for 'backupdir' 352 # endif 353 #endif 354 355 #ifndef DFLT_DIR 356 # ifdef VMS 357 # define DFLT_DIR "./,sys$login:,tmp:" 358 # else 359 # define DFLT_DIR ".,~/tmp,/var/tmp,/tmp" // default for 'directory' 360 # endif 361 #endif 362 363 #ifndef DFLT_VDIR 364 # ifdef VMS 365 # define DFLT_VDIR "sys$login:vimfiles/view" 366 # else 367 # define DFLT_VDIR "$HOME/.vim/view" // default for 'viewdir' 368 # endif 369 #endif 370 371 #define DFLT_ERRORFILE "errors.err" 372 373 #ifndef DFLT_RUNTIMEPATH 374 375 # ifdef VMS 376 # define DFLT_RUNTIMEPATH "sys$login:vimfiles,$VIM/vimfiles,$VIMRUNTIME,$VIM/vimfiles/after,sys$login:vimfiles/after" 377 # define CLEAN_RUNTIMEPATH "$VIM/vimfiles,$VIMRUNTIME,$VIM/vimfiles/after" 378 # else 379 # ifdef RUNTIME_GLOBAL 380 # ifdef RUNTIME_GLOBAL_AFTER 381 # define DFLT_RUNTIMEPATH "~/.vim," RUNTIME_GLOBAL ",$VIMRUNTIME," RUNTIME_GLOBAL_AFTER ",~/.vim/after" 382 # define CLEAN_RUNTIMEPATH RUNTIME_GLOBAL ",$VIMRUNTIME," RUNTIME_GLOBAL_AFTER 383 # else 384 # define DFLT_RUNTIMEPATH "~/.vim," RUNTIME_GLOBAL ",$VIMRUNTIME," RUNTIME_GLOBAL "/after,~/.vim/after" 385 # define CLEAN_RUNTIMEPATH RUNTIME_GLOBAL ",$VIMRUNTIME," RUNTIME_GLOBAL "/after" 386 # endif 387 # else 388 # define DFLT_RUNTIMEPATH "~/.vim,$VIM/vimfiles,$VIMRUNTIME,$VIM/vimfiles/after,~/.vim/after" 389 # define CLEAN_RUNTIMEPATH "$VIM/vimfiles,$VIMRUNTIME,$VIM/vimfiles/after" 390 # endif 391 # endif 392 393 #endif 394 395 #ifdef VMS 396 # ifndef VAX 397 # define VMS_TEMPNAM // to fix default .LIS extension 398 # endif 399 # define TEMPNAME "TMP:v?XXXXXX.txt" 400 # define TEMPNAMELEN 28 401 #else 402 // Try several directories to put the temp files. 403 # define TEMPDIRNAMES "$TMPDIR", "/tmp", ".", "$HOME" 404 # define TEMPNAMELEN 256 405 #endif 406 407 // Special wildcards that need to be handled by the shell 408 #define SPECIAL_WILDCHAR "`'{" 409 410 /* 411 * Unix has plenty of memory, use large buffers 412 */ 413 #define CMDBUFFSIZE 1024 // size of the command processing buffer 414 415 // Use the system path length if it makes sense. 416 #if defined(PATH_MAX) && (PATH_MAX > 1000) 417 # define MAXPATHL PATH_MAX 418 #else 419 # define MAXPATHL 1024 420 #endif 421 422 #define CHECK_INODE // used when checking if a swap file already 423 // exists for a file 424 #ifdef VMS // Use less memory because of older systems 425 # ifndef DFLT_MAXMEM 426 # define DFLT_MAXMEM (2*1024) 427 # endif 428 # ifndef DFLT_MAXMEMTOT 429 # define DFLT_MAXMEMTOT (5*1024) 430 # endif 431 #else 432 # ifndef DFLT_MAXMEM 433 # define DFLT_MAXMEM (5*1024) // use up to 5 Mbyte for a buffer 434 # endif 435 # ifndef DFLT_MAXMEMTOT 436 # define DFLT_MAXMEMTOT (10*1024) // use up to 10 Mbyte for Vim 437 # endif 438 #endif 439 440 // memmove() is not present on all systems, use memmove, bcopy or memcpy. 441 // Some systems have (void *) arguments, some (char *). If we use (char *) it 442 // works for all 443 #if defined(USEMEMMOVE) || (!defined(USEBCOPY) && !defined(USEMEMCPY)) 444 # define mch_memmove(to, from, len) memmove((char *)(to), (char *)(from), len) 445 #else 446 # ifdef USEBCOPY 447 # define mch_memmove(to, from, len) bcopy((char *)(from), (char *)(to), len) 448 # else 449 // ifdef USEMEMCPY 450 # define mch_memmove(to, from, len) memcpy((char *)(to), (char *)(from), len) 451 # endif 452 #endif 453 454 #ifndef PROTO 455 # ifdef HAVE_RENAME 456 # define mch_rename(src, dst) rename(src, dst) 457 # else 458 int mch_rename(const char *src, const char *dest); 459 # endif 460 # ifndef VMS 461 # ifdef __MVS__ 462 // on OS390 Unix getenv() doesn't return a pointer to persistent 463 // storage -> use __getenv() 464 # define mch_getenv(x) (char_u *)__getenv((char *)(x)) 465 # else 466 # define mch_getenv(x) (char_u *)getenv((char *)(x)) 467 # endif 468 # define mch_setenv(name, val, x) setenv(name, val, x) 469 # endif 470 #endif 471 472 // Note: Some systems need both string.h and strings.h (Savage). However, 473 // some systems can't handle both, only use string.h in that case. 474 #ifdef HAVE_STRING_H 475 # include <string.h> 476 #endif 477 #if defined(HAVE_STRINGS_H) && !defined(NO_STRINGS_WITH_STRING_H) 478 # include <strings.h> 479 #endif 480 481 #if defined(HAVE_SETJMP_H) 482 # include <setjmp.h> 483 # ifdef HAVE_SIGSETJMP 484 # define JMP_BUF sigjmp_buf 485 # define SETJMP(x) sigsetjmp((x), 1) 486 # define LONGJMP siglongjmp 487 # else 488 # define JMP_BUF jmp_buf 489 # define SETJMP(x) setjmp(x) 490 # define LONGJMP longjmp 491 # endif 492 #endif 493 494 #ifndef HAVE_DUP 495 # define HAVE_DUP // have dup() 496 #endif 497 #define HAVE_ST_MODE // have stat.st_mode 498 499 // We have three kinds of ACL support. 500 #define HAVE_ACL (HAVE_POSIX_ACL || HAVE_SOLARIS_ACL || HAVE_AIX_ACL) 501