ftp.nice.ch/pub/next/unix/developer/RevScanner.s.tar.gz#/RevScanner/rcsbase.h

This is rcsbase.h in view mode; [Download] [Up]

/*
 *                     RevScanner common definitions and data structures
 */
char RCSBASE[]= "$Id: rcsbase.h,v 1.4 1991/12/20 01:45:40 dstrout Beta $";

/* Copyright (C) 1991 David Strout

This file is part of RevScanner.

RevScanner 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 1, or (at your option)
any later version.

RevScanner 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
along with RCS; see the file COPYING.  If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.

Report problems and direct all questions to:

    dstrout@darpa.mil

*/



/*****************************************************************************
 * INSTRUCTIONS:
 * =============
 * See the Makefile for how to define C preprocessor symbols.
 * If you need to change the comment leaders, update the table comtable[]
 * in rcsfnms.c. (This can wait until you know what a comment leader is.)
 *****************************************************************************
 */


/* $Log: rcsbase.h,v $
 * Revision 1.4  1991/12/20  01:45:40  dstrout
 * Added GNU License
 *
 * Revision 1.3  1991/12/19  21:10:25  dstrout
 * added rcsid
 *
 * Revision 1.2  1991/12/19  19:43:24  dstrout
 * Commented out def of null so as to net see the error at compile time.
 *
 * Revision 1.1  1991/12/19  16:29:10  dstrout
 * Initial revision
 *
 * Revision 1.1.1.1  1991/12/19  15:42:46  dstrout
 * rcs 5.5 distribution
 *
 * Revision 1.1  1991/12/19  15:42:38  dstrout
 * Initial revision
 *
 * Revision 1.2  1991/04/10  22:30:15  karl
 * *** empty log message ***
 *
 * 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 %02d, the other %.2d.
 *
 * 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
 */

/* GCC */
#if __GNUC__ && !__STRICT_ANSI__
#	define exiting volatile
#else
#	define exiting
#endif


/* standard include files */

#include "conf.h"

#if !MAKEDEPEND

#include <errno.h>
#include <signal.h>
#include <time.h>


/* ANSI C library */
/* These declarations are for the benefit of non-ANSI C hosts.  */

	/* <errno.h> */
#	ifndef errno
		extern int errno;
#	endif

	/* <limits.h> */
#	ifndef CHAR_BIT
#		define CHAR_BIT 8
#	endif
#	ifndef ULONG_MAX
#		define ULONG_MAX (-(unsigned long)1)
#	endif

	/* <signal.h> */
#	ifndef signal
		signal_type (*signal P((int,signal_type(*)P((int)))))P((int));
#	endif

	/* <stdio.h> */
	/* conf.h declares the troublesome printf family.  */
#	ifndef L_tmpnam
#		define L_tmpnam 25 /* sizeof("/usr/tmp/xxxxxxxxxxxxxxx") */
#	endif
#	ifndef SEEK_SET
#		define SEEK_SET 0
#	endif
#	ifndef fopen
		FILE *fopen P((const char*,const char*));
#	endif
#	ifndef fread
		fread_type fread P((void*,size_t,size_t,FILE*));
#	endif
#	ifndef fwrite
		fread_type fwrite P((const void*,size_t,size_t,FILE*));
#	endif
#	ifndef fclose
		int fclose P((FILE*));
#	endif
#	ifndef fflush
		int fflush P((FILE*));
#	endif
#	ifndef fputs
		int fputs P((const char*,FILE*));
#	endif
#	ifndef fseek
		int fseek P((FILE*,long,int));
#	endif
#	ifndef perror
		void perror P((const char*));
#	endif
#	ifndef clearerr
		void clearerr P((FILE*));
#	endif
#	ifndef feof
		int feof P((FILE*));
#	endif
#	ifndef ferror
		int ferror P((FILE*));
#	endif
#	if has_rename && !defined(rename)
		int rename P((const char*,const char*));
#	endif
#	if has_tmpnam && !defined(tmpnam)
		char *tmpnam P((char*));
#	endif

	/* <stdlib.h> */
#	ifndef EXIT_FAILURE
#		define EXIT_FAILURE 1
#	endif
#	ifndef EXIT_SUCCESS
#		define EXIT_SUCCESS 0
#	endif
#	ifndef getenv
		char *getenv P((const char*));
#	endif
#	ifndef exit
		exiting exit_type exit P((int));
#	endif
#	ifndef _exit
		exiting underscore_exit_type _exit P((int));
#	endif
#	ifndef free
		free_type free P((malloc_type));
#	endif
#	ifndef atoi
		int atoi P((const char*));
#	endif
#	ifndef malloc
		malloc_type malloc P((size_t));
#	endif
#	ifndef realloc
		malloc_type realloc P((malloc_type,size_t));
#	endif

	/* <string.h> */
#	ifndef strcat
		char *strcat P((char*,const char*));
#	endif
#	ifndef strcpy
		char *strcpy P((char*,const char*));
#	endif
#	ifndef strncpy

                extern char *strncpy(char *s1, const char *s2, size_t n);

#	endif
#	ifndef strrchr
		char *strrchr P((const char*,int));
#	endif
#	ifndef strcmp
		int strcmp P((const char*,const char*));
#	endif
#	ifndef strncmp
                extern int strncmp(const char *s1, const char *s2, size_t n);
#	endif
#	ifndef strlen
		strlen_type strlen P((const char*));
#	endif

	/* <time.h> */
#	ifndef time
		time_t time P((time_t*));
#	endif


/* Posix 1003.1-1988 */
/* These declarations are for the benefit of non-Posix hosts.  */

	/* <limits.h> */
#	if !defined(NAME_MAX) && !defined(_POSIX_NAME_MAX)
#		if has_sys_dir_h
#			include <sys/dir.h>
#		endif
#		ifndef NAME_MAX
#			ifndef MAXNAMLEN
#				define MAXNAMLEN 14
#			endif
#			define NAME_MAX MAXNAMLEN
#		endif
#	endif
#	if !defined(PATH_MAX) && !defined(_POSIX_PATH_MAX)
#		if has_sys_param_h
#			include <sys/param.h>
#		endif
#		ifndef PATH_MAX
#			ifndef MAXPATHLEN
#				define MAXPATHLEN 256
#			endif
#			define PATH_MAX (MAXPATHLEN-1)
#		endif
#	endif

	/* <sys/wait.h> */
#	if has_sys_wait_h
#		include <sys/wait.h>
#	endif
#	ifndef WEXITSTATUS
#		define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8)
#		undef WIFEXITED /* Avoid 4.3BSD incompatibility with Posix.  */
#	endif
#	ifndef WIFEXITED
#		define WIFEXITED(stat_val) (!((stat_val) & 255))
#	endif

	/* <fcntl.h> */
	/* conf.h declares fcntl() and open().  */
#	ifdef F_DUPD
#		undef dup2
#		define dup2(a,b) fcntl(a,F_DUPFD,b)
#	else
#		ifndef dup2
			int dup2 P((int,int));
#		endif
#	endif
#	ifdef O_CREAT
#		define open_can_creat 1
#		undef creat
#		define creat(path,mode) open(path,O_CREAT|O_TRUNC|O_WRONLY,mode)
#	else
#		define open_can_creat 0
#		define O_RDONLY 0
#		define O_WRONLY 1
#		define O_CREAT 01000
#		define O_TRUNC 02000
#		ifndef creat
			int creat P((const char*,mode_t));
#		endif
#	endif

	/* <stdio.h> */
#	ifndef fdopen
		FILE *fdopen P((int,const char*));
#	endif

	/* <sys/stat.h> */
	/* conf.h declares chmod() and umask().  */
#	ifndef S_IRUSR
#		define S_IRUSR 0400
#		define S_IWUSR 0200
#		define S_IRGRP 0040
#		define S_IWGRP 0020
#		define S_IROTH 0004
#		define S_IWOTH 0002
#	endif
#	ifndef S_ISREG
#		define S_ISREG(n) (((n) & S_IFMT) == S_IFREG)
#	endif
#	ifndef fstat
		int fstat P((int,struct stat*));
#	endif
#	ifndef stat
		int stat P((const char*,struct stat*));
#	endif

	/* <unistd.h> */
#	ifndef STDIN_FILENO
#		define STDIN_FILENO 0
#		define STDOUT_FILENO 1
#		define STDERR_FILENO 2
#	endif
#	ifndef getlogin
		char *getlogin P((void));
#	endif
#	ifndef _exit
		exiting void _exit P((int));
#	endif
#	ifndef close
		int close P((int));
#	endif
#	ifndef execv
		int execv P((const char*,const char*const*));
#	endif
#	ifndef execvp
		int execvp P((const char*,const char*const*));
#	endif
#	ifndef isatty
		int isatty P((int));
#	endif
#	ifndef read
		int read P((int,char*,unsigned));
#	endif
#	ifndef write
		int write P((int,const char*,unsigned));
#	endif
#	ifndef unlink
		int unlink P((const char*));
#	endif
#	if has_getuid
#		ifndef getgid
			gid_t getgid P((void));
#		endif
#		ifndef getuid
			uid_t getuid P((void));
#		endif
#	endif
#	if has_seteuid
#		ifndef setegid
			int setegid P((gid_t));
#		endif
#		ifndef seteuid
			int seteuid P((uid_t));
#		endif
#		ifndef getegid
			gid_t getegid P((void));
#		endif
#		ifndef geteuid
			uid_t geteuid P((void));
#		endif
#	endif
#	if has_vfork
#		ifndef vfork
			pid_t vfork P((void));
#		endif
#	else
#		define vfork fork
#		ifndef fork
			pid_t fork P((void));
#		endif
#	endif
#	if has_getcwd && !defined(getcwd)
		char *getcwd P((char*,size_t));
#	endif


/* traditional Unix library */
#define EXIT_TROUBLE 2 /* code returned by diff(1) if trouble is found */
#if !has_getcwd && !defined(getwd)
	char *getwd P((char*));
#endif
#if !has_tmpnam && !defined(mktemp)
	char *mktemp P((char*));
#endif
#if !has_sigaction & has_sigblock
#	ifndef sigblock
		int sigblock P((int));
#	endif
#	ifndef sigsetmask
		int sigsetmask P((int));
#	endif
#endif
#ifndef _filbuf
	int _filbuf P((FILE*));
#endif
#ifndef _flsbuf
	int _flsbuf P((int,FILE*));
#endif


#endif /* !MAKEDEPEND */


/*
 * 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)    */
#define datesize (yearlength+16) /* size of output of DATEFORM		    */
#define joinlength         20 /* number of joined revisions permitted       */
#define RCSSUF            'v' /* suffix for RCS files                       */
#define KDELIM            '$' /* delimiter for keywords                     */
#define VDELIM            ':' /* separates keywords from values             */
#define DEFAULTSTATE    "Exp" /* default state of revisions                 */



#define true     1
#define false    0
/*#define nil      0 Commented out by dstrout for RevScanner */




/* This version of putc prints a char, but aborts on write error            */
#if lint
#	define aputc(c,o) afputc(c,o)
#	define GETC(i,o,c) afputc(c=getc(i), o)
#else
#	define aputc(c,o) do { if (putc(c,o)==EOF) IOerror(); } while(0)
#	define GETC(i,o,c) do {c=getc(i); if (o) aputc(c,o); } while(0)
#endif
/* GETC writes a DEL-character (all ones) on end of file.		    */

#define WORKMODE(RCSmode, writable) ((RCSmode)&~(S_IWUSR|S_IWGRP|S_IWOTH) | ((writable)?S_IWUSR:0))
/* 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,	EOFILE,	ID,	NUM,	SEMI,	STRING
};

#define SDELIM  '@'     /* the actual character is needed for string handling*/
/* SDELIM must be consistent with map[], so that ctab[SDELIM]==SBEGIN.
 * there should be no overlap among SDELIM, KDELIM, and VDELIM
 */

#define isdigit(c) ((unsigned)((c)-'0') <= 9) /* faster than ctab[c]==DIGIT */





/***************************************
 * Data structures for the symbol table
 ***************************************/

/* Buffer of arbitrary data */
struct buf {
	char *string;
	size_t size;
};
struct cbuf {
	const char *string;
	size_t size;
};

/* Hash table entry */
struct hshentry {
	const char	  * num;      /* pointer to revision number (ASCIZ) */
	const char	  * date;     /* pointer to date of checkin	    */
	const char	  * author;   /* login of person checking in        */
	const char	  * lockedby; /* who locks the revision             */
	const char	  * state;    /* state of revision (Exp by default) */
	struct cbuf	    log;      /* log message requested at checkin   */
        struct branchhead * branches; /* list of first revisions on branches*/
	struct cbuf	    ig;	      /* ignored phrases of revision	    */
        struct hshentry   * next;     /* next revision on same branch       */
	struct hshentry   * nexthsh;  /* next revision with same hash value */
	unsigned long	    insertlns;/* lines inserted (computed by rlog)  */
	unsigned long	    deletelns;/* lines deleted  (computed by rlog)  */
	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 {
	const char	  * login;
        struct access     * nextaccess;
};

/* list element for locks  */
struct lock {
	const char	  * login;
        struct hshentry   * delta;
        struct lock       * nextlock;
};

/* list element for symbolic names */
struct assoc {
	const char	  * symbol;
	const char	  * num;
        struct assoc      * nextassoc;
};


#define mainArgs (argc,argv) int argc; char **argv;

#if lint
#	define libId(name,rcsid)
#	define mainProg(name,cmd,rcsid) int name mainArgs
#else
#	define libId(name,rcsid) const char name[] = rcsid;
#	define mainProg(name,cmd,rcsid) const char copyright[] = "Copyright 1982,1988,1989 by Walter F. Tichy\nPurdue CS\nCopyright 1990 by Paul Eggert", rcsbaseId[] = RCSBASE, cmdid[] = cmd; libId(name,rcsid) int main mainArgs
#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"
#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,
	       Locker, Log, RCSfile, Revision, Source, State };
	/* 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 */

/* main program */
extern const char cmdid[];
exiting void exiterr P((void));

/* maketime */
void str2date P((const char*,char[datesize]));
void time2date P((time_t,char[datesize]));

/* partime */
int partime P((const char*,struct tm*,int*));

/* rcsedit */
#define ciklogsize 23 /* sizeof("checked in with -k by ") */
extern FILE *fcopy;
extern const char *resultfile;
extern const char ciklog[ciklogsize];
extern int locker_expansion;
extern struct buf dirtfname[];
#define newRCSfilename (dirtfname[0].string)
FILE *initeditfiles P((const char*));
FILE *rcswriteopen P((const char*));
const char *makedirtemp P((const char*,int));
int expandline P((FILE*,FILE*,const struct hshentry*,int,FILE*));
void arewind P((FILE*));
void copystring P((void));
void dirtempunlink P((void));
void editstring P((const struct hshentry*));
void finishedit P((const struct hshentry*));
void inittmpeditfiles P((void));
void keepdirtemp P((const char*));
void swapeditfiles P((int));
void xpandstring P((const struct hshentry*));

/* rcsfnms */
#define bufautobegin(b) ((void) ((b)->size = 0)) /* for auto on block entry */
extern char *workfilename;
extern const char *RCSfilename;
extern int haveworkstat;
extern struct stat RCSstat;
extern struct stat workstat;
FILE *rcsreadopen P((const char*));
char *bufenlarge P((struct buf*,const char**));
char *maketemp P((int));
const char *bindex P((const char*,int));
const char *getfullRCSname P((void));
const char *tmp();
int getfworkstat P((int));
int getworkstat P((void));
int pairfilenames P((int,char**,FILE*(*)P((const char*)),int,int));
void bufalloc P((struct buf*,size_t));
void bufautoend P((struct buf*));
void bufrealloc P((struct buf*,size_t));
void bufscat P((struct buf*,const char*));
void bufscpy P((struct buf*,const char*));
void ffclose P((FILE*));
void tempunlink P((void));
#if has_rename & !bad_rename
#	define re_name(x,y) rename(x,y)
#else
	int re_name P((const char*,const char*));
#endif

/* rcsgen */
extern int interactiveflag;
extern struct cbuf curlogmsg;
extern struct buf curlogbuf;
const char *buildrevision P((const struct hshentries*,struct hshentry*,int,int));
int getcstdin P((void));
int ttystdin P((void));
int yesorno P((int,const char*,...));
struct cbuf cleanlogmsg P((char*,size_t));
void putdesc P((int,const char*));

/* rcskeys */
extern const char *const Keyword[];
enum markers trymatch P((const char*));

/* rcslex */
extern FILE *finptr;
extern FILE *foutptr;
extern FILE *frewrite;
extern const char *NextString;
extern enum tokens nexttok;
extern int hshenter;
extern int nerror;
extern int nextc;
extern int quietflag;
extern unsigned long rcsline;
const char *getid P((void));
exiting void efaterror P((const char*));
exiting void faterror P((const char*,...));
exiting void fatserror P((const char*,...));
exiting void IOerror P((void));
exiting void unterminatedString P((void));
char *checkid P((char*,int));
int getkeyopt P((const char*));
int getlex P((enum tokens));
struct cbuf getphrases P((const char*));
struct cbuf savestring P((struct buf*));
struct hshentry *getnum P((void));
void Lexinit P((void));
void afputc P((int,FILE*));
void aprintf P((FILE*,const char*,...));
void aputs P((const char*,FILE*));
void checksid P((char*));
void diagnose P((const char*,...));
void eflush P((void));
void error P((const char*,...));
void eerror P((const char*));
void fvfprintf P((FILE*,const char*,va_list));
void getkey P((const char*));
void getkeystring P((const char*));
void nextlex P((void));
void oflush P((void));
void printstring P((void));
void readstring P((void));
void redefined P((int));
void warn P((const char*,...));
void warnignore P((void));

/* rcsmap */
#define ctab (&map[1])
extern const enum tokens map[];

/* rcsrev */
char *partialno P((struct buf*,const char*,unsigned));
int cmpnum P((const char*,const char*));
int cmpnumfld P((const char*,const char*,unsigned));
int compartial P((const char*,const char*,unsigned));
int expandsym P((const char*,struct buf*));
struct hshentry *genrevs P((const char*,const char*,const char*,const char*,struct hshentries**));
unsigned countnumflds P((const char*));
void getbranchno P((const char*,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 */
struct diffcmd {
	unsigned long
		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 const char      * Dbranch;
extern struct access   * AccessList;
extern struct assoc    * Symbols;
extern struct cbuf Comment;
extern struct lock     * Locks;
extern struct hshentry * Head;
extern int		 Expand;
extern int               StrictLocks;
extern int               TotalDeltas;
extern const char *const expand_names[];
extern const char Kdesc[];
extern const char Klog[];
extern const char Ktext[];
int getdiffcmd P((FILE*,int,FILE*,struct diffcmd*));
int putdftext P((const char*,struct cbuf,FILE*,FILE*,int));
int putdtext P((const char*,struct cbuf,const char*,FILE*,int));
int str2expmode P((const char*));
void getadmin P((void));
void getdesc P((int));
void gettree P((void));
void ignorephrase P((void));
void initdiffcmd P((struct diffcmd*));
void putadmin P((FILE*));
void puttree P((const struct hshentry*,FILE*));

/* rcsutil */
extern int RCSversion;
char *cgetenv P((const char*));
const char *getcaller P((void));
const char *fstrsave P((const char*));
const char *strsave P((const char*));
int addlock P((struct hshentry*));
int addsymbol P((const char*,const char*,int));
int checkaccesslist P((void));
int findlock P((int,struct hshentry**));
int run P((const char*,const char*,...));
int runv P((const char**));
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)
#if lint
	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 tfree(p)
#else
#	define ftnalloc(T,n) ((T*) ftestalloc(sizeof(T)*(n)))
#	define tnalloc(T,n) ((T*) testalloc(sizeof(T)*(n)))
#	define tfree(p) free((malloc_type)(p))
#endif
void awrite P((const char*,fread_type,FILE*));
void catchints P((void));
void fastcopy P((FILE*,FILE*));
void ffree P((void));
void ffree1 P((const char*));
void initid P((void));
void ignoreints P((void));
void printdate P((FILE*,const char*,const char*));
void restoreints P((void));
void setRCSversion P((const char*));
#define SETID (has_getuid & has_seteuid & DIFF_PATH_HARDWIRED)
#if has_getuid
	extern uid_t ruid;
#	define myself(u) ((u) == ruid)
#else
#	define myself(u) true
#endif
#if SETID
	void seteid P((void));
	void setrid P((void));
#else
#	define seteid()
#	define setrid()
#endif

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.