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.