Index: gnu/rcs/MSDOS/Makefile
diff -u /dev/null gnu/rcs/MSDOS/Makefile:1.1
--- /dev/null	Sun Feb  2 22:42:20 1997
+++ gnu/rcs/MSDOS/Makefile	Wed Sep 13 20:10:09 1995
@@ -0,0 +1,15 @@
+#
+# Makefile for preparing MS-DOS version of RCS
+#  $Id: Makefile,v 1.1 1995/09/14 03:10:09 elf Exp $
+#
+# written by Marc Singer (elf@netcom.com)
+# 3 August 1995
+#
+
+.PHONY: all release
+
+all:
+
+release:
+	cvs patch -r RCS_5_7 rcs > patch_new
+	
\ No newline at end of file
Index: gnu/rcs/MSDOS/Makefile.src
diff -u /dev/null gnu/rcs/MSDOS/Makefile.src:1.3
--- /dev/null	Sun Feb  2 22:42:20 1997
+++ gnu/rcs/MSDOS/Makefile.src	Sun Feb  2 22:23:13 1997
@@ -0,0 +1,279 @@
+# Generated automatically from Makefile.in by configure.
+# Make RCS.
+
+#	$Id: Makefile.src,v 1.3 1997/02/03 06:23:13 elf Exp $
+
+# Copyright 1982, 1988, 1989 Walter Tichy
+# Copyright 1990, 1991, 1992, 1993, 1994, 1995 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,
+# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# Report problems and direct all questions to:
+#
+#    rcs-bugs@cs.purdue.edu
+
+
+# default target
+default :: all
+
+# See the file INSTALL.RCS for more information on the configuration section.
+# ----- start of configuration section -----
+
+#(Unix
+
+srcdir = .
+prefix = /usr
+exec_prefix = ${prefix}
+
+CC = gcc
+CPPFLAGS = 
+CFLAGS = -g -O2 -fomit-frame-pointer
+DEFS =  
+DIFF = /usr/bin/diff
+DIFF3 = /usr/bin/diff3
+DIFF3_BIN = 1
+DIFFFLAGS = -an
+DIFF_L = 1
+DIFF_FAILURE = 1
+DIFF_SUCCESS = 0
+DIFF_TROUBLE = 2
+ED = /bin/ed
+INSTALL = /usr/bin/ginstall -c
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_PROGRAM = ${INSTALL}
+LDFLAGS = 
+LIBS = 
+SENDMAIL = "/usr/lib/sendmail"
+
+# Standard shell commands added for DJGPP v2.01.  We used to use the
+# DOS shell commands, but this does not work with Make 3.75.  These
+# commands are available in DJGPP v2.01, so we can use the real
+# thang.
+
+CP =cp
+RM =rm
+MV =mv
+
+# The following definitions can be tailored by hand;
+# this shouldn't be needed for ordinary installations.
+
+ bindir = $(exec_prefix)/bin
+
+ ALL_CFLAGS = $(CPPFLAGS) -Dhas_conf_h $(DEFS) -I. -I$(srcdir) $(CFLAGS)
+
+ COMPAT2 = 0
+#COMPAT2 = 1
+
+ LIBOBJS =
+
+ LINK = $(CC) $(LDFLAGS) $(CFLAGS)
+
+ LINT = lint -abchx# traditional and BSD lint
+#LINT = lint# System V lint
+
+#RCSPREFIX should end in `/' if it is not empty.
+ RCSPREFIX = $(bindir)/
+
+ REMOVE = rm -f
+
+ o = .o
+#o = .s# Minix/PC with ACK cc
+
+ x =
+
+#)
+# On non-Unix hosts you must manually create and edit conf.h from conf.heg.
+
+# ----- end of configuration section -----
+# You shouldn't have to change anything past this point.
+
+
+define stubify
+	@echo Making stripped EXE.
+	$(CP) $@ a.out
+	strip a.out
+	stubify a.out
+	$(RM) $@.exe
+	$(MV) a.exe $@.exe
+	$(RM) a.out
+endef
+
+# Avoid brain damage in some versions of 'make'.
+SHELL = /bin/sh
+
+PROGRAMS = ci$x co$x ident$x merge$x \
+	rcs$x rcsclean$x rcsdiff$x rcsmerge$x rlog$x
+
+all :: $(PROGRAMS)
+
+.SUFFIXES :
+.SUFFIXES : .c $o
+.c$o :
+	$(CC) -c $(ALL_CFLAGS) $<
+
+installdirs :: ../mkinstalldirs
+	$(srcdir)/../mkinstalldirs $(bindir)
+
+install :: all installdirs
+	for p in $(PROGRAMS); do \
+	  $(INSTALL_PROGRAM) $$p $(bindir)/$$p; \
+	done
+
+uninstall ::
+	for p in $(PROGRAMS); do \
+	  $(REMOVE) $(bindir)/$$p; \
+	done
+
+# Install RCS and (if applicable) GNU diff before running these tests.
+# To test RCS before installing it, see the file INSTALL.RCS.
+RCSTEST = \
+	ALL_CFLAGS='$(ALL_CFLAGS)' CC='$(CC)' DIFF='$(DIFF)' \
+	LDFLAGS='$(LDFLAGS)' LIBS='$(LIBS)' \
+	PATH=$(bindir):$$PATH \
+	sh $(srcdir)/rcstest
+installcheck ::
+	$(RCSTEST)
+installdebug ::
+	$(RCSTEST) -v
+
+clean ::
+	$(REMOVE) a.* RCS/a.*
+	$(REMOVE) *$o
+	$(REMOVE) $(PROGRAMS)
+	$(REMOVE) conf.err core core.* *.core
+
+mostlyclean :: clean
+
+distclean :: mostlyclean
+	$(REMOVE) conf.h Makefile
+
+maintainer-clean :: distclean
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+	$(REMOVE) TAGS
+
+safe : conf.h glob.c glob.h makefile rcsbase.h rcsfnms.c rcslinks.c rcsutil.c\
+	merger.c rcs.c rcsdiff.c co.c rcsmerge.c
+	pkzip new.zip conf.h glob.h makefile rcsbase.h
+	pkzip new.zip glob.c rcsfnms.c rcslinks.c rcsutil.c version.c
+	pkzip new.zip merger.c rcs.c rcsdiff.c co.c rcsmerge.c
+
+#(Unix
+#conf.h : conf.sh Makefile
+#	$(REMOVE) a.*
+#	ALL_CFLAGS='$(ALL_CFLAGS)' \
+#	CC='$(CC)' \
+#	COMPAT2='$(COMPAT2)' \
+#	DIFF3='$(DIFF3)' DIFF3_BIN='$(DIFF3_BIN)' \
+#	DIFF='$(DIFF)' DIFFFLAGS='$(DIFFFLAGS)' DIFF_L='$(DIFF_L)' \
+#	DIFF_SUCCESS='$(DIFF_SUCCESS)' \
+#	DIFF_FAILURE='$(DIFF_FAILURE)' \
+#	DIFF_TROUBLE='$(DIFF_TROUBLE)' \
+#	ED='$(ED)' \
+#	LDFLAGS='$(LDFLAGS)' LIBS='$(LIBS)' \
+#	RCSPREFIX='$(RCSPREFIX)' \
+#	SENDMAIL='$(SENDMAIL)' \
+#	$(SHELL) -x $(srcdir)/conf.sh 3>&1 >a.h 2>conf.err
+#	mv a.h $@
+#	$(REMOVE) a.* core core.* *.core
+#)
+
+ci = ci$o rcslex$o rcssyn$o rcsgen$o rcsedit$o rcskeys$o rcsmap$o \
+	rcsrev$o rcsutil$o rcsfnms$o maketime$o partime$o rcstime$o rcskeep$o \
+	rcsfcmp$o rcslinks$o glob$o version$o $(LIBOBJS)
+ci$x : $(ci)
+	$(LINK) $(ci) -o $@ $(LIBS)
+	@$(stubify)
+
+co = co$o rcslex$o rcssyn$o rcsgen$o rcsedit$o rcskeys$o rcsmap$o \
+	rcsrev$o rcsutil$o rcsfnms$o maketime$o partime$o rcstime$o rcskeep$o \
+	rcslinks$o glob$o version$o $(LIBOBJS)
+co$x : $(co)
+	$(LINK) $(co) -o $@ $(LIBS)
+	@$(stubify)
+
+ident = ident$o rcsmap$o version$o $(LIBOBJS)
+ident$x : $(ident)
+	$(LINK) $(ident) -o $@ $(LIBS)
+	@$(stubify)
+
+merge = merge$o merger$o rcsfnms$o rcslinks$o glob$o rcslex$o \
+	rcsmap$o rcsrev$o rcssyn$o rcsutil$o \
+	rcskeep$o rcskeys$o maketime$o partime$o rcstime$o version$o \
+	$(LIBOBJS)
+merge$x : $(merge)
+	$(LINK) $(merge) -o $@ $(LIBS)
+	@$(stubify)
+
+rlog = rlog$o rcslex$o rcsmap$o rcssyn$o rcsrev$o rcsutil$o \
+	maketime$o partime$o rcstime$o rcsfnms$o rcskeep$o rcskeys$o \
+	rcslinks$o glob$o version$o $(LIBOBJS)
+rlog$x : $(rlog)
+	$(LINK) $(rlog) -o $@ $(LIBS)
+	@$(stubify)
+
+rcs = rcs$o rcslex$o rcssyn$o rcsrev$o rcsutil$o rcsgen$o \
+	rcsedit$o rcskeys$o rcsmap$o rcsfnms$o rcslinks$o rcskeep$o \
+	maketime$o partime$o rcstime$o glob$o version$o $(LIBOBJS)
+rcs$x : $(rcs)
+	$(LINK) $(rcs) -o $@ $(LIBS)
+	@$(stubify)
+
+rcsclean = rcsclean$o rcsedit$o rcsfcmp$o rcsfnms$o rcsgen$o rcskeys$o \
+	rcslex$o rcsmap$o rcsrev$o rcssyn$o rcsutil$o rcskeep$o \
+	maketime$o partime$o rcstime$o rcslinks$o glob$o version$o $(LIBOBJS)
+rcsclean$x : $(rcsclean)
+	$(LINK) $(rcsclean) -o $@ $(LIBS)
+	@$(stubify)
+
+rcsdiff = rcsdiff$o rcsutil$o rcsfnms$o rcsmap$o rcsrev$o rcssyn$o \
+	rcslex$o maketime$o partime$o rcstime$o rcskeep$o rcskeys$o \
+	rcslinks$o glob$o version$o $(LIBOBJS)
+rcsdiff$x : $(rcsdiff)
+	$(LINK) $(rcsdiff) -o $@ $(LIBS)
+	@$(stubify)
+
+rcsmerge = rcsmerge$o merger$o rcsutil$o rcsfnms$o rcsmap$o rcsrev$o \
+	rcssyn$o rcslex$o rcskeep$o rcskeys$o rcslinks$o glob$o \
+	maketime$o partime$o rcstime$o version$o $(LIBOBJS)
+rcsmerge$x : $(rcsmerge)
+	$(LINK) $(rcsmerge) -o $@ $(LIBS)
+	@$(stubify)
+
+SOURCE=	ci.c co.c ident.c maketime.c merge.c merger.c partime.c rcs.c \
+	rcsclean.c rcsdiff.c rcsedit.c rcsfcmp.c rcsfnms.c rcsgen.c \
+	rcskeep.c rcskeys.c rcslex.c rcsmap.c rcsmerge.c rcsrev.c rcssyn.c \
+	rcstime.c rcsutil.c rlog.c rcslinks.c glob.c version.c
+OBJECT=	ci$o co$o ident$o maketime$o merge$o merger$o partime$o rcs$o \
+	rcsclean$o rcsdiff$o rcsedit$o rcsfcmp$o rcsfnms$o rcsgen$o \
+	rcskeep$o rcskeys$o rcslex$o rcsmap$o rcsmerge$o rcsrev$o rcssyn$o \
+	rcstime$o rcsutil$o rlog$o rcslinks$o glob$o version$o
+
+lint :: conf.h
+	$(LINT) -DRCS_lint=1 $(ALL_CFLAGS) $(SOURCE)
+
+TAGS : $(SOURCE)
+	etags $(SOURCE)
+
+dvi info ::
+
+conf_h = conf.h
+$(OBJECT) : $(conf_h) rcsbase.h
+maketime$o partime$o rcstime$o : partime.h
+maketime$o rcstime$o : maketime.h
Index: gnu/rcs/MSDOS/RCSDOS.LSM
diff -u /dev/null gnu/rcs/MSDOS/RCSDOS.LSM:1.1
--- /dev/null	Sun Feb  2 22:42:20 1997
+++ gnu/rcs/MSDOS/RCSDOS.LSM	Sun Feb  2 22:41:32 1997
@@ -0,0 +1,21 @@
+Begin3
+Title:           RCSDOS
+Version:         5.7-patch12
+Date:		 2 February 1997
+Description:     RCSDOS is a patched, precompiled version of Walter
+		 Tichy's Revision Control System.  It includes
+		 enhancements to circumvent Un*x-like assumtions of
+		 RCS such as: soft file links for finding log files,
+		 appropriate CR-LF translation, and reading change
+		 comments from disk files.  Included is a PATCH (Larry
+		 Wall's) compatible unified diff of the changes to the
+ 		 standard RCS distribution.  The executables are
+		 compiled with DJGPP v2.01.  These binaries support 
+		 long filenames in Windows 95.
+Keywords:        RCS revision control SCCS MS-DOS DJGPP
+Authors:         Walter Tichy, Paul Eggert, Marc Singer <elf@netcom.com>
+Primary-Site:    ftp://thumper.redtech.com/pub/rcsdos
+Secondary-Site:  ftp://ftp.netcom.com/pub/el/elf/rcsdos
+Platforms:       MS-DOS
+Copying-Policy:  GNU GPL
+End
Index: gnu/rcs/MSDOS/README.TXT
diff -u /dev/null gnu/rcs/MSDOS/README.TXT:1.1
--- /dev/null	Sun Feb  2 22:42:20 1997
+++ gnu/rcs/MSDOS/README.TXT	Sun Feb  2 22:41:51 1997
@@ -0,0 +1,278 @@
+>>> rcsdos-5.7/README.TXT
+>>>  $Id: README.TXT,v 1.1 1997/02/03 06:41:51 elf Exp $
+>>>
+>>> RCS Revision Control for MS-DOS [package: RCSDOS-5.7]
+>>>   Patches and Binaries for RCS 5.7 (Patch Level 12)
+>>>
+>>> by Marc Singer (elf@netcom.com)
+>>>    2 Feb 1997
+>>>
+
+0.   Introduction
+1.   What and Where is RCSDOS-5.7?
+2.   QuickStart Instructions for the Impatient
+3.   Sharing Logfiles Between MS-DOS and Linux/UN*X
+4.   Compiling and Configuring RCSDOS-5.7
+5.   Bug Fixes and Extensions to RCS for MS-DOS
+ .1   RCS_SOFTLINKS
+ .2   CR-LF Translation
+ .3   RCSBIN Environment Variable
+ .4   Change Comments from Files
+6.   Known problems ( none %^) ) 
+7.   Storing Binary Files in RCS
+
+
+      0. Introduction
+
+This README provides four things.  Most importantly, it describes what
+RCSDOS-5.7 is and where you can get it.  Next comes the QuickStart
+section for getting RCS running at once.  There is a section
+describing how to configure and compile the patched version of the
+source.  And the final section describes some details about the
+enhancements to the RCS sources that were necessary to make it run on
+top of MS-DOS.
+
+This version of RCSDOS is compiled for DJGPP v2.01.  It is *not*
+compatible with earlier versions of DJGPP (according to advice on the
+DJGPP list).  I believe that the incompatibility is due to methods
+used to pass long command lines.  Overall, this version of RCS is very
+stable and has been working for me (and several silently happy users)
+for a couple of years.  
+
+Some of the original speed problems have not been satisfactorily
+addressed.  While I have crafted a set of perl scripts to handle
+commands to report who has what files locked and to synchronize my
+working directories, these operations tend to be slower with RCS than
+with the commercial packages.  I have not discovered any simple
+optimizations that will alleviate the bottlenecks.
+
+
+      1. What and Where is RCSDOS-5.7?
+
+It's a port of the revision control system, originally authored by
+Walter Tichy and presently maintained by Paul Eggert, to MS-DOS.
+You will find the compressed archives on 
+
+  ftp://thumper.redtech.com/pub/rcsdos
+or
+  ftp://ftp.netcom.com/pub/el/elf/rcsdos
+
+For a complete description of RCS and more information about using it,
+see your local GNU dealer.  You can find the RCS sources
+
+  ftp://ftp.cs.purdue.edu/pub/RCS
+
+
+      2. QuickStart Instructions for the Impatient
+
+You can find precompiled versions of the RCS programs and support
+utilities in the ZIP archive file RCSDOS57.ZIP.  Fetch and uncompress
+the archive.  If you retain the directory structure in the archive,
+there are two directories.  One contains the RCS binaries and the
+other contains the utilities.  It is best to copy all of these
+executables to the same directory so that you can use the RCSBINPATH
+environment variable.  More on this topic later.
+
+Create an environment variable USER with your `login' id.  This is the
+name that RCS uses to track you as the revision author, but because
+this is MS-DOS and NOT Linux, you can use anything.  I use a different
+id on MS-DOS from Linux so that I can keep track of where the
+revisions are being made.  So, I am `elf' on Linux and `elf-pc' on
+MS-DOS.
+
+If you are using vanilla MS-DOS, you will not be able to store your
+log files in the same directory as your source files due to the short
+file name limitation.  Windows 95 users need to be concerned with
+this problem.  Everyone else must create an environment variable
+RCSINIT that specifies the -x switch so that the RCS programs will
+not append ,v to the file names.  Make sure that a sub-directory
+named RCS exists in your working directory to contain the log files.
+
+The primary enhancement to RCS to make it operate on MS-DOS is the
+ability to use a symbolic link that points to the log files.
+Normally, the RCS programs look for a directory called RCS as a
+repository for log files.  If, instead, there is a file named `RCS'
+that contains an absolute pathname pointing to the real log file
+directory, these RCS programs will perform the indirection
+automatically.  In order to make RCSDIFF happy, the basename of this
+indirect log file directory needs either be `RCS' or it must have the
+extension `.RCS'.
+
+Here is an example.
+
+  Working directory:				c:/project/magic
+  Real (shared) log file directory:		r:/magic.rcs
+  Symbolic link file:				c:/project/magic/rcs
+      contains the string:			r:/magic.rcs
+
+Standard wildcards are supported, so commands like
+  rlog -h c:/project/magic/rcs/*.[hc]
+and
+  rlog rcs/*
+will work as expected.  Note that the seashell wildcard of *.{c,cpp}
+does not work.
+
+
+      3. Sharing Logfiles Between DOS and Linux/UN*X
+
+There are a couple of important things to note when sharing log files
+between DOS and Linux.  In general, the 5.7 release of RCS fixes the
+bugs in earlier releases where this sharing was difficult.
+
+The primary problem was that the lack CR/LF translation can interfere
+with programs on either end.  Version 5.7 (and a small bug fix of my
+own) fixes this.
+
+The only other sticking point is that you must declare your timezone
+on DOS so that the gmtime () function in DJGPP correctly reports GMT.
+If you do not do this RCS may disallow a checkin because the date of
+the previous revision is later than the date of the current revision.
+Set the TZ variable in your djgpp.env file (commonly found in
+C:/DJGPP/DJGPP.ENV) to something such as 
+
+  TZ=US/Pacific
+
+and RCS should be happy. (See note 1.)
+
+
+      4. Compiling and Configuring RCSDOS
+
+In the distribution archive RCSDOS57.ZIP, the file patch12 contains
+the unified diff format patches for the changes made to the standard
+RCS v5.7 source distribution.  The patch file is relative to the root
+directory of the RCS source tree.  In addition to this patch, you'll
+need the following:
+
+  DJGPP v2.01 or better
+  GNU C compiler for DJGPP v2.7.2.1
+  GNU Make and other binary utilities (distributed with DJGPP v2.01)
+  GNU Diff v2.6 (v2.7.1 is available as part of DJGPP v2.01)
+
+If you have a version of Larry Wall's PATCH program you can patch the
+source tree in place.  Otherwise, you may need to do the edits by
+hand.  For the most part, the changes are isolated to a few one-line
+changes in the standard RCS source files with a couple of new files,
+RCSLINKS.C, GLOB.C (GNU), GLOB.H (GNU), and the contents of the MSDOS
+directory.
+
+  1) Apply the file `PATCH12'.
+  2) Execute the shell script MSDOS/prepare.sh.  If you cannot execute
+     the script, simply copy MSDOS/conf.h and MSDOS/Makefile.src to
+     src/conf.h and src/Makefile.
+  3) Run GNU make is the src subdirectory.
+
+
+      5. Bug Fixes and Extensions to RCS for MS-DOS
+
+For the most part, porting RCS to DJGPP and MS-DOS is a matter of
+setting the appropriate options in the configuration file.  All of the
+segment violation errors and a good number of the errant behaviors of
+RCS can be corrected by finding the configuration switch that controls
+the non-standard behavior of the DJGPP C libraries--these problems
+appear to be rooted in MS-DOS and not any failing on the part of the
+DJGPP team.
+
+      5.1 RCS_SOFTLINKS
+
+This feature interprets path elements with the name RCS as containers
+for symbolic links and will replace all path elements up to and
+including the RCS reference with the contents of that file.  Note
+that this differs from the standard symbolic link which may be
+relative.  Simple, right?
+
+There are a couple of caveats.  The first is only a concern for
+MS-DOS (not Windows 95) users who are using the -x switch to
+eliminate the pesky ",v" logfile suffix.  RCSDIFF needs to be able to
+distinguish a workfile from a logfile.  It usually uses the ",v"
+suffix to identify logfiles, but the -x switch inhibits them which is
+necessary without long file names.  So, in order to identify the
+logfiles, the linked directory must be either `RCS' or a directory
+with the extension `.RCS'.  Thus the directory name that is in the
+RCS soft-link file must end with the letters `RCS'.  So far, this has
+not proven to be a bother.  If you do not use the -x switch, then
+this limitation is not imposed upon you.
+
+Let me give an explicit example.  Your development directory might
+have one source and the link file.
+
+   foozle.c      RCS
+
+The file RCS contains the absolute pathname of the real logfile
+directory: c:\logfiles\projfoo.rcs.  This directory could not be
+c:\logfiles\projfoo, but it could be c:\logfiles\projfoo\rcs.
+
+The second caveat is that we now have the problem that the command
+
+  rlog -h rcs/*
+
+cannot be expanded by DJGPP on starting the program.  MS-DOS sees a
+file named `rcs' so the wildcard is meaningless.  Thus, I added glob.c
+to the sources and perform link expansion in the function getRCSINIT.
+
+Scan the source code for RCS_SOFTLINKS for all of the places that were
+modified to support links.
+
+
+      5.2 CR-LF Translation
+
+Version 5.6 of RCSDOS always read and wrote logfiles and workfiles in
+the MS-DOS Text mode.  This caused binary data checked into RCS to be
+vulnerable to corruption if the data contained \x0a characters with
+a preceeding \x0d.  While there is a keyword mode -kb (see rcs.1),
+nothing is done to allow v5.6 logfiles to be readable by v5.7
+programs.  Thus, a change was made to the workfile processing code to
+always generate correct line termination sequences.
+
+
+      5.3 RCSBIN Environment Variable
+
+This environment variable is optional, but recommended.  When it is
+not present, the RCS programs search the PATH environment variable for
+programs.  RCS runs much more quickly when it does not have to search
+for programs.  RCSBIN points to the directory where the rcs
+programs, including the modern DIFF.EXE and DIFF3.EXE, are found.
+
+Note that this variable changed from RCSBINPATH to RCSBIN since the
+last patch.  This is to make it compatible with CVS which uses the
+variable RCSBIN to find RCS programs.
+
+
+      5.4 Change Comments from Files
+
+By prefixing the change comment with an at sign, `@', you can cause
+the checkin command to read the comment from a file.  For example:
+
+  ci -u -m @cmnt/changes.txt cycles.c
+
+
+      6. Known Problems
+
+When using DOS and not Windows 95, RCSDOS only supports the -x option
+which forces RCS to use the same name for the log file as the source.
+This means that you must use a separate RCS directory for the log
+files.  In Windows 95, this is no longer a limitation.
+ 
+The latest patches have no known bugs.
+
+
+      7. Storing Binary Files in RCS
+
+Though it has not been extensively tested, this release of RCS should
+support the binary logfile type.   Logfiles that will store binary
+data should be primed before storing data in them.
+
+  rcs -i -kb tomcat.bmp
+
+The -kb switch sets the keyword expansion mode for the file to binary.
+Check-in and check-out will function normally, but the deltas will
+store binary differences.
+
+
+-----
+Notes:
+ (1) TZ is needed in programs which do not access djgpp.env.  Some
+     internet access software fits in this category.  One package
+     defaults to PST on e-mail if TZ is not set in AUTOEXEC.BAT. I set
+     TZ=EST5 because I do not like Day Light Saving Time.  This works
+     with NIST [NBS] time set as well. 
+       [Frank Donahoe fdonahoe@wilkes1.wilkes.edu]
Index: gnu/rcs/MSDOS/conf.h
diff -u /dev/null gnu/rcs/MSDOS/conf.h:1.4
--- /dev/null	Sun Feb  2 22:42:20 1997
+++ gnu/rcs/MSDOS/conf.h	Wed Feb 21 16:07:20 1996
@@ -0,0 +1,409 @@
+/* RCS compile-time configuration */
+
+	/* $Id: conf.h,v 1.4 1996/02/22 00:07:20 elf Exp $ */
+
+/*
+ * This file is generated automatically.
+ * If you edit it by hand your changes may be lost.
+ * Instead, please try to fix conf.sh,
+ * and send your fixes to rcs-bugs@cs.purdue.edu.
+ */
+
+#define exitmain(n) return n /* how to exit from main() */
+/* #define _POSIX_C_SOURCE 2147483647L */ /* if strict C + Posix 1003.1b-1993 or later */
+/* #define _POSIX_SOURCE */ /* if strict C + Posix 1003.1-1990 */
+
+#include <errno.h>
+#include <stdio.h>
+#include <time.h>
+
+/* Comment out #include lines below that do not work.  */
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <limits.h>
+/* #include <mach/mach.h> */
+/* #include <net/errno.h> */
+#include <pwd.h>
+/* #include <siginfo.h> */
+#include <signal.h>
+#include <stdlib.h>
+#include <string.h>
+/* #include <sys/mman.h> */
+#include <sys/wait.h>
+/* #include <ucontext.h> */
+#include <unistd.h>
+#include <utime.h>
+/* #include <vfork.h> */
+
+#define RCS_SOFTLINKS	/* Permit special DOS mode link files */
+#define RCS_FILECOMMENTS /* Can read change comments from file */
+#define FORCE_STRIP_CR	/* Clobber all extraneous \r's.  For compatibility */
+
+/* Define boolean symbols to be 0 (false, the default), or 1 (true).  */
+#define has_sys_param_h 1 /* Does #include <sys/param.h> work?  */
+/* extern int errno; */ /* Uncomment if <errno.h> doesn't declare errno.  */
+#define has_readlink 0 /* Does readlink() work?  */
+#define readlink_isreg_errno EINVAL /* errno after readlink on regular file */
+
+#if has_readlink && !defined(MAXSYMLINKS)
+#	if has_sys_param_h
+#		include <sys/param.h>
+#	endif
+#	ifndef MAXSYMLINKS
+#		define MAXSYMLINKS 20 /* BSD; not standard yet */
+#	endif
+#endif
+
+/* Comment out the typedefs below if the types are already declared.  */
+/* Fix any uncommented typedefs that are wrong.  */
+/* typedef int mode_t; */
+/* typedef long off_t; */
+/* typedef int pid_t; */
+/* typedef int sig_atomic_t; */
+/* typedef unsigned size_t; */
+/* typedef int ssize_t; */
+/* typedef long time_t; */
+/* typedef int uid_t; */
+
+/* Comment out the keyword definitions below if the keywords work.  */
+/* #define const */
+/* #define volatile */
+
+/* Define boolean symbols to be 0 (false, the default), or 1 (true).  */
+#define has_prototypes 1 /* Do function prototypes work?  */
+#define has_stdarg 1 /* Does <stdarg.h> work?  */
+/* #define has_varargs ? */ /* Does <varargs.h> work?  */
+#define va_start_args 2 /* How many args does va_start() take?  */
+
+#if O_BINARY
+	/* Text and binary i/o behave differently.  */
+	/* This is incompatible with Posix and Unix.  */
+#	define FOPEN_RB "rb"
+#	define FOPEN_R_WORK (Expand==BINARY_EXPAND ? "rb" : "r")
+#	define FOPEN_WB "wb"
+#	define FOPEN_W_WORK (Expand==BINARY_EXPAND ? "wb" : "w")
+#	define FOPEN_WPLUS_WORK (Expand!=BINARY_EXPAND ? "w+" : "w+b")
+#	define OPEN_O_BINARY O_BINARY
+#else
+	/*
+	* Text and binary i/o behave the same.
+	* Omit "b", since some nonstandard hosts reject it.
+	*/
+#	define FOPEN_RB "r"
+#	define FOPEN_R_WORK "r"
+#	define FOPEN_WB "w"
+#	define FOPEN_W_WORK "w"
+#	define FOPEN_WPLUS_WORK "w+"
+#	define OPEN_O_BINARY 0
+#endif
+
+/* This may need changing on non-Unix systems (notably DOS).  */
+#define OPEN_CREAT_READONLY (S_IRUSR|S_IRGRP|S_IROTH) /* lock file mode */
+#define OPEN_O_LOCK 0 /* extra open flags for creating lock file */
+#define OPEN_O_WRONLY O_WRONLY /* main open flag for creating a lock file */
+
+/* Define or comment out the following symbols as needed.  */
+#if has_prototypes
+#	define P(params) params
+#else
+#	define P(params) ()
+#endif
+#if has_stdarg
+#	include <stdarg.h>
+#else
+#	if has_varargs
+#		include <varargs.h>
+#	else
+		typedef char *va_list;
+#		define va_dcl int va_alist;
+#		define va_start(ap) ((ap) = (va_list)&va_alist)
+#		define va_arg(ap,t) (((t*) ((ap)+=sizeof(t)))  [-1])
+#		define va_end(ap)
+#	endif
+#endif
+#if va_start_args == 2
+#	define vararg_start va_start
+#else
+#	define vararg_start(ap,p) va_start(ap)
+#endif
+#define bad_chmod_close 1 /* Can chmod() close file descriptors?  */
+#define bad_creat0 0 /* Do writes fail after creat(f,0)?  */
+#define bad_fopen_wplus 0 /* Does fopen(f,"w+") fail to truncate f?  */
+#define getlogin_is_secure 0 /* Is getlogin() secure?  Usually it's not.  */
+#define has_attribute_noreturn 1 /* Does __attribute__((noreturn)) work?  */
+#if has_attribute_noreturn
+#	define exiting __attribute__((noreturn))
+#else
+#	define exiting
+#endif
+#define has_dirent 1 /* Do opendir(), readdir(), closedir() work?  */
+#define void_closedir 0 /* Does closedir() yield void?  */
+#define has_fchmod 0 /* Does fchmod() work?  */
+#define has_fflush_input 1 /* Does fflush() work on input files?  */
+#define has_fputs 1 /* Does fputs() work?  */
+#define has_ftruncate 1 /* Does ftruncate() work?  */
+#define has_getuid 1 /* Does getuid() work?  */
+#define has_getpwuid 1 /* Does getpwuid() work?  */
+#define has_memcmp 1 /* Does memcmp() work?  */
+#define has_memcpy 1 /* Does memcpy() work?  */
+#define has_memmove 1 /* Does memmove() work?  */
+#define has_map_fd 0 /* Does map_fd() work?  */
+#define has_mmap 0 /* Does mmap() work on regular files?  */
+#define has_madvise 0 /* Does madvise() work?  */
+/* #define mmap_signal ? */ /* signal received if you reference nonexistent part of mmapped file */
+#define has_rename 1 /* Does rename() work?  */
+#define bad_a_rename 0 /* Does rename(A,B) fail if A is unwritable?  */
+#define bad_b_rename 0 /* Does rename(A,B) fail if B is unwritable?  */
+#define bad_NFS_rename 0 /* Can rename(A,B) falsely report success?  */
+/* typedef int void; */ /* Some ancient compilers need this.  */
+#define VOID (void) /* 'VOID e;' discards the value of an expression 'e'.  */
+#define has_seteuid 0 /* Does seteuid() work?  See ../INSTALL.RCS.  */
+#define has_setreuid 0 /* Does setreuid() work?  See ../INSTALL.RCS.  */
+#define has_setuid 1 /* Does setuid() exist?  */
+#define has_sigaction 1 /* Does struct sigaction work?  */
+#define has_sa_sigaction 0 /* Does struct sigaction have sa_sigaction?  */
+#define has_signal 1 /* Does signal() work?  */
+#define signal_type void /* type returned by signal handlers */
+#define sig_zaps_handler 0 /* Must a signal handler reinvoke signal()?  */
+/* #define has_sigblock ? */ /* Does sigblock() work?  */
+/* #define sigmask(s) (1 << ((s)-1)) */ /* Yield mask for signal number.  */
+typedef size_t fread_type; /* type returned by fread() and fwrite() */
+typedef size_t freadarg_type; /* type of their size arguments */
+typedef void *malloc_type; /* type returned by malloc() */
+#define has_getcwd 1 /* Does getcwd() work?  */
+/* #define has_getwd ? */ /* Does getwd() work?  */
+#define needs_getabsname 0 /* Must we define getabsname?  */
+#define has_mktemp 1 /* Does mktemp() work?  */
+#define has_NFS 0 /* Might NFS be used?  */
+#define has_psiginfo 0 /* Does psiginfo() work?  */
+#define has_psignal 0 /* Does psignal() work?  */
+/* #define has_si_errno ? */ /* Does siginfo_t have si_errno?  */
+/* #define has_sys_siglist ? */ /* Does sys_siglist[] work?  */
+/* #define strchr index */ /* Use old-fashioned name for strchr()?  */
+/* #define strrchr rindex */ /* Use old-fashioned name for strrchr()?  */
+#define bad_unlink 0 /* Does unlink() fail on unwritable files?  */
+#define has_vfork 0 /* Does vfork() work?  */
+#define has_fork 0 /* Does fork() work?  */
+#define has_spawn 1 /* Does spawn*() work?  */
+#define has_waitpid 1 /* Does waitpid() work?  */
+#define bad_wait_if_SIGCHLD_ignored 0 /* Does ignoring SIGCHLD break wait()?  */
+/* #define RCS_SHELL "/bin/sh" /* shell to run RCS subprograms */
+#define has_printf_dot 1 /* Does "%.2d" print leading 0?  */
+#define has_vfprintf 1 /* Does vfprintf() work?  */
+#define has_attribute_format_printf 1 /* Does __attribute__((format(printf,N,N+1))) work?  */
+#if has_attribute_format_printf
+#	define printf_string(m, n) __attribute__((format(printf, m, n)))
+#else
+#	define printf_string(m, n)
+#endif
+#if has_attribute_format_printf && has_attribute_noreturn
+	/* Work around a bug in GCC 2.5.x.  */
+#	define printf_string_exiting(m, n) __attribute__((format(printf, m, n), noreturn))
+#else
+#	define printf_string_exiting(m, n) printf_string(m, n) exiting
+#endif
+/* #define has__doprintf ? */ /* Does _doprintf() work?  */
+/* #define has__doprnt ? */ /* Does _doprnt() work?  */
+/* #undef EXIT_FAILURE */ /* Uncomment this if EXIT_FAILURE is broken.  */
+#define large_memory 1 /* Can main memory hold entire RCS files?  */
+#ifndef LONG_MAX
+#define LONG_MAX 2147483647L /* long maximum */
+#endif
+/* Do struct stat s and t describe the same file?  Answer d if unknown.  */
+#define same_file(s,t,d) ((s).st_ino==(t).st_ino && (s).st_dev==(t).st_dev)
+#define has_utimbuf 1 /* Does struct utimbuf work?  */
+#define CO compose_bin_path ("co") /* name of 'co' program */
+#define COMPAT2 0 /* Are version 2 files supported?  */
+#define DIFF compose_bin_path ("diff") /* name of 'diff' program */
+#define DIFF3 compose_bin_path ("diff3") /* name of 'diff3' program */
+#define DIFF3_BIN 1 /* Is diff3 user-visible (not the /usr/lib auxiliary)?  */
+#define DIFFFLAGS "-an" /* Make diff output suitable for RCS.  */
+#define DIFF_L 1 /* Does diff -L work?  */
+#define DIFF_SUCCESS 0 /* DIFF status if no differences are found */
+#define DIFF_FAILURE 1 /* DIFF status if differences are found */
+#define DIFF_TROUBLE 2 /* DIFF status if trouble */
+/* #define ED "/bin/ed" /* name of 'ed' program (used only if !DIFF3_BIN) */
+#define MERGE compose_bin_path ("merge") /* name of 'merge' program */
+#define TMPDIR "c:/tmp" /* default directory for temporary files */
+#define SLASH '/' /* principal filename separator */
+#define SLASHes '/' /* `case SLASHes:' labels all filename separators */
+#define isSLASH(c) ((c) == SLASH) /* Is arg a filename separator?  */
+#define ROOTPATH(p) isSLASH((p)[0]) /* Is p an absolute pathname?  */
+#define X_DEFAULT ",v/" /* default value for -x option */
+#define SLASHSLASH_is_SLASH 1 /* Are // and / the same directory?  */
+#define ALL_ABSOLUTE 0 /* Do all subprograms satisfy ROOTPATH?  */
+#define DIFF_ABSOLUTE 1 /* Is ROOTPATH(DIFF) true?  */
+#define SENDMAIL "c:/usr/lib/sendmail" /* how to send mail */
+#define TZ_must_be_set 0 /* Must TZ be set for gmtime() to work?  */
+
+
+
+/* Adjust the following declarations as needed.  */
+
+
+/*** These defined for DJGPP v2 */
+/*#undef  WTERMSIG */
+/*#undef  WIFSIGNALED */
+#define BINPATHVAR "RCSBIN"
+#include <process.h>
+
+/* The rest is for the benefit of non-standard, traditional hosts.  */
+/* Don't bother to declare functions that in traditional hosts do not appear, */
+/* or are declared in .h files, or return int or void.  */
+
+
+/* traditional BSD */
+
+#if has_sys_siglist && !defined(sys_siglist)
+	extern char const * const sys_siglist[];
+#endif
+
+
+/* Posix (ISO/IEC 9945-1: 1990 / IEEE Std 1003.1-1990) */
+
+/* <fcntl.h> */
+#ifdef O_CREAT
+#	define open_can_creat 1
+#else
+#	define open_can_creat 0
+#	define O_RDONLY 0
+#	define O_WRONLY 1
+#	define O_RDWR 2
+#	define O_CREAT 01000
+#	define O_TRUNC 02000
+#endif
+#ifndef O_EXCL
+#define O_EXCL 0
+#endif
+
+/* <sys/stat.h> */
+#ifndef S_IRUSR
+#	ifdef S_IREAD
+#		define S_IRUSR S_IREAD
+#	else
+#		define S_IRUSR 0400
+#	endif
+#	ifdef S_IWRITE
+#		define S_IWUSR S_IWRITE
+#	else
+#		define S_IWUSR (S_IRUSR/2)
+#	endif
+#endif
+#ifndef S_IRGRP
+#	if has_getuid
+#		define S_IRGRP (S_IRUSR / 0010)
+#		define S_IWGRP (S_IWUSR / 0010)
+#		define S_IROTH (S_IRUSR / 0100)
+#		define S_IWOTH (S_IWUSR / 0100)
+#	else
+		/* single user OS -- not Posix or Unix */
+#		define S_IRGRP 0
+#		define S_IWGRP 0
+#		define S_IROTH 0
+#		define S_IWOTH 0
+#	endif
+#endif
+#ifndef S_ISREG
+#define S_ISREG(n) (((n) & S_IFMT) == S_IFREG)
+#endif
+
+/* <sys/wait.h> */
+#ifndef WEXITSTATUS
+#define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8)
+#undef WIFEXITED /* Avoid 4.3BSD incompatibility with Posix.  */
+#endif
+#ifndef WIFEXITED
+#define WIFEXITED(stat_val) (((stat_val)  &  0377) == 0)
+#endif
+#ifndef WTERMSIG
+#define WTERMSIG(stato_val) ((stato_val) & 0177)
+#undef WIFSIGNALED /* Avoid 4.3BSD incompatibility with Posix.  */
+#endif
+#ifndef WIFSIGNALED
+#define WIFSIGNALED(stat_val) ((unsigned)(stat_val) - 1  <  0377)
+#endif
+
+/* <unistd.h> */
+char *getlogin P((void));
+#ifndef STDIN_FILENO
+#	define STDIN_FILENO 0
+#	define STDOUT_FILENO 1
+#	define STDERR_FILENO 2
+#endif
+#if has_fork && !has_vfork
+#	undef vfork
+#	define vfork fork
+#endif
+#if has_getcwd || !has_getwd
+	char *getcwd P((char*,size_t));
+#else
+	char *getwd P((char*));
+#endif
+#if has_setuid && !has_seteuid
+#	undef seteuid
+#	define seteuid setuid
+#endif
+#if has_spawn
+#	if ALL_ABSOLUTE
+#		define spawn_RCS spawnv
+#	else
+#		define spawn_RCS spawnvp
+#	endif
+#else
+#	if ALL_ABSOLUTE
+#		define exec_RCS execv
+#	else
+#		define exec_RCS execvp
+#	endif
+#endif
+
+/* utime.h */
+#if !has_utimbuf
+	struct utimbuf { time_t actime, modtime; };
+#endif
+
+
+/* Standard C library */
+
+/* <stdio.h> */
+#ifndef L_tmpnam
+#define L_tmpnam 32 /* power of 2 > sizeof("/usr/tmp/xxxxxxxxxxxxxxx") */
+#endif
+#ifndef SEEK_SET
+#define SEEK_SET 0
+#endif
+#ifndef SEEK_CUR
+#define SEEK_CUR 1
+#endif
+#if has_mktemp
+	char *mktemp P((char*)); /* traditional */
+#else
+	char *tmpnam P((char*));
+#endif
+
+/* <stdlib.h> */
+char *getenv P((char const*));
+void _exit P((int)) exiting;
+void exit P((int)) exiting;
+malloc_type malloc P((size_t));
+malloc_type realloc P((malloc_type,size_t));
+#ifndef EXIT_FAILURE
+#define EXIT_FAILURE 1
+#endif
+#ifndef EXIT_SUCCESS
+#define EXIT_SUCCESS 0
+#endif
+
+/* <string.h> */
+char *strcpy P((char*,char const*));
+char *strchr P((char const*,int));
+char *strrchr P((char const*,int));
+void *memcpy P((void*,void const*,size_t));
+#if has_memmove
+	void *memmove P((void*,void const*,size_t));
+#endif
+
+/* <time.h> */
+time_t time P((time_t*));
Index: gnu/rcs/MSDOS/prepare.sh
diff -u /dev/null gnu/rcs/MSDOS/prepare.sh:1.1
--- /dev/null	Sun Feb  2 22:42:20 1997
+++ gnu/rcs/MSDOS/prepare.sh	Mon Aug 21 17:04:51 1995
@@ -0,0 +1,12 @@
+#!/bin/sh
+#
+# Copyright (c) 1995, Marc Singer
+#
+# You may distribute under the terms of the GNU General Public License.
+#
+
+# Copy preconfigured headers/Makefiles
+
+cp conf.h ../src/conf.h
+cp Makefile.src ../src/Makefile
+
Index: gnu/rcs/src/glob.c
diff -u /dev/null gnu/rcs/src/glob.c:1.1
--- /dev/null	Sun Feb  2 22:42:22 1997
+++ gnu/rcs/src/glob.c	Wed Aug  2 22:16:26 1995
@@ -0,0 +1,658 @@
+/* Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+This library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+/* AIX requires this to be the first thing in the file.  */
+#if defined (_AIX) && !defined (__GNUC__)
+#pragma alloca
+#endif
+
+#ifdef	HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#define POSIX
+
+
+#include <errno.h>
+#include <sys/types.h>
+#define HAVE_STRING_H
+
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+   actually compiling the library itself.  This code is part of the GNU C
+   Library, but also included in many other GNU distributions.  Compiling
+   and linking in this code is a waste when using the GNU C library
+   (especially if it is a shared library).  Rather than having every GNU
+   program understand `configure --with-gnu-libc' and omit the object files,
+   it is simpler to just do this in the source for each such file.  */
+
+#if defined (_LIBC) || !defined (__GNU_LIBRARY__)
+
+
+#ifdef	STDC_HEADERS
+#include <stddef.h>
+#endif
+
+#ifdef	HAVE_UNISTD_H
+#include <unistd.h>
+#ifndef POSIX
+#ifdef	_POSIX_VERSION
+#define	POSIX
+#endif
+#endif
+#endif
+
+#if !defined(__GNU_LIBRARY__) && !defined(STDC_HEADERS)
+extern int errno;
+#endif
+
+#ifndef	NULL
+#define	NULL	0
+#endif
+
+#if	defined (POSIX) || defined (DIRENT) || defined (__GNU_LIBRARY__)
+#include <dirent.h>
+#ifndef	__GNU_LIBRARY__
+#define D_NAMLEN(d) strlen((d)->d_name)
+#else /* GNU C library.  */
+#define D_NAMLEN(d) ((d)->d_namlen)
+#endif /* Not GNU C library.  */
+#else /* Not POSIX or DIRENT.  */
+#define direct dirent
+#define D_NAMLEN(d) ((d)->d_namlen)
+#ifdef	SYSNDIR
+#include <sys/ndir.h>
+#endif /* SYSNDIR */
+#ifdef	SYSDIR
+#include <sys/dir.h>
+#endif /* SYSDIR */
+#ifdef NDIR
+#include <ndir.h>
+#endif /* NDIR */
+#endif /* POSIX or DIRENT or __GNU_LIBRARY__.  */
+
+#if defined (POSIX) && !defined (__GNU_LIBRARY__)
+/* Posix does not require that the d_ino field be present, and some
+   systems do not provide it. */
+#define REAL_DIR_ENTRY(dp) 1
+#else
+#define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
+#endif /* POSIX */
+
+#if	(defined (STDC_HEADERS) || defined (__GNU_LIBRARY__))
+#include <stdlib.h>
+#include <string.h>
+#define	ANSI_STRING
+#else /* No standard headers.  */
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#define	ANSI_STRING
+#else
+#include <strings.h>
+#endif
+#ifdef	HAVE_MEMORY_H
+#include <memory.h>
+#endif
+
+extern char *malloc (), *realloc ();
+extern void free ();
+
+extern void qsort ();
+/* extern void abort (), exit (); */
+
+#endif /* Standard headers.  */
+
+#ifndef	ANSI_STRING
+
+#ifndef	bzero
+extern void bzero ();
+#endif
+#ifndef	bcopy
+extern void bcopy ();
+#endif
+
+#define	memcpy(d, s, n)	bcopy ((s), (d), (n))
+#define	strrchr	rindex
+/* memset is only used for zero here, but let's be paranoid.  */
+#define	memset(s, better_be_zero, n) \
+  ((void) ((better_be_zero) == 0 ? (bzero((s), (n)), 0) : (abort(), 0)))
+#endif /* Not ANSI_STRING.  */
+
+#ifndef	HAVE_STRCOLL
+#define	strcoll	strcmp
+#endif
+
+
+#ifndef	__GNU_LIBRARY__
+#ifdef	__GNUC__
+__inline
+#endif
+static char *
+my_realloc (p, n)
+  char *p;
+  unsigned int n;
+{
+  /* These casts are the for sake of the broken Ultrix compiler,
+     which warns of illegal pointer combinations otherwise.  */
+  if (p == NULL)
+    return (char *) malloc (n);
+  return (char *) realloc (p, n);
+}
+
+#define	realloc	my_realloc
+#endif
+
+
+#if	!defined(__alloca) && !defined(__GNU_LIBRARY__)
+
+#ifdef	__GNUC__
+#undef	alloca
+#define	alloca(n)	__builtin_alloca (n)
+#else /* Not GCC.  */
+#if	defined (sparc) || defined (HAVE_ALLOCA_H)
+#include <alloca.h>
+#else /* Not sparc or HAVE_ALLOCA_H.  */
+#ifndef	_AIX
+extern char *alloca ();
+#endif /* Not _AIX.  */
+#endif /* sparc or HAVE_ALLOCA_H.  */
+#endif /* GCC.  */
+
+#define	__alloca	alloca
+
+#endif
+
+#ifndef	STDC_HEADERS
+#undef	size_t
+#define	size_t	unsigned int
+#endif
+
+/* Some system header files erroneously define these.
+   We want our own definitions from <fnmatch.h> to take precedence.  */
+#undef	FNM_PATHNAME
+#undef	FNM_NOESCAPE
+#undef	FNM_PERIOD
+#include <fnmatch.h>
+
+#ifndef	FNM_PERIOD
+#define FNM_PERIOD (1 << 2)
+#endif
+
+#ifndef	FNM_NOESCAPE
+#define FNM_NOESCAPE FNM_QUOTE
+#endif
+
+
+/* Some system header files erroneously define these.
+   We want our own definitions from <glob.h> to take precedence.  */
+#undef	GLOB_ERR
+#undef	GLOB_MARK
+#undef	GLOB_NOSORT
+#undef	GLOB_DOOFFS
+#undef	GLOB_NOCHECK
+#undef	GLOB_APPEND
+#undef	GLOB_NOESCAPE
+#undef	GLOB_PERIOD
+#include "glob.h"
+
+__ptr_t (*__glob_opendir_hook) __P ((const char *directory));
+  const char *(*__glob_readdir_hook) __P ((__ptr_t stream));
+  void (*__glob_closedir_hook) __P ((__ptr_t stream));
+
+  static int glob_pattern_p __P ((const char *pattern, int quote));
+  static int glob_in_dir __P ((const char *pattern, const char *directory,
+			       int flags,
+			       int (*errfunc) __P ((const char *, int)),
+			       glob_t * pglob));
+  static int prefix_array __P ((const char *prefix, char **array, size_t n));
+  static int collated_compare __P ((const __ptr_t, const __ptr_t));
+
+  /* Do glob searching for PATTERN, placing results in PGLOB.
+   The bits defined above may be set in FLAGS.
+   If a directory cannot be opened or read and ERRFUNC is not nil,
+   it is called with the pathname that caused the error, and the
+   `errno' value from the failing call; if it returns non-zero
+   `glob' returns GLOB_ABEND; if it returns zero, the error is ignored.
+   If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned.
+   Otherwise, `glob' returns zero.  */
+  int
+   glob (pattern, flags, errfunc, pglob)
+  const char *pattern;
+  int flags;
+  int (*errfunc) __P ((const char *, int));
+  glob_t *pglob;
+{
+  const char *filename;
+  char *dirname;
+  size_t dirlen;
+  int status;
+  int oldcount;
+
+  if (pattern == NULL || pglob == NULL || (flags & ~__GLOB_FLAGS) != 0) {
+    errno = EINVAL;
+    return -1;
+  }
+
+  /* Find the filename.  */
+  filename = strrchr (pattern, '/');
+  if (filename == NULL) {
+    filename = pattern;
+    dirname = (char *) ".";
+    dirlen = 0;
+  }
+  else if (filename == pattern) {
+    /* "/pattern".  */
+    dirname = (char *) "/";
+    dirlen = 1;
+    ++filename;
+  }
+  else {
+    dirlen = filename - pattern;
+    dirname = (char *) __alloca (dirlen + 1);
+    memcpy (dirname, pattern, dirlen);
+    dirname[dirlen] = '\0';
+    ++filename;
+  }
+
+  if (filename[0] == '\0' && dirlen > 1)
+    /* "pattern/".  Expand "pattern", appending slashes.  */
+  {
+    int ret = glob (dirname, flags | GLOB_MARK, errfunc, pglob);
+    if (ret == 0)
+      pglob->gl_flags = (pglob->gl_flags & ~GLOB_MARK) | (flags & GLOB_MARK);
+    return ret;
+  }
+
+  if (!(flags & GLOB_APPEND)) {
+    pglob->gl_pathc = 0;
+    pglob->gl_pathv = NULL;
+  }
+
+  oldcount = pglob->gl_pathc;
+
+  if (glob_pattern_p (dirname, !(flags & GLOB_NOESCAPE))) {
+    /* The directory name contains metacharacters, so we
+	 have to glob for the directory, and then glob for
+	 the pattern in each directory found.  */
+    glob_t dirs;
+    register int i;
+
+    status = glob (dirname,
+		   ((flags & (GLOB_ERR | GLOB_NOCHECK | GLOB_NOESCAPE)) |
+		    GLOB_NOSORT),
+		   errfunc, &dirs);
+    if (status != 0)
+      return status;
+
+    /* We have successfully globbed the preceding directory name.
+	 For each name we found, call glob_in_dir on it and FILENAME,
+	 appending the results to PGLOB.  */
+    for (i = 0; i < dirs.gl_pathc; ++i) {
+      int oldcount;
+
+#ifdef	SHELL
+      {
+	/* Make globbing interruptible in the bash shell. */
+	extern int interrupt_state;
+
+	if (interrupt_state) {
+	  globfree (&dirs);
+	  globfree (&files);
+	  return GLOB_ABEND;
+	}
+      }
+#endif /* SHELL.  */
+
+      oldcount = pglob->gl_pathc;
+      status = glob_in_dir (filename, dirs.gl_pathv[i],
+			    (flags | GLOB_APPEND) & ~GLOB_NOCHECK,
+			    errfunc, pglob);
+      if (status == GLOB_NOMATCH)
+	/* No matches in this directory.  Try the next.  */
+	continue;
+
+      if (status != 0) {
+	globfree (&dirs);
+	globfree (pglob);
+	return status;
+      }
+
+      /* Stick the directory on the front of each name.  */
+      if (prefix_array (dirs.gl_pathv[i],
+			&pglob->gl_pathv[oldcount],
+			pglob->gl_pathc - oldcount)) {
+	globfree (&dirs);
+	globfree (pglob);
+	return GLOB_NOSPACE;
+      }
+    }
+
+    flags |= GLOB_MAGCHAR;
+
+    if (pglob->gl_pathc == oldcount)
+      /* No matches.  */
+      if (flags & GLOB_NOCHECK) {
+	const size_t len = strlen (pattern) + 1;
+	char *patcopy = (char *) malloc (len);
+	if (patcopy == NULL)
+	  return GLOB_NOSPACE;
+	memcpy (patcopy, pattern, len);
+
+	pglob->gl_pathv
+	  = (char **) realloc (pglob->gl_pathv,
+			       (pglob->gl_pathc +
+				((flags & GLOB_DOOFFS) ?
+				 pglob->gl_offs : 0) +
+				1 + 1) *
+			       sizeof (char *));
+	if (pglob->gl_pathv == NULL) {
+	  free (patcopy);
+	  return GLOB_NOSPACE;
+	}
+
+	if (flags & GLOB_DOOFFS)
+	  while (pglob->gl_pathc < pglob->gl_offs)
+	    pglob->gl_pathv[pglob->gl_pathc++] = NULL;
+
+	pglob->gl_pathv[pglob->gl_pathc++] = patcopy;
+	pglob->gl_pathv[pglob->gl_pathc] = NULL;
+	pglob->gl_flags = flags;
+      }
+      else
+	return GLOB_NOMATCH;
+  }
+  else {
+    status = glob_in_dir (filename, dirname, flags, errfunc, pglob);
+    if (status != 0)
+      return status;
+
+    if (dirlen > 0) {
+      /* Stick the directory on the front of each name.  */
+      if (prefix_array (dirname,
+			&pglob->gl_pathv[oldcount],
+			pglob->gl_pathc - oldcount)) {
+	globfree (pglob);
+	return GLOB_NOSPACE;
+      }
+    }
+  }
+
+  if (!(flags & GLOB_NOSORT))
+    /* Sort the vector.  */
+    qsort ((__ptr_t) & pglob->gl_pathv[oldcount],
+	   pglob->gl_pathc - oldcount,
+	   sizeof (char *), collated_compare);
+
+  return 0;
+}
+
+
+/* Free storage allocated in PGLOB by a previous `glob' call.  */
+void
+globfree (pglob)
+  register glob_t *pglob;
+{
+  if (pglob->gl_pathv != NULL) {
+    register int i;
+    for (i = 0; i < pglob->gl_pathc; ++i)
+      if (pglob->gl_pathv[i] != NULL)
+	free ((__ptr_t) pglob->gl_pathv[i]);
+    free ((__ptr_t) pglob->gl_pathv);
+  }
+}
+
+
+/* Do a collated comparison of A and B.  */
+static int
+collated_compare (a, b)
+  const __ptr_t a;
+  const __ptr_t b;
+{
+  const char *const s1 = *(const char *const *const) a;
+  const char *const s2 = *(const char *const *const) b;
+
+  if (s1 == s2)
+    return 0;
+  if (s1 == NULL)
+    return 1;
+  if (s2 == NULL)
+    return -1;
+  return strcoll (s1, s2);
+}
+
+
+/* Prepend DIRNAME to each of N members of ARRAY, replacing ARRAY's
+   elements in place.  Return nonzero if out of memory, zero if successful.
+   A slash is inserted between DIRNAME and each elt of ARRAY,
+   unless DIRNAME is just "/".  Each old element of ARRAY is freed.  */
+static int
+prefix_array (dirname, array, n)
+  const char *dirname;
+  char **array;
+  const size_t n;
+{
+  register size_t i;
+  size_t dirlen = strlen (dirname);
+
+  if (dirlen == 1 && dirname[0] == '/')
+    /* DIRNAME is just "/", so normal prepending would get us "//foo".
+       We want "/foo" instead, so don't prepend any chars from DIRNAME.  */
+    dirlen = 0;
+
+  for (i = 0; i < n; ++i) {
+    const size_t eltlen = strlen (array[i]) + 1;
+    char *new = (char *) malloc (dirlen + 1 + eltlen);
+    if (new == NULL) {
+      while (i > 0)
+	free ((__ptr_t) array[--i]);
+      return 1;
+    }
+
+    memcpy (new, dirname, dirlen);
+    new[dirlen] = '/';
+    memcpy (&new[dirlen + 1], array[i], eltlen);
+    free ((__ptr_t) array[i]);
+    array[i] = new;
+  }
+
+  return 0;
+}
+
+
+/* Return nonzero if PATTERN contains any metacharacters.
+   Metacharacters can be quoted with backslashes if QUOTE is nonzero.  */
+static int
+glob_pattern_p (pattern, quote)
+  const char *pattern;
+  const int quote;
+{
+  register const char *p;
+  int open = 0;
+
+  for (p = pattern; *p != '\0'; ++p)
+    switch (*p) {
+      case '?':
+      case '*':
+	return 1;
+
+      case '\\':
+	if (quote)
+	  ++p;
+	break;
+
+      case '[':
+	open = 1;
+	break;
+
+      case ']':
+	if (open)
+	  return 1;
+	break;
+    }
+
+  return 0;
+}
+
+
+/* Like `glob', but PATTERN is a final pathname component,
+   and matches are searched for in DIRECTORY.
+   The GLOB_NOSORT bit in FLAGS is ignored.  No sorting is ever done.
+   The GLOB_APPEND flag is assumed to be set (always appends).  */
+static int
+glob_in_dir (pattern, directory, flags, errfunc, pglob)
+  const char *pattern;
+  const char *directory;
+  int flags;
+  int (*errfunc) __P ((const char *, int));
+  glob_t *pglob;
+{
+  __ptr_t stream;
+
+  struct globlink {
+    struct globlink *next;
+    char *name;
+  };
+  struct globlink *names = NULL;
+  size_t nfound = 0;
+
+  if (!glob_pattern_p (pattern, !(flags & GLOB_NOESCAPE))) {
+    stream = NULL;
+    flags |= GLOB_NOCHECK;
+  }
+  else {
+    flags |= GLOB_MAGCHAR;
+
+    stream = (__glob_opendir_hook ? (*__glob_opendir_hook) (directory)
+	      : (__ptr_t) opendir (directory));
+    if (stream == NULL) {
+      if ((errfunc != NULL && (*errfunc) (directory, errno)) ||
+	  (flags & GLOB_ERR))
+	return GLOB_ABEND;
+    }
+    else
+      while (1) {
+	const char *name;
+	size_t len;
+
+	if (__glob_readdir_hook) {
+	  name = (*__glob_readdir_hook) (stream);
+	  if (name == NULL)
+	    break;
+	  len = 0;
+	}
+	else {
+	  struct dirent *d = readdir ((DIR *) stream);
+	  if (d == NULL)
+	    break;
+	  if (!REAL_DIR_ENTRY (d))
+	    continue;
+	  name = d->d_name;
+#ifdef	HAVE_D_NAMLEN
+	  len = d->d_namlen;
+#else
+	  len = 0;
+#endif
+	}
+
+	if ((flags & GLOB_NODOTDIR)
+	    && (!strcmp (name, ".") || !strcmp (name, "..")))
+	  continue;
+
+	if (fnmatch (pattern, name,
+		     (!(flags & GLOB_PERIOD) ? FNM_PERIOD : 0) |
+		     ((flags & GLOB_NOESCAPE) ? FNM_NOESCAPE : 0)) == 0) {
+	  struct globlink *new
+	  = (struct globlink *) __alloca (sizeof (struct globlink));
+	  if (len == 0)
+	    len = strlen (name);
+	  new->name
+	    = (char *) malloc (len + ((flags & GLOB_MARK) ? 1 : 0) + 1);
+	  if (new->name == NULL)
+	    goto memory_error;
+	  memcpy ((__ptr_t) new->name, name, len);
+	  if (flags & GLOB_MARK)
+	    new->name[len++] = '/';
+	  new->name[len] = '\0';
+	  new->next = names;
+	  names = new;
+	  ++nfound;
+	}
+      }
+  }
+
+  if (nfound == 0 && (flags & GLOB_NOCHECK)) {
+    size_t len = strlen (pattern);
+    nfound = 1;
+    names = (struct globlink *) __alloca (sizeof (struct globlink));
+    names->next = NULL;
+    names->name = (char *) malloc (len + ((flags & GLOB_MARK) ? 1 : 0) + 1);
+    if (names->name == NULL)
+      goto memory_error;
+    memcpy (names->name, pattern, len);
+    if (flags & GLOB_MARK)
+      names->name[len++] = '/';
+    names->name[len] = '\0';
+  }
+
+  pglob->gl_pathv
+    = (char **) realloc (pglob->gl_pathv,
+			 (pglob->gl_pathc +
+			  ((flags & GLOB_DOOFFS) ? pglob->gl_offs : 0) +
+			  nfound + 1) *
+			 sizeof (char *));
+  if (pglob->gl_pathv == NULL)
+    goto memory_error;
+
+  if (flags & GLOB_DOOFFS)
+    while (pglob->gl_pathc < pglob->gl_offs)
+      pglob->gl_pathv[pglob->gl_pathc++] = NULL;
+
+  for (; names != NULL; names = names->next)
+    pglob->gl_pathv[pglob->gl_pathc++] = names->name;
+  pglob->gl_pathv[pglob->gl_pathc] = NULL;
+
+  pglob->gl_flags = flags;
+
+  if (stream != NULL) {
+    int save = errno;
+    if (__glob_closedir_hook)
+      (*__glob_closedir_hook) (stream);
+    else
+      (void) closedir ((DIR *) stream);
+    errno = save;
+  }
+  return nfound == 0 ? GLOB_NOMATCH : 0;
+
+memory_error:
+  {
+    int save = errno;
+    if (__glob_closedir_hook)
+      (*__glob_closedir_hook) (stream);
+    else
+      (void) closedir ((DIR *) stream);
+    errno = save;
+  }
+  while (names != NULL) {
+    if (names->name != NULL)
+      free ((__ptr_t) names->name);
+    names = names->next;
+  }
+  return GLOB_NOSPACE;
+}
+
+#endif /* _LIBC or not __GNU_LIBRARY__.  */
Index: gnu/rcs/src/glob.h
diff -u /dev/null gnu/rcs/src/glob.h:1.1
--- /dev/null	Sun Feb  2 22:42:22 1997
+++ gnu/rcs/src/glob.h	Wed Aug  2 22:16:26 1995
@@ -0,0 +1,100 @@
+/* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+This library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+#ifndef	_GLOB_H
+
+#define	_GLOB_H	1
+
+#ifdef	__cplusplus
+extern "C"
+{
+#endif
+
+#undef	__ptr_t
+#if defined (__cplusplus) || (defined (__STDC__) && __STDC__)
+#undef	__P
+#define	__P(args)	args
+#define	__ptr_t	void *
+#else /* Not C++ or ANSI C.  */
+#undef	__P
+#define	__P(args)	()
+#undef	const
+#define	const
+#define	__ptr_t	char *
+#endif /* C++ or ANSI C.  */
+
+/* Bits set in the FLAGS argument to `glob'.  */
+#define	GLOB_ERR	(1 << 0)/* Return on read errors.  */
+#define	GLOB_MARK	(1 << 1)/* Append a slash to each name.  */
+#define	GLOB_NOSORT	(1 << 2)/* Don't sort the names.  */
+#define	GLOB_DOOFFS	(1 << 3)/* Insert PGLOB->gl_offs NULLs.  */
+#define	GLOB_NOCHECK	(1 << 4)/* If nothing matches, return the pattern.  */
+#define	GLOB_APPEND	(1 << 5)/* Append to results of a previous call.  */
+#define	GLOB_NOESCAPE	(1 << 6)/* Backslashes don't quote metacharacters.  */
+#define	GLOB_PERIOD	(1 << 7)/* Leading `.' can be matched by metachars.  */
+#define GLOB_SWITCHES	(1 << 8)/* Pass switches through to pathv */
+#define GLOB_NODOTDIR	(1 << 9)/* Exclude '.' and '..' directories */
+#define	__GLOB_FLAGS	(GLOB_ERR|GLOB_MARK|GLOB_NOSORT|GLOB_DOOFFS| \
+			 GLOB_NOESCAPE|GLOB_NOCHECK|GLOB_APPEND|GLOB_PERIOD| \
+			 GLOB_SWITCHES|GLOB_NODOTDIR)
+
+#if !defined (_POSIX_C_SOURCE) || _POSIX_C_SOURCE < 2 || defined (_BSD_SOURCE)
+#define	GLOB_MAGCHAR	(1 << 8)/* Set in gl_flags if any metachars seen.  */
+#endif
+
+/* Error returns from `glob'.  */
+#define	GLOB_NOSPACE	1	/* Ran out of memory.  */
+#define	GLOB_ABEND	2	/* Read error.  */
+#define	GLOB_NOMATCH	3	/* No matches found.  */
+
+/* Structure describing a globbing run.  */
+typedef struct
+  {
+    int gl_pathc;		/* Count of paths matched by the pattern.  */
+    char **gl_pathv;		/* List of matched pathnames.  */
+    int gl_offs;		/* Slots to reserve in `gl_pathv'.  */
+    int gl_flags;		/* Set to FLAGS, maybe | GLOB_MAGCHAR.  */
+  } glob_t;
+
+/* Do glob searching for PATTERN, placing results in PGLOB.
+   The bits defined above may be set in FLAGS.
+   If a directory cannot be opened or read and ERRFUNC is not nil,
+   it is called with the pathname that caused the error, and the
+   `errno' value from the failing call; if it returns non-zero
+   `glob' returns GLOB_ABEND; if it returns zero, the error is ignored.
+   If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned.
+   Otherwise, `glob' returns zero.  */
+extern int glob __P ((const char *__pattern, int __flags,
+		      int (*__errfunc) __P ((const char *, int)),
+		      glob_t *__pglob));
+
+/* Free storage allocated in PGLOB by a previous `glob' call.  */
+extern void globfree __P ((glob_t *__pglob));
+
+
+#if !defined (_POSIX_C_SOURCE) || _POSIX_C_SOURCE < 2 || defined (_GNU_SOURCE)
+/* If they are not NULL, `glob' uses these functions to read directories.  */
+extern __ptr_t (*__glob_opendir_hook) __P ((const char *__directory));
+extern const char *(*__glob_readdir_hook) __P ((__ptr_t __stream));
+extern void (*__glob_closedir_hook) __P ((__ptr_t __stream));
+#endif
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif /* glob.h  */
Index: gnu/rcs/src/rcs.c
diff -u gnu/rcs/src/rcs.c:1.1.1.1 gnu/rcs/src/rcs.c:1.4
--- gnu/rcs/src/rcs.c:1.1.1.1	Wed Aug  2 21:49:44 1995
+++ gnu/rcs/src/rcs.c	Fri Sep 15 11:19:49 1995
@@ -1545,7 +1545,7 @@
 	    *++diffp = DIFFFLAGS;
 #	    if OPEN_O_BINARY
 		if (Expand == BINARY_EXPAND)
-		    *++diffp == "--binary";
+		    *++diffp = "--binary";
 #	    endif
 	    *++diffp = "-";
 	    *++diffp = resultname;
Index: gnu/rcs/src/rcsbase.h
diff -u gnu/rcs/src/rcsbase.h:1.1.1.1 gnu/rcs/src/rcsbase.h:1.2
--- gnu/rcs/src/rcsbase.h:1.1.1.1	Wed Aug  2 21:49:44 1995
+++ gnu/rcs/src/rcsbase.h	Wed Aug  2 22:16:27 1995
@@ -614,6 +614,19 @@
 	void Irewind P((RILE*));
 #endif
 
+/* rcslinks */
+
+#if defined (RCS_SOFTLINKS)
+  void clean_path_separators P((char* szPath));
+  char* compose_bin_path P((char* szProgram));
+  void expand_argv_links P((int* pargc, char*** pargv));
+  int find_path_length P((char* sz));
+  void follow_rcs_link P((struct buf* Buffer));
+  char* resolve_link P((char* sz, int cch));
+#else
+ #define compose_bin_path(sz) sz
+#endif
+
 /* rcsmap */
 extern enum tokens const ctab[];
 
Index: gnu/rcs/src/rcsedit.c
diff -u gnu/rcs/src/rcsedit.c:1.1.1.1 gnu/rcs/src/rcsedit.c:1.3
--- gnu/rcs/src/rcsedit.c:1.1.1.1	Wed Aug  2 21:49:44 1995
+++ gnu/rcs/src/rcsedit.c	Wed Feb 21 16:08:34 1996
@@ -870,6 +870,9 @@
 	char const *tlim;
 	static struct buf keyval;
         enum markers matchresult;
+#ifdef FORCE_STRIP_CR
+	int fStripCR = (Expand != BINARY_EXPAND);
+#endif
 
 	setupcache(infile); cache(infile);
 	out = outfile;
@@ -884,6 +887,10 @@
 		GETC_(frew, c)
 	    else
 		cachegeteof_(c, goto uncache_exit;)
+#ifdef FORCE_STRIP_CR
+	    if (c == '\r' && fStripCR)
+	      continue;
+#endif
 	    for (;;) {
 		switch (c) {
 		    case SDELIM:
Index: gnu/rcs/src/rcsfnms.c
diff -u gnu/rcs/src/rcsfnms.c:1.1.1.1 gnu/rcs/src/rcsfnms.c:1.2
--- gnu/rcs/src/rcsfnms.c:1.1.1.1	Wed Aug  2 21:49:44 1995
+++ gnu/rcs/src/rcsfnms.c	Wed Aug  2 22:16:28 1995
@@ -555,13 +555,22 @@
 		if (xl <= nl  &&  memcmp(p = nz-xl, x, xl) == 0)
 		    return p;
 	    } else
-		for (p = name;  p < nz - rcslen;  p++)
+		for (p = name;  p < nz - rcslen;  p++) {
+
+#if defined (RCS_SOFTLINKS)
+		  if (isSLASH (p[rcslen])
+		      && (p == name || p[-1] == '.')
+		      && strnicmp (p, rcsdir, rcslen) == 0)
+		    return nz;
+#endif
+
 		    if (
 			isSLASH(p[rcslen])
 			&& (p==name || isSLASH(p[-1]))
 			&& memcmp(p, rcsdir, rcslen) == 0
 		    )
 			return nz;
+		}  /* for */
 	    x += xl;
 	} while (*x++);
 	return 0;
@@ -639,6 +648,9 @@
 	VOID memcpy(p, base, baselen);
 	VOID memcpy(p += baselen, x, xlen);
 	p[xlen] = 0;
+
+	follow_rcs_link (&RCSb);	/* RCS_SOFTLINKS */
+
 	if (xlen) {
 	    if (finopen(rcsopen, mustread))
 		return true;
@@ -739,6 +751,7 @@
 	if (RCSbase!=RCS1) {
                 /* a path for RCSfile is given; single RCS file to look for */
 		bufscpy(&RCSbuf, RCS1);
+		follow_rcs_link (&RCSbuf);		/* RCS_SOFTLINKS */
 		finptr = (*rcsopen)(&RCSbuf, &RCSstat, mustread);
 		RCSerrno = errno;
         } else {
Index: gnu/rcs/src/rcsgen.c
diff -u gnu/rcs/src/rcsgen.c:1.1.1.1 gnu/rcs/src/rcsgen.c:1.3
--- gnu/rcs/src/rcsgen.c:1.1.1.1	Wed Aug  2 21:49:44 1995
+++ gnu/rcs/src/rcsgen.c	Mon Apr 15 21:29:36 1996
@@ -260,6 +260,94 @@
 	}
 }
 
+#if defined (RCS_FILECOMMENTS)
+
+/* cleanlogmsg	(Marc Singer elf@netcom.com 11 Dec 94)
+
+   prepare logfile change message.  szMessageArg is the user's logfile
+   message unless the first character is an '@' in which case the rest
+   of the string is interpreted as a filename where the message is
+   found.  The message is cleaned by removing trailing whitespace form
+   each line.  The return value is a cbuf containing the message and
+   its length.
+
+   Also, we guarantee that the message is at least one character long.
+   I would rather allow the return parameter to be NULL, but the
+   method implemented here is designed to maintain compatibility with
+   existing code.
+
+*/
+   
+struct cbuf
+cleanlogmsg (szMessageArg, cb)
+     char* szMessageArg;	/* Literal message or file containing it */
+     size_t cb;
+{
+  register char* sz = szMessageArg;
+  static char g_szNoComment[] = "<Empty change comment>";
+
+				/* @filename for comment in a file */
+  if (sz [0] == '@') {	
+#if O_BINARY
+    int fd = open (sz + 1, O_RDONLY | O_BINARY);
+#else
+    int fd = open (sz + 1, O_RDONLY);
+#endif
+    if (fd > 0 && (cb = (size_t) lseek (fd, 0, SEEK_END))) {
+      lseek (fd, 0, SEEK_SET);
+      sz = malloc (cb + 1);
+      read (fd, sz, cb);
+      close (fd);
+      szMessageArg = sz;
+    }
+    else if (fd >= 0) {
+      *sz = 0;
+      cb = 0;
+      close (fd);
+    }  /* else */
+  }  /* if */
+
+				/* Strip unnecessary whitespace */
+  {
+    register size_t cbSkip = 0;
+    char* pchEndLine;
+    pchEndLine = sz;
+    for (; cb--; ++sz) {
+      *sz = sz[cbSkip];
+#if O_BINARY
+      if (*sz == 0x4) *sz = ' ';
+#endif
+      if (!isspace (*sz))
+	pchEndLine = sz + 1;
+      if (*sz == '\n') {
+	cbSkip += sz - pchEndLine;
+	sz = pchEndLine;
+	*sz = '\n';
+      }  /* if */
+    }  /* for */
+    sz = pchEndLine;		/* Remove all but, possibly, one trailing \n */
+    if (*sz && *sz != '\n') /*  || sz == szMessageArg)) */
+      ++sz;
+    *sz = 0;
+  }  /* block */
+
+  {
+    struct cbuf retValue;
+    retValue.size = sz - szMessageArg;
+    if (retValue.size == 0) {
+      retValue.string = g_szNoComment;
+      retValue.size = sizeof (g_szNoComment) - 1;
+    }  /* if */
+    else
+      retValue.string = szMessageArg;
+    return retValue;
+  }  /* block */
+}  /* cleanlogmsg */
+
+#else
+
+/* Stock version of clean log message */
+
 	struct cbuf
 cleanlogmsg(m, s)
 	char *m;
@@ -284,6 +372,7 @@
 	return r;
 }
 
+#endif
 
 int ttystdin()
 {
@@ -589,7 +678,7 @@
  */
 {
 	RILE *fin;
-	if (!(fin = Iopen(srcname, "r", (struct stat*)0))) {
+	if (!(fin = Iopen(srcname, FOPEN_R_WORK, (struct stat*)0))) {
 		eerror(srcname);
 		return false;
 	}
Index: gnu/rcs/src/rcslinks.c
diff -u /dev/null gnu/rcs/src/rcslinks.c:1.5
--- /dev/null	Sun Feb  2 22:42:25 1997
+++ gnu/rcs/src/rcslinks.c	Wed Feb 21 16:08:35 1996
@@ -0,0 +1,277 @@
+/* RCS soft links support */
+
+/****************************************************************************
+ *                     following link paths stored in files called `rcs'
+ ****************************************************************************
+ */
+
+/* Copyright (c) 1995 Marc Singer
+   Distributed under license by the Free Software Foundation, Inc.
+
+This file should be 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,
+59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+Report problems and questions for this file to:
+
+    elf@netcom.com
+
+*/
+
+/*
+ * $Log: rcslinks.c,v $
+ * Revision 1.5  1996/02/22 00:08:35  elf
+ * Added FORCE_STRIP_CR to rcsedit.  Added code to strip spaces from end of RCSLINK.  Removed vestigal code that worked around bug in DJGPP's exec code.
+ *
+ * Revision 1.4  1995/09/15 18:19:50  elf
+ * Simplified compose_bin_path changes.  Fixed spawn from clobbering program name
+ *
+ * Revision 1.3  1995/09/14 03:10:11  elf
+ * Patches for DOS bugs found with CVS.
+ *
+ * Revision 1.2  1995/08/22 00:06:13  elf
+ * Changes for CVS
+ *
+ * Revision 1.1  1995/08/03 05:16:29  elf
+ * MS-DOS patches 7.2
+ *
+ */
+
+
+#include "rcsbase.h"
+#include "glob.h"
+
+#if defined (RCS_SOFTLINKS)
+
+/* clean_path_separators
+
+   converts all backslash characters to forward slashes.  This is to
+   prevent the internals from being confused by the escape.  Note
+   that this should only be done on MS-DOS machines as is the case
+   for all of this soft-links stuff.
+
+*/
+
+void clean_path_separators (char* sz)
+{
+  for ( ;*sz; ++sz)
+    if (*sz == '\\')
+      *sz = '/';
+}  /* clean_path_separators */
+
+
+/* compose_bin_path
+
+   allows the user to control the path from where RCS programs are
+   executed.  This is for speed because DOS searches the path so
+   slowly.
+
+*/
+
+char* compose_bin_path (char* szProgram)
+{
+#if !defined (BINPATHVAR)
+  return szProgram;
+#else
+  char* szPathBinary;
+  char* pch;
+  char* szPath = NULL;
+
+	/* Check for absolute path */
+  if (   isSLASH (*szProgram)
+      || (isalpha (*szProgram) && szProgram[1] == ':'))
+    return szProgram;
+
+	/* Fetch binary's path */
+  szPathBinary = getenv (BINPATHVAR);
+  if (!szPathBinary || !*szPathBinary)
+    return szProgram;
+  
+	/* Normalize/compose binary's path */
+  szPath = malloc (strlen (szPathBinary) + strlen (szProgram) + 2);
+  if (!szPath)
+    return szProgram;
+  strcpy (szPath, szPathBinary);
+  clean_path_separators (szPath);
+  if (szPath[strlen (szPath) - 1] != '/')
+    strcat (szPath, "/");
+  strcat (szPath, szProgram);
+  return szPath;
+#endif
+}  /* compose_bin_path */
+
+
+/* find_path_length
+
+   returns the length of the path portion of the filename.  If there
+   are no path separators, then zero is returned.  If there are
+   separators, the return count is the offset to the last separator.
+
+*/
+
+int find_path_length (char* sz)
+{
+  int cch = 0;
+  int ich;
+  while ((ich = strcspn (sz + cch, "/\\")), sz [cch + ich])
+    cch += ich + 1;
+  if (cch)
+    --cch;
+  return cch;
+}  /* find_path_length */
+
+
+/* resolve_link
+
+   opens a the pathname for a file to see if it is a soft link
+   emulation file.  The returned pointer is the contents of the link
+   file.
+
+*/
+
+char* resolve_link (char* sz, int cch)
+{
+  FILE* fp;
+  static char* szLink;
+  char* szPath = NULL;
+
+  if (szLink) {				/* Release previous link data */
+    free (szLink);
+    szLink = NULL;
+  }  /* if */
+
+  szPath = (char*) malloc (cch + 1);	/* Allocate space for pathname */
+  strncpy (szPath, sz, cch);
+  szPath[cch] = 0;
+  
+  fp = fopen (szPath, "rb");
+  if (fp) {
+    int cchLink;			/* Calc length of data and read */
+    fseek (fp, 0, SEEK_END);
+    cchLink = ftell (fp);
+    if (cchLink < PATH_MAX) {
+      fseek (fp, 0, SEEK_SET);
+      szLink = (char*) malloc (cchLink + 1);
+      cchLink = fread (szLink, 1, cchLink, fp);
+      szLink[cchLink] = 0;
+    }  /* if */
+    else
+      cchLink = 0;
+    fclose (fp);
+
+    if (!cchLink && szLink) {		/* Cleanup if empty */
+      free (szLink);
+      szLink = NULL;
+    }  /* if */
+
+    if (szLink) {
+      cchLink = strcspn (szLink, "\n\r"); /* Ignore multiple lines */
+      szLink[cchLink] = 0;
+    }  /* if */
+  }  /* if */
+
+  free (szPath);
+
+  if (szLink) {
+	/* Remove trailing spaces, cause this seems to happen sometimes */
+    int i;
+    for (i = strlen (szLink); --i >= 0;) {
+      if (szLink[i] != ' ')
+	break;
+      szLink[i] = 0;
+    }  /* for */
+    clean_path_separators (szLink);
+  }  /* if */
+
+  return szLink;
+}  /* resolve_link */
+
+
+/* expand_argv_links
+
+   expands the argv list for wildcards via soft links.  Since our
+   links are expanded after the standard wildcard expansion, we
+   perform another expansion here.  Presently, we only expand a
+   single asterisk wildcard.
+
+*/
+
+void expand_argv_links (int* pargc, char*** pargv)
+{
+  int cArgOriginal = *pargc;
+  char** argvOriginal = *pargv;
+  int cchPathname;
+  glob_t a_glob;
+  char* szFilename = NULL;
+  int cchMax = 0;
+
+  memset (&a_glob, 0, sizeof (a_glob));
+
+  for (; cArgOriginal--; ++argvOriginal) {
+    int ichWild = strcspn (*argvOriginal, "*[]?"); /* All wildcards */
+    char* szLink;
+    clean_path_separators (*argvOriginal);
+    if (*argvOriginal[0] != '-' && (*argvOriginal)[ichWild]
+	&& (cchPathname = find_path_length (*argvOriginal))
+	&& (szLink = resolve_link (*argvOriginal, cchPathname))) {
+      if (cchMax < strlen (szLink) + strlen (*argvOriginal) - cchPathname) {
+	if (szFilename)
+	  free (szFilename);
+	szFilename = malloc (cchMax = strlen (szLink)
+			     + strlen (*argvOriginal) - cchPathname);
+      }  /* if */
+      strcpy (szFilename, szLink);
+      strcat (szFilename, *argvOriginal + cchPathname);
+      glob (szFilename, GLOB_APPEND | GLOB_NOSORT | GLOB_NODOTDIR,
+	    NULL, &a_glob);
+    }  /* if */
+    else
+      glob (*argvOriginal, GLOB_APPEND | GLOB_NOSORT | GLOB_NOCHECK,
+	    NULL, &a_glob);
+  }  /* while */
+
+  *pargc = a_glob.gl_pathc;
+  *pargv = a_glob.gl_pathv;
+}  /* expand_argv_links */
+
+
+void follow_rcs_link (struct buf* Buffer)
+{
+  struct buf BufferNew;
+  int cch;
+  char* szFilename;
+  char* szLink;
+  
+  cch = find_path_length (Buffer->string);
+  if (!cch)
+    cch = strlen (Buffer->string);
+  szFilename = &Buffer->string[cch];
+
+  szLink = resolve_link (Buffer->string, cch);
+  if (!szLink)
+    return;
+
+  memset (&BufferNew, 0, sizeof (struct buf));
+  bufalloc (&BufferNew, strlen (szLink) + strlen (szFilename) + 1);
+  strcpy (BufferNew.string, szLink);
+  strcat (BufferNew.string, szFilename);
+      
+  bufautoend (Buffer);
+  Buffer->string = BufferNew.string;
+  Buffer->size = BufferNew.size;
+}  /* follow_rcs_link */
+
+#endif
Index: gnu/rcs/src/rcsmerge.c
diff -u gnu/rcs/src/rcsmerge.c:1.1.1.1 gnu/rcs/src/rcsmerge.c:1.3
--- gnu/rcs/src/rcsmerge.c:1.1.1.1	Wed Aug  2 21:49:44 1995
+++ gnu/rcs/src/rcsmerge.c	Fri Sep 15 11:19:50 1995
@@ -116,8 +116,6 @@
  */
 #include "rcsbase.h"
 
-static char const co[] = CO;
-
 mainProg(rcsmergeId, "rcsmerge", "$Id: rcsmerge.c,v 5.15 1995/06/16 06:19:24 eggert Exp $")
 {
 	static char const cmdusage[] =
@@ -253,7 +251,7 @@
 				-1,
 				/* Do not collide with merger.c maketemp().  */
 				arg[i] = maketemp(i+2),
-				co, quietarg, commarg.string,
+				CO, quietarg, commarg.string,
 				expandarg, suffixarg, versionarg, zonearg,
 				RCSname, (char*)0
 			))
Index: gnu/rcs/src/rcsutil.c
diff -u gnu/rcs/src/rcsutil.c:1.1.1.1 gnu/rcs/src/rcsutil.c:1.5
--- gnu/rcs/src/rcsutil.c:1.1.1.1	Wed Aug  2 21:49:45 1995
+++ gnu/rcs/src/rcsutil.c	Wed Feb 21 16:08:36 1996
@@ -1064,7 +1064,17 @@
 		efaterror(outname);
 	}
 
-	wstatus = spawn_RCS(0, args[1], (char**)(args + 1));
+#if 0
+	{
+	  const char** psz;
+	  fprintf (stderr, "spawning `%s'", args[1]);
+	  for (psz = args + 1; *psz; ++psz)
+	    fprintf (stderr, " `%s'", *psz);
+	  fprintf (stderr, "\n");
+	}  /* block */
+#endif
+	wstatus = spawn_RCS(P_WAIT, args[1], (char**)(args + 1));
+
 #	ifdef RCS_SHELL
 	    if (wstatus == -1  &&  errno == ENOEXEC) {
 		args[0] = RCS_SHELL;
@@ -1302,6 +1312,11 @@
 		while ((*pp++ = *argv++))
 			continue;
 	}
+
+#if defined (RCS_SOFTLINKS)
+	expand_argv_links (&argc, newargv);
+#endif
+
 	return argc;
 }
 
@@ -1390,3 +1405,4 @@
 		efaterror("time");
 	return t;
 }
+
Index: gnu/rcs/src/version.c
diff -u gnu/rcs/src/version.c:1.1.1.1 gnu/rcs/src/version.c:1.8
--- gnu/rcs/src/version.c:1.1.1.1	Wed Aug  2 21:49:45 1995
+++ gnu/rcs/src/version.c	Mon Apr 15 21:33:31 1996
@@ -1,2 +1,2 @@
 #include "rcsbase.h"
-char const RCS_version_string[] = "5.7";
+char const RCS_version_string[] = "5.7 (RCS_SOFTLINKS patch 11)";
