page%swap@Sun.COM (Bob Page) (11/19/89)
Submitted-by: rsbx@cbmvax.commodore.com (Raymond S. Brand)
Posting-number: Volume 89, Issue 223
Archive-name: unix/rcs.08
# This is a shell archive.
# Remove anything above and including the cut line.
# Then run the rest of the file through 'sh'.
# Unpacked files will be owned by you and have default permissions.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar: SHell ARchive
# Run the following text through 'sh' to create:
# rcs/rcs.rcsfiles/rcsbase.h,v
# rcs/rcs.rcsfiles/rcsdiff.c,v
# rcs/rcs.rcsfiles/rcsclean.c,v
# This is archive 8 of a 14-part kit.
# This archive created: Sun Nov 19 01:12:09 1989
if `test ! -d rcs`
then
mkdir rcs
echo "mkdir rcs"
fi
if `test ! -d rcs/rcs.rcsfiles`
then
mkdir rcs/rcs.rcsfiles
echo "mkdir rcs/rcs.rcsfiles"
fi
echo "extracting rcs/rcs.rcsfiles/rcsbase.h,v"
sed 's/^X//' << \SHAR_EOF > rcs/rcs.rcsfiles/rcsbase.h,v
Xhead 4.9;
Xbranch 4.9.2;
Xaccess ;
Xsymbols amiga_rcs:4.9.2 cbmvax_source:4.9.1 uunet_june89_dist:4.9;
Xlocks ; strict;
Xcomment @ * @;
X
X
X4.9
Xdate 89.05.01.15.17.14; author narten; state Exp;
Xbranches 4.9.1.1 4.9.2.1;
Xnext ;
X
X4.9.1.1
Xdate 89.08.11.01.42.12; author rsbx; state Exp;
Xbranches ;
Xnext ;
X
X4.9.2.1
Xdate 89.10.13.19.16.35; author rsbx; state Exp;
Xbranches ;
Xnext 4.9.2.2;
X
X4.9.2.2
Xdate 89.10.15.15.43.52; author rsbx; state Exp;
Xbranches ;
Xnext 4.9.2.3;
X
X4.9.2.3
Xdate 89.10.16.19.07.02; author rsbx; state Exp;
Xbranches ;
Xnext 4.9.2.4;
X
X4.9.2.4
Xdate 89.11.01.14.43.06; author rsbx; state Exp;
Xbranches ;
Xnext ;
X
X
Xdesc
X@RCS common definitions and data structures.
X@
X
X
X
X4.9
Xlog
X@checked in with -k by rsbx at 89.08.10.16.06.59.
X@
Xtext
X@
X/*
X * RCS common definitions and data structures
X */
X#define RCSBASE "$Id: rcsbase.h,v 4.9 89/05/01 15:17:14 narten Exp $"
X
X/* Copyright (C) 1982, 1988, 1989 Walter Tichy
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms are permitted
X * provided that the above copyright notice and this paragraph are
X * duplicated in all such forms and that any documentation,
X * advertising materials, and other materials related to such
X * distribution and use acknowledge that the software was developed
X * by Walter Tichy.
X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
X * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
X *
X * Report all problems and direct all questions to:
X * rcs-bugs@@cs.purdue.edu
X *
X
X
X
X
X
X
X
X*/
X
X
X
X/*****************************************************************************
X * INSTRUCTIONS:
X * =============
X * The following should be handled in the Makefile:
X * For USG Unix, define USG; for BSD Unix, don't (see ifdef USG).
X * For 4.2 bsd, define V4_2BSD; this will replace the routines
X * getwd() and rename() with the corresponding ones in the C-library.
X * V4_2BSD also selects different definitions for the macros NCPFN and NCPPN
X * (max. number of characters per filename, number of characters per path name).
X * Define STRICT_LOCKING appropriately (see STRICT_LOCKING).
X * The following need be changed for porting to a different machine:
X * Define SMALLOG for a machine with small memory (like the PDP11).
X * SMALLOG conserves space for log messages.
X * Change BYTESIZ if necessary.
X * If you need to change the comment leaders, update the table comtable[]
X * in rcsfnms.c. (This can wait until you know what a comment leader is.)
X *****************************************************************************
X */
X
X
X/* $Log: rcsbase.h,v $
X * Revision 4.9 89/05/01 15:17:14 narten
X * botched previous USG fix
X *
X * Revision 4.8 89/05/01 14:53:05 narten
X * changed #include <strings.h> -> string.h for USG systems.
X *
X * Revision 4.7 88/11/08 15:58:45 narten
X * removed defs for functions loaded from libraries
X *
X * Revision 4.6 88/11/08 12:04:06 narten
X * changes from eggert@@sm.unisys.com (Paul Eggert)
X *
X * Revision 4.6 88/08/09 19:12:36 eggert
X * Shrink stdio code size; remove lint; permit -Dhshsize=nn.
X *
X * Revision 4.5 87/12/18 17:06:41 narten
X * made removed BSD ifdef, now uses V4_2BSD
X *
X * Revision 4.4 87/10/18 10:29:49 narten
X * Updating version numbers
X * Changes relative to 1.1 are actually relative to 4.2
X *
X * Revision 1.3 87/09/24 14:02:25 narten
X * changes for lint
X *
X * Revision 1.2 87/03/27 14:22:02 jenkins
X * Port to suns
X *
X * Revision 1.1 84/01/23 14:50:14 kcs
X * Initial revision
X *
X * Revision 4.2 83/12/20 16:04:20 wft
X * merged 3.6.1.1 and 4.1 (SMALLOG, logsize).
X * moved setting of STRICT_LOCKING to Makefile.
X * changed DOLLAR to UNKN (conflict with KDELIM).
X *
X * Revision 4.1 83/05/04 09:12:41 wft
X * Added markers Id and RCSfile.
X * Added Dbranch for default branches.
X *
X * Revision 3.6.1.1 83/12/02 21:56:22 wft
X * Increased logsize, added macro SMALLOG.
X *
X * Revision 3.6 83/01/15 16:43:28 wft
X * 4.2 prerelease
X *
X * Revision 3.6 83/01/15 16:43:28 wft
X * Replaced dbm.h with BYTESIZ, fixed definition of rindex().
X * Added variants of NCPFN and NCPPN for bsd 4.2, selected by defining V4_2BSD.
X * Added macro DELNUMFORM to have uniform format for printing delta text nodes.
X * Added macro DELETE to mark deleted deltas.
X *
X * Revision 3.5 82/12/10 12:16:56 wft
X * Added two forms of DATEFORM, one using %02d, the other %.2d.
X *
X * Revision 3.4 82/12/04 20:01:25 wft
X * added LOCKER, Locker, and USG (redefinition of rindex).
X *
X * Revision 3.3 82/12/03 12:22:04 wft
X * Added dbm.h, stdio.h, RCSBASE, RCSSEP, RCSSUF, WORKMODE, TMPFILE3,
X * PRINTDATE, PRINTTIME, map, and ctab; removed Suffix. Redefined keyvallength
X * using NCPPN. Changed putc() to abort on write error.
X *
X * Revision 3.2 82/10/18 15:03:52 wft
X * added macro STRICT_LOCKING, removed RCSUMASK.
X * renamed JOINFILE[1,2] to JOINFIL[1,2].
X *
X * Revision 3.1 82/10/11 19:41:17 wft
X * removed NBPW, NBPC, NCPW.
X * added typdef int void to aid compiling
X */
X
X
X
X#include <stdio.h>
X#ifdef USG
X#include <string.h>
X#else
X#include <strings.h>
X#endif
X#undef putc /* will be redefined */
X
X
X#ifdef USG
X# define rindex strrchr
X# define DATEFORM "%.2d.%.2d.%.2d.%.2d.%.2d.%.2d"
X#else
X# define DATEFORM "%02d.%02d.%02d.%02d.%02d.%02d"
X#endif
X/* Make sure one of %02d or %.2d prints a number with a field width 2, with
X * leading zeroes. For example, 0, 1, and 22 must be printed as 00, 01, and
X * 22. Otherwise, there will be problems with the dates.
X */
X
X#define PRINTDATE(file,date) fprintf(file,"%.2s/%.2s/%.2s",date,date+3,date+6)
X#define PRINTTIME(file,date) fprintf(file,"%.2s:%.2s:%.2s",date+9,date+12,date+15)
X/* print RCS format date and time in nice format from a string */
X
X/*
X * Parameters
X */
X#define BYTESIZ 8 /* number of bits in a byte */
X
X/*#define STRICT_LOCKING 0 /* 0 sets the default locking to non-strict; */
X /* used in experimental environments. */
X /* 1 sets the default locking to strict; */
X /* used in production environments. */
X /* STRICT_LOCKING is set in the Makefile! */
X#ifndef hshsize
X#define hshsize 239 /* hashtable size; MUST be prime and -1 mod 4 */
X /* other choices: 547 or 719 */
X#endif
X
X#define strtsize (hshsize * 50) /* string table size */
X#ifdef SMALLOG
X# define logsize 1024 /* max. size of log message for pdp11 */
X#else
X# define logsize 4096 /* max. size of log message for others */
X#endif
X#define revlength 30 /* max. length of revision numbers */
X#define datelength 20 /* length of a date in RCS format */
X#define joinlength 20 /* number of joined revisions permitted */
X#define RCSDIR "RCS/" /* subdirectory for RCS files */
X#define RCSSUF 'v' /* suffix for RCS files */
X#define RCSSEP ',' /* separator for RCSSUF */
X#define KDELIM '$' /* delimiter for keywords */
X#define VDELIM ':' /* separates keywords from values */
X#define DEFAULTSTATE "Exp" /* default state of revisions */
X#ifdef V4_2BSD
X# define NCPFN 256 /* number of characters per filename */
X# define NCPPN 1024 /* number of characters per pathname */
X#else
X# define NCPFN 14 /* number of characters per filename */
X# define NCPPN 6*NCPFN /* number of characters per pathname */
X#endif
X#define keylength 20 /* buffer length for expansion keywords */
X#define keyvallength NCPPN+revlength+datelength+60
X /* buffer length for keyword expansion */
X
X
X
X#define true 1
X#define false 0
X#define nil 0
X#define elsif else if
X#define elif else if
X
X
X/* temporary file names */
X
X#define NEWRCSFILE ",RCSnewXXXXXX"
X#define DIFFILE ",RCSciXXXXXX"
X#define TMPFILE1 ",RCSt1XXXXXX"
X#define TMPFILE2 ",RCSt2XXXXXX"
X#define TMPFILE3 ",RCSt3XXXXXX"
X#define JOINFIL2 ",RCSj2XXXXXX"
X#define JOINFIL3 ",RCSj3XXXXXX"
X
X
X#define putc(x,p) (--(p)->_cnt>=0? ((int)(*(p)->_ptr++=(unsigned)(x))):fflsbuf((unsigned)(x),p))
X/* This version of putc prints a char, but aborts on write error */
X
X#define GETC(in,out,echo) (c=getc(in), echo?putc(c,out):c)
X/* GETC modifies a local variable c; a kludge, but smaller and faster. */
X/* GETC writes a del-character (octal 177) on end of file */
X
X#define WORKMODE(RCSmode) (RCSmode&~0222)|((lockflag||!StrictLocks)?0600:0000)
X/* computes mode of working file: same as RCSmode, but write permission */
X/* determined by lockflag and StrictLocks. */
X
X
X/* character classes and token codes */
Xenum tokens {
X/* char classes*/ DIGIT, IDCHAR, NEWLN, LETTER, PERIOD, SBEGIN, SPACE, UNKN,
X/* tokens */ COLON, DATE, EOFILE, ID, KEYW, NUM, SEMI, STRING,
X};
X
X#define AT SBEGIN /* class SBEGIN (string begin) is returned by lex. anal. */
X#define SDELIM '@@' /* the actual character is needed for string handling*/
X/* these must be changed consistently, for instance to:
X * #define DQUOTE SBEGIN
X * #define SDELIM '"'
X * #define AT IDCHAR
X * there should be no overlap among SDELIM, KDELIM, and VDELIM
X */
X
X/* other characters */
X
X#define ACCENT IDCHAR
X#define AMPER IDCHAR
X#define BACKSL IDCHAR
X#define BAR IDCHAR
X#define COMMA UNKN
X#define DIVIDE IDCHAR
X#define DOLLAR UNKN /* overlap with KDELIM */
X#define DQUOTE IDCHAR
X#define EQUAL IDCHAR
X#define EXCLA IDCHAR
X#define GREAT IDCHAR
X#define HASH IDCHAR
X#define INSERT UNKN
X#define LBRACE IDCHAR
X#define LBRACK IDCHAR
X#define LESS IDCHAR
X#define LPARN IDCHAR
X#define MINUS IDCHAR
X#define PERCNT IDCHAR
X#define PLUS IDCHAR
X#define QUEST IDCHAR
X#define RBRACE IDCHAR
X#define RBRACK IDCHAR
X#define RPARN IDCHAR
X#define SQUOTE IDCHAR
X#define TILDE IDCHAR
X#define TIMES IDCHAR
X#define UNDER IDCHAR
X#define UPARR IDCHAR
X
X
X
X
X/***************************************
X * Data structures for the symbol table
X ***************************************/
X
X
X/* Hash table entry */
Xstruct hshentry {
X char * num; /* pointer to revision number (ASCIZ) */
X char * date; /* pointer to date of checking */
X char * author; /* login of person checking in */
X char * lockedby; /* who locks the revision */
X char * log; /* log message requested at checkin */
X char * state; /* state of revision (Exp by default) */
X struct branchhead * branches; /* list of first revisions on branches*/
X struct hshentry * next; /* next revision on same branch */
X int insertlns;/* lines inserted (computed by rlog) */
X int deletelns;/* lines deleted (computed by rlog) */
X char selector; /* marks entry for selection/deletion */
X};
X
X/* list element for branch lists */
Xstruct branchhead {
X struct hshentry * hsh;
X struct branchhead * nextbranch;
X};
X
X/* accesslist element */
Xstruct access {
X char * login;
X struct access * nextaccess;
X};
X
X/* list element for locks */
Xstruct lock {
X char * login;
X struct hshentry * delta;
X struct lock * nextlock;
X};
X
X/* list element for symbolic names */
Xstruct assoc {
X char * symbol;
X struct hshentry * delta;
X struct assoc * nextassoc;
X};
X
X
X/* common variables (getadmin and getdelta())*/
Xextern char * Comment;
Xextern struct access * AccessList;
Xextern struct assoc * Symbols;
Xextern struct lock * Locks;
Xextern struct hshentry * Head;
Xextern struct hshentry * Dbranch;
Xextern int StrictLocks;
Xextern int TotalDeltas;
X#ifndef lint
Xstatic char copyright[]="Copyright (C) 1982 by Walter F. Tichy";
X#endif
X
X/* common variables (lexical analyzer)*/
Xextern enum tokens map[];
X#define ctab (&map[1])
Xextern enum tokens nexttok;
Xextern int hshenter;
Xextern char * NextString;
Xextern char * cmdid;
X
X#if defined(USG) || defined(V4_2BSD)
X#define VOID (void)
X#else
Xtypedef int void;
X#define VOID
X#endif
X
X/* common routines */
Xextern char *talloc();
Xextern int serror();
Xextern int faterror();
Xextern int fatserror();
Xextern void ignoreints();
Xextern void catchints();
Xextern void restoreints();
X
X#ifdef USG
Xextern int sprintf();
X#endif
X
X/*
X * Markers for keyword expansion (used in co and ident)
X */
X#define AUTHOR "Author"
X#define DATE "Date"
X#define HEADER "Header"
X#define IDH "Id"
X#define LOCKER "Locker"
X#define LOG "Log"
X#define RCSFILE "RCSfile"
X#define REVISION "Revision"
X#define SOURCE "Source"
X#define STATE "State"
X
Xenum markers { Nomatch, Author, Date, Header, Id,
X Locker, Log, RCSfile, Revision, Source, State };
X
X#define DELNUMFORM "\n\n%s\n%s\n"
X/* used by putdtext and scanlogtext */
X#define DELETE 'D'
X/* set by rcs -o and used by puttree() in rcssyn */
X
X@
X
X
X4.9.2.1
Xlog
X@Start of Amiga RCS port branch.
X@
Xtext
X@d5 1
Xa5 2
X<<<<<<< rcsbase.h
X#define RCSBASE "$Id: rcsbase.h,v 4.9.1.1 89/08/11 01:42:12 rsbx Exp Locker: rsbx $"
Xa33 3
X=======
X#define RCSBASE "$Id: rcsbase.h,v 1.3 89/09/17 09:54:06 rick Exp $"
X>>>>>>> 1.3
Xa54 9
X<<<<<<< rcsbase.h
X * Revision 4.9.1.1 89/08/11 01:42:12 rsbx
X * Start of cbmvax RCS source branch.
X=======
X * Revision 1.3 89/09/17 09:54:06 rick
X * Change back to original
X>>>>>>> 1.3
X *
X<<<<<<< rcsbase.h
Xa55 3
X * checked in with -k by rsbx at 89.08.10.16.06.59.
X *
X * Revision 4.9 89/05/01 15:17:14 narten
Xa69 5
X=======
X * Revision 1.2 88/09/03 15:14:12 rick
X * Port to AmigaDos. All done with conditional compiles
X *
X>>>>>>> 1.3
Xa129 1
X<<<<<<< rcsbase.h
Xa134 3
X=======
X#ifndef AMIGA
X>>>>>>> 1.3
Xa135 1
X#endif
Xd137 1
Xa137 4
X#ifdef AMIGA
X# define rindex strrchr
X# define DATEFORM "%02d.%02d.%02d.%02d.%02d.%02d"
X#else
Xa143 1
X#endif
Xa182 4
X#ifdef AMIGA
X# define NCPFN 256 /* number of characters per filename */
X# define NCPPN 1024 /* number of characters per pathname */
X#else
Xa189 1
X#endif
Xd213 1
Xa213 1
X#ifndef AMIGA
Xa215 1
X#endif
X@
X
X
X4.9.2.2
Xlog
X@Finished the integration of Rick Schaeffer's RCS Amiga port with the RCS
Xsources I have here (and are later than the ones Rick used).
X@
Xtext
X@d5 2
Xa6 1
X#define RCSBASE "$Id: rcsbase.h,v 4.9.2.1 89/10/13 19:16:35 rsbx Exp Locker: rsbx $"
Xd35 3
Xd59 1
Xa59 3
X * Revision 4.9.2.1 89/10/13 19:16:35 rsbx
X * Start of Amiga RCS port branch.
X *
Xd62 4
Xd67 1
Xd86 5
Xd151 2
Xa152 1
X#if defined(USG) || defined(AMIGA)
Xd157 1
Xd159 1
Xd380 1
Xa380 1
X#if defined(USG) || defined(V4_2BSD) || defined (AMIGA)
X@
X
X
X4.9.2.3
Xlog
X@Changed file path handling to deal with Amiga file path sematics.
X@
Xtext
X@d5 1
Xa5 1
X#define RCSBASE "$Id: rcsbase.h,v 4.9.2.2 89/10/15 15:43:52 rsbx Exp $"
Xa54 4
X * Revision 4.9.2.2 89/10/15 15:43:52 rsbx
X * Finished the integration of Rick Schaeffer's RCS Amiga port with the RCS
X * sources I have here (and are later than the ones Rick used).
X *
Xa149 1
X# define index strchr
X@
X
X
X4.9.2.4
Xlog
X@Changes to make the delete bit to track the write bit. Made protection
Xbit manipulation less insane.
X@
Xtext
X@d5 1
Xa5 1
X#define RCSBASE "$Id: rcsbase.h,v 4.9.2.3 89/10/16 19:07:02 rsbx Exp $"
Xa54 3
X * Revision 4.9.2.3 89/10/16 19:07:02 rsbx
X * Changed file path handling to deal with Amiga file path sematics.
X *
Xd230 7
Xa236 7
X#define NEWRCSFILE ",RCSnewXXXXXXXX"
X#define DIFFILE ",RCSciXXXXXXXX"
X#define TMPFILE1 ",RCSt1XXXXXXXX"
X#define TMPFILE2 ",RCSt2XXXXXXXX"
X#define TMPFILE3 ",RCSt3XXXXXXXX"
X#define JOINFIL2 ",RCSj2XXXXXXXX"
X#define JOINFIL3 ",RCSj3XXXXXXXX"
Xa246 3
X#ifdef AMIGA
X#define WORKMODE(RCSmode) (RCSmode&~(S_IWRITE|S_IDELETE))|((lockflag||!StrictLocks)?S_IWRITE|S_IREAD|S_IDELETE:0)
X#else
Xa247 1
X#endif
X@
X
X
X4.9.1.1
Xlog
X@Start of cbmvax RCS source branch.
X@
Xtext
X@a55 3
X * checked in with -k by rsbx at 89.08.10.16.06.59.
X *
X * Revision 4.9 89/05/01 15:17:14 narten
X@
SHAR_EOF
echo "extracting rcs/rcs.rcsfiles/rcsdiff.c,v"
sed 's/^X//' << \SHAR_EOF > rcs/rcs.rcsfiles/rcsdiff.c,v
Xhead 4.6;
Xbranch 4.6.2;
Xaccess ;
Xsymbols amiga_rcs:4.6.2 cbmvax_source:4.6.1 uunet_june89_dist:4.6;
Xlocks ; strict;
Xcomment @ * @;
X
X
X4.6
Xdate 89.05.01.15.12.27; author narten; state Exp;
Xbranches 4.6.1.1 4.6.2.1;
Xnext ;
X
X4.6.1.1
Xdate 89.08.11.01.42.22; author rsbx; state Exp;
Xbranches ;
Xnext ;
X
X4.6.2.1
Xdate 89.10.13.19.18.20; author rsbx; state Exp;
Xbranches ;
Xnext 4.6.2.2;
X
X4.6.2.2
Xdate 89.10.15.15.44.03; author rsbx; state Exp;
Xbranches ;
Xnext 4.6.2.3;
X
X4.6.2.3
Xdate 89.11.12.15.07.26; author rsbx; state Exp;
Xbranches ;
Xnext ;
X
X
Xdesc
X@RCS rcsdiff operation.
X@
X
X
X
X4.6
Xlog
X@checked in with -k by rsbx at 89.08.10.16.19.11.
X@
Xtext
X@/*
X * RCS rcsdiff operation
X */
X#ifndef lint
Xstatic char rcsid[]=
X"$Header: /usr/src/local/bin/rcs/src/RCS/rcsdiff.c,v 4.6 89/05/01 15:12:27 narten Exp $ Purdue CS";
X#endif
X/*****************************************************************************
X * generate difference between RCS revisions
X *****************************************************************************
X */
X
X/* Copyright (C) 1982, 1988, 1989 Walter Tichy
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms are permitted
X * provided that the above copyright notice and this paragraph are
X * duplicated in all such forms and that any documentation,
X * advertising materials, and other materials related to such
X * distribution and use acknowledge that the software was developed
X * by Walter Tichy.
X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
X * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
X *
X * Report all problems and direct all questions to:
X * rcs-bugs@@cs.purdue.edu
X *
X
X
X
X
X
X
X
X*/
X
X
X
X
X/* $Log: rcsdiff.c,v $
X * Revision 4.6 89/05/01 15:12:27 narten
X * changed copyright header to reflect current distribution rules
X *
X * Revision 4.5 88/11/08 12:01:51 narten
X * changes from eggert@@sm.unisys.com (Paul Eggert)
X *
X * Revision 4.5 88/08/09 19:12:41 eggert
X * Use execv(), not system(); yield exit status like diff(1)s; allow cc -R.
X *
X * Revision 4.4 87/12/18 11:37:46 narten
X * changes Jay Lepreau made in the 4.3 BSD version, to add support for
X * "-i", "-w", and "-t" flags and to permit flags to be bundled together,
X * merged in.
X *
X * Revision 4.3 87/10/18 10:31:42 narten
X * Updating version numbers. Changes relative to 1.1 actually
X * relative to 4.1
X *
X * Revision 1.3 87/09/24 13:59:21 narten
X * Sources now pass through lint (if you ignore printf/sprintf/fprintf
X * warnings)
X *
X * Revision 1.2 87/03/27 14:22:15 jenkins
X * Port to suns
X *
X * Revision 1.1 84/01/23 14:50:18 kcs
X * Initial revision
X *
X * Revision 4.1 83/05/03 22:13:19 wft
X * Added default branch, option -q, exit status like diff.
X * Added fterror() to replace faterror().
X *
X * Revision 3.6 83/01/15 17:52:40 wft
X * Expanded mainprogram to handle multiple RCS files.
X *
X * Revision 3.5 83/01/06 09:33:45 wft
X * Fixed passing of -c (context) option to diff.
X *
X * Revision 3.4 82/12/24 15:28:38 wft
X * Added call to catchsig().
X *
X * Revision 3.3 82/12/10 16:08:17 wft
X * Corrected checking of return code from diff; improved error msgs.
X *
X * Revision 3.2 82/12/04 13:20:09 wft
X * replaced getdelta() with gettree(). Changed diagnostics.
X *
X * Revision 3.1 82/11/28 19:25:04 wft
X * Initial revision.
X *
X */
X#include <ctype.h>
X#include "rcsbase.h"
X#define ERRCODE 2 /*error code for exit status */
Xextern char *rindex();
X#ifndef lint
Xstatic char rcsbaseid[] = RCSBASE;
X#endif
Xstatic char co[] = CO;
X
Xextern int cleanup(); /* cleanup after signals */
Xextern char * mktempfile(); /*temporary file name generator */
Xextern int fterror(); /*forward for special fatal error func. */
Xextern struct hshentry * genrevs(); /*generate delta numbers */
Xextern int nerror; /*counter for errors */
Xextern int quietflag; /*suppresses diagnostics */
Xextern FILE * finptr; /* RCS input file */
X
Xchar *RCSfilename;
Xchar *workfilename;
Xchar * temp1file, * temp2file;
X
Xchar bops[10];
Xchar otherops[10];
X
Xmain (argc, argv)
Xint argc; char **argv;
X{
X char * cmdusage;
X char commarg[revlength+3];
X int revnums; /* counter for revision numbers given */
X char * rev1, * rev2; /* revision numbers from command line */
X char numericrev[revlength]; /* holds expanded revision number */
X char * xrev1, * xrev2; /* expanded revision numbers */
X struct hshentry * gendeltas[hshsize];/*stores deltas to be generated*/
X struct hshentry * target;
X char * boption, * otheroption;
X int exit_stats;
X int diffs_found;
X char *argp;
X register c;
X
X catchints();
X otheroption = otherops + 2;
X boption = bops + 2;
X cmdid = "rcsdiff";
X cmdusage = "command format:\n rcsdiff [-biwt] [-q] [-cefhn] [-rrev1] [-rrev2] file";
X diffs_found=revnums=0;
X while (--argc,++argv, argc>=1 && ((*argv)[0] == '-')) {
X argp = &((*argv)[1]);
X while (c = *argp++) switch (c) {
X case 'r':
X if (*argp!='\0') {
X if (revnums==0) {
X rev1= argp; revnums=1;
X } elif (revnums==1) {
X rev2= argp; revnums=2;
X } else {
X fterror("too many revision numbers");
X }
X } /* do nothing for empty -r */
X argp += strlen(argp);
X break;
X case 'b':
X case 'i':
X case 'w':
X case 't':
X if (!rindex(bops + 2, c))
X *boption++ = c;
X break;
X case 'q':
X quietflag=true;
X break;
X case 'c':
X case 'e':
X case 'f':
X case 'h':
X case 'n':
X if (otheroption == otherops + 2) {
X *otheroption++ = c;
X if (c == 'c' && isdigit(*argp)) {
X while (isdigit(*argp) && otheroption < otherops+sizeof(otherops)-1)
X *otheroption++ = *argp++;
X if (*argp)
X faterror("-c: bad count");
X argp = "";
X }
X } else {
X fterror("Options c,e,f,h,n are mutually exclusive");
X }
X break;
X default:
X fterror("unknown option: %s\n%s", *argv,cmdusage);
X };
X } /* end of option processing */
X
X if (boption != bops + 2) {
X bops[0] = ' ';
X bops[1] = '-';
X boption = bops;
X }
X if (otheroption != otherops + 2) {
X otherops[0] = ' ';
X otherops[1] = '-';
X otheroption = otherops;
X }
X if (argc<1) fterror("No input file\n%s",cmdusage);
X
X /* now handle all filenames */
X do {
X finptr=NULL;
X
X if (pairfilenames(argc,argv,true,false)!=1) continue;
X diagnose("===================================================================");
X diagnose("RCS file: %s",RCSfilename);
X if (revnums<2 && !(access(workfilename,4)==0)) {
X error("Can't open %s",workfilename);
X continue;
X }
X if (!trysema(RCSfilename,false)) continue; /* give up */
X
X
X gettree(); /* reads in the delta tree */
X
X if (Head==nil) {
X error("no revisions present");
X continue;
X }
X if (revnums==0)
X rev1=Dbranch!=nil?Dbranch->num:Head->num; /* default rev1 */
X
X if (!expandsym(rev1,numericrev)) continue;
X if (!(target=genrevs(numericrev,(char *)nil,(char *)nil,(char *)nil,gendeltas))) continue;
X xrev1=target->num;
X
X if (revnums==2) {
X if (!expandsym(rev2,numericrev)) continue;
X if (!(target=genrevs(numericrev,(char *)nil,(char *)nil,(char *)nil,gendeltas))) continue;
X xrev2=target->num;
X }
X
X
X temp1file=mktempfile("/tmp/",TMPFILE1);
X diagnose("retrieving revision %s",xrev1);
X VOID sprintf(commarg,"-p%s",xrev1);
X if (run((char*)nil,temp1file, co,"-q",commarg,RCSfilename,(char*)nil)){
X error("co failed");
X continue;
X }
X if (revnums<=1) {
X temp2file=workfilename;
X diagnose("diff%s%s -r%s %s",boption,otheroption,xrev1,workfilename);
X } else {
X temp2file=mktempfile("/tmp/",TMPFILE2);
X diagnose("retrieving revision %s",xrev2);
X VOID sprintf(commarg,"-p%s",xrev2);
X if (run((char*)nil,temp2file, co,"-q",commarg,RCSfilename,(char *)nil)){
X error("co failed");
X continue;
X }
X diagnose("diff%s%s -r%s -r%s",boption,otheroption,xrev1,xrev2);
X }
X
X exit_stats =
X *boption
X ? *otheroption
X ? run((char*)nil,(char*)nil, DIFF, boption+1, otheroption+1, temp1file,temp2file,(char*)nil)
X : run((char*)nil,(char*)nil, DIFF, boption+1, temp1file,temp2file,(char*)nil)
X : *otheroption
X ? run((char*)nil,(char*)nil, DIFF, otheroption+1, temp1file,temp2file,(char*)nil)
X : run((char*)nil,(char*)nil, DIFF, temp1file,temp2file,(char*)nil);
X
X if (exit_stats == (1 << BYTESIZ))
X diffs_found = 1;
X else if (exit_stats != 0) {
X error ("diff failed");
X continue;
X }
X } while (cleanup(),
X ++argv, --argc >=1);
X
X
X exit(nerror ? ERRCODE : diffs_found);
X}
X
X
X/*VARARGS3*/
Xfterror(e, e1, e2)
Xchar * e, * e1, * e2;
X/* prints error message and terminates program with ERRCODE */
X{ nerror++;
X VOID fprintf(stderr,"%s error: ",cmdid);
X VOID fprintf(stderr,e, e1, e2);
X VOID fprintf(stderr,"\n%s aborted\n",cmdid);
X VOID cleanup();
X exit(ERRCODE);
X}
X
X@
X
X
X4.6.2.1
Xlog
X@Start of Amiga RCS port branch.
X@
Xtext
X@d6 1
Xa6 5
X<<<<<<< rcsdiff.c
X"$Header: /u/softeng/rsbx/rcs/amiga/RCS.cbmvax/rcsdiff.c,v 4.6.1.1 89/08/11 01:42:22 rsbx Exp Locker: rsbx $ Purdue CS";
X=======
X"$Header: /u/softeng/rsbx/rcs/amiga/RCS/rcsdiff.c,v 1.2 89/09/17 13:35:25 rick Exp $ Purdue CS";
X>>>>>>> 1.2
Xa41 11
X<<<<<<< rcsdiff.c
X * Revision 4.6.1.1 89/08/11 01:42:22 rsbx
X * Start of cbmvax RCS source branch.
X=======
X * Revision 1.2 89/09/17 13:35:25 rick
X * Port to AmigaDos done by Rick Schaeffer (ricks@@iscuva.iscs.com)
X * All changes done with conditional compile (#ifdef AMIGA). This version
X * compiles correctly with Lattice C version 5.02 or later.
X>>>>>>> 1.2
X *
X<<<<<<< rcsdiff.c
Xa42 3
X * checked in with -k by rsbx at 89.08.10.16.19.11.
X *
X * Revision 4.6 89/05/01 15:12:27 narten
Xa50 8
X=======
X * Revision 1.3 89/09/10 09:27:39 rick
X * Moved TARGETDIR to rcs:
X *
X * Revision 1.2 88/09/03 15:09:44 rick
X * Port to AmigaDos. All done with conditional compiles
X *
X>>>>>>> 1.2
Xa101 6
X#ifdef AMIGA
X#define DTMPFILE1 ",RDFt1XXXXXX"
X#define DTMPFILE2 ",RDFt2XXXXXX"
X#define DTMPFILE3 ",RDFt3XXXXXX"
X#endif
X
Xa233 3
X#ifdef AMIGA
X temp1file=mktempfile("t:",DTMPFILE1);
X#else
Xa234 1
X#endif
Xa235 1
X<<<<<<< rcsdiff.c
Xa237 5
X=======
X VOID sprintf(command,"%sco -q -p%s %s >%s\n",
X TARGETDIR,xrev1,RCSfilename,temp1file);
X if (system(command)){
X>>>>>>> 1.2
Xa244 3
X#ifdef AMIGA
X temp2file=mktempfile("t:",DTMPFILE2);
X#else
Xa245 1
X#endif
Xa246 1
X<<<<<<< rcsdiff.c
Xa248 5
X=======
X VOID sprintf(command,"%sco -q -p%s %s >%s\n",
X TARGETDIR,xrev2,RCSfilename,temp2file);
X if (system(command)){
X>>>>>>> 1.2
X@
X
X
X4.6.2.2
Xlog
X@Finished the integration of Rick Schaeffer's RCS Amiga port with the RCS
Xsources I have here (and are later than the ones Rick used).
X@
Xtext
X@d6 5
Xa10 1
X"$Header: /u/softeng/rsbx/rcs/amiga/RCS/rcsdiff.c,v 4.6.2.1 89/10/13 19:18:20 rsbx Exp Locker: rsbx $ Purdue CS";
Xd46 1
Xa46 3
X * Revision 4.6.2.1 89/10/13 19:18:20 rsbx
X * Start of Amiga RCS port branch.
X *
Xd49 6
Xd56 1
Xd69 8
Xd272 1
Xd275 5
Xd293 1
Xd296 5
X@
X
X
X4.6.2.3
Xlog
X@WaitChild() on the Amiga returns the completion code from a child process
Xwithout shifting it up 8 bits like the Unix wait() does.
X@
Xtext
X@d6 1
Xa6 1
X"$Header: /u/softeng/rsbx/rcs/amiga/RCS/rcsdiff.c,v 4.6.2.2 89/10/15 15:44:03 rsbx Exp $ Purdue CS";
Xa41 4
X * Revision 4.6.2.2 89/10/15 15:44:03 rsbx
X * Finished the integration of Rick Schaeffer's RCS Amiga port with the RCS
X * sources I have here (and are later than the ones Rick used).
X *
Xa286 3
X#ifdef AMIGA
X if (exit_stats == 1)
X#else
Xa287 1
X#endif
X@
X
X
X4.6.1.1
Xlog
X@Start of cbmvax RCS source branch.
X@
Xtext
X@d6 1
Xa6 1
X"$Header: /u/softeng/rsbx/rcs/rcs.uunet/src/RCS/rcsdiff.c,v 4.6 89/05/01 15:12:27 narten Exp $ Purdue CS";
Xa41 3
X * Revision 4.6 89/05/01 15:12:27 narten
X * checked in with -k by rsbx at 89.08.10.16.19.11.
X *
X@
SHAR_EOF
echo "extracting rcs/rcs.rcsfiles/rcsclean.c,v"
sed 's/^X//' << \SHAR_EOF > rcs/rcs.rcsfiles/rcsclean.c,v
Xhead 4.4;
Xbranch 4.4.2;
Xaccess ;
Xsymbols amiga_rcs:4.4.2 cbmvax_source:4.4.1 uunet_june89_dist:4.4;
Xlocks ; strict;
Xcomment @ * @;
X
X
X4.4
Xdate 89.05.01.15.12.21; author narten; state Exp;
Xbranches 4.4.1.1 4.4.2.1;
Xnext ;
X
X4.4.1.1
Xdate 89.08.11.01.42.15; author rsbx; state Exp;
Xbranches ;
Xnext ;
X
X4.4.2.1
Xdate 89.10.13.19.18.16; author rsbx; state Exp;
Xbranches ;
Xnext 4.4.2.2;
X
X4.4.2.2
Xdate 89.10.15.15.43.57; author rsbx; state Exp;
Xbranches ;
Xnext ;
X
X
Xdesc
X@RCS rcsclean operation.
X@
X
X
X
X4.4
Xlog
X@checked in by rsbx at 89.08.10.16.15.55.
X@
Xtext
X@/*
X * RCS rcsclean operation
X */
X
Xstatic char rcsid[]=
X"$Header $ Purdue CS";
X/*****************************************************************************
X * remove unneded working files
X *****************************************************************************
X */
X
X/* Copyright (C) 1982, 1988, 1989 Walter Tichy
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms are permitted
X * provided that the above copyright notice and this paragraph are
X * duplicated in all such forms and that any documentation,
X * advertising materials, and other materials related to such
X * distribution and use acknowledge that the software was developed
X * by Walter Tichy.
X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
X * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
X *
X * Report all problems and direct all questions to:
X * rcs-bugs@@cs.purdue.edu
X *
X
X
X
X
X
X
X
X*/
X
X
X
X
X/* $Log: rcsclean.c,v $
X * Revision 4.4 89/05/01 15:12:21 narten
X * changed copyright header to reflect current distribution rules
X *
X * Revision 4.3 88/11/08 15:59:54 narten
X * removed reference to TARGETDIR
X *
X * Revision 4.2 87/10/18 10:30:43 narten
X * Updating version numbers. Changes relative to 1.1 are actually
X * relative to 4.1
X *
X * Revision 1.2 87/09/24 13:59:13 narten
X * Sources now pass through lint (if you ignore printf/sprintf/fprintf
X * warnings)
X *
X * Revision 1.1 84/01/23 14:50:16 kcs
X * Initial revision
X *
X * Revision 4.1 83/12/15 12:26:18 wft
X * Initial revision.
X *
X */
X#include "rcsbase.h"
X#define ERRCODE 2 /*error code for exit status */
Xstatic char rcsbaseid[] = RCSBASE;
X
Xextern int cleanup(); /* cleanup after signals */
Xextern char * mktempfile(); /*temporary file name generator */
Xextern int fterror(); /*forward for special fatal error func. */
Xextern struct hshentry * genrevs(); /*generate delta numbers */
Xextern int nerror; /*counter for errors */
Xextern int quietflag; /*suppresses diagnostics */
Xextern FILE * finptr; /* RCS input file */
Xextern FILE * fopen();
X
Xchar *RCSfilename;
Xchar *workfilename;
Xchar * tempfile;
XFILE * file1, * file2; /*file descriptors for comparison */
X
Xmain (argc, argv)
Xint argc; char **argv;
X{
X char * cmdusage;
X char command[NCPPN+revlength+40];
X char * rev; /* revision number from command line */
X char numericrev[revlength]; /* holds expanded revision number */
X int revnums; /* number of -r options */
X struct hshentry * gendeltas[hshsize];/*stores deltas to be generated*/
X struct hshentry * target;
X int filecounter;
X register int c1; /* reading input */
X int result; /* result of comparison */
X int pairresult; /* reulst of pairfilenames */
X
X catchints();
X cmdid = "rcsclean";
X cmdusage = "command format:\n rcsclean [-rrev] file";
X filecounter=revnums=0;
X quietflag=true; /* default no diagnostics */
X while (--argc,++argv, argc>=1 && ((*argv)[0] == '-')) {
X switch ((*argv)[1]) {
X case 'r':
X revno: if ((*argv)[2]!='\0') {
X if (revnums==0) {
X rev= *argv+2; revnums=1;
X } else {
X fterror("too many revision numbers");
X }
X } /* do nothing for empty -r */
X break;
X case 'D': /* debug option */
X quietflag = false;
X break;
X
X default:
X fterror("unknown option: %s\n%s", *argv,cmdusage);
X };
X } /* end of option processing */
X
X if (argc<1) fterror("No input file\n%s",cmdusage);
X
X /* now handle all filenames */
X do {
X finptr=NULL;
X pairresult=pairfilenames(argc,argv,false,false);
X
X if (pairresult==0) continue; /* error */
X if (!(access(workfilename,4)==0)) {
X diagnose("Can't open %s",workfilename);
X continue;
X } elsif (pairresult == -1) {
X warn("Can't find RCS file for %s",workfilename);
X continue;
X }
X diagnose("RCS file: %s",RCSfilename);
X if (!trysema(RCSfilename,false)) continue; /* give up */
X
X
X gettree(); /* reads in the delta tree */
X
X if (Head==nil) {
X error("no revisions present");
X continue;
X }
X if (revnums==0)
X rev=(Dbranch!=nil?Dbranch->num:Head->num); /* default rev1 */
X
X if (!expandsym(rev,numericrev)) continue;
X if (!(target=genrevs(numericrev,nil,nil,nil,gendeltas))) continue;
X
X tempfile=mktempfile("/tmp/",TMPFILE1);
X diagnose("retrieving revision %s",target->num);
X VOID sprintf(command,"%s -q -p%s %s > %s\n",
X CO ,target->num,RCSfilename,tempfile);
X if (system(command)){
X error("co failed");
X continue;
X }
X /* now do comparison */
X if ((file1=fopen(tempfile,"r"))==NULL) {
X error("Can't open checked out file %s",tempfile);
X continue;
X }
X if ((file2=fopen(workfilename,"r"))==NULL) {
X error("Can't open %s",workfilename);
X continue;
X }
X result=1;
X while ((c1=getc(file1))==getc(file2)) {
X if (c1==EOF) {
X /* identical files; can remove working file */
X result=0;
X diagnose("files identical; %s removed",workfilename);
X if (unlink(workfilename)!=0) {
X error("Can't unlink %s",workfilename);
X }
X break;
X }
X }
X fclose(file1); fclose(file2);
X
X if (result==1) diagnose ("files different");
X
X
X } while (cleanup(),
X ++argv, --argc >=1);
X
X
X if (nerror>0) {
X exit(ERRCODE);
X } else {
X exit(result);
X }
X
X}
X
X
Xfterror(e, e1, e2)
Xchar * e, * e1, * e2;
X/* prints error message and terminates program with ERRCODE */
X{ nerror++;
X VOID fprintf(stderr,"%s error: ",cmdid);
X VOID fprintf(stderr,e, e1, e2);
X VOID fprintf(stderr,"\n%s aborted\n",cmdid);
X VOID cleanup();
X exit(ERRCODE);
X}
X
X@
X
X
X4.4.2.1
Xlog
X@Start of Amiga RCS port branch.
X@
Xtext
X@a40 11
X<<<<<<< rcsclean.c
X * Revision 4.4.1.1 89/08/11 01:42:15 rsbx
X * Start of cbmvax RCS source branch.
X=======
X * Revision 1.2 89/09/17 13:35:21 rick
X * Port to AmigaDos done by Rick Schaeffer (ricks@@iscuva.iscs.com)
X * All changes done with conditional compile (#ifdef AMIGA). This version
X * compiles correctly with Lattice C version 5.02 or later.
X>>>>>>> 1.2
X *
X<<<<<<< rcsclean.c
Xa41 3
X * checked in by rsbx at 89.08.10.16.15.55.
X *
X * Revision 4.4 89/05/01 15:12:21 narten
Xa46 8
X=======
X * Revision 1.3 89/09/10 09:27:22 rick
X * Moved TARGETDIR to rcs:
X *
X * Revision 1.2 88/09/03 15:09:35 rick
X * Port to AmigaDos. All done with conditional compiles
X *
X>>>>>>> 1.2
Xa150 3
X#ifdef AMIGA
X tempfile=mktempfile("t:",TMPFILE1);
X#else
Xa151 1
X#endif
Xa152 1
X<<<<<<< rcsclean.c
Xa154 4
X=======
X sprintf(command,"%sco -q -p%s %s >%s\n",
X TARGETDIR,target->num,RCSfilename,tempfile);
X>>>>>>> 1.2
Xa173 1
X fclose(file2); file2 = NULL;
Xd180 1
Xa180 4
X if (file1)
X fclose(file1);
X if (file2)
X fclose(file2);
X@
X
X
X4.4.2.2
Xlog
X@Finished the integration of Rick Schaeffer's RCS Amiga port with the RCS
Xsources I have here (and are later than the ones Rick used).
X@
Xtext
X@d41 1
Xa41 3
X * Revision 4.4.2.1 89/10/13 19:18:16 rsbx
X * Start of Amiga RCS port branch.
X *
Xd44 6
Xd51 1
Xd61 8
Xd179 1
Xd182 4
X@
X
X
X4.4.1.1
Xlog
X@Start of cbmvax RCS source branch.
X@
Xtext
X@a41 3
X * checked in by rsbx at 89.08.10.16.15.55.
X *
X * Revision 4.4 89/05/01 15:12:21 narten
X@
SHAR_EOF
echo "End of archive 8 (of 14)"
# if you want to concatenate archives, remove anything after this line
exit