xref: /plan9/sys/src/ape/cmd/diff/system.h (revision f5692daa7036e29f3c674ff66e91b7ec98da5f5e)
10b459c2cSDavid du Colombier /* System dependent declarations.
20b459c2cSDavid du Colombier    Copyright (C) 1988, 1989, 1992, 1993, 1994 Free Software Foundation, Inc.
30b459c2cSDavid du Colombier 
40b459c2cSDavid du Colombier This file is part of GNU DIFF.
50b459c2cSDavid du Colombier 
60b459c2cSDavid du Colombier GNU DIFF is free software; you can redistribute it and/or modify
70b459c2cSDavid du Colombier it under the terms of the GNU General Public License as published by
80b459c2cSDavid du Colombier the Free Software Foundation; either version 2, or (at your option)
90b459c2cSDavid du Colombier any later version.
100b459c2cSDavid du Colombier 
110b459c2cSDavid du Colombier GNU DIFF is distributed in the hope that it will be useful,
120b459c2cSDavid du Colombier but WITHOUT ANY WARRANTY; without even the implied warranty of
130b459c2cSDavid du Colombier MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
140b459c2cSDavid du Colombier GNU General Public License for more details.
150b459c2cSDavid du Colombier 
160b459c2cSDavid du Colombier You should have received a copy of the GNU General Public License
170b459c2cSDavid du Colombier along with GNU DIFF; see the file COPYING.  If not, write to
180b459c2cSDavid du Colombier the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
190b459c2cSDavid du Colombier 
200b459c2cSDavid du Colombier /* We must define `volatile' and `const' first (the latter inside config.h),
210b459c2cSDavid du Colombier    so that they're used consistently in all system includes.  */
220b459c2cSDavid du Colombier #if !__STDC__
230b459c2cSDavid du Colombier #ifndef volatile
240b459c2cSDavid du Colombier #define volatile
250b459c2cSDavid du Colombier #endif
260b459c2cSDavid du Colombier #endif
270b459c2cSDavid du Colombier #include <config.h>
280b459c2cSDavid du Colombier 
290b459c2cSDavid du Colombier #include <sys/types.h>
300b459c2cSDavid du Colombier #include <sys/stat.h>
310b459c2cSDavid du Colombier 
320b459c2cSDavid du Colombier #if __STDC__
330b459c2cSDavid du Colombier #define PARAMS(args) args
340b459c2cSDavid du Colombier #define VOID void
350b459c2cSDavid du Colombier #else
360b459c2cSDavid du Colombier #define PARAMS(args) ()
370b459c2cSDavid du Colombier #define VOID char
380b459c2cSDavid du Colombier #endif
390b459c2cSDavid du Colombier 
400b459c2cSDavid du Colombier #if STAT_MACROS_BROKEN
410b459c2cSDavid du Colombier #undef S_ISBLK
420b459c2cSDavid du Colombier #undef S_ISCHR
430b459c2cSDavid du Colombier #undef S_ISDIR
440b459c2cSDavid du Colombier #undef S_ISFIFO
450b459c2cSDavid du Colombier #undef S_ISREG
460b459c2cSDavid du Colombier #undef S_ISSOCK
470b459c2cSDavid du Colombier #endif
480b459c2cSDavid du Colombier #ifndef S_ISDIR
490b459c2cSDavid du Colombier #define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
500b459c2cSDavid du Colombier #endif
510b459c2cSDavid du Colombier #ifndef S_ISREG
520b459c2cSDavid du Colombier #define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)
530b459c2cSDavid du Colombier #endif
540b459c2cSDavid du Colombier #if !defined(S_ISBLK) && defined(S_IFBLK)
550b459c2cSDavid du Colombier #define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK)
560b459c2cSDavid du Colombier #endif
570b459c2cSDavid du Colombier #if !defined(S_ISCHR) && defined(S_IFCHR)
580b459c2cSDavid du Colombier #define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR)
590b459c2cSDavid du Colombier #endif
600b459c2cSDavid du Colombier #if !defined(S_ISFIFO) && defined(S_IFFIFO)
610b459c2cSDavid du Colombier #define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFFIFO)
620b459c2cSDavid du Colombier #endif
630b459c2cSDavid du Colombier #if !defined(S_ISSOCK) && defined(S_IFSOCK)
640b459c2cSDavid du Colombier #define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK)
650b459c2cSDavid du Colombier #endif
660b459c2cSDavid du Colombier 
670b459c2cSDavid du Colombier #if HAVE_UNISTD_H
680b459c2cSDavid du Colombier #include <unistd.h>
690b459c2cSDavid du Colombier #endif
700b459c2cSDavid du Colombier 
710b459c2cSDavid du Colombier #ifndef SEEK_SET
720b459c2cSDavid du Colombier #define SEEK_SET 0
730b459c2cSDavid du Colombier #endif
740b459c2cSDavid du Colombier #ifndef SEEK_CUR
750b459c2cSDavid du Colombier #define SEEK_CUR 1
760b459c2cSDavid du Colombier #endif
770b459c2cSDavid du Colombier 
780b459c2cSDavid du Colombier #ifndef STDIN_FILENO
790b459c2cSDavid du Colombier #define STDIN_FILENO 0
800b459c2cSDavid du Colombier #endif
810b459c2cSDavid du Colombier #ifndef STDOUT_FILENO
820b459c2cSDavid du Colombier #define STDOUT_FILENO 1
830b459c2cSDavid du Colombier #endif
840b459c2cSDavid du Colombier #ifndef STDERR_FILENO
850b459c2cSDavid du Colombier #define STDERR_FILENO 2
860b459c2cSDavid du Colombier #endif
870b459c2cSDavid du Colombier 
880b459c2cSDavid du Colombier #if HAVE_TIME_H
890b459c2cSDavid du Colombier #include <time.h>
900b459c2cSDavid du Colombier #else
910b459c2cSDavid du Colombier #include <sys/time.h>
920b459c2cSDavid du Colombier #endif
930b459c2cSDavid du Colombier 
940b459c2cSDavid du Colombier #if HAVE_FCNTL_H
950b459c2cSDavid du Colombier #include <fcntl.h>
960b459c2cSDavid du Colombier #else
970b459c2cSDavid du Colombier #if HAVE_SYS_FILE_H
980b459c2cSDavid du Colombier #include <sys/file.h>
990b459c2cSDavid du Colombier #endif
1000b459c2cSDavid du Colombier #endif
1010b459c2cSDavid du Colombier 
1020b459c2cSDavid du Colombier #if !HAVE_DUP2
1030b459c2cSDavid du Colombier #define dup2(f,t)	(close (t),  fcntl (f,F_DUPFD,t))
1040b459c2cSDavid du Colombier #endif
1050b459c2cSDavid du Colombier 
1060b459c2cSDavid du Colombier #ifndef O_RDONLY
1070b459c2cSDavid du Colombier #define O_RDONLY 0
1080b459c2cSDavid du Colombier #endif
1090b459c2cSDavid du Colombier 
1100b459c2cSDavid du Colombier #if HAVE_SYS_WAIT_H
1110b459c2cSDavid du Colombier #include <sys/wait.h>
1120b459c2cSDavid du Colombier #endif
1130b459c2cSDavid du Colombier #ifndef WEXITSTATUS
1140b459c2cSDavid du Colombier #define WEXITSTATUS(stat_val) ((unsigned) (stat_val) >> 8)
1150b459c2cSDavid du Colombier #endif
1160b459c2cSDavid du Colombier #ifndef WIFEXITED
1170b459c2cSDavid du Colombier #define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
1180b459c2cSDavid du Colombier #endif
1190b459c2cSDavid du Colombier 
1200b459c2cSDavid du Colombier #ifndef STAT_BLOCKSIZE
1210b459c2cSDavid du Colombier #if HAVE_ST_BLKSIZE
1220b459c2cSDavid du Colombier #define STAT_BLOCKSIZE(s) (s).st_blksize
1230b459c2cSDavid du Colombier #else
1240b459c2cSDavid du Colombier #define STAT_BLOCKSIZE(s) (8 * 1024)
1250b459c2cSDavid du Colombier #endif
1260b459c2cSDavid du Colombier #endif
1270b459c2cSDavid du Colombier 
1280b459c2cSDavid du Colombier #if HAVE_DIRENT_H
1290b459c2cSDavid du Colombier # include <dirent.h>
1300b459c2cSDavid du Colombier # define NAMLEN(dirent) strlen((dirent)->d_name)
1310b459c2cSDavid du Colombier #else
1320b459c2cSDavid du Colombier # define dirent direct
1330b459c2cSDavid du Colombier # define NAMLEN(dirent) ((dirent)->d_namlen)
1340b459c2cSDavid du Colombier # if HAVE_SYS_NDIR_H
1350b459c2cSDavid du Colombier #  include <sys/ndir.h>
1360b459c2cSDavid du Colombier # endif
1370b459c2cSDavid du Colombier # if HAVE_SYS_DIR_H
1380b459c2cSDavid du Colombier #  include <sys/dir.h>
1390b459c2cSDavid du Colombier # endif
1400b459c2cSDavid du Colombier # if HAVE_NDIR_H
1410b459c2cSDavid du Colombier #  include <ndir.h>
1420b459c2cSDavid du Colombier # endif
1430b459c2cSDavid du Colombier #endif
1440b459c2cSDavid du Colombier 
1450b459c2cSDavid du Colombier #if HAVE_VFORK_H
1460b459c2cSDavid du Colombier #include <vfork.h>
1470b459c2cSDavid du Colombier #endif
1480b459c2cSDavid du Colombier 
1490b459c2cSDavid du Colombier #if HAVE_STDLIB_H
1500b459c2cSDavid du Colombier #include <stdlib.h>
1510b459c2cSDavid du Colombier #else
1520b459c2cSDavid du Colombier VOID *malloc ();
1530b459c2cSDavid du Colombier VOID *realloc ();
1540b459c2cSDavid du Colombier #endif
1550b459c2cSDavid du Colombier #ifndef getenv
1560b459c2cSDavid du Colombier char *getenv ();
1570b459c2cSDavid du Colombier #endif
1580b459c2cSDavid du Colombier 
1590b459c2cSDavid du Colombier #if HAVE_LIMITS_H
1600b459c2cSDavid du Colombier #include <limits.h>
1610b459c2cSDavid du Colombier #endif
1620b459c2cSDavid du Colombier #ifndef INT_MAX
1630b459c2cSDavid du Colombier #define INT_MAX 2147483647
1640b459c2cSDavid du Colombier #endif
1650b459c2cSDavid du Colombier #ifndef CHAR_BIT
1660b459c2cSDavid du Colombier #define CHAR_BIT 8
1670b459c2cSDavid du Colombier #endif
1680b459c2cSDavid du Colombier 
1690b459c2cSDavid du Colombier #if STDC_HEADERS || HAVE_STRING_H
1700b459c2cSDavid du Colombier # include <string.h>
1710b459c2cSDavid du Colombier # ifndef bzero
1720b459c2cSDavid du Colombier #  define bzero(s, n) memset (s, 0, n)
1730b459c2cSDavid du Colombier # endif
1740b459c2cSDavid du Colombier #else
1750b459c2cSDavid du Colombier # if !HAVE_STRCHR
1760b459c2cSDavid du Colombier #  define strchr index
1770b459c2cSDavid du Colombier #  define strrchr rindex
1780b459c2cSDavid du Colombier # endif
1790b459c2cSDavid du Colombier char *strchr (), *strrchr ();
1800b459c2cSDavid du Colombier # if !HAVE_MEMCHR
1810b459c2cSDavid du Colombier #  define memcmp(s1, s2, n) bcmp (s1, s2, n)
1820b459c2cSDavid du Colombier #  define memcpy(d, s, n) bcopy (s, d, n)
1830b459c2cSDavid du Colombier void *memchr ();
1840b459c2cSDavid du Colombier # endif
1850b459c2cSDavid du Colombier #endif
1860b459c2cSDavid du Colombier 
1870b459c2cSDavid du Colombier #include <ctype.h>
1880b459c2cSDavid du Colombier /* CTYPE_DOMAIN (C) is nonzero if the unsigned char C can safely be given
1890b459c2cSDavid du Colombier    as an argument to <ctype.h> macros like `isspace'.  */
1900b459c2cSDavid du Colombier #if STDC_HEADERS
1910b459c2cSDavid du Colombier #define CTYPE_DOMAIN(c) 1
1920b459c2cSDavid du Colombier #else
1930b459c2cSDavid du Colombier #define CTYPE_DOMAIN(c) ((unsigned) (c) <= 0177)
1940b459c2cSDavid du Colombier #endif
1950b459c2cSDavid du Colombier #ifndef ISPRINT
1960b459c2cSDavid du Colombier #define ISPRINT(c) (CTYPE_DOMAIN (c) && isprint (c))
1970b459c2cSDavid du Colombier #endif
1980b459c2cSDavid du Colombier #ifndef ISSPACE
1990b459c2cSDavid du Colombier #define ISSPACE(c) (CTYPE_DOMAIN (c) && isspace (c))
2000b459c2cSDavid du Colombier #endif
2010b459c2cSDavid du Colombier #ifndef ISUPPER
2020b459c2cSDavid du Colombier #define ISUPPER(c) (CTYPE_DOMAIN (c) && isupper (c))
2030b459c2cSDavid du Colombier #endif
2040b459c2cSDavid du Colombier 
2050b459c2cSDavid du Colombier #ifndef ISDIGIT
2060b459c2cSDavid du Colombier #define ISDIGIT(c) ((unsigned) (c) - '0' <= 9)
2070b459c2cSDavid du Colombier #endif
2080b459c2cSDavid du Colombier 
2090b459c2cSDavid du Colombier #include <errno.h>
2100b459c2cSDavid du Colombier #if !STDC_HEADERS
2110b459c2cSDavid du Colombier extern int errno;
2120b459c2cSDavid du Colombier #endif
2130b459c2cSDavid du Colombier 
2140b459c2cSDavid du Colombier #ifdef min
2150b459c2cSDavid du Colombier #undef min
2160b459c2cSDavid du Colombier #endif
2170b459c2cSDavid du Colombier #ifdef max
2180b459c2cSDavid du Colombier #undef max
2190b459c2cSDavid du Colombier #endif
2200b459c2cSDavid du Colombier #define min(a,b) ((a) <= (b) ? (a) : (b))
2210b459c2cSDavid du Colombier #define max(a,b) ((a) >= (b) ? (a) : (b))
2220b459c2cSDavid du Colombier 
2230b459c2cSDavid du Colombier /* This section contains Posix-compliant defaults for macros
2240b459c2cSDavid du Colombier    that are meant to be overridden by hand in config.h as needed.  */
2250b459c2cSDavid du Colombier 
2260b459c2cSDavid du Colombier #ifndef filename_cmp
2270b459c2cSDavid du Colombier #define filename_cmp(a, b) strcmp (a, b)
2280b459c2cSDavid du Colombier #endif
2290b459c2cSDavid du Colombier 
2300b459c2cSDavid du Colombier #ifndef filename_lastdirchar
2310b459c2cSDavid du Colombier #define filename_lastdirchar(filename) strrchr (filename, '/')
2320b459c2cSDavid du Colombier #endif
2330b459c2cSDavid du Colombier 
2340b459c2cSDavid du Colombier #ifndef HAVE_FORK
2350b459c2cSDavid du Colombier #define HAVE_FORK 1
2360b459c2cSDavid du Colombier #endif
2370b459c2cSDavid du Colombier 
2380b459c2cSDavid du Colombier #ifndef HAVE_SETMODE
2390b459c2cSDavid du Colombier #define HAVE_SETMODE 0
2400b459c2cSDavid du Colombier #endif
2410b459c2cSDavid du Colombier 
2420b459c2cSDavid du Colombier #ifndef initialize_main
2430b459c2cSDavid du Colombier #define initialize_main(argcp, argvp)
2440b459c2cSDavid du Colombier #endif
2450b459c2cSDavid du Colombier 
2460b459c2cSDavid du Colombier /* Do struct stat *S, *T describe the same file?  Answer -1 if unknown.  */
2470b459c2cSDavid du Colombier #ifndef same_file
248*f5692daaSDavid du Colombier /* #define same_file(s,t) ((s)->st_ino==(t)->st_ino && (s)->st_dev==(t)->st_dev) */
249*f5692daaSDavid du Colombier #define same_file(s,t) 0
2500b459c2cSDavid du Colombier #endif
2510b459c2cSDavid du Colombier 
2520b459c2cSDavid du Colombier /* Place into Q a quoted version of A suitable for `popen' or `system',
2530b459c2cSDavid du Colombier    incrementing Q and junking A.
2540b459c2cSDavid du Colombier    Do not increment Q by more than 4 * strlen (A) + 2.  */
2550b459c2cSDavid du Colombier #ifndef SYSTEM_QUOTE_ARG
2560b459c2cSDavid du Colombier #define SYSTEM_QUOTE_ARG(q, a) \
2570b459c2cSDavid du Colombier   { \
2580b459c2cSDavid du Colombier     *(q)++ = '\''; \
2590b459c2cSDavid du Colombier     for (;  *(a);  *(q)++ = *(a)++) \
2600b459c2cSDavid du Colombier       if (*(a) == '\'') \
2610b459c2cSDavid du Colombier 	{ \
2620b459c2cSDavid du Colombier 	  *(q)++ = '\''; \
2630b459c2cSDavid du Colombier 	  *(q)++ = '\\'; \
2640b459c2cSDavid du Colombier 	  *(q)++ = '\''; \
2650b459c2cSDavid du Colombier 	} \
2660b459c2cSDavid du Colombier     *(q)++ = '\''; \
2670b459c2cSDavid du Colombier   }
2680b459c2cSDavid du Colombier #endif
2690b459c2cSDavid du Colombier #ifndef FOLD_FN_CHAR
2700b459c2cSDavid du Colombier #define FOLD_FN_CHAR(c) (c)
2710b459c2cSDavid du Colombier #define fnfold(filename) (filename)
2720b459c2cSDavid du Colombier #define fncmp strcmp
2730b459c2cSDavid du Colombier #endif
274