summaryrefslogtreecommitdiff
path: root/gnu/usr.bin
diff options
context:
space:
mode:
authorThorsten Lockert <tholo@cvs.openbsd.org>1999-02-28 21:58:35 +0000
committerThorsten Lockert <tholo@cvs.openbsd.org>1999-02-28 21:58:35 +0000
commitbe6c0c795aa2d454d92156537e202b4b9981f92c (patch)
tree73e006884f58bfffc785db0c39b5ed772e988af5 /gnu/usr.bin
parent4029a51f9c2b0ad309f4f23f3cba7ede7fac899f (diff)
Integrate local changes
Diffstat (limited to 'gnu/usr.bin')
-rw-r--r--gnu/usr.bin/cvs/configure56
-rw-r--r--gnu/usr.bin/cvs/configure.in12
-rw-r--r--gnu/usr.bin/cvs/contrib/Makefile.in6
-rw-r--r--gnu/usr.bin/cvs/contrib/elib/ChangeLog10
-rw-r--r--gnu/usr.bin/cvs/contrib/elib/Makefile.in79
-rw-r--r--gnu/usr.bin/cvs/contrib/elib/README8
-rw-r--r--gnu/usr.bin/cvs/contrib/elib/elib-1.0.tar.gzbin58335 -> 0 bytes
-rw-r--r--gnu/usr.bin/cvs/contrib/listen2.c107
-rw-r--r--gnu/usr.bin/cvs/contrib/listen2.mak188
-rw-r--r--gnu/usr.bin/cvs/diff/Makefile.in6
-rw-r--r--gnu/usr.bin/cvs/lib/getdate.c10
-rw-r--r--gnu/usr.bin/cvs/lib/getdate.y6
-rw-r--r--gnu/usr.bin/cvs/lib/memmove.c5
-rw-r--r--gnu/usr.bin/cvs/lib/vasprintf.c171
-rw-r--r--gnu/usr.bin/cvs/os2/getdate.c1578
-rw-r--r--gnu/usr.bin/cvs/src/Makefile.in6
-rw-r--r--gnu/usr.bin/cvs/src/checkout.c2
-rw-r--r--gnu/usr.bin/cvs/src/commit.c273
-rw-r--r--gnu/usr.bin/cvs/src/cvs.h28
-rw-r--r--gnu/usr.bin/cvs/src/ignore.c19
-rw-r--r--gnu/usr.bin/cvs/src/lock.c183
-rw-r--r--gnu/usr.bin/cvs/src/main.c470
-rw-r--r--gnu/usr.bin/cvs/src/mkmodules.c147
-rw-r--r--gnu/usr.bin/cvs/src/parseinfo.c15
-rw-r--r--gnu/usr.bin/cvs/src/patch.c16
-rw-r--r--gnu/usr.bin/cvs/src/rcs.c260
-rw-r--r--gnu/usr.bin/cvs/src/rcscmds.c3
-rw-r--r--gnu/usr.bin/cvs/src/server.c608
-rw-r--r--gnu/usr.bin/cvs/src/update.c111
-rw-r--r--gnu/usr.bin/cvs/tools/pcl-cvs/.cvsignore19
-rw-r--r--gnu/usr.bin/cvs/tools/pcl-cvs/ChangeLog891
-rw-r--r--gnu/usr.bin/cvs/tools/pcl-cvs/INSTALL94
-rw-r--r--gnu/usr.bin/cvs/tools/pcl-cvs/Makefile.in238
-rw-r--r--gnu/usr.bin/cvs/tools/pcl-cvs/NEWS149
-rw-r--r--gnu/usr.bin/cvs/tools/pcl-cvs/README25
-rw-r--r--gnu/usr.bin/cvs/tools/pcl-cvs/pcl-cvs-lucid.el134
-rw-r--r--gnu/usr.bin/cvs/tools/pcl-cvs/pcl-cvs-startup.el17
-rw-r--r--gnu/usr.bin/cvs/tools/pcl-cvs/pcl-cvs.aux102
-rw-r--r--gnu/usr.bin/cvs/tools/pcl-cvs/pcl-cvs.el3450
-rw-r--r--gnu/usr.bin/cvs/tools/pcl-cvs/pcl-cvs.ps2667
-rw-r--r--gnu/usr.bin/cvs/tools/pcl-cvs/pcl-cvs.texinfo1565
-rw-r--r--gnu/usr.bin/cvs/tools/pcl-cvs/texinfo.tex4381
42 files changed, 1550 insertions, 16565 deletions
diff --git a/gnu/usr.bin/cvs/configure b/gnu/usr.bin/cvs/configure
index 2d09bf31f89..808d939b694 100644
--- a/gnu/usr.bin/cvs/configure
+++ b/gnu/usr.bin/cvs/configure
@@ -1856,7 +1856,7 @@ EOF
fi
-for ac_func in mkdir rename strstr dup2 strerror valloc waitpid memmove vasprintf strtoul
+for ac_func in mkdir rename strstr dup2 strerror valloc waitpid memmove strtoul
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:1863: checking for $ac_func" >&5
@@ -3134,7 +3134,7 @@ echo "default place for GSSAPI is $GSSAPI"
hold_cppflags=$CPPFLAGS
CPPFLAGS="$CPPFLAGS -I$GSSAPI/include "
-for ac_hdr in gssapi.h gssapi/gssapi.h gssapi/gssapi_generic.h
+for ac_hdr in krb5.h gssapi.h gssapi/gssapi.h gssapi/gssapi_generic.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
@@ -3176,7 +3176,9 @@ done
CPPFLAGS=$hold_cppflags
-if test "$ac_cv_header_gssapi_h" = "yes" || test "$ac_cv_header_gssapi_gssapi_h" = "yes"; then
+if test "$ac_cv_header_krb5_h" = "yes" &&
+ (test "$ac_cv_header_gssapi_h" = "yes" ||
+ test "$ac_cv_header_gssapi_gssapi_h" = "yes"); then
cat >> confdefs.h <<\EOF
#define HAVE_GSSAPI 1
EOF
@@ -3192,7 +3194,7 @@ EOF
CPPFLAGS="-I$GSSAPI/include $CPPFLAGS"
if test "$ac_cv_header_gssapi_h" = "yes"; then
cat > conftest.$ac_ext <<EOF
-#line 3196 "configure"
+#line 3198 "configure"
#include "confdefs.h"
#include <gssapi.h>
EOF
@@ -3208,7 +3210,7 @@ rm -f conftest*
else
cat > conftest.$ac_ext <<EOF
-#line 3212 "configure"
+#line 3214 "configure"
#include "confdefs.h"
#include <gssapi/gssapi.h>
EOF
@@ -3227,7 +3229,7 @@ rm -f conftest*
# This is necessary on Irix 5.3, in order to link against libkrb5 --
# there, an_to_ln.o refers to things defined only in -lgen.
echo $ac_n "checking for compile in -lgen""... $ac_c" 1>&6
-echo "configure:3231: checking for compile in -lgen" >&5
+echo "configure:3233: checking for compile in -lgen" >&5
ac_lib_var=`echo gen'_'compile | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -3235,7 +3237,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lgen $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 3239 "configure"
+#line 3241 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -3246,7 +3248,7 @@ int main() {
compile()
; return 0; }
EOF
-if { (eval echo configure:3250: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:3252: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -3295,12 +3297,12 @@ EOF
fi
echo $ac_n "checking for gethostname""... $ac_c" 1>&6
-echo "configure:3299: checking for gethostname" >&5
+echo "configure:3301: checking for gethostname" >&5
if eval "test \"`echo '$''{'ac_cv_func_gethostname'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3304 "configure"
+#line 3306 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char gethostname(); below. */
@@ -3323,7 +3325,7 @@ gethostname();
; return 0; }
EOF
-if { (eval echo configure:3327: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:3329: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_func_gethostname=yes"
else
@@ -3402,12 +3404,12 @@ if test "$enable_server" = yes; then
for ac_func in crypt
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3406: checking for $ac_func" >&5
+echo "configure:3408: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3411 "configure"
+#line 3413 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -3430,7 +3432,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:3434: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:3436: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -3456,7 +3458,7 @@ done
if test "$ac_cv_func_crypt" = no; then
echo $ac_n "checking for crypt in -lcrypt""... $ac_c" 1>&6
-echo "configure:3460: checking for crypt in -lcrypt" >&5
+echo "configure:3462: checking for crypt in -lcrypt" >&5
ac_lib_var=`echo crypt'_'crypt | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -3464,7 +3466,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lcrypt $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 3468 "configure"
+#line 3470 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -3475,7 +3477,7 @@ int main() {
crypt()
; return 0; }
EOF
-if { (eval echo configure:3479: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:3481: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -3505,12 +3507,12 @@ fi
for ac_func in crypt
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3509: checking for $ac_func" >&5
+echo "configure:3511: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3514 "configure"
+#line 3516 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -3533,7 +3535,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:3537: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:3539: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -3573,19 +3575,19 @@ EOF
echo $ac_n "checking for cygwin32""... $ac_c" 1>&6
-echo "configure:3577: checking for cygwin32" >&5
+echo "configure:3579: checking for cygwin32" >&5
if eval "test \"`echo '$''{'ccvs_cv_sys_cygwin32'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3582 "configure"
+#line 3584 "configure"
#include "confdefs.h"
int main() {
return __CYGWIN32__;
; return 0; }
EOF
-if { (eval echo configure:3589: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3591: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ccvs_cv_sys_cygwin32=yes
else
@@ -3726,8 +3728,8 @@ ac_given_srcdir=$srcdir
ac_given_INSTALL="$INSTALL"
trap 'rm -fr `echo "Makefile lib/Makefile src/Makefile zlib/Makefile diff/Makefile doc/Makefile \
- man/Makefile tools/Makefile tools/pcl-cvs/Makefile \
- contrib/Makefile contrib/elib/Makefile \
+ man/Makefile tools/Makefile \
+ contrib/Makefile \
windows-NT/Makefile windows-NT/SCC/Makefile \
os2/Makefile emx/Makefile macintosh/Makefile vms/Makefile \
stamp-h config.h src/options.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
@@ -3819,8 +3821,8 @@ EOF
cat >> $CONFIG_STATUS <<EOF
CONFIG_FILES=\${CONFIG_FILES-"Makefile lib/Makefile src/Makefile zlib/Makefile diff/Makefile doc/Makefile \
- man/Makefile tools/Makefile tools/pcl-cvs/Makefile \
- contrib/Makefile contrib/elib/Makefile \
+ man/Makefile tools/Makefile \
+ contrib/Makefile \
windows-NT/Makefile windows-NT/SCC/Makefile \
os2/Makefile emx/Makefile macintosh/Makefile vms/Makefile \
stamp-h"}
diff --git a/gnu/usr.bin/cvs/configure.in b/gnu/usr.bin/cvs/configure.in
index dd6172d7956..e1550fed466 100644
--- a/gnu/usr.bin/cvs/configure.in
+++ b/gnu/usr.bin/cvs/configure.in
@@ -63,7 +63,7 @@ AC_TYPE_MODE_T
AC_TYPE_SIZE_T
AC_TYPE_PID_T
AC_STRUCT_ST_BLKSIZE
-AC_REPLACE_FUNCS(mkdir rename strstr dup2 strerror valloc waitpid memmove vasprintf strtoul)
+AC_REPLACE_FUNCS(mkdir rename strstr dup2 strerror valloc waitpid memmove strtoul)
AC_CHECK_FUNCS(fchmod fsync ftime mktemp putenv vprintf ftruncate timezone getpagesize initgroups fchdir sigaction sigprocmask sigvec sigsetmask sigblock tempnam tzset readlink wait3)
dnl
@@ -270,10 +270,12 @@ WITH_GSSAPI
hold_cppflags=$CPPFLAGS
CPPFLAGS="$CPPFLAGS -I$GSSAPI/include "
-AC_CHECK_HEADERS(gssapi.h gssapi/gssapi.h gssapi/gssapi_generic.h)
+AC_CHECK_HEADERS(krb5.h gssapi.h gssapi/gssapi.h gssapi/gssapi_generic.h)
CPPFLAGS=$hold_cppflags
-if test "$ac_cv_header_gssapi_h" = "yes" || test "$ac_cv_header_gssapi_gssapi_h" = "yes"; then
+if test "$ac_cv_header_krb5_h" = "yes" &&
+ (test "$ac_cv_header_gssapi_h" = "yes" ||
+ test "$ac_cv_header_gssapi_gssapi_h" = "yes"); then
AC_DEFINE(HAVE_GSSAPI)
includeopt="${includeopt} -I$GSSAPI/include"
# FIXME: This is ugly, but these things don't seem to be standardized.
@@ -397,8 +399,8 @@ test -f src/options.h && (
)
AC_OUTPUT(Makefile lib/Makefile src/Makefile zlib/Makefile diff/Makefile doc/Makefile \
- man/Makefile tools/Makefile tools/pcl-cvs/Makefile \
- contrib/Makefile contrib/elib/Makefile \
+ man/Makefile tools/Makefile \
+ contrib/Makefile \
windows-NT/Makefile windows-NT/SCC/Makefile \
os2/Makefile emx/Makefile macintosh/Makefile vms/Makefile \
stamp-h)
diff --git a/gnu/usr.bin/cvs/contrib/Makefile.in b/gnu/usr.bin/cvs/contrib/Makefile.in
index 462ae89f65e..c3ea9b03c40 100644
--- a/gnu/usr.bin/cvs/contrib/Makefile.in
+++ b/gnu/usr.bin/cvs/contrib/Makefile.in
@@ -44,8 +44,7 @@ DISTFILES = \
Makefile.in clmerge.pl cln_hist.pl commit_prep.pl cvs2vendor.sh \
cvs_acls.pl cvscheck.sh cvscheck.man cvshelp.man descend.sh \
descend.man dirfns.shar log.pl log_accum.pl mfpipe.pl rcs-to-cvs.sh \
- rcs2log.sh rcslock.pl sccs2rcs.csh rcs2sccs.sh \
- listen2.c listen2.mak
+ rcs2log.sh rcslock.pl sccs2rcs.csh rcs2sccs.sh
# files installed in $(libdir)/cvs/contrib
#
@@ -110,7 +109,7 @@ clean:
.PHONY: clean
distclean: clean
- rm -f Makefile elib/Makefile $(PROGS) $(CONTRIB_PROGS)
+ rm -f Makefile $(PROGS) $(CONTRIB_PROGS)
.PHONY: distclean
realclean: distclean
@@ -121,7 +120,6 @@ dist-dir:
for i in ${DISTFILES}; do \
ln $(srcdir)/$${i} ${DISTDIR}; \
done
- cd elib; ${MAKE} dist-dir DISTDIR="../${DISTDIR}/elib"
.PHONY: dist-dir
subdir = contrib
diff --git a/gnu/usr.bin/cvs/contrib/elib/ChangeLog b/gnu/usr.bin/cvs/contrib/elib/ChangeLog
deleted file mode 100644
index 14286ff08fa..00000000000
--- a/gnu/usr.bin/cvs/contrib/elib/ChangeLog
+++ /dev/null
@@ -1,10 +0,0 @@
-Sun Apr 14 11:21:03 1996 Karl Fogel <kfogel@floss.red-bean.com>
-
- * Makefile.in: new file; useful only for "make dist".
-
- * README: new file.
-
- * Added ChangeLog (this file).
-
- * Added elib-1.0.tar.gz.
-
diff --git a/gnu/usr.bin/cvs/contrib/elib/Makefile.in b/gnu/usr.bin/cvs/contrib/elib/Makefile.in
deleted file mode 100644
index a04787a88bb..00000000000
--- a/gnu/usr.bin/cvs/contrib/elib/Makefile.in
+++ /dev/null
@@ -1,79 +0,0 @@
-# Makefile for elib distributed with GNU CVS.
-
-# NOTE: this is only used for `make dist'. To actually make elib
-# itself, you must unpack the elib tar file, build and install.
-
-# Do not use this makefile directly, but only from `../Makefile'.
-# Copyright (C) 1986, 1988-1990 Free Software Foundation, Inc.
-
-# This program 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.
-
-# This program 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 this program; if not, write to the Free Software
-# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-# $CVSid: @(#)Makefile.in 1.6 94/10/22 $
-
-SHELL = /bin/sh
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-# Where to put the manual pages.
-mandir = $(prefix)/man
-
-# Use cp if you don't have install.
-INSTALL = @INSTALL@
-
-DISTFILES = ChangeLog README Makefile.in elib-1.0.tar.gz
-
-all: Makefile
-.PHONY: all
-
-install: all
- @echo "You must unpack, build, and install elib yourself."
-.PHONY: install
-
-tags:
-.PHONY: tags
-
-TAGS:
-.PHONY: TAGS
-
-ls:
- @echo $(DISTFILES)
-.PHONY: ls
-
-clean:
- /bin/rm -f *.o core
-.PHONY: clean
-
-distclean: clean
- rm -f Makefile
-.PHONY: distclean
-
-realclean: distclean
-.PHONY: realclean
-
-dist-dir:
- mkdir ${DISTDIR}
- for i in ${DISTFILES}; do \
- ln $(srcdir)/$${i} ${DISTDIR}; \
- done
-.PHONY: dist-dir
-
-subdir = contrib/elib
-Makefile: ../../config.status Makefile.in
- cd ../.. && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./config.status
diff --git a/gnu/usr.bin/cvs/contrib/elib/README b/gnu/usr.bin/cvs/contrib/elib/README
deleted file mode 100644
index 40c903fe43e..00000000000
--- a/gnu/usr.bin/cvs/contrib/elib/README
+++ /dev/null
@@ -1,8 +0,0 @@
- Elib is included in the CVS distribution as a convenience
-only, because pcl-cvs needs elib to run (see tools/pcl-cvs/). The
-maintainers of CVS do not maintain elib, so please do not send them
-bug reports about elib.
-
- As of 14 April 1996, the latest release of elib can be found
-at "ftp://ftp.lysator.liu.se/pub/emacs/elib-1.0.tar.gz".
-
diff --git a/gnu/usr.bin/cvs/contrib/elib/elib-1.0.tar.gz b/gnu/usr.bin/cvs/contrib/elib/elib-1.0.tar.gz
deleted file mode 100644
index b858c583e53..00000000000
--- a/gnu/usr.bin/cvs/contrib/elib/elib-1.0.tar.gz
+++ /dev/null
Binary files differ
diff --git a/gnu/usr.bin/cvs/contrib/listen2.c b/gnu/usr.bin/cvs/contrib/listen2.c
deleted file mode 100644
index 20cfc6cd455..00000000000
--- a/gnu/usr.bin/cvs/contrib/listen2.c
+++ /dev/null
@@ -1,107 +0,0 @@
-/* This will develop into the inted-like program which
- we may want to use for a server on Win95/NT. Right now
- it is just a test program ("telnet foo 2401" and you'll
- get a message). */
-
-#include <winsock.h>
-#include <stdio.h>
-#include <io.h>
-#include <process.h>
-
-int
-main ()
-{
- struct sockaddr_in sa;
- SOCKET t;
- SOCKET s;
- WSADATA data;
-
- if (WSAStartup (MAKEWORD (1, 1), &data))
- {
- fprintf (stderr, "cvs: unable to initialize winsock\n");
- exit (1);
- }
-
- t = socket (PF_INET, SOCK_STREAM, 0);
- if (t == INVALID_SOCKET)
- {
- printf ("Error in socket(): %d\n", WSAGetLastError ());
- exit (1);
- }
- sa.sin_family = AF_INET;
- sa.sin_addr.s_addr = INADDR_ANY;
- sa.sin_port = htons (2401);
- if (bind (t, (struct sockaddr *) &sa, sizeof (sa)) != 0)
- {
- printf ("Cannot bind(): %d\n", WSAGetLastError ());
- exit (1);
- }
- if (listen (t, 1) != 0)
- {
- printf ("Cannot listen(): %d\n", WSAGetLastError ());
- exit (1);
- }
- while (1)
- {
- int sasize = sizeof (sa);
-
-#if 0
- int save_stdin, save_stdout;
-#endif
-
- s = accept (t, (struct sockaddr *) &sa, &sasize);
- if (s == INVALID_SOCKET)
- {
- printf ("Cannot accept(): %d\n", WSAGetLastError ());
- exit (1);
- }
-#if 0
- /* This, of course, does not work because sockets are
- not file descriptors and file descriptors are not
- sockets. Duh! */
- save_stdin = _dup (0);
- if (save_stdin < 0)
- {
- printf ("Cannot save stdin: %s\n", strerror (errno));
- exit (1);
- }
- save_stdout = _dup (1);
- if (save_stdout < 0)
- {
- printf ("Cannot save stdout: %s\n", strerror (errno));
- exit (1);
- }
- if (_dup2 (s, 0) < 0)
- {
- printf ("Cannot dup stdin: %s\n", strerror (errno));
- exit (1);
- }
- if (_dup2 (s, 1) < 0)
- {
- printf ("Cannot dup stdout: %s\n", strerror (errno));
- exit (1);
- }
- /* Of course this will be "cvs" eventually, but "netstat"
- is for testing. */
- if (_spawnl (_P_DETACH, "netstat", "netstat", NULL) < 0)
- {
- printf ("Cannot spawn subprocess: %s\n", strerror (errno));
- exit (1);
- }
-#else
- if (send (s, "hello, world\n", 13, 0) == SOCKET_ERROR)
- {
- /* Note that we do not detect the case in which we sent
- less than the requested number of bytes. */
- printf ("Cannot send(): %d\n", WSAGetLastError ());
- exit (1);
- }
-#endif
- if (closesocket (s) != 0)
- {
- printf ("Cannot closesocket(): %d\n", WSAGetLastError ());
- exit (1);
- }
- }
- return 0;
-}
diff --git a/gnu/usr.bin/cvs/contrib/listen2.mak b/gnu/usr.bin/cvs/contrib/listen2.mak
deleted file mode 100644
index 12a80cede84..00000000000
--- a/gnu/usr.bin/cvs/contrib/listen2.mak
+++ /dev/null
@@ -1,188 +0,0 @@
-# Microsoft Developer Studio Generated NMAKE File, Format Version 40001
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Console Application" 0x0103
-
-!IF "$(CFG)" == ""
-CFG=listen2 - Win32 Debug
-!MESSAGE No configuration specified. Defaulting to listen2 - Win32 Debug.
-!ENDIF
-
-!IF "$(CFG)" != "listen2 - Win32 Release" && "$(CFG)" !=\
- "listen2 - Win32 Debug"
-!MESSAGE Invalid configuration "$(CFG)" specified.
-!MESSAGE You can specify a configuration when running NMAKE on this makefile
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "listen2.mak" CFG="listen2 - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "listen2 - Win32 Release" (based on "Win32 (x86) Console Application")
-!MESSAGE "listen2 - Win32 Debug" (based on "Win32 (x86) Console Application")
-!MESSAGE
-!ERROR An invalid configuration is specified.
-!ENDIF
-
-!IF "$(OS)" == "Windows_NT"
-NULL=
-!ELSE
-NULL=nul
-!ENDIF
-################################################################################
-# Begin Project
-RSC=rc.exe
-CPP=cl.exe
-
-!IF "$(CFG)" == "listen2 - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "Release"
-# PROP Intermediate_Dir "Release"
-# PROP Target_Dir ""
-OUTDIR=.\Release
-INTDIR=.\Release
-
-ALL : "$(OUTDIR)\listen2.exe"
-
-CLEAN :
- -@erase ".\Release\listen2.exe"
- -@erase ".\Release\listen2.obj"
-
-"$(OUTDIR)" :
- if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
-
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /c
-# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /YX /c
-CPP_PROJ=/nologo /ML /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE"\
- /Fp"$(INTDIR)/listen2.pch" /YX /Fo"$(INTDIR)/" /c
-CPP_OBJS=.\Release/
-CPP_SBRS=
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-BSC32_FLAGS=/nologo /o"$(OUTDIR)/listen2.bsc"
-BSC32_SBRS=
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /machine:I386
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib wsock32.lib /nologo /subsystem:console /machine:I386
-LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
- advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib wsock32.lib /nologo\
- /subsystem:console /incremental:no /pdb:"$(OUTDIR)/listen2.pdb" /machine:I386\
- /out:"$(OUTDIR)/listen2.exe"
-LINK32_OBJS= \
- "$(INTDIR)/listen2.obj"
-
-"$(OUTDIR)\listen2.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
- $(LINK32) @<<
- $(LINK32_FLAGS) $(LINK32_OBJS)
-<<
-
-!ELSEIF "$(CFG)" == "listen2 - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "Debug"
-# PROP Intermediate_Dir "Debug"
-# PROP Target_Dir ""
-OUTDIR=.\Debug
-INTDIR=.\Debug
-
-ALL : "$(OUTDIR)\listen2.exe"
-
-CLEAN :
- -@erase ".\Debug\listen2.exe"
- -@erase ".\Debug\listen2.obj"
- -@erase ".\Debug\listen2.ilk"
- -@erase ".\Debug\listen2.pdb"
- -@erase ".\Debug\vc40.pdb"
- -@erase ".\Debug\vc40.idb"
-
-"$(OUTDIR)" :
- if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
-
-# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /YX /c
-# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /YX /c
-CPP_PROJ=/nologo /MLd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE"\
- /Fp"$(INTDIR)/listen2.pch" /YX /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c
-CPP_OBJS=.\Debug/
-CPP_SBRS=
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-BSC32_FLAGS=/nologo /o"$(OUTDIR)/listen2.bsc"
-BSC32_SBRS=
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /debug /machine:I386
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib wsock32.lib /nologo /subsystem:console /debug /machine:I386
-LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
- advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib wsock32.lib /nologo\
- /subsystem:console /incremental:yes /pdb:"$(OUTDIR)/listen2.pdb" /debug\
- /machine:I386 /out:"$(OUTDIR)/listen2.exe"
-LINK32_OBJS= \
- "$(INTDIR)/listen2.obj"
-
-"$(OUTDIR)\listen2.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
- $(LINK32) @<<
- $(LINK32_FLAGS) $(LINK32_OBJS)
-<<
-
-!ENDIF
-
-.c{$(CPP_OBJS)}.obj:
- $(CPP) $(CPP_PROJ) $<
-
-.cpp{$(CPP_OBJS)}.obj:
- $(CPP) $(CPP_PROJ) $<
-
-.cxx{$(CPP_OBJS)}.obj:
- $(CPP) $(CPP_PROJ) $<
-
-.c{$(CPP_SBRS)}.sbr:
- $(CPP) $(CPP_PROJ) $<
-
-.cpp{$(CPP_SBRS)}.sbr:
- $(CPP) $(CPP_PROJ) $<
-
-.cxx{$(CPP_SBRS)}.sbr:
- $(CPP) $(CPP_PROJ) $<
-
-################################################################################
-# Begin Target
-
-# Name "listen2 - Win32 Release"
-# Name "listen2 - Win32 Debug"
-
-!IF "$(CFG)" == "listen2 - Win32 Release"
-
-!ELSEIF "$(CFG)" == "listen2 - Win32 Debug"
-
-!ENDIF
-
-################################################################################
-# Begin Source File
-
-SOURCE=.\listen2.c
-
-"$(INTDIR)\listen2.obj" : $(SOURCE) "$(INTDIR)"
-
-
-# End Source File
-# End Target
-# End Project
-################################################################################
diff --git a/gnu/usr.bin/cvs/diff/Makefile.in b/gnu/usr.bin/cvs/diff/Makefile.in
index c95930fca54..effc1cdbfd2 100644
--- a/gnu/usr.bin/cvs/diff/Makefile.in
+++ b/gnu/usr.bin/cvs/diff/Makefile.in
@@ -12,10 +12,6 @@
# 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 GNU DIFF; see the file COPYING. If not, write to
-# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
#### Start of system configuration section. ####
@@ -47,7 +43,7 @@ SOURCES = diff.c diff3.c analyze.c cmpbuf.c cmpbuf.h io.c context.c ed.c \
diffrun.h
OBJECTS = diff.o diff3.o analyze.o cmpbuf.o dir.o io.o util.o \
context.o ed.o ifdef.o normal.o side.o version.o
-DISTFILES = $(SOURCES) ChangeLog build_diff.com Makefile.in
+DISTFILES = $(SOURCES) ChangeLog build_diff.com Makefile.in diagmeet.note
all: libdiff.a
diff --git a/gnu/usr.bin/cvs/lib/getdate.c b/gnu/usr.bin/cvs/lib/getdate.c
index c97fd30af03..c02af2a5fc9 100644
--- a/gnu/usr.bin/cvs/lib/getdate.c
+++ b/gnu/usr.bin/cvs/lib/getdate.c
@@ -633,6 +633,10 @@ ToSeconds(Hours, Minutes, Seconds, Meridian)
}
+/* Year is either
+ * A negative number, which means to use its absolute value (why?)
+ * A number from 0 to 99, which means a year from 1900 to 1999, or
+ * The actual year (>=100). */
static time_t
Convert(Month, Day, Year, Hours, Minutes, Seconds, Meridian, DSTmode)
time_t Month;
@@ -724,7 +728,7 @@ RelativeMonth(Start, RelMonth)
if (RelMonth == 0)
return 0;
tm = localtime(&Start);
- Month = 12 * tm->tm_year + tm->tm_mon + RelMonth;
+ Month = 12 * (tm->tm_year + 1900) + tm->tm_mon + RelMonth;
Year = Month / 12;
Month = Month % 12 + 1;
return DSTcorrect(Start,
@@ -1040,7 +1044,7 @@ main(ac, av)
/* NOTREACHED */
}
#endif /* defined(TEST) */
-#line 1044 "y.tab.c"
+#line 1048 "y.tab.c"
#define YYABORT goto yyabort
#define YYREJECT goto yyabort
#define YYACCEPT goto yyaccept
@@ -1465,7 +1469,7 @@ case 41:
yyval.Meridian = yyvsp[0].Meridian;
}
break;
-#line 1469 "y.tab.c"
+#line 1473 "y.tab.c"
}
yyssp -= yym;
yystate = *yyssp;
diff --git a/gnu/usr.bin/cvs/lib/getdate.y b/gnu/usr.bin/cvs/lib/getdate.y
index fdb177d04c1..9a4a8fae658 100644
--- a/gnu/usr.bin/cvs/lib/getdate.y
+++ b/gnu/usr.bin/cvs/lib/getdate.y
@@ -619,6 +619,10 @@ ToSeconds(Hours, Minutes, Seconds, Meridian)
}
+/* Year is either
+ * A negative number, which means to use its absolute value (why?)
+ * A number from 0 to 99, which means a year from 1900 to 1999, or
+ * The actual year (>=100). */
static time_t
Convert(Month, Day, Year, Hours, Minutes, Seconds, Meridian, DSTmode)
time_t Month;
@@ -710,7 +714,7 @@ RelativeMonth(Start, RelMonth)
if (RelMonth == 0)
return 0;
tm = localtime(&Start);
- Month = 12 * tm->tm_year + tm->tm_mon + RelMonth;
+ Month = 12 * (tm->tm_year + 1900) + tm->tm_mon + RelMonth;
Year = Month / 12;
Month = Month % 12 + 1;
return DSTcorrect(Start,
diff --git a/gnu/usr.bin/cvs/lib/memmove.c b/gnu/usr.bin/cvs/lib/memmove.c
index 8818d46544c..047a5a0941a 100644
--- a/gnu/usr.bin/cvs/lib/memmove.c
+++ b/gnu/usr.bin/cvs/lib/memmove.c
@@ -12,10 +12,7 @@ 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 libiberty; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA. */
+*/
/*
diff --git a/gnu/usr.bin/cvs/lib/vasprintf.c b/gnu/usr.bin/cvs/lib/vasprintf.c
deleted file mode 100644
index 45253b15325..00000000000
--- a/gnu/usr.bin/cvs/lib/vasprintf.c
+++ /dev/null
@@ -1,171 +0,0 @@
-/* Like vsprintf but provides a pointer to malloc'd storage, which must
- be freed by the caller.
- Copyright (C) 1994 Free Software Foundation, Inc.
-
-This file is part of the libiberty library.
-Libiberty 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.
-
-Libiberty 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 libiberty; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA. */
-
-#include <stdio.h>
-#include <string.h>
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#ifdef __STDC__
-#include <stdarg.h>
-#else
-#include <varargs.h>
-#endif
-
-extern int abs ();
-
-#ifdef TEST
-int global_total_width;
-#endif
-
-unsigned long strtoul ();
-char *malloc ();
-
-static int
-int_vasprintf (result, format, args)
- char **result;
- const char *format;
- va_list *args;
-{
- const char *p = format;
- /* Add one to make sure that it is never zero, which might cause malloc
- to return NULL. */
- int total_width = strlen (format) + 1;
- va_list ap;
-
- memcpy (&ap, args, sizeof (va_list));
-
- while (*p != '\0')
- {
- if (*p++ == '%')
- {
- while (strchr ("-+ #0", *p))
- ++p;
- if (*p == '*')
- {
- ++p;
- total_width += abs (va_arg (ap, int));
- }
- else
- total_width += strtoul (p, &p, 10);
- if (*p == '.')
- {
- ++p;
- if (*p == '*')
- {
- ++p;
- total_width += abs (va_arg (ap, int));
- }
- else
- total_width += strtoul (p, &p, 10);
- }
- while (strchr ("hlL", *p))
- ++p;
- /* Should be big enough for any format specifier except %s. */
- total_width += 30;
- switch (*p)
- {
- case 'd':
- case 'i':
- case 'o':
- case 'u':
- case 'x':
- case 'X':
- case 'c':
- (void) va_arg (ap, int);
- break;
- case 'f':
- case 'e':
- case 'E':
- case 'g':
- case 'G':
- (void) va_arg (ap, double);
- break;
- case 's':
- total_width += strlen (va_arg (ap, char *));
- break;
- case 'p':
- case 'n':
- (void) va_arg (ap, char *);
- break;
- }
- }
- }
-#ifdef TEST
- global_total_width = total_width;
-#endif
- *result = malloc (total_width);
- if (*result != NULL)
- return vsprintf (*result, format, *args);
- else
- return 0;
-}
-
-int
-vasprintf (result, format, args)
- char **result;
- const char *format;
- va_list args;
-{
- return int_vasprintf (result, format, &args);
-}
-
-#ifdef TEST
-void
-checkit
-#ifdef __STDC__
- (const char* format, ...)
-#else
- (va_alist)
- va_dcl
-#endif
-{
- va_list args;
- char *result;
-
-#ifdef __STDC__
- va_start (args, format);
-#else
- char *format;
- va_start (args);
- format = va_arg (args, char *);
-#endif
- vasprintf (&result, format, args);
- if (strlen (result) < global_total_width)
- printf ("PASS: ");
- else
- printf ("FAIL: ");
- printf ("%d %s\n", global_total_width, result);
-}
-
-int
-main ()
-{
- checkit ("%d", 0x12345678);
- checkit ("%200d", 5);
- checkit ("%.300d", 6);
- checkit ("%100.150d", 7);
- checkit ("%s", "jjjjjjjjjiiiiiiiiiiiiiiioooooooooooooooooppppppppppppaa\n\
-777777777777777777333333333333366666666666622222222222777777777777733333");
- checkit ("%f%s%d%s", 1.0, "foo", 77, "asdjffffffffffffffiiiiiiiiiiixxxxx");
-}
-#endif /* TEST */
diff --git a/gnu/usr.bin/cvs/os2/getdate.c b/gnu/usr.bin/cvs/os2/getdate.c
deleted file mode 100644
index dcfcdf39e9c..00000000000
--- a/gnu/usr.bin/cvs/os2/getdate.c
+++ /dev/null
@@ -1,1578 +0,0 @@
-/* stolen from lib/getdate.c */
-
-#include "config.h"
-#include <stdlib.h>
-#include <stdio.h>
-#include <ctype.h>
-
-/* The code at the top of get_date which figures out the offset of the
- current time zone checks various CPP symbols to see if special
- tricks are need, but defaults to using the gettimeofday system call.
- Include <sys/time.h> if that will be used. */
-
-#if defined(vms)
-
-#include <types.h>
-#include <time.h>
-
-#else
-
-#include <sys/types.h>
-
-#ifdef TIME_WITH_SYS_TIME
-#include <sys/time.h>
-#include <time.h>
-#else
-#ifdef HAVE_SYS_TIME_H
-#include <sys/time.h>
-#else
-#include <time.h>
-#endif
-#endif
-
-#ifdef timezone
-#undef timezone /* needed for sgi */
-#endif
-
-#if defined(HAVE_SYS_TIMEB_H)
-#include <sys/timeb.h>
-#else
-/*
-** We use the obsolete `struct timeb' as part of our interface!
-** Since the system doesn't have it, we define it here;
-** our callers must do likewise.
-*/
-struct timeb {
- time_t time; /* Seconds since the epoch */
- unsigned short millitm; /* Field not used */
- short timezone; /* Minutes west of GMT */
- short dstflag; /* Field not used */
-};
-#endif /* defined(HAVE_SYS_TIMEB_H) */
-
-#endif /* defined(vms) */
-
-#if defined (STDC_HEADERS) || defined (USG)
-#include <string.h>
-#endif
-
-/* Some old versions of bison generate parsers that use bcopy.
- That loses on systems that don't provide the function, so we have
- to redefine it here. */
-#if !defined (HAVE_BCOPY) && defined (HAVE_MEMCPY) && !defined (bcopy)
-#define bcopy(from, to, len) memcpy ((to), (from), (len))
-#endif
-
-#if defined (STDC_HEADERS)
-#include <stdlib.h>
-#endif
-
-#if defined (HAVE_ALLOCA_H)
-#include <alloca.h>
-#endif
-
-extern struct tm *gmtime();
-extern struct tm *localtime();
-
-#define yyparse getdate_yyparse
-#define yylex getdate_yylex
-#define yyerror getdate_yyerror
-
-#if !defined(lint) && !defined(SABER)
-static char RCS[] = "$CVSid: @(#)getdate.y 1.11 94/09/21 $";
-#endif /* !defined(lint) && !defined(SABER) */
-
-static int yylex ();
-static int yyerror ();
-
-#define EPOCH 1970
-#define HOUR(x) ((time_t)(x) * 60)
-#define SECSPERDAY (24L * 60L * 60L)
-
-
-/*
-** An entry in the lexical lookup table.
-*/
-typedef struct _TABLE {
- char *name;
- int type;
- time_t value;
-} TABLE;
-
-
-/*
-** Daylight-savings mode: on, off, or not yet known.
-*/
-typedef enum _DSTMODE {
- DSTon, DSToff, DSTmaybe
-} DSTMODE;
-
-/*
-** Meridian: am, pm, or 24-hour style.
-*/
-typedef enum _MERIDIAN {
- MERam, MERpm, MER24
-} MERIDIAN;
-
-
-/*
-** Global variables. We could get rid of most of these by using a good
-** union as the yacc stack. (This routine was originally written before
-** yacc had the %union construct.) Maybe someday; right now we only use
-** the %union very rarely.
-*/
-static char *yyInput;
-static DSTMODE yyDSTmode;
-static time_t yyDayOrdinal;
-static time_t yyDayNumber;
-static int yyHaveDate;
-static int yyHaveDay;
-static int yyHaveRel;
-static int yyHaveTime;
-static int yyHaveZone;
-static time_t yyTimezone;
-static time_t yyDay;
-static time_t yyHour;
-static time_t yyMinutes;
-static time_t yyMonth;
-static time_t yySeconds;
-static time_t yyYear;
-static MERIDIAN yyMeridian;
-static time_t yyRelMonth;
-static time_t yyRelSeconds;
-
-
-typedef union {
- time_t Number;
- enum _MERIDIAN Meridian;
-} YYSTYPE;
-# define tAGO 257
-# define tDAY 258
-# define tDAYZONE 259
-# define tID 260
-# define tMERIDIAN 261
-# define tMINUTE_UNIT 262
-# define tMONTH 263
-# define tMONTH_UNIT 264
-# define tSEC_UNIT 265
-# define tSNUMBER 266
-# define tUNUMBER 267
-# define tZONE 268
-# define tDST 269
-#define yyclearin yychar = -1
-#define yyerrok yyerrflag = 0
-extern int yychar;
-extern int yyerrflag;
-#ifndef YYMAXDEPTH
-#define YYMAXDEPTH 150
-#endif
-YYSTYPE yylval, yyval;
-# define YYERRCODE 256
-
-
-
-/* Month and day table. */
-static TABLE const MonthDayTable[] = {
- { "january", tMONTH, 1 },
- { "february", tMONTH, 2 },
- { "march", tMONTH, 3 },
- { "april", tMONTH, 4 },
- { "may", tMONTH, 5 },
- { "june", tMONTH, 6 },
- { "july", tMONTH, 7 },
- { "august", tMONTH, 8 },
- { "september", tMONTH, 9 },
- { "sept", tMONTH, 9 },
- { "october", tMONTH, 10 },
- { "november", tMONTH, 11 },
- { "december", tMONTH, 12 },
- { "sunday", tDAY, 0 },
- { "monday", tDAY, 1 },
- { "tuesday", tDAY, 2 },
- { "tues", tDAY, 2 },
- { "wednesday", tDAY, 3 },
- { "wednes", tDAY, 3 },
- { "thursday", tDAY, 4 },
- { "thur", tDAY, 4 },
- { "thurs", tDAY, 4 },
- { "friday", tDAY, 5 },
- { "saturday", tDAY, 6 },
- { NULL }
-};
-
-/* Time units table. */
-static TABLE const UnitsTable[] = {
- { "year", tMONTH_UNIT, 12 },
- { "month", tMONTH_UNIT, 1 },
- { "fortnight", tMINUTE_UNIT, 14 * 24 * 60 },
- { "week", tMINUTE_UNIT, 7 * 24 * 60 },
- { "day", tMINUTE_UNIT, 1 * 24 * 60 },
- { "hour", tMINUTE_UNIT, 60 },
- { "minute", tMINUTE_UNIT, 1 },
- { "min", tMINUTE_UNIT, 1 },
- { "second", tSEC_UNIT, 1 },
- { "sec", tSEC_UNIT, 1 },
- { NULL }
-};
-
-/* Assorted relative-time words. */
-static TABLE const OtherTable[] = {
- { "tomorrow", tMINUTE_UNIT, 1 * 24 * 60 },
- { "yesterday", tMINUTE_UNIT, -1 * 24 * 60 },
- { "today", tMINUTE_UNIT, 0 },
- { "now", tMINUTE_UNIT, 0 },
- { "last", tUNUMBER, -1 },
- { "this", tMINUTE_UNIT, 0 },
- { "next", tUNUMBER, 2 },
- { "first", tUNUMBER, 1 },
-/* { "second", tUNUMBER, 2 }, */
- { "third", tUNUMBER, 3 },
- { "fourth", tUNUMBER, 4 },
- { "fifth", tUNUMBER, 5 },
- { "sixth", tUNUMBER, 6 },
- { "seventh", tUNUMBER, 7 },
- { "eighth", tUNUMBER, 8 },
- { "ninth", tUNUMBER, 9 },
- { "tenth", tUNUMBER, 10 },
- { "eleventh", tUNUMBER, 11 },
- { "twelfth", tUNUMBER, 12 },
- { "ago", tAGO, 1 },
- { NULL }
-};
-
-/* The timezone table. */
-/* Some of these are commented out because a time_t can't store a float. */
-static TABLE const TimezoneTable[] = {
- { "gmt", tZONE, HOUR( 0) }, /* Greenwich Mean */
- { "ut", tZONE, HOUR( 0) }, /* Universal (Coordinated) */
- { "utc", tZONE, HOUR( 0) },
- { "wet", tZONE, HOUR( 0) }, /* Western European */
- { "bst", tDAYZONE, HOUR( 0) }, /* British Summer */
- { "wat", tZONE, HOUR( 1) }, /* West Africa */
- { "at", tZONE, HOUR( 2) }, /* Azores */
-#if 0
- /* For completeness. BST is also British Summer, and GST is
- * also Guam Standard. */
- { "bst", tZONE, HOUR( 3) }, /* Brazil Standard */
- { "gst", tZONE, HOUR( 3) }, /* Greenland Standard */
-#endif
-#if 0
- { "nft", tZONE, HOUR(3.5) }, /* Newfoundland */
- { "nst", tZONE, HOUR(3.5) }, /* Newfoundland Standard */
- { "ndt", tDAYZONE, HOUR(3.5) }, /* Newfoundland Daylight */
-#endif
- { "ast", tZONE, HOUR( 4) }, /* Atlantic Standard */
- { "adt", tDAYZONE, HOUR( 4) }, /* Atlantic Daylight */
- { "est", tZONE, HOUR( 5) }, /* Eastern Standard */
- { "edt", tDAYZONE, HOUR( 5) }, /* Eastern Daylight */
- { "cst", tZONE, HOUR( 6) }, /* Central Standard */
- { "cdt", tDAYZONE, HOUR( 6) }, /* Central Daylight */
- { "mst", tZONE, HOUR( 7) }, /* Mountain Standard */
- { "mdt", tDAYZONE, HOUR( 7) }, /* Mountain Daylight */
- { "pst", tZONE, HOUR( 8) }, /* Pacific Standard */
- { "pdt", tDAYZONE, HOUR( 8) }, /* Pacific Daylight */
- { "yst", tZONE, HOUR( 9) }, /* Yukon Standard */
- { "ydt", tDAYZONE, HOUR( 9) }, /* Yukon Daylight */
- { "hst", tZONE, HOUR(10) }, /* Hawaii Standard */
- { "hdt", tDAYZONE, HOUR(10) }, /* Hawaii Daylight */
- { "cat", tZONE, HOUR(10) }, /* Central Alaska */
- { "ahst", tZONE, HOUR(10) }, /* Alaska-Hawaii Standard */
- { "nt", tZONE, HOUR(11) }, /* Nome */
- { "idlw", tZONE, HOUR(12) }, /* International Date Line West */
- { "cet", tZONE, -HOUR(1) }, /* Central European */
- { "met", tZONE, -HOUR(1) }, /* Middle European */
- { "mewt", tZONE, -HOUR(1) }, /* Middle European Winter */
- { "mest", tDAYZONE, -HOUR(1) }, /* Middle European Summer */
- { "swt", tZONE, -HOUR(1) }, /* Swedish Winter */
- { "sst", tDAYZONE, -HOUR(1) }, /* Swedish Summer */
- { "fwt", tZONE, -HOUR(1) }, /* French Winter */
- { "fst", tDAYZONE, -HOUR(1) }, /* French Summer */
- { "eet", tZONE, -HOUR(2) }, /* Eastern Europe, USSR Zone 1 */
- { "bt", tZONE, -HOUR(3) }, /* Baghdad, USSR Zone 2 */
-#if 0
- { "it", tZONE, -HOUR(3.5) },/* Iran */
-#endif
- { "zp4", tZONE, -HOUR(4) }, /* USSR Zone 3 */
- { "zp5", tZONE, -HOUR(5) }, /* USSR Zone 4 */
-#if 0
- { "ist", tZONE, -HOUR(5.5) },/* Indian Standard */
-#endif
- { "zp6", tZONE, -HOUR(6) }, /* USSR Zone 5 */
-#if 0
- /* For completeness. NST is also Newfoundland Stanard, and SST is
- * also Swedish Summer. */
- { "nst", tZONE, -HOUR(6.5) },/* North Sumatra */
- { "sst", tZONE, -HOUR(7) }, /* South Sumatra, USSR Zone 6 */
-#endif /* 0 */
- { "wast", tZONE, -HOUR(7) }, /* West Australian Standard */
- { "wadt", tDAYZONE, -HOUR(7) }, /* West Australian Daylight */
-#if 0
- { "jt", tZONE, -HOUR(7.5) },/* Java (3pm in Cronusland!) */
-#endif
- { "cct", tZONE, -HOUR(8) }, /* China Coast, USSR Zone 7 */
- { "jst", tZONE, -HOUR(9) }, /* Japan Standard, USSR Zone 8 */
-#if 0
- { "cast", tZONE, -HOUR(9.5) },/* Central Australian Standard */
- { "cadt", tDAYZONE, -HOUR(9.5) },/* Central Australian Daylight */
-#endif
- { "east", tZONE, -HOUR(10) }, /* Eastern Australian Standard */
- { "eadt", tDAYZONE, -HOUR(10) }, /* Eastern Australian Daylight */
- { "gst", tZONE, -HOUR(10) }, /* Guam Standard, USSR Zone 9 */
- { "nzt", tZONE, -HOUR(12) }, /* New Zealand */
- { "nzst", tZONE, -HOUR(12) }, /* New Zealand Standard */
- { "nzdt", tDAYZONE, -HOUR(12) }, /* New Zealand Daylight */
- { "idle", tZONE, -HOUR(12) }, /* International Date Line East */
- { NULL }
-};
-
-/* Military timezone table. */
-static TABLE const MilitaryTable[] = {
- { "a", tZONE, HOUR( 1) },
- { "b", tZONE, HOUR( 2) },
- { "c", tZONE, HOUR( 3) },
- { "d", tZONE, HOUR( 4) },
- { "e", tZONE, HOUR( 5) },
- { "f", tZONE, HOUR( 6) },
- { "g", tZONE, HOUR( 7) },
- { "h", tZONE, HOUR( 8) },
- { "i", tZONE, HOUR( 9) },
- { "k", tZONE, HOUR( 10) },
- { "l", tZONE, HOUR( 11) },
- { "m", tZONE, HOUR( 12) },
- { "n", tZONE, HOUR(- 1) },
- { "o", tZONE, HOUR(- 2) },
- { "p", tZONE, HOUR(- 3) },
- { "q", tZONE, HOUR(- 4) },
- { "r", tZONE, HOUR(- 5) },
- { "s", tZONE, HOUR(- 6) },
- { "t", tZONE, HOUR(- 7) },
- { "u", tZONE, HOUR(- 8) },
- { "v", tZONE, HOUR(- 9) },
- { "w", tZONE, HOUR(-10) },
- { "x", tZONE, HOUR(-11) },
- { "y", tZONE, HOUR(-12) },
- { "z", tZONE, HOUR( 0) },
- { NULL }
-};
-
-
-
-
-/* ARGSUSED */
-static int
-yyerror(s)
- char *s;
-{
- return 0;
-}
-
-
-static time_t
-ToSeconds(Hours, Minutes, Seconds, Meridian)
- time_t Hours;
- time_t Minutes;
- time_t Seconds;
- MERIDIAN Meridian;
-{
- if (Minutes < 0 || Minutes > 59 || Seconds < 0 || Seconds > 59)
- return -1;
- switch (Meridian) {
- case MER24:
- if (Hours < 0 || Hours > 23)
- return -1;
- return (Hours * 60L + Minutes) * 60L + Seconds;
- case MERam:
- if (Hours < 1 || Hours > 12)
- return -1;
- return (Hours * 60L + Minutes) * 60L + Seconds;
- case MERpm:
- if (Hours < 1 || Hours > 12)
- return -1;
- return ((Hours + 12) * 60L + Minutes) * 60L + Seconds;
- default:
- abort ();
- }
- /* NOTREACHED */
-}
-
-
-static time_t
-Convert(Month, Day, Year, Hours, Minutes, Seconds, Meridian, DSTmode)
- time_t Month;
- time_t Day;
- time_t Year;
- time_t Hours;
- time_t Minutes;
- time_t Seconds;
- MERIDIAN Meridian;
- DSTMODE DSTmode;
-{
- static int DaysInMonth[12] = {
- 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
- };
- time_t tod;
- time_t Julian;
- int i;
-
- if (Year < 0)
- Year = -Year;
- if (Year < 100)
- Year += 1900;
- DaysInMonth[1] = Year % 4 == 0 && (Year % 100 != 0 || Year % 400 == 0)
- ? 29 : 28;
- if (Year < EPOCH || Year > 1999
- || Month < 1 || Month > 12
- /* Lint fluff: "conversion from long may lose accuracy" */
- || Day < 1 || Day > DaysInMonth[(int)--Month])
- return -1;
-
- for (Julian = Day - 1, i = 0; i < Month; i++)
- Julian += DaysInMonth[i];
- for (i = EPOCH; i < Year; i++)
- Julian += 365 + (i % 4 == 0);
- Julian *= SECSPERDAY;
- Julian += yyTimezone * 60L;
- if ((tod = ToSeconds(Hours, Minutes, Seconds, Meridian)) < 0)
- return -1;
- Julian += tod;
- if (DSTmode == DSTon
- || (DSTmode == DSTmaybe && localtime(&Julian)->tm_isdst))
- Julian -= 60 * 60;
- return Julian;
-}
-
-
-static time_t
-DSTcorrect(Start, Future)
- time_t Start;
- time_t Future;
-{
- time_t StartDay;
- time_t FutureDay;
-
- StartDay = (localtime(&Start)->tm_hour + 1) % 24;
- FutureDay = (localtime(&Future)->tm_hour + 1) % 24;
- return (Future - Start) + (StartDay - FutureDay) * 60L * 60L;
-}
-
-
-static time_t
-RelativeDate(Start, DayOrdinal, DayNumber)
- time_t Start;
- time_t DayOrdinal;
- time_t DayNumber;
-{
- struct tm *tm;
- time_t now;
-
- now = Start;
- tm = localtime(&now);
- now += SECSPERDAY * ((DayNumber - tm->tm_wday + 7) % 7);
- now += 7 * SECSPERDAY * (DayOrdinal <= 0 ? DayOrdinal : DayOrdinal - 1);
- return DSTcorrect(Start, now);
-}
-
-
-static time_t
-RelativeMonth(Start, RelMonth)
- time_t Start;
- time_t RelMonth;
-{
- struct tm *tm;
- time_t Month;
- time_t Year;
-
- if (RelMonth == 0)
- return 0;
- tm = localtime(&Start);
- Month = 12 * tm->tm_year + tm->tm_mon + RelMonth;
- Year = Month / 12;
- Month = Month % 12 + 1;
- return DSTcorrect(Start,
- Convert(Month, (time_t)tm->tm_mday, Year,
- (time_t)tm->tm_hour, (time_t)tm->tm_min, (time_t)tm->tm_sec,
- MER24, DSTmaybe));
-}
-
-
-static int
-LookupWord(buff)
- char *buff;
-{
- register char *p;
- register char *q;
- register const TABLE *tp;
- int i;
- int abbrev;
-
- /* Make it lowercase. */
- for (p = buff; *p; p++)
- if (isupper(*p))
- *p = tolower(*p);
-
- if (strcmp(buff, "am") == 0 || strcmp(buff, "a.m.") == 0) {
- yylval.Meridian = MERam;
- return tMERIDIAN;
- }
- if (strcmp(buff, "pm") == 0 || strcmp(buff, "p.m.") == 0) {
- yylval.Meridian = MERpm;
- return tMERIDIAN;
- }
-
- /* See if we have an abbreviation for a month. */
- if (strlen(buff) == 3)
- abbrev = 1;
- else if (strlen(buff) == 4 && buff[3] == '.') {
- abbrev = 1;
- buff[3] = '\0';
- }
- else
- abbrev = 0;
-
- for (tp = MonthDayTable; tp->name; tp++) {
- if (abbrev) {
- if (strncmp(buff, tp->name, 3) == 0) {
- yylval.Number = tp->value;
- return tp->type;
- }
- }
- else if (strcmp(buff, tp->name) == 0) {
- yylval.Number = tp->value;
- return tp->type;
- }
- }
-
- for (tp = TimezoneTable; tp->name; tp++)
- if (strcmp(buff, tp->name) == 0) {
- yylval.Number = tp->value;
- return tp->type;
- }
-
- if (strcmp(buff, "dst") == 0)
- return tDST;
-
- for (tp = UnitsTable; tp->name; tp++)
- if (strcmp(buff, tp->name) == 0) {
- yylval.Number = tp->value;
- return tp->type;
- }
-
- /* Strip off any plural and try the units table again. */
- i = strlen(buff) - 1;
- if (buff[i] == 's') {
- buff[i] = '\0';
- for (tp = UnitsTable; tp->name; tp++)
- if (strcmp(buff, tp->name) == 0) {
- yylval.Number = tp->value;
- return tp->type;
- }
- buff[i] = 's'; /* Put back for "this" in OtherTable. */
- }
-
- for (tp = OtherTable; tp->name; tp++)
- if (strcmp(buff, tp->name) == 0) {
- yylval.Number = tp->value;
- return tp->type;
- }
-
- /* Military timezones. */
- if (buff[1] == '\0' && isalpha(*buff)) {
- for (tp = MilitaryTable; tp->name; tp++)
- if (strcmp(buff, tp->name) == 0) {
- yylval.Number = tp->value;
- return tp->type;
- }
- }
-
- /* Drop out any periods and try the timezone table again. */
- for (i = 0, p = q = buff; *q; q++)
- if (*q != '.')
- *p++ = *q;
- else
- i++;
- *p = '\0';
- if (i)
- for (tp = TimezoneTable; tp->name; tp++)
- if (strcmp(buff, tp->name) == 0) {
- yylval.Number = tp->value;
- return tp->type;
- }
-
- return tID;
-}
-
-
-static int
-yylex()
-{
- register char c;
- register char *p;
- char buff[20];
- int Count;
- int sign;
-
- for ( ; ; ) {
- while (isspace(*yyInput))
- yyInput++;
-
- if (isdigit(c = *yyInput) || c == '-' || c == '+') {
- if (c == '-' || c == '+') {
- sign = c == '-' ? -1 : 1;
- if (!isdigit(*++yyInput))
- /* skip the '-' sign */
- continue;
- }
- else
- sign = 0;
- for (yylval.Number = 0; isdigit(c = *yyInput++); )
- yylval.Number = 10 * yylval.Number + c - '0';
- yyInput--;
- if (sign < 0)
- yylval.Number = -yylval.Number;
- return sign ? tSNUMBER : tUNUMBER;
- }
- if (isalpha(c)) {
- for (p = buff; isalpha(c = *yyInput++) || c == '.'; )
- if (p < &buff[sizeof buff - 1])
- *p++ = c;
- *p = '\0';
- yyInput--;
- return LookupWord(buff);
- }
- if (c != '(')
- return *yyInput++;
- Count = 0;
- do {
- c = *yyInput++;
- if (c == '\0')
- return c;
- if (c == '(')
- Count++;
- else if (c == ')')
- Count--;
- } while (Count > 0);
- }
-}
-
-#define TM_YEAR_ORIGIN 1900
-
-/* Yield A - B, measured in seconds. */
-static long
-difftm (a, b)
- struct tm *a, *b;
-{
- int ay = a->tm_year + (TM_YEAR_ORIGIN - 1);
- int by = b->tm_year + (TM_YEAR_ORIGIN - 1);
- int days = (
- /* difference in day of year */
- a->tm_yday - b->tm_yday
- /* + intervening leap days */
- + ((ay >> 2) - (by >> 2))
- - (ay/100 - by/100)
- + ((ay/100 >> 2) - (by/100 >> 2))
- /* + difference in years * 365 */
- + (long)(ay-by) * 365
- );
- return (60*(60*(24*days + (a->tm_hour - b->tm_hour))
- + (a->tm_min - b->tm_min))
- + (a->tm_sec - b->tm_sec));
-}
-
-time_t
-get_date(p, now)
- char *p;
- struct timeb *now;
-{
- struct tm *tm, gmt;
- struct timeb ftz;
- time_t Start;
- time_t tod;
-
- yyInput = p;
- if (now == NULL) {
- now = &ftz;
- (void)time(&ftz.time);
-
- if (! (tm = gmtime (&ftz.time)))
- return -1;
- gmt = *tm; /* Make a copy, in case localtime modifies *tm. */
-
- if (! (tm = localtime (&ftz.time)))
- return -1;
-
- ftz.timezone = difftm (&gmt, tm) / 60;
- if(tm->tm_isdst)
- ftz.timezone += 60;
- }
-
- tm = localtime(&now->time);
- yyYear = tm->tm_year;
- yyMonth = tm->tm_mon + 1;
- yyDay = tm->tm_mday;
- yyTimezone = now->timezone;
- yyDSTmode = DSTmaybe;
- yyHour = 0;
- yyMinutes = 0;
- yySeconds = 0;
- yyMeridian = MER24;
- yyRelSeconds = 0;
- yyRelMonth = 0;
- yyHaveDate = 0;
- yyHaveDay = 0;
- yyHaveRel = 0;
- yyHaveTime = 0;
- yyHaveZone = 0;
-
- if (yyparse()
- || yyHaveTime > 1 || yyHaveZone > 1 || yyHaveDate > 1 || yyHaveDay > 1)
- return -1;
-
- if (yyHaveDate || yyHaveTime || yyHaveDay) {
- Start = Convert(yyMonth, yyDay, yyYear, yyHour, yyMinutes, yySeconds,
- yyMeridian, yyDSTmode);
- if (Start < 0)
- return -1;
- }
- else {
- Start = now->time;
- if (!yyHaveRel)
- Start -= ((tm->tm_hour * 60L + tm->tm_min) * 60L) + tm->tm_sec;
- }
-
- Start += yyRelSeconds;
- Start += RelativeMonth(Start, yyRelMonth);
-
- if (yyHaveDay && !yyHaveDate) {
- tod = RelativeDate(Start, yyDayOrdinal, yyDayNumber);
- Start += tod;
- }
-
- /* Have to do *something* with a legitimate -1 so it's distinguishable
- * from the error return value. (Alternately could set errno on error.) */
- return Start == -1 ? 0 : Start;
-}
-
-
-#if defined(TEST)
-
-/* ARGSUSED */
-int
-main(ac, av)
- int ac;
- char *av[];
-{
- char buff[128];
- time_t d;
-
- (void)printf("Enter date, or blank line to exit.\n\t> ");
- (void)fflush(stdout);
- while (gets(buff) && buff[0]) {
- d = get_date(buff, (struct timeb *)NULL);
- if (d == -1)
- (void)printf("Bad format - couldn't convert.\n");
- else
- (void)printf("%s", ctime(&d));
- (void)printf("\t> ");
- (void)fflush(stdout);
- }
- exit(0);
- /* NOTREACHED */
-}
-#endif /* defined(TEST) */
-int yyexca[] ={
--1, 1,
- 0, -1,
- -2, 0,
- };
-# define YYNPROD 42
-# define YYLAST 228
-int yyact[]={
-
- 13, 11, 22, 28, 16, 12, 18, 17, 15, 9,
- 10, 38, 39, 20, 48, 44, 47, 46, 36, 43,
- 50, 32, 35, 34, 33, 29, 37, 31, 41, 45,
- 40, 30, 14, 8, 7, 6, 5, 4, 3, 2,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 49, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 21, 0, 0, 19, 25, 24, 27,
- 26, 23, 44, 0, 0, 0, 0, 42 };
-int yypact[]={
-
- -1000, -258, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -45,
- -266, -1000, -242, -13, -230, -241, -1000, -1000, -1000, -1000,
- -245, -1000, -249, -240, -255, -1000, -1000, -1000, -1000, -14,
- -1000, -1000, -1000, -1000, -1000, -39, -18, -1000, -1000, -1000,
- -250, -1000, -1000, -251, -1000, -253, -1000, -246, -1000, -1000,
- -1000 };
-int yypgo[]={
-
- 0, 28, 40, 39, 38, 37, 36, 35, 34, 33,
- 32 };
-int yyr1[]={
-
- 0, 2, 2, 3, 3, 3, 3, 3, 3, 4,
- 4, 4, 4, 4, 5, 5, 5, 7, 7, 7,
- 6, 6, 6, 6, 6, 6, 6, 6, 8, 8,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 9,
- 1, 1 };
-int yyr2[]={
-
- 0, 0, 4, 3, 3, 3, 3, 3, 2, 5,
- 9, 9, 13, 13, 3, 3, 5, 3, 5, 5,
- 7, 11, 7, 7, 5, 9, 5, 7, 5, 2,
- 5, 5, 3, 5, 5, 3, 5, 5, 3, 3,
- 1, 3 };
-int yychk[]={
-
- -1000, -2, -3, -4, -5, -6, -7, -8, -9, 267,
- 268, 259, 263, 258, -10, 266, 262, 265, 264, 261,
- 58, 258, 47, 266, 263, 262, 265, 264, 269, 267,
- 44, 257, 262, 265, 264, 267, 267, 266, 266, 267,
- 44, -1, 266, 58, 261, 47, 267, 267, 267, -1,
- 266 };
-int yydef[]={
-
- 1, -2, 2, 3, 4, 5, 6, 7, 8, 39,
- 14, 15, 0, 17, 29, 0, 32, 35, 38, 9,
- 0, 19, 0, 0, 26, 30, 34, 37, 16, 24,
- 18, 28, 31, 33, 36, 40, 20, 22, 23, 27,
- 0, 10, 11, 0, 41, 0, 25, 40, 21, 12,
- 13 };
-typedef struct { char *t_name; int t_val; } yytoktype;
-#ifndef YYDEBUG
-# define YYDEBUG 0 /* don't allow debugging */
-#endif
-
-#if YYDEBUG
-
-yytoktype yytoks[] =
-{
- "tAGO", 257,
- "tDAY", 258,
- "tDAYZONE", 259,
- "tID", 260,
- "tMERIDIAN", 261,
- "tMINUTE_UNIT", 262,
- "tMONTH", 263,
- "tMONTH_UNIT", 264,
- "tSEC_UNIT", 265,
- "tSNUMBER", 266,
- "tUNUMBER", 267,
- "tZONE", 268,
- "tDST", 269,
- "-unknown-", -1 /* ends search */
-};
-
-char * yyreds[] =
-{
- "-no such reduction-",
- "spec : /* empty */",
- "spec : spec item",
- "item : time",
- "item : zone",
- "item : date",
- "item : day",
- "item : rel",
- "item : number",
- "time : tUNUMBER tMERIDIAN",
- "time : tUNUMBER ':' tUNUMBER o_merid",
- "time : tUNUMBER ':' tUNUMBER tSNUMBER",
- "time : tUNUMBER ':' tUNUMBER ':' tUNUMBER o_merid",
- "time : tUNUMBER ':' tUNUMBER ':' tUNUMBER tSNUMBER",
- "zone : tZONE",
- "zone : tDAYZONE",
- "zone : tZONE tDST",
- "day : tDAY",
- "day : tDAY ','",
- "day : tUNUMBER tDAY",
- "date : tUNUMBER '/' tUNUMBER",
- "date : tUNUMBER '/' tUNUMBER '/' tUNUMBER",
- "date : tUNUMBER tSNUMBER tSNUMBER",
- "date : tUNUMBER tMONTH tSNUMBER",
- "date : tMONTH tUNUMBER",
- "date : tMONTH tUNUMBER ',' tUNUMBER",
- "date : tUNUMBER tMONTH",
- "date : tUNUMBER tMONTH tUNUMBER",
- "rel : relunit tAGO",
- "rel : relunit",
- "relunit : tUNUMBER tMINUTE_UNIT",
- "relunit : tSNUMBER tMINUTE_UNIT",
- "relunit : tMINUTE_UNIT",
- "relunit : tSNUMBER tSEC_UNIT",
- "relunit : tUNUMBER tSEC_UNIT",
- "relunit : tSEC_UNIT",
- "relunit : tSNUMBER tMONTH_UNIT",
- "relunit : tUNUMBER tMONTH_UNIT",
- "relunit : tMONTH_UNIT",
- "number : tUNUMBER",
- "o_merid : /* empty */",
- "o_merid : tMERIDIAN",
-};
-#endif /* YYDEBUG */
-/* @(#)yaccpar 1.10 89/04/04 SMI; from S5R3 1.10 */
-
-/*
-** Skeleton parser driver for yacc output
-*/
-
-/*
-** yacc user known macros and defines
-*/
-#define YYERROR goto yyerrlab
-#define YYACCEPT { free(yys); free(yyv); return(0); }
-#define YYABORT { free(yys); free(yyv); return(1); }
-#define YYBACKUP( newtoken, newvalue )\
-{\
- if ( yychar >= 0 || ( yyr2[ yytmp ] >> 1 ) != 1 )\
- {\
- yyerror( "syntax error - cannot backup" );\
- goto yyerrlab;\
- }\
- yychar = newtoken;\
- yystate = *yyps;\
- yylval = newvalue;\
- goto yynewstate;\
-}
-#define YYRECOVERING() (!!yyerrflag)
-#ifndef YYDEBUG
-# define YYDEBUG 1 /* make debugging available */
-#endif
-
-/*
-** user known globals
-*/
-int yydebug; /* set to 1 to get debugging */
-
-/*
-** driver internal defines
-*/
-#define YYFLAG (-1000)
-
-/*
-** static variables used by the parser
-*/
-static YYSTYPE *yyv; /* value stack */
-static int *yys; /* state stack */
-
-static YYSTYPE *yypv; /* top of value stack */
-static int *yyps; /* top of state stack */
-
-static int yystate; /* current state */
-static int yytmp; /* extra var (lasts between blocks) */
-
-int yynerrs; /* number of errors */
-
-int yyerrflag; /* error recovery flag */
-int yychar; /* current input token number */
-
-
-/*
-** yyparse - return 0 if worked, 1 if syntax error not recovered from
-*/
-int
-yyparse()
-{
- register YYSTYPE *yypvt; /* top of value stack for $vars */
- unsigned yymaxdepth = YYMAXDEPTH;
-
- /*
- ** Initialize externals - yyparse may be called more than once
- */
- yyv = (YYSTYPE*)malloc(yymaxdepth*sizeof(YYSTYPE));
- yys = (int*)malloc(yymaxdepth*sizeof(int));
- if (!yyv || !yys)
- {
- yyerror( "out of memory" );
- return(1);
- }
- yypv = &yyv[-1];
- yyps = &yys[-1];
- yystate = 0;
- yytmp = 0;
- yynerrs = 0;
- yyerrflag = 0;
- yychar = -1;
-
- goto yystack;
- {
- register YYSTYPE *yy_pv; /* top of value stack */
- register int *yy_ps; /* top of state stack */
- register int yy_state; /* current state */
- register int yy_n; /* internal state number info */
-
- /*
- ** get globals into registers.
- ** branch to here only if YYBACKUP was called.
- */
- yynewstate:
- yy_pv = yypv;
- yy_ps = yyps;
- yy_state = yystate;
- goto yy_newstate;
-
- /*
- ** get globals into registers.
- ** either we just started, or we just finished a reduction
- */
- yystack:
- yy_pv = yypv;
- yy_ps = yyps;
- yy_state = yystate;
-
- /*
- ** top of for (;;) loop while no reductions done
- */
- yy_stack:
- /*
- ** put a state and value onto the stacks
- */
-#if YYDEBUG
- /*
- ** if debugging, look up token value in list of value vs.
- ** name pairs. 0 and negative (-1) are special values.
- ** Note: linear search is used since time is not a real
- ** consideration while debugging.
- */
- if ( yydebug )
- {
- register int yy_i;
-
- (void)printf( "State %d, token ", yy_state );
- if ( yychar == 0 )
- (void)printf( "end-of-file\n" );
- else if ( yychar < 0 )
- (void)printf( "-none-\n" );
- else
- {
- for ( yy_i = 0; yytoks[yy_i].t_val >= 0;
- yy_i++ )
- {
- if ( yytoks[yy_i].t_val == yychar )
- break;
- }
- (void)printf( "%s\n", yytoks[yy_i].t_name );
- }
- }
-#endif /* YYDEBUG */
- if ( ++yy_ps >= &yys[ yymaxdepth ] ) /* room on stack? */
- {
- /*
- ** reallocate and recover. Note that pointers
- ** have to be reset, or bad things will happen
- */
- int yyps_index = (yy_ps - yys);
- int yypv_index = (yy_pv - yyv);
- int yypvt_index = (yypvt - yyv);
- yymaxdepth += YYMAXDEPTH;
- yyv = (YYSTYPE*)realloc((char*)yyv,
- yymaxdepth * sizeof(YYSTYPE));
- yys = (int*)realloc((char*)yys,
- yymaxdepth * sizeof(int));
- if (!yyv || !yys)
- {
- yyerror( "yacc stack overflow" );
- return(1);
- }
- yy_ps = yys + yyps_index;
- yy_pv = yyv + yypv_index;
- yypvt = yyv + yypvt_index;
- }
- *yy_ps = yy_state;
- *++yy_pv = yyval;
-
- /*
- ** we have a new state - find out what to do
- */
- yy_newstate:
- if ( ( yy_n = yypact[ yy_state ] ) <= YYFLAG )
- goto yydefault; /* simple state */
-#if YYDEBUG
- /*
- ** if debugging, need to mark whether new token grabbed
- */
- yytmp = yychar < 0;
-#endif
- if ( ( yychar < 0 ) && ( ( yychar = yylex() ) < 0 ) )
- yychar = 0; /* reached EOF */
-#if YYDEBUG
- if ( yydebug && yytmp )
- {
- register int yy_i;
-
- (void)printf( "Received token " );
- if ( yychar == 0 )
- (void)printf( "end-of-file\n" );
- else if ( yychar < 0 )
- (void)printf( "-none-\n" );
- else
- {
- for ( yy_i = 0; yytoks[yy_i].t_val >= 0;
- yy_i++ )
- {
- if ( yytoks[yy_i].t_val == yychar )
- break;
- }
- (void)printf( "%s\n", yytoks[yy_i].t_name );
- }
- }
-#endif /* YYDEBUG */
- if ( ( ( yy_n += yychar ) < 0 ) || ( yy_n >= YYLAST ) )
- goto yydefault;
- if ( yychk[ yy_n = yyact[ yy_n ] ] == yychar ) /*valid shift*/
- {
- yychar = -1;
- yyval = yylval;
- yy_state = yy_n;
- if ( yyerrflag > 0 )
- yyerrflag--;
- goto yy_stack;
- }
-
- yydefault:
- if ( ( yy_n = yydef[ yy_state ] ) == -2 )
- {
-#if YYDEBUG
- yytmp = yychar < 0;
-#endif
- if ( ( yychar < 0 ) && ( ( yychar = yylex() ) < 0 ) )
- yychar = 0; /* reached EOF */
-#if YYDEBUG
- if ( yydebug && yytmp )
- {
- register int yy_i;
-
- (void)printf( "Received token " );
- if ( yychar == 0 )
- (void)printf( "end-of-file\n" );
- else if ( yychar < 0 )
- (void)printf( "-none-\n" );
- else
- {
- for ( yy_i = 0;
- yytoks[yy_i].t_val >= 0;
- yy_i++ )
- {
- if ( yytoks[yy_i].t_val
- == yychar )
- {
- break;
- }
- }
- (void)printf( "%s\n", yytoks[yy_i].t_name );
- }
- }
-#endif /* YYDEBUG */
- /*
- ** look through exception table
- */
- {
- register int *yyxi = yyexca;
-
- while ( ( *yyxi != -1 ) ||
- ( yyxi[1] != yy_state ) )
- {
- yyxi += 2;
- }
- while ( ( *(yyxi += 2) >= 0 ) &&
- ( *yyxi != yychar ) )
- ;
- if ( ( yy_n = yyxi[1] ) < 0 )
- YYACCEPT;
- }
- }
-
- /*
- ** check for syntax error
- */
- if ( yy_n == 0 ) /* have an error */
- {
- /* no worry about speed here! */
- switch ( yyerrflag )
- {
- case 0: /* new error */
- yyerror( "syntax error" );
- goto skip_init;
- yyerrlab:
- /*
- ** get globals into registers.
- ** we have a user generated syntax type error
- */
- yy_pv = yypv;
- yy_ps = yyps;
- yy_state = yystate;
- yynerrs++;
- skip_init:
- case 1:
- case 2: /* incompletely recovered error */
- /* try again... */
- yyerrflag = 3;
- /*
- ** find state where "error" is a legal
- ** shift action
- */
- while ( yy_ps >= yys )
- {
- yy_n = yypact[ *yy_ps ] + YYERRCODE;
- if ( yy_n >= 0 && yy_n < YYLAST &&
- yychk[yyact[yy_n]] == YYERRCODE) {
- /*
- ** simulate shift of "error"
- */
- yy_state = yyact[ yy_n ];
- goto yy_stack;
- }
- /*
- ** current state has no shift on
- ** "error", pop stack
- */
-#if YYDEBUG
-# define _POP_ "Error recovery pops state %d, uncovers state %d\n"
- if ( yydebug )
- (void)printf( _POP_, *yy_ps,
- yy_ps[-1] );
-# undef _POP_
-#endif
- yy_ps--;
- yy_pv--;
- }
- /*
- ** there is no state on stack with "error" as
- ** a valid shift. give up.
- */
- YYABORT;
- case 3: /* no shift yet; eat a token */
-#if YYDEBUG
- /*
- ** if debugging, look up token in list of
- ** pairs. 0 and negative shouldn't occur,
- ** but since timing doesn't matter when
- ** debugging, it doesn't hurt to leave the
- ** tests here.
- */
- if ( yydebug )
- {
- register int yy_i;
-
- (void)printf( "Error recovery discards " );
- if ( yychar == 0 )
- (void)printf( "token end-of-file\n" );
- else if ( yychar < 0 )
- (void)printf( "token -none-\n" );
- else
- {
- for ( yy_i = 0;
- yytoks[yy_i].t_val >= 0;
- yy_i++ )
- {
- if ( yytoks[yy_i].t_val
- == yychar )
- {
- break;
- }
- }
- (void)printf( "token %s\n",
- yytoks[yy_i].t_name );
- }
- }
-#endif /* YYDEBUG */
- if ( yychar == 0 ) /* reached EOF. quit */
- YYABORT;
- yychar = -1;
- goto yy_newstate;
- }
- }/* end if ( yy_n == 0 ) */
- /*
- ** reduction by production yy_n
- ** put stack tops, etc. so things right after switch
- */
-#if YYDEBUG
- /*
- ** if debugging, print the string that is the user's
- ** specification of the reduction which is just about
- ** to be done.
- */
- if ( yydebug )
- (void)printf( "Reduce by (%d) \"%s\"\n",
- yy_n, yyreds[ yy_n ] );
-#endif
- yytmp = yy_n; /* value to switch over */
- yypvt = yy_pv; /* $vars top of value stack */
- /*
- ** Look in goto table for next state
- ** Sorry about using yy_state here as temporary
- ** register variable, but why not, if it works...
- ** If yyr2[ yy_n ] doesn't have the low order bit
- ** set, then there is no action to be done for
- ** this reduction. So, no saving & unsaving of
- ** registers done. The only difference between the
- ** code just after the if and the body of the if is
- ** the goto yy_stack in the body. This way the test
- ** can be made before the choice of what to do is needed.
- */
- {
- /* length of production doubled with extra bit */
- register int yy_len = yyr2[ yy_n ];
-
- if ( !( yy_len & 01 ) )
- {
- yy_len >>= 1;
- yyval = ( yy_pv -= yy_len )[1]; /* $$ = $1 */
- yy_state = yypgo[ yy_n = yyr1[ yy_n ] ] +
- *( yy_ps -= yy_len ) + 1;
- if ( yy_state >= YYLAST ||
- yychk[ yy_state =
- yyact[ yy_state ] ] != -yy_n )
- {
- yy_state = yyact[ yypgo[ yy_n ] ];
- }
- goto yy_stack;
- }
- yy_len >>= 1;
- yyval = ( yy_pv -= yy_len )[1]; /* $$ = $1 */
- yy_state = yypgo[ yy_n = yyr1[ yy_n ] ] +
- *( yy_ps -= yy_len ) + 1;
- if ( yy_state >= YYLAST ||
- yychk[ yy_state = yyact[ yy_state ] ] != -yy_n )
- {
- yy_state = yyact[ yypgo[ yy_n ] ];
- }
- }
- /* save until reenter driver code */
- yystate = yy_state;
- yyps = yy_ps;
- yypv = yy_pv;
- }
- /*
- ** code supplied by user is placed in this switch
- */
- switch( yytmp )
- {
-
-case 3:
-{
- yyHaveTime++;
- } break;
-case 4:
-{
- yyHaveZone++;
- } break;
-case 5:
-{
- yyHaveDate++;
- } break;
-case 6:
-{
- yyHaveDay++;
- } break;
-case 7:
-{
- yyHaveRel++;
- } break;
-case 9:
-{
- yyHour = yypvt[-1].Number;
- yyMinutes = 0;
- yySeconds = 0;
- yyMeridian = yypvt[-0].Meridian;
- } break;
-case 10:
-{
- yyHour = yypvt[-3].Number;
- yyMinutes = yypvt[-1].Number;
- yySeconds = 0;
- yyMeridian = yypvt[-0].Meridian;
- } break;
-case 11:
-{
- yyHour = yypvt[-3].Number;
- yyMinutes = yypvt[-1].Number;
- yyMeridian = MER24;
- yyDSTmode = DSToff;
- yyTimezone = - (yypvt[-0].Number % 100 + (yypvt[-0].Number / 100) * 60);
- } break;
-case 12:
-{
- yyHour = yypvt[-5].Number;
- yyMinutes = yypvt[-3].Number;
- yySeconds = yypvt[-1].Number;
- yyMeridian = yypvt[-0].Meridian;
- } break;
-case 13:
-{
- yyHour = yypvt[-5].Number;
- yyMinutes = yypvt[-3].Number;
- yySeconds = yypvt[-1].Number;
- yyMeridian = MER24;
- yyDSTmode = DSToff;
- yyTimezone = - (yypvt[-0].Number % 100 + (yypvt[-0].Number / 100) * 60);
- } break;
-case 14:
-{
- yyTimezone = yypvt[-0].Number;
- yyDSTmode = DSToff;
- } break;
-case 15:
-{
- yyTimezone = yypvt[-0].Number;
- yyDSTmode = DSTon;
- } break;
-case 16:
-{
- yyTimezone = yypvt[-1].Number;
- yyDSTmode = DSTon;
- } break;
-case 17:
-{
- yyDayOrdinal = 1;
- yyDayNumber = yypvt[-0].Number;
- } break;
-case 18:
-{
- yyDayOrdinal = 1;
- yyDayNumber = yypvt[-1].Number;
- } break;
-case 19:
-{
- yyDayOrdinal = yypvt[-1].Number;
- yyDayNumber = yypvt[-0].Number;
- } break;
-case 20:
-{
- yyMonth = yypvt[-2].Number;
- yyDay = yypvt[-0].Number;
- } break;
-case 21:
-{
- yyMonth = yypvt[-4].Number;
- yyDay = yypvt[-2].Number;
- yyYear = yypvt[-0].Number;
- } break;
-case 22:
-{
- /* ISO 8601 format. yyyy-mm-dd. */
- yyYear = yypvt[-2].Number;
- yyMonth = -yypvt[-1].Number;
- yyDay = -yypvt[-0].Number;
- } break;
-case 23:
-{
- /* e.g. 17-JUN-1992. */
- yyDay = yypvt[-2].Number;
- yyMonth = yypvt[-1].Number;
- yyYear = -yypvt[-0].Number;
- } break;
-case 24:
-{
- yyMonth = yypvt[-1].Number;
- yyDay = yypvt[-0].Number;
- } break;
-case 25:
-{
- yyMonth = yypvt[-3].Number;
- yyDay = yypvt[-2].Number;
- yyYear = yypvt[-0].Number;
- } break;
-case 26:
-{
- yyMonth = yypvt[-0].Number;
- yyDay = yypvt[-1].Number;
- } break;
-case 27:
-{
- yyMonth = yypvt[-1].Number;
- yyDay = yypvt[-2].Number;
- yyYear = yypvt[-0].Number;
- } break;
-case 28:
-{
- yyRelSeconds = -yyRelSeconds;
- yyRelMonth = -yyRelMonth;
- } break;
-case 30:
-{
- yyRelSeconds += yypvt[-1].Number * yypvt[-0].Number * 60L;
- } break;
-case 31:
-{
- yyRelSeconds += yypvt[-1].Number * yypvt[-0].Number * 60L;
- } break;
-case 32:
-{
- yyRelSeconds += yypvt[-0].Number * 60L;
- } break;
-case 33:
-{
- yyRelSeconds += yypvt[-1].Number;
- } break;
-case 34:
-{
- yyRelSeconds += yypvt[-1].Number;
- } break;
-case 35:
-{
- yyRelSeconds++;
- } break;
-case 36:
-{
- yyRelMonth += yypvt[-1].Number * yypvt[-0].Number;
- } break;
-case 37:
-{
- yyRelMonth += yypvt[-1].Number * yypvt[-0].Number;
- } break;
-case 38:
-{
- yyRelMonth += yypvt[-0].Number;
- } break;
-case 39:
-{
- if (yyHaveTime && yyHaveDate && !yyHaveRel)
- yyYear = yypvt[-0].Number;
- else {
- if(yypvt[-0].Number>10000) {
- yyHaveDate++;
- yyDay= (yypvt[-0].Number)%100;
- yyMonth= (yypvt[-0].Number/100)%100;
- yyYear = yypvt[-0].Number/10000;
- }
- else {
- yyHaveTime++;
- if (yypvt[-0].Number < 100) {
- yyHour = yypvt[-0].Number;
- yyMinutes = 0;
- }
- else {
- yyHour = yypvt[-0].Number / 100;
- yyMinutes = yypvt[-0].Number % 100;
- }
- yySeconds = 0;
- yyMeridian = MER24;
- }
- }
- } break;
-case 40:
-{
- yyval.Meridian = MER24;
- } break;
-case 41:
-{
- yyval.Meridian = yypvt[-0].Meridian;
- } break;
- }
- goto yystack; /* reset registers in driver code */
-}
diff --git a/gnu/usr.bin/cvs/src/Makefile.in b/gnu/usr.bin/cvs/src/Makefile.in
index af0c72d2f80..5f8e1cb19e6 100644
--- a/gnu/usr.bin/cvs/src/Makefile.in
+++ b/gnu/usr.bin/cvs/src/Makefile.in
@@ -100,14 +100,10 @@ installdirs:
.PHONY: install installdirs
installcheck:
- RCSBIN=$(bindir) ; export RCSBIN ; $(SHELL) $(srcdir)/sanity.sh $(bindir)/cvs
+ $(SHELL) $(srcdir)/sanity.sh $(bindir)/cvs
.PHONY: installcheck
check: all
- if [ -x ../../rcs/src/rcs ] ; then \
- RCSBIN=`pwd`/../../rcs/src ; \
- export RCSBIN ; \
- fi ; \
$(SHELL) $(srcdir)/sanity.sh `pwd`/cvs
.PHONY: check
diff --git a/gnu/usr.bin/cvs/src/checkout.c b/gnu/usr.bin/cvs/src/checkout.c
index c6a81221d9d..a7d942f5d35 100644
--- a/gnu/usr.bin/cvs/src/checkout.c
+++ b/gnu/usr.bin/cvs/src/checkout.c
@@ -238,7 +238,7 @@ checkout (argc, argv)
if (!tag && !date)
error (1, 0, "must specify a tag or date");
- if (tag && isdigit (tag[0]))
+ if (tag && isdigit ((unsigned char) tag[0]))
error (1, 0, "tag `%s' must be a symbolic tag", tag);
}
diff --git a/gnu/usr.bin/cvs/src/commit.c b/gnu/usr.bin/cvs/src/commit.c
index 75d2e5ae7b6..61e25de9e2e 100644
--- a/gnu/usr.bin/cvs/src/commit.c
+++ b/gnu/usr.bin/cvs/src/commit.c
@@ -49,7 +49,6 @@ static int precommit_list_proc PROTO((Node * p, void *closure));
static int precommit_proc PROTO((char *repository, char *filter));
static int remove_file PROTO ((struct file_info *finfo, char *tag,
char *message));
-static void fix_rcs_modes PROTO((char *rcs, char *user));
static void fixaddfile PROTO((char *file, char *repository));
static void fixbranch PROTO((RCSNode *, char *branch));
static void unlockrcs PROTO((RCSNode *rcs));
@@ -340,7 +339,12 @@ commit (argc, argv)
/* FIXME: Shouldn't this check be much more closely related to the
readonly user stuff (CVSROOT/readers, &c). That is, why should
root be able to "cvs init", "cvs import", &c, but not "cvs ci"? */
- if (geteuid () == (uid_t) 0)
+ if (geteuid () == (uid_t) 0
+# ifdef CLIENT_SUPPORT
+ /* Who we are on the client side doesn't affect logging. */
+ && !client_active
+# endif
+ )
{
struct passwd *pw;
@@ -406,7 +410,7 @@ commit (argc, argv)
argv += optind;
/* numeric specified revision means we ignore sticky tags... */
- if (saved_tag && isdigit (*saved_tag))
+ if (saved_tag && isdigit ((unsigned char) *saved_tag))
{
aflag = 1;
/* strip trailing dots */
@@ -561,13 +565,6 @@ commit (argc, argv)
send_arg("-n");
option_with_arg ("-r", saved_tag);
- /* Sending only the names of the files which were modified, added,
- or removed means that the server will only do an up-to-date
- check on those files. This is different from local CVS and
- previous versions of client/server CVS, but it probably is a Good
- Thing, or at least Not Such A Bad Thing. */
- send_file_names (find_args.argc, find_args.argv, 0);
-
/* FIXME: This whole find_args.force/SEND_FORCE business is a
kludge. It would seem to be a server bug that we have to
say that files are modified when they are not. This makes
@@ -580,6 +577,13 @@ commit (argc, argv)
send_files (find_args.argc, find_args.argv, local, 0,
find_args.force ? SEND_FORCE : 0);
+ /* Sending only the names of the files which were modified, added,
+ or removed means that the server will only do an up-to-date
+ check on those files. This is different from local CVS and
+ previous versions of client/server CVS, but it probably is a Good
+ Thing, or at least Not Such A Bad Thing. */
+ send_file_names (find_args.argc, find_args.argv, 0);
+
send_to_server ("ci\012", 0);
err = get_responses_and_close ();
if (err != 0 && use_editor && saved_message != NULL)
@@ -703,7 +707,7 @@ classify_file_internal (finfo, vers)
noexec = quiet = really_quiet = 1;
/* handle specified numeric revision specially */
- if (saved_tag && isdigit (*saved_tag))
+ if (saved_tag && isdigit ((unsigned char) *saved_tag))
{
/* If the tag is for the trunk, make sure we're at the head */
if (numdots (saved_tag) < 2)
@@ -787,6 +791,19 @@ check_fileproc (callerdat, finfo)
struct commit_info *ci;
struct logfile_info *li;
+ size_t cvsroot_len = strlen (CVSroot_directory);
+
+ if (strncmp (finfo->repository, CVSroot_directory, cvsroot_len) == 0
+ && ISDIRSEP (finfo->repository[cvsroot_len])
+ && strncmp (finfo->repository + cvsroot_len + 1,
+ CVSROOTADM,
+ sizeof (CVSROOTADM) - 1) == 0
+ && ISDIRSEP (finfo->repository[cvsroot_len + sizeof (CVSROOTADM)])
+ && strcmp (finfo->repository + cvsroot_len + sizeof (CVSROOTADM) + 1,
+ CVSNULLREPOS) == 0
+ )
+ error (1, 0, "cannot check in to %s", finfo->repository);
+
status = classify_file_internal (finfo, &vers);
/*
@@ -825,7 +842,7 @@ check_fileproc (callerdat, finfo)
* allow the commit if timestamp is identical or if we find
* an RCS_MERGE_PAT in the file.
*/
- if (!saved_tag || !isdigit (*saved_tag))
+ if (!saved_tag || !isdigit ((unsigned char) *saved_tag))
{
if (vers->date)
{
@@ -897,7 +914,9 @@ warning: file `%s' seems to still contain conflict indicators",
}
}
- if (status == T_REMOVED && vers->tag && isdigit (*vers->tag))
+ if (status == T_REMOVED
+ && vers->tag
+ && isdigit ((unsigned char) *vers->tag))
{
/* Remove also tries to forbid this, but we should check
here. I'm only _sure_ about somewhat obscure cases
@@ -936,7 +955,7 @@ warning: file `%s' seems to still contain conflict indicators",
}
free (rcs);
}
- if (vers->tag && isdigit (*vers->tag) &&
+ if (vers->tag && isdigit ((unsigned char) *vers->tag) &&
numdots (vers->tag) > 1)
{
error (0, 0,
@@ -996,7 +1015,7 @@ warning: file `%s' seems to still contain conflict indicators",
ci = (struct commit_info *) xmalloc (sizeof (struct commit_info));
ci->status = status;
if (vers->tag)
- if (isdigit (*vers->tag))
+ if (isdigit ((unsigned char) *vers->tag))
ci->rev = xstrdup (vers->tag);
else
ci->rev = RCS_whatbranch (finfo->rcs, vers->tag);
@@ -1115,7 +1134,7 @@ precommit_proc (repository, filter)
s = xstrdup (filter);
for (cp = s; *cp; cp++)
- if (isspace (*cp))
+ if (isspace ((unsigned char) *cp))
{
*cp = '\0';
break;
@@ -1262,7 +1281,11 @@ commit_fileproc (callerdat, finfo)
Since the branch test was done in check_fileproc for
modified files, we need to stub it in again here. */
- if (ci->tag)
+ if (ci->tag
+
+ /* If numeric, it is on the trunk; check_fileproc enforced
+ this. */
+ && !isdigit ((unsigned char) ci->tag[0]))
{
if (finfo->rcs == NULL)
error (1, 0, "internal error: no parsed RCS file");
@@ -1596,16 +1619,16 @@ findmaxrev (p, closure)
* XXX - if removing a ,v file that is a relative symbolic link to
* another ,v file, we probably should add a ".." component to the
* link to keep it relative after we move it into the attic.
- */
+
+ Return value is 0 on success, or >0 on error (in which case we have
+ printed an error message). */
static int
remove_file (finfo, tag, message)
struct file_info *finfo;
char *tag;
char *message;
{
- mode_t omask;
int retcode;
- char *tmp;
int branch;
int lockflag;
@@ -1695,16 +1718,6 @@ remove_file (finfo, tag, message)
RCS_rewrite (finfo->rcs, NULL, NULL);
}
-#ifdef SERVER_SUPPORT
- if (server_active) {
- /* If this is the server, there will be a file sitting in the
- temp directory which is the kludgy way in which server.c
- tells time_stamp that the file is no longer around. Remove
- it so we can create temp files with that name (ignore errors). */
- unlink_file (finfo->file);
- }
-#endif
-
/* check something out. Generally this is the head. If we have a
particular rev, then name it. */
retcode = RCS_checkout (finfo->rcs, finfo->file, rev ? corev : NULL,
@@ -1741,34 +1754,9 @@ remove_file (finfo, tag, message)
if (rev != NULL)
free (rev);
- old_path = finfo->rcs->path;
+ old_path = xstrdup (finfo->rcs->path);
if (!branch)
- {
- /* this was the head; really move it into the Attic */
- tmp = xmalloc(strlen(finfo->repository) +
- sizeof('/') +
- sizeof(CVSATTIC) +
- sizeof('/') +
- strlen(finfo->file) +
- sizeof(RCSEXT) + 1);
- (void) sprintf (tmp, "%s/%s", finfo->repository, CVSATTIC);
- omask = umask (cvsumask);
- (void) CVS_MKDIR (tmp, 0777);
- (void) umask (omask);
- (void) sprintf (tmp, "%s/%s/%s%s", finfo->repository, CVSATTIC,
- finfo->file, RCSEXT);
-
- if (strcmp (finfo->rcs->path, tmp) != 0
- && CVS_RENAME (finfo->rcs->path, tmp) == -1
- && (isreadable (finfo->rcs->path) || !isreadable (tmp)))
- {
- free(tmp);
- return (1);
- }
- /* The old value of finfo->rcs->path is in old_path, and is
- freed below. */
- finfo->rcs->path = tmp;
- }
+ RCS_setattic (finfo->rcs, 1);
/* Print message that file was removed. */
cvs_output (old_path, 0);
@@ -1779,8 +1767,7 @@ remove_file (finfo, tag, message)
cvs_output ("\ndone\n", 0);
free(prev_rev);
- if (old_path != finfo->rcs->path)
- free (old_path);
+ free (old_path);
Scratch_Entry (finfo->entries, finfo->file);
return (0);
@@ -1806,7 +1793,9 @@ finaladd (finfo, rev, tag, options)
char *tmp = xmalloc (strlen (finfo->file) + sizeof (CVSADM)
+ sizeof (CVSEXT_LOG) + 10);
(void) sprintf (tmp, "%s/%s%s", CVSADM, finfo->file, CVSEXT_LOG);
- (void) unlink_file (tmp);
+ if (unlink_file (tmp) < 0
+ && !existence_error (errno))
+ error (0, errno, "cannot remove %s", tmp);
free (tmp);
}
else
@@ -1850,7 +1839,10 @@ fixaddfile (file, repository)
save_really_quiet = really_quiet;
really_quiet = 1;
if ((rcsfile = RCS_parsercsfile (rcs)) == NULL)
- (void) unlink_file (rcs);
+ {
+ if (unlink_file (rcs) < 0)
+ error (0, errno, "cannot remove %s", rcs);
+ }
else
freercsnode (&rcsfile);
really_quiet = save_really_quiet;
@@ -1897,8 +1889,20 @@ checkaddfile (file, repository, tag, options, rcsnode)
int newfile = 0;
RCSNode *rcsfile = NULL;
int retval;
+ int adding_on_branch;
+
+ /* Callers expect to be able to use either "" or NULL to mean the
+ default keyword expansion. */
+ if (options != NULL && options[0] == '\0')
+ options = NULL;
+ if (options != NULL)
+ assert (options[0] == '-' && options[1] == 'k');
- if (tag)
+ /* If numeric, it is on the trunk; check_fileproc enforced
+ this. */
+ adding_on_branch = tag != NULL && !isdigit ((unsigned char) tag[0]);
+
+ if (adding_on_branch)
{
rcs = xmalloc (strlen (repository) + strlen (file)
+ sizeof (RCSEXT) + sizeof (CVSATTIC) + 10);
@@ -1921,6 +1925,7 @@ checkaddfile (file, repository, tag, options, rcsnode)
{
/* file has existed in the past. Prepare to resurrect. */
char *rev;
+ char *oldexpand;
if ((rcsfile = *rcsnode) == NULL)
{
@@ -1929,41 +1934,38 @@ checkaddfile (file, repository, tag, options, rcsnode)
goto out;
}
- if (tag == NULL)
+ oldexpand = RCS_getexpand (rcsfile);
+ if ((oldexpand != NULL
+ && options != NULL
+ && strcmp (options + 2, oldexpand) != 0)
+ || (oldexpand == NULL && options != NULL))
{
- char *oldfile;
-
- /* we are adding on the trunk, so move the file out of the
- Attic. */
- oldfile = xstrdup (rcs);
- sprintf (rcs, "%s/%s%s", repository, file, RCSEXT);
+ /* We tell the user about this, because it means that the
+ old revisions will no longer retrieve the way that they
+ used to. */
+ error (0, 0, "changing keyword expansion mode to %s", options);
+ RCS_setexpand (rcsfile, options + 2);
+ }
- if (strcmp (oldfile, rcs) == 0)
+ if (!adding_on_branch)
+ {
+ /* We are adding on the trunk, so move the file out of the
+ Attic. */
+ if (!(rcsfile->flags & INATTIC))
{
error (0, 0, "internal error: confused about attic for %s",
- oldfile);
- out1:
- free (oldfile);
+ rcsfile->path);
retval = 1;
goto out;
}
- if (CVS_RENAME (oldfile, rcs) != 0)
- {
- error (0, errno, "failed to move `%s' out of the attic",
- oldfile);
- goto out1;
- }
- if (isreadable (oldfile)
- || !isreadable (rcs))
+
+ sprintf (rcs, "%s/%s%s", repository, file, RCSEXT);
+
+ if (RCS_setattic (rcsfile, 0))
{
- error (0, 0, "\
-internal error: `%s' didn't move out of the attic",
- oldfile);
- goto out1;
+ retval = 1;
+ goto out;
}
- free (oldfile);
- free (rcsfile->path);
- rcsfile->path = xstrdup (rcs);
}
rev = RCS_getversion (rcsfile, tag, NULL, 1, (int *) NULL);
@@ -2016,7 +2018,7 @@ internal error: `%s' didn't move out of the attic",
}
/* Set RCS keyword expansion options. */
- if (options && options[0] == '-' && options[1] == 'k')
+ if (options != NULL)
opt = options + 2;
else
opt = NULL;
@@ -2045,7 +2047,7 @@ internal error: `%s' didn't move out of the attic",
/* when adding a file for the first time, and using a tag, we need
to create a dead revision on the trunk. */
- if (tag && newfile)
+ if (adding_on_branch && newfile)
{
char *tmp;
FILE *fp;
@@ -2107,7 +2109,7 @@ internal error: `%s' didn't move out of the attic",
}
}
- if (tag != NULL)
+ if (adding_on_branch)
{
/* when adding with a tag, we need to stub a branch, if it
doesn't already exist. */
@@ -2171,13 +2173,22 @@ internal error: `%s' didn't move out of the attic",
fileattr_newfile (file);
- /* I don't think fix_rcs_modes is needed any more. In the
- add_rcs_file case, the algorithms used by add_rcs_file and
- fix_rcs_modes are the same, so there is no need to go through
- it all twice. In the other cases, I think we want to just
- preserve the mode that the file had before we started. That is
- a behavior change, but I would think a desirable one. */
- fix_rcs_modes (rcs, file);
+ /* At this point, we used to set the file mode of the RCS file
+ based on the mode of the file in the working directory. If we
+ are creating the RCS file for the first time, add_rcs_file does
+ this already. If we are re-adding the file, then perhaps it is
+ consistent to preserve the old file mode, just as we preserve
+ the old keyword expansion mode.
+
+ If we decide that we should change the modes, then we can't do
+ it here anyhow. At this point, the RCS file may be owned by
+ somebody else, so a chmod will fail. We need to instead do the
+ chmod after rewriting it.
+
+ FIXME: In general, I think the file mode (and the keyword
+ expansion mode) should be associated with a particular revision
+ of the file, so that it is possible to have different revisions
+ of a file have different modes. */
retval = 0;
@@ -2211,7 +2222,8 @@ lock_RCS (user, rcs, rev, repository)
* the head points to the trunk, not a branch... and as such, it's not
* necessary to move the head in this case.
*/
- if (rev == NULL || (rev && isdigit (*rev) && numdots (rev) < 2))
+ if (rev == NULL
+ || (rev && isdigit ((unsigned char) *rev) && numdots (rev) < 2))
{
branch = xstrdup (rcs->branch);
if (branch != NULL)
@@ -2268,69 +2280,6 @@ lock_RCS (user, rcs, rev, repository)
return (1);
}
-/* Called when "add"ing files to the RCS respository. It doesn't seem to
- be possible to get RCS to use the right mode, so we change it after
- the fact. TODO: now that RCS has been librarified, we have the power
- to change this. */
-
-static void
-fix_rcs_modes (rcs, user)
- char *rcs;
- char *user;
-{
- struct stat sb;
- mode_t rcs_mode;
-
-#ifdef PRESERVE_PERMISSIONS_SUPPORT
- /* Do ye nothing to the modes on a symbolic link. */
- if (preserve_perms && islink (user))
- return;
-#endif
-
- if (CVS_STAT (user, &sb) < 0)
- {
- /* FIXME: Should be ->fullname. */
- error (0, errno, "warning: cannot stat %s", user);
- return;
- }
-
- /* Now we compute the new mode.
-
- TODO: decide whether this whole thing can/should be skipped
- when `preserve_perms' is set. Almost certainly so. -twp
-
- The algorithm that we use is:
-
- Write permission is always off (this is what RCS and CVS have always
- done).
-
- If S_IRUSR is on (user read), then the read permission of
- the RCS file will be on. It would seem that if this is off,
- then other users can't do "cvs update" and such, so perhaps this
- should be hardcoded to being on (it is a strange case, though--the
- case in which a user file doesn't have user read permission on).
-
- If S_IXUSR is on (user execute), then set execute permission
- on the RCS file. This allows other users who check out the file
- to get the right setting for whether a shell script (for example)
- has the executable bit set.
-
- The result of that calculation is modified by CVSUMASK. The
- reason, of course, that the read and execute settings take the
- user bit and copy it to all three bits (user, group, other), is
- that it should be CVSUMASK, not the umask of individual users,
- which is the sole determiner of modes in the repository. */
-
- rcs_mode = 0;
- if (sb.st_mode & S_IRUSR)
- rcs_mode |= S_IRUSR | S_IRGRP | S_IROTH;
- if (sb.st_mode & S_IXUSR)
- rcs_mode |= S_IXUSR | S_IXGRP | S_IXOTH;
- rcs_mode &= ~cvsumask;
- if (chmod (rcs, rcs_mode) < 0)
- error (0, errno, "warning: cannot change mode of %s", rcs);
-}
-
/*
* free an UPDATE node's data
*/
diff --git a/gnu/usr.bin/cvs/src/cvs.h b/gnu/usr.bin/cvs/src/cvs.h
index c2d9efa0c8e..1c543ae0fd5 100644
--- a/gnu/usr.bin/cvs/src/cvs.h
+++ b/gnu/usr.bin/cvs/src/cvs.h
@@ -370,11 +370,16 @@ extern char *RCS_citag;
/* Access method specified in CVSroot. */
typedef enum {
local_method, server_method, pserver_method, kserver_method, gserver_method,
- ext_method
+ ext_method, fork_method
} CVSmethod;
extern char *method_names[]; /* change this in root.c if you change
the enum above */
+/* This global variable holds the global -d option. It is NULL if -d
+ was not used, which means that we must get the CVSroot information
+ from the CVSROOT environment variable or from a CVS/Root file. */
+extern char *CVSroot_cmdline;
+
extern char *CVSroot_original; /* the active, complete CVSroot string */
extern int client_active; /* nonzero if we are doing remote access */
extern CVSmethod CVSroot_method; /* one of the enum values above */
@@ -382,6 +387,11 @@ extern char *CVSroot_username; /* the username or NULL if method == local */
extern char *CVSroot_hostname; /* the hostname or NULL if method == local */
extern char *CVSroot_directory; /* the directory name */
+/* These variables keep track of all of the CVSROOT directories that
+ have been seen by the client and the current one of those selected. */
+extern List *root_directories;
+extern char *current_root;
+
extern char *emptydir_name PROTO ((void));
extern int trace; /* Show all commands */
@@ -391,11 +401,11 @@ extern int logoff; /* Don't write history entry */
extern int top_level_admin;
-#ifdef AUTH_SERVER_SUPPORT
-extern char *Pserver_Repos; /* used to check that same repos is
- transmitted in pserver auth and in
- CVS protocol. */
-#endif /* AUTH_SERVER_SUPPORT */
+#ifdef CLIENT_SUPPORT
+extern List *dirs_sent_to_server; /* used to decide which "Argument
+ xxx" commands to send to each
+ server in multiroot mode. */
+#endif
extern char hostname[];
@@ -436,6 +446,7 @@ void Subdir_Deregister PROTO((List *, const char *, const char *));
char *Make_Date PROTO((char *rawdate));
char *date_from_time_t PROTO ((time_t));
+void date_to_internet PROTO ((char *, char *));
char *Name_Repository PROTO((char *dir, char *update_dir));
char *Short_Repository PROTO((char *repository));
@@ -506,6 +517,9 @@ void lock_tree_for_write PROTO ((int argc, char **argv, int local, int aflag));
/* See lock.c for description. */
extern void lock_dir_for_write PROTO ((char *));
+
+/* LockDir setting from CVSROOT/config. */
+extern char *lock_dir;
void Scratch_Entry PROTO((List * list, char *fname));
void ParseTag PROTO((char **tagp, char **datep, int *nonbranchp));
@@ -632,6 +646,7 @@ char *make_message_rcslegal PROTO((char *message));
extern int file_has_markers PROTO ((const struct file_info *));
extern void get_file PROTO ((const char *, const char *, const char *,
char **, size_t *, size_t *));
+extern void resolve_symlink PROTO ((char **filename));
/* flags for run_exec(), the fast system() for CVS */
#define RUN_NORMAL 0x0000 /* no special behaviour */
@@ -652,7 +667,6 @@ int run_exec PROTO((const char *stin, const char *stout, const char *sterr,
FILE *run_popen PROTO((const char *, const char *));
int piped_child PROTO((char **, int *, int *));
void close_on_exec PROTO((int));
-int filter_stream_through_program PROTO((int, int, char **, pid_t *));
pid_t waitpid PROTO((pid_t, int *, int));
diff --git a/gnu/usr.bin/cvs/src/ignore.c b/gnu/usr.bin/cvs/src/ignore.c
index 2f842cd84a3..c2147cb1cad 100644
--- a/gnu/usr.bin/cvs/src/ignore.c
+++ b/gnu/usr.bin/cvs/src/ignore.c
@@ -82,6 +82,11 @@ ign_setup ()
/* Then add entries found in home dir, (if user has one) and file exists */
home_dir = get_homedir ();
+ /* If we can't find a home directory, ignore ~/.cvsignore. This may
+ make tracking down problems a bit of a pain, but on the other
+ hand it might be obnoxious to complain when CVS will function
+ just fine without .cvsignore (and many users won't even know what
+ .cvsignore is). */
if (home_dir)
{
char *file = xmalloc (strlen (home_dir) + sizeof (CVSDOTIGNORE) + 10);
@@ -176,7 +181,7 @@ ign_add (ign, hold)
char save;
/* ignore whitespace before the token */
- if (isspace (*ign))
+ if (isspace ((unsigned char) *ign))
continue;
/*
@@ -184,7 +189,8 @@ ign_add (ign, hold)
* (saving it if necessary). We also catch * as a special case in a
* global ignore file as an optimization
*/
- if ((!*(ign+1) || isspace (*(ign+1))) && (*ign == '!' || *ign == '*'))
+ if ((!*(ign+1) || isspace ((unsigned char) *(ign+1)))
+ && (*ign == '!' || *ign == '*'))
{
if (!hold)
{
@@ -233,7 +239,7 @@ ign_add (ign, hold)
}
/* find the end of this token */
- for (mark = ign; *mark && !isspace (*mark); mark++)
+ for (mark = ign; *mark && !isspace ((unsigned char) *mark); mark++)
/* do nothing */ ;
save = *mark;
@@ -395,11 +401,15 @@ ignore_files (ilist, entries, update_dir, proc)
dirp = CVS_OPENDIR (".");
if (dirp == NULL)
+ {
+ error (0, errno, "cannot open current directory");
return;
+ }
ign_add_file (CVSDOTIGNORE, 1);
wrap_add_file (CVSDOTWRAPPER, 1);
+ errno = 0;
while ((dp = readdir (dirp)) != NULL)
{
file = dp->d_name;
@@ -476,6 +486,9 @@ ignore_files (ilist, entries, update_dir, proc)
}
(*proc) (file, xdir);
+ errno = 0;
}
+ if (errno != 0)
+ error (0, errno, "error reading current directory");
(void) closedir (dirp);
}
diff --git a/gnu/usr.bin/cvs/src/lock.c b/gnu/usr.bin/cvs/src/lock.c
index e6a6be359c6..f962d183551 100644
--- a/gnu/usr.bin/cvs/src/lock.c
+++ b/gnu/usr.bin/cvs/src/lock.c
@@ -73,6 +73,7 @@
unneeded complication although it presumably would be faster). */
#include "cvs.h"
+#include <assert.h>
struct lock {
/* This is the directory in which we may have a lock named by the
@@ -134,12 +135,161 @@ static List *lock_tree_list;
static char *locked_dir;
static List *locked_list;
+/* LockDir from CVSROOT/config. */
+char *lock_dir;
+
+static char *lock_name PROTO ((char *repository, char *name));
+
+/* Return a newly malloc'd string containing the name of the lock for the
+ repository REPOSITORY and the lock file name within that directory
+ NAME. Also create the directories in which to put the lock file
+ if needed (if we need to, could save system call(s) by doing
+ that only if the actual operation fails. But for now we'll keep
+ things simple). */
+static char *
+lock_name (repository, name)
+ char *repository;
+ char *name;
+{
+ char *retval;
+ char *p;
+ char *q;
+ char *short_repos;
+ mode_t save_umask;
+ int saved_umask = 0;
+
+ if (lock_dir == NULL)
+ {
+ /* This is the easy case. Because the lock files go directly
+ in the repository, no need to create directories or anything. */
+ retval = xmalloc (strlen (repository) + strlen (name) + 10);
+ (void) sprintf (retval, "%s/%s", repository, name);
+ }
+ else
+ {
+ struct stat sb;
+ mode_t new_mode = 0;
+
+ /* The interesting part of the repository is the part relative
+ to CVSROOT. */
+ assert (CVSroot_directory != NULL);
+ assert (strncmp (repository, CVSroot_directory,
+ strlen (CVSroot_directory)) == 0);
+ short_repos = repository + strlen (CVSroot_directory);
+ assert (*short_repos++ == '/');
+
+ retval = xmalloc (strlen (lock_dir)
+ + strlen (short_repos)
+ + strlen (name)
+ + 10);
+ strcpy (retval, lock_dir);
+ q = retval + strlen (retval);
+ *q++ = '/';
+
+ strcpy (q, short_repos);
+
+ /* In the common case, where the directory already exists, let's
+ keep it to one system call. */
+ if (CVS_STAT (retval, &sb) < 0)
+ {
+ /* If we need to be creating more than one directory, we'll
+ get the existence_error here. */
+ if (!existence_error (errno))
+ error (1, errno, "cannot stat directory %s", retval);
+ }
+ else
+ {
+ if (S_ISDIR (sb.st_mode))
+ goto created;
+ else
+ error (1, 0, "%s is not a directory", retval);
+ }
+
+ /* Now add the directories one at a time, so we can create
+ them if needed.
+
+ The idea behind the new_mode stuff is that the directory we
+ end up creating will inherit permissions from its parent
+ directory (we re-set new_mode with each EEXIST). CVSUMASK
+ isn't right, because typically the reason for LockDir is to
+ use a different set of permissions. We probably want to
+ inherit group ownership also (but we don't try to deal with
+ that, some systems do it for us either always or when g+s is on).
+
+ We don't try to do anything about the permissions on the lock
+ files themselves. The permissions don't really matter so much
+ because the locks will generally be removed by the process
+ which created them. */
+
+ if (CVS_STAT (lock_dir, &sb) < 0)
+ error (1, errno, "cannot stat %s", lock_dir);
+ new_mode = sb.st_mode;
+ save_umask = umask (0000);
+ saved_umask = 1;
+
+ p = short_repos;
+ while (1)
+ {
+ while (!ISDIRSEP (*p) && *p != '\0')
+ ++p;
+ if (ISDIRSEP (*p))
+ {
+ strncpy (q, short_repos, p - short_repos);
+ q[p - short_repos] = '\0';
+ if (!ISDIRSEP (q[p - short_repos - 1])
+ && CVS_MKDIR (retval, new_mode) < 0)
+ {
+ int saved_errno = errno;
+ if (saved_errno != EEXIST)
+ error (1, errno, "cannot make directory %s", retval);
+ else
+ {
+ if (CVS_STAT (retval, &sb) < 0)
+ error (1, errno, "cannot stat %s", retval);
+ new_mode = sb.st_mode;
+ }
+ }
+ ++p;
+ }
+ else
+ {
+ strcpy (q, short_repos);
+ if (CVS_MKDIR (retval, new_mode) < 0
+ && errno != EEXIST)
+ error (1, errno, "cannot make directory %s", retval);
+ goto created;
+ }
+ }
+ created:;
+
+ strcat (retval, "/");
+ strcat (retval, name);
+
+ if (saved_umask)
+ {
+ assert (umask (save_umask) == 0000);
+ saved_umask = 0;
+ }
+ }
+ return retval;
+}
+
/*
* Clean up all outstanding locks
*/
void
Lock_Cleanup ()
{
+ /* FIXME: error handling here is kind of bogus; we sometimes will call
+ error, which in turn can call us again. For the moment work around
+ this by refusing to reenter this function (this is a kludge). */
+ /* FIXME-reentrancy: the workaround isn't reentrant. */
+ static int in_lock_cleanup = 0;
+
+ if (in_lock_cleanup)
+ return;
+ in_lock_cleanup = 1;
+
remove_locks ();
dellist (&lock_tree_list);
@@ -151,6 +301,7 @@ Lock_Cleanup ()
locked_dir = NULL;
locked_list = NULL;
}
+ in_lock_cleanup = 0;
}
/*
@@ -199,8 +350,7 @@ lock_simple_remove (lock)
existence_error here. */
if (readlock != NULL)
{
- tmp = xmalloc (strlen (lock->repository) + strlen (readlock) + 10);
- (void) sprintf (tmp, "%s/%s", lock->repository, readlock);
+ tmp = lock_name (lock->repository, readlock);
if ( CVS_UNLINK (tmp) < 0 && ! existence_error (errno))
error (0, errno, "failed to remove lock %s", tmp);
free (tmp);
@@ -212,8 +362,7 @@ lock_simple_remove (lock)
existence_error here. */
if (writelock != NULL)
{
- tmp = xmalloc (strlen (lock->repository) + strlen (writelock) + 10);
- (void) sprintf (tmp, "%s/%s", lock->repository, writelock);
+ tmp = lock_name (lock->repository, writelock);
if ( CVS_UNLINK (tmp) < 0 && ! existence_error (errno))
error (0, errno, "failed to remove lock %s", tmp);
free (tmp);
@@ -221,8 +370,7 @@ lock_simple_remove (lock)
if (lock->have_lckdir)
{
- tmp = xmalloc (strlen (lock->repository) + sizeof (CVSLCK) + 10);
- (void) sprintf (tmp, "%s/%s", lock->repository, CVSLCK);
+ tmp = lock_name (lock->repository, CVSLCK);
SIG_beginCrSect ();
if (CVS_RMDIR (tmp) < 0)
error (0, errno, "failed to remove lock dir %s", tmp);
@@ -283,8 +431,7 @@ Reader_Lock (xrepository)
}
/* write a read-lock */
- tmp = xmalloc (strlen (xrepository) + strlen (readlock) + 10);
- (void) sprintf (tmp, "%s/%s", xrepository, readlock);
+ tmp = lock_name (xrepository, readlock);
if ((fp = CVS_FOPEN (tmp, "w+")) == NULL || fclose (fp) == EOF)
{
error (0, errno, "cannot create read lock in repository `%s'",
@@ -432,8 +579,7 @@ write_lock (lock)
}
/* write the write-lock file */
- tmp = xmalloc (strlen (lock->repository) + strlen (writelock) + 10);
- (void) sprintf (tmp, "%s/%s", lock->repository, writelock);
+ tmp = lock_name (lock->repository, writelock);
if ((fp = CVS_FOPEN (tmp, "w+")) == NULL || fclose (fp) == EOF)
{
int xerrno = errno;
@@ -577,8 +723,7 @@ set_lock (lock, will_wait)
if (masterlock != NULL)
free (masterlock);
- masterlock = xmalloc (strlen (lock->repository) + sizeof (CVSLCK) + 10);
- (void) sprintf (masterlock, "%s/%s", lock->repository, CVSLCK);
+ masterlock = lock_name (lock->repository, CVSLCK);
/*
* Note that it is up to the callers of set_lock() to arrange for signal
@@ -675,13 +820,17 @@ lock_wait (repos)
char *repos;
{
time_t now;
+ char *msg;
(void) time (&now);
- error (0, 0, "[%8.8s] waiting for %s's lock in %s", ctime (&now) + 11,
- lockers_name, repos);
+ msg = xmalloc (100 + strlen (lockers_name) + strlen (repos));
+ sprintf (msg, "[%8.8s] waiting for %s's lock in %s", ctime (&now) + 11,
+ lockers_name, repos);
+ error (0, 0, "%s", msg);
/* Call cvs_flusherr to ensure that the user sees this message as
soon as possible. */
cvs_flusherr ();
+ free (msg);
(void) sleep (CVSLCKSLEEP);
}
@@ -693,12 +842,16 @@ lock_obtained (repos)
char *repos;
{
time_t now;
+ char *msg;
(void) time (&now);
- error (0, 0, "[%8.8s] obtained lock in %s", ctime (&now) + 11, repos);
+ msg = xmalloc (100 + strlen (repos));
+ sprintf (msg, "[%8.8s] obtained lock in %s", ctime (&now) + 11, repos);
+ error (0, 0, "%s", msg);
/* Call cvs_flusherr to ensure that the user sees this message as
soon as possible. */
cvs_flusherr ();
+ free (msg);
}
static int lock_filesdoneproc PROTO ((void *callerdat, int err,
diff --git a/gnu/usr.bin/cvs/src/main.c b/gnu/usr.bin/cvs/src/main.c
index eca5f4fae4f..beed6e4e4a2 100644
--- a/gnu/usr.bin/cvs/src/main.c
+++ b/gnu/usr.bin/cvs/src/main.c
@@ -12,6 +12,7 @@
*
*/
+#include <assert.h>
#include "cvs.h"
#ifdef HAVE_WINSOCK_H
@@ -59,6 +60,16 @@ char *CurDir;
char *Tmpdir = TMPDIR_DFLT;
char *Editor = EDITOR_DFLT;
+
+/* When our working directory contains subdirectories with different
+ values in CVS/Root files, we maintain a list of them. */
+List *root_directories = NULL;
+
+/* We step through the above values. This variable is set to reflect
+ the currently active value. */
+char *current_root = NULL;
+
+
static const struct cmd
{
char *fullname; /* Full name of the function (e.g. "commit") */
@@ -238,6 +249,21 @@ static const char *const opt_usage[] =
NULL
};
+
+static int
+set_root_directory (p, ignored)
+ Node *p;
+ void *ignored;
+{
+ if (current_root == NULL && p->data == NULL)
+ {
+ current_root = p->key;
+ return 1;
+ }
+ return 0;
+}
+
+
static const char * const*
cmd_synonyms ()
{
@@ -313,7 +339,6 @@ lookup_command_attribute (cmd_name)
(strcmp (cmd_name, "diff") != 0) &&
(strcmp (cmd_name, "rdiff") != 0) &&
(strcmp (cmd_name, "update") != 0) &&
- (strcmp (cmd_name, "history") != 0) &&
(strcmp (cmd_name, "editors") != 0) &&
(strcmp (cmd_name, "export") != 0) &&
(strcmp (cmd_name, "history") != 0) &&
@@ -408,7 +433,6 @@ main (argc, argv)
/* `getopt_long' stores the option index here, but right now we
don't use it. */
int option_index = 0;
- int need_to_create_root = 0;
#ifdef SYSTEM_INITIALIZE
/* Hook for OS-specific behavior, for example socket subsystems on
@@ -568,6 +592,9 @@ Copyright (c) 1989-1998 Brian Berliner, david d `zoo' zuhn, \n\
free_Editor = 1;
break;
case 'd':
+ if (CVSroot_cmdline != NULL)
+ free (CVSroot_cmdline);
+ CVSroot_cmdline = xstrdup (optarg);
CVSroot = xstrdup (optarg);
free_CVSroot = 1;
cvs_update_env = 1; /* need to update environment */
@@ -650,7 +677,10 @@ Copyright (c) 1989-1998 Brian Berliner, david d `zoo' zuhn, \n\
}
if (help)
+ {
argc = -1; /* some functions only check for this */
+ err = (*(cm->func)) (argc, argv);
+ }
else
{
/* The user didn't ask for help, so go ahead and authenticate,
@@ -707,10 +737,79 @@ Copyright (c) 1989-1998 Brian Berliner, david d `zoo' zuhn, \n\
#ifdef SERVER_SUPPORT
server_active = strcmp (command_name, "server") == 0;
+#endif
+
+ /* This is only used for writing into the history file. For
+ remote connections, it might be nice to have hostname
+ and/or remote path, on the other hand I'm not sure whether
+ it is worth the trouble. */
+#ifdef SERVER_SUPPORT
+ if (server_active)
+ CurDir = xstrdup ("<remote>");
+ else
+#endif
+ {
+ CurDir = xgetwd ();
+ if (CurDir == NULL)
+ error (1, errno, "cannot get working directory");
+ }
+
+ if (Tmpdir == NULL || Tmpdir[0] == '\0')
+ Tmpdir = "/tmp";
+
+#ifdef HAVE_PUTENV
+ if (tmpdir_update_env)
+ {
+ char *env;
+ env = xmalloc (strlen (TMPDIR_ENV) + strlen (Tmpdir) + 1 + 1);
+ (void) sprintf (env, "%s=%s", TMPDIR_ENV, Tmpdir);
+ (void) putenv (env);
+ /* do not free env, as putenv has control of it */
+ }
+#endif
+
+#ifndef DONT_USE_SIGNALS
+ /* make sure we clean up on error */
+#ifdef SIGHUP
+ (void) SIG_register (SIGHUP, main_cleanup);
+ (void) SIG_register (SIGHUP, Lock_Cleanup);
+#endif
+#ifdef SIGINT
+ (void) SIG_register (SIGINT, main_cleanup);
+ (void) SIG_register (SIGINT, Lock_Cleanup);
+#endif
+#ifdef SIGQUIT
+ (void) SIG_register (SIGQUIT, main_cleanup);
+ (void) SIG_register (SIGQUIT, Lock_Cleanup);
+#endif
+#ifdef SIGPIPE
+ (void) SIG_register (SIGPIPE, main_cleanup);
+ (void) SIG_register (SIGPIPE, Lock_Cleanup);
+#endif
+#ifdef SIGTERM
+ (void) SIG_register (SIGTERM, main_cleanup);
+ (void) SIG_register (SIGTERM, Lock_Cleanup);
+#endif
+#endif /* !DONT_USE_SIGNALS */
+
+ gethostname(hostname, sizeof (hostname));
+
+#ifdef KLUDGE_FOR_WNT_TESTSUITE
+ /* Probably the need for this will go away at some point once
+ we call fflush enough places (e.g. fflush (stdout) in
+ cvs_outerr). */
+ (void) setvbuf (stdout, (char *) NULL, _IONBF, 0);
+ (void) setvbuf (stderr, (char *) NULL, _IONBF, 0);
+#endif /* KLUDGE_FOR_WNT_TESTSUITE */
+
+ if (use_cvsrc)
+ read_cvsrc (&argc, &argv, command_name);
+
+#ifdef SERVER_SUPPORT
/* Fiddling with CVSROOT doesn't make sense if we're running
- in server mode, since the client will send the repository
- directory after the connection is made. */
+ in server mode, since the client will send the repository
+ directory after the connection is made. */
if (!server_active)
#endif
@@ -727,11 +826,15 @@ Copyright (c) 1989-1998 Brian Berliner, david d `zoo' zuhn, \n\
specify a different repository than the one we are
importing to. */
- if (lookup_command_attribute (command_name)
- & CVS_CMD_IGNORE_ADMROOT)
- {
+ if ((lookup_command_attribute (command_name)
+ & CVS_CMD_IGNORE_ADMROOT)
+
+ /* -d overrides CVS/Root, so don't give an error if the
+ latter points to a nonexistent repository. */
+ && CVSroot_cmdline == NULL)
+ {
CVSADM_Root = Name_Root((char *) NULL, (char *) NULL);
- }
+ }
if (CVSADM_Root != NULL)
{
@@ -740,39 +843,11 @@ Copyright (c) 1989-1998 Brian Berliner, david d `zoo' zuhn, \n\
CVSroot = CVSADM_Root;
cvs_update_env = 1; /* need to update environment */
}
- /* Let -d override CVS/Root file. The user might want
- to change the access method, use a different server
- (if there are two server machines which share the
- repository using a networked file system), etc. */
- else if (
-#ifdef CLIENT_SUPPORT
- !getenv ("CVS_IGNORE_REMOTE_ROOT") &&
-#endif
- strcmp (CVSroot, CVSADM_Root) != 0)
- {
- /* Once we have verified that this root is usable,
- we will want to write it into CVS/Root.
-
- Don't do it for the "login" command, however.
- Consider: if the user executes "cvs login" with
- the working directory inside an already checked
- out module, we'd incorrectly change the
- CVS/Root file to reflect the CVSROOT of the
- "cvs login" command. Ahh, the things one
- discovers. */
-
- if (lookup_command_attribute (command_name)
- & CVS_CMD_USES_WORK_DIR)
- {
- need_to_create_root = 1;
- }
-
- }
}
/* Now we've reconciled CVSROOT from the command line, the
- CVS/Root file, and the environment variable. Do the
- last sanity checks on the variable. */
+ CVS/Root file, and the environment variable. Do the
+ last sanity checks on the variable. */
if (! CVSroot)
{
@@ -794,172 +869,180 @@ Copyright (c) 1989-1998 Brian Berliner, david d `zoo' zuhn, \n\
error (1, 0,
"CVS/Root file (if any).");
}
+ }
+
+ /* Here begins the big loop over unique cvsroot values. We
+ need to call do_recursion once for each unique value found
+ in CVS/Root. Prime the list with the current value. */
+
+ /* Create the list. */
+ assert (root_directories == NULL);
+ root_directories = getlist ();
+
+ /* Prime it. */
+ if (CVSroot != NULL)
+ {
+ Node *n;
+ n = getnode ();
+ n->type = UNKNOWN;
+ n->key = xstrdup (CVSroot);
+ n->data = NULL;
+
+ if (addnode (root_directories, n))
+ error (1, 0, "cannot add initial CVSROOT %s", n->key);
+ }
- /* Now we're 100% sure that we have a valid CVSROOT
- variable. Parse it to see if we're supposed to do
- remote accesses or use a special access method. */
+ assert (current_root == NULL);
- if (parse_cvsroot (CVSroot))
- error (1, 0, "Bad CVSROOT.");
+ /* If we're running the server, we want to execute this main
+ loop once and only once (we won't be serving multiple roots
+ from this connection, so there's no need to do it more than
+ once). To get out of the loop, we perform a "break" at the
+ end of things. */
- /*
- * Check to see if we can write into the history file. If not,
- * we assume that we can't work in the repository.
- * BUT, only if the history file exists.
- */
+ while (
+#ifdef SERVER_SUPPORT
+ server_active ||
+#endif
+ walklist (root_directories, set_root_directory, NULL)
+ )
+ {
+#ifdef SERVER_SUPPORT
+ /* Fiddling with CVSROOT doesn't make sense if we're running
+ in server mode, since the client will send the repository
+ directory after the connection is made. */
- if (!client_active)
+ if (!server_active)
+#endif
{
- char *path;
- int save_errno;
-
- path = xmalloc (strlen (CVSroot_directory)
- + sizeof (CVSROOTADM)
- + 20
- + sizeof (CVSROOTADM_HISTORY));
- (void) sprintf (path, "%s/%s", CVSroot_directory, CVSROOTADM);
- if (!isaccessible (path, R_OK | X_OK))
+ /* Now we're 100% sure that we have a valid CVSROOT
+ variable. Parse it to see if we're supposed to do
+ remote accesses or use a special access method. */
+
+ if (parse_cvsroot (current_root))
+ error (1, 0, "Bad CVSROOT.");
+
+ if (trace)
+ error (0, 0, "notice: main loop with CVSROOT=%s",
+ current_root);
+
+ /*
+ * Check to see if we can write into the history file. If not,
+ * we assume that we can't work in the repository.
+ * BUT, only if the history file exists.
+ */
+
+ if (!client_active)
{
- save_errno = errno;
- /* If this is "cvs init", the root need not exist yet. */
- if (strcmp (command_name, "init") != 0)
+ char *path;
+ int save_errno;
+
+ path = xmalloc (strlen (CVSroot_directory)
+ + sizeof (CVSROOTADM)
+ + 20
+ + sizeof (CVSROOTADM_HISTORY));
+ (void) sprintf (path, "%s/%s", CVSroot_directory, CVSROOTADM);
+ if (!isaccessible (path, R_OK | X_OK))
+ {
+ save_errno = errno;
+ /* If this is "cvs init", the root need not exist yet. */
+ if (strcmp (command_name, "init") != 0)
+ {
+ error (1, save_errno, "%s", path);
+ }
+ }
+ (void) strcat (path, "/");
+ (void) strcat (path, CVSROOTADM_HISTORY);
+ if (readonlyfs == 0 && isfile (path) && !isaccessible (path, R_OK | W_OK))
{
+ save_errno = errno;
+ error (0, 0, "Sorry, you don't have read/write access to the history file");
error (1, save_errno, "%s", path);
}
+ free (path);
}
- (void) strcat (path, "/");
- (void) strcat (path, CVSROOTADM_HISTORY);
- if (readonlyfs == 0 && isfile (path) && !isaccessible (path, R_OK | W_OK))
- {
- save_errno = errno;
- error (0, 0, "Sorry, you don't have read/write access to the history file");
- error (1, save_errno, "%s", path);
- }
- free (path);
- }
#ifdef HAVE_PUTENV
- /* Update the CVSROOT environment variable if necessary. */
-
- if (cvs_update_env)
- {
- char *env;
- env = xmalloc (strlen (CVSROOT_ENV) + strlen (CVSroot)
- + 1 + 1);
- (void) sprintf (env, "%s=%s", CVSROOT_ENV, CVSroot);
- (void) putenv (env);
- /* do not free env, as putenv has control of it */
- }
+ /* Update the CVSROOT environment variable if necessary. */
+ /* FIXME (njc): should we always set this with the CVSROOT from the command line? */
+ if (cvs_update_env)
+ {
+ char *env;
+ env = xmalloc (strlen (CVSROOT_ENV) + strlen (CVSroot)
+ + 1 + 1);
+ (void) sprintf (env, "%s=%s", CVSROOT_ENV, CVSroot);
+ (void) putenv (env);
+ /* do not free env, as putenv has control of it */
+ }
#endif
- }
+ }
- /* This is only used for writing into the history file. For
- remote connections, it might be nice to have hostname
- and/or remote path, on the other hand I'm not sure whether
- it is worth the trouble. */
-
+ /* Parse the CVSROOT/config file, but only for local. For the
+ server, we parse it after we know $CVSROOT. For the
+ client, it doesn't get parsed at all, obviously. The
+ presence of the parse_config call here is not mean to
+ predetermine whether CVSROOT/config overrides things from
+ read_cvsrc and other such places or vice versa. That sort
+ of thing probably needs more thought. */
+ if (1
#ifdef SERVER_SUPPORT
- if (server_active)
- CurDir = xstrdup ("<remote>");
- else
+ && !server_active
#endif
- {
- CurDir = xgetwd ();
- if (CurDir == NULL)
- error (1, errno, "cannot get working directory");
- }
-
- if (Tmpdir == NULL || Tmpdir[0] == '\0')
- Tmpdir = "/tmp";
-
-#ifdef HAVE_PUTENV
- if (tmpdir_update_env)
- {
- char *env;
- env = xmalloc (strlen (TMPDIR_ENV) + strlen (Tmpdir) + 1 + 1);
- (void) sprintf (env, "%s=%s", TMPDIR_ENV, Tmpdir);
- (void) putenv (env);
- /* do not free env, as putenv has control of it */
- }
+#ifdef CLIENT_SUPPORT
+ && !client_active
#endif
+ )
+ {
+ /* If there was an error parsing the config file, parse_config
+ already printed an error. We keep going. Why? Because
+ if we didn't, then there would be no way to check in a new
+ CVSROOT/config file to fix the broken one! */
+ parse_config (CVSroot_directory);
+ }
-#ifndef DONT_USE_SIGNALS
- /* make sure we clean up on error */
-#ifdef SIGHUP
- (void) SIG_register (SIGHUP, main_cleanup);
- (void) SIG_register (SIGHUP, Lock_Cleanup);
-#endif
-#ifdef SIGINT
- (void) SIG_register (SIGINT, main_cleanup);
- (void) SIG_register (SIGINT, Lock_Cleanup);
-#endif
-#ifdef SIGQUIT
- (void) SIG_register (SIGQUIT, main_cleanup);
- (void) SIG_register (SIGQUIT, Lock_Cleanup);
-#endif
-#ifdef SIGPIPE
- (void) SIG_register (SIGPIPE, main_cleanup);
- (void) SIG_register (SIGPIPE, Lock_Cleanup);
-#endif
-#ifdef SIGTERM
- (void) SIG_register (SIGTERM, main_cleanup);
- (void) SIG_register (SIGTERM, Lock_Cleanup);
+#ifdef CLIENT_SUPPORT
+ if (client_active)
+ {
+ /* Create a new list for directory names that we've
+ sent to the server. */
+ if (dirs_sent_to_server != NULL)
+ dellist (&dirs_sent_to_server);
+ dirs_sent_to_server = getlist ();
+ }
#endif
-#endif /* !DONT_USE_SIGNALS */
-
- gethostname(hostname, sizeof (hostname));
-#ifdef KLUDGE_FOR_WNT_TESTSUITE
- /* Probably the need for this will go away at some point once
- we call fflush enough places (e.g. fflush (stdout) in
- cvs_outerr). */
- (void) setvbuf (stdout, (char *) NULL, _IONBF, 0);
- (void) setvbuf (stderr, (char *) NULL, _IONBF, 0);
-#endif /* KLUDGE_FOR_WNT_TESTSUITE */
+ err = (*(cm->func)) (argc, argv);
+
+ /* Mark this root directory as done. When the server is
+ active, current_root will be NULL -- don't try and
+ remove it from the list. */
- if (use_cvsrc)
- read_cvsrc (&argc, &argv, command_name);
+ if (current_root != NULL)
+ {
+ Node *n = findnode (root_directories, current_root);
+ assert (n != NULL);
+ n->data = (void *) 1;
+ current_root = NULL;
+ }
+
+#if 0
+ /* This will not work yet, since it tries to free (void *) 1. */
+ dellist (&root_directories);
+#endif
- /* Parse the CVSROOT/config file, but only for local. For the
- server, we parse it after we know $CVSROOT. For the
- client, it doesn't get parsed at all, obviously. The
- presence of the parse_config call here is not mean to
- predetermine whether CVSROOT/config overrides things from
- read_cvsrc and other such places or vice versa. That sort
- of thing probably needs more thought. */
- if (1
#ifdef SERVER_SUPPORT
- && !server_active
-#endif
-#ifdef CLIENT_SUPPORT
- && !client_active
+ if (server_active)
+ break;
#endif
- )
- {
- /* If there was an error parsing the config file, parse_config
- already printed an error. We keep going. Why? Because
- if we didn't, then there would be no way to check in a new
- CVSROOT/config file to fix the broken one! */
- parse_config (CVSroot_directory);
- }
- } /* end of stuff that gets done if the user DOESN'T ask for help */
+ } /* end of loop for cvsroot values */
- err = (*(cm->func)) (argc, argv);
-
- if (need_to_create_root)
- {
- /* Update the CVS/Root file. We might want to do this in
- all directories that we recurse into, but currently we
- don't. Note that if there is an error writing the file,
- we give an error/warning. This is so if users try to rewrite
- CVS/Root with the -d option (a documented feature), they will
- either succeed, or be told why it didn't work. */
- Create_Root (NULL, CVSroot);
- }
+ } /* end of stuff that gets done if the user DOESN'T ask for help */
Lock_Cleanup ();
free (program_path);
+ if (CVSroot_cmdline != NULL)
+ free (CVSroot_cmdline);
if (free_CVSroot)
free (CVSroot);
if (free_Editor)
@@ -1026,6 +1109,43 @@ date_from_time_t (unixtime)
return (ret);
}
+/* Convert a date to RFC822/1123 format. This is used in contexts like
+ dates to send in the protocol; it should not vary based on locale or
+ other such conventions for users. We should have another routine which
+ does that kind of thing.
+
+ The SOURCE date is in our internal RCS format. DEST should point to
+ storage managed by the caller, at least MAXDATELEN characters. */
+void
+date_to_internet (dest, source)
+ char *dest;
+ char *source;
+{
+ int year, month, day, hour, minute, second;
+
+ /* Just to reiterate, these strings are from RFC822 and do not vary
+ according to locale. */
+ static const char *const month_names[] =
+ {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
+
+ if (sscanf (source, SDATEFORM,
+ &year, &month, &day, &hour, &minute, &second)
+ != 6)
+ /* Is there a better way to handle errors here? I made this
+ non-fatal in case we are called from the code which can't
+ deal with fatal errors. */
+ error (0, 0, "internal error: bad date %s", source);
+
+ /* Always send a four digit year. */
+ if (year < 100)
+ year += 1900;
+
+ sprintf (dest, "%d %s %d %02d:%02d:%02d -0000", day,
+ month < 1 || month > 12 ? "???" : month_names[month - 1],
+ year, hour, minute, second);
+}
+
void
usage (cpp)
register const char *const *cpp;
diff --git a/gnu/usr.bin/cvs/src/mkmodules.c b/gnu/usr.bin/cvs/src/mkmodules.c
index 01b0e26bbfd..a5a87cf7ab8 100644
--- a/gnu/usr.bin/cvs/src/mkmodules.c
+++ b/gnu/usr.bin/cvs/src/mkmodules.c
@@ -406,11 +406,6 @@ mkmodules (dir)
rename_rcsfile (temp, CVSROOTADM_MODULES);
break;
- case -1: /* fork failed */
- (void) unlink_file (temp);
- error (1, errno, "cannot check out %s", CVSROOTADM_MODULES);
- /* NOTREACHED */
-
default:
error (0, 0,
"'cvs checkout' is less functional without a %s file",
@@ -418,7 +413,9 @@ mkmodules (dir)
break;
} /* switch on checkout_file() */
- (void) unlink_file (temp);
+ if (unlink_file (temp) < 0
+ && !existence_error (errno))
+ error (0, errno, "cannot remove %s", temp);
free (temp);
/* Checkout the files that need it in CVSROOT dir */
@@ -439,7 +436,9 @@ mkmodules (dir)
else if (fileptr->errormsg)
error (0, 0, fileptr->errormsg, fileptr->filename);
#endif
- (void) unlink_file (temp);
+ if (unlink_file (temp) < 0
+ && !existence_error (errno))
+ error (0, errno, "cannot remove %s", temp);
free (temp);
}
@@ -462,11 +461,13 @@ mkmodules (dir)
*last = '\0'; /* strip the newline */
/* Skip leading white space. */
- for (fname = line; *fname && isspace(*fname); fname++)
+ for (fname = line;
+ *fname && isspace ((unsigned char) *fname);
+ fname++)
;
/* Find end of filename. */
- for (cp = fname; *cp && !isspace(*cp); cp++)
+ for (cp = fname; *cp && !isspace ((unsigned char) *cp); cp++)
;
*cp = '\0';
@@ -477,11 +478,16 @@ mkmodules (dir)
}
else
{
- for (cp++; cp < last && *last && isspace(*last); cp++)
+ for (cp++;
+ cp < last && *last && isspace ((unsigned char) *last);
+ cp++)
;
if (cp < last && *cp)
error (0, 0, cp, fname);
}
+ if (unlink_file (temp) < 0
+ && !existence_error (errno))
+ error (0, errno, "cannot remove %s", temp);
free (temp);
}
if (line)
@@ -531,6 +537,10 @@ make_tempfile ()
return temp;
}
+/* Get a file. If the file does not exist, return 1 silently. If
+ there is an error, print a message and return 1 (FIXME: probably
+ not a very clean convention). On success, return 0. */
+
static int
checkout_file (file, temp)
char *file;
@@ -556,6 +566,8 @@ checkout_file (file, temp)
(RCSCHECKOUTPROC) NULL, (void *) NULL);
if (retcode != 0)
{
+ /* Probably not necessary (?); RCS_checkout already printed a
+ message. */
error (0, 0, "failed to check out %s file",
file);
}
@@ -616,7 +628,7 @@ write_dbmfile (temp)
if (value[0] == '#')
continue; /* comment line */
vp = value;
- while (*vp && isspace (*vp))
+ while (*vp && isspace ((unsigned char) *vp))
vp++;
if (*vp == '\0')
continue; /* empty line */
@@ -627,11 +639,11 @@ write_dbmfile (temp)
if (!cont)
{
key.dptr = vp;
- while (*vp && !isspace (*vp))
+ while (*vp && !isspace ((unsigned char) *vp))
vp++;
key.dsize = vp - key.dptr;
*vp++ = '\0'; /* NULL terminate the key */
- while (*vp && isspace (*vp))
+ while (*vp && isspace ((unsigned char) *vp))
vp++; /* skip whitespace to value */
if (*vp == '\0')
{
@@ -648,17 +660,28 @@ write_dbmfile (temp)
}
}
dbm_close (db);
- (void) fclose (fp);
+ if (fclose (fp) < 0)
+ error (0, errno, "cannot close %s", temp);
if (err)
{
+ /* I think that the size of the buffer needed here is
+ just determined by sizeof (CVSROOTADM_MODULES), the
+ filenames created by make_tempfile, and other things that won't
+ overflow. */
char dotdir[50], dotpag[50], dotdb[50];
(void) sprintf (dotdir, "%s.dir", temp);
(void) sprintf (dotpag, "%s.pag", temp);
(void) sprintf (dotdb, "%s.db", temp);
- (void) unlink_file (dotdir);
- (void) unlink_file (dotpag);
- (void) unlink_file (dotdb);
+ if (unlink_file (dotdir) < 0
+ && !existence_error (errno))
+ error (0, errno, "cannot remove %s", dotdir);
+ if (unlink_file (dotpag) < 0
+ && !existence_error (errno))
+ error (0, errno, "cannot remove %s", dotpag);
+ if (unlink_file (dotdb) < 0
+ && !existence_error (errno))
+ error (0, errno, "cannot remove %s", dotdb);
error (1, 0, "DBM creation failed; correct above errors");
}
}
@@ -667,10 +690,18 @@ static void
rename_dbmfile (temp)
char *temp;
{
+ /* I think that the size of the buffer needed here is
+ just determined by sizeof (CVSROOTADM_MODULES), the
+ filenames created by make_tempfile, and other things that won't
+ overflow. */
char newdir[50], newpag[50], newdb[50];
char dotdir[50], dotpag[50], dotdb[50];
char bakdir[50], bakpag[50], bakdb[50];
+ int dir1_errno = 0, pag1_errno = 0, db1_errno = 0;
+ int dir2_errno = 0, pag2_errno = 0, db2_errno = 0;
+ int dir3_errno = 0, pag3_errno = 0, db3_errno = 0;
+
(void) sprintf (dotdir, "%s.dir", CVSROOTADM_MODULES);
(void) sprintf (dotpag, "%s.pag", CVSROOTADM_MODULES);
(void) sprintf (dotdb, "%s.db", CVSROOTADM_MODULES);
@@ -688,18 +719,59 @@ rename_dbmfile (temp)
/* don't mess with me */
SIG_beginCrSect ();
- (void) unlink_file (bakdir); /* rm .#modules.dir .#modules.pag */
- (void) unlink_file (bakpag);
- (void) unlink_file (bakdb);
- (void) CVS_RENAME (dotdir, bakdir); /* mv modules.dir .#modules.dir */
- (void) CVS_RENAME (dotpag, bakpag); /* mv modules.pag .#modules.pag */
- (void) CVS_RENAME (dotdb, bakdb); /* mv modules.db .#modules.db */
- (void) CVS_RENAME (newdir, dotdir); /* mv "temp".dir modules.dir */
- (void) CVS_RENAME (newpag, dotpag); /* mv "temp".pag modules.pag */
- (void) CVS_RENAME (newdb, dotdb); /* mv "temp".db modules.db */
+ /* rm .#modules.dir .#modules.pag */
+ if (unlink_file (bakdir) < 0)
+ dir1_errno = errno;
+ if (unlink_file (bakpag) < 0)
+ pag1_errno = errno;
+ if (unlink_file (bakdb) < 0)
+ db1_errno = errno;
+
+ /* mv modules.dir .#modules.dir */
+ if (CVS_RENAME (dotdir, bakdir) < 0)
+ dir2_errno = errno;
+ /* mv modules.pag .#modules.pag */
+ if (CVS_RENAME (dotpag, bakpag) < 0)
+ pag2_errno = errno;
+ /* mv modules.db .#modules.db */
+ if (CVS_RENAME (dotdb, bakdb) < 0)
+ db2_errno = errno;
+
+ /* mv "temp".dir modules.dir */
+ if (CVS_RENAME (newdir, dotdir) < 0)
+ dir3_errno = errno;
+ /* mv "temp".pag modules.pag */
+ if (CVS_RENAME (newpag, dotpag) < 0)
+ pag3_errno = errno;
+ /* mv "temp".db modules.db */
+ if (CVS_RENAME (newdb, dotdb) < 0)
+ db3_errno = errno;
/* OK -- make my day */
SIG_endCrSect ();
+
+ /* I didn't want to call error() when we had signals blocked
+ (unnecessary?), but do it now. */
+ if (dir1_errno && !existence_error (dir1_errno))
+ error (0, dir1_errno, "cannot remove %s", bakdir);
+ if (pag1_errno && !existence_error (pag1_errno))
+ error (0, pag1_errno, "cannot remove %s", bakpag);
+ if (db1_errno && !existence_error (db1_errno))
+ error (0, db1_errno, "cannot remove %s", bakdb);
+
+ if (dir2_errno && !existence_error (dir2_errno))
+ error (0, dir2_errno, "cannot remove %s", bakdir);
+ if (pag2_errno && !existence_error (pag2_errno))
+ error (0, pag2_errno, "cannot remove %s", bakpag);
+ if (db2_errno && !existence_error (db2_errno))
+ error (0, db2_errno, "cannot remove %s", bakdb);
+
+ if (dir3_errno && !existence_error (dir3_errno))
+ error (0, dir3_errno, "cannot remove %s", bakdir);
+ if (pag3_errno && !existence_error (pag3_errno))
+ error (0, pag3_errno, "cannot remove %s", bakpag);
+ if (db3_errno && !existence_error (db3_errno))
+ error (0, db3_errno, "cannot remove %s", bakdb);
}
#endif /* !MY_NDBM */
@@ -717,16 +789,31 @@ rename_rcsfile (temp, real)
rcs = xmalloc (strlen (real) + sizeof (RCSEXT) + 10);
(void) sprintf (rcs, "%s%s", real, RCSEXT);
statbuf.st_mode = 0; /* in case rcs file doesn't exist, but it should... */
- (void) CVS_STAT (rcs, &statbuf);
+ if (CVS_STAT (rcs, &statbuf) < 0
+ && !existence_error (errno))
+ error (0, errno, "cannot stat %s", rcs);
free (rcs);
if (chmod (temp, 0444 | (statbuf.st_mode & 0111)) < 0)
error (0, errno, "warning: cannot chmod %s", temp);
bak = xmalloc (strlen (real) + sizeof (BAKPREFIX) + 10);
(void) sprintf (bak, "%s%s", BAKPREFIX, real);
- (void) unlink_file (bak); /* rm .#loginfo */
- (void) CVS_RENAME (real, bak); /* mv loginfo .#loginfo */
- (void) CVS_RENAME (temp, real); /* mv "temp" loginfo */
+
+ /* rm .#loginfo */
+ if (unlink_file (bak) < 0
+ && !existence_error (errno))
+ error (0, errno, "cannot remove %s", bak);
+
+ /* mv loginfo .#loginfo */
+ if (CVS_RENAME (real, bak) < 0
+ && !existence_error (errno))
+ error (0, errno, "cannot rename %s to %s", real, bak);
+
+ /* mv "temp" loginfo */
+ if (CVS_RENAME (temp, real) < 0
+ && !existence_error (errno))
+ error (0, errno, "cannot rename %s to %s", temp, real);
+
free (bak);
}
diff --git a/gnu/usr.bin/cvs/src/parseinfo.c b/gnu/usr.bin/cvs/src/parseinfo.c
index b2ec65d9a81..a5629a3fb78 100644
--- a/gnu/usr.bin/cvs/src/parseinfo.c
+++ b/gnu/usr.bin/cvs/src/parseinfo.c
@@ -77,7 +77,7 @@ Parse_Info (infofile, repository, callproc, all)
continue;
/* skip whitespace at beginning of line */
- for (cp = line; *cp && isspace (*cp); cp++)
+ for (cp = line; *cp && isspace ((unsigned char) *cp); cp++)
;
/* if *cp is null, the whole line was blank */
@@ -85,13 +85,13 @@ Parse_Info (infofile, repository, callproc, all)
continue;
/* the regular expression is everything up to the first space */
- for (exp = cp; *cp && !isspace (*cp); cp++)
+ for (exp = cp; *cp && !isspace ((unsigned char) *cp); cp++)
;
if (*cp != '\0')
*cp++ = '\0';
/* skip whitespace up to the start of the matching value */
- while (*cp && isspace (*cp))
+ while (*cp && isspace ((unsigned char) *cp))
cp++;
/* no value to match with the regular expression is an error */
@@ -382,6 +382,15 @@ warning: this CVS does not support PreservePermissions");
goto error_return;
}
}
+ else if (strcmp (line, "LockDir") == 0)
+ {
+ if (lock_dir != NULL)
+ free (lock_dir);
+ lock_dir = xstrdup (p);
+ /* Could try some validity checking, like whether we can
+ opendir it or something, but I don't see any particular
+ reason to do that now rather than waiting until lock.c. */
+ }
else
{
/* We may be dealing with a keyword which was added in a
diff --git a/gnu/usr.bin/cvs/src/patch.c b/gnu/usr.bin/cvs/src/patch.c
index 9f56b627bfa..f16a3318890 100644
--- a/gnu/usr.bin/cvs/src/patch.c
+++ b/gnu/usr.bin/cvs/src/patch.c
@@ -763,19 +763,29 @@ patch_dirproc (callerdat, dir, repos, update_dir, entries)
static RETSIGTYPE
patch_cleanup ()
{
+ /* Note that the checks for existence_error are because we are
+ called from a signal handler, without SIG_begincrsect, so
+ we don't know whether the files got created. */
+
if (tmpfile1 != NULL)
{
- (void) unlink_file (tmpfile1);
+ if (unlink_file (tmpfile1) < 0
+ && !existence_error (errno))
+ error (0, errno, "cannot remove %s", tmpfile1);
free (tmpfile1);
}
if (tmpfile2 != NULL)
{
- (void) unlink_file (tmpfile2);
+ if (unlink_file (tmpfile2) < 0
+ && !existence_error (errno))
+ error (0, errno, "cannot remove %s", tmpfile2);
free (tmpfile2);
}
if (tmpfile3 != NULL)
{
- (void) unlink_file (tmpfile3);
+ if (unlink_file (tmpfile3) < 0
+ && !existence_error (errno))
+ error (0, errno, "cannot remove %s", tmpfile3);
free (tmpfile3);
}
tmpfile1 = tmpfile2 = tmpfile3 = NULL;
diff --git a/gnu/usr.bin/cvs/src/rcs.c b/gnu/usr.bin/cvs/src/rcs.c
index a93d7a035ff..571ae2a300e 100644
--- a/gnu/usr.bin/cvs/src/rcs.c
+++ b/gnu/usr.bin/cvs/src/rcs.c
@@ -153,6 +153,24 @@ static const char spacetab[] = {
#define whitespace(c) (spacetab[(unsigned char)c] != 0)
+/* A few generic thoughts on error handling, in particular the
+ printing of unexpected characters that we find in the RCS file
+ (that is, why we use '\x%x' rather than %c or some such).
+
+ * Avoiding %c means we don't have to worry about what is printable
+ and other such stuff. In error handling, often better to keep it
+ simple.
+
+ * Hex rather than decimal or octal because character set standards
+ tend to use hex.
+
+ * Saying "character 0x%x" might make it sound like we are printing
+ a file offset. So we use '\x%x'.
+
+ * Would be nice to print the offset within the file, but I can
+ imagine various portability hassles (in particular, whether
+ unsigned long is always big enough to hold file offsets). */
+
/* Parse an rcsfile given a user file name and a repository. If there is
an error, we print an error message and return NULL. If the file
does not exist, we return NULL without printing anything (I'm not
@@ -364,7 +382,9 @@ RCS_parsercsfile_i (fp, rcsfile)
break;
}
- for (cp = key; (isdigit (*cp) || *cp == '.') && *cp != '\0'; cp++)
+ for (cp = key;
+ (isdigit ((unsigned char) *cp) || *cp == '.') && *cp != '\0';
+ cp++)
/* do nothing */ ;
if (*cp == '\0')
break;
@@ -498,7 +518,9 @@ RCS_reparsercsfile (rdata, pfp, rcsbufp)
* revision or `desc', we are done with the headers and are down to the
* revision deltas, so we break out of the loop
*/
- for (cp = key; (isdigit (*cp) || *cp == '.') && *cp != '\0'; cp++)
+ for (cp = key;
+ (isdigit ((unsigned char) *cp) || *cp == '.') && *cp != '\0';
+ cp++)
/* do nothing */ ;
/* Note that when comparing with RCSDATE, we are not massaging
VALUE from the string found in the RCS file. This is OK
@@ -583,6 +605,98 @@ RCS_reparsercsfile (rdata, pfp, rcsbufp)
rdata->flags &= ~PARTIAL;
}
+/* Move RCS into or out of the Attic, depending on TOATTIC. If the
+ file is already in the desired place, return without doing
+ anything. At some point may want to think about how this relates
+ to RCS_rewrite but that is a bit hairy (if one wants renames to be
+ atomic, or that kind of thing). If there is an error, print a message
+ and return 1. On success, return 0. */
+int
+RCS_setattic (rcs, toattic)
+ RCSNode *rcs;
+ int toattic;
+{
+ char *newpath;
+ char *p;
+ char *q;
+
+ /* Some systems aren't going to let us rename an open file. */
+ rcsbuf_cache_close ();
+
+ /* Could make the pathname computations in this file, and probably
+ in other parts of rcs.c too, easier if the REPOS and FILE
+ arguments to RCS_parse got stashed in the RCSNode. */
+
+ if (toattic)
+ {
+ mode_t omask;
+
+ if (rcs->flags & INATTIC)
+ return 0;
+
+ /* Example: rcs->path is "/foo/bar/baz,v". */
+ newpath = xmalloc (strlen (rcs->path) + sizeof CVSATTIC + 5);
+ p = last_component (rcs->path);
+ strncpy (newpath, rcs->path, p - rcs->path);
+ strcpy (newpath + (p - rcs->path), CVSATTIC);
+
+ /* Create the Attic directory if it doesn't exist. */
+ omask = umask (cvsumask);
+ if (CVS_MKDIR (newpath, 0777) < 0 && errno != EEXIST)
+ error (0, errno, "cannot make directory %s", newpath);
+ (void) umask (omask);
+
+ strcat (newpath, "/");
+ strcat (newpath, p);
+
+ if (CVS_RENAME (rcs->path, newpath) < 0)
+ {
+ int save_errno = errno;
+
+ /* The checks for isreadable look awfully fishy, but
+ I'm going to leave them here for now until I
+ can think harder about whether they take care of
+ some cases which should be handled somehow. */
+
+ if (isreadable (rcs->path) || !isreadable (newpath))
+ {
+ error (0, save_errno, "cannot rename %s to %s",
+ rcs->path, newpath);
+ free (newpath);
+ return 1;
+ }
+ }
+ }
+ else
+ {
+ if (!(rcs->flags & INATTIC))
+ return 0;
+
+ newpath = xmalloc (strlen (rcs->path));
+
+ /* Example: rcs->path is "/foo/bar/Attic/baz,v". */
+ p = last_component (rcs->path);
+ strncpy (newpath, rcs->path, p - rcs->path - 1);
+ newpath[p - rcs->path - 1] = '\0';
+ q = newpath + (p - rcs->path - 1) - (sizeof CVSATTIC - 1);
+ assert (strncmp (q, CVSATTIC, sizeof CVSATTIC - 1) == 0);
+ strcpy (q, p);
+
+ if (CVS_RENAME (rcs->path, newpath) < 0)
+ {
+ error (0, errno, "failed to move `%s' out of the attic",
+ rcs->path);
+ free (newpath);
+ return 1;
+ }
+ }
+
+ free (rcs->path);
+ rcs->path = newpath;
+
+ return 0;
+}
+
/*
* Fully parse the RCS file. Store all keyword/value pairs, fetch the
* log messages for each revision, and fetch add and delete counts for
@@ -671,7 +785,8 @@ warning: duplicate key `%s' in version `%s' of RCS file `%s'",
op = *cp++;
if (op != 'a' && op != 'd')
- error (1, 0, "unrecognized operation '%c' in %s",
+ error (1, 0, "\
+unrecognized operation '\\x%x' in %s",
op, rcs->path);
(void) strtoul (cp, (char **) &cp, 10);
if (*cp++ != ' ')
@@ -1479,7 +1594,8 @@ rcsbuf_getstring (rcsbuf, strp)
/* PTR should now point to the start of a string. */
if (c != '@')
- error (1, 0, "expected @-string at `%c' in %s", c, rcsbuf->filename);
+ error (1, 0, "expected @-string at '\\x%x' in %s",
+ c, rcsbuf->filename);
/* Optimize the common case of a value composed of a single
'@' string. */
@@ -1736,7 +1852,7 @@ rcsbuf_getword (rcsbuf, wordp)
printing character that is not a special.' This test ought
to do the trick. */
c = *ptr;
- if (isprint (c) &&
+ if (isprint ((unsigned char) c) &&
c != ';' && c != '$' && c != ',' && c != '@' && c != ':')
{
++ptr;
@@ -1804,9 +1920,10 @@ rcsbuf_getrevnum (rcsbuf, revp)
++ptr;
}
- if (! isdigit (c) && c != '.')
+ if (! isdigit ((unsigned char) c) && c != '.')
error (1, 0,
- "unexpected `%c' reading revision number in RCS file %s",
+ "\
+unexpected '\\x%x' reading revision number in RCS file %s",
c, rcsbuf->filename);
*revp = ptr;
@@ -1826,10 +1943,11 @@ rcsbuf_getrevnum (rcsbuf, revp)
c = *ptr;
}
- while (isdigit (c) || c == '.');
+ while (isdigit ((unsigned char) c) || c == '.');
if (! whitespace (c))
- error (1, 0, "unexpected `%c' reading revision number in RCS file %s",
+ error (1, 0, "\
+unexpected '\\x%x' reading revision number in RCS file %s",
c, rcsbuf->filename);
*ptr = '\0';
@@ -2337,7 +2455,7 @@ RCS_getversion (rcs, tag, date, force_tag_match, simple_tag)
}
/* Work out the branch. */
- if (! isdigit (tag[0]))
+ if (! isdigit ((unsigned char) tag[0]))
branch = RCS_whatbranch (rcs, tag);
else
branch = xstrdup (tag);
@@ -2478,7 +2596,7 @@ RCS_gettag (rcs, symtag, force_tag_match, simple_tag)
#endif
return (RCS_head (rcs));
- if (!isdigit (tag[0]))
+ if (!isdigit ((unsigned char) tag[0]))
{
char *version;
@@ -2675,7 +2793,7 @@ RCS_isbranch (rcs, rev)
const char *rev;
{
/* numeric revisions are easy -- even number of dots is a branch */
- if (isdigit (*rev))
+ if (isdigit ((unsigned char) *rev))
return ((numdots (rev) & 1) == 0);
/* assume a revision if you can't find the RCS info */
@@ -2702,7 +2820,7 @@ RCS_nodeisbranch (rcs, rev)
assert (rcs != NULL);
/* numeric revisions are easy -- even number of dots is a branch */
- if (isdigit (*rev))
+ if (isdigit ((unsigned char) *rev))
return ((numdots (rev) & 1) == 0);
version = translate_symtag (rcs, rev);
@@ -2929,7 +3047,7 @@ RCS_branch_head (rcs, rev)
if (RCS_nodeisbranch (rcs, rev))
return RCS_getbranch (rcs, rev, 1);
- if (isdigit (*rev))
+ if (isdigit ((unsigned char) *rev))
num = xstrdup (rev);
else
{
@@ -3101,8 +3219,23 @@ RCS_getdate (rcs, date, force_tag_match)
*/
/* if we found what we're looking for, and it's not 1.1 return it */
- if (cur_rev != NULL && ! STREQ (cur_rev, "1.1"))
- return (xstrdup (cur_rev));
+ if (cur_rev != NULL)
+ {
+ if (! STREQ (cur_rev, "1.1"))
+ return (xstrdup (cur_rev));
+
+ /* This is 1.1; if the date of 1.1 is not the same as that for the
+ 1.1.1.1 version, then return 1.1. This happens when the first
+ version of a file is created by a regular cvs add and commit,
+ and there is a subsequent cvs import of the same file. */
+ p = findnode (rcs->versions, "1.1.1.1");
+ if (p)
+ {
+ vers = (RCSVers *) p->data;
+ if (RCS_datecmp (vers->date, date) != 0)
+ return xstrdup ("1.1");
+ }
+ }
/* look on the vendor branch */
retval = RCS_getdatebranch (rcs, date, CVSBRANCH);
@@ -3454,11 +3587,11 @@ RCS_check_tag (tag)
* characters cannot be non-visible graphic characters, and must not be
* in the set of "invalid" RCS identifier characters.
*/
- if (isalpha (*tag))
+ if (isalpha ((unsigned char) *tag))
{
for (cp = tag; *cp; cp++)
{
- if (!isgraph (*cp))
+ if (!isgraph ((unsigned char) *cp))
error (1, 0, "tag `%s' has non-visible graphic characters",
tag);
if (strchr (invalid, *cp))
@@ -3485,7 +3618,7 @@ RCS_valid_rev (rev)
{
char last, c;
last = *rev++;
- if (!isdigit (last))
+ if (!isdigit ((unsigned char) last))
return 0;
while ((c = *rev++)) /* Extra parens placate -Wall gcc option */
{
@@ -3496,10 +3629,10 @@ RCS_valid_rev (rev)
continue;
}
last = c;
- if (!isdigit (c))
+ if (!isdigit ((unsigned char) c))
return 0;
}
- if (!isdigit (last))
+ if (!isdigit ((unsigned char) last))
return 0;
return 1;
}
@@ -3535,10 +3668,26 @@ char *
RCS_getexpand (rcs)
RCSNode *rcs;
{
+ /* Since RCS_parsercsfile_i now reads expand, don't need to worry
+ about RCS_reparsercsfile. */
assert (rcs != NULL);
return rcs->expand;
}
+/* Set keyword expansion mode to EXPAND. For example "b" for binary. */
+void
+RCS_setexpand (rcs, expand)
+ RCSNode *rcs;
+ char *expand;
+{
+ /* Since RCS_parsercsfile_i now reads expand, don't need to worry
+ about RCS_reparsercsfile. */
+ assert (rcs != NULL);
+ if (rcs->expand != NULL)
+ free (rcs->expand);
+ rcs->expand = xstrdup (expand);
+}
+
/* RCS keywords, and a matching enum. */
struct rcs_keyword
{
@@ -3747,7 +3896,7 @@ expand_keywords (rcs, ver, name, log, loglen, expand, buf, len, retbuf, retlen)
/* Look for the first non alphabetic character after the '$'. */
send = srch + srch_len;
for (s = srch; s < send; s++)
- if (! isalpha (*s))
+ if (! isalpha ((unsigned char) *s))
break;
/* If the first non alphabetic character is not '$' or ':',
@@ -3851,7 +4000,7 @@ expand_keywords (rcs, ver, name, log, loglen, expand, buf, len, retbuf, retlen)
break;
case KEYWORD_NAME:
- if (name != NULL && ! isdigit (*name))
+ if (name != NULL && ! isdigit ((unsigned char) *name))
value = (char *) name;
else
value = NULL;
@@ -4194,7 +4343,7 @@ RCS_checkout (rcs, workfile, rev, nametag, options, sout, pfn, callerdat)
: (sout != RUN_TTY ? sout : "(stdout)"))));
}
- assert (rev == NULL || isdigit (*rev));
+ assert (rev == NULL || isdigit ((unsigned char) *rev));
if (noexec && workfile != NULL)
return 0;
@@ -5028,37 +5177,11 @@ RCS_checkin (rcs, workfile, message, rev, flags)
/* Is the backend file a symbolic link? Follow it and replace the
filename with the destination of the link. */
- while (islink (rcs->path))
- {
- char *newname;
-#ifdef HAVE_READLINK
- /* The clean thing to do is probably to have each filesubr.c
- implement this (with an error if not supported by the
- platform, in which case islink would presumably return 0).
- But that would require editing each filesubr.c and so the
- expedient hack seems to be looking at HAVE_READLINK. */
- newname = xreadlink (rcs->path);
-#else
- error (1, 0, "internal error: islink doesn't like readlink");
-#endif
-
- if (isabsolute (newname))
- {
- free (rcs->path);
- rcs->path = newname;
- }
- else
- {
- char *oldname = last_component (rcs->path);
- int dirlen = oldname - rcs->path;
- char *fullnewname = xmalloc (dirlen + strlen (newname) + 1);
- strncpy (fullnewname, rcs->path, dirlen);
- strcpy (fullnewname + dirlen, newname);
- free (newname);
- free (rcs->path);
- rcs->path = fullnewname;
- }
- }
+ /* If the filename is a symbolic link, follow it and replace it
+ with the destination of the link. We need to do this before
+ calling rcs_internal_lockfile, or else we won't put the lock in
+ the right place. */
+ resolve_symlink (&(rcs->path));
checkin_quiet = flags & RCS_FLAGS_QUIET;
if (!checkin_quiet)
@@ -5285,7 +5408,7 @@ RCS_checkin (rcs, workfile, message, rev, flags)
char *branch, *tip, *newrev, *p;
int dots, isrevnum;
- assert (isdigit(*rev));
+ assert (isdigit ((unsigned char) *rev));
newrev = xstrdup (rev);
dots = numdots (newrev);
@@ -6549,7 +6672,7 @@ RCS_delete_revs (rcs, tag1, tag2, inclusive)
goto delrev_done;
outfile = cvs_temp_name();
- status = diff_exec (beforefile, afterfile, "-n", outfile);
+ status = diff_exec (beforefile, afterfile, "-an", outfile);
if (status == 2)
{
@@ -7016,7 +7139,8 @@ apply_rcs_changes (lines, diffbuf, difflen, name, addvers, delvers)
if (op != 'a' && op != 'd')
/* Can't just skip over the deltafrag, because the value
of op determines the syntax. */
- error (1, 0, "unrecognized operation '%c' in %s", op, name);
+ error (1, 0, "unrecognized operation '\\x%x' in %s",
+ op, name);
df = (struct deltafrag *) xmalloc (sizeof (struct deltafrag));
df->next = dfhead;
dfhead = df;
@@ -7542,7 +7666,9 @@ getdelta (rcsbuf, rcsfile, keyp, valp)
/* Make sure that it is a revision number and not a cabbage
or something. */
- for (cp = key; (isdigit (*cp) || *cp == '.') && *cp != '\0'; cp++)
+ for (cp = key;
+ (isdigit ((unsigned char) *cp) || *cp == '.') && *cp != '\0';
+ cp++)
/* do nothing */ ;
/* Note that when comparing with RCSDATE, we are not massaging
VALUE from the string found in the RCS file. This is OK since
@@ -7726,7 +7852,9 @@ unable to parse %s; `state' not in the expected place", rcsfile);
continue;
}
/* if we have a new revision number, we're done with this delta */
- for (cp = key; (isdigit (*cp) || *cp == '.') && *cp != '\0'; cp++)
+ for (cp = key;
+ (isdigit ((unsigned char) *cp) || *cp == '.') && *cp != '\0';
+ cp++)
/* do nothing */ ;
/* Note that when comparing with RCSDATE, we are not massaging
VALUE from the string found in the RCS file. This is OK
@@ -8468,6 +8596,9 @@ RCS_rewrite (rcs, newdtext, insertpt)
if (noexec)
return;
+ /* Make sure we're operating on an actual file and not a symlink. */
+ resolve_symlink (&(rcs->path));
+
fout = rcs_internal_lockfile (rcs->path);
RCS_putadmin (rcs, fout);
@@ -8620,8 +8751,8 @@ annotate (argc, argv)
option_with_arg ("-r", tag);
if (date)
client_senddate (date);
- send_file_names (argc, argv, SEND_EXPAND_WILD);
send_files (argc, argv, local, 0, SEND_NO_CONTENTS);
+ send_file_names (argc, argv, SEND_EXPAND_WILD);
send_to_server ("annotate\012", 0);
return get_responses_and_close ();
}
@@ -8657,7 +8788,7 @@ make_file_label (path, rev, rcs)
char *file;
file = last_component (path);
- label = (char *) xmalloc (strlen (file)
+ label = (char *) xmalloc (strlen (path)
+ (rev == NULL ? 0 : strlen (rev))
+ 50);
@@ -8666,7 +8797,7 @@ make_file_label (path, rev, rcs)
char *date;
RCS_getrevtime (rcs, rev, datebuf, 0);
date = printable_date (datebuf);
- (void) sprintf (label, "-L%s\t%s\t%s", file, date, rev);
+ (void) sprintf (label, "-L%s\t%s\t%s", path, date, rev);
free (date);
}
else
@@ -8683,9 +8814,8 @@ make_file_label (path, rev, rcs)
wm->tm_year + 1900, wm->tm_mon + 1,
wm->tm_mday, wm->tm_hour,
wm->tm_min, wm->tm_sec);
- (void) sprintf (label, "-L%s\t%s", file, datebuf);
+ (void) sprintf (label, "-L%s\t%s", path, datebuf);
}
}
return label;
}
-
diff --git a/gnu/usr.bin/cvs/src/rcscmds.c b/gnu/usr.bin/cvs/src/rcscmds.c
index f8892338b42..ab94e407bd7 100644
--- a/gnu/usr.bin/cvs/src/rcscmds.c
+++ b/gnu/usr.bin/cvs/src/rcscmds.c
@@ -147,7 +147,8 @@ call_diff_write_output (text, len)
const char *text;
size_t len;
{
- cvs_output (text, len);
+ if (len > 0)
+ cvs_output (text, len);
}
/* Call back function for the diff library to flush the output file.
diff --git a/gnu/usr.bin/cvs/src/server.c b/gnu/usr.bin/cvs/src/server.c
index 1e024f4c7a8..0aafa586e5d 100644
--- a/gnu/usr.bin/cvs/src/server.c
+++ b/gnu/usr.bin/cvs/src/server.c
@@ -133,7 +133,7 @@ char *CVS_Username = NULL;
/* Used to check that same repos is transmitted in pserver auth and in
later CVS protocol. Exported because root.c also uses. */
-char *Pserver_Repos = NULL;
+static char *Pserver_Repos = NULL;
/* Should we check for system usernames/passwords? Can be changed by
CVSROOT/config. */
@@ -341,6 +341,182 @@ fd_buffer_block (closure, block)
return 0;
}
+/* Populate all of the directories between BASE_DIR and its relative
+ subdirectory DIR with CVSADM directories. Return 0 for success or
+ errno value. */
+static int create_adm_p PROTO((char *, char *));
+
+static int
+create_adm_p (base_dir, dir)
+ char *base_dir;
+ char *dir;
+{
+ char *dir_where_cvsadm_lives, *dir_to_register, *p, *tmp;
+ int retval, done;
+ FILE *f;
+
+ if (strcmp (dir, ".") == 0)
+ return 0; /* nothing to do */
+
+ /* Allocate some space for our directory-munging string. */
+ p = malloc (strlen (dir) + 1);
+ if (p == NULL)
+ return ENOMEM;
+
+ dir_where_cvsadm_lives = malloc (strlen (base_dir) + strlen (dir) + 100);
+ if (dir_where_cvsadm_lives == NULL)
+ return ENOMEM;
+
+ /* Allocate some space for the temporary string in which we will
+ construct filenames. */
+ tmp = malloc (strlen (base_dir) + strlen (dir) + 100);
+ if (tmp == NULL)
+ return ENOMEM;
+
+
+ /* We make several passes through this loop. On the first pass,
+ we simply create the CVSADM directory in the deepest directory.
+ For each subsequent pass, we try to remove the last path
+ element from DIR, create the CVSADM directory in the remaining
+ pathname, and register the subdirectory in the newly created
+ CVSADM directory. */
+
+ retval = done = 0;
+
+ strcpy (p, dir);
+ strcpy (dir_where_cvsadm_lives, base_dir);
+ strcat (dir_where_cvsadm_lives, "/");
+ strcat (dir_where_cvsadm_lives, p);
+ dir_to_register = NULL;
+
+ while (1)
+ {
+ /* Create CVSADM. */
+ (void) sprintf (tmp, "%s/%s", dir_where_cvsadm_lives, CVSADM);
+ if ((CVS_MKDIR (tmp, 0777) < 0) && (errno != EEXIST))
+ {
+ retval = errno;
+ goto finish;
+ }
+
+ /* Create CVSADM_REP. */
+ (void) sprintf (tmp, "%s/%s", dir_where_cvsadm_lives, CVSADM_REP);
+ if (! isfile (tmp))
+ {
+ /* Use Emptydir as the placeholder until the client sends
+ us the real value. This code is similar to checkout.c
+ (emptydir_name), but the code below returns errors
+ differently. */
+
+ char *empty;
+ empty = malloc (strlen (CVSroot_directory)
+ + sizeof (CVSROOTADM)
+ + sizeof (CVSNULLREPOS)
+ + 10);
+ if (! empty)
+ {
+ retval = ENOMEM;
+ goto finish;
+ }
+
+ /* Create the directory name. */
+ (void) sprintf (empty, "%s/%s/%s", CVSroot_directory,
+ CVSROOTADM, CVSNULLREPOS);
+
+ /* Create the directory if it doesn't exist. */
+ if (! isfile (empty))
+ {
+ mode_t omask;
+ omask = umask (cvsumask);
+ if (CVS_MKDIR (empty, 0777) < 0)
+ {
+ retval = errno;
+ free (empty);
+ goto finish;
+ }
+ (void) umask (omask);
+ }
+
+
+ f = CVS_FOPEN (tmp, "w");
+ if (f == NULL)
+ {
+ retval = errno;
+ free (empty);
+ goto finish;
+ }
+ /* Write the directory name to CVSADM_REP. */
+ if (fprintf (f, "%s\n", empty) < 0)
+ {
+ retval = errno;
+ fclose (f);
+ free (empty);
+ goto finish;
+ }
+ if (fclose (f) == EOF)
+ {
+ retval = errno;
+ free (empty);
+ goto finish;
+ }
+
+ /* Clean up after ourselves. */
+ free (empty);
+ }
+
+ /* Create CVSADM_ENT. We open in append mode because we
+ don't want to clobber an existing Entries file. */
+ (void) sprintf (tmp, "%s/%s", dir_where_cvsadm_lives, CVSADM_ENT);
+ f = CVS_FOPEN (tmp, "a");
+ if (f == NULL)
+ {
+ retval = errno;
+ goto finish;
+ }
+ if (fclose (f) == EOF)
+ {
+ retval = errno;
+ goto finish;
+ }
+
+ if (dir_to_register != NULL)
+ {
+ /* FIXME: Yes, this results in duplicate entries in the
+ Entries.Log file, but it doesn't currently matter. We
+ might need to change this later on to make sure that we
+ only write one entry. */
+
+ Subdir_Register ((List *) NULL, dir_where_cvsadm_lives,
+ dir_to_register);
+ }
+
+ if (done)
+ break;
+
+ dir_to_register = strrchr (p, '/');
+ if (dir_to_register == NULL)
+ {
+ dir_to_register = p;
+ strcpy (dir_where_cvsadm_lives, base_dir);
+ done = 1;
+ }
+ else
+ {
+ *dir_to_register = '\0';
+ dir_to_register++;
+ strcpy (dir_where_cvsadm_lives, base_dir);
+ strcat (dir_where_cvsadm_lives, "/");
+ strcat (dir_where_cvsadm_lives, p);
+ }
+ }
+
+ finish:
+ free (tmp);
+ free (dir_where_cvsadm_lives);
+ free (p);
+ return retval;
+}
+
/*
* Make directory DIR, including all intermediate directories if necessary.
* Returns 0 for success or errno code.
@@ -563,6 +739,7 @@ serve_root (arg)
char *env;
char *path;
int save_errno;
+ char *arg_dup;
if (error_pending()) return;
@@ -591,16 +768,43 @@ serve_root (arg)
return;
}
- set_local_cvsroot (arg);
+#ifdef AUTH_SERVER_SUPPORT
+ if (Pserver_Repos != NULL)
+ {
+ if (strcmp (Pserver_Repos, arg) != 0)
+ {
+ if (alloc_pending (80 + strlen (Pserver_Repos) + strlen (arg)))
+ /* The explicitness is to aid people who are writing clients.
+ I don't see how this information could help an
+ attacker. */
+ sprintf (pending_error_text, "\
+E Protocol error: Root says \"%s\" but pserver says \"%s\"",
+ arg, Pserver_Repos);
+ }
+ }
+#endif
+ arg_dup = malloc (strlen (arg) + 1);
+ if (arg_dup == NULL)
+ {
+ pending_error = ENOMEM;
+ return;
+ }
+ strcpy (arg_dup, arg);
+ set_local_cvsroot (arg_dup);
/* For pserver, this will already have happened, and the call will do
nothing. But for rsh, we need to do it now. */
parse_config (CVSroot_directory);
- path = xmalloc (strlen (CVSroot_directory)
- + sizeof (CVSROOTADM)
- + sizeof (CVSROOTADM_HISTORY)
- + 10);
+ path = malloc (strlen (CVSroot_directory)
+ + sizeof (CVSROOTADM)
+ + sizeof (CVSROOTADM_HISTORY)
+ + 10);
+ if (path == NULL)
+ {
+ pending_error = ENOMEM;
+ return;
+ }
(void) sprintf (path, "%s/%s", CVSroot_directory, CVSROOTADM);
if (!isaccessible (path, R_OK | X_OK))
{
@@ -709,7 +913,6 @@ dirswitch (dir, repos)
{
int status;
FILE *f;
- char *b;
size_t dir_len;
server_write_entries ();
@@ -745,7 +948,7 @@ dirswitch (dir, repos)
strcat (dir_name, "/");
strcat (dir_name, dir);
- status = mkdir_p (dir_name);
+ status = mkdir_p (dir_name);
if (status != 0
&& status != EEXIST)
{
@@ -755,16 +958,20 @@ dirswitch (dir, repos)
return;
}
- /* Note that this call to Subdir_Register will be a noop if the parent
- directory does not yet exist (for example, if the client sends
- "Directory foo" followed by "Directory .", then the subdirectory does
- not get registered, but if the client sends "Directory ." followed
- by "Directory foo", then the subdirectory does get registered.
- This seems pretty fishy, but maybe it is the way it needs to work. */
- b = strrchr (dir_name, '/');
- *b = '\0';
- Subdir_Register ((List *) NULL, dir_name, b + 1);
- *b = '/';
+ /* We need to create adm directories in all path elements because
+ we want the server to descend them, even if the client hasn't
+ sent the appropriate "Argument xxx" command to match the
+ already-sent "Directory xxx" command. See recurse.c
+ (start_recursion) for a big discussion of this. */
+
+ status = create_adm_p (server_temp_dir, dir);
+ if (status != 0)
+ {
+ pending_error = status;
+ if (alloc_pending (80 + strlen (dir_name)))
+ sprintf (pending_error_text, "E cannot create_adm_p %s", dir_name);
+ return;
+ }
if ( CVS_CHDIR (dir_name) < 0)
{
@@ -777,14 +984,17 @@ dirswitch (dir, repos)
* This is pretty much like calling Create_Admin, but Create_Admin doesn't
* report errors in the right way for us.
*/
- if (CVS_MKDIR (CVSADM, 0777) < 0)
+ if ((CVS_MKDIR (CVSADM, 0777) < 0) && (errno != EEXIST))
{
- if (errno == EEXIST)
- /* Don't create the files again. */
- return;
pending_error = errno;
return;
}
+
+ /* The following will overwrite the contents of CVSADM_REP. This
+ is the correct behavior -- mkdir_p may have written a
+ placeholder value to this file and we need to insert the
+ correct value. */
+
f = CVS_FOPEN (CVSADM_REP, "w");
if (f == NULL)
{
@@ -1055,8 +1265,6 @@ receive_file (size, file, gzipped)
{
int fd;
char *arg = file;
- pid_t gzip_pid = 0;
- int gzip_status;
/* Write the file. */
fd = CVS_OPEN (arg, O_WRONLY | O_CREAT | O_TRUNC, 0600);
@@ -1069,15 +1277,78 @@ receive_file (size, file, gzipped)
return;
}
- /*
- * FIXME: This doesn't do anything reasonable with gunzip's stderr, which
- * means that if gunzip writes to stderr, it will cause all manner of
- * protocol violations.
- */
if (gzipped)
- fd = filter_through_gunzip (fd, 0, &gzip_pid);
+ {
+ /* Using gunzip_and_write isn't really a high-performance
+ approach, because it keeps the whole thing in memory
+ (contiguous memory, worse yet). But it seems easier to
+ code than the alternative (and less vulnerable to subtle
+ bugs). Given that this feature is mainly for
+ compatibility, that is the better tradeoff. */
+
+ int toread = size;
+ char *filebuf;
+ char *p;
- receive_partial_file (size, fd);
+ filebuf = malloc (size);
+ p = filebuf;
+ /* If NULL, we still want to read the data and discard it. */
+
+ while (toread > 0)
+ {
+ int status, nread;
+ char *data;
+
+ status = buf_read_data (buf_from_net, toread, &data, &nread);
+ if (status != 0)
+ {
+ if (status == -2)
+ pending_error = ENOMEM;
+ else
+ {
+ pending_error_text = malloc (80);
+ if (pending_error_text == NULL)
+ pending_error = ENOMEM;
+ else if (status == -1)
+ {
+ sprintf (pending_error_text,
+ "E premature end of file from client");
+ pending_error = 0;
+ }
+ else
+ {
+ sprintf (pending_error_text,
+ "E error reading from client");
+ pending_error = status;
+ }
+ }
+ return;
+ }
+
+ toread -= nread;
+
+ if (filebuf != NULL)
+ {
+ memcpy (p, data, nread);
+ p += nread;
+ }
+ }
+ if (filebuf == NULL)
+ {
+ pending_error = ENOMEM;
+ goto out;
+ }
+
+ if (gunzip_and_write (fd, file, filebuf, size))
+ {
+ if (alloc_pending (80))
+ sprintf (pending_error_text,
+ "E aborting due to compression error");
+ }
+ free (filebuf);
+ }
+ else
+ receive_partial_file (size, fd);
if (pending_error_text)
{
@@ -1091,30 +1362,25 @@ receive_file (size, file, gzipped)
/* else original string is supposed to be unchanged */
}
+ out:
if (close (fd) < 0 && !error_pending ())
{
pending_error_text = malloc (40 + strlen (arg));
if (pending_error_text)
sprintf (pending_error_text, "E cannot close %s", arg);
pending_error = errno;
- if (gzip_pid)
- waitpid (gzip_pid, (int *) 0, 0);
return;
}
-
- if (gzip_pid)
- {
- if (waitpid (gzip_pid, &gzip_status, 0) != gzip_pid)
- error (1, errno, "waiting for gunzip process %ld",
- (long) gzip_pid);
- else if (gzip_status != 0)
- error (1, 0, "gunzip exited %d", gzip_status);
- }
}
/* Kopt for the next file sent in Modified or Is-modified. */
static char *kopt;
+/* Timestamp (Checkin-time) for next file sent in Modified or
+ Is-modified. */
+static int checkin_time_valid;
+static time_t checkin_time;
+
static void serve_modified PROTO ((char *));
static void
@@ -1218,6 +1484,22 @@ serve_modified (arg)
if (error_pending ()) return;
}
+ if (checkin_time_valid)
+ {
+ struct utimbuf t;
+
+ memset (&t, 0, sizeof (t));
+ t.modtime = t.actime = checkin_time;
+ if (utime (arg, &t) < 0)
+ {
+ pending_error = errno;
+ if (alloc_pending (80 + strlen (arg)))
+ sprintf (pending_error_text, "E cannot utime %s", arg);
+ return;
+ }
+ checkin_time_valid = 0;
+ }
+
{
int status = change_mode (arg, mode_text, 0);
free (mode_text);
@@ -1443,6 +1725,34 @@ serve_kopt (arg)
strcpy (kopt, arg);
}
+static void serve_checkin_time PROTO ((char *));
+
+static void
+serve_checkin_time (arg)
+ char *arg;
+{
+ if (error_pending ())
+ return;
+
+ if (checkin_time_valid)
+ {
+ if (alloc_pending (80 + strlen (arg)))
+ sprintf (pending_error_text,
+ "E protocol error: duplicate Checkin-time request: %s",
+ arg);
+ return;
+ }
+
+ checkin_time = get_date (arg, NULL);
+ if (checkin_time == (time_t)-1)
+ {
+ if (alloc_pending (80 + strlen (arg)))
+ sprintf (pending_error_text, "E cannot parse date %s", arg);
+ return;
+ }
+ checkin_time_valid = 1;
+}
+
static void
server_write_entries ()
{
@@ -2879,8 +3189,8 @@ server_register (name, version, timestamp, options, tag, date, conflict)
if (trace)
{
(void) fprintf (stderr,
- "%c-> server_register(%s, %s, %s, %s, %s, %s, %s)\n",
- (server_active) ? 'S' : ' ', /* silly */
+ "%s-> server_register(%s, %s, %s, %s, %s, %s, %s)\n",
+ CLIENT_SERVER_STR,
name, version, timestamp ? timestamp : "", options,
tag ? tag : "", date ? date : "",
conflict ? conflict : "");
@@ -3346,6 +3656,12 @@ server_copy_file (file, update_dir, repository, newfile)
char *repository;
char *newfile;
{
+ /* At least for now, our practice is to have the server enforce
+ noexec for the repository and the client enforce it for the
+ working directory. This might want more thought, and/or
+ documentation in cvsclient.texi (other responses do it
+ differently). */
+
if (!supported_response ("Copy-file"))
return;
buf_output0 (protocol, "Copy-file ");
@@ -3364,33 +3680,21 @@ server_modtime (finfo, vers_ts)
Vers_TS *vers_ts;
{
char date[MAXDATELEN];
- int year, month, day, hour, minute, second;
- /* Note that these strings are specified in RFC822 and do not vary
- according to locale. */
- static const char *const month_names[] =
- {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
+ char outdate[MAXDATELEN];
assert (vers_ts->vn_rcs != NULL);
if (!supported_response ("Mod-time"))
return;
- /* The only hard part about this routine is converting the date
- formats. In terms of functionality it all boils down to the
- call to RCS_getrevtime. */
if (RCS_getrevtime (finfo->rcs, vers_ts->vn_rcs, date, 0) == (time_t) -1)
/* FIXME? should we be printing some kind of warning? For one
thing I'm not 100% sure whether this happens in non-error
circumstances. */
return;
-
- sscanf (date, SDATEFORM, &year, &month, &day, &hour, &minute, &second);
- sprintf (date, "%d %s %d %d:%d:%d -0000", day,
- month < 1 || month > 12 ? "???" : month_names[month - 1],
- year, hour, minute, second);
+ date_to_internet (outdate, date);
buf_output0 (protocol, "Mod-time ");
- buf_output0 (protocol, date);
+ buf_output0 (protocol, outdate);
buf_output0 (protocol, "\n");
}
@@ -3438,6 +3742,12 @@ server_updated (finfo, vers, updated, mode, checksum, filebuf)
unsigned long size;
char size_text[80];
+ /* The contents of the file will be in one of filebuf,
+ list/last, or here. */
+ unsigned char *file;
+ size_t file_allocated;
+ size_t file_used;
+
if (filebuf != NULL)
{
size = buf_length (filebuf);
@@ -3546,6 +3856,11 @@ CVS server internal error: no mode in server_updated");
}
list = last = NULL;
+
+ file = NULL;
+ file_allocated = 0;
+ file_used = 0;
+
if (size > 0)
{
/* Throughout this section we use binary mode to read the
@@ -3561,8 +3876,14 @@ CVS server internal error: no mode in server_updated");
*/
&& size > 100)
{
- int status, fd, gzip_status;
- pid_t gzip_pid;
+ /* Basing this routine on read_and_gzip is not a
+ high-performance approach. But it seems easier
+ to code than the alternative (and less
+ vulnerable to subtle bugs). Given that this feature
+ is mainly for compatibility, that is the better
+ tradeoff. */
+
+ int fd;
/* Callers must avoid passing us a buffer if
file_gzip_level is set. We could handle this case,
@@ -3575,22 +3896,13 @@ CVS server internal error: unhandled case in server_updated");
fd = CVS_OPEN (finfo->file, O_RDONLY | OPEN_BINARY, 0);
if (fd < 0)
error (1, errno, "reading %s", finfo->fullname);
- fd = filter_through_gzip (fd, 1, file_gzip_level, &gzip_pid);
- f = fdopen (fd, "rb");
- status = buf_read_file_to_eof (f, &list, &last);
- size = buf_chain_length (list);
- if (status == -2)
- (*protocol->memory_error) (protocol);
- else if (status != 0)
- error (1, ferror (f) ? errno : 0, "reading %s",
- finfo->fullname);
- if (fclose (f) == EOF)
+ if (read_and_gzip (fd, finfo->fullname, &file,
+ &file_allocated, &file_used,
+ file_gzip_level))
+ error (1, 0, "aborting due to compression error");
+ size = file_used;
+ if (close (fd) < 0)
error (1, errno, "reading %s", finfo->fullname);
- if (waitpid (gzip_pid, &gzip_status, 0) == -1)
- error (1, errno, "waiting for gzip process %ld",
- (long) gzip_pid);
- else if (gzip_status != 0)
- error (1, 0, "gzip exited %d", gzip_status);
/* Prepending length with "z" is flag for using gzip here. */
buf_output0 (protocol, "z");
}
@@ -3615,7 +3927,13 @@ CVS server internal error: unhandled case in server_updated");
sprintf (size_text, "%lu\n", size);
buf_output0 (protocol, size_text);
- if (filebuf == NULL)
+ if (file != NULL)
+ {
+ buf_output (protocol, file, file_used);
+ free (file);
+ file = NULL;
+ }
+ else if (filebuf == NULL)
buf_append_data (protocol, list, last);
else
{
@@ -3638,7 +3956,11 @@ CVS server internal error: unhandled case in server_updated");
/* But if we are joining, we'll need the file when we call
join_file. */
&& !joining ())
- CVS_UNLINK (finfo->file);
+ {
+ if (CVS_UNLINK (finfo->file) < 0)
+ error (0, errno, "cannot remove temp file for %s",
+ finfo->fullname);
+ }
}
else if (scratched_file != NULL && entries_line == NULL)
{
@@ -4133,78 +4455,81 @@ struct request requests[] =
#define REQ_LINE(n, f, s) {n, s}
#endif
- REQ_LINE("Root", serve_root, rq_essential),
- REQ_LINE("Valid-responses", serve_valid_responses, rq_essential),
- REQ_LINE("valid-requests", serve_valid_requests, rq_essential),
- REQ_LINE("Repository", serve_repository, rq_optional),
- REQ_LINE("Directory", serve_directory, rq_essential),
- REQ_LINE("Max-dotdot", serve_max_dotdot, rq_optional),
- REQ_LINE("Static-directory", serve_static_directory, rq_optional),
- REQ_LINE("Sticky", serve_sticky, rq_optional),
- REQ_LINE("Checkin-prog", serve_checkin_prog, rq_optional),
- REQ_LINE("Update-prog", serve_update_prog, rq_optional),
- REQ_LINE("Entry", serve_entry, rq_essential),
- REQ_LINE("Kopt", serve_kopt, rq_optional),
- REQ_LINE("Modified", serve_modified, rq_essential),
- REQ_LINE("Is-modified", serve_is_modified, rq_optional),
+ REQ_LINE("Root", serve_root, RQ_ESSENTIAL | RQ_ROOTLESS),
+ REQ_LINE("Valid-responses", serve_valid_responses,
+ RQ_ESSENTIAL | RQ_ROOTLESS),
+ REQ_LINE("valid-requests", serve_valid_requests,
+ RQ_ESSENTIAL | RQ_ROOTLESS),
+ REQ_LINE("Repository", serve_repository, 0),
+ REQ_LINE("Directory", serve_directory, RQ_ESSENTIAL),
+ REQ_LINE("Max-dotdot", serve_max_dotdot, 0),
+ REQ_LINE("Static-directory", serve_static_directory, 0),
+ REQ_LINE("Sticky", serve_sticky, 0),
+ REQ_LINE("Checkin-prog", serve_checkin_prog, 0),
+ REQ_LINE("Update-prog", serve_update_prog, 0),
+ REQ_LINE("Entry", serve_entry, RQ_ESSENTIAL),
+ REQ_LINE("Kopt", serve_kopt, 0),
+ REQ_LINE("Checkin-time", serve_checkin_time, 0),
+ REQ_LINE("Modified", serve_modified, RQ_ESSENTIAL),
+ REQ_LINE("Is-modified", serve_is_modified, 0),
/* The client must send this request to interoperate with CVS 1.5
through 1.9 servers. The server must support it (although it can
be and is a noop) to interoperate with CVS 1.5 to 1.9 clients. */
- REQ_LINE("UseUnchanged", serve_enable_unchanged, rq_enableme),
-
- REQ_LINE("Unchanged", serve_unchanged, rq_essential),
- REQ_LINE("Notify", serve_notify, rq_optional),
- REQ_LINE("Questionable", serve_questionable, rq_optional),
- REQ_LINE("Case", serve_case, rq_optional),
- REQ_LINE("Argument", serve_argument, rq_essential),
- REQ_LINE("Argumentx", serve_argumentx, rq_essential),
- REQ_LINE("Global_option", serve_global_option, rq_optional),
- REQ_LINE("Gzip-stream", serve_gzip_stream, rq_optional),
+ REQ_LINE("UseUnchanged", serve_enable_unchanged, RQ_ENABLEME | RQ_ROOTLESS),
+
+ REQ_LINE("Unchanged", serve_unchanged, RQ_ESSENTIAL),
+ REQ_LINE("Notify", serve_notify, 0),
+ REQ_LINE("Questionable", serve_questionable, 0),
+ REQ_LINE("Case", serve_case, 0),
+ REQ_LINE("Argument", serve_argument, RQ_ESSENTIAL),
+ REQ_LINE("Argumentx", serve_argumentx, RQ_ESSENTIAL),
+ REQ_LINE("Global_option", serve_global_option, 0),
+ REQ_LINE("Gzip-stream", serve_gzip_stream, 0),
REQ_LINE("wrapper-sendme-rcsOptions",
serve_wrapper_sendme_rcs_options,
- rq_optional),
- REQ_LINE("Set", serve_set, rq_optional),
+ 0),
+ REQ_LINE("Set", serve_set, RQ_ROOTLESS),
#ifdef ENCRYPTION
# ifdef HAVE_KERBEROS
- REQ_LINE("Kerberos-encrypt", serve_kerberos_encrypt, rq_optional),
+ REQ_LINE("Kerberos-encrypt", serve_kerberos_encrypt, 0),
# endif
# ifdef HAVE_GSSAPI
- REQ_LINE("Gssapi-encrypt", serve_gssapi_encrypt, rq_optional),
+ REQ_LINE("Gssapi-encrypt", serve_gssapi_encrypt, 0),
# endif
#endif
#ifdef HAVE_GSSAPI
- REQ_LINE("Gssapi-authenticate", serve_gssapi_authenticate, rq_optional),
+ REQ_LINE("Gssapi-authenticate", serve_gssapi_authenticate, 0),
#endif
- REQ_LINE("expand-modules", serve_expand_modules, rq_optional),
- REQ_LINE("ci", serve_ci, rq_essential),
- REQ_LINE("co", serve_co, rq_essential),
- REQ_LINE("update", serve_update, rq_essential),
- REQ_LINE("diff", serve_diff, rq_optional),
- REQ_LINE("log", serve_log, rq_optional),
- REQ_LINE("add", serve_add, rq_optional),
- REQ_LINE("remove", serve_remove, rq_optional),
- REQ_LINE("update-patches", serve_ignore, rq_optional),
- REQ_LINE("gzip-file-contents", serve_gzip_contents, rq_optional),
- REQ_LINE("status", serve_status, rq_optional),
- REQ_LINE("rdiff", serve_rdiff, rq_optional),
- REQ_LINE("tag", serve_tag, rq_optional),
- REQ_LINE("rtag", serve_rtag, rq_optional),
- REQ_LINE("import", serve_import, rq_optional),
- REQ_LINE("admin", serve_admin, rq_optional),
- REQ_LINE("export", serve_export, rq_optional),
- REQ_LINE("history", serve_history, rq_optional),
- REQ_LINE("release", serve_release, rq_optional),
- REQ_LINE("watch-on", serve_watch_on, rq_optional),
- REQ_LINE("watch-off", serve_watch_off, rq_optional),
- REQ_LINE("watch-add", serve_watch_add, rq_optional),
- REQ_LINE("watch-remove", serve_watch_remove, rq_optional),
- REQ_LINE("watchers", serve_watchers, rq_optional),
- REQ_LINE("editors", serve_editors, rq_optional),
- REQ_LINE("init", serve_init, rq_optional),
- REQ_LINE("annotate", serve_annotate, rq_optional),
- REQ_LINE("noop", serve_noop, rq_optional),
- REQ_LINE(NULL, NULL, rq_optional)
+ REQ_LINE("expand-modules", serve_expand_modules, 0),
+ REQ_LINE("ci", serve_ci, RQ_ESSENTIAL),
+ REQ_LINE("co", serve_co, RQ_ESSENTIAL),
+ REQ_LINE("update", serve_update, RQ_ESSENTIAL),
+ REQ_LINE("diff", serve_diff, 0),
+ REQ_LINE("log", serve_log, 0),
+ REQ_LINE("add", serve_add, 0),
+ REQ_LINE("remove", serve_remove, 0),
+ REQ_LINE("update-patches", serve_ignore, 0),
+ REQ_LINE("gzip-file-contents", serve_gzip_contents, 0),
+ REQ_LINE("status", serve_status, 0),
+ REQ_LINE("rdiff", serve_rdiff, 0),
+ REQ_LINE("tag", serve_tag, 0),
+ REQ_LINE("rtag", serve_rtag, 0),
+ REQ_LINE("import", serve_import, 0),
+ REQ_LINE("admin", serve_admin, 0),
+ REQ_LINE("export", serve_export, 0),
+ REQ_LINE("history", serve_history, 0),
+ REQ_LINE("release", serve_release, 0),
+ REQ_LINE("watch-on", serve_watch_on, 0),
+ REQ_LINE("watch-off", serve_watch_off, 0),
+ REQ_LINE("watch-add", serve_watch_add, 0),
+ REQ_LINE("watch-remove", serve_watch_remove, 0),
+ REQ_LINE("watchers", serve_watchers, 0),
+ REQ_LINE("editors", serve_editors, 0),
+ REQ_LINE("init", serve_init, RQ_ROOTLESS),
+ REQ_LINE("annotate", serve_annotate, 0),
+ REQ_LINE("noop", serve_noop, 0),
+ REQ_LINE(NULL, NULL, 0)
#undef REQ_LINE
};
@@ -4605,7 +4930,16 @@ error ENOMEM Virtual memory exhausted.\n");
* "co".
*/
continue;
- (*rq->func) (cmd);
+
+ if (!(rq->flags & RQ_ROOTLESS)
+ && CVSroot_directory == NULL)
+ {
+ if (alloc_pending (80))
+ sprintf (pending_error_text,
+ "E Protocol error: Root request missing");
+ }
+ else
+ (*rq->func) (cmd);
break;
}
if (rq->name == NULL)
diff --git a/gnu/usr.bin/cvs/src/update.c b/gnu/usr.bin/cvs/src/update.c
index a376a02c12c..d661dc1dad1 100644
--- a/gnu/usr.bin/cvs/src/update.c
+++ b/gnu/usr.bin/cvs/src/update.c
@@ -1,32 +1,32 @@
/*
* Copyright (c) 1992, Brian Berliner and Jeff Polk
* Copyright (c) 1989-1992, Brian Berliner
- *
+ *
* You may distribute under the terms of the GNU General Public License as
* specified in the README file that comes with the CVS source distribution.
- *
+ *
* "update" updates the version in the present directory with respect to the RCS
* repository. The present version must have been created by "checkout". The
* user can keep up-to-date by calling "update" whenever he feels like it.
- *
+ *
* The present version can be committed by "commit", but this keeps the version
* in tact.
- *
+ *
* Arguments following the options are taken to be file names to be updated,
* rather than updating the entire directory.
- *
+ *
* Modified or non-existent RCS files are checked out and reported as U
* <user_file>
- *
+ *
* Modified user files are reported as M <user_file>. If both the RCS file and
* the user file have been modified, the user file is replaced by the result
* of rcsmerge, and a backup file is written for the user in .#file.version.
* If this throws up irreconcilable differences, the file is reported as C
* <user_file>, and as M <user_file> otherwise.
- *
+ *
* Files added but not yet committed are reported as A <user_file>. Files
* removed but not yet committed are reported as R <user_file>.
- *
+ *
* If the current directory contains subdirectories that hold concurrent
* versions, these are updated too. If the -d option was specified, new
* directories added to the repository are automatically created and updated
@@ -284,11 +284,11 @@ update (argc, argv)
if (failed_patches == NULL)
{
- send_file_names (argc, argv, SEND_EXPAND_WILD);
/* If noexec, probably could be setting SEND_NO_CONTENTS.
Same caveats as for "cvs status" apply. */
send_files (argc, argv, local, aflag,
update_build_dirs ? SEND_BUILD_DIRS : 0);
+ send_file_names (argc, argv, SEND_EXPAND_WILD);
}
else
{
@@ -304,10 +304,13 @@ update (argc, argv)
}
for (i = 0; i < failed_patches_count; i++)
- (void) unlink_file (failed_patches[i]);
- send_file_names (failed_patches_count, failed_patches, 0);
+ if (unlink_file (failed_patches[i]) < 0
+ && !existence_error (errno))
+ error (0, errno, "cannot remove %s",
+ failed_patches[i]);
send_files (failed_patches_count, failed_patches, local,
aflag, update_build_dirs ? SEND_BUILD_DIRS : 0);
+ send_file_names (failed_patches_count, failed_patches, 0);
}
failed_patches = NULL;
@@ -631,15 +634,7 @@ update_fileproc (callerdat, finfo)
write_letter (finfo, 'C');
break;
case T_NEEDS_MERGE: /* needs merging */
- if (noexec)
- {
- retval = 1;
- write_letter (finfo, 'C');
- }
- else
- {
- retval = merge_file (finfo, vers);
- }
+ retval = merge_file (finfo, vers);
break;
case T_MODIFIED: /* locally modified */
retval = 0;
@@ -874,6 +869,28 @@ update_dirent_proc (callerdat, dir, repository, update_dir, entries)
if (!update_build_dirs)
return (R_SKIP_ALL);
+ /* Various CVS administrators are in the habit of removing
+ the repository directory for things they don't want any
+ more. I've even been known to do it myself (on rare
+ occasions). Not the usual recommended practice, but we
+ want to try to come up with some kind of
+ reasonable/documented/sensible behavior. Generally
+ the behavior is to just skip over that directory (see
+ dirs test in sanity.sh; the case which reaches here
+ is when update -d is specified, and the working directory
+ is gone but the subdirectory is still mentioned in
+ CVS/Entries). */
+ if (1
+#ifdef SERVER_SUPPORT
+ /* In the remote case, the client should refrain from
+ sending us the directory in the first place. So we
+ want to continue to give an error, so clients make
+ sure to do this. */
+ && !server_active
+#endif
+ && !isdir (repository))
+ return R_SKIP_ALL;
+
if (noexec)
{
/* ignore the missing dir if -n is specified */
@@ -1285,11 +1302,14 @@ VERS: ", 0);
{
Vers_TS *xvers_ts;
- if (revbuf != NULL)
+ if (revbuf != NULL && !noexec)
{
struct stat sb;
- /* FIXME: We should have RCS_checkout return the mode. */
+ /* FIXME: We should have RCS_checkout return the mode.
+ That would also fix the kludge with noexec, above, which
+ is here only because noexec doesn't write srcfile->path
+ for us to stat. */
if (stat (vers_ts->srcfile->path, &sb) < 0)
error (1, errno, "cannot stat %s",
vers_ts->srcfile->path);
@@ -1489,7 +1509,7 @@ struct patch_file_data
/* Whether to compute the MD5 checksum. */
int compute_checksum;
/* Data structure for computing the MD5 checksum. */
- struct MD5Context context;
+ struct cvs_MD5Context context;
/* Set if the file has a final newline. */
int final_nl;
};
@@ -1569,7 +1589,11 @@ patch_file (finfo, vers_ts, docheckout, file_info, checksum)
if (isfile (finfo->file))
rename_file (finfo->file, backup);
else
- (void) unlink_file (backup);
+ {
+ if (unlink_file (backup) < 0
+ && !existence_error (errno))
+ error (0, errno, "cannot remove %s", backup);
+ }
file1 = xmalloc (strlen (finfo->file)
+ sizeof (CVSADM)
@@ -1618,7 +1642,7 @@ patch_file (finfo, vers_ts, docheckout, file_info, checksum)
data.fp = e;
data.final_nl = 0;
data.compute_checksum = 1;
- MD5Init (&data.context);
+ cvs_MD5Init (&data.context);
retcode = RCS_checkout (vers_ts->srcfile, (char *) NULL,
vers_ts->vn_rcs, (char *) NULL,
@@ -1631,7 +1655,7 @@ patch_file (finfo, vers_ts, docheckout, file_info, checksum)
if (retcode != 0 || ! data.final_nl)
fail = 1;
else
- MD5Final (checksum, &data.context);
+ cvs_MD5Final (checksum, &data.context);
}
retcode = 0;
@@ -1766,9 +1790,15 @@ patch_file (finfo, vers_ts, docheckout, file_info, checksum)
retval = retcode;
}
- (void) unlink_file (backup);
- (void) unlink_file (file1);
- (void) unlink_file (file2);
+ if (unlink_file (backup) < 0
+ && !existence_error (errno))
+ error (0, errno, "cannot remove %s", backup);
+ if (unlink_file (file1) < 0
+ && !existence_error (errno))
+ error (0, errno, "cannot remove %s", file1);
+ if (unlink_file (file2) < 0
+ && !existence_error (errno))
+ error (0, errno, "cannot remove %s", file2);
free (backup);
free (file1);
@@ -1794,7 +1824,7 @@ patch_file_write (callerdat, buffer, len)
data->final_nl = (buffer[len - 1] == '\n');
if (data->compute_checksum)
- MD5Update (&data->context, (unsigned char *) buffer, len);
+ cvs_MD5Update (&data->context, (unsigned char *) buffer, len);
}
#endif /* SERVER_SUPPORT */
@@ -1870,7 +1900,8 @@ merge_file (finfo, vers)
+ 10);
(void) sprintf (backup, "%s%s.%s", BAKPREFIX, finfo->file, vers->vn_user);
- (void) unlink_file (backup);
+ if (unlink_file (backup) && !existence_error (errno))
+ error (0, errno, "unable to remove %s", backup);
copy_file (finfo->file, backup);
xchmod (finfo->file, 1);
@@ -1973,10 +2004,17 @@ merge_file (finfo, vers)
}
#endif
+ /* FIXME: the noexec case is broken. RCS_merge could be doing the
+ xcmp on the temporary files without much hassle, I think. */
if (!noexec && !xcmp (backup, finfo->file))
{
- printf ("%s already contains the differences between %s and %s\n",
- finfo->fullname, vers->vn_user, vers->vn_rcs);
+ cvs_output (finfo->fullname, 0);
+ cvs_output (" already contains the differences between ", 0);
+ cvs_output (vers->vn_user, 0);
+ cvs_output (" and ", 0);
+ cvs_output (vers->vn_rcs, 0);
+ cvs_output ("\n", 1);
+
history_write ('G', finfo->update_dir, vers->vn_rcs, finfo->file,
finfo->repository);
retval = 0;
@@ -1985,8 +2023,7 @@ merge_file (finfo, vers)
if (status == 1)
{
- if (!noexec)
- error (0, 0, "conflicts found in %s", finfo->fullname);
+ error (0, 0, "conflicts found in %s", finfo->fullname);
write_letter (finfo, 'C');
@@ -2337,7 +2374,9 @@ join_file (finfo, vers)
+ 10);
(void) sprintf (backup, "%s%s.%s", BAKPREFIX, finfo->file, vers->vn_user);
- (void) unlink_file (backup);
+ if (unlink_file (backup) < 0
+ && !existence_error (errno))
+ error (0, errno, "cannot remove %s", backup);
copy_file (finfo->file, backup);
xchmod (finfo->file, 1);
diff --git a/gnu/usr.bin/cvs/tools/pcl-cvs/.cvsignore b/gnu/usr.bin/cvs/tools/pcl-cvs/.cvsignore
deleted file mode 100644
index d8c4f2ace56..00000000000
--- a/gnu/usr.bin/cvs/tools/pcl-cvs/.cvsignore
+++ /dev/null
@@ -1,19 +0,0 @@
-Makefile
-pcl-cvs.info*
-pcl-cvs.aux
-pcl-cvs.cp
-pcl-cvs.cps
-pcl-cvs.dvi
-pcl-cvs.fn
-pcl-cvs.fns
-pcl-cvs.ky
-pcl-cvs.kys
-pcl-cvs.log
-pcl-cvs.pg
-pcl-cvs.pgs
-pcl-cvs.toc
-pcl-cvs.tp
-pcl-cvs.tps
-pcl-cvs.vr
-pcl-cvs.vrs
-pcl-cvs.ps
diff --git a/gnu/usr.bin/cvs/tools/pcl-cvs/ChangeLog b/gnu/usr.bin/cvs/tools/pcl-cvs/ChangeLog
deleted file mode 100644
index 0192b937b6d..00000000000
--- a/gnu/usr.bin/cvs/tools/pcl-cvs/ChangeLog
+++ /dev/null
@@ -1,891 +0,0 @@
-Mon Apr 15 01:34:27 1996 Karl Fogel <kfogel@floss.red-bean.com>
-
- * Makefile: removed. Why was this in the repository in the first
- place?
-
- * Makefile.in (BATCHFLAGS): don't pass -q to Emacs when compiling,
- because Emacs probably can't find Elib's cookie.el[c] if we do
- that. (Actually, it still can't, but that may be due to a bug in
- Emacs).
-
- * INSTALL: reflect changed location of elib in the CVS dist.
-
-Sun Apr 14 12:18:12 1996 Karl Fogel <kfogel@floss.red-bean.com>
-
- * pcl-cvs.el (cookie): Changed "(load \"cookie\")" to
- "(require 'cookie)", since elib is now included again.
- Moved "(provide 'pcl-cvs)" to the end of the file, so it's not
- provided if the package didn't load successfully.
-
- * Makefile.in (subdir): tools/pcl-cvs now, not contrib/pcl-cvs.
- (BATCHFLAGS): removed "-n" from BATCHFLAGS. Emacs 19.30 does not
- know about this flag.
- (OBJDIR_DISTFILES): don't include .elc files here, add comment
- explaining why.
-
-Thu Apr 11 20:22:34 1996 Karl Fogel <kfogel@floss.red-bean.com>
-
- * pcl-cvs.el (cvs-mode-map): conform to Emacs 19 keybinding
- conventions by not binding any regular letters under C-c.
-
-Fri Feb 9 14:29:07 1996 Jim Blandy <jimb@totoro.cyclic.com>
-
- * Makefile.in (mostlyclean clean realclean): Remove 'realclean'
- from this target list; it's already defined later in the file.
-
-Tue Jan 23 13:02:24 1996 Greg A. Woods <woods@most.weird.com>
-
- * pcl-cvs.el (pcl-cvs-bugs-address): change the default address
- as suggested by Per Cederqvist.
- * pcl-cvs.el: removed comments refering to Signum, etc.
-
-Sun Jan 21 12:51:12 1996 Greg A. Woods <woods@most.weird.com>
-
- * pcl-cvs.el (cvs-parse-stderr): fix typo (missing '\') that was
- causing occasional un-reported, un-traced, failures that simply
- said something like "RE missing '\(' or '\\('" -- hopefully this
- is the last such bug!
-
-Tue Jan 16 13:57:16 1996 Jim Kingdon <kingdon@harvey.cyclic.com>
-
- * Makefile.in: Rename "dist" target back to "dist-dir". The
- latter is what actually gets used.
- (pcl-cvs.dvi): Restore srcdir to pcl-cvs.texinfo. Fix typo
- (pcl-cvs.texifo -> pcl-cvs.texinfo).
- (TEXINDEX,TEX,SET_TEXINPUTS): New variables.
- (.el.elc): Copy .el file to build dir so .elc file gets put there.
- (dist-dir): Fix typo (cvs.info -> pcl-cvs.info).
- * cookie.el: New file, copied from elib 1.0.
- * README: Remove note about requiring elib; it claimed that CVS
- contained a copy of elib, but it lied.
- * pcl-cvs.el: Change (require 'cookie) to (load "cookie.el").
- * pcl-cvs-lucid.el: Change (require 'pcl-cvs) to (load "pcl-cvs.el").
-
-Fri Jan 12 10:32:14 1996 Greg A. Woods <woods@most.weird.com>
-
- * pcl-cvs.elc, pcl-cvs-lucid.elc: removed
-
- * pcl-cvs.el: run through the spell checker...
- - noted some free variables in comments
- (cvs-inhibit-copyright-message): move this above
- cvs-startup-message to keep the compiler quiet
-
- * compile-all.el: removed (use make for dependency checking!)
-
- * Makefile.in: tweak various comments and echo messages...
- (elcfiles): removed this target.
- (.SUFFIXES, .el.elc): added support for elisp files.
- (CORE): new macro -- list of files all .elc depend on [still empty]
- (BATCHFLAGS): new macro -- flags to pass to emacs
- (OBJDIR_DISTFILES): added ELCFILES to be shipped in distribution
-
- * README: fix the RCS Id.
-
- * INSTALL: re-copy formatted makeinfo output from pcl-cvs.info,
- just to keep everything in proper synchronisation.
-
- * pcl-cvs.texinfo (Pcl-cvs installation): update to match Karl's
- new wording from INSTALL.
-
-Wed Jan 10 22:04:35 1996 Karl Fogel <kfogel@floss.red-bean.com>
-
- * INSTALL: make first item read a little more smoothly.
-
- * README: note that pcl-cvs has been tested under 19.30.
-
-Wed Jan 10 17:59:00 1996 Greg A. Woods <woods@most.weird.com>
-
- * ChangeLog.woods: these are changes integrated in from my
- own pcl-cvs repository module, and based on the original PCL-CVS
- Version 1.05 release. They include most, if not all, of the
- changes from the Cygnus and Cyclic CVS contrib versions of
- PCL-CVS (i.e. the changes noted below).
-
-Sat Dec 30 15:01:45 1995 Karl Fogel <kfogel@floss.cyclic.com>
-
- * pcl-cvs.el (cvs-changelog-ours-p): check that
- `add-log-full-name' and `add-log-mailing-address' are non-nil, in
- addition to checking that they are boundp.
-
-Thu Dec 21 16:45:48 1995 Karl Fogel <kfogel@occs.cs.oberlin.edu>
-
- * pcl-cvs.el (cvs-parse-stderr): ignore kerberos connection
- failure, since CVS will automatically try rsh next. I think this
- is okay because if a person needs to know that kerberos failed,
- then chances are the rsh failed too, and *that* error message will
- clue them in that something's afoot.
-
-Wed Nov 22 11:01:50 1995 Joshua Cowan <jcowan@hermit.reslife.okstate.edu>
-
- * pcl-cvs.el (cvs-changelog-ours-p): use `user-full-name' if
- `add-log-full-name' unbound, as not every uses the stuff in
- add-log.el. Same with `add-log-mailing-address'.
- (cvs-changelog-entries): change to `change-log-mode' unless
- already in it.
-
-Sun Jul 9 20:57:11 1995 Karl Fogel <kfogel@floss.cyclic.com>
-
- * "/bin/rmdir" as default, not "/usr/local/bin/rmdir".
-
-Fri Jun 16 15:24:34 1995 Jim Kingdon (kingdon@cyclic.com)
-
- * pcl-cvs.elc, pcl-cvs-lucid.elc: Added.
-
- * Makefile.in: Rename from Makefile and set srcdir.
-
-Thu May 18 17:10:27 1995 Jim Blandy <jimb@totoro.bio.indiana.edu>
-
- Automatically guess CVS log entries from ChangeLog contents.
- * pcl-cvs.el (cvs-mode-changelog-commit): New command.
- (cvs-changelog-full-paragraphs): New variable.
- (cvs-changelog-name, cvs-narrow-changelog,
- cvs-changelog-paragraph, cvs-changelog-subparagraph,
- cvs-changelog-entry, cvs-changelog-ours-p, cvs-relative-path,
- cvs-changelog-entries, cvs-changelog-insert-entries, cvs-union,
- cvs-insert-changelog-entries, cvs-edit-delete-common-indentation):
- New functions.
- (cvs-mode-map): Bind 'C' to cvs-mode-changelog-commit.
- (cvs-mode): Mention cvs-mode-changelog-commit in docstring.
-
- Give the info files names ending in ".info".
- * Makefile (INFOFILES, install_info): Change pcl-cvs to
- pcl-cvs.info.
- (pcl-cvs.info): Target renamed from pcl-cvs.
- (DISTFILES): pcl-cvs removed; we handle the info files explicitly
- in the dist-dir target.
- (dist-dir): Depend on pcl-cvs.info. Distribute pcl-cvs.info*.
- * pcl-cvs.texinfo: Change @setfilename appropriately.
- * INSTALL: Updated.
- * .cvsignore: Correctly ignore the info files.
-
- * README: Note that pcl-cvs has been tested under 19.28, and that
- the "cookie" naming conflict was resolved in 19.11.
-
- * Makefile (pcl-cvs-lucid.elc): Changed this target from
- pcl-cvs-lucid.el. That's a source file, for goodness' sake!
-
-Tue May 9 13:56:50 1995 Jim Blandy <jimb@totoro.bio.indiana.edu>
-
- * Change references to "Cygnus's remote CVS" to "Cyclic CVS".
-
-Wed May 3 13:55:27 1995 Jim Blandy <jimb@totoro.bio.indiana.edu>
-
- * pcl-cvs.el (cvs-parse-stderr): Handle colons after both
- "rcsmerge" and "warning".
-
-Fri Apr 28 22:38:14 1995 Jim Blandy <jimb@totoro.bio.indiana.edu>
-
- * Makefile (ELFILES): Include pcl-cvs-startup.el.
- (info, pcl-cvs): Call makeinfo appropriately for modern versions.
- (pcl-cvs.aux): List dependency on pcl-cvs.texinfo.
- (pcl-cvs.ps): New target.
- (DVIPS): New variable.
- (dist-dir): Renamed from dist, updated to accept DISTDIR value
- passed from parent.
- (DISTFILES): New varible.
- (pcl-cvs.elc, pcl-cvs-lucid.elc): Add targets to elcfiles target.
-
-Tue Apr 25 21:33:49 1995 Jim Blandy <jimb@totoro.bio.indiana.edu>
-
- * pcl-cvs.el: (cvs-parse-stderr): Recognize "conflicts" as well as
- "overlaps" before "during merge."
-
-Thu Feb 16 12:17:20 1995 Jim Blandy <jimb@totoro.bio.indiana.edu>
-
- * pcl-cvs.el (cvs-parse-stderr): Recognize "conflicts found in..."
- messages attributed to "cvs server", as well as "cvs update".
-
-Sat Feb 4 01:47:01 1995 Jim Blandy <jimb@totoro.bio.indiana.edu>
-
- * pcl-cvs.el: Deal with the 'P' action, produced by remote CVS.
- (cvs-parse-stdout): Treat 'P' like 'U' --- file is updated.
-
-Tue Jan 31 23:31:39 1995 Jim Blandy <jimb@totoro.bio.indiana.edu>
-
- * pcl-cvs.el (cvs-cvsroot-required): New variable.
- (cvs-do-update): If cvs-cvsroot-required is not set, don't complain if
- CVSROOT and cvs-cvsroot are both unset.
-
-Sun Jan 22 21:22:22 1995 Jim Blandy <jimb@totoro.bio.indiana.edu>
-
- * pcl-cvs.el (cvs-parse-stderr):
- Some changes for Cygnus's Remote CVS. Treat
- messages like "cvs server: Updating DIRECTORY" as we treat those like
- "cvs update: Updating DIRECTORY". Ignore other messages starting with
- "cvs server".
-
- * pcl-cvs.el (cvs-parse-stderr): Re-indent.
-
- * .cvsignore: Add ignore list for Texinfo litter.
-
- * Makefile (lispdir): Set appropriately for totoro.
- * pcl-cvs.el (cvs-program, cvs-diff-program, cvs-rmdir-program): Same.
-
-Tue Jun 1 00:00:03 1993 Per Cederqvist (ceder@lysator.liu.se)
-
- * Release 1.05. (This release was promised before the end of May,
- but I didn't quite make it. No, I didn't fake the date above).
-
-Mon May 31 01:32:25 1993 Per Cederqvist (ceder@lysator.liu.se)
-
- * Removed the elib sub-directory. Users must now get the Elib
- library separately.
- * pcl-cvs.texinfo: Document it.
-
- * pcl-cvs-lucid.el: A new version, supplied by Jamie Zawinsky,
- added.
-
- * pcl-cvs Id 68: Transform RCS keywords
- * Makefile (pcl-cvs-$(VER)): Remove the $ signs in most files in
- the distribution.
-
- * pcl-cvs Id 76: Extra " in cvs-mode-add.
- * pcl-cvs.el (cvs-mode-add): Don't add the extra level of quotes
- around the log message, since it doesn't work with CVS.
-
- * pcl-cvs Id 56: '-d <CVSROOT>' support in pcl-cvs
- * pcl-cvs.el (cvs-change-cvsroot): New function.
-
- * pcl-cvs Id 77: *cvs* isn't cleared properly
- * pcl-cvs.el (cvs-do-update): Always erase the *cvs* buffer and
- re-create the collection.
-
- * pcl-cvs.el (cvs-do-update): Set mode-line-process in the *cvs*
- buffer.
- * pcl-cvs.el (cvs-mode): Reset mode-line-process.
-
- * pcl-cvs Id 59: sort .cvsignore alphabetically!
- * pcl-cvs.el (cvs-sort-ignore-file): New variable.
- * pcl-cvs.el (cvs-mode-ignore): Use it.
- * pcl-cvs.texinfo: Document it.
-
- * pcl-cvs Id 75: Require final newline.
- * pcl-cvs.el (cvs-commit-buffer-require-final-newline): New
- variable.
- * pcl-cvs.el (cvs-edit-done): Use it.
- * pcl-cvs.texinfo: Document it.
-
- * pcl-cvs Id 72: make clean deletes lucid-emacs.el
- * dist-makefile (ELCFILES): Fixed a typo.
-
- * pcl-cvs Id 46: "cvs remove f" "touch f" "cvs update f" -> parse err.
- * pcl-cvs.el (cvs-fileinfo->type): New type: REM-EXIST.
- * pcl-cvs.el (cvs-shadow-entry-p): A REMOVED that follows a
- REM-EXIST is a shadow.
- * pcl-cvs.el (cvs-parse-stderr): Recognize the "should be removed
- and is still there" message.
- * pcl-cvs.el (cvs-pp): Recognize REM-EXIST.
- * pcl-cvs.el (cvs-mode-undo-local-changes): Recognize and complain
- about REM-EXIST. Defensive test added: complain about unknown types.
-
- * pcl-cvs.el (cvs-mode-add): Add an extra level of quotes around
- the log message. This is apparently needed by RCVS. <This change
- has been removed. --ceder>.
-
- * pcl-cvs.el (cvs-parse-stderr): Ignore output from RCVS.
-
-Tue Apr 27 00:48:40 1993 Per Cederqvist (ceder@lysator.liu.se)
-
- * pcl-cvs.el (cvs-startup-message): Now a defconst instead of a
- defvar.
- * pcl-cvs.el (cvs-mode-commit): Add a defvar for it.
-
- * dist-makefile (EMACS): Use $(EMACS) instead of hard-coding 'emacs'.
-
-Sat Apr 17 12:47:10 1993 Per Cederqvist (ceder@lysator.liu.se)
-
- * Release 1.04.
-
- * pcl-cvs.texinfo: Updated the Contributors node.
-
- * pcl-cvs Id 58: Lucid GNU Emacs support
- * pcl-cvs-lucid.el: New file, contributed by the people at Lucid.
- * pcl-cvs.el: Autoload pcl-cvs-lucid if running in an Lucid GNU
- Emacs.
- * compile-all.el: (files-to-compile): Add pcl-cvs-lucid.
- * dist-makefile (ELFILES, ELCFILES): Dito.
-
- * pcl-cvs Id 55: cvs-diff-backup swaps old and new version.
- * pcl-cvs.el (cvs-diff-backup-extractor): Old version should be
- first.
- * pcl-cvs.el (cvs-mode-diff-backup): Call cvs-backup-diffable
- correctly.
-
- * pcl-cvs Id 64: elib substitute
- * dist-makefile (install): Warn about Elib.
- * pcl-cvs.texinfo: Talk about Elib.
-
- * pcl-cvs Id 50: Committing the *commit* buffer twice.
- * pcl-cvs.el (cvs-edit-done): Report an error if cvs-commit-list
- is empty, and empty it when the commit is done.
-
- * pcl-cvs Id 56: '-d <CVSROOT>' support.
- * pcl-cvs.el (cvs-cvsroot): New variable.
- * pcl-cvs.el (cvs-do-update, all callers of cvs-execute-list): Use
- it everywhere CVS is called, to override CVSROOT.
- * pcl-cvs.texinfo (Customization): Document it.
-
-Thu Apr 1 00:34:55 1993 Per Cederqvist (ceder@lysator.liu.se)
-
- * pcl-cvs.el (cvs-retrieve-revision-to-tmpfile): Exit status nil
- from call-process means everything was successful in some Emacs
- versions.
-
- * pcl-cvs.el (cvs-mode-map): Bind "q" to bury-buffer.
- * pcl-cvs.texinfo: Document it.
-
-Thu Mar 11 00:05:03 1993 Per Cederqvist (ceder@lysator.liu.se)
-
- * Release 1.03-Emerge (not released).
-
- * Makefile (pcl-cvs-$(VER)): Don't includ elib-dll-debug.el in the
- distribution. (It's included as elib/dll-debug.el).
-
- * pcl-cvs.el (cvs-mode): Document the "e" key (cvs-mode-emerge).
-
-Tue Mar 9 00:02:57 1993 Per Cederqvist (ceder@lysator.liu.se)
-
- * pcl-cvs.texinfo (Emerge): New node.
-
- * pcl-cvs.el (cvs-kill-buffer-visiting): New function.
-
- * pcl-cvs.el (cvs-mode-emerge): Handle Conflict and Merged files.
-
- * pcl-cvs.el (cvs-retrieve-revision-to-tmpfile): Handle any revision.
-
- * pcl-cvs.el (cvs-fileinfo-*): Store base-revision instead of
- backup-file.
-
- * pcl-cvs.el (cvs-backup-diffable): The file is only diffable if
- the backup file is readable.
-
- * pcl-cvs.el (cvs-mode-map): Bind "e" to cvs-mode-emerge instead
- of cvs-mode-find-file (which is anyhow bound to "f").
-
-Mon Mar 8 23:06:52 1993 Per Cederqvist (ceder@lysator.liu.se)
-
- * pcl-cvs.el (cvs-mode-emerge): New function. Currently only
- handles emerge of Modified files.
-
- * pcl-cvs.el (cvs-retrieve-revision-to-tmpfile): New function.
-
-Sun Jan 24 20:07:18 1993 Per Cederqvist (ceder@lysator.liu.se)
-
- * elib-dll-debug.el: Moved to elib.
-
-Mon Jan 18 00:35:59 1993 Per Cederqvist (ceder@mauritz)
-
- * pcl-cvs.el (cvs-do-update): Added a probably unnecessary sit-for.
-
- * Release 1.03-Elib-0.05.1 (not released).
-
- * Elib 0.05 compatibility:
- * elib-dll-debug.el, pcl-cvs-buffer.el, test-dll.el: Fix the
- require strings.
- * pcl-cvs.el (cvs-pp): Insert the string.
-
- * Release 1.03-Elib-0.05 (not released).
-
- * elib: New directory, containing the parts of elib that are
- required for pcl-cvs. Changes to the files in that directory
- that are present in Elib are documented in the ChangeLog of
- Elib, not here.
- * Makefile (pcl-cvs-$(VER)): Copy the new dir to the distribution.
- * dist-makefile (ELFILES, ELCFILES): Don't include the Elib files.
-
-Fri Jan 8 02:43:49 1993 Per Cederqvist (ceder@konrad)
-
- * pcl-cvs.el (cvs-mode-map): Bind "e" to cvs-mode-find-file, like
- in dired.
-
-Sun Jan 3 23:25:13 1993 Per Cederqvist (ceder@konrad)
-
- * elib-dll.el, elib-node.el, cookie.el: Moved to the elib package.
- Pcl-cvs now requires elib.
-
-Tue Dec 29 22:06:57 1992 Per Cederqvist (ceder@konrad)
-
- * pcl-cvs.el: Tracked the latest (last?) rename of all functions
- in cookie.el.
-
-Thu Sep 24 00:29:16 1992 Per Cederqvist (ceder@robert)
-
- * pcl-cvs.texinfo (Archives): This version is not distributed with
- CVS 1.3, so don't claim that it is.
-
-Fri Aug 21 15:17:08 1992 Per Cederqvist (ceder@maskros)
-
- * pcl-cvs.el (cvs-parse-stderr): Fixed two "(set head" that should
- be "(setq head".
-
-Thu Aug 20 05:53:58 1992 Per Cederqvist (ceder@robin)
-
- * cookie.el: Changes to this file is documented in the ChangeLog
- of elib in the future.
-
-Tue Aug 18 03:30:28 1992 Per Cederqvist (ceder@robin)
-
- * pcl-cvs.el: Don't use cookie-last-tin (which no longer exists).
-
- * cookie.el: Use prefix cookie:: for internal functions.
-
- * cookie.el: (cookie:enter-after, cookie:enter-before,
- cookie:nth-cookie): Implemented.
- * cookie.el: No longer define (impl).
-
- * cookie.el: More renames:
- cookie:next-cookie -> cookie:goto-next-tin
- cookie:previous-cookie -> cookie:goto-previous-tin
- tin-next -> cookie:next-tin
- tin-previous -> cookie:previous-tin
- tin-nth -> cookie:nth-tin
- tin-delete -> cookie:delete-tin
- cookie:collect -> cookie:collect-cookies
- cookie:tin-collect -> cookie:collect-tins
- (new) -> cookie:tin-collect-cookies
- (new) -> cookie:tin-collect-tins
- cookie:refresh -> cookie:refresh-all
- tin-invalidate-tins -> cookie:invalidate-tins
-
-Mon Aug 17 01:39:49 1992 Per Cederqvist (ceder@robin)
-
- * cookie.el (cookie:set-buffer-bind-dll-let*): New macro. Used in
- many places instead of cookie:set-buffer-bind-dll.
- * cookie.el (cookie:set-buffer-bind-dll): Renamed the macro
- cookie:set-buffer to this.
-
- * pcl-cvs.el (cvs-use-temp-buffer): Set default-directory.
-
-Sun Aug 16 20:51:30 1992 Per Cederqvist (ceder@robin)
-
- * pcl-cvs.el (cvs-add-sub): Fixed call to cvs-add-file-update-buffer.
-
-Sat Aug 8 20:28:21 1992 Per Cederqvist (ceder@robin)
-
- * Release 1.03-Cookie-II (not released).
-
- * pcl-cvs.el (cvs-mode-diff-cvs): Don't care about the exit status
- from ``cvs diff''.
-
- * pcl-cvs.el (cvs-mode): Document cvs-mode-undo-local-changes.
- * pcl-cvs.el (cvs-diffable): New function.
-
- * pcl-cvs.el: Use the new cookie package.
- * pcl-cvs.el (cvs-cookie-handle): New variable.
- * pcl-cvs.el (cvs-do-update): User the new cookie:create
- interface, and cookie:clear if the buffer already existed. Make
- the buffer read-only.
- * pcl-cvs.el (cvs-mode-next-line, cvs-mode-previous-line): New
- functions (used instead of cookie:next-cookie and
- cookie:previous-cookie).
-
- * cookie.el: Major redesign. The handle that is passed to all
- cookie functions is now a new datatype, and not the buffer that
- the cookies resides in. This way it is possible to have more than
- one set of cookies in a buffer. Things that used to be
- buffer-local variables are now fields in the handle data type.
- cookie-last-tin is no longer available.
- * cookie.el (cookie:create): The buffer is not cleared, nor set to
- be read-only.
- * cookie.el (cookie:next-cookie, cookie:previous-cookie): Since
- the first argument is now a handle and not a buffer, these can no
- longer be called interactively. You have to write a small wrapper
- about them.
- * cookie.el (cookie:buffer): New function.
-
-Tue Aug 4 03:02:25 1992 Per Cederqvist (ceder@robert)
-
- * pcl-cvs.texinfo (Bugs): Renamed "Reporting bugs and ideas" to
- "Bugs" and added a table of known bugs/FAQ:s.
-
-Mon Aug 3 00:19:39 1992 Per Cederqvist (ceder@robert)
-
- * pcl-cvs.el, pcl-cvs.texinfo: Big Renaming Time!
- The commands that operate in the *cvs* buffer:
- cvs-add-change-log-entry-other-window -> cvs-mode-add-change-log-entry-other-window
- cvs-mark-all-files -> cvs-mode-mark-all-files
- cvs-revert-updated-buffers -> cvs-mode-revert-updated-buffers
- cvs-undo-local-changes -> cvs-mode-undo-local-changes
- cvs-unmark-up -> cvs-mode-unmark-up
- cvs-acknowledge -> cvs-mode-acknowledge
- cvs-unmark-all-files -> cvs-mode-unmark-all-files
- cvs-add -> cvs-mode-add
- cvs-diff-backup -> cvs-mode-diff-backup
- cvs-commit -> cvs-mode-commit
- cvs-diff-cvs -> cvs-mode-diff-cvs
- cvs-find-file -> cvs-mode-find-file
- cvs-update-no-prompt -> cvs-mode-update-no-prompt
- cvs-ignore -> cvs-mode-ignore
- cvs-log -> cvs-mode-log
- cvs-mark -> cvs-mode-mark
- cvs-find-file-other-window -> cvs-mode-find-file-other-window
- cvs-remove-file -> cvs-mode-remove-file
- cvs-status -> cvs-mode-status
- cvs-remove-handled -> cvs-mode-remove-handled
- cvs-unmark -> cvs-mode-unmark
-
- * pcl-cvs.el (cvs-cvs-diff-flags): Variable deleted.
- * pcl-cvs.el (cvs-diff-cvs): Use cvs-diff-flags instead.
- * pcl-cvs.texinfo (Customization): Update the doc.
-
- * pcl-cvs.el (cvs-diff-cvs): Handle exit status 0 (no diffs), 1
- (diffs) and other (error).
- * pcl-cvs.el (cvs-execute-list): Add support for this kind of
- thing.
-
- * Revert buffers for committed files:
- * pcl-cvs.el (cvs-auto-revert-after-commit): New variable.
- * pcl-cvs.texinfo (Committing changes, Customization): Document
- it.
- * pcl-cvs.el (cvs-after-commit-function): New function.
-
- * pcl-cvs.el (cvs-execute-list): Return the exit status or nil.
- * pcl-cvs.el (cvs-edit-done, cvs-diff-cvs, cvs-remove-file,
- cvs-undo-local-changes, cvs-add, cvs-status, cvs-log): Use the
- exit status to generate an error message.
-
-
- * pcl-cvs.el (cvs-do-update): It should be "cvs -n update -l", not
- "cvs -l update -n". Put the -n and/or -l in the message that is
- displayed in the *cvs* buffer during the update.
-
-Sat Aug 1 00:55:49 1992 Per Cederqvist (ceder@robert)
-
- * cookie.el (cookie-sort): New function.
-
- * cookie.el (cookie-clear): Rewritten. No longer clears all local
- variables.
-
-Tue Jul 28 17:21:17 1992 Per Cederqvist (ceder@robin)
-
- * pcl-cvs.el (cvs-parse-stderr): Try to handle the output from RCS
- when it is compiled without DIFF3_BIN and a conflict occurs.
-
- * pcl-cvs.texinfo (Getting Started): Fixed typo.
-
- * pcl-cvs-startup.el (cvs-update-other-window): Make the autoload
- be interactive.
-
-Mon Jul 27 19:36:40 1992 Per Cederqvist (ceder@robin)
-
- * pcl-cvs.el (cvs-revert-updated-buffers, cvs-revert-fileinfo):
- New functions.
- * pcl-cvs.texinfo (Reverting your buffers): Document it.
-
- * pcl-cvs.el (cvs-fileinfo->full-path): New function.
- * pcl-cvs.el (cvs-full-path): Use it.
-
- * cookie.el (cookie-map, cookie-map-reverse): Better doc-
- string. Removed the unused local variable 'result'.
-
- * compile-all.el: Renamed elib-files to files-to-compare.
- * compile-all.el (compile-pcl-cvs): Bind load-path in a let
- statement instead of globally.
-
-Thu Jul 23 19:02:41 1992 Per Cederqvist (ceder@robin)
-
- * pcl-cvs.el (cvs-do-update): Check that CVSROOT is set.
- * pcl-cvs.el (cvs-diff-cvs): Check that cvs-cvs-diff-flags is a
- list.
- * pcl-cvs.el (cvs-diff-backup): Check that cvs-diff-flags is a
- list.
-
-Tue Jul 21 11:27:39 1992 Per Cederqvist (ceder@robin)
-
- * pcl-cvs.el (cvs-parse-error): Make the *cvs* buffer writeable
- before trying to write the email message. Require sendmail before
- trying to switch to mail-mode.
-
- * pcl-cvs.el (cvs-do-update): Check that cvs-program exists.
-
- * pcl-cvs.el (cvs-skip-line): Fixed bracketing error.
-
-Mon Jul 20 10:31:51 1992 Per Cederqvist (ceder@robin)
-
- * Release 1.03.
-
- * pcl-cvs.el, cookie.el: Indentation fixes.
-
- * Makefile (pcl-cvs-$(VER)): Include NEWS in the distribution.
-
- * pcl-cvs.el (cvs-rm-program): Deleted.
- * pcl-cvs.el (cvs-rmdir-program, cvs-lock-file): New variables.
-
- * Handle lock files in a nicer way:
- * pcl-cvs.el (cvs-update-filter, cvs-delete-lock,
- cvs-lock-file-p): New functions.
- * pcl-cvs.el (cvs-do-update, cvs-sentinel): Redirect stdout to the
- temporary file, not stderr. Use cvs-update-filter.
- * pcl-cvs.el (cvs-parse-update): New arguments.
- * pcl-cvs.el (cvs-parse-buffer): Renamed to cvs-parse-update.
- * pcl-cvs.el (cvs-stderr-file): Renamed to cvs-stdout-file.
- * pcl-cvs.texinfo (Miscellaneous commands, Updating the
- directory): Document cvs-delete-lock.
-
- * pcl-cvs.el (cvs-mode): Don't reset buffer-read-only.
-
- * pcl-cvs.el (cvs-find-file-other-window): Don't save-some-buffers.
-
-Thu Jul 16 00:19:58 1992 Per Cederqvist (ceder@robin)
-
- * pcl-cvs.el, test-cookie-el: Use the new names from cookie.el.
-
- * cookie.el: Big Renaming Time!
- External functions:
- cookie-next -> tin-next
- cookie-previous -> tin-previous
- cookie-nth -> tin-nth
- cookie-delete -> tin-delete
- cookie-filter-tins -> tin-filter
- cookie-get-selection -> tin-get-selection
- cookie-start-marker -> tin-start-marker
- cookie-end-marker -> tin-end-marker
- cookie-invalidate-tins -> tin-invalidate-tins
- cookie-collect-tins -> tin-collect
- cookie-collect-cookies -> cookie-collect
- Internal functions:
- cookie-create-tin -> cookie-create-wrapper
- cookie-tin-start-marker -> cookie-wrapper-start-marker
- cookie-tin-cookie-safe -> cookie-wrapper-cookie-safe
- cookie-tin-cookie -> cookie-wrapper-cookie
- set-cookie-tin-start-marker -> cookie-wrapper-set-start-marker
- set-cookie-tin-cookie -> cookie-wrapper-set-cookie
- cookie-tin-p -> cookie-wrapper-p
- cookie-create-tin-and-insert -> cookie-create-wrapper-and-insert
-
- * pcl-cvs.el (cvs-find-file, cvs-find-file-other-window): Signal
- an appropriate error message if the *cvs* buffer is empty.
-
- * cookie.el (cookie-create): Make the buffer read-only.
- * cookie.el (cookie-create-tin-and-insert, cookie-refresh,
- cookie-delete-tin-internal, cookie-refresh-tin): Bind
- buffer-read-only to nil while changing the contents of
- the buffer.
-
- * pcl-cvs.el (cvs-byte-compile-files): New function.
- * pcl-cvs.texinfo (Miscellaneous commands): Document it.
-
- * pcl-cvs.el (cvs-diff-ignore-marks): New variable.
- * pcl-cvs.el (cvs-diff-cvs, cvs-diff-backup): Don't consider
- marked files to be selected if a prefix argument is given XOR the
- variable cvs-diff-ignore-marks is non-nil.
- * pcl-cvs.el (cvs-get-marked): New optional argument `ignore-marks'.
- * pcl-cvs.texinfo (Customization, Viewing differences): Document
- this behaviour.
-
- * pcl-cvs.el (cvs-undo-local-changes): New function.
- * pcl-cvs.texinfo (Undoing changes): Document
- cvs-undo-local-changes.
- * pcl-cvs.el (cvs-mode-map): cvs-unmark-all-files moved from "U"
- to "ESC DEL". cvs-undo-local-changes bound to "U".
- * pcl-cvs.texinfo (Marking files): Document ESC DEL.
-
- * pcl-cvs.el (cvs-skip-line): New arguments. All callers updated.
- Now calls cvs-parse-error if a parse error occurs.
- * pcl-cvs.el (cvs-parse-error): New function that creates a bug
- report.
- * pcl-cvs.el (cvs-parse-stderr, cvs-parse-stdout): New arguments.
- The only caller (cvs-parse-buffer) updated. Call cvs-parse-error
- in case of parse error.
-
- * pcl-cvs.el (pcl-cvs-version): New variable.
-
- * cookie.el (cookie-create): Kill all local variables in the buffer.
-
-Fri Jul 10 11:17:40 1992 Per Cederqvist (ceder@robin)
-
- * Release 1.03beta1.
-
-Thu Jul 9 03:12:00 1992 Per Cederqvist (ceder@robin)
-
- * pcl-cvs.el (cvs-update-running): New variable.
- * pcl-cvs.el (cvs-do-update): Use it instead of the previous local
- variable cvs-process (that no longer exists). Make sure that only
- one `cvs update' runs at any given moment.
- * pcl-cvs.el (cvs-sentinel): Reset cvs-update-running when the
- update process exits.
-
- * pcl-cvs.el (cvs-update): Switch to the *cvs* buffer.
- * pcl-cvs.el (cvs-update-other-window): New function.
- * pcl-cvs-startup.el (cvs-update-other-window): Added a autoload
- for it.
- * pcl-cvs.el (cvs-do-update): Don't pop up any buffer in a window
- - let cvs-update or cvs-update-other-window handle that. Also
- don't kill the *cvs* buffer, but rather insert a "Running cvs..."
- message into it.
- * pcl-cvs.el (cvs-parse-buffer): Don't change the window
- configuration.
-
- * pcl-cvs.el (cvs-create-fileinfo, cvs-pp, cvs-fileninfo->type):
- New type for a fileinfo: MESSAGE.
-
- * pcl-cvs.el (cvs-cvs-buffer): Deleted the variable. Use
- cvs-buffer-name instead. (I no longer have any plans to allow more
- than one cvs update to run at the same time - things only get
- confusing). Changed all places where cvs-cvs-buffer was used.
-
- * pcl-cvs.el: Take care of update programs (the -u option in the
- modules file):
- * pcl-cvs.el (cvs-update-prog-output-skip-regexp): New variable.
- * pcl-cvs.el (cvs-parse-stdout): Skip output from the update
- program (using cvs-update-prog-output-skip-regexp).
- * pcl-cvs.texinfo (Future enhancements): Document that the
- solution is not as good as it should be.
- * pcl-cvs.texinfo (Customization): Document the variable.
-
-Wed Jul 8 20:29:44 1992 Per Cederqvist (ceder@robin)
-
- * pcl-cvs.el (cvs-do-update): Check that this-dir really exists
- and is a directory, and that this-dir/CVS exists and is a
- directory.
-
-Tue Jul 7 01:02:24 1992 Per Cederqvist (ceder@robin)
-
- * pcl-cvs.texinfo (Customization): Document TMPDIR.
-
- * This chunk of modifications should make it possible to run
- pcl-cvs on hosts that do not line-buffer stdout (such as
- DECstation). They work by diverting stdout and stderr from
- `cvs update' and later sorting them together.
- * pcl-cvs.el (cvs-parse-stderr): Don't fail to parse conflict
- data.
- * pcl-cvs.el (cvs-remove-stdout-shadows, cvs-shadow-entry-p): New
- functions.
- * pcl-cvs.el (cvs-parse-buffer): Use it.
- * pcl-cvs.el (cvs-remove-empty-directories): New function.
- * pcl-cvs.el (cvs-remove-handled, cvs-parse-buffer): Use it.
- * pcl-cvs.el (cvs-get-current-dir): New argument ROOT-DIR. All
- calls to cvs-get-current-dir updated.
- * pcl-cvs.el (cvs-do-update): Allocate a tmp file. Use cvs-shell
- (typically /bin/sh) to redirect stderr from CVS to the tmp file.
- * pcl-cvs.el (cvs-sentinel): Handle the tmp file. Remove it when
- it is parsed.
- * pcl-cvs.el (cvs-parse-buffer): New argument STDERR-BUFFER. All
- calls to cvs-parse-buffer updated. Rewritten to handle the
- separation of stderr and stdout.
- * pcl-cvs.el (cvs-shell, cvs-stderr-file): New variables.
- * pcl-cvs.el (cvs-compare-fileinfos, cvs-parse-stderr,
- cvs-parse-stdout): New functions.
-
- * pcl-cvs.el (cvs-parse-buffer): Some modifications for output
- from RCS 5.6.
-
-Tue Apr 7 09:11:27 1992 Per Cederqvist (ceder@leopold)
-
- * Release 1.02.
-
- * pcl-cvs.el (cvs-diff-backup, cvs-edit-done, cvs-status): Call
- save-some-buffers.
-
- * pcl-cvs.el (cvs-diff-backup-extractor): Fixed syntax error.
-
- * Makefile, README, compile-all.el, dist-makefile, pcl-cvs.el,
- pcl-cvs.texinfo (XXRELEASEXX): A magic string that is substituted
- for the current release number when a distribution is made.
- (Release 1.01 says that it is release 1.00).
-
- * pcl-cvs.el (cvs-find-file): Added missing pair of parenthesis.
-
-Mon Mar 30 14:25:26 1992 Per Cederqvist (ceder@leopold)
-
- * Release 1.01.
-
- * pcl-cvs.el (cvs-parse-buffer): The message when waiting for a
- lock has been changed.
-
-Sun Mar 29 05:29:57 1992 Per Cederqvist (ceder@leopold)
-
- * Release 1.00.
-
- * pcl-cvs.el (cvs-do-update, cvs-sentinel, cvs-parse-buffer):
- Major rewrite of buffer and window selection and handling.
- The *cvs* buffer is now killed whenever a new "cvs update" is
- initiated. The -update buffer is replaced with the *cvs*
- buffer when the update is completed.
-
-Sat Mar 28 21:03:05 1992 Per Cederqvist (ceder@robin)
-
- * pcl-cvs.el (cvs-delete-unused-temporary-buffers): Fixed it.
-
- * pcl-cvs.el (cvs-auto-remove-handled): New variable.
- * pcl-cvs.el (cvs-edit-done): Use it.
- * pcl-cvs.texinfo (Customization, Removing handled entries):
- Document it.
-
- * pcl-cvs.el (cvs-mode): Turn of the undo feature. It really
- isn't useful in a cookie buffer...
-
- * pcl-cvs.el (cvs-edit-done): Committing a file now looks more
- like diffing a file. The window handling is better.
- * pcl-cvs.el (cvs-use-temp-buffer): The &optional switch is no
- longer needed.
-
-Mon Mar 23 00:20:33 1992 Per Cederqvist (ceder@robin)
-
- * Release 0.97.
-
- * pcl-cvs.el (default-directory): Make sure it always ends in a
- slash. fileinfo->dir does NOT end in a slash, and I had forgotten
- to call file-name-as-directory in various places.
-
- * pcl-cvs.el (cvs-diff-backup-extractor): Signal an error if a
- fileinfo without backup file is given.
-
- * pcl-cvs.el (cvs-mode): Added documentation.
-
- * pcl-cvs.el (cvs-execute-list): Fix the order of files in the
- same directory.
-
- * pcl-cvs.el (cvs-log-flags, cvs-status-flags): New variables.
- * pcl-cvs.el (cvs-log, cvs-status): Use them.
- * pcl-cvs.texinfo (Customization): Document them.
-
- * pcl-cvs.el (cvs-diff-backup): Filter non-backup-diffable files
- at an earlier stage, like cvs-commit does.
-
- * pcl-cvs.el (cvs-diff-flags): New variable.
- * pcl-cvs.el (cvs-diff-backup): Use it.
- * pcl-cvs.texinfo (Customization): Document it.
-
- * pcl-cvs.el (cvs-execute-single-file-list): Remove &rest before
- last argument. No callers needed updating.
-
- * pcl-cvs.el (cvs-execute-list): Remove the &rest before the last
- argument (constant-args). Update all callers of cvs-execute-list
- to use the new calling convention.
- * pcl-cvs.el (cvs-cvs-diff-flags): Now a list of strings instead
- of a string.
- * pcl-cvs.texinfo (Customization): Document the change to
- cvs-cvs-diff-flags.
-
- * Release 0.96.
-
- * pcl-cvs.el (cvs-cvs-diff-flags): New variable.
- * pcl-cvs.el (cvs-diff-cvs): Use it.
- * pcl-cvs.texinfo (Customization, Viewing differences): Document it.
-
- * pcl-cvs.el (cvs-use-temp-buffe): Don't switch to the temporary
- buffer. Use display-buffer and set-buffer instead. This way
- cvs-log, cvs-status, cvs-diff-cvs and friends don't select the
- temporary buffer. The cursor will remain in the *cvs* buffer.
-
-Sun Mar 22 21:50:18 1992 Per Cederqvist (ceder@robin)
-
- * pcl-cvs.el (cvs-find-file, cvs-find-file-other-window): Don't
- prompt when reading in a directory in dired.
-
- * Makefile (pcl-cvs-$(VER)): Include pcl-cvs-startup.el in the
- distribution.
-
- * dist-makefile (pcl-cvs.dvi): Don't fail even if texindex does
- not exist.
-
- * pcl-cvs.texinfo (@setchapternewpage): Changed from 'off' to 'on'.
- * pcl-cvs.texinfo (Variable index): Joined into function index.
- * pcl-cvs.texinfo (Key index): add a description about the key.
- * pcl-cvs.texinfo: Many other small changes.
-
-Wed Mar 18 01:58:38 1992 Per Cederqvist (ceder@leopold)
-
- * Use GNU General Public License version 2.
-
diff --git a/gnu/usr.bin/cvs/tools/pcl-cvs/INSTALL b/gnu/usr.bin/cvs/tools/pcl-cvs/INSTALL
deleted file mode 100644
index 9d4e1985a38..00000000000
--- a/gnu/usr.bin/cvs/tools/pcl-cvs/INSTALL
+++ /dev/null
@@ -1,94 +0,0 @@
-This text is copied from the TeXinfo manual for pcl-cvs.
-
-Installation of the pcl-cvs program
-===================================
-
- 1. Possibly edit the file `Makefile' to reflect the situation at your
- site. We say "possibly" because the version of pcl-cvs included
- with CVS uses a configuration mechanism integrated with the overall
- mechanisms used by the CVS build and install procedures. Thus the
- file `Makefile' will be generated automatically from the file
- `Makefile.in', and it should not be necessary to edit it further.
-
- If you do have to edit the `Makefile', the only things you have to
- change is the definition of `lispdir' and `infodir'. The elisp
- files will be copied to `lispdir', and the info file(s) to
- `infodir'.
-
- 2. Configure pcl-cvs.el
-
- There are a couple of pathnames that you have to check to make
- sure that they match your system. They appear early in the file
- `pcl-cvs.el'.
-
- *NOTE:* If your system is running emacs 18.57 or earlier you MUST
- uncomment the line that says:
- (setq delete-exited-processes nil)
-
- Setting `delete-exited-processes' to `nil' works around a bug in
- emacs that causes it to dump core. The bug was fixed in emacs
- 18.58.
-
- 3. Release 1.05 and later of pcl-cvs requires parts of the Elib
- library, version 1.0 or later. Elib is available via anonymous
- ftp from prep.ai.mit.edu in `pub/gnu/elib-1.0.tar.gz', and from a
- lot of other sites that mirror prep. Get Elib, and install it,
- before proceeding.
-
- *NOTE:* The version of pcl-cvs included with CVS includes a copy
- of Elib in the sub-directory `elib' under the `contrib/elib'
- directory.
-
- 4. Type `make install' in the source directory. This will
- byte-compile all `.el' files and copy the `*.elc' files into the
- directory you specified in step 1.
-
- If you want to install the `*.el' files too, you can type `make
- install-el' to do so.
-
- If you only want to create the compiled elisp files, but don't
- want to install them, you can type `make' without parameters.
-
- 5. Edit the file `default.el' in your emacs lisp directory (usually
- `/usr/gnu/lib/emacs/site-lisp' or something similar) and enter the
- contents of the file `pcl-cvs-startup.el' into it. It contains a
- couple of `auto-load's that facilitates the use of pcl-cvs.
-
-
-Installation of the on-line manual.
-===================================
-
- 1. Create the info file(s) `pcl-cvs.info*' from `pcl-cvs.texinfo' by
- typing `make info'. If you don't have the program `makeinfo' you
- can get it by anonymous ftp from e.g. `prep.ai.mit.edu' as
- `pub/gnu/texinfo-3.7.tar.gz' (there might be a newer version there
- when you read this).
-
- 2. Install the info file(s) `pcl-cvs.info*' into your standard `info'
- directory. You should be able to do this by typing `make
- install-info'.
-
- 3. Edit the file `dir' in the `info' directory and enter one line to
- contain a pointer to the info file(s) `pcl-cvs.info*'. The line
- can, for instance, look like this:
-
- * Pcl-cvs: (pcl-cvs). An Emacs front-end to CVS.
-
-How to make typeset documentation from pcl-cvs.texinfo
-======================================================
-
- If you have TeX installed at your site, you can make a typeset manual
-from `pcl-cvs.texinfo'.
-
- 1. Run TeX by typing ``make pcl-cvs.dvi''. You will not get the
- indices unless you have the `texindex' program.
-
- 2. Convert the resulting device independent file `pcl-cvs.dvi' to a
- form which your printer can output and print it. If you have a
- postscript printer there is a program, `dvi2ps', which does. There
- is also a program which comes together with TeX, `dvips', which
- you can use.
-
-
---
-#ident "@(#)cvs/contrib/pcl-cvs:$Name: $Id: INSTALL,v 1.1 1996/05/06 22:20:47 tholo Exp $"
diff --git a/gnu/usr.bin/cvs/tools/pcl-cvs/Makefile.in b/gnu/usr.bin/cvs/tools/pcl-cvs/Makefile.in
deleted file mode 100644
index a8c94f98e1f..00000000000
--- a/gnu/usr.bin/cvs/tools/pcl-cvs/Makefile.in
+++ /dev/null
@@ -1,238 +0,0 @@
-# Makefile for pcl-cvs, an Emacs interface to CVS.
-# NOTE: pcl-cvs requires Elib to run. See ../../contrib/elib/.
-
-#
-#ident "@(#)original: dist-makefile,v 1.19 1993/05/31 22:43:45 ceder Exp "
-#
-#ident "@(#)elisp/pcl-cvs:$Name: $:$Id: Makefile.in,v 1.1 1996/05/06 22:20:47 tholo Exp $"
-#
-# Makefile for pcl-cvs release 1.05-CVS-$Name: $.
-# Copyright (C) 1992, 1993 Per Cederqvist
-#
-# This program 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 of the License, or
-# (at your option) any later version.
-#
-# This program 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 this program; if not, write to the Free Software
-# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-SHELL = /bin/sh
-
-#### Start of system configuration section. ####
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-# Where to put the system-wide supplementary files
-libdir = $(prefix)/lib
-
-# Where to put the Info files
-infodir = $(prefix)/info
-
-# Where to put the manual pages.
-mandir = $(prefix)/man
-
-# Used to batch-byte-compile files.
-EMACS = emacs
-# compile with noninteractive environment
-BATCHFLAGS = -batch
-
-# This is the directory in which the ELCFILES will be installed.
-lispdir = $(libdir)/emacs/site-lisp
-
-#### End of system configuration section. ####
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-
-# Just in case...
-SHELL = /bin/sh
-@SET_MAKE@
-
-DISTFILES = \
- .cvsignore ChangeLog INSTALL Makefile.in NEWS README \
- ${ELFILES} \
- pcl-cvs.texinfo texinfo.tex
-
-
-# OBJDIR_DISTFILES used to include the byte-compiled elisp files, but
-# this seems wrong because the person building the dist cannot have
-# made the appropriate site-specific modifications to pcl-cvs.el.
-# Therefore, I've taken the .elc files out of OBJDIR_DISTFILES for
-# now, pending the Right Solution to this problem (which probably
-# involves moving the site-specific modification section of pcl-cvs.el
-# to a separate file and having autoconf generate as much of the file
-# as possible). -Karl
-#
-# OBJDIR_DISTFILES = $(ELCFILES) pcl-cvs.aux pcl-cvs.ps
-OBJDIR_DISTFILES = pcl-cvs.aux pcl-cvs.ps
-
-
-# files that contain key macro definitions. almost everything
-# depends on them because the byte-compiler inlines macro
-# expansions. everything also depends on the byte compiler
-# options file since this might do odd things like turn off
-# certain compiler optimizations.
-CORE =
-
-ELFILES = pcl-cvs.el pcl-cvs-lucid.el pcl-cvs-startup.el
-ELCFILES = pcl-cvs.elc pcl-cvs-lucid.elc
-INFOFILES = pcl-cvs.info*
-TEXTMPS = pcl-cvs.aux pcl-cvs.log pcl-cvs.toc pcl-cvs.dvi pcl-cvs.cp \
- pcl-cvs.fn pcl-cvs.vr pcl-cvs.tp pcl-cvs.ky pcl-cvs.pg \
- pcl-cvs.cps pcl-cvs.fns pcl-cvs.kys pcl-cvs.pgs pcl-cvs.tps \
- pcl-cvs.vrs
-
-# Use cp if you don't have install.
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-
-MAKEINFO = makeinfo
-
-SET_TEXINPUTS = TEXINPUTS=.:$(srcdir):$$TEXINPUTS
-
-# Don Knuth's TeX formatter
-TEX = tex
-
-# auxiliary program for sorting Texinfo indices
-TEXINDEX = texindex
-
-DVIPS = dvips
-DVIPSFLAGS =
-
-# CYGNUS LOCAL: install does not depend on info
-all: $(ELCFILES) # info
-.PHONY: all
-
-.SUFFIXES: .el .elc
-# We copy the .el file to the build dir--is there a cleaner way to get
-# emacs to compile the .el file from srcdir and put the .elc in the build dir?
-# (that is also why we have separate rules for pcl-cvs.elc and
-# pcl-cvs-lucid.elc rather than just using a .el.elc rule).
-pcl-cvs.elc: pcl-cvs.el
- @echo "You can probably ignore free variable and unknown function warnings..."
- if test -f pcl-cvs.el; then \
- : OK, we are building in srcdir ; \
- else \
- ln $(srcdir)/pcl-cvs.el . ; \
- fi
- $(EMACS) $(BATCHFLAGS) -f batch-byte-compile pcl-cvs.el
-pcl-cvs-lucid.elc: pcl-cvs-lucid.el
- @echo "You can probably ignore free variable and unknown function warnings..."
- if test -f pcl-cvs-lucid.el; then \
- : OK, we are building in srcdir ; \
- else \
- ln $(srcdir)/pcl-cvs-lucid.el . ; \
- fi
- $(EMACS) $(BATCHFLAGS) -f batch-byte-compile pcl-cvs-lucid.el
-
-check installcheck:
- @echo "$@ not supported in this makefile..."
-.PHONY: check installcheck
-
-# CYGNUS LOCAL: install does not depend on install-info
-install: install-elc # install-info install-el
-
-install-el: $(ELFILES)
- for i in $(ELFILES) ; do \
- $(INSTALL_DATA) $$i $(lispdir)/$$i ; \
- done
-
-install-elc: $(ELCFILES)
- for i in $(ELCFILES) ; do \
- $(INSTALL_DATA) $$i $(lispdir)/$$i ; \
- done
-
-install-info: info
- test -f pcl-cvs.info || cd $(srcdir); \
- for i in *.info* ; do \
- $(INSTALL_DATA) $$i $(infodir)/$$i ; \
- done
-
-.PHONY: install install-el install-elc install-info
-
-# mkinstalldirs isn't supported for CVS yet....
-installdirs: $(top_srcdir)/mkinstalldirs
- $(SHELL) $(top_srcdir)/mkinstalldirs $(lispdir) $(infodir)
-.PHONY: installdirs
-
-uninstall:
- @echo "$@ not yet supported in this makefile..."
-.PHONY: uninstall
-
-info: pcl-cvs.info
-.PHONY: info
-
-pcl-cvs.info: pcl-cvs.texinfo
- $(MAKEINFO) ${srcdir}/pcl-cvs.texinfo -o pcl-cvs.info
-
-dvi: pcl-cvs.dvi
-.PHONY: dvi
-
-# this mess seems to be necessary to make the index right...
-pcl-cvs.dvi pcl-cvs.aux: pcl-cvs.texinfo
- $(SET_TEXINPUTS) $(TEX) $(srcdir)/pcl-cvs.texinfo
- $(SET_TEXINPUTS) $(TEX) $(srcdir)/pcl-cvs.texinfo
- -$(TEXINDEX) pcl-cvs.cp pcl-cvs.fn pcl-cvs.vr pcl-cvs.tp pcl-cvs.ky \
- pcl-cvs.pg
- $(SET_TEXINPUTS) $(TEX) $(srcdir)/pcl-cvs.texinfo
-
-pcl-cvs.ps: pcl-cvs.dvi
- $(DVIPS) $(DVIPSFLAGS) pcl-cvs.dvi -o pcl-cvs.ps
-
-mostlyclean clean:
- rm -f *~ core $(ELCFILES) $(INFOFILES) $(TEXTMPS)
-.PHONY: mostlyclean clean
-
-distclean: clean
- rm -f Makefile tags TAGS
-.PHONY: distclean
-
-realclean maintainer-clean: distclean
- rm -f pcl-cvs.info* pcl-cvs.ps
-.PHONY: realclean maintainer-clean
-
-# you can't use ctags for lisp...
-tags TAGS:
- etags *.el
-.PHONY: tags
-
-ls:
- @echo $(DISTFILES)
-.PHONY: ls
-
-dist-dir: ${OBJDIR_DISTFILES} ${DISTFILES} pcl-cvs.info
- mkdir ${DISTDIR}
- for i in ${DISTFILES}; do \
- ln $(srcdir)/$${i} ${DISTDIR}; \
- done
- ln ${OBJDIR_DISTFILES} ${DISTDIR}
- if [ -f pcl-cvs.info-1 ]; \
- then ln -f pcl-cvs.info-* ${DISTDIR}; \
- else : Pacify Ultrix sh; \
- fi
-.PHONY: dist-dir
-
-subdir = tools/pcl-cvs
-Makefile: ../../config.status Makefile.in
- cd ../.. && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./config.status
-
-# CYGNUS LOCAL: don't depend on auto-re-config
-#../config.status: ../configure
-# cd .. ; $(SHELL) config.status --recheck
-
-# CYGNUS LOCAL: don't depend on auto-re-config
-#../configure: ../configure.in
-# cd $(top_srcdir) ; autoconf
diff --git a/gnu/usr.bin/cvs/tools/pcl-cvs/NEWS b/gnu/usr.bin/cvs/tools/pcl-cvs/NEWS
deleted file mode 100644
index d453f36a966..00000000000
--- a/gnu/usr.bin/cvs/tools/pcl-cvs/NEWS
+++ /dev/null
@@ -1,149 +0,0 @@
-This is the NEWS file for pcl-cvs, an Emacs elisp front-end to CVS.
-
-User-visible changes in the un-official CVS release of pcl-cvs
-from the official 1.05 release to 1.05-CVS-$Name: $:
-
-* Support for using ChangeLog files, including hooks to automatically
- guess CVS log entries from ChangeLog contents.
-
-* Support for client/server CVS (versions 1.5 through 1.7 and newer).
-
-* New commands for tagging files and directory trees (still needs to
- be made to run in the background).
-
-* Better support for recognizing and handling unknown directories.
-
-* An attempt at new ediff and emerge interfaces (still needs work!),
- including attempts to make vendor-branch merging work.
-
-* In a possibly misguided attempt to make it easier to see the effects
- of changes that affect several files, diff output is now stored in a
- uniqe buffer for each file.
-
-* Some commands now have default flags (cvs-*-flags).
-
-* Proper quoting of command line arguments displayed in *cvs-tmp*.
-
-* More hacking with getting CVSROOT right, though probably all
- pointless, since CVS should do the right thing all the time.
-
-* Elib is back, at least in the CVS distribution.
-
-* Lots of minor bug fixes, tweaks, cleanup, re-indentation, etc.
-
-* Some minor tweaks, fixes, re-indentation, etc., in the
- documentation.
-
-
-User-visible changes in pcl-cvs from 1.04 to 1.05:
-
-* Elib is no longer distributed with pcl-cvs. You must get Elib
- separately, for instance from ftp.lysator.liu.se in pub/emacs.
-
-* The Lucid Emacs support works again.
-
-* A new function, cvs-change-cvsroot, can be used to interactively
- switch between CVS repositories.
-
-* The mode line in the *cvs* buffer now indicates when a "cvs update"
- is running.
-
-* The .cvsignore file is automatically sorted alphabetically (to
- reduce the risk of conflicts when two people add different files
- simultaneously). This behaviour can be turned off with
- cvs-sort-ignore-file.
-
-* A trailing newline is always added in commit log messages. This
- behaviour can be turned off with
- cvs-commit-buffer-require-final-newline.
-
-* This version of pcl-cvs should work together with RCVS. I have not
- tested this myself, though.
-
-* Plus some bug fixes. (Note that the version of cookie.el that is
- distributed with pcl-cvs 1.04 contains errors that affects pcl-cvs.
- You should get Elib 0.07).
-
-
-User-visible changes in pcl-cvs from 1.03 to 1.04:
-
-* Support for Emerge. Hitting "e" on a file that is Modified, Merged
- or in Conflict will start Emerge, an interactive file merger written
- in Emacs Lisp. This requires Emerge version 4. Emerge is not
- included in this package. If you can't find it anywhere else, you
- can get in from ftp.lysator.liu.se in pub/emacs. This package makes
- it a lot easier to resolve conflicts.
-
-* Emacs will now automatically revert your buffers when the CVS
- commands pcl-cvs issues causes the file to change. This automatic
- revert never occurs if the buffer contents did not agree with the
- file prior to the command.
-
-* If you are running Lucid GNU Emacs, you will get some fonts and
- mouse support. This was contributed from people at Lucid.
-
-* The variable cvs-cvsroot can be used to select the location if the
- repository. You no longer need to exit Emacs, setenv CVSROOT, and
- start a new Emacs if you work with multiple repositories.
-
-* The "q" key can be used to hide the *cvs* buffer.
-
-* The name of the commands in the *cvs* have changed. If it was called
- cvs-foo, it will now be called cvs-mode-foo. See the ChangeLog
- entry from Tue Aug 4 03:02:25 1992 for a complete list of changes.
-
-* The variable cvs-cvs-diff-flags is no longer used. Instead,
- cvs-diff-flags is always used.
-
-* Plus a lot of bug fixes.
-
-
-User-visible changes in pcl-cvs from 1.02 to 1.03:
-
-* Output from CVS to stdout and stderr is separated and parsed
- independently. In that way pcl-cvs should work regardless of
- whether stdout is buffered or line-buffered. Pcl-cvs should now
- work with CVS 1.3 without modifications on hosts such as
- DECstations.
-
-* Pcl-cvs now fully supports RCS version 5.6 as well as 5.5.
-
-* New functions:
-
- + cvs-undo-local-changes ("U") - Undo all your modifications
- to a file and get the newest
- version from the repository.
- + cvs-update-other-window - Similar to cvs-update.
- + cvs-byte-compile-files - Byte compile the selected files.
-
-* cvs-update now displays the *cvs* buffer, which initially contains a
- small message ("Running `cvs update' in /foo/bar/gazonk/...") until
- the update is ready. The *cvs* buffer no longer pops up when the
- update is ready. It often failed to pop up, due to race conditions
- that are very hard to solve (and I doubt that they were at all
- solvable).
-
-* cvs-unmark-all-files is moved from "U" to "ESC DEL" to be
- "compatible" with dired.
-
-* cvs-diff ("d") and cvs-diff-backup ("b") can be configured to work
- on only the file the cursor is positioned on, and ignore any marked
- files. A prefix argument toggles this.
-
-* Only one `cvs update' can be run at a time. (It was previously
- possible to start more than one simultaneously, but pcl-cvs could
- not really handle more than one.)
-
-* Some rudimentary support for programs that CVS runs at update (due
- to the -u switch in the modules file).
-
-* Pcl-cvs now automatically generates a bug report if it can't parse
- the output from CVS.
-
-* The *cvs* buffer is read-only.
-
-* Pcl-cvs now creates temporary files in $TMPDIR if that environment
- variable is set (otherwise it uses /tmp).
-
----End of file NEWS---
-#ident "@(#)cvs/contrib/pcl-cvs:$Name: $:$Id: NEWS,v 1.1 1996/05/06 22:20:47 tholo Exp $"
diff --git a/gnu/usr.bin/cvs/tools/pcl-cvs/README b/gnu/usr.bin/cvs/tools/pcl-cvs/README
deleted file mode 100644
index 05da0b0de02..00000000000
--- a/gnu/usr.bin/cvs/tools/pcl-cvs/README
+++ /dev/null
@@ -1,25 +0,0 @@
-This is the readme file for pcl-cvs, release 1.05-CVS-$Name: $.
-
-Pcl-cvs is a front-end to CVS versions 1.5 through 1.7. It integrates
-the most frequently used CVS commands into an emacs interface.
-
-There may be some configuration that needs to be done in pcl-cvs.el to
-get it to work. See the instructions in the file INSTALL.
-
-Full documentation is in Texinfo format in the file pcl-cvs.texinfo. To
-browse this document online, or in the emacs info mode, you will need to
-process this file with the makeinfo program, which can also be found on
-prep.ai.mit.edu in pub/gnu.
-
-If you have been using a previous version of pcl-cvs (for instance the
-official 1.05 release, or any previous releases) you should read through
-the file NEWS to see what has changed.
-
-This release has been tested under, Emacs 19.28 and Emacs 19.30.
-
-Per Cederqvist
-(updated by Jim Blandy, Greg A. Woods, Karl Fogel)
-
---
-#OrigId "@(#) Id: README,v 1.14 1993/05/31 22:43:36 ceder Exp "
-#ident "@(#)cvs/contrib/pcl-cvs:$Name: $:$Id: README,v 1.1 1996/05/06 22:20:47 tholo Exp $"
diff --git a/gnu/usr.bin/cvs/tools/pcl-cvs/pcl-cvs-lucid.el b/gnu/usr.bin/cvs/tools/pcl-cvs/pcl-cvs-lucid.el
deleted file mode 100644
index 8695f67aa11..00000000000
--- a/gnu/usr.bin/cvs/tools/pcl-cvs/pcl-cvs-lucid.el
+++ /dev/null
@@ -1,134 +0,0 @@
-;;; Mouse and font support for PCL-CVS 1.3 running in Lucid GNU Emacs
-;; @(#) Id: pcl-cvs-lucid.el,v 1.2 1993/05/31 19:37:34 ceder Exp
-;; Copyright (C) 1992-1993 Free Software Foundation, Inc.
-
-;; This file is part of GNU Emacs.
-
-;; GNU Emacs 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.
-
-;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to
-;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
-
-
-;; This simply adds a menu of the common CVS commands to the menubar and to
-;; the right mouse button. Clicking right moves point, and then pops up a
-;; menu from which commands can be executed.
-;;
-;; This could stand to be a lot more clever: for example, the "Commit Changes"
-;; command should only be active on files for which there is something to
-;; commit. Also, some indication of which files the command applies to
-;; (especially in the presence of multiple marked files) would be nice.
-;;
-;; Middle-click runs find-file.
-
-
-;(require 'pcl-cvs)
-(load "pcl-cvs.el")
-
-(defvar cvs-menu
- '("CVS"
- ["Find File" cvs-mode-find-file t]
- ["Find File Other Window" cvs-mode-find-file-other-window t]
- ["Interactively Merge (emerge)" cvs-mode-emerge t]
- ["Diff against Repository" cvs-mode-diff-cvs t]
- ["Diff against Backup Version" cvs-mode-diff-backup t]
- "----"
- ["Commit Changes to Repository" cvs-mode-commit t]
- ["Revert File from Repository" cvs-mode-undo-local-changes t]
- ["Add File to Repository" cvs-mode-add t]
- ["Remove File from Repository" cvs-mode-remove-file t]
- ["Ignore File" cvs-mode-ignore t]
- ["Hide File" cvs-mode-acknowledge t]
- ["Hide Handled Files" cvs-mode-remove-handled t]
- "----"
- ["Add ChangeLog Entry" cvs-mode-add-change-log-entry-other-window t]
- ["Show CVS Log" cvs-mode-log t]
- ["Show CVS Status" cvs-mode-status t]
- "----"
- ["Mark File" cvs-mode-mark t]
- ["Unmark File" cvs-mode-unmark t]
- ["Mark All Files" cvs-mode-mark-all-files t]
- ["Unmark All Files" cvs-mode-unmark-all-files t]
- "----"
- ["Quit" bury-buffer t]
- ))
-
-(defun cvs-menu (e)
- (interactive "e")
- (mouse-set-point e)
- (beginning-of-line)
- (or (looking-at "^[* ] ") (error "No CVS file line here"))
- (popup-menu cvs-menu))
-
-(defun cvs-mouse-find-file (e)
- (interactive "e")
- (mouse-set-point e)
- (beginning-of-line)
- (or (looking-at "^[* ] ") (error "No CVS file line here"))
- (cvs-mode-find-file (point)))
-
-(define-key cvs-mode-map 'button3 'cvs-menu)
-(define-key cvs-mode-map 'button2 'cvs-mouse-find-file)
-
-(make-face 'cvs-header-face)
-(make-face 'cvs-filename-face)
-(make-face 'cvs-status-face)
-
-(or (face-differs-from-default-p 'cvs-header-face)
- (copy-face 'italic 'cvs-header-face))
-
-(or (face-differs-from-default-p 'cvs-filename-face)
- (copy-face 'bold 'cvs-filename-face))
-
-(or (face-differs-from-default-p 'cvs-status-face)
- (copy-face 'bold-italic 'cvs-status-face))
-
-
-(defun pcl-mode-motion-highlight-line (event)
- (if (save-excursion
- (let* ((window (event-window event))
- (buffer (and window (window-buffer window)))
- (point (and buffer (event-point event))))
- (and point
- (progn
- (set-buffer buffer)
- (goto-char point)
- (beginning-of-line)
- (looking-at "^[* ] ")))))
- (mode-motion-highlight-line event)))
-
-(defconst pcl-cvs-font-lock-keywords
- '(("^In directory \\(.+\\)$" 1 cvs-header-face)
- ("^[* ] \\w+ +\\(ci\\)" 1 cvs-status-face)
- ("^[* ] \\(Conflict\\|Merged\\)" 1 cvs-status-face)
- ("^[* ] \\w+ +\\(ci +\\)?\\(.+\\)$" 2 cvs-filename-face)
- )
- "Patterns to highlight in the *cvs* buffer.")
-
-(defun pcl-cvs-fontify ()
- ;;
- ;; set up line highlighting
- (require 'mode-motion)
- (setq mode-motion-hook 'pcl-mode-motion-highlight-line)
- ;;
- ;; set up menubar
- (if (and current-menubar (not (assoc "CVS" current-menubar)))
- (progn
- (set-buffer-menubar (copy-sequence current-menubar))
- (add-menu nil "CVS" (cdr cvs-menu))))
- ;;
- ;; fontify mousable lines
- (set (make-local-variable 'font-lock-keywords) pcl-cvs-font-lock-keywords)
- (font-lock-mode 1)
- )
-
-(add-hook 'cvs-mode-hook 'pcl-cvs-fontify)
diff --git a/gnu/usr.bin/cvs/tools/pcl-cvs/pcl-cvs-startup.el b/gnu/usr.bin/cvs/tools/pcl-cvs/pcl-cvs-startup.el
deleted file mode 100644
index 0d802be948c..00000000000
--- a/gnu/usr.bin/cvs/tools/pcl-cvs/pcl-cvs-startup.el
+++ /dev/null
@@ -1,17 +0,0 @@
-;;;#ident "@(#)OrigId: pcl-cvs-startup.el,v 1.4 1993/05/31 18:40:33 ceder Exp "
-;;;
-;;;#ident "@(#)cvs/contrib/pcl-cvs:$Name: $:$Id: pcl-cvs-startup.el,v 1.1 1996/05/06 22:20:48 tholo Exp $"
-;;;
-(autoload 'cvs-update "pcl-cvs"
- "Run a 'cvs update' in the current working directory. Feed the
-output to a *cvs* buffer and run cvs-mode on it.
-If optional prefix argument LOCAL is non-nil, 'cvs update -l' is run."
- t)
-
-(autoload 'cvs-update-other-window "pcl-cvs"
- "Run a 'cvs update' in the current working directory. Feed the
-output to a *cvs* buffer, display it in the other window, and run
-cvs-mode on it.
-
-If optional prefix argument LOCAL is non-nil, 'cvs update -l' is run."
- t)
diff --git a/gnu/usr.bin/cvs/tools/pcl-cvs/pcl-cvs.aux b/gnu/usr.bin/cvs/tools/pcl-cvs/pcl-cvs.aux
deleted file mode 100644
index 2ecac17b019..00000000000
--- a/gnu/usr.bin/cvs/tools/pcl-cvs/pcl-cvs.aux
+++ /dev/null
@@ -1,102 +0,0 @@
-'xrdef {Installation-title}{Installation}
-'xrdef {Installation-pg}{1}
-'xrdef {Installation-snt}{Chapter'tie1}
-'xrdef {Pcl-cvs installation-title}{Installation of the pcl-cvs program}
-'xrdef {Pcl-cvs installation-pg}{1}
-'xrdef {Pcl-cvs installation-snt}{Section'tie1.1}
-'xrdef {On-line manual installation-title}{Installation of the on-line manual.}
-'xrdef {On-line manual installation-pg}{2}
-'xrdef {On-line manual installation-snt}{Section'tie1.2}
-'xrdef {Typeset manual installation-title}{How to make typeset documentation from pcl-cvs.texinfo}
-'xrdef {Typeset manual installation-pg}{2}
-'xrdef {Typeset manual installation-snt}{Section'tie1.3}
-'xrdef {About pcl-cvs-title}{About pcl-cvs}
-'xrdef {About pcl-cvs-pg}{3}
-'xrdef {About pcl-cvs-snt}{Chapter'tie2}
-'xrdef {Contributors-title}{Contributors to pcl-cvs}
-'xrdef {Contributors-pg}{3}
-'xrdef {Contributors-snt}{Section'tie2.1}
-'xrdef {Archives-title}{Where can I get pcl-cvs?}
-'xrdef {Archives-pg}{4}
-'xrdef {Archives-snt}{Section'tie2.2}
-'xrdef {Getting started-title}{Getting started}
-'xrdef {Getting started-pg}{5}
-'xrdef {Getting started-snt}{Chapter'tie3}
-'xrdef {Buffer contents-title}{Buffer contents}
-'xrdef {Buffer contents-pg}{7}
-'xrdef {Buffer contents-snt}{Chapter'tie4}
-'xrdef {File status-title}{File status}
-'xrdef {File status-pg}{7}
-'xrdef {File status-snt}{Section'tie4.1}
-'xrdef {Selected files-title}{Selected files}
-'xrdef {Selected files-pg}{8}
-'xrdef {Selected files-snt}{Section'tie4.2}
-'xrdef {Commands-title}{Commands}
-'xrdef {Commands-pg}{10}
-'xrdef {Commands-snt}{Chapter'tie5}
-'xrdef {Updating the directory-title}{Updating the directory}
-'xrdef {Updating the directory-pg}{10}
-'xrdef {Updating the directory-snt}{Section'tie5.1}
-'xrdef {Movement commands-title}{Movement Commands}
-'xrdef {Movement commands-pg}{10}
-'xrdef {Movement commands-snt}{Section'tie5.2}
-'xrdef {Marking files-title}{Marking files}
-'xrdef {Marking files-pg}{11}
-'xrdef {Marking files-snt}{Section'tie5.3}
-'xrdef {Committing changes-title}{Committing changes}
-'xrdef {Committing changes-pg}{11}
-'xrdef {Committing changes-snt}{Section'tie5.4}
-'xrdef {Editing files-title}{Editing files}
-'xrdef {Editing files-pg}{12}
-'xrdef {Editing files-snt}{Section'tie5.5}
-'xrdef {Getting info about files-title}{Getting info about files}
-'xrdef {Getting info about files-pg}{12}
-'xrdef {Getting info about files-snt}{Section'tie5.6}
-'xrdef {Adding and removing files-title}{Adding and removing files}
-'xrdef {Adding and removing files-pg}{13}
-'xrdef {Adding and removing files-snt}{Section'tie5.7}
-'xrdef {Undoing changes-title}{Undoing changes}
-'xrdef {Undoing changes-pg}{13}
-'xrdef {Undoing changes-snt}{Section'tie5.8}
-'xrdef {Removing handled entries-title}{Removing handled entries}
-'xrdef {Removing handled entries-pg}{14}
-'xrdef {Removing handled entries-snt}{Section'tie5.9}
-'xrdef {Ignoring files-title}{Ignoring files}
-'xrdef {Ignoring files-pg}{14}
-'xrdef {Ignoring files-snt}{Section'tie5.10}
-'xrdef {Viewing differences-title}{Viewing differences}
-'xrdef {Viewing differences-pg}{14}
-'xrdef {Viewing differences-snt}{Section'tie5.11}
-'xrdef {Invoking Ediff-title}{Running ediff}
-'xrdef {Invoking Ediff-pg}{15}
-'xrdef {Invoking Ediff-snt}{Section'tie5.12}
-'xrdef {Invoking Emerge-title}{Running emerge}
-'xrdef {Invoking Emerge-pg}{15}
-'xrdef {Invoking Emerge-snt}{Section'tie5.13}
-'xrdef {Reverting your buffers-title}{Reverting your buffers}
-'xrdef {Reverting your buffers-pg}{16}
-'xrdef {Reverting your buffers-snt}{Section'tie5.14}
-'xrdef {Miscellaneous commands-title}{Miscellaneous commands}
-'xrdef {Miscellaneous commands-pg}{16}
-'xrdef {Miscellaneous commands-snt}{Section'tie5.15}
-'xrdef {Customization-title}{Customization}
-'xrdef {Customization-pg}{18}
-'xrdef {Customization-snt}{Chapter'tie6}
-'xrdef {Future enhancements-title}{Future enhancements}
-'xrdef {Future enhancements-pg}{20}
-'xrdef {Future enhancements-snt}{Chapter'tie7}
-'xrdef {Bugs-title}{Bugs (known and unknown)}
-'xrdef {Bugs-pg}{22}
-'xrdef {Bugs-snt}{Chapter'tie8}
-'xrdef {COPYING-title}{GNU GENERAL PUBLIC LICENSE}
-'xrdef {COPYING-pg}{23}
-'xrdef {COPYING-snt}{Appendix'tie'char65{}}
-'xrdef {Function and Variable Index-title}{Function and Variable Index}
-'xrdef {Function and Variable Index-pg}{24}
-'xrdef {Function and Variable Index-snt}{}
-'xrdef {Concept Index-title}{Concept Index}
-'xrdef {Concept Index-pg}{25}
-'xrdef {Concept Index-snt}{}
-'xrdef {Key Index-title}{Key Index}
-'xrdef {Key Index-pg}{27}
-'xrdef {Key Index-snt}{}
diff --git a/gnu/usr.bin/cvs/tools/pcl-cvs/pcl-cvs.el b/gnu/usr.bin/cvs/tools/pcl-cvs/pcl-cvs.el
deleted file mode 100644
index 68517bf8b1a..00000000000
--- a/gnu/usr.bin/cvs/tools/pcl-cvs/pcl-cvs.el
+++ /dev/null
@@ -1,3450 +0,0 @@
-;;;
-;;;#ident "@(#)OrigId: pcl-cvs.el,v 1.93 1993/05/31 22:44:00 ceder Exp "
-;;;
-;;;#ident "@(#)cvs/contrib/pcl-cvs:$Name: $:$Id: pcl-cvs.el,v 1.1 1996/05/06 22:20:47 tholo Exp $"
-;;;
-;;; pcl-cvs.el -- A Front-end to CVS 1.3 or later.
-;;; Release 1.05-CVS-$Name: $.
-;;; Copyright (C) 1991, 1992, 1993 Per Cederqvist
-
-;;; This program 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 of the License, or
-;;; (at your option) any later version.
-;;;
-;;; This program 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 this program; if not, write to the Free Software
-;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-;;; See below for installation instructions.
-
-;;; This package requires ELIB-1.0 to run. Elib is included in the
-;;; CVS distribution in the contrib/elib/ subdirectory, but you can
-;;; also download it at the following URL:
-;;;
-;;; ftp://ftp.lysator.liu.se/pub/emacs/elib-1.0.tar.gz
-;;;
-
-;;; There is an TeXinfo file that describes this package. You should read it
-;;; to get the most from this package.
-
-;;; Mail questions and bug reports regarding this version (as included in
-;;; CVS-1.7 or newer) to the pcl-cvs support team at <pcl-cvs@cyclic.com>.
-
-;;; Don't try to use this with CVS 1.2 or earlier. It won't work. Get CVS 1.7
-;;; or newer. Use the version of RCS best suited for the version of CVS you're
-;;; using.
-
-(require 'cookie) ; from ELIB-1.0
-(require 'add-log) ; for all the ChangeLog goodies
-
-;;; -------------------------------------------------------
-;;; START OF THINGS TO CHECK WHEN INSTALLING
-
-;; also use $GNU here, since may folks might install CVS as a GNU package
-;;
-(defvar local-path (cond
- ((getenv "LOCAL")
- (getenv "LOCAL"))
- ((getenv "GNU")
- (getenv "GNU"))
- (t
- "/usr/local"))
- "*Path prefix for most locally installed things.")
-
-;; this isn't likely to be right all the time....
-;;
-(defvar local-gnu-path (cond
- ((getenv "GNU")
- (getenv "GNU"))
- (t
- "/usr/local")) ; or "/usr/gnu"?
- "*Path prefix for locally installed GNU software.")
-
-(defvar cvs-program (concat local-path "/bin/cvs")
- "*Full path to the cvs executable.")
-
-;; SunOS-4.1.1_U1 has "diff.c 1.12 88/08/04 SMI; from UCB 4.6 86/04/03"
-;;
-(defvar cvs-diff-program (concat local-gnu-path "/bin/diff")
- "*Full path to the best diff program you've got.
-NOTE: there are some nasty bugs in the context diff variants of some vendor
-versions, such as the one in SunOS-4.1.1_U1")
-
-(defvar cvs-rmdir-program "/bin/rmdir"
- "*Full path to the rmdir program. Typically /bin/rmdir.")
-
-(defvar cvs-shell "/bin/sh"
- "*Full path to a shell that can do redirection on stdout.")
-
-;;; Options to control various features:
-
-(defvar cvs-changelog-full-paragraphs t
- "If non-nil, include full ChangeLog paragraphs in the CVS log.
-This may be set in the ``local variables'' section of a ChangeLog, to
-indicate the policy for that ChangeLog.
-
-A ChangeLog paragraph is a bunch of log text containing no blank lines;
-a paragraph usually describes a set of changes with a single purpose,
-but perhaps spanning several functions in several files. Changes in
-different paragraphs are unrelated.
-
-You could argue that the CVS log entry for a file should contain the
-full ChangeLog paragraph mentioning the change to the file, even though
-it may mention other files, because that gives you the full context you
-need to understand the change. This is the behaviour you get when this
-variable is set to t.
-
-On the other hand, you could argue that the CVS log entry for a change
-should contain only the text for the changes which occurred in that
-file, because the CVS log is per-file. This is the behaviour you get
-when this variable is set to nil.")
-
-(defvar cvs-cvsroot-required nil
- "*Specifies whether CVS needs to be told where the repository is.
-
-In CVS 1.3, if your CVSROOT environment variable is not set, and you
-do not set the `cvs-cvsroot' lisp variable, CVS will have no idea
-where to find the repository, and refuse to run. CVS 1.4 and later
-store the repository path with the working directories, so most
-operations don't need to be told where the repository is.
-
-If you work with multiple repositories with CVS 1.4, it's probably
-advisable to leave your CVSROOT environment variable unset, set this
-variable to nil, and let CVS figure out where the repository is for
-itself.")
-
-(defvar cvs-cvsroot nil
- "*Specifies where the (current) cvs master repository is.
-Overrides the $CVSROOT variable by sending \" -d dir\" to all cvs commands.
-This switch is useful if you have multiple CVS repositories, and are not using
-a modern version of CVS that stores the current repository in CVS/Root.")
-
-;; Uncomment the following line if you are running on 18.57 or earlier.
-;(setq delete-exited-processes nil)
-;; Emacs version 18.57 and earlier is likely to crash if
-;; delete-exited-processes is t, since the sentinel uses lots of
-;; memory, and 18.57 forgets to GCPROT a variable if
-;; delete-exited-processes is t.
-
-;;; END OF THINGS TO CHECK WHEN INSTALLING
-;;; --------------------------------------------------------
-
-(defconst pcl-cvs-version "1.05-CVS-$Name: $"
- "A string denoting the current release version of pcl-cvs.")
-
-;; You are NOT allowed to disable this message by default. However, you
-;; are encouraged to inform your users that by adding
-;; (setq cvs-inhibit-copyright-message t)
-;; to their .emacs they can get rid of it. Just don't add that line
-;; to your default.el!
-(defvar cvs-inhibit-copyright-message nil
- "*Non-nil means don't display a Copyright message in the ``*cvs*'' buffer.")
-
-(defconst cvs-startup-message
- (if cvs-inhibit-copyright-message
- "PCL-CVS release 1.05-CVS-$Name: $"
- "PCL-CVS release 1.05 from CVS release $Name: $.
-Copyright (C) 1992, 1993 Per Cederqvist
-Pcl-cvs comes with absolutely no warranty; for details consult the manual.
-This is free software, and you are welcome to redistribute it under certain
-conditions; again, consult the TeXinfo manual for details.")
- "*Startup message for CVS.")
-
-(defconst pcl-cvs-bugs-address "pcl-cvs-auto-bugs@cyclic.com"
- "The destination address used for the default bug report form.")
-
-(defvar cvs-stdout-file nil
- "Name of the file that holds the output that CVS sends to stdout.
-This variable is buffer local.")
-
-(defvar cvs-lock-file nil
- "Full path to a lock file that CVS is waiting for (or was waiting for).")
-
-(defvar cvs-bakprefix ".#"
- "The prefix that CVS prepends to files when rcsmerge'ing.")
-
-(defvar cvs-erase-input-buffer nil
- "*Non-nil if input buffers should be cleared before asking for new info.")
-
-(defvar cvs-auto-remove-handled nil
- "*Non-nil if cvs-mode-remove-handled should be called automatically.
-If this is set to any non-nil value, entries that do not need to be checked in
-will be removed from the *cvs* buffer after every cvs-mode-commit command.")
-
-(defvar cvs-auto-remove-handled-directories nil
- "*Non-nil if cvs-mode-remove-handled and cvs-update should automatically
-remove empty directories.
-If this is set to any non-nil value, directories that do not contain any files
-to be checked in will be removed from the *cvs* buffer.")
-
-(defvar cvs-sort-ignore-file t
- "*Non-nil if cvs-mode-ignore should sort the .cvsignore automatically.")
-
-(defvar cvs-auto-revert-after-commit t
- "*Non-nil if committed buffers should be automatically reverted.")
-
-(defconst cvs-cursor-column 14
- "Column to position cursor in in cvs-mode.
-Column 0 is left-most column.")
-
-(defvar cvs-mode-map nil
- "Keymap for the cvs mode.")
-
-(defvar cvs-edit-mode-map nil
- "Keymap for the cvs edit mode (used when editing cvs log messages).")
-
-(defvar cvs-buffer-name "*cvs*"
- "Name of the cvs buffer.")
-
-(defvar cvs-commit-prompt-buffer "*cvs-commit-message*"
- "Name of buffer in which the user is prompted for a log message when
-committing files.")
-
-(defvar cvs-commit-buffer-require-final-newline t
- "*t says silently put a newline at the end of commit log messages.
-Non-nil but not t says ask user whether to add a newline in each such case.
-nil means don't add newlines.")
-
-(defvar cvs-temp-buffer-name "*cvs-tmp*"
- "*Name of the cvs temporary buffer.
-Output from cvs is placed here by synchronous commands.")
-
-(defvar cvs-diff-ignore-marks nil
- "*Non-nil if cvs-diff and cvs-mode-diff-backup should ignore any marked files.
-Normally they run diff on the files that are marked (with cvs-mode-mark),
-or the file under the cursor if no files are marked. If this variable
-is set to a non-nil value they will always run diff on the file on the
-current line.")
-
-;;; (setq cvs-status-flags '("-v"))
-(defvar cvs-status-flags '("-v")
- "*List of flags to pass to ``cvs status''. Default is \"-v\".")
-
-;;; (setq cvs-log-flags nil)
-(defvar cvs-log-flags nil
- "*List of flags to pass to ``cvs log''. Default is none.")
-
-;;; (setq cvs-tag-flags nil)
-(defvar cvs-tag-flags nil
- "*List of extra flags to pass to ``cvs tag''. Default is none.")
-
-;;; (setq cvs-rtag-flags nil)
-(defvar cvs-rtag-flags nil
- "*List of extra flags to pass to ``cvs rtag''. Default is none.")
-
-;;; (setq cvs-diff-flags '("-u"))
-(defvar cvs-diff-flags '("-u")
- "*List of flags to use as flags to pass to ``diff'' and ``cvs diff''.
-Used by cvs-mode-diff-cvs and cvs-mode-diff-backup. Default is \"-u\".
-
-Set this to \"-u\" to get a Unidiff format, or \"-c\" to get context diffs.")
-
-;;; (setq cvs-update-optional-flags nil)
-(defvar cvs-update-optional-flags nil
- "*List of strings to use as optional flags to pass to ``cvs update''. Used
-by cvs-do-update, called by cvs-update, cvs-update-other-window,
-cvs-mode-update-no-prompt, and cvs-examine. Default is none.
-
-For example set this to \"-j VENDOR_PREV_RELEASE -j VENDOR_TOP_RELEASE\" to
-perform an update after a new vendor release has been imported.
-
-To restrict the update to the current working directory, set this to \"-l\".")
-
-(defvar cvs-update-prog-output-skip-regexp "$"
- "*A regexp that matches the end of the output from all cvs update programs.
-That is, output from any programs that are run by CVS (by the flag -u in the
-`modules' file - see cvs(5)) when `cvs update' is performed should terminate
-with a line that this regexp matches. It is enough that some part of the line
-is matched.
-
-The default (a single $) fits programs without output.")
-
-;;; --------------------------------------------------------
-;;; The variables below are used internally by pcl-cvs. You should
-;;; never change them.
-
-(defvar cvs-buffers-to-delete nil
- "List of temporary buffers that should be discarded as soon as possible.
-Due to a bug in emacs 18.57 the sentinel can't discard them reliably.")
-
-(defvar cvs-update-running nil
- "This is set to nil when no process is running, and to
-the process when a cvs update process is running.")
-
-(defvar cvs-cookie-handle nil
- "Handle for the cookie structure that is displayed in the *cvs* buffer.")
-
-(defvar cvs-commit-list nil
- "Used internally by pcl-cvs.")
-
-;;; The cvs data structure:
-;;;
-;;; When the `cvs update' is ready we parse the output. Every file
-;;; that is affected in some way is added as a cookie of fileinfo
-;;; (as defined below).
-;;;
-
-;;; cvs-fileinfo
-
-;;; Constructor:
-
-(defun cvs-create-fileinfo (type
- dir
- file-name
- full-log)
- "Create a fileinfo from all parameters.
-Arguments: TYPE DIR FILE-NAME FULL-LOG.
-A fileinfo is a vector with the following fields:
-
-[0] handled True if this file doesn't require further action.
-[1] marked t/nil
-[2] type One of
- UPDATED - file copied from repository
- PATCHED - file update with patch from repository
- MODIFIED - modified by you, unchanged in
- repository
- ADDED - added by you, not yet committed
- REMOVED - removed by you, not yet committed
- CVS-REMOVED- removed, since file no longer exists
- in the repository.
- MERGED - successful merge
- CONFLICT - conflict when merging (if pcl-cvs did it)
- REM-CONFLICT-removed in repository, but altered
- locally.
- MOD-CONFLICT-removed locally, changed in repository.
- REM-EXIST - removed locally, but still exists.
- DIRCHANGE - A change of directory.
- UNKNOWN - An unknown file.
- UNKNOWN-DIR- An unknown directory.
- MOVE-AWAY - A file that is in the way.
- REPOS-MISSING- The directory has vanished from the
- repository.
- MESSAGE - This is a special fileinfo that is used
- to display a text that should be in
- full-log.
-[3] dir Directory the file resides in. Should not end with slash.
-[4] file-name The file name.
-[5] backup-file The name of a backup file created during a merge.
- Only valid for MERGED and CONFLICT files.
-[6] base-revision The revision that the working file was based on.
- Only valid for MERGED and CONFLICT files.
-[7] head-revision The revision that the newly merged changes came from
- Only valid for MERGED and CONFLICT files.
-[8] backup-revision The revision of the cvs backup file (original working rev.)
- Only valid for MERGED and CONFLICT files.
-[9] cvs-diff-buffer A buffer that contains a 'cvs diff file'.
-[10] vendor-diff-buffer A buffer that contains a 'diff base-file head-file'.
-[11] backup-diff-buffer A buffer that contains a 'diff file backup-file'.
-[12] full-log The output from cvs, unparsed.
-[13] mod-time Modification time of file used for *-diff-buffer."
-
- (cons
- 'CVS-FILEINFO
- (vector nil nil type dir file-name nil nil nil nil nil nil nil full-log nil nil)))
-
-;;; Selectors:
-
-(defun cvs-fileinfo->handled (cvs-fileinfo)
- "Get the `handled' field from CVS-FILEINFO."
- (elt (cdr cvs-fileinfo) 0))
-
-(defun cvs-fileinfo->marked (cvs-fileinfo)
- "Check if CVS-FILEINFO is marked."
- (elt (cdr cvs-fileinfo) 1))
-
-(defun cvs-fileinfo->type (cvs-fileinfo)
- "Get type from CVS-FILEINFO.
-Type is one of UPDATED, PATCHED, MODIFIED, ADDED, REMOVED, CVS-REMOVED, MERGED,
-CONFLICT, REM-CONFLICT, MOD-CONFLICT, REM-EXIST, DIRCHANGE, UNKNOWN,
-UNKNOWN-DIR, MOVE-AWAY, REPOS-MISSING or MESSAGE."
- (elt (cdr cvs-fileinfo) 2))
-
-(defun cvs-fileinfo->dir (cvs-fileinfo)
- "Get dir from CVS-FILEINFO.
-The directory name does not end with a slash."
- (elt (cdr cvs-fileinfo) 3))
-
-(defun cvs-fileinfo->file-name (cvs-fileinfo)
- "Get file-name from CVS-FILEINFO."
- (elt (cdr cvs-fileinfo) 4))
-
-(defun cvs-fileinfo->backup-file (cvs-fileinfo)
- "Get backup-file from CVS-FILEINFO."
- (elt (cdr cvs-fileinfo) 5))
-
-(defun cvs-fileinfo->base-revision (cvs-fileinfo)
- "Get the base revision from CVS-FILEINFO."
- (elt (cdr cvs-fileinfo) 6))
-
-(defun cvs-fileinfo->head-revision (cvs-fileinfo)
- "Get the head revision from CVS-FILEINFO."
- (elt (cdr cvs-fileinfo) 7))
-
-(defun cvs-fileinfo->backup-revision (cvs-fileinfo)
- "Get the backup revision from CVS-FILEINFO."
- (elt (cdr cvs-fileinfo) 8))
-
-(defun cvs-fileinfo->cvs-diff-buffer (cvs-fileinfo)
- "Get cvs-diff-buffer from CVS-FILEINFO."
- (elt (cdr cvs-fileinfo) 9))
-
-(defun cvs-fileinfo->vendor-diff-buffer (cvs-fileinfo)
- "Get backup-diff-buffer from CVS-FILEINFO."
- (elt (cdr cvs-fileinfo) 10))
-
-(defun cvs-fileinfo->backup-diff-buffer (cvs-fileinfo)
- "Get backup-diff-buffer from CVS-FILEINFO."
- (elt (cdr cvs-fileinfo) 11))
-
-(defun cvs-fileinfo->full-log (cvs-fileinfo)
- "Get full-log from CVS-FILEINFO."
- (elt (cdr cvs-fileinfo) 12))
-
-(defun cvs-fileinfo->mod-time (cvs-fileinfo)
- "Get mod-time from CVS-FILEINFO."
- (elt (cdr cvs-fileinfo) 13))
-
-;;; Modifiers:
-
-(defun cvs-set-fileinfo->handled (cvs-fileinfo newval)
- "Set handled in CVS-FILEINFO to NEWVAL."
- (aset (cdr cvs-fileinfo) 0 newval))
-
-(defun cvs-set-fileinfo->marked (cvs-fileinfo newval)
- "Set marked in CVS-FILEINFO to NEWVAL."
- (aset (cdr cvs-fileinfo) 1 newval))
-
-(defun cvs-set-fileinfo->type (cvs-fileinfo newval)
- "Set type in CVS-FILEINFO to NEWVAL."
- (aset (cdr cvs-fileinfo) 2 newval))
-
-(defun cvs-set-fileinfo->dir (cvs-fileinfo newval)
- "Set dir in CVS-FILEINFO to NEWVAL.
-The directory should now end with a slash."
- (aset (cdr cvs-fileinfo) 3 newval))
-
-(defun cvs-set-fileinfo->file-name (cvs-fileinfo newval)
- "Set file-name in CVS-FILEINFO to NEWVAL."
- (aset (cdr cvs-fileinfo) 4 newval))
-
-(defun cvs-set-fileinfo->backup-file (cvs-fileinfo newval)
- "Set backup-file in CVS-FILEINFO to NEWVAL."
- (aset (cdr cvs-fileinfo) 5 newval))
-
-(defun cvs-set-fileinfo->base-revision (cvs-fileinfo newval)
- "Set base-revision in CVS-FILEINFO to NEWVAL."
- (aset (cdr cvs-fileinfo) 6 newval))
-
-(defun cvs-set-fileinfo->head-revision (cvs-fileinfo newval)
- "Set head-revision in CVS-FILEINFO to NEWVAL."
- (aset (cdr cvs-fileinfo) 7 newval))
-
-(defun cvs-set-fileinfo->backup-revision (cvs-fileinfo newval)
- "Set backup-revision in CVS-FILEINFO to NEWVAL."
- (aset (cdr cvs-fileinfo) 8 newval))
-
-(defun cvs-set-fileinfo->cvs-diff-buffer (cvs-fileinfo newval)
- "Set cvs-diff-buffer in CVS-FILEINFO to NEWVAL."
- (aset (cdr cvs-fileinfo) 9 newval))
-
-(defun cvs-set-fileinfo->vendor-diff-buffer (cvs-fileinfo newval)
- "Set vendor-diff-buffer in CVS-FILEINFO to NEWVAL."
- (aset (cdr cvs-fileinfo) 10 newval))
-
-(defun cvs-set-fileinfo->backup-diff-buffer (cvs-fileinfo newval)
- "Set backup-diff-buffer in CVS-FILEINFO to NEWVAL."
- (aset (cdr cvs-fileinfo) 11 newval))
-
-(defun cvs-set-fileinfo->full-log (cvs-fileinfo newval)
- "Set full-log in CVS-FILEINFO to NEWVAL."
- (aset (cdr cvs-fileinfo) 12 newval))
-
-(defun cvs-set-fileinfo->mod-time (cvs-fileinfo newval)
- "Set full-log in CVS-FILEINFO to NEWVAL."
- (aset (cdr cvs-fileinfo) 13 newval))
-
-;;; Predicate:
-
-(defun cvs-fileinfo-p (object)
- "Return t if OBJECT is a cvs-fileinfo."
- (eq (car-safe object) 'CVS-FILEINFO))
-
-;;;; End of types.
-
-;;----------
-(defun cvs-use-temp-buffer ()
- "Display a temporary buffer in another window and select it.
-The selected window will not be changed. The temporary buffer will
-be erased and writable."
-
- (let ((dir default-directory))
- (display-buffer (get-buffer-create cvs-temp-buffer-name))
- (set-buffer cvs-temp-buffer-name)
- (setq buffer-read-only nil)
- (setq default-directory dir)
- (erase-buffer)))
-
-;;----------
-(defun cvs-examine (directory &optional local)
- "Run a 'cvs -n update' in the current working directory.
-That is, check what needs to be done, but don't change the disc.
-Feed the output to a *cvs* buffer and run cvs-mode on it.
-If optional prefix argument LOCAL is non-nil, 'cvs update -l' is run.
-WARNING: this doesn't work very well yet...."
-
- ;; TODO: this should do everything cvs-update does...
- ;; for example, for CONFLICT files, it should setup fileinfo appropriately
-
- (interactive (list (read-file-name "CVS Update (directory): "
- nil default-directory nil)
- current-prefix-arg))
- (cvs-do-update directory local 'noupdate))
-
-;;----------
-(defun cvs-update (directory &optional local)
- "Run a 'cvs update' in the current working directory. Feed the
-output to a *cvs* buffer and run cvs-mode on it.
-If optional prefix argument LOCAL is non-nil, 'cvs update -l' is run."
-
- (interactive (list (read-file-name "CVS Update (directory): "
- nil default-directory nil)
- current-prefix-arg))
- (cvs-do-update directory local nil)
- (switch-to-buffer cvs-buffer-name))
-
-;;----------
-(defun cvs-update-other-window (directory &optional local)
- "Run a 'cvs update' in the current working directory. Feed the
-output to a *cvs* buffer, display it in the other window, and run
-cvs-mode on it.
-
-If optional prefix argument LOCAL is non-nil, 'cvs update -l' is run."
-
- (interactive (list (read-file-name "CVS Update other window (directory): "
- nil default-directory nil)
- current-prefix-arg))
- (cvs-do-update directory local nil)
- (switch-to-buffer-other-window cvs-buffer-name))
-
-;;----------
-(defun cvs-filter (predicate list &rest extra-args)
- "Apply PREDICATE to each element on LIST.
-Args: PREDICATE LIST &rest EXTRA-ARGS.
-
-Return a new list consisting of those elements that PREDICATE
-returns non-nil for.
-
-If more than two arguments are given the remaining args are
-passed to PREDICATE."
-
- ;; Avoid recursion - this should work for LONG lists also!
- (let* ((head (cons 'dummy-header nil))
- (tail head))
- (while list
- (if (apply predicate (car list) extra-args)
- (setq tail (setcdr tail (list (car list)))))
- (setq list (cdr list)))
- (cdr head)))
-
-;;----------
-(defun cvs-mode-update-no-prompt ()
- "Run cvs update in current directory."
-
- (interactive)
- (cvs-do-update default-directory nil nil))
-
-;;----------
-(defun cvs-do-update (directory local dont-change-disc)
- "Do a 'cvs update' in DIRECTORY.
-Args: DIRECTORY LOCAL DONT-CHANGE-DISC.
-
-If LOCAL is non-nil 'cvs update -l' is executed.
-If DONT-CHANGE-DISC is non-nil 'cvs -n update' is executed.
-Both LOCAL and DONT-CHANGE-DISC may be non-nil simultaneously.
-
-*Note*: DONT-CHANGE-DISC does not yet work. The parser gets confused."
-
- (save-some-buffers)
- ;; Ensure that it is safe to do an update. If not, ask user
- ;; for confirmation.
- (if (and (boundp 'cvs-cookie-handle) (collection-buffer cvs-cookie-handle))
- (if (collection-collect-tin
- cvs-cookie-handle
- '(lambda (cookie) (eq (cvs-fileinfo->type cookie) 'CONFLICT)))
- (if (not
- (yes-or-no-p
- "Only update if conflicts have been resolved. Continue? "))
- (error "Update aborted by user request."))))
- (if (not (file-exists-p cvs-program))
- (error "%s: file not found (check setting of cvs-program)"
- cvs-program))
- (let* ((this-dir (file-name-as-directory (expand-file-name directory)))
- (update-buffer (generate-new-buffer
- (concat " " (file-name-nondirectory
- (substring this-dir 0 -1))
- "-update")))
- (temp-name (make-temp-name
- (concat (file-name-as-directory
- (or (getenv "TMPDIR") "/tmp"))
- "pcl-cvs.")))
- (args nil))
-
- ;; Check that this-dir exists and is a directory that is under CVS contr.
-
- (if (not (file-directory-p this-dir))
- (error "%s is not a directory." this-dir))
- (if (not (file-directory-p (concat this-dir "CVS")))
- (error "%s does not contain CVS controlled files." this-dir))
- (if (file-readable-p (concat this-dir "CVS/Root"))
- (save-excursion ; read CVS/Root into cvs-cvsroot
- (find-file (concat this-dir "CVS/Root"))
- (goto-char (point-min))
- (setq cvs-cvsroot (buffer-substring (point)
- (progn (end-of-line) (point))))
- (if (not cvs-cvsroot)
- (error "Invalid contents of %sCVS/Root" this-dir))
- (kill-buffer (current-buffer)))
- (if (and cvs-cvsroot-required
- (not (or (getenv "CVSROOT") cvs-cvsroot)))
- (error "Both cvs-cvsroot and environment variable CVSROOT are unset, and no CVS/Root.")))
-
- ;; Check that at most one `cvs update' is run at any time.
-
- (if (and cvs-update-running (process-status cvs-update-running)
- (or (eq (process-status cvs-update-running) 'run)
- (eq (process-status cvs-update-running) 'stop)))
- (error "Can't run two `cvs update' simultaneously."))
-
- (if (not (listp cvs-update-optional-flags))
- (error "cvs-update-optional-flags should be set using cvs-set-update-optional-flags"))
-
- ;; Generate "-d /master -n update -l".
- (setq args (concat (if cvs-cvsroot (concat " -d " cvs-cvsroot))
- (if dont-change-disc " -n ")
- " update "
- (if local " -l ")
- (if cvs-update-optional-flags
- (mapconcat 'identity
- (copy-sequence cvs-update-optional-flags)
- " "))))
-
- ;; Set up the buffer that receives the stderr output from "cvs update".
- (set-buffer update-buffer)
- (setq default-directory this-dir)
- (make-local-variable 'cvs-stdout-file)
- (setq cvs-stdout-file temp-name)
-
- (setq cvs-update-running
- (let ((process-connection-type nil)) ; Use a pipe, not a pty.
- (start-process "cvs" update-buffer cvs-shell "-c"
- (concat cvs-program " " args " > " temp-name))))
-
- (setq mode-line-process
- (concat ": "
- (symbol-name (process-status cvs-update-running))))
- (set-buffer-modified-p (buffer-modified-p)) ; Update the mode line.
- (set-process-sentinel cvs-update-running 'cvs-sentinel)
- (set-process-filter cvs-update-running 'cvs-update-filter)
- (set-marker (process-mark cvs-update-running) (point-min))
-
- (save-excursion
- (set-buffer (get-buffer-create cvs-buffer-name))
- (setq buffer-read-only nil)
- (erase-buffer)
- (cvs-mode))
-
- (setq cvs-cookie-handle
- (collection-create
- cvs-buffer-name 'cvs-pp
- cvs-startup-message ;See comment above cvs-startup-message.
- "---------- End -----"))
-
- (cookie-enter-first
- cvs-cookie-handle
- (cvs-create-fileinfo
- 'MESSAGE nil nil (concat "\n Running `cvs " args "' in " this-dir
- "...\n")))
-
- (save-excursion
- (set-buffer cvs-buffer-name)
- (setq mode-line-process
- (concat ": "
- (symbol-name (process-status cvs-update-running))))
- (set-buffer-modified-p (buffer-modified-p)) ; Update the mode line.
- (setq buffer-read-only t))
-
- ;; Work around a bug in emacs 18.57 and earlier.
- (setq cvs-buffers-to-delete
- (cvs-delete-unused-temporary-buffers cvs-buffers-to-delete)))
-
- ;; The following line is said to improve display updates on some
- ;; emacses. It shouldn't be needed, but it does no harm.
- (sit-for 0))
-
-;;----------
-(defun cvs-delete-unused-temporary-buffers (list)
- "Delete all buffers on LIST that is not visible.
-Return a list of all buffers that still is alive."
-
- (cond
- ((null list) nil)
- ((get-buffer-window (car list))
- (cons (car list)
- (cvs-delete-unused-temporary-buffers (cdr list))))
- (t
- (kill-buffer (car list))
- (cvs-delete-unused-temporary-buffers (cdr list)))))
-
-;;----------
-(put 'cvs-mode 'mode-class 'special)
-
-;;----------
-(defun cvs-mode ()
- "\\<cvs-mode-map>Mode used for pcl-cvs, a front-end to CVS.
-
-To get to the \"*cvs*\" buffer you should use ``\\[execute-extended-command] cvs-update''.
-
-Full documentation is in the Texinfo file. Here are the most useful commands:
-
-\\[cvs-mode-previous-line] Move up. \\[cvs-mode-next-line] Move down.
-\\[cvs-mode-commit] Commit file. \\[cvs-mode-update-no-prompt] Re-update directory.
-\\[cvs-mode-mark] Mark file/dir. \\[cvs-mode-unmark] Unmark file/dir.
-\\[cvs-mode-mark-all-files] Mark all files. \\[cvs-mode-unmark-all-files] Unmark all files.
-\\[cvs-mode-find-file] Edit file/run Dired. \\[cvs-mode-find-file-other-window] Find file or run Dired in other window.
-\\[cvs-mode-ignore] Add file to ./.cvsignore. \\[cvs-mode-add-change-log-entry-other-window] Write ChangeLog in other window.
-\\[cvs-mode-add] Add to repository. \\[cvs-mode-remove-file] Remove file.
-\\[cvs-mode-diff-cvs] Diff with base revision. \\[cvs-mode-diff-backup] Diff backup file.
-\\[cvs-mode-ediff] Ediff base rev & backup. \\[cvs-mode-diff-vendor] Show merge from vendor branch.
-\\[cvs-mode-emerge] Emerge base rev & backup. \\[cvs-mode-diff-backup] Diff backup file.
-\\[cvs-mode-acknowledge] Delete line from buffer. \\[cvs-mode-remove-handled] Remove processed entries.
-\\[cvs-mode-log] Run ``cvs log''. \\[cvs-mode-status] Run ``cvs status''.
-\\[cvs-mode-tag] Run ``cvs tag''. \\[cvs-mode-rtag] Run ``cvs rtag''.
-\\[cvs-mode-changelog-commit] Like \\[cvs-mode-commit], but get default log text from ChangeLog.
-\\[cvs-mode-undo-local-changes] Revert the last checked in version - discard your changes to the file.
-
-Entry to this mode runs cvs-mode-hook.
-This description is updated for release 1.05-CVS-$Name: $ of pcl-cvs.
-
-All bindings:
-\\{cvs-mode-map}"
-
- (interactive)
- (setq major-mode 'cvs-mode)
- (setq mode-name "CVS")
- (setq mode-line-process nil)
-;; for older v18 emacs
-;;(buffer-flush-undo (current-buffer))
- (buffer-disable-undo (current-buffer))
- (make-local-variable 'goal-column)
- (setq goal-column cvs-cursor-column)
- (use-local-map cvs-mode-map)
- (run-hooks 'cvs-mode-hook))
-
-;;----------
-(defun cvs-sentinel (proc msg)
- "Sentinel for the cvs update process.
-This is responsible for parsing the output from the cvs update when
-it is finished."
-
- (cond
- ((null (buffer-name (process-buffer proc)))
- ;; buffer killed
- (set-process-buffer proc nil))
- ((memq (process-status proc) '(signal exit))
- (let* ((obuf (current-buffer))
- (omax (point-max))
- (opoint (point)))
- ;; save-excursion isn't the right thing if
- ;; process-buffer is current-buffer
- (unwind-protect
- (progn
- (set-buffer (process-buffer proc))
- (setq mode-line-process
- (concat ": "
- (symbol-name (process-status proc))))
- (let* ((out-file cvs-stdout-file)
- (stdout-buffer (find-file-noselect out-file)))
- (save-excursion
- (set-buffer stdout-buffer)
- (rename-buffer (concat " "
- (file-name-nondirectory out-file)) t))
- (cvs-parse-update stdout-buffer (process-buffer proc))
- (setq cvs-buffers-to-delete
- (cons (process-buffer proc)
- (cons stdout-buffer
- cvs-buffers-to-delete)))
- (delete-file out-file)))
- (set-buffer-modified-p (buffer-modified-p))
- (setq cvs-update-running nil))
- (if (equal obuf (process-buffer proc))
- nil
- (set-buffer (process-buffer proc))
- (if (< opoint omax)
- (goto-char opoint))
- (set-buffer obuf))))))
-
-;;----------
-(defun cvs-update-filter (proc string)
- "Filter function for pcl-cvs.
-This function gets the output that CVS sends to stderr. It inserts it
-into (process-buffer proc) but it also checks if CVS is waiting for a
-lock file. If so, it inserts a message cookie in the *cvs* buffer."
-
- (let ((old-buffer (current-buffer))
- (data (match-data)))
- (unwind-protect
- (progn
- (set-buffer (process-buffer proc))
- (save-excursion
- ;; Insert the text, moving the process-marker.
- (goto-char (process-mark proc))
- (insert string)
- (set-marker (process-mark proc) (point))
- ;; Delete any old lock message
- (if (tin-nth cvs-cookie-handle 1)
- (tin-delete cvs-cookie-handle
- (tin-nth cvs-cookie-handle 1)))
- ;; Check if CVS is waiting for a lock.
- (beginning-of-line 0) ;Move to beginning of last
- ;complete line.
- (cond
- ((looking-at
- "^cvs \\(update\\|server\\): \\[..:..:..\\] waiting for \\(.*\\)lock in \\(.*\\)$")
- (setq cvs-lock-file (buffer-substring (match-beginning 3)
- (match-end 3)))
- (cookie-enter-last
- cvs-cookie-handle
- (cvs-create-fileinfo
- 'MESSAGE nil nil
- (concat "\tWaiting for "
- (buffer-substring (match-beginning 2)
- (match-end 2))
- "lock in " cvs-lock-file
- ".\n\t (type M-x cvs-delete-lock to delete it)")))))))
- (store-match-data data)
- (set-buffer old-buffer))))
-
-;;----------
-(defun cvs-delete-lock ()
- "Delete the lock file that CVS is waiting for.
-Note that this can be dangerous. You should only do this
-if you are convinced that the process that created the lock is dead."
-
- (interactive)
- (cond
- ((not (or (file-exists-p
- (concat (file-name-as-directory cvs-lock-file) "#cvs.lock"))
- (cvs-filter (function cvs-lock-file-p)
- (directory-files cvs-lock-file))))
- (error "No lock files found."))
- ((yes-or-no-p (concat "Really delete locks in " cvs-lock-file "? "))
- ;; Re-read the directory -- the locks might have disappeared.
- (let ((locks (cvs-filter (function cvs-lock-file-p)
- (directory-files cvs-lock-file))))
- (while locks
- (delete-file (concat (file-name-as-directory cvs-lock-file)
- (car locks)))
- (setq locks (cdr locks)))
- (cvs-remove-directory
- (concat (file-name-as-directory cvs-lock-file) "#cvs.lock"))))))
-
-;;----------
-(defun cvs-remove-directory (dir)
- "Remove a directory."
-
- (if (file-directory-p dir)
- (call-process cvs-rmdir-program nil nil nil dir)
- (error "Not a directory: %s" dir))
- (if (file-exists-p dir)
- (error "Could not remove directory %s" dir)))
-
-;;----------
-(defun cvs-lock-file-p (file)
- "Return true if FILE looks like a CVS lock file."
-
- (or
- (string-match "^#cvs.tfl.[0-9]+$" file)
- (string-match "^#cvs.rfl.[0-9]+$" file)
- (string-match "^#cvs.wfl.[0-9]+$" file)))
-
-;;----------
-(defun cvs-quote-multiword-string (str)
- "Return STR surrounded in single quotes if it contains whitespace."
- (cond ((string-match "[ \t\n]" str)
- (concat "'" str "'"))
- (t
- str)))
-
-;;----------
-;; this should be in subr.el or some similar place....
-(defun parse-string (str &optional regexp)
- "Explode the string STR into a list of words ala strtok(3). Optional REGEXP
-defines regexp matching word separator, which defaults to \"[ \\t\\n]+\"."
- (let (str-list ; new list
- str-token ; "index" of next token
- (str-start 0) ; "index" of current token
- (str-sep (if regexp
- regexp
- "[ \t\n]+")))
- (while (setq str-token (string-match str-sep str str-start))
- (setq str-list
- (nconc str-list
- (list (substring str str-start str-token))))
- (setq str-start (match-end 0)))
- ;; tag on the remainder as the final item
- (if (not (>= str-start (length str)))
- (setq str-list
- (nconc str-list
- (list (substring str str-start)))))
- str-list))
-
-;;----------
-(defun cvs-make-list (str)
- "Return list of words made from the string STR."
- (cond ((string-match "[ \t\n]+" str)
- (let ((new-str (parse-string str "[ \t\n]+")))
- ;; this is ugly, but assume if the first element is empty, there are
- ;; no more elements.
- (cond ((string= (car new-str) "")
- nil)
- (t
- new-str))))
- ((string= str "")
- nil)
- (t
- (list str))))
-
-;;----------
-(defun cvs-skip-line (stdout stderr regexp &optional arg)
- "Like forward-line, but check that the skipped line matches REGEXP.
-Args: STDOUT STDERR REGEXP &optional ARG.
-
-If it doesn't match REGEXP a bug report is generated and displayed.
-STDOUT and STDERR is only used to do that.
-
-If optional ARG, a number, is given the ARGth parenthesized expression
-in the REGEXP is returned as a string.
-Point should be in column 1 when this function is called."
-
- (cond
- ((looking-at regexp)
- (forward-line 1)
- (if arg
- (buffer-substring (match-beginning arg)
- (match-end arg))))
- (t
- (cvs-parse-error stdout
- stderr
- (if (eq (current-buffer) stdout)
- 'STDOUT
- 'STDERR)
- (point)
- regexp))))
-
-;;----------
-(defun cvs-get-current-dir (root-dir dirname)
- "Return current working directory, suitable for cvs-parse-update.
-Args: ROOT-DIR DIRNAME.
-
-Concatenates ROOT-DIR and DIRNAME to form an absolute path."
-
- (if (string= "." dirname)
- (substring root-dir 0 -1)
- (concat root-dir dirname)))
-
-;;----------
-(defun cvs-compare-fileinfos (a b)
- "Compare fileinfo A with fileinfo B and return t if A is `less'."
-
- (cond
- ;; Sort acording to directories.
- ((string< (cvs-fileinfo->dir a) (cvs-fileinfo->dir b)) t)
- ((not (string= (cvs-fileinfo->dir a) (cvs-fileinfo->dir b))) nil)
- ;; The DIRCHANGE entry is always first within the directory.
- ((and (eq (cvs-fileinfo->type a) 'DIRCHANGE)
- (not (eq (cvs-fileinfo->type b) 'DIRCHANGE))) t)
- ((and (eq (cvs-fileinfo->type b) 'DIRCHANGE)
- (not (eq (cvs-fileinfo->type a) 'DIRCHANGE))) nil)
- ;; All files are sorted by file name.
- ((string< (cvs-fileinfo->file-name a) (cvs-fileinfo->file-name b)))))
-
-;;----------
-(defun cvs-parse-error (stdout-buffer stderr-buffer err-buf pos &optional indicator)
- "Handle a parse error when parsing the output from cvs.
-Args: STDOUT-BUFFER STDERR-BUFFER ERR-BUF POS &optional INDICATOR.
-
-ERR-BUF should be 'STDOUT or 'STDERR."
-
- (setq pos (1- pos))
- (set-buffer cvs-buffer-name)
- (setq buffer-read-only nil)
- (erase-buffer)
- (insert "To: " pcl-cvs-bugs-address "\n")
- (insert "Subject: pcl-cvs release" pcl-cvs-version " parse error.\n")
- (insert (concat mail-header-separator "\n"))
- (insert "This bug report is automatically generated by pcl-cvs\n")
- (insert "because it doesn't understand some output from CVS. Below\n")
- (insert "is detailed information about the error. Please send\n")
- (insert "this, together with any information you think might be\n")
- (insert "useful for me to fix the bug, to the address above. But\n")
- (insert "please check the \"known problems\" section of the\n")
- (insert "documentation first. Note that this buffer contains\n")
- (insert "information that you might consider confidential. You\n")
- (insert "are encouraged to read through it before sending it.\n")
- (insert "\n")
- (insert "Press C-c C-c to send this email.\n\n")
- (insert "Please state the version of these programs you are using:\n\n")
- (insert "RCS: \ndiff: \n\n")
-
- (let* ((stdout (save-excursion (set-buffer stdout-buffer) (buffer-string)))
- (stderr (save-excursion (set-buffer stderr-buffer) (buffer-string)))
- (errstr (if (eq err-buf 'STDOUT) stdout stderr))
- (errline-end (string-match "\n" errstr pos))
- (errline (substring errstr pos errline-end)))
- (insert (format "Offending line (%d chars): >" (- errline-end pos)))
- (insert errline)
- (insert "<\n")
- (insert "Sent to " (symbol-name err-buf) " at pos " (format "%d\n" pos))
- (if indicator
- (insert "Optional args: \"" indicator "\".\n"))
- (insert "\nEmacs-version: " (emacs-version) "\n")
- (insert "Pcl-cvs Version: "
- "@(#)OrigId: pcl-cvs.el,v 1.93 1993/05/31 22:44:00 ceder Exp\n")
- (insert "CVS Version: "
- "@(#)cvs/contrib/pcl-cvs:$Name: $:$Id: pcl-cvs.el,v 1.1 1996/05/06 22:20:47 tholo Exp $\n\n")
- (insert (format "--- Contents of stdout buffer (%d chars) ---\n"
- (length stdout)))
- (insert stdout)
- (insert "--- End of stdout buffer ---\n")
- (insert (format "--- Contents of stderr buffer (%d chars) ---\n"
- (length stderr)))
- (insert stderr)
- (insert "--- End of stderr buffer ---\n")
- (insert "\nEnd of bug report.\n")
- (require 'sendmail)
- (mail-mode)
- (error "CVS parse error - please report this bug.")))
-
-;;----------
-(defun cvs-parse-update (stdout-buffer stderr-buffer)
- "Parse the output from `cvs update'.
-
-Args: STDOUT-BUFFER STDERR-BUFFER.
-
-This functions parses the from `cvs update' (which should be
-separated in its stdout- and stderr-components) and prints a
-pretty representation of it in the *cvs* buffer.
-
-Signals an error if unexpected output was detected in the buffer."
-
- (let* ((head (cons 'dummy nil))
- (tail (cvs-parse-stderr stdout-buffer stderr-buffer
- head default-directory))
- (root-dir default-directory))
- (cvs-parse-stdout stdout-buffer stderr-buffer tail root-dir)
- (setq head (sort (cdr head) (function cvs-compare-fileinfos)))
- (collection-clear cvs-cookie-handle)
- (collection-append-cookies cvs-cookie-handle head)
- (cvs-remove-stdout-shadows)
- (if cvs-auto-remove-handled-directories
- (cvs-remove-empty-directories))
- (set-buffer cvs-buffer-name)
- (cvs-mode)
- (goto-char (point-min))
- (tin-goto-previous cvs-cookie-handle (point-min) 1)
- (setq default-directory root-dir)))
-
-;;----------
-(defun cvs-remove-stdout-shadows ()
- "Remove entries in the *cvs* buffer that comes from both stdout and stderr.
-If there is two entries for a single file the second one should be
-deleted. (Remember that sort uses a stable sort algorithm, so one can
-be sure that the stderr entry is always first)."
-
- (collection-filter-tins cvs-cookie-handle
- (function
- (lambda (tin)
- (not (cvs-shadow-entry-p tin))))))
-
-;;----------
-(defun cvs-shadow-entry-p (tin)
- "Return non-nil if TIN is a shadow entry.
-Args: TIN.
-
-A TIN is a shadow entry if the previous tin contains the same file."
-
- (let* ((previous-tin (tin-previous cvs-cookie-handle tin))
- (curr (tin-cookie cvs-cookie-handle tin))
- (prev (and previous-tin
- (tin-cookie cvs-cookie-handle previous-tin))))
- (and
- prev curr
- (string= (cvs-fileinfo->file-name prev)
- (cvs-fileinfo->file-name curr))
- (string= (cvs-fileinfo->dir prev)
- (cvs-fileinfo->dir curr))
- (or
- (and (eq (cvs-fileinfo->type prev) 'CONFLICT)
- (eq (cvs-fileinfo->type curr) 'CONFLICT))
- (and (eq (cvs-fileinfo->type prev) 'MERGED)
- (eq (cvs-fileinfo->type curr) 'MODIFIED))
- (and (eq (cvs-fileinfo->type prev) 'REM-EXIST)
- (eq (cvs-fileinfo->type curr) 'REMOVED))))))
-
-;;----------
-(defun cvs-find-backup-file (filename &optional dirname)
- "Look for a backup file for FILENAME, optionally in directory DIRNAME, and if
-there is one, return the name of the first file found as a string."
-
- (if (eq dirname nil)
- (setq dirname default-directory))
- (car (directory-files dirname nil (concat "^\\" cvs-bakprefix filename
- "\\."))))
-
-;;----------
-(defun cvs-find-backup-revision (filename)
- "Take FILENAME as the name of a cvs backup file and return the revision of
-that file as a string."
-
- (substring filename
- (+ 1 (string-match "\\.\\([0-9.]+\\)$" filename))))
-
-;;----------
-(defun cvs-parse-stderr (stdout-buffer stderr-buffer head dir)
- "Parse the output from CVS that is written to stderr.
-Args: STDOUT-BUFFER STDERR-BUFFER HEAD DIR
-
-STDOUT-BUFFER holds the output that cvs sent to stdout. It is only
-used to create a bug report in case there is a parse error.
-STDERR-BUFFER is the buffer that holds the output to parse.
-HEAD is a cons-cell, the head of the list that is built.
-DIR is the directory the `cvs update' was run in.
-
-This function returns the last cons-cell in the list that is built."
-
- (save-window-excursion
- (set-buffer stderr-buffer)
- (goto-char (point-min))
- (let ((current-dir dir)
- (root-dir dir))
-
- (while (< (point) (point-max))
- (cond
-
- ;; CVS is descending a subdirectory.
-
- ((looking-at
- "^cvs \\(server\\|update\\): Updating \\(.*\\)$")
- (setq current-dir
- (cvs-get-current-dir
- root-dir
- (buffer-substring (match-beginning 2) (match-end 2))))
- (setcdr head (list (cvs-create-fileinfo
- 'DIRCHANGE
- current-dir
- "." ; the old version had nil here???
- (buffer-substring (match-beginning 0)
- (match-end 0)))))
- (setq head (cdr head))
- (forward-line 1))
-
- ;; File removed, since it is removed (by third party) in repository.
-
- ((or (looking-at
- "^cvs \\(update\\|server\\): warning: \\(.*\\) is not (any longer) pertinent")
- (looking-at
- "^cvs \\(update\\|server\\): \\(.*\\) is no longer in the repository"))
-
- (setcdr head (list (cvs-create-fileinfo
- 'CVS-REMOVED
- current-dir
- (file-name-nondirectory
- (buffer-substring (match-beginning 2)
- (match-end 2)))
- (buffer-substring (match-beginning 0)
- (match-end 0)))))
- (setq head (cdr head))
- (forward-line 1))
-
- ;; File removed by you, but recreated by cvs. Ignored. Will say
- ;; "Updated" on the next line.
-
- ((looking-at
- "^cvs \\(update\\|server\\): warning: .* was lost$")
- (forward-line 1))
-
- ;; File unknown for some reason.
- ;; FIXME: is it really a good idea to add this as unknown here?
-
- ((looking-at
- "cvs \\(update\\|server\\): nothing known about \\(.*\\)$")
- (let ((filename (buffer-substring (match-beginning 2)
- (match-end 2))))
- (if (file-directory-p filename)
- (setcdr head (list (cvs-create-fileinfo
- 'UNKNOWN-DIR
- current-dir
- "."
- (buffer-substring (match-beginning 0)
- (match-end 0)))))
- (setcdr head (list (cvs-create-fileinfo
- 'UNKNOWN
- current-dir
- (file-name-nondirectory filename)
- (buffer-substring (match-beginning 0)
- (match-end 0)))))))
- (setq head (cdr head))
- (forward-line 1))
-
- ;; A file that has been created by you, but added to the cvs
- ;; repository by another.
-
- ((looking-at
- "^cvs \\(update\\|server\\): move away \\(.*\\); it is in the way$")
- (setcdr head (list (cvs-create-fileinfo
- 'MOVE-AWAY
- current-dir
- (file-name-nondirectory
- (buffer-substring (match-beginning 2)
- (match-end 2)))
- (buffer-substring (match-beginning 0)
- (match-end 0)))))
- (setq head (cdr head))
- (forward-line 1))
-
- ;; Cvs waits for a lock. Ignore.
-
- ((looking-at
- "^cvs \\(update\\|server\\): \\[..:..:..\\] waiting for .*lock in ")
- (forward-line 1))
-
- ;; File removed in repository, but edited by you.
-
- ((looking-at
- "^cvs \\(update\\|server\\): conflict: \\(.*\\) is modified but no longer in the repository$")
- (setcdr head (list
- (cvs-create-fileinfo
- 'REM-CONFLICT
- current-dir
- (file-name-nondirectory
- (buffer-substring (match-beginning 2)
- (match-end 2)))
- (buffer-substring (match-beginning 0)
- (match-end 0)))))
- (setq head (cdr head))
- (forward-line 1))
-
- ;; File removed in repository, but edited by someone else.
-
- ((looking-at
- "^cvs \\(update\\|server\\): conflict: removed \\(.*\\) was modified by second party")
- (setcdr head
- (list
- (cvs-create-fileinfo
- 'MOD-CONFLICT
- current-dir
- (buffer-substring (match-beginning 1)
- (match-end 1))
- (buffer-substring (match-beginning 0)
- (match-end 0)))))
- (setq head (cdr head))
- (forward-line 1))
-
- ;; File removed in repository, but not in local directory.
-
- ((looking-at
- "^cvs \\(update\\|server\\): \\(.*\\) should be removed and is still there")
- (setcdr head
- (list
- (cvs-create-fileinfo
- 'REM-EXIST
- current-dir
- (buffer-substring (match-beginning 2)
- (match-end 2))
- (buffer-substring (match-beginning 0)
- (match-end 0)))))
- (setq head (cdr head))
- (forward-line 1))
-
- ;; Error searching for repository
-
- ((looking-at
- "^cvs \\(update\\|server\\): in directory ")
- (let ((start (point)))
- (forward-line 1)
- (cvs-skip-line stdout-buffer stderr-buffer
- (regexp-quote "cvs [update aborted]: there is no repository "))
- (setcdr head (list (cvs-create-fileinfo
- 'REPOS-MISSING
- current-dir
- nil
- (buffer-substring start (point)))))
- (setq head (cdr head))))
-
- ;; Silly warning from attempted conflict resolution. Ignored.
- ;; FIXME: Should it be?
- ;; eg.: "cvs update: cannot find revision APC-web-update in file .cvsignore"
- ;;
- ((looking-at
- "^cvs \\(update\\|server\\): cannot find revision \\(.*\\) in file \\(.*\\)$")
- (forward-line 1)
- (message "%s" (buffer-substring (match-beginning 0) (match-end 0))))
-
- ;; CVS has decided to merge someone elses changes into this document.
- ;; About to start an rcsmerge operation...
- ;;
- ((looking-at
- "^RCS file: ")
-
- ;; skip the "RCS file:" line...
- (forward-line 1)
-
- (let ((complex-start (point))
- base-revision ; the first revision retrieved to merge from
- head-revision ; the second revision retrieved to merge from
- filename ; the name of the file being merged
- backup-file ; the name of the backup of the working file
- backup-revision) ; the revision of the original working file
-
- (setq base-revision
- (cvs-skip-line stdout-buffer stderr-buffer
- "^retrieving revision \\(.*\\)$"
- 1))
- (setq head-revision
- (cvs-skip-line stdout-buffer stderr-buffer
- "^retrieving revision \\(.*\\)$"
- 1))
- (setq filename
- (cvs-skip-line stdout-buffer stderr-buffer
- "^Merging differences between [0-9.]+ and [0-9.]+ into \\(.*\\)$"
- 1))
- (setq backup-file
- (cvs-find-backup-file filename current-dir))
- (setq backup-revision
- (cvs-find-backup-revision backup-file))
-
- ;; Was there a conflict during the merge?
-
- (cond
-
- ;;;; From CVS-1.3 & RCS-5.6.0.1 with GNU-Diffutils-2.5:
- ;;;; "cvs update -j OLD-REV -j NEW-REV ."
- ;;
- ;; RCS file: /big/web-CVS/apc/cmd/Main/logout.sh,v
- ;; retrieving revision 1.1.1.1
- ;; retrieving revision 1.1.1.2
- ;; Merging differences between 1.1.1.1 and 1.1.1.2 into logout.sh
- ;; rcsmerge warning: overlaps during merge
-
- ((looking-at
- ;; Allow both RCS 5.5 and 5.6. (5.6 prints "rcs" and " warning").
- "^\\(rcs\\)?merge[:]*\\( warning\\)?: \\((overlaps\\|conflicts\\) during merge$")
-
- ;; Yes, this is a conflict.
- (cvs-skip-line stdout-buffer stderr-buffer
- "^\\(rcs\\)?merge[:]*\\( warning\\)?: \\(overlaps\\|conflicts\\) during merge$")
-
- ;; this line doesn't seem to appear in all cases -- perhaps only
- ;; in "-j A -j B" usage, in which case this indicates ????
- (cvs-skip-line stdout-buffer stderr-buffer
- "^cvs \\(update\\|server\\): conflicts found in ")
-
- (let ((fileinfo
- (cvs-create-fileinfo
- 'CONFLICT current-dir
- filename
- (buffer-substring complex-start (point)))))
-
- ;; squirrel away info about the files that were retrieved for merging
- (cvs-set-fileinfo->base-revision fileinfo base-revision)
- (cvs-set-fileinfo->head-revision fileinfo head-revision)
- (cvs-set-fileinfo->backup-revision fileinfo backup-revision)
- (cvs-set-fileinfo->backup-file fileinfo backup-file)
-
- (setcdr head (list fileinfo))
- (setq head (cdr head))))
-
- ;; Was it a conflict, and was RCS compiled without DIFF3_BIN, in
- ;; which case this is a failed conflict resolution?
-
- ((looking-at
- ;; Allow both RCS 5.5 and 5.6. (5.6 prints "rcs" and " warning").
- "^\\(rcs\\)?merge\\( warning\\)?: overlaps or other problems during merge$")
-
- (cvs-skip-line stdout-buffer stderr-buffer
- "^\\(rcs\\)?merge\\( warning\\)?: overlaps or other problems during merge$")
- (cvs-skip-line stdout-buffer stderr-buffer
- "^cvs update: could not merge ")
- (cvs-skip-line stdout-buffer stderr-buffer
- "^cvs update: restoring .* from backup file ")
- (let ((fileinfo
- (cvs-create-fileinfo
- 'CONFLICT current-dir
- filename
- (buffer-substring complex-start (point)))))
- (setcdr head (list fileinfo))
- (setq head (cdr head))))
-
- ;; Not a conflict; it must be a succesful merge.
-
- (t
- (let ((fileinfo
- (cvs-create-fileinfo
- 'MERGED current-dir
- filename
- (buffer-substring complex-start (point)))))
- (cvs-set-fileinfo->base-revision fileinfo base-revision)
- (cvs-set-fileinfo->head-revision fileinfo head-revision)
- (cvs-set-fileinfo->backup-revision fileinfo backup-revision)
- (cvs-set-fileinfo->backup-file fileinfo backup-file)
- (setcdr head (list fileinfo))
- (setq head (cdr head)))))))
-
- ;; Error messages from CVS (incomplete)
-
- ((looking-at
- "^cvs \\(update\\|server\\): \\(invalid option .*\\)$")
- (error "Interface problem with CVS: %s"
- (buffer-substring (match-beginning 2) (match-end 2))))
-
- ;; network errors
-
- ;; Kerberos connection attempted but failed. This is not
- ;; really an error, as CVS will automatically fall back to
- ;; rsh. Plus it tries kerberos, if available, even when rsh
- ;; is what you really wanted.
-
- ((looking-at
- "^cvs update: kerberos connect:.*$")
- (forward-line 1)
- (message "Remote CVS: %s"
- (buffer-substring (match-beginning 0) (match-end 0))))
-
- ;; And when kerberos *does* fail, cvs prints out some stuff
- ;; as it tries rsh. Ignore that stuff too.
-
- ((looking-at
- "^cvs update: trying to start server using rsh$")
- (forward-line 1))
-
- ((looking-at
- "^\\([^:]*\\) Connection timed out")
- (error "Remote CVS: %s"
- (buffer-substring (match-beginning 0) (match-end 0))))
-
- ((looking-at
- "^Permission denied.")
- (error "Remote CVS: %s"
- (buffer-substring (match-beginning 0) (match-end 0))))
-
- ((looking-at
- "^cvs \\[update aborted\\]: premature end of file from server")
- (error "Remote CVS: %s"
- (buffer-substring (match-beginning 0) (match-end 0))))
-
- ;; Empty line. Probably inserted by mistake by user (or developer :-)
- ;; Ignore.
-
- ((looking-at
- "^$")
- (forward-line 1))
-
- ;; top-level parser (cond) default clause
-
- (t
- (cvs-skip-line stdout-buffer stderr-buffer
- "^UN-MATCHABLE-OUTPUT"))))))
-
- ;; cause this function to return the head of the parser output list
- head)
-
-;;----------
-(defun cvs-parse-stdout (stdout-buffer stderr-buffer head root-dir)
- "Parse the output from CVS that is written to stderr.
-Args: STDOUT-BUFFER STDERR-BUFFER HEAD ROOT-DIR
-
-STDOUT-BUFFER is the buffer that holds the output to parse.
-STDERR-BUFFER holds the output that cvs sent to stderr. It is only
-used to create a bug report in case there is a parse error.
-
-HEAD is a cons-cell, the head of the list that is built.
-ROOT-DIR is the directory the `cvs update' was run in.
-
-This function doesn't return anything particular."
-
- (save-window-excursion
- (set-buffer stdout-buffer)
- (goto-char (point-min))
- (while (< (point) (point-max))
- (cond
-
- ;; M: The file is modified by the user, and untouched in the repository.
- ;; A: The file is "cvs add"ed, but not "cvs ci"ed.
- ;; R: The file is "cvs remove"ed, but not "cvs ci"ed.
- ;; C: Conflict (only useful if a join was done and stderr has info...)
- ;; U: The file is copied from the repository.
- ;; ?: Unknown file or directory.
-
- ((looking-at
- "^\\([MARCUP?]\\) \\(.*\\)$")
- (let*
- ((c (char-after (match-beginning 1)))
- (full-path (concat (file-name-as-directory root-dir)
- (buffer-substring (match-beginning 2)
- (match-end 2))))
- (isdir (file-directory-p full-path))
- (fileinfo (cvs-create-fileinfo
- (cond ((eq c ?M) 'MODIFIED)
- ((eq c ?A) 'ADDED)
- ((eq c ?R) 'REMOVED)
- ((eq c ?C) 'CONFLICT)
- ((eq c ?U) 'UPDATED)
- ((eq c ?P) 'PATCHED)
- ((eq c ??) (if isdir
- 'UNKNOWN-DIR
- 'UNKNOWN)))
- (substring (file-name-directory full-path) 0 -1)
- (file-name-nondirectory full-path)
- (buffer-substring (match-beginning 0) (match-end 0)))))
- ;; Updated and Patched files require no further action.
- (if (memq c '(?U ?P))
- (cvs-set-fileinfo->handled fileinfo t))
-
- ;; Link this last on the list.
- (setcdr head (list fileinfo))
- (setq head (cdr head))
- (forward-line 1)))
-
- ;; Executing a program because of the -u option in modules.
- ((looking-at
- "^cvs \\(update\\|server\\): Executing")
- ;; Skip by any output the program may generate to stdout.
- ;; Note that pcl-cvs will get seriously confused if the
- ;; program prints anything to stderr.
- (re-search-forward cvs-update-prog-output-skip-regexp)
- (forward-line 1))
-
- (t
- (cvs-parse-error stdout-buffer stderr-buffer 'STDOUT (point)
- "cvs-parse-stdout"))))))
-
-;;----------
-(defun cvs-pp (fileinfo)
- "Pretty print FILEINFO. Insert a printed representation in current buffer.
-For use by the cookie package."
-
- (let ((a (cvs-fileinfo->type fileinfo))
- (s (if (cvs-fileinfo->marked fileinfo)
- "*" " "))
- (f (cvs-fileinfo->file-name fileinfo))
- (ci (if (cvs-fileinfo->handled fileinfo)
- " " "ci")))
- (insert
- (cond
- ((eq a 'UPDATED)
- (format "%s Updated %s" s f))
- ((eq a 'PATCHED)
- (format "%s Patched %s" s f))
- ((eq a 'MODIFIED)
- (format "%s Modified %s %s" s ci f))
- ((eq a 'MERGED)
- (format "%s Merged %s %s" s ci f))
- ((eq a 'CONFLICT)
- (format "%s Conflict %s" s f))
- ((eq a 'ADDED)
- (format "%s Added %s %s" s ci f))
- ((eq a 'REMOVED)
- (format "%s Removed %s %s" s ci f))
- ((eq a 'UNKNOWN)
- (format "%s Unknown %s" s f))
- ((eq a 'UNKNOWN-DIR)
- (format "%s Unknown dir %s" s f))
- ((eq a 'CVS-REMOVED)
- (format "%s Removed from repository: %s" s f))
- ((eq a 'REM-CONFLICT)
- (format "%s Conflict: Removed from repository, changed by you: %s" s f))
- ((eq a 'MOD-CONFLICT)
- (format "%s Conflict: Removed by you, changed in repository: %s" s f))
- ((eq a 'REM-EXIST)
- (format "%s Conflict: Removed by you, but still exists: %s" s f))
- ((eq a 'DIRCHANGE)
- (format "\nIn directory %s:" (cvs-fileinfo->dir fileinfo)))
- ((eq a 'MOVE-AWAY)
- (format "%s Move away %s - it is in the way" s f))
- ((eq a 'REPOS-MISSING)
- (format " This repository directory is missing! Remove this directory manually."))
- ((eq a 'MESSAGE)
- (cvs-fileinfo->full-log fileinfo))
- (t
- (format "%s Internal error! %s" s f))))))
-
-
-;;; You can define your own keymap in .emacs. pcl-cvs.el won't overwrite it.
-
-(if cvs-mode-map
- nil
- (setq cvs-mode-map (make-keymap))
- (suppress-keymap cvs-mode-map)
- (define-prefix-command 'cvs-mode-map-control-c-prefix)
- (define-key cvs-mode-map "\C-?" 'cvs-mode-unmark-up)
- (define-key cvs-mode-map "\C-k" 'cvs-mode-acknowledge)
- (define-key cvs-mode-map "\C-n" 'cvs-mode-next-line)
- (define-key cvs-mode-map "\C-p" 'cvs-mode-previous-line)
- ;; ^C- keys are used to set various flags to control CVS features
- (define-key cvs-mode-map "\C-c" 'cvs-mode-map-control-c-prefix)
- (define-key cvs-mode-map "\C-c\C-c" 'cvs-change-cvsroot)
- (define-key cvs-mode-map "\C-c\C-d" 'cvs-set-diff-flags)
- (define-key cvs-mode-map "\C-c\C-l" 'cvs-set-log-flags)
- (define-key cvs-mode-map "\C-c\C-s" 'cvs-set-status-flags)
- (define-key cvs-mode-map "\C-c\C-u" 'cvs-set-update-optional-flags)
- ;; M- keys are usually those that operate on modules
- (define-key cvs-mode-map "\M-\C-?" 'cvs-mode-unmark-all-files)
- (define-key cvs-mode-map "\M-C" 'cvs-mode-rcs2log) ; i.e. "Create a ChangeLog"
- (define-key cvs-mode-map "\M-a" 'cvs-mode-admin)
- (define-key cvs-mode-map "\M-c" 'cvs-mode-checkout)
- (define-key cvs-mode-map "\M-o" 'cvs-mode-checkout-other-window)
- (define-key cvs-mode-map "\M-p" 'cvs-mode-rdiff) ; i.e. "create a Patch"
- (define-key cvs-mode-map "\M-r" 'cvs-mode-release)
- (define-key cvs-mode-map "\M-t" 'cvs-mode-rtag)
- ;; keys that operate on files
- (define-key cvs-mode-map " " 'cvs-mode-next-line)
- (define-key cvs-mode-map "?" 'describe-mode)
- (define-key cvs-mode-map "A" 'cvs-mode-add-change-log-entry-other-window)
- (define-key cvs-mode-map "B" 'cvs-mode-byte-compile-files)
- (define-key cvs-mode-map "C" 'cvs-mode-changelog-commit)
- (define-key cvs-mode-map "E" 'cvs-mode-emerge)
- (define-key cvs-mode-map "G" 'cvs-update)
- (define-key cvs-mode-map "M" 'cvs-mode-mark-all-files)
- (define-key cvs-mode-map "Q" 'cvs-examine)
- (define-key cvs-mode-map "R" 'cvs-mode-revert-updated-buffers)
- (define-key cvs-mode-map "U" 'cvs-mode-undo-local-changes)
- (define-key cvs-mode-map "a" 'cvs-mode-add)
- (define-key cvs-mode-map "b" 'cvs-mode-diff-backup)
- (define-key cvs-mode-map "c" 'cvs-mode-commit)
- (define-key cvs-mode-map "d" 'cvs-mode-diff-cvs)
- (define-key cvs-mode-map "e" 'cvs-mode-ediff)
- (define-key cvs-mode-map "f" 'cvs-mode-find-file)
- (define-key cvs-mode-map "g" 'cvs-mode-update-no-prompt)
- (define-key cvs-mode-map "i" 'cvs-mode-ignore)
- (define-key cvs-mode-map "l" 'cvs-mode-log)
- (define-key cvs-mode-map "m" 'cvs-mode-mark)
- (define-key cvs-mode-map "n" 'cvs-mode-next-line)
- (define-key cvs-mode-map "o" 'cvs-mode-find-file-other-window)
- (define-key cvs-mode-map "p" 'cvs-mode-previous-line)
- (define-key cvs-mode-map "q" 'bury-buffer)
- (define-key cvs-mode-map "r" 'cvs-mode-remove-file)
- (define-key cvs-mode-map "s" 'cvs-mode-status)
- (define-key cvs-mode-map "t" 'cvs-mode-tag)
- (define-key cvs-mode-map "u" 'cvs-mode-unmark)
- (define-key cvs-mode-map "v" 'cvs-mode-diff-vendor)
- (define-key cvs-mode-map "x" 'cvs-mode-remove-handled))
-
-;;----------
-(defun cvs-get-marked (&optional ignore-marks ignore-contents)
- "Return a list of all selected tins.
-Args: &optional IGNORE-MARKS IGNORE-CONTENTS.
-
-If there are any marked tins, and IGNORE-MARKS is nil, return them. Otherwise,
-if the cursor selects a directory, return all files in it, unless there are
-none, in which case just return the directory; or unless IGNORE-CONTENTS is not
-nil, in which case also just return the directory. Otherwise return (a list
-containing) the file the cursor points to, or an empty list if it doesn't point
-to a file at all."
-
- (cond
- ;; Any marked cookies?
- ((and (not ignore-marks)
- (collection-collect-tin cvs-cookie-handle 'cvs-fileinfo->marked)))
- ;; Nope.
- ((and (not ignore-contents)
- (let ((sel (tin-locate cvs-cookie-handle (point))))
- (cond
- ;; If a directory is selected, all it members are returned.
- ((and sel (eq (cvs-fileinfo->type (tin-cookie cvs-cookie-handle
- sel))
- 'DIRCHANGE))
- (let ((retsel
- (collection-collect-tin cvs-cookie-handle
- 'cvs-dir-member-p
- (cvs-fileinfo->dir (tin-cookie
- cvs-cookie-handle sel)))))
- (if retsel
- retsel
- (list sel))))
- (t
- (list sel))))))
- (t
- (list (tin-locate cvs-cookie-handle (point))))))
-
-;;----------
-(defun cvs-dir-member-p (fileinfo dir)
- "Return true if FILEINFO represents a file in directory DIR."
-
- (and (not (eq (cvs-fileinfo->type fileinfo) 'DIRCHANGE))
- (string= (cvs-fileinfo->dir fileinfo) dir)))
-
-;;----------
-(defun cvs-dir-empty-p (tin)
- "Return non-nil if TIN is a directory that is empty.
-Args: CVS-BUF TIN."
-
- (and (eq (cvs-fileinfo->type (tin-cookie cvs-cookie-handle tin)) 'DIRCHANGE)
- (or (not (tin-next cvs-cookie-handle tin))
- (eq (cvs-fileinfo->type
- (tin-cookie cvs-cookie-handle
- (tin-next cvs-cookie-handle tin)))
- 'DIRCHANGE))))
-
-;;----------
-(defun cvs-mode-revert-updated-buffers ()
- "Revert any buffers that are UPDATED, PATCHED, MERGED or CONFLICT."
-
- (interactive)
- (cookie-map (function cvs-revert-fileinfo) cvs-cookie-handle))
-
-;;----------
-(defun cvs-revert-fileinfo (fileinfo)
- "Revert the buffer that holds the file in FILEINFO if it has changed,
-and if the type is UPDATED, PATCHED, MERGED or CONFLICT."
-
- (let* ((type (cvs-fileinfo->type fileinfo))
- (file (cvs-fileinfo->full-path fileinfo))
- (buffer (get-file-buffer file)))
- ;; For a revert to happen...
- (cond
- ((and
- ;; ...the type must be one that justifies a revert...
- (or (eq type 'UPDATED)
- (eq type 'PATCHED)
- (eq type 'MERGED)
- (eq type 'CONFLICT))
- ;; ...and the user must be editing the file...
- buffer)
- (save-excursion
- (set-buffer buffer)
- (cond
- ((buffer-modified-p)
- (error "%s: edited since last cvs-update."
- (buffer-file-name)))
- ;; Go ahead and revert the file.
- (t (revert-buffer 'dont-use-auto-save-file 'dont-ask))))))))
-
-;;----------
-(defun cvs-mode-remove-handled ()
- "Remove all lines that are handled.
-Empty directories are removed."
-
- (interactive)
- ;; Pass one: remove files that are handled.
- (collection-filter-cookies cvs-cookie-handle
- (function
- (lambda (fileinfo)
- (not (cvs-fileinfo->handled fileinfo)))))
- ;; Pass two: remove empty directories.
- (if cvs-auto-remove-handled-directories
- (cvs-remove-empty-directories)))
-
-;;----------
-(defun cvs-remove-empty-directories ()
- "Remove empty directories in the *cvs* buffer."
-
- (collection-filter-tins cvs-cookie-handle
- (function
- (lambda (tin)
- (not (cvs-dir-empty-p tin))))))
-
-;;----------
-(defun cvs-mode-mark (pos)
- "Mark a fileinfo.
-Args: POS.
-
-If the fileinfo is a directory, all the contents of that directory are marked
-instead. A directory can never be marked. POS is a buffer position."
-
- (interactive "d")
- (let* ((tin (tin-locate cvs-cookie-handle pos))
- (sel (tin-cookie cvs-cookie-handle tin)))
- (cond
- ;; Does POS point to a directory? If so, mark all files in that directory.
- ((eq (cvs-fileinfo->type sel) 'DIRCHANGE)
- (cookie-map
- (function (lambda (f dir)
- (cond
- ((cvs-dir-member-p f dir)
- (cvs-set-fileinfo->marked f t)
- t)))) ; Tell cookie to redisplay this cookie.
- cvs-cookie-handle
- (cvs-fileinfo->dir sel)))
- (t
- (cvs-set-fileinfo->marked sel t)
- (tin-invalidate cvs-cookie-handle tin)
- (tin-goto-next cvs-cookie-handle pos 1)))))
-
-;;----------
-(defun cvs-committable (tin)
- "Check if the TIN is committable.
-It is committable if it
- a) is not handled and
- b) is either MODIFIED, ADDED, REMOVED, MERGED or CONFLICT."
-
- (let* ((fileinfo (tin-cookie cvs-cookie-handle tin))
- (type (cvs-fileinfo->type fileinfo)))
- (and (not (cvs-fileinfo->handled fileinfo))
- (or (eq type 'MODIFIED)
- (eq type 'ADDED)
- (eq type 'REMOVED)
- (eq type 'MERGED)
- (eq type 'CONFLICT)))))
-
-;;----------
-(defun cvs-mode-commit ()
- "Check in all marked files, or the current file.
-The user will be asked for a log message in a buffer.
-If cvs-erase-input-buffer is non-nil that buffer will be erased.
-Otherwise mark and point will be set around the entire contents of the
-buffer so that it is easy to kill the contents of the buffer with \\[kill-region]."
-
- (interactive)
- (let* ((cvs-buf (current-buffer))
- (marked (cvs-filter (function cvs-committable)
- (cvs-get-marked))))
- (if (null marked)
- (error "Nothing to commit!")
- (pop-to-buffer (get-buffer-create cvs-commit-prompt-buffer))
- (goto-char (point-min))
-
- (if cvs-erase-input-buffer
- (erase-buffer)
- (push-mark (point-max)))
- (cvs-edit-mode)
- (make-local-variable 'cvs-commit-list)
- (setq cvs-commit-list marked)
- (message "Press C-c C-c when you are done editing."))))
-
-;;----------
-(defun cvs-edit-done ()
- "Commit the files to the repository."
-
- (interactive)
- (if (null cvs-commit-list)
- (error "You have already committed the files"))
- (if (and (> (point-max) 1)
- (/= (char-after (1- (point-max))) ?\n)
- (or (eq cvs-commit-buffer-require-final-newline t)
- (and cvs-commit-buffer-require-final-newline
- (yes-or-no-p
- (format "Buffer %s does not end in newline. Add one? "
- (buffer-name))))))
- (save-excursion
- (goto-char (point-max))
- (insert ?\n)))
- (save-some-buffers)
- (let ((cc-list cvs-commit-list)
- (cc-buffer (get-buffer cvs-buffer-name))
- (msg-buffer (current-buffer))
- (msg (buffer-substring (point-min) (point-max))))
- (pop-to-buffer cc-buffer)
- (bury-buffer msg-buffer)
- (cvs-use-temp-buffer)
- (message "Committing...")
- (if (cvs-execute-list cc-list cvs-program
- (if cvs-cvsroot
- (list "-d" cvs-cvsroot "commit" "-m" msg)
- (list "commit" "-m" msg))
- "Committing %s...")
- (error "Something went wrong. Check the %s buffer carefully."
- cvs-temp-buffer-name))
- ;; FIXME: don't do any of this if the commit fails.
- (let ((ccl cc-list))
- (while ccl
- (cvs-after-commit-function (tin-cookie cvs-cookie-handle (car ccl)))
- (setq ccl (cdr ccl))))
- (apply 'tin-invalidate cvs-cookie-handle cc-list)
- (set-buffer msg-buffer)
- (setq cvs-commit-list nil)
- (set-buffer cc-buffer)
- (if cvs-auto-remove-handled
- (cvs-mode-remove-handled)))
-
- (message "Committing... Done."))
-
-;;----------
-(defun cvs-after-commit-function (fileinfo)
- "Do everything that needs to be done when FILEINFO has been committed.
-The fileinfo->handle is set, and if the buffer is present it is reverted."
-
- (cvs-set-fileinfo->handled fileinfo t)
- (if cvs-auto-revert-after-commit
- (let* ((file (cvs-fileinfo->full-path fileinfo))
- (buffer (get-file-buffer file)))
- ;; For a revert to happen...
- (if buffer
- ;; ...the user must be editing the file...
- (save-excursion
- (set-buffer buffer)
- (if (not (buffer-modified-p))
- ;; ...but it must be unmodified.
- (revert-buffer 'dont-use-auto-save-file 'dont-ask)))))))
-
-;;----------
-(defun cvs-execute-list (tin-list program constant-args &optional message-fmt)
- "Run PROGRAM on all elements on TIN-LIST.
-Args: TIN-LIST PROGRAM CONSTANT-ARGS.
-
-The PROGRAM will be called with pwd set to the directory the files reside
-in. CONSTANT-ARGS should be a list of strings. The arguments given to the
-program will be CONSTANT-ARGS followed by all the files (from TIN-LIST) that
-resides in that directory. If the files in TIN-LIST resides in different
-directories the PROGRAM will be run once for each directory (if all files in
-the same directory appears after each other).
-
-Any output from PROGRAM will be inserted in the current buffer.
-
-This function return nil if all went well, or the numerical exit status or a
-signal name as a string. Note that PROGRAM might be called several times. This
-will return non-nil if something goes wrong, but there is no way to know which
-process that failed.
-
-If MESSAGE-FMT is not nil, then message is called to display progress with
-MESSAGE-FMT as the string. MESSAGE-FMT should contain one %s for the arg-list
-being passed to PROGRAM."
-
- ;; FIXME: something seems wrong with the error checking here....
-
- (let ((exitstatus nil))
- (while tin-list
- (let ((current-dir (cvs-fileinfo->dir (tin-cookie cvs-cookie-handle
- (car tin-list))))
- arg-list
- arg-str)
-
- ;; Collect all marked files in this directory.
-
- (while (and tin-list
- (string= current-dir
- (cvs-fileinfo->dir (tin-cookie cvs-cookie-handle
- (car tin-list)))))
- (setq arg-list
- (cons (cvs-fileinfo->file-name
- (tin-cookie cvs-cookie-handle (car tin-list)))
- arg-list))
- (setq tin-list (cdr tin-list)))
-
- (setq arg-list (nreverse arg-list))
-
- ;; Execute the command on all the files that were collected.
-
- (if message-fmt
- (message message-fmt
- (mapconcat 'cvs-quote-multiword-string
- arg-list
- " ")))
- (setq default-directory (file-name-as-directory current-dir))
- (insert (format "=== cd %s\n" default-directory))
- (insert (format "=== %s %s\n\n"
- program
- (mapconcat 'cvs-quote-multiword-string
- (nconc (copy-sequence constant-args)
- arg-list)
- " ")))
- (let ((res (apply 'call-process program nil t t
- (nconc (copy-sequence constant-args) arg-list))))
- ;; Remember the first, or highest, exitstatus.
- (if (and (not (and (integerp res) (zerop res)))
- (or (null exitstatus)
- (and (integerp exitstatus) (= 1 exitstatus))))
- (setq exitstatus res)))
- (goto-char (point-max))
- (if message-fmt
- (message message-fmt
- (mapconcat 'cvs-quote-multiword-string
- (nconc (copy-sequence arg-list) '("Done."))
- " ")))
- exitstatus))))
-
-;;----------
-;;;; +++ not currently used!
-(defun cvs-execute-single-file-list (tin-list extractor program constant-args
- &optional cleanup message-fmt)
- "Run PROGRAM on all elements on TIN-LIST.
-Args: TIN-LIST EXTRACTOR PROGRAM CONSTANT-ARGS &optional CLEANUP.
-
-The PROGRAM will be called with pwd set to the directory the files
-reside in. CONSTANT-ARGS is a list of strings to pass as arguments to
-PROGRAM. The arguments given to the program will be CONSTANT-ARGS
-followed by the list that EXTRACTOR returns.
-
-EXTRACTOR will be called once for each file on TIN-LIST. It is given
-one argument, the cvs-fileinfo. It can return t, which means ignore
-this file, or a list of arguments to send to the program.
-
-If CLEANUP is not nil, the filenames returned by EXTRACTOR are deleted.
-
-If MESSAGE-FMT is not nil, then message is called to display progress with
-MESSAGE-FMT as the string. MESSAGE-FMT should contain one %s for the arg-list
-being passed to PROGRAM."
-
- (while tin-list
- (let ((current-dir (file-name-as-directory
- (cvs-fileinfo->dir
- (tin-cookie cvs-cookie-handle
- (car tin-list)))))
- (arg-list
- (funcall extractor
- (tin-cookie cvs-cookie-handle (car tin-list)))))
-
- ;; Execute the command unless extractor returned t.
-
- (if (eq arg-list t)
- nil
- (setq default-directory current-dir)
- (insert (format "=== cd %s\n" default-directory))
- (insert (format "=== %s %s\n\n"
- program
- (mapconcat 'cvs-quote-multiword-string
- (nconc (copy-sequence constant-args)
- arg-list)
- " ")))
- (if message-fmt
- (message message-fmt (mapconcat 'cvs-quote-multiword-string
- arg-list
- " ")))
- (apply 'call-process program nil t t
- (nconc (copy-sequence constant-args) arg-list))
- (goto-char (point-max))
- (if message-fmt
- (message message-fmt (mapconcat 'cvs-quote-multiword-string
- (nconc arg-list '("Done."))
- " ")))
- (if cleanup
- (while arg-list
-;;;; (kill-buffer ?????)
- (delete-file (car arg-list))
- (setq arg-list (cdr arg-list))))))
- (setq tin-list (cdr tin-list))))
-
-;;----------
-(defun cvs-edit-mode ()
- "\\<cvs-edit-mode-map>Mode for editing cvs log messages.
-Commands:
-\\[cvs-edit-done] checks in the file when you are ready.
-This mode is based on fundamental mode."
-
- (interactive)
- (use-local-map cvs-edit-mode-map)
- (setq major-mode 'cvs-edit-mode)
- (setq mode-name "CVS Log")
- (auto-fill-mode 1))
-
-;;----------
-(if cvs-edit-mode-map
- nil
- (setq cvs-edit-mode-map (make-sparse-keymap))
- (define-prefix-command 'cvs-edit-mode-control-c-prefix)
- (define-key cvs-edit-mode-map "\C-c" 'cvs-edit-mode-control-c-prefix)
- (define-key cvs-edit-mode-map "\C-c\C-c" 'cvs-edit-done))
-
-;;----------
-(defun cvs-diffable (tins)
- "Return a list of all tins on TINS that it makes sense to run
-``cvs diff'' on."
-
- ;; +++ There is an unnecessary (nreverse) here. Get the list the
- ;; other way around instead!
- (let ((result nil))
- (while tins
- (let ((type (cvs-fileinfo->type
- (tin-cookie cvs-cookie-handle (car tins)))))
- (if (or (eq type 'MODIFIED)
- (eq type 'UPDATED)
- (eq type 'PATCHED)
- (eq type 'MERGED)
- (eq type 'CONFLICT)
- (eq type 'REMOVED) ;+++Does this line make sense?
- (eq type 'ADDED)) ;+++Does this line make sense?
- (setq result (cons (car tins) result)))
- (setq tins (cdr tins))))
- (nreverse result)))
-
-;;----------
-(defun cvs-mode-diff-cvs (&optional ignore-marks)
- "Diff the selected files against the head revisions in the repository.
-
-If the variable cvs-diff-ignore-marks is non-nil any marked files will not be
-considered to be selected. An optional prefix argument will invert the
-influence from cvs-diff-ignore-marks.
-
-The flags in the variable cvs-diff-flags will be passed to ``cvs diff''.
-
-The resulting diffs are placed in the cvs-fileinfo->cvs-diff-buffer."
-
- (interactive "P")
- (if (not (listp cvs-diff-flags))
- (error "cvs-diff-flags should be set using cvs-set-diff-flags."))
- (save-some-buffers)
- (message "cvsdiffing...")
- (let ((marked-file-list (cvs-diffable
- (cvs-get-marked
- (or (and ignore-marks (not cvs-diff-ignore-marks))
- (and (not ignore-marks) cvs-diff-ignore-marks))))))
- (while marked-file-list
- (let ((fileinfo-to-diff (tin-cookie cvs-cookie-handle
- (car marked-file-list)))
- (local-def-directory (file-name-as-directory
- (cvs-fileinfo->dir
- (tin-cookie cvs-cookie-handle
- (car marked-file-list))))))
- (message "cvsdiffing %s..."
- (cvs-fileinfo->file-name fileinfo-to-diff))
-
- ;; FIXME: this seems messy to test and set buffer name at this point....
- (if (not (cvs-fileinfo->cvs-diff-buffer fileinfo-to-diff))
- (cvs-set-fileinfo->cvs-diff-buffer fileinfo-to-diff
- (concat "*cvs-diff-"
- (cvs-fileinfo->file-name
- fileinfo-to-diff)
- "-in-"
- local-def-directory
- "*")))
- (display-buffer (get-buffer-create
- (cvs-fileinfo->cvs-diff-buffer fileinfo-to-diff)))
- (set-buffer (cvs-fileinfo->cvs-diff-buffer fileinfo-to-diff))
- (setq buffer-read-only nil)
- (setq default-directory local-def-directory)
- (erase-buffer)
- (insert (format "=== cd %s\n" default-directory))
- (insert (format "=== cvs %s\n\n"
- (mapconcat 'cvs-quote-multiword-string
- (nconc (if cvs-cvsroot
- (list "-d" cvs-cvsroot "diff")
- '("diff"))
- (copy-sequence cvs-diff-flags)
- (list (cvs-fileinfo->file-name
- fileinfo-to-diff)))
- " ")))
- (if (apply 'call-process cvs-program nil t t
- (nconc (if cvs-cvsroot
- (list "-d" cvs-cvsroot "diff")
- '("diff"))
- (copy-sequence cvs-diff-flags)
- (list (cvs-fileinfo->file-name fileinfo-to-diff))))
- (message "cvsdiffing %s... Done."
- (cvs-fileinfo->file-name fileinfo-to-diff))
- (message "cvsdiffing %s... No differences found."
- (cvs-fileinfo->file-name fileinfo-to-diff)))
- (goto-char (point-max))
- (setq marked-file-list (cdr marked-file-list)))))
- (message "cvsdiffing... Done."))
-
-;;----------
-(defun cvs-mode-diff-backup (&optional ignore-marks)
- "Diff the files against the backup file.
-This command can be used on files that are marked with \"Merged\"
-or \"Conflict\" in the *cvs* buffer.
-
-If the variable cvs-diff-ignore-marks is non-nil any marked files will
-not be considered to be selected. An optional prefix argument will
-invert the influence from cvs-diff-ignore-marks.
-
-The flags in cvs-diff-flags will be passed to ``diff''.
-
-The resulting diffs are placed in the cvs-fileinfo->backup-diff-buffer."
-
- (interactive "P")
- (if (not (listp cvs-diff-flags))
- (error "cvs-diff-flags should be set using cvs-set-diff-flags."))
- (save-some-buffers)
- (let ((marked-file-list (cvs-filter
- (function cvs-backup-diffable)
- (cvs-get-marked
- (or
- (and ignore-marks (not cvs-diff-ignore-marks))
- (and (not ignore-marks) cvs-diff-ignore-marks))))))
- (if (null marked-file-list)
- (error "No ``Conflict'' or ``Merged'' file selected!"))
- (message "backup diff...")
- (while marked-file-list
- (let ((fileinfo-to-diff (tin-cookie cvs-cookie-handle
- (car marked-file-list)))
- (local-def-directory (file-name-as-directory
- (cvs-fileinfo->dir
- (tin-cookie cvs-cookie-handle
- (car marked-file-list)))))
- (backup-temp-files (cvs-diff-backup-extractor
- (tin-cookie cvs-cookie-handle
- (car marked-file-list)))))
- (message "backup diff %s..."
- (cvs-fileinfo->file-name fileinfo-to-diff))
-
- ;; FIXME: this seems messy to test and set buffer name at this point....
- (if (not (cvs-fileinfo->backup-diff-buffer fileinfo-to-diff))
- (cvs-set-fileinfo->backup-diff-buffer fileinfo-to-diff
- (concat "*cvs-diff-"
- (cvs-fileinfo->backup-file
- fileinfo-to-diff)
- "-to-"
- (cvs-fileinfo->file-name
- fileinfo-to-diff)
- "-in"
- local-def-directory
- "*")))
- (display-buffer (get-buffer-create
- (cvs-fileinfo->backup-diff-buffer fileinfo-to-diff)))
- (set-buffer (cvs-fileinfo->backup-diff-buffer fileinfo-to-diff))
- (setq buffer-read-only nil)
- (setq default-directory local-def-directory)
- (erase-buffer)
- (insert (format "=== cd %s\n" default-directory))
- (insert (format "=== %s %s\n\n"
- cvs-diff-program
- (mapconcat 'cvs-quote-multiword-string
- (nconc (copy-sequence cvs-diff-flags)
- backup-temp-files)
- " ")))
- (apply 'call-process cvs-diff-program nil t t
- (nconc (copy-sequence cvs-diff-flags) backup-temp-files))
- (goto-char (point-max))
- (message "backup diff %s... Done."
- (cvs-fileinfo->file-name fileinfo-to-diff))
- (setq marked-file-list (cdr marked-file-list)))))
- (message "backup diff... Done."))
-
-;;----------
-(defun cvs-mode-diff-vendor (&optional ignore-marks)
- "Diff the revisions merged into the current file. I.e. show what changes
-were merged in.
-
-This command can be used on files that are marked with \"Merged\"
-or \"Conflict\" in the *cvs* buffer.
-
-If the variable cvs-diff-ignore-marks is non-nil any marked files will
-not be considered to be selected. An optional prefix argument will
-invert the influence from cvs-diff-ignore-marks.
-
-The flags in cvs-diff-flags will be passed to ``diff''.
-
-The resulting diffs are placed in the cvs-fileinfo->vendor-diff-buffer."
-
- (interactive "P")
- (if (not (listp cvs-diff-flags))
- (error "cvs-diff-flags should be set using cvs-set-diff-flags."))
- (save-some-buffers)
- (let ((marked-file-list (cvs-filter
- (function cvs-vendor-diffable)
- (cvs-get-marked
- (or
- (and ignore-marks (not cvs-diff-ignore-marks))
- (and (not ignore-marks) cvs-diff-ignore-marks))))))
- (if (null marked-file-list)
- (error "No ``Conflict'' or ``Merged'' file selected!"))
- (message "vendor diff...")
- (while marked-file-list
- (let ((fileinfo-to-diff (tin-cookie cvs-cookie-handle
- (car marked-file-list)))
- (local-def-directory (file-name-as-directory
- (cvs-fileinfo->dir
- (tin-cookie cvs-cookie-handle
- (car marked-file-list)))))
- (vendor-temp-files (cvs-diff-vendor-extractor
- (tin-cookie cvs-cookie-handle
- (car marked-file-list)))))
- (message "vendor diff %s..."
- (cvs-fileinfo->file-name fileinfo-to-diff))
- (if (not (cvs-fileinfo->vendor-diff-buffer fileinfo-to-diff))
- (cvs-set-fileinfo->vendor-diff-buffer fileinfo-to-diff
- (concat "*cvs-diff-"
- (cvs-fileinfo->file-name
- fileinfo-to-diff)
- "-of-"
- (cvs-fileinfo->base-revision
- fileinfo-to-diff)
- "-to-"
- (cvs-fileinfo->head-revision
- fileinfo-to-diff)
- "-in-"
- local-def-directory
- "*")))
- (display-buffer (get-buffer-create
- (cvs-fileinfo->vendor-diff-buffer fileinfo-to-diff)))
- (set-buffer (cvs-fileinfo->vendor-diff-buffer fileinfo-to-diff))
- (setq buffer-read-only nil)
- (setq default-directory local-def-directory)
- (erase-buffer)
- (insert (format "=== cd %s\n" default-directory))
- (insert (format "=== %s %s\n\n"
- cvs-diff-program
- (mapconcat 'cvs-quote-multiword-string
- (nconc (copy-sequence cvs-diff-flags)
- vendor-temp-files)
- " ")))
- (apply 'call-process cvs-diff-program nil t t
- (nconc (copy-sequence cvs-diff-flags) vendor-temp-files))
- (goto-char (point-max))
- (message "vendor diff %s... Done."
- (cvs-fileinfo->file-name fileinfo-to-diff))
- (while vendor-temp-files
- (cvs-kill-buffer-visiting (car vendor-temp-files))
- (delete-file (car vendor-temp-files))
- (setq vendor-temp-files (cdr vendor-temp-files)))
- (setq marked-file-list (cdr marked-file-list)))))
- (message "vendor diff... Done."))
-
-;;----------
-(defun cvs-backup-diffable (tin)
- "Check if the TIN is backup-diffable.
-It must have a backup file to be diffable."
-
- (file-readable-p
- (cvs-fileinfo->backup-file (tin-cookie cvs-cookie-handle tin))))
-
-;;----------
-(defun cvs-vendor-diffable (tin)
- "Check if the TIN is vendor-diffable.
-It must have head and base revision info to be diffable."
-
- (and
- (cvs-fileinfo->base-revision (tin-cookie cvs-cookie-handle tin))
- (cvs-fileinfo->head-revision (tin-cookie cvs-cookie-handle tin))))
-
-;;----------
-(defun cvs-diff-backup-extractor (fileinfo)
- "Return the filename and the name of the backup file as a list.
-Signal an error if there is no backup file."
-
- (if (not (file-readable-p (cvs-fileinfo->backup-file fileinfo)))
- (error "%s has no backup file."
- (concat
- (file-name-as-directory (cvs-fileinfo->dir fileinfo))
- (cvs-fileinfo->file-name fileinfo))))
- (list (cvs-fileinfo->backup-file fileinfo)
- (cvs-fileinfo->file-name fileinfo)))
-
-;;----------
-(defun cvs-diff-vendor-extractor (fileinfo)
- "Retrieve and return the filenames of the vendor branch revisions as a list.
-Signal an error if there is no info for the vendor revisions."
-
- (list (cvs-retrieve-revision-to-tmpfile fileinfo
- (cvs-fileinfo->base-revision
- fileinfo))
- (cvs-retrieve-revision-to-tmpfile fileinfo
- (cvs-fileinfo->head-revision
- fileinfo))))
-
-;;----------
-(defun cvs-mode-find-file-other-window (pos)
- "Select a buffer containing the file in another window.
-Args: POS."
-
- (interactive "d")
- (let ((tin (tin-locate cvs-cookie-handle pos)))
- (if tin
- (let ((type (cvs-fileinfo->type (tin-cookie cvs-cookie-handle tin))))
- (cond
- ((or (eq type 'REMOVED)
- (eq type 'CVS-REMOVED))
- (error "Can't visit a removed file."))
- ((eq type 'DIRCHANGE)
- (let ((obuf (current-buffer))
- (odir default-directory))
- (setq default-directory
- (file-name-as-directory
- (cvs-fileinfo->dir
- (tin-cookie cvs-cookie-handle tin))))
- (dired-other-window default-directory)
- (set-buffer obuf)
- (setq default-directory odir)))
- (t
- (find-file-other-window (cvs-full-path tin)))))
- (error "There is no file to find."))))
-
-;;----------
-(defun cvs-fileinfo->full-path (fileinfo)
- "Return the full path for the file that is described in FILEINFO."
-
- (concat
- (file-name-as-directory
- (cvs-fileinfo->dir fileinfo))
- (cvs-fileinfo->file-name fileinfo)))
-
-;;----------
-(defun cvs-full-path (tin)
- "Return the full path for the file that is described in TIN."
-
- (cvs-fileinfo->full-path (tin-cookie cvs-cookie-handle tin)))
-
-;;----------
-(defun cvs-mode-find-file (pos)
- "Select a buffer containing the file in another window.
-Args: POS."
-
- (interactive "d")
- (let* ((cvs-buf (current-buffer))
- (tin (tin-locate cvs-cookie-handle pos)))
- (if tin
- (let* ((fileinfo (tin-cookie cvs-cookie-handle tin))
- (type (cvs-fileinfo->type fileinfo)))
- (cond
- ((or (eq type 'REMOVED)
- (eq type 'CVS-REMOVED))
- (error "Can't visit a removed file."))
- ((eq type 'DIRCHANGE)
- (let ((odir default-directory))
- (setq default-directory
- (file-name-as-directory (cvs-fileinfo->dir fileinfo)))
- (dired default-directory)
- (set-buffer cvs-buf)
- (setq default-directory odir)))
- (t
- (find-file (cvs-full-path tin)))))
- (error "There is no file to find."))))
-
-;;----------
-(defun cvs-mode-mark-all-files ()
- "Mark all files.
-Directories are not marked."
-
- (interactive)
- (cookie-map (function (lambda (cookie)
- (cond
- ((not (eq (cvs-fileinfo->type cookie) 'DIRCHANGE))
- (cvs-set-fileinfo->marked cookie t)
- t))))
- cvs-cookie-handle))
-
-;;----------
-(defun cvs-mode-unmark (pos)
- "Unmark a fileinfo.
-Args: POS."
-
- (interactive "d")
- (let* ((tin (tin-locate cvs-cookie-handle pos))
- (sel (tin-cookie cvs-cookie-handle tin)))
- (cond
- ((eq (cvs-fileinfo->type sel) 'DIRCHANGE)
- (cookie-map
- (function (lambda (f dir)
- (cond
- ((cvs-dir-member-p f dir)
- (cvs-set-fileinfo->marked f nil)
- t))))
- cvs-cookie-handle
- (cvs-fileinfo->dir sel)))
- (t
- (cvs-set-fileinfo->marked sel nil)
- (tin-invalidate cvs-cookie-handle tin)
- (tin-goto-next cvs-cookie-handle pos 1)))))
-
-;;----------
-(defun cvs-mode-unmark-all-files ()
- "Unmark all files.
-Directories are also unmarked, but that doesn't matter, since
-they should always be unmarked."
-
- (interactive)
- (cookie-map (function (lambda (cookie)
- (cvs-set-fileinfo->marked cookie nil)
- t))
- cvs-cookie-handle))
-
-;;----------
-(defun cvs-do-removal (tins)
- "Remove files.
-Args: TINS.
-
-TINS is a list of tins that the user wants to delete. The files are deleted.
-If the type of the tin is 'UNKNOWN or 'UNKNOWN-DIR the tin is removed from the
-buffer. If it is anything else the file is added to a list that should be `cvs
-remove'd and the tin is changed to be of type 'REMOVED.
-
-Returns a list of tins files that should be `cvs remove'd."
-
- (cvs-use-temp-buffer)
- (mapcar 'cvs-insert-full-path tins)
- (cond
- ((and tins (yes-or-no-p (format "Delete %d files? " (length tins))))
- (let (files-to-remove)
- (while tins
- (let* ((tin (car tins))
- (fileinfo (tin-cookie cvs-cookie-handle tin))
- (filepath (cvs-full-path tin))
- (type (cvs-fileinfo->type fileinfo)))
- (if (or (eq type 'REMOVED)
- (eq type 'CVS-REMOVED))
- nil
- ;; if it doesn't exist, as a file or directory, ignore it
- (cond ((file-directory-p filepath)
- (call-process cvs-rmdir-program nil nil nil filepath))
- ((file-exists-p filepath)
- (delete-file filepath)))
- (if (or (eq type 'UNKNOWN)
- (eq type 'UNKNOWN-DIR)
- (eq type 'MOVE-AWAY))
- (tin-delete cvs-cookie-handle tin)
- (setq files-to-remove (cons tin files-to-remove))
- (cvs-set-fileinfo->type fileinfo 'REMOVED)
- (cvs-set-fileinfo->handled fileinfo nil)
- (tin-invalidate cvs-cookie-handle tin))))
- (setq tins (cdr tins)))
- files-to-remove))
- (t nil)))
-
-;;----------
-(defun cvs-mode-remove-file ()
- "Remove all marked files."
-
- (interactive)
- (let ((files-to-remove (cvs-do-removal (cvs-get-marked))))
- (if (null files-to-remove)
- nil
- (cvs-use-temp-buffer)
- (message "removing from repository...")
- (if (cvs-execute-list files-to-remove cvs-program
- (if cvs-cvsroot
- (list "-d" cvs-cvsroot "remove")
- '("remove"))
- "removing %s from repository...")
- (error "CVS exited with non-zero exit status.")
- (message "removing from repository... Done.")))))
-
-;;----------
-(defun cvs-mode-undo-local-changes ()
- "Undo local changes to all marked files.
-The file is removed and `cvs update FILE' is run."
-
- (interactive)
- (let ((tins-to-undo (cvs-get-marked)))
- (cvs-use-temp-buffer)
- (mapcar 'cvs-insert-full-path tins-to-undo)
- (cond
- ((and tins-to-undo (yes-or-no-p (format "Undo changes to %d files? "
- (length tins-to-undo))))
- (let (files-to-update)
- (while tins-to-undo
- (let* ((tin (car tins-to-undo))
- (fileinfo (tin-cookie cvs-cookie-handle tin))
- (type (cvs-fileinfo->type fileinfo)))
- (cond
- ((or
- (eq type 'UPDATED)
- (eq type 'PATCHED)
- (eq type 'MODIFIED)
- (eq type 'MERGED)
- (eq type 'CONFLICT)
- (eq type 'CVS-REMOVED)
- (eq type 'REM-CONFLICT)
- (eq type 'MOVE-AWAY)
- (eq type 'REMOVED))
- (if (not (eq type 'REMOVED))
- (delete-file (cvs-full-path tin)))
- (setq files-to-update (cons tin files-to-update))
- (cvs-set-fileinfo->type fileinfo 'UPDATED)
- (cvs-set-fileinfo->handled fileinfo t)
- (tin-invalidate cvs-cookie-handle tin))
-
- ((eq type 'MOD-CONFLICT)
- (error "Use cvs-mode-add instead on %s."
- (cvs-fileinfo->file-name fileinfo)))
-
- ((eq type 'REM-CONFLICT)
- (error "Can't deal with a file you have removed and recreated."))
-
- ((eq type 'DIRCHANGE)
- (error "Undo on directories not supported (yet)."))
-
- ((eq type 'ADDED)
- (error "There is no old revision to get for %s"
- (cvs-fileinfo->file-name fileinfo)))
- (t (error "cvs-mode-undo-local-changes: can't handle an %s"
- type)))
-
- (setq tins-to-undo (cdr tins-to-undo))))
- (cvs-use-temp-buffer)
- (message "Re-getting files from repository...")
- (if (cvs-execute-list files-to-update cvs-program
- (if cvs-cvsroot
- (list "-d" cvs-cvsroot "update")
- '("update"))
- "Re-getting %s from repository...")
- (error "CVS exited with non-zero exit status.")
- (message "Re-getting files from repository... Done.")))))))
-
-;;----------
-(defun cvs-mode-acknowledge ()
- "Remove all marked files from the buffer."
-
- (interactive)
- (mapcar (function (lambda (tin)
- (tin-delete cvs-cookie-handle tin)))
- (cvs-get-marked)))
-
-;;----------
-(defun cvs-mode-unmark-up (pos)
- "Unmark the file on the previous line.
-Takes one argument POS, a buffer position."
-
- (interactive "d")
- (let ((tin (tin-goto-previous cvs-cookie-handle pos 1)))
- (cond
- (tin
- (cvs-set-fileinfo->marked (tin-cookie cvs-cookie-handle tin)
- nil)
- (tin-invalidate cvs-cookie-handle tin)))))
-
-;;----------
-(defun cvs-mode-previous-line (arg)
- "Go to the previous line.
-If a prefix argument is given, move by that many lines."
-
- (interactive "p")
- (tin-goto-previous cvs-cookie-handle (point) arg))
-
-;;----------
-(defun cvs-mode-next-line (arg)
- "Go to the next line.
-If a prefix argument is given, move by that many lines."
-
- (interactive "p")
- (tin-goto-next cvs-cookie-handle (point) arg))
-
-;;----------
-(defun cvs-add-file-update-buffer (tin)
- "Sub-function to cvs-mode-add. Internal use only. Update the display. Return
-non-nil if `cvs add' should be called on this file.
-Args: TIN.
-
-Returns 'DIR, 'ADD, 'ADD-DIR, or 'RESURRECT."
-
- (let ((fileinfo (tin-cookie cvs-cookie-handle tin)))
- (cond
- ((eq (cvs-fileinfo->type fileinfo) 'UNKNOWN-DIR)
- (cvs-set-fileinfo->full-log fileinfo "new directory added with cvs-mode-add")
- 'ADD-DIR)
- ((eq (cvs-fileinfo->type fileinfo) 'UNKNOWN)
- (cvs-set-fileinfo->type fileinfo 'ADDED)
- (cvs-set-fileinfo->full-log fileinfo "new file added with cvs-mode-add")
- (tin-invalidate cvs-cookie-handle tin)
- 'ADD)
- ((eq (cvs-fileinfo->type fileinfo) 'REMOVED)
- (cvs-set-fileinfo->type fileinfo 'UPDATED)
- (cvs-set-fileinfo->full-log fileinfo "file resurrected with cvs-mode-add")
- (cvs-set-fileinfo->handled fileinfo t)
- (tin-invalidate cvs-cookie-handle tin)
- 'RESURRECT))))
-
-;;----------
-(defun cvs-add-sub (cvs-buf candidates)
- "Internal use only.
-Args: CVS-BUF CANDIDATES.
-
-CANDIDATES is a list of tins. Updates the CVS-BUF and returns a list of lists.
-The first list is unknown tins that shall be `cvs add -m msg'ed.
-The second list is unknown directory tins that shall be `cvs add -m msg'ed.
-The third list is removed files that shall be `cvs add'ed (resurrected)."
-
- (let (add add-dir resurrect)
- (while candidates
- (let ((type (cvs-add-file-update-buffer (car candidates))))
- (cond ((eq type 'ADD)
- (setq add (cons (car candidates) add)))
- ((eq type 'ADD-DIR)
- (setq add-dir (cons (car candidates) add-dir)))
- ((eq type 'RESURRECT)
- (setq resurrect (cons (car candidates) resurrect)))))
- (setq candidates (cdr candidates)))
- (list add add-dir resurrect)))
-
-;;----------
-(defun cvs-mode-add ()
- "Add marked files to the cvs repository."
-
- (interactive)
- (let* ((buf (current-buffer))
- (marked (cvs-get-marked))
- (result (cvs-add-sub buf marked))
- (added (car result))
- (newdirs (car (cdr result)))
- (resurrect (car (cdr (cdr result))))
- (msg (if (or added newdirs)
- (read-from-minibuffer "Enter description: "))))
-
- (if (or resurrect (or added newdirs))
- (cvs-use-temp-buffer))
-
- (cond (resurrect
- (message "Resurrecting files from repository...")
- (if (cvs-execute-list resurrect
- cvs-program
- (if cvs-cvsroot
- (list "-d" cvs-cvsroot "add")
- '("add"))
- "Resurrecting %s from repository...")
- (error "CVS exited with non-zero exit status.")
- (message "Resurrecting files from repository... Done."))))
-
- (cond (added
- (message "Adding new files to repository...")
- (if (cvs-execute-list added
- cvs-program
- (if cvs-cvsroot
- (list "-d" cvs-cvsroot "add" "-m" msg)
- (list "add" "-m" msg))
- "Adding %s to repository...")
- (error "CVS exited with non-zero exit status.")
- (message "Adding new files to repository... Done."))))
-
- (cond (newdirs
- (message "Adding new directories to repository...")
- (if (cvs-execute-list newdirs
- cvs-program
- (if cvs-cvsroot
- (list "-d" cvs-cvsroot "add" "-m" msg)
- (list "add" "-m" msg))
- "Adding %s to repository...")
- (error "CVS exited with non-zero exit status.")
- (while newdirs
- (let* ((tin (car newdirs))
- (fileinfo (tin-cookie cvs-cookie-handle tin))
- (newdir (cvs-fileinfo->file-name fileinfo)))
- (cvs-set-fileinfo->dir fileinfo
- (concat (cvs-fileinfo->dir fileinfo)
- "/"
- newdir))
- (cvs-set-fileinfo->type fileinfo 'DIRCHANGE)
- (cvs-set-fileinfo->file-name fileinfo ".")
- (tin-invalidate cvs-cookie-handle tin)
- (setq newdirs (cdr newdirs))))
- ;; FIXME: this should really run cvs-update-no-prompt on the
- ;; subdir and insert everthing in the current list.
- (message "You must re-update to visit the new directories."))))))
-
-;;----------
-(defun cvs-mode-ignore ()
- "Arrange so that CVS ignores the selected files and directories.
-This command ignores files/dirs that are flagged as `Unknown'."
-
- (interactive)
- (mapcar (function (lambda (tin)
- (let* ((fileinfo (tin-cookie cvs-cookie-handle tin))
- (type (cvs-fileinfo->type fileinfo)))
- (cond ((or (eq type 'UNKNOWN)
- (eq type 'UNKNOWN-DIR))
- (cvs-append-to-ignore fileinfo)
- (tin-delete cvs-cookie-handle tin))))))
- (cvs-get-marked)))
-
-;;----------
-(defun cvs-append-to-ignore (fileinfo)
- "Append the file in fileinfo to the .cvsignore file"
-
- (save-window-excursion
- (set-buffer (find-file-noselect (concat (file-name-as-directory
- (cvs-fileinfo->dir fileinfo))
- ".cvsignore")))
- (goto-char (point-max))
- (if (not (zerop (current-column)))
- (insert "\n"))
- (insert (cvs-fileinfo->file-name fileinfo) "\n")
- (if cvs-sort-ignore-file
- (sort-lines nil (point-min) (point-max)))
- (save-buffer)))
-
-;;----------
-(defun cvs-mode-status ()
- "Show cvs status for all marked files."
-
- (interactive)
- (save-some-buffers)
- (if (not (listp cvs-status-flags))
- (error "cvs-status-flags should be set using cvs-set-status-flags."))
- (let ((marked (cvs-get-marked nil t)))
- (cvs-use-temp-buffer)
- (message "Running cvs status ...")
- (if (cvs-execute-list marked
- cvs-program
- (append (if cvs-cvsroot (list "-d" cvs-cvsroot))
- (list "-Q" "status")
- cvs-status-flags)
- "Running cvs -Q status %s...")
- (error "CVS exited with non-zero exit status.")
- (message "Running cvs -Q status ... Done."))))
-
-;;----------
-(defun cvs-mode-log ()
- "Display the cvs log of all selected files."
-
- (interactive)
- (if (not (listp cvs-log-flags))
- (error "cvs-log-flags should be set using cvs-set-log-flags."))
- (let ((marked (cvs-get-marked nil t)))
- (cvs-use-temp-buffer)
- (message "Running cvs log ...")
- (if (cvs-execute-list marked
- cvs-program
- (append (if cvs-cvsroot (list "-d" cvs-cvsroot))
- (list "log")
- cvs-log-flags)
- "Running cvs log %s...")
- (error "CVS exited with non-zero exit status.")
- (message "Running cvs log ... Done."))))
-
-;;----------
-(defun cvs-mode-tag ()
- "Run 'cvs tag' on all selected files."
-
- (interactive)
- (if (not (listp cvs-tag-flags))
- (error "cvs-tag-flags should be set using cvs-set-tag-flags."))
- (let ((marked (cvs-get-marked nil t))
- (tag-args (cvs-make-list (read-string "Tag name (and flags): "))))
- (cvs-use-temp-buffer)
- (message "Running cvs tag ...")
- (if (cvs-execute-list marked
- cvs-program
- (append (if cvs-cvsroot (list "-d" cvs-cvsroot))
- (list "tag")
- cvs-tag-flags
- tag-args)
- "Running cvs tag %s...")
- (error "CVS exited with non-zero exit status.")
- (message "Running cvs tag ... Done."))))
-
-;;----------
-(defun cvs-mode-rtag ()
- "Run 'cvs rtag' on all selected files."
-
- (interactive)
- (if (not (listp cvs-rtag-flags))
- (error "cvs-rtag-flags should be set using cvs-set-rtag-flags."))
- (let ((marked (cvs-get-marked nil t))
- ;; FIXME: should give selection from the modules file
- (module-name (read-string "Module name: "))
- ;; FIXME: should also ask for an existing tag *or* date
- (rtag-args (cvs-make-list (read-string "Tag name (and flags): "))))
- (cvs-use-temp-buffer)
- (message "Running cvs rtag ...")
- (if (cvs-execute-list marked
- cvs-program
- (append (if cvs-cvsroot (list "-d" cvs-cvsroot))
- (list "rtag")
- cvs-rtag-flags
- rtag-args
- (list module-name))
- "Running cvs rtag %s...")
- (error "CVS rtag exited with non-zero exit status.")
- (message "Running cvs rtag ... Done."))))
-
-;;----------
-(defun cvs-mode-byte-compile-files ()
- "Run byte-compile-file on all selected files that end in '.el'."
-
- (interactive)
- (let ((marked (cvs-get-marked)))
- (while marked
- (let ((filename (cvs-full-path (car marked))))
- (if (string-match "\\.el$" filename)
- (byte-compile-file filename)))
- (setq marked (cdr marked)))))
-
-;;----------
-(defun cvs-insert-full-path (tin)
- "Insert full path to the file described in TIN in the current buffer."
-
- (insert (format "%s\n" (cvs-full-path tin))))
-
-;;----------
-(defun cvs-mode-add-change-log-entry-other-window (pos)
- "Add a ChangeLog entry in the ChangeLog of the current directory.
-Args: POS."
-
- (interactive "d")
- (let* ((cvs-buf (current-buffer))
- (odir default-directory)
- (obfname buffer-file-name)
- (tin (tin-locate cvs-cookie-handle pos))
- (fileinfo (tin-cookie cvs-cookie-handle tin))
- (fname (cvs-fileinfo->file-name fileinfo))
- (dname (file-name-as-directory (cvs-fileinfo->dir fileinfo))))
- (setq change-log-default-name nil) ; this rarely correct in 19.28
- (setq buffer-file-name (cond (fname
- fname)
- (t
- nil)))
- (setq default-directory (cond (dname
- dname)
- (t
- odir)))
- (add-change-log-entry-other-window)
- (set-buffer cvs-buf)
- (setq default-directory odir)
- (setq buffer-file-name obfname)))
-
-;;----------
-(defun print-cvs-tin (foo)
- "Debug utility."
-
- (let ((cookie (tin-cookie cvs-cookie-handle foo))
- (stream (get-buffer-create "pcl-cvs-debug")))
- (princ "==============\n" stream)
- (princ (cvs-fileinfo->file-name cookie) stream)
- (princ "\n" stream)
- (princ (cvs-fileinfo->dir cookie) stream)
- (princ "\n" stream)
- (princ (cvs-fileinfo->full-log cookie) stream)
- (princ "\n" stream)
- (princ (cvs-fileinfo->marked cookie) stream)
- (princ "\n" stream)))
-
-;;----------
-;; NOTE: the variable cvs-emerge-tmp-head-file will be "free" when compiling
-(defun cvs-mode-emerge (pos)
- "Emerge appropriate revisions of the selected file.
-Args: POS."
-
- (interactive "d")
- (let* ((cvs-buf (current-buffer))
- (tin (tin-locate cvs-cookie-handle pos)))
- (if (boundp 'cvs-emerge-tmp-head-file)
- (error "There can only be one emerge session active at a time."))
- (if tin
- (let* ((fileinfo (tin-cookie cvs-cookie-handle tin))
- (type (cvs-fileinfo->type fileinfo)))
- (cond
- ((eq type 'MODIFIED) ; merge repository head rev. with working file
- (require 'emerge)
- (setq cvs-emerge-tmp-head-file ; trick to prevent multiple runs
- (cvs-retrieve-revision-to-tmpfile fileinfo))
- (unwind-protect
- (if (not (emerge-files
- t ; arg
- (cvs-fileinfo->full-path fileinfo) ; file-A
- ;; this is an un-avoidable compiler reference to a free variable
- cvs-emerge-tmp-head-file ; file-B
- (cvs-fileinfo->full-path fileinfo) ; file-out
- nil ; start-hooks
- '(lambda () ; quit-hooks
- (delete-file cvs-emerge-tmp-head-file)
- (makunbound 'cvs-emerge-tmp-head-file))))
- (error "Emerge session failed"))))
-
- ;; re-do the same merge rcsmerge supposedly just did....
- ((or (eq type 'MERGED)
- (eq type 'CONFLICT)) ; merge backup-working=A, head=B, base=ancestor
- (require 'emerge)
- (setq cvs-emerge-tmp-head-file ; trick to prevent multiple runs
- (cvs-retrieve-revision-to-tmpfile fileinfo
- (cvs-fileinfo->head-revision
- fileinfo)))
- (let ((cvs-emerge-tmp-backup-working-file
- (cvs-fileinfo->backup-file fileinfo))
- (cvs-emerge-tmp-ancestor-file
- (cvs-retrieve-revision-to-tmpfile fileinfo
- (cvs-fileinfo->base-revision
- fileinfo))))
- (unwind-protect
- (if (not (emerge-files-with-ancestor
- t ; arg
- cvs-emerge-tmp-backup-working-file ; file-A
- ;; this is an un-avoidable compiler reference to a free variable
- cvs-emerge-tmp-head-file ; file-B
- cvs-emerge-tmp-ancestor-file ; file-ancestor
- (cvs-fileinfo->full-path fileinfo) ; file-out
- nil ; start-hooks
- '(lambda () ; quit-hooks
- (delete-file cvs-emerge-tmp-backup-file)
- (delete-file cvs-emerge-tmp-ancestor-file)
- (delete-file cvs-emerge-tmp-head-file)
- (makunbound 'cvs-emerge-tmp-head-file))))
- (error "Emerge session failed")))))
- (t
- (error "Can only e-merge \"Modified\", \"Merged\" or \"Conflict\" files"))))
- (error "There is no file to e-merge."))))
-
-;;----------
-;; NOTE: the variable ediff-version may be "free" when compiling
-(defun cvs-mode-ediff (pos)
- "Ediff appropriate revisions of the selected file.
-Args: POS."
-
- (interactive "d")
- (if (boundp 'cvs-ediff-tmp-head-file)
- (error "There can only be one ediff session active at a time."))
- (require 'ediff)
- (if (and (boundp 'ediff-version)
- (>= (string-to-number ediff-version) 2.0)) ; FIXME real number?
- (run-ediff-from-cvs-buffer pos)
- (cvs-old-ediff-interface pos)))
-
-(defun cvs-old-ediff-interface (pos)
- "Emerge like interface for older ediffs.
-Args: POS"
-
- (let* ((cvs-buf (current-buffer))
- (tin (tin-locate cvs-cookie-handle pos)))
- (if tin
- (let* ((fileinfo (tin-cookie cvs-cookie-handle tin))
- (type (cvs-fileinfo->type fileinfo)))
- (cond
- ((eq type 'MODIFIED) ; diff repository head rev. with working file
- ;; should this be inside the unwind-protect, and should the
- ;; makeunbound be an unwindform?
- (setq cvs-ediff-tmp-head-file ; trick to prevent multiple runs
- (cvs-retrieve-revision-to-tmpfile fileinfo))
- (unwind-protect
- (if (not (ediff-files ; check correct ordering of args
- (cvs-fileinfo->full-path fileinfo) ; file-A
- ;; this is an un-avoidable compiler reference to a free variable
- cvs-ediff-tmp-head-file ; file-B
- '(lambda () ; startup-hooks
- (make-local-hook 'ediff-cleanup-hooks)
- (add-hook 'ediff-cleanup-hooks
- '(lambda ()
- (ediff-janitor)
- (delete-file cvs-ediff-tmp-head-file)
- (makunbound 'cvs-ediff-tmp-head-file))
- nil t))))
- (error "Ediff session failed"))))
-
- ;; look at the merge rcsmerge supposedly just did....
- ((or (eq type 'MERGED)
- (eq type 'CONFLICT)) ; diff backup-working=A, head=B, base=ancestor
- (if (not (boundp 'ediff-version))
- (error "ediff version way too old for 3-way diff"))
- (if (<= (string-to-number ediff-version) 1.9) ; FIXME real number?
- (error "ediff version %s too old for 3-way diff" ediff-version))
- (setq cvs-ediff-tmp-head-file ; trick to prevent multiple runs
- (cvs-retrieve-revision-to-tmpfile fileinfo
- (cvs-fileinfo->head-revision
- fileinfo)))
- (let ((cvs-ediff-tmp-backup-working-file
- (cvs-fileinfo->backup-file fileinfo))
- (cvs-ediff-tmp-ancestor-file
- (cvs-retrieve-revision-to-tmpfile fileinfo
- (cvs-fileinfo->base-revision
- fileinfo))))
- (unwind-protect
- (if (not (ediff-files3 ; check correct ordering of args
- cvs-ediff-tmp-backup-working-file ; file-A
- ;; this is an un-avoidable compiler reference to a free variable
- cvs-ediff-tmp-head-file ; file-B
- cvs-ediff-tmp-ancestor-file ; file-ancestor
- '(lambda () ; start-hooks
- (make-local-hook 'ediff-cleanup-hooks)
- (add-hook 'ediff-cleanup-hooks
- '(lambda ()
- (ediff-janitor)
- (delete-file cvs-ediff-tmp-backup-file)
- (delete-file cvs-ediff-tmp-ancestor-file)
- (delete-file cvs-ediff-tmp-head-file)
- (makunbound 'cvs-ediff-tmp-head-file))
- nil t))))
- (error "Ediff session failed")))))
-
- ((not (or (eq type 'UNKNOWN)
- (eq type 'UNKNOWN-DIR))) ; i.e. UPDATED or PATCHED ????
- ;; this should really diff the current working file with the previous
- ;; rev. on the current branch (i.e. not the head, since that's what
- ;; the current file should be)
- (setq cvs-ediff-tmp-head-file ; trick to prevent multiple runs
- (cvs-retrieve-revision-to-tmpfile fileinfo
- (read-string "Rev #/tag to diff against: "
- (cvs-fileinfo->head-revision
- fileinfo))))
- (unwind-protect
- (if (not (ediff-files ; check correct ordering of args
- (cvs-fileinfo->full-path fileinfo) ; file-A
- ;; this is an un-avoidable compiler reference to a free variable
- cvs-ediff-tmp-head-file ; file-B
- '(lambda () ; startup-hooks
- (make-local-hook 'ediff-cleanup-hooks)
- (add-hook 'ediff-cleanup-hooks
- '(lambda ()
- (ediff-janitor)
- (delete-file cvs-ediff-tmp-head-file)
- (makunbound 'cvs-ediff-tmp-head-file))
- nil t))))
- (error "Ediff session failed"))))
- (t
- (error "Can not ediff \"Unknown\" files"))))
- (error "There is no file to ediff."))))
-
-;;----------
-(defun cvs-retrieve-revision-to-tmpfile (fileinfo &optional revision)
- "Retrieve the latest revision of the file in FILEINFO to a temporary file.
-If second optional argument REVISION is given, retrieve that revision instead."
-
- (let
- ((temp-name (make-temp-name
- (concat (file-name-as-directory
- (or (getenv "TMPDIR") "/tmp"))
- "pcl-cvs." revision))))
- (cvs-kill-buffer-visiting temp-name)
- (if (and revision
- (stringp revision)
- (not (string= revision "")))
- (message "Retrieving revision %s..." revision)
- (message "Retrieving latest revision..."))
- (let ((res (call-process cvs-shell nil nil nil "-c"
- (concat cvs-program " update -p "
- (if (and revision
- (stringp revision)
- (not (string= revision "")))
- (concat "-r " revision " ")
- "")
- (cvs-fileinfo->full-path fileinfo)
- " > " temp-name))))
- (if (and res (not (and (integerp res) (zerop res))))
- (error "Something went wrong retrieving revision %s: %s"
- revision res))
-
- (if revision
- (message "Retrieving revision %s... Done." revision)
- (message "Retrieving latest revision... Done."))
- (save-excursion
- (set-buffer (find-file-noselect temp-name))
- (rename-buffer (concat " " (file-name-nondirectory temp-name)) t))
- temp-name)))
-
-;;----------
-(defun cvs-kill-buffer-visiting (filename)
- "If there is any buffer visiting FILENAME, kill it (without confirmation)."
-
- (let ((l (buffer-list)))
- (while l
- (if (string= (buffer-file-name (car l)) filename)
- (kill-buffer (car l)))
- (setq l (cdr l)))))
-
-;;----------
-(defun cvs-change-cvsroot ()
- "Ask for a new cvsroot."
-
- (interactive)
- (cvs-set-cvsroot (read-file-name "New CVSROOT: " cvs-cvsroot)))
-
-;;----------
-(defun cvs-set-cvsroot (newroot)
- "Change the cvsroot."
-
- (if (or (file-directory-p (expand-file-name "CVSROOT" newroot))
- (y-or-n-p (concat "Warning: no CVSROOT found inside repository."
- " Change cvs-cvsroot anyhow?")))
- (setq cvs-cvsroot newroot)))
-
-;;----------
-(defun cvs-set-diff-flags ()
- "Ask for new setting of cvs-diff-flags."
-
- (interactive)
- (let ((old-value (mapconcat 'identity
- (copy-sequence cvs-diff-flags) " ")))
- (setq cvs-diff-flags
- (cvs-make-list (read-string "Diff flags: " old-value)))))
-
-;;----------
-(defun cvs-set-update-optional-flags ()
- "Ask for new setting of cvs-update-optional-flags."
-
- (interactive)
- (let ((old-value (mapconcat 'identity
- (copy-sequence cvs-update-optional-flags) " ")))
- (setq cvs-update-optional-flags
- (cvs-make-list (read-string "Update optional flags: " old-value)))))
-
-;;----------
-(defun cvs-set-status-flags ()
- "Ask for new setting of cvs-status-flags."
-
- (interactive)
- (let ((old-value (mapconcat 'identity
- (copy-sequence cvs-status-flags) " ")))
- (setq cvs-status-flags
- (cvs-make-list (read-string "Status flags: " old-value)))))
-
-;;----------
-(defun cvs-set-log-flags ()
- "Ask for new setting of cvs-log-flags."
-
- (interactive)
- (let ((old-value (mapconcat 'identity
- (copy-sequence cvs-log-flags) " ")))
- (setq cvs-log-flags
- (cvs-make-list (read-string "Log flags: " old-value)))))
-
-;;----------
-(defun cvs-set-tag-flags ()
- "Ask for new setting of cvs-tag-flags."
-
- (interactive)
- (let ((old-value (mapconcat 'identity
- (copy-sequence cvs-tag-flags) " ")))
- (setq cvs-tag-flags
- (cvs-make-list (read-string "Tag flags: " old-value)))))
-
-;;----------
-(defun cvs-set-rtag-flags ()
- "Ask for new setting of cvs-rtag-flags."
-
- (interactive)
- (let ((old-value (mapconcat 'identity
- (copy-sequence cvs-rtag-flags) " ")))
- (setq cvs-rtag-flags
- (cvs-make-list (read-string "Rtag flags: " old-value)))))
-
-;;----------
-(if (string-match "Lucid" emacs-version)
- (progn
- (autoload 'pcl-cvs-fontify "pcl-cvs-lucid")
- (add-hook 'cvs-mode-hook 'pcl-cvs-fontify)))
-
-(defun cvs-changelog-name (directory)
- "Return the name of the ChangeLog file that handles DIRECTORY.
-This is in DIRECTORY or one of its parents.
-Signal an error if we can't find an appropriate ChangeLog file."
- (let ((dir (file-name-as-directory directory))
- file)
- (while (and dir
- (not (file-exists-p
- (setq file (expand-file-name "ChangeLog" dir)))))
- (let ((last dir))
- (setq dir (file-name-directory (directory-file-name dir)))
- (if (equal last dir)
- (setq dir nil))))
- (or dir
- (error "Can't find ChangeLog for %s" directory))
- file))
-
-(defun cvs-narrow-changelog ()
- "Narrow to the top page of the current buffer, a ChangeLog file.
-Actually, the narrowed region doesn't include the date line.
-A \"page\" in a ChangeLog file is the area between two dates."
- (or (eq major-mode 'change-log-mode)
- (error "cvs-narrow-changelog: current buffer isn't a ChangeLog"))
-
- (goto-char (point-min))
-
- ;; Skip date line and subsequent blank lines.
- (forward-line 1)
- (if (looking-at "[ \t\n]*\n")
- (goto-char (match-end 0)))
-
- (let ((start (point)))
- (forward-page 1)
- (narrow-to-region start (point))
- (goto-char (point-min))))
-
-(defun cvs-changelog-paragraph ()
- "Return the bounds of the ChangeLog paragraph containing point.
-If we are between paragraphs, return the previous paragraph."
- (save-excursion
- (beginning-of-line)
- (if (looking-at "^[ \t]*$")
- (skip-chars-backward " \t\n" (point-min)))
- (list (progn
- (if (re-search-backward "^[ \t]*\n" nil 'or-to-limit)
- (goto-char (match-end 0)))
- (point))
- (if (re-search-forward "^[ \t\n]*$" nil t)
- (match-beginning 0)
- (point)))))
-
-(defun cvs-changelog-subparagraph ()
- "Return the bounds of the ChangeLog subparagraph containing point.
-A subparagraph is a block of non-blank lines beginning with an asterisk.
-If we are between sub-paragraphs, return the previous subparagraph."
- (save-excursion
- (end-of-line)
- (if (search-backward "*" nil t)
- (list (progn (beginning-of-line) (point))
- (progn
- (forward-line 1)
- (if (re-search-forward "^[ \t]*[\n*]" nil t)
- (match-beginning 0)
- (point-max))))
- (list (point) (point)))))
-
-(defun cvs-changelog-entry ()
- "Return the bounds of the ChangeLog entry containing point.
-The variable `cvs-changelog-full-paragraphs' decides whether an
-\"entry\" is a paragraph or a subparagraph; see its documentation string
-for more details."
- (if cvs-changelog-full-paragraphs
- (cvs-changelog-paragraph)
- (cvs-changelog-subparagraph)))
-
-;; NOTE: the variable user-full-name may be "free" when compiling
-(defun cvs-changelog-ours-p ()
- "See if ChangeLog entry at point is for the current user, today.
-Return non-nil iff it is."
- ;; Code adapted from add-change-log-entry.
- (looking-at (concat (regexp-quote (substring (current-time-string)
- 0 10))
- ".* "
- (regexp-quote (substring (current-time-string) -4))
- "[ \t]+"
- (regexp-quote (if (and (boundp 'add-log-full-name)
- add-log-full-name)
- add-log-full-name
- user-full-name))
- " <"
- (regexp-quote (if (and (boundp 'add-log-mailing-address)
- add-log-mailing-address)
- add-log-mailing-address
- user-mail-address)))))
-
-(defun cvs-relative-path (base child)
- "Return a directory path relative to BASE for CHILD.
-If CHILD doesn't seem to be in a subdirectory of BASE, just return
-the full path to CHILD."
- (let ((base (file-name-as-directory (expand-file-name base)))
- (child (expand-file-name child)))
- (or (string= base (substring child 0 (length base)))
- (error "cvs-relative-path: %s isn't in %s" child base))
- (substring child (length base))))
-
-(defun cvs-changelog-entries (file)
- "Return the ChangeLog entries for FILE, and the ChangeLog they came from.
-The return value looks like this:
- (LOGBUFFER (ENTRYSTART . ENTRYEND) ...)
-where LOGBUFFER is the name of the ChangeLog buffer, and each
-\(ENTRYSTART . ENTRYEND\) pair is a buffer region."
- (save-excursion
- (set-buffer (find-file-noselect
- (cvs-changelog-name
- (file-name-directory
- (expand-file-name file)))))
- (or (eq major-mode 'change-log-mode)
- (change-log-mode))
- (goto-char (point-min))
- (if (looking-at "[ \t\n]*\n")
- (goto-char (match-end 0)))
- (if (not (cvs-changelog-ours-p))
- (list (current-buffer))
- (save-restriction
- (cvs-narrow-changelog)
- (goto-char (point-min))
-
- ;; Search for the name of FILE relative to the ChangeLog. If that
- ;; doesn't occur anywhere, they're not using full relative
- ;; filenames in the ChangeLog, so just look for FILE; we'll accept
- ;; some false positives.
- (let ((pattern (cvs-relative-path
- (file-name-directory buffer-file-name) file)))
- (if (or (string= pattern "")
- (not (save-excursion
- (search-forward pattern nil t))))
- (setq pattern file))
-
- (let (texts)
- (while (search-forward pattern nil t)
- (let ((entry (cvs-changelog-entry)))
- (setq texts (cons entry texts))
- (goto-char (elt entry 1))))
-
- (cons (current-buffer) texts)))))))
-
-(defun cvs-changelog-insert-entries (buffer regions)
- "Insert those regions in BUFFER specified in REGIONS.
-Sort REGIONS front-to-back first."
- (let ((regions (sort regions 'car-less-than-car))
- (last))
- (while regions
- (if (and last (< last (car (car regions))))
- (newline))
- (setq last (elt (car regions) 1))
- (apply 'insert-buffer-substring buffer (car regions))
- (setq regions (cdr regions)))))
-
-(defun cvs-union (set1 set2)
- "Return the union of SET1 and SET2, according to `equal'."
- (while set2
- (or (member (car set2) set1)
- (setq set1 (cons (car set2) set1)))
- (setq set2 (cdr set2)))
- set1)
-
-(defun cvs-insert-changelog-entries (files)
- "Given a list of files FILES, insert the ChangeLog entries for them."
- (let ((buffer-entries nil))
-
- ;; Add each buffer to buffer-entries, and associate it with the list
- ;; of entries we want from that file.
- (while files
- (let* ((entries (cvs-changelog-entries (car files)))
- (pair (assq (car entries) buffer-entries)))
- (if pair
- (setcdr pair (cvs-union (cdr pair) (cdr entries)))
- (setq buffer-entries (cons entries buffer-entries))))
- (setq files (cdr files)))
-
- ;; Now map over each buffer in buffer-entries, sort the entries for
- ;; each buffer, and extract them as strings.
- (while buffer-entries
- (cvs-changelog-insert-entries (car (car buffer-entries))
- (cdr (car buffer-entries)))
- (if (and (cdr buffer-entries) (cdr (car buffer-entries)))
- (newline))
- (setq buffer-entries (cdr buffer-entries)))))
-
-(defun cvs-edit-delete-common-indentation ()
- "Unindent the current buffer rigidly until at least one line is flush left."
- (save-excursion
- (let ((common 100000))
- (goto-char (point-min))
- (while (< (point) (point-max))
- (if (not (looking-at "^[ \t]*$"))
- (setq common (min common (current-indentation))))
- (forward-line 1))
- (indent-rigidly (point-min) (point-max) (- common)))))
-
-(defun cvs-mode-changelog-commit ()
- "Check in all marked files, or the current file.
-Ask the user for a log message in a buffer.
-
-This is just like `\\[cvs-mode-commit]', except that it tries to provide
-appropriate default log messages by looking at the ChangeLog. The
-idea is to write your ChangeLog entries first, and then use this
-command to commit your changes.
-
-To select default log text, we:
-- find the ChangeLog entries for the files to be checked in,
-- verify that the top entry in the ChangeLog is on the current date
- and by the current user; if not, we don't provide any default text,
-- search the ChangeLog entry for paragraphs containing the names of
- the files we're checking in, and finally
-- use those paragraphs as the log text."
-
- (interactive)
-
- (let* ((cvs-buf (current-buffer))
- (marked (cvs-filter (function cvs-committable)
- (cvs-get-marked))))
- (if (null marked)
- (error "Nothing to commit!")
- (pop-to-buffer (get-buffer-create cvs-commit-prompt-buffer))
- (goto-char (point-min))
-
- (erase-buffer)
- (cvs-insert-changelog-entries
- (mapcar (lambda (tin)
- (let ((cookie (tin-cookie cvs-cookie-handle tin)))
- (expand-file-name
- (cvs-fileinfo->file-name cookie)
- (cvs-fileinfo->dir cookie))))
- marked))
- (cvs-edit-delete-common-indentation)
-
- (cvs-edit-mode)
- (make-local-variable 'cvs-commit-list)
- (setq cvs-commit-list marked)
- (message "Press C-c C-c when you are done editing."))))
-
-(provide 'pcl-cvs)
-
-;;;; end of file pcl-cvs.el
diff --git a/gnu/usr.bin/cvs/tools/pcl-cvs/pcl-cvs.ps b/gnu/usr.bin/cvs/tools/pcl-cvs/pcl-cvs.ps
deleted file mode 100644
index d8fdac2dd01..00000000000
--- a/gnu/usr.bin/cvs/tools/pcl-cvs/pcl-cvs.ps
+++ /dev/null
@@ -1,2667 +0,0 @@
-%!PS-Adobe-2.0
-%%Creator: dvipsk 5.58f Copyright 1986, 1994 Radical Eye Software
-%%Title: pcl-cvs.dvi
-%%Pages: 32
-%%PageOrder: Ascend
-%%BoundingBox: 0 0 596 842
-%%EndComments
-%DVIPSCommandLine: dvips pcl-cvs.dvi -o pcl-cvs.ps
-%DVIPSParameters: dpi=300, compressed, comments removed
-%DVIPSSource: TeX output 1996.05.06:0523
-%%BeginProcSet: texc.pro
-/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N
-/X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72
-mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1}
-ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale
-isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div
-hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul
-TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if}
-forall round exch round exch]setmatrix}N /@landscape{/isls true N}B
-/@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B
-/FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{
-/nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N
-string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N
-end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{
-/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0]
-N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup
-length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{
-128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub
-get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data
-dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N
-/rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup
-/base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx
-0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff
-setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff
-.1 sub]/id ch-image N /rw ch-width 7 add 8 idiv string N /rc 0 N /gp 0 N
-/cp 0 N{rc 0 ne{rc 1 sub /rc X rw}{G}ifelse}imagemask restore}B /G{{id
-gp get /gp gp 1 add N dup 18 mod S 18 idiv pl S get exec}loop}B /adv{cp
-add /cp X}B /chg{rw cp id gp 4 index getinterval putinterval dup gp add
-/gp X adv}B /nd{/cp 0 N rw exit}B /lsh{rw cp 2 copy get dup 0 eq{pop 1}{
-dup 255 eq{pop 254}{dup dup add 255 and S 1 and or}ifelse}ifelse put 1
-adv}B /rsh{rw cp 2 copy get dup 0 eq{pop 128}{dup 255 eq{pop 127}{dup 2
-idiv S 128 and or}ifelse}ifelse put 1 adv}B /clr{rw cp 2 index string
-putinterval adv}B /set{rw cp fillstr 0 4 index getinterval putinterval
-adv}B /fillstr 18 string 0 1 17{2 copy 255 put pop}for N /pl[{adv 1 chg}
-{adv 1 chg nd}{1 add chg}{1 add chg nd}{adv lsh}{adv lsh nd}{adv rsh}{
-adv rsh nd}{1 add adv}{/rc X nd}{1 add set}{1 add clr}{adv 2 chg}{adv 2
-chg nd}{pop nd}]dup{bind pop}forall N /D{/cc X dup type /stringtype ne{]
-}if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup
-length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{
-cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin
-0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul
-add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore userdict
-/eop-hook known{eop-hook}if showpage}N /@start{userdict /start-hook
-known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X
-/IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for
-65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0
-0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V
-{}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7
-getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false}
-ifelse}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false
-RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1
-false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform
-round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg
-rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail
-{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M}
-B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{
-4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{
-p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p
-a}B /bos{/SS save N}B /eos{SS restore}B end
-%%EndProcSet
-TeXDict begin 39158280 55380996 1000 300 300 (pcl-cvs.dvi)
-@start /Fa 1 47 df<127012F8A212F012E005057B840E>46 D
-E /Fb 1 47 df<1238127C12FCA212F8127006067A8512>46 D E
-/Fc 51 123 df<90381FC1F090387037189038C03E3C3801807C000313783907003800A9
-B612C03907003800B2143C397FE1FFC01E2380A21C>11 D<132013401380EA01005A1206
-1204120CA25AA25AA312701260A312E0AE1260A312701230A37EA27EA2120412067E7EEA
-0080134013200B327CA413>40 D<7E12407E7E12187E12041206A27EA2EA0180A313C012
-00A313E0AE13C0A312011380A3EA0300A21206A21204120C5A12105A5A5A0B327DA413>
-I<EAFFF8A20D02808B10>45 D<EA01F0EA071CEA0C06487E00381380A2387001C0A400F0
-13E0AE007013C0A3EA780300381380A2381C0700EA0C06EA071CEA01F013227EA018>48
-D<13801203120F12F31203B3A9EA07C0EAFFFE0F217CA018>I<EA03F0EA0C1CEA100700
-201380384003C0A2008013E012F0EAF801A3EA2003120014C0A2EB07801400130E5B1318
-5B5B5B485A90C7FC000213205A5A00181360481340383FFFC05AB5FC13217EA018>I<EA
-03F8EA0C1EEA100F38200780004013C0127813031307123800001380A214005B130C1338
-EA03F0EA001C130FEB0780A2EB03C0A214E01220127012F8A200F013C01240EB07801220
-38100F00EA0C1CEA03F013227EA018>I<1303A25BA25B1317A213271367134713871201
-13071202120612041208A212101220A2124012C0B512F838000700A7EB0F80EB7FF01521
-7FA018>I<00101380381E0700EA1FFF5B13F8EA17E00010C7FCA6EA11F8EA120CEA1C07
-381803801210380001C0A214E0A4127012F0A200E013C01280EA4003148038200700EA10
-06EA0C1CEA03F013227EA018>I<137EEA01C138030080380601C0EA0C03121C38180180
-0038C7FCA212781270A2EAF0F8EAF30CEAF4067F00F81380EB01C012F014E0A51270A300
-3813C0A238180380001C1300EA0C06EA070CEA01F013227EA018>I<12401260387FFFE0
-14C0A23840008038C0010012801302A2485A5BA25B5BA21360134013C0A21201A25B1203
-A41207A76CC7FC13237DA118>I<EA01F8EA060EEA0803381001801220386000C0A31270
-A238780180003E1300EA3F02EA1FC4EA0FF812036C7EEA067EEA083F38100F80383007C0
-EA6003EB00E05A1460A40060134014C06C138038180300EA0E0EEA03F013227EA018>I<
-497EA3497EA3EB05E0A2EB09F01308A2EB1078A3497EA3497EA2EBC01F497EA248B51280
-EB0007A20002EB03C0A348EB01E0A348EB00F0121C003EEB01F839FF800FFF20237EA225
->65 D<B512F8380F800E0007EB0780EC03C015E0140115F0A515E01403EC07C0EC0F80EC
-3E00EBFFFE9038800780EC03C0EC01E015F0140015F8A6EC01F0A2EC03E0EC07C0000FEB
-0F00B512FC1D227EA123>I<903807E0109038381830EBE0063901C0017039038000F048
-C7FC000E1470121E001C1430123CA2007C14101278A200F81400A812781510127C123CA2
-001C1420121E000E14407E6C6C13803901C001003800E002EB381CEB07E01C247DA223>
-I<B612C0380F80070007130114001540A215601520A314201500A3146014E013FF138014
-601420A315081400A21510A31530A2157015E0000F1303B6FC1D227EA121>69
-D<B612C0380F80070007130114001540A215601520A314201500A3146014E013FF138014
-601420A491C7FCA9487EEAFFFE1B227EA120>I<903807F00890383C0C18EBE0023901C0
-01B839038000F848C71278481438121E15185AA2007C14081278A200F81400A7EC1FFF00
-78EB00F81578127C123CA27EA27E7E6C6C13B86C7E3900E0031890383C0C08903807F000
-20247DA226>I<EAFFFCEA0FC0EA0780B3ACEA0FC0EAFFFC0E227EA112>73
-D<D8FFFCEBFF80D80FC0EB7C006C48133015205D5D4AC7FC14025C5C5C5C5C5CEB81C0EB
-83E01385EB88F01390EBA078EBC03C13808080A26E7E8114036E7EA26E7E81486C7F3AFF
-FC07FF8021227EA126>75 D<EAFFFCEA1F806CC7FCB3A21401A41403A214021406A2141E
-48137EB512FE18227DA11E>I<39FF8007FF3907C000F81570D805E01320EA04F0A21378
-137C133C7F131F7FEB0780A2EB03C0EB01E0A2EB00F014F81478143C143E141E140FA2EC
-07A0EC03E0A21401A21400000E1460121FD8FFE0132020227EA125>78
-D<B512F0380F803C0007130FEC078015C0140315E0A615C014071580EC0F00143CEBFFF0
-0180C7FCAE487EEAFFFC1B227EA121>80 D<B512E0380F803C0007130E6E7E81140381A5
-5D14075D020EC7FC143CEBFFE0EB80708080141E140E140FA481A3168015C014073A0FC0
-03C10039FFFC01E2C8127C21237EA124>82 D<3803F020380C0C60EA1802383001E0EA70
-000060136012E0A21420A36C1300A21278127FEA3FF0EA1FFE6C7E0003138038003FC0EB
-07E01301EB00F0A214707EA46C1360A26C13C07E38C8018038C60700EA81FC14247DA21B
->I<39FFFC07FF390FC000F86C4813701520B3A5000314407FA2000114806C7E90386001
-00EB3006EB1C08EB03F020237EA125>85 D<D8FFF0EB7FC0D81F80EB1F006CC7120C7F00
-071408A26C6C5BA36C6C5BA26D136000001440A201785BA2137CD93C01C7FCA2EB1E02A3
-6D5AA2148CEB0788A2EB03D0A214F06D5AA26D5AA322237FA125>I<EA1FE0EA3038EA78
-0C130EEA30071200A313FFEA07C7EA1E07123C1278127000F01308A3130FEA7817383C23
-90380FC1E015157E9418>97 D<120E12FE121E120EAB131FEB61C0EB8060380F0030000E
-1338143C141C141EA7141C143C1438000F1370380C8060EB41C038083F0017237FA21B>
-I<EA01FEEA0703380C0780121C383803000078C7FC127012F0A712700078134012386C13
-80380C0100EA0706EA01F812157E9416>I<14E0130F13011300ABEA01F8EA0704EA0C02
-EA1C01EA38001278127012F0A7127012781238EA1801EA0C0238070CF03801F0FE17237E
-A21B>I<EA01FCEA0707380C0380381C01C01238007813E0EA700012F0B5FC00F0C7FCA5
-12700078132012386C13406C138038070300EA00FC13157F9416>I<14703803F198380E
-1E18EA1C0E38380700A200781380A400381300A2EA1C0EEA1E1CEA33F00020C7FCA21230
-1238EA3FFE381FFFC06C13E0383000F0481330481318A400601330A2003813E0380E0380
-3803FE0015217F9518>103 D<120E12FE121E120EABEB1F80EB60C0EB80E0380F0070A2
-120EAF38FFE7FF18237FA21B>I<121C123EA3121CC7FCA8120E127E121E120EB1EAFFC0
-0A227FA10E>I<120E12FE121E120EABEB03FCEB01F014C01480EB02005B5B5B133813F8
-EA0F1CEA0E1E130E7F1480EB03C0130114E0EB00F014F838FFE3FE17237FA21A>107
-D<120E12FE121E120EB3ADEAFFE00B237FA20E>I<390E1FC07F3AFE60E183803A1E8072
-01C03A0F003C00E0A2000E1338AF3AFFE3FF8FFE27157F942A>I<380E1F8038FE60C038
-1E80E0380F0070A2120EAF38FFE7FF18157F941B>I<EA01FCEA0707380C0180381800C0
-003813E0481370A200F01378A700701370007813F0003813E0381C01C0380E0380380707
-00EA01FC15157F9418>I<EA0E1F38FE61C0380E8060380F0070000E1338143CA2141EA7
-143CA21438000F1370380E80E0EB41C0EB3F0090C7FCA9EAFFE0171F7F941B>I<EA0E3C
-EAFE46EA1E8FEA0F0F13061300120EAD120FEAFFF010157F9413>114
-D<EA0F88EA3078EA601812C01308A212E0EAF000127FEA3FE0EA0FF0EA01F8EA003CEA80
-1C130CA212C01308EAE018EAD030EA8FC00E157E9413>I<1202A41206A3120E121E123E
-EAFFFCEA0E00AB1304A6EA07081203EA01F00E1F7F9E13>I<000E137038FE07F0EA1E00
-000E1370AD14F0A238060170380382783800FC7F18157F941B>I<38FF80FE381E007814
-30000E1320A26C1340A2EB80C000031380A23801C100A2EA00E2A31374A21338A3131017
-157F941A>I<39FF8FF87F393E01E03C001CEBC01814E0000E1410EB0260147000071420
-EB04301438D803841340EB8818141CD801C81380EBD00C140E3900F00F00497EA2EB6006
-EB400220157F9423>I<38FF83FE381F00F0000E13C06C1380EB8100EA0383EA01C2EA00
-E41378A21338133C134E138FEA0187EB0380380201C0000413E0EA0C00383E01F038FF03
-FE17157F941A>I<38FF80FE381E00781430000E1320A26C1340A2EB80C000031380A238
-01C100A2EA00E2A31374A21338A31310A25BA35B12F05B12F10043C7FC123C171F7F941A
->I<383FFFC038380380EA300700201300EA600EEA401C133C1338C65A5B12015B380380
-40EA07005A000E13C04813805AEA7801EA7007B5FC12157F9416>I
-E /Fd 1 59 df<126012F0A2126004047D830B>58 D E /Fe 66
-123 df<EBFE7C380381C6380603CE000E1384001C1380A6B512F0381C0380AE38FF8FF0
-171A809916>11 D<13FEEA038138060180EA0E03381C010090C7FCA5B51280EA1C03AE38
-FF8FF0141A809915>I<EBFF80EA0383EA0603120E121CA6B5FCEA1C03AE38FF9FF0141A
-809915>I<126012F0A61260AA12201200A4126012F0A21260041A7D990B>33
-D<1380EA010012025A120C120812185AA35AA412E0AA1260A47EA37E1208120C12047E7E
-EA008009267D9B0F>40 D<7E12407E7E12181208120C7EA37EA41380AA1300A41206A35A
-1208121812105A5A5A09267E9B0F>I<1203A4EAE31CEA7338EA1FE0EA0780A2EA1FE0EA
-7338EAE31CEA0300A40E107E9B13>I<126012F0A212701210A31220A21240A2040B7D83
-0B>44 D<EAFFC0A20A0280880D>I<126012F0A2126004047D830B>I<130CA2131C1318A2
-13381330A213701360A213E013C0A212011380A2120313005A1206A2120E120CA2121C12
-18A212381230A212701260A212E05AA20E257E9B13>I<EA07E0EA1C38EA381CEA300CEA
-700EEA6006A2EAE007AAEA6006A2EA700EEA300CEA381CEA1C38EA07E010187F9713>I<
-12035AB4FC1207B3A2EA7FF80D187D9713>I<EA0F80EA1060EA2030EA4038EA803CEAC0
-1C12E01240EA003C1338A21370136013C0EA018013001202EA040412081210EA3008EA3F
-F8127F12FF0E187E9713>I<EA07E0EA1838EA201CEA601EEA700EEA201E1200131CA213
-381370EA07E0EA0038131C130E130FA212E0A212C0EA400EEA601CEA1838EA07E010187F
-9713>I<1318A21338137813F813B8EA01381202A212041208121812101220124012C0B5
-FCEA0038A6EA03FF10187F9713>I<EA3018EA3FF013E01380EA2000A5EA2FC0EA3060EA
-2030EA00381318131CA2124012E0A2EA8018EA40381330EA30E0EA0F800E187E9713>I<
-EA01F8EA0704EA0C06EA180E123013001270126012E0EAE3E0EAE418EAE80CEAF00EEAE0
-061307A31260A2EA7006EA300EEA180CEA0C38EA07E010187F9713>I<1240EA7FFF13FE
-A2EA4004EA80081310A2EA00201340A21380120113005AA25A1206A2120EA5120410197E
-9813>I<EA07E0EA1818EA300CEA20061260A21270EA780CEA3E18EA1F30EA07C0EA03E0
-EA0CF8EA307CEA601E130FEAC0071303A3EA6002EA2004EA1818EA07E010187F9713>I<
-130CA3131EA2132F1327A2EB4380A3EB81C0A200017F1300A248B47E38020070A2487FA3
-487FA2003C131EB4EBFFC01A1A7F991D>65 D<B51280380E00E014701438143CA5147814
-70EB01E0380FFFC0380E00F01478143C141C141EA4141C143C147814F0B512C0171A7F99
-1B>I<EB3F023801C0C63803002E000E131E48130E14065A007813021270A200F01300A6
-00701302A21278003813047E14087E000313303801C0C038003F00171A7E991C>I<B57E
-380E00E01470808080A280A21580A81500A25C140E5CA2147814E0B51280191A7F991D>
-I<B512F8380E003814181408140C1404A3EB0100A35BEA0FFFEA0E037FA3EB0002A31406
-1404A2140C143CB512FC171A7F991A>I<B512F8380E003814181408140C1404A3EB0100
-A35BEA0FFFEA0E037FA390C7FCA8EAFFE0161A7F9919>I<EB3F023801C0C63803002E00
-0E131E48130E14065A007813021270A200F090C7FCA5903801FFC03970000E00A2127812
-387EA27E000313163801C06638003F821A1A7E991E>I<39FFE1FFC0390E001C00AB380F
-FFFC380E001CAC39FFE1FFC01A1A7F991D>I<EAFF80EA1C00B3A6EAFF80091A7E990E>I<
-39FFE01FC0390E000F00140C14085C5C5C495A0102C7FC5B130C131C132E1347EB8380EA
-0F03380E01C06D7EA2147080A280141E141F39FFE07FC01A1A7F991E>75
-D<EAFFE0000EC7FCB01408A3141814101430147014F0B5FC151A7F9918>I<B414FF000F
-14F0A2390B800170A23809C002A33808E004A2EB7008A3EB3810A3EB1C20A2EB0E40A3EB
-0780A2EB0300121C39FF8307FF201A7F9923>I<137F3801C1C038070070000E7F487F00
-3C131E0038130E0078130F00707F00F01480A80078EB0F00A20038130E003C131E001C13
-1C6C5B6C5B3801C1C0D8007FC7FC191A7E991E>79 D<B51280380E01E0EB007014781438
-143CA4143814781470EB01E0380FFF80000EC7FCABEAFFE0161A7F991A>I<137F3801C1
-C038070070000E7F487F003C131E0038130E0078130F00707F00F01480A8007014000078
-5B0038130E383C1C1E381C221C380E4138000713F03801E1C039007F8080EB00C0A214E1
-EC7F00A2143E141C19217E991E>I<B5FC380E01C0EB0070147880A55C1470EB01C0D80F
-FFC7FC380E0380EB00C0801470A31478A31540143CEC1C8039FFE00F001A1A7F991C>I<
-EA0FC2EA1836EA200EEA600612C01302A3EAE0001270127EEA3FE0EA1FF8EA03FCEA007E
-130E130713031280A3EAC0021306EAE004EAD818EA87E0101A7E9915>I<007FB5FC3870
-1C0700401301A200C0148000801300A300001400B13803FFE0191A7F991C>I<39FFE07F
-C0390E000E001404B200065B12076C5B6C6C5A3800E0C0013FC7FC1A1A7F991D>I<39FF
-801FC0391C00070014066C1304A36C5BA26C6C5AA36C6C5AA26C6C5AA3EB7080A2137901
-39C7FCA2131EA3130CA21A1A7F991D>I<39FFC0FF80390F003C0014106C5BEA03806D5A
-00015BEA00E101F1C7FC137A133E131C131EA21317EB27801343EB41C0EB81E0EA010048
-137000021378481338000C7F001E133EB4EB7FC01A1A7F991D>88
-D<EA1FC0EA38707FEA101C1200A2EA03FCEA1E1C1238127012E01480A2133CEA705F381F
-8F0011107F8F13>97 D<12FC121CA913FCEA1D07381E0380381C01C0130014E0A6EB01C0
-1480381E0300EA1906EA10F8131A809915>I<EA07F8EA1C1C1238EA700813005AA61270
-1304EA3808EA1C18EA07E00E107F8F11>I<133F1307A9EA03E7EA0C17EA180F487E1270
-12E0A6126012706C5AEA1C373807C7E0131A7F9915>I<EA07C0EA1C30EA30181270EA60
-0C12E0EAFFFCEAE000A41260EA7004EA3808EA1C18EA07E00E107F8F11>I<EA01F0EA07
-18EA0E38EA1C101300A6EAFFC0EA1C00AEEAFF800D1A80990C>I<EA0FCF381871803830
-3000EA7038A4EA30306C5AEA2FC00060C7FCA21270EA3FF013FC6C7EEA600FEAC003A4EA
-6006EA381CEA07E011187F8F13>I<12FC121CA9137CEA1D87381E0380A2121CAB38FF9F
-F0141A809915>I<1218123CA212181200A612FC121CAE12FF081A80990A>I<12FC121CA9
-EB1FC0EB0F00130C5B13205B13E0121DEA1E70EA1C7813387F131E7F148038FF9FE0131A
-809914>107 D<12FC121CB3A6EAFF80091A80990A>I<38FC7C1F391D8E6380391E0781C0
-A2001C1301AB39FF9FE7F81D107F8F20>I<EAFC7CEA1D87381E0380A2121CAB38FF9FF0
-1410808F15>I<EA07E0EA1C38EA300CEA700EEA6006EAE007A6EA6006EA700EEA381CEA
-1C38EA07E010107F8F13>I<EAFCFCEA1D07381E0380381C01C0A2EB00E0A6EB01C01480
-381E0300EA1D06EA1CF890C7FCA6B47E1317808F15>I<EA03E1EA0C13EA180BEA300FEA
-700712E0A61270A26C5AEA1C37EA07C7EA0007A6EB3FE013177F8F14>I<EAFC78EA1D9C
-EA1E1C1308EA1C00ABEAFF800E10808F0F>I<EA1F20EA60E0EA402012C0A2EAF000127F
-EA3FC0EA1FE0EA00F0EA8070133012C01320EAF040EA8F800C107F8F0F>I<1208A41218
-A21238EAFFC0EA3800A81320A41218EA1C40EA07800B177F960F>I<38FC1F80EA1C03AB
-1307120CEA0E0B3803F3F01410808F15>I<38FF0F80383C0700EA1C061304A26C5AA26C
-5AA3EA03A0A2EA01C0A36C5A11107F8F14>I<39FE7F1F8039381C0700003C1306381C0C
-04130E380E16081317A238072310149013A33803C1A014E0380180C0A319107F8F1C>I<
-38FE3F80383C1E00EA1C086C5AEA0F306C5A6C5A12017F1203EA0270487E1208EA181CEA
-381E38FC3FC012107F8F14>I<38FF0F80383C0700EA1C061304A26C5AA26C5AA3EA03A0
-A2EA01C0A36C5AA248C7FCA212E112E212E4127811177F8F14>I<EAFFF8EAE07012C0EA
-80E0EA81C0A2EA0380EA0700A2EA0E04121CA2EA380812701338EAFFF80E107F8F11>I
-E /Ff 4 109 df<EB0FE0EB3810EBE038EA01C0143038038000A5381FFFF0380700E0A6
-380E01C0A6381C0380A238FF8FF0151A809915>12 D<1270A212F0126004047D830B>46
-D<EA03F0EA0618EA1C0C1238EA300E1270EA7FFEEAE000A412601304EA3008EA1830EA0F
-C00F107E8F11>101 D<EA07C01201A4EA0380A6EA0700A6120EA65AA2EAFF800A1A8099
-0A>108 D E /Fg 38 122 df<1230127CA2123C120CA3121C1238127012E012C0060C79
-9614>39 D<EA0380A3EA638CEAF39EEA7FFCEA3FF8EA0FE0A2EA3FF8EA7FFCEAF39EEA63
-8CEA0380A30F107E9214>42 D<EAFFFEA30F037E8C14>45 D<EA01C0487EA21360A2EA07
-70A4EA0630EA0E38A4487EEA1FFCA2EA1C1CA2487EA238FE3F80A211177F9614>65
-D<3801F180EA07FFEA1E1FEA3C0FEA3807EA7803127012F048C7FCA738F0038012701278
-EA3807003C1300EA1E1EEA07FCEA01F011177F9614>67 D<EAFFE013F8EA383C7F130E7F
-A3EB0380A8EB0700A2130E131E5BEAFFF813E011177F9614>I<B51280A2EA1C03A490C7
-FCA2131CA2EA1FFCA2EA1C1CA290C7FCA3EB01C0A4B5FCA21217809614>I<EAFFC0A200
-1CC7FCAFEB0380A4B5FCA211177F9614>76 D<38FE0FE0A2003E1380EA3B1BA413BBA2EA
-39B3A313F3EA38E3A21303A638FE0FE0A21317809614>I<EAFFF813FEEA1C0F7FEB0380
-A5EB07005BEA1FFE13F8001CC7FCA8B47EA21117809614>80 D<EAFFE013F8EA383C131C
-7FA45B133CEA3FF85BEA38787F131CA4EB1DC0A3EAFE0FEB070012177F9614>82
-D<EA0FCCEA3FFCEA787CEAF03C12E0131CA2EAF0007E127EEA3FE0EA0FF8EA01FCEA003C
-131E130E12E0A3EAF01CEAF83CEAFFF8EAC7E00F177E9614>I<38FF8FF8A2381C01C0B0
-380E0380EA0F0738078F00EA03FEEA00F81517819614>85 D<120C121C1238127012E012
-C0A312F012F8A21230060C799914>96 D<EA1FC0EA7FF0EA7078EA203CEA001CA2EA07FC
-121FEA7C1C12F012E0A3EA707C383FFF80EA0F8F11107E8F14>I<12FCA2121CA513F8EA
-1FFE130F381E0780EA1C0314C01301A41303001E13801307381F0F0013FEEA1CF8121780
-9614>I<EA03F8EA0FFEEA3C0EEA7804EA700012F05AA47E1270EA780EEA3C1EEA0FFCEA
-03F00F107E8F14>I<137EA2130EA5EA07CEEA1FFEEA3C3EEA781EEA700E12F012E0A412
-F0EA701E1278EA3C3E381FFFC0EA07CF12177F9614>I<EA07E0EA1FF8EA3C3CEA781CEA
-701EEAF00E12E0EAFFFEA2EAE0007E1270EA780EEA3C1EEA0FFCEA03F00F107E8F14>I<
-13FCEA01FEEA078E13041300A3EAFFFEA2EA0700ACEAFFF8A20F177F9614>I<EA07CF38
-1FFF80EA3C7B38783C00EA701CA3EA783C6C5AEA3FF0EA77C00070C7FCA2EA3FF813FE7F
-38700F80EAF007EAE003A338700700EA7C1FEA1FFCEA07F011197F8F14>I<12FCA2121C
-A51378EA1DFEEA1F8FEA1E07A2121CA938FF9FE0A21317809614>I<1203EA0780A2EA03
-00C7FCA4EAFF80A21203ACEAFFFCA20E187D9714>I<12FCA2121CA5EBFFC0A2EB3E005B
-5BEA1DF0EA1FE0A27F1370EA1E78EA1C3C7FA238FF3FC0A21217809614>107
-D<EAFF80A21203B3EAFFFEA20F177E9614>I<EAFB8EB51280EA3EFBEA3CF3EA38E3AA38
-FEFBE0A21310808F14>I<EAFC78EAFDFEEA1F8FEA1E07A2121CA938FF9FE0A21310808F
-14>I<EA07C0EA1FF0EA3C78EA701CA2EAE00EA6EA701CEA783CEA3C78EA1FF0EA07C00F
-107E8F14>I<EAFCF8EAFFFEEA1F0F381E0780EA1C0314C01301A41303001E1380130738
-1F0F0013FEEA1CF890C7FCA6B47EA21218808F14>I<EA03E7EA0FF7EA3C3FEA780F1270
-EAF00712E0A412F0EA700FEA781F6C5AEA1FF7EA07C7EA0007A6EB3FE0A213187F8F14>
-I<EAFE1FEB7F80EA0FE3EB8100138090C7FC120EA8EAFFF8A211107F8F14>I<EA0FD8EA
-7FF8EAE078EAC038A2EAF000EA7F80EA3FF0EA07FCEA001EEAE00E130612F0EAF81CEAFF
-F8EACFE00F107E8F14>I<120EA5EAFFFCA2EA0E00A8130EA3EA0F1EEA07FCEA01F00F15
-7F9414>I<EAFC3FA2EA1C07AA5BEA1E1F380FFFE0EA03E71310808F14>I<38FF7F80A238
-3C1E00EA1C1CA36C5AA3EA0630EA0770A36C5AA311107F8F14>I<38FF7F80A238700700
-EA380EA3EA39CEA3EA1B6C121AA3EA1E7CA2EA0E3811107F8F14>I<38FE7F80A2381E3C
-00EA0E78EA07705B12036C5A12037FEA0770EA0E781338487E38FF7F80A211107F8F14>
-I<38FF7F80A2381C0E005BA2120E5BA212071330A2EA0370A25B1201A25BA3485A127300
-77C7FC127E123C11187F8F14>I E /Fh 30 122 df<903803F07C90381E0DC69038380F
-0FEB701E01E0130EEC0C003801C01CA548485A007FB512C03903803800A448485AA6000E
-5BA648485A001E7F38FF8FFC20207E9F1B>11 D<EB03E0EB1C181338EB703C13E0143838
-01C000A5485A387FFFF038038070A4380700E0A6380E01C0A6381C0380001E13C038FF0F
-F016207E9F19>I<EAFFF0A20C027E8A0F>45 D<0007B512FC3900F8007C0178131C150C
-5B1504A414043901E00800A31438EBFFF8EBE0383803C010A4EC00081510485AA21520A2
-156015C0380F00011407B612801E1F7E9E1F>69 D<0007B512F83900F800780178133815
-185B1508A53901E00800A314181438EBFFF83803C0301410A491C7FC485AA648C8FC7FEA
-FFFC1D1F7E9E1E>I<3807FF803800F8001378A25BA6485AA6485AA6485AA648C7FC7FEA
-FFF0111F7E9E10>73 D<3807FFE0D800FCC7FC1378A25BA6485AA6485AA41580EC0100EA
-0780A25C14021406140E380F001E147CB512FC191F7E9E1C>76 D<D807F8EB7FC0D8007C
-EB1F00150C015E1304019E5B138FA2EB8780A2EB83C0D801035BEB01E0A2EB00F0A21478
-00025C143CA2141EA2140F485CEC07C0A21403A21401000C5C001E1300B47E221F7E9E22
->78 D<EB01FCEB0E0790383801C090387000E0484813F048481378485A153C48C7FC5A00
-1E143E123E123C127CA448147CA3157815F81278EC01F0007C14E01403003C14C0001CEB
-0780001EEB0F006C131E380780383801C0E038007F801F217C9F23>I<3807FFFE3900F8
-078090387801E0EC00F05B15F8A415F03801E00115E0EC03C0EC0780EC1E00EBFFF03803
-C03880141E140EA2140F48485AA51502D80F001304EB800F39FFF00788C7EA01F01F207E
-9E21>82 D<EB1F82EB7066EBC01E3801800EEA030048130C00061304120EA3000F1300A2
-7FEA07F013FF6C13C06C13E038003FF0EB03F813001478143CA200401338A31430006013
-70146000F013C038E8018038C60300EA81FC17217E9F19>I<39FFF001FE391F8000F86C
-C712601540A215807F0007EB0100A214021406EBC00400035BA25CA26C6C5AA25CA26D5A
-120001F1C7FC13F2A213FC137C1378A21370A213201F207A9E22>86
-D<EA07F8EA0C0CEA1E061307121C1200A313FFEA07C7EA1E07EA3C0E127800F01310A313
-1EEB2E2038784F40381F878014147D9317>97 D<1207123F120F7EA2120EA65A137CEA1D
-83381E0180001C13C0EB00E05A14F0A5387001E0A214C013031480EB0700EAE80EEACC38
-EA83E014207B9F19>I<13FEEA0383380E0780121C0038130090C7FC12785AA45AA37E5B
-EA70026C5AEA1C18EA07E011147D9314>I<1438EB01F8EB00781438A21470A614E013FC
-EA0382EA0601121CEA3C00383801C0127812F0A438E00380A412F0EA700738380F00381C
-37803807C7E015207D9F19>I<13F8EA070EEA0E07121C383803801278127012F0A2B5FC
-00F0C7FC5AA46C5AEA7002EA3004EA1C18EA07E011147D9314>I<140EEB3E11EBE1A338
-01C1C2380381E0EA07801301120FA3380703C01480EB8700EA04FC48C7FCA21218121CEA
-0FFF14C014E0381800F04813305A5AA3006013606C13C0381C0700EA07FC181F809417>
-103 D<13E0120712011200A2485AA6485AEB8F80EB90E013A0EBC0601380000713E01300
-A5380E01C0A6381C0380001E13C038FF8FF014207E9F19>I<EA01C0EA03E0A213C0EA01
-80C7FCA6EA0380121F12071203A2EA0700A6120EA65A121EEAFF800B1F7F9E0C>I<13E0
-120712011200A2485AA6485AEB81FCEB80F014C0EB81801400EA07045B13181338137C13
-1C120E7FA2130F7F1480EA1C03381E07C038FF8FF016207E9F18>107
-D<13E0120712011200A2EA01C0A6EA0380A6EA0700A6120EA65A121EEAFF800B207F9F0C
->I<390387C07C391F9861863907A072073903C03403EB80380007EB7807EB0070A5000E
-EBE00EA64848485A001EEBE01E3AFFCFFCFFC022147E9326>I<38038F80381F90E0EA07
-A03803C0601380000713E01300A5380E01C0A6381C0380001E13C038FF8FF014147E9319
->I<13FCEA0387380E0180381C00C04813E0A24813F012F0A438E001E0A214C0130300F0
-138038700700EA380E6C5AEA07E014147D9317>I<EA038E381FB380EA07C71203EB8300
-EA078090C7FCA5120EA65A121EEAFFC011147E9312>114 D<EA01F9EA0607EA08031218
-1301EA3802EA3C00121F13F0EA07FCEA01FEEA001FEA40071303A212601306EAF004EAC8
-18EA87E010147F9312>I<1380EA0100A35A5A5A121EEAFFF8EA0E00A45AA65A1310A413
-20A2EA1840EA0F800D1C7C9B12>I<38FF83F8381E00E0001C13C01480121E380E01005B
-13025B12075BA25BEA039013A013E05B5B120190C7FC15147C9318>118
-D<390FF83F803901E00E00EBC00C140813E000005B143014205C13705CA20171C7FC1339
-133A133E133C133813181310A25BA25BEA70C0EAF08000F1C8FC12E61278191D809318>
-121 D E /Fi 1 59 df<127012F8A3127005057C840D>58 D E /Fj
-8 117 df<1238127C12FEA3127C12381200A61238127C12FEA3127C123807147D930D>
-58 D<B6FCA2380FC01F80808015801401A2EBC181A2EC8000A213C313FFA213C313C1A2
-15C0A2EBC000EC0180A31403A21407EC3F00B6FCA21A1F7E9E1E>69
-D<39FFC007FE13E0000FEB00607F7FEA0DFC120C7F137FEB3F80131F14C0EB0FE0130714
-F0EB03F8EB01FC130014FE147F143F15E0141F140F1407A2140314011400EAFFC015601F
-1F7E9E24>78 D<EB3FE0EBFFF83803F07E3807C01F390F800F80001F14C0393F0007E0A2
-4814F0007E1303A200FE14F8A9007E14F0A2007F13076C14E0A2391F800FC0390FC01F80
-3907E03F003803F07E3800FFF8EB3FE01D1F7E9E22>I<007FB512C0A2387C1F83007013
-8100601380A200E014E000C01460A400001400B13807FFFEA21B1E7E9D20>84
-D<EA03F8EA0FFEEA1F1F383E0F80EA7E07007C13C012FCA2B5FCA200FCC7FCA4127C007E
-13C0EA3E01381F03803807FF00EA01FC12147F9315>101 D<EA01F8EA0FFF381F0F8038
-3E07C0387C03E0A300FC13F0A7007C13E0A2383E07C0381F0F80380FFF00EA03FC14147F
-9317>111 D<1203A45AA25AA2123FEAFFF8A2EA1F00AA130CA5EA0F98EA07F0EA03E00E
-1D7F9C12>116 D E /Fk 64 123 df<903901FF81FE010FEBEFFF903A7F81FF8F80D9FE
-01EB1FC03901F803FE000314FCEA07F0EE0F80020190C7FCA7B712F0A32707F001FCC7FC
-B3A33A7FFF1FFFE0A32A2A7FA927>11 D<49B4FC011F13C090387F81E0EBFC013901F807
-F01203EA07F0A4EC01C091C8FCA3EC3FF8B6FCA33807F003B3A33A7FFF3FFF80A3212A7F
-A925>I<1306130C13181338137013E01201EA03C0A2EA0780A2120F13005AA2123EA312
-7EA3127CA212FCAE127CA2127EA3123EA37EA27E13801207A2EA03C0A2EA01E012001370
-13381318130C13060F3C7AAC1A>40 D<12C012607E12387E7E120FEA0780A2EA03C0A213
-E0120113F0A2EA00F8A313FCA3137CA2137EAE137CA213FCA313F8A3EA01F0A213E01203
-13C0A2EA0780A2EA0F00120E5A5A12305A5A0F3C7CAC1A>I<B51280A611067F9016>45
-D<121C127FA2EAFF80A3EA7F00A2121C09097B8813>I<EB3F803801FFF03807E0FC380F
-C07E48487E497E481480003E130F007E14C0A400FE14E0AF007E14C0A46CEB1F80A26C14
-006D5A380FC07E6C6C5A3801FFF038003F801B277DA622>48 D<130E131E137EEA07FE12
-FFA212F81200B3ABB512FEA317277BA622>I<EBFF80000713F04813FC381E03FE393800
-FF80007C133F00FE14C06C131F15E0140FA2127E003C131FC7FC15C0A2EC3F801500147E
-5C5C495A495AEB078049C7FC131E4913E013705B3901C001C0EA0380EA0600000FB5FC5A
-5A5AB61280A31B277DA622>I<EB7F803803FFF04813FC380F81FE381F007FEA3F80EC3F
-80A3121F1300C7EA7F00A2147E5C495AEB07F0EBFFC0A2EB01F8EB007E801580EC1FC0A2
-15E0A2123C127EB4FCA215C0143F481480007CEB7F00383F01FE6CB45A000713F0C61380
-1B277DA622>I<140FA25C5C5C5C5BA2EB03BFEB073F130E131C133C1338137013E0EA01
-C0EA038012071300120E5A5A5A12F0B612F8A3C7EA7F00A890381FFFF8A31D277EA622>
-I<00181303381F801FEBFFFE5C5C5C14C091C7FC001CC8FCA7EB7FC0381DFFF8381F80FC
-381E003F121CC7EA1F8015C0A215E0A21218127C12FEA315C05A0078EB3F80A26CEB7F00
-381F01FE6CB45A000313F0C613801B277DA622>I<EB07F8EB3FFE90B5FC3901FC078039
-03F00FC03807C01FEA0F80121F130048EB0F8091C7FC127EA3EAFE02EB1FF0EB3FFCEB60
-3EEB801F00FF14809038000FC0A24814E0A4127EA4123E003F14C07EEC1F80D80F801300
-3807E07E6CB45A6C5B38003FC01B277DA622>I<1238123E003FB512F0A34814E015C0A2
-15803970000F00141E5C48133814785CC6485A495A5C130749C7FCA25B131E133EA2137E
-A2137C13FCA41201A8EA00701C297CA822>I<EB3FC03801FFF04813FC3807C07E48C67E
-001E7FEC0F80123EA2123F138001C01300EBF01F381FFC1E6D5A380FFFF86C13E06C7F6C
-13FC8000077FD80F0F1380D81E0713C0EA3E01397C007FE0141F48130F14071403A315C0
-127C007EEB07806CEB0F00381FC03F380FFFFC00035B38007FC01B277DA622>I<EB7F80
-3801FFF000077F380FC0FC381F803E48487E007E1480A2140F00FE14C0A315E0A5007E13
-1FA26C133F6C132F380F80CF3807FF8F0001130FEA0008010013C0A3EC1F80123E127FEC
-3F00143E147E007E5B383E03F8381FFFE06C1380D801FEC7FC1B277DA622>I<48B4FC00
-0F13E0381E03F0383801F8387800FC00FC13FE7EA3127C003813FCEA0001EB03F8EB07E0
-EB0FC01480EB1E00A25B1338A25BA790C7FCA51370EA01FC487EA56C5AEA0070172A7CA9
-20>63 D<EC0780A24A7EA34A7EA24A7EA3EC77F8A2ECF7FC14E3A2903801C1FEA201037F
-1480A249486C7EA24980010E133FA2496D7EA2013FB57EA39039700007F8A201F0804913
-03000181491301A2000381D8FFFE013F13FCA32E297EA833>65 D<B612F815FF16C03A03
-F8001FE0ED0FF0ED07F8150316FCA21501A3150316F8A2ED07F0150FED1FC0EDFF8090B5
-EAFE00EDFFC09039F8000FF0ED03F8ED01FC16FE1500A216FFA616FE1501ED03FC1507ED
-1FF8B712E016C0EDFE0028297DA830>I<91387FE003903907FFFC07011FEBFF0F90397F
-F00F9F9039FF0001FFD801FC7F4848147F4848143F4848141F485A160F485A1607127FA2
-90C9FC5AA97E7F1607123FA26C7E160E6C7E6C6C141C6C6C143C6C6C14786CB4EB01F090
-397FF007C0011FB512800107EBFE009038007FF028297CA831>I<B612FCEDFF8016E03A
-03FC001FF8ED03FCED00FE167FEE3F80EE1FC0A2EE0FE0A2EE07F0A417F8AA17F0A3EE0F
-E0A217C0161FEE3F80EE7F005EED03FCED1FF8B75A168003FCC7FC2D297EA834>I<B712
-E0A33903FC001FED07F01501A215001670A3913801C0781638A302031300A2140F90B5FC
-A3EBFC0F1403A20201130EA3161C91C7FCA3163C1638167816F815011503151FB712F0A3
-27297EA82C>I<B712C0A33903FC003FED0FE015031501A21500A316F0913801C070A316
-001403A2140F90B5FCA3EBFC0F1403A21401A491C8FCA9B512FCA324297EA82A>I<9138
-7FE003903907FFFC07011FEBFF0F90397FF00F9F9039FF0001FFD801FC7F484880484880
-484880485A82485A82127FA290CAFC5AA892B512F87E7F03001300123FA26C7EA26C7E6C
-7E6C7E6C7E6CB45B90387FF007011FB5129F0107EBFE0F9039007FF0032D297CA835>I<
-B5D8F00FB5FCA3D803FCC7EA3FC0AF90B7FCA301FCC7123FB1B5D8F00FB5FCA330297EA8
-35>I<B512F0A33803FC00B3B1B512F0A314297EA819>I<B500F0EBFFFEA3D803FCC7EA0F
-80EE1E005E16F84B5A4B5A4B5A4BC7FC153E5D5D4A5AEC03C0140F4A7E143F4A7E4A7E90
-38FDE7FCEBFFC7EC83FEEC01FF496C7F5B6F7E6F7E82151F6F7E6F7E8215036F7E6F1380
-17C0B5D8F00F13FEA32F297EA835>75 D<B512FCA3D803FCC8FCB3A3ED01C0A415031680
-A21507A2150FA2151F157F913801FF00B7FCA322297EA828>I<D8FFFE92383FFF80A26D
-5D0003EFE000A2D9BF8014EFA2D99FC0EB01CFA2D98FE0EB038FA3D987F0EB070FA2D983
-F8130EA2D981FC131CA3D980FE1338A2027F1370A291383F80E0A391381FC1C0A291380F
-E380A2913807F700A3EC03FEA26E5AA26E5AD8FFFE0203B51280A2157039297DA840>I<
-D8FFFEEC7FFF7FA200036DEB01C08080EBBFF0EB9FF8EB8FFC1387EB83FE800181138001
-8013C0EC7FE0143FEC1FF0EC0FF815FCEC07FEEC03FF6E138180ED7FC116E1ED3FF1ED1F
-F9ED0FFD1507ED03FF81A281167F163F161F160FA2D8FFFE14071603160130297EA835>
-I<ECFFC0010F13FC90383F807F9039FE001FC0D801F8EB07E048486D7E48486D7E000F81
-48486D7EA24848147FA2007F168090C8123FA34816C0AA6C16806D147FA2003F1600A26C
-6C14FEA26C6C495A6C6C495A6C6C495A6C6C495A6C6C495A90263FC0FFC7FC90380FFFFC
-010013C02A297CA833>I<B612F815FF16C03A03FC003FE0ED07F0ED03F816FC150116FE
-A716FC150316F8ED07F0ED3FE090B61280EDFE0001FCC8FCB0B512F0A327297EA82E>I<
-ECFFC0010F13FC90383FC0FF9039FE001FC048486D7ED803F0EB03F000078148486D7E48
-486D7EA24848147FA2007F1680A290C8123FA24816C0AA6C16806D147FA2003F1600A26C
-6C14FE143E3A0FE0FF81FC3A07E1C1C1F83A03F180E3F0D801F9EB77E0D800FFEB7FC0D9
-3FC090C7FC90380FFFFC010015C0EC003C81ED1F01168316FF178081A217006F5A6F5AED
-00F82A357CA833>I<B612E015FE6F7E3A03FC003FE0ED0FF06F7E6F7E150182A65E4B5A
-1507ED0FE0ED3FC090B500FEC7FCA29039FC00FF80ED3FE06F7E150F821507A8170EA2ED
-03FC171EB539F001FE3C9238007FF8EE0FE02F297EA832>I<9038FF80600003EBF0E000
-0F13F8381F80FD383F001F003E1307481303A200FC1301A214007EA26C140013C0EA7FFC
-EBFFE06C13F86C13FE80000714806C14C0C6FC010F13E0EB007FEC1FF0140F140700E013
-03A46C14E0A26C13076C14C0B4EB0F80EBE03F39E3FFFE0000E15B38C01FF01C297CA825
->I<007FB71280A39039807F807FD87C00140F00781507A20070150300F016C0A2481501
-A5C791C7FCB3A490B612C0A32A287EA72F>I<B500F0EBFFFEA3D803FCC7EA0380B3A916
-076C6C1500A200005D6D141E6D6C5B6D6C5B90390FF003F06DB55A01001480DA1FFCC7FC
-2F297EA834>I<B500F0EB7FFFA3D803FEC7EA01C00001ED0380A26D14076C16006E5B01
-7F140E80013F5CA26E133C011F14386E1378010F14708001075CA26D6C485AA2ECFE0301
-015CECFF076D91C7FC1587EC7F8EA215DEEC3FDC15FC6E5AA26E5AA36E5AA26E5AA23029
-7FA833>I<B53CE07FFFE01FFFC0A32803FC0003FCC7EA7000A26D6D7E000160A26D6E13
-016C604B138002801503017F5F4B13C0D93FC0013F49C7FCA2913AE00E1FE00F011F160E
-17F09126F01C0F131E010F161C033C13F8902707F838075BA2037813FC902703FC70035B
-A2913AFEE001FEF001015E02FF14FF4B7E6D5EA26E486D5AA36EC76CC8FCA2023E80021E
-141EA242297FA845>I<3B7FFFF01FFFE0A3000190C7EAF0006C6D485A02C05B017F1303
-6D6C485AD91FF090C7FC5D90380FF81E6D6C5A1538903803FE786D6C5A5D6D5B147F6E7E
-A26E7E81143F81EC7BFEECF3FFEB01E102C07F01036D7EEB078049486C7E010E6D7E131E
-496D7E01386D7E498001F0130348486D7EB5013F13FCA32E297EA833>I<3803FF80000F
-13F0381F01FC383F80FE147F801580EA1F00C7FCA4EB3FFF3801FC3FEA0FE0EA1F80EA3F
-00127E5AA4145F007EEBDFC0393F839FFC381FFE0F3803FC031E1B7E9A21>97
-D<EAFFE0A3120FACEBE1FE9038EFFF809038FE07E09038F803F09038F001F89038E000FC
-A2157EA2157FA8157EA315FCA29038F001F89038F803F090389C0FE090380FFF80390E01
-FC00202A7EA925>I<EB3FF03801FFFC3803F03E380FC07FEA1F80EA3F00A248133E007E
-90C7FCA212FEA7127EA2127F6CEB03801380001FEB0700380FE00E3803F83C3801FFF838
-003FC0191B7E9A1E>I<EC7FF0A31407ACEB3F873801FFF73807F03F380FC00F381F8007
-EA3F00A2127EA312FEA8127EA27EA2381F800F380FC01F3907E07FFF3801FFE738007F87
-202A7EA925>I<EB3FC03801FFF03807E07C48487E48487ED83F001380140F5A007E14C0
-12FE1407A2B6FCA248C8FCA4127E127F6CEB01C01380001F1303390FC007803903F01F00
-3800FFFCEB3FE01A1B7E9A1F>I<EB07F8EB3FFCEB7E3E3801FC7FEA03F813F01207143E
-1400A7B512C0A33807F000B3A3387FFF80A3182A7EA915>I<9038FF80F00003EBE3F839
-0FC1FE1C391F007C7C48137E003EEB3E10007EEB3F00A6003E133E003F137E6C137C380F
-C1F8380BFFE00018138090C8FC1238A2123C383FFFF814FF6C14C06C14E06C14F0121F38
-3C0007007CEB01F8481300A4007CEB01F0A2003FEB07E0390FC01F806CB5120038007FF0
-1E287E9A22>I<EAFFE0A3120FAC147E9038E1FF809038E30FC001E413E0EBE80701F813
-F013F0A213E0B039FFFE3FFFA3202A7DA925>I<1207EA1FC0EA3FE0A5EA1FC0EA0700C7
-FCA7EAFFE0A3120FB3A3EAFFFEA30F2B7EAA12>I<EAFFE0A3120FACEC1FFCA3EC07C0EC
-0F80EC1E00147C5CEBE1F0EBE3E013E713EFEBFFF080EBFBFC13F1EBE1FEEBC0FFEC7F80
-143F15C0EC1FE0EC0FF0140739FFFC1FFFA3202A7FA923>107 D<EAFFE0A3120FB3B2EA
-FFFEA30F2A7EA912>I<26FFC07FEB1FC0903AC1FFC07FF0903AC307E0C1F8D80FC49038
-F101FC9039C803F20001D801FE7F01D05BA201E05BB03CFFFE3FFF8FFFE0A3331B7D9A38
->I<38FFC07E9038C1FF809038C30FC0D80FC413E0EBC80701D813F013D0A213E0B039FF
-FE3FFFA3201B7D9A25>I<EB3FE03801FFFC3803F07E390FC01F80391F800FC0393F0007
-E0A2007EEB03F0A300FE14F8A8007E14F0A26CEB07E0A2391F800FC0390FC01F803907F0
-7F003801FFFC38003FE01D1B7E9A22>I<38FFE1FE9038EFFF809038FE0FE0390FF803F0
-9038F001F801E013FC140015FEA2157FA8157E15FEA215FC140101F013F89038F807F090
-38FC0FE09038EFFF809038E1FC0001E0C7FCA9EAFFFEA320277E9A25>I<38FFC1F0EBC7
-FCEBC63E380FCC7F13D813D0A2EBF03EEBE000B0B5FCA3181B7F9A1B>114
-D<3803FE30380FFFF0EA3E03EA7800127000F01370A27E00FE1300EAFFE06CB4FC14C06C
-13E06C13F0000713F8C6FCEB07FC130000E0137C143C7E14387E6C137038FF01E038E7FF
-C000C11300161B7E9A1B>I<13E0A41201A31203A21207120F381FFFE0B5FCA2380FE000
-AD1470A73807F0E0000313C03801FF8038007F0014267FA51A>I<39FFE07FF0A3000F13
-07B2140FA2000713173903F067FF3801FFC738007F87201B7D9A25>I<39FFFC03FFA339
-0FF000F0000714E07F0003EB01C0A2EBFC0300011480EBFE070000140013FFEB7F0EA214
-9EEB3F9C14FC6D5AA26D5AA36D5AA26D5AA2201B7F9A23>I<3BFFFC7FFC1FFCA33B0FE0
-0FE001C02607F007EB0380A201F8EBF00700031600EC0FF801FC5C0001150EEC1FFC2600
-FE1C5B15FE9039FF387E3C017F1438EC787F6D486C5A16F0ECE01F011F5CA26D486C5AA2
-EC800701075CA22E1B7F9A31>I<39FFFC1FFEA33907F003803803F8079038FC0F003801
-FE1E00005BEB7F3814F86D5A6D5A130F806D7E130F497EEB3CFEEB38FFEB787F9038F03F
-803901E01FC0D803C013E0EB800F39FFF03FFFA3201B7F9A23>I<39FFFC03FFA3390FF0
-00F0000714E07F0003EB01C0A2EBFC0300011480EBFE070000140013FFEB7F0EA2149EEB
-3F9C14FC6D5AA26D5AA36D5AA26D5AA25CA21307003890C7FCEA7C0FEAFE0E131E131C5B
-EA74F0EA3FE0EA0F8020277F9A23>I<003FB5FCA21301003C13FE383803FCEA780714F8
-38700FF0EB1FE0A238003FC0EB7F80A2EBFF00485A1407EA03FCEA07F8A2380FF00FEA1F
-E0003F130EEBC01E387F803E00FF13FE13FFA2181B7E9A1E>I E
-/Fl 68 123 df<127012F8B012701200A5127012F8A31270051C779B18>33
-D<EA4010EAE038EAF078EAE038AAEA60300D0E7B9C18>I<EA0306EA078FA6387FFFC0B5
-12E0A26C13C0380F1E00A6387FFFC0B512E0A26C13C0381E3C00A6EA0C18131C7E9B18>
-I<13C01201A3EA07F0EA1FFC487EEA7DDF3871C780EAF1C3EAE1C7A338F1C0001279127F
-6C7EEA0FF8EA03FC6C7E13CFEBC780EA61C312F1A212E1EAF1C73871CF00EA7DDFEA3FFE
-EA1FF8EA07F0EA01C0A3120011247D9F18>I<EA03C0487E487EEA1E78EA1C38A4EB7BF8
-13F3EA1EE3000F13C0EBC38013831307001F1300EA3F87EA7BCFEA71CEEAF1FEEAE0FCA2
-EB7870EAF07CEA71FE387FFFF0383FCFE0381F03C0151C7F9B18>38
-D<1238127C127EA2123E120EA3121E123C127812F812F012C0070E789B18>I<137013F0
-1201EA03C0EA0780EA0F00121E121C123C123812781270A212F05AA87E1270A212781238
-123C121C121E7EEA0780EA03C0EA01F0120013700C24799F18>I<126012F012787E7E7E
-EA0780120313C0120113E01200A213F01370A813F013E0A2120113C0120313801207EA0F
-00121E5A5A5A12600C247C9F18>I<EA01C0A4EA41C138F1C780EAFDDF387FFF00EA1FFC
-EA07F0A2EA1FFCEA7FFF38FDDF80EAF1C73841C100EA01C0A411147D9718>I<136013F0
-A7387FFFC0B512E0A26C13C03800F000A7136013147E9718>I<123C127E127FA3123F12
-0F120E121E127C12F81270080C788518>I<387FFFC0B512E0A26C13C013047E8F18>I<12
-7812FCA412780606778518>I<1303EB0780130FA214005BA2133EA2133C137CA25BA25B
-1201A2485AA2485AA25B120FA248C7FCA2121E123EA25AA2127812F8A25A126011247D9F
-18>I<EA01F0EA07FC487EEA1F1FEA1C0738380380007813C0EA7001A238E000E0A9EAF0
-01007013C0A2EA780300381380381C0700EA1F1FEA0FFE6C5AEA01F0131C7E9B18>I<EA
-018012031207A2120F123F12FF12FB12631203B0EA7FFCEAFFFEEA7FFC0F1C7B9B18>I<
-EA07F8EA1FFE487E387C0F80387003C038F001E01300A3C7FCA2130114C01303EB0780EB
-0F00131E5B5B5BEA03E0485A485A381E00E05AEA7FFFB5FC7E131C7E9B18>I<EA07F8EA
-1FFE487E387C0F80387803C01301123012001303EB0780131F3803FF005B7F38000F80EB
-03C0130114E01300A212F0130114C01303387C0F80383FFF006C5AEA07F8131C7E9B18>
-I<383FFF80A30038C7FCA8EA3BFCEA3FFE7F383E0780383803C0380001E01300A2126012
-F0130100E013C0EAF003387C0F80383FFF006C5AEA07F8131C7E9B18>53
-D<12E0B512E0A338E00380130738000F00131E5B13381378137013F05B12015BA212035B
-A3120790C7FCA7131D7E9C18>55 D<127812FCA412781200A8127812FCA4127806147793
-18>58 D<126012F87E127F6C7EEA0FE06C7EEA01FC6C7EEB3F80EB1FC0EB07E0A2EB1FC0
-EB3F80EBFE00485AEA07F0485AEA3F8048C7FC12FC5A126013187E9918>62
-D<13FCEA03FE487E380F8780381E03C0EA3C3FEA387F3878FFE0EA71E313C112F3EAE380
-A6EAF3C1007113C013E33878FF8038387F00EA3C3E381E00E0EA0F83EA07FF6C13803800
-FE00131C7E9B18>64 D<137013F8A213D8A2EA01DCA3138CEA038EA4EA0707A5380FFF80
-A3EA0E03381C01C0A3387F07F000FF13F8007F13F0151C7F9B18>I<3801FCE0EA03FEEA
-07FFEA0F07EA1E03EA3C01EA78001270A200F013005AA87E007013E0A21278EA3C01001E
-13C0EA0F073807FF806C1300EA01FC131C7E9B18>67 D<EA7FF8EAFFFE6C7E381C0F80EB
-03C0A2EB01E01300A214F01470A814F014E0A2130114C01303EB0F80387FFF00485AEA7F
-F8141C7F9B18>I<B512F0A3381C0070A41400A2130EA3EA1FFEA3EA1C0EA390C7FCA214
-38A5B512F8A3151C7F9B18>I<B512F8A3381C0038A41400A21307A3EA1FFFA3EA1C07A3
-90C7FCA7EAFFC0A3151C7F9B18>I<3801F9C0EA07FF5AEA1F0FEA1C03123CEA78011270
-A200F0C7FC5AA5EB0FF0131F130F38F001C0127013031278123CEA1C07EA1F0FEA0FFFEA
-07FDEA01F9141C7E9B18>I<EA7FFFB512806C1300EA01C0B3A4EA7FFFB512806C130011
-1C7D9B18>73 D<EAFFC0A3001CC7FCB114E0A5B5FCA3131C7E9B18>76
-D<38FC01F8EAFE03A2383B06E0A4138EA2EA398CA213DCA3EA38D8A213F81370A21300A6
-38FE03F8A3151C7F9B18>I<387E07F038FF0FF8387F07F0381D81C0A313C1121CA213E1
-A313611371A213311339A31319A2131D130DA3EA7F07EAFF87EA7F03151C7F9B18>I<EA
-0FFE383FFF804813C0EA7803EA700100F013E0EAE000B0EAF001007013C0EA7C07EA7FFF
-6C1380380FFE00131C7E9B18>I<EAFFFEEBFF8014C0EA1C03EB01E013001470A514E013
-01EB03C0EA1FFF1480EBFE00001CC7FCA8B47EA3141C7F9B18>I<EA7FF8EAFFFE6C7E38
-1C0F80130314C01301A313031480130F381FFF005BA2EA1C0FEB07801303A5149CA3007F
-13FC38FF81F8387F00F0161C7F9B18>82 D<3807F9C0EA1FFF5AEA7C0FEA7003EAF00112
-E0A290C7FC7E1278123FEA1FF0EA0FFEEA01FF38001F80EB03C0EB01E01300A2126012E0
-130100F013C0EAFC07B512801400EAE7FC131C7E9B18>I<387FFFF8B5FCA238E07038A4
-00001300B2EA07FFA3151C7F9B18>I<38FF83FEA3381C0070B2001E13F0000E13E0EA0F
-013807C7C03803FF806C1300EA007C171C809B18>I<38FE03F8EAFF07EAFE03383C01E0
-001C13C0A3EA1E03000E1380A438070700A4EA038EA4EA018C13DCA3EA00D813F8A21370
-151C7F9B18>I<EAFFF8A3EAE000B3ACEAFFF8A30D24779F18>91
-D<EAFFF8A3EA0038B3ACEAFFF8A30D247F9F18>93 D<EA0FF0EA1FFC487EEA3C1F381807
-80EA0003A213FF120F5AEA7F83EA780312F012E0A2EAF007EA7C1F383FFFF8EA1FFDEA07
-F015147E9318>97 D<127E12FE127E120EA5133EEBFF80000F13C0EBE3E0EB80F0EB0070
-1478000E1338A5120F14781470EB80F0EBC3E0EBFFC0000E138038067E00151C809B18>
-I<EA01FEEA07FF001F1380EA3F07383C030048C7FC127012F05AA47E1270387801C0123C
-EA3F07381FFF8000071300EA01FC12147D9318>I<EB1F80133F131F1303A5EA03F3EA0F
-FBEA1FFFEA3E1FEA780FEA700712F0EAE003A5130712F01270EA780FEA3E3F381FFFF038
-0FFBF83803E3F0151C7E9B18>I<EA03F0EA0FFC487EEA3E1F38780780EA700300F013C0
-EAE001A2B5FCA300F0C7FC1270387801C0123CEA3F07381FFF8000071300EA01FC12147D
-9318>I<EB1FC0EB7FE013FFEA01F1EBC0C01400A3387FFFC0B5FCA23801C000AEEA7FFF
-A3131C7F9B18>I<3803F1F03807FFF85A381E1F30383C0F00EA3807A5EA3C0FEA1E1EEA
-1FFC485AEA3BF00038C7FC123CEA1FFF14C04813E0387801F038F00078481338A36C1378
-007813F0EA7E03383FFFE0000F13803803FE00151F7F9318>I<127E12FE127E120EA513
-3FEBFF80000F13C0EBE1E013801300A2120EAA387FC7FC38FFE7FE387FC7FC171C809B18
->I<EA0380EA07C0A3EA0380C7FCA4EA7FC012FF127F1201AEB5FCA3101D7C9C18>I<1338
-137CA313381300A4EA0FFCA3EA001CB3A3133CEA6038EAF078EAFFF0EA7FE0EA3FC00E27
-7E9C18>I<127E12FE127E120EA5EB3FF0A3EB0780EB0F00131E5B5B5BEA0FF87F139C13
-1EEA0E0FEB0780130314C0387FC7F812FF127F151C7F9B18>I<EAFFC0A31201B3A4B512
-80A3111C7D9B18>I<38FBE3E038FFF7F0EBFFF8383E3E38EA3C3CA2EA3838AB38FE3E3E
-EB7E7EEB3E3E1714809318>I<EA7E3F38FEFF80007F13C0380FE1E013801300A2120EAA
-387FC7FC38FFE7FE387FC7FC1714809318>I<EA01F0EA0FFE487E383E0F80EA38033870
-01C0A238E000E0A5EAF001007013C0EA7803383C0780EA3E0F381FFF006C5AEA01F01314
-7E9318>I<EA7E3E38FEFF80007F13C0380FE3E0EB80F0EB00701478000E1338A5120F14
-781470EB80F0EBC3E0EBFFC0000E1380EB7E0090C7FCA7EA7FC0487E6C5A151E809318>
-I<3803F380EA0FFBEA1FFFEA3E1FEA780FEA700712F0EAE003A6EAF0071270EA780FEA3E
-1FEA1FFFEA0FFBEA03F3EA0003A7EB1FF0EB3FF8EB1FF0151E7E9318>I<38FF0FC0EB3F
-F0137FEA07F8EBE060EBC0005BA390C7FCA8EAFFFC7F5B14147E9318>I<EA0FF7EA3FFF
-5AEAF81FEAE007A212F0007CC7FCEA7FF0EA1FFCEA07FEEA001F38600780EAE00312F013
-0738FC0F00B5FC5BEAE7F811147D9318>I<487E1203A4387FFFC0B5FCA238038000A914
-4014E0A21381EBC3C0EA01FF6C1380EB7E0013197F9818>I<387E07E0EAFE0FEA7E07EA
-0E00AC1301EA0F073807FFFC6C13FE3801FCFC1714809318>I<387F8FF000FF13F8007F
-13F0381C01C0380E0380A338070700A3138FEA038EA3EA01DCA3EA00F8A2137015147F93
-18>I<38FF07F8138F1307383800E0A4381C01C0137113F9A213D9EA1DDD000D1380A313
-8DEA0F8FA23807070015147F9318>I<387F8FF0139F138F380F0700EA078EEA039EEA01
-DC13F81200137013F07FEA01DCEA039E138EEA0707000E1380387F8FF000FF13F8007F13
-F015147F9318>I<387F8FF000FF13F8007F13F0380E01C0EB0380A21207EB0700A2EA03
-87A2138EEA01CEA213CC120013DC1378A31370A313F05B1279EA7BC0EA7F806CC7FC121E
-151E7F9318>I<383FFFF05AA2387001E0EB03C0EB078038000F00131E137C5B485A485A
-EA0780380F0070121E5A5AB512F0A314147F9318>I E /Fm 52 123
-df<91393FFC07F80103B5EA3FFE903B0FF807FF0F80903B3FC003FC1FC090267F800F13
-3FD9FF0013F8485A000315F049ED1F80EF060094C7FCA8B812F0A32803FC000FF0C7FCB3
-A8267FFFE1B512C0A332327FB12F>11 D<14C01301EB0380EB0F00131E133E133C5B13F8
-485AA2485AA2485AA2120F5B121FA348C7FCA35AA2127EA312FEB0127EA3127FA27EA36C
-7EA3120F7F1207A26C7EA26C7EA26C7E13787F133E131E7FEB0380EB01C01300124878B5
-1F>40 D<12C07E1270123C7E121F7E6C7E7F6C7EA26C7EA26C7EA27F137C137EA37FA314
-80A2131FA314C0B01480A3133FA21400A3137EA3137C13FC5BA2485AA2485AA2485A5B48
-C7FC5A121E5A12705A5A12487CB51F>I<B512F8A715077F921B>45
-D<EB01C01303130F137FEA1FFFB5FC13BFEAE03F1200B3B1007FB512F0A31C2E7AAD28>
-49 D<EB3FE03801FFFE0007EBFF80D80F8013C0393E003FF0003CEB1FF8007C130F007F
-14FC38FF800715FEA21403A2EA7F00003E1307C7FC15FCA2140F15F8EC1FF015E0EC3FC0
-1580EC7F0014FE495A5CEB03E0495A495A90381F000E133E137849131E4848131C485A48
-48133C90B512FC5A5A5A4814F8B6FCA31F2E7CAD28>I<EB1FF890B5FC000314C0390FE0
-1FF048C66C7E6D6C7EEA3FC06E7E13E013C0A2121F380F0007C75BA24A5A5D4A5A4A5A02
-FFC7FCEB3FF8ECFF809038001FE06E7EEC07FC6E7EA281801680A3121C127FEAFF80A216
-005CA201005B007E495A003C495A391FC01FF06CB512C0000391C7FC38003FF8212E7DAD
-28>I<157015F0140114031407140FA2141F143F147714F714E7EB01C7EB0387EB070713
-0F130E131C1338137013F013E0EA01C0EA0380EA07005A120E5A5A5A5AB712E0A3C7380F
-F000A9010FB512E0A3232E7EAD28>I<000C1430390FC007F090B512E0A215C015005C5C
-14F01480000EC8FCA8EB1FF0EBFFFE390FE03F809038000FE0000E14F0000CEB07F8C7FC
-EC03FCA315FEA21218127EB4FCA415FC481307007814F8A26CEB0FF06CEB1FE0390FC07F
-C06CB51200000113FC38003FE01F2E7CAD28>I<14FF010713E0011F7F90387F80F89038
-FE003CD803FC137E484813FEEBF001EA0FE0121F13C0003F6D5A1578007F91C7FC5BA338
-FF83FC90388FFF8090389C0FE09038B803F001F07F496C7E81496C7EA3491480A4127FA4
-123F6D1400A2001F495AEA0FE04A5AD807F05B3903FC0FF0C6B512C0013F90C7FCEB0FFC
-212E7DAD28>I<1238123E003FB612C0A31680481500A25D5D0078C7127800705C5D00F0
-130148495A4A5A4AC7FCC7121E141C143C5C5CA213015C130313075C130FA3131F5CA213
-3FA4137FA86DC8FC131E22307CAF28>I<EB0FFC90387FFF8048B512E03903F00FF0390F
-C003F8496C7E48C7FC8148147EA27FA213E06D5B13FC6CB4485AEC83F06CEBE7E0ECFF80
-6C49C7FC00017F6C14C0013F7F90B512F8D803E77FD80FC17F381F807F393F001FFF487F
-007E0103138000FE130048147F153FA2151FA36C1500007E5C007F143E6C6C137E6C6C5B
-390FF007F06CB55AC61480D91FF8C7FC212E7DAD28>I<1578A215FCA34A7EA24A7EA24A
-7FA34A7FEC0E7F021E7FEC1C3FA202387F151F02787FEC700FA202E07F1507010180ECC0
-03A249486C7EA201078191C7FC498191B6FCA24981011CC7123F013C810138141FA24981
-160F01F081491407A2484881486C1403B549B512FCA336317DB03D>65
-D<B712C016FC16FFD801FEC77FEE7FE0707E161F707EA2831607A4160FA25FA24C5A4C5A
-4C5A4B485ADB1FFEC7FC90B65AEEFF8049C7EA3FE0EE0FF0EE07FCA2707E83821880A718
-005E5F16074C5A4C5AEEFFF0B812C094C7FC16F831317DB039>I<913A03FF800180023F
-EBF00349B5EAFC0F01079038003F1FD91FF8EB07FFD97FE01301D9FF807F4890C8127F48
-48153F4848151F485A170F48481507123F5B1703127FA24992C7FC12FFAB127F7FEF0380
-123FA27F001F16076C6C16005F6C6C150E6C6C151E6C6C5D6C6D5CD97FE0495AD91FF849
-5AD907FFEB3F800101D9FFFEC7FCD9003F13F80203138031317CB03A>I<B812F0A3C690
-3880003FEE07F816031600A21778A21738A3171C1507A31700A25D5D5D91B5FCA3EC803F
-818181A21707A392C7120EA4171EA2173CA2177C17FC16011607163FB812F8A330317EB0
-35>69 D<B812E0A3C6903880007FEE0FF016031601A21600A21770A31738A21507A21700
-A35D5D5D91B5FCA3EC803F818181A592C8FCACB612C0A32D317EB033>I<DA03FF130302
-7FEBF00749B5EAFC1F010F9038007F3FD91FF0EB0FFFD97FC0130349487F4890C8FC4848
-81484881484881121F4981123F5B007F82A34992C7FC12FFAA0307B512F8127F7FDB0001
-1300A2123F7F121F7F120F6C7E6C7E6C7E6C6D5BEB7FE0D91FF8130F6DB4EB3F7F010190
-38FFFE1F6D6CEBF00F0203EB800335317CB03F>I<B61280A3C6EB8000B3B3A7B61280A3
-19317EB01E>73 D<B6D88003B5FCA3C60180C7EA1F8095C7FC173C5F4C5A4C5A4C5A4C5A
-041EC8FC5E16F84B5A4B5A4B5A4BC9FC151E157E15FF02817F02837F148791388F7FE091
-38BE3FF014FC4A6C7E4A6C7E02E07FEC80076F7E6F7F8381707E707E83161F707E707E83
-82707F707F84B6D8801FEBFF80A339317EB03F>75 D<B67EA3000190C9FCB3A9EE0380A4
-16071700A25EA35E5E5E5E4B5A150FB7FCA329317DB030>I<B500C049B512C080A2C66D
-90390003E0006E6E5A80EBEFFEEBE7FF13E301E17F8101E07F6E7E6E7E141F6E7E816E7E
-6E13806E13C080ED7FE016F0ED3FF8ED1FFCED0FFE1507ED03FF17816F13C16F13E1EE7F
-F1163FEE1FF917FDEE0FFF82828282A2177F173F171F170F486C1507B512E0170317013A
-317EB03F>78 D<B712E016FEEEFF80C6D9800013E0EE3FF0EE0FF8EE07FCA2EE03FEA217
-FFA717FEA2EE07FC17F8160FEE3FE0EEFFC091B6120016F80280C8FCB3A2B67EA330317E
-B037>80 D<B77E16F816FEC690398003FF809238007FE0EE1FF0707EA283160783A65F16
-0F5F4C5A4C5A4C5ADB03FFC8FC91B512F816E091388007F8ED03FE6F7E6F7F707EA2707E
-A583A5F0038017F8161FEFFC07040F1400B6398007FE0E933801FFFC9338001FF039317E
-B03C>82 D<90391FF8018090B51203000314C73907F007EF391F8000FF90C7127F003E14
-3F007E141F007C140F150712FCA215037E7E6D90C7FC7FEA7FF0EBFF8014F86CEBFF806C
-14F06C806C14FE6C80C61580013F14C01301D9001F13E014019138003FF0151F150F1507
-12E01503A37E16E06C140716C06C140FB4EC1F8001C0EB3F0001FC13FE00F1B55AD8E03F
-13F0D8C003138024317CB02D>I<007FB8FCA39039C00FF801D87E00EC003F007C820078
-82A200708200F01780A3481603A5C792C7FCB3AA017FB6FCA331307DAF38>I<B6D88003
-B51280A3C60180C73807C000715AB3AE17076D6C92C7FCA2013F5D6E141E131F6D6C5C6D
-6C14F8D903FE495A903A00FF801FE0023FB51280020F49C8FC020013E039317EB03E>I<
-B500FC91B5FCA3000390C8EA07C06CEE03806E14076C170080017F150EA26E141E013F15
-1C6E143C011F153880010F5D8001075DA26E130101035D6E13036D5D15806D4AC7FCA26F
-5A027F130EEDE01E023F131CEDF03C021F133815F8020F5BA2EDFCF002075B15FF6E5BA2
-6E5BA26E90C8FCA3157EA2153CA238317EB03D>I<EBFFF0000713FF390FC03FC0486C6C
-7E6E7E6E7EA26E7EEA0FC0C7FCA414FF131FEBFFE33803FC03EA0FF0EA1FE0EA3FC0EA7F
-8012FF1300A314071380007F130F9038C01DFE3A1FE079FFF03807FFE0C6EB803F24207E
-9F27>97 D<EA01F812FFA3120F1207ADEC3FE0ECFFFC9038FBE07F9039FF001F804914E0
-49EB0FF049130716F8A2ED03FCA216FEAA16FCA2ED07F8A216F06DEB0FE06DEB1FC001E7
-EB3F809039C3C0FE00903880FFF89038003FC027327EB12D>I<EB0FFF017F13E03901FC
-03F03903F807F8EA0FF0EA1FE013C0123F007FEB03F049C7FCA212FFAA127F7F151C123F
-6C6C133C15786C6C13F03903F801E03901FC07C039007FFF00EB0FF81E207D9F24>I<ED
-0FC0EC07FFA3EC007F153FADEB07F8EB3FFF9038FE07BF3903F801FF48487E4848137F48
-48133F123FA2485AA212FFAA127FA26C7EA2001F147F7F6C6C13FF0003010313E03A01FC
-0FBFFE39007FFE3FEB0FF027327DB12D>I<EB0FFC90387FFF803901FC0FE03903F807F0
-390FF003F89038E001FC381FC000003F14FEA24848137E157F12FFA390B6FCA20180C7FC
-A4127FA27F003F1407A26C6C130F000F141E6C6C133C6C6C13783900FE03F090383FFFC0
-903807FE0020207E9F25>I<EB01FE90380FFF8090383FC3E090387F07F0EBFF0FEA01FE
-A2EA03FCEC07E0EC018091C7FCA8B512FCA3D803FCC7FCB3A8387FFFF0A31C327EB119>
-I<90391FF007C09039FFFE3FE03A03F83FF9F03907F01FC3390FE00FE1001FECF1E09039
-C007F000003F80A7001F5CEBE00F000F5C6C6C485A6D485A260EFFFEC7FCEB1FF090C9FC
-121EA2121F7F90B57E6C14F015FC6C14FF16806C15C0120F003FC7127F007EEC1FE000FE
-140F481407A4007EEC0FC0007F141F6C1580D81FC0EB7F003907F803FC0001B512F0D800
-1F90C7FC242F7E9F28>I<EA01F812FFA3120F1207ADEC07F8EC3FFE9138F87F809038F9
-C03FD9FB8013C09038FF001F4914E0A25BA25BB3B500C3B5FCA328327DB12D>I<EA03C0
-EA0FF0A2487EA46C5AA2EA03C0C8FCA9EA01F8127FA31207B3A7B51280A311337DB217>
-I<EA01F812FFA3120F1207ADEDFFF8A3ED3F00153C15F84A5A4A5A4A5A4AC7FC143E5C14
-FCEBF9FE90B5FC81A2496C7E9038F83FE0496C7EA26E7E6E7E6E7EA26E7E6E1380ED7FC0
-16E0B53881FFFEA327327EB12B>107 D<EA01F812FFA3120F1207B3B3A6B512C0A31232
-7DB117>I<2703F007F8EB1FE000FFD93FFEEBFFF8913AF87F83E1FE903AF1C03F870026
-0FF38001CE7F2807F7001FDC7F01F602F8148013FE495CA2495CB3B500C3B5380FFFFCA3
-3E207D9F43>I<3903F007F800FFEB3FFE9138F87F809038F1C03F260FF38013C03907F7
-001F01F614E013FE5BA25BB3B500C3B5FCA328207D9F2D>I<EB07FC90387FFFC03901FC
-07F03903F001F848486C7E4848137E001F147F003F158049133F007F15C0A300FF15E0A8
-007F15C0A36C6CEB7F80A2001F15006C6C13FE00075C3903F803F83901FE0FF039007FFF
-C0D907FCC7FC23207E9F28>I<3901F83FE000FFEBFFFC9038FBE07F9039FF003F80D807
-FEEB1FE049EB0FF05BED07F8A216FCA2ED03FEAAED07FCA216F8150F16F06DEB1FE06D14
-C06DEB3F809039FBC0FE009038F8FFF8EC3FC091C8FCABB512C0A3272E7E9F2D>I<3803
-F03F00FFEBFFC09038F1C7E09038F38FF0380FF70FEA07F613FE13FCEC07E091C7FCA25B
-B2B512E0A31C207E9F21>114 D<3801FF86000713FEEA1F00003C133E007C131E127800
-F8130EA27E6C90C7FC6C7E13FC387FFFC014F06C7F6C7F00077F00017FEA003F01001380
-143F00E0131FA26C130FA27E15006C5B6C133E6C6C5A38F3FFF038C07F8019207D9F20>
-I<131CA5133CA3137CA213FC120112031207381FFFFEB5FCA2D803FCC7FCB0EC0380A714
-07D801FE13001200EB7F0EEB3FFCEB07F0192E7FAD1F>I<D801F8EB07E000FFEB03FFA3
-000FEB003F0007141FB3153FA2157F000314FF9039FC01DFF03A00FE039FFF90387FFF1F
-EB0FFC28207D9F2D>I<B5EB1FFCA3D80FF8EB03C0000715806D1307000315007F000114
-0E7F6C5CA2EC803C017F1338ECC078013F1370ECE0F0011F5B14F1010F5B14F9903807FB
-80A214FF6D90C7FCA26D5AA26D5AA21478A226207E9F2B>I<B53A1FFFE03FF8A33C0FF0
-00FE0007C06DED038000076EEB0700816D5D00039138FF800EA26C6C486D5A15DF01FF15
-3C6C9039038FE038A2D97F876D5A150702C714F0D93FCF6D5AECCE03D91FFEEBF9C09138
-FC01FD16FF010F5D4A7EA26D486DC7FCA20103147E4A133EA26D48131C35207E9F3A>I<
-3A7FFF807FFCA33A03FC001F806C6CEB1E006C6C5BEC803890387FC078013F5B90381FE1
-E090380FF3C0ECFF806D90C7FC6D5A13016D7E81815B903803DFE09038078FF08190380F
-07FC90381E03FEEB3C01496C7E4914804848EB7FC00003EC3FE026FFFC01B5FCA328207F
-9F2B>I<B5EB1FFCA3D80FF8EB03C0000715806D1307000315007F0001140E7F6C5CA2EC
-803C017F1338ECC078013F1370ECE0F0011F5B14F1010F5B14F9903807FB80A214FF6D90
-C7FCA26D5AA26D5AA21478A21470A214F05C1301007C5BEAFE035C49C8FC5BEAFC1EEA78
-7CEA3FF0EA0FC0262E7E9F2B>I<003FB512F8A2EB801FD83E0013F0003CEB3FE00038EB
-7FC0007813FF1580D8700113005B5C495AEA000F5C495A495AA2495A9038FF801C5A1400
-485A120749133C485A001F1438491378484813F8387FC00100FF130790B5FCA21E207E9F
-24>I E /Fn 3 16 df<B612C0A21A027C8B23>0 D<14FF010713E090381F00F80138131C
-01F0130FD801C0EB03804848EB01C048C812E0000E1570000C1530001C153848151C0030
-150C0070150E00601506A300E01507481503A76C150700601506A30070150E0030150C00
-38151C6C1538000C1530000E15706C15E06C6CEB01C06C6CEB0380D800F0EB0F00013813
-1C011F13F8903807FFE0010090C7FC282B7EA02D>13 D<EA03F0EA0FFC487E487E481380
-A2B512C0A66C1380A26C13006C5A6C5AEA03F012127E9317>15 D
-E /Fo 83 125 df<90381F83E09038F06E303901C07878380380F8903800F03048EB7000
-A7B612803907007000B2383FE3FF1D20809F1B>11 D<133FEBE0C0EA01C0380381E0EA07
-01A290C7FCA6B512E0EA0700B2383FC3FC1620809F19>I<EB3FE013E0EA01C1EA0381EA
-0700A8B5FCEA0700B2383FE7FC1620809F19>I<127012F8A71270AA1220A51200A51270
-12F8A3127005217CA00D>33 D<EA7038EAF87CEAFC7EA2EA743AEA0402A3EA0804A2EA10
-08A2EA2010EA40200F0E7F9F17>I<1340A2EA03F0EA0C4EEA1041382040801260004013
-4038C041C01343A238E04180EB40001270127CEA3FC0EA1FF86C7EEA03FEEA007FEB4F80
-1343EB41C0A2EAF040A312801480EA404100201300EA3042EA0C4CEA03F0EA0040A31225
-7EA117>36 D<127012F812FCA212741204A31208A21210A212201240060E7C9F0D>39
-D<13401380EA01005A12061204120C5AA212381230A212701260A412E0AC1260A4127012
-30A212381218A27E120412067E7EEA008013400A2E7BA112>I<7E12407E12307E120812
-0C7EA212077EA213801201A413C0AC1380A412031300A25A1206A25A120812185A12205A
-5A0A2E7EA112>I<EA0180A5EAE187EA718EEA399CEA0FF0EA03C0A2EA0FF0EA399CEA71
-8EEAE187EA0180A510147DA117>I<127012F012F8A212781208A31210A31220A2124005
-0E7C840D>44 D<EAFFF0A20C02808A0F>I<127012F8A3127005057C840D>I<14C0A21301
-1480A2130314005B1306A2130E130CA2131C131813381330A213701360A213E05B12015B
-A2120390C7FCA25A1206120E120CA2121C1218A21238123012701260A212E05AA2122D7E
-A117>I<EA03F0EA0E1C487EEA1806EA380738700380A400F013C0AD00701380A3EA7807
-00381300EA1806EA1C0E6C5AEA03F0121F7E9D17>I<13801203120F12F31203B3A6EA07
-C0EAFFFE0F1E7C9D17>I<EA03F0EA0C1CEA100E487E00401380128000F013C0EAF803A3
-EA200712001480A2EB0F00130E5B5B5B13605B485A48C7FC000613405A5A00101380EA3F
-FF5AB5FC121E7E9D17>I<EA03F0EA0C1CEA100EEA200F007813801307A2EA380F120014
-00A2131E131C1370EA07F0EA003C130E130FEB0780A214C0122012F8A300F013801240EB
-0F00EA200EEA183CEA07F0121F7E9D17>I<1306A2130EA2131E132EA2134E138EA2EA01
-0E1202A212041208A212101220A2124012C0B512F038000E00A7EBFFE0141E7F9D17>I<
-EA1803EA1FFE5B5B13E00010C7FCA6EA11F0EA161CEA180EEA10071480EA0003A214C0A3
-127012F0A200E013801240EB0700EA20066C5AEA0838EA07E0121F7E9D17>I<137CEA01
-82EA0701380E0380EA0C0712183838030090C7FC12781270A2EAF1F0EAF21CEAF406EAF8
-07EB0380A200F013C0A51270A214801238EB07001218EA0C0E6C5AEA01F0121F7E9D17>
-I<1240387FFFE014C0A23840008038800100A21302485AA25B5BA25BA21360A213E05B12
-01A41203A76C5A131F7E9D17>I<EA03F0EA0C0CEA1006EA3003382001801260A3127038
-780300123EEA3F06EA1FC8EA0FF0EA03F8487EEA0C7EEA103F38300F80EA6007EB01C012
-C01300A31480EA600100201300EA1002EA0C0CEA03F0121F7E9D17>I<EA03F0EA0E1848
-7E487E13071270EB038012F0A214C0A5EA7007A21238EA180BEA0E13EA03E338000380A3
-EB07001230EA7806130EEA700CEA2018EA1070EA0FC0121F7E9D17>I<127012F8A31270
-1200AA127012F8A3127005147C930D>I<127012F8A312701200AA127012F012F8A21278
-1208A31210A31220A21240051D7C930D>I<EA0FE0EA103CEA601EEA400EEAE00F12F0A2
-1260EA001E131C13381370136013C01380A2EA0100A6C7FCA5EA0380EA07C0A3EA038010
-207E9F15>63 D<5B497EA3497EA3EB09E0A3EB10F0A3EB2078A3497EA2EBC03EEB801EA2
-48B5FCEB000FA20002EB0780A348EB03C0A2120C001E14E039FF801FFE1F207F9F22>65
-D<B512E0380F0078141EA2801580A515005C141E147CEBFFF0EB007C141FEC0F80EC07C0
-140315E0A515C014071580EC0F00143EB512F01B1F7E9E20>I<90380FE0109038381C30
-9038E002703803C00139078000F048C71270121E15305A1510127C127800F81400A91278
-007C1410123CA26C1420A27E6C6C13406C6C13803900E00300EB380CEB0FF01C217E9F21
->I<B512F83807801EEC0780EC03C0EC01E0EC00F015701578A2153CA3153EA8153CA215
-7C1578A215F0EC01E0EC03C0EC0780EC1E00B512F81F1F7F9E23>I<B61280380F000F14
-031401140015C01540A314401500A214C0130113FF130113001440A3EC0020A31540A315
-C01401EC0380140FB6FC1B1F7E9E1F>I<B61280380780071401A2140015C01540A4EC20
-00A3146014E013FF138014601420A391C7FCA87FEAFFFE1A1F7F9E1E>I<90380FE01090
-38381C309038E002703803C00139078000F048C71270121E15305A1510127C127800F814
-00A7EC3FFEEC01F000781300127C123CA27EA27E6C7E3903C001703900E002309038380C
-1090380FF0001F217E9F24>I<39FFF07FF8390F000780AD90B5FCEB0007AF39FFF07FF8
-1D1F7E9E22>I<EAFFF0EA0F00B3ABEAFFF00C1F7E9E10>I<3807FFC038003E00131EB3A3
-122012F8A3EAF01CEA403CEA6038EA1070EA0FC012207F9E17>I<39FFF007FC390F0003
-E0EC0180150014025C5C5C5C5C5C49C7FC5B497E130FEB13C0EB21E01341EB80F0EB0078
-A28080A280EC0780A2EC03C015E015F039FFF01FFE1F1F7E9E23>I<EAFFF8EA0F8090C7
-FCB21402A414061404A2140C141C147CB512FC171F7E9E1C>I<B46CEB07FE000715C0A2
-D805C0130BA2D804E01313A301701323A26D1343A36D1383A290380E0103A3EB0702A3EB
-0384A2EB01C8A3EB00F0A21460121FD8FFE0EB7FFE271F7F9E2A>I<B4EB0FF8390F8003
-E0EC0080EA0BC0EA09E0A2EA08F01378A27F7FA27FEB0780A2EB03C0EB01E0A2EB00F014
-78A2143C141EA2140F1407A214031401123E38FF80001D1F7E9E22>I<EB1FE0EB703838
-01C00E48487E39070003804814C0001EEB01E048EB00F0A2007C14F8A20078147800F814
-7CA900781478007C14F8A2003C14F0003E1301001E14E06CEB03C06C1480390380070038
-01E01E38007038EB1FE01E217E9F23>I<B512E0380F007C141E80EC0780A215C0A41580
-A2EC0F00141E147CEBFFE090C8FCAEEAFFF01A1F7E9E1F>I<B57E380F00F0143C8080A2
-1580A41500A2141E5C14F0EBFF80EB01C0EB0070A280143CA3143EA31504143F141FEC0F
-0839FFF00788C7EA01F01E207E9E21>82 D<3803F040380C0CC0EA1803EA3001EA6000A2
-12E01440A36C13007E127CEA7F80EA3FF86CB4FC00071380C613C0EB1FE013031301EB00
-F014707EA46C136014E06C13C038F8018038C60300EA81FC14217E9F19>I<007FB512E0
-38780F010060EB006000401420A200C0143000801410A400001400B3497E3803FFFC1C1F
-7E9E21>I<39FFF00FF8390F0003E0EC0080B3A46CEB01001380120314026C6C5A6C6C5A
-EB3830EB0FC01D207E9E22>I<39FFF003FE391F8000F86CC7126015206C6C1340A36C6C
-1380A2EBE00100011400A23800F002A213F8EB7804A26D5AA36D5AA2131F6D5AA2EB07C0
-A36D5AA36DC7FC1F207F9E22>I<3BFFF07FF81FF03B1F000FC007C06C90390780018017
-0015C001805C00071502EC09E013C000035DEC19F01410D801E05CA2EC2078D800F05CA2
-EC403C01785CA2EC801E017C1460013C144090383D000F133F6D5CA2011E1307010E91C7
-FCA2010C7F010413022C207F9E2F>I<397FF81FF8390FE007C03907C0030000031302EB
-E0063801F00400005BEBF818EB78106D5AEB3E60EB1E406D5AA213076D7E497E1305EB08
-F0EB18F8EB1078EB207CEB603EEB401EEB801F3901000F801407000214C000061303001F
-EB07E039FFC01FFE1F1F7F9E22>I<39FFF001FF391F800078000F146012076D13400003
-14807F3901F001001200EBF802EB7C06EB3C04EB3E08131EEB1F10EB0FB0EB07A014E06D
-5AACEB3FFC201F7F9E22>I<387FFFFE387E003C127800701378006013F814F0384001E0
-130314C0EB07801200EB0F00131EA25B137C13785B1201EBE002EA03C0A2EA0780000F13
-061300001E1304003E130C123C48133C14FCB5FC171F7E9E1C>I<12FFA212C0B3B3A512
-FFA2082D7CA10D>I<EA0804EA1008EA2010A2EA4020A2EA8040A3EAB85CEAFC7EA2EA7C
-3EEA381C0F0E7A9F17>I<12FFA21203B3B3A512FFA2082D80A10D>I<120812101220A212
-40A21280A312B812FCA2127C1238060E7D9F0D>96 D<EA1FE0EA3030EA7818131CEA300E
-1200A313FEEA078EEA1E0E1238127800F01310A3131E127838386720380F83C014147E93
-17>I<121C12FC121CAA137CEA1D87381E0180EB00C0001C13E01470A21478A6147014F0
-14E0001E13C0381A018038198700EA107C15207E9F19>I<EA01FCEA0706EA1C0F123813
-060078C7FC127012F0A61270127800381380A2381C0100EA0706EA01F811147F9314>I<
-EB01C0130F1301AAEA01F1EA070DEA0C03EA180112381278127012F0A61270A21238EA18
-03120CEA070D3801F1F815207F9F19>I<EA03F0EA0E1C487E487EA21270EB038012F0A2
-B5FC00F0C7FCA31270A26C1380A2381C0100EA0706EA01F811147F9314>I<137CEA01C6
-EA030F1207EA0E061300A7EAFFF0EA0E00B2EA7FE01020809F0E>I<14E03803E330EA0E
-3CEA1C1C38380E00EA780FA5EA380E6C5AEA1E38EA33E00020C7FCA21230A2EA3FFE381F
-FF8014C0383001E038600070481330A4006013606C13C0381C03803803FC00141F7F9417
->I<121C12FC121CAA137C1386EA1D03001E1380A2121CAE38FF8FF014207E9F19>I<1238
-127CA31238C7FCA6121C12FC121CB1EAFF80091F7F9E0C>I<13E0EA01F0A3EA00E01300
-A61370EA07F012001370B3A31260EAF06013C0EA6180EA3F000C28829E0E>I<121C12FC
-121CAAEB1FE0EB0780EB060013045B5B5B136013E0EA1DF0EA1E70EA1C38133C131C7F13
-0F7F148014C038FF9FF014207E9F18>I<121C12FC121CB3ABEAFF8009207F9F0C>I<391C
-3E03E039FCC30C30391D039038391E01E01CA2001C13C0AE3AFF8FF8FF8021147E9326>
-I<EA1C7CEAFC86EA1D03001E1380A2121CAE38FF8FF014147E9319>I<EA01F8EA070E38
-1C0380383801C0A2387000E0A200F013F0A6007013E0A2383801C0A2381C038038070E00
-EA01F814147F9317>I<EA1C7CEAFD87381E018014C0381C00E014F014701478A6147014
-F014E0381E01C0EB0380381D8700EA1C7C90C7FCA8B47E151D7E9319>I<3801F0403807
-0CC0EA0E02EA1C03EA38011278127012F0A6127012781238EA1C03EA0C05EA0709EA01F1
-EA0001A8EB0FF8151D7F9318>I<EA1CF0EAFD18EA1E3CA21318EA1C00AEEAFFC00E147E
-9312>I<EA0FC8EA3038EA6018EAC008A3EAE000127CEA3FE0EA1FF0EA07F8EA003CEA80
-0E130612C0A21304EAE00CEAD818EA87E00F147F9312>I<1202A31206A2120EA2123EEA
-FFF8EA0E00AB1304A5EA07081203EA01F00E1C7F9B12>I<381C0380EAFC1FEA1C03AE13
-07120CEA061B3803E3F014147E9319>I<38FF83F8383E00E0001C13C06C1380A3380701
-00A21383EA0382A2EA01C4A213E4EA00E8A21370A3132015147F9318>I<39FF9FE1FC39
-3C078070391C030060EC8020000E1440A214C0D80704138014E0A239038861001471A238
-01D032143A143E3800E01CA2EB6018EB40081E147F9321>I<38FF87F8381E03C0380E01
-80EB0300EA0702EA0384EA01C813D8EA00F01370137813F8139CEA010E1202EA06073804
-0380000C13C0003C13E038FE07FC16147F9318>I<38FF83F8383E00E0001C13C06C1380
-A338070100A21383EA0382A2EA01C4A213E4EA00E8A21370A31320A25BA3EAF080A200F1
-C7FC1262123C151D7F9318>I<EA7FFFEA700E1260EA401C133813781370EA00E0120113
-C0EA038012071301120E121EEA1C03EA3802EA7006130EEAFFFE10147F9314>I<B812F0
-2C01808C2D>124 D E /Fp 25 119 df<120FEA3FC0EA7FE0EAFFF0A313F8A3127F123F
-EA0F381200A21378A21370A213F013E0120113C01203EA0780EA0F005A123E123C12180D
-1D79BB1B>39 D<B61280A819087F9620>45 D<DB1FFE14E00203B5EAE001021FECF80302
-7FECFE07903B01FFFC00FF0F010701C0EB1FDF4990C7EA07FFD93FFC1401D97FF0804948
-157F4849153F4849151F5A91C9120F48481607A2485A1803123F5B007F1701A34993C7FC
-12FFAD127F7FF001E0A2123F7F121F18036C6C17C018076C7E6EED0F807E6C6DED1F006C
-6D153E6D6C5DD93FFC5DD90FFFEC03F06D01C0EB0FE0010101FCEB7FC06D6CB6C7FC021F
-14FC020314E09126001FFEC8FC3B3D7BBB46>67 D<B912F0A43A007FF000019338003FF8
-170F1707170317011700A21878A4043C137C183CA4047C1300A216FC1501150791B5FCA4
-ECF00715011500167CA2043C130FA3181EA293C7FCA2183EA2183CA2187CA218FC1701EF
-03F81707170F173FEE03FFB9FC18F0A3383B7CBA40>69 D<B912C0A43A007FF000079338
-007FE0173F170F1707A21703A21701A418F0EE7800A41800A216F8A21501150791B5FCA4
-ECF00715011500A21678A693C8FCAEB612FEA4343B7CBA3D>I<DB1FFCEB01C00203B5EA
-C003021FECF007027FECFC0F903B01FFFC00FF1F010701C0EB1FBFD91FFEC7EA07FF4948
-80D97FF0804948804849157F4849153F4890C9FC181F4848160F121F491607A2123F5B00
-7F1703A34993C8FC12FFAB041FB61280A2127F7FDC0001EBC000A2123F7F121FA27F120F
-6C7EA26C7F6C7F6C7F6D6C5CEB3FFC6DB45C010701C0EB1FBF010101FCEBFF1F6D6CB5EA
-FE0F021FECF8030203ECE0009126001FFEC9FC413D7BBB4C>I<D903FF1307011FEBE00F
-90B512FC486E5A3A07FE00FFBFD80FF0EB1FFF48481307497F48487F007F808290C8FC48
-81A282A27F827F7F6D91C7FCEA7FFCEBFF8014F86CEBFFC015FC6C14FF6C15C06C15F06C
-816C816C6C80011F8001031580EB001F020114C0EC000F15036F13E081167F00F0153FA3
-161FA27EA26C16C0A26C153F6C16806D147F6D15006D14FE01FCEB03FC3AFDFFC00FF8D8
-F87FB55AD8F01F14C0010391C7FC39E0003FF82B3D7BBB36>83 D<B600F80107B512E0A4
-26007FF0C83807E000725AB3B3A21807013F5F80A2011F160F6E93C7FC010F5E6D6C153E
-606D6C5D6D01C013036D01F0EB0FF0DA3FFEEBFFC06EB65A02074AC8FC020014F8030F13
-80433C7DBA4A>85 D<B600E091B512F0A4C601F0C83803F800725A017F5F6E1503013F5F
-6E1507011F5F80180F010F94C7FC6E5D6D161E6F143E6D163C816D5E8118F86D5E6F1301
-027F5D6F1303023F5D811707021F5D6F130F020F92C8FC6F5B6E141E16806E5C16C0177C
-6E1478EEE0F86E5C16F1037F5B16F916FB033F5B16FF6F5BA26F90C9FCA26F5AA36F5AA2
-6F5AA26F5A443B7EBA49>I<EB3FFE48B512E0000714F8390FF007FE391FF801FF6E7F6F
-7EA2826C48133F6C5A6C5AC8FCA491B5FC131F90387FF83F3803FF803807FC00EA1FF848
-5A485A5B12FF5BA3157FA26D13FF397FE001DF263FF00313F83B1FF80F9FFFE0390FFFFE
-0F0001497E39003FE0012B267DA52F>97 D<903801FFF0010F13FE013FEBFF809039FF80
-3FC03A03FE007FE0485A485A485AA24848EB3FC0ED1F80007FEC0F0092C7FC5B12FFAA12
-7F7FA2123F6D14F0121F6D13016C6CEB03E06C6CEB07C06C6C130FC69038C03F0090383F
-FFFE010F13F8010113C024267DA52B>99 D<EE3F80ED3FFFA4150181B0ECFF80010F13F0
-013F13FC9038FFC03F48EB000FD807FC7F48487F497F001F80485AA2127F5BA212FFAA12
-7FA27F123FA26C6C5BA26C6C5B6C6C130F6C6C4913C02700FF807E13FE90387FFFF8010F
-13E0010113002F3C7DBB36>I<903803FF80011F13F0017F13FC9038FF81FE3A03FE007F
-80D807F8133F000FEC1FC0484814E0150F484814F01507127F4914F8A212FFA290B6FCA3
-01C0C8FCA5127FA27F003F1578A26C6C14F8000F15F06C6C13016C6CEB03E06CB4EB0FC0
-6C9038C07F8090393FFFFE00010F5B010113C025267DA52C>I<13FE12FFA412071203B0
-EDFF80020313F0020F13FC91383E07FEEC78034A6C7E14E06D486C13805CA291C7FCA25B
-B3A4B5D8F83F13FEA42F3C7CBB36>104 D<EA03F0487E487E487EA66C5A6C5A6C5AC8FC
-AB13FE127FA412071203B3AAB512F0A4143D7DBC1A>I<13FE12FFA412071203B3B3AEB5
-12F8A4153C7DBB1A>108 D<D801FCD97FC0EB0FF800FF902603FFF8EB7FFF020F6D48B5
-7E913C1F03FF03E07FE0DA780190380F003F0007D97000018E6D7E000349149CD9FDC0D9
-7FF86D7E4A5C13FF91C75BA2495DB3A4B5D8F81FB50003B512E0A44B267CA552>I<D801
-FCEBFF8000FF010313F0020F13FC91383E07FEEC78030007496C7E000313E09026FDC000
-1380EBFF80A291C7FCA25BB3A4B5D8F83F13FEA42F267CA536>I<903801FFC0010F13F8
-017F13FFD9FF807F3A03FE003FE0D807F8EB0FF048486D7EA248486D7E003F81A248486D
-7EA400FF1680A9007F1600A36C6C495AA2001F5D6D1307000F5D6C6C495AD803FEEB3FE0
-3A00FF80FF806DB5C7FC010F13F8010113C029267DA530>I<9038FE01FF00FF011F13F0
-027F13FC9039FFFC07FE9139F001FF800007D9C00013C06C49EB7FE091C7EA3FF049141F
-17F8160F17FCA3EE07FEAAEE0FFCA3EE1FF8A2EE3FF06D15E06E137F6EEBFFC06E481300
-9039FEFC07FE91387FFFF8021F13E0DA03FEC7FC91C9FCADB512F8A42F377DA536>I<39
-01FC03F000FFEB0FFEEC3FFF91387C7F809138F0FFC000075B3803FDC0A2EBFF80ED7F80
-9138003F00151E92C7FCA25BB3A2B512FCA422267DA528>114 D<90383FF0383903FFFE
-78000FEBFFF8381FC00F383F0003007E1301007C130012FC1578A27E6C140013C013FC38
-7FFFF014FE6CEBFF806C14C06C14F0000314F8C6FC011F13FCEB007FEC07FE00F0130114
-007E157EA27E6C147C15FC6C14F8EB80019038F00FF000F9B512C0D8F07F130038E01FF8
-1F267DA526>I<130FA55BA45BA25BA25B5A5A5A001FEBFFF0B6FCA3000190C7FCB3153C
-A8EC80787EECC0F0EB7FE190381FFFE06D1380903801FE001E377EB626>I<01FEEC3F80
-00FFEC3FFFA400071401000380B3A35DA35D5D00015C6D011E13C06CD9807C13FE6DB45A
-011F13E0010313802F267CA536>I<B500F0EBFFFCA4D803FEC7EA1F806D15006C151E80
-6C5DA26E137C017F14786E13F8013F5CECF001011F5CECF803010F5CA2ECFC0701075CEC
-FE0F010391C7FC6E5A6D131E15BE6D13BC15FC6E5AA36E5AA26E5AA26E5AA26E5A2E267E
-A533>I E end
-%%EndProlog
-%%BeginSetup
-%%Feature: *Resolution 300dpi
-TeXDict begin
-%%PaperSize: a4
-
-%%EndSetup
-%%Page: 1 1
-1 0 bop 701 942 a Fp(User's)32 b(Guide)932 1067 y(to)154
-1191 y(p)s(cl-cvs)i(-)e(the)g(Emacs)f(F)-8 b(ron)m(t-End)31
-b(to)i(CVS)703 1378 y Fo(release)16 b(1.05-CVS-$Name: $)827
-1627 y(P)o(er)c(Cederqvist)720 1876 y(last)g(up)q(dated)h(20)f(No)o(v)f
-(1995)p eop
-%%Page: 2 2
-2 1 bop 0 1814 a Fo(Cop)o(yrigh)o(t)226 1813 y(c)214
-1814 y Fn(\015)15 b Fo(1992)f(P)o(er)h(Cederqvist)0 1951
-y(P)o(ermission)e(is)g(gran)o(ted)f(to)f(mak)o(e)h(and)h(distribute)h
-(v)o(erbatim)e(copies)h(of)f(this)h(man)o(ual)g(pro)o(vided)g(the)f
-(cop)o(yrigh)o(t)0 2014 y(notice)k(and)f(this)h(p)q(ermission)h(notice)
-e(are)g(preserv)o(ed)h(on)f(all)h(copies.)0 2151 y(P)o(ermission)f(is)f
-(gran)o(ted)f(to)h(cop)o(y)g(and)g(distribute)h(mo)q(di\014ed)h(v)o
-(ersions)e(of)f(this)i(man)o(ual)f(under)h(the)f(conditions)0
-2213 y(for)20 b(v)o(erbatim)g(cop)o(ying,)i(pro)o(vided)f(also)g(that)f
-(the)g(section)h(en)o(titled)h(\\GNU)e(General)h(Public)h(License")g
-(is)0 2275 y(included)14 b(exactly)e(as)f(in)i(the)f(original,)h(and)e
-(pro)o(vided)i(that)e(the)g(en)o(tire)h(resulting)h(deriv)o(ed)g(w)o
-(ork)d(is)i(distributed)0 2337 y(under)k(the)f(terms)g(of)g(a)f(p)q
-(ermission)j(notice)f(iden)o(tical)h(to)e(this)g(one.)0
-2474 y(P)o(ermission)20 b(is)g(gran)o(ted)f(to)g(cop)o(y)h(and)f
-(distribute)i(translations)f(of)f(this)h(man)o(ual)f(in)o(to)h(another)
-f(language,)0 2537 y(under)f(the)f(ab)q(o)o(v)o(e)f(conditions)j(for)d
-(mo)q(di\014ed)i(v)o(ersions,)f(except)h(that)e(the)h(section)h(en)o
-(titled)g(\\GNU)f(General)0 2599 y(Public)i(License")f(and)f(this)g(p)q
-(ermission)i(notice)e(ma)o(y)f(b)q(e)i(included)h(in)f(translations)f
-(appro)o(v)o(ed)f(b)o(y)h(the)g(F)l(ree)0 2661 y(Soft)o(w)o(are)d(F)l
-(oundation)h(instead)h(of)f(in)h(the)f(original)h(English.)p
-eop
-%%Page: 1 3
-1 2 bop 0 -58 a Fo(Chapter)15 b(1:)k(Installation)1470
-b(1)0 183 y Fm(1)41 b(Installation)62 371 y Fo(This)17
-b(section)g(describ)q(es)h(the)f(installation)h(of)e(p)q(cl-cvs,)i(the)
-f(GNU)f(Emacs)g(CVS)h(fron)o(t-end.)23 b(Y)l(ou)17 b(should)0
-434 y(install)j(not)e(only)h(the)g(elisp)h(\014les)f(themselv)o(es,)g
-(but)g(also)f(the)h(on-line)h(do)q(cumen)o(tation)f(so)f(that)g(y)o
-(our)g(users)0 496 y(will)d(kno)o(w)e(ho)o(w)g(to)g(use)h(it.)20
-b(Y)l(ou)13 b(can)h(create)f(t)o(yp)q(eset)h(do)q(cumen)o(tation)g
-(from)e(the)i(\014le)h(`)p Fl(pcl-cvs.texinfo)p Fo(')10
-b(as)0 558 y(w)o(ell)15 b(as)e(an)h(on-line)h(info)f(\014le.)21
-b(The)14 b(follo)o(wing)g(steps)g(are)f(also)h(describ)q(ed)h(in)g(the)
-f(\014le)h(`)p Fl(INSTALL)p Fo(')d(in)i(the)g(source)0
-620 y(directory)l(.)0 847 y Fk(1.1)33 b(Installation)16
-b(of)f(the)g(p)r(cl-cvs)h(program)25 984 y Fo(1.)29 b(P)o(ossibly)13
-b(edit)g(the)f(\014le)h(`)p Fl(Makefile)p Fo(')d(to)i(re\015ect)g(the)g
-(situation)h(at)e(y)o(our)h(site.)19 b(W)l(e)12 b(sa)o(y)g
-Fl(")p Fo(p)q(ossibly)p Fl(")h Fo(b)q(ecause)90 1046
-y(the)j(v)o(ersion)f(of)h(p)q(cl-cvs)h(included)h(with)e(CVS)g(uses)f
-(a)h(con\014guration)f(mec)o(hanism)i(in)o(tegrated)e(with)h(the)90
-1109 y(o)o(v)o(erall)e(mec)o(hanisms)g(used)g(b)o(y)g(the)f(CVS)h
-(build)i(and)e(install)h(pro)q(cedures.)20 b(Th)o(us)13
-b(the)h(\014le)h Fl(Makefile)d Fo(will)90 1171 y(b)q(e)k(generated)f
-(automatically)h(from)f(the)g(\014le)h Fl(Makefile.in)p
-Fo(,)e(and)h(it)h(should)g(not)f(b)q(e)h(necessary)g(to)e(edit)90
-1233 y(it)h(further.)90 1308 y(If)20 b(y)o(ou)e(do)i(ha)o(v)o(e)e(to)h
-(edit)h(the)f(`)p Fl(Makefile)p Fo(',)f(the)i(only)g(things)f(y)o(ou)g
-(ha)o(v)o(e)g(to)g(c)o(hange)g(is)h(the)f(de\014nition)90
-1370 y(of)h Fl(lispdir)e Fo(and)j Fl(infodir)p Fo(.)33
-b(The)20 b(elisp)h(\014les)g(will)h(b)q(e)f(copied)g(to)e
-Fl(lispdir)p Fo(,)h(and)g(the)g(info)g(\014le\(s\))h(to)90
-1433 y Fl(infodir)p Fo(.)25 1508 y(2.)29 b(Con\014gure)15
-b(p)q(cl-cvs.el)90 1582 y(There)i(are)f(a)h(couple)h(of)e(pathnames)h
-(that)f(y)o(ou)g(ha)o(v)o(e)h(to)f(c)o(hec)o(k)h(to)f(mak)o(e)g(sure)h
-(that)f(they)h(matc)o(h)f(y)o(our)90 1645 y(system.)j(They)d(app)q(ear)
-f(early)h(in)g(the)f(\014le)h(`)p Fl(pcl-cvs.el)p Fo('.)90
-1720 y Fj(NOTE:)f Fo(If)h(y)o(our)f(system)g(is)i(running)g(emacs)f
-(18.57)e(or)h(earlier)i(y)o(ou)f(MUST)f(uncommen)o(t)h(the)g(line)i
-(that)90 1782 y(sa)o(ys:)210 1847 y Fl(\(setq)23 b
-(delete-exited-processes)e(nil\))90 1922 y Fo(Setting)12
-b Fl(delete-exited-processes)c Fo(to)j Fl(nil)g Fo(w)o(orks)f(around)i
-(a)f(bug)h(in)g(emacs)f(that)g(causes)h(it)g(to)e(dump)90
-1984 y(core.)20 b(The)15 b(bug)h(w)o(as)e(\014xed)i(in)g(emacs)f
-(18.58.)25 2059 y(3.)29 b(Release)16 b(1.05)e(and)h(later)h(of)e(p)q
-(cl-cvs)j(requires)f(parts)e(of)h(the)g(Elib)h(library)l(,)g(v)o
-(ersion)f(1.0)g(or)f(later.)20 b(Elib)c(is)90 2121 y(a)o(v)m(ailable)g
-(via)f(anon)o(ymous)f(ftp)g(from)f(prep.ai.mit.edu)i(in)h(`)p
-Fl(pub/gnu/elib-1.0.tar.g)o(z)p Fo(',)11 b(and)k(from)e(a)90
-2183 y(lot)i(of)g(other)g(sites)g(that)g(mirror)g(prep.)20
-b(Get)15 b(Elib,)h(and)f(install)i(it,)e(b)q(efore)g(pro)q(ceeding.)90
-2258 y Fj(NOTE:)f Fo(The)h(v)o(ersion)g(of)g(p)q(cl-cvs)h(included)i
-(with)d(CVS)g(includes)j(a)c(cop)o(y)h(of)g(Elib)h(in)g(the)f
-(sub-directory)90 2321 y(`)p Fl(elib)p Fo(')f(under)i(the)f(`)p
-Fl(contrib/pcl-cvs)p Fo(')d(directory)l(.)25 2396 y(4.)29
-b(T)o(yp)q(e)18 b(`)p Fl(make)d(install)p Fo(')h(in)j(the)f(source)h
-(directory)l(.)29 b(This)18 b(will)i(b)o(yte-compile)g(all)f(`)p
-Fl(.el)p Fo(')e(\014les)i(and)f(cop)o(y)90 2458 y(the)d(`)p
-Fl(*.elc)p Fo(')f(\014les)i(in)o(to)f(the)h(directory)f(y)o(ou)g(sp)q
-(eci\014ed)i(in)f(step)f(1.)90 2533 y(If)g(y)o(ou)g(w)o(an)o(t)f(to)h
-(install)i(the)e(`)p Fl(*.el)p Fo(')f(\014les)i(to)q(o,)e(y)o(ou)h(can)
-g(t)o(yp)q(e)h(`)p Fl(make)e(install-el)p Fo(')f(to)i(do)g(so.)90
-2608 y(If)e(y)o(ou)g(only)g(w)o(an)o(t)f(to)g(create)h(the)g(compiled)i
-(elisp)f(\014les,)g(but)f(don't)g(w)o(an)o(t)f(to)g(install)i(them,)f
-(y)o(ou)g(can)g(t)o(yp)q(e)90 2670 y(`)p Fl(make)p Fo(')h(without)h
-(parameters.)p eop
-%%Page: 2 4
-2 3 bop 0 -58 a Fo(Chapter)15 b(1:)k(Installation)1470
-b(2)25 183 y(5.)29 b(Edit)11 b(the)f(\014le)h(`)p Fl(default.el)p
-Fo(')d(in)j(y)o(our)f(emacs)g(lisp)h(directory)g(\(usually)g(`)p
-Fl(/usr/gnu/lib/emacs/si)o(te-lisp)p Fo(')p 2009 195
-21 46 v 90 246 a(or)j(something)i(similar\))g(and)f(en)o(ter)g(the)g
-(con)o(ten)o(ts)f(of)h(the)g(\014le)h(`)p Fl(pcl-cvs-startup.el)p
-Fo(')c(in)o(to)j(it.)20 b(It)15 b(con-)90 308 y(tains)g(a)g(couple)i
-(of)d Fl(auto-load)p Fo(s)g(that)h(facilitates)h(the)f(use)h(of)e(p)q
-(cl-cvs.)0 532 y Fk(1.2)33 b(Installation)16 b(of)f(the)g(on-line)i
-(man)n(ual.)25 669 y Fo(1.)29 b(Create)e(the)h(info)h(\014le\(s\))f(`)p
-Fl(pcl-cvs.info*)p Fo(')d(from)i(`)p Fl(pcl-cvs.texinfo)p
-Fo(')e(b)o(y)j(t)o(yping)g(`)p Fl(make)14 b(info)p Fo('.)90
-731 y(If)27 b(y)o(ou)g(don't)f(ha)o(v)o(e)g(the)h(program)f(`)p
-Fl(makeinfo)p Fo(')f(y)o(ou)i(can)g(get)f(it)h(b)o(y)g(anon)o(ymous)f
-(ftp)h(from)f(e.g.)90 793 y(`)p Fl(prep.ai.mit.edu)p
-Fo(')12 b(as)i(`)p Fl(pub/gnu/texinfo-3.7.tar.g)o(z)p
-Fo(')e(\(there)i(migh)o(t)h(b)q(e)g(a)f(new)o(er)h(v)o(ersion)g(there)
-90 856 y(when)h(y)o(ou)f(read)g(this\).)25 930 y(2.)29
-b(Install)14 b(the)e(info)h(\014le\(s\))g(`)p Fl(pcl-cvs.info*)p
-Fo(')c(in)o(to)k(y)o(our)f(standard)g(`)p Fl(info)p Fo(')f(directory)l
-(.)19 b(Y)l(ou)13 b(should)g(b)q(e)g(able)90 993 y(to)i(do)g(this)g(b)o
-(y)g(t)o(yping)h(`)p Fl(make)e(install-info)p Fo('.)25
-1067 y(3.)29 b(Edit)18 b(the)g(\014le)g(`)p Fl(dir)p
-Fo(')f(in)h(the)g(`)p Fl(info)p Fo(')e(directory)i(and)g(en)o(ter)f
-(one)h(line)h(to)e(con)o(tain)h(a)f(p)q(oin)o(ter)h(to)f(the)h(info)90
-1130 y(\014le\(s\))e(`)p Fl(pcl-cvs.info*)p Fo('.)h(The)e(line)i(can,)e
-(for)g(instance,)g(lo)q(ok)h(lik)o(e)g(this:)210 1194
-y Fl(*)24 b(Pcl-cvs:)e(\(pcl-cvs\).)262 b(An)23 b(Emacs)g(front-end)g
-(to)h(CVS.)0 1418 y Fk(1.3)33 b(Ho)n(w)14 b(to)h(mak)n(e)g(t)n(yp)r
-(eset)g(do)r(cumen)n(tation)h(from)f(p)r(cl-cvs.texinfo)62
-1555 y Fo(If)e(y)o(ou)g(ha)o(v)o(e)g(T)317 1565 y(E)342
-1555 y(X)g(installed)i(at)d(y)o(our)h(site,)g(y)o(ou)g(can)g(mak)o(e)f
-(a)h(t)o(yp)q(eset)g(man)o(ual)g(from)f(`)p Fl(pcl-cvs.texinfo)p
-Fo('.)25 1692 y(1.)29 b(Run)19 b(T)217 1702 y(E)243 1692
-y(X)f(b)o(y)h(t)o(yping)f(\\)p Fl(make)d(pcl-cvs.dvi)p
-Fo(''.)27 b(Y)l(ou)18 b(will)i(not)e(get)g(the)h(indices)h(unless)g(y)o
-(ou)e(ha)o(v)o(e)g(the)90 1754 y Fl(texindex)c Fo(program.)25
-1829 y(2.)29 b(Con)o(v)o(ert)14 b(the)h(resulting)h(device)g(indep)q
-(enden)o(t)i(\014le)e(`)p Fl(pcl-cvs.dvi)p Fo(')c(to)j(a)f(form)g(whic)
-o(h)i(y)o(our)f(prin)o(ter)g(can)90 1891 y(output)h(and)g(prin)o(t)g
-(it.)23 b(If)16 b(y)o(ou)g(ha)o(v)o(e)g(a)f(p)q(ostscript)i(prin)o(ter)
-f(there)g(is)h(a)e(program,)g Fl(dvi2ps)p Fo(,)g(whic)o(h)i(do)q(es.)90
-1954 y(There)e(is)h(also)f(a)g(program)f(whic)o(h)i(comes)f(together)g
-(with)g(T)1150 1963 y(E)1176 1954 y(X,)g Fl(dvips)p Fo(,)f(whic)o(h)i
-(y)o(ou)f(can)g(use.)p eop
-%%Page: 3 5
-3 4 bop 0 -58 a Fo(Chapter)15 b(2:)k(Ab)q(out)d(p)q(cl-cvs)1418
-b(3)0 183 y Fm(2)41 b(Ab)r(out)15 b(p)r(cl-cvs)62 390
-y Fo(Pcl-cvs)i(is)e(a)g(fron)o(t-end)h(to)e(CVS)i(v)o(ersions)f(1.5)g
-(through)g(1.7)f(and)h(new)o(er;)g(and)h(p)q(ossibly)h(v)o(erison)e
-(1.3)g(and)0 452 y(1.4A2.)k(It)c(in)o(tegrates)g(the)g(most)f(frequen)o
-(tly)i(used)g(CVS)f(commands)g(in)o(to)g(an)h(emacs)f(in)o(terface.)0
-713 y Fk(2.1)33 b(Con)n(tributors)16 b(to)f(p)r(cl-cvs)62
-854 y Fo(Con)o(tributions)j(to)f(the)g(pac)o(k)m(age)h(are)f(w)o
-(elcome.)27 b(I)18 b(ha)o(v)o(e)f(limited)i(time)f(to)e(w)o(ork)h(on)g
-(this)h(pro)s(ject,)f(but)h(I)0 916 y(will)d(gladly)f(add)g(an)o(y)f
-(co)q(de)g(that)g(y)o(ou)g(con)o(tribute)h(to)e(me)i(to)e(this)i(pac)o
-(k)m(age)f(\(see)h(Chapter)f(8)f([Bugs],)h(page)g(22\).)62
-1057 y(The)j(follo)o(wing)g(p)q(ersons)f(ha)o(v)o(e)g(made)g(con)o
-(tributions)h(to)f(p)q(cl-cvs.)37 1198 y Fn(\017)30 b
-Fo(Brian)16 b(Berliner)h(wrote)e(CVS,)g(together)f(with)i(some)f(other)
-g(con)o(tributors.)21 b(Without)15 b(his)h(w)o(ork)e(on)i(CVS)90
-1260 y(this)g(pac)o(k)m(age)f(w)o(ould)g(b)q(e)h(useless)p
-Fi(:)8 b(:)g(:)37 1339 y Fn(\017)30 b Fo(P)o(er)19 b(Cederqvist)h
-(wrote)f(most)f(of)h(the)h(otherwise)f(unattributed)h(functions)g(in)h
-(p)q(cl-cvs)g(as)e(w)o(ell)h(as)f(all)90 1401 y(do)q(cumen)o(tation.)37
-1480 y Fn(\017)30 b Fo(Inge)23 b(W)l(allin)h(\(`)p Fl
-(inge@lysator.liu.se)p Fo(')o(\))19 b(wrote)j(the)g(sk)o(eleton)h(to)e
-(`)p Fl(pcl-cvs.texinfo)p Fo(',)g(and)i(ga)o(v)o(e)90
-1542 y(useful)c(commen)o(ts)f(on)g(it.)29 b(He)19 b(also)f(wrote)f(the)
-h(\014les)h(`)p Fl(elib-node.el)p Fo(')d(and)j(`)p Fl(compile-all.el)p
-Fo('.)26 b(The)90 1604 y(\014le)16 b(`)p Fl(cookie.el)p
-Fo(')d(w)o(as)i(inspired)i(b)o(y)e(Inge.)37 1683 y Fn(\017)30
-b Fo(Lin)o(us)13 b(T)l(olk)o(e)g(\(`)p Fl(linus@lysator.liu.se)o
-Fo('\))c(con)o(tributed)k(useful)g(commen)o(ts)f(on)g(b)q(oth)g(the)h
-(functionalit)o(y)90 1745 y(and)i(the)h(do)q(cumen)o(tation.)37
-1824 y Fn(\017)30 b Fo(Jamie)16 b(Za)o(winski)g(\(`)p
-Fl(jwz@lucid.com)p Fo('\))c(con)o(tributed)j(`)p Fl(pcl-cvs-lucid.el)p
-Fo('.)37 1903 y Fn(\017)30 b Fo(Leif)12 b(Lonn)o(blad)g(con)o(tributed)
-g(R)o(CVS)f(supp)q(ort.)18 b(\(Since)12 b(sup)q(erceded)h(b)o(y)e(the)g
-(new)g(remote)g(CVS)g(supp)q(ort.\))37 1981 y Fn(\017)30
-b Fo(Jim)20 b(Blandy)f(\(`)p Fl(jimb@cyclic.com)p Fo('\))c(con)o
-(tributed)20 b(ho)q(oks)e(to)g(automatically)h(guess)g(CVS)g(log)g(en)o
-(tries)90 2044 y(from)12 b(ChangeLog)h(con)o(ten)o(ts;)g(and)g(initial)
-i(supp)q(ort)f(of)e(the)i(new)f(Cygn)o(us)g(/)f(Cyclic)j(remote)d(CVS;)
-h(as)g(w)o(ell)90 2106 y(as)i(v)m(arious)g(sundry)h(bug)g(\014xes)f
-(and)g(clean)o(ups.)37 2185 y Fn(\017)30 b Fo(Jim)16
-b(Kingdon)g(\(`)p Fl(kingdon@cyclic.com)p Fo('\))c(con)o(tributed)j
-(lots)g(of)g(\014xes)h(to)e(the)h(build)i(and)f(install)g(pro)q(ce-)90
-2247 y(dure.)37 2326 y Fn(\017)30 b Fo(Greg)17 b(A.)g(W)l(o)q(o)q(ds)g
-(\(`)p Fl(woods@planix.com)p Fo('\))d(con)o(tributed)k(co)q(de)g(to)f
-(implemen)o(t)h(the)g(use)g(of)f(p)q(er-\014le)i(di\013)90
-2388 y(bu\013ers;)14 b(and)g(v)o(endor)g(join)g(di\013s)g(with)h
-(emerge)e(and)h(edi\013;)h(as)f(w)o(ell)g(as)g(v)m(arious)g(an)g
-(sundry)g(bug)h(\014xes)f(and)90 2450 y(clean)o(ups.)62
-2608 y(Apart)k(from)g(these,)h(a)f(lot)h(of)f(p)q(eople)i(ha)o(v)o(e)e
-(send)h(me)g(suggestions,)f(ideas,)i(requests,)f(bug)g(rep)q(orts)f
-(and)0 2670 y(encouragemen)o(t.)i(Thanks)15 b(a)g(lot!)20
-b(Without)15 b(y)o(our)f(there)i(w)o(ould)f(b)q(e)h(no)f(new)h
-(releases)f(of)g(p)q(cl-cvs.)p eop
-%%Page: 4 6
-4 5 bop 0 -58 a Fo(Chapter)15 b(2:)k(Ab)q(out)d(p)q(cl-cvs)1418
-b(4)0 183 y Fk(2.2)33 b(Where)15 b(can)g(I)h(get)e(p)r(cl-cvs?)62
-320 y Fo(The)i(curren)o(t)f(release)h(of)e(p)q(cl-cvs)j(is)f(included)i
-(in)e(CVS-1.7.)62 457 y(The)i(author's)f(release)i(of)e(p)q(cl-cvs)i
-(can)f(b)q(e)h(fetc)o(hed)f(via)g(anon)o(ymous)f(ftp)h(from)f
-Fl(ftp.lysator.liu.se)p Fo(,)0 519 y(\(IP)i(no.)30 b(130.236.254.1\))15
-b(in)20 b(the)f(directory)g Fl(pub/emacs)p Fo(.)29 b(If)19
-b(y)o(ou)f(don't)h(liv)o(e)h(in)f(Scandina)o(via)h(y)o(ou)f(should)0
-582 y(probably)d(c)o(hec)o(k)f(with)h(arc)o(hie)f(to)g(see)h(if)f
-(there)g(is)h(a)f(site)h(closer)f(to)g(y)o(ou)g(that)f(arc)o(hiv)o(es)i
-(p)q(cl-cvs.)62 719 y(New)h(releases)g(will)h(b)q(e)f(announced)h(to)e
-(appropriate)h(newsgroups.)23 b(If)17 b(y)o(ou)f(send)h(y)o(our)f
-(email)i(address)f(to)0 781 y(me)e(I)h(will)h(add)e(y)o(ou)g(to)f(m)o
-(y)h(list)h(of)f(p)q(eople)i(to)d(mail)i(when)g(I)f(mak)o(e)g(a)g(new)g
-(release.)p eop
-%%Page: 5 7
-5 6 bop 0 -58 a Fo(Chapter)15 b(3:)k(Getting)c(started)1388
-b(5)0 183 y Fm(3)41 b(Getting)15 b(started)62 410 y Fo(This)k(do)q
-(cumen)o(t)f(assumes)f(that)g(y)o(ou)g(kno)o(w)g(what)h(CVS)f(is,)i
-(and)f(that)f(y)o(ou)g(at)g(least)h(kno)o(ws)f(the)g(funda-)0
-472 y(men)o(tal)e(concepts)h(of)f(CVS.)g(If)g(that)g(is)g(not)g(the)g
-(case)h(y)o(ou)e(should)j(read)e(the)g(man)g(page)g(for)g(CVS.)62
-617 y(Pcl-cvs)k(is)f(only)g(useful)g(once)g(y)o(ou)f(ha)o(v)o(e)h(c)o
-(hec)o(k)o(ed)g(out)f(a)g(mo)q(dule.)28 b(So)17 b(b)q(efore)h(y)o(ou)f
-(in)o(v)o(ok)o(e)h(it)f(y)o(ou)h(m)o(ust)0 679 y(ha)o(v)o(e)d(a)g(cop)o
-(y)g(of)g(a)f(mo)q(dule)j(somewhere)e(in)h(the)f(\014le)h(system.)62
-824 y(Y)l(ou)h(in)o(v)o(ok)o(e)g(p)q(cl-cvs)i(b)o(y)e(t)o(yping)g
-Fl(M-x)d(cvs-update)g(RET)p Fo(.)25 b(If)17 b(y)o(our)f(emacs)h(resp)q
-(onds)h(with)f(`)p Fl([No)d(match])p Fo(')0 887 y(y)o(our)f(system)h
-(administrator)g(has)g(not)f(installed)j(p)q(cl-cvs)g(prop)q(erly)l(.)k
-(T)l(ry)14 b Fl(M-x)h(load-library)e(RET)i(pcl-cvs)0
-949 y(RET)p Fo(.)k(If)14 b(that)f(also)h(fails)h(-)f(talk)f(to)h(y)o
-(our)f(ro)q(ot.)19 b(If)14 b(it)g(succeeds)h(y)o(ou)e(migh)o(t)h(put)g
-(this)g(line)i(in)e(y)o(our)g(`)p Fl(.emacs)p Fo(')e(\014le)0
-1011 y(so)j(that)f(y)o(ou)h(don't)g(ha)o(v)o(e)g(to)f(t)o(yp)q(e)h(the)
-h(`)p Fl(load-library)p Fo(')d(command)i(ev)o(ery)g(time)g(y)o(ou)g
-(wish)h(to)e(use)i(p)q(cl-cvs:)120 1146 y Fl(\(autoload)23
-b('cvs-update)f("pcl-cvs")h(nil)g(t\))62 1291 y Fo(The)18
-b(function)h Fl(cvs-update)d Fo(will)k(ask)d(for)h(a)f(directory)l(.)28
-b(The)18 b(command)g(`)p Fl(cvs)c(update)p Fo(')j(will)j(b)q(e)e(run)g
-(in)0 1353 y(that)11 b(directory)l(.)20 b(\(It)11 b(should)i(con)o
-(tain)f(\014les)h(that)f(ha)o(v)o(e)f(b)q(een)i(c)o(hec)o(k)o(ed)g(out)
-e(from)g(a)h(CVS)g(arc)o(hiv)o(e.\))19 b(The)12 b(output)0
-1415 y(from)g Fl(cvs)h Fo(will)h(b)q(e)g(parsed)f(and)g(presen)o(ted)g
-(in)h(a)e(table)i(in)f(a)g(bu\013er)g(called)h(`)p Fl(*cvs*)p
-Fo('.)k(It)13 b(migh)o(t)g(lo)q(ok)g(something)0 1478
-y(lik)o(e)j(this:)120 1612 y Fl(PCL-CVS)23 b(release)g(1.05-CVS-$Name:)
-45 b($.)120 1716 y(In)24 b(directory)e(/users/ceder/FOO/test:)168
-1768 y(Updated)118 b(bar)168 1820 y(Updated)g(file.txt)168
-1872 y(Modified)22 b(ci)i(namechange)168 1923 y(Updated)118
-b(newer)120 2027 y(In)24 b(directory)e(/users/ceder/FOO/test/sub:)168
-2079 y(Modified)g(ci)i(ChangeLog)120 2131 y(----------)e(End)i(-----)62
-2276 y Fo(In)18 b(this)f(example)h(the)f(t)o(w)o(o)f(\014les)h(\(`)p
-Fl(bar)p Fo(',)f(`)p Fl(file.txt)p Fo(',)f(and)i(`)p
-Fl(newer)p Fo('\))e(that)h(are)h(mark)o(ed)f(with)i(`)p
-Fl(Updated)p Fo(')0 2338 y(ha)o(v)o(e)d(b)q(een)h(copied)g(from)e(the)h
-(CVS)h(rep)q(ository)f(to)f(`)p Fl(/users/ceder/FOO/test/)p
-Fo(')d(since)16 b(someone)f(else)h(ha)o(v)o(e)0 2401
-y(c)o(hec)o(k)o(ed)23 b(in)g(new)o(er)f(v)o(ersions)g(of)g(them.)41
-b(Tw)o(o)21 b(\014les)j(\(`)p Fl(namechange)p Fo(')19
-b(and)k(`)p Fl(sub/ChangeLog)p Fo('\))c(ha)o(v)o(e)j(b)q(een)0
-2463 y(mo)q(di\014ed)17 b(lo)q(cally)l(,)f(and)g(needs)g(to)e(b)q(e)i
-(c)o(hec)o(k)o(ed)g(in.)62 2608 y(Y)l(ou)g(can)g(mo)o(v)o(e)e(the)i
-(cursor)f(up)h(and)g(do)o(wn)f(in)h(the)g(bu\013er)g(with)f
-Fl(C-n)g Fo(and)h Fl(C-p)f Fo(or)g Fl(n)h Fo(and)f Fl(p)p
-Fo(.)21 b(If)16 b(y)o(ou)f(press)0 2670 y Fl(c)g Fo(on)h(one)f(of)g
-(the)h(`)p Fl(Modified)p Fo(')d(\014les)k(that)d(\014le)j(will)g(b)q(e)
-f(c)o(hec)o(k)o(ed)g(in)g(to)f(the)g(CVS)h(rep)q(ository)l(.)21
-b(See)16 b(Section)g(5.4)p eop
-%%Page: 6 8
-6 7 bop 0 -58 a Fo(Chapter)15 b(3:)k(Getting)c(started)1388
-b(6)0 183 y([Committing)17 b(c)o(hanges],)g(page)g(11.)26
-b(Y)l(ou)18 b(can)g(press)f Fl(x)g Fo(to)g(get)g(rid)h(of)f(the)h
-Fl(")p Fo(unin)o(teresting)p Fl(")g Fo(\014les)h(that)d(ha)o(v)o(e)0
-246 y(only)g(b)q(een)g(`)p Fl(Updated)p Fo(')e(\(and)h(don't)f(require)
-i(an)o(y)f(further)g(action)h(from)e(y)o(ou\).)62 382
-y(Y)l(ou)f(can)g(also)g(easily)h(get)f(a)f(`)p Fl(diff)p
-Fo(')g(b)q(et)o(w)o(een)h(y)o(our)g(mo)q(di\014ed)h(\014le)g(and)f(the)
-g(base)g(v)o(ersion)g(that)f(y)o(ou)h(started)0 445 y(from,)18
-b(and)h(y)o(ou)g(can)g(get)f(the)h(output)f(from)g(`)p
-Fl(cvs)c(log)p Fo(')k(and)h(`)p Fl(cvs)c(status)p Fo(')i(on)i(the)f
-(listed)i(\014les)g(simply)g(b)o(y)0 507 y(pressing)c(a)f(k)o(ey)g
-(\(see)g(Section)h(5.6)e([Getting)h(info)h(ab)q(out)f(\014les],)g(page)
-g(12\).)p eop
-%%Page: 7 9
-7 8 bop 0 -58 a Fo(Chapter)15 b(4:)k(Bu\013er)d(con)o(ten)o(ts)1392
-b(7)0 183 y Fm(4)41 b(Bu\013er)15 b(con)n(ten)n(ts)62
-379 y Fo(The)h(displa)o(y)g(con)o(tains)f(four)g(columns.)21
-b(They)15 b(con)o(tain,)g(from)g(left)g(to)g(righ)o(t:)37
-518 y Fn(\017)30 b Fo(An)15 b(asterisk)h(when)f(the)h(\014le)g(is)f
-Fh(mark)o(ed)i Fo(\(see)e(Section)h(4.2)e([Selected)j(\014les],)e(page)
-g(8\).)37 595 y Fn(\017)30 b Fo(The)15 b(status)g(of)g(the)g(\014le.)21
-b(See)16 b(See)f(Section)h(4.1)f([File)h(status],)d(page)i(7,)g(for)f
-(more)h(information.)37 672 y Fn(\017)30 b Fo(A)15 b
-Fl(")p Fo(need)h(to)f(b)q(e)h(c)o(hec)o(k)o(ed)f(in)p
-Fl(")p Fo(-mark)o(er)g(\(`)p Fl(ci)p Fo('\).)37 748 y
-Fn(\017)30 b Fo(The)15 b(\014le)i(name.)0 989 y Fk(4.1)33
-b(File)16 b(status)62 1128 y Fo(The)g(`)p Fl(file)e(status)p
-Fo(')g(\014eld)i(can)g(ha)o(v)o(e)f(the)g(follo)o(wing)h(v)m(alues:)0
-1281 y(`)p Fl(Updated)p Fo(')46 b(The)18 b(\014le)g(w)o(as)f(brough)o
-(t)g(up)h(to)f(date)g(with)h(resp)q(ect)g(to)f(the)h(rep)q(ository)l(.)
-27 b(This)18 b(is)g(done)g(for)f(an)o(y)240 1344 y(\014le)g(that)f
-(exists)g(in)h(the)f(rep)q(ository)g(but)g(not)g(in)h(y)o(our)f
-(source,)g(and)g(for)g(\014les)h(that)e(y)o(ou)h(ha)o(v)o(en't)240
-1406 y(c)o(hanged)g(but)f(are)g(not)g(the)g(most)f(recen)o(t)h(v)o
-(ersions)h(a)o(v)m(ailable)h(in)f(the)f(rep)q(ository)l(.)0
-1497 y(`)p Fl(Patched)p Fo(')46 b(The)14 b(\014le)h(w)o(as)e(brough)o
-(t)h(up)g(to)f(date)h(with)g(resp)q(ect)h(to)e(a)h(remote)f(rep)q
-(ository)h(b)o(y)g(w)o(a)o(y)f(of)g(fetc)o(hing)240 1559
-y(and)h(applying)g(a)f(patc)o(h)g(to)g(the)h(\014le)g(in)g(y)o(our)f
-(source.)19 b(This)14 b(is)g(done)g(for)e(an)o(y)h(\014le)i(that)d
-(exists)i(in)g(a)240 1621 y(remote)h(rep)q(ository)g(and)h(in)g(y)o
-(our)f(source;)h(of)f(whic)o(h)h(y)o(ou)f(ha)o(v)o(en't)g(c)o(hanged)h
-(lo)q(cally)h(but)e(is)h(not)240 1684 y(the)f(most)g(recen)o(t)g(v)o
-(ersion)g(a)o(v)m(ailable)i(in)f(the)f(remote)g(rep)q(ository)l(.)0
-1775 y(`)p Fl(Modified)p Fo(')240 1837 y(The)k(\014le)g(is)g(mo)q
-(di\014ed)h(in)f(y)o(our)f(w)o(orking)g(directory)l(,)h(and)g(there)g
-(w)o(as)e(no)h(mo)q(di\014cation)i(to)e(the)240 1899
-y(same)d(\014le)h(in)g(the)f(rep)q(ository)l(.)0 1990
-y(`)p Fl(Merged)p Fo(')70 b(The)21 b(\014le)h(is)g(mo)q(di\014ed)g(in)g
-(y)o(our)e(w)o(orking)h(directory)l(,)h(and)f(there)g(w)o(ere)g(mo)q
-(di\014cations)h(in)g(the)240 2052 y(rep)q(ository)15
-b(as)f(w)o(ell)h(as)f(in)i(y)o(our)e(cop)o(y)l(,)g(but)h(they)g(w)o
-(ere)f(merged)g(successfully)l(,)j(without)d(con\015ict,)240
-2115 y(in)i(y)o(our)f(w)o(orking)g(directory)l(.)0 2205
-y(`)p Fl(Conflict)p Fo(')240 2268 y(A)i(con\015ict)g(w)o(as)f(detected)
-i(while)g(trying)f(to)f(merge)g(y)o(our)h(c)o(hanges)f(to)h
-Fh(\014le)j Fo(with)d(c)o(hanges)g(from)240 2330 y(the)h(source)g(rep)q
-(ository)l(.)28 b Fh(\014le)21 b Fo(\(the)d(cop)o(y)f(in)i(y)o(our)e(w)
-o(orking)h(directory\))f(is)i(no)o(w)e(the)h(output)f(of)240
-2392 y(the)g(`)p Fl(rcsmerge)p Fo(')e(command)i(on)g(the)g(t)o(w)o(o)e
-(v)o(ersions;)j(an)f(unmo)q(di\014ed)i(cop)o(y)e(of)f(y)o(our)h(\014le)
-h(is)f(also)240 2455 y(in)j(y)o(our)f(w)o(orking)h(directory)l(,)g
-(with)g(the)g(name)f(`)p Fl(.#)p Fh(\014le)p Fl(.)p Fh(v)o(ersion)p
-Fo(',)i(where)e Fh(v)o(ersion)h Fo(is)g(the)g(R)o(CS)240
-2517 y(revision)g(that)e(y)o(our)g(mo)q(di\014ed)i(\014le)g(started)e
-(from.)29 b(See)20 b(Section)f(5.11)f([Viewing)i(di\013erences],)240
-2579 y(page)15 b(14,)f(for)h(more)g(details.)0 2670 y(`)p
-Fl(Added)p Fo(')94 b(The)15 b(\014le)i(has)e(b)q(een)h(added)g(b)o(y)f
-(y)o(ou,)g(but)g(it)g(still)i(needs)f(to)e(b)q(e)i(c)o(hec)o(k)o(ed)g
-(in)g(to)f(the)g(rep)q(ository)l(.)p eop
-%%Page: 8 10
-8 9 bop 0 -58 a Fo(Chapter)15 b(4:)k(Bu\013er)d(con)o(ten)o(ts)1392
-b(8)0 183 y(`)p Fl(Removed)p Fo(')46 b(The)14 b(\014le)h(has)f(b)q(een)
-h(remo)o(v)o(ed)f(b)o(y)g(y)o(ou,)g(but)g(it)g(needs)h(to)e(b)q(e)i(c)o
-(hec)o(k)o(ed)g(in)g(to)e(the)h(rep)q(ository)l(.)20
-b(Y)l(ou)240 246 y(can)15 b(resurrect)g(it)h(b)o(y)f(t)o(yping)g
-Fl(a)g Fo(\(see)h(Section)g(5.7)e([Adding)i(and)f(remo)o(ving)g
-(\014les],)h(page)f(13\).)0 334 y(`)p Fl(Unknown)p Fo(')46
-b(A)16 b(\014le)i(that)d(w)o(as)h(detected)h(in)g(y)o(our)f(directory)l
-(,)h(but)f(that)g(neither)h(app)q(ears)g(in)g(the)f(rep)q(ository)l(,)
-240 396 y(nor)f(is)h(presen)o(t)f(on)g(the)g(list)h(of)f(\014les)h
-(that)f(CVS)g(should)h(ignore.)62 547 y(There)g(are)f(also)g(a)g(few)g
-(sp)q(ecial)i(cases,)d(that)h(rarely)g(o)q(ccur,)g(whic)o(h)i(ha)o(v)o
-(e)d(longer)i(strings)f(in)h(the)f(\014elds:)0 698 y(`)p
-Fl(Removed)f(from)g(repository)p Fo(')240 760 y(The)h(\014le)h(has)f(b)
-q(een)i(remo)o(v)o(ed)d(from)h(y)o(our)f(directory)h(since)i(someone)e
-(has)g(remo)o(v)o(ed)f(it)i(from)e(the)240 823 y(rep)q(ository)l(.)19
-b(\(It)12 b(is)g(still)h(presen)o(t)f(in)h(the)f(A)o(ttic)g(directory)l
-(,)h(so)e(no)h(p)q(ermanen)o(t)g(loss)g(has)g(o)q(ccurred\).)240
-885 y(This,)j(unlik)o(e)i(the)f(other)e(en)o(tries)i(in)g(this)g
-(table,)f(is)h(not)e(an)i(error)e(condition.)0 974 y(`)p
-Fl(Removed)g(from)g(repository,)g(changed)g(by)h(you)p
-Fo(')240 1036 y(Y)l(ou)20 b(ha)o(v)o(e)g(mo)q(di\014ed)h(a)f(\014le)h
-(that)e(someone)h(ha)o(v)o(e)g(remo)o(v)o(ed)g(from)f(the)h(rep)q
-(ository)l(.)35 b(Y)l(ou)20 b(can)240 1098 y(correct)d(this)h
-(situation)g(b)o(y)f(remo)o(ving)g(the)h(\014le)g(man)o(ually)g(\(see)f
-(see)h(Section)g(5.7)f([Adding)h(and)240 1160 y(remo)o(ving)d
-(\014les],)h(page)f(13\).)0 1249 y(`)p Fl(Removed)f(by)h(you,)f
-(changed)g(in)h(repository)p Fo(')240 1311 y(Y)l(ou)g(ha)o(v)o(e)f
-(remo)o(v)o(ed)f(a)i(\014le,)g(and)f(b)q(efore)h(y)o(ou)f(committed)h
-(the)f(remo)o(v)m(al)h(someone)f(committed)g(a)240 1374
-y(c)o(hange)j(to)f(that)g(\014le.)26 b(Y)l(ou)18 b(could)f(use)h
-Fl(a)e Fo(to)h(resurrect)f(the)h(\014le)h(\(see)f(see)g(Section)h(5.7)e
-([Adding)240 1436 y(and)f(remo)o(ving)g(\014les],)h(page)f(13\).)0
-1524 y(`)p Fl(Move)f(away)h Fh(\014le)k Fl(-)c(it)g(is)f(in)h(the)g
-(way)p Fo(')240 1587 y(F)l(or)g(some)f(reason)h(CVS)h(do)q(es)f(not)g
-(lik)o(e)h(the)g(\014le)g Fh(\014le)p Fo(.)21 b(Rename)16
-b(or)e(remo)o(v)o(e)h(it.)0 1675 y(`)p Fl(This)f(repository)g(is)h
-(missing!)f(Remove)g(this)h(dir)g(manually.)p Fo(')240
-1738 y(It)h(is)g(imp)q(ossible)i(to)d(remo)o(v)o(e)g(a)h(directory)g
-(in)h(the)e(CVS)h(rep)q(ository)g(in)h(a)e(clean)i(w)o(a)o(y)l(.)k
-(Someone)240 1800 y(ha)o(v)o(e)15 b(tried)g(to)g(remo)o(v)o(e)f(one,)h
-(and)g(CVS)g(gets)g(confused.)21 b(Remo)o(v)o(e)15 b(y)o(our)f(cop)o(y)
-h(of)g(the)g(directory)l(.)0 2031 y Fk(4.2)33 b(Selected)15
-b(\014les)62 2168 y Fo(Man)o(y)g(of)g(the)g(commands)g(w)o(orks)f(on)h
-(the)g(curren)o(t)h(set)e(of)h Fh(selected)j Fo(\014les.)37
-2306 y Fn(\017)30 b Fo(If)15 b(there)h(are)f(an)o(y)f(\014les)j(that)d
-(are)h(mark)o(ed)g(they)g(constitute)g(the)h(set)f(of)f(selected)j
-(\014les.)37 2381 y Fn(\017)30 b Fo(Otherwise,)16 b(if)f(the)h(cursor)e
-(p)q(oin)o(ts)i(to)f(a)g(\014le,)g(that)g(\014le)h(is)g(the)f(selected)
-i(\014le.)37 2457 y Fn(\017)30 b Fo(Otherwise,)15 b(if)f(the)h(cursor)f
-(p)q(oin)o(ts)g(to)g(a)f(directory)l(,)i(all)g(the)f(\014les)h(in)g
-(that)f(directory)g(that)g(app)q(ears)g(in)h(the)90 2519
-y(bu\013er)g(are)g(the)g(selected)i(\014les.)62 2670
-y(This)f(sc)o(heme)g(migh)o(t)f(seem)g(a)g(little)h(complicated,)h(but)
-e(once)h(one)f(get)g(used)g(to)g(it,)g(it)g(is)h(quite)g(p)q(o)o(w)o
-(erful.)p eop
-%%Page: 9 11
-9 10 bop 0 -58 a Fo(Chapter)15 b(4:)k(Bu\013er)d(con)o(ten)o(ts)1392
-b(9)62 183 y(See)16 b(Section)g(5.3)e([Marking)h(\014les],)g(page)g(11)
-g(tells)h(ho)o(w)f(y)o(ou)g(mark)f(and)i(unmark)f(\014les.)p
-eop
-%%Page: 10 12
-10 11 bop 0 -58 a Fo(Chapter)15 b(5:)k(Commands)1450
-b(10)0 183 y Fm(5)41 b(Commands)62 386 y Fo(This)16 b(c)o(hapter)f
-(describ)q(es)i(all)f(the)f(commands)g(that)g(y)o(ou)g(can)g(use)g(in)i
-(p)q(cl-cvs.)0 640 y Fk(5.1)33 b(Up)r(dating)15 b(the)h(directory)0
-796 y Fl(M-x)f(cvs-update)240 858 y Fo(Run)j(a)e(`)p
-Fl(cvs)f(update)p Fo(')g(command.)25 b(Y)l(ou)17 b(will)h(b)q(e)g(ask)o
-(ed)e(for)h(the)g(directory)g(in)g(whic)o(h)h(the)f(`)p
-Fl(cvs)240 921 y(update)p Fo(')f(will)j(b)q(e)f(run.)27
-b(The)18 b(output)f(will)i(b)q(e)g(parsed)e(b)o(y)h(p)q(cl-cvs,)h(and)e
-(the)h(result)g(prin)o(ted)g(in)240 983 y(the)e(`)p Fl(*cvs*)p
-Fo(')e(bu\013er)i(\(see)g(see)g(Chapter)f(4)h([Bu\013er)f(con)o(ten)o
-(ts],)g(page)g(7)h(for)f(a)g(description)j(of)d(the)240
-1045 y(con)o(ten)o(ts\).)240 1123 y(By)j(default,)g(`)p
-Fl(cvs-update)p Fo(')e(will)j(descend)g(recursiv)o(ely)g(in)o(to)f(sub)
-q(directories.)29 b(Y)l(ou)18 b(can)g(a)o(v)o(oid)240
-1185 y(that)f(b)q(eha)o(vior)h(b)o(y)f(giving)h(a)f(pre\014x)h(argumen)
-o(t)f(to)g(it)g(\(e.g.,)g(b)o(y)g(t)o(yping)h Fl(C-u)d(M-x)f
-(cvs-update)240 1248 y(RET)p Fo(\).)240 1326 y(All)21
-b(other)e(commands)g(in)i(p)q(cl-cvs)g(requires)f(that)f(y)o(ou)g(ha)o
-(v)o(e)g(a)g(`)p Fl(*cvs*)p Fo(')f(bu\013er.)33 b(This)20
-b(is)g(the)240 1388 y(command)15 b(that)g(y)o(ou)f(use)i(to)f(get)f
-(one.)240 1466 y(CVS)20 b(uses)g(lo)q(c)o(k)g(\014les)h(in)g(the)f(rep)
-q(ository)g(to)f(ensure)h(the)g(in)o(tegrit)o(y)g(of)f(the)h(data)f
-(\014les)i(in)g(the)240 1528 y(rep)q(ository)l(.)j(They)17
-b(migh)o(t)f(b)q(e)h(left)g(b)q(ehind)h(i.e.)24 b(if)17
-b(a)g(w)o(orkstation)e(crashes)h(in)h(the)g(middle)h(of)e(a)240
-1590 y(CVS)h(op)q(eration.)24 b(CVS)17 b(outputs)f(a)h(message)f(when)h
-(it)g(is)g(w)o(aiting)g(for)f(a)g(lo)q(c)o(k)h(\014le)h(to)e(go)g(a)o
-(w)o(a)o(y)l(.)240 1653 y(Pcl-cvs)22 b(will)h(sho)o(w)e(the)h(same)f
-(message)g(in)h(the)f(*cvs*)g(bu\013er,)i(together)d(with)i
-(instructions)240 1715 y(for)16 b(deleting)j(the)e(lo)q(c)o(k)g
-(\014les.)26 b(Y)l(ou)17 b(should)h(normally)g(not)e(ha)o(v)o(e)h(to)f
-(delete)i(them)f(man)o(ually)h(|)240 1777 y(just)f(w)o(ait)g(a)g
-(little)h(while)h(and)e(the)h(problem)f(should)i(\014x)e(itself.)27
-b(But)17 b(if)h(the)f(lo)q(c)o(k)h(\014les)g(do)q(esn't)240
-1840 y(disapp)q(ear)e(y)o(ou)f(can)g(delete)i(them)e(with)g
-Fl(M-x)g(cvs-delete-lock)e(RET)p Fo(.)0 1933 y Fl(g)216
-b Fo(This)14 b(will)g(run)f(`)p Fl(cvs)i(update)p Fo(')d(again.)19
-b(It)13 b(will)h(alw)o(a)o(ys)f(use)g(the)g(same)g(bu\013er)g(that)f(w)
-o(as)g(used)i(with)240 1996 y(the)i(previous)h(`)p Fl(cvs)d(update)p
-Fo('.)21 b(Giv)o(e)16 b(a)f(pre\014x)i(argumen)o(t)e(to)g(a)o(v)o(oid)g
-(descending)j(in)o(to)e(sub)q(direc-)240 2058 y(tories.)k(This)c(runs)f
-(the)g(command)g(`)p Fl(cvs-mode-update-no-prompt)p Fo(')o(.)0
-2152 y Fl(G)216 b Fo(This)18 b(will)g(run)f(`)p Fl(cvs)e(update)p
-Fo(')g(and)j(prompt)e(for)g(a)h(new)g(directory)g(to)g(up)q(date.)25
-b(This)18 b(runs)f(the)240 2214 y(command)e(`)p Fl(cvs-update)p
-Fo('.)0 2467 y Fk(5.2)33 b(Mo)n(v)n(emen)n(t)15 b(Commands)62
-2608 y Fo(Y)l(ou)f(can)g(use)g(most)f(normal)h(Emacs)g(commands)f(to)g
-(mo)o(v)o(e)g(forw)o(ard)g(and)h(bac)o(kw)o(ard)f(in)i(the)f(bu\013er.)
-19 b(Some)0 2670 y(k)o(eys)c(are)g(reb)q(ound)h(to)f(functions)h(that)e
-(tak)o(e)h(adv)m(an)o(tage)f(of)h(the)g(fact)g(that)f(the)i(bu\013er)f
-(is)h(a)e(p)q(cl-cvs)j(bu\013er:)p eop
-%%Page: 11 13
-11 12 bop 0 -58 a Fo(Chapter)15 b(5:)k(Commands)1450
-b(11)0 183 y Fl(SPC)0 246 y(C-n)0 308 y(n)216 b Fo(These)18
-b(k)o(eys)f(mo)o(v)o(e)g(the)g(cursor)g(one)h(\014le)g(forw)o(ard,)e
-(to)o(w)o(ards)g(the)h(end)i(of)d(the)i(bu\013er)f(\()p
-Fl(cookie-)240 370 y(next-cookie)p Fo(\).)0 453 y Fl(C-p)0
-516 y(p)216 b Fo(These)23 b(k)o(eys)f(mo)o(v)o(e)f(one)i(\014le)g(bac)o
-(kw)o(ard,)g(to)o(w)o(ards)e(the)h(b)q(eginning)j(of)d(the)g(bu\013er)g
-(\()p Fl(cookie-)240 578 y(previous-cookie)p Fo(\).)0
-795 y Fk(5.3)33 b(Marking)16 b(\014les)62 932 y Fo(Pcl-cvs)i(w)o(orks)e
-(on)g(a)h(set)f(of)g Fh(selected)i(\014les)i Fo(\(see)c(Section)i(4.2)e
-([Selected)h(\014les],)h(page)e(8\).)24 b(Y)l(ou)17 b(can)g(mark)0
-994 y(and)e(unmark)g(\014les)i(with)e(these)h(commands:)0
-1141 y Fl(m)216 b Fo(This)19 b(marks)e(the)h(\014le)h(that)e(the)h
-(cursor)g(is)g(p)q(ositioned)i(on.)28 b(If)18 b(the)g(cursor)f(is)i(p)q
-(ositioned)g(on)f(a)240 1204 y(directory)d(all)i(\014les)f(in)g(that)e
-(directory)i(will)h(b)q(e)e(mark)o(ed.)20 b(\()p Fl(cvs-mode-mark)p
-Fo(\).)0 1287 y Fl(u)216 b Fo(Unmark)13 b(the)h(\014le)h(that)d(the)i
-(cursor)f(is)h(p)q(ositioned)i(on.)j(If)14 b(the)f(cursor)h(is)g(on)f
-(a)g(directory)l(,)h(all)h(\014les)240 1349 y(in)h(that)f(directory)g
-(will)i(b)q(e)f(unmark)o(ed.)k(\()p Fl(cvs-mode-unmark)p
-Fo(\).)0 1433 y Fl(M)216 b Fo(Mark)14 b Fh(all)k Fo(\014les)e(in)g(the)
-g(bu\013er)f(\()p Fl(cvs-mode-mark-all-files)o Fo(\).)0
-1516 y Fl(ESC)g(DEL)81 b Fo(Unmark)15 b Fh(all)j Fo(\014les)e(\()p
-Fl(cvs-mode-unmark-all-file)o(s)p Fo(\).)0 1600 y Fl(DEL)168
-b Fo(Unmark)15 b(the)g(\014le)h(on)f(the)g(previous)g(line,)i(and)e(mo)
-o(v)o(e)f(p)q(oin)o(t)h(to)g(that)f(line)j(\()p Fl(cvs-mode-unmark-)240
-1662 y(up)p Fo(\).)0 1879 y Fk(5.4)33 b(Committing)16
-b(c)n(hanges)0 2026 y Fl(c)216 b Fo(All)17 b(\014les)g(that)f(ha)o(v)o
-(e)g(a)f Fl(")p Fo(need)i(to)f(b)q(e)g(c)o(hec)o(k)o(ed)h(in)p
-Fl(")p Fo(-mark)o(er)f(\(see)g(Chapter)g(4)g([Bu\013er)f(con)o(ten)o
-(ts],)240 2088 y(page)20 b(7\))g(can)h(b)q(e)g(c)o(hec)o(k)o(ed)g(in)g
-(with)g(the)g Fl(c)f Fo(command.)36 b(It)20 b(c)o(hec)o(ks)h(in)g(all)h
-(selected)g(\014les)f(\(see)240 2151 y(Section)c(4.2)f([Selected)i
-(\014les],)f(page)g(8\))f(\(except)g(those)h(who)f(lac)o(k)h(the)f
-Fl(")p Fo(ci)p Fl(")p Fo(-mark)o(er)h(-)g(they)f(are)240
-2213 y(ignored\).)k(Pressing)c Fl(c)f Fo(causes)g Fl(cvs-mode-commit)e
-Fo(to)i(b)q(e)h(run.)240 2286 y(When)f(y)o(ou)g(press)g
-Fl(c)g Fo(y)o(ou)f(will)j(get)d(a)h(bu\013er)g(called)h(`)p
-Fl(*cvs-commit-message*)p Fo('.)g(En)o(ter)f(the)g(log)240
-2348 y(message)f(for)g(the)h(\014le\(s\))g(in)h(it.)k(When)15
-b(y)o(ou)g(are)f(ready)h(y)o(ou)f(should)i(press)f Fl(C-c)g(C-c)f
-Fo(to)g(actually)240 2410 y(commit)h(the)g(\014les)i(\(using)e
-Fl(cvs-edit-done)p Fo(\).)240 2483 y(Normally)23 b(the)f(`)p
-Fl(*cvs-commit-message*)p Fo(')d(bu\013er)j(will)i(retain)e(the)g(log)h
-(message)e(from)h(the)240 2545 y(previous)g(commit,)g(but)g(if)f(the)h
-(v)m(ariable)g Fl(cvs-erase-input-buffer)d Fo(is)i(set)g(to)g(a)g(non-)
-p Fl(nil)240 2608 y Fo(v)m(alue)h(the)e(bu\013er)h(will)h(b)q(e)f
-(erased.)35 b(P)o(oin)o(t)20 b(and)h(mark)f(will)i(alw)o(a)o(ys)d(b)q
-(e)i(lo)q(cated)g(around)g(the)240 2670 y(en)o(tire)16
-b(bu\013er)f(so)g(that)f(y)o(ou)h(can)g(easily)i(erase)e(it)g(with)h
-Fl(C-w)e Fo(\(`)p Fl(kill-region)p Fo('\).)p eop
-%%Page: 12 14
-12 13 bop 0 -58 a Fo(Chapter)15 b(5:)k(Commands)1450
-b(12)240 183 y(If)25 b(y)o(ou)g(are)g(editing)i(the)e(\014les)h(in)g(y)
-o(our)f(emacs)g(an)g(automatic)g(`)p Fl(revert-buffer)p
-Fo(')d(will)27 b(b)q(e)240 246 y(p)q(erformed.)39 b(\(If)21
-b(the)h(\014le)g(con)o(tains)f(`)p Fl($Id: pcl-cvs.ps,v 1.1 1996/05/06 22:27:22 tholo Exp $)p Fo(')g(k)o(eyw)o(ords)f(`)
-p Fl(cvs)14 b(commit)p Fo(')21 b(will)i(write)e(a)g(new)h(\014le)240
-308 y(with)i(the)g(new)g(v)m(alues)h(substituted.)47
-b(The)24 b(auto-rev)o(ert)f(mak)o(es)g(sure)h(that)f(y)o(ou)h(get)f
-(them)240 370 y(in)o(to)d(y)o(our)g(bu\013er\).)35 b(The)20
-b(rev)o(ert)g(will)i(not)e(o)q(ccur)h(if)f(y)o(ou)g(ha)o(v)o(e)g(mo)q
-(di\014ed)i(y)o(our)e(bu\013er,)h(or)e(if)240 432 y(`)p
-Fl(cvs-auto-revert-after-c)o(ommit)p Fo(')12 b(is)j(set)g(to)g(`)p
-Fl(nil)p Fo('.)0 516 y Fl(C)216 b Fo(This)15 b(is)f(just)g(lik)o(e)i(`)
-p Fl(cvs-mode-commit)p Fo(',)11 b(except)k(that)e(it)h(tries)h(to)e
-(pro)o(vide)i(appropriate)f(default)240 578 y(log)k(messages)f(b)o(y)h
-(lo)q(oking)h(at)e(the)h(`)p Fl(ChangeLog)p Fo('s)e(in)i(the)g(curren)o
-(t)g(directory)l(.)28 b(The)19 b(idea)f(is)h(to)240 640
-y(write)11 b(y)o(our)f(ChangeLog)h(en)o(tries)g(\014rst,)g(and)g(then)h
-(use)f(this)g(command)g(to)f(commit)h(y)o(our)f(c)o(hanges.)240
-703 y(Pressing)16 b Fl(C)f Fo(causes)g Fl(cvs-mode-changelog-commit)d
-Fo(to)i(b)q(e)i(run.)240 775 y(T)l(o)f(select)h(default)g(log)f(text,)f
-(p)q(cl-cvs:)265 848 y Fn(\000)30 b Fo(\014nds)16 b(the)f(ChangeLogs)g
-(for)g(the)g(\014les)h(to)f(b)q(e)g(c)o(hec)o(k)o(ed)h(in;)265
-921 y Fn(\000)30 b Fo(v)o(eri\014es)20 b(that)f(the)g(top)g(en)o(try)g
-(in)h(the)f(ChangeLog)g(is)h(on)f(the)h(curren)o(t)f(date)g(and)h(b)o
-(y)f(the)330 983 y(curren)o(t)c(user;)g(if)h(not,)e(no)h(default)h
-(text)f(is)g(pro)o(vided;)265 1056 y Fn(\000)30 b Fo(searc)o(h)13
-b(the)h(ChangeLog)f(en)o(try)g(for)g(paragraphs)g(con)o(taining)h(the)g
-(names)f(of)g(the)h(\014les)h(w)o(e're)330 1118 y(c)o(hec)o(king)h(in;)
-g(and)f(\014nally)265 1191 y Fn(\000)30 b Fo(uses)24
-b(those)f(paragraphs)f(as)h(the)g(default)h(log)f(text)g(in)h(the)f(`)p
-Fl(*cvs-commit-message*)p Fo(')330 1254 y(bu\013er.)240
-1337 y(Y)l(ou)15 b(can)h(then)f(commit)g(the)h(`)p Fl(ChangeLog)p
-Fo(')d(\014le)j(once)g(p)q(er)f(da)o(y)g(without)g(an)o(y)g(log)g
-(message.)0 1554 y Fk(5.5)33 b(Editing)17 b(\014les)62
-1691 y Fo(There)d(are)g(curren)o(tly)g(three)g(commands)g(that)f(can)h
-(b)q(e)h(used)f(to)g(\014nd)g(a)g(\014le)h(\(that)e(is,)h(load)g(it)g
-(in)o(to)g(a)g(bu\013er)0 1753 y(and)h(start)f(editing)j(it)e(there\).)
-20 b(These)15 b(commands)g(w)o(ork)g(on)g(the)g(line)i(that)d(the)i
-(cursor)e(is)i(situated)g(at.)j(They)0 1815 y(ignore)c(an)o(y)g(mark)o
-(ed)g(\014les.)0 1963 y Fl(f)216 b Fo(Find)16 b(the)g(\014le)g(that)f
-(the)g(cursor)g(p)q(oin)o(ts)h(to.)k(Run)c(`)p Fl(dired)p
-Fo(')e(if)i(the)f(cursor)g(p)q(oin)o(ts)h(to)f(a)g(directory)240
-2025 y(\()p Fl(cvs-mode-find-file)p Fo(\).)0 2108 y Fl(o)216
-b Fo(Lik)o(e)16 b Fl(f)p Fo(,)f(but)g(use)h(another)e(windo)o(w)i(\()p
-Fl(cvs-mode-find-file-oth)o(er-windo)o(w)p Fo(\).)0 2192
-y Fl(A)216 b Fo(In)o(v)o(ok)o(e)29 b(`)p Fl(add-change-log-entry-other)
-o(-window)o Fo(')e(to)i(edit)h(a)f(`)p Fl(ChangeLog)p
-Fo(')f(\014le.)64 b(The)240 2254 y(`)p Fl(ChangeLog)p
-Fo(')20 b(will)k(b)q(e)f(found)g(in)g(the)f(directory)h(of)f(the)g
-(\014le)h(the)g(cursor)f(p)q(oin)o(ts)g(to.)41 b(\()p
-Fl(cvs-)240 2316 y(mode-add-change-log-entry-)o(other-w)o(indow)p
-Fo(\))o(.)0 2533 y Fk(5.6)33 b(Getting)15 b(info)h(ab)r(out)f(\014les)
-62 2670 y Fo(Both)g(of)g(the)g(follo)o(wing)h(commands)f(can)h(b)q(e)f
-(customized.)21 b(See)16 b(Chapter)f(6)g([Customization],)f(page)h(18.)
-p eop
-%%Page: 13 15
-13 14 bop 0 -58 a Fo(Chapter)15 b(5:)k(Commands)1450
-b(13)0 183 y Fl(l)216 b Fo(Run)20 b(`)p Fl(cvs)14 b(log)p
-Fo(')k(on)h(all)g(selected)h(\014les,)g(and)f(sho)o(w)f(the)h(result)g
-(in)h(a)e(temp)q(orary)g(bu\013er)h(\()p Fl(cvs-)240
-246 y(mode-log)p Fo(\).)0 345 y Fl(s)216 b Fo(Run)15
-b(`)p Fl(cvs)f(status)p Fo(')e(on)i(all)g(selected)h(\014les,)g(and)f
-(sho)o(w)f(the)g(result)i(in)f(a)f(temp)q(orary)g(bu\013er)h(\()p
-Fl(cvs-)240 407 y(mode-status)p Fo(\).)0 685 y Fk(5.7)33
-b(Adding)16 b(and)f(remo)n(ving)i(\014les)62 828 y Fo(The)h(follo)o
-(wing)g(commands)g(are)f(a)o(v)m(ailable)i(to)e(mak)o(e)g(it)h(easy)g
-(to)e(add)i(and)g(remo)o(v)o(e)f(\014les)h(from)f(the)h(CVS)0
-890 y(rep)q(ository)l(.)0 1051 y Fl(a)216 b Fo(Add)13
-b(all)h(selected)g(\014les.)20 b(This)13 b(command)g(can)g(b)q(e)h
-(used)f(on)g(`)p Fl(Unknown)p Fo(')e(\014les)i(\(see)g(see)g(Section)h
-(4.1)240 1114 y([File)j(status],)e(page)i(7\).)23 b(The)16
-b(status)g(of)g(the)h(\014le)g(will)h(c)o(hange)f(to)f(`)p
-Fl(Added)p Fo(',)e(and)j(y)o(ou)f(will)i(ha)o(v)o(e)240
-1176 y(to)g(use)h Fl(c)f Fo(\(`)p Fl(cvs-mode-commit)p
-Fo(',)e(see)j(see)g(Section)h(5.4)d([Committing)i(c)o(hanges],)f(page)h
-(11\))f(to)240 1238 y(really)e(add)g(the)f(\014le)h(to)f(the)g(rep)q
-(ository)l(.)240 1319 y(This)g(command)f(can)h(also)f(b)q(e)h(used)h
-(on)e(`)p Fl(Removed)p Fo(')f(\014les)i(\(b)q(efore)f(y)o(ou)h(commit)f
-(them\))g(to)g(resur-)240 1381 y(rect)h(them.)240 1462
-y(Selected)e(\014les)g(that)d(are)i(neither)g(`)p Fl(Unknown)p
-Fo(')e(nor)h(`)p Fl(Removed)p Fo(')f(will)j(b)q(e)f(ignored)g(b)o(y)g
-(this)f(command.)240 1543 y(The)k(command)h(that)e(is)i(run)f(is)h
-Fl(cvs-mode-add)p Fo(.)0 1642 y Fl(r)216 b Fo(This)16
-b(command)f(remo)o(v)o(es)f(the)h(selected)i(\014les)f(\(after)e
-(prompting)h(for)g(con\014rmation\).)20 b(The)15 b(\014les)240
-1704 y(are)j(`)p Fl(rm)p Fo('ed)g(from)g(y)o(our)g(directory)h(and)f
-(\(unless)i(the)e(status)g(w)o(as)g(`)p Fl(Unknown)p
-Fo(';)g(see)h(Section)g(4.1)240 1766 y([File)e(status],)e(page)h(7\))g
-(they)g(will)i(also)e(b)q(e)h(`)p Fl(cvs)d(remove)p Fo('d.)22
-b(If)17 b(the)f(\014les)h(w)o(ere)f(`)p Fl(Unknown)p
-Fo(')f(they)240 1829 y(will)20 b(disapp)q(ear)f(from)e(the)h(bu\013er.)
-29 b(Otherwise)19 b(their)f(status)g(will)h(c)o(hange)g(to)e(`)p
-Fl(Removed)p Fo(',)g(and)240 1891 y(y)o(ou)g(m)o(ust)h(use)g
-Fl(c)f Fo(\(`)p Fl(cvs-mode-commit)p Fo(',)e(see)j(Section)h(5.4)d
-([Committing)i(c)o(hanges],)f(page)h(11\))240 1953 y(to)d(commit)g(the)
-g(remo)o(v)m(al.)240 2034 y(The)g(command)h(that)e(is)i(run)f(is)h
-Fl(cvs-mode-remove-file)p Fo(.)0 2312 y Fk(5.8)33 b(Undoing)15
-b(c)n(hanges)0 2473 y Fl(U)216 b Fo(If)14 b(y)o(ou)f(ha)o(v)o(e)h(mo)q
-(di\014ed)h(a)e(\014le,)i(and)f(for)f(some)h(reason)f(decide)i(that)e
-(y)o(ou)h(don't)f(w)o(an)o(t)g(to)g(k)o(eep)h(the)240
-2535 y(c)o(hanges,)i(y)o(ou)g(can)g(undo)h(them)f(with)g(this)h
-(command.)22 b(It)17 b(w)o(orks)e(b)o(y)h(remo)o(ving)g(y)o(our)f(w)o
-(orking)240 2598 y(cop)o(y)20 b(of)g(the)g(\014le)h(and)g(then)f
-(getting)g(the)g(latest)g(v)o(ersion)h(from)e(the)h(rep)q(ository)h(\()
-p Fl(cvs-mode-)240 2660 y(undo-local-changes)p Fo(.)p
-eop
-%%Page: 14 16
-14 15 bop 0 -58 a Fo(Chapter)15 b(5:)k(Commands)1450
-b(14)0 183 y Fk(5.9)33 b(Remo)n(ving)15 b(handled)i(en)n(tries)0
-329 y Fl(x)216 b Fo(This)16 b(command)f(allo)o(ws)h(y)o(ou)f(to)g(remo)
-o(v)o(e)f(all)j(en)o(tries)f(that)e(y)o(ou)h(ha)o(v)o(e)g(pro)q
-(cessed.)22 b(More)14 b(sp)q(ecif-)240 391 y(ically)l(,)20
-b(the)e(lines)h(for)e(`)p Fl(Updated)p Fo(')f(\014les)i(\(see)g
-(Section)h(4.1)d([File)j(status],)d(page)i(7)f(and)h(\014les)h(that)240
-454 y(ha)o(v)o(e)12 b(b)q(een)h(c)o(hec)o(k)o(ed)g(in)f(\(see)h
-(Section)f(5.4)g([Committing)f(c)o(hanges],)h(page)g(11\))f(are)h(remo)
-o(v)o(ed)g(from)240 516 y(the)h(bu\013er.)18 b(If)13
-b(a)f(directory)h(b)q(ecomes)g(empt)o(y)f(the)h(heading)g(for)f(that)g
-(directory)g(is)h(also)g(remo)o(v)o(ed.)240 578 y(This)j(mak)o(es)e(it)
-i(easier)g(to)e(get)h(an)g(o)o(v)o(erview)g(of)g(what)f(needs)i(to)f(b)
-q(e)h(done.)240 650 y(The)e(command)f(is)h(called)g Fl
-(cvs-mode-remove-handled)p Fo(.)j(If)c(`)p Fl(cvs-auto-remove-handled)p
-Fo(')c(is)240 712 y(set)15 b(to)g(non-)p Fl(nil)g Fo(this)g(will)i
-(automatically)f(b)q(e)g(p)q(erformed)f(after)f(ev)o(ery)i(commit.)0
-792 y Fl(C-k)168 b Fo(This)11 b(command)f(can)h(b)q(e)g(used)g(for)e
-(lines)j(that)e(`)p Fl(cvs-mode-remove-handled)p Fo(')c(w)o(ould)11
-b(not)f(delete,)240 854 y(but)15 b(that)g(y)o(ou)g(w)o(an)o(t)f(to)g
-(delete)j(\()p Fl(cvs-mode-acknowledge)p Fo(\))o(.)0
-1064 y Fk(5.10)32 b(Ignoring)16 b(\014les)0 1210 y Fl(i)216
-b Fo(Arrange)18 b(so)h(that)f(CVS)g(will)j(ignore)e(the)g(selected)g
-(\014les.)32 b(The)19 b(\014le)g(names)g(are)f(added)i(to)e(the)240
-1273 y(`)p Fl(.cvsignore)p Fo(')d(\014le)k(in)f(the)f(corresp)q(onding)
-i(directory)l(.)26 b(If)18 b(the)f(`)p Fl(.cvsignore)p
-Fo(')f(do)q(esn't)h(exist)h(it)240 1335 y(will)f(b)q(e)f(created.)240
-1406 y(The)d(`)p Fl(.cvsignore)p Fo(')d(\014le)j(should)h(normally)f(b)
-q(e)g(added)g(to)e(the)i(rep)q(ository)l(,)g(but)f(y)o(ou)g(could)i
-(ignore)240 1468 y(it)h(also)h(if)f(y)o(ou)g(lik)o(e)h(it)g(b)q(etter)f
-(that)g(w)o(a)o(y)l(.)240 1540 y(This)h(runs)f Fl(cvs-mode-ignore)p
-Fo(.)0 1750 y Fk(5.11)32 b(Viewing)16 b(di\013erences)0
-1896 y Fl(d)216 b Fo(Displa)o(y)13 b(a)e(`)p Fl(cvs)k(diff)p
-Fo(')c(b)q(et)o(w)o(een)h(the)h(selected)g(\014les)g(and)f(the)h(R)o
-(CS)f(v)o(ersion)g(that)g(they)g(are)g(based)240 1958
-y(on.)24 b(See)17 b(Chapter)f(6)g([Customization],)g(page)g(18)g
-(describ)q(es)i(ho)o(w)e(y)o(ou)g(can)h(send)g(\015ags)f(to)g(`)p
-Fl(cvs)240 2020 y(diff)p Fo('.)i(If)c Fh(cvs-di\013-ignore-marks)i
-Fo(is)e(set)f(to)g(a)g(non-)p Fl(nil)g Fo(v)m(alue)i(or)e(if)h(a)f
-(pre\014x)h(argumen)o(t)f(is)g(giv)o(en)240 2083 y(\(but)20
-b(not)g(b)q(oth\))g(an)o(y)g(mark)o(ed)g(\014les)h(will)h(not)e(b)q(e)h
-(considered)h(to)d(b)q(e)i(selected.)37 b(\()p Fl(cvs-mode-)240
-2145 y(diff-cvs)p Fo(\).)0 2225 y Fl(b)216 b Fo(If)15
-b(CVS)g(\014nds)h(a)f(con\015ict)g(while)i(merging)e(t)o(w)o(o)f(v)o
-(ersions)h(of)f(a)h(\014le)h(\(during)f(a)g(`)p Fl(cvs)f(update)p
-Fo(',)g(see)240 2287 y(Section)g(5.1)d([Up)q(dating)i(the)g
-(directory],)g(page)f(10\))g(it)h(will)h(sa)o(v)o(e)e(the)h(original)g
-(\014le)h(in)f(a)g(\014le)g(called)240 2350 y(`)p Fl(.#)p
-Fh(FILE)p Fl(.)p Fh(VERSION)5 b Fo(')18 b(where)g Fh(FILE)i
-Fo(is)e(the)g(name)f(of)g(the)h(\014le,)h(and)e Fh(VERSION)24
-b Fo(is)18 b(the)g(R)o(CS)240 2412 y(v)o(ersion)d(n)o(um)o(b)q(er)h
-(that)e(y)o(our)h(\014le)h(w)o(as)f(based)g(on.)240 2483
-y(With)c(the)h Fl(b)e Fo(command)h(y)o(ou)g(can)h(run)f(a)g(`)p
-Fl(diff)p Fo(')f(on)h(the)g(\014les)h(`)p Fl(.#)p Fh(FILE)p
-Fl(.)p Fh(VERSION)5 b Fo(')12 b(and)f(`)p Fh(FILE)s Fo('.)240
-2545 y(Y)l(ou)17 b(can)h(get)e(a)h(con)o(text-)g(or)f(Unidi\013)j(b)o
-(y)e(setting)g(`)p Fl(cvs-diff-flags)p Fo(')d(-)j(see)h(Chapter)e(6)h
-([Cus-)240 2608 y(tomization],)g(page)g(18.)24 b(This)18
-b(command)f(only)g(w)o(orks)f(on)h(\014les)h(that)e(ha)o(v)o(e)h
-(status)f(`)p Fl(Conflict)p Fo(')240 2670 y(or)f(`)p
-Fl(Merged)p Fo('.)p eop
-%%Page: 15 17
-15 16 bop 0 -58 a Fo(Chapter)15 b(5:)k(Commands)1450
-b(15)240 183 y(If)11 b Fh(cvs-di\013-ignore-marks)j Fo(is)d(set)g(to)g
-(a)f(non-)p Fl(nil)h Fo(v)m(alue)i(or)d(if)i(a)f(pre\014x)g(argumen)o
-(t)f(is)i(giv)o(en)f(\(but)g(not)240 246 y(b)q(oth\))h(an)o(y)f(mark)o
-(ed)h(\014les)g(will)i(not)d(b)q(e)i(considered)g(to)e(b)q(e)i
-(selected.)20 b(\()p Fl(cvs-mode-diff-backup)p Fo(\))o(.)0
-490 y Fk(5.12)32 b(Running)17 b(edi\013)0 644 y Fl(e)216
-b Fo(This)14 b(command)g(w)o(orks)f(sligh)o(tly)h(di\013eren)o(t)g(dep)
-q(ending)i(on)e(the)g(v)o(ersion)g(of)f(`)p Fl(ediff)p
-Fo(')f(and)i(the)g(\014le)240 707 y(status.)240 784 y(With)c(mo)q(dern)
-h(v)o(ersions)f(of)g(`)p Fl(ediff)p Fo(',)f(this)i(command)f(in)o(v)o
-(ok)o(es)g(`)p Fl(run-ediff-from-cvs-buf)o(fer)p Fo(')p
-1959 792 21 41 v 240 846 a(on)15 b(one)g(\014le.)240
-923 y Fj(Note:)25 b Fo(When)19 b(the)f(\014le)h(status)f(is)h(`)p
-Fl(Merged)p Fo(')d(or)i(`)p Fl(Conflict)p Fo(',)f(CVS)h(has)g(already)h
-(p)q(erformed)f(a)240 985 y(merge.)24 b(The)17 b(resulting)g(\014le)h
-(is)f(not)f(used)h(in)h(an)o(y)e(w)o(a)o(y)f(if)j(y)o(ou)e(use)h(this)g
-(command.)24 b(If)16 b(y)o(ou)h(use)240 1047 y(the)h
-Fl(q)h Fo(command)f(inside)i(`)p Fl(ediff)p Fo(')d(\(to)h(successfully)
-i(terminate)e(a)g(merge\))g(the)h(\014le)g(that)f(CVS)240
-1110 y(created)d(will)i(b)q(e)f(o)o(v)o(erwritten.)240
-1187 y(Older)11 b(v)o(ersions)g(of)e(`)p Fl(ediff)p Fo(')g(use)i(an)f
-(in)o(terface)g(similar)h(to)f(`)p Fl(emerge)p Fo('.)16
-b(The)11 b(function)g(`)p Fl(cvs-old-ediff-interfac)o(e)p
-Fo(')p 2274 1197 21 42 v 240 1249 a(is)g(in)o(v)o(ok)o(ed)f(if)h(the)f
-(v)o(ersion)g(of)g(`)p Fl(ediff)p Fo(')f(y)o(ou)g(ha)o(v)o(e)h(do)q
-(esn't)g(supp)q(ort)g(`)p Fl(run-ediff-from-cvs-buffer)p
-Fo(')o(.)p 2036 1258 21 41 v 240 1311 a(These)16 b(older)f(v)o(ersions)
-h(do)f(not)g(supp)q(ort)g(merging)g(of)g(revisions.)240
-1403 y(`)p Fl(Modified)p Fo(')480 1465 y(Run)g(`)p Fl(ediff-files)p
-Fo(')c(with)j(y)o(our)f(w)o(orking)g(\014le)i(as)e(\014le)i(A,)e(and)h
-(the)f(latest)h(revision)480 1527 y(in)i(the)f(rep)q(ository)g(as)g
-(\014le)i(B.)240 1619 y(`)p Fl(Merged)p Fo(')240 1681
-y(`)p Fl(Conflict)p Fo(')480 1744 y(Run)d(`)p Fl(ediff-files3)p
-Fo(')c(with)k(y)o(our)e(w)o(orking)h(\014le)h(\(as)e(it)h(w)o(as)g
-(prior)g(to)f(y)o(our)h(in)o(v)o(o)q(ca-)480 1806 y(tion)j(of)f(`)p
-Fl(cvs-update)p Fo('\))e(as)j(\014le)g(A,)g(the)f(latest)h(revision)h
-(in)f(the)g(rep)q(ository)g(as)f(\014le)480 1868 y(B,)e(and)h(the)f
-(revision)i(that)d(y)o(ou)h(based)h(y)o(our)f(lo)q(cal)h(mo)q
-(di\014cations)h(on)e(as)g(ancestor.)240 1960 y(`)p Fl(Updated)p
-Fo(')240 2022 y(`)p Fl(Patched)p Fo(')46 b(Run)14 b(`)p
-Fl(ediff-files)p Fo(')d(with)i(y)o(our)g(w)o(orking)g(\014le)h(as)f
-(\014le)h(A,)f(and)g(a)g(giv)o(en)h(revision)g(in)480
-2084 y(the)g(rep)q(ository)g(as)g(\014le)h(B.)f(Y)l(ou)g(are)g
-(prompted)g(for)f(the)h(revision)i(to)d(edi\013)i(against,)480
-2147 y(and)e(y)o(ou)f(ma)o(y)g(sp)q(ecify)j(either)e(a)g(tag)e(name)i
-(or)f(a)h(n)o(umerical)h(revision)g(n)o(um)o(b)q(er)f(\(see)480
-2209 y(Section)j(5.6)e([Getting)h(info)h(ab)q(out)f(\014les],)g(page)g
-(12\).)0 2454 y Fk(5.13)32 b(Running)17 b(emerge)0 2608
-y Fl(E)216 b Fo(In)o(v)o(ok)o(e)16 b(`)p Fl(emerge)p
-Fo(')g(on)g(one)h(\014le.)26 b(This)17 b(command)g(w)o(orks)e(sligh)o
-(tly)j(di\013eren)o(t)f(dep)q(ending)i(on)e(the)240 2670
-y(\014le)f(status.)p eop
-%%Page: 16 18
-16 17 bop 0 -58 a Fo(Chapter)15 b(5:)k(Commands)1450
-b(16)240 183 y(`)p Fl(Modified)p Fo(')480 246 y(Run)13
-b(`)p Fl(emerge-files)p Fo(')c(with)j(y)o(our)f(w)o(orking)g(\014le)i
-(as)e(\014le)i(A,)e(and)h(the)f(latest)h(revision)480
-308 y(in)k(the)f(rep)q(ository)g(as)g(\014le)i(B.)240
-396 y(`)p Fl(Merged)p Fo(')240 458 y(`)p Fl(Conflict)p
-Fo(')480 520 y(Run)11 b(`)p Fl(emerge-files-with-ancest)o(or)p
-Fo(')c(with)k(y)o(our)e(w)o(orking)h(\014le)h(\(as)f(it)g(w)o(as)g
-(prior)480 582 y(to)20 b(y)o(our)g(in)o(v)o(o)q(cation)h(of)f(`)p
-Fl(cvs-update)p Fo('\))e(as)j(\014le)g(A,)g(the)f(latest)h(revision)g
-(in)h(the)480 645 y(rep)q(ository)11 b(as)f(\014le)h(B,)g(and)g(the)f
-(revision)i(that)e(y)o(ou)g(based)h(y)o(our)f(lo)q(cal)i(mo)q
-(di\014cations)480 707 y(on)j(as)g(ancestor.)240 795
-y Fj(Note:)25 b Fo(When)19 b(the)f(\014le)h(status)f(is)h(`)p
-Fl(Merged)p Fo(')d(or)i(`)p Fl(Conflict)p Fo(',)f(CVS)h(has)g(already)h
-(p)q(erformed)f(a)240 857 y(merge.)24 b(The)17 b(resulting)g(\014le)h
-(is)f(not)f(used)h(in)h(an)o(y)e(w)o(a)o(y)f(if)j(y)o(ou)e(use)h(this)g
-(command.)24 b(If)16 b(y)o(ou)h(use)240 919 y(the)d Fl(q)f
-Fo(command)g(inside)i(`)p Fl(emerge)p Fo(')d(\(to)h(successfully)i
-(terminate)f(the)f(merge\))g(the)h(\014le)g(that)f(CVS)240
-981 y(created)i(will)i(b)q(e)f(o)o(v)o(erwritten.)0 1208
-y Fk(5.14)32 b(Rev)n(erting)17 b(y)n(our)f(bu\013ers)0
-1358 y Fl(R)216 b Fo(If)17 b(y)o(ou)f(are)g(editing)i(\(or)e(just)g
-(viewing\))h(a)f(\014le)i(in)f(a)f(bu\013er,)h(and)f(that)g(\014le)i
-(is)f(c)o(hanged)f(b)o(y)h(CVS)240 1420 y(during)g(a)f(`)p
-Fl(cvs-update)p Fo(',)e(all)j(y)o(ou)f(ha)o(v)o(e)g(to)g(do)g(is)h(t)o
-(yp)q(e)f Fl(R)g Fo(in)h(the)g(*cvs*)f(bu\013er)g(to)g(read)g(in)h(the)
-240 1483 y(new)e(v)o(ersions)h(of)f(the)g(\014les.)240
-1558 y(All)h(\014les)g(that)e(are)g(`)p Fl(Updated)p
-Fo(',)f(`)p Fl(Merged)p Fo(')g(or)h(in)h(`)p Fl(Conflict)p
-Fo(')e(are)h(rev)o(erted)h(from)f(the)g(disk.)21 b(An)o(y)240
-1620 y(other)15 b(\014les)h(are)f(ignored.)20 b(Only)d(\014les)f(that)e
-(y)o(ou)h(w)o(ere)g(already)h(editing)g(are)f(read.)240
-1695 y(An)i(error)f(is)i(signalled)g(if)g(y)o(ou)e(ha)o(v)o(e)h(mo)q
-(di\014ed)h(the)f(bu\013er)g(since)h(it)f(w)o(as)f(last)h(c)o(hanged.)
-25 b(\()p Fl(cvs-)240 1757 y(mode-revert-updated-buffer)o(s)p
-Fo(\).)0 1984 y Fk(5.15)32 b(Miscellaneous)15 b(commands)0
-2134 y Fl(M-x)g(cvs-byte-compile-files)240 2196 y Fo(Byte)g(compile)i
-(all)f(selected)g(\014les)h(that)d(end)i(in)g(.el.)0
-2284 y Fl(M-x)f(cvs-delete-lock)240 2346 y Fo(This)e(command)f(can)g(b)
-q(e)h(used)g(in)g(an)o(y)f(bu\013er,)g(and)g(deletes)i(the)e(lo)q(c)o
-(k)g(\014les)i(that)d(the)h(*cvs*)g(bu\013er)240 2408
-y(informs)17 b(y)o(ou)f(ab)q(out.)25 b(Y)l(ou)17 b(should)h(normally)g
-(nev)o(er)f(ha)o(v)o(e)f(to)g(use)i(this)f(command)g(since)h(CVS)240
-2470 y(tries)d(v)o(ery)g(carefully)i(to)d(alw)o(a)o(ys)h(remo)o(v)o(e)f
-(the)h(lo)q(c)o(k)h(\014les)g(itself.)240 2545 y(Y)l(ou)g(can)g(only)g
-(use)g(this)g(command)g(when)g(a)g(message)f(in)i(the)e(*cvs*)h
-(bu\013er)f(tells)i(y)o(ou)f(so.)21 b(Y)l(ou)240 2608
-y(should)d(w)o(ait)e(a)h(while)h(b)q(efore)g(using)f(this)h(command)e
-(in)i(case)f(someone)g(else)h(is)f(running)h(a)f(cvs)240
-2670 y(command.)p eop
-%%Page: 17 19
-17 18 bop 0 -58 a Fo(Chapter)15 b(5:)k(Commands)1450
-b(17)0 183 y Fl(q)216 b Fo(Bury)15 b(the)h(*cvs*)e(bu\013er.)20
-b(\()p Fl(bury-buffer)p Fo(\).)p eop
-%%Page: 18 20
-18 19 bop 0 -58 a Fo(Chapter)15 b(6:)k(Customization)1385
-b(18)0 183 y Fm(6)41 b(Customization)62 394 y Fo(If)16
-b(y)o(ou)e(ha)o(v)o(e)h(an)g(idea)h(ab)q(out)f(an)o(y)f(customization)i
-(that)e(w)o(ould)i(b)q(e)f(handy)h(but)f(isn't)g(presen)o(t)g(in)h
-(this)g(list,)0 456 y(please)g(tell)g(me!)k(See)c(Chapter)f(8)g
-([Bugs],)f(page)h(22)g(for)f(info)i(on)f(ho)o(w)g(to)f(reac)o(h)h(me.)0
-616 y(`)p Fl(cvs-erase-input-buffer)p Fo(')240 678 y(If)h(set)f(to)g
-(an)o(ything)h(else)h(than)e Fl(nil)h Fo(the)f(edit)i(bu\013er)f(will)h
-(b)q(e)f(erased)g(b)q(efore)g(y)o(ou)f(write)h(the)g(log)240
-740 y(message)f(\(see)g(Section)h(5.4)e([Committing)h(c)o(hanges],)f
-(page)h(11\).)0 837 y(`)p Fl(cvs-inhibit-copyright-m)o(essage)p
-Fo(')240 899 y(The)g(cop)o(yrigh)o(t)f(message)g(that)g(is)h(displa)o
-(y)o(ed)h(on)e(startup)g(can)h(b)q(e)g(anno)o(ying)g(after)f(a)g
-(while.)21 b(Set)240 961 y(this)16 b(v)m(ariable)g(to)f(`)p
-Fl(t)p Fo(')f(if)i(y)o(ou)f(w)o(an)o(t)f(to)h(get)g(rid)h(of)f(it.)20
-b(\(But)15 b(don't)g(set)g(this)h(to)f(`)p Fl(t)p Fo(')f(in)i(the)f
-(system)240 1024 y(defaults)h(\014le)g(-)f(new)h(users)f(should)h(see)g
-(this)f(message)g(at)g(least)g(once\).)0 1120 y(`)p Fl(cvs-diff-flags)p
-Fo(')240 1183 y(A)i(list)g(of)f(strings)g(to)g(pass)g(as)g(argumen)o
-(ts)g(to)g(the)g(`)p Fl(cvs)f(diff)p Fo(')g(and)i(`)p
-Fl(diff)p Fo(')e(programs.)22 b(This)17 b(is)240 1245
-y(used)i(b)o(y)f(`)p Fl(cvs-mode-diff-cvs)p Fo(')c(and)19
-b(`)p Fl(cvs-mode-diff-backup)p Fo(')14 b(\(k)o(ey)k
-Fl(b)p Fo(,)g(see)g(Section)h(5.11)240 1307 y([Viewing)c
-(di\013erences],)f(page)f(14\).)19 b(If)14 b(y)o(ou)f(prefer)h(the)f
-(Unidi\013)i(format)e(y)o(ou)g(could)h(add)g(this)g(line)240
-1370 y(to)h(y)o(our)f(`)p Fl(.emacs)p Fo(')g(\014le:)360
-1439 y Fl(\(setq)23 b(cvs-diff-flags)f('\("-u"\)\))0
-1536 y Fo(`)p Fl(cvs-diff-ignore-marks)p Fo(')240 1598
-y(If)10 b(this)h(v)m(ariable)h(is)e(non-)p Fl(nil)g Fo(or)g(if)h(a)e
-(pre\014x)i(argumen)o(t)e(is)i(giv)o(en)g(\(but)f(not)f(b)q(oth\))h(to)
-g(`)p Fl(cvs-mode-diff-cvs)p Fo(')p 2112 1609 21 46 v
-240 1660 a(or)15 b(`)p Fl(cvs-mode-diff-backup)p Fo(')c(mark)o(ed)k
-(\014les)h(are)f(not)g(considered)i(selected.)0 1757
-y(`)p Fl(cvs-log-flags)p Fo(')240 1819 y(List)h(of)g(strings)g(to)f
-(send)h(to)g(`)p Fl(cvs)c(log)p Fo('.)27 b(Used)18 b(b)o(y)g(`)p
-Fl(cvs-mode-log)p Fo(')e(\(k)o(ey)h Fl(l)p Fo(,)h(see)g(Section)h(5.6)
-240 1881 y([Getting)c(info)g(ab)q(out)g(\014les],)h(page)f(12\).)0
-1978 y(`)p Fl(cvs-status-flags)p Fo(')240 2040 y(List)j(of)f(strings)h
-(to)f(send)h(to)f(`)p Fl(cvs)d(status)p Fo('.)26 b(Used)18
-b(b)o(y)g(`)p Fl(cvs-mode-status)p Fo(')d(\(k)o(ey)i
-Fl(s)p Fo(,)g(see)h(Sec-)240 2103 y(tion)d(5.6)g([Getting)f(info)i(ab)q
-(out)f(\014les],)g(page)g(12\).)0 2200 y(`)p Fl
-(cvs-auto-remove-handled)o Fo(')240 2262 y(If)h(this)g(v)m(ariable)h
-(is)f(set)f(to)g(an)o(y)g(non-)p Fl(nil)h Fo(v)m(alue)g(`)p
-Fl(cvs-mode-remove-handled)p Fo(')c(will)17 b(b)q(e)f(called)240
-2324 y(ev)o(ery)i(time)h(y)o(ou)f(c)o(hec)o(k)h(in)g(\014les,)h(after)d
-(the)i(c)o(hec)o(k-in)h(is)e(ready)l(.)30 b(See)19 b(Section)g(5.9)f
-([Remo)o(ving)240 2386 y(handled)f(en)o(tries],)e(page)g(14.)0
-2483 y(`)p Fl(cvs-auto-revert-after-c)o(ommit)p Fo(')240
-2545 y(If)f(this)f(v)m(ariable)i(is)f(set)f(to)g(an)o(y)g(non-`)p
-Fl(nil)p Fo(')f(v)m(alue)j(an)o(y)e(bu\013ers)g(y)o(ou)g(ha)o(v)o(e)g
-(that)f(visit)i(a)f(\014le)i(that)d(is)240 2608 y(committed)j(will)i(b)
-q(e)f(automatically)g(rev)o(erted.)k(This)c(v)m(ariable)g(is)g(default)
-g(`)p Fl(t)p Fo('.)j(See)d(Section)g(5.4)240 2670 y([Committing)f(c)o
-(hanges],)f(page)h(11.)p eop
-%%Page: 19 21
-19 20 bop 0 -58 a Fo(Chapter)15 b(6:)k(Customization)1385
-b(19)0 183 y(`)p Fl(cvs-update-prog-output-)o(skip-reg)o(exp)p
-Fo(')240 246 y(The)20 b(`)p Fl(-u)p Fo(')f(\015ag)h(in)g(the)g(`)p
-Fl(modules)p Fo(')f(\014le)i(can)f(b)q(e)g(used)h(to)e(run)h(a)g
-(command)g(whenev)o(er)g(a)g(`)p Fl(cvs)240 308 y(update)p
-Fo(')12 b(is)h(p)q(erformed)g(\(see)g(cvs\(5\)\).)18
-b(This)c(regexp)f(is)g(used)h(to)e(searc)o(h)h(for)f(the)h(last)g(line)
-i(in)f(that)240 370 y(output.)19 b(It)12 b(is)h(normally)g(set)f(to)g
-(`)p Fl("$")p Fo('.)18 b(That)12 b(setting)g(is)h(only)g(correct)f(if)h
-(the)g(command)f(outputs)240 432 y(nothing.)20 b(Note)14
-b(that)g(p)q(cl-cvs)i(will)g(get)e(v)o(ery)g(confused)h(if)g(the)g
-(command)f(outputs)g Fh(an)o(ything)19 b Fo(to)240 495
-y(`)p Fl(stderr)p Fo('.)0 582 y(`)p Fl(cvs-cvsroot)p
-Fo(')240 644 y(This)e(v)m(ariable)h(can)f(b)q(e)g(set)g(to)f(o)o(v)o
-(erride)g(`)p Fl(CVSROOT)p Fo('.)23 b(It)16 b(should)i(b)q(e)f(a)f
-(string.)24 b(If)17 b(it)g(is)g(set)g(then)240 706 y(ev)o(erytime)h(a)g
-(cvs)g(command)f(is)i(run)f(it)g(will)i(b)q(e)e(called)i(as)d(`)p
-Fl(cvs)d(-d)h Fh(cvs-cvsro)q(ot)q Fi(:)8 b(:)g(:)n Fo(')17
-b(This)i(can)240 769 y(b)q(e)d(useful)g(if)g(y)o(our)f(site)g(has)g
-(sev)o(eral)h(rep)q(ositories.)0 856 y(`)p Fl(TMPDIR)p
-Fo(')70 b(Pcl-cvs)20 b(uses)f(this)g Fh(en)o(vironmen)o(t)g(v)m
-(ariable)k Fo(to)18 b(decide)j(where)e(to)f(put)h(the)g(temp)q(orary)f
-(\014les)i(it)240 918 y(needs.)h(It)15 b(defaults)h(to)e(`)p
-Fl(/tmp)p Fo(')g(if)i(it)f(is)h(not)f(set.)0 1005 y(`)p
-Fl(cvs-commit-buffer-requi)o(re-final)o(-newlin)o(e)p
-Fo(')240 1067 y(When)g(y)o(ou)f(en)o(ter)h(a)f(log)h(message)f(in)h
-(the)g(`)p Fl(*cvs-commit-message*)p Fo(')c(bu\013er)k(p)q(cl-cvs)h
-(will)g(nor-)240 1130 y(mally)d(automatically)f(insert)h(a)f(trailing)h
-(newline,)h(unless)g(there)e(already)g(is)h(one.)19 b(This)12
-b(b)q(eha)o(vior)240 1192 y(can)k(b)q(e)h(con)o(trolled)g(via)f(`)p
-Fl(cvs-commit-buffer-requi)o(re-fina)o(l-newli)o(ne)p
-Fo('.)j(If)d(it)h(is)f(`)p Fl(t)p Fo(')f(\(the)240 1254
-y(default)g(b)q(eha)o(vior\),)f(a)g(newline)i(will)g(alw)o(a)o(ys)d(b)q
-(e)i(app)q(ended.)21 b(If)15 b(it)f(is)h(`)p Fl(nil)p
-Fo(',)e(newlines)j(will)g(nev)o(er)240 1316 y(b)q(e)21
-b(app)q(ended.)36 b(An)o(y)21 b(other)f(v)m(alue)h(causes)f(p)q(cl-cvs)
-i(to)e(ask)g(the)g(user)g(whenev)o(er)h(there)f(is)h(no)240
-1379 y(trailing)16 b(newline)h(in)f(the)g(commit)f(message)g(bu\013er.)
-0 1466 y(`)p Fl(cvs-sort-ignore-file)p Fo(')240 1528
-y(If)20 b(this)f(v)m(ariable)i(is)f(set)f(to)f(an)o(y)h(non-`)p
-Fl(nil)p Fo(')g(v)m(alue)h(the)g(`)p Fl(.cvsignore)p
-Fo(')d(will)k(alw)o(a)o(ys)d(b)q(e)i(sorted)240 1590
-y(whenev)o(er)c(y)o(ou)e(use)i(`)p Fl(cvs-mode-ignore)p
-Fo(')c(to)j(add)g(a)g(\014le)h(to)f(it.)20 b(This)c(option)f(is)h(on)f
-(b)o(y)g(default.)p eop
-%%Page: 20 22
-20 21 bop 0 -58 a Fo(Chapter)15 b(7:)k(F)l(uture)d(enhancemen)o(ts)1249
-b(20)0 183 y Fm(7)41 b(F)-7 b(uture)15 b(enhancemen)n(ts)62
-369 y Fo(Pcl-cvs)i(is)f(still)i(under)e(dev)o(elopmen)o(t)h(and)f
-(needs)h(a)e(n)o(um)o(b)q(er)h(of)g(enhancemen)o(ts)g(to)g(b)q(e)g
-(called)i(complete.)0 431 y(Belo)o(w)h(is)h(m)o(y)f(curren)o(t)g
-(wish-list)i(for)d(future)h(releases)h(of)f(p)q(cl-cvs.)33
-b(Please,)21 b(let)e(me)g(kno)o(w)g(whic)o(h)h(of)f(these)0
-493 y(features)c(y)o(ou)g(w)o(an)o(t)f(most.)19 b(They)c(are)g(listed)h
-(b)q(elo)o(w)g(in)g(appro)o(ximately)f(the)g(order)g(that)g(I)g(curren)
-o(tly)h(think)g(I)0 556 y(will)h(implemen)o(t)f(them)g(in.)37
-693 y Fn(\017)30 b Fo(Rewritten)22 b(parser)e(co)q(de.)38
-b(There)22 b(are)e(man)o(y)h(situations)g(where)g(p)q(cl-cvs)i(will)g
-(fail)f(to)e(recognize)i(the)90 755 y(output)15 b(from)f(CVS.)h(The)h
-(situation)f(could)i(b)q(e)f(greatly)e(increased.)37
-829 y Fn(\017)30 b Fo(`)p Fl(cvs-status)p Fo('.)39 b(This)23
-b(will)h(run)e(`)p Fl(cvs)15 b(status)p Fo(')21 b(in)i(a)f(directory)g
-(and)h(pro)q(duce)g(a)f(bu\013er)g(that)g(lo)q(oks)90
-892 y(prett)o(y)14 b(m)o(uc)o(h)h(lik)o(e)g(the)g(curren)o(t)g(*cvs*)f
-(bu\013er.)19 b(That)14 b(bu\013er)h(will)h(include)h(information)e
-(for)f(all)i(v)o(ersion-)90 954 y(con)o(trolled)h(\014les.)25
-b(\(There)16 b(will)j(b)q(e)e(a)f(simple)i(k)o(eystrok)o(e)d(to)h(remo)
-o(v)o(e)g(all)h Fl(")p Fo(unin)o(teresting)p Fl(")h Fo(\014les,)f(that)
-f(is,)90 1016 y(\014les)j(that)f(are)g Fl(")p Fo(Up-to-date)p
-Fl(")p Fo(\).)29 b(In)19 b(this)g(new)g(bu\013er)f(y)o(ou)g(will)j(b)q
-(e)e(able)g(to)f(up)q(date)h(a)f(\014le,)i(commit)e(a)90
-1078 y(\014le,)e(et)f(c.)20 b(The)15 b(big)g(win)h(with)f(this)h(is)f
-(that)g(y)o(ou)f(will)j(b)q(e)f(able)f(to)g(w)o(atc)o(h)f(the)h
-(di\013erences)h(b)q(et)o(w)o(een)f(y)o(our)90 1141 y(curren)o(t)e(w)o
-(orking)g(\014le)h(and)g(the)f(head)g(revision)i(in)f(the)f(rep)q
-(ository)g(b)q(efore)h(y)o(ou)f(up)q(date)g(the)h(\014le,)g(and)f(y)o
-(ou)90 1203 y(can)i(then)h(c)o(ho)q(ose)f(to)g(up)q(date)g(it)h(or)f
-(let)g(it)h(w)o(ait)e(for)h(a)g(while)i(longer.)37 1277
-y Fn(\017)30 b Fo(Log)11 b(mo)q(de.)19 b(When)12 b(this)g(mo)q(de)g(is)
-g(\014nished)h(y)o(ou)f(will)h(b)q(e)f(able)g(to)f(mo)o(v)o(e)g(around)
-h(\(using)g Fl(n)f Fo(and)h Fl(p)p Fo(\))f(b)q(et)o(w)o(een)90
-1340 y(the)18 b(revisions)h(of)f(a)f(\014le,)j(mark)d(t)o(w)o(o)g(of)g
-(them,)h(and)h(run)f(a)g(di\013)g(b)q(et)o(w)o(een)g(them.)28
-b(Y)l(ou)19 b(will)g(b)q(e)g(able)g(to)90 1402 y(hide)14
-b(branc)o(hes)e(\(similar)i(to)d(the)i(w)o(a)o(y)e(y)o(ou)h(can)h(hide)
-g(sub-paragraphs)f(in)i(outline-mo)q(de\))f(and)g(do)f(merges)90
-1464 y(b)q(et)o(w)o(een)k(revisions.)k(Other)c(ideas)g(ab)q(out)f(this)
-g(are)g(w)o(elcome.)37 1539 y Fn(\017)30 b Fo(The)13
-b(curren)o(t)f(mo)q(del)h(for)f(marks)g(in)h(the)g(*cvs*)f(bu\013er)g
-(seems)g(to)g(b)q(e)h(confusing.)20 b(I)13 b(am)f(considering)i(to)e
-(use)90 1601 y(the)j(VM)g(mo)q(del)i(instead,)e(where)h(marks)e(are)h
-(normally)h(inactiv)o(e.)22 b(T)l(o)15 b(activ)m(ate)g(the)h(mark,)e(y)
-o(ou)h(issue)h(a)90 1663 y(command)g(lik)o(e)i(`)p Fl
-(cvs-mode-next-command-)o(uses-ma)o(rks)p Fo('.)i(I)d(migh)o(t)f
-(implemen)o(t)i(a)e(\015ag)g(so)g(that)f(y)o(ou)90 1725
-y(can)g(use)h(either)g(v)o(ersion.)k(F)l(eedbac)o(k)15
-b(on)h(this)f(b)q(efore)h(I)f(start)f(co)q(ding)i(it)g(is)g(v)o(ery)f
-(w)o(elcome.)37 1800 y Fn(\017)30 b Fo(It)22 b(should)h(b)q(e)g(p)q
-(ossible)h(to)e(run)g(commands)h(suc)o(h)f(as)g(`)p Fl(cvs)14
-b(log)p Fo(',)23 b(`)p Fl(cvs)14 b(status)p Fo(')21 b(and)i(`)p
-Fl(cvs)14 b(commit)p Fo(')90 1862 y(directly)21 b(from)d(a)h(bu\013er)g
-(con)o(taining)h(a)f(\014le,)i(instead)f(of)e(ha)o(ving)i(to)e(`)p
-Fl(cvs-update)p Fo('.)30 b(If)19 b(the)h(directory)90
-1924 y(con)o(tains)15 b(man)o(y)g(\014les)h(the)g(`)p
-Fl(cvs-update)p Fo(')d(can)i(tak)o(e)g(quite)h(some)f(time,)g(esp)q
-(ecially)j(on)d(a)g(slo)o(w)g(mac)o(hine.)90 1987 y(I)f(planed)h(to)f
-(put)g(these)g(kind)h(of)e(commands)h(on)g(the)g(pre\014x)g
-Fl(C-c)h(C-v)p Fo(,)e(but)h(that)g(turned)g(out)g(to)f(b)q(e)h(used)90
-2049 y(b)o(y)k(for)f(instance)i(c)p Fl(++)p Fo(-mo)q(de.)28
-b(If)18 b(y)o(ou)f(ha)o(v)o(e)h(an)o(y)f(suggestions)h(for)f(a)h(b)q
-(etter)f(pre\014x)i(k)o(ey)l(,)f(please)h(let)f(me)90
-2111 y(kno)o(w.)37 2186 y Fn(\017)30 b Fo(Increased)15
-b(robustness.)k(F)l(or)13 b(instance,)i(y)o(ou)e(can)h(not)g(curren)o
-(tly)g(press)g Fl(C-g)f Fo(when)i(y)o(ou)e(are)h(en)o(tering)g(the)90
-2248 y(description)j(of)d(a)h(\014le)i(that)d(y)o(ou)h(are)g(adding)h
-(without)f(confusing)h(p)q(cl-cvs.)37 2322 y Fn(\017)30
-b Fo(Supp)q(ort)16 b(for)e(m)o(ultiple)j(activ)o(e)f(*cvs*)e
-(bu\013ers.)37 2397 y Fn(\017)30 b Fo(Dired)20 b(supp)q(ort.)33
-b(I)20 b(ha)o(v)o(e)g(an)f(exp)q(erimen)o(tal)i(`)p Fl(dired-cvs.el)p
-Fo(')c(that)i(w)o(orks)g(together)g(with)h(CVS)f(1.2.)90
-2459 y(Unfortunately)c(I)h(wrote)e(it)i(on)f(top)g(of)f(a)h
-(non-standard)g(`)p Fl(dired.el)p Fo(',)e(so)i(it)h(m)o(ust)e(b)q(e)i
-(rewritten.)37 2533 y Fn(\017)30 b Fo(An)15 b(abilit)o(y)i(to)d(send)i
-(user-supplied)i(options)d(to)g(all)h(the)f(cvs)h(commands.)37
-2608 y Fn(\017)30 b Fo(Pcl-cvs)18 b(is)g(not)f(at)g(all)h(clev)o(er)g
-(ab)q(out)f(what)g(it)h(should)g(do)f(when)h(`)p Fl(cvs)d(update)p
-Fo(')h(runs)h(a)g(program)g(\(due)90 2670 y(to)e(the)h(`)p
-Fl(-u)p Fo(')f(option)h(in)h(the)f(`)p Fl(modules)p Fo(')e(\014le)j(|)f
-(see)g(`)p Fl(cvs\(5\))p Fo('\).)k(The)d(curren)o(t)e(release)i(uses)f
-(a)g(regexp)g(to)p eop
-%%Page: 21 23
-21 22 bop 0 -58 a Fo(Chapter)15 b(7:)k(F)l(uture)d(enhancemen)o(ts)1249
-b(21)90 183 y(searc)o(h)17 b(for)f(the)g(end.)26 b(A)o(t)16
-b(the)h(v)o(ery)f(least)h(that)f(regexp)h(should)g(b)q(e)h
-(con\014gured)f(for)f(di\013eren)o(t)h(mo)q(dules.)90
-246 y(T)l(ell)c(me)f(if)g(y)o(ou)g(ha)o(v)o(e)f(an)o(y)g(idea)i(ab)q
-(out)f(what)f(is)h(the)g(righ)o(t)f(thing)i(to)e(do.)19
-b(In)12 b(a)f(p)q(erfect)i(w)o(orld)e(the)h(program)90
-308 y(should)k(also)f(b)q(e)h(allo)o(w)o(ed)g(to)e(prin)o(t)i(to)e(`)p
-Fl(stderr)p Fo(')g(without)h(causing)h(p)q(cl-cvs)h(to)d(crash.)62
-457 y(If)k(y)o(ou)f(miss)h(something)g(in)h(this)f(wish-list,)h(let)f
-(me)g(kno)o(w!)27 b(I)18 b(don't)f(promise)h(that)f(I)h(will)h(write)f
-(it,)g(but)0 519 y(I)i(will)g(at)f(least)g(try)g(to)f(co)q(ordinate)i
-(the)f(e\013orts)f(of)h(making)g(a)g(go)q(o)q(d)g(Emacs)g(fron)o(t)f
-(end)i(to)f(CVS.)g(See)g(See)0 582 y(Chapter)c(8)g([Bugs],)f(page)h(22)
-g(for)f(information)h(ab)q(out)h(ho)o(w)e(to)h(reac)o(h)g(me.)62
-719 y(So)j(far,)g(I)g(ha)o(v)o(e)f(written)h(most)f(of)h(p)q(cl-cvs)h
-(in)g(m)o(y)e(all-to-rare)h(spare)g(time.)28 b(If)18
-b(y)o(ou)g(w)o(an)o(t)f(p)q(cl-cvs)i(to)e(b)q(e)0 781
-y(dev)o(elop)q(ed)e(faster)e(y)o(ou)g(can)g(write)h(a)f(con)o(tract)f
-(with)i(Sign)o(um)g(Supp)q(ort)g(to)f(do)g(the)h(extension.)20
-b(Y)l(ou)14 b(can)f(reac)o(h)0 843 y(Sign)o(um)g(Supp)q(ort)g(b)o(y)f
-(email)h(to)f(`)p Fl(info@signum.se)p Fo(')e(or)i(via)g(mail)h(to)f
-(Sign)o(um)h(Supp)q(ort)g(AB,)f(Bo)o(x)g(2044,)f(S-580)0
-906 y(02)k(Link)o(oping,)h(Sw)o(eden.)21 b(Phone:)f Fl(+)p
-Fo(46)14 b(\(0\))g(13)h(-)g(21)g(46)g(00.)k(F)l(ax:)g
-Fl(+)p Fo(46)c(\(0\))f(13)h(-)g(21)f(47)h(00.)p eop
-%%Page: 22 24
-22 23 bop 0 -58 a Fo(Chapter)15 b(8:)k(Bugs)d(\(kno)o(wn)e(and)i(unkno)
-o(wn\))1112 b(22)0 183 y Fm(8)41 b(Bugs)15 b(\(kno)n(wn)g(and)g(unkno)n
-(wn\))62 370 y Fo(If)c(y)o(ou)f(\014nd)h(a)g(bug)f(or)g(misfeature,)h
-(don't)f(hesitate)h(to)f(tell)i(me!)18 b(Send)11 b(email)h(to)e(`)p
-Fl(ceder@lysator.liu.se)p Fo(')o(.)62 507 y(If)18 b(y)o(ou)g(ha)o(v)o
-(e)f(ideas)i(for)e(impro)o(v)o(emen)o(ts,)g(or)h(if)g(y)o(ou)f(ha)o(v)o
-(e)h(written)f(some)h(extensions)g(to)f(this)i(pac)o(k)m(age,)f(I)0
-569 y(w)o(ould)e(lik)o(e)g(to)e(hear)i(from)e(y)o(ou.)20
-b(I)15 b(hop)q(e)h(that)e(y)o(ou)h(\014nd)h(this)g(pac)o(k)m(age)f
-(useful!)62 706 y(Belo)o(w)h(is)f(a)g(partial)h(list)g(of)f(curren)o
-(tly)g(kno)o(wn)g(problems)h(with)g(p)q(cl-cvs)g(v)o(ersion)g(1.05.)0
-856 y(Commit)f(causes)g(Emacs)g(to)g(hang)240 918 y(Emacs)c(w)o(aits)g
-(for)h(the)f(`)p Fl(cvs)k(commit)p Fo(')10 b(command)i(to)f(\014nish)i
-(b)q(efore)f(y)o(ou)f(can)h(do)f(an)o(ything.)19 b(If)12
-b(y)o(ou)240 980 y(start)i(a)h(bac)o(kground)g(job)h(from)e(the)i
-(loginfo)f(\014le)i(y)o(ou)e(m)o(ust)g(tak)o(e)f(care)h(that)g(it)h
-(closes)g(`)p Fl(stdout)p Fo(')240 1043 y(and)c(`)p Fl(stderr)p
-Fo(')e(if)i(y)o(ou)f(do)h(not)f(w)o(an)o(t)g(to)g(w)o(ait)g(for)g(it.)
-19 b(\(Y)l(ou)11 b(do)h(that)f(with)h(`)p Fl(background-command)240
-1105 y(&>-)j(2&>-)f(&)p Fo(')h(if)h(y)o(ou)f(are)f(starting)h(`)p
-Fl(background-command)p Fo(')d(from)i(a)h(`)p Fl(/bin/sh)p
-Fo(')f(shell)i(script\).)240 1180 y(Y)l(our)d(emacs)h(will)h(also)e
-(hang)h(if)g(there)f(w)o(as)g(a)g(lo)q(c)o(k)h(\014le)g(in)g(the)g(rep)
-q(ository)l(.)19 b(In)14 b(this)g(case)g(y)o(ou)f(can)240
-1242 y(t)o(yp)q(e)i Fl(C-g)g Fo(to)g(get)f(con)o(trol)h(o)o(v)o(er)g(y)
-o(our)f(emacs)h(again.)0 1329 y(Name)g(clash)h(in)g(Emacs)f(19)240
-1391 y(This)j(is)f(really)h(a)e(bug)h(in)h(Elib)h(or)d(the)h(Emacs)f
-(19)h(distribution.)27 b(Both)16 b(Elib)j(and)e(Emacs)f(19.6)240
-1453 y(through)f(at)f(least)i(19.10)e(con)o(tains)h(a)g(\014le)h(named)
-g(`)p Fl(cookie.el)p Fo('.)i(One)e(of)e(the)i(\014les)g(will)h(ha)o(v)o
-(e)e(to)240 1516 y(b)q(e)h(renamed,)f(and)g(w)o(e)g(are)g(curren)o(tly)
-h(negotiating)f(ab)q(out)g(whic)o(h)h(of)f(the)g(\014les)i(to)d
-(rename.)0 1603 y(Commands)h(while)h(cvs-up)q(date)g(is)g(running)240
-1665 y(It)h(is)h(p)q(ossible)h(to)e(t)o(yp)q(e)g(commands)g(in)h(the)g
-(*cvs*)e(bu\013er)i(while)g(the)g(up)q(date)g(is)f(running,)i(but)240
-1727 y(error)14 b(messages)h(is)h(all)g(that)e(y)o(ou)h(will)i(get.)j
-(The)15 b(error)g(messages)f(should)i(b)q(e)g(b)q(etter.)0
-1815 y(Unexp)q(ected)h(output)e(from)f(CVS)240 1877 y(Unexp)q(ected)19
-b(output)f(from)f(CVS)h(confuses)g(p)q(cl-cvs.)29 b(It)18
-b(will)i(curren)o(tly)e(create)g(a)f(bug)h(rep)q(ort)240
-1939 y(that)c(y)o(ou)h(can)h(mail)g(to)e(me.)20 b(It)15
-b(should)i(do)e(something)g(more)g(civilized.)p eop
-%%Page: 23 25
-23 24 bop 0 -58 a Fo(App)q(endix)17 b(A:)e(GNU)g(GENERAL)h(PUBLIC)g
-(LICENSE)885 b(23)0 183 y Fm(App)r(endix)13 b(A)41 b(GNU)15
-b(GENERAL)i(PUBLIC)f(LICENSE)p eop
-%%Page: 24 26
-24 25 bop 0 -58 a Fo(F)l(unction)16 b(and)f(V)l(ariable)i(Index)1337
-b(24)0 183 y Fm(F)-7 b(unction)15 b(and)g(V)-7 b(ariable)14
-b(Index)0 416 y Fk(B)0 482 y Fg(bury-buffe)o(r)t Ff(.)s(.)6
-b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)17 b Fe(16)0 590 y Fk(C)0 656 y Fg(cookie-nex)o(t-)o(coo)o(ki)o
-(e)t Ff(.)s(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)16
-b Fe(10)0 715 y Fg(cookie-pre)o(vi)o(ous)o(-c)o(ook)o(ie)7
-b Ff(.)s(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Fe(10)0 773
-y(cvs-auto-remo)o(v)o(e-handled)c(\(v)n(ariable\))t Ff(.)9
-b(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)17
-b Fe(18)0 831 y(cvs-auto-rev)o(ert-after-commit)d(\(v)n(ariable\))e
-Ff(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)22 b Fe(11,)13
-b(18)0 889 y Fg(cvs-byte-c)o(om)o(pil)o(e-)o(fil)o(es)7
-b Ff(.)s(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Fe(16)0 947
-y(cvs-commit-bu\013er-require-\014n)q(al)q(-newli)q(ne)c(\(v)n
-(ariable\))5 b Ff(.)j(.)e(.)18 b Fe(18)0 1005 y(cvs-cvsro)q(ot)c(\(v)n
-(ariable\))8 b Ff(.)g(.)e(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21
-b Fe(18)0 1063 y Fg(cvs-delete)o(-l)o(ock)6 b Ff(.)t(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)20 b Fe(10)0
-1121 y(cvs-di\013-\015ags)15 b(\(v)n(ariable\))7 b Ff(.)h(.)e(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)h(.)f(.)g(.)19 b Fe(18)0 1180 y
-(cvs-di\013-ignore-marks)d(\(v)n(ariable\))7 b Ff(.)h(.)e(.)h(.)f(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Fe(14,)13
-b(18)0 1238 y(cvs-erase-input-bu\013er)j(\(v)n(ariable\))c
-Ff(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)22
-b Fe(11,)13 b(18)0 1296 y(cvs-inhibit-copyrig)q(h)o(t-message)j(\(v)n
-(ariable\))9 b Ff(.)f(.)e(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)21
-b Fe(18)0 1354 y(cvs-log-\015ags)15 b(\(v)n(ariable\))9
-b Ff(.)f(.)e(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)22 b
-Fe(18)0 1412 y Fg(cvs-mode-a)o(ck)o(now)o(le)o(dge)6
-b Ff(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)22 b Fe(14)0
-1470 y Fg(cvs-mode-a)o(dd)8 b Ff(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Fe(13)0 1528
-y Fg(cvs-mode-a)o(dd)o(-ch)o(an)o(ge-)o(log)o(-e)o(ntr)o(y-)o(oth)o(er)
-o(-wi)o(ndo)o(w)7 b Ff(.)s(.)f(.)20 b Fe(12)0 1586 y
-Fg(cvs-mode-c)o(ha)o(nge)o(lo)o(g-c)o(omm)o(it)r Ff(.)t(.)6
-b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
-(.)g(.)g(.)g(.)16 b Fe(11)0 1644 y Fg(cvs-mode-c)o(om)o(mit)6
-b Ff(.)t(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)20
-b Fe(11)0 1703 y Fg(cvs-mode-d)o(if)o(f-b)o(ac)o(kup)6
-b Ff(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)22 b Fe(14)0
-1761 y Fg(cvs-mode-d)o(if)o(f-c)o(vs)t Ff(.)s(.)6 b(.)h(.)f(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Fe(14)0 1819 y Fg(cvs-mode-e)o(di)o
-(ff)8 b Ff(.)s(.)e(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)h(.)21 b Fe(15)0 1877 y Fg(cvs-mode-e)o(me)o(rge)6
-b Ff(.)t(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)20
-b Fe(15)1015 416 y Fg(cvs-mode-fi)o(nd)o(-fi)o(le)s Ff(.)s(.)6
-b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Fe(12)1015
-474 y Fg(cvs-mode-fi)o(nd)o(-fi)o(le-)o(ot)o(her)o(-w)o(ind)o(ow)t
-Ff(.)s(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)17
-b Fe(12)1015 532 y Fg(cvs-mode-ig)o(no)o(re)7 b Ff(.)s(.)f(.)g(.)g(.)g
-(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Fe(14)1015
-590 y Fg(cvs-mode-lo)o(g)8 b Ff(.)e(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)25 b Fe(12)1015 648
-y Fg(cvs-mode-ma)o(rk)6 b Ff(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)23 b Fe(11)1015 706 y
-Fg(cvs-mode-ma)o(rk)o(-al)o(l-f)o(il)o(es)5 b Ff(.)s(.)i(.)f(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g
-(.)g(.)19 b Fe(11)1015 764 y Fg(cvs-mode-re)o(mo)o(ve-)o(fil)o(e)6
-b Ff(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Fe(13)1015
-823 y Fg(cvs-mode-re)o(mo)o(ve-)o(han)o(dl)o(ed)5 b Ff(.)s(.)i(.)f(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
-g(.)g(.)g(.)19 b Fe(14)1015 881 y Fg(cvs-mode-re)o(ve)o(rt-)o(upd)o(at)
-o(ed-)o(bu)o(ffe)o(rs)t Ff(.)s(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)h(.)f(.)17 b Fe(16)1015 939 y Fg(cvs-mode-st)o(at)o(us)7
-b Ff(.)s(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21
-b Fe(12)1015 997 y Fg(cvs-mode-un)o(do)o(-lo)o(cal)o(-c)o(han)o(ge)o(s)
-9 b Ff(.)s(.)d(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)h(.)22 b Fe(13)1015 1055 y Fg(cvs-mode-un)o(ma)o(rk)7
-b Ff(.)s(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21
-b Fe(11)1015 1113 y Fg(cvs-mode-un)o(ma)o(rk-)o(all)o(-f)o(ile)o(s)s
-Ff(.)s(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)h(.)16 b Fe(11)1015 1171 y Fg(cvs-mode-un)o(ma)o
-(rk-)o(up)s Ff(.)s(.)6 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17
-b Fe(11)1015 1229 y Fg(cvs-mode-up)o(da)o(te-)o(no-)o(pr)o(omp)o(t)s
-Ff(.)s(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)h(.)16 b Fe(10)1015 1287 y Fg(cvs-old-edi)o(ff)o
-(-in)o(ter)o(fa)o(ce)5 b Ff(.)s(.)i(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)19
-b Fe(15)1015 1346 y(cvs-sort-ignore-\014le)d(\(v)n(ariable\))8
-b Ff(.)g(.)e(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)h(.)f(.)g(.)21 b Fe(18)1015 1404 y(cvs-status-\015ags)15
-b(\(v)n(ariable\))9 b Ff(.)f(.)e(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)22
-b Fe(18)1015 1462 y Fg(cvs-update)5 b Ff(.)s(.)h(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h
-(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19
-b Fe(10)1015 1520 y(cvs-up)q(date-prog-outpu)q(t-skip)q(-regexp)d(\(v)n
-(ariable\))8 b Ff(.)g(.)e(.)g(.)g(.)g(.)21 b Fe(18)1015
-1632 y Fk(R)1015 1698 y Fg(run-ediff-f)o(ro)o(m-c)o(vs-)o(bu)o(ffe)o(r)
-s Ff(.)s(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)h(.)16 b Fe(15)1015 1810 y Fk(T)1015
-1877 y Fe(TMPDIR)e(\(en)o(vironmen)o(t)h(v)n(ariable\))5
-b Ff(.)j(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
-g(.)g(.)18 b Fe(18)p eop
-%%Page: 25 27
-25 26 bop 0 -58 a Fo(Concept)15 b(Index)1616 b(25)0 183
-y Fm(Concept)16 b(Index)0 437 y Fk(-)0 503 y Fe(-u)d(option)h(in)g(mo)q
-(dules)h(\014le)9 b Ff(.)e(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)22
-b Fe(18)0 616 y Fk(.)0 682 y Fe(.cvsignore)14 b(\014le,)g(sorting)5
-b Ff(.)j(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)18
-b Fe(18)0 795 y Fk(A)0 861 y Fe(Ab)q(out)13 b(p)q(cl-cvs)t
-Ff(.)8 b(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)17 b Fe(3)0 920 y(Activ)o(e)d(\014les)s
-Ff(.)7 b(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)16 b Fe(8)0 978 y(Added)e(\(\014le)f
-(status\))7 b Ff(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)
-f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
-(.)g(.)g(.)19 b Fe(7)0 1036 y(Adding)14 b(\014les)t Ff(.)7
-b(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-h(.)f(.)g(.)g(.)16 b Fe(13)0 1094 y(Arc)o(hiv)o(es)7
-b Ff(.)g(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Fe(4)0 1152
-y(Author,)13 b(ho)o(w)g(to)g(reac)o(h)c Ff(.)e(.)f(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)22 b Fe(22)0 1210 y(Authors)12 b
-Ff(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)23 b Fe(3)0 1268
-y(Automatically)16 b(inserting)f(newline)6 b Ff(.)i(.)e(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19
-b Fe(18)0 1326 y(Automatically)d(remo)o(v)o(e)d(handled)i(\014les)s
-Ff(.)8 b(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
-16 b Fe(18)0 1385 y(Automatically)g(sorting)e(.cvsignore)d
-Ff(.)6 b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)h(.)22 b Fe(18)0 1497 y Fk(B)0 1564 y Fe(Bu\013er)14
-b(con)o(ten)o(ts)e Ff(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Fe(7)0 1622 y(Bugs,)13
-b(ho)o(w)g(to)g(rep)q(ort)h(them)5 b Ff(.)h(.)g(.)h(.)f(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)
-18 b Fe(22)0 1680 y(Bugs,)13 b(kno)o(wn)t Ff(.)8 b(.)e(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)17
-b Fe(22)0 1738 y(Byte)c(compilation)h Ff(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Fe(16)0 1851
-y Fk(C)0 1917 y Fe(Ci)7 b Ff(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
-g(.)g(.)g(.)20 b Fe(11)0 1975 y(Commit)13 b(bu\013er)6
-b Ff(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)h(.)18 b Fe(11)0 2033 y(Commit)13 b(message,)h(inserting)h
-(newline)t Ff(.)8 b(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)17 b Fe(18)0 2091 y(Committing)d(c)o(hanges)8
-b Ff(.)g(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)
-f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21
-b Fe(11)0 2149 y(Con\015ict)14 b(\(\014le)g(status\))t
-Ff(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)16
-b Fe(7)0 2208 y(Con\015icts,)e(ho)o(w)f(to)g(resolv)o(e)h(them)d
-Ff(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)24 b Fe(14)0 2266 y(Con\015icts,)14 b(resolving)s
-Ff(.)9 b(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)16
-b Fe(15)0 2324 y(Con)o(text)d(di\013,)h(ho)o(w)f(to)g(get)t
-Ff(.)6 b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Fe(18)0
-2382 y(Con)o(tributors)6 b Ff(.)h(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)18 b
-Fe(3)0 2440 y(Cop)o(yrigh)o(t)c(message,)g(getting)g(rid)g(of)e(it)d
-Ff(.)e(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)22
-b Fe(18)0 2498 y(Customization)7 b Ff(.)i(.)d(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Fe(18)0
-2611 y Fk(D)0 2677 y Fe(Deleting)15 b(\014les)s Ff(.)8
-b(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
-g(.)g(.)g(.)16 b Fe(13)1015 437 y(Di\013)t Ff(.)8 b(.)e(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)h(.)f(.)g(.)g(.)g(.)g(.)17 b Fe(14)1015 495 y(Dired)5
-b Ff(.)j(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Fe(12)1015
-609 y Fk(E)1015 676 y Fe(Edi\013)7 b Ff(.)h(.)e(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20
-b Fe(14,)13 b(15)1015 734 y(Edit)h(bu\013er)s Ff(.)8
-b(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)17 b Fe(11)1015 792 y(Editing)f(\014les)c
-Ff(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)h(.)24 b Fe(12)1015 850 y(Email)15 b(arc)o(hiv)o(es)7
-b Ff(.)h(.)e(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)21 b Fe(4)1015 908 y(Email)15 b(to)e(the)g(author)t
-Ff(.)7 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)17
-b Fe(22)1015 966 y(Emerge)6 b Ff(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)
-f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)19
-b Fe(15)1015 1024 y(Enhancemen)o(ts)7 b Ff(.)i(.)d(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b
-Fe(20)1015 1083 y(Erasing)15 b(commit)f(message)8 b Ff(.)e(.)g(.)g(.)h
-(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
-g(.)g(.)g(.)g(.)g(.)21 b Fe(11)1015 1141 y(Erasing)15
-b(the)e(input)i(bu\013er)s Ff(.)7 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)
-16 b Fe(18)1015 1199 y(Example)f(run)t Ff(.)7 b(.)f(.)g(.)g(.)g(.)g(.)g
-(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)17
-b Fe(5)1015 1257 y(Expunging)f(unin)o(teresting)g(en)o(tries)6
-b Ff(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)h(.)19 b Fe(14)1015 1371 y Fk(F)1015 1438 y Fe(F)l(A)o(Q)t
-Ff(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h
-(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18
-b Fe(22)1015 1496 y(File)d(selection)s Ff(.)8 b(.)e(.)g(.)g(.)g(.)h(.)f
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)16
-b Fe(8)1015 1554 y(File)f(status)7 b Ff(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)20
-b Fe(7)1015 1612 y(Finding)c(\014les)9 b Ff(.)e(.)f(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)22
-b Fe(12)1015 1670 y(Flush)15 b(c)o(hanges)d Ff(.)6 b(.)g(.)g(.)h(.)f(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)24
-b Fe(13)1015 1728 y(Ftp-sites)5 b Ff(.)j(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h
-(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
-18 b Fe(4)1015 1843 y Fk(G)1015 1909 y Fe(Generating)d(a)e(t)o(yp)q
-(eset)h(man)o(ual)6 b Ff(.)i(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b
-Fe(2)1015 1967 y(Generating)c(the)e(on-line)i(man)o(ual)d
-Ff(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)23 b Fe(2)1015 2025 y(Getting)15
-b(p)q(cl-cvs)c Ff(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)h(.)f(.)g(.)23 b Fe(4)1015 2083 y(Getting)15
-b(rid)e(of)g(lo)q(c)o(k)h(\014les)f Ff(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)25 b Fe(16)1015 2141 y(Getting)15 b(rid)e(of)g(the)g(Cop)o
-(yrigh)o(t)i(message.)7 b Ff(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
-g(.)g(.)g(.)20 b Fe(18)1015 2200 y(Getting)15 b(rid)e(of)g(unin)o
-(teresting)j(lines)7 b Ff(.)h(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)20 b Fe(14)1015 2258 y(Getting)15
-b(status)8 b Ff(.)e(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)h(.)f(.)g(.)21 b Fe(12)1015 2316 y(Getting)15
-b(the)e(*cvs*)g(bu\013er)f Ff(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24
-b Fe(10)1015 2430 y Fk(H)1015 2497 y Fe(Handled)15 b(lines,)f(remo)o
-(ving)h(them)6 b Ff(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Fe(14)1015 2611
-y Fk(I)1015 2677 y Fe(Info-\014le)14 b(\(ho)o(w)f(to)g(generate\))5
-b Ff(.)i(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Fe(2)p eop
-%%Page: 26 28
-26 27 bop 0 -58 a Fo(Concept)15 b(Index)1616 b(26)0 183
-y Fe(Inhibiting)16 b(the)d(Cop)o(yrigh)o(t)i(message.)6
-b Ff(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)19 b Fe(18)0 241 y(Installation)9 b Ff(.)g(.)d(.)g(.)g(.)g(.)g(.)g
-(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)
-f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)21
-b Fe(1)0 299 y(Installation)16 b(of)d(elisp)h(\014les)7
-b Ff(.)h(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b
-Fe(1)0 358 y(Installation)c(of)d(on-line)i(man)o(ual)c
-Ff(.)6 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)h(.)22 b Fe(2)0 416 y(Installation)16
-b(of)d(t)o(yp)q(eset)g(man)o(ual)6 b Ff(.)i(.)e(.)g(.)g(.)g(.)g(.)g(.)g
-(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19
-b Fe(2)0 474 y(In)o(tro)q(duction)8 b Ff(.)g(.)e(.)g(.)g(.)g(.)g(.)h(.)
-f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)20
-b Fe(5)0 532 y(In)o(v)o(oking)15 b(dired)8 b Ff(.)f(.)f(.)g(.)g(.)g(.)g
-(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)
-f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21
-b Fe(12)0 590 y(In)o(v)o(oking)15 b(edi\013)c Ff(.)6
-b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)22
-b Fe(14,)13 b(15)0 648 y(In)o(v)o(oking)i(emerge)9 b
-Ff(.)d(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-22 b Fe(15)0 781 y Fk(K)0 847 y Fe(Kno)o(wn)13 b(bugs)8
-b Ff(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)21 b Fe(22)0 980 y Fk(L)0 1047 y Fe(Loading)15
-b(\014les)6 b Ff(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Fe(12)0 1105 y(Lo)q(c)o(k)13
-b(\014les)8 b Ff(.)f(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)20 b Fe(16)0
-1163 y(Log)13 b(\(R)o(CS/cvs)h(command\))9 b Ff(.)e(.)f(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)22 b Fe(12)0 1296 y Fk(M)0 1362 y Fe(Man)o(ual)15
-b(installation)h(\(on-line\))8 b Ff(.)h(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21
-b Fe(2)0 1420 y(Man)o(ual)15 b(installation)h(\(t)o(yp)q(eset\))t
-Ff(.)8 b(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)
-f(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Fe(2)0 1478 y(Mark)o(ed)d(\014les)e
-Ff(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)h(.)23 b Fe(8)0 1537 y(Marking)15
-b(\014les)d Ff(.)6 b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)h(.)f(.)g(.)g(.)g(.)24 b Fe(11)0 1595 y(Merged)14
-b(\(\014le)g(status\))8 b Ff(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f
-(.)g(.)g(.)g(.)g(.)20 b Fe(7)0 1653 y(Mo)q(di\014ed)15
-b(\(\014le)f(status\))5 b Ff(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)18 b Fe(7)0 1711 y(Mo)q(dules)d(\014le)f(\(-u)f
-(option\))6 b Ff(.)h(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19
-b Fe(18)0 1769 y(Mo)o(v)o(e)13 b(a)o(w)o(a)o(y)g Ff(\014le)j
-Fe(-)d(it)g(is)h(in)g(the)f(w)o(a)o(y)g(\(\014le)h(status\))t
-Ff(.)7 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Fe(7)0 1827
-y(Mo)o(v)o(emen)o(t)d(Commands)d Ff(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)23 b Fe(10)0 1960 y Fk(O)0 2026 y Fe(On-line)15
-b(man)o(ual)f(\(ho)o(w)f(to)g(generate\))7 b Ff(.)g(.)f(.)g(.)g(.)g(.)g
-(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20
-b Fe(2)0 2159 y Fk(P)0 2226 y Fe(P)o(atc)o(hed)14 b(\(\014le)g
-(status\))d Ff(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)24 b Fe(7)0 2284 y(Prin)o(ting)15 b(a)e(man)o(ual)g
-Ff(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24
-b Fe(2)0 2342 y(Problems,)14 b(list)g(of)f(common)8 b
-Ff(.)f(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21 b Fe(22)0 2400
-y(Putting)14 b(\014les)g(under)g(CVS)f(con)o(trol)7 b
-Ff(.)g(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)20 b Fe(13)1015 183 y Fk(R)1015 250 y Fe(Recompilin)q(g)c
-(elisp)e(\014les)f Ff(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)24
-b Fe(16)1015 308 y(Remo)o(v)o(ed)14 b(\(\014le)g(status\))d
-Ff(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24
-b Fe(7)1015 366 y(Remo)o(v)o(ed)14 b(b)o(y)e(y)o(ou,)h(c)o(hanged)g(in)
-h(rep)q(ository)g(\(\014le)f(status\))5 b Ff(.)i(.)17
-b Fe(7)1015 424 y(Remo)o(v)o(ed)d(from)f(rep)q(ository)i(\(\014le)f
-(status\))d Ff(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)24 b Fe(7)1015 482 y(Remo)o(v)o(ed)14 b(from)f(rep)q(ository)m(,)h
-(c)o(hanged)h(b)o(y)e(y)o(ou)g(\(\014le)h(status\))1099
-540 y Ff(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h
-(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)19
-b Fe(7)1015 598 y(Remo)o(ving)c(\014les)7 b Ff(.)g(.)g(.)f(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)20
-b Fe(13)1015 656 y(Remo)o(ving)15 b(unin)o(teresting)h(\(pro)q
-(cessed\))e(lines)7 b Ff(.)h(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20
-b Fe(14)1015 715 y(Rep)q(orting)15 b(bugs)f(and)g(ideas)8
-b Ff(.)g(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)22 b Fe(22)1015 773
-y(Require)15 b(\014nal)f(newline)s Ff(.)9 b(.)d(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)17 b Fe(18)1015 831 y(Resolving)f(con\015icts)7
-b Ff(.)h(.)e(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21
-b Fe(15)1015 889 y(Resurrecting)15 b(\014les)d Ff(.)6
-b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)23
-b Fe(13)1015 947 y(Rev)o(erting)15 b(bu\013ers)d Ff(.)6
-b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24
-b Fe(16)1015 1005 y(Rev)o(erting)15 b(bu\013ers)f(after)f(commit)e
-Ff(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
-23 b Fe(11,)13 b(18)1015 1113 y Fk(S)1015 1180 y Fe(Selected)i(\014les)
-6 b Ff(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)h(.)f(.)g(.)g(.)g(.)19 b Fe(8)1015 1238 y(Selecting)d(\014les)e
-(\(commands)g(to)f(mark)g(\014les\))7 b Ff(.)h(.)e(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)21 b Fe(11)1015 1296 y(Sites)5 b Ff(.)j(.)e(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)18 b Fe(4)1015 1354
-y(Sorting)d(the)e(.cvsignore)i(\014le)9 b Ff(.)d(.)g(.)h(.)f(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g
-(.)g(.)22 b Fe(18)1015 1412 y(Status)14 b(\(cvs)f(command\))c
-Ff(.)e(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)22 b Fe(12)1015
-1470 y(Syncing)15 b(bu\013ers)c Ff(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Fe(16)1015
-1578 y Fk(T)1015 1644 y Fe(T)m(eX)13 b(-)f(generating)j(a)e(t)o(yp)q
-(eset)h(man)o(ual)8 b Ff(.)g(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)h(.)f(.)g(.)g(.)21 b Fe(2)1015 1703 y(This)14
-b(rep)q(ository)h(is)f(missing!)p Fd(:)7 b(:)f(:)19 b
-Fe(\(\014le)14 b(status\))e Ff(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)24 b Fe(7)1015 1810 y Fk(U)1015 1877 y Fe(Undo)14
-b(c)o(hanges)t Ff(.)7 b(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)h(.)f(.)g(.)g(.)17 b Fe(13)1015 1935 y(Unidi\013,)e(ho)o(w)
-e(to)g(get)5 b Ff(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)18 b Fe(18)1015 1993 y(Unin)o(teresting)e(en)o(tries,)d
-(getting)i(rid)e(of)g(them)5 b Ff(.)h(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
-(.)g(.)18 b Fe(14)1015 2051 y(Unkno)o(wn)c(\(\014le)g(status\))8
-b Ff(.)e(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21
-b Fe(7)1015 2109 y(Up)q(date)14 b(program)g(\(-u)f(option)h(in)g(mo)q
-(dules)h(\014le\))c Ff(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)24
-b Fe(18)1015 2167 y(Up)q(dated)14 b(\(\014le)g(status\))6
-b Ff(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)19
-b Fe(7)1015 2275 y Fk(V)1015 2342 y Fe(V)m(ariables,)c(list)f(of)f(all)
-c Ff(.)e(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)22
-b Fe(18)1015 2400 y(Viewing)15 b(di\013erences)5 b Ff(.)j(.)e(.)g(.)g
-(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)h(.)f(.)g(.)g(.)g(.)g(.)18 b Fe(14,)13 b(15)p eop
-%%Page: 27 29
-27 28 bop 0 -58 a Fo(Key)16 b(Index)1700 b(27)0 183 y
-Fm(Key)15 b(Index)0 430 y Fk(A)0 496 y Fg(a)d(-)h(add)e(a)i(file)5
-b Ff(.)g(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
-(.)g(.)g(.)18 b Fe(13)0 554 y Fg(A)12 b(-)h(add)e(ChangeLog)f(entry)f
-Ff(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Fe(12)0 679 y
-Fk(B)0 745 y Fg(b)12 b(-)h(diff)e(backup)g(file)6 b Ff(.)t(.)g(.)g(.)g
-(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)
-f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Fe(14)0 870 y Fk(C)0
-936 y Fg(c)12 b(-)h(commit)d(files)e Ff(.)t(.)e(.)g(.)g(.)h(.)f(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Fe(11)0 994 y Fg(C)12
-b(-)h(commit)d(files)h(with)g(ChangeLog)f(message)c Ff(.)s(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)19 b Fe(11)0 1052 y Fg(C-k)12 b(-)g(remove)f
-(selected)e(entries)s Ff(.)t(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)16 b Fe(14)0 1110 y Fg(C-n)c(-)g(Move)f
-(down)h(one)f(file)t Ff(.)5 b(.)h(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)17
-b Fe(10)0 1169 y Fg(C-p)12 b(-)g(Move)f(up)h(one)g(file)7
-b Ff(.)e(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Fe(10)0
-1293 y Fk(D)0 1359 y Fg(d)12 b(-)h(run)e(`cvs)19 b(diff')5
-b Ff(.)t(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)18
-b Fe(14)0 1418 y Fg(DEL)12 b(-)g(unmark)f(previous)e(file)e
-Ff(.)e(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)20 b Fe(11)0 1542 y Fk(E)0 1609
-y Fg(e)12 b(-)h(invoke)d(`ediff')5 b Ff(.)t(.)h(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)
-f(.)g(.)g(.)g(.)g(.)g(.)18 b Fe(15)0 1667 y Fg(E)12 b(-)h(invoke)d
-(`emerge')t Ff(.)s(.)c(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17
-b Fe(15)0 1725 y Fg(ESC)12 b(DEL)f(-)i(unmark)d(all)i(files)c
-Ff(.)e(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)h(.)f(.)g(.)g(.)g(.)23 b Fe(11)0 1849 y Fk(F)0 1916
-y Fg(f)12 b(-)h(find)e(file)g(or)h(directory)7 b Ff(.)f(.)g(.)h(.)f(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
-23 b Fe(12)0 2040 y Fk(G)0 2107 y Fg(g)12 b(-)h(Rerun)e(`cvs)18
-b(update')9 b Ff(.)s(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)21
-b Fe(10)0 2231 y Fk(I)0 2298 y Fg(i)12 b(-)h(ignoring)d(files)5
-b Ff(.)t(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)18
-b Fe(14)1015 430 y Fk(L)1015 496 y Fg(l)13 b(-)f(run)g(`cvs)18
-b(log')7 b Ff(.)t(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)20 b Fe(12)1015 604 y Fk(M)1015 670 y Fg(m)13 b(-)f(marking)e(a)j
-(file)c Ff(.)t(.)d(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)22
-b Fe(11)1015 729 y Fg(M)13 b(-)f(marking)e(all)i(files)5
-b Ff(.)t(.)h(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)18 b
-Fe(11)1015 836 y Fk(N)1015 903 y Fg(n)13 b(-)f(Move)g(down)f(one)g
-(file)c Ff(.)e(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)20
-b Fe(10)1015 1011 y Fk(O)1015 1077 y Fg(o)13 b(-)f(find)g(file)f(in)h
-(other)f(window)c Ff(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)h(.)f(.)g(.)23 b Fe(12)1015 1185 y Fk(P)1015
-1252 y Fg(p)13 b(-)f(Move)g(up)g(on)g(file)d Ff(.)d(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-h(.)f(.)g(.)g(.)g(.)g(.)g(.)24 b Fe(10)1015 1359 y Fk(Q)1015
-1426 y Fg(q)13 b(-)f(bury)g(the)f(*cvs*)g(buffer)s Ff(.)t(.)6
-b(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)h(.)16 b Fe(16)1015 1534 y Fk(R)1015
-1600 y Fg(r)d(-)f(remove)f(a)h(file)d Ff(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)23 b Fe(13)1015 1658 y
-Fg(R)13 b(-)f(revert)f(buffers)5 b Ff(.)s(.)i(.)f(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)19 b Fe(16)1015 1766 y Fk(S)1015
-1833 y Fg(s)13 b(-)f(run)g(`cvs)18 b(status')9 b Ff(.)d(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)25 b Fe(12)1015 1891 y Fg(SPC)12
-b(-)h(Move)e(down)g(one)h(file)t Ff(.)5 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-18 b Fe(10)1015 1999 y Fk(U)1015 2065 y Fg(U)13 b(-)f(undo)g(changes)c
-Ff(.)s(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)21
-b Fe(13)1015 2123 y Fg(u)13 b(-)f(unmark)f(a)h(file)d
-Ff(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)23
-b Fe(11)1015 2231 y Fk(X)1015 2298 y Fg(x)13 b(-)f(remove)f(processed)e
-(entries)c Ff(.)s(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Fe(14)p eop
-%%Page: -1 30
--1 29 bop 1937 -58 a Fo(i)0 183 y Fm(Short)16 b(Con)n(ten)n(ts)0
-299 y Fc(1)78 b(Installation)9 b Fb(.)i(.)e(.)h(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g
-(.)26 b Fc(1)0 366 y(2)78 b(Ab)q(out)17 b(p)q(cl-cvs)10
-b Fb(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)26 b Fc(3)0 432 y(3)78
-b(Getting)17 b(started)8 b Fb(.)i(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)25
-b Fc(5)0 499 y(4)78 b(Bu\013er)16 b(con)o(ten)o(ts)11
-b Fb(.)f(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)28 b Fc(7)0 565 y(5)78
-b(Commands)13 b Fb(.)c(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)
-g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)29
-b Fc(10)0 632 y(6)78 b(Customization)6 b Fb(.)j(.)h(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)22
-b Fc(18)0 698 y(7)78 b(F)l(uture)16 b(enhancemen)o(ts)f
-Fb(.)10 b(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-f(.)h(.)33 b Fc(20)0 764 y(8)78 b(Bugs)17 b(\(kno)o(wn)f(and)h(unkno)o
-(wn\))d Fb(.)c(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)29
-b Fc(22)0 831 y(App)q(endix)16 b(A)49 b(GNU)15 b(GENERAL)i(PUBLIC)f
-(LICENSE)h Fb(.)10 b(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)
-h(.)g(.)33 b Fc(23)0 897 y(F)l(unction)16 b(and)h(V)l(ariable)e(Index)i
-Fb(.)10 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)
-34 b Fc(24)0 964 y(Concept)16 b(Index)e Fb(.)c(.)f(.)h(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g
-(.)g(.)g(.)30 b Fc(25)0 1030 y(Key)16 b(Index)g Fb(.)10
-b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)34 b
-Fc(27)p eop
-%%Page: -2 31
--2 30 bop 1925 -58 a Fo(ii)0 183 y Fm(T)-7 b(able)15
-b(of)g(Con)n(ten)n(ts)0 358 y Fk(1)67 b(Installation)13
-b Fb(.)e(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)f(.)h(.)g(.)35 b Fk(1)149 435 y Fo(1.1)45
-b(Installation)16 b(of)f(the)g(p)q(cl-cvs)i(program)5
-b Fa(.)i(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
-h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)19
-b Fo(1)149 498 y(1.2)45 b(Installation)16 b(of)f(the)g(on-line)i(man)o
-(ual.)11 b Fa(.)d(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
-(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)25
-b Fo(2)149 560 y(1.3)45 b(Ho)o(w)15 b(to)f(mak)o(e)h(t)o(yp)q(eset)g
-(do)q(cumen)o(tation)g(from)g(p)q(cl-cvs.texinfo)6 b
-Fa(.)j(.)f(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)21 b Fo(2)0
-684 y Fk(2)67 b(Ab)r(out)22 b(p)r(cl-cvs)17 b Fb(.)10
-b(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-f(.)h(.)38 b Fk(3)149 762 y Fo(2.1)45 b(Con)o(tributors)14
-b(to)h(p)q(cl-cvs)e Fa(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
-f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
-(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)26 b Fo(3)149
-825 y(2.2)45 b(Where)15 b(can)h(I)f(get)g(p)q(cl-cvs?)6
-b Fa(.)k(.)d(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)
-f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
-(.)f(.)h(.)f(.)h(.)f(.)21 b Fo(4)0 949 y Fk(3)67 b(Getting)23
-b(started)8 b Fb(.)i(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)
-h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)f(.)h(.)g(.)g(.)g(.)30 b Fk(5)0 1089 y(4)67 b(Bu\013er)23
-b(con)n(ten)n(ts)11 b Fb(.)f(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)
-g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)33 b Fk(7)149 1167 y Fo(4.1)45
-b(File)16 b(status)9 b Fa(.)e(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
-(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)
-f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
-(.)f(.)h(.)f(.)h(.)f(.)h(.)23 b Fo(7)149 1229 y(4.2)45
-b(Selected)17 b(\014les)9 b Fa(.)f(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
-(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
-h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
-(.)h(.)g(.)f(.)h(.)f(.)23 b Fo(8)0 1354 y Fk(5)67 b(Commands)13
-b Fb(.)c(.)h(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)
-g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g
-(.)g(.)g(.)g(.)g(.)g(.)35 b Fk(10)149 1432 y Fo(5.1)45
-b(Up)q(dating)16 b(the)f(directory)e Fa(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h
-(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)
-f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)28
-b Fo(10)149 1494 y(5.2)45 b(Mo)o(v)o(emen)o(t)14 b(Commands)9
-b Fa(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)
-h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
-(.)h(.)f(.)h(.)f(.)h(.)f(.)25 b Fo(10)149 1556 y(5.3)45
-b(Marking)15 b(\014les)5 b Fa(.)k(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
-(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
-h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
-(.)h(.)f(.)h(.)g(.)20 b Fo(11)149 1618 y(5.4)45 b(Committing)15
-b(c)o(hanges)6 b Fa(.)h(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
-(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)
-h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)21 b
-Fo(11)149 1681 y(5.5)45 b(Editing)16 b(\014les)t Fa(.)9
-b(.)f(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
-(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
-f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)20
-b Fo(12)149 1743 y(5.6)45 b(Getting)15 b(info)h(ab)q(out)f(\014les)c
-Fa(.)d(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
-(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
-f(.)h(.)f(.)h(.)f(.)26 b Fo(12)149 1805 y(5.7)45 b(Adding)16
-b(and)g(remo)o(ving)f(\014les)f Fa(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
-h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
-(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)28 b Fo(13)149
-1868 y(5.8)45 b(Undoing)16 b(c)o(hanges)9 b Fa(.)f(.)f(.)h(.)f(.)h(.)f
-(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
-h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g
-(.)f(.)h(.)f(.)h(.)24 b Fo(13)149 1930 y(5.9)45 b(Remo)o(ving)16
-b(handled)g(en)o(tries)6 b Fa(.)i(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
-(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
-f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)21 b Fo(14)149
-1992 y(5.10)45 b(Ignoring)15 b(\014les)5 b Fa(.)k(.)f(.)f(.)h(.)f(.)h
-(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
-f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
-(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)21 b Fo(14)149 2054 y(5.11)45
-b(Viewing)16 b(di\013erences)7 b Fa(.)i(.)f(.)f(.)h(.)f(.)h(.)f(.)h(.)f
-(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
-h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)23
-b Fo(14)149 2117 y(5.12)45 b(Running)17 b(edi\013)10
-b Fa(.)d(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
-h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
-(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)25
-b Fo(15)149 2179 y(5.13)45 b(Running)17 b(emerge)t Fa(.)7
-b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
-(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
-f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)19 b Fo(15)149
-2241 y(5.14)45 b(Rev)o(erting)16 b(y)o(our)e(bu\013ers)8
-b Fa(.)g(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
-f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
-(.)f(.)h(.)g(.)f(.)h(.)23 b Fo(16)149 2303 y(5.15)45
-b(Miscellaneous)17 b(commands)d Fa(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
-h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
-(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)29 b Fo(16)0
-2428 y Fk(6)67 b(Customization)6 b Fb(.)k(.)g(.)g(.)g(.)g(.)g(.)f(.)h
-(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
-f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)29 b Fk(18)0
-2568 y(7)67 b(F)-6 b(uture)24 b(enhancemen)n(ts)16 b
-Fb(.)10 b(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)38
-b Fk(20)p eop
-%%Page: -3 32
--3 31 bop 1912 -58 a Fo(iii)0 45 y Fk(8)67 b(Bugs)22
-b(\(kno)n(wn)h(and)g(unkno)n(wn\))14 b Fb(.)d(.)f(.)f(.)h(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)36
-b Fk(22)0 185 y(App)r(endix)24 b(A)67 b(GNU)22 b(GENERAL)g(PUBLIC)g
-(LICENSE)141 247 y Fb(.)10 b(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)
-g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g
-(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)
-g(.)g(.)g(.)g(.)29 b Fk(23)0 387 y(F)-6 b(unction)25
-b(and)d(V)-6 b(ariable)24 b(Index)17 b Fb(.)10 b(.)g(.)g(.)g(.)g(.)f(.)
-h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)38 b Fk(24)0 527 y(Concept)22 b(Index)11 b Fb(.)g(.)f(.)g(.)g(.)g(.)
-g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g
-(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)34
-b Fk(25)0 667 y(Key)22 b(Index)d Fb(.)10 b(.)g(.)g(.)g(.)g(.)f(.)h(.)g
-(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)
-h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g
-(.)40 b Fk(27)p eop
-%%Trailer
-end
-userdict /end-hook known{end-hook}if
-%%EOF
diff --git a/gnu/usr.bin/cvs/tools/pcl-cvs/pcl-cvs.texinfo b/gnu/usr.bin/cvs/tools/pcl-cvs/pcl-cvs.texinfo
deleted file mode 100644
index 7e4e5834816..00000000000
--- a/gnu/usr.bin/cvs/tools/pcl-cvs/pcl-cvs.texinfo
+++ /dev/null
@@ -1,1565 +0,0 @@
-\input texinfo @c -*-texinfo-*-
-
-@comment OrigId: pcl-cvs.texinfo,v 1.45 1993/05/31 22:38:15 ceder Exp
-@comment @@(#)cvs/contrib/pcl-cvs:$Name: $:$Id: pcl-cvs.texinfo,v 1.1 1996/05/06 22:20:48 tholo Exp $
-
-@comment Documentation for the GNU Emacs CVS mode.
-@comment Copyright (C) 1992 Per Cederqvist
-
-@comment This file is part of the pcl-cvs distribution.
-
-@comment Pcl-cvs is free software; you can redistribute it and/or modify
-@comment it under the terms of the GNU General Public License as published by
-@comment the Free Software Foundation; either version 1, or (at your option)
-@comment any later version.
-
-@comment Pcl-cvs is distributed in the hope that it will be useful,
-@comment but WITHOUT ANY WARRANTY; without even the implied warranty of
-@comment MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-@comment GNU General Public License for more details.
-
-@comment You should have received a copy of the GNU General Public License
-@comment along with pcl-cvs; see the file COPYING. If not, write to
-@comment the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
-
-@setfilename pcl-cvs.info
-@settitle Pcl-cvs - The Emacs Front-End to CVS
-@setchapternewpage on
-
-@ifinfo
-Copyright @copyright{} 1992 Per Cederqvist
-
-Permission is granted to make and distribute verbatim copies of
-this manual provided the copyright notice and this permission notice
-are preserved on all copies.
-
-@ignore
-Permission is granted to process this file through Tex and print the
-results, provided the printed document carries copying permission
-notice identical to this one except for the removal of this paragraph
-(this paragraph not being relevant to the printed manual).
-
-@end ignore
-Permission is granted to copy and distribute modified versions of this
-manual under the conditions for verbatim copying, provided also that the
-section entitled ``GNU General Public License'' is included exactly as
-in the original, and provided that the entire resulting derived work is
-distributed under the terms of a permission notice identical to this one.
-
-Permission is granted to copy and distribute translations of this manual
-into another language, under the above conditions for modified versions,
-except that the section entitled ``GNU General Public License'' and
-this permission notice may be included in translations approved by the
-Free Software Foundation instead of in the original English.
-@end ifinfo
-
-@synindex vr fn
-@comment The titlepage section does not appear in the Info file.
-@titlepage
-@sp 4
-@comment The title is printed in a large font.
-@center @titlefont{User's Guide}
-@sp
-@center @titlefont{to}
-@sp
-@center @titlefont{pcl-cvs - the Emacs Front-End to CVS}
-@sp 2
-@center release 1.05-CVS-$Name: $
-@comment -release-
-@sp 3
-@center Per Cederqvist
-@sp 3
-@center last updated 20 Nov 1995
-@comment -date-
-
-@comment The following two commands start the copyright page
-@comment for the printed manual. This will not appear in the Info file.
-@page
-@vskip 0pt plus 1filll
-Copyright @copyright{} 1992 Per Cederqvist
-
-Permission is granted to make and distribute verbatim copies of
-this manual provided the copyright notice and this permission notice
-are preserved on all copies.
-
-Permission is granted to copy and distribute modified versions of this
-manual under the conditions for verbatim copying, provided also that the
-section entitled ``GNU General Public License'' is included exactly as
-in the original, and provided that the entire resulting derived work is
-distributed under the terms of a permission notice identical to this one.
-
-Permission is granted to copy and distribute translations of this manual
-into another language, under the above conditions for modified versions,
-except that the section entitled ``GNU General Public License'' and
-this permission notice may be included in translations approved by the
-Free Software Foundation instead of in the original English.
-@end titlepage
-
-@comment ================================================================
-@comment The real text starts here
-@comment ================================================================
-
-@node Top, Installation, (dir), (dir)
-@comment node-name, next, previous, up
-
-
-@ifinfo
-This info manual describes pcl-cvs which is a GNU Emacs front-end to
-CVS. It works with CVS versions 1.5 through 1.7 and newer, and possibly
-CVS-1.3 and CVS-1.4A2. This manual is updated to release
-1.05-CVS-$Name: $ of pcl-cvs.
-@end ifinfo
-@comment -release-
-
-@menu
-* Installation:: How to install pcl-cvs on your system.
-* About pcl-cvs:: Authors and ftp sites.
-
-* Getting started:: An introduction with a walk-through example.
-* Buffer contents:: An explanation of the buffer contents.
-* Commands:: All commands, grouped by type.
-
-* Customization:: How you can tailor pcl-cvs to suit your needs.
-* Future enhancements:: Future enhancements of pcl-cvs.
-* Bugs:: Bugs (known and unknown).
-* COPYING:: GNU General Public License
-* Function and Variable Index:: List of functions and variables.
-* Concept Index:: List of concepts.
-* Key Index:: List of keystrokes.
-
- --- The Detailed Node Listing ---
-
-Installation
-
-* Pcl-cvs installation:: How to install pcl-cvs on your system.
-* On-line manual installation:: How to install the on-line manual.
-* Typeset manual installation:: How to create typeset documentation
- about pcl-cvs.
-
-About pcl-cvs
-
-* Contributors:: Contributors to pcl-cvs.
-* Archives:: Where can I get a copy of Pcl-Cvs?
-
-Buffer contents
-
-* File status:: The meaning of the second field.
-* Selected files:: How selection works.
-
-Commands
-
-* Updating the directory:: Commands to update the local directory
-* Movement commands:: How to move up and down in the buffer
-* Marking files:: How to mark files that other commands
- will later operate on.
-* Committing changes:: Checking in your modifications to the
- CVS repository.
-* Editing files:: Loading files into Emacs.
-* Getting info about files:: Display the log and status of files.
-* Adding and removing files:: Adding and removing files
-* Undoing changes:: Undoing changes
-* Removing handled entries:: Uninteresting lines can easily be removed.
-* Ignoring files:: Telling CVS to ignore generated files.
-* Viewing differences:: Commands to @samp{diff} different versions.
-* Invoking Ediff:: Running @samp{ediff} from @samp{*cvs*} buffer.
-* Invoking Emerge:: Running @samp{emerge} from @samp{*cvs*} buffer.
-* Reverting your buffers:: Reverting your buffers
-* Miscellaneous commands:: Miscellaneous commands
-@end menu
-
-
-@node Installation, About pcl-cvs, Top, Top
-@comment node-name, next, previous, up
-
-@chapter Installation
-@cindex Installation
-
-This section describes the installation of pcl-cvs, the GNU Emacs CVS
-front-end. You should install not only the elisp files themselves, but
-also the on-line documentation so that your users will know how to use
-it. You can create typeset documentation from the file
-@file{pcl-cvs.texinfo} as well as an on-line info file. The following
-steps are also described in the file @file{INSTALL} in the source
-directory.
-
-@menu
-* Pcl-cvs installation:: How to install pcl-cvs on your system.
-* On-line manual installation:: How to install the on-line manual.
-* Typeset manual installation:: How to create typeset documentation
- about pcl-cvs.
-@end menu
-
-
-@node Pcl-cvs installation, On-line manual installation, Installation, Installation
-@comment node-name, next, previous, up
-@section Installation of the pcl-cvs program
-@cindex Installation of elisp files
-
-@enumerate
-@item
-Possibly edit the file @file{Makefile} to reflect the situation at your
-site. We say "possibly" because the version of pcl-cvs included with
-CVS uses a configuration mechanism integrated with the overall
-mechanisms used by the CVS build and install procedures. Thus the file
-@code{Makefile} will be generated automatically from the file
-@code{Makefile.in}, and it should not be necessary to edit it further.
-
-If you do have to edit the @file{Makefile}, the only things you have to
-change is the definition of @code{lispdir} and @code{infodir}. The
-elisp files will be copied to @code{lispdir}, and the info file(s) to
-@code{infodir}.
-
-@item
-Configure pcl-cvs.el
-
-There are a couple of pathnames that you have to check to make sure that
-they match your system. They appear early in the file
-@samp{pcl-cvs.el}.
-
-@strong{NOTE:} If your system is running emacs 18.57 or earlier you MUST
-uncomment the line that says:
-@example
-(setq delete-exited-processes nil)
-@end example
-
-Setting @code{delete-exited-processes} to @code{nil} works around a bug
-in emacs that causes it to dump core. The bug was fixed in emacs
-18.58.@refill
-
-@item
-Release 1.05 and later of pcl-cvs requires parts of the Elib library,
-version 1.0 or later. Elib is available via anonymous ftp from
-prep.ai.mit.edu in @file{pub/gnu/elib-1.0.tar.gz}, and from a lot of
-other sites that mirror prep. Get Elib, and install it, before
-proceeding.
-
-@strong{NOTE:} The version of pcl-cvs included with CVS includes a copy
-of Elib in the sub-directory @file{elib} under the
-@file{contrib/pcl-cvs} directory.
-
-@item
-Type @samp{make install} in the source directory. This will
-byte-compile all @file{.el} files and copy the @file{*.elc} files into
-the directory you specified in step 1.
-
-If you want to install the @file{*.el} files too, you can type
-@samp{make install-el} to do so.
-
-If you only want to create the compiled elisp files, but don't want to
-install them, you can type @samp{make} without parameters.
-
-@item
-Edit the file @file{default.el} in your emacs lisp directory (usually
-@file{/usr/gnu/lib/emacs/site-lisp} or something similar) and enter the
-contents of the file @file{pcl-cvs-startup.el} into it. It contains a
-couple of @code{auto-load}s that facilitates the use of pcl-cvs.
-
-@end enumerate
-
-
-@node On-line manual installation, Typeset manual installation, Pcl-cvs installation, Installation
-@comment node-name, next, previous, up
-
-@section Installation of the on-line manual.
-@cindex Manual installation (on-line)
-@cindex Installation of on-line manual
-@cindex Generating the on-line manual
-@cindex On-line manual (how to generate)
-@cindex Info-file (how to generate)
-
-@enumerate
-@item
-Create the info file(s) @file{pcl-cvs.info*} from @file{pcl-cvs.texinfo}
-by typing @samp{make info}. If you don't have the program
-@samp{makeinfo} you can get it by anonymous ftp from
-e.g. @samp{prep.ai.mit.edu} as @file{pub/gnu/texinfo-3.7.tar.gz} (there
-might be a newer version there when you read this).@refill
-
-@item
-Install the info file(s) @file{pcl-cvs.info*} into your standard
-@file{info} directory. You should be able to do this by typing
-@samp{make install-info}.@refill
-
-@item
-Edit the file @file{dir} in the @file{info} directory and enter one line
-to contain a pointer to the info file(s) @file{pcl-cvs.info*}. The line
-can, for instance, look like this:@refill
-
-@example
-* Pcl-cvs: (pcl-cvs). An Emacs front-end to CVS.
-@end example
-@end enumerate
-
-
-@node Typeset manual installation, , On-line manual installation, Installation
-@comment node-name, next, previous, up
-
-@section How to make typeset documentation from pcl-cvs.texinfo
-@cindex Manual installation (typeset)
-@cindex Installation of typeset manual
-@cindex Printing a manual
-@cindex TeX - generating a typeset manual
-@cindex Generating a typeset manual
-
-If you have @TeX{} installed at your site, you can make a typeset manual
-from @file{pcl-cvs.texinfo}.
-
-@enumerate
-@item
-Run @TeX{} by typing `@samp{make pcl-cvs.dvi}'. You will not get the
-indices unless you have the @code{texindex} program.
-
-@item
-Convert the resulting device independent file @file{pcl-cvs.dvi} to a
-form which your printer can output and print it. If you have a
-postscript printer there is a program, @code{dvi2ps}, which does. There
-is also a program which comes together with @TeX{}, @code{dvips}, which
-you can use.
-
-@end enumerate
-
-
-@node About pcl-cvs, Getting started, Installation, Top
-@comment node-name, next, previous, up
-
-@chapter About pcl-cvs
-@cindex About pcl-cvs
-
-Pcl-cvs is a front-end to CVS versions 1.5 through 1.7 and newer; and
-possibly verison 1.3 and 1.4A2. It integrates the most frequently used
-CVS commands into an emacs interface.
-
-@menu
-* Contributors:: Contributors to pcl-cvs.
-* Archives:: Where can I get a copy of Pcl-Cvs?
-@end menu
-
-
-@node Contributors, Archives, About pcl-cvs, About pcl-cvs
-@comment node-name, next, previous, up
-
-@section Contributors to pcl-cvs
-@cindex Contributors
-@cindex Authors
-
-Contributions to the package are welcome. I have limited time to work
-on this project, but I will gladly add any code that you contribute to
-me to this package (@pxref{Bugs}).
-
-The following persons have made contributions to pcl-cvs.
-
-@itemize @bullet
-@item
-Brian Berliner wrote CVS, together with some other contributors.
-Without his work on CVS this package would be useless@dots{}
-
-@item
-Per Cederqvist wrote most of the otherwise unattributed functions in
-pcl-cvs as well as all documentation.
-
-@item
-Inge Wallin (@samp{inge@@lysator.liu.se}) wrote the skeleton to
-@file{pcl-cvs.texinfo}, and gave useful comments on it. He also wrote
-the files @file{elib-node.el} and @file{compile-all.el}. The file
-@file{cookie.el} was inspired by Inge.@refill
-
-@item
-Linus Tolke (@samp{linus@@lysator.liu.se}) contributed useful comments
-on both the functionality and the documentation.@refill
-
-@item
-Jamie Zawinski (@samp{jwz@@lucid.com}) contributed
-@file{pcl-cvs-lucid.el}.
-
-@item
-Leif Lonnblad contributed RCVS support. (Since superceded by the new
-remote CVS support.)
-
-@item
-Jim Blandy (@samp{jimb@@cyclic.com}) contributed hooks to automatically
-guess CVS log entries from ChangeLog contents; and initial support of
-the new Cygnus / Cyclic remote CVS; as well as various sundry bug fixes
-and cleanups.
-
-@item
-Jim Kingdon (@samp{kingdon@@cyclic.com}) contributed lots of fixes to
-the build and install procedure.
-
-@item
-Greg A. Woods (@samp{woods@@planix.com}) contributed code to implement
-the use of per-file diff buffers; and vendor join diffs with emerge and
-ediff; as well as various an sundry bug fixes and cleanups.
-@end itemize
-
-Apart from these, a lot of people have send me suggestions, ideas,
-requests, bug reports and encouragement. Thanks a lot! Without your
-there would be no new releases of pcl-cvs.
-
-
-@node Archives, , Contributors, About pcl-cvs
-@comment node-name, next, previous, up
-
-@section Where can I get pcl-cvs?
-@cindex Sites
-@cindex Archives
-@cindex Ftp-sites
-@cindex Getting pcl-cvs
-@cindex Email archives
-
-The current release of pcl-cvs is included in CVS-1.7.
-
-The author's release of pcl-cvs can be fetched via anonymous ftp from
-@code{ftp.lysator.liu.se}, (IP no. 130.236.254.1) in the directory
-@code{pub/emacs}. If you don't live in Scandinavia you should probably
-check with archie to see if there is a site closer to you that archives
-pcl-cvs.
-
-New releases will be announced to appropriate newsgroups. If you send
-your email address to me I will add you to my list of people to mail
-when I make a new release.
-
-
-@node Getting started, Buffer contents, About pcl-cvs, Top
-@comment node-name, next, previous, up
-
-@chapter Getting started
-@cindex Introduction
-@cindex Example run
-
-This document assumes that you know what CVS is, and that you at least
-knows the fundamental concepts of CVS. If that is not the case you
-should read the man page for CVS.
-
-Pcl-cvs is only useful once you have checked out a module. So before
-you invoke it you must have a copy of a module somewhere in the file
-system.
-
-You invoke pcl-cvs by typing @kbd{M-x cvs-update RET}. If your emacs
-responds with @samp{[No match]} your system administrator has not
-installed pcl-cvs properly. Try @kbd{M-x load-library RET pcl-cvs RET}.
-If that also fails - talk to your root. If it succeeds you might put
-this line in your @file{.emacs} file so that you don't have to type the
-@samp{load-library} command every time you wish to use pcl-cvs:
-
-@example
-(autoload 'cvs-update "pcl-cvs" nil t)
-@end example
-
-The function @code{cvs-update} will ask for a directory. The command
-@samp{cvs update} will be run in that directory. (It should contain
-files that have been checked out from a CVS archive.) The output from
-@code{cvs} will be parsed and presented in a table in a buffer called
-@samp{*cvs*}. It might look something like this:
-
-@example
-PCL-CVS release 1.05-CVS-$Name: $.
-@comment -release-
-
-In directory /users/ceder/FOO/test:
- Updated bar
- Updated file.txt
- Modified ci namechange
- Updated newer
-
-In directory /users/ceder/FOO/test/sub:
- Modified ci ChangeLog
----------- End -----
-@end example
-
-In this example the two files (@file{bar}, @file{file.txt}, and
-@file{newer}) that are marked with @samp{Updated} have been copied from
-the CVS repository to @file{/users/ceder/FOO/test/} since someone else
-have checked in newer versions of them. Two files (@file{namechange}
-and @file{sub/ChangeLog}) have been modified locally, and needs to be
-checked in.
-
-You can move the cursor up and down in the buffer with @kbd{C-n} and
-@kbd{C-p} or @kbd{n} and @kbd{p}. If you press @kbd{c} on one of the
-@samp{Modified} files that file will be checked in to the CVS
-repository. @xref{Committing changes}. You can press @kbd{x} to get rid
-of the "uninteresting" files that have only been @samp{Updated} (and
-don't require any further action from you).@refill
-
-You can also easily get a @samp{diff} between your modified file and the
-base version that you started from, and you can get the output from
-@samp{cvs log} and @samp{cvs status} on the listed files simply by
-pressing a key (@pxref{Getting info about files}).
-
-
-@node Buffer contents, Commands, Getting started, Top
-@comment node-name, next, previous, up
-
-@chapter Buffer contents
-@cindex Buffer contents
-
-The display contains four columns. They contain, from left to right:
-
-@itemize @bullet
-@item
-An asterisk when the file is @dfn{marked} (@pxref{Selected
-files}).@refill
-@item
-The status of the file. See @xref{File status}, for more
-information.@refill
-@item
-A "need to be checked in"-marker (@samp{ci}).
-@item
-The file name.
-@end itemize
-
-@menu
-* File status:: The meaning of the second field.
-* Selected files:: How selection works.
-@end menu
-
-
-@node File status, Selected files, Buffer contents, Buffer contents
-@comment node-name, next, previous, up
-
-@section File status
-@cindex File status
-@cindex Updated (file status)
-@cindex Patched (file status)
-@cindex Modified (file status)
-@cindex Merged (file status)
-@cindex Conflict (file status)
-@cindex Added (file status)
-@cindex Removed (file status)
-@cindex Unknown (file status)
-@cindex Removed from repository (file status)
-@cindex Removed from repository, changed by you (file status)
-@cindex Removed by you, changed in repository (file status)
-@cindex Move away @var{file} - it is in the way (file status)
-@cindex This repository is missing!@dots{} (file status)
-
-The @samp{file status} field can have the following values:
-
-@table @samp
-
-@item Updated
-The file was brought up to date with respect to the repository. This is
-done for any file that exists in the repository but not in your source,
-and for files that you haven't changed but are not the most recent
-versions available in the repository.@refill
-
-@item Patched
-The file was brought up to date with respect to a remote repository by
-way of fetching and applying a patch to the file in your source. This
-is done for any file that exists in a remote repository and in your
-source; of which you haven't changed locally but is not the most recent
-version available in the remote repository.@refill
-
-@item Modified
-The file is modified in your working directory, and there was no
-modification to the same file in the repository.@refill
-
-@item Merged
-The file is modified in your working directory, and there were
-modifications in the repository as well as in your copy, but they were
-merged successfully, without conflict, in your working directory.@refill
-
-@item Conflict
-A conflict was detected while trying to merge your changes to @var{file}
-with changes from the source repository. @var{file} (the copy in your
-working directory) is now the output of the @samp{rcsmerge} command on
-the two versions; an unmodified copy of your file is also in your
-working directory, with the name @file{.#@var{file}.@var{version}},
-where @var{version} is the RCS revision that your modified file started
-from. @xref{Viewing differences}, for more details.@refill
-
-@item Added
-The file has been added by you, but it still needs to be checked in to
-the repository.@refill
-
-@item Removed
-The file has been removed by you, but it needs to be checked in to the
-repository. You can resurrect it by typing @kbd{a} (@pxref{Adding and
-removing files}).@refill
-
-@item Unknown
-A file that was detected in your directory, but that neither appears in
-the repository, nor is present on the list of files that CVS should
-ignore.@refill
-
-@end table
-
-There are also a few special cases, that rarely occur, which have longer
-strings in the fields:
-
-@table @samp
-@item Removed from repository
-The file has been removed from your directory since someone has removed
-it from the repository. (It is still present in the Attic directory, so
-no permanent loss has occurred). This, unlike the other entries in this
-table, is not an error condition.@refill
-
-@item Removed from repository, changed by you
-You have modified a file that someone have removed from the repository.
-You can correct this situation by removing the file manually (see
-@pxref{Adding and removing files}).@refill
-
-@item Removed by you, changed in repository
-You have removed a file, and before you committed the removal someone
-committed a change to that file. You could use @kbd{a} to resurrect the
-file (see @pxref{Adding and removing files}).@refill
-
-@item Move away @var{file} - it is in the way
-For some reason CVS does not like the file @var{file}. Rename or remove
-it.@refill
-
-@item This repository is missing! Remove this dir manually.
-It is impossible to remove a directory in the CVS repository in a clean
-way. Someone have tried to remove one, and CVS gets confused. Remove
-your copy of the directory.@refill
-@end table
-
-
-@node Selected files, , File status, Buffer contents
-@comment node-name, next, previous, up
-
-@section Selected files
-@cindex Selected files
-@cindex Marked files
-@cindex File selection
-@cindex Active files
-
-Many of the commands works on the current set of @dfn{selected} files.
-
-@itemize @bullet
-@item
-If there are any files that are marked they constitute the set of
-selected files.@refill
-@item
-Otherwise, if the cursor points to a file, that file is the selected
-file.@refill
-@item
-Otherwise, if the cursor points to a directory, all the files in that
-directory that appears in the buffer are the selected files.
-@end itemize
-
-This scheme might seem a little complicated, but once one get used to
-it, it is quite powerful.
-
-@xref{Marking files} tells how you mark and unmark files.
-
-
-@node Commands, Customization, Buffer contents, Top
-@comment node-name, next, previous, up
-
-@chapter Commands
-
-@iftex
-This chapter describes all the commands that you can use in pcl-cvs.
-@end iftex
-@ifinfo
-The nodes in this menu contains explanations about all the commands that
-you can use in pcl-cvs. They are grouped together by type.
-@end ifinfo
-
-@menu
-* Updating the directory:: Commands to update the local directory
-* Movement commands:: How to move up and down in the buffer
-* Marking files:: How to mark files that other commands
- will later operate on.
-* Committing changes:: Checking in your modifications to the
- CVS repository.
-* Editing files:: Loading files into Emacs.
-* Getting info about files:: Display the log and status of files.
-* Adding and removing files:: Adding and removing files
-* Undoing changes:: Undoing changes
-* Removing handled entries:: Uninteresting lines can easily be removed.
-* Ignoring files:: Telling CVS to ignore generated files.
-* Viewing differences:: Commands to @samp{diff} different versions.
-* Invoking Ediff:: Running @samp{ediff} from @samp{*cvs*} buffer.
-* Invoking Emerge:: Running @samp{emerge} from @samp{*cvs*} buffer.
-* Reverting your buffers:: Reverting your buffers
-* Miscellaneous commands:: Miscellaneous commands
-@end menu
-
-
-@node Updating the directory, Movement commands, Commands, Commands
-@comment node-name, next, previous, up
-
-@section Updating the directory
-@findex cvs-update
-@findex cvs-mode-update-no-prompt
-@findex cvs-delete-lock
-@cindex Getting the *cvs* buffer
-@kindex g - Rerun @samp{cvs update}
-
-
-@table @kbd
-
-@item M-x cvs-update
-Run a @samp{cvs update} command. You will be asked for the directory in
-which the @samp{cvs update} will be run. The output will be parsed by
-pcl-cvs, and the result printed in the @samp{*cvs*} buffer (see
-@pxref{Buffer contents} for a description of the contents).@refill
-
-By default, @samp{cvs-update} will descend recursively into
-subdirectories. You can avoid that behavior by giving a prefix
-argument to it (e.g., by typing @kbd{C-u M-x cvs-update RET}).@refill
-
-All other commands in pcl-cvs requires that you have a @samp{*cvs*}
-buffer. This is the command that you use to get one.@refill
-
-CVS uses lock files in the repository to ensure the integrity of the
-data files in the repository. They might be left behind i.e. if a
-workstation crashes in the middle of a CVS operation. CVS outputs a
-message when it is waiting for a lock file to go away. Pcl-cvs will
-show the same message in the *cvs* buffer, together with instructions
-for deleting the lock files. You should normally not have to delete
-them manually --- just wait a little while and the problem should fix
-itself. But if the lock files doesn't disappear you can delete them
-with @kbd{M-x cvs-delete-lock RET}.@refill
-
-@item g
-This will run @samp{cvs update} again. It will always use the same
-buffer that was used with the previous @samp{cvs update}. Give a prefix
-argument to avoid descending into subdirectories. This runs the command
-@samp{cvs-mode-update-no-prompt}.@refill
-
-@item G
-This will run @samp{cvs update} and prompt for a new directory to
-update. This runs the command @samp{cvs-update}.@refill
-
-@end table
-
-
-@node Movement commands, Marking files, Updating the directory, Commands
-@comment node-name, next, previous, up
-
-@section Movement Commands
-@cindex Movement Commands
-@findex cookie-next-cookie
-@findex cookie-previous-cookie
-@kindex SPC - Move down one file
-@kindex C-n - Move down one file
-@kindex n - Move down one file
-@kindex C-p - Move up one file
-@kindex p - Move up on file
-
-You can use most normal Emacs commands to move forward and backward in
-the buffer. Some keys are rebound to functions that take advantage of
-the fact that the buffer is a pcl-cvs buffer:
-
-
-@table @kbd
-@item SPC
-@itemx C-n
-@itemx n
-These keys move the cursor one file forward, towards the end of the
-buffer (@code{cookie-next-cookie}).
-
-@item C-p
-@itemx p
-These keys move one file backward, towards the beginning of the buffer
-(@code{cookie-previous-cookie}).
-@end table
-
-
-@node Marking files, Committing changes, Movement commands, Commands
-@comment node-name, next, previous, up
-
-@section Marking files
-@cindex Selecting files (commands to mark files)
-@cindex Marking files
-@kindex m - marking a file
-@kindex M - marking all files
-@kindex u - unmark a file
-@kindex ESC DEL - unmark all files
-@kindex DEL - unmark previous file
-@findex cvs-mode-mark
-@findex cvs-mode-unmark
-@findex cvs-mode-mark-all-files
-@findex cvs-mode-unmark-all-files
-@findex cvs-mode-unmark-up
-
-Pcl-cvs works on a set of @dfn{selected files} (@pxref{Selected files}).
-You can mark and unmark files with these commands:
-
-@table @kbd
-@item m
-This marks the file that the cursor is positioned on. If the cursor is
-positioned on a directory all files in that directory will be marked.
-(@code{cvs-mode-mark}).
-
-@item u
-Unmark the file that the cursor is positioned on. If the cursor is on a
-directory, all files in that directory will be unmarked.
-(@code{cvs-mode-unmark}).@refill
-
-@item M
-Mark @emph{all} files in the buffer (@code{cvs-mode-mark-all-files}).
-
-@item @key{ESC} @key{DEL}
-Unmark @emph{all} files (@code{cvs-mode-unmark-all-files}).
-
-@item @key{DEL}
-Unmark the file on the previous line, and move point to that line
-(@code{cvs-mode-unmark-up}).
-@end table
-
-
-@node Committing changes, Editing files, Marking files, Commands
-@comment node-name, next, previous, up
-
-@section Committing changes
-@cindex Committing changes
-@cindex Ci
-@findex cvs-mode-commit
-@findex cvs-mode-changelog-commit
-@kindex c - commit files
-@kindex C - commit files with ChangeLog message
-@vindex cvs-erase-input-buffer (variable)
-@vindex cvs-auto-revert-after-commit (variable)
-@cindex Commit buffer
-@cindex Edit buffer
-@cindex Erasing commit message
-@cindex Reverting buffers after commit
-
-@table @kbd
-
-@item c
-All files that have a "need to be checked in"-marker (@pxref{Buffer
-contents}) can be checked in with the @kbd{c} command. It checks in all
-selected files (@pxref{Selected files}) (except those who lack the
-"ci"-marker - they are ignored). Pressing @kbd{c} causes
-@code{cvs-mode-commit} to be run.@refill
-
-When you press @kbd{c} you will get a buffer called
-@samp{*cvs-commit-message*}. Enter the log message for the file(s) in
-it. When you are ready you should press @kbd{C-c C-c} to actually
-commit the files (using @code{cvs-edit-done}).
-
-Normally the @samp{*cvs-commit-message*} buffer will retain the log
-message from the previous commit, but if the variable
-@code{cvs-erase-input-buffer} is set to a non-@code{nil} value the
-buffer will be erased. Point and mark will always be located around the
-entire buffer so that you can easily erase it with @kbd{C-w}
-(@samp{kill-region}).@refill
-
-If you are editing the files in your emacs an automatic
-@samp{revert-buffer} will be performed. (If the file contains
-@samp{$@asis{Id}$} keywords @samp{cvs commit} will write a new file with
-the new values substituted. The auto-revert makes sure that you get
-them into your buffer). The revert will not occur if you have modified
-your buffer, or if @samp{cvs-auto-revert-after-commit} is set to
-@samp{nil}.@refill
-
-@item C
-This is just like @samp{cvs-mode-commit}, except that it tries to
-provide appropriate default log messages by looking at the
-@samp{ChangeLog}s in the current directory. The idea is to write your
-ChangeLog entries first, and then use this command to commit your
-changes. Pressing @kbd{C} causes @code{cvs-mode-changelog-commit} to be
-run.@refill
-
-To select default log text, pcl-cvs:
-@itemize @minus
-@item
-finds the ChangeLogs for the files to be checked in;
-@item
-verifies that the top entry in the ChangeLog is on the current date and
-by the current user; if not, no default text is provided;
-@item
-search the ChangeLog entry for paragraphs containing the names of the
-files we're checking in; and finally
-@item
-uses those paragraphs as the default log text in the
-@samp{*cvs-commit-message*} buffer.
-@end itemize
-
-You can then commit the @samp{ChangeLog} file once per day without any
-log message.@refill
-
-@end table
-
-
-@node Editing files, Getting info about files, Committing changes, Commands
-@comment node-name, next, previous, up
-
-@section Editing files
-@cindex Editing files
-@cindex Finding files
-@cindex Loading files
-@cindex Dired
-@cindex Invoking dired
-@findex cvs-mode-find-file
-@findex cvs-mode-find-file-other-window
-@findex cvs-mode-add-change-log-entry-other-window
-@kindex f - find file or directory
-@kindex o - find file in other window
-@kindex A - add ChangeLog entry
-
-There are currently three commands that can be used to find a file (that
-is, load it into a buffer and start editing it there). These commands
-work on the line that the cursor is situated at. They ignore any marked
-files.
-
-@table @kbd
-@item f
-Find the file that the cursor points to. Run @samp{dired}
-@ifinfo
-(@pxref{Dired,,,Emacs})
-@end ifinfo
-if the cursor points to a directory (@code{cvs-mode-find-file}).@refill
-
-@item o
-Like @kbd{f}, but use another window
-(@code{cvs-mode-find-file-other-window}).@refill
-
-@item A
-Invoke @samp{add-change-log-entry-other-window} to edit a
-@samp{ChangeLog} file. The @samp{ChangeLog} will be found in the
-directory of the file the cursor points to.
-(@code{cvs-mode-add-change-log-entry-other-window}).@refill
-@end table
-
-
-@node Getting info about files, Adding and removing files, Editing files, Commands
-@comment node-name, next, previous, up
-
-@section Getting info about files
-@cindex Status (cvs command)
-@cindex Log (RCS/cvs command)
-@cindex Getting status
-@kindex l - run @samp{cvs log}
-@kindex s - run @samp{cvs status}
-@findex cvs-mode-log
-@findex cvs-mode-status
-
-Both of the following commands can be customized.
-@xref{Customization}.@refill
-
-@table @kbd
-@item l
-Run @samp{cvs log} on all selected files, and show the result in a
-temporary buffer (@code{cvs-mode-log}).
-
-@item s
-Run @samp{cvs status} on all selected files, and show the result in a
-temporary buffer (@code{cvs-mode-status}).
-@end table
-
-
-@node Adding and removing files, Undoing changes, Getting info about files, Commands
-@comment node-name, next, previous, up
-
-@section Adding and removing files
-@cindex Adding files
-@cindex Removing files
-@cindex Resurrecting files
-@cindex Deleting files
-@cindex Putting files under CVS control
-@kindex a - add a file
-@kindex r - remove a file
-@findex cvs-mode-add
-@findex cvs-mode-remove-file
-
-The following commands are available to make it easy to add and remove
-files from the CVS repository.
-
-@table @kbd
-@item a
-Add all selected files. This command can be used on @samp{Unknown}
-files (see @pxref{File status}). The status of the file will change to
-@samp{Added}, and you will have to use @kbd{c} (@samp{cvs-mode-commit}, see
-@pxref{Committing changes}) to really add the file to the
-repository.@refill
-
-This command can also be used on @samp{Removed} files (before you commit
-them) to resurrect them.
-
-Selected files that are neither @samp{Unknown} nor @samp{Removed} will
-be ignored by this command.
-
-The command that is run is @code{cvs-mode-add}.
-
-@item r
-This command removes the selected files (after prompting for
-confirmation). The files are @samp{rm}ed from your directory and
-(unless the status was @samp{Unknown}; @pxref{File status}) they will
-also be @samp{cvs remove}d. If the files were @samp{Unknown} they will
-disappear from the buffer. Otherwise their status will change to
-@samp{Removed}, and you must use @kbd{c} (@samp{cvs-mode-commit},
-@pxref{Committing changes}) to commit the removal.@refill
-
-The command that is run is @code{cvs-mode-remove-file}.
-@end table
-
-
-@node Undoing changes, Removing handled entries, Adding and removing files, Commands
-@comment node-name, next, previous, up
-
-@section Undoing changes
-@cindex Undo changes
-@cindex Flush changes
-@kindex U - undo changes
-@findex cvs-mode-undo-local-changes
-
-@table @kbd
-@item U
-If you have modified a file, and for some reason decide that you don't
-want to keep the changes, you can undo them with this command. It works
-by removing your working copy of the file and then getting the latest
-version from the repository (@code{cvs-mode-undo-local-changes}.
-@end table
-
-
-@node Removing handled entries, Ignoring files, Undoing changes, Commands
-@comment node-name, next, previous, up
-
-@section Removing handled entries
-@cindex Expunging uninteresting entries
-@cindex Uninteresting entries, getting rid of them
-@cindex Getting rid of uninteresting lines
-@cindex Removing uninteresting (processed) lines
-@cindex Handled lines, removing them
-@kindex x - remove processed entries
-@kindex C-k - remove selected entries
-@findex cvs-mode-remove-handled
-@findex cvs-mode-acknowledge
-
-@table @kbd
-@item x
-This command allows you to remove all entries that you have processed.
-More specifically, the lines for @samp{Updated} files (@pxref{File
-status} and files that have been checked in (@pxref{Committing changes})
-are removed from the buffer. If a directory becomes empty the heading
-for that directory is also removed. This makes it easier to get an
-overview of what needs to be done.
-
-The command is called @code{cvs-mode-remove-handled}. If
-@samp{cvs-auto-remove-handled} is set to non-@code{nil} this will
-automatically be performed after every commit.@refill
-
-@item C-k
-This command can be used for lines that @samp{cvs-mode-remove-handled} would
-not delete, but that you want to delete (@code{cvs-mode-acknowledge}).
-@end table
-
-
-@node Ignoring files, Viewing differences, Removing handled entries, Commands
-@comment node-name, next, previous, up
-
-@section Ignoring files
-@kindex i - ignoring files
-@findex cvs-mode-ignore
-
-@table @kbd
-@item i
-Arrange so that CVS will ignore the selected files. The file names are
-added to the @file{.cvsignore} file in the corresponding directory. If
-the @file{.cvsignore} doesn't exist it will be created.
-
-The @file{.cvsignore} file should normally be added to the repository,
-but you could ignore it also if you like it better that way.
-
-This runs @code{cvs-mode-ignore}.
-@end table
-
-
-@node Viewing differences, Invoking Ediff, Ignoring files, Commands
-@comment node-name, next, previous, up
-
-@section Viewing differences
-@cindex Diff
-@cindex Ediff
-@cindex Invoking ediff
-@cindex Conflicts, how to resolve them
-@cindex Viewing differences
-@kindex d - run @samp{cvs diff}
-@kindex b - diff backup file
-@findex cvs-mode-diff-cvs
-@findex cvs-mode-diff-backup
-@vindex cvs-diff-ignore-marks (variable)
-
-@table @kbd
-@item d
-Display a @samp{cvs diff} between the selected files and the RCS version
-that they are based on. @xref{Customization} describes how you can send
-flags to @samp{cvs diff}. If @var{cvs-diff-ignore-marks} is set to a
-non-@code{nil} value or if a prefix argument is given (but not both) any
-marked files will not be considered to be selected.
-(@code{cvs-mode-diff-cvs}).@refill
-
-@item b
-If CVS finds a conflict while merging two versions of a file (during a
-@samp{cvs update}, @pxref{Updating the directory}) it will save the
-original file in a file called @file{.#@var{FILE}.@var{VERSION}} where
-@var{FILE} is the name of the file, and @var{VERSION} is the RCS version
-number that your file was based on.@refill
-
-With the @kbd{b} command you can run a @samp{diff} on the files
-@file{.#@var{FILE}.@var{VERSION}} and @file{@var{FILE}}. You can get a
-context- or Unidiff by setting @samp{cvs-diff-flags} -
-@pxref{Customization}. This command only works on files that have
-status @samp{Conflict} or @samp{Merged}.@refill
-
-If @var{cvs-diff-ignore-marks} is set to a non-@code{nil} value or if a
-prefix argument is given (but not both) any marked files will not be
-considered to be selected. (@code{cvs-mode-diff-backup}).@refill
-@end table
-
-
-@node Invoking Ediff, Invoking Emerge, Viewing differences, Commands
-@comment node-name, next, previous, up
-
-@section Running ediff
-@cindex Ediff
-@cindex Invoking ediff
-@cindex Viewing differences
-@cindex Conflicts, resolving
-@cindex Resolving conflicts
-@kindex e - invoke @samp{ediff}
-@findex cvs-mode-ediff
-@findex run-ediff-from-cvs-buffer
-@findex cvs-old-ediff-interface
-
-@table @kbd
-@item e
-This command works
-slightly different depending on the version of @samp{ediff} and the file
-status.@refill
-
-With modern versions of @samp{ediff}, this command invokes
-@samp{run-ediff-from-cvs-buffer} on one file.@refill
-
-@strong{Note:} When the file status is @samp{Merged} or @samp{Conflict},
-CVS has already performed a merge. The resulting file is not used in
-any way if you use this command. If you use the @kbd{q} command inside
-@samp{ediff} (to successfully terminate a merge) the file that CVS
-created will be overwritten.@refill
-
-Older versions of @samp{ediff} use an interface similar to
-@samp{emerge}. The function @samp{cvs-old-ediff-interface} is invoked
-if the version of @samp{ediff} you have doesn't support
-@samp{run-ediff-from-cvs-buffer}. These older versions do not support
-merging of revisions.@refill
-
-@table @asis
-@item @samp{Modified}
-Run @samp{ediff-files} with your working file as file A, and the latest
-revision in the repository as file B.
-
-@item @samp{Merged}
-@itemx @samp{Conflict}
-Run @samp{ediff-files3} with your working file (as it was prior to your
-invocation of @samp{cvs-update}) as file A, the latest revision in the
-repository as file B, and the revision that you based your local
-modifications on as ancestor.
-
-@item @samp{Updated}
-@itemx @samp{Patched}
-Run @samp{ediff-files} with your working file as file A, and a given
-revision in the repository as file B. You are prompted for the revision
-to ediff against, and you may specify either a tag name or a numerical
-revision number (@pxref{Getting info about files}).
-@end table
-
-@end table
-
-@node Invoking Emerge, Reverting your buffers, Invoking Ediff, Commands
-@comment node-name, next, previous, up
-
-@section Running emerge
-@cindex Emerge
-@cindex Ediff
-@cindex Viewing differences
-@cindex Invoking emerge
-@cindex Conflicts, resolving
-@cindex Resolving conflicts
-@kindex E - invoke @samp{emerge}
-@findex cvs-mode-emerge
-
-@table @kbd
-@item E
-Invoke @samp{emerge} on one file. This command works slightly different
-depending on the file status.
-
-@table @asis
-@item @samp{Modified}
-Run @samp{emerge-files} with your working file as file A, and the latest
-revision in the repository as file B.
-
-@item @samp{Merged}
-@itemx @samp{Conflict}
-Run @samp{emerge-files-with-ancestor} with your working file (as it was
-prior to your invocation of @samp{cvs-update}) as file A, the latest
-revision in the repository as file B, and the revision that you based
-your local modifications on as ancestor.
-@end table
-
-@strong{Note:} When the file status is @samp{Merged} or @samp{Conflict},
-CVS has already performed a merge. The resulting file is not used in
-any way if you use this command. If you use the @kbd{q} command inside
-@samp{emerge} (to successfully terminate the merge) the file that CVS
-created will be overwritten.
-
-@end table
-
-
-@node Reverting your buffers, Miscellaneous commands, Invoking Emerge, Commands
-@comment node-name, next, previous, up
-
-@section Reverting your buffers
-@findex cvs-mode-revert-updated-buffers
-@kindex R - revert buffers
-@cindex Syncing buffers
-@cindex Reverting buffers
-
-@table @kbd
-@item R
-If you are editing (or just viewing) a file in a buffer, and that file
-is changed by CVS during a @samp{cvs-update}, all you have to do is type
-@kbd{R} in the *cvs* buffer to read in the new versions of the
-files.@refill
-
-All files that are @samp{Updated}, @samp{Merged} or in @samp{Conflict}
-are reverted from the disk. Any other files are ignored. Only files
-that you were already editing are read.@refill
-
-An error is signalled if you have modified the buffer since it was last
-changed. (@code{cvs-mode-revert-updated-buffers}).@refill
-@end table
-
-
-@node Miscellaneous commands, , Reverting your buffers, Commands
-@comment node-name, next, previous, up
-
-@section Miscellaneous commands
-@findex cvs-byte-compile-files
-@cindex Recompiling elisp files
-@cindex Byte compilation
-@cindex Getting rid of lock files
-@cindex Lock files
-@kindex q - bury the *cvs* buffer
-@findex bury-buffer
-
-@table @kbd
-@item M-x cvs-byte-compile-files
-Byte compile all selected files that end in .el.
-
-@item M-x cvs-delete-lock
-This command can be used in any buffer, and deletes the lock files that
-the *cvs* buffer informs you about. You should normally never have to
-use this command since CVS tries very carefully to always remove the
-lock files itself.
-
-You can only use this command when a message in the *cvs* buffer tells
-you so. You should wait a while before using this command in case
-someone else is running a cvs command.
-
-@item q
-Bury the *cvs* buffer. (@code{bury-buffer}).
-
-@end table
-
-
-@node Customization, Future enhancements, Commands, Top
-@comment node-name, next, previous, up
-
-@chapter Customization
-@vindex cvs-erase-input-buffer (variable)
-@vindex cvs-inhibit-copyright-message (variable)
-@vindex cvs-diff-flags (variable)
-@vindex cvs-diff-ignore-marks (variable)
-@vindex cvs-log-flags (variable)
-@vindex cvs-status-flags (variable)
-@vindex cvs-auto-remove-handled (variable)
-@vindex cvs-update-prog-output-skip-regexp (variable)
-@vindex cvs-cvsroot (variable)
-@vindex TMPDIR (environment variable)
-@vindex cvs-auto-revert-after-commit (variable)
-@vindex cvs-commit-buffer-require-final-newline (variable)
-@vindex cvs-sort-ignore-file (variable)
-@cindex Inhibiting the Copyright message.
-@cindex Copyright message, getting rid of it
-@cindex Getting rid of the Copyright message.
-@cindex Customization
-@cindex Variables, list of all
-@cindex Erasing the input buffer
-@cindex Context diff, how to get
-@cindex Unidiff, how to get
-@cindex Automatically remove handled files
-@cindex -u option in modules file
-@cindex Modules file (-u option)
-@cindex Update program (-u option in modules file)
-@cindex Reverting buffers after commit
-@cindex Require final newline
-@cindex Automatically inserting newline
-@cindex Commit message, inserting newline
-@cindex Sorting the .cvsignore file
-@cindex .cvsignore file, sorting
-@cindex Automatically sorting .cvsignore
-
-If you have an idea about any customization that would be handy but
-isn't present in this list, please tell me! @xref{Bugs} for info on how
-to reach me.@refill
-
-@table @samp
-@item cvs-erase-input-buffer
-If set to anything else than @code{nil} the edit buffer will be erased
-before you write the log message (@pxref{Committing changes}).
-
-@item cvs-inhibit-copyright-message
-The copyright message that is displayed on startup can be annoying after
-a while. Set this variable to @samp{t} if you want to get rid of it.
-(But don't set this to @samp{t} in the system defaults file - new users
-should see this message at least once).
-
-@item cvs-diff-flags
-A list of strings to pass as arguments to the @samp{cvs diff} and
-@samp{diff} programs. This is used by @samp{cvs-mode-diff-cvs} and
-@samp{cvs-mode-diff-backup} (key @kbd{b}, @pxref{Viewing differences}). If
-you prefer the Unidiff format you could add this line to your
-@file{.emacs} file:@refill
-
-@example
-(setq cvs-diff-flags '("-u"))
-@end example
-
-@item cvs-diff-ignore-marks
-If this variable is non-@code{nil} or if a prefix argument is given (but
-not both) to @samp{cvs-mode-diff-cvs} or @samp{cvs-mode-diff-backup}
-marked files are not considered selected.
-
-@item cvs-log-flags
-List of strings to send to @samp{cvs log}. Used by @samp{cvs-mode-log}
-(key @kbd{l}, @pxref{Getting info about files}).
-
-@item cvs-status-flags
-List of strings to send to @samp{cvs status}. Used by @samp{cvs-mode-status}
-(key @kbd{s}, @pxref{Getting info about files}).
-
-@item cvs-auto-remove-handled
-If this variable is set to any non-@code{nil} value
-@samp{cvs-mode-remove-handled} will be called every time you check in
-files, after the check-in is ready. @xref{Removing handled
-entries}.@refill
-
-@item cvs-auto-revert-after-commit
-If this variable is set to any non-@samp{nil} value any buffers you have
-that visit a file that is committed will be automatically reverted.
-This variable is default @samp{t}. @xref{Committing changes}.@refill
-
-@item cvs-update-prog-output-skip-regexp
-The @samp{-u} flag in the @file{modules} file can be used to run a command
-whenever a @samp{cvs update} is performed (see cvs(5)). This regexp
-is used to search for the last line in that output. It is normally set
-to @samp{"$"}. That setting is only correct if the command outputs
-nothing. Note that pcl-cvs will get very confused if the command
-outputs @emph{anything} to @samp{stderr}.
-
-@item cvs-cvsroot
-This variable can be set to override @samp{CVSROOT}. It should be a
-string. If it is set then everytime a cvs command is run it will be
-called as @samp{cvs -d @var{cvs-cvsroot}@dots{}} This can be useful if
-your site has several repositories.
-
-@item TMPDIR
-Pcl-cvs uses this @emph{environment variable} to decide where to put the
-temporary files it needs. It defaults to @file{/tmp} if it is not set.
-
-@item cvs-commit-buffer-require-final-newline
-When you enter a log message in the @samp{*cvs-commit-message*} buffer
-pcl-cvs will normally automatically insert a trailing newline, unless
-there already is one. This behavior can be controlled via
-@samp{cvs-commit-buffer-require-final-newline}. If it is @samp{t} (the
-default behavior), a newline will always be appended. If it is
-@samp{nil}, newlines will never be appended. Any other value causes
-pcl-cvs to ask the user whenever there is no trailing newline in the
-commit message buffer.
-
-@item cvs-sort-ignore-file
-If this variable is set to any non-@samp{nil} value the
-@file{.cvsignore} will always be sorted whenever you use
-@samp{cvs-mode-ignore} to add a file to it. This option is on by
-default.
-
-@end table
-
-
-@node Future enhancements, Bugs, Customization, Top
-@comment node-name, next, previous, up
-
-@chapter Future enhancements
-@cindex Enhancements
-
-Pcl-cvs is still under development and needs a number of enhancements to
-be called complete. Below is my current wish-list for future releases
-of pcl-cvs. Please, let me know which of these features you want most.
-They are listed below in approximately the order that I currently think
-I will implement them in.
-
-@itemize @bullet
-@item
-Rewritten parser code. There are many situations where pcl-cvs will
-fail to recognize the output from CVS. The situation could be greatly
-increased.
-
-@item
-@samp{cvs-status}. This will run @samp{cvs status} in a directory and
-produce a buffer that looks pretty much like the current *cvs* buffer.
-That buffer will include information for all version-controlled files.
-(There will be a simple keystroke to remove all "uninteresting" files,
-that is, files that are "Up-to-date"). In this new buffer you will be
-able to update a file, commit a file, et c. The big win with this is
-that you will be able to watch the differences between your current
-working file and the head revision in the repository before you update
-the file, and you can then choose to update it or let it wait for a
-while longer.
-
-@item
-Log mode. When this mode is finished you will be able to move around
-(using @kbd{n} and @kbd{p}) between the revisions of a file, mark two of
-them, and run a diff between them. You will be able to hide branches
-(similar to the way you can hide sub-paragraphs in outline-mode) and do
-merges between revisions. Other ideas about this are welcome.
-
-@item
-The current model for marks in the *cvs* buffer seems to be confusing.
-I am considering to use the VM model instead, where marks are normally
-inactive. To activate the mark, you issue a command like
-@samp{cvs-mode-next-command-uses-marks}. I might implement a flag so
-that you can use either version. Feedback on this before I start coding
-it is very welcome.
-
-@item
-It should be possible to run commands such as @samp{cvs log}, @samp{cvs
-status} and @samp{cvs commit} directly from a buffer containing a file,
-instead of having to @samp{cvs-update}. If the directory contains many
-files the @samp{cvs-update} can take quite some time, especially on a
-slow machine. I planed to put these kind of commands on the prefix
-@kbd{C-c C-v}, but that turned out to be used by for instance c++-mode.
-If you have any suggestions for a better prefix key, please let me know.
-
-@item
-Increased robustness. For instance, you can not currently press
-@kbd{C-g} when you are entering the description of a file that you are
-adding without confusing pcl-cvs.
-
-@item
-Support for multiple active *cvs* buffers.
-
-@item
-Dired support. I have an experimental @file{dired-cvs.el} that works
-together with CVS 1.2. Unfortunately I wrote it on top of a
-non-standard @file{dired.el}, so it must be rewritten.@refill
-
-@item
-An ability to send user-supplied options to all the cvs commands.
-
-@item
-Pcl-cvs is not at all clever about what it should do when @samp{cvs
-update} runs a program (due to the @samp{-u} option in the
-@file{modules} file --- see @samp{cvs(5)}). The current release uses a
-regexp to search for the end. At the very least that regexp should be
-configured for different modules. Tell me if you have any idea about
-what is the right thing to do. In a perfect world the program should
-also be allowed to print to @samp{stderr} without causing pcl-cvs to
-crash.
-@end itemize
-
-
-If you miss something in this wish-list, let me know! I don't promise
-that I will write it, but I will at least try to coordinate the efforts
-of making a good Emacs front end to CVS. See @xref{Bugs} for
-information about how to reach me.@refill
-
-So far, I have written most of pcl-cvs in my all-to-rare spare time. If
-you want pcl-cvs to be developed faster you can write a contract with
-Signum Support to do the extension. You can reach Signum Support by
-email to @samp{info@@signum.se} or via mail to Signum Support AB, Box
-2044, S-580 02 Linkoping, Sweden. Phone: +46 (0) 13 - 21 46 00. Fax:
-+46 (0) 13 - 21 47 00.
-
-
-@node Bugs, COPYING, Future enhancements, Top
-@comment node-name, next, previous, up
-
-@chapter Bugs (known and unknown)
-@cindex Reporting bugs and ideas
-@cindex Bugs, how to report them
-@cindex Author, how to reach
-@cindex Email to the author
-@cindex Known bugs
-@cindex Bugs, known
-@cindex FAQ
-@cindex Problems, list of common
-
-If you find a bug or misfeature, don't hesitate to tell me! Send email
-to @samp{ceder@@lysator.liu.se}.
-
-If you have ideas for improvements, or if you have written some
-extensions to this package, I would like to hear from you. I hope that
-you find this package useful!
-
-Below is a partial list of currently known problems with pcl-cvs version
-1.05.
-
-@table @asis
-@item Commit causes Emacs to hang
-Emacs waits for the @samp{cvs commit} command to finish before you can
-do anything. If you start a background job from the loginfo file you
-must take care that it closes @samp{stdout} and @samp{stderr} if you do
-not want to wait for it. (You do that with @samp{background-command &>-
-2&>- &} if you are starting @samp{background-command} from a
-@samp{/bin/sh} shell script).
-
-Your emacs will also hang if there was a lock file in the repository.
-In this case you can type @kbd{C-g} to get control over your emacs
-again.
-
-@item Name clash in Emacs 19
-This is really a bug in Elib or the Emacs 19 distribution. Both Elib and
-Emacs 19.6 through at least 19.10 contains a file named
-@file{cookie.el}. One of the files will have to be renamed, and we are
-currently negotiating about which of the files to rename.
-
-@item Commands while cvs-update is running
-It is possible to type commands in the *cvs* buffer while the update is
-running, but error messages is all that you will get. The error
-messages should be better.
-
-@item Unexpected output from CVS
-Unexpected output from CVS confuses pcl-cvs. It will currently create a
-bug report that you can mail to me. It should do something more
-civilized.
-@end table
-
-
-@node COPYING, Function and Variable Index, Bugs, Top
-@comment node-name, next, previous, up
-
-@appendix GNU GENERAL PUBLIC LICENSE
-@c @include gpl.texinfo
-
-
-@node Function and Variable Index, Concept Index, COPYING, Top
-@comment node-name, next, previous, up
-
-@unnumbered Function and Variable Index
-
-@printindex fn
-
-
-@node Concept Index, Key Index, Function and Variable Index, Top
-@comment node-name, next, previous, up
-
-@unnumbered Concept Index
-
-@printindex cp
-
-
-@node Key Index, , Concept Index, Top
-@comment node-name, next, previous, up
-
-@unnumbered Key Index
-
-@printindex ky
-
-@summarycontents
-@contents
-@bye
diff --git a/gnu/usr.bin/cvs/tools/pcl-cvs/texinfo.tex b/gnu/usr.bin/cvs/tools/pcl-cvs/texinfo.tex
deleted file mode 100644
index de11a7ffca0..00000000000
--- a/gnu/usr.bin/cvs/tools/pcl-cvs/texinfo.tex
+++ /dev/null
@@ -1,4381 +0,0 @@
-%% TeX macros to handle texinfo files
-
-% Copyright (C) 1985, 86, 88, 90, 91, 92, 93, 1994 Free Software Foundation, Inc.
-
-%This texinfo.tex file 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.
-
-%This texinfo.tex file 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 this texinfo.tex file; see the file COPYING. If not, write
-%to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139,
-%USA.
-
-
-%In other words, you are welcome to use, share and improve this program.
-%You are forbidden to forbid anyone else to use, share and improve
-%what you give them. Help stamp out software-hoarding!
-
-% This automatically updates the version number based on RCS.
-\def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}}
-\deftexinfoversion$fixed-revision: 2.137 $
-\message{Loading texinfo package [Version \texinfoversion]:}
-
-% Print the version number if in a .fmt file.
-\everyjob{\message{[Texinfo version \texinfoversion]}\message{}}
-
-% Save some parts of plain tex whose names we will redefine.
-
-\let\ptextilde=\~
-\let\ptexlbrace=\{
-\let\ptexrbrace=\}
-\let\ptexdots=\dots
-\let\ptexdot=\.
-\let\ptexstar=\*
-\let\ptexend=\end
-\let\ptexbullet=\bullet
-\let\ptexb=\b
-\let\ptexc=\c
-\let\ptexi=\i
-\let\ptext=\t
-\let\ptexl=\l
-\let\ptexL=\L
-
-% Be sure we're in horizontal mode when doing a tie, since we make space
-% equivalent to this in @example-like environments. Otherwise, a space
-% at the beginning of a line will start with \penalty -- and
-% since \penalty is valid in vertical mode, we'd end up putting the
-% penalty on the vertical list instead of in the new paragraph.
-{\catcode`@ = 11
- \gdef\tie{\leavevmode\penalty\@M\ }
-}
-\let\~ = \tie % And make it available as @~.
-
-\message{Basics,}
-\chardef\other=12
-
-% If this character appears in an error message or help string, it
-% starts a new line in the output.
-\newlinechar = `^^J
-
-% Set up fixed words for English.
-\ifx\putwordChapter\undefined{\gdef\putwordChapter{Chapter}}\fi%
-\def\putwordInfo{Info}%
-\ifx\putwordSee\undefined{\gdef\putwordSee{See}}\fi%
-\ifx\putwordsee\undefined{\gdef\putwordsee{see}}\fi%
-\ifx\putwordfile\undefined{\gdef\putwordfile{file}}\fi%
-\ifx\putwordpage\undefined{\gdef\putwordpage{page}}\fi%
-\ifx\putwordsection\undefined{\gdef\putwordsection{section}}\fi%
-\ifx\putwordSection\undefined{\gdef\putwordSection{Section}}\fi%
-\ifx\putwordTableofContents\undefined{\gdef\putwordTableofContents{Table of Contents}}\fi%
-\ifx\putwordShortContents\undefined{\gdef\putwordShortContents{Short Contents}}\fi%
-\ifx\putwordAppendix\undefined{\gdef\putwordAppendix{Appendix}}\fi%
-
-% Ignore a token.
-%
-\def\gobble#1{}
-
-\hyphenation{ap-pen-dix}
-\hyphenation{mini-buf-fer mini-buf-fers}
-\hyphenation{eshell}
-
-% Margin to add to right of even pages, to left of odd pages.
-\newdimen \bindingoffset \bindingoffset=0pt
-\newdimen \normaloffset \normaloffset=\hoffset
-\newdimen\pagewidth \newdimen\pageheight
-\pagewidth=\hsize \pageheight=\vsize
-
-% Sometimes it is convenient to have everything in the transcript file
-% and nothing on the terminal. We don't just call \tracingall here,
-% since that produces some useless output on the terminal.
-%
-\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
-\def\loggingall{\tracingcommands2 \tracingstats2
- \tracingpages1 \tracingoutput1 \tracinglostchars1
- \tracingmacros2 \tracingparagraphs1 \tracingrestores1
- \showboxbreadth\maxdimen\showboxdepth\maxdimen
-}%
-
-%---------------------Begin change-----------------------
-%
-%%%% For @cropmarks command.
-% Dimensions to add cropmarks at corners Added by P. A. MacKay, 12 Nov. 1986
-%
-\newdimen\cornerlong \newdimen\cornerthick
-\newdimen \topandbottommargin
-\newdimen \outerhsize \newdimen \outervsize
-\cornerlong=1pc\cornerthick=.3pt % These set size of cropmarks
-\outerhsize=7in
-%\outervsize=9.5in
-% Alternative @smallbook page size is 9.25in
-\outervsize=9.25in
-\topandbottommargin=.75in
-%
-%---------------------End change-----------------------
-
-% \onepageout takes a vbox as an argument. Note that \pagecontents
-% does insertions itself, but you have to call it yourself.
-\chardef\PAGE=255 \output={\onepageout{\pagecontents\PAGE}}
-\def\onepageout#1{\hoffset=\normaloffset
-\ifodd\pageno \advance\hoffset by \bindingoffset
-\else \advance\hoffset by -\bindingoffset\fi
-{\escapechar=`\\\relax % makes sure backslash is used in output files.
-\shipout\vbox{{\let\hsize=\pagewidth \makeheadline} \pagebody{#1}%
-{\let\hsize=\pagewidth \makefootline}}}%
-\advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi}
-
-%%%% For @cropmarks command %%%%
-
-% Here is a modification of the main output routine for Near East Publications
-% This provides right-angle cropmarks at all four corners.
-% The contents of the page are centerlined into the cropmarks,
-% and any desired binding offset is added as an \hskip on either
-% site of the centerlined box. (P. A. MacKay, 12 November, 1986)
-%
-\def\croppageout#1{\hoffset=0pt % make sure this doesn't mess things up
-{\escapechar=`\\\relax % makes sure backslash is used in output files.
- \shipout
- \vbox to \outervsize{\hsize=\outerhsize
- \vbox{\line{\ewtop\hfill\ewtop}}
- \nointerlineskip
- \line{\vbox{\moveleft\cornerthick\nstop}
- \hfill
- \vbox{\moveright\cornerthick\nstop}}
- \vskip \topandbottommargin
- \centerline{\ifodd\pageno\hskip\bindingoffset\fi
- \vbox{
- {\let\hsize=\pagewidth \makeheadline}
- \pagebody{#1}
- {\let\hsize=\pagewidth \makefootline}}
- \ifodd\pageno\else\hskip\bindingoffset\fi}
- \vskip \topandbottommargin plus1fill minus1fill
- \boxmaxdepth\cornerthick
- \line{\vbox{\moveleft\cornerthick\nsbot}
- \hfill
- \vbox{\moveright\cornerthick\nsbot}}
- \nointerlineskip
- \vbox{\line{\ewbot\hfill\ewbot}}
- }}
- \advancepageno
- \ifnum\outputpenalty>-20000 \else\dosupereject\fi}
-%
-% Do @cropmarks to get crop marks
-\def\cropmarks{\let\onepageout=\croppageout }
-
-\newinsert\margin \dimen\margin=\maxdimen
-
-\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
-{\catcode`\@ =11
-\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
-% marginal hacks, juha@viisa.uucp (Juha Takala)
-\ifvoid\margin\else % marginal info is present
- \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
-\dimen@=\dp#1 \unvbox#1
-\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
-\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
-}
-
-%
-% Here are the rules for the cropmarks. Note that they are
-% offset so that the space between them is truly \outerhsize or \outervsize
-% (P. A. MacKay, 12 November, 1986)
-%
-\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
-\def\nstop{\vbox
- {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
-\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
-\def\nsbot{\vbox
- {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
-
-% Parse an argument, then pass it to #1. The argument is the rest of
-% the input line (except we remove a trailing comment). #1 should be a
-% macro which expects an ordinary undelimited TeX argument.
-%
-\def\parsearg#1{%
- \let\next = #1%
- \begingroup
- \obeylines
- \futurelet\temp\parseargx
-}
-
-% If the next token is an obeyed space (from an @example environment or
-% the like), remove it and recurse. Otherwise, we're done.
-\def\parseargx{%
- % \obeyedspace is defined far below, after the definition of \sepspaces.
- \ifx\obeyedspace\temp
- \expandafter\parseargdiscardspace
- \else
- \expandafter\parseargline
- \fi
-}
-
-% Remove a single space (as the delimiter token to the macro call).
-{\obeyspaces %
- \gdef\parseargdiscardspace {\futurelet\temp\parseargx}}
-
-{\obeylines %
- \gdef\parseargline#1^^M{%
- \endgroup % End of the group started in \parsearg.
- %
- % First remove any @c comment, then any @comment.
- % Result of each macro is put in \toks0.
- \argremovec #1\c\relax %
- \expandafter\argremovecomment \the\toks0 \comment\relax %
- %
- % Call the caller's macro, saved as \next in \parsearg.
- \expandafter\next\expandafter{\the\toks0}%
- }%
-}
-
-% Since all \c{,omment} does is throw away the argument, we can let TeX
-% do that for us. The \relax here is matched by the \relax in the call
-% in \parseargline; it could be more or less anything, its purpose is
-% just to delimit the argument to the \c.
-\def\argremovec#1\c#2\relax{\toks0 = {#1}}
-\def\argremovecomment#1\comment#2\relax{\toks0 = {#1}}
-
-% \argremovec{,omment} might leave us with trailing spaces, though; e.g.,
-% @end itemize @c foo
-% will have two active spaces as part of the argument with the
-% `itemize'. Here we remove all active spaces from #1, and assign the
-% result to \toks0.
-%
-% This loses if there are any *other* active characters besides spaces
-% in the argument -- _ ^ +, for example -- since they get expanded.
-% Fortunately, Texinfo does not define any such commands. (If it ever
-% does, the catcode of the characters in questionwill have to be changed
-% here.) But this means we cannot call \removeactivespaces as part of
-% \argremovec{,omment}, since @c uses \parsearg, and thus the argument
-% that \parsearg gets might well have any character at all in it.
-%
-\def\removeactivespaces#1{%
- \begingroup
- \ignoreactivespaces
- \edef\temp{#1}%
- \global\toks0 = \expandafter{\temp}%
- \endgroup
-}
-
-% Change the active space to expand to nothing.
-%
-\begingroup
- \obeyspaces
- \gdef\ignoreactivespaces{\obeyspaces\let =\empty}
-\endgroup
-
-
-\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
-
-%% These are used to keep @begin/@end levels from running away
-%% Call \inENV within environments (after a \begingroup)
-\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi}
-\def\ENVcheck{%
-\ifENV\errmessage{Still within an environment. Type Return to continue.}
-\endgroup\fi} % This is not perfect, but it should reduce lossage
-
-% @begin foo is the same as @foo, for now.
-\newhelp\EMsimple{Type <Return> to continue.}
-
-\outer\def\begin{\parsearg\beginxxx}
-
-\def\beginxxx #1{%
-\expandafter\ifx\csname #1\endcsname\relax
-{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else
-\csname #1\endcsname\fi}
-
-% @end foo executes the definition of \Efoo.
-%
-\def\end{\parsearg\endxxx}
-\def\endxxx #1{%
- \removeactivespaces{#1}%
- \edef\endthing{\the\toks0}%
- %
- \expandafter\ifx\csname E\endthing\endcsname\relax
- \expandafter\ifx\csname \endthing\endcsname\relax
- % There's no \foo, i.e., no ``environment'' foo.
- \errhelp = \EMsimple
- \errmessage{Undefined command `@end \endthing'}%
- \else
- \unmatchedenderror\endthing
- \fi
- \else
- % Everything's ok; the right environment has been started.
- \csname E\endthing\endcsname
- \fi
-}
-
-% There is an environment #1, but it hasn't been started. Give an error.
-%
-\def\unmatchedenderror#1{%
- \errhelp = \EMsimple
- \errmessage{This `@end #1' doesn't have a matching `@#1'}%
-}
-
-% Define the control sequence \E#1 to give an unmatched @end error.
-%
-\def\defineunmatchedend#1{%
- \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}%
-}
-
-
-% Single-spacing is done by various environments (specifically, in
-% \nonfillstart and \quotations).
-\newskip\singlespaceskip \singlespaceskip = 12.5pt
-\def\singlespace{%
- % Why was this kern here? It messes up equalizing space above and below
- % environments. --karl, 6may93
- %{\advance \baselineskip by -\singlespaceskip
- %\kern \baselineskip}%
- \setleading \singlespaceskip
-}
-
-%% Simple single-character @ commands
-
-% @@ prints an @
-% Kludge this until the fonts are right (grr).
-\def\@{{\tt \char '100}}
-
-% This is turned off because it was never documented
-% and you can use @w{...} around a quote to suppress ligatures.
-%% Define @` and @' to be the same as ` and '
-%% but suppressing ligatures.
-%\def\`{{`}}
-%\def\'{{'}}
-
-% Used to generate quoted braces.
-
-\def\mylbrace {{\tt \char '173}}
-\def\myrbrace {{\tt \char '175}}
-\let\{=\mylbrace
-\let\}=\myrbrace
-
-% @: forces normal size whitespace following.
-\def\:{\spacefactor=1000 }
-
-% @* forces a line break.
-\def\*{\hfil\break\hbox{}\ignorespaces}
-
-% @. is an end-of-sentence period.
-\def\.{.\spacefactor=3000 }
-
-% @enddots{} is an end-of-sentence ellipsis.
-\gdef\enddots{$\mathinner{\ldotp\ldotp\ldotp\ldotp}$\spacefactor=3000}
-
-% @! is an end-of-sentence bang.
-\gdef\!{!\spacefactor=3000 }
-
-% @? is an end-of-sentence query.
-\gdef\?{?\spacefactor=3000 }
-
-% @w prevents a word break. Without the \leavevmode, @w at the
-% beginning of a paragraph, when TeX is still in vertical mode, would
-% produce a whole line of output instead of starting the paragraph.
-\def\w#1{\leavevmode\hbox{#1}}
-
-% @group ... @end group forces ... to be all on one page, by enclosing
-% it in a TeX vbox. We use \vtop instead of \vbox to construct the box
-% to keep its height that of a normal line. According to the rules for
-% \topskip (p.114 of the TeXbook), the glue inserted is
-% max (\topskip - \ht (first item), 0). If that height is large,
-% therefore, no glue is inserted, and the space between the headline and
-% the text is small, which looks bad.
-%
-\def\group{\begingroup
- \ifnum\catcode13=\active \else
- \errhelp = \groupinvalidhelp
- \errmessage{@group invalid in context where filling is enabled}%
- \fi
- %
- % The \vtop we start below produces a box with normal height and large
- % depth; thus, TeX puts \baselineskip glue before it, and (when the
- % next line of text is done) \lineskip glue after it. (See p.82 of
- % the TeXbook.) Thus, space below is not quite equal to space
- % above. But it's pretty close.
- \def\Egroup{%
- \egroup % End the \vtop.
- \endgroup % End the \group.
- }%
- %
- \vtop\bgroup
- % We have to put a strut on the last line in case the @group is in
- % the midst of an example, rather than completely enclosing it.
- % Otherwise, the interline space between the last line of the group
- % and the first line afterwards is too small. But we can't put the
- % strut in \Egroup, since there it would be on a line by itself.
- % Hence this just inserts a strut at the beginning of each line.
- \everypar = {\strut}%
- %
- % Since we have a strut on every line, we don't need any of TeX's
- % normal interline spacing.
- \offinterlineskip
- %
- % OK, but now we have to do something about blank
- % lines in the input in @example-like environments, which normally
- % just turn into \lisppar, which will insert no space now that we've
- % turned off the interline space. Simplest is to make them be an
- % empty paragraph.
- \ifx\par\lisppar
- \edef\par{\leavevmode \par}%
- %
- % Reset ^^M's definition to new definition of \par.
- \obeylines
- \fi
- %
- % Do @comment since we are called inside an environment such as
- % @example, where each end-of-line in the input causes an
- % end-of-line in the output. We don't want the end-of-line after
- % the `@group' to put extra space in the output. Since @group
- % should appear on a line by itself (according to the Texinfo
- % manual), we don't worry about eating any user text.
- \comment
-}
-%
-% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
-% message, so this ends up printing `@group can only ...'.
-%
-\newhelp\groupinvalidhelp{%
-group can only be used in environments such as @example,^^J%
-where each line of input produces a line of output.}
-
-% @need space-in-mils
-% forces a page break if there is not space-in-mils remaining.
-
-\newdimen\mil \mil=0.001in
-
-\def\need{\parsearg\needx}
-
-% Old definition--didn't work.
-%\def\needx #1{\par %
-%% This method tries to make TeX break the page naturally
-%% if the depth of the box does not fit.
-%{\baselineskip=0pt%
-%\vtop to #1\mil{\vfil}\kern -#1\mil\penalty 10000
-%\prevdepth=-1000pt
-%}}
-
-\def\needx#1{%
- % Go into vertical mode, so we don't make a big box in the middle of a
- % paragraph.
- \par
- %
- % Don't add any leading before our big empty box, but allow a page
- % break, since the best break might be right here.
- \allowbreak
- \nointerlineskip
- \vtop to #1\mil{\vfil}%
- %
- % TeX does not even consider page breaks if a penalty added to the
- % main vertical list is 10000 or more. But in order to see if the
- % empty box we just added fits on the page, we must make it consider
- % page breaks. On the other hand, we don't want to actually break the
- % page after the empty box. So we use a penalty of 9999.
- %
- % There is an extremely small chance that TeX will actually break the
- % page at this \penalty, if there are no other feasible breakpoints in
- % sight. (If the user is using lots of big @group commands, which
- % almost-but-not-quite fill up a page, TeX will have a hard time doing
- % good page breaking, for example.) However, I could not construct an
- % example where a page broke at this \penalty; if it happens in a real
- % document, then we can reconsider our strategy.
- \penalty9999
- %
- % Back up by the size of the box, whether we did a page break or not.
- \kern -#1\mil
- %
- % Do not allow a page break right after this kern.
- \nobreak
-}
-
-% @br forces paragraph break
-
-\let\br = \par
-
-% @dots{} output some dots
-
-\def\dots{$\ldots$}
-
-% @page forces the start of a new page
-
-\def\page{\par\vfill\supereject}
-
-% @exdent text....
-% outputs text on separate line in roman font, starting at standard page margin
-
-% This records the amount of indent in the innermost environment.
-% That's how much \exdent should take out.
-\newskip\exdentamount
-
-% This defn is used inside fill environments such as @defun.
-\def\exdent{\parsearg\exdentyyy}
-\def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}}
-
-% This defn is used inside nofill environments such as @example.
-\def\nofillexdent{\parsearg\nofillexdentyyy}
-\def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount
-\leftline{\hskip\leftskip{\rm#1}}}}
-
-%\hbox{{\rm#1}}\hfil\break}}
-
-% @include file insert text of that file as input.
-
-\def\include{\parsearg\includezzz}
-%Use \input\thisfile to avoid blank after \input, which may be an active
-%char (in which case the blank would become the \input argument).
-%The grouping keeps the value of \thisfile correct even when @include
-%is nested.
-\def\includezzz #1{\begingroup
-\def\thisfile{#1}\input\thisfile
-\endgroup}
-
-\def\thisfile{}
-
-% @center line outputs that line, centered
-
-\def\center{\parsearg\centerzzz}
-\def\centerzzz #1{{\advance\hsize by -\leftskip
-\advance\hsize by -\rightskip
-\centerline{#1}}}
-
-% @sp n outputs n lines of vertical space
-
-\def\sp{\parsearg\spxxx}
-\def\spxxx #1{\par \vskip #1\baselineskip}
-
-% @comment ...line which is ignored...
-% @c is the same as @comment
-% @ignore ... @end ignore is another way to write a comment
-
-\def\comment{\catcode 64=\other \catcode 123=\other \catcode 125=\other%
-\parsearg \commentxxx}
-
-\def\commentxxx #1{\catcode 64=0 \catcode 123=1 \catcode 125=2 }
-
-\let\c=\comment
-
-% Prevent errors for section commands.
-% Used in @ignore and in failing conditionals.
-\def\ignoresections{%
-\let\chapter=\relax
-\let\unnumbered=\relax
-\let\top=\relax
-\let\unnumberedsec=\relax
-\let\unnumberedsection=\relax
-\let\unnumberedsubsec=\relax
-\let\unnumberedsubsection=\relax
-\let\unnumberedsubsubsec=\relax
-\let\unnumberedsubsubsection=\relax
-\let\section=\relax
-\let\subsec=\relax
-\let\subsubsec=\relax
-\let\subsection=\relax
-\let\subsubsection=\relax
-\let\appendix=\relax
-\let\appendixsec=\relax
-\let\appendixsection=\relax
-\let\appendixsubsec=\relax
-\let\appendixsubsection=\relax
-\let\appendixsubsubsec=\relax
-\let\appendixsubsubsection=\relax
-\let\contents=\relax
-\let\smallbook=\relax
-\let\titlepage=\relax
-}
-
-% Used in nested conditionals, where we have to parse the Texinfo source
-% and so want to turn off most commands, in case they are used
-% incorrectly.
-%
-\def\ignoremorecommands{%
- \let\defcv = \relax
- \let\deffn = \relax
- \let\deffnx = \relax
- \let\defindex = \relax
- \let\defivar = \relax
- \let\defmac = \relax
- \let\defmethod = \relax
- \let\defop = \relax
- \let\defopt = \relax
- \let\defspec = \relax
- \let\deftp = \relax
- \let\deftypefn = \relax
- \let\deftypefun = \relax
- \let\deftypevar = \relax
- \let\deftypevr = \relax
- \let\defun = \relax
- \let\defvar = \relax
- \let\defvr = \relax
- \let\ref = \relax
- \let\xref = \relax
- \let\printindex = \relax
- \let\pxref = \relax
- \let\settitle = \relax
- \let\include = \relax
- \let\lowersections = \relax
- \let\down = \relax
- \let\raisesections = \relax
- \let\up = \relax
- \let\set = \relax
- \let\clear = \relax
- \let\item = \relax
- \let\message = \relax
-}
-
-% Ignore @ignore ... @end ignore.
-%
-\def\ignore{\doignore{ignore}}
-
-% Also ignore @ifinfo, @ifhtml, @html, @menu, and @direntry text.
-%
-\def\ifinfo{\doignore{ifinfo}}
-\def\ifhtml{\doignore{ifhtml}}
-\def\html{\doignore{html}}
-\def\menu{\doignore{menu}}
-\def\direntry{\doignore{direntry}}
-
-% Ignore text until a line `@end #1'.
-%
-\def\doignore#1{\begingroup
- % Don't complain about control sequences we have declared \outer.
- \ignoresections
- %
- % Define a command to swallow text until we reach `@end #1'.
- \long\def\doignoretext##1\end #1{\enddoignore}%
- %
- % Make sure that spaces turn into tokens that match what \doignoretext wants.
- \catcode32 = 10
- %
- % And now expand that command.
- \doignoretext
-}
-
-% What we do to finish off ignored text.
-%
-\def\enddoignore{\endgroup\ignorespaces}%
-
-\newif\ifwarnedobs\warnedobsfalse
-\def\obstexwarn{%
- \ifwarnedobs\relax\else
- % We need to warn folks that they may have trouble with TeX 3.0.
- % This uses \immediate\write16 rather than \message to get newlines.
- \immediate\write16{}
- \immediate\write16{***WARNING*** for users of Unix TeX 3.0!}
- \immediate\write16{This manual trips a bug in TeX version 3.0 (tex hangs).}
- \immediate\write16{If you are running another version of TeX, relax.}
- \immediate\write16{If you are running Unix TeX 3.0, kill this TeX process.}
- \immediate\write16{ Then upgrade your TeX installation if you can.}
- \immediate\write16{If you are stuck with version 3.0, run the}
- \immediate\write16{ script ``tex3patch'' from the Texinfo distribution}
- \immediate\write16{ to use a workaround.}
- \immediate\write16{}
- \warnedobstrue
- \fi
-}
-
-% **In TeX 3.0, setting text in \nullfont hangs tex. For a
-% workaround (which requires the file ``dummy.tfm'' to be installed),
-% uncomment the following line:
-%%%%%\font\nullfont=dummy\let\obstexwarn=\relax
-
-% Ignore text, except that we keep track of conditional commands for
-% purposes of nesting, up to an `@end #1' command.
-%
-\def\nestedignore#1{%
- \obstexwarn
- % We must actually expand the ignored text to look for the @end
- % command, so that nested ignore constructs work. Thus, we put the
- % text into a \vbox and then do nothing with the result. To minimize
- % the change of memory overflow, we follow the approach outlined on
- % page 401 of the TeXbook: make the current font be a dummy font.
- %
- \setbox0 = \vbox\bgroup
- % Don't complain about control sequences we have declared \outer.
- \ignoresections
- %
- % Define `@end #1' to end the box, which will in turn undefine the
- % @end command again.
- \expandafter\def\csname E#1\endcsname{\egroup\ignorespaces}%
- %
- % We are going to be parsing Texinfo commands. Most cause no
- % trouble when they are used incorrectly, but some commands do
- % complicated argument parsing or otherwise get confused, so we
- % undefine them.
- %
- % We can't do anything about stray @-signs, unfortunately;
- % they'll produce `undefined control sequence' errors.
- \ignoremorecommands
- %
- % Set the current font to be \nullfont, a TeX primitive, and define
- % all the font commands to also use \nullfont. We don't use
- % dummy.tfm, as suggested in the TeXbook, because not all sites
- % might have that installed. Therefore, math mode will still
- % produce output, but that should be an extremely small amount of
- % stuff compared to the main input.
- %
- \nullfont
- \let\tenrm = \nullfont \let\tenit = \nullfont \let\tensl = \nullfont
- \let\tenbf = \nullfont \let\tentt = \nullfont \let\smallcaps = \nullfont
- \let\tensf = \nullfont
- % Similarly for index fonts (mostly for their use in
- % smallexample)
- \let\indrm = \nullfont \let\indit = \nullfont \let\indsl = \nullfont
- \let\indbf = \nullfont \let\indtt = \nullfont \let\indsc = \nullfont
- \let\indsf = \nullfont
- %
- % Don't complain when characters are missing from the fonts.
- \tracinglostchars = 0
- %
- % Don't bother to do space factor calculations.
- \frenchspacing
- %
- % Don't report underfull hboxes.
- \hbadness = 10000
- %
- % Do minimal line-breaking.
- \pretolerance = 10000
- %
- % Do not execute instructions in @tex
- \def\tex{\doignore{tex}}
-}
-
-% @set VAR sets the variable VAR to an empty value.
-% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
-%
-% Since we want to separate VAR from REST-OF-LINE (which might be
-% empty), we can't just use \parsearg; we have to insert a space of our
-% own to delimit the rest of the line, and then take it out again if we
-% didn't need it.
-%
-\def\set{\parsearg\setxxx}
-\def\setxxx#1{\setyyy#1 \endsetyyy}
-\def\setyyy#1 #2\endsetyyy{%
- \def\temp{#2}%
- \ifx\temp\empty \global\expandafter\let\csname SET#1\endcsname = \empty
- \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted.
- \fi
-}
-\def\setzzz#1#2 \endsetzzz{\expandafter\xdef\csname SET#1\endcsname{#2}}
-
-% @clear VAR clears (i.e., unsets) the variable VAR.
-%
-\def\clear{\parsearg\clearxxx}
-\def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax}
-
-% @value{foo} gets the text saved in variable foo.
-%
-\def\value#1{\expandafter
- \ifx\csname SET#1\endcsname\relax
- {\{No value for ``#1''\}}
- \else \csname SET#1\endcsname \fi}
-
-% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
-% with @set.
-%
-\def\ifset{\parsearg\ifsetxxx}
-\def\ifsetxxx #1{%
- \expandafter\ifx\csname SET#1\endcsname\relax
- \expandafter\ifsetfail
- \else
- \expandafter\ifsetsucceed
- \fi
-}
-\def\ifsetsucceed{\conditionalsucceed{ifset}}
-\def\ifsetfail{\nestedignore{ifset}}
-\defineunmatchedend{ifset}
-
-% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
-% defined with @set, or has been undefined with @clear.
-%
-\def\ifclear{\parsearg\ifclearxxx}
-\def\ifclearxxx #1{%
- \expandafter\ifx\csname SET#1\endcsname\relax
- \expandafter\ifclearsucceed
- \else
- \expandafter\ifclearfail
- \fi
-}
-\def\ifclearsucceed{\conditionalsucceed{ifclear}}
-\def\ifclearfail{\nestedignore{ifclear}}
-\defineunmatchedend{ifclear}
-
-% @iftex always succeeds; we read the text following, through @end
-% iftex). But `@end iftex' should be valid only after an @iftex.
-%
-\def\iftex{\conditionalsucceed{iftex}}
-\defineunmatchedend{iftex}
-
-% We can't just want to start a group at @iftex (for example) and end it
-% at @end iftex, since then @set commands inside the conditional have no
-% effect (they'd get reverted at the end of the group). So we must
-% define \Eiftex to redefine itself to be its previous value. (We can't
-% just define it to fail again with an ``unmatched end'' error, since
-% the @ifset might be nested.)
-%
-\def\conditionalsucceed#1{%
- \edef\temp{%
- % Remember the current value of \E#1.
- \let\nece{prevE#1} = \nece{E#1}%
- %
- % At the `@end #1', redefine \E#1 to be its previous value.
- \def\nece{E#1}{\let\nece{E#1} = \nece{prevE#1}}%
- }%
- \temp
-}
-
-% We need to expand lots of \csname's, but we don't want to expand the
-% control sequences after we've constructed them.
-%
-\def\nece#1{\expandafter\noexpand\csname#1\endcsname}
-
-% @asis just yields its argument. Used with @table, for example.
-%
-\def\asis#1{#1}
-
-% @math means output in math mode.
-% We don't use $'s directly in the definition of \math because control
-% sequences like \math are expanded when the toc file is written. Then,
-% we read the toc file back, the $'s will be normal characters (as they
-% should be, according to the definition of Texinfo). So we must use a
-% control sequence to switch into and out of math mode.
-%
-% This isn't quite enough for @math to work properly in indices, but it
-% seems unlikely it will ever be needed there.
-%
-\let\implicitmath = $
-\def\math#1{\implicitmath #1\implicitmath}
-
-% @bullet and @minus need the same treatment as @math, just above.
-\def\bullet{\implicitmath\ptexbullet\implicitmath}
-\def\minus{\implicitmath-\implicitmath}
-
-\def\node{\ENVcheck\parsearg\nodezzz}
-\def\nodezzz#1{\nodexxx [#1,]}
-\def\nodexxx[#1,#2]{\gdef\lastnode{#1}}
-\let\nwnode=\node
-\let\lastnode=\relax
-
-\def\donoderef{\ifx\lastnode\relax\else
-\expandafter\expandafter\expandafter\setref{\lastnode}\fi
-\global\let\lastnode=\relax}
-
-\def\unnumbnoderef{\ifx\lastnode\relax\else
-\expandafter\expandafter\expandafter\unnumbsetref{\lastnode}\fi
-\global\let\lastnode=\relax}
-
-\def\appendixnoderef{\ifx\lastnode\relax\else
-\expandafter\expandafter\expandafter\appendixsetref{\lastnode}\fi
-\global\let\lastnode=\relax}
-
-\let\refill=\relax
-
-% @setfilename is done at the beginning of every texinfo file.
-% So open here the files we need to have open while reading the input.
-% This makes it possible to make a .fmt file for texinfo.
-\def\setfilename{%
- \readauxfile
- \opencontents
- \openindices
- \fixbackslash % Turn off hack to swallow `\input texinfo'.
- \global\let\setfilename=\comment % Ignore extra @setfilename cmds.
- \comment % Ignore the actual filename.
-}
-
-\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
-
-\def\inforef #1{\inforefzzz #1,,,,**}
-\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
- node \samp{\ignorespaces#1{}}}
-
-\message{fonts,}
-
-% Font-change commands.
-
-% Texinfo supports the sans serif font style, which plain TeX does not.
-% So we set up a \sf analogous to plain's \rm, etc.
-\newfam\sffam
-\def\sf{\fam=\sffam \tensf}
-\let\li = \sf % Sometimes we call it \li, not \sf.
-
-%% Try out Computer Modern fonts at \magstephalf
-\let\mainmagstep=\magstephalf
-
-% Set the font macro #1 to the font named #2, adding on the
-% specified font prefix (normally `cm').
-\def\setfont#1#2{\font#1=\fontprefix#2}
-
-% Use cm as the default font prefix.
-% To specify the font prefix, you must define \fontprefix
-% before you read in texinfo.tex.
-\ifx\fontprefix\undefined
-\def\fontprefix{cm}
-\fi
-
-\ifx\bigger\relax
-\let\mainmagstep=\magstep1
-\setfont\textrm{r12}
-\setfont\texttt{tt12}
-\else
-\setfont\textrm{r10 scaled \mainmagstep}
-\setfont\texttt{tt10 scaled \mainmagstep}
-\fi
-% Instead of cmb10, you many want to use cmbx10.
-% cmbx10 is a prettier font on its own, but cmb10
-% looks better when embedded in a line with cmr10.
-\setfont\textbf{b10 scaled \mainmagstep}
-\setfont\textit{ti10 scaled \mainmagstep}
-\setfont\textsl{sl10 scaled \mainmagstep}
-\setfont\textsf{ss10 scaled \mainmagstep}
-\setfont\textsc{csc10 scaled \mainmagstep}
-\font\texti=cmmi10 scaled \mainmagstep
-\font\textsy=cmsy10 scaled \mainmagstep
-
-% A few fonts for @defun, etc.
-\setfont\defbf{bx10 scaled \magstep1} %was 1314
-\setfont\deftt{tt10 scaled \magstep1}
-\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf}
-
-% Fonts for indices and small examples.
-% We actually use the slanted font rather than the italic,
-% because texinfo normally uses the slanted fonts for that.
-% Do not make many font distinctions in general in the index, since they
-% aren't very useful.
-\setfont\ninett{tt9}
-\setfont\indrm{r9}
-\setfont\indit{sl9}
-\let\indsl=\indit
-\let\indtt=\ninett
-\let\indsf=\indrm
-\let\indbf=\indrm
-\let\indsc=\indrm
-\font\indi=cmmi9
-\font\indsy=cmsy9
-
-% Fonts for headings
-\setfont\chaprm{bx12 scaled \magstep2}
-\setfont\chapit{ti12 scaled \magstep2}
-\setfont\chapsl{sl12 scaled \magstep2}
-\setfont\chaptt{tt12 scaled \magstep2}
-\setfont\chapsf{ss12 scaled \magstep2}
-\let\chapbf=\chaprm
-\setfont\chapsc{csc10 scaled\magstep3}
-\font\chapi=cmmi12 scaled \magstep2
-\font\chapsy=cmsy10 scaled \magstep3
-
-\setfont\secrm{bx12 scaled \magstep1}
-\setfont\secit{ti12 scaled \magstep1}
-\setfont\secsl{sl12 scaled \magstep1}
-\setfont\sectt{tt12 scaled \magstep1}
-\setfont\secsf{ss12 scaled \magstep1}
-\setfont\secbf{bx12 scaled \magstep1}
-\setfont\secsc{csc10 scaled\magstep2}
-\font\seci=cmmi12 scaled \magstep1
-\font\secsy=cmsy10 scaled \magstep2
-
-% \setfont\ssecrm{bx10 scaled \magstep1} % This size an font looked bad.
-% \setfont\ssecit{cmti10 scaled \magstep1} % The letters were too crowded.
-% \setfont\ssecsl{sl10 scaled \magstep1}
-% \setfont\ssectt{tt10 scaled \magstep1}
-% \setfont\ssecsf{ss10 scaled \magstep1}
-
-%\setfont\ssecrm{b10 scaled 1315} % Note the use of cmb rather than cmbx.
-%\setfont\ssecit{ti10 scaled 1315} % Also, the size is a little larger than
-%\setfont\ssecsl{sl10 scaled 1315} % being scaled magstep1.
-%\setfont\ssectt{tt10 scaled 1315}
-%\setfont\ssecsf{ss10 scaled 1315}
-
-%\let\ssecbf=\ssecrm
-
-\setfont\ssecrm{bx12 scaled \magstephalf}
-\setfont\ssecit{ti12 scaled \magstephalf}
-\setfont\ssecsl{sl12 scaled \magstephalf}
-\setfont\ssectt{tt12 scaled \magstephalf}
-\setfont\ssecsf{ss12 scaled \magstephalf}
-\setfont\ssecbf{bx12 scaled \magstephalf}
-\setfont\ssecsc{csc10 scaled \magstep1}
-\font\sseci=cmmi12 scaled \magstephalf
-\font\ssecsy=cmsy10 scaled \magstep1
-% The smallcaps and symbol fonts should actually be scaled \magstep1.5,
-% but that is not a standard magnification.
-
-% Fonts for title page:
-\setfont\titlerm{bx12 scaled \magstep3}
-\let\authorrm = \secrm
-
-% In order for the font changes to affect most math symbols and letters,
-% we have to define the \textfont of the standard families. Since
-% texinfo doesn't allow for producing subscripts and superscripts, we
-% don't bother to reset \scriptfont and \scriptscriptfont (which would
-% also require loading a lot more fonts).
-%
-\def\resetmathfonts{%
- \textfont0 = \tenrm \textfont1 = \teni \textfont2 = \tensy
- \textfont\itfam = \tenit \textfont\slfam = \tensl \textfont\bffam = \tenbf
- \textfont\ttfam = \tentt \textfont\sffam = \tensf
-}
-
-
-% The font-changing commands redefine the meanings of \tenSTYLE, instead
-% of just \STYLE. We do this so that font changes will continue to work
-% in math mode, where it is the current \fam that is relevant in most
-% cases, not the current. Plain TeX does, for example,
-% \def\bf{\fam=\bffam \tenbf} By redefining \tenbf, we obviate the need
-% to redefine \bf itself.
-\def\textfonts{%
- \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
- \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
- \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
- \resetmathfonts}
-\def\chapfonts{%
- \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
- \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
- \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
- \resetmathfonts}
-\def\secfonts{%
- \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
- \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
- \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
- \resetmathfonts}
-\def\subsecfonts{%
- \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
- \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
- \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
- \resetmathfonts}
-\def\indexfonts{%
- \let\tenrm=\indrm \let\tenit=\indit \let\tensl=\indsl
- \let\tenbf=\indbf \let\tentt=\indtt \let\smallcaps=\indsc
- \let\tensf=\indsf \let\teni=\indi \let\tensy=\indsy
- \resetmathfonts}
-
-% Set up the default fonts, so we can use them for creating boxes.
-%
-\textfonts
-
-% Count depth in font-changes, for error checks
-\newcount\fontdepth \fontdepth=0
-
-% Fonts for short table of contents.
-\setfont\shortcontrm{r12}
-\setfont\shortcontbf{bx12}
-\setfont\shortcontsl{sl12}
-
-%% Add scribe-like font environments, plus @l for inline lisp (usually sans
-%% serif) and @ii for TeX italic
-
-% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
-% unless the following character is such as not to need one.
-\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi}
-\def\smartitalic#1{{\sl #1}\futurelet\next\smartitalicx}
-
-\let\i=\smartitalic
-\let\var=\smartitalic
-\let\dfn=\smartitalic
-\let\emph=\smartitalic
-\let\cite=\smartitalic
-
-\def\b#1{{\bf #1}}
-\let\strong=\b
-
-% We can't just use \exhyphenpenalty, because that only has effect at
-% the end of a paragraph. Restore normal hyphenation at the end of the
-% group within which \nohyphenation is presumably called.
-%
-\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation}
-\def\restorehyphenation{\hyphenchar\font = `- }
-
-\def\t#1{%
- {\tt \nohyphenation \rawbackslash \frenchspacing #1}%
- \null
-}
-\let\ttfont = \t
-%\def\samp #1{`{\tt \rawbackslash \frenchspacing #1}'\null}
-\def\samp #1{`\tclose{#1}'\null}
-\def\key #1{{\tt \nohyphenation \uppercase{#1}}\null}
-\def\ctrl #1{{\tt \rawbackslash \hat}#1}
-
-\let\file=\samp
-
-% @code is a modification of @t,
-% which makes spaces the same size as normal in the surrounding text.
-\def\tclose#1{%
- {%
- % Change normal interword space to be same as for the current font.
- \spaceskip = \fontdimen2\font
- %
- % Switch to typewriter.
- \tt
- %
- % But `\ ' produces the large typewriter interword space.
- \def\ {{\spaceskip = 0pt{} }}%
- %
- % Turn off hyphenation.
- \nohyphenation
- %
- \rawbackslash
- \frenchspacing
- #1%
- }%
- \null
-}
-
-% We *must* turn on hyphenation at `-' and `_' in \code.
-% Otherwise, it is too hard to avoid overful hboxes
-% in the Emacs manual, the Library manual, etc.
-
-% Unfortunately, TeX uses one parameter (\hyphenchar) to control
-% both hyphenation at - and hyphenation within words.
-% We must therefore turn them both off (\tclose does that)
-% and arrange explicitly to hyphenate an a dash.
-% -- rms.
-{
-\catcode`\-=\active
-\catcode`\_=\active
-\global\def\code{\begingroup \catcode`\-=\active \let-\codedash \catcode`\_=\active \let_\codeunder \codex}
-% The following is used by \doprintindex to insure that long function names
-% wrap around. It is necessary for - and _ to be active before the index is
-% read from the file, as \entry parses the arguments long before \code is
-% ever called. -- mycroft
-\global\def\indexbreaks{\catcode`\-=\active \let-\realdash \catcode`\_=\active \let_\realunder}
-}
-\def\realdash{-}
-\def\realunder{_}
-\def\codedash{-\discretionary{}{}{}}
-\def\codeunder{\normalunderscore\discretionary{}{}{}}
-\def\codex #1{\tclose{#1}\endgroup}
-
-%\let\exp=\tclose %Was temporary
-
-% @kbd is like @code, except that if the argument is just one @key command,
-% then @kbd has no effect.
-
-\def\xkey{\key}
-\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
-\ifx\one\xkey\ifx\threex\three \key{#2}%
-\else\tclose{\look}\fi
-\else\tclose{\look}\fi}
-
-% Typeset a dimension, e.g., `in' or `pt'. The only reason for the
-% argument is to make the input look right: @dmn{pt} instead of
-% @dmn{}pt.
-%
-\def\dmn#1{\thinspace #1}
-
-\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
-
-\def\l#1{{\li #1}\null} %
-
-\def\r#1{{\rm #1}} % roman font
-% Use of \lowercase was suggested.
-\def\sc#1{{\smallcaps#1}} % smallcaps font
-\def\ii#1{{\it #1}} % italic font
-
-\message{page headings,}
-
-\newskip\titlepagetopglue \titlepagetopglue = 1.5in
-\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
-
-% First the title page. Must do @settitle before @titlepage.
-\def\titlefont#1{{\titlerm #1}}
-
-\newif\ifseenauthor
-\newif\iffinishedtitlepage
-
-\def\shorttitlepage{\parsearg\shorttitlepagezzz}
-\def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
- \endgroup\page\hbox{}\page}
-
-\def\titlepage{\begingroup \parindent=0pt \textfonts
- \let\subtitlerm=\tenrm
-% I deinstalled the following change because \cmr12 is undefined.
-% This change was not in the ChangeLog anyway. --rms.
-% \let\subtitlerm=\cmr12
- \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}%
- %
- \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines}%
- %
- % Leave some space at the very top of the page.
- \vglue\titlepagetopglue
- %
- % Now you can print the title using @title.
- \def\title{\parsearg\titlezzz}%
- \def\titlezzz##1{\leftline{\titlefont{##1}}
- % print a rule at the page bottom also.
- \finishedtitlepagefalse
- \vskip4pt \hrule height 4pt width \hsize \vskip4pt}%
- % No rule at page bottom unless we print one at the top with @title.
- \finishedtitlepagetrue
- %
- % Now you can put text using @subtitle.
- \def\subtitle{\parsearg\subtitlezzz}%
- \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}%
- %
- % @author should come last, but may come many times.
- \def\author{\parsearg\authorzzz}%
- \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi
- {\authorfont \leftline{##1}}}%
- %
- % Most title ``pages'' are actually two pages long, with space
- % at the top of the second. We don't want the ragged left on the second.
- \let\oldpage = \page
- \def\page{%
- \iffinishedtitlepage\else
- \finishtitlepage
- \fi
- \oldpage
- \let\page = \oldpage
- \hbox{}}%
-% \def\page{\oldpage \hbox{}}
-}
-
-\def\Etitlepage{%
- \iffinishedtitlepage\else
- \finishtitlepage
- \fi
- % It is important to do the page break before ending the group,
- % because the headline and footline are only empty inside the group.
- % If we use the new definition of \page, we always get a blank page
- % after the title page, which we certainly don't want.
- \oldpage
- \endgroup
- \HEADINGSon
-}
-
-\def\finishtitlepage{%
- \vskip4pt \hrule height 2pt width \hsize
- \vskip\titlepagebottomglue
- \finishedtitlepagetrue
-}
-
-%%% Set up page headings and footings.
-
-\let\thispage=\folio
-
-\newtoks \evenheadline % Token sequence for heading line of even pages
-\newtoks \oddheadline % Token sequence for heading line of odd pages
-\newtoks \evenfootline % Token sequence for footing line of even pages
-\newtoks \oddfootline % Token sequence for footing line of odd pages
-
-% Now make Tex use those variables
-\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
- \else \the\evenheadline \fi}}
-\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
- \else \the\evenfootline \fi}\HEADINGShook}
-\let\HEADINGShook=\relax
-
-% Commands to set those variables.
-% For example, this is what @headings on does
-% @evenheading @thistitle|@thispage|@thischapter
-% @oddheading @thischapter|@thispage|@thistitle
-% @evenfooting @thisfile||
-% @oddfooting ||@thisfile
-
-\def\evenheading{\parsearg\evenheadingxxx}
-\def\oddheading{\parsearg\oddheadingxxx}
-\def\everyheading{\parsearg\everyheadingxxx}
-
-\def\evenfooting{\parsearg\evenfootingxxx}
-\def\oddfooting{\parsearg\oddfootingxxx}
-\def\everyfooting{\parsearg\everyfootingxxx}
-
-{\catcode`\@=0 %
-
-\gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish}
-\gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{%
-\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
-
-\gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish}
-\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{%
-\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
-
-\gdef\everyheadingxxx #1{\everyheadingyyy #1@|@|@|@|\finish}
-\gdef\everyheadingyyy #1@|#2@|#3@|#4\finish{%
-\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}
-\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
-
-\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish}
-\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{%
-\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
-
-\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish}
-\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{%
-\global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
-
-\gdef\everyfootingxxx #1{\everyfootingyyy #1@|@|@|@|\finish}
-\gdef\everyfootingyyy #1@|#2@|#3@|#4\finish{%
-\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}
-\global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
-%
-}% unbind the catcode of @.
-
-% @headings double turns headings on for double-sided printing.
-% @headings single turns headings on for single-sided printing.
-% @headings off turns them off.
-% @headings on same as @headings double, retained for compatibility.
-% @headings after turns on double-sided headings after this page.
-% @headings doubleafter turns on double-sided headings after this page.
-% @headings singleafter turns on single-sided headings after this page.
-% By default, they are off.
-
-\def\headings #1 {\csname HEADINGS#1\endcsname}
-
-\def\HEADINGSoff{
-\global\evenheadline={\hfil} \global\evenfootline={\hfil}
-\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
-\HEADINGSoff
-% When we turn headings on, set the page number to 1.
-% For double-sided printing, put current file name in lower left corner,
-% chapter name on inside top of right hand pages, document
-% title on inside top of left hand pages, and page numbers on outside top
-% edge of all pages.
-\def\HEADINGSdouble{
-%\pagealignmacro
-\global\pageno=1
-\global\evenfootline={\hfil}
-\global\oddfootline={\hfil}
-\global\evenheadline={\line{\folio\hfil\thistitle}}
-\global\oddheadline={\line{\thischapter\hfil\folio}}
-}
-% For single-sided printing, chapter title goes across top left of page,
-% page number on top right.
-\def\HEADINGSsingle{
-%\pagealignmacro
-\global\pageno=1
-\global\evenfootline={\hfil}
-\global\oddfootline={\hfil}
-\global\evenheadline={\line{\thischapter\hfil\folio}}
-\global\oddheadline={\line{\thischapter\hfil\folio}}
-}
-\def\HEADINGSon{\HEADINGSdouble}
-
-\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
-\let\HEADINGSdoubleafter=\HEADINGSafter
-\def\HEADINGSdoublex{%
-\global\evenfootline={\hfil}
-\global\oddfootline={\hfil}
-\global\evenheadline={\line{\folio\hfil\thistitle}}
-\global\oddheadline={\line{\thischapter\hfil\folio}}
-}
-
-\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
-\def\HEADINGSsinglex{%
-\global\evenfootline={\hfil}
-\global\oddfootline={\hfil}
-\global\evenheadline={\line{\thischapter\hfil\folio}}
-\global\oddheadline={\line{\thischapter\hfil\folio}}
-}
-
-% Subroutines used in generating headings
-% Produces Day Month Year style of output.
-\def\today{\number\day\space
-\ifcase\month\or
-January\or February\or March\or April\or May\or June\or
-July\or August\or September\or October\or November\or December\fi
-\space\number\year}
-
-% Use this if you want the Month Day, Year style of output.
-%\def\today{\ifcase\month\or
-%January\or February\or March\or April\or May\or June\or
-%July\or August\or September\or October\or November\or December\fi
-%\space\number\day, \number\year}
-
-% @settitle line... specifies the title of the document, for headings
-% It generates no output of its own
-
-\def\thistitle{No Title}
-\def\settitle{\parsearg\settitlezzz}
-\def\settitlezzz #1{\gdef\thistitle{#1}}
-
-\message{tables,}
-
-% @tabs -- simple alignment
-
-% These don't work. For one thing, \+ is defined as outer.
-% So these macros cannot even be defined.
-
-%\def\tabs{\parsearg\tabszzz}
-%\def\tabszzz #1{\settabs\+#1\cr}
-%\def\tabline{\parsearg\tablinezzz}
-%\def\tablinezzz #1{\+#1\cr}
-%\def\&{&}
-
-% Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x).
-
-% default indentation of table text
-\newdimen\tableindent \tableindent=.8in
-% default indentation of @itemize and @enumerate text
-\newdimen\itemindent \itemindent=.3in
-% margin between end of table item and start of table text.
-\newdimen\itemmargin \itemmargin=.1in
-
-% used internally for \itemindent minus \itemmargin
-\newdimen\itemmax
-
-% Note @table, @vtable, and @vtable define @item, @itemx, etc., with
-% these defs.
-% They also define \itemindex
-% to index the item name in whatever manner is desired (perhaps none).
-
-\newif\ifitemxneedsnegativevskip
-
-\def\itemxpar{\par\ifitemxneedsnegativevskip\vskip-\parskip\nobreak\fi}
-
-\def\internalBitem{\smallbreak \parsearg\itemzzz}
-\def\internalBitemx{\itemxpar \parsearg\itemzzz}
-
-\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz}
-\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitemzzz}
-
-\def\internalBkitem{\smallbreak \parsearg\kitemzzz}
-\def\internalBkitemx{\itemxpar \parsearg\kitemzzz}
-
-\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}%
- \itemzzz {#1}}
-
-\def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}%
- \itemzzz {#1}}
-
-\def\itemzzz #1{\begingroup %
- \advance\hsize by -\rightskip
- \advance\hsize by -\tableindent
- \setbox0=\hbox{\itemfont{#1}}%
- \itemindex{#1}%
- \nobreak % This prevents a break before @itemx.
- %
- % Be sure we are not still in the middle of a paragraph.
- %{\parskip = 0in
- %\par
- %}%
- %
- % If the item text does not fit in the space we have, put it on a line
- % by itself, and do not allow a page break either before or after that
- % line. We do not start a paragraph here because then if the next
- % command is, e.g., @kindex, the whatsit would get put into the
- % horizontal list on a line by itself, resulting in extra blank space.
- \ifdim \wd0>\itemmax
- %
- % Make this a paragraph so we get the \parskip glue and wrapping,
- % but leave it ragged-right.
- \begingroup
- \advance\leftskip by-\tableindent
- \advance\hsize by\tableindent
- \advance\rightskip by0pt plus1fil
- \leavevmode\unhbox0\par
- \endgroup
- %
- % We're going to be starting a paragraph, but we don't want the
- % \parskip glue -- logically it's part of the @item we just started.
- \nobreak \vskip-\parskip
- %
- % Stop a page break at the \parskip glue coming up. Unfortunately
- % we can't prevent a possible page break at the following
- % \baselineskip glue.
- \nobreak
- \endgroup
- \itemxneedsnegativevskipfalse
- \else
- % The item text fits into the space. Start a paragraph, so that the
- % following text (if any) will end up on the same line. Since that
- % text will be indented by \tableindent, we make the item text be in
- % a zero-width box.
- \noindent
- \rlap{\hskip -\tableindent\box0}\ignorespaces%
- \endgroup%
- \itemxneedsnegativevskiptrue%
- \fi
-}
-
-\def\item{\errmessage{@item while not in a table}}
-\def\itemx{\errmessage{@itemx while not in a table}}
-\def\kitem{\errmessage{@kitem while not in a table}}
-\def\kitemx{\errmessage{@kitemx while not in a table}}
-\def\xitem{\errmessage{@xitem while not in a table}}
-\def\xitemx{\errmessage{@xitemx while not in a table}}
-
-%% Contains a kludge to get @end[description] to work
-\def\description{\tablez{\dontindex}{1}{}{}{}{}}
-
-\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex}
-{\obeylines\obeyspaces%
-\gdef\tablex #1^^M{%
-\tabley\dontindex#1 \endtabley}}
-
-\def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex}
-{\obeylines\obeyspaces%
-\gdef\ftablex #1^^M{%
-\tabley\fnitemindex#1 \endtabley
-\def\Eftable{\endgraf\afterenvbreak\endgroup}%
-\let\Etable=\relax}}
-
-\def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex}
-{\obeylines\obeyspaces%
-\gdef\vtablex #1^^M{%
-\tabley\vritemindex#1 \endtabley
-\def\Evtable{\endgraf\afterenvbreak\endgroup}%
-\let\Etable=\relax}}
-
-\def\dontindex #1{}
-\def\fnitemindex #1{\doind {fn}{\code{#1}}}%
-\def\vritemindex #1{\doind {vr}{\code{#1}}}%
-
-{\obeyspaces %
-\gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup%
-\tablez{#1}{#2}{#3}{#4}{#5}{#6}}}
-
-\def\tablez #1#2#3#4#5#6{%
-\aboveenvbreak %
-\begingroup %
-\def\Edescription{\Etable}% Neccessary kludge.
-\let\itemindex=#1%
-\ifnum 0#3>0 \advance \leftskip by #3\mil \fi %
-\ifnum 0#4>0 \tableindent=#4\mil \fi %
-\ifnum 0#5>0 \advance \rightskip by #5\mil \fi %
-\def\itemfont{#2}%
-\itemmax=\tableindent %
-\advance \itemmax by -\itemmargin %
-\advance \leftskip by \tableindent %
-\exdentamount=\tableindent
-\parindent = 0pt
-\parskip = \smallskipamount
-\ifdim \parskip=0pt \parskip=2pt \fi%
-\def\Etable{\endgraf\afterenvbreak\endgroup}%
-\let\item = \internalBitem %
-\let\itemx = \internalBitemx %
-\let\kitem = \internalBkitem %
-\let\kitemx = \internalBkitemx %
-\let\xitem = \internalBxitem %
-\let\xitemx = \internalBxitemx %
-}
-
-% This is the counter used by @enumerate, which is really @itemize
-
-\newcount \itemno
-
-\def\itemize{\parsearg\itemizezzz}
-
-\def\itemizezzz #1{%
- \begingroup % ended by the @end itemsize
- \itemizey {#1}{\Eitemize}
-}
-
-\def\itemizey #1#2{%
-\aboveenvbreak %
-\itemmax=\itemindent %
-\advance \itemmax by -\itemmargin %
-\advance \leftskip by \itemindent %
-\exdentamount=\itemindent
-\parindent = 0pt %
-\parskip = \smallskipamount %
-\ifdim \parskip=0pt \parskip=2pt \fi%
-\def#2{\endgraf\afterenvbreak\endgroup}%
-\def\itemcontents{#1}%
-\let\item=\itemizeitem}
-
-% Set sfcode to normal for the chars that usually have another value.
-% These are `.?!:;,'
-\def\frenchspacing{\sfcode46=1000 \sfcode63=1000 \sfcode33=1000
- \sfcode58=1000 \sfcode59=1000 \sfcode44=1000 }
-
-% \splitoff TOKENS\endmark defines \first to be the first token in
-% TOKENS, and \rest to be the remainder.
-%
-\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
-
-% Allow an optional argument of an uppercase letter, lowercase letter,
-% or number, to specify the first label in the enumerated list. No
-% argument is the same as `1'.
-%
-\def\enumerate{\parsearg\enumeratezzz}
-\def\enumeratezzz #1{\enumeratey #1 \endenumeratey}
-\def\enumeratey #1 #2\endenumeratey{%
- \begingroup % ended by the @end enumerate
- %
- % If we were given no argument, pretend we were given `1'.
- \def\thearg{#1}%
- \ifx\thearg\empty \def\thearg{1}\fi
- %
- % Detect if the argument is a single token. If so, it might be a
- % letter. Otherwise, the only valid thing it can be is a number.
- % (We will always have one token, because of the test we just made.
- % This is a good thing, since \splitoff doesn't work given nothing at
- % all -- the first parameter is undelimited.)
- \expandafter\splitoff\thearg\endmark
- \ifx\rest\empty
- % Only one token in the argument. It could still be anything.
- % A ``lowercase letter'' is one whose \lccode is nonzero.
- % An ``uppercase letter'' is one whose \lccode is both nonzero, and
- % not equal to itself.
- % Otherwise, we assume it's a number.
- %
- % We need the \relax at the end of the \ifnum lines to stop TeX from
- % continuing to look for a <number>.
- %
- \ifnum\lccode\expandafter`\thearg=0\relax
- \numericenumerate % a number (we hope)
- \else
- % It's a letter.
- \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
- \lowercaseenumerate % lowercase letter
- \else
- \uppercaseenumerate % uppercase letter
- \fi
- \fi
- \else
- % Multiple tokens in the argument. We hope it's a number.
- \numericenumerate
- \fi
-}
-
-% An @enumerate whose labels are integers. The starting integer is
-% given in \thearg.
-%
-\def\numericenumerate{%
- \itemno = \thearg
- \startenumeration{\the\itemno}%
-}
-
-% The starting (lowercase) letter is in \thearg.
-\def\lowercaseenumerate{%
- \itemno = \expandafter`\thearg
- \startenumeration{%
- % Be sure we're not beyond the end of the alphabet.
- \ifnum\itemno=0
- \errmessage{No more lowercase letters in @enumerate; get a bigger
- alphabet}%
- \fi
- \char\lccode\itemno
- }%
-}
-
-% The starting (uppercase) letter is in \thearg.
-\def\uppercaseenumerate{%
- \itemno = \expandafter`\thearg
- \startenumeration{%
- % Be sure we're not beyond the end of the alphabet.
- \ifnum\itemno=0
- \errmessage{No more uppercase letters in @enumerate; get a bigger
- alphabet}
- \fi
- \char\uccode\itemno
- }%
-}
-
-% Call itemizey, adding a period to the first argument and supplying the
-% common last two arguments. Also subtract one from the initial value in
-% \itemno, since @item increments \itemno.
-%
-\def\startenumeration#1{%
- \advance\itemno by -1
- \itemizey{#1.}\Eenumerate\flushcr
-}
-
-% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
-% to @enumerate.
-%
-\def\alphaenumerate{\enumerate{a}}
-\def\capsenumerate{\enumerate{A}}
-\def\Ealphaenumerate{\Eenumerate}
-\def\Ecapsenumerate{\Eenumerate}
-
-% Definition of @item while inside @itemize.
-
-\def\itemizeitem{%
-\advance\itemno by 1
-{\let\par=\endgraf \smallbreak}%
-\ifhmode \errmessage{\in hmode at itemizeitem}\fi
-{\parskip=0in \hskip 0pt
-\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}%
-\vadjust{\penalty 1200}}%
-\flushcr}
-
-% @multitable macros
-% Amy Hendrickson, 8/18/94
-%
-% @multitable ... @endmultitable will make as many columns as desired.
-% Contents of each column will wrap at width given in preamble. Width
-% can be specified either with sample text given in a template line,
-% or in percent of \hsize, the current width of text on page.
-
-% Table can continue over pages but will only break between lines.
-
-% To make preamble:
-%
-% Either define widths of columns in terms of percent of \hsize:
-% @multitable @percentofhsize .2 .3 .5
-% @item ...
-%
-% Numbers following @percentofhsize are the percent of the total
-% current hsize to be used for each column. You may use as many
-% columns as desired.
-
-% Or use a template:
-% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
-% @item ...
-% using the widest term desired in each column.
-
-
-% Each new table line starts with @item, each subsequent new column
-% starts with @tab. Empty columns may be produced by supplying @tab's
-% with nothing between them for as many times as empty columns are needed,
-% ie, @tab@tab@tab will produce two empty columns.
-
-% @item, @tab, @multicolumn or @endmulticolumn do not need to be on their
-% own lines, but it will not hurt if they are.
-
-% Sample multitable:
-
-% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
-% @item first col stuff @tab second col stuff @tab third col
-% @item
-% first col stuff
-% @tab
-% second col stuff
-% @tab
-% third col
-% @item first col stuff @tab second col stuff
-% @tab Many paragraphs of text may be used in any column.
-%
-% They will wrap at the width determined by the template.
-% @item@tab@tab This will be in third column.
-% @endmultitable
-
-% Default dimensions may be reset by user.
-% @intableparskip will set vertical space between paragraphs in table.
-% @intableparindent will set paragraph indent in table.
-% @spacebetweencols will set horizontal space to be left between columns.
-% @spacebetweenlines will set vertical space to be left between lines.
-
-%%%%
-% Dimensions
-
-\newdimen\intableparskip
-\newdimen\intableparindent
-\newdimen\spacebetweencols
-\newdimen\spacebetweenlines
-\intableparskip=0pt
-\intableparindent=6pt
-\spacebetweencols=12pt
-\spacebetweenlines=12pt
-
-%%%%
-% Macros used to set up halign preamble:
-\let\endsetuptable\relax
-\def\xendsetuptable{\endsetuptable}
-\let\percentofhsize\relax
-\def\xpercentofhsize{\percentofhsize}
-\newif\ifsetpercent
-
-\newcount\colcount
-\def\setuptable#1{\def\firstarg{#1}%
-\ifx\firstarg\xendsetuptable\let\go\relax%
-\else
- \ifx\firstarg\xpercentofhsize\global\setpercenttrue%
- \else
- \ifsetpercent
- \if#1.\else%
- \global\advance\colcount by1 %
- \expandafter\xdef\csname col\the\colcount\endcsname{.#1\hsize}%
- \fi
- \else
- \global\advance\colcount by1
- \setbox0=\hbox{#1}%
- \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
- \fi%
- \fi%
- \let\go\setuptable%
-\fi\go}
-%%%%
-% multitable syntax
-\def\tab{&}
-
-%%%%
-% @multitable ... @endmultitable definitions:
-
-\def\multitable#1\item{\bgroup
-\let\item\cr
-\tolerance=9500
-\hbadness=9500
-\parskip=\intableparskip
-\parindent=\intableparindent
-\overfullrule=0pt
-\global\colcount=0\relax%
-\def\Emultitable{\global\setpercentfalse\global\everycr{}\cr\egroup\egroup}%
- % To parse everything between @multitable and @item :
-\def\one{#1}\expandafter\setuptable\one\endsetuptable
- % Need to reset this to 0 after \setuptable.
-\global\colcount=0\relax%
- %
- % This preamble sets up a generic column definition, which will
- % be used as many times as user calls for columns.
- % \vtop will set a single line and will also let text wrap and
- % continue for many paragraphs if desired.
-\halign\bgroup&\global\advance\colcount by 1\relax%
-\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname
- % In order to keep entries from bumping into each other
- % we will add a \leftskip of \spacebetweencols to all columns after
- % the first one.
- % If a template has been used, we will add \spacebetweencols
- % to the width of each template entry.
- % If user has set preamble in terms of percent of \hsize
- % we will use that dimension as the width of the column, and
- % the \leftskip will keep entries from bumping into each other.
- % Table will start at left margin and final column will justify at
- % right margin.
-\ifnum\colcount=1
-\else
- \ifsetpercent
- \else
- % If user has <not> set preamble in terms of percent of \hsize
- % we will advance \hsize by \spacebetweencols
- \advance\hsize by \spacebetweencols
- \fi
- % In either case we will make \leftskip=\spacebetweencols:
-\leftskip=\spacebetweencols
-\fi
-\noindent##}\cr%
- % \everycr will reset column counter, \colcount, at the end of
- % each line. Every column entry will cause \colcount to advance by one.
- % The table preamble
- % looks at the current \colcount to find the correct column width.
-\global\everycr{\noalign{\nointerlineskip\vskip\spacebetweenlines
-\filbreak%% keeps underfull box messages off when table breaks over pages.
-\global\colcount=0\relax}}}
-
-\message{indexing,}
-% Index generation facilities
-
-% Define \newwrite to be identical to plain tex's \newwrite
-% except not \outer, so it can be used within \newindex.
-{\catcode`\@=11
-\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}}
-
-% \newindex {foo} defines an index named foo.
-% It automatically defines \fooindex such that
-% \fooindex ...rest of line... puts an entry in the index foo.
-% It also defines \fooindfile to be the number of the output channel for
-% the file that accumulates this index. The file's extension is foo.
-% The name of an index should be no more than 2 characters long
-% for the sake of vms.
-
-\def\newindex #1{
-\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file
-\openout \csname#1indfile\endcsname \jobname.#1 % Open the file
-\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex
-\noexpand\doindex {#1}}
-}
-
-% @defindex foo == \newindex{foo}
-
-\def\defindex{\parsearg\newindex}
-
-% Define @defcodeindex, like @defindex except put all entries in @code.
-
-\def\newcodeindex #1{
-\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file
-\openout \csname#1indfile\endcsname \jobname.#1 % Open the file
-\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex
-\noexpand\docodeindex {#1}}
-}
-
-\def\defcodeindex{\parsearg\newcodeindex}
-
-% @synindex foo bar makes index foo feed into index bar.
-% Do this instead of @defindex foo if you don't want it as a separate index.
-\def\synindex #1 #2 {%
-\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
-\expandafter\let\csname#1indfile\endcsname=\synindexfoo
-\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex
-\noexpand\doindex {#2}}%
-}
-
-% @syncodeindex foo bar similar, but put all entries made for index foo
-% inside @code.
-\def\syncodeindex #1 #2 {%
-\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
-\expandafter\let\csname#1indfile\endcsname=\synindexfoo
-\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex
-\noexpand\docodeindex {#2}}%
-}
-
-% Define \doindex, the driver for all \fooindex macros.
-% Argument #1 is generated by the calling \fooindex macro,
-% and it is "foo", the name of the index.
-
-% \doindex just uses \parsearg; it calls \doind for the actual work.
-% This is because \doind is more useful to call from other macros.
-
-% There is also \dosubind {index}{topic}{subtopic}
-% which makes an entry in a two-level index such as the operation index.
-
-\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
-\def\singleindexer #1{\doind{\indexname}{#1}}
-
-% like the previous two, but they put @code around the argument.
-\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
-\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
-
-\def\indexdummies{%
-% Take care of the plain tex accent commands.
-\def\"{\realbackslash "}%
-\def\`{\realbackslash `}%
-\def\'{\realbackslash '}%
-\def\^{\realbackslash ^}%
-\def\~{\realbackslash ~}%
-\def\={\realbackslash =}%
-\def\b{\realbackslash b}%
-\def\c{\realbackslash c}%
-\def\d{\realbackslash d}%
-\def\u{\realbackslash u}%
-\def\v{\realbackslash v}%
-\def\H{\realbackslash H}%
-% Take care of the plain tex special European modified letters.
-\def\oe{\realbackslash oe}%
-\def\ae{\realbackslash ae}%
-\def\aa{\realbackslash aa}%
-\def\OE{\realbackslash OE}%
-\def\AE{\realbackslash AE}%
-\def\AA{\realbackslash AA}%
-\def\o{\realbackslash o}%
-\def\O{\realbackslash O}%
-\def\l{\realbackslash l}%
-\def\L{\realbackslash L}%
-\def\ss{\realbackslash ss}%
-% Take care of texinfo commands likely to appear in an index entry.
-\def\_{{\realbackslash _}}%
-\def\w{\realbackslash w }%
-\def\bf{\realbackslash bf }%
-\def\rm{\realbackslash rm }%
-\def\sl{\realbackslash sl }%
-\def\sf{\realbackslash sf}%
-\def\tt{\realbackslash tt}%
-\def\gtr{\realbackslash gtr}%
-\def\less{\realbackslash less}%
-\def\hat{\realbackslash hat}%
-\def\char{\realbackslash char}%
-\def\TeX{\realbackslash TeX}%
-\def\dots{\realbackslash dots }%
-\def\copyright{\realbackslash copyright }%
-\def\tclose##1{\realbackslash tclose {##1}}%
-\def\code##1{\realbackslash code {##1}}%
-\def\samp##1{\realbackslash samp {##1}}%
-\def\t##1{\realbackslash r {##1}}%
-\def\r##1{\realbackslash r {##1}}%
-\def\i##1{\realbackslash i {##1}}%
-\def\b##1{\realbackslash b {##1}}%
-\def\cite##1{\realbackslash cite {##1}}%
-\def\key##1{\realbackslash key {##1}}%
-\def\file##1{\realbackslash file {##1}}%
-\def\var##1{\realbackslash var {##1}}%
-\def\kbd##1{\realbackslash kbd {##1}}%
-\def\dfn##1{\realbackslash dfn {##1}}%
-\def\emph##1{\realbackslash emph {##1}}%
-}
-
-% \indexnofonts no-ops all font-change commands.
-% This is used when outputting the strings to sort the index by.
-\def\indexdummyfont#1{#1}
-\def\indexdummytex{TeX}
-\def\indexdummydots{...}
-
-\def\indexnofonts{%
-% Just ignore accents.
-\let\"=\indexdummyfont
-\let\`=\indexdummyfont
-\let\'=\indexdummyfont
-\let\^=\indexdummyfont
-\let\~=\indexdummyfont
-\let\==\indexdummyfont
-\let\b=\indexdummyfont
-\let\c=\indexdummyfont
-\let\d=\indexdummyfont
-\let\u=\indexdummyfont
-\let\v=\indexdummyfont
-\let\H=\indexdummyfont
-% Take care of the plain tex special European modified letters.
-\def\oe{oe}%
-\def\ae{ae}%
-\def\aa{aa}%
-\def\OE{OE}%
-\def\AE{AE}%
-\def\AA{AA}%
-\def\o{o}%
-\def\O{O}%
-\def\l{l}%
-\def\L{L}%
-\def\ss{ss}%
-\let\w=\indexdummyfont
-\let\t=\indexdummyfont
-\let\r=\indexdummyfont
-\let\i=\indexdummyfont
-\let\b=\indexdummyfont
-\let\emph=\indexdummyfont
-\let\strong=\indexdummyfont
-\let\cite=\indexdummyfont
-\let\sc=\indexdummyfont
-%Don't no-op \tt, since it isn't a user-level command
-% and is used in the definitions of the active chars like <, >, |...
-%\let\tt=\indexdummyfont
-\let\tclose=\indexdummyfont
-\let\code=\indexdummyfont
-\let\file=\indexdummyfont
-\let\samp=\indexdummyfont
-\let\kbd=\indexdummyfont
-\let\key=\indexdummyfont
-\let\var=\indexdummyfont
-\let\TeX=\indexdummytex
-\let\dots=\indexdummydots
-}
-
-% To define \realbackslash, we must make \ not be an escape.
-% We must first make another character (@) an escape
-% so we do not become unable to do a definition.
-
-{\catcode`\@=0 \catcode`\\=\other
-@gdef@realbackslash{\}}
-
-\let\indexbackslash=0 %overridden during \printindex.
-
-\let\SETmarginindex=\relax %initialize!
-% workhorse for all \fooindexes
-% #1 is name of index, #2 is stuff to put there
-\def\doind #1#2{%
-% Put the index entry in the margin if desired.
-\ifx\SETmarginindex\relax\else%
-\insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}%
-\fi%
-{\count10=\lastpenalty %
-{\indexdummies % Must do this here, since \bf, etc expand at this stage
-\escapechar=`\\%
-{\let\folio=0% Expand all macros now EXCEPT \folio
-\def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
-% so it will be output as is; and it will print as backslash in the indx.
-%
-% Now process the index-string once, with all font commands turned off,
-% to get the string to sort the index by.
-{\indexnofonts
-\xdef\temp1{#2}%
-}%
-% Now produce the complete index entry. We process the index-string again,
-% this time with font commands expanded, to get what to print in the index.
-\edef\temp{%
-\write \csname#1indfile\endcsname{%
-\realbackslash entry {\temp1}{\folio}{#2}}}%
-\temp }%
-}\penalty\count10}}
-
-\def\dosubind #1#2#3{%
-{\count10=\lastpenalty %
-{\indexdummies % Must do this here, since \bf, etc expand at this stage
-\escapechar=`\\%
-{\let\folio=0%
-\def\rawbackslashxx{\indexbackslash}%
-%
-% Now process the index-string once, with all font commands turned off,
-% to get the string to sort the index by.
-{\indexnofonts
-\xdef\temp1{#2 #3}%
-}%
-% Now produce the complete index entry. We process the index-string again,
-% this time with font commands expanded, to get what to print in the index.
-\edef\temp{%
-\write \csname#1indfile\endcsname{%
-\realbackslash entry {\temp1}{\folio}{#2}{#3}}}%
-\temp }%
-}\penalty\count10}}
-
-% The index entry written in the file actually looks like
-% \entry {sortstring}{page}{topic}
-% or
-% \entry {sortstring}{page}{topic}{subtopic}
-% The texindex program reads in these files and writes files
-% containing these kinds of lines:
-% \initial {c}
-% before the first topic whose initial is c
-% \entry {topic}{pagelist}
-% for a topic that is used without subtopics
-% \primary {topic}
-% for the beginning of a topic that is used with subtopics
-% \secondary {subtopic}{pagelist}
-% for each subtopic.
-
-% Define the user-accessible indexing commands
-% @findex, @vindex, @kindex, @cindex.
-
-\def\findex {\fnindex}
-\def\kindex {\kyindex}
-\def\cindex {\cpindex}
-\def\vindex {\vrindex}
-\def\tindex {\tpindex}
-\def\pindex {\pgindex}
-
-\def\cindexsub {\begingroup\obeylines\cindexsub}
-{\obeylines %
-\gdef\cindexsub "#1" #2^^M{\endgroup %
-\dosubind{cp}{#2}{#1}}}
-
-% Define the macros used in formatting output of the sorted index material.
-
-% This is what you call to cause a particular index to get printed.
-% Write
-% @unnumbered Function Index
-% @printindex fn
-
-\def\printindex{\parsearg\doprintindex}
-
-\def\doprintindex#1{%
- \tex
- \dobreak \chapheadingskip {10000}
- \catcode`\%=\other\catcode`\&=\other\catcode`\#=\other
- \catcode`\$=\other
- \catcode`\~=\other
- \indexbreaks
- %
- % The following don't help, since the chars were translated
- % when the raw index was written, and their fonts were discarded
- % due to \indexnofonts.
- %\catcode`\"=\active
- %\catcode`\^=\active
- %\catcode`\_=\active
- %\catcode`\|=\active
- %\catcode`\<=\active
- %\catcode`\>=\active
- % %
- \def\indexbackslash{\rawbackslashxx}
- \indexfonts\rm \tolerance=9500 \advance\baselineskip -1pt
- \begindoublecolumns
- %
- % See if the index file exists and is nonempty.
- \openin 1 \jobname.#1s
- \ifeof 1
- % \enddoublecolumns gets confused if there is no text in the index,
- % and it loses the chapter title and the aux file entries for the
- % index. The easiest way to prevent this problem is to make sure
- % there is some text.
- (Index is nonexistent)
- \else
- %
- % If the index file exists but is empty, then \openin leaves \ifeof
- % false. We have to make TeX try to read something from the file, so
- % it can discover if there is anything in it.
- \read 1 to \temp
- \ifeof 1
- (Index is empty)
- \else
- \input \jobname.#1s
- \fi
- \fi
- \closein 1
- \enddoublecolumns
- \Etex
-}
-
-% These macros are used by the sorted index file itself.
-% Change them to control the appearance of the index.
-
-% Same as \bigskipamount except no shrink.
-% \balancecolumns gets confused if there is any shrink.
-\newskip\initialskipamount \initialskipamount 12pt plus4pt
-
-\def\initial #1{%
-{\let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
-\ifdim\lastskip<\initialskipamount
-\removelastskip \penalty-200 \vskip \initialskipamount\fi
-\line{\secbf#1\hfill}\kern 2pt\penalty10000}}
-
-% This typesets a paragraph consisting of #1, dot leaders, and then #2
-% flush to the right margin. It is used for index and table of contents
-% entries. The paragraph is indented by \leftskip.
-%
-\def\entry #1#2{\begingroup
- %
- % Start a new paragraph if necessary, so our assignments below can't
- % affect previous text.
- \par
- %
- % Do not fill out the last line with white space.
- \parfillskip = 0in
- %
- % No extra space above this paragraph.
- \parskip = 0in
- %
- % Do not prefer a separate line ending with a hyphen to fewer lines.
- \finalhyphendemerits = 0
- %
- % \hangindent is only relevant when the entry text and page number
- % don't both fit on one line. In that case, bob suggests starting the
- % dots pretty far over on the line. Unfortunately, a large
- % indentation looks wrong when the entry text itself is broken across
- % lines. So we use a small indentation and put up with long leaders.
- %
- % \hangafter is reset to 1 (which is the value we want) at the start
- % of each paragraph, so we need not do anything with that.
- \hangindent=2em
- %
- % When the entry text needs to be broken, just fill out the first line
- % with blank space.
- \rightskip = 0pt plus1fil
- %
- % Start a ``paragraph'' for the index entry so the line breaking
- % parameters we've set above will have an effect.
- \noindent
- %
- % Insert the text of the index entry. TeX will do line-breaking on it.
- #1%
- % The following is kluged to not output a line of dots in the index if
- % there are no page numbers. The next person who breaks this will be
- % cursed by a Unix daemon.
- \def\tempa{{\rm }}%
- \def\tempb{#2}%
- \edef\tempc{\tempa}%
- \edef\tempd{\tempb}%
- \ifx\tempc\tempd\ \else%
- %
- % If we must, put the page number on a line of its own, and fill out
- % this line with blank space. (The \hfil is overwhelmed with the
- % fill leaders glue in \indexdotfill if the page number does fit.)
- \hfil\penalty50
- \null\nobreak\indexdotfill % Have leaders before the page number.
- %
- % The `\ ' here is removed by the implicit \unskip that TeX does as
- % part of (the primitive) \par. Without it, a spurious underfull
- % \hbox ensues.
- \ #2% The page number ends the paragraph.
- \fi%
- \par
-\endgroup}
-
-% Like \dotfill except takes at least 1 em.
-\def\indexdotfill{\cleaders
- \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill}
-
-\def\primary #1{\line{#1\hfil}}
-
-\newskip\secondaryindent \secondaryindent=0.5cm
-
-\def\secondary #1#2{
-{\parfillskip=0in \parskip=0in
-\hangindent =1in \hangafter=1
-\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\par
-}}
-
-%% Define two-column mode, which is used in indexes.
-%% Adapted from the TeXbook, page 416.
-\catcode `\@=11
-
-\newbox\partialpage
-
-\newdimen\doublecolumnhsize
-
-\def\begindoublecolumns{\begingroup
- % Grab any single-column material above us.
- \output = {\global\setbox\partialpage
- =\vbox{\unvbox255\kern -\topskip \kern \baselineskip}}%
- \eject
- %
- % Now switch to the double-column output routine.
- \output={\doublecolumnout}%
- %
- % Change the page size parameters. We could do this once outside this
- % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
- % format, but then we repeat the same computation. Repeating a couple
- % of assignments once per index is clearly meaningless for the
- % execution time, so we may as well do it once.
- %
- % First we halve the line length, less a little for the gutter between
- % the columns. We compute the gutter based on the line length, so it
- % changes automatically with the paper format. The magic constant
- % below is chosen so that the gutter has the same value (well, +- <
- % 1pt) as it did when we hard-coded it.
- %
- % We put the result in a separate register, \doublecolumhsize, so we
- % can restore it in \pagesofar, after \hsize itself has (potentially)
- % been clobbered.
- %
- \doublecolumnhsize = \hsize
- \advance\doublecolumnhsize by -.04154\hsize
- \divide\doublecolumnhsize by 2
- \hsize = \doublecolumnhsize
- %
- % Double the \vsize as well. (We don't need a separate register here,
- % since nobody clobbers \vsize.)
- \vsize = 2\vsize
- \doublecolumnpagegoal
-}
-
-\def\enddoublecolumns{\eject \endgroup \pagegoal=\vsize \unvbox\partialpage}
-
-\def\doublecolumnsplit{\splittopskip=\topskip \splitmaxdepth=\maxdepth
- \global\dimen@=\pageheight \global\advance\dimen@ by-\ht\partialpage
- \global\setbox1=\vsplit255 to\dimen@ \global\setbox0=\vbox{\unvbox1}
- \global\setbox3=\vsplit255 to\dimen@ \global\setbox2=\vbox{\unvbox3}
- \ifdim\ht0>\dimen@ \setbox255=\vbox{\unvbox0\unvbox2} \global\setbox255=\copy5 \fi
- \ifdim\ht2>\dimen@ \setbox255=\vbox{\unvbox0\unvbox2} \global\setbox255=\copy5 \fi
-}
-\def\doublecolumnpagegoal{%
- \dimen@=\vsize \advance\dimen@ by-2\ht\partialpage \global\pagegoal=\dimen@
-}
-\def\pagesofar{\unvbox\partialpage %
- \hsize=\doublecolumnhsize % have to restore this since output routine
- \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}}
-\def\doublecolumnout{%
- \setbox5=\copy255
- {\vbadness=10000 \doublecolumnsplit}
- \ifvbox255
- \setbox0=\vtop to\dimen@{\unvbox0}
- \setbox2=\vtop to\dimen@{\unvbox2}
- \onepageout\pagesofar \unvbox255 \penalty\outputpenalty
- \else
- \setbox0=\vbox{\unvbox5}
- \ifvbox0
- \dimen@=\ht0 \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip
- \divide\dimen@ by2 \splittopskip=\topskip \splitmaxdepth=\maxdepth
- {\vbadness=10000
- \loop \global\setbox5=\copy0
- \setbox1=\vsplit5 to\dimen@
- \setbox3=\vsplit5 to\dimen@
- \ifvbox5 \global\advance\dimen@ by1pt \repeat
- \setbox0=\vbox to\dimen@{\unvbox1}
- \setbox2=\vbox to\dimen@{\unvbox3}
- \global\setbox\partialpage=\vbox{\pagesofar}
- \doublecolumnpagegoal
- }
- \fi
- \fi
-}
-
-\catcode `\@=\other
-\message{sectioning,}
-% Define chapters, sections, etc.
-
-\newcount \chapno
-\newcount \secno \secno=0
-\newcount \subsecno \subsecno=0
-\newcount \subsubsecno \subsubsecno=0
-
-% This counter is funny since it counts through charcodes of letters A, B, ...
-\newcount \appendixno \appendixno = `\@
-\def\appendixletter{\char\the\appendixno}
-
-\newwrite \contentsfile
-% This is called from \setfilename.
-\def\opencontents{\openout \contentsfile = \jobname.toc}
-
-% Each @chapter defines this as the name of the chapter.
-% page headings and footings can use it. @section does likewise
-
-\def\thischapter{} \def\thissection{}
-\def\seccheck#1{\if \pageno<0 %
-\errmessage{@#1 not allowed after generating table of contents}\fi
-%
-}
-
-\def\chapternofonts{%
-\let\rawbackslash=\relax%
-\let\frenchspacing=\relax%
-\def\result{\realbackslash result}
-\def\equiv{\realbackslash equiv}
-\def\expansion{\realbackslash expansion}
-\def\print{\realbackslash print}
-\def\TeX{\realbackslash TeX}
-\def\dots{\realbackslash dots}
-\def\copyright{\realbackslash copyright}
-\def\tt{\realbackslash tt}
-\def\bf{\realbackslash bf }
-\def\w{\realbackslash w}
-\def\less{\realbackslash less}
-\def\gtr{\realbackslash gtr}
-\def\hat{\realbackslash hat}
-\def\char{\realbackslash char}
-\def\tclose##1{\realbackslash tclose {##1}}
-\def\code##1{\realbackslash code {##1}}
-\def\samp##1{\realbackslash samp {##1}}
-\def\r##1{\realbackslash r {##1}}
-\def\b##1{\realbackslash b {##1}}
-\def\key##1{\realbackslash key {##1}}
-\def\file##1{\realbackslash file {##1}}
-\def\kbd##1{\realbackslash kbd {##1}}
-% These are redefined because @smartitalic wouldn't work inside xdef.
-\def\i##1{\realbackslash i {##1}}
-\def\cite##1{\realbackslash cite {##1}}
-\def\var##1{\realbackslash var {##1}}
-\def\emph##1{\realbackslash emph {##1}}
-\def\dfn##1{\realbackslash dfn {##1}}
-}
-
-\newcount\absseclevel % used to calculate proper heading level
-\newcount\secbase\secbase=0 % @raise/lowersections modify this count
-
-% @raisesections: treat @section as chapter, @subsection as section, etc.
-\def\raisesections{\global\advance\secbase by -1}
-\let\up=\raisesections % original BFox name
-
-% @lowersections: treat @chapter as section, @section as subsection, etc.
-\def\lowersections{\global\advance\secbase by 1}
-\let\down=\lowersections % original BFox name
-
-% Choose a numbered-heading macro
-% #1 is heading level if unmodified by @raisesections or @lowersections
-% #2 is text for heading
-\def\numhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
-\ifcase\absseclevel
- \chapterzzz{#2}
-\or
- \seczzz{#2}
-\or
- \numberedsubseczzz{#2}
-\or
- \numberedsubsubseczzz{#2}
-\else
- \ifnum \absseclevel<0
- \chapterzzz{#2}
- \else
- \numberedsubsubseczzz{#2}
- \fi
-\fi
-}
-
-% like \numhead, but chooses appendix heading levels
-\def\apphead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
-\ifcase\absseclevel
- \appendixzzz{#2}
-\or
- \appendixsectionzzz{#2}
-\or
- \appendixsubseczzz{#2}
-\or
- \appendixsubsubseczzz{#2}
-\else
- \ifnum \absseclevel<0
- \appendixzzz{#2}
- \else
- \appendixsubsubseczzz{#2}
- \fi
-\fi
-}
-
-% like \numhead, but chooses numberless heading levels
-\def\unnmhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
-\ifcase\absseclevel
- \unnumberedzzz{#2}
-\or
- \unnumberedseczzz{#2}
-\or
- \unnumberedsubseczzz{#2}
-\or
- \unnumberedsubsubseczzz{#2}
-\else
- \ifnum \absseclevel<0
- \unnumberedzzz{#2}
- \else
- \unnumberedsubsubseczzz{#2}
- \fi
-\fi
-}
-
-
-\def\thischaptername{No Chapter Title}
-\outer\def\chapter{\parsearg\chapteryyy}
-\def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz
-\def\chapterzzz #1{\seccheck{chapter}%
-\secno=0 \subsecno=0 \subsubsecno=0
-\global\advance \chapno by 1 \message{\putwordChapter \the\chapno}%
-\chapmacro {#1}{\the\chapno}%
-\gdef\thissection{#1}%
-\gdef\thischaptername{#1}%
-% We don't substitute the actual chapter name into \thischapter
-% because we don't want its macros evaluated now.
-\xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}%
-{\chapternofonts%
-\edef\temp{{\realbackslash chapentry {#1}{\the\chapno}{\noexpand\folio}}}%
-\escapechar=`\\%
-\write \contentsfile \temp %
-\donoderef %
-\global\let\section = \numberedsec
-\global\let\subsection = \numberedsubsec
-\global\let\subsubsection = \numberedsubsubsec
-}}
-
-\outer\def\appendix{\parsearg\appendixyyy}
-\def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz
-\def\appendixzzz #1{\seccheck{appendix}%
-\secno=0 \subsecno=0 \subsubsecno=0
-\global\advance \appendixno by 1 \message{Appendix \appendixletter}%
-\chapmacro {#1}{\putwordAppendix{} \appendixletter}%
-\gdef\thissection{#1}%
-\gdef\thischaptername{#1}%
-\xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}%
-{\chapternofonts%
-\edef\temp{{\realbackslash chapentry
- {#1}{\putwordAppendix{} \appendixletter}{\noexpand\folio}}}%
-\escapechar=`\\%
-\write \contentsfile \temp %
-\appendixnoderef %
-\global\let\section = \appendixsec
-\global\let\subsection = \appendixsubsec
-\global\let\subsubsection = \appendixsubsubsec
-}}
-
-\outer\def\top{\parsearg\unnumberedyyy}
-\outer\def\unnumbered{\parsearg\unnumberedyyy}
-\def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
-\def\unnumberedzzz #1{\seccheck{unnumbered}%
-\secno=0 \subsecno=0 \subsubsecno=0
-%
-% This used to be simply \message{#1}, but TeX fully expands the
-% argument to \message. Therefore, if #1 contained @-commands, TeX
-% expanded them. For example, in `@unnumbered The @cite{Book}', TeX
-% expanded @cite (which turns out to cause errors because \cite is meant
-% to be executed, not expanded).
-%
-% Anyway, we don't want the fully-expanded definition of @cite to appear
-% as a result of the \message, we just want `@cite' itself. We use
-% \the<toks register> to achieve this: TeX expands \the<toks> only once,
-% simply yielding the contents of the <toks register>.
-\toks0 = {#1}\message{(\the\toks0)}%
-%
-\unnumbchapmacro {#1}%
-\gdef\thischapter{#1}\gdef\thissection{#1}%
-{\chapternofonts%
-\edef\temp{{\realbackslash unnumbchapentry {#1}{\noexpand\folio}}}%
-\escapechar=`\\%
-\write \contentsfile \temp %
-\unnumbnoderef %
-\global\let\section = \unnumberedsec
-\global\let\subsection = \unnumberedsubsec
-\global\let\subsubsection = \unnumberedsubsubsec
-}}
-
-\outer\def\numberedsec{\parsearg\secyyy}
-\def\secyyy #1{\numhead1{#1}} % normally calls seczzz
-\def\seczzz #1{\seccheck{section}%
-\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
-\gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}%
-{\chapternofonts%
-\edef\temp{{\realbackslash secentry %
-{#1}{\the\chapno}{\the\secno}{\noexpand\folio}}}%
-\escapechar=`\\%
-\write \contentsfile \temp %
-\donoderef %
-\penalty 10000 %
-}}
-
-\outer\def\appenixsection{\parsearg\appendixsecyyy}
-\outer\def\appendixsec{\parsearg\appendixsecyyy}
-\def\appendixsecyyy #1{\apphead1{#1}} % normally calls appendixsectionzzz
-\def\appendixsectionzzz #1{\seccheck{appendixsection}%
-\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
-\gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}%
-{\chapternofonts%
-\edef\temp{{\realbackslash secentry %
-{#1}{\appendixletter}{\the\secno}{\noexpand\folio}}}%
-\escapechar=`\\%
-\write \contentsfile \temp %
-\appendixnoderef %
-\penalty 10000 %
-}}
-
-\outer\def\unnumberedsec{\parsearg\unnumberedsecyyy}
-\def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz
-\def\unnumberedseczzz #1{\seccheck{unnumberedsec}%
-\plainsecheading {#1}\gdef\thissection{#1}%
-{\chapternofonts%
-\edef\temp{{\realbackslash unnumbsecentry{#1}{\noexpand\folio}}}%
-\escapechar=`\\%
-\write \contentsfile \temp %
-\unnumbnoderef %
-\penalty 10000 %
-}}
-
-\outer\def\numberedsubsec{\parsearg\numberedsubsecyyy}
-\def\numberedsubsecyyy #1{\numhead2{#1}} % normally calls numberedsubseczzz
-\def\numberedsubseczzz #1{\seccheck{subsection}%
-\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
-\subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}%
-{\chapternofonts%
-\edef\temp{{\realbackslash subsecentry %
-{#1}{\the\chapno}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
-\escapechar=`\\%
-\write \contentsfile \temp %
-\donoderef %
-\penalty 10000 %
-}}
-
-\outer\def\appendixsubsec{\parsearg\appendixsubsecyyy}
-\def\appendixsubsecyyy #1{\apphead2{#1}} % normally calls appendixsubseczzz
-\def\appendixsubseczzz #1{\seccheck{appendixsubsec}%
-\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
-\subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}%
-{\chapternofonts%
-\edef\temp{{\realbackslash subsecentry %
-{#1}{\appendixletter}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
-\escapechar=`\\%
-\write \contentsfile \temp %
-\appendixnoderef %
-\penalty 10000 %
-}}
-
-\outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy}
-\def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
-\def\unnumberedsubseczzz #1{\seccheck{unnumberedsubsec}%
-\plainsecheading {#1}\gdef\thissection{#1}%
-{\chapternofonts%
-\edef\temp{{\realbackslash unnumbsubsecentry{#1}{\noexpand\folio}}}%
-\escapechar=`\\%
-\write \contentsfile \temp %
-\unnumbnoderef %
-\penalty 10000 %
-}}
-
-\outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy}
-\def\numberedsubsubsecyyy #1{\numhead3{#1}} % normally numberedsubsubseczzz
-\def\numberedsubsubseczzz #1{\seccheck{subsubsection}%
-\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
-\subsubsecheading {#1}
- {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
-{\chapternofonts%
-\edef\temp{{\realbackslash subsubsecentry %
- {#1}
- {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}
- {\noexpand\folio}}}%
-\escapechar=`\\%
-\write \contentsfile \temp %
-\donoderef %
-\penalty 10000 %
-}}
-
-\outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy}
-\def\appendixsubsubsecyyy #1{\apphead3{#1}} % normally appendixsubsubseczzz
-\def\appendixsubsubseczzz #1{\seccheck{appendixsubsubsec}%
-\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
-\subsubsecheading {#1}
- {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
-{\chapternofonts%
-\edef\temp{{\realbackslash subsubsecentry{#1}%
- {\appendixletter}
- {\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}%
-\escapechar=`\\%
-\write \contentsfile \temp %
-\appendixnoderef %
-\penalty 10000 %
-}}
-
-\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy}
-\def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
-\def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}%
-\plainsecheading {#1}\gdef\thissection{#1}%
-{\chapternofonts%
-\edef\temp{{\realbackslash unnumbsubsubsecentry{#1}{\noexpand\folio}}}%
-\escapechar=`\\%
-\write \contentsfile \temp %
-\unnumbnoderef %
-\penalty 10000 %
-}}
-
-% These are variants which are not "outer", so they can appear in @ifinfo.
-% Actually, they should now be obsolete; ordinary section commands should work.
-\def\infotop{\parsearg\unnumberedzzz}
-\def\infounnumbered{\parsearg\unnumberedzzz}
-\def\infounnumberedsec{\parsearg\unnumberedseczzz}
-\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz}
-\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}
-
-\def\infoappendix{\parsearg\appendixzzz}
-\def\infoappendixsec{\parsearg\appendixseczzz}
-\def\infoappendixsubsec{\parsearg\appendixsubseczzz}
-\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz}
-
-\def\infochapter{\parsearg\chapterzzz}
-\def\infosection{\parsearg\sectionzzz}
-\def\infosubsection{\parsearg\subsectionzzz}
-\def\infosubsubsection{\parsearg\subsubsectionzzz}
-
-% These macros control what the section commands do, according
-% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
-% Define them by default for a numbered chapter.
-\global\let\section = \numberedsec
-\global\let\subsection = \numberedsubsec
-\global\let\subsubsection = \numberedsubsubsec
-
-% Define @majorheading, @heading and @subheading
-
-% NOTE on use of \vbox for chapter headings, section headings, and
-% such:
-% 1) We use \vbox rather than the earlier \line to permit
-% overlong headings to fold.
-% 2) \hyphenpenalty is set to 10000 because hyphenation in a
-% heading is obnoxious; this forbids it.
-% 3) Likewise, headings look best if no \parindent is used, and
-% if justification is not attempted. Hence \raggedright.
-
-
-\def\majorheading{\parsearg\majorheadingzzz}
-\def\majorheadingzzz #1{%
-{\advance\chapheadingskip by 10pt \chapbreak }%
-{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
- \parindent=0pt\raggedright
- \rm #1\hfill}}\bigskip \par\penalty 200}
-
-\def\chapheading{\parsearg\chapheadingzzz}
-\def\chapheadingzzz #1{\chapbreak %
-{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
- \parindent=0pt\raggedright
- \rm #1\hfill}}\bigskip \par\penalty 200}
-
-\def\heading{\parsearg\secheadingi}
-
-\def\subheading{\parsearg\subsecheadingi}
-
-\def\subsubheading{\parsearg\subsubsecheadingi}
-
-% These macros generate a chapter, section, etc. heading only
-% (including whitespace, linebreaking, etc. around it),
-% given all the information in convenient, parsed form.
-
-%%% Args are the skip and penalty (usually negative)
-\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
-
-\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
-
-%%% Define plain chapter starts, and page on/off switching for it
-% Parameter controlling skip before chapter headings (if needed)
-
-\newskip \chapheadingskip \chapheadingskip = 30pt plus 8pt minus 4pt
-
-\def\chapbreak{\dobreak \chapheadingskip {-4000}}
-\def\chappager{\par\vfill\supereject}
-\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
-
-\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
-
-\def\CHAPPAGoff{
-\global\let\pchapsepmacro=\chapbreak
-\global\let\pagealignmacro=\chappager}
-
-\def\CHAPPAGon{
-\global\let\pchapsepmacro=\chappager
-\global\let\pagealignmacro=\chappager
-\global\def\HEADINGSon{\HEADINGSsingle}}
-
-\def\CHAPPAGodd{
-\global\let\pchapsepmacro=\chapoddpage
-\global\let\pagealignmacro=\chapoddpage
-\global\def\HEADINGSon{\HEADINGSdouble}}
-
-\CHAPPAGon
-
-\def\CHAPFplain{
-\global\let\chapmacro=\chfplain
-\global\let\unnumbchapmacro=\unnchfplain}
-
-\def\chfplain #1#2{%
- \pchapsepmacro
- {%
- \chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
- \parindent=0pt\raggedright
- \rm #2\enspace #1}%
- }%
- \bigskip
- \penalty5000
-}
-
-\def\unnchfplain #1{%
-\pchapsepmacro %
-{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
- \parindent=0pt\raggedright
- \rm #1\hfill}}\bigskip \par\penalty 10000 %
-}
-\CHAPFplain % The default
-
-\def\unnchfopen #1{%
-\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
- \parindent=0pt\raggedright
- \rm #1\hfill}}\bigskip \par\penalty 10000 %
-}
-
-\def\chfopen #1#2{\chapoddpage {\chapfonts
-\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
-\par\penalty 5000 %
-}
-
-\def\CHAPFopen{
-\global\let\chapmacro=\chfopen
-\global\let\unnumbchapmacro=\unnchfopen}
-
-% Parameter controlling skip before section headings.
-
-\newskip \subsecheadingskip \subsecheadingskip = 17pt plus 8pt minus 4pt
-\def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}}
-
-\newskip \secheadingskip \secheadingskip = 21pt plus 8pt minus 4pt
-\def\secheadingbreak{\dobreak \secheadingskip {-1000}}
-
-% @paragraphindent is defined for the Info formatting commands only.
-\let\paragraphindent=\comment
-
-% Section fonts are the base font at magstep2, which produces
-% a size a bit more than 14 points in the default situation.
-
-\def\secheading #1#2#3{\secheadingi {#2.#3\enspace #1}}
-\def\plainsecheading #1{\secheadingi {#1}}
-\def\secheadingi #1{{\advance \secheadingskip by \parskip %
-\secheadingbreak}%
-{\secfonts \vbox{\hyphenpenalty=10000\tolerance=5000
- \parindent=0pt\raggedright
- \rm #1\hfill}}%
-\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 }
-
-
-% Subsection fonts are the base font at magstep1,
-% which produces a size of 12 points.
-
-\def\subsecheading #1#2#3#4{\subsecheadingi {#2.#3.#4\enspace #1}}
-\def\subsecheadingi #1{{\advance \subsecheadingskip by \parskip %
-\subsecheadingbreak}%
-{\subsecfonts \vbox{\hyphenpenalty=10000\tolerance=5000
- \parindent=0pt\raggedright
- \rm #1\hfill}}%
-\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 }
-
-\def\subsubsecfonts{\subsecfonts} % Maybe this should change:
- % Perhaps make sssec fonts scaled
- % magstep half
-\def\subsubsecheading #1#2#3#4#5{\subsubsecheadingi {#2.#3.#4.#5\enspace #1}}
-\def\subsubsecheadingi #1{{\advance \subsecheadingskip by \parskip %
-\subsecheadingbreak}%
-{\subsubsecfonts \vbox{\hyphenpenalty=10000\tolerance=5000
- \parindent=0pt\raggedright
- \rm #1\hfill}}%
-\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000}
-
-
-\message{toc printing,}
-
-% Finish up the main text and prepare to read what we've written
-% to \contentsfile.
-
-\newskip\contentsrightmargin \contentsrightmargin=1in
-\def\startcontents#1{%
- \pagealignmacro
- \immediate\closeout \contentsfile
- \ifnum \pageno>0
- \pageno = -1 % Request roman numbered pages.
- \fi
- % Don't need to put `Contents' or `Short Contents' in the headline.
- % It is abundantly clear what they are.
- \unnumbchapmacro{#1}\def\thischapter{}%
- \begingroup % Set up to handle contents files properly.
- \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11
- \catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi
- \raggedbottom % Worry more about breakpoints than the bottom.
- \advance\hsize by -\contentsrightmargin % Don't use the full line length.
-}
-
-
-% Normal (long) toc.
-\outer\def\contents{%
- \startcontents{\putwordTableofContents}%
- \input \jobname.toc
- \endgroup
- \vfill \eject
-}
-
-% And just the chapters.
-\outer\def\summarycontents{%
- \startcontents{\putwordShortContents}%
- %
- \let\chapentry = \shortchapentry
- \let\unnumbchapentry = \shortunnumberedentry
- % We want a true roman here for the page numbers.
- \secfonts
- \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl
- \rm
- \advance\baselineskip by 1pt % Open it up a little.
- \def\secentry ##1##2##3##4{}
- \def\unnumbsecentry ##1##2{}
- \def\subsecentry ##1##2##3##4##5{}
- \def\unnumbsubsecentry ##1##2{}
- \def\subsubsecentry ##1##2##3##4##5##6{}
- \def\unnumbsubsubsecentry ##1##2{}
- \input \jobname.toc
- \endgroup
- \vfill \eject
-}
-\let\shortcontents = \summarycontents
-
-% These macros generate individual entries in the table of contents.
-% The first argument is the chapter or section name.
-% The last argument is the page number.
-% The arguments in between are the chapter number, section number, ...
-
-% Chapter-level things, for both the long and short contents.
-\def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}}
-
-% See comments in \dochapentry re vbox and related settings
-\def\shortchapentry#1#2#3{%
- \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno{#3}}%
-}
-
-% Typeset the label for a chapter or appendix for the short contents.
-% The arg is, e.g. `Appendix A' for an appendix, or `3' for a chapter.
-% We could simplify the code here by writing out an \appendixentry
-% command in the toc file for appendices, instead of using \chapentry
-% for both, but it doesn't seem worth it.
-\setbox0 = \hbox{\shortcontrm \putwordAppendix }
-\newdimen\shortappendixwidth \shortappendixwidth = \wd0
-
-\def\shortchaplabel#1{%
- % We typeset #1 in a box of constant width, regardless of the text of
- % #1, so the chapter titles will come out aligned.
- \setbox0 = \hbox{#1}%
- \dimen0 = \ifdim\wd0 > \shortappendixwidth \shortappendixwidth \else 0pt \fi
- %
- % This space should be plenty, since a single number is .5em, and the
- % widest letter (M) is 1em, at least in the Computer Modern fonts.
- % (This space doesn't include the extra space that gets added after
- % the label; that gets put in in \shortchapentry above.)
- \advance\dimen0 by 1.1em
- \hbox to \dimen0{#1\hfil}%
-}
-
-\def\unnumbchapentry#1#2{\dochapentry{#1}{#2}}
-\def\shortunnumberedentry#1#2{\tocentry{#1}{\doshortpageno{#2}}}
-
-% Sections.
-\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}}
-\def\unnumbsecentry#1#2{\dosecentry{#1}{#2}}
-
-% Subsections.
-\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}}
-\def\unnumbsubsecentry#1#2{\dosubsecentry{#1}{#2}}
-
-% And subsubsections.
-\def\subsubsecentry#1#2#3#4#5#6{%
- \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}}
-\def\unnumbsubsubsecentry#1#2{\dosubsubsecentry{#1}{#2}}
-
-
-% This parameter controls the indentation of the various levels.
-\newdimen\tocindent \tocindent = 3pc
-
-% Now for the actual typesetting. In all these, #1 is the text and #2 is the
-% page number.
-%
-% If the toc has to be broken over pages, we would want to be at chapters
-% if at all possible; hence the \penalty.
-\def\dochapentry#1#2{%
- \penalty-300 \vskip\baselineskip
- \begingroup
- \chapentryfonts
- \tocentry{#1}{\dopageno{#2}}%
- \endgroup
- \nobreak\vskip .25\baselineskip
-}
-
-\def\dosecentry#1#2{\begingroup
- \secentryfonts \leftskip=\tocindent
- \tocentry{#1}{\dopageno{#2}}%
-\endgroup}
-
-\def\dosubsecentry#1#2{\begingroup
- \subsecentryfonts \leftskip=2\tocindent
- \tocentry{#1}{\dopageno{#2}}%
-\endgroup}
-
-\def\dosubsubsecentry#1#2{\begingroup
- \subsubsecentryfonts \leftskip=3\tocindent
- \tocentry{#1}{\dopageno{#2}}%
-\endgroup}
-
-% Final typesetting of a toc entry; we use the same \entry macro as for
-% the index entries, but we want to suppress hyphenation here. (We
-% can't do that in the \entry macro, since index entries might consist
-% of hyphenated-identifiers-that-do-not-fit-on-a-line-and-nothing-else.)
-%
-\def\tocentry#1#2{\begingroup
- \hyphenpenalty = 10000
- \entry{#1}{#2}%
-\endgroup}
-
-% Space between chapter (or whatever) number and the title.
-\def\labelspace{\hskip1em \relax}
-
-\def\dopageno#1{{\rm #1}}
-\def\doshortpageno#1{{\rm #1}}
-
-\def\chapentryfonts{\secfonts \rm}
-\def\secentryfonts{\textfonts}
-\let\subsecentryfonts = \textfonts
-\let\subsubsecentryfonts = \textfonts
-
-
-\message{environments,}
-
-% Since these characters are used in examples, it should be an even number of
-% \tt widths. Each \tt character is 1en, so two makes it 1em.
-% Furthermore, these definitions must come after we define our fonts.
-\newbox\dblarrowbox \newbox\longdblarrowbox
-\newbox\pushcharbox \newbox\bullbox
-\newbox\equivbox \newbox\errorbox
-
-\let\ptexequiv = \equiv
-
-%{\tentt
-%\global\setbox\dblarrowbox = \hbox to 1em{\hfil$\Rightarrow$\hfil}
-%\global\setbox\longdblarrowbox = \hbox to 1em{\hfil$\mapsto$\hfil}
-%\global\setbox\pushcharbox = \hbox to 1em{\hfil$\dashv$\hfil}
-%\global\setbox\equivbox = \hbox to 1em{\hfil$\ptexequiv$\hfil}
-% Adapted from the manmac format (p.420 of TeXbook)
-%\global\setbox\bullbox = \hbox to 1em{\kern.15em\vrule height .75ex width .85ex
-% depth .1ex\hfil}
-%}
-
-\def\point{$\star$}
-
-\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
-\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
-\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
-
-\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
-
-% Adapted from the TeXbook's \boxit.
-{\tentt \global\dimen0 = 3em}% Width of the box.
-\dimen2 = .55pt % Thickness of rules
-% The text. (`r' is open on the right, `e' somewhat less so on the left.)
-\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt}
-
-\global\setbox\errorbox=\hbox to \dimen0{\hfil
- \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
- \advance\hsize by -2\dimen2 % Rules.
- \vbox{
- \hrule height\dimen2
- \hbox{\vrule width\dimen2 \kern3pt % Space to left of text.
- \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
- \kern3pt\vrule width\dimen2}% Space to right.
- \hrule height\dimen2}
- \hfil}
-
-% The @error{} command.
-\def\error{\leavevmode\lower.7ex\copy\errorbox}
-
-% @tex ... @end tex escapes into raw Tex temporarily.
-% One exception: @ is still an escape character, so that @end tex works.
-% But \@ or @@ will get a plain tex @ character.
-
-\def\tex{\begingroup
-\catcode `\\=0 \catcode `\{=1 \catcode `\}=2
-\catcode `\$=3 \catcode `\&=4 \catcode `\#=6
-\catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie
-\catcode `\%=14
-\catcode 43=12
-\catcode`\"=12
-\catcode`\==12
-\catcode`\|=12
-\catcode`\<=12
-\catcode`\>=12
-\escapechar=`\\
-%
-\let\~=\ptextilde
-\let\{=\ptexlbrace
-\let\}=\ptexrbrace
-\let\.=\ptexdot
-\let\*=\ptexstar
-\let\dots=\ptexdots
-\def\@{@}%
-\let\bullet=\ptexbullet
-\let\b=\ptexb \let\c=\ptexc \let\i=\ptexi \let\t=\ptext \let\l=\ptexl
-\let\L=\ptexL
-%
-\let\Etex=\endgroup}
-
-% Define @lisp ... @endlisp.
-% @lisp does a \begingroup so it can rebind things,
-% including the definition of @endlisp (which normally is erroneous).
-
-% Amount to narrow the margins by for @lisp.
-\newskip\lispnarrowing \lispnarrowing=0.4in
-
-% This is the definition that ^^M gets inside @lisp, @example, and other
-% such environments. \null is better than a space, since it doesn't
-% have any width.
-\def\lisppar{\null\endgraf}
-
-% Make each space character in the input produce a normal interword
-% space in the output. Don't allow a line break at this space, as this
-% is used only in environments like @example, where each line of input
-% should produce a line of output anyway.
-%
-{\obeyspaces %
-\gdef\sepspaces{\obeyspaces\let =\tie}}
-
-% Define \obeyedspace to be our active space, whatever it is. This is
-% for use in \parsearg.
-{\sepspaces%
-\global\let\obeyedspace= }
-
-% This space is always present above and below environments.
-\newskip\envskipamount \envskipamount = 0pt
-
-% Make spacing and below environment symmetrical. We use \parskip here
-% to help in doing that, since in @example-like environments \parskip
-% is reset to zero; thus the \afterenvbreak inserts no space -- but the
-% start of the next paragraph will insert \parskip
-%
-\def\aboveenvbreak{{\advance\envskipamount by \parskip
-\endgraf \ifdim\lastskip<\envskipamount
-\removelastskip \penalty-50 \vskip\envskipamount \fi}}
-
-\let\afterenvbreak = \aboveenvbreak
-
-% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins.
-\let\nonarrowing=\relax
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% \cartouche: draw rectangle w/rounded corners around argument
-\font\circle=lcircle10
-\newdimen\circthick
-\newdimen\cartouter\newdimen\cartinner
-\newskip\normbskip\newskip\normpskip\newskip\normlskip
-\circthick=\fontdimen8\circle
-%
-\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
-\def\ctr{{\hskip 6pt\circle\char'010}}
-\def\cbl{{\circle\char'012\hskip -6pt}}
-\def\cbr{{\hskip 6pt\circle\char'011}}
-\def\carttop{\hbox to \cartouter{\hskip\lskip
- \ctl\leaders\hrule height\circthick\hfil\ctr
- \hskip\rskip}}
-\def\cartbot{\hbox to \cartouter{\hskip\lskip
- \cbl\leaders\hrule height\circthick\hfil\cbr
- \hskip\rskip}}
-%
-\newskip\lskip\newskip\rskip
-
-\long\def\cartouche{%
-\begingroup
- \lskip=\leftskip \rskip=\rightskip
- \leftskip=0pt\rightskip=0pt %we want these *outside*.
- \cartinner=\hsize \advance\cartinner by-\lskip
- \advance\cartinner by-\rskip
- \cartouter=\hsize
- \advance\cartouter by 18pt % allow for 3pt kerns on either
-% side, and for 6pt waste from
-% each corner char
- \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
- % Flag to tell @lisp, etc., not to narrow margin.
- \let\nonarrowing=\comment
- \vbox\bgroup
- \baselineskip=0pt\parskip=0pt\lineskip=0pt
- \carttop
- \hbox\bgroup
- \hskip\lskip
- \vrule\kern3pt
- \vbox\bgroup
- \hsize=\cartinner
- \kern3pt
- \begingroup
- \baselineskip=\normbskip
- \lineskip=\normlskip
- \parskip=\normpskip
- \vskip -\parskip
-\def\Ecartouche{%
- \endgroup
- \kern3pt
- \egroup
- \kern3pt\vrule
- \hskip\rskip
- \egroup
- \cartbot
- \egroup
-\endgroup
-}}
-
-
-% This macro is called at the beginning of all the @example variants,
-% inside a group.
-\def\nonfillstart{%
- \aboveenvbreak
- \inENV % This group ends at the end of the body
- \hfuzz = 12pt % Don't be fussy
- \sepspaces % Make spaces be word-separators rather than space tokens.
- \singlespace
- \let\par = \lisppar % don't ignore blank lines
- \obeylines % each line of input is a line of output
- \parskip = 0pt
- \parindent = 0pt
- \emergencystretch = 0pt % don't try to avoid overfull boxes
- % @cartouche defines \nonarrowing to inhibit narrowing
- % at next level down.
- \ifx\nonarrowing\relax
- \advance \leftskip by \lispnarrowing
- \exdentamount=\lispnarrowing
- \let\exdent=\nofillexdent
- \let\nonarrowing=\relax
- \fi
-}
-
-% To ending an @example-like environment, we first end the paragraph
-% (via \afterenvbreak's vertical glue), and then the group. That way we
-% keep the zero \parskip that the environments set -- \parskip glue
-% will be inserted at the beginning of the next paragraph in the
-% document, after the environment.
-%
-\def\nonfillfinish{\afterenvbreak\endgroup}%
-
-% This macro is
-\def\lisp{\begingroup
- \nonfillstart
- \let\Elisp = \nonfillfinish
- \tt
- \rawbackslash % have \ input char produce \ char from current font
- \gobble
-}
-
-% Define the \E... control sequence only if we are inside the
-% environment, so the error checking in \end will work.
-%
-% We must call \lisp last in the definition, since it reads the
-% return following the @example (or whatever) command.
-%
-\def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp}
-\def\smallexample{\begingroup \def\Esmallexample{\nonfillfinish\endgroup}\lisp}
-\def\smalllisp{\begingroup \def\Esmalllisp{\nonfillfinish\endgroup}\lisp}
-
-% @smallexample and @smalllisp. This is not used unless the @smallbook
-% command is given. Originally contributed by Pavel@xerox.
-%
-\def\smalllispx{\begingroup
- \nonfillstart
- \let\Esmalllisp = \nonfillfinish
- \let\Esmallexample = \nonfillfinish
- %
- % Smaller interline space and fonts for small examples.
- \setleading{10pt}%
- \indexfonts \tt
- \rawbackslash % make \ output the \ character from the current font (tt)
- \gobble
-}
-
-% This is @display; same as @lisp except use roman font.
-%
-\def\display{\begingroup
- \nonfillstart
- \let\Edisplay = \nonfillfinish
- \gobble
-}
-
-% This is @format; same as @display except don't narrow margins.
-%
-\def\format{\begingroup
- \let\nonarrowing = t
- \nonfillstart
- \let\Eformat = \nonfillfinish
- \gobble
-}
-
-% @flushleft (same as @format) and @flushright.
-%
-\def\flushleft{\begingroup
- \let\nonarrowing = t
- \nonfillstart
- \let\Eflushleft = \nonfillfinish
- \gobble
-}
-\def\flushright{\begingroup
- \let\nonarrowing = t
- \nonfillstart
- \let\Eflushright = \nonfillfinish
- \advance\leftskip by 0pt plus 1fill
- \gobble}
-
-% @quotation does normal linebreaking (hence we can't use \nonfillstart)
-% and narrows the margins.
-%
-\def\quotation{%
- \begingroup\inENV %This group ends at the end of the @quotation body
- {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
- \singlespace
- \parindent=0pt
- % We have retained a nonzero parskip for the environment, since we're
- % doing normal filling. So to avoid extra space below the environment...
- \def\Equotation{\parskip = 0pt \nonfillfinish}%
- %
- % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
- \ifx\nonarrowing\relax
- \advance\leftskip by \lispnarrowing
- \advance\rightskip by \lispnarrowing
- \exdentamount = \lispnarrowing
- \let\nonarrowing = \relax
- \fi
-}
-
-\message{defuns,}
-% Define formatter for defuns
-% First, allow user to change definition object font (\df) internally
-\def\setdeffont #1 {\csname DEF#1\endcsname}
-
-\newskip\defbodyindent \defbodyindent=.4in
-\newskip\defargsindent \defargsindent=50pt
-\newskip\deftypemargin \deftypemargin=12pt
-\newskip\deflastargmargin \deflastargmargin=18pt
-
-\newcount\parencount
-% define \functionparens, which makes ( and ) and & do special things.
-% \functionparens affects the group it is contained in.
-\def\activeparens{%
-\catcode`\(=\active \catcode`\)=\active \catcode`\&=\active
-\catcode`\[=\active \catcode`\]=\active}
-
-% Make control sequences which act like normal parenthesis chars.
-\let\lparen = ( \let\rparen = )
-
-{\activeparens % Now, smart parens don't turn on until &foo (see \amprm)
-
-% Be sure that we always have a definition for `(', etc. For example,
-% if the fn name has parens in it, \boldbrax will not be in effect yet,
-% so TeX would otherwise complain about undefined control sequence.
-\global\let(=\lparen \global\let)=\rparen
-\global\let[=\lbrack \global\let]=\rbrack
-
-\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 }
-\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
-
-% Definitions of (, ) and & used in args for functions.
-% This is the definition of ( outside of all parentheses.
-\gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested %
-\global\advance\parencount by 1 }
-%
-% This is the definition of ( when already inside a level of parens.
-\gdef\opnested{\char`\(\global\advance\parencount by 1 }
-%
-\gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0.
-% also in that case restore the outer-level definition of (.
-\ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi
-\global\advance \parencount by -1 }
-% If we encounter &foo, then turn on ()-hacking afterwards
-\gdef\amprm#1 {{\rm\&#1}\let(=\oprm \let)=\clrm\ }
-%
-\gdef\normalparens{\boldbrax\let&=\ampnr}
-} % End of definition inside \activeparens
-%% These parens (in \boldbrax) actually are a little bolder than the
-%% contained text. This is especially needed for [ and ]
-\def\opnr{{\sf\char`\(}} \def\clnr{{\sf\char`\)}} \def\ampnr{\&}
-\def\lbrb{{\bf\char`\[}} \def\rbrb{{\bf\char`\]}}
-
-% First, defname, which formats the header line itself.
-% #1 should be the function name.
-% #2 should be the type of definition, such as "Function".
-
-\def\defname #1#2{%
-% Get the values of \leftskip and \rightskip as they were
-% outside the @def...
-\dimen2=\leftskip
-\advance\dimen2 by -\defbodyindent
-\dimen3=\rightskip
-\advance\dimen3 by -\defbodyindent
-\noindent %
-\setbox0=\hbox{\hskip \deflastargmargin{\rm #2}\hskip \deftypemargin}%
-\dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line
-\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuations
-\parshape 2 0in \dimen0 \defargsindent \dimen1 %
-% Now output arg 2 ("Function" or some such)
-% ending at \deftypemargin from the right margin,
-% but stuck inside a box of width 0 so it does not interfere with linebreaking
-{% Adjust \hsize to exclude the ambient margins,
-% so that \rightline will obey them.
-\advance \hsize by -\dimen2 \advance \hsize by -\dimen3
-\rlap{\rightline{{\rm #2}\hskip \deftypemargin}}}%
-% Make all lines underfull and no complaints:
-\tolerance=10000 \hbadness=10000
-\advance\leftskip by -\defbodyindent
-\exdentamount=\defbodyindent
-{\df #1}\enskip % Generate function name
-}
-
-% Actually process the body of a definition
-% #1 should be the terminating control sequence, such as \Edefun.
-% #2 should be the "another name" control sequence, such as \defunx.
-% #3 should be the control sequence that actually processes the header,
-% such as \defunheader.
-
-\def\defparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody
-\medbreak %
-% Define the end token that this defining construct specifies
-% so that it will exit this group.
-\def#1{\endgraf\endgroup\medbreak}%
-\def#2{\begingroup\obeylines\activeparens\spacesplit#3}%
-\parindent=0in
-\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
-\exdentamount=\defbodyindent
-\begingroup %
-\catcode 61=\active % 61 is `='
-\obeylines\activeparens\spacesplit#3}
-
-\def\defmethparsebody #1#2#3#4 {\begingroup\inENV %
-\medbreak %
-% Define the end token that this defining construct specifies
-% so that it will exit this group.
-\def#1{\endgraf\endgroup\medbreak}%
-\def#2##1 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}}}%
-\parindent=0in
-\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
-\exdentamount=\defbodyindent
-\begingroup\obeylines\activeparens\spacesplit{#3{#4}}}
-
-\def\defopparsebody #1#2#3#4#5 {\begingroup\inENV %
-\medbreak %
-% Define the end token that this defining construct specifies
-% so that it will exit this group.
-\def#1{\endgraf\endgroup\medbreak}%
-\def#2##1 ##2 {\def#4{##1}%
-\begingroup\obeylines\activeparens\spacesplit{#3{##2}}}%
-\parindent=0in
-\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
-\exdentamount=\defbodyindent
-\begingroup\obeylines\activeparens\spacesplit{#3{#5}}}
-
-% These parsing functions are similar to the preceding ones
-% except that they do not make parens into active characters.
-% These are used for "variables" since they have no arguments.
-
-\def\defvarparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody
-\medbreak %
-% Define the end token that this defining construct specifies
-% so that it will exit this group.
-\def#1{\endgraf\endgroup\medbreak}%
-\def#2{\begingroup\obeylines\spacesplit#3}%
-\parindent=0in
-\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
-\exdentamount=\defbodyindent
-\begingroup %
-\catcode 61=\active %
-\obeylines\spacesplit#3}
-
-% This is used for \def{tp,vr}parsebody. It could probably be used for
-% some of the others, too, with some judicious conditionals.
-%
-\def\parsebodycommon#1#2#3{%
- \begingroup\inENV %
- \medbreak %
- % Define the end token that this defining construct specifies
- % so that it will exit this group.
- \def#1{\endgraf\endgroup\medbreak}%
- \def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}%
- \parindent=0in
- \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
- \exdentamount=\defbodyindent
- \begingroup\obeylines
-}
-
-\def\defvrparsebody#1#2#3#4 {%
- \parsebodycommon{#1}{#2}{#3}%
- \spacesplit{#3{#4}}%
-}
-
-% This loses on `@deftp {Data Type} {struct termios}' -- it thinks the
-% type is just `struct', because we lose the braces in `{struct
-% termios}' when \spacesplit reads its undelimited argument. Sigh.
-% \let\deftpparsebody=\defvrparsebody
-%
-% So, to get around this, we put \empty in with the type name. That
-% way, TeX won't find exactly `{...}' as an undelimited argument, and
-% won't strip off the braces.
-%
-\def\deftpparsebody #1#2#3#4 {%
- \parsebodycommon{#1}{#2}{#3}%
- \spacesplit{\parsetpheaderline{#3{#4}}}\empty
-}
-
-% Fine, but then we have to eventually remove the \empty *and* the
-% braces (if any). That's what this does, putting the result in \tptemp.
-%
-\def\removeemptybraces\empty#1\relax{\def\tptemp{#1}}%
-
-% After \spacesplit has done its work, this is called -- #1 is the final
-% thing to call, #2 the type name (which starts with \empty), and #3
-% (which might be empty) the arguments.
-%
-\def\parsetpheaderline#1#2#3{%
- \removeemptybraces#2\relax
- #1{\tptemp}{#3}%
-}%
-
-\def\defopvarparsebody #1#2#3#4#5 {\begingroup\inENV %
-\medbreak %
-% Define the end token that this defining construct specifies
-% so that it will exit this group.
-\def#1{\endgraf\endgroup\medbreak}%
-\def#2##1 ##2 {\def#4{##1}%
-\begingroup\obeylines\spacesplit{#3{##2}}}%
-\parindent=0in
-\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
-\exdentamount=\defbodyindent
-\begingroup\obeylines\spacesplit{#3{#5}}}
-
-% Split up #2 at the first space token.
-% call #1 with two arguments:
-% the first is all of #2 before the space token,
-% the second is all of #2 after that space token.
-% If #2 contains no space token, all of it is passed as the first arg
-% and the second is passed as empty.
-
-{\obeylines
-\gdef\spacesplit#1#2^^M{\endgroup\spacesplitfoo{#1}#2 \relax\spacesplitfoo}%
-\long\gdef\spacesplitfoo#1#2 #3#4\spacesplitfoo{%
-\ifx\relax #3%
-#1{#2}{}\else #1{#2}{#3#4}\fi}}
-
-% So much for the things common to all kinds of definitions.
-
-% Define @defun.
-
-% First, define the processing that is wanted for arguments of \defun
-% Use this to expand the args and terminate the paragraph they make up
-
-\def\defunargs #1{\functionparens \sl
-% Expand, preventing hyphenation at `-' chars.
-% Note that groups don't affect changes in \hyphenchar.
-\hyphenchar\tensl=0
-#1%
-\hyphenchar\tensl=45
-\ifnum\parencount=0 \else \errmessage{unbalanced parens in @def arguments}\fi%
-\interlinepenalty=10000
-\advance\rightskip by 0pt plus 1fil
-\endgraf\penalty 10000\vskip -\parskip\penalty 10000%
-}
-
-\def\deftypefunargs #1{%
-% Expand, preventing hyphenation at `-' chars.
-% Note that groups don't affect changes in \hyphenchar.
-\functionparens
-\tclose{#1}% avoid \code because of side effects on active chars
-\interlinepenalty=10000
-\advance\rightskip by 0pt plus 1fil
-\endgraf\penalty 10000\vskip -\parskip\penalty 10000%
-}
-
-% Do complete processing of one @defun or @defunx line already parsed.
-
-% @deffn Command forward-char nchars
-
-\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader}
-
-\def\deffnheader #1#2#3{\doind {fn}{\code{#2}}%
-\begingroup\defname {#2}{#1}\defunargs{#3}\endgroup %
-\catcode 61=\other % Turn off change made in \defparsebody
-}
-
-% @defun == @deffn Function
-
-\def\defun{\defparsebody\Edefun\defunx\defunheader}
-
-\def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
-\begingroup\defname {#1}{Function}%
-\defunargs {#2}\endgroup %
-\catcode 61=\other % Turn off change made in \defparsebody
-}
-
-% @deftypefun int foobar (int @var{foo}, float @var{bar})
-
-\def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader}
-
-% #1 is the data type. #2 is the name and args.
-\def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax}
-% #1 is the data type, #2 the name, #3 the args.
-\def\deftypefunheaderx #1#2 #3\relax{%
-\doind {fn}{\code{#2}}% Make entry in function index
-\begingroup\defname {\defheaderxcond#1\relax$$$#2}{Function}%
-\deftypefunargs {#3}\endgroup %
-\catcode 61=\other % Turn off change made in \defparsebody
-}
-
-% @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar})
-
-\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader}
-
-% \defheaderxcond#1\relax$$$
-% puts #1 in @code, followed by a space, but does nothing if #1 is null.
-\def\defheaderxcond#1#2$$${\ifx#1\relax\else\code{#1#2} \fi}
-
-% #1 is the classification. #2 is the data type. #3 is the name and args.
-\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax}
-% #1 is the classification, #2 the data type, #3 the name, #4 the args.
-\def\deftypefnheaderx #1#2#3 #4\relax{%
-\doind {fn}{\code{#3}}% Make entry in function index
-\begingroup
-\normalparens % notably, turn off `&' magic, which prevents
-% at least some C++ text from working
-\defname {\defheaderxcond#2\relax$$$#3}{#1}%
-\deftypefunargs {#4}\endgroup %
-\catcode 61=\other % Turn off change made in \defparsebody
-}
-
-% @defmac == @deffn Macro
-
-\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader}
-
-\def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
-\begingroup\defname {#1}{Macro}%
-\defunargs {#2}\endgroup %
-\catcode 61=\other % Turn off change made in \defparsebody
-}
-
-% @defspec == @deffn Special Form
-
-\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader}
-
-\def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
-\begingroup\defname {#1}{Special Form}%
-\defunargs {#2}\endgroup %
-\catcode 61=\other % Turn off change made in \defparsebody
-}
-
-% This definition is run if you use @defunx
-% anywhere other than immediately after a @defun or @defunx.
-
-\def\deffnx #1 {\errmessage{@deffnx in invalid context}}
-\def\defunx #1 {\errmessage{@defunx in invalid context}}
-\def\defmacx #1 {\errmessage{@defmacx in invalid context}}
-\def\defspecx #1 {\errmessage{@defspecx in invalid context}}
-\def\deftypefnx #1 {\errmessage{@deftypefnx in invalid context}}
-\def\deftypeunx #1 {\errmessage{@deftypeunx in invalid context}}
-
-% @defmethod, and so on
-
-% @defop {Funny Method} foo-class frobnicate argument
-
-\def\defop #1 {\def\defoptype{#1}%
-\defopparsebody\Edefop\defopx\defopheader\defoptype}
-
-\def\defopheader #1#2#3{%
-\dosubind {fn}{\code{#2}}{on #1}% Make entry in function index
-\begingroup\defname {#2}{\defoptype{} on #1}%
-\defunargs {#3}\endgroup %
-}
-
-% @defmethod == @defop Method
-
-\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader}
-
-\def\defmethodheader #1#2#3{%
-\dosubind {fn}{\code{#2}}{on #1}% entry in function index
-\begingroup\defname {#2}{Method on #1}%
-\defunargs {#3}\endgroup %
-}
-
-% @defcv {Class Option} foo-class foo-flag
-
-\def\defcv #1 {\def\defcvtype{#1}%
-\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}
-
-\def\defcvarheader #1#2#3{%
-\dosubind {vr}{\code{#2}}{of #1}% Make entry in var index
-\begingroup\defname {#2}{\defcvtype{} of #1}%
-\defvarargs {#3}\endgroup %
-}
-
-% @defivar == @defcv {Instance Variable}
-
-\def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader}
-
-\def\defivarheader #1#2#3{%
-\dosubind {vr}{\code{#2}}{of #1}% Make entry in var index
-\begingroup\defname {#2}{Instance Variable of #1}%
-\defvarargs {#3}\endgroup %
-}
-
-% These definitions are run if you use @defmethodx, etc.,
-% anywhere other than immediately after a @defmethod, etc.
-
-\def\defopx #1 {\errmessage{@defopx in invalid context}}
-\def\defmethodx #1 {\errmessage{@defmethodx in invalid context}}
-\def\defcvx #1 {\errmessage{@defcvx in invalid context}}
-\def\defivarx #1 {\errmessage{@defivarx in invalid context}}
-
-% Now @defvar
-
-% First, define the processing that is wanted for arguments of @defvar.
-% This is actually simple: just print them in roman.
-% This must expand the args and terminate the paragraph they make up
-\def\defvarargs #1{\normalparens #1%
-\interlinepenalty=10000
-\endgraf\penalty 10000\vskip -\parskip\penalty 10000}
-
-% @defvr Counter foo-count
-
-\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader}
-
-\def\defvrheader #1#2#3{\doind {vr}{\code{#2}}%
-\begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup}
-
-% @defvar == @defvr Variable
-
-\def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader}
-
-\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
-\begingroup\defname {#1}{Variable}%
-\defvarargs {#2}\endgroup %
-}
-
-% @defopt == @defvr {User Option}
-
-\def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader}
-
-\def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
-\begingroup\defname {#1}{User Option}%
-\defvarargs {#2}\endgroup %
-}
-
-% @deftypevar int foobar
-
-\def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader}
-
-% #1 is the data type. #2 is the name.
-\def\deftypevarheader #1#2{%
-\doind {vr}{\code{#2}}% Make entry in variables index
-\begingroup\defname {\defheaderxcond#1\relax$$$#2}{Variable}%
-\interlinepenalty=10000
-\endgraf\penalty 10000\vskip -\parskip\penalty 10000
-\endgroup}
-
-% @deftypevr {Global Flag} int enable
-
-\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader}
-
-\def\deftypevrheader #1#2#3{\doind {vr}{\code{#3}}%
-\begingroup\defname {\defheaderxcond#2\relax$$$#3}{#1}
-\interlinepenalty=10000
-\endgraf\penalty 10000\vskip -\parskip\penalty 10000
-\endgroup}
-
-% This definition is run if you use @defvarx
-% anywhere other than immediately after a @defvar or @defvarx.
-
-\def\defvrx #1 {\errmessage{@defvrx in invalid context}}
-\def\defvarx #1 {\errmessage{@defvarx in invalid context}}
-\def\defoptx #1 {\errmessage{@defoptx in invalid context}}
-\def\deftypevarx #1 {\errmessage{@deftypevarx in invalid context}}
-\def\deftypevrx #1 {\errmessage{@deftypevrx in invalid context}}
-
-% Now define @deftp
-% Args are printed in bold, a slight difference from @defvar.
-
-\def\deftpargs #1{\bf \defvarargs{#1}}
-
-% @deftp Class window height width ...
-
-\def\deftp{\deftpparsebody\Edeftp\deftpx\deftpheader}
-
-\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}%
-\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup}
-
-% This definition is run if you use @deftpx, etc
-% anywhere other than immediately after a @deftp, etc.
-
-\def\deftpx #1 {\errmessage{@deftpx in invalid context}}
-
-\message{cross reference,}
-% Define cross-reference macros
-\newwrite \auxfile
-
-\newif\ifhavexrefs % True if xref values are known.
-\newif\ifwarnedxrefs % True if we warned once that they aren't known.
-
-% \setref{foo} defines a cross-reference point named foo.
-
-\def\setref#1{%
-\dosetq{#1-title}{Ytitle}%
-\dosetq{#1-pg}{Ypagenumber}%
-\dosetq{#1-snt}{Ysectionnumberandtype}}
-
-\def\unnumbsetref#1{%
-\dosetq{#1-title}{Ytitle}%
-\dosetq{#1-pg}{Ypagenumber}%
-\dosetq{#1-snt}{Ynothing}}
-
-\def\appendixsetref#1{%
-\dosetq{#1-title}{Ytitle}%
-\dosetq{#1-pg}{Ypagenumber}%
-\dosetq{#1-snt}{Yappendixletterandtype}}
-
-% \xref, \pxref, and \ref generate cross-references to specified points.
-% For \xrefX, #1 is the node name, #2 the name of the Info
-% cross-reference, #3 the printed node name, #4 the name of the Info
-% file, #5 the name of the printed manual. All but the node name can be
-% omitted.
-%
-\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
-\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
-\def\ref#1{\xrefX[#1,,,,,,,]}
-\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
- \def\printedmanual{\ignorespaces #5}%
- \def\printednodename{\ignorespaces #3}%
- \setbox1=\hbox{\printedmanual}%
- \setbox0=\hbox{\printednodename}%
- \ifdim \wd0 = 0pt
- % No printed node name was explicitly given.
- \ifx\SETxref-automatic-section-title\relax %
- % Use the actual chapter/section title appear inside
- % the square brackets. Use the real section title if we have it.
- \ifdim \wd1>0pt%
- % It is in another manual, so we don't have it.
- \def\printednodename{\ignorespaces #1}%
- \else
- \ifhavexrefs
- % We know the real title if we have the xref values.
- \def\printednodename{\refx{#1-title}}%
- \else
- % Otherwise just copy the Info node name.
- \def\printednodename{\ignorespaces #1}%
- \fi%
- \fi
- \def\printednodename{#1-title}%
- \else
- % Use the node name inside the square brackets.
- \def\printednodename{\ignorespaces #1}%
- \fi
- \fi
- %
- % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
- % insert empty discretionaries after hyphens, which means that it will
- % not find a line break at a hyphen in a node names. Since some manuals
- % are best written with fairly long node names, containing hyphens, this
- % is a loss. Therefore, we give the text of the node name again, so it
- % is as if TeX is seeing it for the first time.
- \ifdim \wd1 > 0pt
- \putwordsection{} ``\printednodename'' in \cite{\printedmanual}%
- \else
- % _ (for example) has to be the character _ for the purposes of the
- % control sequence corresponding to the node, but it has to expand
- % into the usual \leavevmode...\vrule stuff for purposes of
- % printing. So we \turnoffactive for the \refx-snt, back on for the
- % printing, back off for the \refx-pg.
- {\turnoffactive \refx{#1-snt}{}}%
- \space [\printednodename],\space
- \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
- \fi
-\endgroup}
-
-% \dosetq is the interface for calls from other macros
-
-% Use \turnoffactive so that punctuation chars such as underscore
-% work in node names.
-\def\dosetq #1#2{{\let\folio=0 \turnoffactive \auxhat%
-\edef\next{\write\auxfile{\internalsetq {#1}{#2}}}%
-\next}}
-
-% \internalsetq {foo}{page} expands into
-% CHARACTERS 'xrdef {foo}{...expansion of \Ypage...}
-% When the aux file is read, ' is the escape character
-
-\def\internalsetq #1#2{'xrdef {#1}{\csname #2\endcsname}}
-
-% Things to be expanded by \internalsetq
-
-\def\Ypagenumber{\folio}
-
-\def\Ytitle{\thissection}
-
-\def\Ynothing{}
-
-\def\Ysectionnumberandtype{%
-\ifnum\secno=0 \putwordChapter\xreftie\the\chapno %
-\else \ifnum \subsecno=0 \putwordSection\xreftie\the\chapno.\the\secno %
-\else \ifnum \subsubsecno=0 %
-\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno %
-\else %
-\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno %
-\fi \fi \fi }
-
-\def\Yappendixletterandtype{%
-\ifnum\secno=0 \putwordAppendix\xreftie'char\the\appendixno{}%
-\else \ifnum \subsecno=0 \putwordSection\xreftie'char\the\appendixno.\the\secno %
-\else \ifnum \subsubsecno=0 %
-\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno %
-\else %
-\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
-\fi \fi \fi }
-
-\gdef\xreftie{'tie}
-
-% Use TeX 3.0's \inputlineno to get the line number, for better error
-% messages, but if we're using an old version of TeX, don't do anything.
-%
-\ifx\inputlineno\thisisundefined
- \let\linenumber = \empty % Non-3.0.
-\else
- \def\linenumber{\the\inputlineno:\space}
-\fi
-
-% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
-% If its value is nonempty, SUFFIX is output afterward.
-
-\def\refx#1#2{%
- \expandafter\ifx\csname X#1\endcsname\relax
- % If not defined, say something at least.
- $\langle$un\-de\-fined$\rangle$%
- \ifhavexrefs
- \message{\linenumber Undefined cross reference `#1'.}%
- \else
- \ifwarnedxrefs\else
- \global\warnedxrefstrue
- \message{Cross reference values unknown; you must run TeX again.}%
- \fi
- \fi
- \else
- % It's defined, so just use it.
- \csname X#1\endcsname
- \fi
- #2% Output the suffix in any case.
-}
-
-% Read the last existing aux file, if any. No error if none exists.
-
-% This is the macro invoked by entries in the aux file.
-\def\xrdef #1#2{
-{\catcode`\'=\other\expandafter \gdef \csname X#1\endcsname {#2}}}
-
-\def\readauxfile{%
-\begingroup
-\catcode `\^^@=\other
-\catcode `\=\other
-\catcode `\=\other
-\catcode `\^^C=\other
-\catcode `\^^D=\other
-\catcode `\^^E=\other
-\catcode `\^^F=\other
-\catcode `\^^G=\other
-\catcode `\^^H=\other
-\catcode `\ =\other
-\catcode `\^^L=\other
-\catcode `\=\other
-\catcode `\=\other
-\catcode `\=\other
-\catcode `\=\other
-\catcode `\=\other
-\catcode `\=\other
-\catcode `\=\other
-\catcode `\=\other
-\catcode `\=\other
-\catcode `\=\other
-\catcode `\=\other
-\catcode `\=\other
-\catcode 26=\other
-\catcode `\^^[=\other
-\catcode `\^^\=\other
-\catcode `\^^]=\other
-\catcode `\^^^=\other
-\catcode `\^^_=\other
-\catcode `\@=\other
-\catcode `\^=\other
-\catcode `\~=\other
-\catcode `\[=\other
-\catcode `\]=\other
-\catcode`\"=\other
-\catcode`\_=\other
-\catcode`\|=\other
-\catcode`\<=\other
-\catcode`\>=\other
-\catcode `\$=\other
-\catcode `\#=\other
-\catcode `\&=\other
-% `\+ does not work, so use 43.
-\catcode 43=\other
-% Make the characters 128-255 be printing characters
-{%
- \count 1=128
- \def\loop{%
- \catcode\count 1=\other
- \advance\count 1 by 1
- \ifnum \count 1<256 \loop \fi
- }%
-}%
-% the aux file uses ' as the escape.
-% Turn off \ as an escape so we do not lose on
-% entries which were dumped with control sequences in their names.
-% For example, 'xrdef {$\leq $-fun}{page ...} made by @defun ^^
-% Reference to such entries still does not work the way one would wish,
-% but at least they do not bomb out when the aux file is read in.
-\catcode `\{=1 \catcode `\}=2
-\catcode `\%=\other
-\catcode `\'=0
-\catcode`\^=7 % to make ^^e4 etc usable in xref tags
-\catcode `\\=\other
-\openin 1 \jobname.aux
-\ifeof 1 \else \closein 1 \input \jobname.aux \global\havexrefstrue
-\global\warnedobstrue
-\fi
-% Open the new aux file. Tex will close it automatically at exit.
-\openout \auxfile=\jobname.aux
-\endgroup}
-
-
-% Footnotes.
-
-\newcount \footnoteno
-
-% The trailing space in the following definition for supereject is
-% vital for proper filling; pages come out unaligned when you do a
-% pagealignmacro call if that space before the closing brace is
-% removed.
-\def\supereject{\par\penalty -20000\footnoteno =0 }
-
-% @footnotestyle is meaningful for info output only..
-\let\footnotestyle=\comment
-
-\let\ptexfootnote=\footnote
-
-{\catcode `\@=11
-%
-% Auto-number footnotes. Otherwise like plain.
-\gdef\footnote{%
- \global\advance\footnoteno by \@ne
- \edef\thisfootno{$^{\the\footnoteno}$}%
- %
- % In case the footnote comes at the end of a sentence, preserve the
- % extra spacing after we do the footnote number.
- \let\@sf\empty
- \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi
- %
- % Remove inadvertent blank space before typesetting the footnote number.
- \unskip
- \thisfootno\@sf
- \footnotezzz
-}%
-
-% Don't bother with the trickery in plain.tex to not require the
-% footnote text as a parameter. Our footnotes don't need to be so general.
-%
-\long\gdef\footnotezzz#1{\insert\footins{%
- % We want to typeset this text as a normal paragraph, even if the
- % footnote reference occurs in (for example) a display environment.
- % So reset some parameters.
- \interlinepenalty\interfootnotelinepenalty
- \splittopskip\ht\strutbox % top baseline for broken footnotes
- \splitmaxdepth\dp\strutbox
- \floatingpenalty\@MM
- \leftskip\z@skip
- \rightskip\z@skip
- \spaceskip\z@skip
- \xspaceskip\z@skip
- \parindent\defaultparindent
- %
- % Hang the footnote text off the number.
- \hang
- \textindent{\thisfootno}%
- %
- % Don't crash into the line above the footnote text. Since this
- % expands into a box, it must come within the paragraph, lest it
- % provide a place where TeX can split the footnote.
- \footstrut
- #1\strut}%
-}
-
-}%end \catcode `\@=11
-
-% Set the baselineskip to #1, and the lineskip and strut size
-% correspondingly. There is no deep meaning behind these magic numbers
-% used as factors; they just match (closely enough) what Knuth defined.
-%
-\def\lineskipfactor{.08333}
-\def\strutheightpercent{.70833}
-\def\strutdepthpercent {.29167}
-%
-\def\setleading#1{%
- \normalbaselineskip = #1\relax
- \normallineskip = \lineskipfactor\normalbaselineskip
- \normalbaselines
- \setbox\strutbox =\hbox{%
- \vrule width0pt height\strutheightpercent\baselineskip
- depth \strutdepthpercent \baselineskip
- }%
-}
-
-% @| inserts a changebar to the left of the current line. It should
-% surround any changed text. This approach does *not* work if the
-% change spans more than two lines of output. To handle that, we would
-% have adopt a much more difficult approach (putting marks into the main
-% vertical list for the beginning and end of each change).
-%
-\def\|{%
- % \vadjust can only be used in horizontal mode.
- \leavevmode
- %
- % Append this vertical mode material after the current line in the output.
- \vadjust{%
- % We want to insert a rule with the height and depth of the current
- % leading; that is exactly what \strutbox is supposed to record.
- \vskip-\baselineskip
- %
- % \vadjust-items are inserted at the left edge of the type. So
- % the \llap here moves out into the left-hand margin.
- \llap{%
- %
- % For a thicker or thinner bar, change the `1pt'.
- \vrule height\baselineskip width1pt
- %
- % This is the space between the bar and the text.
- \hskip 12pt
- }%
- }%
-}
-
-% For a final copy, take out the rectangles
-% that mark overfull boxes (in case you have decided
-% that the text looks ok even though it passes the margin).
-%
-\def\finalout{\overfullrule=0pt}
-
-
-% End of control word definitions.
-
-\message{and turning on texinfo input format.}
-
-\def\openindices{%
- \newindex{cp}%
- \newcodeindex{fn}%
- \newcodeindex{vr}%
- \newcodeindex{tp}%
- \newcodeindex{ky}%
- \newcodeindex{pg}%
-}
-
-% Set some numeric style parameters, for 8.5 x 11 format.
-
-%\hsize = 6.5in
-\newdimen\defaultparindent \defaultparindent = 15pt
-\parindent = \defaultparindent
-\parskip 18pt plus 1pt
-\setleading{15pt}
-\advance\topskip by 1.2cm
-
-% Prevent underfull vbox error messages.
-\vbadness=10000
-
-% Following George Bush, just get rid of widows and orphans.
-\widowpenalty=10000
-\clubpenalty=10000
-
-% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
-% using an old version of TeX, don't do anything. We want the amount of
-% stretch added to depend on the line length, hence the dependence on
-% \hsize. This makes it come to about 9pt for the 8.5x11 format.
-%
-\ifx\emergencystretch\thisisundefined
- % Allow us to assign to \emergencystretch anyway.
- \def\emergencystretch{\dimen0}%
-\else
- \emergencystretch = \hsize
- \divide\emergencystretch by 45
-\fi
-
-% Use @smallbook to reset parameters for 7x9.5 format (or else 7x9.25)
-\def\smallbook{
-
-% These values for secheadingskip and subsecheadingskip are
-% experiments. RJC 7 Aug 1992
-\global\secheadingskip = 17pt plus 6pt minus 3pt
-\global\subsecheadingskip = 14pt plus 6pt minus 3pt
-
-\global\lispnarrowing = 0.3in
-\setleading{12pt}
-\advance\topskip by -1cm
-\global\parskip 3pt plus 1pt
-\global\hsize = 5in
-\global\vsize=7.5in
-\global\tolerance=700
-\global\hfuzz=1pt
-\global\contentsrightmargin=0pt
-\global\deftypemargin=0pt
-\global\defbodyindent=.5cm
-
-\global\pagewidth=\hsize
-\global\pageheight=\vsize
-
-\global\let\smalllisp=\smalllispx
-\global\let\smallexample=\smalllispx
-\global\def\Esmallexample{\Esmalllisp}
-}
-
-% Use @afourpaper to print on European A4 paper.
-\def\afourpaper{
-\global\tolerance=700
-\global\hfuzz=1pt
-\setleading{12pt}
-\global\parskip 15pt plus 1pt
-
-\global\vsize= 53\baselineskip
-\advance\vsize by \topskip
-%\global\hsize= 5.85in % A4 wide 10pt
-\global\hsize= 6.5in
-\global\outerhsize=\hsize
-\global\advance\outerhsize by 0.5in
-\global\outervsize=\vsize
-\global\advance\outervsize by 0.6in
-
-\global\pagewidth=\hsize
-\global\pageheight=\vsize
-}
-
-% Allow control of the text dimensions. Parameters in order: textheight;
-% textwidth; \voffset; \hoffset (!); binding offset. All require a dimension;
-% header is additional; added length extends the bottom of the page.
-
-\def\changepagesizes#1#2#3#4#5{
- \global\vsize= #1
- \advance\vsize by \topskip
- \global\voffset= #3
- \global\hsize= #2
- \global\outerhsize=\hsize
- \global\advance\outerhsize by 0.5in
- \global\outervsize=\vsize
- \global\advance\outervsize by 0.6in
- \global\pagewidth=\hsize
- \global\pageheight=\vsize
- \global\normaloffset= #4
- \global\bindingoffset= #5}
-
-% This layout is compatible with Latex on A4 paper.
-
-\def\afourlatex{\changepagesizes{22cm}{15cm}{7mm}{4.6mm}{5mm}}
-
-% Define macros to output various characters with catcode for normal text.
-\catcode`\"=\other
-\catcode`\~=\other
-\catcode`\^=\other
-\catcode`\_=\other
-\catcode`\|=\other
-\catcode`\<=\other
-\catcode`\>=\other
-\catcode`\+=\other
-\def\normaldoublequote{"}
-\def\normaltilde{~}
-\def\normalcaret{^}
-\def\normalunderscore{_}
-\def\normalverticalbar{|}
-\def\normalless{<}
-\def\normalgreater{>}
-\def\normalplus{+}
-
-% This macro is used to make a character print one way in ttfont
-% where it can probably just be output, and another way in other fonts,
-% where something hairier probably needs to be done.
-%
-% #1 is what to print if we are indeed using \tt; #2 is what to print
-% otherwise. Since all the Computer Modern typewriter fonts have zero
-% interword stretch (and shrink), and it is reasonable to expect all
-% typewriter fonts to have this, we can check that font parameter.
-%
-\def\ifusingtt#1#2{\ifdim \fontdimen3\the\font=0pt #1\else #2\fi}
-
-% Turn off all special characters except @
-% (and those which the user can use as if they were ordinary).
-% Most of these we simply print from the \tt font, but for some, we can
-% use math or other variants that look better in normal text.
-
-\catcode`\"=\active
-\def\activedoublequote{{\tt \char '042}}
-\let"=\activedoublequote
-\catcode`\~=\active
-\def~{{\tt \char '176}}
-\chardef\hat=`\^
-\catcode`\^=\active
-\def\auxhat{\def^{'hat}}
-\def^{{\tt \hat}}
-
-\catcode`\_=\active
-\def_{\ifusingtt\normalunderscore\_}
-% Subroutine for the previous macro.
-\def\_{\lvvmode \kern.06em \vbox{\hrule width.3em height.1ex}}
-
-% \lvvmode is equivalent in function to \leavevmode.
-% Using \leavevmode runs into trouble when written out to
-% an index file due to the expansion of \leavevmode into ``\unhbox
-% \voidb@x'' ---which looks to TeX like ``\unhbox \voidb\x'' due to our
-% magic tricks with @.
-\def\lvvmode{\vbox to 0pt{}}
-
-\catcode`\|=\active
-\def|{{\tt \char '174}}
-\chardef \less=`\<
-\catcode`\<=\active
-\def<{{\tt \less}}
-\chardef \gtr=`\>
-\catcode`\>=\active
-\def>{{\tt \gtr}}
-\catcode`\+=\active
-\def+{{\tt \char 43}}
-%\catcode 27=\active
-%\def^^[{$\diamondsuit$}
-
-% Set up an active definition for =, but don't enable it most of the time.
-{\catcode`\==\active
-\global\def={{\tt \char 61}}}
-
-\catcode`\@=0
-
-% \rawbackslashxx output one backslash character in current font
-\global\chardef\rawbackslashxx=`\\
-%{\catcode`\\=\other
-%@gdef@rawbackslashxx{\}}
-
-% \rawbackslash redefines \ as input to do \rawbackslashxx.
-{\catcode`\\=\active
-@gdef@rawbackslash{@let\=@rawbackslashxx }}
-
-% \normalbackslash outputs one backslash in fixed width font.
-\def\normalbackslash{{\tt\rawbackslashxx}}
-
-% Say @foo, not \foo, in error messages.
-\escapechar=`\@
-
-% \catcode 17=0 % Define control-q
-\catcode`\\=\active
-
-% Used sometimes to turn off (effectively) the active characters
-% even after parsing them.
-@def@turnoffactive{@let"=@normaldoublequote
-@let\=@realbackslash
-@let~=@normaltilde
-@let^=@normalcaret
-@let_=@normalunderscore
-@let|=@normalverticalbar
-@let<=@normalless
-@let>=@normalgreater
-@let+=@normalplus}
-
-@def@normalturnoffactive{@let"=@normaldoublequote
-@let\=@normalbackslash
-@let~=@normaltilde
-@let^=@normalcaret
-@let_=@normalunderscore
-@let|=@normalverticalbar
-@let<=@normalless
-@let>=@normalgreater
-@let+=@normalplus}
-
-% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
-% That is what \eatinput is for; after that, the `\' should revert to printing
-% a backslash.
-%
-@gdef@eatinput input texinfo{@fixbackslash}
-@global@let\ = @eatinput
-
-% On the other hand, perhaps the file did not have a `\input texinfo'. Then
-% the first `\{ in the file would cause an error. This macro tries to fix
-% that, assuming it is called before the first `\' could plausibly occur.
-%
-@gdef@fixbackslash{@ifx\@eatinput @let\ = @normalbackslash @fi}
-
-%% These look ok in all fonts, so just make them not special. The @rm below
-%% makes sure that the current font starts out as the newly loaded cmr10
-@catcode`@$=@other @catcode`@%=@other @catcode`@&=@other @catcode`@#=@other
-
-@textfonts
-@rm
-
-@c Local variables:
-@c page-delimiter: "^\\\\message"
-@c End: