home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fresh Fish 8
/
FreshFishVol8-CD2.bin
/
bbs
/
gnu
/
rcs-5.6.0.1-src.lha
/
rcs-5.6.0.1
/
src
/
rcs.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-11-22
|
44KB
|
1,555 lines
/*
* RCS create/change operation
*/
/* Copyright (C) 1982, 1988, 1989 Walter Tichy
Copyright 1990, 1991 by Paul Eggert
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
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:
rcs-bugs@cs.purdue.edu
*/
/* $Log: rcs.c,v $
* Revision 5.12 1991/11/20 17:58:08 eggert
* Don't read the delta tree from a nonexistent RCS file.
*
* Revision 5.11 1991/10/07 17:32:46 eggert
* Remove lint.
*
* Revision 5.10 1991/08/19 23:17:54 eggert
* Add -m, -r$, piece tables. Revision separator is `:', not `-'. Tune.
*
* Revision 5.9 1991/04/21 11:58:18 eggert
* Add -x, RCSINIT, MS-DOS support.
*
* Revision 5.8 1991/02/25 07:12:38 eggert
* strsave -> str_save (DG/UX name clash)
* 0444 -> S_IRUSR|S_IRGRP|S_IROTH for portability
*
* Revision 5.7 1990/12/18 17:19:21 eggert
* Fix bug with multiple -n and -N options.
*
* Revision 5.6 1990/12/04 05:18:40 eggert
* Use -I for prompts and -q for diagnostics.
*
* Revision 5.5 1990/11/11 00:06:35 eggert
* Fix `rcs -e' core dump.
*
* Revision 5.4 1990/11/01 05:03:33 eggert
* Add -I and new -t behavior. Permit arbitrary data in logs.
*
* Revision 5.3 1990/10/04 06:30:16 eggert
* Accumulate exit status across files.
*
* Revision 5.2 1990/09/04 08:02:17 eggert
* Standardize yes-or-no procedure.
*
* Revision 5.1 1990/08/29 07:13:51 eggert
* Remove unused setuid support. Clean old log messages too.
*
* Revision 5.0 1990/08/22 08:12:42 eggert
* Don't lose names when applying -a option to multiple files.
* Remove compile-time limits; use malloc instead. Add setuid support.
* Permit dates past 1999/12/31. Make lock and temp files faster and safer.
* Ansify and Posixate. Add -V. Fix umask bug. Make linting easier. Tune.
* Yield proper exit status. Check diff's output.
*
* Revision 4.11 89/05/01 15:12:06 narten
* changed copyright header to reflect current distribution rules
*
* Revision 4.10 88/11/08 16:01:54 narten
* didn't install previous patch correctly
*
* Revision 4.9 88/11/08 13:56:01 narten
* removed include <sysexits.h> (not needed)
* minor fix for -A option
*
* Revision 4.8 88/08/09 19:12:27 eggert
* Don't access freed storage.
* Use execv(), not system(); yield proper exit status; remove lint.
*
* Revision 4.7 87/12/18 11:37:17 narten
* lint cleanups (Guy Harris)
*
* Revision 4.6 87/10/18 10:28:48 narten
* Updating verison numbers. Changes relative to 1.1 are actually
* relative to 4.3
*
* Revision 1.4 87/09/24 13:58:52 narten
* Sources now pass through lint (if you ignore printf/sprintf/fprintf
* warnings)
*
* Revision 1.3 87/03/27 14:21:55 jenkins
* Port to suns
*
* Revision 1.2 85/12/17 13:59:09 albitz
* Changed setstate to rcs_setstate because of conflict with random.o.
*
* Revision 4.3 83/12/15 12:27:33 wft
* rcs -u now breaks most recent lock if it can't find a lock by the caller.
*
* Revision 4.2 83/12/05 10:18:20 wft
* Added conditional compilation for sending mail.
* Alternatives: V4_2BSD, V6, USG, and other.
*
* Revision 4.1 83/05/10 16:43:02 wft
* Simplified breaklock(); added calls to findlock() and getcaller().
* Added option -b (default branch). Updated -s and -w for -b.
* Removed calls to stat(); now done by pairfilenames().
* Replaced most catchints() calls with restoreints().
* Removed check for exit status of delivermail().
* Directed all interactive output to stderr.
*
* Revision 3.9.1.1 83/12/02 22:08:51 wft
* Added conditional compilation for 4.2 sendmail and 4.1 delivermail.
*
* Revision 3.9 83/02/15 15:38:39 wft
* Added call to fastcopy() to copy remainder of RCS file.
*
* Revision 3.8 83/01/18 17:37:51 wft
* Changed sendmail(): now uses delivermail, and asks whether to break the lock.
*
* Revision 3.7 83/01/15 18:04:25 wft
* Removed putree(); replaced with puttree() in rcssyn.c.
* Combined putdellog() and scanlogtext(); deleted putdellog().
* Cleaned up diagnostics and error messages. Fixed problem with
* mutilated files in case of deletions in 2 files in a single command.
* Changed marking of selector from 'D' to DELETE.
*
* Revision 3.6 83/01/14 15:37:31 wft
* Added ignoring of interrupts while new RCS file is renamed;
* Avoids deletion of RCS files by interrupts.
*
* Revision 3.5 82/12/10 21:11:39 wft
* Removed unused variables, fixed checking of return code from diff,
* introduced variant COMPAT2 for skipping Suffix on -A files.
*
* Revision 3.4 82/12/04 13:18:20 wft
* Replaced getdelta() with gettree(), changed breaklock to update
* field lockedby, added some diagnostics.
*
* Revision 3.3 82/12/03 17:08:04 wft
* Replaced getlogin() with getpwuid(), flcose() with ffclose(),
* /usr/ucb/Mail with macro MAIL. Removed handling of Suffix (-x).
* fixed -u for missing revno. Disambiguated structure members.
*
* Revision 3.2 82/10/18 21:05:07 wft
* rcs -i now generates a file mode given by the umask minus write permission;
* otherwise, rcs keeps the mode, but removes write permission.
* I added a check for write error, fixed call to getlogin(), replaced
* curdir() with getfullRCSname(), cleaned up handling -U/L, and changed
* conflicting, long identifiers.
*
* Revision 3.1 82/10/13 16:11:07 wft
* fixed type of variables receiving from getc() (char -> int).
*/
#include "rcsbase.h"
struct Lockrev {
char const *revno;
struct Lockrev * nextrev;
};
struct Symrev {
char const *revno;
char const *ssymbol;
int override;
struct Symrev * nextsym;
};
struct Message {
char const *revno;
struct cbuf message;
struct Message *nextmessage;
};
struct Status {
char const *revno;
char const *status;
struct Status * nextstatus;
};
enum changeaccess {append, erase};
struct chaccess {
char const *login;
enum changeaccess command;
struct chaccess *nextchaccess;
};
struct delrevpair {
char const *strt;
char const *end;
int code;
};
static int buildeltatext P((struct hshentries const*));
static int removerevs P((void));
static int sendmail P((char const*,char const*));
static struct Lockrev *rmnewlocklst P((struct Lockrev const*));
static void breaklock P((struct hshentry const*));
static void buildtree P((void));
static void cleanup P((void));
static void doaccess P((void));
static void doassoc P((void));
static void dolocks P((void));
static void domessages P((void));
static void getaccessor P((char*,enum changeaccess));
static void getassoclst P((int,char*));
static void getchaccess P((char const*,enum changeaccess));
static void getdelrev P((char*));
static void getmessage P((char*));
static void getstates P((char*));
static void rcs_setstate P((char const*,char const*));
static void scanlogtext P((struct hshentry*,int));
static void setlock P((char const*));
static struct buf numrev;
static char const *headstate;
static int chgheadstate, exitstatus, lockhead, unlockcaller;
static struct Lockrev *newlocklst, *rmvlocklst;
static struct Message *messagelst, *lastmessage;
static struct Status *statelst, *laststate;
static struct Symrev *assoclst, *lastassoc;
static struct chaccess *chaccess, **nextchaccess;
static struct delrevpair delrev;
static struct hshentry *cuthead, *cuttail, *delstrt;
static struct hshentries *gendeltas;
mainProg(rcsId, "rcs", "$Id: rcs.c,v 5.12 1991/11/20 17:58:08 eggert Exp $")
{
static char const cmdusage[] =
"\nrcs