1996-10-21 11:00:06 +04:00
/* $NetBSD: rcsbase.h,v 1.8 1996/10/21 07:00:06 veego Exp $ */
1996-10-15 10:59:14 +04:00
1995-02-24 05:24:53 +03:00
/* RCS common definitions and data structures */
1996-10-15 10:59:14 +04:00
# define RCSBASE "Id: rcsbase.h,v 5.20 1995 / 06 / 16 06:19:24 eggert Exp"
1993-07-09 05:56:50 +04:00
1995-02-24 05:24:53 +03:00
/* Copyright 1982, 1988, 1989 Walter Tichy
1996-10-15 10:59:14 +04:00
Copyright 1990 , 1991 , 1992 , 1993 , 1994 , 1995 Paul Eggert
1993-07-09 05:56:50 +04:00
Distributed under license by the Free Software Foundation , Inc .
This file is part of RCS .
RCS is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 2 , or ( at your option )
any later version .
RCS is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
1996-10-15 10:59:14 +04:00
along with RCS ; see the file COPYING .
If not , write to the Free Software Foundation ,
59 Temple Place - Suite 330 , Boston , MA 02111 - 1307 , USA .
1993-07-09 05:56:50 +04:00
Report problems and direct all questions to :
rcs - bugs @ cs . purdue . edu
*/
1995-02-24 05:24:53 +03:00
/*
* $ Log : rcsbase . h , v $
1996-10-21 11:00:06 +04:00
* Revision 1.8 1996 / 10 / 21 07 : 00 : 06 veego
* Fix missing " #ifdef LOCALID " from pr # 2876
*
1996-10-15 10:59:14 +04:00
* Revision 1.7 1996 / 10 / 15 07 : 00 : 11 veego
* Merge rcs 5.7 .
*
* Revision 5.20 1995 / 06 / 16 06 : 19 : 24 eggert
* Update FSF address .
*
* Revision 5.19 1995 / 06 / 01 16 : 23 : 43 eggert
* ( SIZEABLE_PATH ) : Don ' t depend on PATH_MAX : it ' s not worth configuring .
* ( Ioffset_type , BINARY_EXPAND , MIN_UNEXPAND , MIN_UNCHANGED_EXPAND ) : New macros .
* ( maps_memory ) : New macro ; replaces many instances of ` has_mmap ' .
* ( cacheptr ) : Renamed from cachetell .
* ( struct RILE ) : New alternate name for RILE ; the type is now recursive .
* ( deallocate ) : New member for RILE , used for generic buffer deallocation .
* ( cacheunget_ ) : No longer take a failure arg ; just call Ierror on failure .
* ( struct rcslock ) : Renamed from struct lock , to avoid collisions with
* system headers on some hosts . All users changed .
* ( basefilename ) : Renamed from basename , likewise .
* ( dirtpname ) : Remove ; no longer external .
* ( dirlen , dateform ) : Remove ; no longer used .
* ( cmpdate , fopenSafer , fdSafer , readAccessFilenameBuffer ) : New functions .
* ( zonelenmax ) : Increase to 9 for full ISO 8601 format .
* ( catchmmapints ) : Depend on has_NFS .
1995-02-24 05:24:53 +03:00
*
* Revision 5.18 1994 / 03 / 17 14 : 05 : 48 eggert
* Add primitives for reading backwards from a RILE ;
* this is needed to go back and find the $ Log prefix .
* Specify subprocess input via file descriptor , not file name . Remove lint .
*
* Revision 5.17 1993 / 11 / 09 17 : 40 : 15 eggert
* Move RCS - specific time handling into rcstime . c .
* printf_string now takes two arguments , alas .
*
* Revision 5.16 1993 / 11 / 03 17 : 42 : 27 eggert
* Don ' t arbitrarily limit the number of joins . Remove ` nil ' .
* Add Name keyword . Don ' t discard ignored phrases .
* Add support for merge - A vs - E , and allow up to three labels .
* Improve quality of diagnostics and prototypes .
*
* Revision 5.15 1992 / 07 / 28 16 : 12 : 44 eggert
* Statement macro names now end in _ .
*
* Revision 5.14 1992 / 02 / 17 23 : 02 : 22 eggert
* Add - T support . Work around NFS mmap SIGBUS problem .
*
* Revision 5.13 1992 / 01 / 24 18 : 44 : 19 eggert
* Add support for bad_creat0 . lint - > RCS_lint
*
* Revision 5.12 1992 / 01 / 06 02 : 42 : 34 eggert
* while ( E ) ; - > while ( E ) continue ;
*
* Revision 5.11 1991 / 10 / 07 17 : 32 : 46 eggert
* Support piece tables even if ! has_mmap .
*
* Revision 5.10 1991 / 09 / 24 00 : 28 : 39 eggert
* Remove unexported functions .
*
* Revision 5.9 1991 / 08 / 19 03 : 13 : 55 eggert
* Add piece tables and other tuneups , and NFS workarounds .
*
* Revision 5.8 1991 / 04 / 21 11 : 58 : 20 eggert
* Add - x , RCSINIT , MS - DOS support .
*
* Revision 5.7 1991 / 02 / 28 19 : 18 : 50 eggert
* Try setuid ( ) if seteuid ( ) doesn ' t work .
*
* Revision 5.6 1991 / 02 / 26 17 : 48 : 37 eggert
* Support new link behavior . Move ANSI C / Posix declarations into conf . sh .
*
* Revision 5.5 1990 / 12 / 04 05 : 18 : 43 eggert
* Use - I for prompts and - q for diagnostics .
*
* Revision 5.4 1990 / 11 / 01 05 : 03 : 35 eggert
* Don ' t assume that builtins are functions ; they may be macros .
* Permit arbitrary data in logs .
*
* Revision 5.3 1990 / 09 / 26 23 : 36 : 58 eggert
* Port wait ( ) to non - Posix ANSI C hosts .
*
* Revision 5.2 1990 / 09 / 04 08 : 02 : 20 eggert
* Don ' t redefine NAME_MAX , PATH_MAX .
* Improve incomplete line handling . Standardize yes - or - no procedure .
*
* Revision 5.1 1990 / 08 / 29 07 : 13 : 53 eggert
* Add - kkvl . Fix type typos exposed by porting . Clean old log messages too .
*
* Revision 5.0 1990 / 08 / 22 08 : 12 : 44 eggert
* Adjust ANSI C / Posix support . Add - k , - V , setuid . Don ' t call access ( ) .
* Remove compile - time limits ; use malloc instead .
* Ansify and Posixate . Add support for ISO 8859.
* Remove snoop and v2 support .
*
* Revision 4.9 89 / 05 / 01 15 : 17 : 14 narten
* botched previous USG fix
*
* Revision 4.8 89 / 05 / 01 14 : 53 : 05 narten
* changed # include < strings . h > - > string . h for USG systems .
*
* Revision 4.7 88 / 11 / 08 15 : 58 : 45 narten
* removed defs for functions loaded from libraries
*
* Revision 4.6 88 / 08 / 09 19 : 12 : 36 eggert
* Shrink stdio code size ; remove lint ; permit - Dhshsize = nn .
*
* Revision 4.5 87 / 12 / 18 17 : 06 : 41 narten
* made removed BSD ifdef , now uses V4_2BSD
*
* Revision 4.4 87 / 10 / 18 10 : 29 : 49 narten
* Updating version numbers
* Changes relative to 1.1 are actually relative to 4.2
*
* Revision 1.3 87 / 09 / 24 14 : 02 : 25 narten
* changes for lint
*
* Revision 1.2 87 / 03 / 27 14 : 22 : 02 jenkins
* Port to suns
*
* Revision 4.2 83 / 12 / 20 16 : 04 : 20 wft
* merged 3.6 .1 .1 and 4.1 ( SMALLOG , logsize ) .
* moved setting of STRICT_LOCKING to Makefile .
* changed DOLLAR to UNKN ( conflict with KDELIM ) .
*
* Revision 4.1 83 / 05 / 04 09 : 12 : 41 wft
* Added markers Id and RCSfile .
* Added Dbranch for default branches .
*
* Revision 3.6 .1 .1 83 / 12 / 02 21 : 56 : 22 wft
* Increased logsize , added macro SMALLOG .
*
* Revision 3.6 83 / 01 / 15 16 : 43 : 28 wft
* 4.2 prerelease
*
* Revision 3.6 83 / 01 / 15 16 : 43 : 28 wft
* Replaced dbm . h with BYTESIZ , fixed definition of rindex ( ) .
* Added variants of NCPFN and NCPPN for bsd 4.2 , selected by defining V4_2BSD .
* Added macro DELNUMFORM to have uniform format for printing delta text nodes .
* Added macro DELETE to mark deleted deltas .
*
* Revision 3.5 82 / 12 / 10 12 : 16 : 56 wft
* Added two forms of DATEFORM , one using % 02 d , the other % .2 d .
*
* Revision 3.4 82 / 12 / 04 20 : 01 : 25 wft
* added LOCKER , Locker , and USG ( redefinition of rindex ) .
*
* Revision 3.3 82 / 12 / 03 12 : 22 : 04 wft
* Added dbm . h , stdio . h , RCSBASE , RCSSEP , RCSSUF , WORKMODE , TMPFILE3 ,
* PRINTDATE , PRINTTIME , map , and ctab ; removed Suffix . Redefined keyvallength
* using NCPPN . Changed putc ( ) to abort on write error .
*
* Revision 3.2 82 / 10 / 18 15 : 03 : 52 wft
* added macro STRICT_LOCKING , removed RCSUMASK .
* renamed JOINFILE [ 1 , 2 ] to JOINFIL [ 1 , 2 ] .
*
* Revision 3.1 82 / 10 / 11 19 : 41 : 17 wft
* removed NBPW , NBPC , NCPW .
* added typdef int void to aid compiling
1993-07-09 05:56:50 +04:00
*/
# include "conf.h"
# define EXIT_TROUBLE DIFF_TROUBLE
1996-10-15 10:59:14 +04:00
# ifdef _POSIX_PATH_MAX
1993-07-09 05:56:50 +04:00
# define SIZEABLE_PATH _POSIX_PATH_MAX
1996-10-15 10:59:14 +04:00
# else
# define SIZEABLE_PATH 255 /* size of a large path; not a hard limit */
1993-07-09 05:56:50 +04:00
# endif
/* for traditional C hosts with unusual size arguments */
# define Fread(p,s,n,f) fread(p, (freadarg_type)(s), (freadarg_type)(n), f)
# define Fwrite(p,s,n,f) fwrite(p, (freadarg_type)(s), (freadarg_type)(n), f)
/*
* Parameters
*/
/* backwards compatibility with old versions of RCS */
# define VERSION_min 3 /* old output RCS format supported */
# define VERSION_max 5 /* newest output RCS format supported */
# ifndef VERSION_DEFAULT /* default RCS output format */
# define VERSION_DEFAULT VERSION_max
# endif
# define VERSION(n) ((n) - VERSION_DEFAULT) /* internally, 0 is the default */
# ifndef STRICT_LOCKING
# define STRICT_LOCKING 1
# endif
/* 0 sets the default locking to non-strict; */
/* used in experimental environments. */
/* 1 sets the default locking to strict; */
/* used in production environments. */
# define yearlength 16 /* (good through AD 9,999,999,999,999,999) */
1996-10-15 10:59:14 +04:00
# define datesize (yearlength+16) /* size of output of time2date */
1993-07-09 05:56:50 +04:00
# define RCSTMPPREFIX '_' /* prefix for temp files in working dir */
# define KDELIM '$' /* delimiter for keywords */
# define VDELIM ':' /* separates keywords from values */
# define DEFAULTSTATE "Exp" /* default state of revisions */
# define true 1
# define false 0
/*
* RILE - readonly file
* declarecache ; - declares local cache for RILE variable ( s )
* setupcache - sets up the local RILE cache , but does not initialize it
* cache , uncache - caches and uncaches the local RILE ;
* ( uncache , cache ) is needed around functions that advance the RILE pointer
1995-02-24 05:24:53 +03:00
* Igeteof_ ( f , c , s ) - get a char c from f , executing statement s at EOF
* cachegeteof_ ( c , s ) - Igeteof_ applied to the local RILE
* Iget_ ( f , c ) - like Igeteof_ , except EOF is an error
* cacheget_ ( c ) - Iget_ applied to the local RILE
* cacheunget_ ( f , c , s ) - read c backwards from cached f , executing s at BOF
1996-10-15 10:59:14 +04:00
* Ifileno , Ioffset_type , Irewind , Itell - analogs to stdio routines
1995-02-24 05:24:53 +03:00
*
* By conventions , macros whose names end in _ are statements , not expressions .
* Following such macros with ` ; else ' results in a syntax error .
1993-07-09 05:56:50 +04:00
*/
1996-10-15 10:59:14 +04:00
# define maps_memory (has_map_fd || has_mmap)
1993-07-09 05:56:50 +04:00
# if large_memory
typedef unsigned char const * Iptr_type ;
1996-10-15 10:59:14 +04:00
typedef struct RILE {
1993-07-09 05:56:50 +04:00
Iptr_type ptr , lim ;
1996-10-15 10:59:14 +04:00
unsigned char * base ; /* not Iptr_type for lint's sake */
unsigned char * readlim ;
int fd ;
# if maps_memory
void ( * deallocate ) P ( ( struct RILE * ) ) ;
1993-07-09 05:56:50 +04:00
# else
FILE * stream ;
# endif
} RILE ;
1996-10-15 10:59:14 +04:00
# if maps_memory
1993-07-09 05:56:50 +04:00
# define declarecache register Iptr_type ptr, lim
# define setupcache(f) (lim = (f)->lim)
1995-02-24 05:24:53 +03:00
# define Igeteof_(f,c,s) if ((f)->ptr==(f)->lim) s else (c)= *(f)->ptr++;
# define cachegeteof_(c,s) if (ptr==lim) s else (c)= *ptr++;
1993-07-09 05:56:50 +04:00
# else
1995-02-24 05:24:53 +03:00
int Igetmore P ( ( RILE * ) ) ;
1993-07-09 05:56:50 +04:00
# define declarecache register Iptr_type ptr; register RILE *rRILE
# define setupcache(f) (rRILE = (f))
1995-02-24 05:24:53 +03:00
# define Igeteof_(f,c,s) if ((f)->ptr==(f)->readlim && !Igetmore(f)) s else (c)= *(f)->ptr++;
# define cachegeteof_(c,s) if (ptr==rRILE->readlim && !Igetmore(rRILE)) s else (c)= *ptr++;
1993-07-09 05:56:50 +04:00
# endif
# define uncache(f) ((f)->ptr = ptr)
# define cache(f) (ptr = (f)->ptr)
1995-02-24 05:24:53 +03:00
# define Iget_(f,c) Igeteof_(f,c,Ieof();)
# define cacheget_(c) cachegeteof_(c,Ieof();)
1996-10-15 10:59:14 +04:00
# define cacheunget_(f,c) (c)=(--ptr)[-1];
# define Ioffset_type size_t
# define Itell(f) ((f)->ptr - (f)->base)
# define Irewind(f) ((f)->ptr = (f)->base)
# define cacheptr() ptr
# define Ifileno(f) ((f)->fd)
1993-07-09 05:56:50 +04:00
# else
# define RILE FILE
# define declarecache register FILE *ptr
# define setupcache(f) (ptr = (f))
# define uncache(f)
# define cache(f)
1995-02-24 05:24:53 +03:00
# define Igeteof_(f,c,s) {if(((c)=getc(f))==EOF){testIerror(f);if(feof(f))s}}
# define cachegeteof_(c,s) Igeteof_(ptr,c,s)
# define Iget_(f,c) { if (((c)=getc(f))==EOF) testIeof(f); }
# define cacheget_(c) Iget_(ptr,c)
1996-10-15 10:59:14 +04:00
# define cacheunget_(f,c) if(fseek(ptr,-2L,SEEK_CUR))Ierror();else cacheget_(c)
# define Ioffset_type long
# define Itell(f) ftell(f)
1993-07-09 05:56:50 +04:00
# define Ifileno(f) fileno(f)
# endif
/* Print a char, but abort on write error. */
1995-02-24 05:24:53 +03:00
# define aputc_(c,o) { if (putc(c,o)==EOF) testOerror(o); }
1993-07-09 05:56:50 +04:00
/* Get a character from an RCS file, perhaps copying to a new RCS file. */
1995-02-24 05:24:53 +03:00
# define GETCeof_(o,c,s) { cachegeteof_(c,s) if (o) aputc_(c,o) }
# define GETC_(o,c) { cacheget_(c) if (o) aputc_(c,o) }
1993-07-09 05:56:50 +04:00
1995-02-24 05:24:53 +03:00
# define WORKMODE(RCSmode, writable) (((RCSmode)&(mode_t)~(S_IWUSR|S_IWGRP|S_IWOTH)) | ((writable)?S_IWUSR:0))
1993-07-09 05:56:50 +04:00
/* computes mode of working file: same as RCSmode, but write permission */
/* determined by writable */
/* character classes and token codes */
enum tokens {
/* classes */ DELIM , DIGIT , IDCHAR , NEWLN , LETTER , Letter ,
PERIOD , SBEGIN , SPACE , UNKN ,
/* tokens */ COLON , ID , NUM , SEMI , STRING
} ;
# define SDELIM '@' /* the actual character is needed for string handling*/
/* SDELIM must be consistent with ctab[], so that ctab[SDELIM]==SBEGIN.
* there should be no overlap among SDELIM , KDELIM , and VDELIM
*/
1995-02-24 05:24:53 +03:00
# define isdigit(c) (((unsigned)(c)-'0') <= 9) /* faster than ctab[c]==DIGIT */
1993-07-09 05:56:50 +04:00
/***************************************
* Data structures for the symbol table
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* Buffer of arbitrary data */
struct buf {
char * string ;
size_t size ;
} ;
struct cbuf {
char const * string ;
size_t size ;
} ;
/* Hash table entry */
struct hshentry {
char const * num ; /* pointer to revision number (ASCIZ) */
char const * date ; /* pointer to date of checkin */
char const * author ; /* login of person checking in */
char const * lockedby ; /* who locks the revision */
char const * state ; /* state of revision (Exp by default) */
1995-02-24 05:24:53 +03:00
char const * name ; /* name (if any) by which retrieved */
1993-07-09 05:56:50 +04:00
struct cbuf log ; /* log message requested at checkin */
struct branchhead * branches ; /* list of first revisions on branches*/
1995-02-24 05:24:53 +03:00
struct cbuf ig ; /* ignored phrases in admin part */
struct cbuf igtext ; /* ignored phrases in deltatext part */
1993-07-09 05:56:50 +04:00
struct hshentry * next ; /* next revision on same branch */
struct hshentry * nexthsh ; /* next revision with same hash value */
1995-02-24 05:24:53 +03:00
long insertlns ; /* lines inserted (computed by rlog) */
long deletelns ; /* lines deleted (computed by rlog) */
1993-07-09 05:56:50 +04:00
char selector ; /* true if selected, false if deleted */
} ;
/* list of hash entries */
struct hshentries {
struct hshentries * rest ;
struct hshentry * first ;
} ;
/* list element for branch lists */
struct branchhead {
struct hshentry * hsh ;
struct branchhead * nextbranch ;
} ;
/* accesslist element */
struct access {
char const * login ;
struct access * nextaccess ;
} ;
/* list element for locks */
1996-10-15 10:59:14 +04:00
struct rcslock {
1993-07-09 05:56:50 +04:00
char const * login ;
struct hshentry * delta ;
1996-10-15 10:59:14 +04:00
struct rcslock * nextlock ;
1993-07-09 05:56:50 +04:00
} ;
/* list element for symbolic names */
struct assoc {
char const * symbol ;
char const * num ;
struct assoc * nextassoc ;
} ;
# define mainArgs (argc,argv) int argc; char **argv;
1995-02-24 05:24:53 +03:00
# if RCS_lint
1993-07-09 05:56:50 +04:00
# define libId(name,rcsid)
# define mainProg(name,cmd,rcsid) int name mainArgs
# else
# define libId(name,rcsid) char const name[] = rcsid;
1996-10-15 10:59:14 +04:00
# define mainProg(n,c,i) char const Copyright[] = "Copyright 1982,1988,1989 Walter F. Tichy, Purdue CS\nCopyright 1990,1991,1992,1993,1994,1995 Paul Eggert", baseid[] = RCSBASE, cmdid[] = c; libId(n,i) int main P((int,char**)); int main mainArgs
1993-07-09 05:56:50 +04:00
# endif
/*
* Markers for keyword expansion ( used in co and ident )
* Every byte must have class LETTER or Letter .
*/
# define AUTHOR "Author"
# define DATE "Date"
# define HEADER "Header"
# define IDH "Id"
# define LOCKER "Locker"
# define LOG "Log"
1995-02-24 05:24:53 +03:00
# define NAME "Name"
1993-07-09 05:56:50 +04:00
# define RCSFILE "RCSfile"
# define REVISION "Revision"
# define SOURCE "Source"
# define STATE "State"
# define keylength 8 /* max length of any of the above keywords */
enum markers { Nomatch , Author , Date , Header , Id ,
1996-10-21 11:00:06 +04:00
# ifdef LOCALID
LocalId ,
# endif
1995-02-24 05:24:53 +03:00
Locker , Log , Name , RCSfile , Revision , Source , State } ;
1993-07-09 05:56:50 +04:00
/* This must be in the same order as rcskeys.c's Keyword[] array. */
# define DELNUMFORM "\n\n%s\n%s\n"
/* used by putdtext and scanlogtext */
# define EMPTYLOG "*** empty log message ***" /* used by ci and rlog */
/* main program */
extern char const cmdid [ ] ;
1995-02-24 05:24:53 +03:00
void exiterr P ( ( void ) ) exiting ;
1993-07-09 05:56:50 +04:00
/* merge */
1995-02-24 05:24:53 +03:00
int merge P ( ( int , char const * , char const * const [ 3 ] , char const * const [ 3 ] ) ) ;
1993-07-09 05:56:50 +04:00
/* rcsedit */
# define ciklogsize 23 /* sizeof("checked in with -k by ") */
extern FILE * fcopy ;
1995-02-24 05:24:53 +03:00
extern char const * resultname ;
1993-07-09 05:56:50 +04:00
extern char const ciklog [ ciklogsize ] ;
extern int locker_expansion ;
RILE * rcswriteopen P ( ( struct buf * , struct stat * , int ) ) ;
1995-02-24 05:24:53 +03:00
char const * makedirtemp P ( ( int ) ) ;
1993-07-09 05:56:50 +04:00
char const * getcaller P ( ( void ) ) ;
1995-02-24 05:24:53 +03:00
int addlock P ( ( struct hshentry * , int ) ) ;
1993-07-09 05:56:50 +04:00
int addsymbol P ( ( char const * , char const * , int ) ) ;
int checkaccesslist P ( ( void ) ) ;
1995-02-24 05:24:53 +03:00
int chnamemod P ( ( FILE * * , char const * , char const * , int , mode_t , time_t ) ) ;
int donerewrite P ( ( int , time_t ) ) ;
1993-07-09 05:56:50 +04:00
int dorewrite P ( ( int , int ) ) ;
1995-02-24 05:24:53 +03:00
int expandline P ( ( RILE * , FILE * , struct hshentry const * , int , FILE * , int ) ) ;
1993-07-09 05:56:50 +04:00
int findlock P ( ( int , struct hshentry * * ) ) ;
1995-02-24 05:24:53 +03:00
int setmtime P ( ( char const * , time_t ) ) ;
void ORCSclose P ( ( void ) ) ;
void ORCSerror P ( ( void ) ) ;
1993-07-09 05:56:50 +04:00
void copystring P ( ( void ) ) ;
void dirtempunlink P ( ( void ) ) ;
void enterstring P ( ( void ) ) ;
void finishedit P ( ( struct hshentry const * , FILE * , int ) ) ;
void keepdirtemp P ( ( char const * ) ) ;
void openfcopy P ( ( FILE * ) ) ;
void snapshotedit P ( ( FILE * ) ) ;
void xpandstring P ( ( struct hshentry const * ) ) ;
# if has_NFS || bad_unlink
int un_link P ( ( char const * ) ) ;
# else
# define un_link(s) unlink(s)
# endif
# if large_memory
void edit_string P ( ( void ) ) ;
# define editstring(delta) edit_string()
# else
void editstring P ( ( struct hshentry const * ) ) ;
# endif
/* rcsfcmp */
int rcsfcmp P ( ( RILE * , struct stat const * , char const * , struct hshentry const * ) ) ;
/* rcsfnms */
1995-02-24 05:24:53 +03:00
# define bufautobegin(b) clear_buf(b)
# define clear_buf(b) (VOID ((b)->string = 0, (b)->size = 0))
1993-07-09 05:56:50 +04:00
extern FILE * workstdout ;
1995-02-24 05:24:53 +03:00
extern char * workname ;
extern char const * RCSname ;
1993-07-09 05:56:50 +04:00
extern char const * suffixes ;
1995-02-24 05:24:53 +03:00
extern int fdlock ;
1993-07-09 05:56:50 +04:00
extern struct stat RCSstat ;
RILE * rcsreadopen P ( ( struct buf * , struct stat * , int ) ) ;
char * bufenlarge P ( ( struct buf * , char const * * ) ) ;
1996-10-15 10:59:14 +04:00
char const * basefilename P ( ( char const * ) ) ;
1993-07-09 05:56:50 +04:00
char const * getfullRCSname P ( ( void ) ) ;
char const * maketemp P ( ( int ) ) ;
char const * rcssuffix P ( ( char const * ) ) ;
1995-02-24 05:24:53 +03:00
int pairnames P ( ( int , char * * , RILE * ( * ) P ( ( struct buf * , struct stat * , int ) ) , int , int ) ) ;
1993-07-09 05:56:50 +04:00
struct cbuf bufremember P ( ( struct buf * , size_t ) ) ;
void bufalloc P ( ( struct buf * , size_t ) ) ;
void bufautoend P ( ( struct buf * ) ) ;
void bufrealloc P ( ( struct buf * , size_t ) ) ;
void bufscat P ( ( struct buf * , char const * ) ) ;
void bufscpy P ( ( struct buf * , char const * ) ) ;
void tempunlink P ( ( void ) ) ;
/* rcsgen */
extern int interactiveflag ;
extern struct buf curlogbuf ;
char const * buildrevision P ( ( struct hshentries const * , struct hshentry * , FILE * , int ) ) ;
int getcstdin P ( ( void ) ) ;
1995-02-24 05:24:53 +03:00
int putdtext P ( ( struct hshentry const * , char const * , FILE * , int ) ) ;
1993-07-09 05:56:50 +04:00
int ttystdin P ( ( void ) ) ;
1995-02-24 05:24:53 +03:00
int yesorno P ( ( int , char const * , . . . ) ) printf_string ( 2 , 3 ) ;
1993-07-09 05:56:50 +04:00
struct cbuf cleanlogmsg P ( ( char * , size_t ) ) ;
struct cbuf getsstdin P ( ( char const * , char const * , char const * , struct buf * ) ) ;
void putdesc P ( ( int , char * ) ) ;
1995-02-24 05:24:53 +03:00
void putdftext P ( ( struct hshentry const * , RILE * , FILE * , int ) ) ;
1993-07-09 05:56:50 +04:00
/* rcskeep */
extern int prevkeys ;
1995-02-24 05:24:53 +03:00
extern struct buf prevauthor , prevdate , prevname , prevrev , prevstate ;
1993-07-09 05:56:50 +04:00
int getoldkeys P ( ( RILE * ) ) ;
/* rcskeys */
extern char const * const Keyword [ ] ;
enum markers trymatch P ( ( char const * ) ) ;
/* rcslex */
extern FILE * foutptr ;
extern FILE * frewrite ;
extern RILE * finptr ;
extern char const * NextString ;
extern enum tokens nexttok ;
extern int hshenter ;
extern int nerror ;
extern int nextc ;
extern int quietflag ;
1995-02-24 05:24:53 +03:00
extern long rcsline ;
1993-07-09 05:56:50 +04:00
char const * getid P ( ( void ) ) ;
1995-02-24 05:24:53 +03:00
void efaterror P ( ( char const * ) ) exiting ;
void enfaterror P ( ( int , char const * ) ) exiting ;
void fatcleanup P ( ( int ) ) exiting ;
void faterror P ( ( char const * , . . . ) ) printf_string_exiting ( 1 , 2 ) ;
void fatserror P ( ( char const * , . . . ) ) printf_string_exiting ( 1 , 2 ) ;
void rcsfaterror P ( ( char const * , . . . ) ) printf_string_exiting ( 1 , 2 ) ;
void Ieof P ( ( void ) ) exiting ;
void Ierror P ( ( void ) ) exiting ;
void Oerror P ( ( void ) ) exiting ;
1993-07-09 05:56:50 +04:00
char * checkid P ( ( char * , int ) ) ;
1995-02-24 05:24:53 +03:00
char * checksym P ( ( char * , int ) ) ;
1993-07-09 05:56:50 +04:00
int eoflex P ( ( void ) ) ;
int getkeyopt P ( ( char const * ) ) ;
int getlex P ( ( enum tokens ) ) ;
struct cbuf getphrases P ( ( char const * ) ) ;
struct cbuf savestring P ( ( struct buf * ) ) ;
struct hshentry * getnum P ( ( void ) ) ;
void Ifclose P ( ( RILE * ) ) ;
void Izclose P ( ( RILE * * ) ) ;
void Lexinit P ( ( void ) ) ;
void Ofclose P ( ( FILE * ) ) ;
1995-02-24 05:24:53 +03:00
void Orewind P ( ( FILE * ) ) ;
1993-07-09 05:56:50 +04:00
void Ozclose P ( ( FILE * * ) ) ;
1996-10-15 10:59:14 +04:00
void aflush P ( ( FILE * ) ) ;
1993-07-09 05:56:50 +04:00
void afputc P ( ( int , FILE * ) ) ;
1995-02-24 05:24:53 +03:00
void aprintf P ( ( FILE * , char const * , . . . ) ) printf_string ( 2 , 3 ) ;
1993-07-09 05:56:50 +04:00
void aputs P ( ( char const * , FILE * ) ) ;
void checksid P ( ( char * ) ) ;
1995-02-24 05:24:53 +03:00
void checkssym P ( ( char * ) ) ;
void diagnose P ( ( char const * , . . . ) ) printf_string ( 1 , 2 ) ;
1993-07-09 05:56:50 +04:00
void eerror P ( ( char const * ) ) ;
void eflush P ( ( void ) ) ;
void enerror P ( ( int , char const * ) ) ;
1995-02-24 05:24:53 +03:00
void error P ( ( char const * , . . . ) ) printf_string ( 1 , 2 ) ;
1993-07-09 05:56:50 +04:00
void fvfprintf P ( ( FILE * , char const * , va_list ) ) ;
void getkey P ( ( char const * ) ) ;
void getkeystring P ( ( char const * ) ) ;
void nextlex P ( ( void ) ) ;
void oflush P ( ( void ) ) ;
void printstring P ( ( void ) ) ;
void readstring P ( ( void ) ) ;
void redefined P ( ( int ) ) ;
1995-02-24 05:24:53 +03:00
void rcserror P ( ( char const * , . . . ) ) printf_string ( 1 , 2 ) ;
void rcswarn P ( ( char const * , . . . ) ) printf_string ( 1 , 2 ) ;
1993-07-09 05:56:50 +04:00
void testIerror P ( ( FILE * ) ) ;
void testOerror P ( ( FILE * ) ) ;
1995-02-24 05:24:53 +03:00
void warn P ( ( char const * , . . . ) ) printf_string ( 1 , 2 ) ;
1993-07-09 05:56:50 +04:00
void warnignore P ( ( void ) ) ;
1995-02-24 05:24:53 +03:00
void workerror P ( ( char const * , . . . ) ) printf_string ( 1 , 2 ) ;
void workwarn P ( ( char const * , . . . ) ) printf_string ( 1 , 2 ) ;
1993-07-09 05:56:50 +04:00
# if has_madvise && has_mmap && large_memory
void advise_access P ( ( RILE * , int ) ) ;
# define if_advise_access(p,f,advice) if (p) advise_access(f,advice)
# else
# define advise_access(f,advice)
# define if_advise_access(p,f,advice)
# endif
1996-10-15 10:59:14 +04:00
# if large_memory && maps_memory
1993-07-09 05:56:50 +04:00
RILE * I_open P ( ( char const * , struct stat * ) ) ;
# define Iopen(f,m,s) I_open(f,s)
# else
RILE * Iopen P ( ( char const * , char const * , struct stat * ) ) ;
# endif
# if !large_memory
void testIeof P ( ( FILE * ) ) ;
void Irewind P ( ( RILE * ) ) ;
# endif
/* rcsmap */
1995-02-24 05:24:53 +03:00
extern enum tokens const ctab [ ] ;
1993-07-09 05:56:50 +04:00
/* rcsrev */
1995-02-24 05:24:53 +03:00
char * partialno P ( ( struct buf * , char const * , int ) ) ;
char const * namedrev P ( ( char const * , struct hshentry * ) ) ;
1993-07-09 05:56:50 +04:00
char const * tiprev P ( ( void ) ) ;
1996-10-15 10:59:14 +04:00
int cmpdate P ( ( char const * , char const * ) ) ;
1993-07-09 05:56:50 +04:00
int cmpnum P ( ( char const * , char const * ) ) ;
1995-02-24 05:24:53 +03:00
int cmpnumfld P ( ( char const * , char const * , int ) ) ;
int compartial P ( ( char const * , char const * , int ) ) ;
1993-07-09 05:56:50 +04:00
int expandsym P ( ( char const * , struct buf * ) ) ;
int fexpandsym P ( ( char const * , struct buf * , RILE * ) ) ;
struct hshentry * genrevs P ( ( char const * , char const * , char const * , char const * , struct hshentries * * ) ) ;
1995-02-24 05:24:53 +03:00
int countnumflds P ( ( char const * ) ) ;
1993-07-09 05:56:50 +04:00
void getbranchno P ( ( char const * , struct buf * ) ) ;
/* rcssyn */
/* These expand modes must agree with Expand_names[] in rcssyn.c. */
# define KEYVAL_EXPAND 0 /* -kkv `$Keyword: value $' */
# define KEYVALLOCK_EXPAND 1 /* -kkvl `$Keyword: value locker $' */
# define KEY_EXPAND 2 /* -kk `$Keyword$' */
# define VAL_EXPAND 3 /* -kv `value' */
# define OLD_EXPAND 4 /* -ko use old string, omitting expansion */
1996-10-15 10:59:14 +04:00
# define BINARY_EXPAND 5 /* -kb like -ko, but use binary mode I/O */
# define MIN_UNEXPAND OLD_EXPAND /* min value for no logical expansion */
# define MIN_UNCHANGED_EXPAND (OPEN_O_BINARY ? BINARY_EXPAND : OLD_EXPAND)
/* min value guaranteed to yield an identical file */
1993-07-09 05:56:50 +04:00
struct diffcmd {
1995-02-24 05:24:53 +03:00
long
1993-07-09 05:56:50 +04:00
line1 , /* number of first line */
nlines , /* number of lines affected */
adprev , /* previous 'a' line1+1 or 'd' line1 */
dafter ; /* sum of previous 'd' line1 and previous 'd' nlines */
} ;
extern char const * Dbranch ;
extern struct access * AccessList ;
extern struct assoc * Symbols ;
extern struct cbuf Comment ;
1995-02-24 05:24:53 +03:00
extern struct cbuf Ignored ;
1996-10-15 10:59:14 +04:00
extern struct rcslock * Locks ;
1993-07-09 05:56:50 +04:00
extern struct hshentry * Head ;
extern int Expand ;
extern int StrictLocks ;
1995-02-24 05:24:53 +03:00
extern int TotalDeltas ;
1993-07-09 05:56:50 +04:00
extern char const * const expand_names [ ] ;
1995-02-24 05:24:53 +03:00
extern char const
Kaccess [ ] , Kauthor [ ] , Kbranch [ ] , Kcomment [ ] ,
Kdate [ ] , Kdesc [ ] , Kexpand [ ] , Khead [ ] , Klocks [ ] , Klog [ ] ,
Knext [ ] , Kstate [ ] , Kstrict [ ] , Ksymbols [ ] , Ktext [ ] ;
void unexpected_EOF P ( ( void ) ) exiting ;
1993-07-09 05:56:50 +04:00
int getdiffcmd P ( ( RILE * , int , FILE * , struct diffcmd * ) ) ;
int str2expmode P ( ( char const * ) ) ;
void getadmin P ( ( void ) ) ;
void getdesc P ( ( int ) ) ;
void gettree P ( ( void ) ) ;
1995-02-24 05:24:53 +03:00
void ignorephrases P ( ( char const * ) ) ;
1993-07-09 05:56:50 +04:00
void initdiffcmd P ( ( struct diffcmd * ) ) ;
1995-02-24 05:24:53 +03:00
void putadmin P ( ( void ) ) ;
1993-07-09 05:56:50 +04:00
void putstring P ( ( FILE * , int , struct cbuf , int ) ) ;
void puttree P ( ( struct hshentry const * , FILE * ) ) ;
1995-02-24 05:24:53 +03:00
/* rcstime */
1996-10-15 10:59:14 +04:00
# define zonelenmax 9 /* maxiumum length of time zone string, e.g. "+12:34:56" */
1995-02-24 05:24:53 +03:00
char const * date2str P ( ( char const [ datesize ] , char [ datesize + zonelenmax ] ) ) ;
time_t date2time P ( ( char const [ datesize ] ) ) ;
void str2date P ( ( char const * , char [ datesize ] ) ) ;
void time2date P ( ( time_t , char [ datesize ] ) ) ;
void zone_set P ( ( char const * ) ) ;
1993-07-09 05:56:50 +04:00
/* rcsutil */
extern int RCSversion ;
1996-10-15 10:59:14 +04:00
FILE * fopenSafer P ( ( char const * , char const * ) ) ;
1993-07-09 05:56:50 +04:00
char * cgetenv P ( ( char const * ) ) ;
char * fstr_save P ( ( char const * ) ) ;
char * str_save P ( ( char const * ) ) ;
char const * getusername P ( ( int ) ) ;
1996-10-15 10:59:14 +04:00
int fdSafer P ( ( int ) ) ;
1993-07-09 05:56:50 +04:00
int getRCSINIT P ( ( int , char * * , char * * * ) ) ;
1995-02-24 05:24:53 +03:00
int run P ( ( int , char const * , . . . ) ) ;
int runv P ( ( int , char const * , char const * * ) ) ;
1993-07-09 05:56:50 +04:00
malloc_type fremember P ( ( malloc_type ) ) ;
malloc_type ftestalloc P ( ( size_t ) ) ;
malloc_type testalloc P ( ( size_t ) ) ;
malloc_type testrealloc P ( ( malloc_type , size_t ) ) ;
# define ftalloc(T) ftnalloc(T,1)
# define talloc(T) tnalloc(T,1)
1995-02-24 05:24:53 +03:00
# if RCS_lint
1993-07-09 05:56:50 +04:00
extern malloc_type lintalloc ;
# define ftnalloc(T,n) (lintalloc = ftestalloc(sizeof(T)*(n)), (T*)0)
# define tnalloc(T,n) (lintalloc = testalloc(sizeof(T)*(n)), (T*)0)
# define trealloc(T,p,n) (lintalloc = testrealloc((malloc_type)0, sizeof(T)*(n)), p)
# define tfree(p)
# else
# define ftnalloc(T,n) ((T*) ftestalloc(sizeof(T)*(n)))
# define tnalloc(T,n) ((T*) testalloc(sizeof(T)*(n)))
# define trealloc(T,p,n) ((T*) testrealloc((malloc_type)(p), sizeof(T)*(n)))
# define tfree(p) free((malloc_type)(p))
# endif
1995-02-24 05:24:53 +03:00
time_t now P ( ( void ) ) ;
1993-07-09 05:56:50 +04:00
void awrite P ( ( char const * , size_t , FILE * ) ) ;
void fastcopy P ( ( RILE * , FILE * ) ) ;
void ffree P ( ( void ) ) ;
void ffree1 P ( ( char const * ) ) ;
void setRCSversion P ( ( char const * ) ) ;
# if has_signal
void catchints P ( ( void ) ) ;
void ignoreints P ( ( void ) ) ;
void restoreints P ( ( void ) ) ;
# else
# define catchints()
# define ignoreints()
# define restoreints()
# endif
1995-02-24 05:24:53 +03:00
# if has_mmap && large_memory
1996-10-15 10:59:14 +04:00
# if has_NFS && mmap_signal
void catchmmapints P ( ( void ) ) ;
void readAccessFilenameBuffer P ( ( char const * , unsigned char const * ) ) ;
# else
# define catchmmapints()
# endif
1995-02-24 05:24:53 +03:00
# endif
1993-07-09 05:56:50 +04:00
# if has_getuid
uid_t ruid P ( ( void ) ) ;
# define myself(u) ((u) == ruid())
# else
# define myself(u) true
# endif
# if has_setuid
uid_t euid P ( ( void ) ) ;
void nosetid P ( ( void ) ) ;
void seteid P ( ( void ) ) ;
void setrid P ( ( void ) ) ;
# else
# define nosetid()
# define seteid()
# define setrid()
# endif
1995-02-24 05:24:53 +03:00
/* version */
extern char const RCS_version_string [ ] ;