1 /* System dependent declarations.
3 Copyright (C) 1988-1989, 1992-1995, 1998, 2001-2002, 2004, 2006, 2009-2010
4 Free Software Foundation, Inc.
6 This file is part of GNU DIFF.
8 This program is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
23 /* Use this to suppress gcc's `...may be used before initialized' warnings. */
25 # define IF_LINT(Code) Code
27 # define IF_LINT(Code) /* empty */
30 /* Define `__attribute__' and `volatile' first
31 so that they're used consistently in all system includes. */
32 #if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 6) || __STRICT_ANSI__
33 # define __attribute__(x)
38 #include <sys/types.h>
41 #include "stat-macros.h"
43 #ifndef STAT_BLOCKSIZE
44 # if HAVE_STRUCT_STAT_ST_BLKSIZE
45 # define STAT_BLOCKSIZE(s) ((s).st_blksize)
47 # define STAT_BLOCKSIZE(s) (8 * 1024)
58 # define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8)
61 # define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
65 #ifndef _D_EXACT_NAMLEN
66 # define _D_EXACT_NAMLEN(dp) strlen ((dp)->d_name)
70 #define EXIT_TROUBLE 2
78 #if ! HAVE_STRCASECOLL
79 # if HAVE_STRICOLL || defined stricoll
80 # define strcasecoll(a, b) stricoll (a, b)
82 # define strcasecoll(a, b) strcasecmp (a, b) /* best we can do */
85 #if ! (HAVE_STRCASECMP || defined strcasecmp)
86 int strcasecmp (char const *, char const *);
92 # define textdomain(Domainname) /* empty */
93 # undef bindtextdomain
94 # define bindtextdomain(Domainname, Dirname) /* empty */
97 #define _(msgid) gettext (msgid)
98 #define N_(msgid) msgid
102 /* ISDIGIT differs from isdigit, as follows:
103 - Its arg may be any int or unsigned int; it need not be an unsigned char.
104 - It's guaranteed to evaluate its argument exactly once.
105 - It's typically faster.
106 POSIX 1003.1-2001 says that only '0' through '9' are digits.
107 Prefer ISDIGIT to isdigit unless it's important to use the locale's
108 definition of `digit' even when the host does not conform to POSIX. */
109 #define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9)
115 # ifdef SA_INTERRUPT /* e.g. SunOS 4.1.x */
116 # define SA_RESTART SA_INTERRUPT
118 # define SA_RESTART 0
121 #if !defined SIGCHLD && defined SIGCLD
122 # define SIGCHLD SIGCLD
127 #define MIN(a, b) ((a) <= (b) ? (a) : (b))
128 #define MAX(a, b) ((a) >= (b) ? (a) : (b))
136 #if ! HAVE_WORKING_VFORK
140 #include <intprops.h>
141 #include "propername.h"
143 /* Type used for fast comparison of several bytes at a time. */
146 # define word uintmax_t
149 /* The integer type of a line number. Since files are read into main
150 memory, ptrdiff_t should be wide enough. */
152 typedef ptrdiff_t lin;
153 #define LIN_MAX PTRDIFF_MAX
154 verify (TYPE_SIGNED (lin));
155 verify (sizeof (ptrdiff_t) <= sizeof (lin));
156 verify (sizeof (lin) <= sizeof (long int));
158 /* This section contains POSIX-compliant defaults for macros
159 that are meant to be overridden by hand in config.h as needed. */
161 #ifndef file_name_cmp
162 # define file_name_cmp strcmp
165 #ifndef initialize_main
166 # define initialize_main(argcp, argvp)
170 # define NULL_DEVICE "/dev/null"
173 /* Do struct stat *S, *T describe the same special file? */
174 #ifndef same_special_file
175 # if HAVE_ST_RDEV && defined S_ISBLK && defined S_ISCHR
176 # define same_special_file(s, t) \
177 (((S_ISBLK ((s)->st_mode) && S_ISBLK ((t)->st_mode)) \
178 || (S_ISCHR ((s)->st_mode) && S_ISCHR ((t)->st_mode))) \
179 && (s)->st_rdev == (t)->st_rdev)
181 # define same_special_file(s, t) 0
185 /* Do struct stat *S, *T describe the same file? Answer -1 if unknown. */
187 # define same_file(s, t) \
188 ((((s)->st_ino == (t)->st_ino) && ((s)->st_dev == (t)->st_dev)) \
189 || same_special_file (s, t))
192 /* Do struct stat *S, *T have the same file attributes?
194 POSIX says that two files are identical if st_ino and st_dev are
195 the same, but many file systems incorrectly assign the same (device,
196 inode) pair to two distinct files, including:
198 - GNU/Linux NFS servers that export all local file systems as a
199 single NFS file system, if a local device number (st_dev) exceeds
200 255, or if a local inode number (st_ino) exceeds 16777215.
202 - Network Appliance NFS servers in snapshot directories; see
203 Network Appliance bug #195.
205 - ClearCase MVFS; see bug id ATRia04618.
207 Check whether two files that purport to be the same have the same
208 attributes, to work around instances of this common bug. Do not
209 inspect all attributes, only attributes useful in checking for this
212 It's possible for two distinct files on a buggy file system to have
213 the same attributes, but it's not worth slowing down all
214 implementations (or complicating the configuration) to cater to
215 these rare cases in buggy implementations. */
217 #ifndef same_file_attributes
218 # define same_file_attributes(s, t) \
219 ((s)->st_mode == (t)->st_mode \
220 && (s)->st_nlink == (t)->st_nlink \
221 && (s)->st_uid == (t)->st_uid \
222 && (s)->st_gid == (t)->st_gid \
223 && (s)->st_size == (t)->st_size \
224 && (s)->st_mtime == (t)->st_mtime \
225 && (s)->st_ctime == (t)->st_ctime)
228 #define STREQ(a, b) (strcmp (a, b) == 0)