Index: gnu/rcs/MSDOS/Makefile
diff -c /dev/null gnu/rcs/MSDOS/Makefile:1.1
*** /dev/null	Mon Mar 24 13:38:35 1997
--- gnu/rcs/MSDOS/Makefile	Wed Sep 13 20:10:09 1995
***************
*** 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 -c /dev/null gnu/rcs/MSDOS/Makefile.src:1.3
*** /dev/null	Mon Mar 24 13:38:36 1997
--- gnu/rcs/MSDOS/Makefile.src	Sun Feb  2 22:23:13 1997
***************
*** 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 -c /dev/null gnu/rcs/MSDOS/RCSDOS.LSM:1.2
*** /dev/null	Mon Mar 24 13:38:36 1997
--- gnu/rcs/MSDOS/RCSDOS.LSM	Mon Mar 24 13:38:04 1997
***************
*** 0 ****
--- 1,20 ----
+ Begin3
+ Title:           RCSDOS
+ Version:         5.7-patch13
+ Date:		 24 March 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 version control SCCS MS-DOS DJGPP
+ Authors:         Walter Tichy, Paul Eggert, Marc Singer <elf@netcom.com>
+ Primary-Site:    ftp://ftp.netcom.com/pub/el/elf/rcsdos
+ Platforms:       MS-DOS
+ Copying-Policy:  GNU GPL
+ End
Index: gnu/rcs/MSDOS/README.TXT
diff -c /dev/null gnu/rcs/MSDOS/README.TXT:1.2
*** /dev/null	Mon Mar 24 13:38:36 1997
--- gnu/rcs/MSDOS/README.TXT	Mon Mar 24 13:38:04 1997
***************
*** 0 ****
--- 1,290 ----
+ >>> rcsdos-5.7/README.TXT
+ >>>  $Id: README.TXT,v 1.2 1997/03/24 21:38:04 elf Exp $
+ >>>
+ >>> RCS Revision Control for MS-DOS [package: RCSDOS-5.7]
+ >>>   Patches and Binaries for RCS 5.7 (Patch Level 13)
+ >>>
+ >>> by Marc Singer (elf@netcom.com)
+ >>>    24 March 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 we have the answers to %^) ) 
+       <Special note for Novell users>
+ 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 patch13 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 `PATCH13'.
+   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.
+  
+ Some Novell users have complained that co -l after initial ci
+ generates the error:
+ 
+   RCS/source.in --> source.in
+   Revision 1.1 (locked)
+   co: RCS/source.in No such file or directory
+   co: saved in RCS/source.i_
+ 
+ This is fixed in the patch 13 by changing the rename behavior to
+ always unlink the target before renaming. [Teun Burgers burgers@ecn.nl]
+ 
+ The latest patches have no outstanding 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 -c /dev/null gnu/rcs/MSDOS/conf.h:1.5
*** /dev/null	Mon Mar 24 13:38:36 1997
--- gnu/rcs/MSDOS/conf.h	Mon Mar 24 13:38:05 1997
***************
*** 0 ****
--- 1,409 ----
+ /* RCS compile-time configuration */
+ 
+ 	/* $Id: conf.h,v 1.5 1997/03/24 21:38:05 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 1 /* 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 -c /dev/null gnu/rcs/MSDOS/prepare.sh:1.1
*** /dev/null	Mon Mar 24 13:38:36 1997
--- gnu/rcs/MSDOS/prepare.sh	Mon Aug 21 17:04:51 1995
***************
*** 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 -c /dev/null gnu/rcs/src/glob.c:1.1
*** /dev/null	Mon Mar 24 13:38:37 1997
--- gnu/rcs/src/glob.c	Wed Aug  2 22:16:26 1995
***************
*** 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 -c /dev/null gnu/rcs/src/glob.h:1.1
*** /dev/null	Mon Mar 24 13:38:37 1997
--- gnu/rcs/src/glob.h	Wed Aug  2 22:16:26 1995
***************
*** 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 -c 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,1551 ****
  	    *++diffp = DIFFFLAGS;
  #	    if OPEN_O_BINARY
  		if (Expand == BINARY_EXPAND)
! 		    *++diffp == "--binary";
  #	    endif
  	    *++diffp = "-";
  	    *++diffp = resultname;
--- 1545,1551 ----
  	    *++diffp = DIFFFLAGS;
  #	    if OPEN_O_BINARY
  		if (Expand == BINARY_EXPAND)
! 		    *++diffp = "--binary";
  #	    endif
  	    *++diffp = "-";
  	    *++diffp = resultname;
Index: gnu/rcs/src/rcsbase.h
diff -c 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,619 ****
--- 614,632 ----
  	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 -c 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,875 ****
--- 870,878 ----
  	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,889 ****
--- 887,896 ----
  		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 -c 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,567 ****
  		if (xl <= nl  &&  memcmp(p = nz-xl, x, xl) == 0)
  		    return p;
  	    } else
! 		for (p = name;  p < nz - rcslen;  p++)
  		    if (
  			isSLASH(p[rcslen])
  			&& (p==name || isSLASH(p[-1]))
  			&& memcmp(p, rcsdir, rcslen) == 0
  		    )
  			return nz;
  	    x += xl;
  	} while (*x++);
  	return 0;
--- 555,576 ----
  		if (xl <= nl  &&  memcmp(p = nz-xl, x, xl) == 0)
  		    return p;
  	    } else
! 		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,644 ****
--- 648,656 ----
  	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,744 ****
--- 751,757 ----
  	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 -c 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,265 ****
--- 260,353 ----
  	}
  }
  
+ #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,289 ****
--- 372,378 ----
  	return r;
  }
  
+ #endif
  
  int ttystdin()
  {
***************
*** 589,595 ****
   */
  {
  	RILE *fin;
! 	if (!(fin = Iopen(srcname, "r", (struct stat*)0))) {
  		eerror(srcname);
  		return false;
  	}
--- 678,684 ----
   */
  {
  	RILE *fin;
! 	if (!(fin = Iopen(srcname, FOPEN_R_WORK, (struct stat*)0))) {
  		eerror(srcname);
  		return false;
  	}
Index: gnu/rcs/src/rcslinks.c
diff -c /dev/null gnu/rcs/src/rcslinks.c:1.5
*** /dev/null	Mon Mar 24 13:38:39 1997
--- gnu/rcs/src/rcslinks.c	Wed Feb 21 16:08:35 1996
***************
*** 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 -c 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,123 ****
   */
  #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[] =
--- 116,121 ----
***************
*** 253,259 ****
  				-1,
  				/* Do not collide with merger.c maketemp().  */
  				arg[i] = maketemp(i+2),
! 				co, quietarg, commarg.string,
  				expandarg, suffixarg, versionarg, zonearg,
  				RCSname, (char*)0
  			))
--- 251,257 ----
  				-1,
  				/* Do not collide with merger.c maketemp().  */
  				arg[i] = maketemp(i+2),
! 				CO, quietarg, commarg.string,
  				expandarg, suffixarg, versionarg, zonearg,
  				RCSname, (char*)0
  			))
Index: gnu/rcs/src/rcsutil.c
diff -c 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,1070 ****
  		efaterror(outname);
  	}
  
! 	wstatus = spawn_RCS(0, args[1], (char**)(args + 1));
  #	ifdef RCS_SHELL
  	    if (wstatus == -1  &&  errno == ENOEXEC) {
  		args[0] = RCS_SHELL;
--- 1064,1080 ----
  		efaterror(outname);
  	}
  
! #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,1307 ****
--- 1312,1322 ----
  		while ((*pp++ = *argv++))
  			continue;
  	}
+ 
+ #if defined (RCS_SOFTLINKS)
+ 	expand_argv_links (&argc, newargv);
+ #endif
+ 
  	return argc;
  }
  
***************
*** 1390,1392 ****
--- 1405,1408 ----
  		efaterror("time");
  	return t;
  }
+ 
Index: gnu/rcs/src/version.c
diff -c 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 ****
  #include "rcsbase.h"
! char const RCS_version_string[] = "5.7";
--- 1,2 ----
  #include "rcsbase.h"
! char const RCS_version_string[] = "5.7 (RCS_SOFTLINKS patch 11)";
