xref: /plan9/sys/src/ape/cmd/patch/common.h (revision 0b459c2cb92b7c9d88818e9a2f72e678e5bc4553)
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