1*0b459c2cSDavid du Colombier /* common definitions for `patch' */ 2*0b459c2cSDavid du Colombier 3*0b459c2cSDavid du Colombier /* $Id: common.h,v 1.18 1997/06/13 06:28:37 eggert Exp $ */ 4*0b459c2cSDavid du Colombier 5*0b459c2cSDavid du Colombier /* 6*0b459c2cSDavid du Colombier Copyright 1986, 1988 Larry Wall 7*0b459c2cSDavid du Colombier Copyright 1990, 1991, 1992, 1993, 1997 Free Software Foundation, Inc. 8*0b459c2cSDavid du Colombier 9*0b459c2cSDavid du Colombier This program is free software; you can redistribute it and/or modify 10*0b459c2cSDavid du Colombier it under the terms of the GNU General Public License as published by 11*0b459c2cSDavid du Colombier the Free Software Foundation; either version 2, or (at your option) 12*0b459c2cSDavid du Colombier any later version. 13*0b459c2cSDavid du Colombier 14*0b459c2cSDavid du Colombier This program is distributed in the hope that it will be useful, 15*0b459c2cSDavid du Colombier but WITHOUT ANY WARRANTY; without even the implied warranty of 16*0b459c2cSDavid du Colombier MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17*0b459c2cSDavid du Colombier See the GNU General Public License for more details. 18*0b459c2cSDavid du Colombier 19*0b459c2cSDavid du Colombier You should have received a copy of the GNU General Public License 20*0b459c2cSDavid du Colombier along with this program; see the file COPYING. 21*0b459c2cSDavid du Colombier If not, write to the Free Software Foundation, 22*0b459c2cSDavid du Colombier 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 23*0b459c2cSDavid du Colombier */ 24*0b459c2cSDavid du Colombier 25*0b459c2cSDavid du Colombier #ifndef DEBUGGING 26*0b459c2cSDavid du Colombier #define DEBUGGING 1 27*0b459c2cSDavid du Colombier #endif 28*0b459c2cSDavid du Colombier 29*0b459c2cSDavid du Colombier /* We must define `volatile' and `const' first (the latter inside config.h), 30*0b459c2cSDavid du Colombier so that they're used consistently in all system includes. */ 31*0b459c2cSDavid du Colombier #ifndef __STDC__ 32*0b459c2cSDavid du Colombier # ifndef volatile 33*0b459c2cSDavid du Colombier # define volatile 34*0b459c2cSDavid du Colombier # endif 35*0b459c2cSDavid du Colombier #endif 36*0b459c2cSDavid du Colombier 37*0b459c2cSDavid du Colombier /* Enable support for fseeko and ftello on hosts 38*0b459c2cSDavid du Colombier where it is available but is turned off by default. 39*0b459c2cSDavid du Colombier This must be defined before any system file is included. */ 40*0b459c2cSDavid du Colombier #define _LARGEFILE_SOURCE 1 41*0b459c2cSDavid du Colombier 42*0b459c2cSDavid du Colombier #include <config.h> 43*0b459c2cSDavid du Colombier 44*0b459c2cSDavid du Colombier #include <assert.h> 45*0b459c2cSDavid du Colombier #include <stdio.h> 46*0b459c2cSDavid du Colombier #include <sys/types.h> 47*0b459c2cSDavid du Colombier #include <time.h> 48*0b459c2cSDavid du Colombier 49*0b459c2cSDavid du Colombier #include <sys/stat.h> 50*0b459c2cSDavid du Colombier #if ! defined S_ISDIR && defined S_IFDIR 51*0b459c2cSDavid du Colombier # define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) 52*0b459c2cSDavid du Colombier #endif 53*0b459c2cSDavid du Colombier #if ! defined S_ISREG && defined S_IFREG 54*0b459c2cSDavid du Colombier # define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) 55*0b459c2cSDavid du Colombier #endif 56*0b459c2cSDavid du Colombier #ifndef S_IXOTH 57*0b459c2cSDavid du Colombier #define S_IXOTH 1 58*0b459c2cSDavid du Colombier #endif 59*0b459c2cSDavid du Colombier #ifndef S_IWOTH 60*0b459c2cSDavid du Colombier #define S_IWOTH 2 61*0b459c2cSDavid du Colombier #endif 62*0b459c2cSDavid du Colombier #ifndef S_IROTH 63*0b459c2cSDavid du Colombier #define S_IROTH 4 64*0b459c2cSDavid du Colombier #endif 65*0b459c2cSDavid du Colombier #ifndef S_IXGRP 66*0b459c2cSDavid du Colombier #define S_IXGRP (S_IXOTH << 3) 67*0b459c2cSDavid du Colombier #endif 68*0b459c2cSDavid du Colombier #ifndef S_IWGRP 69*0b459c2cSDavid du Colombier #define S_IWGRP (S_IWOTH << 3) 70*0b459c2cSDavid du Colombier #endif 71*0b459c2cSDavid du Colombier #ifndef S_IRGRP 72*0b459c2cSDavid du Colombier #define S_IRGRP (S_IROTH << 3) 73*0b459c2cSDavid du Colombier #endif 74*0b459c2cSDavid du Colombier #ifndef S_IXUSR 75*0b459c2cSDavid du Colombier #define S_IXUSR (S_IXOTH << 6) 76*0b459c2cSDavid du Colombier #endif 77*0b459c2cSDavid du Colombier #ifndef S_IWUSR 78*0b459c2cSDavid du Colombier #define S_IWUSR (S_IWOTH << 6) 79*0b459c2cSDavid du Colombier #endif 80*0b459c2cSDavid du Colombier #ifndef S_IRUSR 81*0b459c2cSDavid du Colombier #define S_IRUSR (S_IROTH << 6) 82*0b459c2cSDavid du Colombier #endif 83*0b459c2cSDavid du Colombier 84*0b459c2cSDavid du Colombier #if HAVE_LIMITS_H 85*0b459c2cSDavid du Colombier # include <limits.h> 86*0b459c2cSDavid du Colombier #endif 87*0b459c2cSDavid du Colombier #ifndef INT_MAX 88*0b459c2cSDavid du Colombier #define INT_MAX 2147483647 89*0b459c2cSDavid du Colombier #endif 90*0b459c2cSDavid du Colombier #ifndef LONG_MIN 91*0b459c2cSDavid du Colombier #define LONG_MIN (-1-2147483647L) 92*0b459c2cSDavid du Colombier #endif 93*0b459c2cSDavid du Colombier 94*0b459c2cSDavid du Colombier #include <ctype.h> 95*0b459c2cSDavid du Colombier /* CTYPE_DOMAIN (C) is nonzero if the unsigned char C can safely be given 96*0b459c2cSDavid du Colombier as an argument to <ctype.h> macros like `isspace'. */ 97*0b459c2cSDavid du Colombier #if STDC_HEADERS 98*0b459c2cSDavid du Colombier #define CTYPE_DOMAIN(c) 1 99*0b459c2cSDavid du Colombier #else 100*0b459c2cSDavid du Colombier #define CTYPE_DOMAIN(c) ((unsigned) (c) <= 0177) 101*0b459c2cSDavid du Colombier #endif 102*0b459c2cSDavid du Colombier #ifndef ISSPACE 103*0b459c2cSDavid du Colombier #define ISSPACE(c) (CTYPE_DOMAIN (c) && isspace (c)) 104*0b459c2cSDavid du Colombier #endif 105*0b459c2cSDavid du Colombier 106*0b459c2cSDavid du Colombier #ifndef ISDIGIT 107*0b459c2cSDavid du Colombier #define ISDIGIT(c) ((unsigned) (c) - '0' <= 9) 108*0b459c2cSDavid du Colombier #endif 109*0b459c2cSDavid du Colombier 110*0b459c2cSDavid du Colombier 111*0b459c2cSDavid du Colombier #ifndef FILESYSTEM_PREFIX_LEN 112*0b459c2cSDavid du Colombier #define FILESYSTEM_PREFIX_LEN(f) 0 113*0b459c2cSDavid du Colombier #endif 114*0b459c2cSDavid du Colombier 115*0b459c2cSDavid du Colombier #ifndef ISSLASH 116*0b459c2cSDavid du Colombier #define ISSLASH(c) ((c) == '/') 117*0b459c2cSDavid du Colombier #endif 118*0b459c2cSDavid du Colombier 119*0b459c2cSDavid du Colombier 120*0b459c2cSDavid du Colombier /* constants */ 121*0b459c2cSDavid du Colombier 122*0b459c2cSDavid du Colombier /* AIX predefines these. */ 123*0b459c2cSDavid du Colombier #ifdef TRUE 124*0b459c2cSDavid du Colombier #undef TRUE 125*0b459c2cSDavid du Colombier #endif 126*0b459c2cSDavid du Colombier #ifdef FALSE 127*0b459c2cSDavid du Colombier #undef FALSE 128*0b459c2cSDavid du Colombier #endif 129*0b459c2cSDavid du Colombier #define TRUE 1 130*0b459c2cSDavid du Colombier #define FALSE 0 131*0b459c2cSDavid du Colombier 132*0b459c2cSDavid du Colombier /* handy definitions */ 133*0b459c2cSDavid du Colombier 134*0b459c2cSDavid du Colombier #define strEQ(s1,s2) (!strcmp(s1, s2)) 135*0b459c2cSDavid du Colombier #define strnEQ(s1,s2,l) (!strncmp(s1, s2, l)) 136*0b459c2cSDavid du Colombier 137*0b459c2cSDavid du Colombier /* typedefs */ 138*0b459c2cSDavid du Colombier 139*0b459c2cSDavid du Colombier typedef int bool; /* must promote to itself */ 140*0b459c2cSDavid du Colombier typedef long LINENUM; /* must be signed */ 141*0b459c2cSDavid du Colombier 142*0b459c2cSDavid du Colombier /* globals */ 143*0b459c2cSDavid du Colombier 144*0b459c2cSDavid du Colombier extern char const program_name[]; 145*0b459c2cSDavid du Colombier 146*0b459c2cSDavid du Colombier XTERN char *buf; /* general purpose buffer */ 147*0b459c2cSDavid du Colombier XTERN size_t bufsize; /* allocated size of buf */ 148*0b459c2cSDavid du Colombier 149*0b459c2cSDavid du Colombier XTERN bool using_plan_a; /* try to keep everything in memory */ 150*0b459c2cSDavid du Colombier 151*0b459c2cSDavid du Colombier XTERN char *inname; 152*0b459c2cSDavid du Colombier XTERN char *outfile; 153*0b459c2cSDavid du Colombier XTERN int inerrno; 154*0b459c2cSDavid du Colombier XTERN int invc; 155*0b459c2cSDavid du Colombier XTERN struct stat instat; 156*0b459c2cSDavid du Colombier XTERN bool dry_run; 157*0b459c2cSDavid du Colombier XTERN bool posixly_correct; 158*0b459c2cSDavid du Colombier 159*0b459c2cSDavid du Colombier XTERN char const *origprae; 160*0b459c2cSDavid du Colombier XTERN char const *origbase; 161*0b459c2cSDavid du Colombier 162*0b459c2cSDavid du Colombier XTERN char const * volatile TMPOUTNAME; 163*0b459c2cSDavid du Colombier XTERN char const * volatile TMPINNAME; 164*0b459c2cSDavid du Colombier XTERN char const * volatile TMPPATNAME; 165*0b459c2cSDavid du Colombier 166*0b459c2cSDavid du Colombier #ifdef DEBUGGING 167*0b459c2cSDavid du Colombier XTERN int debug; 168*0b459c2cSDavid du Colombier #else 169*0b459c2cSDavid du Colombier # define debug 0 170*0b459c2cSDavid du Colombier #endif 171*0b459c2cSDavid du Colombier XTERN bool force; 172*0b459c2cSDavid du Colombier XTERN bool batch; 173*0b459c2cSDavid du Colombier XTERN bool noreverse; 174*0b459c2cSDavid du Colombier XTERN int reverse; 175*0b459c2cSDavid du Colombier XTERN enum { DEFAULT_VERBOSITY, SILENT, VERBOSE } verbosity; 176*0b459c2cSDavid du Colombier XTERN bool skip_rest_of_patch; 177*0b459c2cSDavid du Colombier XTERN int strippath; 178*0b459c2cSDavid du Colombier XTERN bool canonicalize; 179*0b459c2cSDavid du Colombier XTERN int patch_get; 180*0b459c2cSDavid du Colombier XTERN int set_time; 181*0b459c2cSDavid du Colombier XTERN int set_utc; 182*0b459c2cSDavid du Colombier 183*0b459c2cSDavid du Colombier enum diff 184*0b459c2cSDavid du Colombier { 185*0b459c2cSDavid du Colombier NO_DIFF, 186*0b459c2cSDavid du Colombier CONTEXT_DIFF, 187*0b459c2cSDavid du Colombier NORMAL_DIFF, 188*0b459c2cSDavid du Colombier ED_DIFF, 189*0b459c2cSDavid du Colombier NEW_CONTEXT_DIFF, 190*0b459c2cSDavid du Colombier UNI_DIFF 191*0b459c2cSDavid du Colombier }; 192*0b459c2cSDavid du Colombier 193*0b459c2cSDavid du Colombier XTERN enum diff diff_type; 194*0b459c2cSDavid du Colombier 195*0b459c2cSDavid du Colombier XTERN char *revision; /* prerequisite revision, if any */ 196*0b459c2cSDavid du Colombier 197*0b459c2cSDavid du Colombier #ifdef __STDC__ 198*0b459c2cSDavid du Colombier # define GENERIC_OBJECT void 199*0b459c2cSDavid du Colombier #else 200*0b459c2cSDavid du Colombier # define GENERIC_OBJECT char 201*0b459c2cSDavid du Colombier #endif 202*0b459c2cSDavid du Colombier 203*0b459c2cSDavid du Colombier #if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 6) || __STRICT_ANSI__ 204*0b459c2cSDavid du Colombier # define __attribute__(x) 205*0b459c2cSDavid du Colombier #endif 206*0b459c2cSDavid du Colombier 207*0b459c2cSDavid du Colombier #ifndef PARAMS 208*0b459c2cSDavid du Colombier # ifdef __STDC__ 209*0b459c2cSDavid du Colombier # define PARAMS(args) args 210*0b459c2cSDavid du Colombier # else 211*0b459c2cSDavid du Colombier # define PARAMS(args) () 212*0b459c2cSDavid du Colombier # endif 213*0b459c2cSDavid du Colombier #endif 214*0b459c2cSDavid du Colombier 215*0b459c2cSDavid du Colombier GENERIC_OBJECT *xmalloc PARAMS ((size_t)); 216*0b459c2cSDavid du Colombier void fatal_exit PARAMS ((int)) __attribute__ ((noreturn)); 217*0b459c2cSDavid du Colombier 218*0b459c2cSDavid du Colombier #include <errno.h> 219*0b459c2cSDavid du Colombier #if !STDC_HEADERS && !defined errno 220*0b459c2cSDavid du Colombier extern int errno; 221*0b459c2cSDavid du Colombier #endif 222*0b459c2cSDavid du Colombier 223*0b459c2cSDavid du Colombier #if STDC_HEADERS || HAVE_STRING_H 224*0b459c2cSDavid du Colombier # include <string.h> 225*0b459c2cSDavid du Colombier #else 226*0b459c2cSDavid du Colombier # if !HAVE_MEMCHR 227*0b459c2cSDavid du Colombier # define memcmp(s1, s2, n) bcmp (s1, s2, n) 228*0b459c2cSDavid du Colombier # define memcpy(d, s, n) bcopy (s, d, n) 229*0b459c2cSDavid du Colombier GENERIC_OBJECT *memchr (); 230*0b459c2cSDavid du Colombier # endif 231*0b459c2cSDavid du Colombier #endif 232*0b459c2cSDavid du Colombier 233*0b459c2cSDavid du Colombier #if STDC_HEADERS 234*0b459c2cSDavid du Colombier # include <stdlib.h> 235*0b459c2cSDavid du Colombier #else 236*0b459c2cSDavid du Colombier long atol (); 237*0b459c2cSDavid du Colombier char *getenv (); 238*0b459c2cSDavid du Colombier GENERIC_OBJECT *malloc (); 239*0b459c2cSDavid du Colombier GENERIC_OBJECT *realloc (); 240*0b459c2cSDavid du Colombier #endif 241*0b459c2cSDavid du Colombier 242*0b459c2cSDavid du Colombier #if HAVE_UNISTD_H 243*0b459c2cSDavid du Colombier # include <unistd.h> 244*0b459c2cSDavid du Colombier #endif 245*0b459c2cSDavid du Colombier #ifndef lseek 246*0b459c2cSDavid du Colombier off_t lseek (); 247*0b459c2cSDavid du Colombier #endif 248*0b459c2cSDavid du Colombier #ifndef SEEK_SET 249*0b459c2cSDavid du Colombier #define SEEK_SET 0 250*0b459c2cSDavid du Colombier #endif 251*0b459c2cSDavid du Colombier #ifndef STDIN_FILENO 252*0b459c2cSDavid du Colombier #define STDIN_FILENO 0 253*0b459c2cSDavid du Colombier #endif 254*0b459c2cSDavid du Colombier #ifndef STDOUT_FILENO 255*0b459c2cSDavid du Colombier #define STDOUT_FILENO 1 256*0b459c2cSDavid du Colombier #endif 257*0b459c2cSDavid du Colombier #ifndef STDERR_FILENO 258*0b459c2cSDavid du Colombier #define STDERR_FILENO 2 259*0b459c2cSDavid du Colombier #endif 260*0b459c2cSDavid du Colombier #if _LFS_LARGEFILE 261*0b459c2cSDavid du Colombier typedef off_t file_offset; 262*0b459c2cSDavid du Colombier # define file_seek fseeko 263*0b459c2cSDavid du Colombier # define file_tell ftello 264*0b459c2cSDavid du Colombier #else 265*0b459c2cSDavid du Colombier typedef long file_offset; 266*0b459c2cSDavid du Colombier # define file_seek fseek 267*0b459c2cSDavid du Colombier # define file_tell ftell 268*0b459c2cSDavid du Colombier #endif 269*0b459c2cSDavid du Colombier 270*0b459c2cSDavid du Colombier #if HAVE_FCNTL_H 271*0b459c2cSDavid du Colombier # include <fcntl.h> 272*0b459c2cSDavid du Colombier #endif 273*0b459c2cSDavid du Colombier #ifndef O_RDONLY 274*0b459c2cSDavid du Colombier #define O_RDONLY 0 275*0b459c2cSDavid du Colombier #endif 276*0b459c2cSDavid du Colombier #ifndef O_WRONLY 277*0b459c2cSDavid du Colombier #define O_WRONLY 1 278*0b459c2cSDavid du Colombier #endif 279*0b459c2cSDavid du Colombier #ifndef O_RDWR 280*0b459c2cSDavid du Colombier #define O_RDWR 2 281*0b459c2cSDavid du Colombier #endif 282*0b459c2cSDavid du Colombier #ifndef _O_BINARY 283*0b459c2cSDavid du Colombier #define _O_BINARY 0 284*0b459c2cSDavid du Colombier #endif 285*0b459c2cSDavid du Colombier #ifndef O_BINARY 286*0b459c2cSDavid du Colombier #define O_BINARY _O_BINARY 287*0b459c2cSDavid du Colombier #endif 288*0b459c2cSDavid du Colombier #ifndef O_CREAT 289*0b459c2cSDavid du Colombier #define O_CREAT 0 290*0b459c2cSDavid du Colombier #endif 291*0b459c2cSDavid du Colombier #ifndef O_TRUNC 292*0b459c2cSDavid du Colombier #define O_TRUNC 0 293*0b459c2cSDavid du Colombier #endif 294*0b459c2cSDavid du Colombier 295*0b459c2cSDavid du Colombier #if HAVE_SETMODE 296*0b459c2cSDavid du Colombier XTERN int binary_transput; /* O_BINARY if binary i/o is desired */ 297*0b459c2cSDavid du Colombier #else 298*0b459c2cSDavid du Colombier # define binary_transput 0 299*0b459c2cSDavid du Colombier #endif 300*0b459c2cSDavid du Colombier 301*0b459c2cSDavid du Colombier #ifndef NULL_DEVICE 302*0b459c2cSDavid du Colombier #define NULL_DEVICE "/dev/null" 303*0b459c2cSDavid du Colombier #endif 304*0b459c2cSDavid du Colombier 305*0b459c2cSDavid du Colombier #ifndef TTY_DEVICE 306*0b459c2cSDavid du Colombier #define TTY_DEVICE "/dev/tty" 307*0b459c2cSDavid du Colombier #endif 308