1 /* $NetBSD: system.h,v 1.1.1.1 2003/01/26 00:43:16 wiz Exp $ */
3 /* System dependent declarations.
5 Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1998, 2001, 2002
6 Free Software Foundation, Inc.
8 This file is part of GNU DIFF.
10 GNU DIFF is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2, or (at your option)
15 GNU DIFF is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; see the file COPYING.
22 If not, write to the Free Software Foundation,
23 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
27 /* Don't bother to support K&R C compilers any more; it's not worth
28 the trouble. These macros prevent some library modules from being
29 compiled in K&R C mode. */
30 #define PARAMS(Args) Args
33 /* Define `__attribute__' and `volatile' first
34 so that they're used consistently in all system includes. */
35 #if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 6) || __STRICT_ANSI__
36 # define __attribute__(x)
38 #if defined const && !defined volatile
42 /* Verify a requirement at compile-time (unlike assert, which is runtime). */
43 #define verify(name, assertion) struct name { char a[(assertion) ? 1 : -1]; }
46 /* Determine whether an integer type is signed, and its bounds.
47 This code assumes two's (or one's!) complement with no holes. */
49 /* The extra casts work around common compiler bugs,
50 e.g. Cray C 5.0.3.0 when t == time_t. */
52 # define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
55 # define TYPE_MINIMUM(t) ((t) (TYPE_SIGNED (t) \
56 ? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) \
60 # define TYPE_MAXIMUM(t) ((t) (~ (t) 0 - TYPE_MINIMUM (t)))
63 #include <sys/types.h>
66 #if STAT_MACROS_BROKEN
75 # define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
78 # define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)
80 #if !defined S_ISBLK && defined S_IFBLK
81 # define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK)
83 #if !defined S_ISCHR && defined S_IFCHR
84 # define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR)
86 #if !defined S_ISFIFO && defined S_IFFIFO
87 # define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFFIFO)
89 #if !defined S_ISSOCK && defined S_IFSOCK
90 # define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK)
114 # define STDIN_FILENO 0
116 #ifndef STDOUT_FILENO
117 # define STDOUT_FILENO 1
119 #ifndef STDERR_FILENO
120 # define STDERR_FILENO 2
126 # include <sys/time.h>
133 # include <sys/file.h>
138 # define dup2(f, t) (close (t), fcntl (f, F_DUPFD, t))
148 # define S_IRUSR 0400
151 # define S_IWUSR 0200
155 # include <sys/wait.h>
158 # define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8)
161 # define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
164 #ifndef STAT_BLOCKSIZE
165 # if HAVE_STRUCT_STAT_ST_BLKSIZE
166 # define STAT_BLOCKSIZE(s) ((s).st_blksize)
168 # define STAT_BLOCKSIZE(s) (8 * 1024)
174 # define NAMLEN(dirent) strlen ((dirent)->d_name)
176 # define dirent direct
177 # define NAMLEN(dirent) ((dirent)->d_namlen)
179 # include <sys/ndir.h>
182 # include <sys/dir.h>
197 # define EXIT_SUCCESS 0
200 # undef EXIT_FAILURE /* Sony NEWS-OS 4.0C defines EXIT_FAILURE to 0. */
201 # define EXIT_FAILURE 1
203 #define EXIT_TROUBLE 2
207 # define SSIZE_MAX TYPE_MAXIMUM (ssize_t)
211 # include <inttypes.h>
214 # define PTRDIFF_MAX TYPE_MAXIMUM (ptrdiff_t)
217 # define SIZE_MAX TYPE_MAXIMUM (size_t)
220 # define UINTMAX_MAX TYPE_MAXIMUM (uintmax_t)
222 #if ! HAVE_STRTOUMAX && ! defined strtoumax
223 uintmax_t strtoumax (char const *, char **, int);
228 #if STDC_HEADERS || HAVE_STRING_H
232 # define strchr index
233 # define strrchr rindex
235 char *strchr (), *strrchr ();
237 # define memcmp(s1, s2, n) bcmp (s1, s2, n)
238 # define memcpy(d, s, n) bcopy (s, d, n)
246 # define setlocale(category, locale)
251 #define _(msgid) gettext (msgid)
252 #define N_(msgid) msgid
256 /* CTYPE_DOMAIN (C) is nonzero if the unsigned char C can safely be given
257 as an argument to <ctype.h> macros like `isspace'. */
259 # define CTYPE_DOMAIN(c) 1
261 # define CTYPE_DOMAIN(c) ((unsigned int) (c) <= 0177)
263 #define ISPRINT(c) (CTYPE_DOMAIN (c) && isprint (c))
264 #define ISSPACE(c) (CTYPE_DOMAIN (c) && isspace (c))
267 # define TOLOWER(c) tolower (c)
270 # define _tolower(c) tolower (c)
272 # define TOLOWER(c) (CTYPE_DOMAIN (c) && isupper (c) ? _tolower (c) : (c))
275 /* ISDIGIT differs from isdigit, as follows:
276 - Its arg may be any int or unsigned int; it need not be an unsigned char.
277 - It's guaranteed to evaluate its argument exactly once.
278 - It's typically faster.
279 POSIX 1003.1-2001 says that only '0' through '9' are digits.
280 Prefer ISDIGIT to isdigit unless it's important to use the locale's
281 definition of `digit' even when the host does not conform to POSIX. */
282 #define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9)
291 # ifdef SA_INTERRUPT /* e.g. SunOS 4.1.x */
292 # define SA_RESTART SA_INTERRUPT
294 # define SA_RESTART 0
297 #if !defined SIGCHLD && defined SIGCLD
298 # define SIGCHLD SIGCLD
303 #define MIN(a, b) ((a) <= (b) ? (a) : (b))
304 #define MAX(a, b) ((a) >= (b) ? (a) : (b))
307 # include <stdbool.h>
309 # define bool unsigned char
316 #if ! HAVE_WORKING_VFORK
320 /* Type used for fast comparison of several bytes at a time. */
323 # define word uintmax_t
326 /* The integer type of a line number. Since files are read into main
327 memory, ptrdiff_t should be wide enough. */
329 typedef ptrdiff_t lin
;
330 #define LIN_MAX PTRDIFF_MAX
331 verify (lin_is_signed
, TYPE_SIGNED (lin
));
332 verify (lin_is_wide_enough
, sizeof (ptrdiff_t) <= sizeof (lin
));
333 verify (lin_is_printable_as_long
, sizeof (lin
) <= sizeof (long));
335 /* This section contains POSIX-compliant defaults for macros
336 that are meant to be overridden by hand in config.h as needed. */
338 #ifndef file_name_cmp
339 # define file_name_cmp strcmp
342 #ifndef initialize_main
343 # define initialize_main(argcp, argvp)
347 # define NULL_DEVICE "/dev/null"
350 /* Do struct stat *S, *T describe the same special file? */
351 #ifndef same_special_file
352 # if HAVE_STRUCT_STAT_ST_RDEV && defined S_ISBLK && defined S_ISCHR
353 # define same_special_file(s, t) \
354 (((S_ISBLK ((s)->st_mode) && S_ISBLK ((t)->st_mode)) \
355 || (S_ISCHR ((s)->st_mode) && S_ISCHR ((t)->st_mode))) \
356 && (s)->st_rdev == (t)->st_rdev)
358 # define same_special_file(s, t) 0
362 /* Do struct stat *S, *T describe the same file? Answer -1 if unknown. */
364 # define same_file(s, t) \
365 ((((s)->st_ino == (t)->st_ino) && ((s)->st_dev == (t)->st_dev)) \
366 || same_special_file (s, t))
369 /* Do struct stat *S, *T have the same file attributes?
371 POSIX says that two files are identical if st_ino and st_dev are
372 the same, but many filesystems incorrectly assign the same (device,
373 inode) pair to two distinct files, including:
375 - GNU/Linux NFS servers that export all local filesystems as a
376 single NFS filesystem, if a local device number (st_dev) exceeds
377 255, or if a local inode number (st_ino) exceeds 16777215.
379 - Network Appliance NFS servers in snapshot directories; see
380 Network Appliance bug #195.
382 - ClearCase MVFS; see bug id ATRia04618.
384 Check whether two files that purport to be the same have the same
385 attributes, to work around instances of this common bug. Do not
386 inspect all attributes, only attributes useful in checking for this
389 It's possible for two distinct files on a buggy filesystem to have
390 the same attributes, but it's not worth slowing down all
391 implementations (or complicating the configuration) to cater to
392 these rare cases in buggy implementations. */
394 #ifndef same_file_attributes
395 # define same_file_attributes(s, t) \
396 ((s)->st_mode == (t)->st_mode \
397 && (s)->st_nlink == (t)->st_nlink \
398 && (s)->st_uid == (t)->st_uid \
399 && (s)->st_gid == (t)->st_gid \
400 && (s)->st_size == (t)->st_size \
401 && (s)->st_mtime == (t)->st_mtime \
402 && (s)->st_ctime == (t)->st_ctime)