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