home *** CD-ROM | disk | FTP | other *** search
/ vim.ftp.fu-berlin.de / 2015-02-03.vim.ftp.fu-berlin.de.tar / vim.ftp.fu-berlin.de / unix / vim-6.2.tar.bz2 / vim-6.2.tar / vim62 / src / os_unix.h < prev    next >
Encoding:
C/C++ Source or Header  |  2003-01-20  |  12.3 KB  |  531 lines

  1. /* 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 <string.h>
  222. #include <starlet.h>
  223. #include <socket.h>
  224. #include <lib$routines.h>
  225.  
  226. typedef struct dsc$descriptor   DESC;
  227. #endif
  228.  
  229. /*
  230.  * Unix system-dependent file names
  231.  */
  232. #ifndef SYS_VIMRC_FILE
  233. # define SYS_VIMRC_FILE "$VIM/vimrc"
  234. #endif
  235. #ifndef SYS_GVIMRC_FILE
  236. # define SYS_GVIMRC_FILE "$VIM/gvimrc"
  237. #endif
  238. #ifndef DFLT_HELPFILE
  239. # define DFLT_HELPFILE    "$VIMRUNTIME/doc/help.txt"
  240. #endif
  241. #ifndef FILETYPE_FILE
  242. # define FILETYPE_FILE    "filetype.vim"
  243. #endif
  244. #ifndef FTPLUGIN_FILE
  245. # define FTPLUGIN_FILE    "ftplugin.vim"
  246. #endif
  247. #ifndef INDENT_FILE
  248. # define INDENT_FILE    "indent.vim"
  249. #endif
  250. #ifndef FTOFF_FILE
  251. # define FTOFF_FILE    "ftoff.vim"
  252. #endif
  253. #ifndef FTPLUGOF_FILE
  254. # define FTPLUGOF_FILE    "ftplugof.vim"
  255. #endif
  256. #ifndef INDOFF_FILE
  257. # define INDOFF_FILE    "indoff.vim"
  258. #endif
  259. #ifndef SYS_MENU_FILE
  260. # define SYS_MENU_FILE    "$VIMRUNTIME/menu.vim"
  261. #endif
  262.  
  263. #ifndef USR_EXRC_FILE
  264. # ifdef VMS
  265. #  define USR_EXRC_FILE "sys$login:.exrc"
  266. # else
  267. #  define USR_EXRC_FILE "$HOME/.exrc"
  268. # endif
  269. #endif
  270.  
  271. #if !defined(USR_EXRC_FILE2) && defined(OS2)
  272. # define USR_EXRC_FILE2 "$VIM/.exrc"
  273. #endif
  274. #if !defined(USR_EXRC_FILE2) && defined(VMS)
  275. # define USR_EXRC_FILE2 "sys$login:_exrc"
  276. #endif
  277.  
  278. #ifndef USR_VIMRC_FILE
  279. # ifdef VMS
  280. # define USR_VIMRC_FILE  "sys$login:.vimrc"
  281. # else
  282. #  define USR_VIMRC_FILE "$HOME/.vimrc"
  283. # endif
  284. #endif
  285.  
  286. #if !defined(USR_VIMRC_FILE2) && defined(OS2)
  287. # define USR_VIMRC_FILE2 "$VIM/.vimrc"
  288. #endif
  289. #if !defined(USR_VIMRC_FILE2) && defined(VMS)
  290. # define USR_VIMRC_FILE2 "sys$login:_vimrc"
  291. #endif
  292.  
  293. #ifndef USR_GVIMRC_FILE
  294. # ifdef VMS
  295. #  define USR_GVIMRC_FILE "sys$login:.gvimrc"
  296. # else
  297. #  define USR_GVIMRC_FILE "$HOME/.gvimrc"
  298. # endif
  299. #endif
  300.  
  301. #ifdef VMS
  302. # ifndef USR_GVIMRC_FILE2
  303. #  define USR_GVIMRC_FILE2  "sys$login:_gvimrc"
  304. # endif
  305. #endif
  306.  
  307. #ifndef EVIM_FILE
  308. # define EVIM_FILE    "$VIMRUNTIME/evim.vim"
  309. #endif
  310.  
  311. #ifdef FEAT_VIMINFO
  312. # ifndef VIMINFO_FILE
  313. #  ifdef VMS
  314. #   define VIMINFO_FILE  "sys$login:.viminfo"
  315. #  else
  316. #   define VIMINFO_FILE "$HOME/.viminfo"
  317. #  endif
  318. # endif
  319. # if !defined(VIMINFO_FILE2) && defined(OS2)
  320. #  define VIMINFO_FILE2 "$VIM/.viminfo"
  321. # endif
  322. # if !defined(VIMINFO_FILE2) && defined(VMS)
  323. #  define VIMINFO_FILE2 "sys$login:_viminfo"
  324. # endif
  325. #endif
  326.  
  327. #ifndef EXRC_FILE
  328. # define EXRC_FILE    ".exrc"
  329. #endif
  330.  
  331. #ifndef VIMRC_FILE
  332. # define VIMRC_FILE    ".vimrc"
  333. #endif
  334.  
  335. #ifdef FEAT_GUI
  336. # ifndef GVIMRC_FILE
  337. #  define GVIMRC_FILE    ".gvimrc"
  338. # endif
  339. #endif
  340.  
  341. #ifndef SYNTAX_FNAME
  342. # define SYNTAX_FNAME    "$VIMRUNTIME/syntax/%s.vim"
  343. #endif
  344.  
  345. #ifndef DFLT_BDIR
  346. # ifdef OS2
  347. #  define DFLT_BDIR     ".,c:/tmp,~/tmp,~/"
  348. # else
  349. #  ifdef VMS
  350. #   define DFLT_BDIR    "./,sys$login:,tmp:"
  351. #  else
  352. #   define DFLT_BDIR    ".,~/tmp,~/"    /* default for 'backupdir' */
  353. #  endif
  354. # endif
  355. #endif
  356.  
  357. #ifndef DFLT_DIR
  358. # ifdef OS2
  359. #  define DFLT_DIR      ".,~/tmp,c:/tmp,/tmp"
  360. # else
  361. #  ifdef VMS
  362. #   define DFLT_DIR     "./,sys$login:,tmp:"
  363. #  else
  364. #   define DFLT_DIR     ".,~/tmp,/var/tmp,/tmp" /* default for 'directory' */
  365. #  endif
  366. # endif
  367. #endif
  368.  
  369. #ifndef DFLT_VDIR
  370. # ifdef OS2
  371. #  define DFLT_VDIR     "$VIM/vimfiles/view"
  372. # else
  373. #  ifdef VMS
  374. #   define DFLT_VDIR    "sys$login:vimfiles/view"
  375. #  else
  376. #   define DFLT_VDIR    "$HOME/.vim/view"       /* default for 'viewdir' */
  377. #  endif
  378. # endif
  379. #endif
  380.  
  381. #define DFLT_ERRORFILE        "errors.err"
  382.  
  383. #ifdef OS2
  384. # define DFLT_RUNTIMEPATH    "$HOME/vimfiles,$VIM/vimfiles,$VIMRUNTIME,$VIM/vimfiles/after,$HOME/vimfiles/after"
  385. #else
  386. # ifdef VMS
  387. #  define DFLT_RUNTIMEPATH      "sys$login:vimfiles,$VIM/vimfiles,$VIMRUNTIME,$VIM/vimfiles/after,sys$login:vimfiles/after"
  388. # else
  389. #  ifdef RUNTIME_GLOBAL
  390. #   define DFLT_RUNTIMEPATH    "~/.vim," RUNTIME_GLOBAL ",$VIMRUNTIME," RUNTIME_GLOBAL "/after,~/.vim/after"
  391. #  else
  392. #   define DFLT_RUNTIMEPATH    "~/.vim,$VIM/vimfiles,$VIMRUNTIME,$VIM/vimfiles/after,~/.vim/after"
  393. #  endif
  394. # endif
  395. #endif
  396.  
  397. #ifdef OS2
  398. /*
  399.  * Try several directories to put the temp files.
  400.  */
  401. # define TEMPDIRNAMES    "$TMP", "$TEMP", "c:\\TMP", "c:\\TEMP", ""
  402. # define TEMPNAMELEN    128
  403. #else
  404. # ifdef VMS
  405. #  ifndef VAX
  406. #   define VMS_TEMPNAM    /* to fix default .LIS extension */
  407. #  endif
  408. #  define TEMPNAME       "TMP:v?XXXXXX.txt"
  409. #  define TEMPNAMELEN    28
  410. # else
  411. #  define TEMPDIRNAMES  "$TMPDIR", "/tmp", ".", "$HOME"
  412. #  define TEMPNAMELEN    256
  413. # endif
  414. #endif
  415.  
  416. /* Special wildcards that need to be handled by the shell */
  417. #define SPECIAL_WILDCHAR    "`'{"
  418.  
  419. #ifndef HAVE_OPENDIR
  420. # define NO_EXPANDPATH
  421. #endif
  422.  
  423. /*
  424.  * Unix has plenty of memory, use large buffers
  425.  */
  426. #define CMDBUFFSIZE 1024    /* size of the command processing buffer */
  427. #define MAXPATHL    1024    /* Unix has long paths and plenty of memory */
  428.  
  429. #define CHECK_INODE        /* used when checking if a swap file already
  430.                     exists for a file */
  431. #ifdef VMS  /* Use less memory because of older systems  */
  432. # ifndef DFLT_MAXMEM
  433. #  define DFLT_MAXMEM (2*1024)
  434. # endif
  435. # ifndef DFLT_MAXMEMTOT
  436. #  define DFLT_MAXMEMTOT (5*1024)
  437. # endif
  438. #else
  439. # ifndef DFLT_MAXMEM
  440. #  define DFLT_MAXMEM    (5*1024)     /* use up to 5 Mbyte for a buffer */
  441. # endif
  442. # ifndef DFLT_MAXMEMTOT
  443. #  define DFLT_MAXMEMTOT    (10*1024)    /* use up to 10 Mbyte for Vim */
  444. # endif
  445. #endif
  446.  
  447. /* memmove is not present on all systems, use memmove, bcopy, memcpy or our
  448.  * own version */
  449. /* Some systems have (void *) arguments, some (char *). If we use (char *) it
  450.  * works for all */
  451. #ifdef USEMEMMOVE
  452. # define mch_memmove(to, from, len) memmove((char *)(to), (char *)(from), len)
  453. #else
  454. # ifdef USEBCOPY
  455. #  define mch_memmove(to, from, len) bcopy((char *)(from), (char *)(to), len)
  456. # else
  457. #  ifdef USEMEMCPY
  458. #   define mch_memmove(to, from, len) memcpy((char *)(to), (char *)(from), len)
  459. #  else
  460. #   define VIM_MEMMOVE        /* found in misc2.c */
  461. #  endif
  462. # endif
  463. #endif
  464.  
  465. #ifndef PROTO
  466. # ifdef HAVE_RENAME
  467. #  define mch_rename(src, dst) rename(src, dst)
  468. # else
  469. int mch_rename __ARGS((const char *src, const char *dest));
  470. # endif
  471. # ifdef VMS
  472. #  define mch_chdir(s) chdir(vms_fixfilename(s))
  473. # else
  474. #  define mch_chdir(s) chdir(s)
  475. # endif
  476. # ifndef VMS
  477. #  ifdef __MVS__
  478.   /* on OS390 Unix getenv() doesn't return a pointer to persistant
  479.    * storage -> use __getenv() */
  480. #   define mch_getenv(x) (char_u *)__getenv((char *)(x))
  481. #  else
  482. #   define mch_getenv(x) (char_u *)getenv((char *)(x))
  483. #  endif
  484. #  define mch_setenv(name, val, x) setenv(name, val, x)
  485. # endif
  486. #endif
  487.  
  488. #if !defined(S_ISDIR) && defined(S_IFDIR)
  489. # define    S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
  490. #endif
  491. #if !defined(S_ISREG) && defined(S_IFREG)
  492. # define    S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
  493. #endif
  494. #if !defined(S_ISBLK) && defined(S_IFBLK)
  495. # define    S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
  496. #endif
  497. #if !defined(S_ISSOCK) && defined(S_IFSOCK)
  498. # define    S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
  499. #endif
  500. #if !defined(S_ISFIFO) && defined(S_IFIFO)
  501. # define    S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
  502. #endif
  503.  
  504. /* Note: Some systems need both string.h and strings.h (Savage).  However,
  505.  * some systems can't handle both, only use string.h in that case. */
  506. #ifdef HAVE_STRING_H
  507. # include <string.h>
  508. #endif
  509. #if defined(HAVE_STRINGS_H) && !defined(NO_STRINGS_WITH_STRING_H)
  510. # include <strings.h>
  511. #endif
  512.  
  513. #if defined(HAVE_SETJMP_H)
  514. # include <setjmp.h>
  515. # ifdef HAVE_SIGSETJMP
  516. #  define JMP_BUF sigjmp_buf
  517. #  define SETJMP(x) sigsetjmp((x), 1)
  518. #  define LONGJMP siglongjmp
  519. # else
  520. #  define JMP_BUF jmp_buf
  521. #  define SETJMP(x) setjmp(x)
  522. #  define LONGJMP longjmp
  523. # endif
  524. #endif
  525.  
  526. #define HAVE_DUP        /* have dup() */
  527. #define HAVE_ST_MODE        /* have stat.st_mode */
  528.  
  529. /* We have three kinds of ACL support. */
  530. #define HAVE_ACL (HAVE_POSIX_ACL || HAVE_SOLARIS_ACL || HAVE_AIX_ACL)
  531.