page%swap@Sun.COM (Bob Page) (11/19/89)
Submitted-by: rsbx@cbmvax.commodore.com (Raymond S. Brand) Posting-number: Volume 89, Issue 228 Archive-name: unix/rcs.13 # 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/merge.c,v # rcs/rcs.rcsfiles/makefile,v # rcs/rcs.rcsfiles/co.c,v # rcs/rcs.rcsfiles/curdir.c,v # This is archive 13 of a 14-part kit. # This archive created: Sun Nov 19 01:12:13 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/merge.c,v" sed 's/^X//' << \SHAR_EOF > rcs/rcs.rcsfiles/merge.c,v Xhead 1.2; Xbranch 1; Xaccess ; Xsymbols amiga_rcs:1; Xlocks ; strict; Xcomment @ * @; X X X1.2 Xdate 89.11.10.15.24.53; author rsbx; state Exp; Xbranches ; Xnext 1.1; X X1.1 Xdate 89.11.03.20.47.54; author rsbx; state Exp; Xbranches ; Xnext ; X X Xdesc X@C implementation of the "merge.sh" script in the 4.? RCS source Xdistribution. X@ X X X1.2 Xlog X@Sync'd BUFFSIZE with size of fread(). X@ Xtext X@/* X * merge.c X * X * Rick Schaeffer (ricks@@iscuva.iscs.com) X * Raymond S. Brand (rsbx@@cbmvax.commodore.com) X * X * This is a 'c' implementation of the 'merge.sh' scriptin the X * 4.? RCS source distribution X * X */ X X#ifndef lint X static char rcsid[]= X "$Header: /u/softeng/rsbx/rcs/amiga/RCS/merge.c,v 1.1 89/11/03 20:47:54 rsbx Exp Locker: rsbx $"; X#endif X/* X * $Log: merge.c,v $ X * Revision 1.1 89/11/03 20:47:54 rsbx X * Initial revision X * X */ X X#include <stdio.h> X Xextern FILE *popenl(char *, ... ); X X#define BUFFSIZE 256 X Xstatic char buff[BUFFSIZE]; X Xvoid main(int argc, char **argv) X { X FILE *fptr, *pipefp; X char *pswitch; X int overlaps, count; X char *cmd = *argv; X X if (argc < 3) X { X printf("Usage: %s [-p] file1 file2 file3\n", cmd); X exit(1); X } X X if (!strcmp(argv[1], "-p")) X { X pswitch = "1,$p\n"; X argv++; X } X else X { X pswitch = "w\n"; X } X X if (!(fptr = popenl(DIFF3, "-E", argv[1], argv[2], argv[3], NULL, "r"))) X { X fprintf(stderr, "%s: unable to open %s pipe\n", cmd, DIFF3); X exit(1); X } X X if (!(pipefp = popenl(ED, "-", argv[1], NULL, "w"))) X { X pclose(fptr); X fprintf(stderr, "%s: unable to open %s pipe\n", cmd, ED); X exit(1); X } X X while (count = fread(buff, 1, BUFFSIZE, fptr)) X { X fwrite(buff, 1, count, pipefp); X } X X fputs(pswitch, pipefp); X pclose(pipefp); X X if (overlaps = pclose(fptr)) X { X pswitch = ""; X if (overlaps != 1) X { X pswitch = "s"; X } X fprintf(stderr, "Warning: %d overlap%s during merge\n", overlaps, pswitch); X } X } X@ X X X1.1 Xlog X@Initial revision X@ Xtext X@d14 1 Xa14 1 X "$Header$"; Xd17 4 Xa20 1 X * $Log$ Xa26 3 X#ifdef DEBUG X#define BUFFSIZE 32 X#else Xa27 1 X#endif Xd67 1 Xa67 1 X while (count = fread(buff, 1, 256, fptr)) X@ SHAR_EOF echo "extracting rcs/rcs.rcsfiles/makefile,v" sed 's/^X//' << \SHAR_EOF > rcs/rcs.rcsfiles/makefile,v Xhead 1.13; Xbranch 1.13.2; Xaccess ; Xsymbols amiga_rcs:1.13.2 cbmvax_source:1.13.1 uunet_june89_dist:1.13; Xlocks rsbx:1.13.2.4; strict; Xcomment @# @; X X X1.13 Xdate 89.05.02.14.53.40; author narten; state Exp; Xbranches 1.13.1.1 1.13.2.1; Xnext ; X X1.13.1.1 Xdate 89.08.11.01.41.03; author rsbx; state Exp; Xbranches ; Xnext 1.13.1.2; X X1.13.1.2 Xdate 89.08.11.02.15.34; author rsbx; state Exp; Xbranches ; Xnext ; X X1.13.2.1 Xdate 89.10.13.19.16.09; author rsbx; state Exp; Xbranches ; Xnext 1.13.2.2; X X1.13.2.2 Xdate 89.10.15.15.38.02; author rsbx; state Exp; Xbranches ; Xnext 1.13.2.3; X X1.13.2.3 Xdate 89.11.03.20.53.51; author rsbx; state Exp; Xbranches ; Xnext 1.13.2.4; X X1.13.2.4 Xdate 89.11.05.18.05.11; author rsbx; state Exp; Xbranches ; Xnext ; X X Xdesc X@Makefile for RCS distribution. X@ X X X1.13 Xlog X@checked in with -k by rsbx at 89.08.10.16.00.19. X@ Xtext X@#$Header: /usr/src/local/bin/rcs/src/RCS/Makefile,v 1.13 89/05/02 14:53:40 narten Exp $ 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# INSTRUCTIONS X# ============ X# 0. If you are porting to different hardware, X# check the instructions in rcsbase.h X# X# Note: instructions 1-5 are normally taken care of by the calling make, X# which passes in DIFF, DIFF3, RCSDIR, OLDDIR, OS, and LOCKING. X# X# 1. Early version of diff did not support options needed by RCS. X# Newer versions of diff, support them and diff is no longer distributed with X# RCS. The following definitions apply only if you have both old versions X# and new versions of diff, and you want RCS to use the new versions. X# The default should be : X# X XDIFF = /bin/diff XDIFF3 = /usr/lib/diff3 X X# 2. Figure out where to put the RCS commands; define RCSDIR accordingly. X XRCSDIR = /usr/local/bin X X X# 3. Figure out where to put your old RCS commands; define OLDDIR X# accordingly. This is not needed if you don't have an old release of RCS. XOLDDIR = /usr/old/bin X X# 4. Set the operating system variable OS. If you run on 4.1 BSD, do not X# define OS: X# OS = X# If you run on USG Unix or UN*X, use: X# OS = -DUSG X# If you run on Version 6 Unix, use: X# OS = -DV6 X# If you run on 4.2 or 4.3 BSD, use: X# OS = -DV4_2BSD XOS = -DV4_2BSD X X# Also, set SIGNAL_TYPE to be what your signal() handlers yield. X# Old-fashioned signal handlers yield 'int'; the newer ones 'void'. X XSIGNAL_TYPE = int X X# 5. Decide whether you want strict locking as the default or not. X# If you want strict locking, use: X# LOCKING = 1 X# otherwise: X# LOCKING = 0 XLOCKING = 1 X X# 6. Decide what loader flags you need, and define LDFLAGS accordingly. X# On the Vax you need none, on PDP-11s with split i/d you need -i. X#LDFLAGS = -i XLDFLAGS = X X# 7. RCS can maintain a log of the use of the co and ci commands. If you X# want the logging, you must X# a) define SNOOP (that's where the process that writes the log goes), X# b) define SNOOPFILE (that's the file where SNOOP writes the log; X# it must be owned by the same user that owns SNOOP), X# c) include SNOOP and SNOOPFILE in the CFLAGS macro. X# If you don't want the logging of command usage, omit the SNOOP and X# SNOOPFILE definitions from CFLAGS. X# The two variants of the CFLAG macros are given below. XSNOOPFILE = /usr/log/rcslog/log XSNOOP = /usr/local/bin/snoop X XDEFINES= -DCOMPAT2 $(OS) -DSIGNAL_TYPE=$(SIGNAL_TYPE) -DSTRICT_LOCKING=$(LOCKING) -DDIFF='"$(DIFF)"' -DCO='"${RCSDIR}/co"' -DMERGE='"${RCSDIR}/merge"' XCFLAGS = -O $(DEFINES) XLINTFLAGS = -c -u XLINT = lint $(LINTFLAGS) -Dlint $(DEFINES) X X# 8. If you don't have release 2 RCS files around (e.g., if you don't X# have release 2 of RCS), remove the word -DCOMPAT2 from whatever X# variant of CFLAGS you selected. -DCOMPAT2 assures that release 2 X# RCS files can still be read. (After all release 2 RCS files have X# been updated with release 3 or 4 ci or rcs, you can remake RCS without X# -DCOMPAT2.) Also, make sure that the co commands at the end of this X# file are commented out; otherwise, Make will complain. X# X# 9. Now you are ready. Try to make 'depend' and 'all'. If all went well, make X# 'install' if you want no logging of command usage, 'installog' otherwise. X# X# 10. IMPORTANT! When you have RCS installed, rename old X# release 2 RCS files as follows (if you have any): X# If the working file was "f.c" and the RCS file "f.c.v", rename the X# RCS file to "f.c,v". If the working file was "f.c" and the RCS file X# "f.v", rename the RCS file "f.c,v". Thus, suffixes are no longer X# dropped and RCS files end in ",v" rather than ".v". X# X# 11. If you want to maintain RCS with itself, be sure you preserve the X# original revision numbers, dates, etc. This is done by checking the X# files in with the -k option. When done, remove the comments from the X# co-rules at the end of this file. X# XBCOMMANDS = ci ident rcs rcsdiff rcsmerge rlog co X# binary comands X XRCSCOMMANDS = merge $(BCOMMANDS) X# all commands X XBOBJECTS = ci.o co.o ident.o rcs.o rcsdiff.o rcsedit.o\ X rcsfcmp.o rcsfnms.o rcsgen.o rcskeep.o rcskeys.o rcslex.o rcsmerge.o\ X rcsrev.o rcssyn.o rcsutil.o rlog.o snoop.o\ X rcssynTST.o rcsrevTST.o rcsfnmsTST.o rcsfcmpTST.o rcskeepTST.o X Xall: $(RCSCOMMANDS) X XINSTALL = install X X$(BOBJECTS): rcsbase.h X Xpartime.o maketime.o co.o ci.o rcs.o rlog.o rcsutil.o: time.h X Xinstall: all X# Save the old commands if you have any. X# -cd ${RCSDIR}; mv $(RCSCOMMANDS) ${RCSDIR}$(OLDDIR) X ${INSTALL} -m 775 -o root -s ci ${RCSDIR} X ${INSTALL} -m 775 -o root -s ident ${RCSDIR} X ${INSTALL} -m 775 -o root -s rcs ${RCSDIR} X ${INSTALL} -m 775 -o root -s rcsdiff ${RCSDIR} X ${INSTALL} -m 775 -o root -s rcsmerge ${RCSDIR} X ${INSTALL} -m 775 -o root -s rlog ${RCSDIR} X ${INSTALL} -m 775 -o root -s co ${RCSDIR} X ${INSTALL} -m 775 -o root -c merge ${RCSDIR} X# ${INSTALL} -m 775 -o root -c rcsclean ${RCSDIR} X# ${INSTALL} -m 775 -o root -c rcsfreeze.sh ${RCSDIR}/rcsfreeze X Xinstallog: installsnoop install X Xinstallsnoop: snoop X install -s snoop ${RCSDIR}$(SNOOP) X chmod u+s ${RCSDIR}$(SNOOP) X touch ${RCSDIR}$(SNOOPFILE) X chmod 644 ${RCSDIR}$(SNOOPFILE) X# CAUTION: You may have to do a chown of SNOOP and SNOOPFILE (if not owned by root). Xlint: ci.lint co.lint ident.lint rlog.lint rcs.lint rcsdiff.lint rcsmerge.lint snoop.lint X Xclean: X -rm -f *.o; rm -f $(RCSCOMMANDS) snoop X XCIFILES = ci.o rcslex.o rcssyn.o rcsgen.o rcsedit.o rcskeys.o rcsrev.o rcsutil.o rcsfnms.o partime.o maketime.o rcskeep.o rcsfcmp.o X XCISRC = ci.c rcslex.c rcssyn.c rcsgen.c rcsedit.c rcskeys.c rcsrev.c rcsutil.c rcsfnms.c partime.c maketime.c rcskeep.c rcsfcmp.c X Xci.lint: X $(LINT) $(CISRC) X Xci: $(CIFILES) X ${CC} $(LDFLAGS) -o ci $(CIFILES) X XCOFILES = co.o rcslex.o rcssyn.o rcsgen.o rcsedit.o rcskeys.o rcsrev.o rcsutil.o rcsfnms.o partime.o maketime.o X XCOSRC = co.c rcslex.c rcssyn.c rcsgen.c rcsedit.c rcskeys.c rcsrev.c rcsutil.c rcsfnms.c partime.c maketime.c Xco.lint: X $(LINT) $(COSRC) Xco: $(COFILES) X ${CC} $(LDFLAGS) -o co $(COFILES) X Xident: ident.o rcskeys.o X ${CC} $(LDFLAGS) -o ident ident.o rcskeys.o X Xident.lint: X $(LINT) ident.c rcskeys.c X Xmerge: merge.sh X sed -e '/^#/d' \ X -e 's:DIFF=.*$$:DIFF=$(DIFF):' \ X -e 's:DIFF3=.*$$:DIFF3=$(DIFF3):' \ X merge.sh > merge X# This takes out the comment lines and substitutes in DIFF and DIFF3. X# (Comments are not permitted in some older shells.) X chmod 755 merge X XRLOG = rlog.o rcslex.o rcssyn.o rcsrev.o rcsutil.o partime.o maketime.o rcsfnms.o XRLOGSRC = rlog.c rcslex.c rcssyn.c rcsrev.c rcsutil.c partime.c maketime.c rcsfnms.c Xrlog: $(RLOG) X ${CC} $(LDFLAGS) -o rlog $(RLOG) X Xrlog.lint: X $(LINT) $(RLOGSRC) X XRCS = rcs.o rcslex.o rcssyn.o rcsrev.o rcsutil.o rcsgen.o rcsedit.o rcskeys.o rcsfnms.o X XRCSSRC = rcs.c rcslex.c rcssyn.c rcsrev.c rcsutil.c rcsgen.c rcsedit.c rcskeys.c rcsfnms.c Xrcs: $(RCS) X ${CC} $(LDFLAGS) -o rcs $(RCS) X Xrcs.lint: X $(LINT) $(RCSSRC) X Xrcsclean: rcsclean.sh X sed -e '/^#/d' rcsclean.sh > rcsclean X# This takes out the comments (not permitted in older shells). X chmod 755 rcsclean X XRCSDIFF = rcsdiff.o rcsutil.o rcsfnms.o rcsrev.o rcssyn.o rcslex.o XRCSDIFFSRC = rcsdiff.c rcsutil.c rcsfnms.c rcsrev.c rcssyn.c rcslex.c X Xrcsdiff: $(RCSDIFF) X ${CC} ${LDFLAGS} -o rcsdiff $(RCSDIFF) X Xrcsdiff.lint: X $(LINT) $(RCSDIFFSRC) XRCSMERGE = rcsmerge.o rcsutil.o rcsfnms.o rcsrev.o rcssyn.o rcslex.o XRCSMERGESRC = rcsmerge.c rcsutil.c rcsfnms.c rcsrev.c rcssyn.c rcslex.c Xrcsmerge: $(RCSMERGE) X ${CC} ${LDFLAGS} -o rcsmerge $(RCSMERGE) Xrcsmerge.lint: X $(LINT) $(RCSMERGESRC) X Xsnoop: snoop.o X ${CC} ${LDFLAGS} -o snoop snoop.o Xsnoop.lint: X $(LINT) snoop.c X XSOURCE= ci.c co.c curdir.c ident.c maketime.c partime.c rcs.c \ X rcsclean.c rcsdiff.c rcsedit.c rcsfcmp.c rcsfnms.c rcsgen.c \ X rcskeep.c rcskeys.c rcslex.c rcsmerge.c rcsrev.c rcssyn.c rcsutil.c \ X rlog.c snoop.c X XHFILES= rcsbase.h time.h X Xdepend: ${SOURCE} ${HFILES} X (sed '/^# DO NOT DELETE THIS LINE/q' Makefile && \ X cc -M ${CFLAGS} ${SOURCE} | sed 's/\.\///; /\//d' \ X ) >Makefile.new X cp Makefile Makefile.bak X cp Makefile.new Makefile X rm -f Makefile.new X X X# DO NOT DELETE THIS LINE - Xci.o: ci.c Xci.o: rcsbase.h Xci.o: time.h Xco.o: co.c Xco.o: rcsbase.h Xco.o: time.h Xcurdir.o: curdir.c Xcurdir.o: rcsbase.h Xident.o: ident.c Xident.o: rcsbase.h Xmaketime.o: maketime.c Xmaketime.o: rcsbase.h Xmaketime.o: time.h Xpartime.o: partime.c Xpartime.o: time.h Xrcs.o: rcs.c Xrcs.o: rcsbase.h Xrcsclean.o: rcsclean.c Xrcsclean.o: rcsbase.h Xrcsdiff.o: rcsdiff.c Xrcsdiff.o: rcsbase.h Xrcsedit.o: rcsedit.c Xrcsedit.o: rcsbase.h Xrcsfcmp.o: rcsfcmp.c Xrcsfcmp.o: rcsbase.h Xrcsfnms.o: rcsfnms.c Xrcsfnms.o: rcsbase.h Xrcsgen.o: rcsgen.c Xrcsgen.o: rcsbase.h Xrcskeep.o: rcskeep.c Xrcskeep.o: rcsbase.h Xrcskeys.o: rcskeys.c Xrcskeys.o: rcsbase.h Xrcslex.o: rcslex.c Xrcslex.o: rcsbase.h Xrcsmerge.o: rcsmerge.c Xrcsmerge.o: rcsbase.h Xrcsrev.o: rcsrev.c Xrcsrev.o: rcsbase.h Xrcssyn.o: rcssyn.c Xrcssyn.o: rcsbase.h Xrcsutil.o: rcsutil.c Xrcsutil.o: rcsbase.h Xrlog.o: rlog.c Xrlog.o: time.h Xrlog.o: rcsbase.h Xsnoop.o: snoop.c Xsnoop.o: rcsbase.h X@ X X X1.13.2.1 Xlog X@Start of Amiga RCS port branch. X@ Xtext X@d1 1 Xa1 1 X#$Header: /u/softeng/rsbx/rcs/amiga/RCS.cbmvax/Makefile,v 1.13.1.2 89/08/11 02:15:34 rsbx Exp Locker: rsbx $ Xd40 2 Xa41 2 XDIFF = /usr/local/bin/diff XDIFF3 = /usr/local/bin/diff3 Xd45 1 Xa45 1 XRCSDIR = /u/softeng/rsbx/.bin Xd50 1 Xa50 1 X#OLDDIR = /usr/old/bin Xd66 1 Xa66 1 XSIGNAL_TYPE = void Xd89 2 Xa90 2 X#SNOOPFILE = /usr/log/rcslog/log X#SNOOP = /usr/local/bin/snoop Xd92 1 Xa92 1 XDEFINES= $(OS) -DSIGNAL_TYPE=$(SIGNAL_TYPE) -DSTRICT_LOCKING=$(LOCKING) -DDIFF='"$(DIFF)"' -DCO='"${RCSDIR}/co"' -DMERGE='"${RCSDIR}/merge"' Xd258 48 Xa305 22 Xci.c: Xco.c: Xcurdir.c: Xident.c: Xmaketime.c: Xpartime.c: Xrcs.c: Xrcsclean.c: Xrcsdiff.c: Xrcsedit.c: Xrcsfcmp.c: Xrcsfnms.c: Xrcsgen.c: Xrcskeep.c: Xrcskeys.c: Xrcslex.c: Xrcsmerge.c: Xrcsrev.c: Xrcssyn.c: Xrcsutil.c: Xrlog.c: Xsnoop.c: X@ X X X1.13.2.2 Xlog X@Restructured for use with LMK. X@ Xtext X@d1 1 Xa1 1 X#$Header: /u/softeng/rsbx/rcs/amiga/RCS/Makefile,v 1.13.2.1 89/10/13 19:16:09 rsbx Exp Locker: rsbx $ Xa18 17 X.SILENT: X XCC1=lc1 XCC2=go XCC3=lc2 XC1FLAGS = -j85i -d1 XC2FLAGS = XC3FLAGS = X X.c.o: X $(CC1) -. $(C1FLAGS) $(CFLAGS) -oQUAD: $* X $(CC2) -. $(C2FLAGS) QUAD:$*.q X $(CC3) -. $(C3FLAGS) -o$*.o QUAD:$*.q X X#.c.o: X# $(CC1) -. $(C1FLAGS) $(CFLAGS) -oQUAD: $* X# $(CC3) -. $(C3FLAGS) -o$*.o QUAD:$*.q Xd24 1 Xd40 2 Xa41 2 XDIFF = RCS:diff XDIFF3 = RCS:diff3 Xd45 1 Xa45 1 XRCSDIR = RCS: Xd61 1 Xa61 2 XOS = -dAMIGA XARGS = -dSTDARGS Xd78 1 Xa78 2 XLDFLAGS = quiet batch XLDLIBS = LIB:lc.lib LIB:amiga.lib Xd92 4 Xa95 2 XDEFINES = $(OS) $(ARGS) -dSIGNAL_TYPE=$(SIGNAL_TYPE) -dSTRICT_LOCKING=$(LOCKING) -dDIFF="$(DIFF)" -dCO="${RCSDIR}co" -dMERGE="${RCSDIR}merge" XCFLAGS = $(DEFINES) Xd123 1 Xa123 1 XRCSCOMMANDS = $(BCOMMANDS) Xd126 4 Xd133 1 Xd135 28 Xd164 1 Xa164 3 X -rm -f *.o X -rm -f $(RCSCOMMANDS) snoop X -rm -f *.tmp Xd166 1 Xd168 1 Xa168 6 XCIOBJ = ci.o rcslex.o rcssyn.o rcsgen.o rcsedit.o rcskeys.o rcsrev.o rcsutil.o rcsfnms.o partime.o maketime.o rcskeep.o rcsfcmp.o amiga.o XCISRC = ci.c rcslex.c rcssyn.c rcsgen.c rcsedit.c rcskeys.c rcsrev.c rcsutil.c rcsfnms.c partime.c maketime.c rcskeep.c rcsfcmp.c amiga.c Xci: $(CIOBJ) X -delete $@@ X ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:c.o $(CIOBJ) LIB $(LDLIBS) X rename $@@.tmp $@@ Xd170 5 Xd176 1 Xa176 6 XCOOBJ = co.o rcslex.o rcssyn.o rcsgen.o rcsedit.o rcskeys.o rcsrev.o rcsutil.o rcsfnms.o partime.o maketime.o amiga.o XCOSRC = co.c rcslex.c rcssyn.c rcsgen.c rcsedit.c rcskeys.c rcsrev.c rcsutil.c rcsfnms.c partime.c maketime.c amiga.c Xco: $(COOBJ) X -delete $@@ X ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:c.o $(COOBJ) LIB $(LDLIBS) X rename $@@.tmp $@@ Xd178 5 Xa182 6 XIDENTOBJ = ident.o rcskeys.o XIDENTSRC = ident.c rcskeys.c Xident: $(IDENTOBJ) X -delete $@@ X ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:c.o $(IDENTOBJ) LIB $(LDLIBS) X rename $@@.tmp $@@ Xd184 2 Xd187 2 Xa188 6 XRLOGOBJ = rlog.o rcslex.o rcssyn.o rcsrev.o rcsutil.o partime.o maketime.o rcsfnms.o amiga.o XRLOGSRC = rlog.c rcslex.c rcssyn.c rcsrev.c rcsutil.c partime.c maketime.c rcsfnms.c amiga.c Xrlog: $(RLOGOBJ) X -delete $@@ X ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:c.o $(RLOGOBJ) LIB $(LDLIBS) X rename $@@.tmp $@@ Xd190 8 Xd199 4 Xa202 6 XRCSOBJ = rcs.o rcslex.o rcssyn.o rcsrev.o rcsutil.o rcsgen.o rcsedit.o rcskeys.o rcsfnms.o amiga.o XRCSSRC = rcs.c rcslex.c rcssyn.c rcsrev.c rcsutil.c rcsgen.c rcsedit.c rcskeys.c rcsfnms.c amiga.c Xrcs: $(RCSOBJ) X -delete $@@ X ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:c.o $(RCSOBJ) LIB $(LDLIBS) X rename $@@.tmp $@@ Xd204 2 Xd207 1 Xa207 6 XRCSDIFFOBJ = rcsdiff.o rcsutil.o rcsfnms.o rcsrev.o rcssyn.o rcslex.o amiga.o XRCSDIFFSRC = rcsdiff.c rcsutil.c rcsfnms.c rcsrev.c rcssyn.c rcslex.c amiga.c Xrcsdiff: $(RCSDIFFOBJ) X -delete $@@ X ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:c.o $(RCSDIFFOBJ) LIB $(LDLIBS) X rename $@@.tmp $@@ Xd209 3 Xd213 22 Xa234 6 XRCSMERGEOBJ = rcsmerge.o rcsutil.o rcsfnms.o rcsrev.o rcssyn.o rcslex.o amiga.o XRCSMERGESRC = rcsmerge.c rcsutil.c rcsfnms.c rcsrev.c rcssyn.c rcslex.c amiga.c Xrcsmerge: $(RCSMERGEOBJ) X -delete $@@ X ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:c.o $(RCSMERGEOBJ) LIB $(LDLIBS) X rename $@@.tmp $@@ Xd236 4 Xa239 6 XSNOOPOBJ = snoop.o XSNOOPSRC = snoop.c Xsnoop: $(SNOOPOBJ) X -delete $@@ X ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:c.o $(SNOOPOBJ) LIB $(LDLIBS) X rename $@@.tmp $@@ Xa240 1 X Xd244 1 Xa244 1 X rlog.c snoop.c amiga.c Xd246 1 Xa246 1 XHFILES= rcsbase.h time.h stat.h Xd250 1 Xa250 1 X cc -Em ${CFLAGS} ${SOURCE} | sed 's/\.\///; /\//d' \ Xd258 22 Xa279 55 Xci.o: ci.c Xci.o: rcsbase.h Xci.o: stat.h Xci.o: time.h Xco.o: co.c Xco.o: rcsbase.h Xco.o: stat.h Xco.o: time.h Xcurdir.o: curdir.c Xcurdir.o: rcsbase.h Xident.o: ident.c Xident.o: rcsbase.h Xmaketime.o: maketime.c Xmaketime.o: rcsbase.h Xmaketime.o: time.h Xpartime.o: partime.c Xpartime.o: time.h Xrcs.o: rcs.c Xrcs.o: stat.h Xrcs.o: rcsbase.h Xrcsclean.o: rcsclean.c Xrcsclean.o: rcsbase.h Xrcsdiff.o: rcsdiff.c Xrcsdiff.o: rcsbase.h Xrcsedit.o: rcsedit.c Xrcsedit.o: rcsbase.h Xrcsfcmp.o: rcsfcmp.c Xrcsfcmp.o: rcsbase.h Xrcsfnms.o: rcsfnms.c Xrcsfnms.o: stat.h Xrcsfnms.o: rcsbase.h Xrcsgen.o: rcsgen.c Xrcsgen.o: rcsbase.h Xrcskeep.o: rcskeep.c Xrcskeep.o: rcsbase.h Xrcskeys.o: rcskeys.c Xrcskeys.o: rcsbase.h Xrcslex.o: rcslex.c Xrcslex.o: rcsbase.h Xrcsmerge.o: rcsmerge.c Xrcsmerge.o: rcsbase.h Xrcsrev.o: rcsrev.c Xrcsrev.o: rcsbase.h Xrcssyn.o: rcssyn.c Xrcssyn.o: rcsbase.h Xrcsutil.o: rcsutil.c Xrcsutil.o: stat.h Xrcsutil.o: rcsbase.h Xrlog.o: rlog.c Xrlog.o: time.h Xrlog.o: rcsbase.h Xsnoop.o: snoop.c Xsnoop.o: rcsbase.h Xamiga.o: amiga.c Xamiga.o: stat.h X@ X X X1.13.2.3 Xlog X@Many changes. Added merge to list of commands. X@ Xtext X@d1 1 Xa1 1 X#$Header: /u/softeng/rsbx/rcs/amiga/RCS/Makefile,v 1.13.2.2 89/10/15 15:38:02 rsbx Exp $ Xd24 1 Xa24 1 XC1FLAGS = -j85i -d3 Xd27 6 Xa32 1 X# Xa34 1 X# $(CC2) -. $(C2FLAGS) QUAD:$*.q Xa36 3 X.c.o: X $(CC1) -. $(C1FLAGS) $(CFLAGS) -oQUAD: $* X $(CC3) -. $(C3FLAGS) -o$*.o QUAD:$*.q Xa40 1 X# Xd49 1 Xa49 6 X# 1. Figure out where to put the RCS commands; define RCSDIR accordingly. X XRCSDIR = RCS: X X X# 2. Early version of diff did not support options needed by RCS. Xd56 2 Xa57 2 XDIFF = ${RCSDIR}diff XDIFF3 = ${RCSDIR}diff3 Xd59 1 Xa59 1 XED = ${RCSDIR}ked Xd61 3 Xd95 2 Xa96 2 XLDFLAGS = quiet batch nodebug XLDLIBS = LIB:rsbx.lib LIB:lc.lib LIB:amiga.lib Xd110 1 Xa110 1 XDEFINES = $(OS) $(ARGS) -dSIGNAL_TYPE=$(SIGNAL_TYPE) -dSTRICT_LOCKING=$(LOCKING) -dDIFF="$(DIFF)" -dDIFF3="$(DIFF3)" -dED="$(ED)" -dCO="${RCSDIR}co" -dMERGE="${RCSDIR}merge" Xd136 1 Xa136 1 XBCOMMANDS = ci co ident merge rcs rcsdiff rcsmerge rlog Xa145 11 Xinstall: X copy ci to RCS: X copy co to RCS: X copy ident to RCS: X copy merge to RCS: X copy rcs to RCS: X copy rcsdiff to RCS: X copy rcsmerge to RCS: X copy rlog to RCS: X X Xd147 3 Xa149 3 X -delete \#?.o X -delete $(RCSCOMMANDS) snoop X -delete \#?.tmp Xd153 2 Xa154 1 Xci: $(CIOBJ) $(LDLIBS) Xd156 1 Xa156 1 X ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:xc.o $(CIOBJ) LIB $(LDLIBS) Xd161 2 Xa162 1 Xco: $(COOBJ) $(LDLIBS) Xd164 1 Xa164 1 X ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:xc.o $(COOBJ) LIB $(LDLIBS) Xd168 2 Xa169 1 Xident: $(IDENTOBJ) $(LDLIBS) Xd171 1 Xa171 1 X ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:xc.o $(IDENTOBJ) LIB $(LDLIBS) Xa174 7 XMERGEOBJ = merge.o Xmerge: $(MERGEOBJ) $(LDLIBS) X -delete $@@ X ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:xc.o $(MERGEOBJ) LIB $(LDLIBS) X rename $@@.tmp $@@ X X Xd176 2 Xa177 1 Xrlog: $(RLOGOBJ) $(LDLIBS) Xd179 1 Xa179 1 X ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:xc.o $(RLOGOBJ) LIB $(LDLIBS) Xd184 2 Xa185 1 Xrcs: $(RCSOBJ) $(LDLIBS) Xd187 1 Xa187 1 X ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:xc.o $(RCSOBJ) LIB $(LDLIBS) Xd192 2 Xa193 1 Xrcsdiff: $(RCSDIFFOBJ) $(LDLIBS) Xd195 1 Xa195 1 X ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:xc.o $(RCSDIFFOBJ) LIB $(LDLIBS) Xd200 2 Xa201 1 Xrcsmerge: $(RCSMERGEOBJ) $(LDLIBS) Xd203 1 Xa203 1 X ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:xc.o $(RCSMERGEOBJ) LIB $(LDLIBS) Xd207 2 Xa208 1 Xsnoop: $(SNOOPOBJ) $(LDLIBS) Xd210 1 Xa210 1 X ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:xc.o $(SNOOPOBJ) LIB $(LDLIBS) Xd214 1 Xa214 1 XSOURCE= ci.c co.c curdir.c ident.c maketime.c merge.c partime.c rcs.c \ Xa245 1 Xmerge.o: merge.c X@ X X X1.13.2.4 Xlog X@Added new compile time switch LINK for RCS_link support. X@ Xtext X@d1 1 Xa1 1 X#$Header: /u/softeng/rsbx/rcs/amiga/RCS/Makefile,v 1.13.2.3 89/11/03 20:53:51 rsbx Exp Locker: rsbx $ Xa51 1 XRCSLINK = -dLINK Xd53 1 Xd112 1 Xa112 1 XDEFINES = $(OS) $(ARGS) -dSIGNAL_TYPE=$(SIGNAL_TYPE) -dSTRICT_LOCKING=$(LOCKING) -dDIFF="$(DIFF)" -dDIFF3="$(DIFF3)" -dED="$(ED)" -dCO="${RCSDIR}co" -dMERGE="${RCSDIR}merge" $(RCSLINK) X@ X X X1.13.1.1 Xlog X@Start of cbmvax RCS source branch. X@ Xtext X@d1 1 Xa1 1 X#$Header: /u/softeng/rsbx/rcs/rcs.uunet/src/RCS/Makefile,v 1.13 89/05/02 14:53:40 narten Exp $ X@ X X X1.13.1.2 Xlog X@Modified for cbmvax's environment and my testing. X@ Xtext X@d1 1 Xa1 1 X#$Header: /u/softeng/rsbx/rcs/rcs.uunet/src/RCS/Makefile,v 1.13.1.1 89/08/11 01:41:03 rsbx Exp Locker: rsbx $ Xd40 2 Xa41 2 XDIFF = /usr/local/bin/diff XDIFF3 = /usr/local/bin/diff3 Xd45 1 Xa45 1 XRCSDIR = /u/softeng/rsbx/.bin Xd50 1 Xa50 1 X#OLDDIR = /usr/old/bin Xd66 1 Xa66 1 XSIGNAL_TYPE = void Xd89 2 Xa90 2 X#SNOOPFILE = /usr/log/rcslog/log X#SNOOP = /usr/local/bin/snoop Xd92 1 Xa92 1 XDEFINES= $(OS) -DSIGNAL_TYPE=$(SIGNAL_TYPE) -DSTRICT_LOCKING=$(LOCKING) -DDIFF='"$(DIFF)"' -DCO='"${RCSDIR}/co"' -DMERGE='"${RCSDIR}/merge"' Xd258 48 Xa305 22 Xci.c: Xco.c: Xcurdir.c: Xident.c: Xmaketime.c: Xpartime.c: Xrcs.c: Xrcsclean.c: Xrcsdiff.c: Xrcsedit.c: Xrcsfcmp.c: Xrcsfnms.c: Xrcsgen.c: Xrcskeep.c: Xrcskeys.c: Xrcslex.c: Xrcsmerge.c: Xrcsrev.c: Xrcssyn.c: Xrcsutil.c: Xrlog.c: Xsnoop.c: X@ SHAR_EOF echo "extracting rcs/rcs.rcsfiles/co.c,v" sed 's/^X//' << \SHAR_EOF > rcs/rcs.rcsfiles/co.c,v Xhead 4.7; Xbranch 4.7.2; Xaccess ; Xsymbols amiga_rcs:4.7.2 cbmvax_source:4.7.1 uunet_june89_dist:4.7; Xlocks ; strict; Xcomment @ * @; X X X4.7 Xdate 89.05.01.15.11.41; author narten; state Exp; Xbranches 4.7.1.1 4.7.2.1; Xnext ; X X4.7.1.1 Xdate 89.08.11.01.41.39; author rsbx; state Exp; Xbranches ; Xnext ; X X4.7.2.1 Xdate 89.10.13.19.17.21; author rsbx; state Exp; Xbranches ; Xnext 4.7.2.2; X X4.7.2.2 Xdate 89.10.15.15.43.07; author rsbx; state Exp; Xbranches ; Xnext 4.7.2.3; X X4.7.2.3 Xdate 89.10.30.13.37.50; author rsbx; state Exp; Xbranches ; Xnext 4.7.2.4; X X4.7.2.4 Xdate 89.11.01.14.42.12; author rsbx; state Exp; Xbranches ; Xnext ; X X Xdesc X@RCS checkout operation. X@ X X X X4.7 Xlog X@checked in with -k by rsbx at 89.08.10.16.01.05. X@ Xtext 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 * RCS checkout operation X */ X#ifndef lint Xstatic char rcsid[]= X"$Header: /usr/src/local/bin/rcs/src/RCS/co.c,v 4.7 89/05/01 15:11:41 narten Exp $ Purdue CS"; X#endif X/***************************************************************************** X * check out revisions from RCS files X ***************************************************************************** X */ X X X/* $Log: co.c,v $ X * Revision 4.7 89/05/01 15:11:41 narten X * changed copyright header to reflect current distribution rules X * X * Revision 4.6 88/11/08 12:02:31 narten X * changes from eggert@@sm.unisys.com (Paul Eggert) X * X * Revision 4.6 88/08/09 19:12:15 eggert X * Fix "co -d" core dump; rawdate wasn't always initialized. X * Use execv(), not system(); fix putchar('\0') and diagnose() botches; remove lint X * X * Revision 4.5 87/12/18 11:35:40 narten X * lint cleanups (from Guy Harris) X * X * Revision 4.4 87/10/18 10:20:53 narten X * Updating version numbers changes relative to 1.1, are actually X * relative to 4.2 X * X * Revision 1.3 87/09/24 13:58:30 narten X * Sources now pass through lint (if you ignore printf/sprintf/fprintf X * warnings) X * X * Revision 1.2 87/03/27 14:21:38 jenkins X * Port to suns X * X * Revision 1.1 84/01/23 14:49:58 kcs X * Initial revision X * X * Revision 4.2 83/12/05 13:39:48 wft X * made rewriteflag external. X * X * Revision 4.1 83/05/10 16:52:55 wft X * Added option -u and -f. X * Added handling of default branch. X * Replaced getpwuid() with getcaller(). X * Removed calls to stat(); now done by pairfilenames(). X * Changed and renamed rmoldfile() to rmworkfile(). X * Replaced catchints() calls with restoreints(), unlink()--link() with rename(); X * X * Revision 3.7 83/02/15 15:27:07 wft X * Added call to fastcopy() to copy remainder of RCS file. X * X * Revision 3.6 83/01/15 14:37:50 wft X * Added ignoring of interrupts while RCS file is renamed; this avoids X * deletion of RCS files during the unlink/link window. X * X * Revision 3.5 82/12/08 21:40:11 wft X * changed processing of -d to use DATEFORM; removed actual from X * call to preparejoin; re-fixed printing of done at the end. X * X * Revision 3.4 82/12/04 18:40:00 wft X * Replaced getdelta() with gettree(), SNOOPDIR with SNOOPFILE. X * Fixed printing of "done". X * X * Revision 3.3 82/11/28 22:23:11 wft X * Replaced getlogin() with getpwuid(), flcose() with ffclose(), X * %02d with %.2d, mode generation for working file with WORKMODE. X * Fixed nil printing. Fixed -j combined with -l and -p, and exit X * for non-existing revisions in preparejoin(). X * X * Revision 3.2 82/10/18 20:47:21 wft X * Mode of working file is now maintained even for co -l, but write permission X * is removed. X * The working file inherits its mode from the RCS file, plus write permission X * for the owner. The write permission is not given if locking is strict and X * co does not lock. X * An existing working file without write permission is deleted automatically. X * Otherwise, co asks (empty answer: abort co). X * Call to getfullRCSname() added, check for write error added, call X * for getlogin() fixed. X * X * Revision 3.1 82/10/13 16:01:30 wft X * fixed type of variables receiving from getc() (char -> int). X * removed unused variables. X */ X X X X X#include "rcsbase.h" X#include "time.h" X#include <sys/types.h> X#include <sys/stat.h> X X#ifndef lint Xstatic char rcsbaseid[] = RCSBASE; X#endif Xstatic char co[] = CO; Xstatic char merge[] = MERGE; X Xextern FILE * fopen(); Xextern int rename(); Xextern char * getcaller(); /*get login of caller */ Xextern struct hshentry * genrevs(); /*generate delta numbers */ Xextern char * getancestor(); Xextern int nextc; /*next input character */ Xextern int nerror; /*counter for errors */ Xextern char Kdesc[]; /*keyword for description */ Xextern char * buildrevision(); /*constructs desired revision */ Xextern int buildjoin(); /*join several revisions */ Xextern char * mktempfile(); /*temporary file name generator */ Xextern struct hshentry * findlock();/*find (and delete) a lock */ Xextern struct lock * addlock(); /*add a new lock */ Xextern long maketime(); /*convert parsed time to unix time. */ Xextern struct tm * localtime(); /*convert unixtime into a tm-structure */ Xextern FILE * finptr; /* RCS input file */ Xextern FILE * frewrite; /* new RCS file */ Xextern int rewriteflag; /* indicates whether input should be */ X /* echoed to frewrite */ X Xchar * newRCSfilename, * neworkfilename; Xchar * RCSfilename, * workfilename; Xextern struct stat RCSstat, workstat; /* file status of RCS and work file */ Xextern int haveRCSstat, haveworkstat;/* status indicators */ X Xchar * date, * rev, * state, * author, * join; Xchar finaldate[datelength]; X Xint forceflag, lockflag, unlockflag, tostdout; Xchar * caller; /* caller's login; */ Xextern quietflag; X Xchar numericrev[revlength]; /* holds expanded revision number */ Xstruct hshentry * gendeltas[hshsize]; /* stores deltas to be generated */ Xstruct hshentry * targetdelta; /* final delta to be generated */ X Xchar * joinlist[joinlength]; /* pointers to revisions to be joined */ Xint lastjoin; /* index of last element in joinlist */ X Xmain (argc, argv) Xint argc; Xchar * argv[]; X{ X int killock; /* indicates whether a lock is removed*/ X char * cmdusage; X struct tm parseddate, *ftm; X char * rawdate; X long unixtime; X X catchints(); X cmdid = "co"; X cmdusage = "command format:\nco -f[rev] -l[rev] -p[rev] -q[rev] -r[rev] -ddate -sstate -w[login] -jjoinlist file ..."; X date = rev = state = author = join = nil; X forceflag = lockflag = unlockflag = tostdout = quietflag = false; X caller=getcaller(); X rawdate = ""; X X while (--argc,++argv, argc>=1 && ((*argv)[0] == '-')) { X switch ((*argv)[1]) { X X case 'r': X revno: if ((*argv)[2]!='\0') { X if (rev!=nil) warn("Redefinition of revision number"); X rev = (*argv)+2; X } X break; X X case 'f': X forceflag=true; X goto revno; X X case 'l': X lockflag=true; X if (unlockflag) { X warn("-l has precedence over -u"); X unlockflag=false; X } X goto revno; X X case 'u': X unlockflag=true; X if (lockflag) { X warn("-l has precedence over -u"); X unlockflag=false; X } X goto revno; X X case 'p': X tostdout=true; X goto revno; X X case 'q': X quietflag=true; X goto revno; X X case 'd': X if ((*argv)[2]!='\0') { X if (date!=nil) warn("Redefinition of -d option"); X rawdate=(*argv)+2; X } X /* process date/time */ X if (partime(rawdate,&parseddate)==0) X faterror("Can't parse date/time: %s",rawdate); X if ((unixtime=maketime(&parseddate))== 0L) X faterror("Inconsistent date/time: %s",rawdate); X ftm=localtime(&unixtime); X VOID sprintf(finaldate,DATEFORM, X ftm->tm_year,ftm->tm_mon+1,ftm->tm_mday,ftm->tm_hour,ftm->tm_min,ftm->tm_sec); X date=finaldate; X break; X X case 'j': X if ((*argv)[2]!='\0'){ X if (join!=nil)warn("Redefinition of -j option"); X join = (*argv)+2; X } X break; X X case 's': X if ((*argv)[2]!='\0'){ X if (state!=nil)warn("Redefinition of -s option"); X state = (*argv)+2; X } X break; X X case 'w': X if (author!=nil)warn("Redefinition of -w option"); X if ((*argv)[2]!='\0') X author = (*argv)+2; X else author = caller; X break; X X default: X faterror("unknown option: %s\n%s", *argv,cmdusage); X X }; X } /* end of option processing */ X X if (argc<1) faterror("No input file\n%s",cmdusage); X X /* now handle all filenames */ X do { X rewriteflag=false; X finptr=frewrite=NULL; X neworkfilename=nil; X X if (!pairfilenames(argc,argv,true,tostdout)) continue; X X /* now RCSfilename contains the name of the RCS file, and finptr X * the file descriptor. If tostdout is false, workfilename contains X * the name of the working file, otherwise undefined (not nil!). X * Also, RCSstat, workstat, and haveworkstat have been set. X */ X diagnose("%s --> %s", RCSfilename,tostdout?"stdout":workfilename); X X X if (!tostdout && !trydiraccess(workfilename)) continue; /* give up */ X if ((lockflag||unlockflag) && !checkaccesslist(caller)) continue; /* give up */ X if (!trysema(RCSfilename,lockflag||unlockflag)) continue; /* give up */ X X X gettree(); /* reads in the delta tree */ X X if (Head==nil) { X /* no revisions; create empty file */ X diagnose("no revisions present; generating empty revision 0.0"); X if (!tostdout) X if (!creatempty()) continue; X /* Can't reserve a delta, so don't call addlock */ X } else { X if (rev!=nil) { X /* expand symbolic revision number */ X if (!expandsym(rev,numericrev)) X continue; X } elsif (unlockflag && (targetdelta=findlock(caller,false))!=nil) { X VOID strcpy(numericrev,targetdelta->num); X } elsif (Dbranch!=nil) { X VOID strcpy(numericrev,Dbranch->num); X } else numericrev[0]='\0'; /* empty */ X /* get numbers of deltas to be generated */ X if (!(targetdelta=genrevs(numericrev,date,author,state,gendeltas))) X continue; X /* check reservations */ X if (lockflag && !addlock(targetdelta,caller)) X continue; X X if (unlockflag) { X if((killock=rmlock(caller,targetdelta))== -1) X continue; X } else { X killock=0; X } X X if (join && !preparejoin()) continue; X X diagnose("revision %s%s",targetdelta->num, X lockflag?" (locked)": X unlockflag?" (unlocked)":""); X X /* remove old working file if necessary */ X if (!tostdout) X if (!rmworkfile()) continue; X X /* prepare for rewriting the RCS file */ X if (lockflag||(killock==1)) { X newRCSfilename=mktempfile(RCSfilename,NEWRCSFILE); X if ((frewrite=fopen(newRCSfilename, "w"))==NULL) { X error("Can't open file %s",newRCSfilename); X continue; X } X putadmin(frewrite); X puttree(Head,frewrite); X VOID fprintf(frewrite, "\n\n%s%c",Kdesc,nextc); X rewriteflag=true; X } X X /* skip description */ X getdesc(false); /* don't echo*/ X X if (!(neworkfilename=buildrevision(gendeltas,targetdelta, X tostdout?(join!=nil?"/tmp/":(char *)nil):workfilename,true))) X continue; X X if ((lockflag||killock==1)&&nerror==0) { X /* rewrite the rest of the RCSfile */ X fastcopy(finptr,frewrite); X ffclose(frewrite); frewrite=NULL; X ignoreints(); X if (rename(newRCSfilename,RCSfilename)<0) { X error("Can't rewrite %s; saved in: %s", X RCSfilename, newRCSfilename); X newRCSfilename[0]='\0'; /* avoid deletion*/ X restoreints(); X break; X } X newRCSfilename[0]='\0'; /* avoid re-deletion by cleanup()*/ X if (chmod(RCSfilename,RCSstat.st_mode & ~0222)<0) X warn("Can't preserve mode of %s",RCSfilename); X restoreints(); X } X X# ifdef SNOOPFILE X logcommand("co",targetdelta,gendeltas,caller); X# endif X X if (join) { X rmsema(); /* kill semaphore file so other co's can proceed */ X if (!buildjoin(neworkfilename)) continue; X } X if (!tostdout) { X if (rename(neworkfilename,workfilename) <0) { X error("Can't create %s; see %s",workfilename,neworkfilename); X neworkfilename[0]= '\0'; /*avoid deletion*/ X continue; X } X neworkfilename[0]= '\0'; /*avoid re-deletion by cleanup()*/ X } X } X if (!tostdout) X if (chmod(workfilename, WORKMODE(RCSstat.st_mode))<0) X warn("Can't adjust mode of %s",workfilename); X X X if (!tostdout) diagnose("done"); X } while (cleanup(), X ++argv, --argc >=1); X X exit(nerror!=0); X X} /* end of main (co) */ X X X/***************************************************************** X * The following routines are auxiliary routines X *****************************************************************/ X Xint rmworkfile() X/* Function: unlinks workfilename, if it exists, under the following conditions: X * If it is read-only, workfilename is unlinked. X * Otherwise (file writable): X * if !quietmode asks the user whether to really delete it (default: fail); X * otherwise failure. X * Returns false on failure to unlink, true otherwise. X */ X{ X int response, c; /* holds user response to queries */ X X if (haveworkstat< 0) /* File doesn't exist; set by pairfilenames*/ X return (true); /* No problem */ X X if ((workstat.st_mode & 0222)&&!forceflag) { /* File is writable */ X if (!quietflag) { X VOID fprintf(stderr,"writable %s exists; overwrite? [ny](n): ",workfilename); X /* must be stderr in case of IO redirect */ X c=response=getchar(); X while (!(c==EOF || c=='\n')) c=getchar(); /*skip rest*/ X if (!(response=='y'||response=='Y')) { X warn("checkout aborted."); X return false; X } X } else { X error("writable %s exists; checkout aborted.",workfilename); X return false; X } X } X /* now unlink: either not writable, forceflag, or permission given */ X if (unlink(workfilename) != 0) { /* Remove failed */ X error("Can't unlink %s",workfilename); X return false; X } X return true; X} X X Xcreatempty() X/* Function: creates an empty working file. X * First, removes an existing working file with rmworkfile(). X */ X{ X int fdesc; /* file descriptor */ X X if (!rmworkfile()) return false; X fdesc=creat(workfilename,0); X if (fdesc < 0) { X faterror("Cannot create %s",workfilename); X return false; X } else { X VOID close(fdesc); /* empty file */ X return true; X } X} X X Xint rmlock(who,delta) Xchar * who; struct hshentry * delta; X/* Function: removes the lock held by who on delta. X * Returns -1 if someone else holds the lock, X * 0 if there is no lock on delta, X * and 1 if a lock was found and removed. X */ X{ register struct lock * next, * trail; X char * num; X struct lock dummy; X int whomatch, nummatch; X X num=delta->num; X dummy.nextlock=next=Locks; X trail = &dummy; X while (next!=nil) { X whomatch=strcmp(who,next->login); X nummatch=strcmp(num,next->delta->num); X if ((whomatch==0) && (nummatch==0)) break; X /*found a lock on delta by who*/ X if ((whomatch!=0)&&(nummatch==0)) { X error("revision %s locked by %s; use co -r or rcs -u",num,next->login); X return -1; X } X trail=next; X next=next->nextlock; X } X if (next!=nil) { X /*found one; delete it */ X trail->nextlock=next->nextlock; X Locks=dummy.nextlock; X next->delta->lockedby=nil; /* reset locked-by */ X return 1; /*success*/ X } else return 0; /*no lock on delta*/ X} X X X X X/***************************************************************** X * The rest of the routines are for handling joins X *****************************************************************/ X Xchar * getrev(sp, tp, buffsize) Xregister char * sp, *tp; int buffsize; X/* Function: copies a symbolic revision number from sp to tp, X * appends a '\0', and returns a pointer to the character following X * the revision number; returns nil if the revision number is more than X * buffsize characters long. X * The revision number is terminated by space, tab, comma, colon, X * semicolon, newline, or '\0'. X * used for parsing the -j option. X */ X{ X register char c; X register int length; X X length = 0; X while (((c= *sp)!=' ')&&(c!='\t')&&(c!='\n')&&(c!=':')&&(c!=',') X &&(c!=';')&&(c!='\0')) { X if (length>=buffsize) return false; X *tp++= *sp++; X length++; X } X *tp= '\0'; X return sp; X} X X X Xint preparejoin() X/* Function: Parses a join list pointed to by join and places pointers to the X * revision numbers into joinlist. X */ X{ X struct hshentry * * joindeltas; X struct hshentry * tmpdelta; X register char * j; X char symbolrev[revlength],numrev[revlength]; X X joindeltas = (struct hshentry * *)talloc(hshsize*sizeof(struct hshentry *)); X j=join; X lastjoin= -1; X for (;;) { X while ((*j==' ')||(*j=='\t')||(*j==',')) j++; X if (*j=='\0') break; X if (lastjoin>=joinlength-2) { X error("too many joins"); X return(false); X } X if(!(j=getrev(j,symbolrev,revlength))) return false; X if (!expandsym(symbolrev,numrev)) return false; X tmpdelta=genrevs(numrev,(char *)nil,(char *)nil,(char *)nil,(struct hshentry * *)joindeltas); X if (tmpdelta==nil) X return false; X else joinlist[++lastjoin]=tmpdelta->num; X while ((*j==' ') || (*j=='\t')) j++; X if (*j == ':') { X j++; X while((*j==' ') || (*j=='\t')) j++; X if (*j!='\0') { X if(!(j=getrev(j,symbolrev,revlength))) return false; X if (!expandsym(symbolrev,numrev)) return false; X tmpdelta=genrevs(numrev,(char *)nil,(char *)nil,(char *)nil, (struct hshentry * *) joindeltas); X if (tmpdelta==nil) X return false; X else joinlist[++lastjoin]=tmpdelta->num; X } else { X error("join pair incomplete"); X return false; X } X } else { X if (lastjoin==0) { /* first pair */ X /* common ancestor missing */ X joinlist[1]=joinlist[0]; X lastjoin=1; X /*derive common ancestor*/ X joinlist[0]=talloc(revlength); X if (!getancestor(targetdelta->num,joinlist[1],joinlist[0])) X return false; X } else { X error("join pair incomplete"); X return false; X } X } X } X if (lastjoin<1) { X error("empty join"); X return false; X } else return true; X} X X X Xbuildjoin(initialfile) Xchar * initialfile; X/* Function: merge pairs of elements in joinlist into initialfile X * If tostdout==true, copy result to stdout. X * All unlinking of initialfile, rev2, and rev3 should be done by cleanup(). X */ X{ X char commarg[revlength+3]; X char subs[revlength]; X char * rev2, * rev3; X int i; X X rev2=mktempfile("/tmp/",JOINFIL2); X rev3=mktempfile("/tmp/",JOINFIL3); X X i=0; X while (i<lastjoin) { X /*prepare marker for merge*/ X if (i==0) X VOID strcpy(subs,targetdelta->num); X else VOID sprintf(subs, "merge%d",i/2); X diagnose("revision %s",joinlist[i]); X VOID sprintf(commarg,"-p%s",joinlist[i]); X if (run((char*)nil,rev2, co,commarg,"-q",RCSfilename,(char*)nil)) { X nerror++;return false; X } X diagnose("revision %s",joinlist[i+1]); X VOID sprintf(commarg,"-p%s",joinlist[i+1]); X if (run((char *)nil,rev3, co,commarg,"-q",RCSfilename,(char*)nil)) { X nerror++; return false; X } X diagnose("merging..."); X if ( X (i+2)>=lastjoin && tostdout X ? run((char*)nil,(char*)nil, merge,"-p",initialfile,rev2,rev3,subs,joinlist[i+1],(char*)nil) X : run((char*)nil,(char*)nil, merge, initialfile,rev2,rev3,subs,joinlist[i+1],(char*)nil)) { X nerror++; return false; X } X i=i+2; X } X return true; X} X@ X X X4.7.2.1 Xlog X@Start of Amiga RCS port branch. X@ Xtext X@d31 1 Xa31 5 X<<<<<<< co.c X"$Header: /u/softeng/rsbx/rcs/amiga/RCS.cbmvax/co.c,v 4.7.1.1 89/08/11 01:41:39 rsbx Exp Locker: rsbx $ Purdue CS"; X======= X"$Header: /u/softeng/rsbx/rcs/amiga/RCS/co.c,v 1.2 89/09/17 13:32:18 rick Exp $ Purdue CS"; X>>>>>>> 1.2 Xa39 11 X<<<<<<< co.c X * Revision 4.7.1.1 89/08/11 01:41:39 rsbx X * Start of cbmvax RCS source branch. X======= X * Revision 1.2 89/09/17 13:32:18 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<<<<<<< co.c Xa40 3 X * checked in with -k by rsbx at 89.08.10.16.01.05. X * X * Revision 4.7 89/05/01 15:11:41 narten Xa49 11 X======= X * Revision 1.4 89/09/16 09:42:00 rick X * Modified AMIGA changes to work with Lattice C X * X * Revision 1.3 89/09/10 09:26:21 rick X * Moved TARGETDIR to rcs: X * X * Revision 1.2 88/09/03 15:06:55 rick X * Port to AmigaDos. All done with conditional compiles X * X>>>>>>> 1.2 Xd119 1 Xa119 5 X#ifdef AMIGA X#include "stat.h" X#undef WORKMODE X#define WORKMODE(RCSmode) (RCSmode | S_IWRITE)&~((lockflag||!StrictLocks)?S_IWRITE:0) X#else Xa121 2 X#endif X#include "time.h" Xa348 3 X#ifdef AMIGA X tostdout?(join!=nil?"t\:":(char *)nil):workfilename,true))) X#else Xa349 1 X#endif Xa356 4 X#ifdef AMIGA X fclose(finptr); X unlink(RCSfilename); X#endif Xa364 3 X#ifdef AMIGA X if (chmod(RCSfilename,RCSstat.st_attr | S_IWRITE)<0) X#else Xa365 1 X#endif Xa378 3 X#ifdef AMIGA X unlink(workfilename); X#endif Xa387 3 X#ifdef AMIGA X if (chmod(workfilename, WORKMODE(RCSstat.st_attr))<0) X#else Xa388 1 X#endif Xd418 1 Xa418 3 X#ifdef AMIGA X if (((workstat.st_attr & S_IWRITE) == 0)&&!forceflag) { X#else Xa419 1 X#endif Xa422 3 X#ifdef AMIGA X fflush(stderr); X#endif Xa607 4 X#ifdef AMIGA X rev2=mktempfile("t:",JOINFIL2); X rev3=mktempfile("t:",JOINFIL3); X#else Xa609 1 X#endif Xa617 1 X<<<<<<< co.c Xa619 4 X======= X VOID sprintf(command,"%sco -p%s -q %s >%s\n",TARGETDIR,joinlist[i],RCSfilename,rev2); X if (system(command)) { X>>>>>>> 1.2 Xa622 1 X<<<<<<< co.c Xa624 4 X======= X VOID sprintf(command,"%sco -p%s -q %s >%s\n",TARGETDIR,joinlist[i+1],RCSfilename,rev3); X if (system(command)) { X>>>>>>> 1.2 X@ X X X4.7.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@d31 5 Xa35 1 X"$Header: /u/softeng/rsbx/rcs/amiga/RCS/co.c,v 4.7.2.1 89/10/13 19:17:21 rsbx Exp Locker: rsbx $ Purdue CS"; Xd44 1 Xa44 3 X * Revision 4.7.2.1 89/10/13 19:17:21 rsbx X * Start of Amiga RCS port branch. X * Xd47 6 Xd54 1 Xd68 11 Xd683 1 Xd686 4 Xd693 1 Xd696 4 X@ X X X4.7.2.3 Xlog X@NULL finptr after closing it. X@ Xtext X@d31 1 Xa31 1 X"$Header: /u/softeng/rsbx/rcs/amiga/RCS/co.c,v 4.7.2.2 89/10/15 15:43:07 rsbx Exp $ Purdue CS"; Xa39 4 X * Revision 4.7.2.2 89/10/15 15:43:07 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 * Xd377 1 Xa377 1 X fclose(finptr); finptr = NULL; X@ X X X4.7.2.4 Xlog X@Changes to make the delete bit to track the write bit. Made protection Xbit manipulation less insane. X@ Xtext X@d31 1 Xa31 1 X"$Header: /u/softeng/rsbx/rcs/amiga/RCS/co.c,v 4.7.2.3 89/10/30 13:37:50 rsbx Exp $ Purdue CS"; Xa39 3 X * Revision 4.7.2.3 89/10/30 13:37:50 rsbx X * NULL finptr after closing it. X * Xd134 2 Xd382 1 Xa382 5 X if (chmod(RCSfilename, RCSstat.st_attr|S_IDELETE)<0) X warn("Can't adjust mode of %s",RCSfilename); X if (unlink(RCSfilename) != 0) { /* Remove failed */ X error("Can't unlink %s",RCSfilename); X } Xd393 1 Xa393 1 X if (chmod(RCSfilename,RCSstat.st_attr & ~(S_IWRITE|S_IDELETE))<0) Xa410 1 X chmod(workfilename, workstat.st_attr|S_IDELETE); Xd423 1 Xa423 1 X if (chmod(workfilename, WORKMODE(RCSstat.st_attr))<0) Xd425 1 Xa425 1 X if (chmod(workfilename, WORKMODE(RCSstat.st_mode))<0) Xd427 1 Xa427 1 X warn("Can't adjust mode of %s",workfilename); Xd457 1 Xa457 1 X if ((workstat.st_attr & S_IWRITE)&&!forceflag) { Xa478 4 X#ifdef AMIGA X if (chmod(workfilename, workstat.st_attr|S_IDELETE)<0) X warn("Can't adjust mode of %s",workfilename); X#endif X@ X X X4.7.1.1 Xlog X@Start of cbmvax RCS source branch. X@ Xtext X@d31 1 Xa31 1 X"$Header: /u/softeng/rsbx/rcs/rcs.uunet/src/RCS/co.c,v 4.7 89/05/01 15:11:41 narten Exp $ Purdue CS"; Xa39 3 X * Revision 4.7 89/05/01 15:11:41 narten X * checked in with -k by rsbx at 89.08.10.16.01.05. X * X@ SHAR_EOF echo "extracting rcs/rcs.rcsfiles/curdir.c,v" sed 's/^X//' << \SHAR_EOF > rcs/rcs.rcsfiles/curdir.c,v Xhead 3.3; Xbranch 3.3.2; Xaccess ; Xsymbols amiga_rcs:3.3.2 cbmvax_source:3.3.1 uunet_june89_dist:3.3; Xlocks ; strict; Xcomment @ * @; X X X3.3 Xdate 89.05.01.15.11.49; author narten; state Exp; Xbranches 3.3.1.1 3.3.2.1; Xnext ; X X3.3.1.1 Xdate 89.08.11.01.41.44; author rsbx; state Exp; Xbranches ; Xnext ; X X3.3.2.1 Xdate 89.10.13.19.17.29; author rsbx; state Exp; Xbranches ; Xnext 3.3.2.2; X X3.3.2.2 Xdate 89.10.15.15.43.16; author rsbx; state Exp; Xbranches ; Xnext ; X X Xdesc X@get current directory. X@ X X X X3.3 Xlog X@checked in with -k by rsbx at 89.08.10.16.01.39. X@ Xtext 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 * curdir: get current directory X ******************************************************************* X * returns full pathname of working (current) directory. X * This is an adaptation of pwd, and works for grafted directories. X * Unlike pwd, returns to current directory after it is finished. X * Uses stdio buffering for directory reads. X */ X X static char rcsid[]= X "$Header: /usr/src/local/bin/rcs/src/RCS/curdir.c,v 3.3 89/05/01 15:11:49 narten Exp $"; X X/******************************************************************* X * $Log: curdir.c,v $ X * Revision 3.3 89/05/01 15:11:49 narten X * changed copyright header to reflect current distribution rules X * X * Revision 3.2 87/10/18 10:21:49 narten X * Updating version numbers. Changes relative to 1.1 are actually X * relative to 3.2 X * X * Revision 1.1 84/01/23 14:50:01 kcs X * Initial revision X * X * Revision 3.2 82/12/24 15:41:51 wft X * Changed curdir() such that it returns a pointer to the pathname of X * the current working directory, just as Berkeley's getcwd(). X * X * Revision 3.1 82/10/18 21:16:21 wft X * curdir() now uses stdio buffering for directory reads, X * returns to working directory after done, and closes the directories. X * A testprogram was also added. X * X *******************************************************************/ X X X#include "rcsbase.h" X#include <sys/param.h> X#include <sys/stat.h> X#include <sys/dir.h> X#define dot "." X#define dotdot ".." X X Xstatic char cwd[NCPPN]; X Xchar * curdir() X/* Function: places the pathname of the current directory into cwd X * and returns a pointer to it. Returns NULL on failure. X */ X{ X FILE *file; X struct stat d, dd; X struct direct dir; X X int rdev, rino; X int off; X register i,j; X X cwd[off= 0] = '/'; X cwd[1] = '\0'; X stat("/", &d); X rdev = d.st_dev; X rino = d.st_ino; X for (;;) { X if (stat(dot, &d)<0) return NULL; X if (d.st_ino==rino && d.st_dev==rdev) { X if (cwd[off] == '/') cwd[off] = '\0'; X chdir(cwd); /*change back to current directory*/ X return cwd; X } X if ((file = fopen(dotdot,"r")) == NULL) return NULL; X if (fstat(fileno(file), &dd)<0) goto fail; X chdir(dotdot); X if(d.st_dev == dd.st_dev) { X if(d.st_ino == dd.st_ino) { X if (cwd[off] == '/') cwd[off] = '\0'; X chdir(cwd); /*change back to current directory*/ X fclose(file); X return cwd; X } X do { X if (fread((char *)&dir, sizeof(dir), 1, file) !=1) X goto fail; X } while (dir.d_ino != d.st_ino); X } X else do { X if(fread((char *)&dir, sizeof(dir), 1, file) != 1) { X goto fail; X } X stat(dir.d_name, &dd); X } while(dd.st_ino != d.st_ino || dd.st_dev != d.st_dev); X fclose(file); X X /* concatenate file name */ X i = -1; X while (dir.d_name[++i] != 0); X for(j=off+1; j>0; --j) X cwd[j+i+1] = cwd[j]; X off=i+off+1; X cwd[i+1] = '/'; X for(--i; i>=0; --i) X cwd[i+1] = dir.d_name[i]; X } /* end for */ X Xfail: fclose(file); X return NULL; X} X X X#ifdef TEST Xmain () X{ X printf ("pwd = %s\n", curdir()); X} X#endif TEST X X@ X X X3.3.2.1 Xlog X@Start of Amiga RCS port branch. X@ Xtext X@d36 1 Xa36 5 X<<<<<<< curdir.c X "$Header: /u/softeng/rsbx/rcs/amiga/RCS.cbmvax/curdir.c,v 3.3.1.1 89/08/11 01:41:44 rsbx Exp Locker: rsbx $"; X======= X "$Header: /u/softeng/rsbx/rcs/amiga/RCS/curdir.c,v 1.2 89/09/17 13:40:50 rick Exp $"; X>>>>>>> 1.2 Xa39 4 X<<<<<<< curdir.c X * Revision 3.3.1.1 89/08/11 01:41:44 rsbx X * Start of cbmvax RCS source branch. X * Xa40 3 X * checked in with -k by rsbx at 89.08.10.16.01.39. X * X * Revision 3.3 89/05/01 15:11:49 narten Xa41 9 X======= X * Revision 1.2 89/09/17 13:40:50 rick X * Port to AmigaDos done by Rick Schaeffer (ricks@@iscuva.iscs.com) X * All changes done with condition compile (#ifdef AMIGA). This X * version compiles correctly with Lattice C version 5.02 or later. X * X * Revision 1.1 89/09/17 13:04:17 rick X * Initial revision X>>>>>>> 1.2 X@ X X X3.3.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@d36 5 Xa40 1 X "$Header: /u/softeng/rsbx/rcs/amiga/RCS/curdir.c,v 3.3.2.1 89/10/13 19:17:29 rsbx Exp Locker: rsbx $"; Xd44 1 Xa44 3 X * Revision 3.3.2.1 89/10/13 19:17:29 rsbx X * Start of Amiga RCS port branch. X * Xd53 9 X@ X X X3.3.1.1 Xlog X@Start of cbmvax RCS source branch. X@ Xtext X@d36 1 Xa36 1 X "$Header: /u/softeng/rsbx/rcs/rcs.uunet/src/RCS/curdir.c,v 3.3 89/05/01 15:11:49 narten Exp $"; Xa39 3 X * Revision 3.3 89/05/01 15:11:49 narten X * checked in with -k by rsbx at 89.08.10.16.01.39. X * X@ SHAR_EOF echo "End of archive 13 (of 14)" # if you want to concatenate archives, remove anything after this line exit