public inbox for gnats-devel@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] Removing gnats/man and config/*
@ 2005-02-23  5:39 Chad Walstrom
  2005-02-24 11:17 ` Mike M. Volokhov
  0 siblings, 1 reply; 4+ messages in thread
From: Chad Walstrom @ 2005-02-23  5:39 UTC (permalink / raw)
  To: help-gnats


[-- Attachment #1.1.1: Type: text/plain, Size: 537 bytes --]

OK.  Because I did say I wouldn't be the benevolent dictator and play by
the same rules as everyone else... ;-)  This patch will remove gnats/man
directory and contents, config/ contents, renames configure.in to
configure.ac, moves missing and install-sh to config/, and updates
texinfo.tex. ;-)

Next, time to test Mike's patch.  If I hear no objections, I'll commit
the patch later tomorrow.

-- 
Chad Walstrom <chewie@wookimus.net>           http://www.wookimus.net/
           assert(expired(knowledge)); /* core dump */

[-- Attachment #1.1.2: config-man-cleanup.diff --]
[-- Type: text/plain, Size: 567400 bytes --]

diff -x CVS -uNr gnats/ChangeLog gnats.new/ChangeLog
--- gnats/ChangeLog	2004-11-17 22:22:49.000000000 -0600
+++ gnats.new/ChangeLog	2005-02-22 22:02:10.000000000 -0600
@@ -1,3 +1,12 @@
+2005-02-22  Chad Walstrom  <chewie@wookimus.net>
+
+	* config/*: Makefile fragments removed, unnecessary with autoconf.
+
+	* configure.in -> configure.ac, configure: Moved. Regenerated
+	configure.
+
+	* texinfo/texinfo.tex: Updated
+
 2004-11-17  Chad Walstrom  <chewie@wookimus.net>
 
 	* libiberty/*, include/*: Updated from GCC 3.4.2 release.
diff -x CVS -uNr gnats/config/ChangeLog gnats.new/config/ChangeLog
--- gnats/config/ChangeLog	1999-10-26 02:10:16.000000000 -0500
+++ gnats.new/config/ChangeLog	1969-12-31 18:00:00.000000000 -0600
@@ -1,382 +0,0 @@
-Sun Oct 24 23:54:10 PDT 1999 Jeff Law  (law@cygnus.com)
-
-	* gcc-2.95.2 Released.
-
-Mon Aug 16 01:29:24 PDT 1999 Jeff Law  (law@cygnus.com)
-
-	* gcc-2.95.1 Released.
-
-Wed Jul 28 21:39:31 PDT 1999 Jeff Law  (law@cygnus.com)
-
-	* gcc-2.95 Released.
-
-Sun Jul 25 23:40:51 PDT 1999 Jeff Law  (law@cygnus.com)
-
-	* gcc-2.95 Released.
-
-Tue Feb  2 22:51:21 1999 Philip Blundell  <philb@gnu.org>
-
-	* mh-armpic: New file.  Patch from Jim Pick <jim@jimpick.com>.
-	* mt-armpic: Likewise.
-
-Mon Jan 18 19:41:08 1999  Christopher Faylor <cgf@cygnus.com>
-
-	* cygwin.mh: Activate commented out dependencies for
-	gdb: libtermcap.
-
-Wed Nov 18 20:29:46 1998  Christopher Faylor <cgf@cygnus.com>
-
-	* cygwin.mh: Add extra libtermcap target information.
-	Add commented out dependency for gdb to libtermcap for
-	future readline requirement.
-
-Mon Nov  2 15:15:33 1998  Geoffrey Noer  <noer@cygnus.com>
-
-        * mh-cygwin32: delete
-        * mh-cygwin: was mh-cygwin32
-
-Mon Aug 31 17:50:53 1998  David Edelsohn  <edelsohn@mhpcc.edu>
-
-	* mh-aix43 (NM_FOR_TARGET): Add -X32_64 as well.
-
-Sat Aug 29 14:32:55 1998  David Edelsohn  <edelsohn@mhpcc.edu>
-
-	* mh-aix43: New file.
-
-Mon Aug 10 00:15:47 1998  HJ Lu (hjl@gnu.org)
-
-	* mt-linux (CXXFLAGS_FOR_TARGET): Add -D_GNU_SOURCE.
-
-Wed Apr 22 12:24:28 1998  Michael Meissner  <meissner@cygnus.com>
-
-	* mt-ospace: New file, support using -Os instead of -O2 to compile
-	the libraries.
-
-Wed Apr 22 10:53:14 1998  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
-
-	* mt-linux (CXXFLAGS_FOR_TARGET): Set this instead of CXXFLAGS.
-
-Sat Apr 11 22:43:17 1998  J. Kean Johnston  <jkj@sco.com>
-
-	* mh-svsv5: New file - support for SCO UnixWare 7 / SVR5.
-
-Thu Mar 26 01:54:25 1998  Geoffrey Noer  <noer@cygnus.com>
-
-	* mh-cygwin32: stop configuring and building dosrel.
-
-Thu Sep 11 16:43:27 1997  Jim Wilson  <wilson@cygnus.com>
-
-	* mh-elfalphapic, mt-elfalphapic: New files.
-
-Wed Jul 23 12:32:18 1997  Robert Hoehne <robert.hoehne@Mathematik.TU-Chemnitz.DE>
-
-	* mh-go32 (CFLAGS): Don't set -fno-omit-frame-pointer.
-
-Mon Jun 16 19:06:41 1997  Geoff Keating  <geoffk@ozemail.com.au>
-
-	* mh-ppcpic: New file.
-	* mt-ppcpic: New file.
-
-Thu Mar 27 15:52:40 1997  Geoffrey Noer  <noer@cygnus.com>
-
-	* mh-cygwin32: override CXXFLAGS, setting to -O2 only
-	(no debug)
-
-Tue Mar 25 18:16:43 1997  Geoffrey Noer  <noer@cygnus.com>
-
-	* mh-cygwin32: override LIBGCC2_DEBUG_CFLAGS so debug info
-	isn't included in cygwin32-hosted libgcc2.a by default
-
-Wed Jan  8 19:56:43 1997  Geoffrey Noer  <noer@cygnus.com>
-
-        * mh-cygwin32: override CFLAGS so debug info isn't included
-        in cygwin32-hosted tools by default
-
-Tue Dec 31 16:04:26 1996  Ian Lance Taylor  <ian@cygnus.com>
-
-	* mh-linux: Remove.
-
-Mon Nov 11 10:29:51 1996  Michael Meissner  <meissner@tiktok.cygnus.com>
-
-	* mt-ppc: Delete file, options moved to newlib configure.
-
-Fri Oct  4 12:21:03 1996  Angela Marie Thomas (angela@cygnus.com)
-
-	* mh-dgux386: New file.  x86 dgux specific flags
-
-Mon Sep 30 15:10:07 1996  Stan Shebs  <shebs@andros.cygnus.com>
-
-	* mpw-mh-mpw (EXTRALIBS_PPC_XCOFF): New, was EXTRALIBS_PPC.
-	(EXTRALIBS_PPC): Use shared libraries instead of xcoff.
-
-Sat Aug 17 04:56:25 1996  Geoffrey Noer  <noer@skaro.cygnus.com>
-
-	* mh-cygwin32: don't -D_WIN32 here anymore
-
-Thu Aug 15 19:46:44 1996  Stan Shebs  <shebs@andros.cygnus.com>
-
-	* mpw-mh-mpw (SEGFLAG_68K, SEGFLAG_PPC): Remove.
-	(EXTRALIBS_PPC): Add libgcc.xcoff.
-
-Thu Aug  8 14:51:47 1996  Michael Meissner  <meissner@tiktok.cygnus.com>
-
-	* mt-ppc: New file, add -mrelocatable-lib and -mno-eabi to all
-	target builds for PowerPC eabi targets.
-
-Fri Jul 12 12:06:01 1996  Stan Shebs  <shebs@andros.cygnus.com>
-
-	* mpw: New subdir, Mac MPW configuration support bits.
-
-Mon Jul  8 17:30:52 1996  Jim Wilson  <wilson@cygnus.com>
-
-	* mh-irix6: New file.
-
-Mon Jul  8 15:15:37 1996  Jason Merrill  <jason@yorick.cygnus.com>
-
-	* mt-sparcpic (PICFLAG_FOR_TARGET): Use -fPIC.
-
-Fri Jul  5 11:49:02 1996  Ian Lance Taylor  <ian@cygnus.com>
-
-	* mh-irix4 (RANLIB): Don't define; Irix 4 does have ranlib.
-
-Sun Jun 23 22:59:25 1996  Geoffrey Noer  <noer@cygnus.com>
-
-	* mh-cygwin32: new file.  Like mh-go32 without the CFLAGS entry.
-
-Tue Mar 26 14:10:41 1996  Ian Lance Taylor  <ian@cygnus.com>
-
-	* mh-go32 (CFLAGS): Define.
-
-Thu Mar 14 19:20:54 1996  Ian Lance Taylor  <ian@cygnus.com>
-
-	* mh-necv4: New file.
-
-Thu Feb 15 13:07:43 1996  Ian Lance Taylor  <ian@cygnus.com>
-
-	* mh-cxux (CC): New variable.
-	(CFLAGS, LDFLAGS): Remove.
-	* mh-ncrsvr43 (CC): New variable.
-	(CFLAGS): Remove.
-	* mh-solaris (CFLAGS): Remove.
-
-	* mh-go32: Remove most variable settings, since they presumed a
-	Canadian Cross, which is now handled correctly by the configure
-	script.
-
-	* mh-sparcpic (PICFLAG): Set to -fPIC, not -fpic.
-
-Mon Feb 12 14:53:39 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
-
-	* mh-m68kpic, mt-m68kpic: New files.
-
-Thu Feb  1 14:15:42 1996  Stan Shebs  <shebs@andros.cygnus.com>
-
-	* mpw-mh-mpw (CC_MWC68K): Add options similar to those used
-	in CC_MWCPPC, and -mc68020 -model far.
-	(AR_MWLINK68K): Add -xm library.
-	(AR_AR): Define.
-	(CC_LD_MWLINK68K): Remove -d.
-	(EXTRALIBS_MWC68K): Define.
-
-Thu Jan 25 16:05:33 1996  Ian Lance Taylor  <ian@cygnus.com>
-
-	* mh-ncrsvr43 (CFLAGS): Remove -Hnocopyr.
-
-Tue Nov  7 15:41:30 1995  Stan Shebs  <shebs@andros.cygnus.com>
-
-	* mpw-mh-mpw (CC_MWC68K, CC_MWCPPC): Remove unused include path.
-	(CC_MWCPPC): Add -mpw_chars, disable warnings, add comments
-	explaining reasons for various flags.
-	(EXTRALIBS_PPC, EXTRALIBS_MWCPPC ): Put runtime library first.
-	
-Fri Oct 13 14:44:25 1995  Jason Molenda  (crash@phydeaux.cygnus.com)
-
-	* mh-aix, mh-sun:  Removed.
-
-	* mh-decstation (X11_EXTRA_CFLAGS): Define.
-
-	* mh-sco, mh-solaris, mh-sysv4 (X11_EXTRA_LIBS): Define.
-
-        * mh-hp300, mh-hpux, mh-hpux8, mh-solaris, mh-sun3, mh-sysv4: Don't 
-	hardcode location of X stuff here.
-
-Thu Sep 28 13:14:56 1995  Stan Shebs  <shebs@andros.cygnus.com>
-
-	* mpw-mh-mpw: Add definitions for various 68K and PowerMac
-	compilers, add definitions for library and link steps for
-	PowerMacs.
-
-Thu Sep 14 08:20:04 1995  Fred Fish  <fnf@cygnus.com>
-
-	* mh-hp300 (CC): Add "CC = cc -Wp,-H256000" to avoid
-	"too much defining" errors from the HPUX compiler.
-
-Thu Aug 17 17:28:56 1995  Ken Raeburn  <raeburn@kr-laptop.cygnus.com>
-
-	* mh-hp300 (RANLIB): Use "ar ts", in case GNU ar was used and
-	didn't build a symbol table.
-
-Thu Jun 22 17:47:24 1995  Stan Shebs  <shebs@andros.cygnus.com>
-
-	* mpw-mh-mpw (CC): Define ANSI_PROTOTYPES.
-
-Mon Apr 10 12:29:48 1995  Stan Shebs  <shebs@andros.cygnus.com>
-
-	* mpw-mh-mpw (EXTRALIBS): Always link in Math.o, CSANELIB.o,
-        and ToolLibs.o.
-
-	* mpw-mh-mpw (CC): Define ALMOST_STDC.
-	(CFLAGS): Remove ALMOST_STDC, -mc68881.
-	(LDFLAGS): add -w.
-
-	* mpw-mh-mpw (CFLAGS): Add -b option to put strings at the ends of
-	functions.
-
-	* mpw-mh-mpw: New file, host makefile definitions for MPW.
-
-Fri Mar 31 11:35:17 1995  Jason Molenda (crash@phydeaux.cygnus.com)
-
-	* mt-netware: New file.
-
-Mon Mar 13 12:31:29 1995  Ian Lance Taylor  <ian@cygnus.com>
-
-	* mh-hpux8: New file.
-	* mh-hpux: Use X11R5 rather than X11R4.
-
-Thu Feb  9 11:04:13 1995  Ian Lance Taylor  <ian@cygnus.com>
-
-	* mh-linux (SYSV): Don't define.
-	(RANLIB): Don't define.
-
-Wed Jan 11 16:29:34 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-	* m?-*pic (LIBCXXFLAGS): Add -fno-implicit-templates.
-
-Thu Nov  3 17:27:19 1994  Ken Raeburn  <raeburn@cujo.cygnus.com>
-
-	* mh-irix4 (CC): Increase maximum string length.
-
-	* mh-sco (CC): Define away const, it doesn't work right; elements
-	of arrays of ptr-to-const are considered const themselves.
-
-Sat Jul 16 12:17:49 1994  Stan Shebs  (shebs@andros.cygnus.com)
-
-	* mh-cxux: New file, from Bob Rusk (rrusk@mail.csd.harris.com).
-
-Sat Jun  4 17:22:12 1994  Per Bothner  (bothner@kalessin.cygnus.com)
-
-	* mh-ncrsvr43:  New file from Tom McConnell
-	<tmcconne@sedona.intel.com>.
-
-Thu May 19 00:32:11 1994  Jeff Law  (law@snake.cs.utah.edu)
-
-	* mh-hpux (CC): Add -Wp,-H256000 to avoid "too much defining"
-	errors from the HPUX 8 compilers.
-
-Wed May  4 20:14:47 1994  D. V. Henkel-Wallace  (gumby@cygnus.com)
-
-	* mh-lynxrs6k: set SHELL to /bin/bash
-
-Tue Apr 12 12:38:17 1994  Ian Lance Taylor  (ian@tweedledumb.cygnus.com)
-
-	* mh-irix4 (CC): Change -XNh1500 to -XNh2000.
-
-Sat Dec 25 20:03:45 1993  Jeffrey A. Law  (law@snake.cs.utah.edu)
-
-	* mt-hppa: Delete.
-
-Tue Nov 16 22:54:39 1993  Jim Kingdon  (kingdon@lioth.cygnus.com)
-
-	* mh-a68bsd: Define CC to gcc.
-
-Mon Nov 15 16:56:51 1993  Jim Kingdon  (kingdon@lioth.cygnus.com)
-
-	* mh-linux: Don't put -static in LDFLAGS.  Add comments.
-
-Mon Nov 15 13:37:58 1993  david d `zoo' zuhn  (zoo@cirdan.cygnus.com)
-
-	* mh-sysv4 (AR_FLAGS): change from cq to cr
-
-Fri Nov  5 08:12:32 1993  D. V. Henkel-Wallace  (gumby@blues.cygnus.com)
-
-	* mh-unixware: remove.  It's the same as sysv4, and config.guess
-	can't tell the difference.  So don't allow skew.
-
-Wed Oct 20 20:35:14 1993  Jim Kingdon  (kingdon@lioth.cygnus.com)
-
-	* mh-hp300: Revert yesterday's change, but add comment explaining.
-
-Tue Oct 19 18:58:21 1993  Jim Kingdon  (kingdon@lioth.cygnus.com)
-
-	* mh-hp300: Don't define CFLAGS to empty.  Why should hp300 be
-	different from anything else?  ("gdb doesn't understand the native
-	debug format" isn't a good enough answer because we might be using
-	gcc).
-
-Tue Oct  5 12:17:40 1993  Peter Schauer  (pes@regent.e-technik.tu-muenchen.de)
-
-	* mh-alphaosf: Remove, no longer necessary now that gdb knows
-	how to handle OSF/1 shared libraries.
-
-Tue Jul  6 11:27:33 1993  Steve Chamberlain  (sac@phydeaux.cygnus.com)
-
-	* mh-alphaosf: New file.
-
-Thu Jul  1 15:49:33 1993  Jim Kingdon  (kingdon@lioth.cygnus.com)
-
-	* mh-riscos: New file.
-
-Mon Jun 14 12:03:18 1993  david d `zoo' zuhn  (zoo at rtl.cygnus.com)
-
-	* mh-aix, mh-aix386, mh-decstation, mh-delta88, mh-hpux, mh-irix4,
-	mh-ncr3000, mh-solaris, mh-sysv, mh-sysv4: remove INSTALL=cp line,
-	now that we're using install.sh globally
-
-Fri Jun  4 16:09:34 1993  Ian Lance Taylor  (ian@cygnus.com)
-
-	* mh-sysv4 (INSTALL): Use cp, not /usr/ucb/install.
-
-Thu Apr  8 11:21:52 1993  Ian Lance Taylor  (ian@cygnus.com)
-
-	* mt-a29k, mt-ebmon29k, mt-os68k, mt-ose68000, mt-ose68k,
-	mt-vxworks68, mt-vxworks960: Removed obsolete, unused target
-	Makefile fragment files.
-
-Mon Mar  8 15:05:25 1993  Ken Raeburn  (raeburn@cambridge.cygnus.com)
-
-	* mh-aix386: New file; old mh-aix, plus no-op RANLIB.
-
-Thu Oct  1 13:50:48 1992  david d `zoo' zuhn  (zoo at cirdan.cygnus.com)
-
-	* mh-solaris: INSTALL is NOT /usr/ucb/install
-
-Mon Aug 24 14:25:35 1992  Ian Lance Taylor  (ian@cygnus.com)
-
-	* mt-ose68000, mt-ose68k: renamed from mt-OSE*.
-
-Tue Jul 21 02:11:01 1992  D. V. Henkel-Wallace  (gumby@cygnus.com)
-
-	* mt-OSE68k, mt-680000: new configs.
-
-Thu Jul 16 17:12:09 1992  K. Richard Pixley  (rich@rtl.cygnus.com)
-
-	* mh-irix4: merged changes from progressive.
-
-Tue Jun  9 23:29:38 1992  Per Bothner  (bothner@rtl.cygnus.com)
-
-	* Everywhere: Change RANLIB=echo>/dev/null (which confuses
-	some shells - and I don't blame them) to RANLIB=true.
-	* mh-solaris:  Use /usr/ucb/install for INSTALL.
-
-Sun May 31 14:45:23 1992  Mark Eichin  (eichin at cygnus.com)
-
-	* mh-solaris2: Add new configuration for Solaris 2 (sysv, no ranlib)
-
-Fri Apr 10 23:10:08 1992  Fred Fish  (fnf@cygnus.com)
-
-	* mh-ncr3000:  Add new configuration for NCR 3000.
-
-Tue Dec 10 00:10:55 1991  K. Richard Pixley  (rich at rtl.cygnus.com)
-
-	* ChangeLog: fresh changelog.
-
diff -x CVS -uNr gnats/config/install-sh gnats.new/config/install-sh
--- gnats/config/install-sh	1969-12-31 18:00:00.000000000 -0600
+++ gnats.new/config/install-sh	2005-02-22 22:06:27.000000000 -0600
@@ -0,0 +1,325 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2004-04-01.17
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.  It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=
+transform_arg=
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=
+chgrpcmd=
+stripcmd=
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=
+dst=
+dir_arg=
+
+usage="Usage: $0 [OPTION]... SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 -d DIRECTORIES...
+
+In the first form, install SRCFILE to DSTFILE, removing SRCFILE by default.
+In the second, create the directory path DIR.
+
+Options:
+-b=TRANSFORMBASENAME
+-c         copy source (using $cpprog) instead of moving (using $mvprog).
+-d         create directories instead of installing files.
+-g GROUP   $chgrp installed files to GROUP.
+-m MODE    $chmod installed files to MODE.
+-o USER    $chown installed files to USER.
+-s         strip installed files (using $stripprog).
+-t=TRANSFORM
+--help     display this help and exit.
+--version  display version info and exit.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
+"
+
+while test -n "$1"; do
+  case $1 in
+    -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+        shift
+        continue;;
+
+    -c) instcmd=$cpprog
+        shift
+        continue;;
+
+    -d) dir_arg=true
+        shift
+        continue;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+        shift
+        shift
+        continue;;
+
+    --help) echo "$usage"; exit 0;;
+
+    -m) chmodcmd="$chmodprog $2"
+        shift
+        shift
+        continue;;
+
+    -o) chowncmd="$chownprog $2"
+        shift
+        shift
+        continue;;
+
+    -s) stripcmd=$stripprog
+        shift
+        continue;;
+
+    -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+        shift
+        continue;;
+
+    --version) echo "$0 $scriptversion"; exit 0;;
+
+    *)  # When -d is used, all remaining arguments are directories to create.
+	test -n "$dir_arg" && break
+        # Otherwise, the last argument is the destination.  Remove it from $@.
+	for arg
+	do
+          if test -n "$dstarg"; then
+	    # $@ is not empty: it contains at least $arg.
+	    set fnord "$@" "$dstarg"
+	    shift # fnord
+	  fi
+	  shift # arg
+	  dstarg=$arg
+	done
+	break;;
+  esac
+done
+
+if test -z "$1"; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call `install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+for src
+do
+  # Protect names starting with `-'.
+  case $src in
+    -*) src=./$src ;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    src=
+
+    if test -d "$dst"; then
+      instcmd=:
+      chmodcmd=
+    else
+      instcmd=$mkdirprog
+    fi
+  else
+    # Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dstarg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+
+    dst=$dstarg
+    # Protect names starting with `-'.
+    case $dst in
+      -*) dst=./$dst ;;
+    esac
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      dst=$dst/`basename "$src"`
+    fi
+  fi
+
+  # This sed command emulates the dirname command.
+  dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+  # Make sure that the destination directory exists.
+
+  # Skip lots of stat calls in the usual case.
+  if test ! -d "$dstdir"; then
+    defaultIFS='
+	 '
+    IFS="${IFS-$defaultIFS}"
+
+    oIFS=$IFS
+    # Some sh's can't handle IFS=/ for some reason.
+    IFS='%'
+    set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
+    IFS=$oIFS
+
+    pathcomp=
+
+    while test $# -ne 0 ; do
+      pathcomp=$pathcomp$1
+      shift
+      if test ! -d "$pathcomp"; then
+        $mkdirprog "$pathcomp" || lasterr=$?
+	# mkdir can fail with a `File exist' error in case several
+	# install-sh are creating the directory concurrently.  This
+	# is OK.
+	test ! -d "$pathcomp" && { (exit ${lasterr-1}); exit; }
+      fi
+      pathcomp=$pathcomp/
+    done
+  fi
+
+  if test -n "$dir_arg"; then
+    $doit $instcmd "$dst" \
+      && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
+      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
+      && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
+      && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
+
+  else
+    # If we're going to rename the final executable, determine the name now.
+    if test -z "$transformarg"; then
+      dstfile=`basename "$dst"`
+    else
+      dstfile=`basename "$dst" $transformbasename \
+               | sed $transformarg`$transformbasename
+    fi
+
+    # don't allow the sed command to completely eliminate the filename.
+    test -z "$dstfile" && dstfile=`basename "$dst"`
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
+    trap '(exit $?); exit' 1 2 13 15
+
+    # Move or copy the file name to the temp name
+    $doit $instcmd "$src" "$dsttmp" &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $instcmd $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
+      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
+      && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
+      && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
+
+    # Now rename the file to the real destination.
+    { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
+      || {
+	   # The rename failed, perhaps because mv can't rename something else
+	   # to itself, or perhaps because mv is so ancient that it does not
+	   # support -f.
+
+	   # Now remove or move aside any old file at destination location.
+	   # We try this two ways since rm can't unlink itself on some
+	   # systems and the destination file might be busy for other
+	   # reasons.  In this case, the final cleanup might fail but the new
+	   # file should still install successfully.
+	   {
+	     if test -f "$dstdir/$dstfile"; then
+	       $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
+	       || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
+	       || {
+		 echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
+		 (exit 1); exit
+	       }
+	     else
+	       :
+	     fi
+	   } &&
+
+	   # Now rename the file to the real destination.
+	   $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
+	 }
+    }
+  fi || { (exit 1); exit; }
+done
+
+# The final little trick to "correctly" pass the exit status to the exit trap.
+{
+  (exit 0); exit
+}
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff -x CVS -uNr gnats/config/mh-a68bsd gnats.new/config/mh-a68bsd
--- gnats/config/mh-a68bsd	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-a68bsd	1969-12-31 18:00:00.000000000 -0600
@@ -1,12 +0,0 @@
-RANLIB=true
-
-#None of the Apollo compilers can compile gas or binutils.  The preprocessor
-# chokes on bfd, the compiler won't let you assign integers to enums, and
-# other problems.  Defining CC to gcc is a questionable way to say "don't use
-# the apollo compiler" (the preferred version of GCC could be called cc,
-# or whatever), but I'm not sure leaving CC as cc is any better...
-
-#CC=cc -A ansi -A runtype,any -A systype,any -U__STDC__ -DNO_STDARG
-CC=gcc
-
-BISON=yacc
diff -x CVS -uNr gnats/config/mh-aix386 gnats.new/config/mh-aix386
--- gnats/config/mh-aix386	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-aix386	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-RANLIB = @:
diff -x CVS -uNr gnats/config/mh-aix43 gnats.new/config/mh-aix43
--- gnats/config/mh-aix43	1999-10-26 02:10:16.000000000 -0500
+++ gnats.new/config/mh-aix43	1969-12-31 18:00:00.000000000 -0600
@@ -1,4 +0,0 @@
-# AIX 4.3 and above requires -X32_64 flag to all ar and nm commands
-# to handle both 32-bit and 64-bit objects.
-AR_FOR_TARGET=ar -X32_64
-NM_FOR_TARGET=nm -X32_64
diff -x CVS -uNr gnats/config/mh-apollo68 gnats.new/config/mh-apollo68
--- gnats/config/mh-apollo68	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-apollo68	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-HDEFINES = -DUSG
-RANLIB=true
-CC= cc -A ansi -A runtype,any -A systype,any -U__STDC__ -DUSG
diff -x CVS -uNr gnats/config/mh-armpic gnats.new/config/mh-armpic
--- gnats/config/mh-armpic	1999-10-26 02:10:16.000000000 -0500
+++ gnats.new/config/mh-armpic	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-PICFLAG=-fPIC
diff -x CVS -uNr gnats/config/mh-cxux gnats.new/config/mh-cxux
--- gnats/config/mh-cxux	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-cxux	1969-12-31 18:00:00.000000000 -0600
@@ -1,14 +0,0 @@
-# Configuration for Harris CX/UX 7 (and maybe 6), based on sysv4 configuration.
-
-# Define SYSV as -DSYSV if you are using a System V operating system.
-SYSV = -DSYSV -DSVR4
-RANLIB = true
-
-# C++ debugging is not yet supported under SVR4 (DWARF)
-CXXFLAGS=-O
-
-# The l flag generates a warning from the SVR4 archiver, remove it.
-AR_FLAGS = cq
-
-# Under CX/UX, we want to tell the compiler to use ANSI mode.
-CC=cc -Xa
diff -x CVS -uNr gnats/config/mh-cygwin gnats.new/config/mh-cygwin
--- gnats/config/mh-cygwin	1999-10-26 02:10:16.000000000 -0500
+++ gnats.new/config/mh-cygwin	1969-12-31 18:00:00.000000000 -0600
@@ -1,6 +0,0 @@
-EXTRA_TARGET_HOST_ALL_MODULES=all-libtermcap
-EXTRA_TARGET_HOST_INSTALL_MODULES=install-libtermcap
-
-all-gdb: all-libtermcap
-
-install-gdb: all-libtermcap
diff -x CVS -uNr gnats/config/mh-cygwin32 gnats.new/config/mh-cygwin32
--- gnats/config/mh-cygwin32	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-cygwin32	1969-12-31 18:00:00.000000000 -0600
@@ -1,16 +0,0 @@
-# We don't want debugging info in Win32-hosted toolchains.
-# Accomplish this by overriding CFLAGS.
-CFLAGS=-O2
-CXXFLAGS=-O2
-
-# We also need to override LIBGCC2_DEBUG_CFLAGS so libgcc2 will be
-# build without debugging information
-
-LIBGCC2_DEBUG_CFLAGS=
-
-# We set MAKEINFOFLAGS to not split .info files, because the resulting
-# file names don't work on DOS.
-MAKEINFOFLAGS=--no-split
-
-# custom installation rules for cygwin32 (append .exe to binaries, etc.)
-INSTALL_DOSREL=install-dosrel
diff -x CVS -uNr gnats/config/mh-decstation gnats.new/config/mh-decstation
--- gnats/config/mh-decstation	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-decstation	1969-12-31 18:00:00.000000000 -0600
@@ -1,5 +0,0 @@
-CC = cc -Wf,-XNg1000
-
-# for X11, since the native DECwindows include files are really broken when
-# it comes to function prototypes.  
-X11_EXTRA_CFLAGS = "-DNeedFunctionPrototypes=0"
diff -x CVS -uNr gnats/config/mh-delta88 gnats.new/config/mh-delta88
--- gnats/config/mh-delta88	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-delta88	1969-12-31 18:00:00.000000000 -0600
@@ -1,4 +0,0 @@
-RANLIB = true
-
-
-
diff -x CVS -uNr gnats/config/mh-dgux gnats.new/config/mh-dgux
--- gnats/config/mh-dgux	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-dgux	1969-12-31 18:00:00.000000000 -0600
@@ -1,4 +0,0 @@
-HDEFINES=-DHOST_SYS=DGUX_SYS
-CC=gcc -Wall -ansi -D__using_DGUX
-RANLIB=true
-
diff -x CVS -uNr gnats/config/mh-dgux386 gnats.new/config/mh-dgux386
--- gnats/config/mh-dgux386	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-dgux386	1969-12-31 18:00:00.000000000 -0600
@@ -1,22 +0,0 @@
-# from mh-dgux
-HDEFINES=-DHOST_SYS=DGUX_SYS
-CC=gcc -Wall -ansi -D__using_DGUX
-RANLIB = true
-
-# from mh-sysv4
-# Define SYSV as -DSYSV if you are using a System V operating system.
-SYSV = -DSYSV -DSVR4
-RANLIB = true
-
-# C++ debugging is not yet supported under SVR4 (DWARF)
-CXXFLAGS=-O
-
-# The l flag generates a warning from the SVR4 archiver, remove it.
-AR_FLAGS = cr
-
-X11_EXTRA_LIBS = -lnsl
-
-# from angela
-# no debugging due to broken compiler, use BSD style timeofday
-CFLAGS=-O -D_BSD_TIMEOFDAY_FLAVOR
-
diff -x CVS -uNr gnats/config/mh-djgpp gnats.new/config/mh-djgpp
--- gnats/config/mh-djgpp	1999-10-26 02:10:16.000000000 -0500
+++ gnats.new/config/mh-djgpp	1969-12-31 18:00:00.000000000 -0600
@@ -1,4 +0,0 @@
-# We don't want to use debugging information on DOS.  Unfortunately,
-# this requires that we set CFLAGS.
-# This used to set -fno-omit-frame-pointer.
-CFLAGS=-O2
diff -x CVS -uNr gnats/config/mh-elfalphapic gnats.new/config/mh-elfalphapic
--- gnats/config/mh-elfalphapic	1999-10-26 02:10:16.000000000 -0500
+++ gnats.new/config/mh-elfalphapic	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-PICFLAG=-fPIC
diff -x CVS -uNr gnats/config/mh-go32 gnats.new/config/mh-go32
--- gnats/config/mh-go32	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-go32	1969-12-31 18:00:00.000000000 -0600
@@ -1,4 +0,0 @@
-# We don't want to use debugging information on DOS.  Unfortunately,
-# this requires that we set CFLAGS.
-# This used to set -fno-omit-frame-pointer.
-CFLAGS=-O2
diff -x CVS -uNr gnats/config/mh-hp300 gnats.new/config/mh-hp300
--- gnats/config/mh-hp300	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-hp300	1969-12-31 18:00:00.000000000 -0600
@@ -1,13 +0,0 @@
-# Define SYSV as -DSYSV if you are using a System V operating system.
-SYSV = -DSYSV
-# Avoid "too much defining" errors from HPUX compiler.
-CC = cc -Wp,-H256000
-# If "ar" in $PATH is GNU ar, the symbol table may need rebuilding.
-# If it's HP/UX ar, this should be harmless.
-RANLIB = ar ts
-
-# Native cc can't bootstrap gcc with -g.  Defining CFLAGS here loses (a)
-# for non-gcc directories, (b) if we are compiling with gcc, not
-# native cc.  Neither (a) nor (b) has a trivial fix though.
-
-CFLAGS =
diff -x CVS -uNr gnats/config/mh-hpux gnats.new/config/mh-hpux
--- gnats/config/mh-hpux	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-hpux	1969-12-31 18:00:00.000000000 -0600
@@ -1,4 +0,0 @@
-# Define SYSV as -DSYSV if you are using a System V operating system.
-CC = cc -Wp,-H256000
-SYSV = -DSYSV
-RANLIB = true
diff -x CVS -uNr gnats/config/mh-hpux8 gnats.new/config/mh-hpux8
--- gnats/config/mh-hpux8	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-hpux8	1969-12-31 18:00:00.000000000 -0600
@@ -1,4 +0,0 @@
-# Define SYSV as -DSYSV if you are using a System V operating system.
-CC = cc -Wp,-H256000
-SYSV = -DSYSV
-RANLIB = true
diff -x CVS -uNr gnats/config/mh-interix gnats.new/config/mh-interix
--- gnats/config/mh-interix	1999-10-26 02:10:16.000000000 -0500
+++ gnats.new/config/mh-interix	1969-12-31 18:00:00.000000000 -0600
@@ -1,14 +0,0 @@
-# The shell may not be in /bin. 
-SHELL = sh
-RANLIB = true
-
-# We don't want debugging info in Interix-hosted toolchains.
-# Accomplish this by overriding CFLAGS. This is also a workaround
-# for LD crash when building shared libstdc++.
-CFLAGS=-O2
-CXXFLAGS=-O2
-
-# We also need to override LIBGCC2_DEBUG_CFLAGS so libgcc2 will be
-# built without debugging information
-
-LIBGCC2_DEBUG_CFLAGS=
diff -x CVS -uNr gnats/config/mh-irix4 gnats.new/config/mh-irix4
--- gnats/config/mh-irix4	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-irix4	1969-12-31 18:00:00.000000000 -0600
@@ -1,7 +0,0 @@
-# Makefile changes for SGI's running IRIX-4.x.
-# Tell compiler to use K&R C.  We can't compile under the SGI Ansi
-# environment.  Also bump switch table size so that cp-parse will
-# compile.  Bump string length limit so linker builds.
-
-CC = cc -cckr -Wf,-XNg1500 -Wf,-XNk1000 -Wf,-XNh2000 -Wf,-XNl8192
-SYSV = -DSYSV
diff -x CVS -uNr gnats/config/mh-irix5 gnats.new/config/mh-irix5
--- gnats/config/mh-irix5	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-irix5	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-# Makefile changes for SGI's running IRIX-5.x.
-SYSV = -DSYSV
-RANLIB = true
diff -x CVS -uNr gnats/config/mh-irix6 gnats.new/config/mh-irix6
--- gnats/config/mh-irix6	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-irix6	1969-12-31 18:00:00.000000000 -0600
@@ -1,7 +0,0 @@
-# Makefile changes for SGI's running IRIX-6.x.
-SYSV = -DSYSV
-RANLIB = true
-# Specify the ABI, to ensure that all Irix 6 systems will behave the same.
-# Also, using -32 avoids bugs that exist in the n32/n64 support in some
-# versions of the SGI compiler.
-CC = cc -32
diff -x CVS -uNr gnats/config/mh-lynxos gnats.new/config/mh-lynxos
--- gnats/config/mh-lynxos	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-lynxos	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-# /bin/cc is less than useful for our purposes.  Always use GCC
-CC = /bin/gcc
diff -x CVS -uNr gnats/config/mh-lynxrs6k gnats.new/config/mh-lynxrs6k
--- gnats/config/mh-lynxrs6k	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-lynxrs6k	1969-12-31 18:00:00.000000000 -0600
@@ -1,8 +0,0 @@
-# LynxOS running on the rs6000 doesn't have ranlib
-RANLIB = true
-
-# /bin/cc is less than useful for our purposes.  Always use GCC
-CC = /usr/cygnus/progressive/bin/gcc
-
-# /bin/sh is too buggy, so use /bin/bash instead.
-SHELL = /bin/bash
diff -x CVS -uNr gnats/config/mh-m68kpic gnats.new/config/mh-m68kpic
--- gnats/config/mh-m68kpic	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-m68kpic	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-PICFLAG=-fpic
diff -x CVS -uNr gnats/config/mh-mingw32 gnats.new/config/mh-mingw32
--- gnats/config/mh-mingw32	1999-10-26 02:10:16.000000000 -0500
+++ gnats.new/config/mh-mingw32	1969-12-31 18:00:00.000000000 -0600
@@ -1,12 +0,0 @@
-# We don't want debugging info in Win32-hosted toolchains.
-# Accomplish this by overriding CFLAGS.
-CFLAGS=-O2
-CXXFLAGS=-O2
-
-# We also need to override LIBGCC2_DEBUG_CFLAGS so libgcc2 will be
-# built without debugging information
-
-LIBGCC2_DEBUG_CFLAGS=
-
-# custom installation rules for mingw32 (append .exe to binaries, etc.)
-# INSTALL_DOSREL=install-dosrel
diff -x CVS -uNr gnats/config/mh-ncr3000 gnats.new/config/mh-ncr3000
--- gnats/config/mh-ncr3000	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-ncr3000	1969-12-31 18:00:00.000000000 -0600
@@ -1,17 +0,0 @@
-# Host configuration file for an NCR 3000 (i486/SVR4) system.
-
-# The NCR 3000 ships with a MetaWare compiler installed as /bin/cc.
-# This compiler not only emits obnoxious copyright messages every time
-# you run it, but it chokes and dies on a whole bunch of GNU source
-# files.  Default to using the AT&T compiler installed in /usr/ccs/ATT/cc.
-# Unfortunately though, the AT&T compiler sometimes generates code that
-# the assembler barfs on if -g is used, so disable it by default as well.
-CC = /usr/ccs/ATT/cc
-CFLAGS =
-
-# Define SYSV as -DSYSV if you are using a System V operating system.
-SYSV = -DSYSV -DSVR4
-RANLIB = true
-
-# The l flag generates a warning from the SVR4 archiver, remove it.
-AR_FLAGS = cq
diff -x CVS -uNr gnats/config/mh-ncrsvr43 gnats.new/config/mh-ncrsvr43
--- gnats/config/mh-ncrsvr43	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-ncrsvr43	1969-12-31 18:00:00.000000000 -0600
@@ -1,9 +0,0 @@
-# Host configuration file for an NCR 3000 (i486/SVR43) system.
-
-# The MetaWare compiler will generate a copyright message unless you
-# turn it off by adding the -Hnocopyr flag.
-CC = cc -Hnocopyr
-
-# Define SYSV as -DSYSV if you are using a System V operating system.
-SYSV = -DSYSV -DSVR4
-RANLIB = true
diff -x CVS -uNr gnats/config/mh-necv4 gnats.new/config/mh-necv4
--- gnats/config/mh-necv4	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-necv4	1969-12-31 18:00:00.000000000 -0600
@@ -1,11 +0,0 @@
-# Host Makefile fragment for NEC MIPS SVR4.
-
-# The C compiler on NEC MIPS SVR4 needs bigger tables.
-CC = cc -ZXNd=5000 -ZXNg=1000
-
-# Define SYSV as -DSYSV if you are using a System V operating system.
-SYSV = -DSYSV -DSVR4
-RANLIB = true
-
-# NEC -lX11 needs some other libraries.
-X11_EXTRA_LIBS = -lsocket -lnsl
diff -x CVS -uNr gnats/config/mh-papic gnats.new/config/mh-papic
--- gnats/config/mh-papic	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-papic	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-PICFLAG=-fPIC
diff -x CVS -uNr gnats/config/mh-ppcpic gnats.new/config/mh-ppcpic
--- gnats/config/mh-ppcpic	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-ppcpic	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-PICFLAG=-fPIC
diff -x CVS -uNr gnats/config/mh-riscos gnats.new/config/mh-riscos
--- gnats/config/mh-riscos	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-riscos	1969-12-31 18:00:00.000000000 -0600
@@ -1,15 +0,0 @@
-# This is for a MIPS running RISC/os 4.52C.
-
-# This is needed for GDB, but needs to be in the top-level make because
-# if a library is compiled with the bsd headers and gets linked with the
-# sysv system libraries all hell can break loose (e.g. a jmp_buf might be
-# a different size).
-# ptrace(2) apparently has problems in the BSD environment.  No workaround is
-# known except to select the sysv environment.  Could we use /proc instead?
-# These "sysv environments" and "bsd environments" often end up being a pain.
-#
-# This is not part of CFLAGS because perhaps not all C compilers have this
-# option.
-CC= cc -systype sysv
-
-RANLIB = true
diff -x CVS -uNr gnats/config/mh-sco gnats.new/config/mh-sco
--- gnats/config/mh-sco	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-sco	1969-12-31 18:00:00.000000000 -0600
@@ -1,10 +0,0 @@
-# Define SYSV as -DSYSV if you are using a System V operating system.
-SYSV = -DSYSV
-RANLIB = true
-# You may need this if you don't have bison.
-# BISON = yacc -Sm10400
-# The native C compiler botches some simple uses of const.  Unfortunately,
-# it doesn't defined anything like "__sco__" for us to test for in ansidecl.h.
-CC = cc -Dconst=
-
-X11_EXTRA_LIBS = -lsocket -lm -lintl -lmalloc
diff -x CVS -uNr gnats/config/mh-solaris gnats.new/config/mh-solaris
--- gnats/config/mh-solaris	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-solaris	1969-12-31 18:00:00.000000000 -0600
@@ -1,6 +0,0 @@
-# Makefile changes for Suns running Solaris 2
-
-SYSV = -DSYSV
-RANLIB = true
-
-X11_EXTRA_LIBS = -lnsl -lsocket
diff -x CVS -uNr gnats/config/mh-sparcpic gnats.new/config/mh-sparcpic
--- gnats/config/mh-sparcpic	1999-10-26 02:10:16.000000000 -0500
+++ gnats.new/config/mh-sparcpic	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-PICFLAG=`case "${LIBCFLAGS} ${LIBCXXFLAGS}" in *-fpic* ) echo -fpic ;; * ) echo -fPIC ;; esac`
diff -x CVS -uNr gnats/config/mh-sun3 gnats.new/config/mh-sun3
--- gnats/config/mh-sun3	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-sun3	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-# Sun's C compiler needs the -J flag to be able to compile cp-parse.c
-# without overflowing the jump tables (-J says to use a 32 bit table)
-CC = cc -J
diff -x CVS -uNr gnats/config/mh-sysv gnats.new/config/mh-sysv
--- gnats/config/mh-sysv	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-sysv	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-# Define SYSV as -DSYSV if you are using a System V operating system.
-SYSV = -DSYSV
-RANLIB = true
diff -x CVS -uNr gnats/config/mh-sysv4 gnats.new/config/mh-sysv4
--- gnats/config/mh-sysv4	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-sysv4	1969-12-31 18:00:00.000000000 -0600
@@ -1,11 +0,0 @@
-# Define SYSV as -DSYSV if you are using a System V operating system.
-SYSV = -DSYSV -DSVR4
-RANLIB = true
-
-# C++ debugging is not yet supported under SVR4 (DWARF)
-CXXFLAGS=-O
-
-# The l flag generates a warning from the SVR4 archiver, remove it.
-AR_FLAGS = cr
-
-X11_EXTRA_LIBS = -lnsl
diff -x CVS -uNr gnats/config/mh-sysv5 gnats.new/config/mh-sysv5
--- gnats/config/mh-sysv5	1999-10-26 02:10:16.000000000 -0500
+++ gnats.new/config/mh-sysv5	1969-12-31 18:00:00.000000000 -0600
@@ -1,8 +0,0 @@
-# Define SYSV as -DSYSV if you are using a System V operating system.
-SYSV = -DSYSV -DSVR4 -DSVR5
-RANLIB = true
-
-# The l flag generates a warning from the SVR4 archiver, remove it.
-AR_FLAGS = cr
-
-X11_EXTRA_LIBS = -lnsl
diff -x CVS -uNr gnats/config/mh-vaxult2 gnats.new/config/mh-vaxult2
--- gnats/config/mh-vaxult2	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-vaxult2	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-# The old BSD pcc isn't up to compiling parts of gdb so use gcc
-CC = gcc
diff -x CVS -uNr gnats/config/mh-windows gnats.new/config/mh-windows
--- gnats/config/mh-windows	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-windows	1969-12-31 18:00:00.000000000 -0600
@@ -1,16 +0,0 @@
-CC=cc
-CFLAGS=
-RANLIB=true
-AR_FLAGS=
-
-.PHONY: windows
-windows: nmake.mak
-	@echo "Don't forget to setup setvars.mak!"
-
-nmake.mak: to-be-built
-	@echo Building nmake files
-	@$(srcdir)/gdb/mswin/genmakes
-
-to-be-built:
-	@echo Recording commands
-	@$(srcdir)/gdb/mswin/recordit
diff -x CVS -uNr gnats/config/mh-x86pic gnats.new/config/mh-x86pic
--- gnats/config/mh-x86pic	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mh-x86pic	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-PICFLAG=-fpic
diff -x CVS -uNr gnats/config/missing gnats.new/config/missing
--- gnats/config/missing	1969-12-31 18:00:00.000000000 -0600
+++ gnats.new/config/missing	2005-02-22 22:06:36.000000000 -0600
@@ -0,0 +1,360 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2003-09-02.23
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003 
+#   Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# 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., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+run=:
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+  configure_ac=configure.ac
+else
+  configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case "$1" in
+--run)
+  # Try to run requested program, and just exit if it succeeds.
+  run=
+  shift
+  "$@" && exit 0
+  # Exit code 63 means version mismatch.  This often happens
+  # when the user try to use an ancient version of a tool on
+  # a file that requires a minimum version.  In this case we
+  # we should proceed has if the program had been absent, or
+  # if --run hadn't been passed.
+  if test $? = 63; then
+    run=:
+    msg="probably too old"
+  fi
+  ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case "$1" in
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+  --run           try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  help2man     touch the output file
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  tar          try tar, gnutar, gtar, then tar without non-portable flags
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Send bug reports to <bug-automake@gnu.org>."
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing $scriptversion (GNU Automake)"
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+  aclocal*)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    fi
+
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    fi
+
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`${configure_ac}'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    fi
+
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+    test -z "$files" && files="config.h"
+    touch_files=
+    for f in $files; do
+      case "$f" in
+      *:*) touch_files="$touch_files "`echo "$f" |
+				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+      *) touch_files="$touch_files $f.in";;
+      esac
+    done
+    touch $touch_files
+    ;;
+
+  automake*)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    fi
+
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print |
+	   sed 's/\.am$/.in/' |
+	   while read f; do touch "$f"; done
+    ;;
+
+  autom4te)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    fi
+
+    echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.
+         You can get \`$1' as part of \`Autoconf' from any GNU
+         archive site."
+
+    file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
+    test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
+    if test -f "$file"; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo "#! /bin/sh"
+	echo "# Created by GNU Automake missing as a replacement of"
+	echo "#  $ $@"
+	echo "exit 0"
+	chmod +x $file
+	exit 1
+    fi
+    ;;
+
+  bison|yacc)
+    echo 1>&2 "\
+WARNING: \`$1' $msg.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+	case "$LASTARG" in
+	*.y)
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+	    if [ -f "$SRCFILE" ]; then
+	         cp "$SRCFILE" y.tab.c
+	    fi
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+	    if [ -f "$SRCFILE" ]; then
+	         cp "$SRCFILE" y.tab.h
+	    fi
+	  ;;
+	esac
+    fi
+    if [ ! -f y.tab.h ]; then
+	echo >y.tab.h
+    fi
+    if [ ! -f y.tab.c ]; then
+	echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex|flex)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+	case "$LASTARG" in
+	*.l)
+	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+	    if [ -f "$SRCFILE" ]; then
+	         cp "$SRCFILE" lex.yy.c
+	    fi
+	  ;;
+	esac
+    fi
+    if [ ! -f lex.yy.c ]; then
+	echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  help2man)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    fi
+
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+	 you modified a dependency of a manual page.  You may need the
+	 \`Help2man' package in order for those modifications to take
+	 effect.  You can get \`Help2man' from any GNU archive site."
+
+    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+    if test -z "$file"; then
+	file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
+    fi
+    if [ -f "$file" ]; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo ".ab help2man is required to generate this page"
+	exit 1
+    fi
+    ;;
+
+  makeinfo)
+    if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then
+       # We have makeinfo, but it failed.
+       exit 1
+    fi
+
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+    if test -z "$file"; then
+      file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
+    fi
+    touch $file
+    ;;
+
+  tar)
+    shift
+    if test -n "$run"; then
+      echo 1>&2 "ERROR: \`tar' requires --run"
+      exit 1
+    fi
+
+    # We have already tried tar in the generic part.
+    # Look for gnutar/gtar before invocation to avoid ugly error
+    # messages.
+    if (gnutar --version > /dev/null 2>&1); then
+       gnutar "$@" && exit 0
+    fi
+    if (gtar --version > /dev/null 2>&1); then
+       gtar "$@" && exit 0
+    fi
+    firstarg="$1"
+    if shift; then
+	case "$firstarg" in
+	*o*)
+	    firstarg=`echo "$firstarg" | sed s/o//`
+	    tar "$firstarg" "$@" && exit 0
+	    ;;
+	esac
+	case "$firstarg" in
+	*h*)
+	    firstarg=`echo "$firstarg" | sed s/h//`
+	    tar "$firstarg" "$@" && exit 0
+	    ;;
+	esac
+    fi
+
+    echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+         You may want to install GNU tar or Free paxutils, or check the
+         command line arguments."
+    exit 1
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequisites for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff -x CVS -uNr gnats/config/mpw/ChangeLog gnats.new/config/mpw/ChangeLog
--- gnats/config/mpw/ChangeLog	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mpw/ChangeLog	1969-12-31 18:00:00.000000000 -0600
@@ -1,53 +0,0 @@
-Tue Nov 26 12:34:12 1996  Stan Shebs  <shebs@andros.cygnus.com>
-
-	* g-mpw-make.sed: Fix some comments.
-
-Mon Sep 16 14:42:52 1996  Stan Shebs  <shebs@andros.cygnus.com>
-
-	* g-mpw-make.sed (HLDENV): Edit out all references.
-
-Thu Aug 15 19:49:23 1996  Stan Shebs  <shebs@andros.cygnus.com>
-
-	* true: New script, identical to mpw-true.
-	* g-mpw-make.sed: Add @DASH_C_FLAG@ and @SEGMENT_FLAG()@
-	to the editors for compile commands.
-
-Thu Aug  1 15:01:42 1996  Stan Shebs  <shebs@andros.cygnus.com>
-
-	* mpw-true, mpw-touch, null-command: New scripts.
-	* README: Describe usage in more detail.
-
-Tue Dec 12 14:51:51 1995  Stan Shebs  <shebs@andros.cygnus.com>
-
-	* g-mpw-make.sed: Don't edit out "version=" occurrences.
-
-Fri Dec  1 11:46:18 1995  Stan Shebs  <shebs@andros.cygnus.com>
-
-	* g-mpw-make.sed (bindir, libdir): Edit the positions of
-	pathname separators to work with other pathnames better.
-
-Tue Nov  7 15:08:07 1995  Stan Shebs  <shebs@andros.cygnus.com>
-
-	* g-mpw-make.sed: Add comment about Duplicate vs Catenate,
-	add additional pattern for editing link-compile commands.
-
-Tue Oct 24 14:28:51 1995  Stan Shebs  <shebs@andros.cygnus.com>
-
-	* g-mpw-make.sed: Add handling for *.tab.[hc] files.
-	(CHILL_FOR_TARGET, CHILL_LIB): Edit out tricky definitions
-	of these.
-
-Thu Sep 28 21:05:10 1995  Stan Shebs  <shebs@andros.cygnus.com>
-
-	* g-mpw-make.sed: New file, generic sed commands to translate
-	Unix makefiles into MPW makefile syntax.
-
-Fri Mar 17 11:51:20 1995  Stan Shebs  <shebs@andros.cygnus.com>
-
-	* README: Clarify instructions.
-	* fi: Remove.
-
-Wed Dec 21 15:45:53 1994  Stan Shebs  <shebs@andros.cygnus.com>
-
-	* MoveIfChange, README, fi, forward-include, open-brace,
-        tr-7to8-src: New files.
diff -x CVS -uNr gnats/config/mpw/MoveIfChange gnats.new/config/mpw/MoveIfChange
--- gnats/config/mpw/MoveIfChange	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mpw/MoveIfChange	1969-12-31 18:00:00.000000000 -0600
@@ -1,19 +0,0 @@
-# Rename a file only if it is different from a previously existing
-# file of the same name.  This is useful for keeping make from doing
-# too much work if the contents of a file haven't changed.
-
-# This is an MPW translation of the standard GNU sh script move-if-change.
-
-Set exit 0
-
-If "`exists -f "{2}"`"
-  Compare "{1}" "{2}" >dev:null
-  If {status} != 0
-    Rename -y "{1}" "{2}"
-  Else
-    Echo "{2}" is unchanged
-    Delete -i -y "{1}"
-  End
-Else
-  Rename -y "{1}" "{2}"
-End
diff -x CVS -uNr gnats/config/mpw/README gnats.new/config/mpw/README
--- gnats/config/mpw/README	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mpw/README	1969-12-31 18:00:00.000000000 -0600
@@ -1,23 +0,0 @@
-This directory contains MPW scripts and related files that are needed to
-build Cygnus GNU tools for MPW.  The scripts should be somewhere on the
-command path; our usual practice has been to have a separate directory
-for the scripts, and put the tools (byacc, flex, and sed at least) there
-also; then it's easier to drag the support bits around as a group, or to
-upgrade MPW versions.  The complete package of scripts and tool binaries
-is usually available as pub/mac/buildtools.cpt.hqx on ftp.cygnus.com.
-
-"tr-7to8-src" is actually the source to an MPW script that transforms
-sequences like "\Option-d" into the actual 8-bit chars that MPW needs.
-It's only the source because it can't itself include any 8-bit chars.
-It *can* be processed into a genuine "tr-7to8" by using itself:
-
-	tr-7to8 tr-7to8-src | sed -e 's/Src//' >new-tr-7to8
-
-Use this to verify:
-
-	compare tr-7to8 new-tr-7to8
-
-If you don't have a working tr-7to8, then you will have to manually
-replace all occurrences of "\Option-d" with real Option-d (which looks
-like a delta), then do similarly with all the other "\Option-..."
-strings, and then change "\SrcOption-d" into the string "\Option-d".
diff -x CVS -uNr gnats/config/mpw/forward-include gnats.new/config/mpw/forward-include
--- gnats/config/mpw/forward-include	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mpw/forward-include	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-Echo '#include' ¶""{1}"¶" >"{2}".tem
-MoveIfChange "{2}".tem "{2}"
-
diff -x CVS -uNr gnats/config/mpw/g-mpw-make.sed gnats.new/config/mpw/g-mpw-make.sed
--- gnats/config/mpw/g-mpw-make.sed	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mpw/g-mpw-make.sed	1969-12-31 18:00:00.000000000 -0600
@@ -1,293 +0,0 @@
-# Sed commands to translate Unix makefiles into MPW makefiles.
-# These are nominally generic, but work best on the makefiles used
-# for GNU programs.
-
-# Whack out any commented-out lines that are probably commands;
-# they can only cause trouble later on.
-/^#	/d
-
-# Change dependency char.
-/:$/s/:/ \\Option-f/g
-/^[^ 	:#][^:]*:/s/\([ 	]*\):\([ 	]*\)/ \\Option-f /g
-
-# Change syntax of Makefile vars.
-/\$/s/\${\([a-zA-Z0-9_-]*\)}/{\1}/g
-/\$/s/\$(\([a-zA-Z0-9_-]*\))/{\1}/g
-/ $@/s/ $@/ {Targ}/
-
-# Double-$ are literals to Unix but not to MPW make.
-/\$\$/s/\$\$/$/g
-
-# Change pathname syntax.
-/\//s,\.\./\/\.\./,:::,g
-/\//s,\.\./,::,g
-/\.\//s,\./,:,g
-/\//s,/,:,g
-# Undo excess changes.
-/and/s,and:or$,and/or,
-/and/s,and:or ,and/or ,
-/want/s,want:need,want/need,
-# Fixing up sed commands.
-/-e/s_":\([^:]*\):d"_"/\1/d"_g
-/-e/s_":\([^:]*\):,:\([^:]*\):d"_"/\1/,/\2/d"_g
-
-/=/s/ = \.$/ = :/
-
-# Make these go away so that later edits not confused.
-/HLDENV/s/{HLDENV}//
-
-# Comment out any explicit srcdir setting.
-/srcdir/s/^srcdir/# srcdir/
-
-/BASEDIR/s/^BASEDIR =.*$/BASEDIR = "{srcroot}"/
-/{BASEDIR}:/s/{BASEDIR}:/{BASEDIR}/g
-/{srcdir}:/s/{srcdir}:/"{srcdir}"/g
-/"{srcdir}":/s/"{srcdir}":/"{srcdir}"/g
-
-# Tweak some conventions that are backwards for the Mac.
-/bindir/s/{exec_prefix}:bin/{exec_prefix}bin:/
-/libdir/s/{exec_prefix}:lib/{exec_prefix}lib:/
-
-# Comment out settings of anything set by mpw host config.
-/CC/s/^CC *=/#CC =/
-/CFLAGS/s/^CFLAGS *=/#CFLAGS =/
-/AR/s/^AR *=/#AR =/
-/AR_FLAGS/s/^AR_FLAGS *=/#AR_FLAGS =/
-/RANLIB/s/^RANLIB *=/#RANLIB =/
-/CC_LD/s/^CC_LD *=/#CC_LD =/
-/LDFLAGS/s/^LDFLAGS *=/#LDFLAGS =/
-
-# Change -I usages.
-/-I/s/-I\./-i :/g
-/-I/s/-I::bfd/-i ::bfd:/g
-/-I/s/-I::include/-i ::include:/g
-/-I/s/-I/-i /g
-
-# Change -D usage.
-/-D/s/\([ =]\)-D\([^ ]*\)/\1-d \2/g
-
-# Change continuation char.
-/\\$/s/\\$/\\Option-d/
-
-# Change wildcard char.
-/\*/s/\*/\\Option-x/g
-
-# Change path of various types of source files.  This rule does not allow
-# for file names with multiple dots in the name.
-/\.[chly]/s/\([ 	><=]\)\([-a-zA-Z0-9_${}:"]*\)\.\([chly]\)/\1"{s}"\2.\3/g
-/\.[chly]/s/^\([-a-zA-Z0-9_${}:"]*\)\.\([chly]\)/"{s}"\1.\2/
-# Allow files named *.tab.[ch] as a special case.
-/\.tab\.[ch]/s/\([ 	><=]\)\([-a-zA-Z0-9_${}:"]*\.tab\)\.\([ch]\)/\1"{s}"\2.\3/g
-/\.tab\.[ch]/s/^\([-a-zA-Z0-9_${}:"]*\.tab\)\.\([ch]\)/"{s}"\1.\2/
-# Fix some overenthusiasms.
-/{s}/s/"{s}""{srcdir}"/"{srcdir}"/g
-/{s}/s/"{s}"{\([a-zA-Z0-9_]*\)dir}/"{\1dir}"/g
-/{s}/s/"{s}"{\([a-zA-Z0-9_]*\)DIR}/"{\1DIR}"/g
-/{s}/s/"{s}""{\([a-zA-Z0-9_]*\)dir}"/"{\1dir}"/g
-/{s}/s/"{s}""{\([a-zA-Z0-9_]*\)DIR}"/"{\1DIR}"/g
-/{s}/s/"{s}":/:/g
-/{s}/s/^"{s}"//g
-/{s}/s/"{s}""{s}"/"{s}"/g
-/{s}/s/"{s}""{srcdir}"/"{s}"/g
-/{s}/s/"{srcdir}""{s}"/"{s}"/g
-
-# The .def files are also typically source files.
-/\.def/s/\([ 	><]\)\([-a-zA-Z0-9_${}:"]*\)\.def/\1"{s}"\2.def/g
-/\.def/s/^\([-a-zA-Z0-9_${}:"]*\)\.def/"{s}"\1.def/g
-
-# Change extension and path of objects.
-/\.o/s/\([ 	=]\)\([-a-zA-Z0-9_${}:"]*\)\.o/\1"{o}"\2.c.o/g
-/\.o/s/^\([-a-zA-Z0-9_${}:"]*\)\.o/"{o}"\1.c.o/
-# Allow *.tab.o files as a special case of a 2-dot-name file.
-/\.o/s/\([ 	=]\)\([-a-zA-Z0-9_${}:"]*\)\.tab\.o/\1"{o}"\2.tab.c.o/g
-/\.o/s/^\([-a-zA-Z0-9_${}:"]*\)\.tab\.o/"{o}"\1.tab.c.o/
-# Clean up.
-/"{o}"/s/"{o}""{o}"/"{o}"/g
-/"{o}"/s/^"{o}"\([a-zA-Z0-9_]*\)=/\1=/
-
-# Change extension of libs.
-/\.a/s/lib\([a-z]*\)\.a/lib\1.o/g
-
-# Remove non-fail option.
-/-/s/^\([ 	]*\)-/\1/
-# Fix overeagernesses - assumes no one-letter commands.
-/^[ 	]*[a-z] /s/^\([ 	]*\)\([a-z]\) /\1-\2 /
-
-# Remove non-echo option. (watch out for autoconf things)
-/@/s/^\([ 	]*\)@/\1/
-
-# Change cp to Duplicate.
-# Catenate is perhaps more accurate, but the pattern would have to
-# identify the output file and add a '>' redirection into it.
-/cp/s/^\([ 	]*\)cp /\1Duplicate -d -y /
-# Change mv to Rename.
-/mv/s/^\([ 	]*\)mv /\1Rename -y /
-/Rename/s/^\([ 	]*\)Rename -y -f/\1Rename -y/
-# Change rm to Delete.
-/rm -rf/s/^\([ 	]*\)rm -rf /\1Delete -i -y /
-/rm -f/s/^\([ 	]*\)rm -f /\1Delete -i -y /
-/rm/s/^\([ 	]*\)rm /\1Delete -i -y /
-# Note that we don't mess with ln - directory-specific scripts
-# must decide what to do with symlinks.
-# Change cat to Catenate.
-/cat/s/^\([ 	]*\)cat /\1Catenate /
-# Change touch to mpw-touch.
-/touch/s/^\([ 	]*\)touch /\1mpw-touch /
-# Change mkdir to NewFolder.
-/mkdir/s/^\([ 	]*\)mkdir /\1NewFolder /
-# Change var setting to Set.
-/=/s/^\([ 	]*\)\([-a-zA-Z0-9_]*\)=\([^;]*\); \\Option-d/\1Set \2 \3/
-
-# Change tests.
-/if /s/if \[ *-f \([^ ]*\) ] *; *\\Option-d/If "`Exists "\1"`" != ""/
-/if /s/if \[ *-f \([^ ]*\) ] *; *then *\\Option-d/If "`Exists "\1"`" != ""/
-/if /s/if \[ ! *-f \([^ ]*\) ] *; *\\Option-d/If "`Exists "\1"`" == ""/
-/if /s/if \[ ! *-f \([^ ]*\) ] *; *then \\Option-d/If "`Exists "\1"`" == ""/
-
-/if /s/if \[ *-d \([^ ]*\) ] *; *\\Option-d/If "`Exists "\1"`" != ""/
-/if /s/if \[ *-d \([^ ]*\) ] *; *then *\\Option-d/If "`Exists "\1"`" != ""/
-/if /s/if \[ ! *-d \([^ ]*\) ] *; *\\Option-d/If "`Exists "\1"`" == ""/
-/if /s/if \[ ! *-d \([^ ]*\) ] *; *then *\\Option-d/If "`Exists "\1"`" == ""/
-
-/if /s/if \[ -d \([^ ]*\) ] *; then true *; else mkdir \([^ ;]*\) *; fi/If "`Exists "\1"`" != "" NewFolder \2 End If/
-
-/if /s/if \[ \([^ ]*\) = \([^ ]*\) ] *; *\\Option-d/If "\1" == "\2"/
-/if /s/if \[ \([^ ]*\) = \([^ ]*\) ] *; *then *\\Option-d/If "\1" == "\2"/
-
-/if /s/if \[ \([^ ]*\) != \([^ ]*\) ] *; *\\Option-d/If "\1" != "\2"/
-/if /s/if \[ \([^ ]*\) != \([^ ]*\) ] *; *then *\\Option-d/If "\1" != "\2"/
-
-/if /s/if \[ \([^ ]*\) -eq \([^ ]*\) ] *; *\\Option-d/If "\1" != "\2"/
-/if /s/if \[ \([^ ]*\) -eq \([^ ]*\) ] *; *then *\\Option-d/If "\1" != "\2"/
-
-/^[ 	]*else true$/c\
-	Else\
-		mpw-true\
-
-
-/else/s/^\([ 	]*\)else[ 	]*$/\1Else/
-/else/s/^\([ 	]*\)else[; 	]*\\Option-d$/\1Else/
-
-/^[ 	]*else[ 	]*true[ 	]*$/c\
-	Else\
-		mpw-true
-
-/^[ 	]*else[ 	]*true[; 	]*fi$/c\
-	Else\
-		mpw-true\
-	End If
-
-/fi/s/^\([ 	]*\)fi *$/\1End/
-/fi/s/^\([ 	]*\)fi *; *\\Option-d/\1End/
-
-# Change looping.
-/for/s/^\([ 	]*\)for \([-a-zA-Z0-9_]*\) in \([^;]*\); *do *\\Option-d/\1For \2 In \3/
-/^\([ 	]*\)do *\\Option-d/d
-/done/s/^\([ 	]*\)done *; *\\Option-d/\1End/
-/done/s/^\([ 	]*\)done$/\1End/
-
-# Trailing semicolons and continued lines are unneeded sh syntax.
-/; \\Option-d/s/; \\Option-d//
-
-# Change move-if-change to MoveIfChange.
-/move-if-change/s/\([^ 	]*\)move-if-change/MoveIfChange/g
-
-# Change $(SHELL) to the script name by itself.
-/SHELL/s/^\([ 	]*\){SHELL} /\1/
-
-# Change syntax of default rule dependency.
-/^\.c\.o/s/^\.c\.o \\Option-f$/.c.o \\Option-f .c/
-
-# Change default rule's action.
-/{CC} -c/s/{CC} -c \(.*\) \$<$/{CC} @DASH_C_FLAG@ {DepDir}{Default}.c \1 @SEGMENT_FLAG({Default})@ -o {TargDir}{Default}.c.o/
-
-# This is pretty disgusting, but I can't seem to detect empty rules.
-/Option-f$/s/Option-f$/Option-f _oldest/g
-
-# Remove -c from explicit compiler calls. (but should not if GCC)
-# Handle the case of a source file that is "{xxx}"file.c.
-/ -c /s/{\([A-Z_]*\)CC}\(.*\) -c \(.*\)"\([^"]*\)"\([-a-z_]*\)\.c/{\1CC}\2 @DASH_C_FLAG@ \3"\4"\5.c -o "{o}"\5.c.o/
-# Handle the case of a source file that is "{xxx}"dir:file.c.
-/ -c /s/{\([A-Z_]*\)CC}\(.*\) -c \(.*\)"\([^"]*\)"\([-a-z_]*\):\([-a-z_]*\)\.c/{\1CC}\2 @DASH_C_FLAG@ \3"\4"\5:\6.c -o "{o}"\6.c.o/
-
-# Change linking cc to linking sequence.
-/-o/s/^\([ 	]*\){CC} \(.*\){\([A-Z_]*\)CFLAGS} \(.*\){LDFLAGS} \(.*\)-o \([^ ]*\) \(.*\)$/\1{CC_LD} \2 {\3CFLAGS} \4 {LDFLAGS} \5 -o \6{PROG_EXT} \7\
-\1{MAKEPEF} \6{PROG_EXT} -o \6 {MAKEPEF_TOOL_FLAGS} {MAKEPEF_FLAGS}\
-\1{REZ} "{s}"\6.r -o \6 -append -d PROG_NAME='"'\6'"' -d VERSION_STRING='"'{version}'"'/
-/-o/s/^\([ 	]*\){CC} \(.*\){\([A-Z_]*\)CFLAGS} \(.*\)-o \([^ ]*\) \(.*\){LDFLAGS} \(.*\)$/\1{CC_LD} \2 {\3CFLAGS} \4 {LDFLAGS} \6 -o \5{PROG_EXT} \7\
-\1{MAKEPEF} \5{PROG_EXT} -o \5 {MAKEPEF_TOOL_FLAGS} {MAKEPEF_FLAGS}\
-\1{REZ} "{s}"\5.r -o \5 -append -d PROG_NAME='"'\5'"' -d VERSION_STRING='"'{version}'"'/
-/-o/s/^\([ 	]*\){HOST_CC} \(.*\)-o \([^ ]*\) \(.*\)$/\1{HOST_CC_LD} \2 -o \3{PROG_EXT} \4\
-\1{MAKEPEF} \3{PROG_EXT} -o \3 {MAKEPEF_TOOL_FLAGS} {MAKEPEF_FLAGS}\
-\1{REZ} "{s}"\3.r -o \3 -append -d PROG_NAME='"'\3'"' -d VERSION_STRING='"'{version}'"'/
-
-# Comment out .NOEXPORT rules.
-/\.NOEXPORT/s/^\.NOEXPORT/#\.NOEXPORT/
-# Comment out .PHONY rules.
-/\.PHONY/s/^\.PHONY/#\.PHONY/
-# Comment out .PRECIOUS rules.
-/\.PRECIOUS/s/^\.PRECIOUS/#\.PRECIOUS/
-# Comment out .SUFFIXES rules.
-/\.SUFFIXES/s/^\.SUFFIXES/#\.SUFFIXES/
-
-# Set the install program appropriately.
-/INSTALL/s/^INSTALL *= *`.*`:install.sh -c/INSTALL = Duplicate -y/
-
-# Don't try to decide whether to use the tree's own tools.
-/bison/s/`.*bison:bison.*`/bison -y/
-/byacc/s/`.*byacc:byacc.*`/byacc/
-/flex/s/`.*flex:flex.*`/flex/
-
-# Turn transformed C comments in echo commands back into comments.
-/echo/s,echo '\(.*\):\\Option-x\(.*\)\\Option-x:\(.*\)',echo '\1/*\2*/\3',
-
-# Whack out various clever expressions that search for tools, since
-# the clever code is too /bin/sh specific.
-
-/^AR_FOR_TARGET = `/,/`$/c\
-AR_FOR_TARGET = ::binutils:ar\
-
-
-/^RANLIB_FOR_TARGET = `/,/`$/c\
-RANLIB_FOR_TARGET = ::binutils:ranlib\
-
-
-/^RANLIB_TEST_FOR_TARGET = /,/ranlib ] )$/c\
-RANLIB_TEST_FOR_TARGET = \
-
-
-/^EXPECT = `/,/`$/c\
-EXPECT = \
-
-
-/^RUNTEST = `/,/`$/c\
-RUNTEST = \
-
-
-/^CC_FOR_TARGET = `/,/`$/c\
-CC_FOR_TARGET = \
-
-
-/^CXX_FOR_TARGET = `/,/`$/c\
-CXX_FOR_TARGET = \
-
-
-/^CHILL_FOR_TARGET = `/,/`$/c\
-CHILL_FOR_TARGET = \
-
-
-/^CHILL_LIB = `/,/`$/c\
-CHILL_LIB = \
-
-/sanit/s/{start-sanit...-[a-z0-9]*}//
-/sanit/s/{end-sanit...-[a-z0-9]*}//
-
-# Add standard defines and default rules.
-/^# srcdir/a\
-\
-s = "{srcdir}"\
-\
-o = :\
-\
-"{o}" \\Option-f : "{s}"
-
diff -x CVS -uNr gnats/config/mpw/mpw-mh-mpw gnats.new/config/mpw/mpw-mh-mpw
--- gnats/config/mpw/mpw-mh-mpw	1999-10-26 02:10:16.000000000 -0500
+++ gnats.new/config/mpw/mpw-mh-mpw	1969-12-31 18:00:00.000000000 -0600
@@ -1,157 +0,0 @@
-# This is an MPW makefile fragment.
-
-# Since there are a multiplicity of Mac compilers and two different
-# processors, this file is primarily a library of options for each
-# compiler.  Somebody else (such as a configure or build script) will
-# make the actual choice.
-
-# Compiler to use for compiling.
-
-CC_MPW_C = C -d MPW_C -d ALMOST_STDC -d ANSI_PROTOTYPES -d MPW -mc68020 -model far -b -w
-
-CC_SC = SC -d ALMOST_STDC -d ANSI_PROTOTYPES -d MPW -mc68020 -model far -b -i '' -i :
-
-CC_MWC68K = MWC68K -d MPW -enum int -mpw_chars -sym on -w off -mc68020 -model far
-
-CC_PPCC = PPCC -d powerc=1 -d pascal= -d ALMOST_STDC -d ANSI_PROTOTYPES -d MPW -w
-
-CC_MRC = MrC -d powerc=1 -d pascal= -d ALMOST_STDC -d ANSI_PROTOTYPES -d MPW -i '' -i : -jm
-
-CC_SMrC = SMrC -d MPW
-
-# "-mpw_chars" is necessary because GNU sources often mix signed and
-# unsigned casually.
-# "-w off" is not a great idea, but CW7 is complaining about enum
-# assignments.
-# "-opt global,peep,l4,speed" is sometimes good, and sometimes bad.
-# We must use {CIncludes} so that MPW tools will work; {MWCIncludes}
-# defines stdout, islower, etc, in ways that are incompatible with MPW's
-# runtime.  However, this cannot be done via  -i "{CIncludes}", since
-# that does not affect how <>-type includes happen; instead, the variable
-# MWCIncludes must be set to point at {CIncludes}.
-
-CC_MWCPPC = MWCPPC -d MPW -enum int -mpw_chars -sym on -w off
-
-# Note that GCC does *not* wire in a definition of "pascal", so that
-# it can be handled in another way if desired.
-
-CC_68K_GCC = gC -Dpascal= -DANSI_PROTOTYPES -DMPW
-
-CC_PPC_GCC = gC -Dpowerc=1 -Dpascal= -DANSI_PROTOTYPES -DMPW
-
-# Nothing for the default CFLAGS.
-
-CFLAGS = 
-
-# Tool to use for making libraries/archives.
-
-AR_LIB = Lib
-
-AR_MWLINK68K = MWLink68K -xm library
-
-AR_PPCLINK = PPCLink -xm library
-
-AR_MWLINKPPC = MWLinkPPC -xm library
-
-AR_AR = ar
-
-AR_FLAGS = -o
-
-RANLIB_NULL = null-command
-
-RANLIB_RANLIB = ranlib
-
-# Compiler and/or linker to use for linking.
-
-CC_LD_LINK = Link -w -d -model far {CC_LD_TOOL_FLAGS}
-
-CC_LD_MWLINK68K = MWLink68K -w {CC_LD_TOOL_FLAGS} -sym on -model far
-
-CC_LD_PPCLINK = PPCLink -main __start -outputformat xcoff
-
-CC_LD_MWLINKPPC = MWLinkPPC -w {CC_LD_TOOL_FLAGS} -sym on
-
-CC_LD_GLD = gC
-
-# Extension for linker output.
-
-PROG_EXT_68K =
-
-PROG_EXT_XCOFF = .xcoff
-
-# Nothing for the default LDFLAGS.
-
-LDFLAGS = -w
-
-CC_LD_TOOL_FLAGS = -c 'MPS ' -t MPST
-
-# Libraries to link against.
-
-# It would appear that the math libraries are not
-# needed except to provide a definition for scalb,
-# which is called from ldexp, which is referenced
-# in the m68k opcodes library.
-
-EXTRALIBS_C = \Option-d
-	"{CLibraries}"StdClib.o \Option-d
-	"{CLibraries}"Math.o \Option-d
-	"{CLibraries}"CSANELib.o \Option-d
-	"{Libraries}"Stubs.o \Option-d
-	"{Libraries}"Runtime.o \Option-d
-	"{Libraries}"Interface.o \Option-d
-	"{Libraries}"ToolLibs.o
-
-EXTRALIBS_MWC68K = \Option-d
-	"{CLibraries}"StdClib.o \Option-d
-	"{CLibraries}"Math.o \Option-d
-	"{CLibraries}"CSANELib.o \Option-d
-	"{Libraries}"Stubs.o \Option-d
-	"{Libraries}"Runtime.o \Option-d
-	"{Libraries}"Interface.o \Option-d
-	"{Libraries}"ToolLibs.o \Option-d
-	"{MW68KLibraries}MPW ANSI (4i) C.68K.Lib"
-
-EXTRALIBS_PPC_XCOFF = \Option-d
-	"{PPCLibraries}"StdCRuntime.o \Option-d
-	"{PPCLibraries}"InterfaceLib.xcoff \Option-d
-	"{PPCLibraries}"MathLib.xcoff \Option-d
-	"{PPCLibraries}"StdCLib.xcoff \Option-d
-	"{PPCLibraries}"PPCToolLibs.o \Option-d
-	"{PPCLibraries}"PPCCRuntime.o \Option-d
-	"{GCCPPCLibraries}"libgcc.xcoff
-
-EXTRALIBS_PPC = \Option-d
-	"{PPCLibraries}"StdCRuntime.o \Option-d
-	"{SharedLibraries}"InterfaceLib \Option-d
-	"{SharedLibraries}"MathLib \Option-d
-	"{SharedLibraries}"StdCLib \Option-d
-	"{PPCLibraries}"PPCToolLibs.o \Option-d
-	"{PPCLibraries}"PPCCRuntime.o \Option-d
-	"{GCCPPCLibraries}"libgcc.xcoff
-
-EXTRALIBS_MWCPPC = \Option-d
-	"{MWPPCLibraries}"MWStdCRuntime.Lib \Option-d
-	"{MWPPCLibraries}"InterfaceLib \Option-d
-	"{MWPPCLibraries}"StdCLib \Option-d
-	"{MWPPCLibraries}"MathLib \Option-d
-	"{MWPPCLibraries}"PPCToolLibs.o
-
-# Tool to make PEF with, if needed.
-
-MAKEPEF_NULL = null-command
-
-MAKEPEF_PPC = MakePEF
-
-MAKEPEF_FLAGS = \Option-d
-	-l InterfaceLib.xcoff=InterfaceLib \Option-d
-	-l MathLib.xcoff=MathLib \Option-d
-	-l StdCLib.xcoff=StdCLib
-
-MAKEPEF_TOOL_FLAGS = -ft MPST -fc 'MPS '
-
-# Resource compiler to use.
-
-REZ_68K = Rez
-
-REZ_PPC = Rez -d WANT_CFRG
-
diff -x CVS -uNr gnats/config/mpw/mpw-touch gnats.new/config/mpw/mpw-touch
--- gnats/config/mpw/mpw-touch	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mpw/mpw-touch	1969-12-31 18:00:00.000000000 -0600
@@ -1,7 +0,0 @@
-# "Touch" command.
-
-If "`Exists "{1}"`" != ""
-	SetFile -m . "{1}"
-Else
-	Echo ' ' > "{1}"
-End If
diff -x CVS -uNr gnats/config/mpw/mpw-true gnats.new/config/mpw/mpw-true
--- gnats/config/mpw/mpw-true	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mpw/mpw-true	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-Exit 0
diff -x CVS -uNr gnats/config/mpw/null-command gnats.new/config/mpw/null-command
--- gnats/config/mpw/null-command	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mpw/null-command	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-# This command does nothing.
diff -x CVS -uNr gnats/config/mpw/open-brace gnats.new/config/mpw/open-brace
--- gnats/config/mpw/open-brace	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mpw/open-brace	1969-12-31 18:00:00.000000000 -0600
@@ -1,4 +0,0 @@
-# MPW makefiles seem not to have any way to get a literal open
-# brace into a rule anywhere, so this does the job.
-
-Echo '{'
diff -x CVS -uNr gnats/config/mpw/tr-7to8-src gnats.new/config/mpw/tr-7to8-src
--- gnats/config/mpw/tr-7to8-src	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mpw/tr-7to8-src	1969-12-31 18:00:00.000000000 -0600
@@ -1,9 +0,0 @@
-StreamEdit -e \Option-d
-  '/\Option-x/ \Option-d
-    Replace /\Option-d\SrcOption-d/ "\Option-d\Option-d" -c \Option-5 ; \Option-d
-    Replace /\Option-d\SrcOption-f/ "\Option-d\Option-f" -c \Option-5 ; \Option-d
-	Replace /\Option-d\SrcOption-8/ "\Option-d\Option-8" -c \Option-5 ; \Option-d
-	Replace /\Option-d\SrcOption-5/ "\Option-d\Option-5" -c \Option-5 ; \Option-d
-	Replace /\Option-d\SrcOption-x/ "\Option-d\Option-x" -c \Option-5 ; \Option-d
-	Replace /\Option-d\SrcOption-r/ "\Option-d\Option-r" -c \Option-5'  \Option-d
-  "{1}"
diff -x CVS -uNr gnats/config/mpw/true gnats.new/config/mpw/true
--- gnats/config/mpw/true	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mpw/true	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-Exit 0
diff -x CVS -uNr gnats/config/mpw-mh-mpw gnats.new/config/mpw-mh-mpw
--- gnats/config/mpw-mh-mpw	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mpw-mh-mpw	1969-12-31 18:00:00.000000000 -0600
@@ -1,157 +0,0 @@
-# This is an MPW makefile fragment.
-
-# Since there are a multiplicity of Mac compilers and two different
-# processors, this file is primarily a library of options for each
-# compiler.  Somebody else (such as a configure or build script) will
-# make the actual choice.
-
-# Compiler to use for compiling.
-
-CC_MPW_C = C -d MPW_C -d ALMOST_STDC -d ANSI_PROTOTYPES -d MPW -mc68020 -model far -b -w
-
-CC_SC = SC -d ALMOST_STDC -d ANSI_PROTOTYPES -d MPW -mc68020 -model far -b -i '' -i :
-
-CC_MWC68K = MWC68K -d MPW -enum int -mpw_chars -sym on -w off -mc68020 -model far
-
-CC_PPCC = PPCC -d powerc=1 -d pascal= -d ALMOST_STDC -d ANSI_PROTOTYPES -d MPW -w
-
-CC_MRC = MrC -d powerc=1 -d pascal= -d ALMOST_STDC -d ANSI_PROTOTYPES -d MPW -i '' -i : -jm
-
-CC_SMrC = SMrC -d MPW
-
-# "-mpw_chars" is necessary because GNU sources often mix signed and
-# unsigned casually.
-# "-w off" is not a great idea, but CW7 is complaining about enum
-# assignments.
-# "-opt global,peep,l4,speed" is sometimes good, and sometimes bad.
-# We must use {CIncludes} so that MPW tools will work; {MWCIncludes}
-# defines stdout, islower, etc, in ways that are incompatible with MPW's
-# runtime.  However, this cannot be done via  -i "{CIncludes}", since
-# that does not affect how <>-type includes happen; instead, the variable
-# MWCIncludes must be set to point at {CIncludes}.
-
-CC_MWCPPC = MWCPPC -d MPW -enum int -mpw_chars -sym on -w off
-
-# Note that GCC does *not* wire in a definition of "pascal", so that
-# it can be handled in another way if desired.
-
-CC_68K_GCC = gC -Dpascal= -DANSI_PROTOTYPES -DMPW
-
-CC_PPC_GCC = gC -Dpowerc=1 -Dpascal= -DANSI_PROTOTYPES -DMPW
-
-# Nothing for the default CFLAGS.
-
-CFLAGS = 
-
-# Tool to use for making libraries/archives.
-
-AR_LIB = Lib
-
-AR_MWLINK68K = MWLink68K -xm library
-
-AR_PPCLINK = PPCLink -xm library
-
-AR_MWLINKPPC = MWLinkPPC -xm library
-
-AR_AR = ar
-
-AR_FLAGS = -o
-
-RANLIB_NULL = null-command
-
-RANLIB_RANLIB = ranlib
-
-# Compiler and/or linker to use for linking.
-
-CC_LD_LINK = Link -w -d -model far {CC_LD_TOOL_FLAGS}
-
-CC_LD_MWLINK68K = MWLink68K -w {CC_LD_TOOL_FLAGS} -sym on -model far
-
-CC_LD_PPCLINK = PPCLink -main __start -outputformat xcoff
-
-CC_LD_MWLINKPPC = MWLinkPPC -w {CC_LD_TOOL_FLAGS} -sym on
-
-CC_LD_GLD = gC
-
-# Extension for linker output.
-
-PROG_EXT_68K =
-
-PROG_EXT_XCOFF = .xcoff
-
-# Nothing for the default LDFLAGS.
-
-LDFLAGS = -w
-
-CC_LD_TOOL_FLAGS = -c 'MPS ' -t MPST
-
-# Libraries to link against.
-
-# It would appear that the math libraries are not
-# needed except to provide a definition for scalb,
-# which is called from ldexp, which is referenced
-# in the m68k opcodes library.
-
-EXTRALIBS_C = \Option-d
-	"{CLibraries}"StdClib.o \Option-d
-	"{CLibraries}"Math.o \Option-d
-	"{CLibraries}"CSANELib.o \Option-d
-	"{Libraries}"Stubs.o \Option-d
-	"{Libraries}"Runtime.o \Option-d
-	"{Libraries}"Interface.o \Option-d
-	"{Libraries}"ToolLibs.o
-
-EXTRALIBS_MWC68K = \Option-d
-	"{CLibraries}"StdClib.o \Option-d
-	"{CLibraries}"Math.o \Option-d
-	"{CLibraries}"CSANELib.o \Option-d
-	"{Libraries}"Stubs.o \Option-d
-	"{Libraries}"Runtime.o \Option-d
-	"{Libraries}"Interface.o \Option-d
-	"{Libraries}"ToolLibs.o \Option-d
-	"{MW68KLibraries}MPW ANSI (4i) C.68K.Lib"
-
-EXTRALIBS_PPC_XCOFF = \Option-d
-	"{PPCLibraries}"StdCRuntime.o \Option-d
-	"{PPCLibraries}"InterfaceLib.xcoff \Option-d
-	"{PPCLibraries}"MathLib.xcoff \Option-d
-	"{PPCLibraries}"StdCLib.xcoff \Option-d
-	"{PPCLibraries}"PPCToolLibs.o \Option-d
-	"{PPCLibraries}"PPCCRuntime.o \Option-d
-	"{GCCPPCLibraries}"libgcc.xcoff
-
-EXTRALIBS_PPC = \Option-d
-	"{PPCLibraries}"StdCRuntime.o \Option-d
-	"{SharedLibraries}"InterfaceLib \Option-d
-	"{SharedLibraries}"MathLib \Option-d
-	"{SharedLibraries}"StdCLib \Option-d
-	"{PPCLibraries}"PPCToolLibs.o \Option-d
-	"{PPCLibraries}"PPCCRuntime.o \Option-d
-	"{GCCPPCLibraries}"libgcc.xcoff
-
-EXTRALIBS_MWCPPC = \Option-d
-	"{MWPPCLibraries}"MWStdCRuntime.Lib \Option-d
-	"{MWPPCLibraries}"InterfaceLib \Option-d
-	"{MWPPCLibraries}"StdCLib \Option-d
-	"{MWPPCLibraries}"MathLib \Option-d
-	"{MWPPCLibraries}"PPCToolLibs.o
-
-# Tool to make PEF with, if needed.
-
-MAKEPEF_NULL = null-command
-
-MAKEPEF_PPC = MakePEF
-
-MAKEPEF_FLAGS = \Option-d
-	-l InterfaceLib.xcoff=InterfaceLib \Option-d
-	-l MathLib.xcoff=MathLib \Option-d
-	-l StdCLib.xcoff=StdCLib
-
-MAKEPEF_TOOL_FLAGS = -ft MPST -fc 'MPS '
-
-# Resource compiler to use.
-
-REZ_68K = Rez
-
-REZ_PPC = Rez -d WANT_CFRG
-
diff -x CVS -uNr gnats/config/mt-armpic gnats.new/config/mt-armpic
--- gnats/config/mt-armpic	1999-10-26 02:10:16.000000000 -0500
+++ gnats.new/config/mt-armpic	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-PICFLAG_FOR_TARGET=-fPIC
diff -x CVS -uNr gnats/config/mt-elfalphapic gnats.new/config/mt-elfalphapic
--- gnats/config/mt-elfalphapic	1999-10-26 02:10:16.000000000 -0500
+++ gnats.new/config/mt-elfalphapic	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-PICFLAG_FOR_TARGET=-fPIC
diff -x CVS -uNr gnats/config/mt-linux gnats.new/config/mt-linux
--- gnats/config/mt-linux	1999-10-26 02:10:16.000000000 -0500
+++ gnats.new/config/mt-linux	1969-12-31 18:00:00.000000000 -0600
@@ -1,2 +0,0 @@
-# When using glibc 2 on Linux we must always use vtable thunks.
-CXXFLAGS_FOR_TARGET = $(CXXFLAGS) -fvtable-thunks -D_GNU_SOURCE
diff -x CVS -uNr gnats/config/mt-m68kpic gnats.new/config/mt-m68kpic
--- gnats/config/mt-m68kpic	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mt-m68kpic	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-PICFLAG_FOR_TARGET=-fpic
diff -x CVS -uNr gnats/config/mt-netware gnats.new/config/mt-netware
--- gnats/config/mt-netware	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mt-netware	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-GDB_NLM_DEPS = all-gcc all-ld
diff -x CVS -uNr gnats/config/mt-ospace gnats.new/config/mt-ospace
--- gnats/config/mt-ospace	1999-10-26 02:10:16.000000000 -0500
+++ gnats.new/config/mt-ospace	1969-12-31 18:00:00.000000000 -0600
@@ -1,3 +0,0 @@
-# Build libraries optimizing for space, not speed.
- CFLAGS_FOR_TARGET = -g -Os
- CXXFLAGS_FOR_TARGET = -g -Os
diff -x CVS -uNr gnats/config/mt-papic gnats.new/config/mt-papic
--- gnats/config/mt-papic	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mt-papic	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-PICFLAG_FOR_TARGET=-fPIC
diff -x CVS -uNr gnats/config/mt-ppcpic gnats.new/config/mt-ppcpic
--- gnats/config/mt-ppcpic	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mt-ppcpic	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-PICFLAG_FOR_TARGET=-fPIC
diff -x CVS -uNr gnats/config/mt-sparcpic gnats.new/config/mt-sparcpic
--- gnats/config/mt-sparcpic	1999-10-26 02:10:16.000000000 -0500
+++ gnats.new/config/mt-sparcpic	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-PICFLAG_FOR_TARGET=`case "${LIBCFLAGS} ${LIBCXXFLAGS}" in *-fpic* ) echo -fpic ;; * ) echo -fPIC ;; esac`
diff -x CVS -uNr gnats/config/mt-v810 gnats.new/config/mt-v810
--- gnats/config/mt-v810	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mt-v810	1969-12-31 18:00:00.000000000 -0600
@@ -1,4 +0,0 @@
-CC_FOR_TARGET = ca732 -ansi
-AS_FOR_TARGET = as732
-AR_FOR_TARGET = ar732
-RANLIB_FOR_TARGET = true
diff -x CVS -uNr gnats/config/mt-x86pic gnats.new/config/mt-x86pic
--- gnats/config/mt-x86pic	1998-11-05 13:54:08.000000000 -0600
+++ gnats.new/config/mt-x86pic	1969-12-31 18:00:00.000000000 -0600
@@ -1 +0,0 @@
-PICFLAG_FOR_TARGET=-fpic
diff -x CVS -uNr gnats/configure gnats.new/configure
--- gnats/configure	2004-11-17 22:22:49.000000000 -0600
+++ gnats.new/configure	2005-02-22 22:20:07.000000000 -0600
@@ -1258,7 +1258,7 @@
 
 
 ac_aux_dir=
-for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+for ac_dir in config $srcdir/config; do
   if test -f $ac_dir/install-sh; then
     ac_aux_dir=$ac_dir
     ac_install_sh="$ac_aux_dir/install-sh -c"
@@ -1274,8 +1274,8 @@
   fi
 done
 if test -z "$ac_aux_dir"; then
-  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
-echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in config $srcdir/config" >&5
+echo "$as_me: error: cannot find install-sh or install.sh in config $srcdir/config" >&2;}
    { (exit 1); exit 1; }; }
 fi
 ac_config_guess="$SHELL $ac_aux_dir/config.guess"
@@ -2524,6 +2524,7 @@
 done
 test -n "$YACC" || YACC="yacc"
 
+AC_PROG_LIBTOOL
 
           ac_config_files="$ac_config_files Makefile"
 
diff -x CVS -uNr gnats/configure.ac gnats.new/configure.ac
--- gnats/configure.ac	1969-12-31 18:00:00.000000000 -0600
+++ gnats.new/configure.ac	2005-02-22 22:20:31.000000000 -0600
@@ -0,0 +1,31 @@
+dnl Process this file with autoconf to produce a configure script.
+dnl
+dnl Copyright (C) 2001 Milan Zamazal
+dnl
+dnl This file is part of GNU GNATS.
+dnl 
+dnl GNU GNATS is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 2, or (at your option)
+dnl any later version.
+dnl 
+dnl GNU GNATS is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+dnl GNU General Public License for more details.
+dnl 
+dnl You should have received a copy of the GNU General Public License
+dnl along with GNU GNATS; see the file COPYING.  If not, write to the Free
+dnl Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA.
+dnl
+AC_PREREQ(2.5)
+AC_INIT(gnats,4.1.0,bug-gnats@gnu.org)
+AC_CONFIG_AUX_DIR(config)
+AC_CONFIG_SUBDIRS(libiberty gnats send-pr doc)
+
+AC_PROG_CC
+AC_PROG_LEX
+AC_PROG_YACC
+
+AC_CONFIG_FILES([Makefile])
+AC_OUTPUT
diff -x CVS -uNr gnats/configure.in gnats.new/configure.in
--- gnats/configure.in	2004-11-17 22:22:49.000000000 -0600
+++ gnats.new/configure.in	1969-12-31 18:00:00.000000000 -0600
@@ -1,30 +0,0 @@
-dnl Process this file with autoconf to produce a configure script.
-dnl
-dnl Copyright (C) 2001 Milan Zamazal
-dnl
-dnl This file is part of GNU GNATS.
-dnl 
-dnl GNU GNATS is free software; you can redistribute it and/or modify
-dnl it under the terms of the GNU General Public License as published by
-dnl the Free Software Foundation; either version 2, or (at your option)
-dnl any later version.
-dnl 
-dnl GNU GNATS is distributed in the hope that it will be useful,
-dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
-dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-dnl GNU General Public License for more details.
-dnl 
-dnl You should have received a copy of the GNU General Public License
-dnl along with GNU GNATS; see the file COPYING.  If not, write to the Free
-dnl Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA.
-dnl
-AC_PREREQ(2.5)
-AC_INIT(gnats,4.1.0,bug-gnats@gnu.org)
-AC_CONFIG_SUBDIRS(libiberty gnats send-pr doc)
-
-AC_PROG_CC
-AC_PROG_LEX
-AC_PROG_YACC
-
-AC_CONFIG_FILES([Makefile])
-AC_OUTPUT
diff -x CVS -uNr gnats/gnats/ChangeLog gnats.new/gnats/ChangeLog
--- gnats/gnats/ChangeLog	2004-11-30 09:44:37.000000000 -0600
+++ gnats.new/gnats/ChangeLog	2005-02-22 21:28:42.000000000 -0600
@@ -1,3 +1,8 @@
+2005-02-22  Chad Walstrom  <chewie@wookimus.net>
+
+	* gnats/man: Removed historical directory.  Current manpages found in
+	doc/man.
+
 2004-11-30  Chad Walstrom  <chewie@wookimus.net>
 
 	* gnatsd.c, gnats-pwconv.c (HAVE_CRYPT_H): Changed HAVE_CRYPT to
diff -x CVS -uNr gnats/gnats/gnats-pwconv.c.orig gnats.new/gnats/gnats-pwconv.c.orig
--- gnats/gnats/gnats-pwconv.c.orig	1969-12-31 18:00:00.000000000 -0600
+++ gnats.new/gnats/gnats-pwconv.c.orig	2004-11-29 17:58:57.000000000 -0600
@@ -0,0 +1,321 @@
+/* GNATS password conversion tool.
+   Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+
+This file is part of GNU GNATS.
+
+GNU GNATS 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 GNATS 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 GNATS; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA.  */
+
+#include "gnats.h"
+#ifdef HAVE_LIBCRYPT
+#ifdef HAVE_CRYPT		/* some systems declare `crypt' in unistd.h */
+#include <crypt.h>
+#endif
+#endif
+#include <getopt.h>
+#include <stdio.h>
+#include <time.h>
+#include <unistd.h>
+
+
+enum _Crypt_Type { NONE, PLAIN, CRYPT, MD5 };
+typedef enum _Crypt_Type Crypt_Type;
+
+
+#define PROGRAM_NAME "gnats-pwconv"
+const char *program_name = PROGRAM_NAME;
+
+/* static const int MAXLINE = 1024; */
+static const char* const VERSION = "1.0";
+
+static const char* USAGE[] =
+  {
+    "Usage: " PROGRAM_NAME,
+#ifdef HAVE_LIBCRYPT
+    " {-c | -m | -p} INFILE [OUTFILE]\n",
+#else
+    " -p INFILE [OUTFILE]\n",
+#endif
+    "Convert GNATS v3 gnatsd*.access passwords to version 4 format.\n",
+#ifdef HAVE_LIBCRYPT
+    "Supports plaintext, DES crypt and MD5 output.\n",
+#else
+    "Supports only unencrypted plaintext (compiled without `libcrypt').\n",
+#endif
+    "\n",
+#ifdef HAVE_LIBCRYPT    
+"  -c  --crypt        Use crypt() encryption of passwords.\n\
+  -m  --md5          Use MD5 encryption.\n",
+#endif
+"  -p  --plaintext    Do not encrypt the passwords (plaintext).\n\
+  -h  --help\n\
+  -V  --version\n",
+    NULL
+  };
+
+
+/* Print perror MESSAGE, processed through printf with a single argument ARG.
+ */
+static void
+perrorf (const char *message, char *arg)
+{
+  char *formatted;
+  if (asprintf (&formatted, message, arg) < 0)
+    {
+      perror ("System error");
+      exit (1);
+    }
+  perror (formatted);
+  free (formatted);
+}
+
+
+/* Split LINE into its fields.
+   Return true iff the operation was successful.
+   Note: LINE is modified during the operation.
+*/
+static bool
+parse_entry (char *line,
+	     char **username, char **password, char **level, char **dbs)
+{
+  int i;
+  int length = strlen (line);
+  char *separator;
+  char **fields[4];
+  fields[0] = username; fields[1] = password;
+  fields[2] = level; fields[3] = dbs;
+
+  if (length && line[length-1] == '\n')
+    {
+      line[length-1] = '\0';
+    }
+    
+  *dbs = (char *)"";
+  for (i = 0;
+       (i < 4) && (separator = (char *)strchr (line, ':')) != NULL;
+       i++)
+    {
+      *(fields[i]) = line;
+      *separator = '\0';
+      line = separator + 1;
+    }
+
+  return i >= 3;
+}
+
+
+/* Encrypt CLEARPWSTRING by the encryption type CRYPTTYPE and store the result
+   into NEWPWENTRY.  Return 0 on success, 1 if MD5 encryption is requested and
+   it is not supported by the system. */
+static int
+encrypt_ (char *clearpwstring, Crypt_Type crypttype, char **newpwentry)
+{
+  int result;
+#ifdef HAVE_LIBCRYPT
+  unsigned long seed = random();
+  char salt[12];
+  char rawsalt[9];
+  const char *SEEDCHARS =
+    "./0123456789ABCDEFGHIJKLMNOPQRST"
+    "UVWXYZabcdefghijklmnopqrstuvwxyz";
+  const int SEEDCHARS_LEN = strlen (SEEDCHARS);
+  int i;
+  
+  for (i = 0; i < 8; i++)
+    {
+      rawsalt[i] = SEEDCHARS[(seed/(i+1)) % SEEDCHARS_LEN];
+    }
+  rawsalt[i] = '\0';
+#endif
+  
+  switch (crypttype)
+    {
+    case PLAIN:
+      result = asprintf (newpwentry, "$0$%s", clearpwstring);
+      break;
+      
+#ifdef HAVE_LIBCRYPT      
+    case CRYPT:      
+      strncpy (salt, rawsalt, 2);
+      salt[2] = '\0';
+      result = asprintf (newpwentry, "%s", crypt (clearpwstring, salt));
+      break;
+      
+    case MD5:
+      sprintf (salt, "$1$%s", rawsalt);
+      result = asprintf (newpwentry, "%s", crypt (clearpwstring, salt));
+      break;
+#endif
+      
+    default:
+      fprintf (stderr, "Program error\n");
+      exit (1);
+    }
+
+  if (result < 0)
+    {
+      fprintf (stderr, "Memory allocation error\n");
+      exit (1);
+    }
+  
+  /* Are we on a system that supports MD5? */
+  return (crypttype == MD5 && strncmp ("$1$", *newpwentry, 3)) ? 1 : 0;
+}
+
+
+/* Convert password data in the file INFILE to the file OUTFILE.
+   OUTFILE can be NULL, in which case the data is output to stdout.
+   CRYPTTYPE is passed through to `encrypt_'.
+   Return 0 on success, anything else otherwise. */
+static int
+process_file (char *infile, char *outfile, int crypttype)
+{
+  FILE *input;
+  FILE *output;
+  char *line;
+  int i;
+  
+  if ((input = fopen (infile, "r")) == NULL)
+    {
+      perrorf ("Can't open the file `%s' for input", infile);
+      return 1;
+    }
+  if (outfile == NULL)
+    {
+      output = stdout;
+    }
+  else if ((output = fopen (outfile, "w")) == NULL)
+    {
+      perrorf ("Can't open the file `%s' for output", outfile);
+      return 1;
+    }
+  
+  for (i = 1; (line = read_line (input, NULL)) != NULL; i++)
+    {
+      if (strncmp (line, "#", 1) == 0
+	  || (strspn (line, " \t\r\n") == strlen (line)))
+	{
+	  fprintf (output, "%s", line);
+	}
+      else
+	{
+	  char *username, *password, *level, *dbs;
+	  char *newpwentry;
+	  if (parse_entry (line, &username, &password, &level, &dbs))
+	    {
+	      if (encrypt_ (password, crypttype, &newpwentry) == 1)
+		{
+		  fprintf (stderr, "Error: "
+			   "MD5 encryption not supported on this system.\n");
+		  free (line);
+		  free (newpwentry);
+		  return 1;
+		}
+	      fprintf (output, "%s:%s:%s:%s\n",
+		       username, newpwentry, level, dbs);
+	      free (newpwentry);
+	    }
+	  else
+	    {
+	      fprintf (stderr,
+		       "Error: Unable to decode line %d of the file `%s'.\n",
+		       i, infile);
+	      free (line);
+	      return 1;
+	    }
+	  free (line);
+	}
+    }
+  
+  fclose(input);
+  fclose(output);
+  
+  return 0;
+}
+
+
+int
+main (int argc, char **argv)
+{
+#ifdef HAVE_LIBCRYPT
+  static const char* const OPTSTRING = "pcmVh";
+#else
+  static const char* const OPTSTRING = "pVh";
+#endif
+  int optc = 0;
+  int opt_index = 0;
+  Crypt_Type crypttype = NONE;
+  char *infile = NULL;
+  char *outfile = NULL;
+  struct option LONG_OPTIONS[] =
+    {
+      {"plaintext", no_argument, NULL, 'p'},
+#ifdef HAVE_LIBCRYPT
+      {"crypt",     no_argument, NULL, 'c'},
+      {"md5",       no_argument, NULL, 'm'},
+#endif
+      {"version",   no_argument, NULL, 'V'},
+      {"help",      no_argument, NULL, 'h'}, 
+      {0, 0, 0, 0}
+    };
+  
+  while ((optc = getopt_long (argc, argv, OPTSTRING, LONG_OPTIONS, &opt_index))
+	 != -1)
+    {
+      switch (optc)
+	{
+	case 'p':
+	  if (crypttype != NONE)
+	    usage (USAGE, 1);
+	  crypttype = PLAIN;
+	  break;
+
+	case 'c':
+	  if (crypttype != NONE)
+	    usage (USAGE, 1);
+	  crypttype = CRYPT;
+	  break;
+
+	case 'm':
+	  if (crypttype != NONE)
+	    usage (USAGE, 1);
+	  crypttype = MD5;
+	  break;
+
+	case 'V':
+	  printf ("%s %s\n", PROGRAM_NAME, VERSION);
+	  exit (0);
+	  break;
+
+	case 'h':
+	  usage (USAGE, 0);
+	  break;
+      
+	default:
+	  usage (USAGE, 1);
+	}
+    }
+
+  if ((crypttype == NONE) || (optind >= argc))
+    usage (USAGE, 1);
+  
+  infile = argv[optind++];
+  if (optind < argc)
+    {
+      outfile = argv[optind];
+    }
+  
+  srandom (time (NULL));
+  return process_file (infile, outfile, crypttype);
+}
diff -x CVS -uNr gnats/gnats/man/Makefile.in gnats.new/gnats/man/Makefile.in
--- gnats/gnats/man/Makefile.in	2004-06-09 15:36:34.000000000 -0500
+++ gnats.new/gnats/man/Makefile.in	1969-12-31 18:00:00.000000000 -0600
@@ -1,158 +0,0 @@
-# Makefile for GNU GNATS manual pages.
-# Copyright (C) 1993 Free Software Foundation, Inc.
-#
-# This file is part of GNU GNATS.
-#
-# GNU GNATS 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 GNATS 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 GNATS; see the file COPYING.  If not, write to
-# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
-
-srcdir = @srcdir@
-VPATH = @srcdir@
-
-GNATS_ROOT = @GNATS_ROOT@
-GNATS_SITE = @GNATS_SITE@
-
-prefix = @prefix@
-
-exec_prefix = @exec_prefix@
-bindir = @bindir@
-datadir = @datadir@
-
-datadir = @datadir@
-
-mandir = @mandir@
-man1dir = $(mandir)/man1
-man2dir = $(mandir)/man2
-man3dir = $(mandir)/man3
-man4dir = $(mandir)/man4
-man5dir = $(mandir)/man5
-man6dir = $(mandir)/man6
-man7dir = $(mandir)/man7
-man8dir = $(mandir)/man8
-man9dir = $(mandir)/man9
-man1ext = .1
-man5ext = .5
-man7ext = .7
-man8ext = .8
-infodir = @infodir@
-includedir = @includedir@
-
-SHELL = /bin/sh
-
-INSTALL = @INSTALL@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_DATA = @INSTALL_DATA@
-
-#### host, target, and site dependent makefile fragments come in here.
-###
-
-SRCS1=	edit-pr$(man1ext) query-pr$(man1ext)
-MAN1=	edit-pr.man query-pr.man
-SRCS5=  dbconfig$(man5ext) databases$(man5ext)
-MAN5=   dbconfig.man databases.man
-SRCS7=	gnats$(man7ext)
-MAN7=	gnats.man
-SRCS8=  mkcat$(man8ext) queue-pr$(man8ext) file-pr$(man8ext) rmcat$(man8ext) gen-index$(man8ext) gnatsd$(man8ext) mkdb$(man8ext) delete-pr$(man8ext) pr-edit$(man8ext)
-MAN8 =	mkcat.man queue-pr.man file-pr.man rmcat.man gen-index.man gnatsd.man mkdb.man delete-pr.man pr-edit.man
-
-DISTFILES = Makefile.in $(MAN1) $(MAN7) $(MAN8)
-
-all: @GNATS_ALL@
-
-all-gnats gnats-man-pages: $(SRCS1) $(SRCS5) $(SRCS7) $(SRCS8)
-all-tools tools-man-pages: $(SRCS1)
-
-.PHONY: check
-check:
-
-$(SRCS1): ../Makefile $(MAN1)
-	@echo Creating $@...
-	@file=`echo $@ | sed -e 's,\$(man1ext),,'` ; \
-	sed -e 's,xGNATS_ROOTx,$(GNATS_ROOT),g' \
-	    -e 's,xGNATS_SITEx,$(GNATS_SITE),g' \
-	    -e 's,@BINDIR@,$(bindir),g' \
-	    -e 's,@PREFIX@,$(prefix),g' \
-	    -e 's,@VERSION@,$(VERSION),g' $(srcdir)/$$file.man > tmp-$@
-	@mv tmp-$@ $@
-
-$(SRCS5): ../Makefile $(MAN5)
-	@echo Creating $@...
-	@file=`echo $@ | sed -e 's,\$(man5ext),,'` ; \
-	sed -e 's,xGNATS_ROOTx,$(GNATS_ROOT),g' \
-	    -e 's,xGNATS_SITEx,$(GNATS_SITE),g' \
-	    -e 's,@BINDIR@,$(bindir),g' \
-	    -e 's,@PREFIX@,$(prefix),g' \
-	    -e 's,@VERSION@,$(VERSION),g' $(srcdir)/$$file.man > tmp-$@
-	@mv tmp-$@ $@
-
-$(SRCS7): ../Makefile $(MAN7)
-	@echo Creating $@...
-	@file=`echo $@ | sed -e 's,\$(man7ext),,'` ; \
-	sed -e 's,xGNATS_ROOTx,$(GNATS_ROOT),g' \
-	    -e 's,xGNATS_SITEx,$(GNATS_SITE),g' \
-	    -e 's,@DATADIR@,$(datadir),g' \
-	    -e 's,@VERSION@,$(VERSION),g' $(srcdir)/$$file.man > tmp-$@
-	@mv tmp-$@ $@
-
-$(SRCS8): ../Makefile $(MAN8)
-	@echo Creating $@...
-	@file=`echo $@ | sed -e 's,\$(man8ext),,'` ; \
-	sed -e 's,xGNATS_ROOTx,$(GNATS_ROOT),g' \
-	    -e 's,xGNATS_SITEx,$(GNATS_SITE),g' \
-	    -e 's,@DATADIR@,$(datadir),g' \
-	    -e 's,@VERSION@,$(VERSION),g' $(srcdir)/$$file.man > tmp-$@
-	@mv tmp-$@ $@
-
-info install-info clean-info:
-dvi:
-TAGS:
-
-mostlyclean: force
-	rm -f $(SRCS1) $(SRCS5) $(SRCS7) $(SRCS8)
-clean: mostlyclean
-distclean: clean
-	rm -f Makefile
-realclean: distclean
-
-install: @GNATS_INSTALL@
-
-install-gnats install-gnats-man: all-gnats install-tools
-	for i in $(SRCS5); do \
-	    $(INSTALL_DATA) $$i $(DESTDIR)$(man5dir)/$$i; \
-	done
-	for i in $(SRCS7); do \
-	    $(INSTALL_DATA) $$i $(DESTDIR)$(man7dir)/$$i; \
-	done
-	for i in $(SRCS8); do \
-	    $(INSTALL_DATA) $$i $(DESTDIR)$(man8dir)/$$i; \
-	done
-
-install-tools install-tools-man: all-tools
-	for i in $(SRCS1); do \
-	    $(INSTALL_DATA) $$i $(DESTDIR)$(man1dir)/$$i; \
-	done
-
-uninstall:
-	-for i in $(SRCS1); do rm -f $(DESTDIR)$(man1dir)/$$i; done
-	-for i in $(SRCS5); do rm -f $(DESTDIR)$(man5dir)/$$i; done
-	-for i in $(SRCS7); do rm -f $(DESTDIR)$(man7dir)/$$i; done
-	-for i in $(SRCS8); do rm -f $(DESTDIR)$(man8dir)/$$i; done
-
-force:
-dist:
-
-# Prevent GNU make v3 from overflowing arg limit on SysV.
-.NOEXPORT:
-Makefile: $(srcdir)/Makefile.in
-	cd .. && $(SHELL) config.status
diff -x CVS -uNr gnats/gnats/man/databases.man gnats.new/gnats/man/databases.man
--- gnats/gnats/man/databases.man	2000-02-23 00:10:40.000000000 -0600
+++ gnats.new/gnats/man/databases.man	1969-12-31 18:00:00.000000000 -0600
@@ -1,85 +0,0 @@
-.\" Copyright (c) 1993, 2000 Free Software Foundation, Inc.
-.\" See section COPYING for conditions for redistribution
-.TH databases 5 "January 2000" "GNATS @VERSION@" "GNATS configuration files"
-.de BP
-.sp
-.ti -.2i
-\(**
-..
-.SH NAME
-databases \- the known set of GNATS databases
-.SH DESCRIPTION
-\fBdatabases\fR contains a list of database names and their associated
-parameters.  It it used by the GNATS clients to determine the location
-of a database referred to by name.  It is located by default in
-@PREFIX@/share/gnats/databases.
-.P
-\fBdatabases\fR consists of one or more lines containing at least
-three colon-separated fields:
-.P
-.RS
-default\:The default database\:/the/directory
-.RE
-.P
-Lines beginning with a # are ignored.
-.P
-The first field is the database name, which is the string passed to
-the --database option or specified via the GNATSDB environment
-variable.  The second field is a short human-readable description of
-the database contents.  The final field is the directory where the
-database contents are kept.
-.P
-It may also contain one or two additional fields describing the
-network location of the database:
-.P
-.RS
-network\:Network db\:\:gnats.foo.com\:1234
-.RE
-.P
-The last two options describe the hostname and port of the server where
-\fBgnatsd\fR is running.
-.P
-Both a directory and a server/port may be present.  In this case
-\fBgnatsd\fR uses the directory field to determine where the database
-contents are located, while the clients use the server/port
-information to connect to \fBgnatsd\fR.
-.P
-The database name \fBdefault\fR is special; this is the entry used if
-no database name is specified via a --database option or the
-\fBGNATSDB\fR environment variable.
-.SH "SEE ALSO"
-.I Keeping Track: Managing Messages With GNATS
-(also installed as the GNU Info file
-.BR gnats.info )
-and
-.I Reporting Problems Using send-pr
-(also installed as the GNU Info file
-.BR send-pr.info ).
-.LP
-.BR gnats (7),
-.BR send-pr (1),
-.BR edit-pr (1),
-.BR delete-pr (8),
-.BR query-pr (1),
-.BR file-pr (8),
-.BR queue-pr (8),
-.BR gen-index (8),
-.BR mkcat (8),
-.BR mkdb (8).
-.SH COPYING
-Copyright (c) 1993, 2000 Free Software Foundation, Inc.
-.PP
-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.
-.PP
-Permission is granted to copy and distribute modified versions of this
-manual under the conditions for verbatim copying, provided that the
-entire resulting derived work is distributed under the terms of a
-permission notice identical to this one.
-.PP
-Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that this permission notice may be included in
-translations approved by the Free Software Foundation instead of in
-the original English.
diff -x CVS -uNr gnats/gnats/man/dbconfig.man gnats.new/gnats/man/dbconfig.man
--- gnats/gnats/man/dbconfig.man	2000-03-09 22:49:29.000000000 -0600
+++ gnats.new/gnats/man/dbconfig.man	1969-12-31 18:00:00.000000000 -0600
@@ -1,556 +0,0 @@
-'\" t
-.\" Copyright (c) 2000 Free Software Foundation, Inc.
-.\" See section COPYING for conditions for redistribution
-.TH dbconfig 5 "January 2000" "GNATS @VERSION@" "GNATS Admininstration Files"
-.SH NAME
-dbconfig \- GNATS database configuration file
-.SH DESCRIPTION
-The dbconfig configuration file is, oddly enough, used to control
-the configuration of a GNATS database.  Each database has its own
-individual copy of the file, which is located in the \fBgnats-adm\fR
-administrative subdirectory of the database.
-.P
-The file contains 6 major sections, which must appear in this order:
-.P
-.RS 0.5i
-.br
-Overall database configuration
-.br
-Individual field configuration
-.br
-Named query definitions
-.br
-Audit-trail and outgoing email formats
-.br
-Index file description
-.br
-Initial \fIPR\fR input fields
-.RE
-.P
-Individual descriptions of each section will appear below.  (It is
-helpful to refer to the supplied default configuration, which contains
-examples of most of the available configuration options.)
-.P
-It is very helpful if the administrator has a reasonably good
-understanding of the overall GNATS \fIPR\fR process before trying to
-create or edit a database configuration.
-.SH "FILE FORMAT"
-The file is a free-form ASCII file.  Whitespace is completely
-optional, and is ignored.  Braces ({}) are used to delimit sections
-within the file.  Non-keyword values must generally be surrounded with
-double quotes. Newline characters within double quotes must be
-proceeded with a backslash (`\\') character, and are not included in
-the final resulting string; to include a newline character in a value,
-use the \fB\\n\fR combination instead.
-.SH "Overall Database Configuration"
-The overall database options are controlled with the \fBdatabase-info\fR
-section:
-.P
-.RS 0.5i
-\fBdatabase-info\fR {
-.RS 0.25i
-[\fIoptions\fR]
-.RE
-}
-.RE
-The following options may be present:
-.TP
-\fBdebug-mode\fR \fItrue\fR|\fIfalse\fR
-If set to true, the database is placed into \fIdebug mode\fR.  This
-causes all outgoing email to be sent to the \fIgnats-admin\fR user
-listed in the \fBresponsible\fR adm file.
-.RS 0.5i
-.P
-The default value is \fIfalse\fR.
-.RE
-.TP
-\fBkeep-all-received-headers\fR \fItrue\fR|\fIfalse\fR
-If set to true, all of the Received: headers for \fIPR\fRs submitted via
-email are kept in the PR; otherwise, only the first one is kept.
-.RS 0.5i
-.P
-The default value is \fIfalse\fR.
-.RE
-.TP
-\fBnotify-about-expired-prs\fR \fItrue\fR|\fIfalse\fR
-If set to true, notification email about expired \fIPR\fRs is sent via
-the at-pr command.  Otherwise, required times for \fIPR\fR fixes
-are not used.
-.RS 0.5i
-.P
-The default value is \fIfalse\fR.
-.RE
-.TP
-\fBsend-submitter-ack\fR \fItrue\fR|\fIfalse\fR
-When new \fIPRs\fR are submitted to the database, an acknowledgement
-email will be sent to the submitter if \fBsend-submitter-ack\fR is set
-to true.  This is in addition to the normal notification mail to the
-person(s) responsible for the new \fIPR\fR.
-.RS 0.5i
-.P
-The default value is \fIfalse\fR.
-.RE
-.TP
-\fBlibexecdir\fR "\fIpath\fR"
-Used to specify the directory where the GNATS adminstrative
-executables can be found; in particular, \fBat\-pr\fR and
-\fBmail\-pr\fR are invoked from this directory.
-.RS 0.5i
-.P
-The default value is the empty string, which is unlikely to be useful.
-.RE
-.TP
-\fBbusiness-day-hours\fR \fIday-start\fR \- \fIday-end\fR
-Used to specify the hours that define a business day in 24-hour
-format; the times are inclusive.  A single dash separates the two
-values.  The values are used to determine if a \fIPR\fR required
-completion time has expired.
-.RS 0.5i
-.P
-The default values are 8 for \fIday-start\fR, and 17 for \fIday-end\fR.
-.RE
-.TP
-\fBbusiness-week-days\fR \fIweek-start\fR \- \fIweek-end\fR 
-
-Used to specify the start and ending days of the business week, where
-0 is Sunday, 1 is Monday, etc; the days are inclusive. These values
-are used to determine if a \fIPR\fR required completion time has
-expired.
-.RS 0.5i
-.P
-The default values are 1 for \fIweek-start\fR, and 5 for \fIweek-end\fR.
-.RE
-.TP
-\fBcreate-category-dirs\fR \fItrue\fR|\fIfalse\fR
-
-If set to true, database directories for categories are automatically
-created as needed; otherwise, they must be created manually (usually
-with the \fBmkcat\fR script).  It is suggested that the value be left
-to \fItrue\fR.
-.RS 0.5i
-.P
-The default value is \fItrue\fR.
-.RE
-
-.SH "Individual field configuration"
-Each field in a PR is described with a field entry. It has the general 
-structure
-.RS
-\fBfield\fR "\fIfieldname\fR" {
-.RS 0.25i
-\fBdescription\fR "\fIstring\fR"
-.br
-[ \fIfield-options\fR ... ]
-.br
-\fIdatatype\fR [ \fIdatatype-options\fR ... ]
-.br
-[ \fBon-change\fR { \fIedit-options\fR ... } ]
-.RE
-}
-.RE
-.P
-\fIfieldname\fR is used as the field header in the \fIPR\fR.  The
-\fB>\fR and \fB:\fR field markers should not be present in the name.
-.P
-The order in which the field configurations appear in the
-configuration file determines the order that they appear in the PR
-text.  There is no required order, unlike previous versions of GNATS;
-multitext and the Unformatted fields can appear anywhere in the PR.
-.P
-The following options may be present within the \fBfield\fR section:
-.TP
-\fBbuiltin-name\fR "\fRname\fR"
-Indicates that this field corresponds to one of the GNATS builtin
-fields.
-.RS
-.P
-GNATS has several fields which are required to be present in a
-\fIPR\fR, and this option is used to map their external descriptions
-to their internal usage.  The internal fieldnames are:
-.P
-.TS
-l l
-l l.
-\fBName	Meaning\fR
-number	The PR's unique numeric identifier
-category	The category that the PR falls into
-synopsis	The one-line description of the PR
-confidential	If "yes", the PR is confidential
-severity	How severe is the PR?
-priority	What's the PR's priority?
-responsible	Who's responsible for the PR?
-state	What's the frequency, Kenneth?
-submitter	The user that submitted the PR
-arrival-date	When did the PR arrive?
-last-modified	The date of the last PR modification
-audit-trail	The audit-trail of various changes to the PR
-.TE
-.P
-For these builtin fields, a matching field description must appear in
-the database configuration.  Otherwise, the configuration will be
-considered invalid, and errors will be generated from the GNATS
-clients and \fBgnatsd\fR.
-.RE
-.TP
-\fBdescription\fR "\fIdescription text\fR"
-A one-line human-readable description of the field.  Clients
-can use this string to describe the field in a help dialog; the
-string is returned from the \fBFDSC\fR command in \fBgnatsd\fR,
-and is also available via the \fB\-\-field-description\fR option
-in \fBquery\-pr\fR.
-.RS 0.5i
-.P
-This entry must be present in the field description; there is no default
-value.
-.RE
-.TP
-\fBquery-default\fR \fIexact-regexp\fR|\fIinexact-regexp\fR
-Used to specify the default type of searches performed on this field.
-This is used when the \fB^\fR search operator appears in a query, and
-is also used for queries in \fBquery\-pr\fR that use the old \fI\-\-field\fR
-query options.
-.RS 0.5i
-.P
-If the option is not given, the default search is \fIexact\-regexp\fR).
-.RE
-.TP
-\fBtextsearch\fR
-If this option is present, the field will be searched when the user
-performs a --text search from \fBquery-pr\fR.  The field is also
-flagged as a \fItextsearch\fR field in the set of field flags returned
-by the \fBFIELDFLAGS\fR command in \fBgnatsd\fR.
-.P
-.RS 0.5i
-By default, fields are not marked as \fItextsearch\fR fields.
-.RE
-.TP
-\fBread-only\fR
-The field contents may not be edited; they must be set when the PR
-is initially created.  In general, this should only be used for fields that
-are given internal values rather than fields supplied by the user.
-.P
-.RS 0.5i
-By default, fields are editable by the user.
-.RE
-.SH Field datatypes
-.TP
-\fIdatatype\fR [ \fIoptions\fR ... ]
-Describes the type of data to be stored in the field, and must be present
-in each field description.
-.P
-.RS
-The available datatypes are:
-.RE
-.TP
-\fBtext\fR [ \fBmatching\fR { "\fIregexp\fR" [ "\fIregexp\fR" ... ]  } ]
-The text datatype is the most commonly used type; it is a one-line
-text string.
-.P
-.RS
-If the \fBmatching\fR qualfifier is present, the data in the field
-must match at least one of the specified regexps.  Otherwise, no
-restriction is placed on what values may appear in the field.
-.P
-.RE
-.TP
-\fBmultitext\fR [ { \fBdefault\fR "\fIstring\fR" } ]
-The field can contain multiple lines of text.
-.P
-.RS
-If the \fBdefault\fR option is present, the field will default to the
-specified \fIstring\fR if the field is not given a value when the
-\fIPR\fR is initially created.  Otherwise, the field will be left
-empty.
-.RE
-.ne 8
-.TP
-\fBenum\fR {
-.RS 0.25i
-\fBvalues\fR {
-.RS 0.25i
-"\fIstring\fR" [ "\fIstring\fR" ... ]
-.RE
-}
-.br
-[ \fBdefault\fR "\fIstring\fR" ] 
-.RE
-}
-.P
-.RS
-Defines an enumerated field, where the value in the PR field must
-match an entry from a list of specified values.  
-.P
-The list of allowed values is given with the \fBvalues\fR option,
-which must be present.
-.P
-If a \fBdefault\fR option is present, it is used to determine the
-initial value of the field if no entry for the field appears in an
-initial PR (or if the value in the initial PR is not one of the
-acceptable values).  However, the value in the \fBdefault\fR
-statement is not required to be one of the accepted values; this can
-be used to allow the field to be initially empty, for example.
-.P
-If no \fBdefault\fR option is specified, the default value for the
-field is the first value in the \fBvalues\fR section.
-.RE
-.TP
-\fBmultienum\fR {
-.RS 0.25i
-\fBvalues\fR {
-.RS 0.25i
-"\fIstring\fR" [ "\fIstring\fR" ... ]
-.RE
-}
-.br
-[ \fBseparators\fR "\fIstring\fR" ]
-.br
-[ \fBdefault\fR "\fIstring\fR" ] 
-.RE
-}
-.P
-.RS
-The \fBmultienum\fR datatype is similar to the \fBenum\fR datatype,
-except that the field can contain multiple values, separated by one or
-more characters from the \fIseparators\fR list.
-.P
-If no \fBseparators\fR option is present, the default separators are
-space (` ') and colon (':').
-.RE
-.ne 8
-.TP
-\fBenumerated-in-file\fR {
-.RS 0.25i
-\fBpath\fR "\fIfilename\fR"
-.br
-\fBfields\fR {
-.RS 0.25i
-"\fIname\fR" [ "\fIname\fR" ... ]
-.RE
-} \fBkey\fR "\fIname\fR"
-.br
-[ \fBallow-any-value\fR ]
-.RE
-}
-.RS
-The \fBenumerated-in-file\fR type is used to describe an enumerated
-field with an associated \fIadministrative file\fR, which lists the
-legal values for the field, and may optionally contain additional
-fields that can be examined by query clients or used for other
-internal purposes.  It is similar to the \fBenum\fR datatype, except
-that the list of legal values is stored in a separate file.
-.P
-\fIfilename\fR is the name of a file in the \fBgnats-adm\fR administrative
-directory for the database.
-.P
-The format of the administrative file is a simple ASCII text file.
-Fields within the file are separated with colons (`:').  Lines
-beginning with an octothorpe ('#') are ignored as comments.  Records
-within the file are separated with newlines.
-.P
-The \fBfield\fR option is used to name the fields in the
-administrative file. There must be at least one field, which is used
-to list the legal values for the field.  If the administrative file is
-empty (or does not contain any non-empty non-comment lines) then the
-PR field must be empty.
-.P
-The \fBkey\fR option is used to designate which field in the
-administrative file should be used to list the legal values for the PR
-field.  The value must match one of the field names in the \fBfield\fR
-option.
-.P
-If the \fBallow-any-value\fR option is present, then the value of the
-PR field is not required to appear in the administrative file; any
-value will be accepted.
-.RE
-.TP
-\fBdate\fR
-The date datatype is used to hold dates.  Date fields may be empty, or
-must contain a correctly-formatted date.
-.P
-.RS
-No defaults or other options are available.  The field is left empty if
-no value for the field is given in the initial PR.
-.RE
-.TP
-\fBinteger\fR [ { \fBdefault\fR "\fIinteger\fR" } ]
-Integer fields are used to hold numbers.  They may be empty, or must
-contain a value composed entirely of digits, with an optional leading
-sign.
-.P
-.RS
-If the \fBdefault\fR option is present, the field will have the
-value of \fIinteger\fR if the field is not given a value when the
-\fIPR\fR is initially created.  Otherwise, the field will be left
-empty.
-.RE
-.SH "Edit controls"
-The \fBon-change\fR section is used to specify one or more actions
-to be performed when the field value is edited by the user.  It
-has the general form
-.RS
-\fBon-change\fR [ "\fIquery-expression\fR" ] {
-.P
-.RS 0.25i
-[ \fBadd-audit-trail\fR ]
-.P
-[ \fBaudit-trail-format {
-.RS 0.25i
-\fBformat\fR "\fIformatstring\fR"
-.br
-[ fields { "\fIfieldname\fR" ... } ]
-.RE
-} ]
-.P
-[ \fBrequire-change-reason\fR ]
-.P
-[ \fBset-field\fR|\fBappend-to-field\fR "\fIfieldname\fR" {
-.RS 0.25i
-"\fIformat-string\fR" [ \fIfieldlist\fR ]
-.RE
-} ]
-.RE
-}
-.RE
-.P
-The optional \fIquery-expression\fR controls whether or not the
-actions in the \fBon-change\fR section are taken.  If the expression
-fails to match, the actions are skipped.
-.P
-The \fBadd-audit-trail\fR option indicates that an entry should be
-appended to the builtin audit-trail field when this field is changed.
-The format of the entry is controlled by the optional
-\fBaudit-trail-format\fR section within the field, or by the global
-\fBaudit-trail-format\fR section.  (See the \fBAudit-trail and
-outgoing email formats\fR section for more information.)
-.P
-The \fBrequire-change-reason\fR option specifies that a change reason
-must be present in the PR when this field is edited.  This option only
-makes sense if an audit-trail entry is required, as the change reason
-is otherwise unused.
-.P
-The \fBset-field\fR and \fBappend-to-field\fR options are used to
-change the value of the field \fIfieldname\fR in the PR.  The supplied
-\fBformat\fR is used to format the value that will be placed in the
-field (for more information, see the \fBAudit-trail and outgoing email
-formats\fR section of this manual).  \fBappend-to-field\fR appends the
-resulting formatted string to the existing field contents, while
-\fBset-field\fR completely replaces the contents.
-.P
-Any field may be edited by the \fBset-field\fR or
-\fBappend-to-field\fR option (the \fBread-only\fR option on a field is
-ignored).  However, the changes are subject to the usual field content
-checks.
-.P
-There is a global \fBon-change\fR section that is executed once for
-each \fIPR\fR edit.
-.SH "Named query definitions"
-When queries are performed via \fBquery\-pr\fR, they can refer to
-a query format described via the \fBquery\fR section:
-.RS
-\fBquery\fR "\fIqueryname\fR" {
-.RS 0.25i
-\fBformat\fR "\fIformatstring\fR"
-.br
-[ \fBfields\fR { "\fIfieldname\fR" [ "\fIfieldname\fR" ... ] } ]
-.RE
-}
-.RE
-\fIformatstring\fR is as described in the \fBquery-pr\fR(1) manpage;
-it contains a string with \fBprintf\fR(3)-like % escapes.  The output
-of the query is then formatted as specified by the format string.
-.P
-The \fBfields\fR option lists the fields to be used with the
-\fBformat\fR string.  If the \fBfields\fR option is present without a
-\fBformat\fR option is, then the listed fields are printed out as just
-their contents separated by newlines.
-.P
-The named query formats \fIfull\fR, \fIstandard\fR and \fIsummary\fR
-must be present in the database configuration. \fBfull\fR and
-\fBsummary\fR correspond to the \fBquery\-pr\fR options \fB--full\fR
-and \fB--summary\fR, while \fIstandard\fR is used when no format
-option is given to \fBquery\-pr\fR.
-.SH "Audit-trail and outgoing email formats"
-These formats are smilar to the named query formats, but they include
-more options.  They are used for formatting audit-trail entries and
-for outgoing email messages.
-.P
-There is currently only one audit-trail format, defined by the
-\fBaudit-trail-format\fR option:
-.RS
-\fBaudit-trail-format\fR {
-.RS 0.25i
-\fBformat\fR "\fIformatstring\fR"
-.br
-[\fBfields\fR { "\fIfieldname\fR" [ "\fIfieldname\fR" ... ] } ]
-.RE
-}
-.RE
-For those fields that require an audit-trail entry, the audit-trail
-text to be appended is formatted as described by this format.  The
-per-field \fBaudit-trail-format\fR is used in preference to this one,
-if it exists.
-.P
-\fIformatstring\fR and \fIfieldname\fR are similar to those used by
-the named query format.  \fIfieldname\fR may also be a \fIformat
-parameter\fR, which is a context-specific value.  [Format parameters
-are distinguished from fieldnames by a leading dollarsign (`$').]
-.P
-The following format parameters are defined for
-\fBaudit-trail-format\fR entries:
-.TP
-\fB$FieldName\fR
-The name of the field for which an audit-trail entry is being created.
-.TP
-\fB$OldValue\fR
-The old value of the field.
-.TP
-\fB$NewValue\fR
-The new field value.
-.TP
-\fB$EditUserEmailAddr\fR
-The email address of the user editing the field.
-.TP
-\fB$CurrentDate\fR
-The current date.
-.TP
-\fB$ChangeReason\fR
-The reason for the change; may be blank if no reason was supplied.
-.P
-These parameters may be used anywhere a \fIfieldname\fR can appear.
-
-
-.SH "SEE ALSO"
-.I Keeping Track: Managing Messages With GNATS
-(also installed as the GNU Info file
-.BR gnats.info )
-and
-.I Reporting Problems Using send-pr
-(also installed as the GNU Info file
-.BR send-pr.info ).
-.LP
-.BR gnats (7),
-.BR send-pr (1),
-.BR edit-pr (1),
-.BR query-pr (1),
-.BR file-pr (8),
-.BR queue-pr (8),
-.BR rmcat (8),
-.BR gen-index (8),
-.BR mkcat (8).
-.SH COPYING
-Copyright (c) 2000 Free Software Foundation, Inc.
-.PP
-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.
-.PP
-Permission is granted to copy and distribute modified versions of this
-manual under the conditions for verbatim copying, provided that the
-entire resulting derived work is distributed under the terms of a
-permission notice identical to this one.
-.PP
-Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that this permission notice may be included in
-translations approved by the Free Software Foundation instead of in
-the original English.
diff -x CVS -uNr gnats/gnats/man/delete-pr.man gnats.new/gnats/man/delete-pr.man
--- gnats/gnats/man/delete-pr.man	1999-12-30 22:19:21.000000000 -0600
+++ gnats.new/gnats/man/delete-pr.man	1969-12-31 18:00:00.000000000 -0600
@@ -1,116 +0,0 @@
-.\" Copyright (c) 1999 Free Software Foundation, Inc.
-.\" See section COPYING for conditions for redistribution
-.TH delete-pr 8 "December 1999" "GNATS @VERSION@" "GNATS Admininstration Utilities"
-.de BP
-.sp
-.ti -.2i
-\(**
-..
-.SH NAME
-delete\-pr \- deletes closed PRs
-.SH SYNOPSIS
-.hy 0
-.na
-.TP
-.B delete\-pr
-[
-.B \-V 
-|
-.B \-\-version
-]
-|
-[
-.B \-h
-|
-.B \-\-help
-]
-|
-.br
-[
-.BI -d \ name
-|
-.BI --database= name
-]
-.BR \-c\  | \ \-\-closed\  | \ PR
-.ad b
-.hy 1
-.SH DESCRIPTION
-Deletes the specified
-.BR PR ,
-or if the \fB\-\-closed\fR option is given, all of the closed \fIPR\fRs in the
-database are deleted.
-.P
-\fBdelete\-pr\fR must be run as @GNATS_USER@.
-.P
-Deleting PRs on a regular basis is generally a bad idea, because they
-contain useful historical state that would be lost.
-.SH OPTIONS
-.TP
-.B \-V\fR,\fB \-\-version
-Prints the program version to stdout and exits.
-.TP
-.B \-h\fR,\fB \-\-help
-Prints a short help text to stdout and exits.
-.TP
-.B \-d\fR,\fB \-\-database
-Specifies the database from which the PR(s) are to be deleted.  If no
-database is specified, the database named \fIdefault\fR is assumed.
-This option overrides the database specified in the \fBGNATSDB\fR
-environment variable.
-.TP
-.B \-\-closed
-Requests that all closed PRs in the database be deleted.
-.TP
-.B PR
-Requests that the specified \fBPR\fR be deleted.  The \fBPR\fR must be
-in a closed state.
-.SH ENVIRONMENT VARIABLES
-The \fBGNATSDB\fR environment variable is used to determine which database to
-use.  For a local database, it contains the name of the database to access.
-.P
-For network access via \fIgnatsd\fR, it contains a colon-separated list
-of strings that describe the remote database, in the form
-.TP
-\fIserver\fR:\fIport\fR:\fIdatabasename\fR:\fIusername\fR:\fIpassword\fR
-.P
-Any of the fields may be omitted, but at least one colon must appear;
-otherwise, the value is assumed to be the name of a local database.
-.P
-If \fBGNATSDB\fR is not set and the --database option is not supplied,
-it is assumed that the database is local and that its name is
-\fIdefault\fR.
-.SH "SEE ALSO"
-.I Keeping Track: Managing Messages With GNATS
-(also installed as the GNU Info file
-.BR gnats.info )
-and
-.I Reporting Problems Using send-pr
-(also installed as the GNU Info file
-.BR send-pr.info ).
-.LP
-.BR gnats (7),
-.BR send-pr (1),
-.BR edit-pr (1),
-.BR query-pr (1),
-.BR file-pr (8),
-.BR queue-pr (8),
-.BR rmcat (8),
-.BR gen-index (8),
-.BR mkcat (8).
-.SH COPYING
-Copyright (c) 1999 Free Software Foundation, Inc.
-.PP
-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.
-.PP
-Permission is granted to copy and distribute modified versions of this
-manual under the conditions for verbatim copying, provided that the
-entire resulting derived work is distributed under the terms of a
-permission notice identical to this one.
-.PP
-Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that this permission notice may be included in
-translations approved by the Free Software Foundation instead of in
-the original English.
diff -x CVS -uNr gnats/gnats/man/edit-pr.man gnats.new/gnats/man/edit-pr.man
--- gnats/gnats/man/edit-pr.man	2000-01-22 23:35:38.000000000 -0600
+++ gnats.new/gnats/man/edit-pr.man	1969-12-31 18:00:00.000000000 -0600
@@ -1,154 +0,0 @@
-.\" Copyright (c) 1993, 1999 Free Software Foundation, Inc.
-.\" See section COPYING for conditions for redistribution
-.\" edit-pr, editing function for GNATS - Jeffrey Osier
-.TH edit-pr 1 "December 1999" "GNATS @VERSION@" "GNATS User Utilities"
-.de BP
-.sp
-.ti -.2i
-\(**
-..
-.SH NAME
-edit-pr \- edit a problem report in the GNATS database
-.SH SYNOPSIS
-.hy 0
-.na
-.B edit-pr 
-[
-.B -h 
-| 
-.B --help
-]
-[
-.B -V 
-| 
-.B --version
-]
-[
-.BI -H \ host
-|
-.BI --host= host
-]
-[
-.BI -P \ port
-|
-.BI --port= port
-]
-[
-.BI -v \ user
-|
-.BI --user= user
-]
-[
-.BI -w \ password
-|
-.BI --passwd= password
-]
-[
-.BI -d \ databasename
-|
-.BI --database= databasename
-]
-.I gnats-id
-.ad b
-.hy 1
-.SH DESCRIPTION
-Calls 
-.B $EDITOR
-on 
-.IR gnats-id ; 
-when finished editing, refiles 
-.I gnats-id
-in the 
-.B GNATS
-database, updating the index and sending mail to relevant parties.
-.SH OPTIONS
-.TP 1i
-.B -h\fR,\fB --help
-Prints a brief usage message for
-.BR edit-pr .
-.TP
-.B -V\fR,\fB --version
-Prints the version number for
-.BR edit-pr .
-.TP
-.B -d\fR,\fB --database
-Specifies the database containing the PR to be edited; if no database is
-specified, the database named \fIdefault\fR is assumed.  This option
-overrides the database specified in the \fBGNATSDB\fR environment variable.
-.SS
-GNATS network options:
-.TP
-.B -H\fR,\fB --host
-Hostname of the GNATS server.
-.TP
-.B -P\fR,\fB --port
-The port that the GNATS server runs on.
-.TP
-.B -v\fR,\fB --username
-Username used to log into the GNATS server.
-.TP
-.B -w\fR,\fB --passwd
-Password used to log into the GNATS server.
-.B
-.SH ENVIRONMENT VARIABLES
-The \fBGNATSDB\fR environment variable is used to determine which database to
-use.  For a local database, it contains the name of the database to access.
-.P
-For network access via \fIgnatsd\fR, it contains a colon-separated list
-of strings that describe the remote database, in the form
-.TP
-\fIserver\fR:\fIport\fR:\fIdatabasename\fR:\fIusername\fR:\fIpassword\fR
-.P
-Any of the fields may be omitted, but at least one colon must appear;
-otherwise, the value is assumed to be the name of a local database.
-.P
-If \fBGNATSDB\fR is not set, it is assumed that the database is local
-and that its name is \fIdefault\fR.
-.SH FILES
-.TP 1i
-.B /tmp/ep$$
-Temporary file for PR being edited.
-.TP
-.B /tmp/ed_pr_ch$$
-Holds 
-.B >Audit-Trail:
-change message, if needed.
-.TP
-.B /tmp/u$$
-Holds output of lock function.
-.SH "SEE ALSO"
-.I Keeping Track: Managing Messages With GNATS
-(also installed as the GNU Info file
-.BR gnats.info )
-and
-.I Reporting Problems Using send-pr
-(also installed as the GNU Info file
-.BR send-pr.info ).
-.LP
-.BR gnats (7),
-.BR send-pr (1),
-.BR query-pr (1),
-.BR delete-pr (8),
-.BR file-pr (8),
-.BR queue-pr (8),
-.BR mkcat (8),
-.BR rmcat (8),
-.BR gen-index (8),
-.BR mkdb (8).
-.SH COPYING
-Copyright (c) 1993 Free Software Foundation, Inc.
-.PP
-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.
-.PP
-Permission is granted to copy and distribute modified versions of this
-manual under the conditions for verbatim copying, provided that the
-entire resulting derived work is distributed under the terms of a
-permission notice identical to this one.
-.PP
-Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that this permission notice may be included in
-translations approved by the Free Software Foundation instead of in
-the original English.
diff -x CVS -uNr gnats/gnats/man/file-pr.man gnats.new/gnats/man/file-pr.man
--- gnats/gnats/man/file-pr.man	1999-12-30 22:19:21.000000000 -0600
+++ gnats.new/gnats/man/file-pr.man	1969-12-31 18:00:00.000000000 -0600
@@ -1,149 +0,0 @@
-.\" Copyright (c) 1993, 1999 Free Software Foundation, Inc.
-.\" See section COPYING for conditions for redistribution
-.TH file-pr 8 "December 1999" "GNATS @VERSION@" "GNATS Internal Utilities"
-.de BP
-.sp
-.ti -.2i
-\(**
-..
-.SH NAME
-file-pr \- files incoming problem reports in GNATS database
-.SH SYNOPSIS
-.hy 0
-.na
-.B file\-pr
-[
-.B \-f \fIfile\fB 
-| 
-.B \-\-file=\fIfile\fB
-]
-[
-.B \-h 
-| 
-.B \-\-help
-]
-.br
-[
-.B \-V 
-| 
-.B \-\-version
-]
-[
-.BI -H \ host
-|
-.BI --host= host
-]
-.br
-[
-.BI -P \ port
-|
-.BI --port= port
-]
-[
-.BI -v \ user
-|
-.BI --user= user
-]
-.br
-[
-.BI -w \ password
-|
-.BI --passwd= password
-]
-.br
-[
-.BI -d \ databasename
-|
-.BI --database= databasename
-]
-
-.ad b
-.hy 1
-.SH DESCRIPTION
-Files incoming bug reports in the 
-.B GNATS
-database.  Sends mail to appropriate people.  Logs database activity.
-.SH OPTIONS
-.TP
-.B \-f \fIfile\fB, \-\-filename=\fIfile\fB
-Accept
-.I file
-as input; if this option is not present, standard input is used.
-.TP
-.B \-h, \-\-help
-Display usage summary for
-.BR file\-pr .
-.TP
-.B \-V, \-\-version
-Display version number for
-.BR file\-pr .
-.TP
-.B -d\fR,\fB --database
-Specifies the database to which the PR is to be submitted.  If no
-database is specified, the database named \fIdefault\fR is assumed.
-This option overrides the database specified in the \fBGNATSDB\fR
-environment variable.
-.SS
-GNATS network options:
-.TP
-.B -H\fR,\fB --host
-Hostname of the GNATS server.
-.TP
-.B -P\fR,\fB --port
-The port that the GNATS server runs on.
-.TP
-.B -v\fR,\fB --username
-Username used to log into the GNATS server.
-.TP
-.B -w\fR,\fB --passwd
-Password used to log into the GNATS server.
-.SH ENVIRONMENT VARIABLES
-The \fBGNATSDB\fR environment variable is used to determine which database to
-use.  For a local database, it contains the name of the database to access.
-.P
-For network access via \fIgnatsd\fR, it contains a colon-separated list
-of strings that describe the remote database, in the form
-.TP
-\fIserver\fR:\fIport\fR:\fIdatabasename\fR:\fIusername\fR:\fIpassword\fR
-.P
-Any of the fields may be omitted, but at least one colon must appear;
-otherwise, the value is assumed to be the name of a local database.
-.P
-If \fBGNATSDB\fR is not set, it is assumed that the database is local
-and that its name is \fIdefault\fR.
-.SH "SEE ALSO"
-.I Keeping Track: Managing Messages With GNATS
-(also installed as the GNU Info file
-.BR gnats.info )
-and
-.I Reporting Problems Using send-pr
-(also installed as the GNU Info file
-.BR send-pr.info ).
-.LP
-.BR gnats (7),
-.BR send-pr (1),
-.BR query-pr (1),
-.BR edit-pr (1),
-.BR delete-pr (8),
-.BR queue-pr (8),
-.BR mkcat (8),
-.BR rmcat (8),
-.BR gen-index (8),
-.BR mkdb (8).
-.SH COPYING
-Copyright (c) 1993, 1999 Free Software Foundation, Inc.
-.PP
-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.
-.PP
-Permission is granted to copy and distribute modified versions of this
-manual under the conditions for verbatim copying, provided that the
-entire resulting derived work is distributed under the terms of a
-permission notice identical to this one.
-.PP
-Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that this permission notice may be included in
-translations approved by the Free Software Foundation instead of in
-the original English.
diff -x CVS -uNr gnats/gnats/man/gen-index.man gnats.new/gnats/man/gen-index.man
--- gnats/gnats/man/gen-index.man	1999-12-30 22:19:21.000000000 -0600
+++ gnats.new/gnats/man/gen-index.man	1969-12-31 18:00:00.000000000 -0600
@@ -1,124 +0,0 @@
-.\" Copyright (c) 1993 Free Software Foundation, Inc.
-.\" See section COPYING for conditions for redistribution
-.TH gen-index 8 "October 1993" "GNATS @VERSION@" "GNATS Administration Utilities"
-.de BP
-.sp
-.ti -.2i
-\(**
-..
-.SH NAME
-gen-index \- build an index to current GNATS database
-.SH SYNOPSIS
-.hy 0
-.na
-.B gen\-index
-.RS
-[
-.B -n
-|
-.B --numeric
-]
-[
-.B -h
-|
-.B --help
-]
-.br
-[
-.B -o
-.I outfile
-|
-.BI --outfile= outfile
-]
-.br
-[
-.B -d
-.I databasename
-|
-.BI --database= databasename
-]
-.br
-[
-.B -V
-|
-.B --version
-]
-.ad b
-.hy 1
-.SH DESCRIPTION
-Builds an index for the specified
-.B GNATS
-database. The index is printed to standard output by default.
-.SH OPTIONS
-.TP 0.5i
-.B -n, --numeric
-Sorts index entries numerically rather than by their order in the
-.B `categories'
-list.
-.TP
-.B -d \fIdatabasename\fB, --database=\fIdatabasename\fR
-Specifies the database to be indexed.  If no database is specified,
-the database named \fIdefault\fR is assumed.  This option overrides
-the database specified in the \fBGNATSDB\fR environment variable.
-.TP
-.B -o \fIoutfile\fB, --outfile=\fIoutfile\fR
-Prints the index to 
-.I outfile
-rather than to the standard output.
-.TP
-.B -h, --help
-Prints usage for 
-.BR gen\-index .
-.TP
-.B -V, --version
-Prints the version number of
-.BR gen\-index .
-.SH ENVIRONMENT VARIABLES
-The \fBGNATSDB\fR environment variable is used to determine which database to
-use.  For a local database, it contains the name of the database to access.
-.P
-For network access via \fIgnatsd\fR, it contains a colon-separated list
-of strings that describe the remote database, in the form
-.TP
-\fIserver\fR:\fIport\fR:\fIdatabasename\fR:\fIusername\fR:\fIpassword\fR
-.P
-Any of the fields may be omitted, but at least one colon must appear;
-otherwise, the value is assumed to be the name of a local database.
-.P
-If \fBGNATSDB\fR is not set, it is assumed that the database is local
-and that its name is \fIdefault\fR.
-.SH "SEE ALSO"
-.I Keeping Track: Managing Messages With GNATS
-(also installed as the GNU Info file
-.BR gnats.info )
-and
-.I Reporting Problems Using send-pr
-(also installed as the GNU Info file
-.BR send-pr.info ).
-.LP
-.BR gnats (7),
-.BR send-pr (1),
-.BR edit-pr (1),
-.BR query-pr (1),
-.BR file-pr (8),
-.BR queue-pr (8),
-.BR mkdb (8),
-.BR mkcat (8),
-.BR rmcat (8).
-.SH COPYING
-Copyright (c) 1993 Free Software Foundation, Inc.
-.PP
-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.
-.PP
-Permission is granted to copy and distribute modified versions of this
-manual under the conditions for verbatim copying, provided that the
-entire resulting derived work is distributed under the terms of a
-permission notice identical to this one.
-.PP
-Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that this permission notice may be included in
-translations approved by the Free Software Foundation instead of in
-the original English.
diff -x CVS -uNr gnats/gnats/man/gnats.man gnats.new/gnats/man/gnats.man
--- gnats/gnats/man/gnats.man	2000-03-09 22:49:29.000000000 -0600
+++ gnats.new/gnats/man/gnats.man	1969-12-31 18:00:00.000000000 -0600
@@ -1,256 +0,0 @@
-.\" -*- nroff -*-
-.\" ---------------------------------------------------------------------------
-.\"    man page for GNATS (by Heinz G. Seidl, hgs@cygnus.com)
-.\"    updated April 1993 for GNATS @VERSION@ by Jeffrey Osier, jeffrey@cygnus.com
-.\"
-.\"    This file is part of the GNU Problem Report Management System (GNATS)
-.\"    Copyright 1993 Cygnus Support
-.\"
-.\"    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 Library General Public
-.\"    License along with this program; if not, write to the Free
-.\"    Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA
-.\"
-.\" ---------------------------------------------------------------------------
-.\" 
-.TH gnats 7 "December 1999" "GNATS @VERSION@" "Problem Report Management System"
-.SH NAME
-gnats \- Problem Report Management System
-.SH DESCRIPTION
-.B GNATS
-is a bug-tracking tool designed for use at a central support site.
-Software users who experience problems use electronic mail to
-communicate these problems to the the maintainers of that software;
-.B GNATS
-partially automates the tracking of these problems by:
-.TP
-.B \(bu
-organizing problem reports into a database and notifying responsible
-parties of suspected bugs;
-.TP
-.B \(bu
-allowing support personnel and their managers to edit, query and report
-on accumulated bugs; and
-.TP
-.B \(bu
-providing a reliable archive of problems with a given program and a
-history of the life of the program by preserving its reported problems
-and their subsequent solutions.
-.LP
-.B GNATS
-offers many of the same features offered by more generic databases.
-You can query and edit existing problem reports (\fIPR\fPs) as well as
-obtain reports on groups of PRs.  The database itself is simply an
-ordered repository for problem reports; each PR receives a unique,
-incremental
-.IR PR number ,
-which identifies it throughout its lifetime.
-.LP
-Many of the primary functions available with 
-.B GNATS
-are accessible from within GNU 
-.BR Emacs .
-.SH "PROBLEM REPORT STATES"
-PRs go through several states in their lifetimes.  The set of states is
-site-specific.
-.LP
-The default set of states are:
-.TP 2i
-.I open
-the initial state of every PR;
-this means the PR has been filed and the person or group responsible
-for it has been notified of the suspected problem
-.TP
-.I analyzed
-the problem has been examined and work toward a solution has begun
-.TP
-.I feedback
-a solution has been found and tested at the support site, and sent to
-the party who reported the problem; that party is testing the solution
-.TP
-.I closed
-the solution has been confirmed by the party which reported it
-.LP
-In some cases, it may be necessary to suspend work on a bug; in this
-case, its state changes to
-.I suspended
-rather than 
-.IR closed .
-.SH STRUCTURE
-Incoming PRs are assigned an incremental serial number and filed
-according to category.  An index is kept concurrently to accelerate
-searches of the database.
-.LP
-All 
-.B GNATS
-administration and database files are located in subdirectories of a
-directory associated with each database.  Databases are named, and 
-the association between database names and directories is described
-by the \fBdatabases\fR file, which is found on this system in 
-.B @PREFIX@/share/gnats/databases.
-.LP
-.I Problem Reports
-are segregated into subdirectories within the database directory by
-category.  For example, problems submitted with a category of
-.I gcc
-will be filed in the database subdirectory
-.BR gcc .
-.LP
-.B GNATS
-administration files are kept in the database subdirectory
-.BR gnats-adm :
-.TP 1.5i
-.B dbconfig
-describes the structure of the database, and various database-specific
-options
-.TP
-.B categories
-table of valid categories and parties responsible for them
-.TP
-.B responsible
-table of responsible parties and their email addresses
-.TP
-.B submitters
-database of sites which submit PRs
-.TP
-.B current
-keeps track of incremental PR numbers assigned
-.TP
-.B index
-database index
-.LP
-Administrative programs and programs internal to
-.B GNATS
-are kept in the directory
-.BR @PREFIX@/libexec/gnats
-while those meant for public use are installed in
-.BR @PREFIX@/bin .
-.LP
-.B @PREFIX@/libexec/gnats
-contains the programs:
-.TP 1.5i
-.B mkdb
-used by the
-.B GNATS
-administrator to create a new database
-.TP
-.B mkcat
-used by the
-.B GNATS
-administrator to create new categories [obsolete]
-.TP
-.B rmcat
-used by the
-.B GNATS
-administrator to remove outdated categories [obsolete]
-.TP
-.B gen\-index
-used by the
-.B GNATS
-administrator to generate a new version of the index
-.TP
-.B queue-pr
-mail control program which accepts incoming messages and periodically
-submits them to the database via 
-.B cron
-by feeding them through the program
-.BR file-pr (8)
-.TP
-.B pr-edit
-program which is mainly responsible for editing existing PRs and filing
-new ones; it is used by
-.BR edit\-pr \ and\  file\-pr
-.TP
-.B file-pr
-script which uses \fBpr\-edit\fR to file new PRs
-.TP
-.B at-pr
-automatically notifies responsible parties if a PR is not analyzed
-within a requisite period defined in the
-.B submitters
-file
-.TP
-.B delete-pr
-used to delete closed PRs
-.LP
-.B @PREFIX@/bin
-contains the programs
-.TP 1.5i
-.B query-pr
-used to query the database
-.TP
-.B edit-pr
-used to edit individual PRs
-.TP
-.B send-pr
-used to submit problems to 
-.B GNATS
-.LP
-Documentation exists for all programs associated with
-.B GNATS.
-.SH "SEE ALSO"
-.I Keeping Track: Managing Messages With GNATS
-(also installed as the GNU Info file
-.BR gnats.info )
-and
-.I Reporting Problems Using send-pr
-(also installed as the GNU Info file
-.BR send-pr.info ).
-.LP
-.BR gnats (7),
-.BR send\-pr (1),
-.BR edit\-pr (1),
-.BR query\-pr (1),
-.BR file\-pr (8),
-.BR queue-pr (8),
-.BR delete\-pr (8),
-.BR mkcat (8),
-.BR mkdb (8),
-.BR rmcat (8),
-.BR gen\-index (8),
-.BR pr\-edit (8)
-.SH HISTORY
-.B GNATS 
-was greatly inspired by the BSD 
-.BR sendbug (1)
-and
-.BR bugfiler (8)
-programs.  It was originally written in C++, Elisp, shell script, and
-awk.  It presently consists of utilities written in C, shell script,
-and Elisp.
-.SH AUTHORS
-.B GNATS
-was originally written by Heinz G. Seidl (Cygnus Support).  Subsequent
-iterations were developed by Brendan Kehoe (Cygnus Support) and Jason
-Merrill (Cygnus Support), with help from Tim Wicinski.  Documentation
-was initially developed by Jeffrey Osier (Cygnus Support) and Brendan
-Kehoe (Cygnus Support).
-.P
-Version 4.x was a substantial rewrite done by Bob Manson (Juniper
-Networks).
-.SH COPYING
-Copyright (c) 1992, 1993, 1999, 2000 Free Software Foundation
-.PP
-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.
-.PP
-Permission is granted to copy and distribute modified versions of this
-manual under the conditions for verbatim copying, provided that the
-entire resulting derived work is distributed under the terms of a
-permission notice identical to this one.
-.PP
-Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that this permission notice may be included in
-translations approved by the Free Software Foundation instead of in
-the original English.
diff -x CVS -uNr gnats/gnats/man/gnatsd.man gnats.new/gnats/man/gnatsd.man
--- gnats/gnats/man/gnatsd.man	2000-03-16 22:31:08.000000000 -0600
+++ gnats.new/gnats/man/gnatsd.man	1969-12-31 18:00:00.000000000 -0600
@@ -1,843 +0,0 @@
-.\" Copyright (c) 2000 Free Software Foundation, Inc.
-.\" See section COPYING for conditions for redistribution
-.TH gnatsd 8 "January 2000" "GNATS @VERSION@" "GNATS Admininstration Utilities"
-.de BP
-.sp
-.ti -.2i
-\(**
-..
-.SH NAME
-gnatsd \- GNATS network server
-.SH SYNOPSIS
-.hy 0
-.na
-.TP
-.B gnatsd
-[\fB\-\-database\fR\ \fIdatabase\fR\ |\ \fB\-d\fR\ \fIdatabase\fR]
-[\fB\-\-not\-inetd\fR\ |\ \fB\-n\fR]
-[\fB\-\-max-access-level\fR\ \fIlevel\fR\ |\ \fB\-m\fR\ \fIlevel\fR]
-[\fB\-\-version\fR\ |\ \fB\-V\fR]
-[\fB\-\-help\fR\ |\ \fB\-h\fR]
-.ad b
-.hy 1
-.SH DESCRIPTION
-\fBgnatsd\fR is used to service remote GNATS requests such as querying
-\fIPR\fRs, \fIPR\fR creation, deletion, and editing, and miscellaneous
-database queries.  It uses a simple ASCII-based command protocol
-(similar to SMTP or POP3) for communicating with remote clients. 
-.P
-It also provides an almost completely useless security model based
-either on IP-based authentication (generally a \fBterrible\fR idea) or
-cleartext username/passwords (mmmm, network snooping).  \fBIt is
-strongly recommended that some other scheme (such as \fIssh\fR(8)\fB
-tunneling) be used if security is even remotely an issue\fR.  (The
-next release of GNATS will provide a more useful builtin security
-protocol, probably based on \fIssh\fR.)
-.P
-In the meantime, it is possible to restrict network access to a
-particular access level by using the \fB\-\-max-access-level\fR
-argument.
-.P
-All of the GNATS clients are capable of communicating via the GNATS
-remote protocol to perform their functions.
-.P
-\fBgnatsd\fR should be run as the user \fB@GNATS_USER@\fR.  It is usually
-started from \fIinetd\fR(8).
-.SH OPTIONS
-.TP 0.5i
-.B \-V\fR,\fB \-\-version
-Prints the program version to stdout and exits.
-.TP 0.5i
-.B \-h\fR,\fB \-\-help
-Prints a short help text to stdout and exits.
-.TP 0.5i
-.B \-d\fR,\fB \-\-database
-Specifies the default database which is to be serviced by this
-invocation of \fBgnatsd\fR.  (The selected database may be changed via
-the \fBCHDB\fR command; this is simply the default if no \fBCHDB\fR
-command is issued.)  If no database is specified, the database named
-\fIdefault\fR is assumed.  This option overrides the database
-specified in the \fBGNATSDB\fR environment variable.
-.TP 0.5i
-\fB\-\-not\-inetd\fR,\ \fB\-n\fR
-As its name suggests, indicates that \fBgnatsd\fR is not being invoked
-from \fIinetd\fR.  This can be used when testing \fBgnatsd\fR, or if
-it being run via \fIssh\fR or some other mechanism.
-.P
-.RS 0.5i
-This has the effect of using the local hostname where \fBgnatsd\fR is
-being invoked for authentication purposes, rather than the remote
-address of the connecting client.
-.RE
-.TP 0.5i
-\fB\-\-max-access-level\fR,\ \fB\-m\fR
-Specifies the maximum access level that the connecting client can
-authenticate to. Authentication is as normal but if the user or host
-authenticates at a higher level, access level is set to this level.
-.SH COMMAND PROTOCOL
-Commands are issued to \fBgnatsd\fR as one or more words followed by a
-carriage-return/linefeed pair.  For example, the \fBCHDB\fR (change
-databases) command is sent as
-.RS
-CHDB \fIdatabase\fR<CR><LF>
-.RE
-[the CRLF will not be explicitly written for future examples]
-.P
-Replies from \fBgnatsd\fR are returned as one or more \fIresponse line\fRs
-containing a 3-digit numeric code followed by a human-readable string;
-the line is terminated with a <CR><LF> pair.  For example, one possible
-response to the \fBCHDB\fR command above would be:
-.RS
-210 Now accessing GNATS database 'database'.
-.RE
-.P
-The three-digit code is normally followed by a single ASCII space
-(character 0x20).  However, if additional response lines are to be
-returned from the server, there will be a single dash (`-') instead of
-the space character after the three-digit code.
-.P
-Response code values are divided into ranges.  The first digit
-reflects the general type of response (such as "successful" or
-"error"), and the subsequent digits identify the specific type of
-response.
-.TP
-Codes 200-299
-Positive response indicating that the command was successful.  No
-subsequent data will be transmitted with the response.  [In
-particular, code 210 (\fBCODE_OK\fR) is used as the positive result
-code for most simple commands.]
-.RS
-.P
-Commands that expect additional data from the client (such as
-\fBSUBM\fR or \fBVFLD\fR) use a two-step mechanism for sending the
-data.  The server will respond to the initial command with either a
-211 (\fBCODE_SEND_PR\fR) or 212 (\fBCODE_SEND_TEXT\fR) response line,
-or an error code if an error occurred with the initial command.  The
-client is then expected to send the remaining data using the same
-quoting mechanism as described for server responses in the 300-349
-range.  The server will then send a final response line to the
-command.
-.RE
-.TP
-Codes 300-399
-Positive response indicating that the query request was successful,
-and that a \fIPR\fR or other data will follow.  Codes 300-349 are used
-when transmitting \fIPR\fRs, and 350-399 are used for other responses.
-.P
-.RS
-Codes in the 300-349 range are followed by a series of CRLF-terminated
-lines containing the command response, usually a \fIPR\fR.  The final
-line of the result is a single period (`.').  Result lines that begin
-with a period have an extra period prepended to them.
-.P
-Codes in the 350-399 range use a different scheme for sending their
-responses.  The three-digit numeric code will be followed by either a
-dash (`-') or a single space.  If the code is followed by a dash, that
-indicates that another response line will follow.  The final line of
-the response has a single space after the three-digit code.
-.P
-In previous versions of the protocol the first line of a
-CODE_INFORMATION (310) response was to be ignored.  This is no longer
-the case.  Instead, any lines marked with code CODE_INFORMATION_FILLER
-(351) are to be ignored.  This allows the server to transmit
-additional headers or other human-readable text that can be safely
-ignored by the clients.
-.RE
-.TP
-Codes 400-599 
-An error occurred, usually because of invalid command parameters or
-invalid input from the client, missing arguments to the comamand, or a
-command was issued out of sequence.  The human-readable message
-associated with the response line describes the general problem
-encountered with the command.
-.P
-.RS
-Multiple error messages may be returned from a command; in this case
-the `-' continuation character is used on all but the last response
-line.
-.RE
-.TP
-Codes 600-799
-An internal error occurred on the server, a timeout occurred reading
-data from the client, or a network failure occurred.  These errors are
-of the "this should not occur" nature, and retrying the operation may
-resolve the problem.  Fortunately, most GNATS transactions are
-idempotent; unfortunately, locking the database or a \fIPR\fR are not
-repeatable actions (we cannot determine if an existing lock is the one
-we originally requested, or someone else's).
-.SH COMMANDS
-Note that the set of GNATS commands and their responses is somewhat
-inconsistent and is very much in flux.  At present the GNATS clients
-are rather simple-minded and not very strict about processing
-responses.  For example, if the server were to issue a code 300
-(\fBCODE_PR_READY\fR) response to a \fBCHDB\fR command, the client
-would happily expect to see a PR appear (and would print it out if one
-was sent).
-.P
-It is thus suggested that any clients that use the GNATS protocol be
-equally flexible about the way received responses are handled; in
-particular, only the first digit of the response code should be
-assumed to be meaningful, although subsequent digits are needed in
-some cases (codes 300-399). \fBNo attempt should be made to parse the
-message strings on error response lines; they are only intended to be
-read by humans, and will be changed on a regular basis.\fR
-.P
-Almost every command may result in the response 440 (\fBCODE_CMD_ERROR\fR).
-This indicates that there was a problem with the command arguments,
-usually because of insufficient or too many arguments being specified.
-.TP 0.5i
-\fBUSER\fR [<\fIuserid\fR> <\fIpassword\fR>]
-Specifies the userid and password for database access.  Either both a
-username and password must be specified, or they both may be omitted;
-in the latter case, the current access level is returned.
-.RS 0.5i
-.P
-The possible server responses are:
-.TP
-350 (\fBCODE_INFORMATION\fR)
-The current access level is specified.
-.TP
-422 (\fBCODE_NO_ACCESS\fR)
-A matching username and password could not be found.
-.TP
-200 (\fBCODE_OK\fR)
-A matching username and password was found, and the login was
-successful.
-.RE
-.TP 0.5i
-\fBQUIT\fR
-Requests that the connection be closed.  Possible responses:
-.RS 0.5i
-.TP
-201 (\fBCODE_CLOSING\fR)
-Normal exit.
-.P
-The quit command has the dubious distinction of being the only command
-that cannot fail.
-.RE
-.TP 0.5i
-\fBLIST\fR <\fIlist\ type\fR>
-Describes various aspects of the database.  The lists are returned as
-a list of records, one per line.  Each line may contain a number of
-colon-separated fields.
-.P
-.RS 0.5i
-Possible values for \fIlist type\fR include
-.RS 0.25i
-.TP
-\fBCategories\fR
-Describes the legal categories for the database.
-.TP
-\fBSubmitters\fR
-Describes the set of submitters for the database.
-.TP
-\fBResponsible\fR
-Lists the names in the responsible administrative file, including their
-full names and email addresses.
-.TP
-\fBStates\fR
-Lists the states listed in the state administrative file, including
-the state type (usually blank for most states; the closed state has a
-special type).
-.TP
-\fBClasses\fR
-Lists the set of PR classes and their associated human-readable descriptions.
-.TP
-\fBFieldNames\fR
-Lists the entire set of PR fields.
-.TP
-\fBInitialInputFields\fR
-Lists the fields that should be provided when a PR is initially entered.
-.TP
-\fBDatabases\fR
-Lists the set of databases.
-.RE
-.P
-The possible responses are:
-.TP
-301 (\fBCODE_TEXT_READY\fR)
-Normal response, followed by the records making up the list as described
-above.
-.TP
-416 (\fBCODE_INVALID_LIST\fR)
-The requested list does not exist.
-.RE
-.TP 0.5i
-\fBFTYP\fR <\fIfield\fR> [<\fIfield\fR> ...]
-Describes the type of data held in the field(s) specified with the
-command.  The currently-defined data types are:
-.RS 0.5i
-.TP
-Text
-A plain text field, containing exactly one line.
-.TP
-MultiText
-A text field possibly containing multiple lines of text.
-.TP
-Enum
-An enumerated data field; the value is restricted to one entry out of
-a list of values associated with the field.
-.TP
-MultiEnum
-The field contains one or more enumerated values.  Values are separated
-with spaces or colons (\fB:\fR).
-.TP
-Integer
-The field contains an integer value, possibly signed.
-.TP
-Date
-The field contains a date.
-.TP
-TextWithRegex
-The value in the field must match one or more regular expressions associated
-with the field.
-.P
-The possible responses are:
-.TP
-350 (\fBCODE_INFORMATION\fR)
-The normal response; the supplied text is the data type.
-.TP
-410 (\fBCODE_INVALID_FIELD_NAME\fR)
-The specified field does not exist.
-.P
-If multiple field names were given, multiple response lines will be sent,
-one for each field, using the standard continuation protocol; each response
-except the last will have a dash (`-') immedately after the response
-code.
-.RE
-.TP
-\fBFDSC\fR <\fIfield\fR> [<\fIfield\fR> ... ]
-Returns a human-readable description of the listed field(s).  The possible
-responses are:
-.RS 0.5i
-.TP
-350 (\fBCODE_INFORMATION\fR)
-The normal response; the supplied text is the field description.
-.TP
-410 (\fBCODE_INVALID_FIELD_NAME\fR)
-The specified field does not exist.
-.P
-Like the \fBFVLD\fR command, the standard continuation protocol will
-be used if multiple fields were specified with the command.
-.RE
-.TP
-\fBFIELDFLAGS\fR <\fIfield\fR> [<\fIfield\fR> ... ]
-Returns a set of flags describing the specified field(s).  The possible
-responses are either 410\ (\fBCODE_INVALID_FIELD_NAME\fR), meaning that
-the specified field is invalid or nonexistent, or 350\ (\fBCODE_INFORMATION\fR)
-which contains the set of flags for the field.  The flags may be blank,
-which indicate that no special flags have been set for this field.
-.RS 0.5i
-.P
-Like the \fBFDSC\fR and \fBFTYP\fR commands, multiple field names may be
-listed with the command, and a response line will be returned for
-each one in the order that the fields appear on the command line.
-.P
-The flags include:
-.TP
-\fItextsearch\fR
-The field will be searched when a text field search is requested.
-.TP
-\fIallowAnyValue\fR
-For fields that contain enumerated values, any legal value may be used in 
-the field, not just ones that appear in the enumerated list.
-.TP
-\fIrequireChangeReason\fR
-If the field is edited, a reason for the change must be supplied in
-the new \fIPR\fR text describing the reason for the change.  The
-reason must be supplied as a multitext \fIPR\fR field in the new
-\fIPR\fR whose name is \fIfield\fR-Changed-Why (where \fIfield\fR is
-the name of the field being edited).
-.TP
-\fIreadonly\fR
-The field is read-only, and cannot be edited.
-.RE
-.TP
-\fBFVLD\fR <\fIfield\fR>
-Returns one or more regular expressions or strings that describe the
-valid types of data that can be placed in \fIfield\fR.  Exactly what is
-returned is dependent on the type of data that can be stored in the field.
-For most fields a regular expression is returned; for enumerated fields, the
-returned values are the list of legal strings that can be held in the
-field.
-.P
-.RS 0.5i
-The possible responses are:
-.TP
-301 (\fBCODE_TEXT_READY\fR)
-The normal response, which is followed by the list of regexps or strings.
-.TP
-410 (\fBCODE_INVALID_FIELD_NAME\fR)
-The specified field does not exist.
-.RE
-.TP 0.5i
-\fBVFLD\fR <\fIfield\fR>
-\fBVFLD\fR can be used to validate a given value for a field in the
-database.  The client issues the \fBVFLD\fR command with the name of
-the field to validate as an argument.  The server will either respond
-with 212 (\fBCODE_SEND_TEXT\fR), or 410
-(\fBCODE_INVALID_FIELD_NAME\fR) if the specified field does not exist.
-.P
-.RS 0.5i
-Once the 212 response is received from the server, the client should
-then send the line(s) of text to be validated, using the normal quoting
-mechanism described for \fIPR\fRs.  The final line of text is followed
-by a line containing a single period, again as when sending \fIPR\fR
-text.
-.P
-The server will then either respond with 210 (\fBCODE_OK\fR), indicating that
-the text is acceptable, or one or more error codes describing the problems
-with the field contents.
-.RE
-.TP 0.5i
-\fBINPUTDEFAULT\fR <\fIfield\fR> [<\fIfield\fR> ... ]
-Returns the suggested default value for a field when a \fIPR\fR is
-initially created.  The possible responses are either 410\
-(\fBCODE_INVALID_FIELD_NAME\fR), meaning that the specified field is
-invalid or nonexistent, or 350\ (\fBCODE_INFORMATION\fR) which
-contains the default value for the field.
-.RS 0.5i
-.P
-Like the \fBFDSC\fR and \fBFTYP\fR commands, multiple field names may be
-listed with the command, and a response line will be returned for
-each one in the order that the fields appear on the command line.
-.RE
-.TP 0.5i
-\fBRSET\fR
-Used to reset the internal server state.  The current query expression is
-cleared, and the index of PRs may be reread if it has been updated since the
-start of the session.
-.RS 0.5i
-The possible responses are:
-.TP
-200 (\fBCODE_OK\fR)
-The state has been reset.
-.TP
-440 (\fBCODE_CMD_ERROR\fR)
-One or more arguments were supplied to the command.
-.TP
-6xx (\fIinternal error\fR)
-There were problems resetting the state (usually because the index
-could not be reread).  The session will be immediately terminated.
-.RE
-.TP
-\fBLKDB\fR
-Locks the main GNATS database.  No subsequent database locks will
-succeed until the lock is removed.  Sessions that attempt to write to
-the database will fail.
-.RS 0.5i
-The possible responses are:
-.TP
-200 (\fBCODE_OK\fR)
-The lock has been established.
-.TP
-440 (\fBCODE_CMD_ERROR\fR)
-One or more arguments were supplied to the command.
-.TP
-431 (\fBCODE_GNATS_LOCKED\fR)
-The database is already locked, and the lock could not be obtained after
-10 seconds.
-.TP
-6xx (\fIinternal error\fR)
-An internal error occurred, usually because of permission or other
-filesystem-related problems.  The lock may or may not have been
-established.
-.RE
-.TP
-\fBUNDB\fR
-Unlocks the database.  Any session may steal a database lock; no
-checking of any sort is done.
-.RS 0.5i
-The possible responses are:
-.TP
-200 (\fBCODE_OK\fR)
-The lock has been removed.
-.TP
-432 (\fBCODE_GNATS_NOT_LOCKED\fR)
-The database was not locked.
-.TP
-440 (\fBCODE_CMD_ERROR\fR)
-One or more arguments were supplied to the command.
-.TP
-6xx (\fIinternal error\fR)
-The database lock could not be removed, usually because of permissions or
-other filesystem-related issues.
-.RE
-.TP
-\fBLOCK\fR <\fIPR\fR> <\fIuser\fR> [<\fIpid\fR>]
-Locks the specified \fIPR\fR, marking the lock with the name
-\fIuser\fR and the optional \fIpid\fR.  (No checking is done that the
-\fIuser\fR or \fIpid\fR arguments are valid or meaningful; they are
-simply treated as strings.)
-.RS 0.5i
-.P
-The \fBEDIT\fR command requires that the \fIPR\fR be locked before it
-may be successfully executed.  However, it does not require that the
-lock is owned by the editing session, so the usefulness of the lock is
-simply as an advisory measure.
-.P
-The \fBAPPN\fR and \fBREPL\fR commands lock the \fIPR\fR as part of
-the editing process, and they do not require that the \fIPR\fR be
-locked \fIbefore\fR they are invoked.
-.P
-The possible responses are:
-.TP
-440 (\fBCODE_CMD_ERROR\fR)
-Insufficient or too many arguments were specified to the command.
-.TP
-300 (\fBCODE_PR_READY\fR)
-The lock was successfully obtained; the text of the \fIPR\fR (using
-the standard quoting mechanism for \fIPR\fRs) follows.
-.TP
-400 (\fBCODE_NONEXISTENT_PR\fR)
-The \fIPR\fR specified does not exist.
-.TP
-430 (\fBCODE_LOCKED_PR\fR)
-The \fIPR\fR is already locked by another session.
-.TP
-6xx (\fIinternal error\fR)
-The \fIPR\fR lock could not be created, usually because of permissions or
-other filesystem-related issues.
-.RE
-.TP
-\fBUNLK\fR <\fIPR\fR>
-Unlocks \fIPR\fR.  Any user may unlock a \fIPR\fR, as no checking is done
-to determine if the requesting session owns the lock.
-.RS 0.5i
-.P
-The possible responses are:
-.TP
-440 (\fBCODE_CMD_ERROR\fR)
-Insufficient or too many arguments were specified to the command.
-.TP
-200 (\fBCODE_OK\fR)
-The \fIPR\fR was successfully unlocked.
-.TP
-433 (\fBCODE_PR_NOT_LOCKED\fR)
-The \fIPR\fR was not locked.
-.TP
-6xx (\fIinternal error\fR)
-The \fIPR\fR could not be unlocked, usually because of permission or
-other filesystem-related problems.
-.RE
-.TP
-\fBDELETE\fR <\fIPR\fR>
-Deletes the specified \fIPR\fR.  The user making the request must have
-\fIadmin\fR privileges.  If successful, the \fIPR\fR is removed from the
-filesystem and the index file; a gap will be left in the numbering sequence
-for \fIPR\fRs.  No checks are made that the \fIPR\fR is closed.
-.RS 0.5i
-.P
-The possible responses are:
-.TP
-200 (\fBCODE_OK\fR)
-The \fIPR\fR was successfully deleted.
-.TP
-422 (\fBCODE_NO_ACCESS\fR)
-The user requesting the delete does not have \fIadmin\fR privileges.
-.TP
-430 (\fBCODE_LOCKED_PR\fR)
-The \fIPR\fR is locked by another session.
-.TP
-431 (\fBCODE_GNATS_LOCKED\fR)
-The database has been locked, and no \fIPR\fRs may be updated until the
-lock is cleared.
-.TP
-6xx (\fIinternal error\fR)
-The \fIPR\fR could not be successfully deleted, usually because of
-permission or other filesystem-related problems.
-.RE
-.TP
-\fBCHEK\fR [initial]
-Used to check the text of an entire \fIPR\fR for errors.  Unlike the
-\fBVFLD\fR command, it accepts an entire \fIPR\fR at once instead of
-the contents of an individual field.
-.RS 0.5i
-.P
-The \fIinitial\fR argument indicates that the PR text to be checked is
-for a \fIPR\fR that will be newly created, rather than an edit or 
-replacement of an existing PR.
-.P
-After the \fBCHEK\fR command is issued, the server will respond with either a
-440 (\fBCODE_CMD_ERROR\fR) response indicating that the command
-arguments were incorrect, or a 211 (\fBCODE_SEND_PR\fR) response code will
-be sent.
-.P
-Once the 211 response is received from the server, the client should send
-the \fIPR\fR using the normal \fIPR\fR quoting mechanism; the final line of
-the \fIPR\fR is then followed by a line containing a single period, as usual.
-.P
-The server will then respond with either a 200 (\fBCODE_OK\fR)
-response, indicating there were no problems with the supplied text, or
-one or more error codes listing the problems with the \fIPR\fR.
-.RE
-.TP
-\fBEDIT\fR <\fIPR\fR>
-Verifies the replacement text for \fIPR\fR.  If the command is successful, the
-contents of \fIPR\fR are completely replaced with the supplied text.
-\fIPR\fR must previously have been locked with the \fBLOCK\fR command.
-.RS 0.5i
-.P
-The possible responses are:
-.TP
-431 (\fBCODE_GNATS_LOCKED\fR)
-The database has been locked, and no \fIPR\fRs may be updated until the
-lock is cleared.
-.TP
-433 (\fBCODE_PR_NOT_LOCKED\fR)
-The \fIPR\fR was not previously locked with the \fBLOCK\fR command.
-.TP
-400 (\fBCODE_NONEXISTENT_PR\fR)
-The specified \fIPR\fR does not currently exist.  The \fBSUBM\fR command
-should be used to create new \fIPR\fRs.
-.TP
-211 (\fBCODE_SEND_PR\fR)
-The client should now transmit the replacement \fIPR\fR text using the
-normal \fIPR\fR quoting mechanism.  After the \fIPR\fR has been sent,
-the server will respond with either a 200 (\fBCODE_OK\fR) response
-indicating the edit was successful, or one or more error codes
-listing problems with either with the replacement \fIPR\fR text, or
-errors encountered while updating the \fIPR\fR file or index.
-.RE
-.TP
-\fBAPPN\fR <\fIPR\fR> <\fIfield\fR>
-.TP
-\fBREPL\fR <\fIPR\fR> <\fIfield\fR>
-Appends to or replaces the contents of \fIfield\fR in \fIPR\fR with
-the supplied text.  The command returns a 201\ (\fBCODE_SEND_TEXT\fR)
-response; the client should then transmit the new field contents using
-the standard \fIPR\fR quoting mechanism.  After the server has read
-the new contents, it then attempts to make the requested change to the
-\fIPR\fR.
-.RS 0.5i
-.P
-The possible responses are:
-.TP
-200 (\fBCODE_OK\fR)
-The \fIPR\fR field was successfully changed.
-.TP
-400 (\fBCODE_NONEXISTENT_PR\fR)
-The \fIPR\fR specified does not exist.
-.TP
-410 (\fBCODE_INVALID_FIELD_NAME\fR)
-The specified field does not exist.
-.TP
-402 (\fBCODE_UNREADABLE_PR\fR)
-The \fIPR\fR could not be read.
-.TP
-431 (\fBCODE_GNATS_LOCKED\fR)
-The database has been locked, and no \fIPR\fRs may be updated until the
-lock is cleared.
-.TP
-430 (\fBCODE_LOCKED_PR\fR)
-The \fIPR\fR is locked, and may not be altered until the lock is cleared.
-.TP
-413 (\fBCODE_INVALID_FIELD_CONTENTS\fR)
-The supplied (or resulting) field contents are not valid for the field.
-.TP
-6xx (\fIinternal error\fR)
-An internal error occurred, usually because of permission or other
-filesystem-related problems.  The \fIPR\fR may or may not have been
-altered.
-.RE
-.P
-\fBSUBM\fR
-Submits a new \fIPR\fR into the database.  The supplied text is verified for
-correctness, and if no problems are found a new \fIPR\fR is created.
-.RS 0.5i
-.P
-The possible responses are:
-.TP
-431 (\fBCODE_GNATS_LOCKED\fR)
-The database has been locked, and no \fIPR\fRs may be submitted until the
-lock is cleared.
-.TP
-211 (\fBCODE_SEND_PR\fR)
-The client should now transmit the new \fIPR\fR text using the normal
-quoting mechanism.  After the \fIPR\fR has been sent, the server will
-respond with either a 200 (\fBCODE_OK\fR) response indicating that the
-new PR has been created (and mail sent to the appropriate persons), or
-one or more error codes listing problems with the new \fIPR\fR text.
-.RE
-.TP
-\fBCHDB\fR <\fIdatabase\fR>
-Switches the current database to the name specified in the command.
-.RS 0.5i
-.P
-The possible responses are:
-.TP
-422 (\fBCODE_NO_ACCESS\fR)
-The user does not have permission to access the requested database.
-.TP
-417 (\fBCODE_INVALID_DATABASE\fR)
-The database specified does not exist, or one or more configuration errors
-in the database were encountered.
-.TP
-220 (\fBCODE_OK\fR)
-The current database is now \fIdatabase\fR.  Any operations performed
-will now be applied to that database.
-.RE
-.TP
-\fBDBLS\fR
-Lists the known set of databases.
-.RS 0.5i
-.P
-The possible responses are:
-.TP
-6xx (\fIinternal error\fR)
-An internal error was encountered while trying to obtain the list of
-available databases, usually due to lack of permissions or other
-filesystem-related problems, or the list of databases is empty.
-.TP
-301 (\fBCODE_TEXT_READY\fR)
-The list of databases follows, one per line, using the standard quoting
-mechanism.  Only the database names are sent.
-.RE
-.TP
-\fBDBDESC\fR <\fIdatabasename\fR>
-Returns a human-readable description of the specified database.  Responses
-include:
-.RS 0.5i
-.TP
-6xx (\fIinternal error\fR)
-An internal error was encountered while trying to read the list of
-available databases, usually due to lack of permissions or other
-filesystem-related problems, or the list of databases is empty.
-.TP
-350 (\fBCODE_INFORMATION\fR)
-The normal response; the supplied text is the database description.
-.TP
-417 (\fBCODE_INVALID_DATABASE\fR)
-The specified database name does not have an entry.
-.RE
-.TP
-\fBEXPR\fR <\fIquery expression\fR>
-Specifies a query expression used to limit which \fIPR\fRs are returned
-from the \fBQUER\fR command.  The expression uses the normal query
-expression syntax, as described in the manual entry for query-pr(1).
-.RS 0.5i
-.P
-Multiple \fBEXPR\fR commands may be issued; the expressions are
-boolean \fIAND\fRed together.
-.P
-Expressions are cleared by the RSET command.
-.P
-Possible responses include:
-.TP
-415 (\fBCODE_INVALID_EXPR\fR)
-The specified expression is invalid, and could not be parsed.
-.TP
-200 (\fBCODE_OK\fR)
-The expression has been accepted, and will be used to limit the results
-returned from \fBQUER\fR.
-.RE
-.TP 0.5i
-\fBQFMT\fR <\fIquery format\fR>
-Use the specified query format to format the output of the \fBQUER\fR command.
-The query format may be either the name of a query format known to the
-server, or an actual query format.
-.RS 0.5i
-The possible responses are:
-.TP
-200 (\fBCODE_OK\fR)
-The normal response, which indicates that the query format is acceptable.
-.TP
-440 (\fBCODE_CMD_ERROR\fR)
-No query format was supplied.
-.TP
-418 (\fBCODE_INVALID_QUERY_FORMAT\fR)
-The specified query format does not exist, or could not be parsed.
-.RE
-.TP
-\fBQUER\fR [\fIPR\fR] [\fIPR\fR] [...]
-Searches the contents of the database for \fIPR\fRs that match the
-(optional) specified expressions with the \fBEXPR\fR command.  If no
-expressions were specified with \fBEXPR\fR, the entire set of \fIPR\fRs
-is returned.
-.RS 0.5i
-.P
-If one or more \fIPR\fRs are specified on the commandline, only those
-\fIPR\fRs will be searched and/or output.
-.P
-The format of the output from the command is determined by the query
-format selected with the \fBQFMT\fR command.
-.P
-The possible responses are:
-.TP
-418 (\fBCODE_INVALID_QUERY_FORMAT\fR)
-A valid format was not specified with the \fBQFMT\fR command prior to
-invoking \fBQUER\fR.
-.TP
-300 (\fBCODE_PR_READY\fR)
-One or more \fIPR\fRs will be output using the requested query format.
-The \fIPR\fR text is quoted using the normal quoting mechanisms for
-\fIPR\fRs.
-.TP
-220 (\fBCODE_NO_PRS_MATCHED\fR)
-No \fIPR\fRs met the specified criteria.
-.RE
-.TP
-\fBADMV\fR <\fIfield\fR> <\fIkey\fR> [<\fIsubfield\fR>]
-Returns an entry from an adm file associated with \fIfield\fR.
-\fIkey\fR is used to look up the entry in the data file.  If
-\fIsubfield\fR is specified, only the value of that subfield is
-returned; otherwise, all of the fields in the adm data file are
-returned, separated by colons (`:').
-.RS 0.5i
-.P
-The responses are:
-.TP
-410 (\fBCODE_INVALID_FIELD_NAME\fR)
-The specified field does not exist.
-.TP
-221 (\fBCODE_NO_ADM_ENTRY\fR)
-An adm entry matching the key was not found, or the field does not have
-an adm file associated with it.
-.TP
-350 (\fBCODE_INFORMATION\fR)
-The normal response; the supplied text is the requested field(s).
-.RE
-.SH ENVIRONMENT VARIABLES
-The \fBGNATSDB\fR environment variable is used to determine which
-database to use.  For a local database, it contains the name of the
-database to access.  \fBgnatsd\fR cannot service remote databases (tho
-it might be interesting if it could) so the database is always assumed
-to be local.
-.P
-If \fBGNATSDB\fR is not set and the --database option is not supplied,
-it is assumed that the database is local and that its name is \fIdefault\fR.
-.SH "SEE ALSO"
-.I Keeping Track: Managing Messages With GNATS
-(also installed as the GNU Info file
-.BR gnats.info )
-and
-.I Reporting Problems Using send-pr
-(also installed as the GNU Info file
-.BR send-pr.info ).
-.LP
-.BR gnats (7),
-.BR send-pr (1),
-.BR edit-pr (1),
-.BR query-pr (1),
-.BR file-pr (8),
-.BR queue-pr (8),
-.BR rmcat (8),
-.BR gen-index (8),
-.BR mkcat (8).
-.SH COPYING
-Copyright (c) 2000 Free Software Foundation, Inc.
-.PP
-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.
-.PP
-Permission is granted to copy and distribute modified versions of this
-manual under the conditions for verbatim copying, provided that the
-entire resulting derived work is distributed under the terms of a
-permission notice identical to this one.
-.PP
-Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that this permission notice may be included in
-translations approved by the Free Software Foundation instead of in
-the original English.
diff -x CVS -uNr gnats/gnats/man/mkcat.man gnats.new/gnats/man/mkcat.man
--- gnats/gnats/man/mkcat.man	1999-12-30 22:19:21.000000000 -0600
+++ gnats.new/gnats/man/mkcat.man	1969-12-31 18:00:00.000000000 -0600
@@ -1,75 +0,0 @@
-.\" Copyright (c) 1993, 1999 Free Software Foundation, Inc.
-.\" See section COPYING for conditions for redistribution
-.TH mkcat 8 "December 1999" "GNATS @VERSION@" "GNATS Admininstration Utilities"
-.de BP
-.sp
-.ti -.2i
-\(**
-..
-.SH NAME
-mkcat \- create a new GNATS category
-.SH SYNOPSIS
-.hy 0
-.na
-.TP
-.B mkcat
-[
-.BI -d \ databasename
-|
-.BI --database= databasename
-]
-.ad b
-.hy 1
-.SH DESCRIPTION
-Scans the database for any new categories, creating new subdirectories
-in the database directory if any are found.
-.P
-This program is mostly obsolete since directories for categories are
-automatically created as necessary, but is left for histerical
-reasons.
-.SH OPTIONS
-.TP
-.B -d\fR,\fB --database
-Specifies the database to be scanned for new categories; if no
-database is specified, the database named \fIdefault\fR is assumed.
-This option overrides the database specified in the \fBGNATSDB\fR
-environment variable.
-.SH ENVIRONMENT VARIABLES
-The \fBGNATSDB\fR environment variable is used to determine which database to
-use.  For a local database, it contains the name of the database to access.
-If \fBGNATSDB\fR is not set, the database named \fIdefault\fR is used.
-.SH "SEE ALSO"
-.I Keeping Track: Managing Messages With GNATS
-(also installed as the GNU Info file
-.BR gnats.info )
-and
-.I Reporting Problems Using send-pr
-(also installed as the GNU Info file
-.BR send-pr.info ).
-.LP
-.BR gnats (7),
-.BR send-pr (1),
-.BR edit-pr (1),
-.BR query-pr (1),
-.BR file-pr (8),
-.BR queue-pr (8),
-.BR rmcat (8),
-.BR gen-index (8),
-.BR mkdb (8).
-.SH COPYING
-Copyright (c) 1993, 1999 Free Software Foundation, Inc.
-.PP
-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.
-.PP
-Permission is granted to copy and distribute modified versions of this
-manual under the conditions for verbatim copying, provided that the
-entire resulting derived work is distributed under the terms of a
-permission notice identical to this one.
-.PP
-Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that this permission notice may be included in
-translations approved by the Free Software Foundation instead of in
-the original English.
diff -x CVS -uNr gnats/gnats/man/mkdb.man gnats.new/gnats/man/mkdb.man
--- gnats/gnats/man/mkdb.man	2000-01-22 23:35:38.000000000 -0600
+++ gnats.new/gnats/man/mkdb.man	1969-12-31 18:00:00.000000000 -0600
@@ -1,68 +0,0 @@
-.\" Copyright (c) 1999 Free Software Foundation, Inc.
-.\" See section COPYING for conditions for redistribution
-.TH mkdb 8 "January 2000" "GNATS @VERSION@" "GNATS Admininstration Utilities"
-.de BP
-.sp
-.ti -.2i
-\(**
-..
-.SH NAME
-mkdb \- create a new GNATS database
-.SH SYNOPSIS
-.hy 0
-.na
-.TP
-.B mkdb \fBdirectory\fR
-.ad b
-.hy 1
-.SH DESCRIPTION
-Creates a new database in \fBdirectory\fR.  \fBdirectory\fR must not currently
-exist; it will be created by \fBmkdb\fR, and will be populated with a set of
-default files copied from the @PREFIX@/share/gnats/defaults directory. 
-.P
-The command should be run as @GNATS_USER@.
-.SH OPTIONS
-.TP
-.B directory
-Specifies the pathname of the database to be created.
-.br
-An entry in
-@PREFIX@/share/gnats/databases will \fBnot\fR be created for the new
-database, and you will need to add one manually.  (A sample entry for
-the \fIdefault\fR database is present in the file.)
-.SH "SEE ALSO"
-.I Keeping Track: Managing Messages With GNATS
-(also installed as the GNU Info file
-.BR gnats.info )
-and
-.I Reporting Problems Using send-pr
-(also installed as the GNU Info file
-.BR send-pr.info ).
-.LP
-.BR gnats (7),
-.BR send-pr (1),
-.BR edit-pr (1),
-.BR query-pr (1),
-.BR delete-pr (8),
-.BR file-pr (8),
-.BR queue-pr (8),
-.BR rmcat (8),
-.BR gen-index (8),
-.BR mkcat (8).
-.SH COPYING
-Copyright (c) 2000 Free Software Foundation, Inc.
-.PP
-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.
-.PP
-Permission is granted to copy and distribute modified versions of this
-manual under the conditions for verbatim copying, provided that the
-entire resulting derived work is distributed under the terms of a
-permission notice identical to this one.
-.PP
-Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that this permission notice may be included in
-translations approved by the Free Software Foundation instead of in
-the original English.
diff -x CVS -uNr gnats/gnats/man/pr-edit.man gnats.new/gnats/man/pr-edit.man
--- gnats/gnats/man/pr-edit.man	2000-01-22 23:35:38.000000000 -0600
+++ gnats.new/gnats/man/pr-edit.man	1969-12-31 18:00:00.000000000 -0600
@@ -1,225 +0,0 @@
-.\" Copyright (c) 2000 Free Software Foundation, Inc.
-.\" See section COPYING for conditions for redistribution
-.TH pr-edit 8 "January 2000" "GNATS @VERSION@" "GNATS Admininstration Utilities"
-.de BP
-.sp
-.ti -.2i
-\(**
-..
-.SH NAME
-pr\-edit \- creates, edits or deletes PRs
-.SH SYNOPSIS
-.hy 0
-.na
-.TP
-.B pr\-edit
-[\fB\-\-lock\fR\ \fIusername\fR\ |\ \fB\-l\fR\ \fIusername\fR]
-[\fB\-\-unlock\fR\ |\ \fB\-u\fR]
-[\fB\-\-lockdb\fR\ |\ \fB\-L\fR]
-[\fB\-\-unlockdb\fR\ |\ \fB\-U\fR]
-[\fB\-\-check\fR\ |\ \fB\-c\fR]
-[\fB\-\-check\-initial\fR\ |\ \fB\-C\fR]
-[\fB\-\-submit\fR\ |\ \fB\-s\fR]
-[\fB\-\-append\fR\ \fIfield\fR\ |\ \fB\-a\fR\ \fIfield\fR]
-[\fB\-\-replace\fR\ \fIfield\fR\ |\ \fB\-r\fR\ \fIfield\fR]
-[\fB\-\-delete\-pr\fR]
-[\fB\-\-process\fR\ \fIprocess\-id\fR\ |\ \fB\-p\fR\ \fIprocess\-id\fR]
-[\fB\-\-database\fR\ \fIdatabase\fR\ |\ \fB\-d\fR\ \fIdatabase\fR]
-[\fB\-\-filename\fR\ \fIfilename\fR\ |\ \fB\-f\fR\ \fIfilename\fR]
-[\fB\-\-version\fR\ |\ \fB\-V\fR]
-[\fB\-\-help\fR\ |\ \fB\-h\fR]
-[\fB\-\-user\fR\ \fInetid\fR\ |\ \fB\-v\fR\ \fInetid\fR]
-[\fB\-\-passwd\fR\ \fIpassword\fR\ |\ \fB\-w\fR\ \fIpassword\fR]
-[\fB\-\-host\fR\ \fIhost\fR\ |\ \fB\-H\fR\ \fIhost\fR]
-[\fB\-\-port\fR\ \fIport\fR\ |\ \fB\-P\fR\ \fIport\fR]
-[\fB\-\-debug\fR\ |\ \fB\-D\fR]
-[\fBPR number\fR]
-.ad b
-.hy 1
-.SH DESCRIPTION
-\fBpr\-edit\fR can be used to exit an existing \fIPR\fR by either
-replacing or appending to particular fields within the \fIPR\fR, or
-providing a new \fIPR\fR to replace the existing one. \fBpr\-edit\fR
-can also be used to create new \fIPR\fRs from scratch, or delete
-existing ones.
-.P
-\fBpr\-edit\fR also provides miscellaneous services for locking and
-unlocking \fIPR\fRs,  locking or unlocking an entire database, or
-verifying that proposed \fIPR\fR contents are valid and correct.
-.SH OPTIONS
-.TP 0.5i
-\fB\-\-lockdb\fR,\ \fB\-L\fR
-Locks the specified database.  No PRs may be edited, created or deleted
-while the database is locked.
-.LP
-.RS 0.5i
-This option is generally used when editing the index file.
-.RE
-.TP 0.5i
-\fB\-\-unlockdb\fR,\ \fB\-U\fR
-Unlocks the database.  No check is made that the invoking user actually had
-locked the database in the first place; hence, it is possible for anyone
-to steal a database lock.
-.TP
-\fB\-\-check\fR,\ \fB\-c\fR
-.TP
-\fB\-\-check\-initial\fR,\ \fB\-C\fR
-The \fB\-\-check\fR options are used to verify that a proposed
-\fIPR\fR's field contents are valid.  The \fIPR\fR is read in (either
-from stdin or a file specified with \fB\-\-filename\fR), and its
-fields are compared against the rules specified by the database
-configuration of the selected database.  Warnings are given for
-enumerated fields whose contents do not contain one of the required
-values or fields that do not match required regexps.
-.P
-.RS 0.5i
-\fB\-\-check\-initial\fR is used to verify initial \fIPR\fRs, rather
-than proposed edits of existing \fIPRs\fR.
-.RE
-.TP 0.5i
-\fB\-\-submit\fR,\ \fB\-s\fR
-Used to submit a new \fIPR\fR to the database.  The \fIPR\fR is read
-in and verified for content; if the \fIPR\fR is valid as an initial
-\fIPR\fR, it is then added to the database.
-.P
-.RS 0.5i
-A zero exit code is
-returned if the submission was successful.  Otherwise, the reason(s)
-for the \fIPR\fR being rejected are printed to stdout, and a non-zero
-exit code is returned.
-.RE
-.P
-The following options require a \fIPR number\fR to be given.
-.TP 0.5i
-\fB\-\-delete\-pr\fR
-Deletes the specified \fIPR\fR from the database.  The \fIPR\fR must be
-in a closed state, and not locked.
-.LP
-.RS 0.5i
-Only the user \fB@GNATS_USER@\fR is permitted to delete \fIPR\fRs.
-.RE
-.TP 0.5i
-\fB\-\-lock\fR\ \fIusername\fR,\ \fB\-l\fR\ \fIusername\fR
-Locks the \fIPR\fR.  \fIusername\fR is associated with the lock, so
-the system administrator can determine who actually placed the lock on
-the \fIPR\fR.  However, anyone is permitted to remove locks on a
-\fIPR\fR.
-.P
-.RS 0.5i
-If the optional \fB\-\-process\-id\fR option is also given, that
-\fIprocess\-id\fR is associated with the lock.
-.RE
-.TP 0.5i
-\fB\-\-unlock\fR,\ \fB\-u\fR
-Unlocks the \fIPR\fR.
-.TP
-\fB\-\-append\fR\ \fIfield\fR,\ \fB\-a\fR\ \fIfield\fR
-.TP
-\fB\-\-replace\fR\ \fIfield\fR,\ \fB\-r\fR\ \fIfield\fR
-\fB\-\-append\fR and \fB\-\-replace\fR are used to append or replace
-content of a specific field within a \fIPR\fR.  The new field content
-is read in from stdin (or from the file specified with the
-\fB\-\-filename\fR option), and either appended or replaced to the
-specified field.  The field contents are verified for correctness
-before the \fIPR\fR is rewritten.
-.P
-.RS 0.5i
-If the edit is successful, a zero exit status is returned.  If the edit
-failed, a non-zero exit status is returned, and the reasons for the failure
-are printed to stdout.
-.RE
-.TP 0.5i
-\fB[PR number]\fR
-If only a \fIPR number\fR is specified with no other options, a
-replacement \fIPR\fR is read in (either from stdin or the file
-specified with \fB\-\-filename\fR).  If the \fIPR\fR contents are
-valid and correct, the existing \fIPR\fR is replaced with the new
-\fIPR\fR contents.
-.P
-.RS 0.5i
-If the edit is successful, a zero exit status is returned.  If the edit
-failed, a non-zero exit status is returned, and the reasons for the failure
-are printed to stdout.
-.RE
-.TP 0.5i
-\fB\-\-database\fR\ \fIdatabase\fR,\ \fB\-d\fR\ \fIdatabase\fR
-Specifies the database which is to be manipulated.  If no database is
-specified, the database named \fIdefault\fR is assumed.  This option
-overrides the database specified in the \fBGNATSDB\fR environment
-variable.
-.TP 0.5i
-\fB\-\-filename\fR\ \fIfilename\fR,\ \fB\-f\fR\ \fIfilename\fR
-For actions that require reading in a \fIPR\fR or field content, this
-specifies the name of a file to read.  If \fB\-\-filename\fR is not
-specified, the \fIPR\fR or field content is read in from stdin.
-.TP 0.5i
-\fB\-\-version\fR,\ \fB\-V\fR
-Displays the version number of the program.
-.TP 0.5i
-\fB\-\-help\fR,\ \fB\-h\fR
-Prints a brief usage message.
-.TP 0.5i
-\fB\-\-host\fR\ \fIhost\fR,\ \fB\-H\fR\ \fIhost\fR
-Hostname of the GNATS server.
-.TP 0.5i
-\fB\-\-port\fR\ \fIport\fR,\ \fB\-P\fR\ \fIport\fR
-The port that the GNATS server runs on.
-.TP 0.5i
-\fB\-\-user\fR\ \fInetid\fR,\ \fB\-v\fR\ \fInetid\fR
-Username used when logging into the GNATS server.
-.TP 0.5i
-\fB\-\-passwd\fR\ \fIpassword\fR,\ \fB\-w\fR\ \fIpassword\fR
-Password used when logging into the GNATS server.
-.TP 0.5i
-\fB\-\-debug\fR,\ \fB\-D\fR
-Used to debug network connections.
-.SH ENVIRONMENT VARIABLES
-The \fBGNATSDB\fR environment variable is used to determine which database to
-use.  For a local database, it contains the name of the database to access.
-.P
-For network access via \fIgnatsd\fR, it contains a colon-separated list
-of strings that describe the remote database, in the form
-.TP
-\fIserver\fR:\fIport\fR:\fIdatabasename\fR:\fIusername\fR:\fIpassword\fR
-.P
-Any of the fields may be omitted, but at least one colon must appear;
-otherwise, the value is assumed to be the name of a local database.
-.P
-If \fBGNATSDB\fR is not set and the --database option is not supplied,
-it is assumed that the database is local and that its name is
-\fIdefault\fR.
-.SH "SEE ALSO"
-.I Keeping Track: Managing Messages With GNATS
-(also installed as the GNU Info file
-.BR gnats.info )
-and
-.I Reporting Problems Using send-pr
-(also installed as the GNU Info file
-.BR send-pr.info ).
-.LP
-.BR gnats (7),
-.BR send-pr (1),
-.BR edit-pr (1),
-.BR query-pr (1),
-.BR file-pr (8),
-.BR queue-pr (8),
-.BR rmcat (8),
-.BR gen-index (8),
-.BR mkcat (8).
-.SH COPYING
-Copyright (c) 2000 Free Software Foundation, Inc.
-.PP
-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.
-.PP
-Permission is granted to copy and distribute modified versions of this
-manual under the conditions for verbatim copying, provided that the
-entire resulting derived work is distributed under the terms of a
-permission notice identical to this one.
-.PP
-Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that this permission notice may be included in
-translations approved by the Free Software Foundation instead of in
-the original English.
diff -x CVS -uNr gnats/gnats/man/query-pr.man gnats.new/gnats/man/query-pr.man
--- gnats/gnats/man/query-pr.man	2000-03-09 22:49:29.000000000 -0600
+++ gnats.new/gnats/man/query-pr.man	1969-12-31 18:00:00.000000000 -0600
@@ -1,541 +0,0 @@
-.\" Copyright (c) 1993, 94, 95, 96, 1997, 1999 Free Software Foundation, Inc.
-.\" See section COPYING for conditions for redistribution .in +0.9i
-.TH query-pr 1 "December 1999" "GNATS @VERSION@" "GNATS User Utilities"
-.de BP
-.sp
-.ti -.2i
-\(**
-..
-.SH NAME
-query-pr \- query problem reports in the GNATS database
-.SH SYNOPSIS
-.hy 0
-.na
-.B query\-pr
-.RS
-[\fB\-\-debug\fR\ |\ \fB\-D\fR]
-[\fB\-\-help\fR\ |\ \fB\-h\fR]
-[\fB\-\-version\fR\ |\ \fB\-V\fR]
-[\fB\-\-output\fR\ \fIfile\fR\ |\ \fB\-o\fR\ \fIfile\fR]
-[\fB\-\-list\-databases\fR]
-[\fB\-\-list\-fields\fR]
-[\fB\-\-list\-input\-fields\fR]
-[\fB\-\-responsible\-address\fR\ \fIaddress\fR]
-[\fB\-\-field\-type\fR\ \fItype\fR]
-[\fB\-\-field\-description\fR\ \fIdescription\fR]
-[\fB\-\-valid\-values\fR\ \fIvalues\fR]
-[\fB\-\-format\fR\ \fIformat\fR\ |\ \fB\-f\fR\ \fIformat\fR]
-[\fB\-\-full\fR\ |\ \fB\-F\fR]
-[\fB\-\-summary\fR\ |\ \fB\-q\fR]
-[\fB\-\-database\fR\ \fIdatabase\fR\ |\ \fB\-d\fR\ \fIdatabase\fR]
-[\fB\-\-and\fR\ |\ \fB\-&\fR]
-[\fB\-\-or\fR\ |\ \fB\-|\fR]
-[\fB\-\-expr\fR\ \fIexpr\fR]
-[\fIgnats-id .\|.\|.\fR]
-.SS Non-network-mode options:
-.RS
-[\fB\-\-print\-sh\-vars\fR]
-[\fB\-\-print\-directory\-for\-database\fR]
-.SS Network-mode-only options:
-.RS
-[\fB\-\-host\fR\ \fIhost\fR\ |\ \fB\-H\fR\ \fIhost\fR]
-[\fB\-\-port\fR\ \fIport\fR]
-[\fB\-\-user\fR\ \fIuser\fR\ |\ \fB\-v\fR\ \fIuser\fR]
-[\fB\-\-passwd\fR\ \fIpasswd\fR\ |\ \fB\-w\fR\ \fIpasswd\fR]
-.SS Deprecated Options
-.RS
-[\fB\-\-list\-categories\fR\ |\ \fB\-j\fR]
-[\fB\-\-list\-classes\fR\ |\ \fB\-J\fR]
-[\fB\-\-list\-responsible\fR\ |\ \fB\-k\fR]
-[\fB\-\-list\-submitters\fR\ |\ \fB\-l\fR]
-[\fB\-\-list\-states\fR\ |\ \fB\-T\fR]
-[\fB\-\-category\fR\ \fIcategory\fR\ |\ \fB\-c\fR\ \fIcategory\fR]
-[\fB\-\-synopsis\fR\ \fIsynopsis\fR\ |\ \fB\-y\fR\ \fIsynopsis\fR]
-[\fB\-\-confidential\fR\ \fIconfidential\fR\ |\ \fB\-C\fR\ \fIconfidential\fR]
-[\fB\-\-multitext\fR\ \fImultitext\fR\ |\ \fB\-m\fR\ \fImultitext\fR]
-[\fB\-\-originator\fR\ \fIoriginator\fR\ |\ \fB\-O\fR\ \fIoriginator\fR]
-[\fB\-\-release\fR\ \fIrelease\fR\ |\ \fB\-A\fR\ \fIrelease\fR]
-[\fB\-\-class\fR\ \fIclass\fR\ |\ \fB\-L\fR\ \fIclass\fR]
-[\fB\-\-cases\fR\ \fIcases\fR\ |\ \fB\-E\fR\ \fIcases\fR]
-[\fB\-\-quarter\fR\ \fIquarter\fR\ |\ \fB\-Q\fR\ \fIquarter\fR]
-[\fB\-\-keywords\fR\ \fIkeywords\fR\ |\ \fB\-K\fR\ \fIkeywords\fR]
-[\fB\-\-priority\fR\ \fIpriority\fR\ |\ \fB\-p\fR\ \fIpriority\fR]
-[\fB\-\-responsible\fR\ \fIresponsible\fR\ |\ \fB\-r\fR\ \fIresponsible\fR]
-[\fB\-\-restricted\fR\ |\ \fB\-R\fR]
-[\fB\-\-severity\fR\ \fIseverity\fR\ |\ \fB\-e\fR\ \fIseverity\fR]
-[\fB\-\-skip\-closed\fR\ |\ \fB\-x\fR]
-[\fB\-\-sql\fR\ |\ \fB\-i\fR]
-[\fB\-\-sql2\fR\ |\ \fB\-I\fR]
-[\fB\-\-state\fR\ \fIstate\fR\ |\ \fB\-s\fR\ \fIstate\fR]
-[\fB\-\-submitter\fR\ \fIsubmitter\fR\ |\ \fB\-S\fR\ \fIsubmitter\fR]
-[\fB\-\-text\fR\ \fItext\fR\ |\ \fB\-t\fR\ \fItext\fR]
-[\fB\-\-required\-before\fR\ \fIdate\fR\ |\ \fB\-u\fR\ \fIdate\fR]
-[\fB\-\-required\-after\fR\ \fIdate\fR\ |\ \fB\-U\fR\ \fIdate\fR]
-[\fB\-\-arrived\-before\fR\ \fIdate\fR\ |\ \fB\-b\fR\ \fIdate\fR]
-[\fB\-\-arrived\-after\fR\ \fIdate\fR\ |\ \fB\-a\fR\ \fIdate\fR]
-[\fB\-\-modified\-before\fR\ \fIdate\fR\ |\ \fB\-B\fR\ \fIdate\fR]
-[\fB\-\-modified\-after\fR\ \fIdate\fR\ |\ \fB\-M\fR\ \fIdate\fR]
-[\fB\-\-closed\-before\fR\ \fIdate\fR\ |\ \fB\-z\fR\ \fIdate\fR]
-[\fB\-\-closed\-after\fR\ \fIdate\fR\ |\ \fB\-Z\fR\ \fIdate\fR]
-.ad b
-.hy 1
-.SH DESCRIPTION
-Queries the 
-.B GNATS
-database according to options and returns either selected Problem
-Reports (\fIPR\fRs) or other requested information.  \fBquery-pr\fR
-can query \fIPR\fRs located in either a local database or via
-\fBgnatsd\fR.
-.LP
-\fIPR\fRs may be selected via the use of the \fB\-\-expr\fR option,
-directly by number, or by the use of the (now deprecated)
-field-specific query operators.
-.LP
-By default, query options are connected with a logical
-.BR AND .
-For example,
-.RS
-\fBquery\-pr\fR \fB\-\-category=\fIfoo\fR \fB\-\-responsible=\fIbar\fR
-.RE
-only prints PRs which have a \fBCategory\fR field of \fIfoo\fR and a 
-\fBResponsible\fR field of \fIbar\fR.
-.LP
-The
-.B \-\-or
-option may be used to connect query options with a logical \fBOR\fR. For
-example,
-.RS
-\fBquery\-pr\fR \fB\-\-category=\fIbaz\fR \fB\-\-or\fR \fB\-\-responsible=\fIblee\fR
-.RE
-prints PRs which have either a \fBCategory\fR field of \fIbaz\fR \fIor\fR a
-\fBResponsible\fR field of \fIblee\fR.
-.LP
-The use of these options is strongly discouraged, as they will be
-deleted in the next release.  The expressions specified by the
-\fB\-\-expr\fR option are much more flexible.
-.SH OPTIONS
-.TP 0.5i
-\fB\-\-help\fR,\ \fB\-h\fR
-Prints a (rather longish) help message.
-.TP
-\fB\-\-version\fR,\ \fB\-V\fR
-Displays the program version to stdout.
-.TP
-\fB\-\-output\fR\ \fIfile\fR,\ \fB\-o\fR\ \fIfile\fR
-The results of the query will be placed in this file.
-.TP
-\fB\-\-database\fR\ \fIdatabase\fR,\ \fB\-d\fR\ \fIdatabase\fR
-Specifies the database to be used for the query.  If no database is
-specified, the database named \fIdefault\fR is assumed.  (This option
-overrides the database specified in the \fBGNATSDB\fR environment
-variable; see the \fBENVIRONMENT VARIABLES\fR section for more
-information.)
-.TP
-\fB\-\-list\-categories\fR,\ \fB\-j\fR
-Lists the available \fIPR\fR categories for the selected database.  
-.TP
-\fB\-\-list\-classes\fR,\ \fB\-J\fR
-Lists the available \fIPR\fR classes for the selected database.
-.TP
-\fB\-\-list\-responsible\fR,\ \fB\-k\fR
-Lists the users that appear in the database's responsible list.
-.TP
-\fB\-\-list\-submitters\fR,\ \fB\-l\fR
-Lists the valid submitters for this database.
-.TP
-\fB\-\-list\-states\fR,\ \fB\-T\fR
-Lists the valid \fIPR\fR states for \fIPR\fRs in this database.
-.PP
-The previous \fB\-\-list-*\fR options are deprecated and will be removed in
-the next release; their functionality can be replaced with
-.RE
-.PP
-.RS 1.5i
-\fBquery-pr\fR \fB\-\-valid-values\fR \fIfield\fR
-.RE
-.PP
-where \fIfield\fR is one of \fBCategory\fR, \fBClass\fR, \fBResponsible\fR,
-\fBSubmitter-Id\fR, or \fBState\fR.
-.TP
-\fB\-\-list\-databases\fR
-Lists the known databases.
-.TP
-\fB\-\-list\-fields\fR
-Lists the entire set of field names for \fIPR\fRs in the selected
-database.
-.TP
-\fB\-\-list\-input\-fields\fR
-Lists the fields that should be provided when creating a new \fIPR\fR
-for the currently-specified database.  The fields are listed in an
-order that would make sense when used in a template or form.
-.TP
-\fB\-\-field\-type\fR\ \fIfield\fR
-Returns the data type contained in \fIPR\fR field \fIfield\fR.  The
-current set of data types includes \fBtext\fR, \fBmultitext\fR,
-\fBenum\fR, \fBmultienum\fR, \fBinteger\fR, \fBdate\fR, and
-\fBtext-with-regex-qualifier\fR.
-.TP
-\fB\-\-field\-description\fR\ \fIfield\fR
-Returns a human-readable description of the intended purpose of \fIfield\fR.
-.TP
-\fB\-\-valid\-values\fR\ \fIfield\fR
-For fields of type \fBenum\fR, a list of valid values (one per line) is
-returned.  Otherwise, a regular expression is returned that describes the
-legal values in \fIfield\fR.
-.TP
-\fB\-\-responsible\-address\fR\ \fIname\fR
-The mail address of \fIname\fR is returned; \fIname\fR is assumed to
-be a name either appearing in the database's \fBresponsible\fR list,
-or is otherwise a user on the system.
-.TP
-\fB\-\-print\-sh\-vars\fR
-A set of \fI/bin/sh\fR variables is returned that describe the selected
-database.  They include:
-.RS
-.TP
-GNATSDB
-The name of the currently-selected database.
-.TP
-GNATSDB_VALID
-Set to 1 if the selected database is valid.
-.TP
-GNATSDBDIR
-The directory where the database contents are stored.
-.TP
-DEBUG_MODE
-Set to 1 if debug mode has been enabled for the database.
-.TP
-DEFAULTCATEGORY
-The default category for \fIPR\fRs in the database.
-.TP
-DEFAULTSTATE
-The default state for \fIPR\fRs in the database.
-.RE
-.TP
-\fB\-\-print\-directory\-for\-database\fR
-Returns the directory where the selected database is located.
-.TP
-\fB\-\-format\fR\ \fIformat\fR,\ \fB\-f\fR\ \fIformat\fR
-Used to specify the format of the output \fIPR\fRs, See FORMATS below
-for a complete description.
-.TP
-\fB\-\-full\fR,\ \fB\-F\fR
-When printing \fIPR\fRs, the entre PR is displayed.  This is exactly
-equivalent to
-.PP
-.RS 1i
-\fBquery-pr\fR \fB\-\-format\fR \fBfull\fR
-.RE
-.TP
-\fB\-\-summary\fR,\ \fB\-q\fR
-When printing \fIPR\fRs, a summary format is used.  This is exactly 
-equivalent to
-.PP
-.RS 1i
-\fBquery-pr\fR \fB\-\-format\fR \fBsummary\fR
-.RE
-.TP
-\fB\-\-debug\fR,\ \fB\-D\fR
-Enables debugging output for network queries.
-.TP
-\fB\-\-host\fR\ \fIhost\fR,\ \fB\-H\fR\ \fIhost\fR
-Specifies the hostname of the \fBgnatsd\fR server to communicate with.
-This overrides the value in the \fBGNATSDB\fR environment variable.
-.TP
-\fB\-\-port\fR\ \fIport\fR
-Specifies the port number of the \fBgnatsd\fR server to communicate with.
-This overrides the value in the \fBGNATSDB\fR environment variable.
-.TP
-\fB\-\-user\fR\ \fIuser\fR,\ \fB\-v\fR\ \fIuser\fR
-Specifies the username to login with when connecting to the \fBgnatsd\fR 
-server.  This overrides the value in the \fBGNATSDB\fR environment variable.
-.TP
-\fB\-\-passwd\fR\ \fIpasswd\fR,\ \fB\-w\fR\ \fIpasswd\fR
-Specifies the password to login with when connecting to the \fBgnatsd\fR 
-server.  This overrides the value in the \fBGNATSDB\fR environment variable.
-.TP
-\fB\-\-and\fR,\ \fB\-&\fR, \fB\-\-or\fR,\ \fB\-|,\fR
-These options are used when connecting multiple query operators together.
-They specify whether the previous and subsequent options are to be logically
-\fBAND\fRed or logically \fBOR\fRed.
-.TP
-\fB\-\-expr\fR\ \fIexpr\fR
-Specifies a query expression to use when searching for PRs.  See the
-\fBQUERY EXPRESSIONS\fR section.
-.PP
-The remaining deprecated options are not described here, since their
-use is fairly obvious and their functionality is completely replaced
-by the use of the \fB\-\-expr\fR option.  (Some sort of shorthand
-option for querying fields may appear in the next release.)
-.SH FORMATS
-Printing formats for \fIPR\fRs are in one of three forms:
-.TP
-\fBformatname\fR
-This is a \fInamed format\fR which is described by the database
-(specifically, these formats are described in the \fIdbconfig\fR
-file associated with the database).  The default configuration
-contains five such formats: \fIstandard\fR, \fIfull\fR, \fIsummary\fR,
-\fIsql\fR, and \fIsql2\fR.
-.PP
-.RS
-The first three are the ones most commonly used when performing queries.
-\fIstandard\fR is the format used by default if no other format is specified.
-.PP
-Use of the latter two are discouraged; they are merely kept for historical
-purposes.
-.PP
-Other named formats may have been added by the database administrator.
-.RE
-.TP
-\fBfieldname\fR
-A single field name may appear here.  Only the contents of this field will
-be displayed.
-.TP
-"\fIprintf string\fR" \fIfieldname\fR \fIfieldname\fR . . .
-
-This provides a rather flexible mechanism for formatting \fIPR\fR
-output.  (The formatting is identical to that provided by the named
-formats described by the database configuration.)  The printf string
-can contain the following % sequences:
-.PP
-.RS
-\fB%[positionalspecifiers]s\fR:  Prints the field as a string.  The positional
-specifiers are similar to those of printf, as +, - and digit qualifiers
-can be used to force a particular alignment of the field contents.
-.PP
-\fB%[positionalspecifiers]S\fR: Similar to %s, except that the field contents
-are terminated at the first space character.
-.PP
-\fB%[positionalspecifiers]d\fR: Similar to %s, except that the field
-contents are written as a numeric value.  For integer fields, the
-value is written as a number.  For enumerated fields, the field is
-converted into a numeric equivalent (i.e. if the field can have two
-possible values, the result will be either 1 or 2).  For date fields,
-the value is written as seconds since Jan 1, 1970.
-.PP
-\fB%F\fR: The field is written as it would appear within a \fIPR\fR,
-complete with field header.
-.PP
-\fB%D\fR: For date fields, the date is written in a standard GNATS format.
-.PP
-\fB%Q\fR: For date fields, the date is written in an arbitrary "SQL" format.
-.RE
-.SH QUERY EXPRESSIONS
-Query expressions are used to select specific \fIPR\fRs based on their field
-contents.  The general form is
-.P
-.RS
-\fIfieldname\fR|"\fIvalue\fR" \fIoperator\fR \fIfieldname\fR|"\fIvalue\fR" [\fIbooleanop\fR ...]
-.RE
-.P
-\fIvalue\fR is a literal string or regular expression; it must be
-surrounded by double quotes, otherwise it is interpreted as a
-\fIfieldname\fR.
-.P
-\fIfieldname\fR is the name of a field in the \fIPR\fR.
-.P
-\fIoperator\fR is one of:
-.TP
-\fI=\fR
-The value of the left-hand side of the expression must exactly match
-the regular expression on the right-hand side of the expression.
-.TP
-\fI~\fR
-Some portion of the left-hand side of the expression must match the
-regular expression on the right-hand side.
-.TP
-\fI==\fR
-The value of the left-hand side must be equal to the value
-on the right-hand side of the expression.
-.RS
-.PP
-The equality of two values depends on what type of data is stored in
-the field(s) being queried.  For example, when querying a field
-containing integer values, literal strings are interpreted as
-integers.  The query expression
-.P
-.RS
-Number == "0123"
-.RE
-.P
-is identical to
-.P
-.RS
-Number == "123"
-.RE
-.P
-as the leading zero is ignored.  If the values were treated as strings instead
-of integers, then the two comparisons would return different results.
-.RE
-.TP
-\fI!=\fR
-The not-equal operator. Produces the opposite result of the \fI==\fR
-operator.
-.TP
-\fI<\fR,\fI>\fR
-The left-hand side must have a value less than or greater than the
-right-hand side.  Comparisons are done depending on the type of data
-being queried; in particular, integer fields and dates use a numeric
-comparison, and enumerated fields are ordered depending on the numeric
-equivalent of their enumerated values.
-.PP
-\fIbooleanop\fR is either | [or], or & [and].  The query expression
-.RS
-Category="baz" | Responsible="blee"
-.RE
-is identical to the second query example with \fB\-\-or\fR given earlier;
-it selects all \fIPR\fRs with a Category field of \fIbaz\fR or a Responsible
-field of \fIblee\fR.
-.PP
-The not operator \fI!\fR may be used to negate a test:
-.RS
-! Category="foo"
-.RE
-searches for \fIPR\fRs where the category is \fInot\fR equal to the 
-regular expression \fIfoo\fR.
-.PP
-Parenthesis may be used to force a particular interpretation of the
-expression:
-.RS
-!(Category="foo" & Submitter-Id="blaz")
-.RE
-skips \fIPR\fRs where the \fBCategory\fR field is equal to \fIfoo\fR and the
-\fBSubmitter-Id\fR field is equal to \fIblaz\fR.  Parenthesis may be
-nested to any arbitrary depth.
-.P
-Fieldnames can be specified in several ways.  The simplest and most obvious
-is just a name:
-.RS
-Category="foo"
-.RE
-checks the value of the category field for the value "foo".  
-.P
-A fieldname qualifier may be prepended to the name of the field; a
-colon is used to separate the qualifier from the name.  To refer
-directly to a builtin field name:
-.P
-.RS
-builtin:Number="123"
-.RE
-.P
-In this case, \fINumber\fR is interpreted as the builtin name of the field
-to check.  (This is useful if the fields have been renamed.  For more
-discussion of builtin field names, see dbconfig(5).)
-.P
-To scan all fields of a particular type, the \fIfieldtype\fR qualifier may
-be used:
-.P
-.RS
-fieldtype:Text="bar"
-.RE
-.P
-searches all text fields for the regular expression \fIbar\fR.
-.P
-Note that it is not necessary that the right-hand side of the expression be
-a literal string.  To query all \fIPR\fRs where the \fIPR\fR has been modified 
-since it was closed, the expression
-.P
-.RS
-Last-Modified != Closed-Date
-.RE
-.P
-will work; for each \fIPR\fR, it compares the value of its Last-Modified
-field against its Closed-Date field, and returns those \fIPR\fRs where the
-values differ.  However, this query will also return all \fIPR\fRs with
-empty Last-Modified or Closed-Date fields.  To further narrow the
-search:
-.P
-.RS
-Last-Modified != Closed-Date & Last-Modified != "" & Closed-Date != ""
-.RE
-.P
-In general, comparing fields of two different types (an integer field
-against a date field, for example) will probably not do what you want.
-.P
-Also, a field specifier may be followed by the name of a subfield
-in braces:
-.P
-.RS
-State[type] != "closed"
-.RE
-.P
-or even
-.P
-.RS
-builtin:State[type] != "closed"
-.RE
-.P
-Subfields are further discussed in dbconfig(5).
-
-.SH QUERY BY MAIL
-.B query-pr
-can also be accessed by electronic mail, if your version
-of GNATS is configured for this.  To use this feature, simply send
-mail to the address 
-.BI query-pr@ your-site
-with command line arguments or options in the 
-.B Subject:
-line of the mail header.  GNATS replies to your mail with the results
-of your query.  The default settings for the
-.B query-pr
-mail server are shown below; to override the
-.B \-\-state
-parameter, specify
-.BI \-\-state= state
-in the
-.B Subject:
-line of the mail header.  You can not query on confidential Problem
-Reports by mail.
-.TP 1i
-.B \-\-restricted \-\-state="open|analyzed|feedback|suspended"
-.SH ENVIRONMENT VARIABLES
-The \fBGNATSDB\fR environment variable is used to determine which database to
-use.  For a local database, it contains the name of the database to access.
-.P
-For network access via \fIgnatsd\fR, it contains a colon-separated list
-of strings that describe the remote database in the form
-.TP
-\fIserver\fR:\fIport\fR:\fIdatabasename\fR:\fIusername\fR:\fIpassword\fR
-.P
-Any of the fields may be omitted except for \fIserver\fR, but at
-least one colon must appear; otherwise, the value is assumed to be the
-name of a local database.
-.P
-If \fBGNATSDB\fR is not set, it is assumed that the database is local
-and that its name is \fIdefault\fR.
-.SH "SEE ALSO"
-.I Keeping Track: Managing Messages With GNATS
-(also installed as the GNU Info file
-.BR gnats.info )
-and
-.I Reporting Problems Using send-pr
-(also installed as the GNU Info file
-.BR send-pr.info ).
-.LP
-.BR gnats (7),
-.BR send-pr (1),
-.BR edit-pr (1),
-.BR file-pr (8),
-.BR queue-pr (8),
-.BR nquery-pr (1),
-.BR mkcat (8),
-.BR rmcat (8),
-.BR gen-index (8),
-.BR mkdb (8).
-.SH COPYING
-Copyright (c) 1993, 94, 95, 96, 1997, 1999 Free Software Foundation, Inc.
-.PP
-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.
-.PP
-Permission is granted to copy and distribute modified versions of this
-manual under the conditions for verbatim copying, provided that the
-entire resulting derived work is distributed under the terms of a
-permission notice identical to this one.
-.PP
-Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that this permission notice may be included in
-translations approved by the Free Software Foundation instead of in
-the original English.
diff -x CVS -uNr gnats/gnats/man/queue-pr.man gnats.new/gnats/man/queue-pr.man
--- gnats/gnats/man/queue-pr.man	1999-12-30 22:19:21.000000000 -0600
+++ gnats.new/gnats/man/queue-pr.man	1969-12-31 18:00:00.000000000 -0600
@@ -1,124 +0,0 @@
-.\" Copyright (c) 1993 Free Software Foundation, Inc.
-.\" See section COPYING for conditions for redistribution
-.TH queue-pr 8 "December 1999" "GNATS @VERSION@" "GNATS Administration Utilities"
-.de BP
-.sp
-.ti -.2i
-\(**
-..
-.SH NAME
-queue-pr \- incoming mail control for GNATS
-.SH SYNOPSIS
-.hy 0
-.na
-.TP 1i
-.B queue-pr
-[
-.B \-q | \-\-queue
-]
-[
-.B \-r | \-\-run
-]
-.br
-[
-.B \-f \fIfilename\fB | \-\-file=\fIfilename\fR
-]
-.br
-[
-.B \-d \fIdatabase\fB | \-\-database=\fIdatabase\fR
-]
-.ad b
-.hy 1
-.SH DESCRIPTION
-.B `queue-pr -q' 
-should run through a 
-.BR pipe (2V)
-via the mail 
-.BR aliases (5)
-mechanism to automatically place incoming bug reports in a queue 
-directory for
-.B GNATS.
-.LP
-Run
-.B `queue-pr -r'
-via
-.BR cron (8)
-to periodically empty the 
-.B GNATS
-queue, filing new bug reports in the database.
-.LP
-Always use one of [
-.B \-q | \-\-queue
-] or [
-.B \-r | \-\-run
-] (but not both), in each call to 
-.B queue-pr.
-These are mutually exclusive functions in order to avoid collisions.
-.SH OPTIONS
-.TP 1i
-.B \-q, \-\-queue
-Accept standard input as an incoming mail message, placing this message in
-an incrementally numbered file in the database subdirectory \fBgnats-queue\fR
-for future handling.
-.TP
-.B \-r, \-\-run
-Redirect files from the database subdirectory \fBgnats-queue\fR to
-.BR file-pr (8)
-which files and creates index entries for each.
-.TP
-.B \-f \fIfilename\fR or \fB\-\-file=\fIfilename\fR
-Treat
-.I filename
-as input rather than reading from standard input (used with the
-.B \-\-queue
-option).
-.TP
-.B \-d \fIdatabase\fR or \fB\-\-database=\fIdatabasename\fR
-Used with the 
-.B \-\-queue
-or
-.B \-\-run
-options, use the database named
-.I database
-rather than the database \fIdefault\fR or the database specified by the
-.B GNATSDB
-environment variable.
-.SH "ENVIRONMENT VARIABLES"
-The \fBGNATSDB\fR environment variable is used to determine which database to
-use.  For a local database, it contains the name of the database to access.
-If \fBGNATSDB\fR is not set, the database named \fIdefault\fR is used.
-.SH "SEE ALSO"
-.I Keeping Track: Managing Messages With GNATS
-(also installed as the GNU Info file
-.BR gnats.info )
-and
-.I Reporting Problems Using send-pr
-(also installed as the GNU Info file
-.BR send-pr.info ).
-.LP
-.BR gnats (7),
-.BR send-pr (1),
-.BR query-pr (1),
-.BR edit-pr (1),
-.BR file-pr (8),
-.BR mkcat (8),
-.BR rmcat (8),
-.BR gen-index (8),
-.BR mkdb (8).
-.SH COPYING
-Copyright (c) 1993 Free Software Foundation, Inc.
-.PP
-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.
-.PP
-Permission is granted to copy and distribute modified versions of this
-manual under the conditions for verbatim copying, provided that the
-entire resulting derived work is distributed under the terms of a
-permission notice identical to this one.
-.PP
-Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that this permission notice may be included in
-translations approved by the Free Software Foundation instead of in
-the original English.
diff -x CVS -uNr gnats/gnats/man/rmcat.man gnats.new/gnats/man/rmcat.man
--- gnats/gnats/man/rmcat.man	2000-01-22 23:35:38.000000000 -0600
+++ gnats.new/gnats/man/rmcat.man	1969-12-31 18:00:00.000000000 -0600
@@ -1,75 +0,0 @@
-.\" Copyright (c) 1993, 2000 Free Software Foundation, Inc.
-.\" See section COPYING for conditions for redistribution
-.TH rmcat 8 "January 2000" "GNATS @VERSION@" "GNATS Admininstration Utilities"
-.de BP
-.sp
-.ti -.2i
-\(**
-..
-.SH NAME
-rmcat \- remove GNATS categories
-.SH SYNOPSIS
-.hy 0
-.na
-.TP
-.B rmcat
-.I category
-[
-.I category...
-]
-.ad b
-.hy 1
-.SH DESCRIPTION
-Removes any named
-.I category
-from the
-.B GNATS
-installation.  
-Before calling
-.BR rmcat ,
-you must first remove
-.I category
-from the list of categories in the database.  You must also reclassify
-or remove all problem reports associated with
-.I category
-(i.e., 
-.IR category 's
-subdirectory must be empty).
-.P
-rmcat is mostly useless now, but is kept for histerical reasons.
-.SH "SEE ALSO"
-.I Keeping Track: Managing Messages With GNATS
-(also installed as the GNU Info file
-.BR gnats.info )
-and
-.I Reporting Problems Using send-pr
-(also installed as the GNU Info file
-.BR send-pr.info ).
-.LP
-.BR gnats (7),
-.BR send-pr (1),
-.BR edit-pr (1),
-.BR delete-pr (8),
-.BR query-pr (1),
-.BR file-pr (8),
-.BR queue-pr (8),
-.BR gen-index (8),
-.BR mkcat (8),
-.BR mkdb (8).
-.SH COPYING
-Copyright (c) 1993, 2000 Free Software Foundation, Inc.
-.PP
-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.
-.PP
-Permission is granted to copy and distribute modified versions of this
-manual under the conditions for verbatim copying, provided that the
-entire resulting derived work is distributed under the terms of a
-permission notice identical to this one.
-.PP
-Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that this permission notice may be included in
-translations approved by the Free Software Foundation instead of in
-the original English.
diff -x CVS -uNr gnats/install-sh gnats.new/install-sh
--- gnats/install-sh	1999-10-26 02:10:15.000000000 -0500
+++ gnats.new/install-sh	1969-12-31 18:00:00.000000000 -0600
@@ -1,251 +0,0 @@
-#!/bin/sh
-#
-# install - install a program, script, or datafile
-# This comes from X11R5 (mit/util/scripts/install.sh).
-#
-# Copyright 1991 by the Massachusetts Institute of Technology
-#
-# Permission to use, copy, modify, distribute, and sell this software and its
-# documentation for any purpose is hereby granted without fee, provided that
-# the above copyright notice appear in all copies and that both that
-# copyright notice and this permission notice appear in supporting
-# documentation, and that the name of M.I.T. not be used in advertising or
-# publicity pertaining to distribution of the software without specific,
-# written prior permission.  M.I.T. makes no representations about the
-# suitability of this software for any purpose.  It is provided "as is"
-# without express or implied warranty.
-#
-# Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
-# when there is no Makefile.
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch.  It can only install one file at a time, a restriction
-# shared with many OS's install programs.
-
-
-# set DOITPROG to echo to test this script
-
-# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit="${DOITPROG-}"
-
-
-# put in absolute paths if you don't have them in your path; or use env. vars.
-
-mvprog="${MVPROG-mv}"
-cpprog="${CPPROG-cp}"
-chmodprog="${CHMODPROG-chmod}"
-chownprog="${CHOWNPROG-chown}"
-chgrpprog="${CHGRPPROG-chgrp}"
-stripprog="${STRIPPROG-strip}"
-rmprog="${RMPROG-rm}"
-mkdirprog="${MKDIRPROG-mkdir}"
-
-transformbasename=""
-transform_arg=""
-instcmd="$mvprog"
-chmodcmd="$chmodprog 0755"
-chowncmd=""
-chgrpcmd=""
-stripcmd=""
-rmcmd="$rmprog -f"
-mvcmd="$mvprog"
-src=""
-dst=""
-dir_arg=""
-
-while [ x"$1" != x ]; do
-    case $1 in
-	-c) instcmd="$cpprog"
-	    shift
-	    continue;;
-
-	-d) dir_arg=true
-	    shift
-	    continue;;
-
-	-m) chmodcmd="$chmodprog $2"
-	    shift
-	    shift
-	    continue;;
-
-	-o) chowncmd="$chownprog $2"
-	    shift
-	    shift
-	    continue;;
-
-	-g) chgrpcmd="$chgrpprog $2"
-	    shift
-	    shift
-	    continue;;
-
-	-s) stripcmd="$stripprog"
-	    shift
-	    continue;;
-
-	-t=*) transformarg=`echo $1 | sed 's/-t=//'`
-	    shift
-	    continue;;
-
-	-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
-	    shift
-	    continue;;
-
-	*)  if [ x"$src" = x ]
-	    then
-		src=$1
-	    else
-		# this colon is to work around a 386BSD /bin/sh bug
-		:
-		dst=$1
-	    fi
-	    shift
-	    continue;;
-    esac
-done
-
-if [ x"$src" = x ]
-then
-	echo "install:	no input file specified"
-	exit 1
-else
-	true
-fi
-
-if [ x"$dir_arg" != x ]; then
-	dst=$src
-	src=""
-	
-	if [ -d $dst ]; then
-		instcmd=:
-		chmodcmd=""
-	else
-		instcmd=mkdir
-	fi
-else
-
-# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
-# might cause directories to be created, which would be especially bad 
-# if $src (and thus $dsttmp) contains '*'.
-
-	if [ -f $src -o -d $src ]
-	then
-		true
-	else
-		echo "install:  $src does not exist"
-		exit 1
-	fi
-	
-	if [ x"$dst" = x ]
-	then
-		echo "install:	no destination specified"
-		exit 1
-	else
-		true
-	fi
-
-# If destination is a directory, append the input filename; if your system
-# does not like double slashes in filenames, you may need to add some logic
-
-	if [ -d $dst ]
-	then
-		dst="$dst"/`basename $src`
-	else
-		true
-	fi
-fi
-
-## this sed command emulates the dirname command
-dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
-
-# Make sure that the destination directory exists.
-#  this part is taken from Noah Friedman's mkinstalldirs script
-
-# Skip lots of stat calls in the usual case.
-if [ ! -d "$dstdir" ]; then
-defaultIFS='	
-'
-IFS="${IFS-${defaultIFS}}"
-
-oIFS="${IFS}"
-# Some sh's can't handle IFS=/ for some reason.
-IFS='%'
-set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
-IFS="${oIFS}"
-
-pathcomp=''
-
-while [ $# -ne 0 ] ; do
-	pathcomp="${pathcomp}${1}"
-	shift
-
-	if [ ! -d "${pathcomp}" ] ;
-        then
-		$mkdirprog "${pathcomp}"
-	else
-		true
-	fi
-
-	pathcomp="${pathcomp}/"
-done
-fi
-
-if [ x"$dir_arg" != x ]
-then
-	$doit $instcmd $dst &&
-
-	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
-	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
-	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
-	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
-else
-
-# If we're going to rename the final executable, determine the name now.
-
-	if [ x"$transformarg" = x ] 
-	then
-		dstfile=`basename $dst`
-	else
-		dstfile=`basename $dst $transformbasename | 
-			sed $transformarg`$transformbasename
-	fi
-
-# don't allow the sed command to completely eliminate the filename
-
-	if [ x"$dstfile" = x ] 
-	then
-		dstfile=`basename $dst`
-	else
-		true
-	fi
-
-# Make a temp file name in the proper directory.
-
-	dsttmp=$dstdir/#inst.$$#
-
-# Move or copy the file name to the temp name
-
-	$doit $instcmd $src $dsttmp &&
-
-	trap "rm -f ${dsttmp}" 0 &&
-
-# and set any options; do chmod last to preserve setuid bits
-
-# If any of these fail, we abort the whole thing.  If we want to
-# ignore errors from any of these, just make sure not to ignore
-# errors from the above "$doit $instcmd $src $dsttmp" command.
-
-	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
-	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
-	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
-	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
-
-# Now rename the file to the real destination.
-
-	$doit $rmcmd -f $dstdir/$dstfile &&
-	$doit $mvcmd $dsttmp $dstdir/$dstfile 
-
-fi &&
-
-
-exit 0
diff -x CVS -uNr gnats/missing gnats.new/missing
--- gnats/missing	1999-10-26 02:10:16.000000000 -0500
+++ gnats.new/missing	1969-12-31 18:00:00.000000000 -0600
@@ -1,190 +0,0 @@
-#! /bin/sh
-# Common stub for a few missing GNU programs while installing.
-# Copyright (C) 1996, 1997 Free Software Foundation, Inc.
-# Franc,ois Pinard <pinard@iro.umontreal.ca>, 1996.
-
-# 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., 59 Temple Place - Suite 330, Boston, MA
-# 02111-1307, USA.
-
-if test $# -eq 0; then
-  echo 1>&2 "Try \`$0 --help' for more information"
-  exit 1
-fi
-
-case "$1" in
-
-  -h|--h|--he|--hel|--help)
-    echo "\
-$0 [OPTION]... PROGRAM [ARGUMENT]...
-
-Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
-error status if there is no known handling for PROGRAM.
-
-Options:
-  -h, --help      display this help and exit
-  -v, --version   output version information and exit
-
-Supported PROGRAM values:
-  aclocal      touch file \`aclocal.m4'
-  autoconf     touch file \`configure'
-  autoheader   touch file \`config.h.in'
-  automake     touch all \`Makefile.in' files
-  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
-  flex         create \`lex.yy.c', if possible, from existing .c
-  lex          create \`lex.yy.c', if possible, from existing .c
-  makeinfo     touch the output file
-  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]"
-    ;;
-
-  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
-    echo "missing - GNU libit 0.0"
-    ;;
-
-  -*)
-    echo 1>&2 "$0: Unknown \`$1' option"
-    echo 1>&2 "Try \`$0 --help' for more information"
-    exit 1
-    ;;
-
-  aclocal)
-    echo 1>&2 "\
-WARNING: \`$1' is missing on your system.  You should only need it if
-         you modified \`acinclude.m4' or \`configure.in'.  You might want
-         to install the \`Automake' and \`Perl' packages.  Grab them from
-         any GNU archive site."
-    touch aclocal.m4
-    ;;
-
-  autoconf)
-    echo 1>&2 "\
-WARNING: \`$1' is missing on your system.  You should only need it if
-         you modified \`configure.in'.  You might want to install the
-         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
-         archive site."
-    touch configure
-    ;;
-
-  autoheader)
-    echo 1>&2 "\
-WARNING: \`$1' is missing on your system.  You should only need it if
-         you modified \`acconfig.h' or \`configure.in'.  You might want
-         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
-         from any GNU archive site."
-    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' configure.in`
-    test -z "$files" && files="config.h"
-    touch_files=
-    for f in $files; do
-      case "$f" in
-      *:*) touch_files="$touch_files "`echo "$f" |
-				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
-      *) touch_files="$touch_files $f.in";;
-      esac
-    done
-    touch $touch_files
-    ;;
-
-  automake)
-    echo 1>&2 "\
-WARNING: \`$1' is missing on your system.  You should only need it if
-         you modified \`Makefile.am', \`acinclude.m4' or \`configure.in'.
-         You might want to install the \`Automake' and \`Perl' packages.
-         Grab them from any GNU archive site."
-    find . -type f -name Makefile.am -print |
-	   sed 's/\.am$/.in/' |
-	   while read f; do touch "$f"; done
-    ;;
-
-  bison|yacc)
-    echo 1>&2 "\
-WARNING: \`$1' is missing on your system.  You should only need it if
-         you modified a \`.y' file.  You may need the \`Bison' package
-         in order for those modifications to take effect.  You can get
-         \`Bison' from any GNU archive site."
-    rm -f y.tab.c y.tab.h
-    if [ $# -ne 1 ]; then
-        eval LASTARG="\${$#}"
-	case "$LASTARG" in
-	*.y)
-	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
-	    if [ -f "$SRCFILE" ]; then
-	         cp "$SRCFILE" y.tab.c
-	    fi
-	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
-	    if [ -f "$SRCFILE" ]; then
-	         cp "$SRCFILE" y.tab.h
-	    fi
-	  ;;
-	esac
-    fi
-    if [ ! -f y.tab.h ]; then
-	echo >y.tab.h
-    fi
-    if [ ! -f y.tab.c ]; then
-	echo 'main() { return 0; }' >y.tab.c
-    fi
-    ;;
-
-  lex|flex)
-    echo 1>&2 "\
-WARNING: \`$1' is missing on your system.  You should only need it if
-         you modified a \`.l' file.  You may need the \`Flex' package
-         in order for those modifications to take effect.  You can get
-         \`Flex' from any GNU archive site."
-    rm -f lex.yy.c
-    if [ $# -ne 1 ]; then
-        eval LASTARG="\${$#}"
-	case "$LASTARG" in
-	*.l)
-	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
-	    if [ -f "$SRCFILE" ]; then
-	         cp "$SRCFILE" lex.yy.c
-	    fi
-	  ;;
-	esac
-    fi
-    if [ ! -f lex.yy.c ]; then
-	echo 'main() { return 0; }' >lex.yy.c
-    fi
-    ;;
-
-  makeinfo)
-    echo 1>&2 "\
-WARNING: \`$1' is missing on your system.  You should only need it if
-         you modified a \`.texi' or \`.texinfo' file, or any other file
-         indirectly affecting the aspect of the manual.  The spurious
-         call might also be the consequence of using a buggy \`make' (AIX,
-         DU, IRIX).  You might want to install the \`Texinfo' package or
-         the \`GNU make' package.  Grab either from any GNU archive site."
-    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
-    if test -z "$file"; then
-      file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
-      file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
-    fi
-    touch $file
-    ;;
-
-  *)
-    echo 1>&2 "\
-WARNING: \`$1' is needed, and you do not seem to have it handy on your
-         system.  You might have modified some files without having the
-         proper tools for further handling them.  Check the \`README' file,
-         it often tells you about the needed prerequirements for installing
-         this package.  You may also peek at any GNU archive site, in case
-         some other package would contain this missing \`$1' program."
-    exit 1
-    ;;
-esac
-
-exit 0
diff -x CVS -uNr gnats/texinfo/texinfo.tex gnats.new/texinfo/texinfo.tex
--- gnats/texinfo/texinfo.tex	1998-11-05 13:54:14.000000000 -0600
+++ gnats.new/texinfo/texinfo.tex	2004-11-30 09:43:14.000000000 -0600
@@ -1,52 +1,80 @@
-%% TeX macros to handle Texinfo files.
-%% $Id: texinfo.tex,v 2.201 1997/05/24 22:06:39 karl Exp $
-
-%  Copyright (C) 1985, 86, 88, 90, 91, 92, 93,
-%                94, 95, 96, 97 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, Inc., 59 Temple Place - Suite 330,
-%Boston, MA 02111-1307, 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!
-
-
-% Send bug reports to bug-texinfo@prep.ai.mit.edu.
-% Please include a *precise* test case in each bug report.
-
-
-% Make it possible to create a .fmt file just by loading this file:
-% if the underlying format is not loaded, start by loading it now.
-% Added by gildea November 1993.
+% texinfo.tex -- TeX macros to handle Texinfo files.
+%
+% Load plain if necessary, i.e., if running under initex.
 \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
+%
+\def\texinfoversion{2004-04-07.08}
+%
+% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
+% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 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, Inc., 59 Temple Place - Suite 330,
+% Boston, MA 02111-1307, USA.
+%
+% As a special exception, when this file is read by TeX when processing
+% a Texinfo source document, you may use the result without
+% restriction.  (This has been our intent since Texinfo was invented.)
+% 
+% Please try the latest version of texinfo.tex before submitting bug
+% reports; you can get the latest version from:
+%   http://www.gnu.org/software/texinfo/ (the Texinfo home page), or
+%   ftp://tug.org/tex/texinfo.tex
+%     (and all CTAN mirrors, see http://www.ctan.org).
+% The texinfo.tex in any given distribution could well be out
+% of date, so if that's what you're using, please check.
+%
+% Send bug reports to bug-texinfo@gnu.org.  Please include including a
+% complete document in each bug report with which we can reproduce the
+% problem.  Patches are, of course, greatly appreciated.
+%
+% To process a Texinfo manual with TeX, it's most reliable to use the
+% texi2dvi shell script that comes with the distribution.  For a simple
+% manual foo.texi, however, you can get away with this:
+%   tex foo.texi
+%   texindex foo.??
+%   tex foo.texi
+%   tex foo.texi
+%   dvips foo.dvi -o  # or whatever; this makes foo.ps.
+% The extra TeX runs get the cross-reference information correct.
+% Sometimes one run after texindex suffices, and sometimes you need more
+% than two; texi2dvi does it as many times as necessary.
+%
+% It is possible to adapt texinfo.tex for other languages, to some
+% extent.  You can get the existing language-specific files from the
+% full Texinfo distribution.
+% 
+% The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
+
 
-% This automatically updates the version number based on RCS.
-\def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}}
-\deftexinfoversion$Revision: 2.201 $
-\message{Loading texinfo package [Version \texinfoversion]:}
+\message{Loading texinfo [version \texinfoversion]:}
 
 % If in a .fmt file, print the version number
 % and turn on active characters that we couldn't do earlier because
 % they might have appeared in the input file name.
-\everyjob{\message{[Texinfo version \texinfoversion]}\message{}
+\everyjob{\message{[Texinfo version \texinfoversion]}%
   \catcode`+=\active \catcode`\_=\active}
 
-% Save some parts of plain tex whose names we will redefine.
+\message{Basics,}
+\chardef\other=12
 
+% We never want plain's \outer definition of \+ in Texinfo.
+% For @tex, we can use \tabalign.
+\let\+ = \relax
+
+% Save some plain tex macros whose names we will redefine.
 \let\ptexb=\b
 \let\ptexbullet=\bullet
 \let\ptexc=\c
@@ -54,88 +82,199 @@
 \let\ptexdot=\.
 \let\ptexdots=\dots
 \let\ptexend=\end
-\let\ptexequiv = \equiv
+\let\ptexequiv=\equiv
+\let\ptexexclam=\!
+\let\ptexfootnote=\footnote
+\let\ptexgtr=>
+\let\ptexhat=^
 \let\ptexi=\i
+\let\ptexindent=\indent
+\let\ptexnoindent=\noindent
+\let\ptexinsert=\insert
 \let\ptexlbrace=\{
+\let\ptexless=<
+\let\ptexplus=+
 \let\ptexrbrace=\}
+\let\ptexslash=\/
 \let\ptexstar=\*
 \let\ptext=\t
 
-% 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
- % Avoid using \@M directly, because that causes trouble
- % if the definition is written into an index file.
- \global\let\tiepenalty = \@M
- \gdef\tie{\leavevmode\penalty\tiepenalty\ }
-}
-
-
-\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%
+% 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 % Pre-3.0.
+\else
+  \def\linenumber{l.\the\inputlineno:\space}
+\fi
+
+% Set up fixed words for English if not already set.
+\ifx\putwordAppendix\undefined  \gdef\putwordAppendix{Appendix}\fi
+\ifx\putwordChapter\undefined   \gdef\putwordChapter{Chapter}\fi
+\ifx\putwordfile\undefined      \gdef\putwordfile{file}\fi
+\ifx\putwordin\undefined        \gdef\putwordin{in}\fi
+\ifx\putwordIndexIsEmpty\undefined     \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
+\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
+\ifx\putwordInfo\undefined      \gdef\putwordInfo{Info}\fi
+\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
+\ifx\putwordMethodon\undefined  \gdef\putwordMethodon{Method on}\fi
+\ifx\putwordNoTitle\undefined   \gdef\putwordNoTitle{No Title}\fi
+\ifx\putwordof\undefined        \gdef\putwordof{of}\fi
+\ifx\putwordon\undefined        \gdef\putwordon{on}\fi
+\ifx\putwordpage\undefined      \gdef\putwordpage{page}\fi
+\ifx\putwordsection\undefined   \gdef\putwordsection{section}\fi
+\ifx\putwordSection\undefined   \gdef\putwordSection{Section}\fi
+\ifx\putwordsee\undefined       \gdef\putwordsee{see}\fi
+\ifx\putwordSee\undefined       \gdef\putwordSee{See}\fi
+\ifx\putwordShortTOC\undefined  \gdef\putwordShortTOC{Short Contents}\fi
+\ifx\putwordTOC\undefined       \gdef\putwordTOC{Table of Contents}\fi
+%
+\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
+\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
+\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
+\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
+\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
+\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
+\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
+\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
+\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
+\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
+\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
+\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
+%
+\ifx\putwordDefmac\undefined    \gdef\putwordDefmac{Macro}\fi
+\ifx\putwordDefspec\undefined   \gdef\putwordDefspec{Special Form}\fi
+\ifx\putwordDefvar\undefined    \gdef\putwordDefvar{Variable}\fi
+\ifx\putwordDefopt\undefined    \gdef\putwordDefopt{User Option}\fi
+\ifx\putwordDeffunc\undefined   \gdef\putwordDeffunc{Function}\fi
+
+% In some macros, we cannot use the `\? notation---the left quote is
+% in some cases the escape char.
+\chardef\colonChar = `\:
+\chardef\commaChar = `\,
+\chardef\dotChar   = `\.
+\chardef\exclamChar= `\!
+\chardef\questChar = `\?
+\chardef\semiChar  = `\;
+\chardef\underChar = `\_
+
+\chardef\spaceChar = `\ %
+\chardef\spacecat = 10
+\def\spaceisspace{\catcode\spaceChar=\spacecat}
 
 % Ignore a token.
 %
 \def\gobble#1{}
 
-\hyphenation{ap-pen-dix}
-\hyphenation{mini-buf-fer mini-buf-fers}
-\hyphenation{eshell}
+% The following is used inside several \edef's.
+\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
+
+% Hyphenation fixes.
+\hyphenation{
+  Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
+  ap-pen-dix bit-map bit-maps
+  data-base data-bases eshell fall-ing half-way long-est man-u-script
+  man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
+  par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
+  spell-ing spell-ings
+  stand-alone strong-est time-stamp time-stamps which-ever white-space
+  wide-spread wrap-around
+}
 
 % Margin to add to right of even pages, to left of odd pages.
-\newdimen \bindingoffset
-\newdimen \normaloffset
+\newdimen\bindingoffset
+\newdimen\normaloffset
 \newdimen\pagewidth \newdimen\pageheight
 
+% 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}
+
+% @| 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
+    }%
+  }%
+}
+
 % 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.
+% since that produces some useless output on the terminal.  We also make
+% some effort to order the tracing commands to reduce output in the log
+% file; cf. trace.sty in LaTeX.
 %
 \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
-\def\loggingall{\tracingcommands2 \tracingstats2
-   \tracingpages1 \tracingoutput1 \tracinglostchars1
-   \tracingmacros2 \tracingparagraphs1 \tracingrestores1
-   \showboxbreadth\maxdimen\showboxdepth\maxdimen
+\def\loggingall{%
+  \tracingstats2
+  \tracingpages1
+  \tracinglostchars2  % 2 gives us more in etex
+  \tracingparagraphs1
+  \tracingoutput1
+  \tracingmacros2
+  \tracingrestores1
+  \showboxbreadth\maxdimen \showboxdepth\maxdimen
+  \ifx\eTeXversion\undefined\else % etex gives us more logging
+    \tracingscantokens1
+    \tracingifs1
+    \tracinggroups1
+    \tracingnesting2
+    \tracingassigns1
+  \fi
+  \tracingcommands3  % 3 gives us more in etex
+  \errorcontextlines16
 }%
 
+% add check for \lastpenalty to plain's definitions.  If the last thing
+% we did was a \nobreak, we don't want to insert more space.
+%
+\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
+  \removelastskip\penalty-50\smallskip\fi\fi}
+\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
+  \removelastskip\penalty-100\medskip\fi\fi}
+\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
+  \removelastskip\penalty-200\bigskip\fi\fi}
+
 % For @cropmarks command.
 % Do @cropmarks to get crop marks.
-% 
+%
 \newif\ifcropmarks
 \let\cropmarks = \cropmarkstrue
 %
 % 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
+\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
+\newdimen\cornerlong  \cornerlong=1pc
+\newdimen\cornerthick \cornerthick=.3pt
+\newdimen\topandbottommargin \topandbottommargin=.75in
 
 % Main output routine.
 \chardef\PAGE = 255
@@ -167,15 +306,21 @@
     \normalturnoffactive  % \ in index entries must not stay \, e.g., if
                    % the page break happens to be in the middle of an example.
     \shipout\vbox{%
+      % Do this early so pdf references go to the beginning of the page.
+      \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
+      %
       \ifcropmarks \vbox to \outervsize\bgroup
         \hsize = \outerhsize
-        \line{\ewtop\hfil\ewtop}%
-        \nointerlineskip
-        \line{%
-          \vbox{\moveleft\cornerthick\nstop}%
-          \hfill
-          \vbox{\moveright\cornerthick\nstop}%
-        }%
+        \vskip-\topandbottommargin
+        \vtop to0pt{%
+          \line{\ewtop\hfil\ewtop}%
+          \nointerlineskip
+          \line{%
+            \vbox{\moveleft\cornerthick\nstop}%
+            \hfill
+            \vbox{\moveright\cornerthick\nstop}%
+          }%
+          \vss}%
         \vskip\topandbottommargin
         \line\bgroup
           \hfil % center the page within the outer (page) hsize.
@@ -185,24 +330,32 @@
       %
       \unvbox\headlinebox
       \pagebody{#1}%
-      \unvbox\footlinebox
+      \ifdim\ht\footlinebox > 0pt
+        % Only leave this space if the footline is nonempty.
+        % (We lessened \vsize for it in \oddfootingxxx.)
+        % The \baselineskip=24pt in plain's \makefootline has no effect.
+        \vskip 2\baselineskip
+        \unvbox\footlinebox
+      \fi
       %
       \ifcropmarks
           \egroup % end of \vbox\bgroup
         \hfil\egroup % end of (centering) \line\bgroup
         \vskip\topandbottommargin plus1fill minus1fill
         \boxmaxdepth = \cornerthick
-        \line{%
-          \vbox{\moveleft\cornerthick\nsbot}%
-          \hfill
-          \vbox{\moveright\cornerthick\nsbot}%
+        \vbox to0pt{\vss
+          \line{%
+            \vbox{\moveleft\cornerthick\nsbot}%
+            \hfill
+            \vbox{\moveright\cornerthick\nsbot}%
+          }%
+          \nointerlineskip
+          \line{\ewbot\hfil\ewbot}%
         }%
-        \nointerlineskip
-        \line{\ewbot\hfil\ewbot}%
       \egroup % \vbox from first cropmarks clause
       \fi
     }% end of \shipout\vbox
-  }% end of group with \turnoffactive
+  }% end of group with \normalturnoffactive
   \advancepageno
   \ifnum\outputpenalty>-20000 \else\dosupereject\fi
 }
@@ -235,149 +388,168 @@
 % 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%
+\def\parsearg{\parseargusing{}}
+\def\parseargusing#1#2{%
+  \def\next{#2}%
   \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
+    \spaceisspace
+    #1%
+    \parseargline\empty% Insert the \empty token, see \finishparsearg below.
 }
 
-% 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}%
+    \argremovecomment #1\comment\ArgTerm%
   }%
 }
 
-% 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}}
+% First remove any @comment, then any @c comment.
+\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
+\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
 
-% \argremovec{,omment} might leave us with trailing spaces, though; e.g.,
+% Each occurence of `\^^M' or `<space>\^^M' is replaced by a single space.
+%
+% \argremovec might leave us with trailing space, 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.
+% This space token undergoes the same procedure and is eventually removed
+% by \finishparsearg.
 %
-\def\removeactivespaces#1{%
-  \begingroup
-    \ignoreactivespaces
-    \edef\temp{#1}%
-    \global\toks0 = \expandafter{\temp}%
-  \endgroup
+\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
+\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
+\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
+  \def\temp{#3}%
+  \ifx\temp\empty
+    % We cannot use \next here, as it holds the macro to run;
+    % thus we reuse \temp.
+    \let\temp\finishparsearg
+  \else
+    \let\temp\argcheckspaces
+  \fi
+  % Put the space token in:
+  \temp#1 #3\ArgTerm
 }
 
-% Change the active space to expand to nothing.
+% If a _delimited_ argument is enclosed in braces, they get stripped; so
+% to get _exactly_ the rest of the line, we had to prevent such situation.
+% We prepended an \empty token at the very beginning and we expand it now,
+% just before passing the control to \next.
+% (Similarily, we have to think about #3 of \argcheckspacesY above: it is
+% either the null string, or it ends with \^^M---thus there is no danger
+% that a pair of braces would be stripped.
 %
-\begingroup
+% But first, we have to remove the trailing space token.
+%
+\def\finishparsearg#1 \ArgTerm{\expandafter\next\expandafter{#1}}
+
+% \parseargdef\foo{...}
+%	is roughly equivalent to
+% \def\foo{\parsearg\Xfoo}
+% \def\Xfoo#1{...}
+%
+% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my
+% favourite TeX trick.  --kasal, 16nov03
+
+\def\parseargdef#1{%
+  \expandafter \doparseargdef \csname\string#1\endcsname #1%
+}
+\def\doparseargdef#1#2{%
+  \def#2{\parsearg#1}%
+  \def#1##1%
+}
+
+% Several utility definitions with active space:
+{
   \obeyspaces
-  \gdef\ignoreactivespaces{\obeyspaces\let =\empty}
-\endgroup
+  \gdef\obeyedspace{ }
+
+  % 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.
+  %
+  \gdef\sepspaces{\obeyspaces\let =\tie}
+
+  % If an index command is used in an @example environment, any spaces
+  % therein should become regular spaces in the raw index file, not the
+  % expansion of \tie (\leavevmode \penalty \@M \ ).
+  \gdef\unsepspaces{\let =\space}
+}
 
 
 \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}
+% Define the framework for environments in texinfo.tex.  It's used like this:
+% 
+%   \envdef\foo{...}
+%   \def\Efoo{...}
+%   
+% It's the responsibility of \envdef to insert \begingroup before the
+% actual body; @end closes the group after calling \Efoo.  \envdef also
+% defines \thisenv, so the current environment is known; @end checks
+% whether the environment name matches.  The \checkenv macro can also be
+% used to check whether the current environment is the one expected.
+% 
+% Non-false conditionals (@iftex, @ifset) don't fit into this, so they
+% are not treated as enviroments; they don't open a group.  (The
+% implementation of @end takes care not to call \endgroup in this
+% special case.)
+
+
+% At runtime, environments start with this:
+\def\startenvironment#1{\begingroup\def\thisenv{#1}}
+% initialize
+\let\thisenv\empty
+
+% ... but they get defined via ``\envdef\foo{...}'':
+\long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
+\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
 
-% @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
+% Check whether we're in the right environment:
+\def\checkenv#1{%
+  \def\temp{#1}%
+  \ifx\thisenv\temp
   \else
-    % Everything's ok; the right environment has been started.
-    \csname E\endthing\endcsname
+    \badenverr
   \fi
 }
 
-% There is an environment #1, but it hasn't been started.  Give an error.
-%
-\def\unmatchedenderror#1{%
+% Evironment mismatch, #1 expected:
+\def\badenverr{%
   \errhelp = \EMsimple
-  \errmessage{This `@end #1' doesn't have a matching `@#1'}%
+  \errmessage{This command can appear only \inenvironment\temp,
+    not \inenvironment\thisenv}%
+}
+\def\inenvironment#1{%
+  \ifx#1\empty
+    out of any environment%
+  \else
+    in environment \expandafter\string#1%
+  \fi
 }
 
-% Define the control sequence \E#1 to give an unmatched @end error.
+% @end foo executes the definition of \Efoo.
+% But first, it executes a specialized version of \checkenv
 %
-\def\defineunmatchedend#1{%
-  \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}%
+\parseargdef\end{%
+  \if 1\csname iscond.#1\endcsname
+  \else
+    % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03
+    \expandafter\checkenv\csname#1\endcsname
+    \csname E#1\endcsname
+    \endgroup
+  \fi
 }
 
+\newhelp\EMsimple{Press RETURN to continue.}
 
-% 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}}
+\def\@{{\tt\char64}}
 
 % This is turned off because it was never documented
 % and you can use @w{...} around a quote to suppress ligatures.
@@ -387,21 +559,27 @@
 %\def\'{{'}}
 
 % Used to generate quoted braces.
-\def\mylbrace {{\tt \char '173}}
-\def\myrbrace {{\tt \char '175}}
+\def\mylbrace {{\tt\char123}}
+\def\myrbrace {{\tt\char125}}
 \let\{=\mylbrace
 \let\}=\myrbrace
 \begingroup
-  % Definitions to produce actual \{ & \} command in an index.
-  \catcode`\{ = 12 \catcode`\} = 12
+  % Definitions to produce \{ and \} commands for indices,
+  % and @{ and @} for the aux file.
+  \catcode`\{ = \other \catcode`\} = \other
   \catcode`\[ = 1 \catcode`\] = 2
-  \catcode`\@ = 0 \catcode`\\ = 12
-  @gdef@lbracecmd[\{]%
-  @gdef@rbracecmd[\}]%
-@endgroup
+  \catcode`\! = 0 \catcode`\\ = \other
+  !gdef!lbracecmd[\{]%
+  !gdef!rbracecmd[\}]%
+  !gdef!lbraceatcmd[@{]%
+  !gdef!rbraceatcmd[@}]%
+!endgroup
+
+% @comma{} to avoid , parsing problems.
+\let\comma = ,
 
 % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
-% Others are defined by plain TeX: @` @' @" @^ @~ @= @v @H.
+% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
 \let\, = \c
 \let\dotaccent = \.
 \def\ringaccent#1{{\accent23 #1}}
@@ -409,10 +587,12 @@
 \let\ubaraccent = \b
 \let\udotaccent = \d
 
-% Other special characters: @questiondown @exclamdown
-% Plain TeX defines: @AA @AE @O @OE @L (and lowercase versions) @ss.
+% Other special characters: @questiondown @exclamdown @ordf @ordm
+% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
 \def\questiondown{?`}
 \def\exclamdown{!`}
+\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}
+\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}
 
 % Dotless i and dotless j, used for accents.
 \def\imacro{i}
@@ -425,23 +605,54 @@
   \fi\fi
 }
 
+% The \TeX{} logo, as in plain, but resetting the spacing so that a
+% period following counts as ending a sentence.  (Idea found in latex.)
+% 
+\edef\TeX{\TeX \spacefactor=3000 }
+
+% @LaTeX{} logo.  Not quite the same results as the definition in
+% latex.ltx, since we use a different font for the raised A; it's most
+% convenient for us to use an explicitly smaller font, rather than using
+% the \scriptstyle font (since we don't reset \scriptstyle and
+% \scriptscriptstyle).
+% 
+\def\LaTeX{%
+  L\kern-.36em
+  {\setbox0=\hbox{T}%
+   \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}%
+  \kern-.15em
+  \TeX
+}
+
+% 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
+ % Avoid using \@M directly, because that causes trouble
+ % if the definition is written into an index file.
+ \global\let\tiepenalty = \@M
+ \gdef\tie{\leavevmode\penalty\tiepenalty\ }
+}
+
 % @: forces normal size whitespace following.
 \def\:{\spacefactor=1000 }
 
 % @* forces a line break.
 \def\*{\hfil\break\hbox{}\ignorespaces}
 
+% @/ allows a line break.
+\let\/=\allowbreak
+
 % @. 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 }
+\def\!{!\spacefactor=3000 }
 
 % @? is an end-of-sentence query.
-\gdef\?{?\spacefactor=3000 }
+\def\?{?\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
@@ -456,47 +667,24 @@
 % 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
+% Another complication is that the group might be very large.  This can
+% cause the glue on the previous page to be unduly stretched, because it
+% does not have much material.  In this case, it's better to add an
+% explicit \vfill so that the extra space is at the bottom.  The
+% threshold for doing this is if the group is more than \vfilllimit
+% percent of a page (\vfilllimit can be changed inside of @tex).
+%
+\newbox\groupbox
+\def\vfilllimit{0.7}
+%
+\envdef\group{%
+  \ifnum\catcode`\^^M=\active \else
     \errhelp = \groupinvalidhelp
     \errmessage{@group invalid in context where filling is enabled}%
   \fi
+  \startsavinginserts
   %
-  % 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
-    %
+  \setbox\groupbox = \vtop\bgroup
     % 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
@@ -506,6 +694,32 @@
     \comment
 }
 %
+% The \vtop 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.  Thus, space below is not quite equal to space
+% above.  But it's pretty close.
+\def\Egroup{%
+    % To get correct interline space between the last line of the group
+    % and the first line afterwards, we have to propagate \prevdepth.
+    \endgraf % Not \par, as it may have been set to \lisppar.
+    \global\dimen1 = \prevdepth
+  \egroup           % End the \vtop.
+  % \dimen0 is the vertical size of the group's box.
+  \dimen0 = \ht\groupbox  \advance\dimen0 by \dp\groupbox
+  % \dimen2 is how much space is left on the page (more or less).
+  \dimen2 = \pageheight   \advance\dimen2 by -\pagetotal
+  % if the group doesn't fit on the current page, and it's a big big
+  % group, force a page break.
+  \ifdim \dimen0 > \dimen2
+    \ifdim \pagetotal < \vfilllimit\pageheight
+      \page
+    \fi
+  \fi
+  \box\groupbox
+  \prevdepth = \dimen1
+  \checkinserts
+}
+%
 % TeX puts in an \escapechar (i.e., `@') at the beginning of the help
 % message, so this ends up printing `@group can only ...'.
 %
@@ -518,60 +732,60 @@
 
 \newdimen\mil  \mil=0.001in
 
-\def\need{\parsearg\needx}
-
 % Old definition--didn't work.
-%\def\needx #1{\par %
+%\parseargdef\need{\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
+%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
 %\prevdepth=-1000pt
 %}}
 
-\def\needx#1{%
-  % Go into vertical mode, so we don't make a big box in the middle of a
+\parseargdef\need{%
+  % Ensure 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
+  % If the @need value is less than one line space, it's useless.
+  \dimen0 = #1\mil
+  \dimen2 = \ht\strutbox
+  \advance\dimen2 by \dp\strutbox
+  \ifdim\dimen0 > \dimen2
+    %
+    % Do a \strut just to make the height of this box be normal, so the
+    % normal leading is inserted relative to the preceding line.
+    % And a page break here is fine.
+    \vtop to #1\mil{\strut\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
+  \fi
 }
 
-% @br   forces paragraph break
+% @br   forces paragraph break (and is undocumented).
 
 \let\br = \par
 
-% @dots{}  output some dots
-
-\def\dots{$\ldots$}
-
-% @page    forces the start of a new page
-
+% @page forces the start of a new page.
+%
 \def\page{\par\vfill\supereject}
 
 % @exdent text....
@@ -582,467 +796,648 @@
 \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}}
+\parseargdef\exdent{\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}}}}
-
-% @inmargin{TEXT} puts TEXT in the margin next to the current paragraph.
-
-\def\inmargin#1{%
-\strut\vadjust{\nobreak\kern-\strutdepth
-  \vtop to \strutdepth{\baselineskip\strutdepth\vss
-  \llap{\rightskip=\inmarginspacing \vbox{\noindent #1}}\null}}}
+\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
+  \leftline{\hskip\leftskip{\rm#1}}}}
+
+% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
+% paragraph.  For more general purposes, use the \margin insertion
+% class.  WHICH is `l' or `r'.
+%
 \newskip\inmarginspacing \inmarginspacing=1cm
 \def\strutdepth{\dp\strutbox}
-
-%\hbox{{\rm#1}}\hfil\break}}
+%
+\def\doinmargin#1#2{\strut\vadjust{%
+  \nobreak
+  \kern-\strutdepth
+  \vtop to \strutdepth{%
+    \baselineskip=\strutdepth
+    \vss
+    % if you have multiple lines of stuff to put here, you'll need to
+    % make the vbox yourself of the appropriate size.
+    \ifx#1l%
+      \llap{\ignorespaces #2\hskip\inmarginspacing}%
+    \else
+      \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
+    \fi
+    \null
+  }%
+}}
+\def\inleftmargin{\doinmargin l}
+\def\inrightmargin{\doinmargin r}
+%
+% @inmargin{TEXT [, RIGHT-TEXT]}
+% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
+% else use TEXT for both).
+%
+\def\inmargin#1{\parseinmargin #1,,\finish}
+\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
+  \setbox0 = \hbox{\ignorespaces #2}%
+  \ifdim\wd0 > 0pt
+    \def\lefttext{#1}%  have both texts
+    \def\righttext{#2}%
+  \else
+    \def\lefttext{#1}%  have only one text
+    \def\righttext{#1}%
+  \fi
+  %
+  \ifodd\pageno
+    \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
+  \else
+    \def\temp{\inleftmargin\lefttext}%
+  \fi
+  \temp
+}
 
 % @include file    insert text of that file as input.
-% Allow normal characters that  we make active in the argument (a file name).
-\def\include{\begingroup
-  \catcode`\\=12
-  \catcode`~=12
-  \catcode`^=12
-  \catcode`_=12
-  \catcode`|=12
-  \catcode`<=12
-  \catcode`>=12
-  \catcode`+=12
-  \parsearg\includezzz}
-% Restore active chars for included file.
-\def\includezzz#1{\endgroup\begingroup
-  % Read the included file in a group so nested @include's work.
+%
+\def\include{\parseargusing\filenamecatcodes\includezzz}
+\def\includezzz#1{%
+  \pushthisfilestack
   \def\thisfile{#1}%
-  \input\thisfile
-\endgroup}
+  {%
+    \makevalueexpandable
+    \def\temp{\input #1 }%
+    \expandafter
+  }\temp
+  \popthisfilestack
+}
+\def\filenamecatcodes{%
+  \catcode`\\=\other
+  \catcode`~=\other
+  \catcode`^=\other
+  \catcode`_=\other
+  \catcode`|=\other
+  \catcode`<=\other
+  \catcode`>=\other
+  \catcode`+=\other
+  \catcode`-=\other
+}
 
-\def\thisfile{}
+\def\pushthisfilestack{%
+  \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
+}
+\def\pushthisfilestackX{%
+  \expandafter\pushthisfilestackY\thisfile\StackTerm
+}
+\def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
+  \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
+}
 
-% @center line   outputs that line, centered
+\def\popthisfilestack{\errthisfilestackempty}
+\def\errthisfilestackempty{\errmessage{Internal error:
+  the stack of filenames is empty.}}
 
-\def\center{\parsearg\centerzzz}
-\def\centerzzz #1{{\advance\hsize by -\leftskip
-\advance\hsize by -\rightskip
-\centerline{#1}}}
+\def\thisfile{}
+
+% @center line
+% outputs that line, centered.
+%
+\parseargdef\center{%
+  \ifhmode
+    \let\next\centerH
+  \else
+    \let\next\centerV
+  \fi
+  \next{\hfil \ignorespaces#1\unskip \hfil}%
+}
+\def\centerH#1{%
+  {%
+    \hfil\break
+    \advance\hsize by -\leftskip
+    \advance\hsize by -\rightskip
+    \line{#1}%
+    \break
+  }%
+}
+\def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}}
 
 % @sp n   outputs n lines of vertical space
 
-\def\sp{\parsearg\spxxx}
-\def\spxxx #1{\vskip #1\baselineskip}
+\parseargdef\sp{\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 }
+\def\comment{\begingroup \catcode`\^^M=\other%
+\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
+\commentxxx}
+{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
 
 \let\c=\comment
 
-% @paragraphindent  is defined for the Info formatting commands only.
-\let\paragraphindent=\comment
+% @paragraphindent NCHARS
+% We'll use ems for NCHARS, close enough.
+% NCHARS can also be the word `asis' or `none'.
+% We cannot feasibly implement @paragraphindent asis, though.
+%
+\def\asisword{asis} % no translation, these are keywords
+\def\noneword{none}
+%
+\parseargdef\paragraphindent{%
+  \def\temp{#1}%
+  \ifx\temp\asisword
+  \else
+    \ifx\temp\noneword
+      \defaultparindent = 0pt
+    \else
+      \defaultparindent = #1em
+    \fi
+  \fi
+  \parindent = \defaultparindent
+}
 
-% 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\defcodeindex = \relax
-  \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\setchapternewpage = \relax
-  \let\setchapterstyle = \relax
-  \let\everyheading = \relax
-  \let\evenheading = \relax
-  \let\oddheading = \relax
-  \let\everyfooting = \relax
-  \let\evenfooting = \relax
-  \let\oddfooting = \relax
-  \let\headings = \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
+% @exampleindent NCHARS
+% We'll use ems for NCHARS like @paragraphindent.
+% It seems @exampleindent asis isn't necessary, but
+% I preserve it to make it similar to @paragraphindent.
+\parseargdef\exampleindent{%
+  \def\temp{#1}%
+  \ifx\temp\asisword
+  \else
+    \ifx\temp\noneword
+      \lispnarrowing = 0pt
+    \else
+      \lispnarrowing = #1em
+    \fi
+  \fi
 }
 
-% Ignore @ignore ... @end ignore.
+% @firstparagraphindent WORD
+% If WORD is `none', then suppress indentation of the first paragraph
+% after a section heading.  If WORD is `insert', then do indent at such
+% paragraphs.
+%
+% The paragraph indentation is suppressed or not by calling
+% \suppressfirstparagraphindent, which the sectioning commands do.
+% We switch the definition of this back and forth according to WORD.
+% By default, we suppress indentation.
 %
-\def\ignore{\doignore{ignore}}
-
-% Also ignore @ifinfo, @ifhtml, @html, @menu, and @direntry text.
+\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
+\def\insertword{insert}
 %
-\def\ifinfo{\doignore{ifinfo}}
-\def\ifhtml{\doignore{ifhtml}}
-\def\html{\doignore{html}}
-\def\menu{\doignore{menu}}
-\def\direntry{\doignore{direntry}}
+\parseargdef\firstparagraphindent{%
+  \def\temp{#1}%
+  \ifx\temp\noneword
+    \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
+  \else\ifx\temp\insertword
+    \let\suppressfirstparagraphindent = \relax
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @firstparagraphindent option `\temp'}%
+  \fi\fi
+}
 
-% Also ignore @macro ... @end macro.  The user must run texi2dvi,
-% which runs makeinfo to do macro expansion.  Ignore @unmacro, too.
-\def\macro{\doignore{macro}}
-\let\unmacro = \comment
+% Here is how we actually suppress indentation.  Redefine \everypar to
+% \kern backwards by \parindent, and then reset itself to empty.
+%
+% We also make \indent itself not actually do anything until the next
+% paragraph.
+%
+\gdef\dosuppressfirstparagraphindent{%
+  \gdef\indent{%
+    \restorefirstparagraphindent
+    \indent
+  }%
+  \gdef\noindent{%
+    \restorefirstparagraphindent
+    \noindent
+  }%
+  \global\everypar = {%
+    \kern -\parindent
+    \restorefirstparagraphindent
+  }%
+}
 
+\gdef\restorefirstparagraphindent{%
+  \global \let \indent = \ptexindent
+  \global \let \noindent = \ptexnoindent
+  \global \everypar = {}%
+}
 
-% @dircategory CATEGORY  -- specify a category of the dir file
-% which this file should belong to.  Ignore this in TeX.
-\let\dircategory = \comment
 
-% Ignore text until a line `@end #1'.
+% @asis just yields its argument.  Used with @table, for example.
 %
-\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
-}
+\def\asis#1{#1}
 
-% What we do to finish off ignored text.
+% @math outputs its argument in math mode.
 %
-\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{  (See ftp://ftp.gnu.ai.mit.edu/pub/gnu/TeX.README.)}
-    \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{}
-    \global\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.  Make sure the catcode of space is correct to avoid
-% losing inside @example, for instance.
-%
-\def\set{\begingroup\catcode` =10
-  \catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR.
-  \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
-  \endgroup
-}
-% Can't use \xdef to pre-expand #2 and save some time, since \temp or
-% \next or other control sequences that we've defined might get us into
-% an infinite loop. Consider `@set foo @cite{bar}'.
-\def\setzzz#1#2 \endsetzzz{\expandafter\gdef\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{\begingroup
-  \catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR.
-  \valuexxx}
-\def\valuexxx#1{%
-  \expandafter\ifx\csname SET#1\endcsname\relax
-    {\{No value for ``#1''\}}%
-  \else
-    \csname SET#1\endcsname
-  \fi
-\endgroup}
-
-% @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.
+% One complication: _ usually means subscripts, but it could also mean
+% an actual _ character, as in @math{@var{some_variable} + 1}.  So make
+% _ active, and distinguish by seeing if the current family is \slfam,
+% which is what @var uses.
+{
+  \catcode\underChar = \active
+  \gdef\mathunderscore{%
+    \catcode\underChar=\active
+    \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
+  }
+}
+% Another complication: we want \\ (and @\) to output a \ character.
+% FYI, plain.tex uses \\ as a temporary control sequence (why?), but
+% this is not advertised and we don't care.  Texinfo does not
+% otherwise define @\.
+%
+% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
+\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
+%
+\def\math{%
+  \tex
+  \mathunderscore
+  \let\\ = \mathbackslash
+  \mathactive
+  $\finishmath
+}
+\def\finishmath#1{#1$\endgroup}  % Close the group opened by \tex.
+
+% Some active characters (such as <) are spaced differently in math.
+% We have to reset their definitions in case the @math was an argument
+% to a command which sets the catcodes (such as @item or @section).
 %
-\def\ifclear{\parsearg\ifclearxxx}
-\def\ifclearxxx #1{%
-  \expandafter\ifx\csname SET#1\endcsname\relax
-    \expandafter\ifclearsucceed
-  \else
-    \expandafter\ifclearfail
-  \fi
+{
+  \catcode`^ = \active
+  \catcode`< = \active
+  \catcode`> = \active
+  \catcode`+ = \active
+  \gdef\mathactive{%
+    \let^ = \ptexhat
+    \let< = \ptexless
+    \let> = \ptexgtr
+    \let+ = \ptexplus
+  }
 }
-\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}
+% @bullet and @minus need the same treatment as @math, just above.
+\def\bullet{$\ptexbullet$}
+\def\minus{$-$}
 
-% 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.)
+% @dots{} outputs an ellipsis using the current font.
+% We do .5em per period so that it has the same spacing in a typewriter
+% font as three actual period characters.
 %
-\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}}%
+\def\dots{%
+  \leavevmode
+  \hbox to 1.5em{%
+    \hskip 0pt plus 0.25fil
+    .\hfil.\hfil.%
+    \hskip 0pt plus 0.5fil
   }%
-  \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.
+% @enddots{} is an end-of-sentence ellipsis.
 %
-\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\enddots{%
+  \dots
+  \spacefactor=3000
+}
 
-\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}
+% @comma{} is so commas can be inserted into text without messing up
+% Texinfo's parsing.
+% 
+\let\comma = ,
 
 % @refill is a no-op.
 \let\refill=\relax
 
+% If working on a large document in chapters, it is convenient to
+% be able to disable indexing, cross-referencing, and contents, for test runs.
+% This is done with @novalidate (before @setfilename).
+%
+\newif\iflinks \linkstrue % by default we want the aux files.
+\let\novalidate = \linksfalse
+
 % @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.
+   \iflinks
+     \tryauxfile
+     % Open the new aux file.  TeX will close it automatically at exit.
+     \immediate\openout\auxfile=\jobname.aux
+   \fi % \openindices needs to do some work in any case.
+   \openindices
+   \let\setfilename=\comment % Ignore extra @setfilename cmds.
+   %
+   % If texinfo.cnf is present on the system, read it.
+   % Useful for site-wide @afourpaper, etc.
+   \openin 1 texinfo.cnf
+   \ifeof 1 \else \input texinfo.cnf \fi
+   \closein 1
+   %
    \comment % Ignore the actual filename.
 }
 
+% Called from \setfilename.
+%
+\def\openindices{%
+  \newindex{cp}%
+  \newcodeindex{fn}%
+  \newcodeindex{vr}%
+  \newcodeindex{tp}%
+  \newcodeindex{ky}%
+  \newcodeindex{pg}%
+}
+
 % @bye.
 \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
 
-% \def\macro#1{\begingroup\ignoresections\catcode`\#=6\def\macrotemp{#1}\parsearg\macroxxx}
-% \def\macroxxx#1#2 \end macro{%
-% \expandafter\gdef\macrotemp#1{#2}%
-% \endgroup}
-
-%\def\linemacro#1{\begingroup\ignoresections\catcode`\#=6\def\macrotemp{#1}\parsearg\linemacroxxx}
-%\def\linemacroxxx#1#2 \end linemacro{%
-%\let\parsearg=\relax
-%\edef\macrotempx{\csname M\butfirst\expandafter\string\macrotemp\endcsname}%
-%\expandafter\xdef\macrotemp{\parsearg\macrotempx}%
-%\expandafter\gdef\macrotempx#1{#2}%
-%\endgroup}
 
-%\def\butfirst#1{}
+\message{pdf,}
+% adobe `portable' document format
+\newcount\tempnum
+\newcount\lnkcount
+\newtoks\filename
+\newcount\filenamelength
+\newcount\pgn
+\newtoks\toksA
+\newtoks\toksB
+\newtoks\toksC
+\newtoks\toksD
+\newbox\boxA
+\newcount\countA
+\newif\ifpdf
+\newif\ifpdfmakepagedest
+
+% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
+% can be set).  So we test for \relax and 0 as well as \undefined,
+% borrowed from ifpdf.sty.
+\ifx\pdfoutput\undefined
+\else
+  \ifx\pdfoutput\relax
+  \else
+    \ifcase\pdfoutput
+    \else
+      \pdftrue
+    \fi
+  \fi
+\fi
+%
+\ifpdf
+  \input pdfcolor
+  \pdfcatalog{/PageMode /UseOutlines}%
+  \def\dopdfimage#1#2#3{%
+    \def\imagewidth{#2}%
+    \def\imageheight{#3}%
+    % without \immediate, pdftex seg faults when the same image is
+    % included twice.  (Version 3.14159-pre-1.0-unofficial-20010704.)
+    \ifnum\pdftexversion < 14
+      \immediate\pdfimage
+    \else
+      \immediate\pdfximage
+    \fi
+      \ifx\empty\imagewidth\else width \imagewidth \fi
+      \ifx\empty\imageheight\else height \imageheight \fi
+      \ifnum\pdftexversion<13
+         #1.pdf%
+       \else
+         {#1.pdf}%
+       \fi
+    \ifnum\pdftexversion < 14 \else
+      \pdfrefximage \pdflastximage
+    \fi}
+  \def\pdfmkdest#1{{%
+    % We have to set dummies so commands such as @code in a section title
+    % aren't expanded.
+    \atdummies
+    \normalturnoffactive
+    \pdfdest name{#1} xyz%
+  }}
+  \def\pdfmkpgn#1{#1}
+  \let\linkcolor = \Blue  % was Cyan, but that seems light?
+  \def\endlink{\Black\pdfendlink}
+  % Adding outlines to PDF; macros for calculating structure of outlines
+  % come from Petr Olsak
+  \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
+    \else \csname#1\endcsname \fi}
+  \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
+    \advance\tempnum by 1
+    \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
+  %
+  % #1 is the section text.  #2 is the pdf expression for the number
+  % of subentries (or empty, for subsubsections).  #3 is the node
+  % text, which might be empty if this toc entry had no
+  % corresponding node.  #4 is the page number.
+  % 
+  \def\dopdfoutline#1#2#3#4{%
+    % Generate a link to the node text if that exists; else, use the
+    % page number.  We could generate a destination for the section
+    % text in the case where a section has no node, but it doesn't
+    % seem worthwhile, since most documents are normally structured.
+    \def\pdfoutlinedest{#3}%
+    \ifx\pdfoutlinedest\empty \def\pdfoutlinedest{#4}\fi
+    %
+    \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{#1}%
+  }
+  %
+  \def\pdfmakeoutlines{%
+    \begingroup
+      % Thanh's hack / proper braces in bookmarks
+      \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
+      \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
+      %
+      % Read toc silently, to get counts of subentries for \pdfoutline.
+      \def\numchapentry##1##2##3##4{%
+	\def\thischapnum{##2}%
+	\let\thissecnum\empty
+	\let\thissubsecnum\empty
+      }%
+      \def\numsecentry##1##2##3##4{%
+	\advancenumber{chap\thischapnum}%
+	\def\thissecnum{##2}%
+	\let\thissubsecnum\empty
+      }%
+      \def\numsubsecentry##1##2##3##4{%
+	\advancenumber{sec\thissecnum}%
+	\def\thissubsecnum{##2}%
+      }%
+      \def\numsubsubsecentry##1##2##3##4{%
+	\advancenumber{subsec\thissubsecnum}%
+      }%
+      \let\thischapnum\empty
+      \let\thissecnum\empty
+      \let\thissubsecnum\empty
+      %
+      % use \def rather than \let here because we redefine \chapentry et
+      % al. a second time, below.
+      \def\appentry{\numchapentry}%
+      \def\appsecentry{\numsecentry}%
+      \def\appsubsecentry{\numsubsecentry}%
+      \def\appsubsubsecentry{\numsubsubsecentry}%
+      \def\unnchapentry{\numchapentry}%
+      \def\unnsecentry{\numsecentry}%
+      \def\unnsubsecentry{\numsubsecentry}%
+      \def\unnsubsubsecentry{\numsubsubsecentry}%
+      \input \jobname.toc
+      %
+      % Read toc second time, this time actually producing the outlines.
+      % The `-' means take the \expnumber as the absolute number of
+      % subentries, which we calculated on our first read of the .toc above.
+      % 
+      % We use the node names as the destinations.
+      \def\numchapentry##1##2##3##4{%
+        \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
+      \def\numsecentry##1##2##3##4{%
+        \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
+      \def\numsubsecentry##1##2##3##4{%
+        \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
+      \def\numsubsubsecentry##1##2##3##4{% count is always zero
+        \dopdfoutline{##1}{}{##3}{##4}}%
+      %
+      % PDF outlines are displayed using system fonts, instead of
+      % document fonts.  Therefore we cannot use special characters,
+      % since the encoding is unknown.  For example, the eogonek from
+      % Latin 2 (0xea) gets translated to a | character.  Info from
+      % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
+      % 
+      % xx to do this right, we have to translate 8-bit characters to
+      % their "best" equivalent, based on the @documentencoding.  Right
+      % now, I guess we'll just let the pdf reader have its way.
+      \indexnofonts
+      \turnoffactive
+      \input \jobname.toc
+    \endgroup
+  }
+  %
+  \def\makelinks #1,{%
+    \def\params{#1}\def\E{END}%
+    \ifx\params\E
+      \let\nextmakelinks=\relax
+    \else
+      \let\nextmakelinks=\makelinks
+      \ifnum\lnkcount>0,\fi
+      \picknum{#1}%
+      \startlink attr{/Border [0 0 0]}
+        goto name{\pdfmkpgn{\the\pgn}}%
+      \linkcolor #1%
+      \advance\lnkcount by 1%
+      \endlink
+    \fi
+    \nextmakelinks
+  }
+  \def\picknum#1{\expandafter\pn#1}
+  \def\pn#1{%
+    \def\p{#1}%
+    \ifx\p\lbrace
+      \let\nextpn=\ppn
+    \else
+      \let\nextpn=\ppnn
+      \def\first{#1}
+    \fi
+    \nextpn
+  }
+  \def\ppn#1{\pgn=#1\gobble}
+  \def\ppnn{\pgn=\first}
+  \def\pdfmklnk#1{\lnkcount=0\makelinks #1,END,}
+  \def\skipspaces#1{\def\PP{#1}\def\D{|}%
+    \ifx\PP\D\let\nextsp\relax
+    \else\let\nextsp\skipspaces
+      \ifx\p\space\else\addtokens{\filename}{\PP}%
+        \advance\filenamelength by 1
+      \fi
+    \fi
+    \nextsp}
+  \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax}
+  \ifnum\pdftexversion < 14
+    \let \startlink \pdfannotlink
+  \else
+    \let \startlink \pdfstartlink
+  \fi
+  \def\pdfurl#1{%
+    \begingroup
+      \normalturnoffactive\def\@{@}%
+      \makevalueexpandable
+      \leavevmode\Red
+      \startlink attr{/Border [0 0 0]}%
+        user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
+    \endgroup}
+  \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
+  \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+  \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
+  \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
+  \def\maketoks{%
+    \expandafter\poptoks\the\toksA|ENDTOKS|\relax
+    \ifx\first0\adn0
+    \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
+    \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
+    \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
+    \else
+      \ifnum0=\countA\else\makelink\fi
+      \ifx\first.\let\next=\done\else
+        \let\next=\maketoks
+        \addtokens{\toksB}{\the\toksD}
+        \ifx\first,\addtokens{\toksB}{\space}\fi
+      \fi
+    \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+    \next}
+  \def\makelink{\addtokens{\toksB}%
+    {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
+  \def\pdflink#1{%
+    \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
+    \linkcolor #1\endlink}
+  \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
+\else
+  \let\pdfmkdest = \gobble
+  \let\pdfurl = \gobble
+  \let\endlink = \relax
+  \let\linkcolor = \relax
+  \let\pdfmakeoutlines = \relax
+\fi  % \ifx\pdfoutput
 
 
 \message{fonts,}
 
-% Font-change commands.
+% Change the current font style to #1, remembering it in \curfontstyle.
+% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
+% italics, not bold italics.
+% 
+\def\setfontstyle#1{%
+  \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
+  \csname ten#1\endcsname  % change the current font
+}
+
+% Select #1 fonts with the current style.
+% 
+\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname}
+
+\def\rm{\fam=0 \setfontstyle{rm}}
+\def\it{\fam=\itfam \setfontstyle{it}}
+\def\sl{\fam=\slfam \setfontstyle{sl}}
+\def\bf{\fam=\bffam \setfontstyle{bf}}
+\def\tt{\fam=\ttfam \setfontstyle{tt}}
 
-% Texinfo supports the sans serif font style, which plain TeX does not.
-% So we set up a \sf analogous to plain's \rm, etc.
+% Texinfo sort of supports the sans serif font style, which plain TeX does not.
+% So we set up a \sf.
 \newfam\sffam
-\def\sf{\fam=\sffam \tensf}
+\def\sf{\fam=\sffam \setfontstyle{sf}}
 \let\li = \sf % Sometimes we call it \li, not \sf.
 
-% We don't need math for this one.
-\def\ttsl{\tenttsl}
+% We don't need math for this font style.
+\def\ttsl{\setfontstyle{ttsl}}
 
-%% Try out Computer Modern fonts at \magstephalf
-\let\mainmagstep=\magstephalf
+% Default leading.
+\newdimen\textleading  \textleading = 13.2pt
+
+% 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
+  }%
+}
 
 % Set the font macro #1 to the font named #2, adding on the
 % specified font prefix (normally `cm').
@@ -1072,17 +1467,18 @@
 \def\scshape{csc}
 \def\scbshape{csc}
 
+% Text fonts (11.2pt, magstep1).
+\newcount\mainmagstep
 \ifx\bigger\relax
-\let\mainmagstep=\magstep1
-\setfont\textrm\rmshape{12}{1000}
-\setfont\texttt\ttshape{12}{1000}
+  % not really supported.
+  \mainmagstep=\magstep1
+  \setfont\textrm\rmshape{12}{1000}
+  \setfont\texttt\ttshape{12}{1000}
 \else
-\setfont\textrm\rmshape{10}{\mainmagstep}
-\setfont\texttt\ttshape{10}{\mainmagstep}
+  \mainmagstep=\magstephalf
+  \setfont\textrm\rmshape{10}{\mainmagstep}
+  \setfont\texttt\ttshape{10}{\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\bfshape{10}{\mainmagstep}
 \setfont\textit\itshape{10}{\mainmagstep}
 \setfont\textsl\slshape{10}{\mainmagstep}
@@ -1092,27 +1488,49 @@
 \font\texti=cmmi10 scaled \mainmagstep
 \font\textsy=cmsy10 scaled \mainmagstep
 
-% A few fonts for @defun, etc.
-\setfont\defbf\bxshape{10}{\magstep1} %was 1314
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstep1}
 \setfont\deftt\ttshape{10}{\magstep1}
-\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf}
+\setfont\defttsl\ttslshape{10}{\magstep1}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
 
-% Fonts for indices and small examples (9pt).
-% 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\ttshape{9}{1000}
-\setfont\indrm\rmshape{9}{1000}
-\setfont\indit\slshape{9}{1000}
-\let\indsl=\indit
-\let\indtt=\ninett
-\let\indttsl=\ninett
-\let\indsf=\indrm
-\let\indbf=\indrm
-\setfont\indsc\scshape{10}{900}
-\font\indi=cmmi9
-\font\indsy=cmsy9
+% Fonts for indices, footnotes, small examples (9pt).
+\setfont\smallrm\rmshape{9}{1000}
+\setfont\smalltt\ttshape{9}{1000}
+\setfont\smallbf\bfshape{10}{900}
+\setfont\smallit\itshape{9}{1000}
+\setfont\smallsl\slshape{9}{1000}
+\setfont\smallsf\sfshape{9}{1000}
+\setfont\smallsc\scshape{10}{900}
+\setfont\smallttsl\ttslshape{10}{900}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+
+% Fonts for small examples (8pt).
+\setfont\smallerrm\rmshape{8}{1000}
+\setfont\smallertt\ttshape{8}{1000}
+\setfont\smallerbf\bfshape{10}{800}
+\setfont\smallerit\itshape{8}{1000}
+\setfont\smallersl\slshape{8}{1000}
+\setfont\smallersf\sfshape{8}{1000}
+\setfont\smallersc\scshape{10}{800}
+\setfont\smallerttsl\ttslshape{10}{800}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+
+% Fonts for title page (20.4pt):
+\setfont\titlerm\rmbshape{12}{\magstep3}
+\setfont\titleit\itbshape{10}{\magstep4}
+\setfont\titlesl\slbshape{10}{\magstep4}
+\setfont\titlett\ttbshape{12}{\magstep3}
+\setfont\titlettsl\ttslshape{10}{\magstep4}
+\setfont\titlesf\sfbshape{17}{\magstep1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\authorrm{\secrm}
+\def\authortt{\sectt}
 
 % Chapter (and unnumbered) fonts (17.28pt).
 \setfont\chaprm\rmbshape{12}{\magstep2}
@@ -1120,7 +1538,7 @@
 \setfont\chapsl\slbshape{10}{\magstep3}
 \setfont\chaptt\ttbshape{12}{\magstep2}
 \setfont\chapttsl\ttslshape{10}{\magstep3}
-\setfont\chapsf\sfbshape{12}{\magstep2}
+\setfont\chapsf\sfbshape{17}{1000}
 \let\chapbf=\chaprm
 \setfont\chapsc\scbshape{10}{\magstep3}
 \font\chapi=cmmi12 scaled \magstep2
@@ -1138,109 +1556,168 @@
 \font\seci=cmmi12 scaled \magstep1
 \font\secsy=cmsy10 scaled \magstep2
 
-% \setfont\ssecrm\bxshape{10}{\magstep1}    % This size an font looked bad.
-% \setfont\ssecit\itshape{10}{\magstep1}    % The letters were too crowded.
-% \setfont\ssecsl\slshape{10}{\magstep1}
-% \setfont\ssectt\ttshape{10}{\magstep1}
-% \setfont\ssecsf\sfshape{10}{\magstep1}
-
-%\setfont\ssecrm\bfshape{10}{1315}      % Note the use of cmb rather than cmbx.
-%\setfont\ssecit\itshape{10}{1315}      % Also, the size is a little larger than
-%\setfont\ssecsl\slshape{10}{1315}      % being scaled magstep1.
-%\setfont\ssectt\ttshape{10}{1315}
-%\setfont\ssecsf\sfshape{10}{1315}
-
-%\let\ssecbf=\ssecrm
-
 % Subsection fonts (13.15pt).
 \setfont\ssecrm\rmbshape{12}{\magstephalf}
 \setfont\ssecit\itbshape{10}{1315}
 \setfont\ssecsl\slbshape{10}{1315}
 \setfont\ssectt\ttbshape{12}{\magstephalf}
-\setfont\ssecttsl\ttslshape{10}{\magstep1}
+\setfont\ssecttsl\ttslshape{10}{1315}
 \setfont\ssecsf\sfbshape{12}{\magstephalf}
 \let\ssecbf\ssecrm
-\setfont\ssecsc\scbshape{10}{\magstep1}
+\setfont\ssecsc\scbshape{10}{1315}
 \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.
+\font\ssecsy=cmsy10 scaled 1315
 
-% Fonts for title page:
-\setfont\titlerm\rmbshape{12}{\magstep3}
-\let\authorrm = \secrm
+% Reduced fonts for @acro in text (10pt).
+\setfont\reducedrm\rmshape{10}{1000}
+\setfont\reducedtt\ttshape{10}{1000}
+\setfont\reducedbf\bfshape{10}{1000}
+\setfont\reducedit\itshape{10}{1000}
+\setfont\reducedsl\slshape{10}{1000}
+\setfont\reducedsf\sfshape{10}{1000}
+\setfont\reducedsc\scshape{10}{1000}
+\setfont\reducedttsl\ttslshape{10}{1000}
+\font\reducedi=cmmi10
+\font\reducedsy=cmsy10
 
 % 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).
+% texinfo doesn't allow for producing subscripts and superscripts except
+% in the main text, 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
+  \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 font.  Plain TeX does \def\bf{\fam=\bffam
-% \tenbf}, for example.  By redefining \tenbf, we obviate the need to
-% redefine \bf itself.
+% of just \STYLE.  We do this because \STYLE needs to also set the
+% current \fam for math mode.  Our \STYLE (e.g., \rm) commands hardwire
+% \tenSTYLE to set the current font.
+% 
+% Each font-changing command also sets the names \lsize (one size lower)
+% and \lllsize (three sizes lower).  These relative commands are used in
+% the LaTeX logo and acronyms.
+% 
+% This all needs generalizing, badly.
+% 
 \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 \let\tenttsl=\textttsl
-  \resetmathfonts}
+  \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
+  \let\tenttsl=\textttsl
+  \def\lsize{reduced}\def\lllsize{smaller}%
+  \resetmathfonts \setleading{\textleading}}
+\def\titlefonts{%
+  \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
+  \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
+  \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
+  \let\tenttsl=\titlettsl
+  \def\lsize{chap}\def\lllsize{subsec}%
+  \resetmathfonts \setleading{25pt}}
+\def\titlefont#1{{\titlefonts\rm #1}}
 \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 \let\tenttsl=\chapttsl
+  \def\lsize{sec}\def\lllsize{text}%
   \resetmathfonts \setleading{19pt}}
 \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 \let\tenttsl=\secttsl
+  \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
+  \let\tenttsl=\secttsl
+  \def\lsize{subsec}\def\lllsize{reduced}%
   \resetmathfonts \setleading{16pt}}
 \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 \let\tenttsl=\ssecttsl
+  \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
+  \let\tenttsl=\ssecttsl
+  \def\lsize{text}\def\lllsize{small}%
   \resetmathfonts \setleading{15pt}}
-\let\subsubsecfonts = \subsecfonts % Maybe make sssec fonts scaled magstephalf?
-\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 \let\tenttsl=\indttsl
-  \resetmathfonts \setleading{12pt}}
+\let\subsubsecfonts = \subsecfonts
+\def\reducedfonts{%
+  \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl
+  \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc
+  \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy
+  \let\tenttsl=\reducedttsl
+  \def\lsize{small}\def\lllsize{smaller}%
+  \resetmathfonts \setleading{10.5pt}}
+\def\smallfonts{%
+  \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
+  \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
+  \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
+  \let\tenttsl=\smallttsl
+  \def\lsize{smaller}\def\lllsize{smaller}%
+  \resetmathfonts \setleading{10.5pt}}
+\def\smallerfonts{%
+  \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
+  \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
+  \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
+  \let\tenttsl=\smallerttsl
+  \def\lsize{smaller}\def\lllsize{smaller}%
+  \resetmathfonts \setleading{9.5pt}}
+
+% Set the fonts to use with the @small... environments.
+\let\smallexamplefonts = \smallfonts
+
+% About \smallexamplefonts.  If we use \smallfonts (9pt), @smallexample
+% can fit this many characters:
+%   8.5x11=86   smallbook=72  a4=90  a5=69
+% If we use \scriptfonts (8pt), then we can fit this many characters:
+%   8.5x11=90+  smallbook=80  a4=90+  a5=77
+% For me, subjectively, the few extra characters that fit aren't worth
+% the additional smallness of 8pt.  So I'm making the default 9pt.
+%
+% By the way, for comparison, here's what fits with @example (10pt):
+%   8.5x11=71  smallbook=60  a4=75  a5=58
+%
+% I wish the USA used A4 paper.
+% --karl, 24jan03.
+
 
 % Set up the default fonts, so we can use them for creating boxes.
 %
-\textfonts
+\textfonts \rm
+
+% Define these so they can be easily changed for other fonts.
+\def\angleleft{$\langle$}
+\def\angleright{$\rangle$}
 
 % Count depth in font-changes, for error checks
 \newcount\fontdepth \fontdepth=0
 
 % Fonts for short table of contents.
 \setfont\shortcontrm\rmshape{12}{1000}
-\setfont\shortcontbf\bxshape{12}{1000}
+\setfont\shortcontbf\bfshape{10}{\magstep1}  % no cmb12
 \setfont\shortcontsl\slshape{12}{1000}
+\setfont\shortconttt\ttshape{12}{1000}
 
 %% 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}
+\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else
+                    \ptexslash\fi\fi\fi}
+\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}
+\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}
+
+% like \smartslanted except unconditionally uses \ttsl.
+% @var is set to this for defun arguments.
+\def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx}
+
+% like \smartslanted except unconditionally use \sl.  We never want
+% ttsl for book titles, do we?
+\def\cite#1{{\sl #1}\futurelet\next\smartitalicx}
 
 \let\i=\smartitalic
-\let\var=\smartitalic
-\let\dfn=\smartitalic
+\let\var=\smartslanted
+\let\dfn=\smartslanted
 \let\emph=\smartitalic
-\let\cite=\smartitalic
 
 \def\b#1{{\bf #1}}
 \let\strong=\b
@@ -1252,25 +1729,37 @@
 \def\nohyphenation{\hyphenchar\font = -1  \aftergroup\restorehyphenation}
 \def\restorehyphenation{\hyphenchar\font = `- }
 
+% Set sfcode to normal for the chars that usually have another value.
+% Can't use plain's \frenchspacing because it uses the `\x notation, and
+% sometimes \x has an active definition that messes things up.
+%
+\catcode`@=11
+  \def\frenchspacing{%
+    \sfcode\dotChar  =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
+    \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
+  }
+\catcode`@=\other
+
 \def\t#1{%
   {\tt \rawbackslash \frenchspacing #1}%
   \null
 }
-\let\ttfont=\t
-\def\samp #1{`\tclose{#1}'\null}
-\setfont\smallrm\rmshape{8}{1000}
-\font\smallsy=cmsy9
-\def\key#1{{\smallrm\textfont2=\smallsy \leavevmode\hbox{%
-  \raise0.4pt\hbox{$\langle$}\kern-.08em\vtop{%
+\def\samp#1{`\tclose{#1}'\null}
+\setfont\keyrm\rmshape{8}{1000}
+\font\keysy=cmsy9
+\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
+  \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
     \vbox{\hrule\kern-0.4pt
-     \hbox{\raise0.4pt\hbox{\vphantom{$\langle$}}#1}}%
+     \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
     \kern-0.4pt\hrule}%
-  \kern-.06em\raise0.4pt\hbox{$\rangle$}}}}
+  \kern-.06em\raise0.4pt\hbox{\angleright}}}}
 % The old definition, with no lozenge:
 %\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
 \def\ctrl #1{{\tt \rawbackslash \hat}#1}
 
+% @file, @option are the same as @samp.
 \let\file=\samp
+\let\option=\samp
 
 % @code is a modification of @t,
 % which makes spaces the same size as normal in the surrounding text.
@@ -1295,7 +1784,7 @@
   \null
 }
 
-% We *must* turn on hyphenation at `-' and `_' in \code.
+% We *must* turn on hyphenation at `-' and `_' in @code.
 % Otherwise, it is too hard to avoid overfull hboxes
 % in the Emacs manual, the Library manual, etc.
 
@@ -1305,43 +1794,116 @@
 % and arrange explicitly to hyphenate at a dash.
 %  -- rms.
 {
-\catcode`\-=\active
-\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
-% _ is always active; and it shouldn't be \let = to an _ that is a
-% subscript character anyway. Then, @cindex @samp{_} (for example)
-% fails.  --karl
-\global\def\indexbreaks{%
-  \catcode`\-=\active \let-\realdash
-}
+  \catcode`\-=\active
+  \catcode`\_=\active
+  %
+  \global\def\code{\begingroup
+    \catcode`\-=\active \let-\codedash
+    \catcode`\_=\active \let_\codeunder
+    \codex
+  }
 }
 
 \def\realdash{-}
 \def\codedash{-\discretionary{}{}{}}
-\def\codeunder{\ifusingtt{\normalunderscore\discretionary{}{}{}}{\_}}
+\def\codeunder{%
+  % this is all so @math{@code{var_name}+1} can work.  In math mode, _
+  % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
+  % will therefore expand the active definition of _, which is us
+  % (inside @code that is), therefore an endless loop.
+  \ifusingtt{\ifmmode
+               \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
+             \else\normalunderscore \fi
+             \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.
-%
+
+% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
+%   `example' (@kbd uses ttsl only inside of @example and friends),
+%   or `code' (@kbd uses normal tty font always).
+\parseargdef\kbdinputstyle{%
+  \def\arg{#1}%
+  \ifx\arg\worddistinct
+    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
+  \else\ifx\arg\wordexample
+    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
+  \else\ifx\arg\wordcode
+    \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @kbdinputstyle option `\arg'}%
+  \fi\fi\fi
+}
+\def\worddistinct{distinct}
+\def\wordexample{example}
+\def\wordcode{code}
+
+% Default is `distinct.'
+\kbdinputstyle distinct
+
 \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{\ttsl\look}}\fi
-\else{\tclose{\ttsl\look}}\fi}
+\else{\tclose{\kbdfont\look}}\fi
+\else{\tclose{\kbdfont\look}}\fi}
+
+% For @indicateurl, @env, @command quotes seem unnecessary, so use \code.
+\let\indicateurl=\code
+\let\env=\code
+\let\command=\code
+
+% @uref (abbreviation for `urlref') takes an optional (comma-separated)
+% second argument specifying the text to display and an optional third
+% arg as text to display instead of (rather than in addition to) the url
+% itself.  First (mandatory) arg is the url.  Perhaps eventually put in
+% a hypertex \special here.
+%
+\def\uref#1{\douref #1,,,\finish}
+\def\douref#1,#2,#3,#4\finish{\begingroup
+  \unsepspaces
+  \pdfurl{#1}%
+  \setbox0 = \hbox{\ignorespaces #3}%
+  \ifdim\wd0 > 0pt
+    \unhbox0 % third arg given, show only that
+  \else
+    \setbox0 = \hbox{\ignorespaces #2}%
+    \ifdim\wd0 > 0pt
+      \ifpdf
+        \unhbox0             % PDF: 2nd arg given, show only it
+      \else
+        \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
+      \fi
+    \else
+      \code{#1}% only url given, so show it
+    \fi
+  \fi
+  \endlink
+\endgroup}
+
+% @url synonym for @uref, since that's how everyone uses it.
+% 
+\let\url=\uref
 
-% @url, @email.  Quotes do not seem necessary.
-\let\url=\code % perhaps include a hypertex \special eventually
-% rms does not like the angle brackets --karl, 17may97.
-%\def\email#1{$\langle${\tt #1}$\rangle$}
-\let\email=\code
+% rms does not like angle brackets --karl, 17may97.
+% So now @email is just like @uref, unless we are pdf.
+%
+%\def\email#1{\angleleft{\tt #1}\angleright}
+\ifpdf
+  \def\email#1{\doemail#1,,\finish}
+  \def\doemail#1,#2,#3\finish{\begingroup
+    \unsepspaces
+    \pdfurl{mailto:#1}%
+    \setbox0 = \hbox{\ignorespaces #2}%
+    \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
+    \endlink
+  \endgroup}
+\else
+  \let\email=\uref
+\fi
 
 % Check if we are currently using a typewriter font.  Since all the
 % Computer Modern typewriter fonts have zero interword stretch (and
@@ -1351,8 +1913,7 @@
 \def\ifmonospace{\ifdim\fontdimen3\font=0pt }
 
 % 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.
+% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
 %
 \def\dmn#1{\thinspace #1}
 
@@ -1363,14 +1924,34 @@
 % Polish suppressed-l.  --karl, 22sep96.
 %\def\l#1{{\li #1}\null}
 
+% Explicit font changes: @r, @sc, undocumented @ii.
 \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
 
-% @pounds{} is a sterling sign.
+\def\acronym#1{\doacronym #1,,\finish}
+\def\doacronym#1,#2,#3\finish{%
+  {\selectfonts\lsize #1}%
+  \def\temp{#2}%
+  \ifx\temp\empty \else
+    \space ({\unsepspaces \ignorespaces \temp \unskip})%
+  \fi
+}
+
+% @pounds{} is a sterling sign, which is in the CM italic font.
+% 
 \def\pounds{{\it\$}}
 
+% @registeredsymbol - R in a circle.  The font for the R should really
+% be smaller yet, but lllsize is the best we can do for now.
+% Adapted from the plain.tex definition of \copyright.
+%
+\def\registeredsymbol{%
+  $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}%
+               \hfil\crcr\Orb}}%
+    }$%
+}
+
 
 \message{page headings,}
 
@@ -1378,87 +1959,124 @@
 \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}%
+% Do an implicit @contents or @shortcontents after @end titlepage if the
+% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
+%
+\newif\ifsetcontentsaftertitlepage
+ \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
+\newif\ifsetshortcontentsaftertitlepage
+ \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
+
+\parseargdef\shorttitlepage{\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{%
+\envdef\titlepage{%
+  % Open one extra group, as we want to close it in the middle of \Etitlepage.
+  \begingroup
+    \parindent=0pt \textfonts
+    % Leave some space at the very top of the page.
+    \vglue\titlepagetopglue
+    % No rule at page bottom unless we print one at the top with @title.
+    \finishedtitlepagetrue
+    %
+    % 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
+	 \finishtitlepage
       \fi
-      \oldpage
       \let\page = \oldpage
-      \hbox{}}%
-%   \def\page{\oldpage \hbox{}}
+      \page
+      \null
+    }%
 }
 
 \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
+    \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
+  %
+  % Need this before the \...aftertitlepage checks so that if they are
+  % in effect the toc pages will come out with page numbers.
+  \HEADINGSon
+  %
+  % If they want short, they certainly want long too.
+  \ifsetshortcontentsaftertitlepage
+    \shortcontents
+    \contents
+    \global\let\shortcontents = \relax
+    \global\let\contents = \relax
+  \fi
+  %
+  \ifsetcontentsaftertitlepage
+    \contents
+    \global\let\contents = \relax
+    \global\let\shortcontents = \relax
+  \fi
 }
 
 \def\finishtitlepage{%
-   \vskip4pt \hrule height 2pt width \hsize
-   \vskip\titlepagebottomglue
-   \finishedtitlepagetrue
+  \vskip4pt \hrule height 2pt width \hsize
+  \vskip\titlepagebottomglue
+  \finishedtitlepagetrue
+}
+
+%%% Macros to be used within @titlepage:
+
+\let\subtitlerm=\tenrm
+\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
+
+\def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines
+		\let\tt=\authortt}
+
+\parseargdef\title{%
+  \checkenv\titlepage
+  \leftline{\titlefonts\rm #1}
+  % print a rule at the page bottom also.
+  \finishedtitlepagefalse
+  \vskip4pt \hrule height 4pt width \hsize \vskip4pt
+}
+
+\parseargdef\subtitle{%
+  \checkenv\titlepage
+  {\subtitlefont \rightline{#1}}%
+}
+
+% @author should come last, but may come many times.
+% It can also be used inside @quotation.
+% 
+\parseargdef\author{%
+  \def\temp{\quotation}%
+  \ifx\thisenv\temp
+    \def\quotationauthor{#1}% printed in \Equotation.
+  \else
+    \checkenv\titlepage
+    \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
+    {\authorfont \leftline{#1}}%
+  \fi
 }
 
+
 %%% 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
+\newtoks\evenheadline    % headline on even pages
+\newtoks\oddheadline     % headline on odd pages
+\newtoks\evenfootline    % footline on even pages
+\newtoks\oddfootline     % footline on odd pages
 
-% Now make Tex use those variables
+% Now make TeX use those variables
 \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
                             \else \the\evenheadline \fi}}
 \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
@@ -1472,43 +2090,37 @@
 % @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{%
+\def\evenheading{\parsearg\evenheadingxxx}
+\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
+\def\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{%
+\def\oddheading{\parsearg\oddheadingxxx}
+\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
+\def\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}}}
+\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
 
-\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish}
-\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{%
+\def\evenfooting{\parsearg\evenfootingxxx}
+\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
+\def\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 @.
+\def\oddfooting{\parsearg\oddfootingxxx}
+\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
+\def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
+  \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
+  %
+  % Leave some space for the footline.  Hopefully ok to assume
+  % @evenfooting will not be used by itself.
+  \global\advance\pageheight by -\baselineskip
+  \global\advance\vsize by -\baselineskip
+}
+
+\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
+
 
 % @headings double      turns headings on for double-sided printing.
 % @headings single      turns headings on for single-sided printing.
@@ -1522,7 +2134,7 @@
 
 \def\headings #1 {\csname HEADINGS#1\endcsname}
 
-\def\HEADINGSoff{
+\def\HEADINGSoff{%
 \global\evenheadline={\hfil} \global\evenfootline={\hfil}
 \global\oddheadline={\hfil} \global\oddfootline={\hfil}}
 \HEADINGSoff
@@ -1531,7 +2143,7 @@
 % 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{
+\def\HEADINGSdouble{%
 \global\pageno=1
 \global\evenfootline={\hfil}
 \global\oddfootline={\hfil}
@@ -1543,7 +2155,7 @@
 
 % For single-sided printing, chapter title goes across top left of page,
 % page number on top right.
-\def\HEADINGSsingle{
+\def\HEADINGSsingle{%
 \global\pageno=1
 \global\evenfootline={\hfil}
 \global\oddfootline={\hfil}
@@ -1573,41 +2185,28 @@
 }
 
 % 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
+% This produces Day Month Year style of output.
+% Only define if not already defined, in case a txi-??.tex file has set
+% up a different format (e.g., txi-cs.tex does this).
+\ifx\today\undefined
+\def\today{%
+  \number\day\space
+  \ifcase\month
+  \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+  \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+  \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+  \fi
+  \space\number\year}
+\fi
 
-% These don't work.  For one thing, \+ is defined as outer.
-% So these macros cannot even be defined.
+% @settitle line...  specifies the title of the document, for headings.
+% It generates no output of its own.
+\def\thistitle{\putwordNoTitle}
+\def\settitle{\parsearg{\gdef\thistitle}}
 
-%\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).
+\message{tables,}
+% Tables -- @table, @ftable, @vtable, @item(x).
 
 % default indentation of table text
 \newdimen\tableindent \tableindent=.8in
@@ -1619,7 +2218,7 @@
 % used internally for \itemindent minus \itemmargin
 \newdimen\itemmax
 
-% Note @table, @vtable, and @vtable define @item, @itemx, etc., with
+% Note @table, @ftable, 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).
@@ -1631,30 +2230,13 @@
 \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}}%
+  \setbox0=\hbox{\itemindicate{#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
@@ -1675,114 +2257,125 @@
     % \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
+    % 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
+    % \baselineskip glue.)  However, if what follows is an environment
+    % such as @example, there will be no \parskip glue; then
+    % the negative vskip we just would cause the example and the item to
+    % crash together.  So we use this bizarre value of 10001 as a signal
+    % to \aboveenvbreak to insert \parskip glue after all.
+    % (Possibly there are other commands that could be followed by
+    % @example which need the same treatment, but not section titles; or
+    % maybe section titles are the only special case and they should be
+    % penalty 10001...)
+    \penalty 10001
     \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.
+    % following text (if any) will end up on the same line.
     \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}% Necessary 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 %
+    % Do this with kerns and \unhbox so that if there is a footnote in
+    % the item text, it can migrate to the main vertical list and
+    % eventually be printed.
+    \nobreak\kern-\tableindent
+    \dimen0 = \itemmax  \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
+    \unhbox0
+    \nobreak\kern\dimen0
+    \endgroup
+    \itemxneedsnegativevskiptrue
+  \fi
+}
+
+\def\item{\errmessage{@item while not in a list environment}}
+\def\itemx{\errmessage{@itemx while not in a list environment}}
+
+% @table, @ftable, @vtable.
+\envdef\table{%
+  \let\itemindex\gobble
+  \tablex
+}
+\envdef\ftable{%
+  \def\itemindex ##1{\doind {fn}{\code{##1}}}%
+  \tablex
+}
+\envdef\vtable{%
+  \def\itemindex ##1{\doind {vr}{\code{##1}}}%
+  \tablex
+}
+\def\tablex#1{%
+  \def\itemindicate{#1}%
+  \parsearg\tabley
 }
+\def\tabley#1{%
+  {%
+    \makevalueexpandable
+    \edef\temp{\noexpand\tablez #1\space\space\space}%
+    \expandafter
+  }\temp \endtablez
+}
+\def\tablez #1 #2 #3 #4\endtablez{%
+  \aboveenvbreak
+  \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
+  \ifnum 0#2>0 \tableindent=#2\mil \fi
+  \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
+  \itemmax=\tableindent
+  \advance \itemmax by -\itemmargin
+  \advance \leftskip by \tableindent
+  \exdentamount=\tableindent
+  \parindent = 0pt
+  \parskip = \smallskipamount
+  \ifdim \parskip=0pt \parskip=2pt \fi
+  \let\item = \internalBitem
+  \let\itemx = \internalBitemx
+}
+\def\Etable{\endgraf\afterenvbreak}
+\let\Eftable\Etable
+\let\Evtable\Etable
+\let\Eitemize\Etable
+\let\Eenumerate\Etable
 
 % This is the counter used by @enumerate, which is really @itemize
 
 \newcount \itemno
 
-\def\itemize{\parsearg\itemizezzz}
+\envdef\itemize{\parsearg\doitemize}
 
-\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}
+\def\doitemize#1{%
+  \aboveenvbreak
+  \itemmax=\itemindent
+  \advance\itemmax by -\itemmargin
+  \advance\leftskip by \itemindent
+  \exdentamount=\itemindent
+  \parindent=0pt
+  \parskip=\smallskipamount
+  \ifdim\parskip=0pt \parskip=2pt \fi
+  \def\itemcontents{#1}%
+  % @itemize with no arg is equivalent to @itemize @bullet.
+  \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
+  \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 }
+% Definition of @item while inside @itemize and @enumerate.
+%
+\def\itemizeitem{%
+  \advance\itemno by 1  % for enumerations
+  {\let\par=\endgraf \smallbreak}% reasonable place to break
+  {%
+   % If the document has an @itemize directly after a section title, a
+   % \nobreak will be last on the list, and \sectionheading will have
+   % done a \vskip-\parskip.  In that case, we don't want to zero
+   % parskip, or the item text will crash with the heading.  On the
+   % other hand, when there is normal text preceding the item (as there
+   % usually is), we do want to zero parskip, or there would be too much
+   % space.  In that case, we won't have a \nobreak before.  At least
+   % that's the theory.
+   \ifnum\lastpenalty<10000 \parskip=0in \fi
+   \noindent
+   \hbox to 0pt{\hss \itemcontents \kern\itemmargin}%
+   \vadjust{\penalty 1200}}% not good to break after first line of item.
+  \flushcr
+}
 
 % \splitoff TOKENS\endmark defines \first to be the first token in
 % TOKENS, and \rest to be the remainder.
@@ -1793,11 +2386,8 @@
 % 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}
+\envparseargdef\enumerate{\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
@@ -1868,13 +2458,13 @@
   }%
 }
 
-% Call itemizey, adding a period to the first argument and supplying the
+% Call \doitemize, 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
+  \doitemize{#1.}\flushcr
 }
 
 % @alphaenumerate and @capsenumerate are abbreviations for giving an arg
@@ -1885,16 +2475,6 @@
 \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, 3/6/96
@@ -1921,24 +2501,14 @@
 %   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
 %   @item ...
 %   using the widest term desired in each column.
-%
-% For those who want to use more than one line's worth of words in
-% the preamble, break the line within one argument and it
-% will parse correctly, i.e.,
-%
-%     @multitable {Column 1 template} {Column 2 template} {Column 3
-%      template}
-% Not:
-%     @multitable {Column 1 template} {Column 2 template}
-%      {Column 3 template}
 
 % 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, @multitable or @end multitable do not need to be on their
-% own lines, but it will not hurt if they are.
+% @item, @tab do not need to be on their own lines, but it will not hurt
+% if they are.
 
 % Sample multitable:
 
@@ -1964,10 +2534,7 @@
 % @multitablelinespace is space to leave between table items, baseline
 %                                                            to baseline.
 %   0pt means it depends on current normal line spacing.
-
-%%%%
-% Dimensions
-
+%
 \newskip\multitableparskip
 \newskip\multitableparindent
 \newdimen\multitablecolspace
@@ -1977,129 +2544,175 @@
 \multitablecolspace=12pt
 \multitablelinespace=0pt
 
-%%%%
 % Macros used to set up halign preamble:
+%
 \let\endsetuptable\relax
 \def\xendsetuptable{\endsetuptable}
 \let\columnfractions\relax
 \def\xcolumnfractions{\columnfractions}
 \newif\ifsetpercent
 
-%% 2/1/96, to allow fractions to be given with more than one digit.
-\def\pickupwholefraction#1 {\global\advance\colcount by1 %
-\expandafter\xdef\csname col\the\colcount\endcsname{.#1\hsize}%
-\setuptable}
+% #1 is the @columnfraction, usually a decimal number like .5, but might
+% be just 1.  We just use it, whatever it is.
+% 
+\def\pickupwholefraction#1 {%
+  \global\advance\colcount by 1
+  \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}%
+  \setuptable
+}
 
 \newcount\colcount
-\def\setuptable#1{\def\firstarg{#1}%
-\ifx\firstarg\xendsetuptable\let\go\relax%
-\else
-  \ifx\firstarg\xcolumnfractions\global\setpercenttrue%
+\def\setuptable#1{%
+  \def\firstarg{#1}%
+  \ifx\firstarg\xendsetuptable
+    \let\go = \relax
   \else
-    \ifsetpercent
-       \let\go\pickupwholefraction   % In this case arg of setuptable
-                                     % is the decimal point before the
-                                     % number given in percent of hsize.
-                                     % We don't need this so we don't use it.
+    \ifx\firstarg\xcolumnfractions
+      \global\setpercenttrue
+    \else
+      \ifsetpercent
+         \let\go\pickupwholefraction
+      \else
+         \global\advance\colcount by 1
+         \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
+                   % separator; typically that is always in the input, anyway.
+         \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
+      \fi
+    \fi
+    \ifx\go\pickupwholefraction
+      % Put the argument back for the \pickupwholefraction call, so
+      % we'll always have a period there to be parsed.
+      \def\go{\pickupwholefraction#1}%
     \else
-       \global\advance\colcount by1
-       \setbox0=\hbox{#1 }% Add a normal word space as a separator;
-                          % typically that is always in the input, anyway.
-       \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
+      \let\go = \setuptable
     \fi%
-  \fi%
-\ifx\go\pickupwholefraction\else\let\go\setuptable\fi%
-\fi\go}
-
-%%%%
-% multitable syntax
-\def\tab{&\hskip1sp\relax} % 2/2/96
-                           % tiny skip here makes sure this column space is
-                           % maintained, even if it is never used.
+  \fi
+  \go
+}
 
+% multitable-only commands.
+%
+% @headitem starts a heading row, which we typeset in bold.
+% Assignments have to be global since we are inside the implicit group
+% of an alignment entry.  Note that \everycr resets \everytab.
+\def\headitem{\checkenv\multitable \crcr \global\everytab={\bf}\the\everytab}%
+%
+% A \tab used to include \hskip1sp.  But then the space in a template
+% line is not enough.  That is bad.  So let's go back to just `&' until
+% we encounter the problem it was intended to solve again.
+%					--karl, nathan@acm.org, 20apr99.
+\def\tab{\checkenv\multitable &\the\everytab}%
 
-%%%%
 % @multitable ... @end multitable definitions:
-
-\def\multitable{\parsearg\dotable}
-
-\def\dotable#1{\bgroup
-\let\item\cr
-\tolerance=9500
-\hbadness=9500
-\setmultitablespacing
-\parskip=\multitableparskip
-\parindent=\multitableparindent
-\overfullrule=0pt
-\global\colcount=0\relax%
-\def\Emultitable{\global\setpercentfalse\global\everycr{}\cr\egroup\egroup}%
- % To parse everything between @multitable and @item :
-\setuptable#1 \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%
-\multistrut\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname
- % In order to keep entries from bumping into each other
- % we will add a \leftskip of \multitablecolspace to all columns after
- % the first one.
- %  If a template has been used, we will add \multitablecolspace
- % 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 \multitablecolspace
-  \advance\hsize by \multitablecolspace
-  \fi
- % In either case we will make \leftskip=\multitablecolspace:
-\leftskip=\multitablecolspace
-\fi
- % Ignoring space at the beginning and end avoids an occasional spurious
- % blank line, when TeX decides to break the line at the space before the
- % box from the multistrut, so the strut ends up on a line by itself.
- % For example:
- % @multitable @columnfractions .11 .89
- % @item @code{#}
- % @tab Legal holiday which is valid in major parts of the whole country.
- % Is automatically provided with highlighting sequences respectively marking
- % characters.
- \noindent\ignorespaces##\unskip\multistrut}\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{%
-% \filbreak%% keeps underfull box messages off when table breaks over pages.
-% Maybe so, but it also creates really weird page breaks when the table
-% breaks over pages Wouldn't \vfil be better?  Wait until the problem
-% manifests itself, so it can be fixed for real --karl.
-\global\colcount=0\relax}}
+%
+\newtoks\everytab  % insert after every tab.
+%
+\envdef\multitable{%
+  \vskip\parskip
+  \startsavinginserts
+  %
+  % @item within a multitable starts a normal row.
+  \let\item\crcr
+  %
+  \tolerance=9500
+  \hbadness=9500
+  \setmultitablespacing
+  \parskip=\multitableparskip
+  \parindent=\multitableparindent
+  \overfullrule=0pt
+  \global\colcount=0
+  %
+  \everycr = {%
+    \noalign{%
+      \global\everytab={}%
+      \global\colcount=0 % Reset the column counter.
+      % Check for saved footnotes, etc.
+      \checkinserts
+      % Keeps underfull box messages off when table breaks over pages.
+      %\filbreak
+	% Maybe so, but it also creates really weird page breaks when the
+	% table breaks over pages. Wouldn't \vfil be better?  Wait until the
+	% problem manifests itself, so it can be fixed for real --karl.
+    }%
+  }%
+  %
+  \parsearg\domultitable
+}
+\def\domultitable#1{%
+  % To parse everything between @multitable and @item:
+  \setuptable#1 \endsetuptable
+  %
+  % 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
+    \multistrut
+    \vtop{%
+      % Use the current \colcount to find the correct column width:
+      \hsize=\expandafter\csname col\the\colcount\endcsname
+      %
+      % In order to keep entries from bumping into each other
+      % we will add a \leftskip of \multitablecolspace to all columns after
+      % the first one.
+      %
+      % If a template has been used, we will add \multitablecolspace
+      % to the width of each template entry.
+      %
+      % If the 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.
+      %
+      % Make sure we don't inherit \rightskip from the outer environment.
+      \rightskip=0pt
+      \ifnum\colcount=1
+	% The first column will be indented with the surrounding text.
+	\advance\hsize by\leftskip
+      \else
+	\ifsetpercent \else
+	  % If user has not set preamble in terms of percent of \hsize
+	  % we will advance \hsize by \multitablecolspace.
+	  \advance\hsize by \multitablecolspace
+	\fi
+       % In either case we will make \leftskip=\multitablecolspace:
+      \leftskip=\multitablecolspace
+      \fi
+      % Ignoring space at the beginning and end avoids an occasional spurious
+      % blank line, when TeX decides to break the line at the space before the
+      % box from the multistrut, so the strut ends up on a line by itself.
+      % For example:
+      % @multitable @columnfractions .11 .89
+      % @item @code{#}
+      % @tab Legal holiday which is valid in major parts of the whole country.
+      % Is automatically provided with highlighting sequences respectively
+      % marking characters.
+      \noindent\ignorespaces##\unskip\multistrut
+    }\cr
+}
+\def\Emultitable{%
+  \crcr
+  \egroup % end the \halign
+  \global\setpercentfalse
 }
 
 \def\setmultitablespacing{% test to see if user has set \multitablelinespace.
 % If so, do nothing. If not, give it an appropriate dimension based on
 % current baselineskip.
 \ifdim\multitablelinespace=0pt
+\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
+\global\advance\multitablelinespace by-\ht0
 %% strut to put in table in case some entry doesn't have descenders,
 %% to keep lines equally spaced
 \let\multistrut = \strut
-%% Test to see if parskip is larger than space between lines of
-%% table. If not, do nothing.
-%%        If so, set to same dimension as multitablelinespace.
 \else
+%% FIXME: what is \box0 supposed to be?
 \gdef\multistrut{\vrule height\multitablelinespace depth\dp0
 width0pt\relax} \fi
+%% Test to see if parskip is larger than space between lines of
+%% table. If not, do nothing.
+%%        If so, set to same dimension as multitablelinespace.
 \ifdim\multitableparskip>\multitablelinespace
 \global\multitableparskip=\multitablelinespace
 \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
@@ -2112,6 +2725,216 @@
 \fi}
 
 
+\message{conditionals,}
+
+% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,
+% @ifnotxml always succeed.  They currently do nothing; we don't
+% attempt to check whether the conditionals are properly nested.  But we
+% have to remember that they are conditionals, so that @end doesn't
+% attempt to close an environment group.
+%
+\def\makecond#1{%
+  \expandafter\let\csname #1\endcsname = \relax
+  \expandafter\let\csname iscond.#1\endcsname = 1
+}
+\makecond{iftex}
+\makecond{ifnotdocbook}
+\makecond{ifnothtml}
+\makecond{ifnotinfo}
+\makecond{ifnotplaintext}
+\makecond{ifnotxml}
+
+% Ignore @ignore, @ifhtml, @ifinfo, and the like.
+%
+\def\direntry{\doignore{direntry}}
+\def\documentdescription{\doignore{documentdescription}}
+\def\docbook{\doignore{docbook}}
+\def\html{\doignore{html}}
+\def\ifdocbook{\doignore{ifdocbook}}
+\def\ifhtml{\doignore{ifhtml}}
+\def\ifinfo{\doignore{ifinfo}}
+\def\ifnottex{\doignore{ifnottex}}
+\def\ifplaintext{\doignore{ifplaintext}}
+\def\ifxml{\doignore{ifxml}}
+\def\ignore{\doignore{ignore}}
+\def\menu{\doignore{menu}}
+\def\xml{\doignore{xml}}
+
+% Ignore text until a line `@end #1', keeping track of nested conditionals.
+%
+% A count to remember the depth of nesting.
+\newcount\doignorecount
+
+\def\doignore#1{\begingroup
+  % Scan in ``verbatim'' mode:
+  \catcode`\@ = \other
+  \catcode`\{ = \other
+  \catcode`\} = \other
+  %
+  % Make sure that spaces turn into tokens that match what \doignoretext wants.
+  \spaceisspace
+  %
+  % Count number of #1's that we've seen.
+  \doignorecount = 0
+  %
+  % Swallow text until we reach the matching `@end #1'.
+  \dodoignore {#1}%
+}
+
+{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
+  \obeylines %
+  %
+  \gdef\dodoignore#1{%
+    % #1 contains the string `ifinfo'.
+    %
+    % Define a command to find the next `@end #1', which must be on a line
+    % by itself.
+    \long\def\doignoretext##1^^M@end #1{\doignoretextyyy##1^^M@#1\_STOP_}%
+    % And this command to find another #1 command, at the beginning of a
+    % line.  (Otherwise, we would consider a line `@c @ifset', for
+    % example, to count as an @ifset for nesting.)
+    \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%
+    %
+    % And now expand that command.
+    \obeylines %
+    \doignoretext ^^M%
+  }%
+}
+
+\def\doignoreyyy#1{%
+  \def\temp{#1}%
+  \ifx\temp\empty			% Nothing found.
+    \let\next\doignoretextzzz
+  \else					% Found a nested condition, ...
+    \advance\doignorecount by 1
+    \let\next\doignoretextyyy		% ..., look for another.
+    % If we're here, #1 ends with ^^M\ifinfo (for example).
+  \fi
+  \next #1% the token \_STOP_ is present just after this macro.
+}
+
+% We have to swallow the remaining "\_STOP_".
+% 
+\def\doignoretextzzz#1{%
+  \ifnum\doignorecount = 0	% We have just found the outermost @end.
+    \let\next\enddoignore
+  \else				% Still inside a nested condition.
+    \advance\doignorecount by -1
+    \let\next\doignoretext      % Look for the next @end.
+  \fi
+  \next
+}
+
+% Finish off ignored text.
+\def\enddoignore{\endgroup\ignorespaces}
+
+
+% @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.
+% We rely on the fact that \parsearg sets \catcode`\ =10.
+%
+\parseargdef\set{\setyyy#1 \endsetyyy}
+\def\setyyy#1 #2\endsetyyy{%
+  {%
+    \makevalueexpandable
+    \def\temp{#2}%
+    \edef\next{\gdef\makecsname{SET#1}}%
+    \ifx\temp\empty
+      \next{}%
+    \else
+      \setzzz#2\endsetzzz
+    \fi
+  }%
+}
+% Remove the trailing space \setxxx inserted.
+\def\setzzz#1 \endsetzzz{\next{#1}}
+
+% @clear VAR clears (i.e., unsets) the variable VAR.
+%
+\parseargdef\clear{%
+  {%
+    \makevalueexpandable
+    \global\expandafter\let\csname SET#1\endcsname=\relax
+  }%
+}
+
+% @value{foo} gets the text saved in variable foo.
+\def\value{\begingroup\makevalueexpandable\valuexxx}
+\def\valuexxx#1{\expandablevalue{#1}\endgroup}
+{
+  \catcode`\- = \active \catcode`\_ = \active
+  %
+  \gdef\makevalueexpandable{%
+    \let\value = \expandablevalue
+    % We don't want these characters active, ...
+    \catcode`\-=\other \catcode`\_=\other
+    % ..., but we might end up with active ones in the argument if
+    % we're called from @code, as @code{@value{foo-bar_}}, though.
+    % So \let them to their normal equivalents.
+    \let-\realdash \let_\normalunderscore
+  }
+}
+
+% We have this subroutine so that we can handle at least some @value's
+% properly in indexes (we call \makevalueexpandable in \indexdummies).
+% The command has to be fully expandable (if the variable is set), since
+% the result winds up in the index file.  This means that if the
+% variable's value contains other Texinfo commands, it's almost certain
+% it will fail (although perhaps we could fix that with sufficient work
+% to do a one-level expansion on the result, instead of complete).
+%
+\def\expandablevalue#1{%
+  \expandafter\ifx\csname SET#1\endcsname\relax
+    {[No value for ``#1'']}%
+    \message{Variable `#1', used in @value, is not set.}%
+  \else
+    \csname SET#1\endcsname
+  \fi
+}
+
+% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
+% with @set.
+%
+% To get special treatment of `@end ifset,' call \makeond and the redefine.
+%
+\makecond{ifset}
+\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}
+\def\doifset#1#2{%
+  {%
+    \makevalueexpandable
+    \let\next=\empty
+    \expandafter\ifx\csname SET#2\endcsname\relax
+      #1% If not set, redefine \next.
+    \fi
+    \expandafter
+  }\next
+}
+\def\ifsetfail{\doignore{ifset}}
+
+% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
+% defined with @set, or has been undefined with @clear.
+%
+% The `\else' inside the `\doifset' parameter is a trick to reuse the
+% above code: if the variable is not set, do nothing, if it is set,
+% then redefine \next to \ifclearfail.
+%
+\makecond{ifclear}
+\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}
+\def\ifclearfail{\doignore{ifclear}}
+
+% @dircategory CATEGORY  -- specify a category of the dir file
+% which this file should belong to.  Ignore this in TeX.
+\let\dircategory=\comment
+
+% @defininfoenclose.
+\let\definfoenclose=\comment
+
+
 \message{indexing,}
 % Index generation facilities
 
@@ -2127,45 +2950,59 @@
 % 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}}
+%
+\def\newindex#1{%
+  \iflinks
+    \expandafter\newwrite \csname#1indfile\endcsname
+    \openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+  \fi
+  \expandafter\xdef\csname#1index\endcsname{%     % Define @#1index
+    \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}
+%
+\def\newcodeindex#1{%
+  \iflinks
+    \expandafter\newwrite \csname#1indfile\endcsname
+    \openout \csname#1indfile\endcsname \jobname.#1
+  \fi
+  \expandafter\xdef\csname#1index\endcsname{%
+    \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}}%
+%
+\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
+\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
+
+% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
+% #3 the target index (bar).
+\def\dosynindex#1#2#3{%
+  % Only do \closeout if we haven't already done it, else we'll end up
+  % closing the target index.
+  \expandafter \ifx\csname donesynindex#2\endcsname \undefined
+    % The \closeout helps reduce unnecessary open files; the limit on the
+    % Acorn RISC OS is a mere 16 files.
+    \expandafter\closeout\csname#2indfile\endcsname
+    \expandafter\let\csname\donesynindex#2\endcsname = 1
+  \fi
+  % redefine \fooindfile:
+  \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
+  \expandafter\let\csname#2indfile\endcsname=\temp
+  % redefine \fooindex:
+  \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
 }
 
 % Define \doindex, the driver for all \fooindex macros.
@@ -2185,200 +3022,392 @@
 \def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
 \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
 
+% Take care of Texinfo commands that can appear in an index entry.
+% Since there are some commands we want to expand, and others we don't,
+% we have to laboriously prevent expansion for those that we don't.
+%
 \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.
-% (Must be a way to avoid doing expansion at all, and thus not have to
-% laboriously list every single command here.)
-\def\@{@}% will be @@ when we switch to @ as escape char.
-%\let\{ = \lbracecmd
-%\let\} = \rbracecmd
-\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\dotless##1{\realbackslash dotless {##1}}%
-\def\samp##1{\realbackslash samp {##1}}%
-\def\,##1{\realbackslash ,{##1}}%
-\def\t##1{\realbackslash t {##1}}%
-\def\r##1{\realbackslash r {##1}}%
-\def\i##1{\realbackslash i {##1}}%
-\def\b##1{\realbackslash b {##1}}%
-\def\sc##1{\realbackslash sc {##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}}%
-\unsepspaces
-}
-
-% If an index command is used in an @example environment, any spaces
-% therein should become regular spaces in the raw index file, not the
-% expansion of \tie (\\leavevmode \penalty \@M \ ).
-{\obeyspaces
- \gdef\unsepspaces{\obeyspaces\let =\space}}
-
-% \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\@{@}% change to @@ when we switch to @ as escape char in index files.
+  \def\ {\realbackslash\space }%
+  % Need these in case \tex is in effect and \{ is a \delimiter again.
+  % But can't use \lbracecmd and \rbracecmd because texindex assumes
+  % braces and backslashes are used only as delimiters.
+  \let\{ = \mylbrace
+  \let\} = \myrbrace
+  %
+  % \definedummyword defines \#1 as \realbackslash #1\space, thus
+  % effectively preventing its expansion.  This is used only for control
+  % words, not control letters, because the \space would be incorrect
+  % for control characters, but is needed to separate the control word
+  % from whatever follows.
+  %
+  % For control letters, we have \definedummyletter, which omits the
+  % space.
+  %
+  % These can be used both for control words that take an argument and
+  % those that do not.  If it is followed by {arg} in the input, then
+  % that will dutifully get written to the index (or wherever).
+  %
+  \def\definedummyword##1{%
+    \expandafter\def\csname ##1\endcsname{\realbackslash ##1\space}%
+  }%
+  \def\definedummyletter##1{%
+    \expandafter\def\csname ##1\endcsname{\realbackslash ##1}%
+  }%
+  %
+  % Do the redefinitions.
+  \commondummies
+}
 
-\def\indexnofonts{%
-% Just ignore accents.
-\let\,=\indexdummyfont
-\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
-\let\dotless=\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
-\def\@{@}%
-}
-
-% 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.
+% For the aux file, @ is the escape character.  So we want to redefine
+% everything using @ instead of \realbackslash.  When everything uses
+% @, this will be simpler.
+%
+\def\atdummies{%
+  \def\@{@@}%
+  \def\ {@ }%
+  \let\{ = \lbraceatcmd
+  \let\} = \rbraceatcmd
+  %
+  % (See comments in \indexdummies.)
+  \def\definedummyword##1{%
+    \expandafter\def\csname ##1\endcsname{@##1\space}%
+  }%
+  \def\definedummyletter##1{%
+    \expandafter\def\csname ##1\endcsname{@##1}%
+  }%
+  %
+  % Do the redefinitions.
+  \commondummies
+}
+
+% Called from \indexdummies and \atdummies.  \definedummyword and
+% \definedummyletter must be defined first.
+%
+\def\commondummies{%
+  %
+  \normalturnoffactive
+  %
+  \commondummiesnofonts
+  %
+  \definedummyletter{_}%
+  %
+  % Non-English letters.
+  \definedummyword{AA}%
+  \definedummyword{AE}%
+  \definedummyword{L}%
+  \definedummyword{OE}%
+  \definedummyword{O}%
+  \definedummyword{aa}%
+  \definedummyword{ae}%
+  \definedummyword{l}%
+  \definedummyword{oe}%
+  \definedummyword{o}%
+  \definedummyword{ss}%
+  \definedummyword{exclamdown}%
+  \definedummyword{questiondown}%
+  \definedummyword{ordf}%
+  \definedummyword{ordm}%
+  %
+  % Although these internal commands shouldn't show up, sometimes they do.
+  \definedummyword{bf}%
+  \definedummyword{gtr}%
+  \definedummyword{hat}%
+  \definedummyword{less}%
+  \definedummyword{sf}%
+  \definedummyword{sl}%
+  \definedummyword{tclose}%
+  \definedummyword{tt}%
+  %
+  \definedummyword{LaTeX}%
+  \definedummyword{TeX}%
+  %
+  % Assorted special characters.
+  \definedummyword{bullet}%
+  \definedummyword{copyright}%
+  \definedummyword{registeredsymbol}%
+  \definedummyword{dots}%
+  \definedummyword{enddots}%
+  \definedummyword{equiv}%
+  \definedummyword{error}%
+  \definedummyword{expansion}%
+  \definedummyword{minus}%
+  \definedummyword{pounds}%
+  \definedummyword{point}%
+  \definedummyword{print}%
+  \definedummyword{result}%
+  %
+  % Handle some cases of @value -- where it does not contain any
+  % (non-fully-expandable) commands.
+  \makevalueexpandable
+  %
+  % Normal spaces, not active ones.
+  \unsepspaces
+  %
+  % No macro expansion.
+  \turnoffmacros
+}
 
-{\catcode`\@=0 \catcode`\\=\other
-@gdef@realbackslash{\}}
+% \commondummiesnofonts: common to \commondummies and \indexnofonts.
+%
+% Better have this without active chars.
+{
+  \catcode`\~=\other
+  \gdef\commondummiesnofonts{%
+    % Control letters and accents.
+    \definedummyletter{!}%
+    \definedummyletter{"}%
+    \definedummyletter{'}%
+    \definedummyletter{*}%
+    \definedummyletter{,}%
+    \definedummyletter{.}%
+    \definedummyletter{/}%
+    \definedummyletter{:}%
+    \definedummyletter{=}%
+    \definedummyletter{?}%
+    \definedummyletter{^}%
+    \definedummyletter{`}%
+    \definedummyletter{~}%
+    \definedummyword{u}%
+    \definedummyword{v}%
+    \definedummyword{H}%
+    \definedummyword{dotaccent}%
+    \definedummyword{ringaccent}%
+    \definedummyword{tieaccent}%
+    \definedummyword{ubaraccent}%
+    \definedummyword{udotaccent}%
+    \definedummyword{dotless}%
+    %
+    % Texinfo font commands.
+    \definedummyword{b}%
+    \definedummyword{i}%
+    \definedummyword{r}%
+    \definedummyword{sc}%
+    \definedummyword{t}%
+    %
+    % Commands that take arguments.
+    \definedummyword{acronym}%
+    \definedummyword{cite}%
+    \definedummyword{code}%
+    \definedummyword{command}%
+    \definedummyword{dfn}%
+    \definedummyword{emph}%
+    \definedummyword{env}%
+    \definedummyword{file}%
+    \definedummyword{kbd}%
+    \definedummyword{key}%
+    \definedummyword{math}%
+    \definedummyword{option}%
+    \definedummyword{samp}%
+    \definedummyword{strong}%
+    \definedummyword{tie}%
+    \definedummyword{uref}%
+    \definedummyword{url}%
+    \definedummyword{var}%
+    \definedummyword{verb}%
+    \definedummyword{w}%
+  }
+}
+
+% \indexnofonts is used when outputting the strings to sort the index
+% by, and when constructing control sequence names.  It eliminates all
+% control sequences and just writes whatever the best ASCII sort string
+% would be for a given command (usually its argument).
+%
+\def\indexnofonts{%
+  \def\definedummyword##1{%
+    \expandafter\let\csname ##1\endcsname\asis
+  }%
+  % We can just ignore the accent commands and other control letters.
+  \def\definedummyletter##1{%
+    \expandafter\def\csname ##1\endcsname{}%
+  }%
+  %
+  \commondummiesnofonts
+  %
+  % Don't no-op \tt, since it isn't a user-level command
+  % and is used in the definitions of the active chars like <, >, |, etc.
+  % Likewise with the other plain tex font commands.
+  %\let\tt=\asis
+  %
+  \def\ { }%
+  \def\@{@}%
+  % how to handle braces?
+  \def\_{\normalunderscore}%
+  %
+  % Non-English letters.
+  \def\AA{AA}%
+  \def\AE{AE}%
+  \def\L{L}%
+  \def\OE{OE}%
+  \def\O{O}%
+  \def\aa{aa}%
+  \def\ae{ae}%
+  \def\l{l}%
+  \def\oe{oe}%
+  \def\o{o}%
+  \def\ss{ss}%
+  \def\exclamdown{!}%
+  \def\questiondown{?}%
+  \def\ordf{a}%
+  \def\ordm{o}%
+  %
+  \def\LaTeX{LaTeX}%
+  \def\TeX{TeX}%
+  %
+  % Assorted special characters.
+  % (The following {} will end up in the sort string, but that's ok.)
+  \def\bullet{bullet}%
+  \def\copyright{copyright}%
+  \def\registeredsymbol{R}%
+  \def\dots{...}%
+  \def\enddots{...}%
+  \def\equiv{==}%
+  \def\error{error}%
+  \def\expansion{==>}%
+  \def\minus{-}%
+  \def\pounds{pounds}%
+  \def\point{.}%
+  \def\print{-|}%
+  \def\result{=>}%
+}
 
 \let\indexbackslash=0  %overridden during \printindex.
+\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
+
+% Most index entries go through here, but \dosubind is the general case.
+% #1 is the index name, #2 is the entry text.
+\def\doind#1#2{\dosubind{#1}{#2}{}}
+
+% Workhorse for all \fooindexes.
+% #1 is name of index, #2 is stuff to put there, #3 is subentry --
+% empty if called from \doind, as we usually are (the main exception
+% is with most defuns, which call us directly).
+%
+\def\dosubind#1#2#3{%
+  \iflinks
+  {%
+    % Store the main index entry text (including the third arg).
+    \toks0 = {#2}%
+    % If third arg is present, precede it with a space.
+    \def\thirdarg{#3}%
+    \ifx\thirdarg\empty \else
+      \toks0 = \expandafter{\the\toks0 \space #3}%
+    \fi
+    %
+    \edef\writeto{\csname#1indfile\endcsname}%
+    %
+    \ifvmode
+      \dosubindsanitize
+    \else
+      \dosubindwrite
+    \fi
+  }%
+  \fi
+}
 
-\let\SETmarginindex=\relax %initialize!
-% workhorse for all \fooindexes
-% #1 is name of index, #2 is stuff to put there
-\def\doind #1#2{%
+% Write the entry in \toks0 to the index file:
+%
+\def\dosubindwrite{%
   % Put the index entry in the margin if desired.
   \ifx\SETmarginindex\relax\else
-    \insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}%
+    \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}%
   \fi
-  {%
-    \count255=\lastpenalty
-    {%
-      \indexdummies % Must do this here, since \bf, etc expand at this stage
-      \escapechar=`\\
-      {%
-        \let\folio=0% We will 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.
-        %
-        % First process the index-string with all font commands turned off
-        % to get the string to sort by.
-        {\indexnofonts \xdef\indexsorttmp{#2}}%
-        %
-        % Now produce the complete index entry, with both the sort key and the
-        % original text, including any font commands.
-        \toks0 = {#2}%
-        \edef\temp{%
-          \write\csname#1indfile\endcsname{%
-            \realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}%
-        }%
-        \temp
-      }%
-    }%
-    \penalty\count255
+  %
+  % Remember, we are within a group.
+  \indexdummies % Must do this here, since \bf, etc expand at this stage
+  \escapechar=`\\
+  \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now
+      % so it will be output as is; and it will print as backslash.
+  %
+  % Process the index entry with all font commands turned off, to
+  % get the string to sort by.
+  {\indexnofonts
+   \edef\temp{\the\toks0}% need full expansion
+   \xdef\indexsorttmp{\temp}%
+  }%
+  %
+  % Set up the complete index entry, with both the sort key and
+  % the original text, including any font commands.  We write
+  % three arguments to \entry to the .?? file (four in the
+  % subentry case), texindex reduces to two when writing the .??s
+  % sorted result.
+  \edef\temp{%
+    \write\writeto{%
+      \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}%
   }%
+  \temp
 }
 
-\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}}
+% Take care of unwanted page breaks:
+%
+% If a skip is the last thing on the list now, preserve it
+% by backing up by \lastskip, doing the \write, then inserting
+% the skip again.  Otherwise, the whatsit generated by the
+% \write will make \lastskip zero.  The result is that sequences
+% like this:
+% @end defun
+% @tindex whatever
+% @defun ...
+% will have extra space inserted, because the \medbreak in the
+% start of the @defun won't see the skip inserted by the @end of
+% the previous defun.
+%
+% But don't do any of this if we're not in vertical mode.  We
+% don't want to do a \vskip and prematurely end a paragraph.
+%
+% Avoid page breaks due to these extra skips, too.
+%
+% But wait, there is a catch there:
+% We'll have to check whether \lastskip is zero skip.  \ifdim is not
+% sufficient for this purpose, as it ignores stretch and shrink parts
+% of the skip.  The only way seems to be to check the textual
+% representation of the skip.
+%
+% The following is almost like \def\zeroskipmacro{0.0pt} except that
+% the ``p'' and ``t'' characters have catcode \other, not 11 (letter).
+%
+\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname}
+%
+% ..., ready, GO:
+%
+\def\dosubindsanitize{%
+  % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
+  \skip0 = \lastskip
+  \edef\lastskipmacro{\the\lastskip}%
+  \count255 = \lastpenalty
+  %
+  % If \lastskip is nonzero, that means the last item was a
+  % skip.  And since a skip is discardable, that means this
+  % -\skip0 glue we're inserting is preceded by a
+  % non-discardable item, therefore it is not a potential
+  % breakpoint, therefore no \nobreak needed.
+  \ifx\lastskipmacro\zeroskipmacro
+  \else
+    \vskip-\skip0
+  \fi
+  %
+  \dosubindwrite
+  %
+  \ifx\lastskipmacro\zeroskipmacro
+    % if \lastskip was zero, perhaps the last item was a
+    % penalty, and perhaps it was >=10000, e.g., a \nobreak.
+    % In that case, we want to re-insert the penalty; since we
+    % just inserted a non-discardable item, any following glue
+    % (such as a \parskip) would be a breakpoint.  For example:
+    %   @deffn deffn-whatever
+    %   @vindex index-whatever
+    %   Description.
+    % would allow a break between the index-whatever whatsit
+    % and the "Description." paragraph.
+    \ifnum\count255>9999 \nobreak \fi
+  \else
+    % On the other hand, if we had a nonzero \lastskip,
+    % this make-up glue would be preceded by a non-discardable item
+    % (the whatsit from the \write), so we must insert a \nobreak.
+    \nobreak\vskip\skip0
+  \fi
+}
 
 % The index entry written in the file actually looks like
 %  \entry {sortstring}{page}{topic}
@@ -2415,22 +3444,26 @@
 % @printindex causes a particular index (the ??s file) to get printed.
 % It does not print any chapter heading (usually an @unnumbered).
 %
-\def\printindex{\parsearg\doprintindex}
-\def\doprintindex#1{\begingroup
+\parseargdef\printindex{\begingroup
   \dobreak \chapheadingskip{10000}%
   %
-  \indexfonts \rm
+  \smallfonts \rm
   \tolerance = 9500
-  \indexbreaks
+  \everypar = {}% don't want the \kern\-parindent from indentation suppression.
   %
   % See if the index file exists and is nonempty.
+  % Change catcode of @ here so that if the index file contains
+  % \initial {@}
+  % as its first line, TeX doesn't complain about mismatched braces
+  % (because it thinks @} is a control sequence).
+  \catcode`\@ = 11
   \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)
+    \putwordIndexNonexistent
   \else
     %
     % If the index file exists but is empty, then \openin leaves \ifeof
@@ -2438,14 +3471,13 @@
     % it can discover if there is anything in it.
     \read 1 to \temp
     \ifeof 1
-      (Index is empty)
+      \putwordIndexIsEmpty
     \else
       % Index files are almost Texinfo source, but we use \ as the escape
       % character.  It would be better to use @, but that's too big a change
       % to make right now.
-      \def\indexbackslash{\rawbackslashxx}%
+      \def\indexbackslash{\backslashcurfont}%
       \catcode`\\ = 0
-      \catcode`\@ = 11
       \escapechar = `\\
       \begindoublecolumns
       \input \jobname.#1s
@@ -2458,77 +3490,119 @@
 % 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
+\def\initial#1{{%
+  % Some minor font changes for the special characters.
+  \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
+  %
+  % Remove any glue we may have, we'll be inserting our own.
+  \removelastskip
+  %
+  % We like breaks before the index initials, so insert a bonus.
+  \penalty -300
+  %
+  % Typeset the initial.  Making this add up to a whole number of
+  % baselineskips increases the chance of the dots lining up from column
+  % to column.  It still won't often be perfect, because of the stretch
+  % we need before each entry, but it's better.
+  %
+  % No shrink because it confuses \balancecolumns.
+  \vskip 1.67\baselineskip plus .5\baselineskip
+  \leftline{\secbf #1}%
+  \vskip .33\baselineskip plus .1\baselineskip
   %
-  % \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 kludged 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}
+  % Do our best not to break after the initial.
+  \nobreak
+}}
+
+% \entry typesets a paragraph consisting of the text (#1), dot leaders, and
+% then page number (#2) flushed to the right margin.  It is used for index
+% and table of contents entries.  The paragraph is indented by \leftskip.
+%
+% A straightforward implementation would start like this:
+%	\def\entry#1#2{...
+% But this frozes the catcodes in the argument, and can cause problems to
+% @code, which sets - active.  This problem was fixed by a kludge---
+% ``-'' was active throughout whole index, but this isn't really right.
+% 
+% The right solution is to prevent \entry from swallowing the whole text.
+%                                 --kasal, 21nov03
+\def\entry{%
+  \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
+    %
+    % A bit of stretch before each entry for the benefit of balancing
+    % columns.
+    \vskip 0pt plus1pt
+    %
+    % Swallow the left brace of the text (first parameter):
+    \afterassignment\doentry
+    \let\temp =
+}
+\def\doentry{%
+    \bgroup % Instead of the swallowed brace.
+      \noindent
+      \aftergroup\finishentry
+      % And now comes the text of the entry.
+}
+\def\finishentry#1{%
+    % #1 is the page number.
+    %
+    % The following is kludged 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{#1}%
+    \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.
+      \ifpdf
+	\pdfgettoks#1.%
+	\ \the\toksA
+      \else
+	\ #1%
+      \fi
+    \fi
+    \par
+  \endgroup
+}
 
 % Like \dotfill except takes at least 1 em.
 \def\indexdotfill{\cleaders
@@ -2537,11 +3611,18 @@
 \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
+\def\secondary#1#2{{%
+  \parfillskip=0in
+  \parskip=0in
+  \hangindent=1in
+  \hangafter=1
+  \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
+  \ifpdf
+    \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+  \else
+    #2
+  \fi
+  \par
 }}
 
 % Define two-column mode, which we use to typeset indexes.
@@ -2554,27 +3635,29 @@
 
 \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
   % Grab any single-column material above us.
-  \output = {\global\setbox\partialpage = \vbox{%
-    % 
+  \output = {%
+    %
     % Here is a possibility not foreseen in manmac: if we accumulate a
     % whole lot of material, we might end up calling this \output
     % routine twice in a row (see the doublecol-lose test, which is
     % essentially a couple of indexes with @setchapternewpage off).  In
-    % that case, we must prevent the second \partialpage from
-    % simply overwriting the first, causing us to lose the page.
-    % This will preserve it until a real output routine can ship it
-    % out.  Generally, \partialpage will be empty when this runs and
-    % this will be a no-op.
-    \unvbox\partialpage
-    %
-    % Unvbox the main output page.
-    \unvbox255
-    \kern-\topskip \kern\baselineskip
-  }}%
-  \eject
-  %
-  % Use the double-column output routine for subsequent pages.
-  \output = {\doublecolumnout}%
+    % that case we just ship out what is in \partialpage with the normal
+    % output routine.  Generally, \partialpage will be empty when this
+    % runs and this will be a no-op.  See the indexspread.tex test case.
+    \ifvoid\partialpage \else
+      \onepageout{\pagecontents\partialpage}%
+    \fi
+    %
+    \global\setbox\partialpage = \vbox{%
+      % Unvbox the main output page.
+      \unvbox\PAGE
+      \kern-\topskip \kern\baselineskip
+    }%
+  }%
+  \eject % run that output routine to set \partialpage
+  %
+  % Use the double-column output routine for subsequent pages.
+  \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
@@ -2601,57 +3684,99 @@
   % since nobody clobbers \vsize.)
   \vsize = 2\vsize
 }
+
+% The double-column output routine for all double-column pages except
+% the last.
+%
 \def\doublecolumnout{%
   \splittopskip=\topskip \splitmaxdepth=\maxdepth
   % Get the available space for the double columns -- the normal
   % (undoubled) page height minus any material left over from the
   % previous page.
-  \dimen@=\pageheight \advance\dimen@ by-\ht\partialpage
+  \dimen@ = \vsize
+  \divide\dimen@ by 2
+  \advance\dimen@ by -\ht\partialpage
+  %
   % box0 will be the left-hand column, box2 the right.
   \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
   \onepageout\pagesofar
   \unvbox255
   \penalty\outputpenalty
 }
+%
+% Re-output the contents of the output page -- any previous material,
+% followed by the two boxes we just split, in box0 and box2.
 \def\pagesofar{%
-  % Re-output the contents of the output page -- any previous material,
-  % followed by the two boxes we just split.
   \unvbox\partialpage
+  %
   \hsize = \doublecolumnhsize
-  \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}%
+  \wd0=\hsize \wd2=\hsize
+  \hbox to\pagewidth{\box0\hfil\box2}%
 }
+%
+% All done with double columns.
 \def\enddoublecolumns{%
-  \output = {\balancecolumns}\eject % split what we have
+  \output = {%
+    % Split the last of the double-column material.  Leave it on the
+    % current page, no automatic page break.
+    \balancecolumns
+    %
+    % If we end up splitting too much material for the current page,
+    % though, there will be another page break right after this \output
+    % invocation ends.  Having called \balancecolumns once, we do not
+    % want to call it again.  Therefore, reset \output to its normal
+    % definition right away.  (We hope \balancecolumns will never be
+    % called on to balance too much material, but if it is, this makes
+    % the output somewhat more palatable.)
+    \global\output = {\onepageout{\pagecontents\PAGE}}%
+  }%
+  \eject
   \endgroup % started in \begindoublecolumns
   %
-  % Back to normal single-column typesetting, but take account of the
-  % fact that we just accumulated some stuff on the output page.
+  % \pagegoal was set to the doubled \vsize above, since we restarted
+  % the current page.  We're now back to normal single-column
+  % typesetting, so reset \pagegoal to the normal \vsize (after the
+  % \endgroup where \vsize got restored).
   \pagegoal = \vsize
 }
+%
+% Called at the end of the double column material.
 \def\balancecolumns{%
-  % Called at the end of the double column material.
-  \setbox0 = \vbox{\unvbox255}%
+  \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
   \dimen@ = \ht0
   \advance\dimen@ by \topskip
   \advance\dimen@ by-\baselineskip
-  \divide\dimen@ by 2
+  \divide\dimen@ by 2 % target to split to
+  %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}%
   \splittopskip = \topskip
   % Loop until we get a decent breakpoint.
-  {\vbadness=10000 \loop
-    \global\setbox3=\copy0
-    \global\setbox1=\vsplit3 to\dimen@
-    \ifdim\ht3>\dimen@ \global\advance\dimen@ by1pt
-   \repeat}%
+  {%
+    \vbadness = 10000
+    \loop
+      \global\setbox3 = \copy0
+      \global\setbox1 = \vsplit3 to \dimen@
+    \ifdim\ht3>\dimen@
+      \global\advance\dimen@ by 1pt
+    \repeat
+  }%
+  %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%
   \setbox0=\vbox to\dimen@{\unvbox1}%
   \setbox2=\vbox to\dimen@{\unvbox3}%
+  %
   \pagesofar
 }
 \catcode`\@ = \other
 
 
 \message{sectioning,}
-% Define chapters, sections, etc.
+% Chapters, sections, etc.
 
+% \unnumberedno is an oxymoron, of course.  But we count the unnumbered
+% sections so that we can refer to them unambiguously in the pdf
+% outlines by their "section number".  We avoid collisions with chapter
+% numbers by starting them at 10000.  (If a document ever has 10000
+% chapters, we're in trouble anyway, I'm sure.)
+\newcount\unnumberedno \unnumberedno = 10000
 \newcount\chapno
 \newcount\secno        \secno=0
 \newcount\subsecno     \subsecno=0
@@ -2659,55 +3784,55 @@
 
 % 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 }
+%
+% \def\appendixletter{\char\the\appendixno}
+% We do the following ugly conditional instead of the above simple
+% construct for the sake of pdftex, which needs the actual
+% letter in the expansion, not just typeset.
+% 
+\def\appendixletter{%
+  \ifnum\appendixno=`A A%
+  \else\ifnum\appendixno=`B B%
+  \else\ifnum\appendixno=`C C%
+  \else\ifnum\appendixno=`D D%
+  \else\ifnum\appendixno=`E E%
+  \else\ifnum\appendixno=`F F%
+  \else\ifnum\appendixno=`G G%
+  \else\ifnum\appendixno=`H H%
+  \else\ifnum\appendixno=`I I%
+  \else\ifnum\appendixno=`J J%
+  \else\ifnum\appendixno=`K K%
+  \else\ifnum\appendixno=`L L%
+  \else\ifnum\appendixno=`M M%
+  \else\ifnum\appendixno=`N N%
+  \else\ifnum\appendixno=`O O%
+  \else\ifnum\appendixno=`P P%
+  \else\ifnum\appendixno=`Q Q%
+  \else\ifnum\appendixno=`R R%
+  \else\ifnum\appendixno=`S S%
+  \else\ifnum\appendixno=`T T%
+  \else\ifnum\appendixno=`U U%
+  \else\ifnum\appendixno=`V V%
+  \else\ifnum\appendixno=`W W%
+  \else\ifnum\appendixno=`X X%
+  \else\ifnum\appendixno=`Y Y%
+  \else\ifnum\appendixno=`Z Z%
+  % The \the is necessary, despite appearances, because \appendixletter is
+  % expanded while writing the .toc file.  \char\appendixno is not
+  % expandable, thus it is written literally, thus all appendixes come out
+  % with the same letter (or @) in the toc without it.
+  \else\char\the\appendixno
+  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
 
 % 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{\ifnum \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}}%
-}
+% page headings and footings can use it.  @section does likewise.
+% However, they are not reliable, because we don't use marks.
+\def\thischapter{}
+\def\thissection{}
 
 \newcount\absseclevel % used to calculate proper heading level
-\newcount\secbase\secbase=0 % @raise/lowersections modify this count
+\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
 
 % @raisesections: treat @section as chapter, @subsection as section, etc.
 \def\raisesections{\global\advance\secbase by -1}
@@ -2717,308 +3842,250 @@
 \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}
+% we only have subsub.
+\chardef\maxseclevel = 3
+%
+% A numbered section within an unnumbered changes to unnumbered too.
+% To achive this, remember the "biggest" unnum. sec. we are currently in:
+\chardef\unmlevel = \maxseclevel
+%
+% Trace whether the current chapter is an appendix or not:
+% \chapheadtype is "N" or "A", unnumbered chapters are ignored.
+\def\chapheadtype{N}
+
+% Choose a heading macro
+% #1 is heading type
+% #2 is heading level
+% #3 is text for heading
+\def\genhead#1#2#3{%
+  % Compute the abs. sec. level:
+  \absseclevel=#2
+  \advance\absseclevel by \secbase
+  % Make sure \absseclevel doesn't fall outside the range:
+  \ifnum \absseclevel < 0
+    \absseclevel = 0
   \else
-    \numberedsubsubseczzz{#2}
+    \ifnum \absseclevel > 3
+      \absseclevel = 3
+    \fi
   \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}
+  % The heading type:
+  \def\headtype{#1}%
+  \if \headtype U%
+    \ifnum \absseclevel < \unmlevel
+      \chardef\unmlevel = \absseclevel
+    \fi
   \else
-    \appendixsubsubseczzz{#2}
+    % Check for appendix sections:
+    \ifnum \absseclevel = 0
+      \edef\chapheadtype{\headtype}%
+    \else
+      \if \headtype A\if \chapheadtype N%
+	\errmessage{@appendix... within a non-appendix chapter}%
+      \fi\fi
+    \fi
+    % Check for numbered within unnumbered:
+    \ifnum \absseclevel > \unmlevel
+      \def\headtype{U}%
+    \else
+      \chardef\unmlevel = 3
+    \fi
   \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}
+  % Now print the heading:
+  \if \headtype U%
+    \ifcase\absseclevel
+	\unnumberedzzz{#3}%
+    \or \unnumberedseczzz{#3}%
+    \or \unnumberedsubseczzz{#3}%
+    \or \unnumberedsubsubseczzz{#3}%
+    \fi
   \else
-    \unnumberedsubsubseczzz{#2}
+    \if \headtype A%
+      \ifcase\absseclevel
+	  \appendixzzz{#3}%
+      \or \appendixsectionzzz{#3}%
+      \or \appendixsubseczzz{#3}%
+      \or \appendixsubsubseczzz{#3}%
+      \fi
+    \else
+      \ifcase\absseclevel
+	  \chapterzzz{#3}%
+      \or \seczzz{#3}%
+      \or \numberedsubseczzz{#3}%
+      \or \numberedsubsubseczzz{#3}%
+      \fi
+    \fi
   \fi
-\fi
+  \suppressfirstparagraphindent
 }
 
+% an interface:
+\def\numhead{\genhead N}
+\def\apphead{\genhead A}
+\def\unnmhead{\genhead U}
 
-\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%
-\toks0 = {#1}%
-\edef\temp{{\realbackslash chapentry{\the\toks0}{\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%
-\toks0 = {#1}%
-\edef\temp{{\realbackslash chapentry{\the\toks0}%
-  {\putwordAppendix{} \appendixletter}{\noexpand\folio}}}%
-\escapechar=`\\%
-\write \contentsfile \temp  %
-\appendixnoderef %
-\global\let\section = \appendixsec
-\global\let\subsection = \appendixsubsec
-\global\let\subsubsection = \appendixsubsubsec
-}}
+% @chapter, @appendix, @unnumbered.  Increment top-level counter, reset
+% all lower-level sectioning counters to zero.
+% 
+% Also set \chaplevelprefix, which we prepend to @float sequence numbers
+% (e.g., figures), q.v.  By default (before any chapter), that is empty.
+\let\chaplevelprefix = \empty
+% 
+\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz
+\def\chapterzzz#1{%
+  % section resetting is \global in case the chapter is in a group, such
+  % as an @include file.
+  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+    \global\advance\chapno by 1
+  %
+  % Used for \float.
+  \gdef\chaplevelprefix{\the\chapno.}%
+  \resetallfloatnos
+  %
+  \message{\putwordChapter\space \the\chapno}%
+  %
+  % Write the actual heading.
+  \chapmacro{#1}{Ynumbered}{\the\chapno}%
+  %
+  % So @section and the like are numbered underneath this chapter.
+  \global\let\section = \numberedsec
+  \global\let\subsection = \numberedsubsec
+  \global\let\subsubsection = \numberedsubsubsec
+}
+
+\outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls appendixzzz
+\def\appendixzzz#1{%
+  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+    \global\advance\appendixno by 1
+  \gdef\chaplevelprefix{\appendixletter.}%
+  \resetallfloatnos
+  %
+  \def\appendixnum{\putwordAppendix\space \appendixletter}%
+  \message{\appendixnum}%
+  %
+  \chapmacro{#1}{Yappendix}{\appendixletter}%
+  %
+  \global\let\section = \appendixsec
+  \global\let\subsection = \appendixsubsec
+  \global\let\subsubsection = \appendixsubsubsec
+}
+
+\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
+\def\unnumberedzzz#1{%
+  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+    \global\advance\unnumberedno by 1
+  %
+  % Since an unnumbered has no number, no prefix for figures.
+  \global\let\chaplevelprefix = \empty
+  \resetallfloatnos
+  %
+  % 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 <toks register>.  (We also do this for
+  % the toc entries.)
+  \toks0 = {#1}%
+  \message{(\the\toks0)}%
+  %
+  \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
+  %
+  \global\let\section = \unnumberedsec
+  \global\let\subsection = \unnumberedsubsec
+  \global\let\subsubsection = \unnumberedsubsubsec
+}
 
 % @centerchap is like @unnumbered, but the heading is centered.
-\outer\def\centerchap{\parsearg\centerchapyyy}
-\def\centerchapyyy #1{{\let\unnumbchapmacro=\centerchapmacro \unnumberedyyy{#1}}}
-
-\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%
-\toks0 = {#1}%
-\edef\temp{{\realbackslash unnumbchapentry{\the\toks0}{\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%
-\toks0 = {#1}%
-\edef\temp{{\realbackslash secentry %
-{\the\toks0}{\the\chapno}{\the\secno}{\noexpand\folio}}}%
-\escapechar=`\\%
-\write \contentsfile \temp %
-\donoderef %
-\penalty 10000 %
-}}
-
-\outer\def\appendixsection{\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%
-\toks0 = {#1}%
-\edef\temp{{\realbackslash secentry %
-{\the\toks0}{\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%
-\toks0 = {#1}%
-\edef\temp{{\realbackslash unnumbsecentry{\the\toks0}{\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%
-\toks0 = {#1}%
-\edef\temp{{\realbackslash subsecentry %
-{\the\toks0}{\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%
-\toks0 = {#1}%
-\edef\temp{{\realbackslash subsecentry %
-{\the\toks0}{\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}%
-\plainsubsecheading {#1}\gdef\thissection{#1}%
-{\chapternofonts%
-\toks0 = {#1}%
-\edef\temp{{\realbackslash unnumbsubsecentry{\the\toks0}{\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%
-\toks0 = {#1}%
-\edef\temp{{\realbackslash subsubsecentry{\the\toks0}
-  {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}
-  {\noexpand\folio}}}%
-\escapechar=`\\%
-\write \contentsfile \temp %
-\donoderef %
-\penalty 10000 %
-}}
+\outer\parseargdef\centerchap{%
+  % Well, we could do the following in a group, but that would break
+  % an assumption that \chapmacro is called at the outermost level.
+  % Thus we are safer this way:		--kasal, 24feb04
+  \let\centerparametersmaybe = \centerparameters
+  \unnmhead0{#1}%
+  \let\centerparametersmaybe = \relax
+}
 
-\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%
-\toks0 = {#1}%
-\edef\temp{{\realbackslash subsubsecentry{\the\toks0}%
-  {\appendixletter}
-  {\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}%
-\escapechar=`\\%
-\write \contentsfile \temp %
-\appendixnoderef %
-\penalty 10000 %
-}}
+% @top is like @unnumbered.
+\let\top\unnumbered
 
-\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy}
-\def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
-\def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}%
-\plainsubsubsecheading {#1}\gdef\thissection{#1}%
-{\chapternofonts%
-\toks0 = {#1}%
-\edef\temp{{\realbackslash unnumbsubsubsecentry{\the\toks0}{\noexpand\folio}}}%
-\escapechar=`\\%
-\write \contentsfile \temp %
-\unnumbnoderef %
-\penalty 10000 %
-}}
+% Sections.
+\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz
+\def\seczzz#1{%
+  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
+  \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
+}
+
+\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz
+\def\appendixsectionzzz#1{%
+  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
+  \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
+}
+\let\appendixsec\appendixsection
+
+\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz
+\def\unnumberedseczzz#1{%
+  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
+  \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
+}
 
-% 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}
+% Subsections.
+\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz
+\def\numberedsubseczzz#1{%
+  \global\subsubsecno=0  \global\advance\subsecno by 1
+  \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
+}
+
+\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz
+\def\appendixsubseczzz#1{%
+  \global\subsubsecno=0  \global\advance\subsecno by 1
+  \sectionheading{#1}{subsec}{Yappendix}%
+                 {\appendixletter.\the\secno.\the\subsecno}%
+}
+
+\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
+\def\unnumberedsubseczzz#1{%
+  \global\subsubsecno=0  \global\advance\subsecno by 1
+  \sectionheading{#1}{subsec}{Ynothing}%
+                 {\the\unnumberedno.\the\secno.\the\subsecno}%
+}
+
+% Subsubsections.
+\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz
+\def\numberedsubsubseczzz#1{%
+  \global\advance\subsubsecno by 1
+  \sectionheading{#1}{subsubsec}{Ynumbered}%
+                 {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz
+\def\appendixsubsubseczzz#1{%
+  \global\advance\subsubsecno by 1
+  \sectionheading{#1}{subsubsec}{Yappendix}%
+                 {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
+\def\unnumberedsubsubseczzz#1{%
+  \global\advance\subsubsecno by 1
+  \sectionheading{#1}{subsubsec}{Ynothing}%
+                 {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
 
 % 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
+\let\section = \numberedsec
+\let\subsection = \numberedsubsec
+\let\subsubsection = \numberedsubsubsec
 
 % Define @majorheading, @heading and @subheading
 
-% NOTE on use of \vbox for chapter headings, section headings, and
-% such:
+% 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
@@ -3027,23 +4094,27 @@
 %          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\majorheading{%
+  {\advance\chapheadingskip by 10pt \chapbreak }%
+  \parsearg\chapheadingzzz
+}
+
+\def\chapheading{\chapbreak \parsearg\chapheadingzzz}
+\def\chapheadingzzz#1{%
+  {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                    \parindent=0pt\raggedright
+                    \rm #1\hfill}}%
+  \bigskip \par\penalty 200\relax
+  \suppressfirstparagraphindent
+}
 
 % @heading, @subheading, @subsubheading.
-\def\heading{\parsearg\plainsecheading}
-\def\subheading{\parsearg\plainsubsecheading}
-\def\subsubheading{\parsearg\plainsubsubsecheading}
+\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{}
+  \suppressfirstparagraphindent}
+\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
+  \suppressfirstparagraphindent}
+\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
+  \suppressfirstparagraphindent}
 
 % These macros generate a chapter, section, etc. heading only
 % (including whitespace, linebreaking, etc. around it),
@@ -3052,8 +4123,6 @@
 %%% 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)
 
@@ -3065,18 +4134,18 @@
 
 \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
 
-\def\CHAPPAGoff{
+\def\CHAPPAGoff{%
 \global\let\contentsalignmacro = \chappager
 \global\let\pchapsepmacro=\chapbreak
 \global\let\pagealignmacro=\chappager}
 
-\def\CHAPPAGon{
+\def\CHAPPAGon{%
 \global\let\contentsalignmacro = \chappager
 \global\let\pchapsepmacro=\chappager
 \global\let\pagealignmacro=\chappager
 \global\def\HEADINGSon{\HEADINGSsingle}}
 
-\def\CHAPPAGodd{
+\def\CHAPPAGodd{%
 \global\let\contentsalignmacro = \chapoddpage
 \global\let\pchapsepmacro=\chapoddpage
 \global\let\pagealignmacro=\chapoddpage
@@ -3084,221 +4153,394 @@
 
 \CHAPPAGon
 
-\def\CHAPFplain{
-\global\let\chapmacro=\chfplain
-\global\let\unnumbchapmacro=\unnchfplain
-\global\let\centerchapmacro=\centerchfplain}
-
-% Plain chapter opening.
-% #1 is the text, #2 the chapter number or empty if unnumbered.
-\def\chfplain#1#2{%
+% Chapter opening.
+% 
+% #1 is the text, #2 is the section type (Ynumbered, Ynothing,
+% Yappendix, Yomitfromtoc), #3 the chapter number.
+% 
+% To test against our argument.
+\def\Ynothingkeyword{Ynothing}
+\def\Yomitfromtockeyword{Yomitfromtoc}
+\def\Yappendixkeyword{Yappendix}
+%
+\def\chapmacro#1#2#3{%
   \pchapsepmacro
   {%
     \chapfonts \rm
-    \def\chapnum{#2}%
-    \setbox0 = \hbox{#2\ifx\chapnum\empty\else\enspace\fi}%
+    %
+    % Have to define \thissection before calling \donoderef, because the
+    % xref code eventually uses it.  On the other hand, it has to be called
+    % after \pchapsepmacro, or the headline will change too soon.
+    \gdef\thissection{#1}%
+    \gdef\thischaptername{#1}%
+    %
+    % Only insert the separating space if we have a chapter/appendix
+    % number, and don't print the unnumbered ``number''.
+    \def\temptype{#2}%
+    \ifx\temptype\Ynothingkeyword
+      \setbox0 = \hbox{}%
+      \def\toctype{unnchap}%
+      \def\thischapter{#1}%
+    \else\ifx\temptype\Yomitfromtockeyword
+      \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
+      \def\toctype{omit}%
+      \xdef\thischapter{}%
+    \else\ifx\temptype\Yappendixkeyword
+      \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
+      \def\toctype{app}%
+      % We don't substitute the actual chapter name into \thischapter
+      % because we don't want its macros evaluated now.  And we don't
+      % use \thissection because that changes with each section.
+      %
+      \xdef\thischapter{\putwordAppendix{} \appendixletter:
+                        \noexpand\thischaptername}%
+    \else
+      \setbox0 = \hbox{#3\enspace}%
+      \def\toctype{numchap}%
+      \xdef\thischapter{\putwordChapter{} \the\chapno:
+                        \noexpand\thischaptername}%
+    \fi\fi\fi
+    %
+    % Write the toc entry for this chapter.  Must come before the
+    % \donoderef, because we include the current node name in the toc
+    % entry, and \donoderef resets it to empty.
+    \writetocentry{\toctype}{#1}{#3}%
+    %
+    % For pdftex, we have to write out the node definition (aka, make
+    % the pdfdest) after any page break, but before the actual text has
+    % been typeset.  If the destination for the pdf outline is after the
+    % text, then jumping from the outline may wind up with the text not
+    % being visible, for instance under high magnification.
+    \donoderef{#2}%
+    %
+    % Typeset the actual heading.
     \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
-          \hangindent = \wd0 \centerparametersmaybe
+          \hangindent=\wd0 \centerparametersmaybe
           \unhbox0 #1\par}%
   }%
   \nobreak\bigskip % no page break after a chapter title
   \nobreak
 }
 
-% Plain opening for unnumbered.
-\def\unnchfplain#1{\chfplain{#1}{}}
-
 % @centerchap -- centered and unnumbered.
 \let\centerparametersmaybe = \relax
-\def\centerchfplain#1{{%
-  \def\centerparametersmaybe{%
-    \advance\rightskip by 3\rightskip
-    \leftskip = \rightskip
-    \parfillskip = 0pt
-  }%
-  \chfplain{#1}{}%
-}}
+\def\centerparameters{%
+  \advance\rightskip by 3\rightskip
+  \leftskip = \rightskip
+  \parfillskip = 0pt
+}
 
-\CHAPFplain % The default
 
+% I don't think this chapter style is supported any more, so I'm not
+% updating it with the new noderef stuff.  We'll see.  --karl, 11aug03.
+% 
+\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
+%
 \def\unnchfopen #1{%
 \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
                        \parindent=0pt\raggedright
-                       \rm #1\hfill}}\bigskip \par\penalty 10000 %
+                       \rm #1\hfill}}\bigskip \par\nobreak
 }
-
 \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\centerchfopen #1{%
 \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
                        \parindent=0pt
-                       \hfill {\rm #1}\hfill}}\bigskip \par\penalty 10000 %
+                       \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
 }
+\def\CHAPFopen{%
+  \global\let\chapmacro=\chfopen
+  \global\let\centerchapmacro=\centerchfopen}
 
-\def\CHAPFopen{
-\global\let\chapmacro=\chfopen
-\global\let\unnumbchapmacro=\unnchfopen
-\global\let\centerchapmacro=\centerchfopen}
 
-
-% Section titles.
+% Section titles.  These macros combine the section number parts and
+% call the generic \sectionheading to do the printing.
+% 
 \newskip\secheadingskip
-\def\secheadingbreak{\dobreak \secheadingskip {-1000}}
-\def\secheading#1#2#3{\sectionheading{sec}{#2.#3}{#1}}
-\def\plainsecheading#1{\sectionheading{sec}{}{#1}}
+\def\secheadingbreak{\dobreak \secheadingskip{-1000}}
 
 % Subsection titles.
-\newskip \subsecheadingskip
-\def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}}
-\def\subsecheading#1#2#3#4{\sectionheading{subsec}{#2.#3.#4}{#1}}
-\def\plainsubsecheading#1{\sectionheading{subsec}{}{#1}}
+\newskip\subsecheadingskip
+\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}}
 
 % Subsubsection titles.
-\let\subsubsecheadingskip = \subsecheadingskip
-\let\subsubsecheadingbreak = \subsecheadingbreak
-\def\subsubsecheading#1#2#3#4#5{\sectionheading{subsubsec}{#2.#3.#4.#5}{#1}}
-\def\plainsubsubsecheading#1{\sectionheading{subsubsec}{}{#1}}
+\def\subsubsecheadingskip{\subsecheadingskip}
+\def\subsubsecheadingbreak{\subsecheadingbreak}
 
 
-% Print any size section title.
-%
-% #1 is the section type (sec/subsec/subsubsec), #2 is the section
-% number (maybe empty), #3 the text.
-\def\sectionheading#1#2#3{%
-  {%
-    \expandafter\advance\csname #1headingskip\endcsname by \parskip
-    \csname #1headingbreak\endcsname
-  }%
+% Print any size, any type, section title.
+% 
+% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is
+% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the
+% section number.
+% 
+\def\sectionheading#1#2#3#4{%
   {%
     % Switch to the right set of fonts.
-    \csname #1fonts\endcsname \rm
+    \csname #2fonts\endcsname \rm
+    %
+    % Insert space above the heading.
+    \csname #2headingbreak\endcsname
     %
-    % Only insert the separating space if we have a section number.
-    \def\secnum{#2}%
-    \setbox0 = \hbox{#2\ifx\secnum\empty\else\enspace\fi}%
+    % Only insert the space after the number if we have a section number.
+    \def\sectionlevel{#2}%
+    \def\temptype{#3}%
     %
+    \ifx\temptype\Ynothingkeyword
+      \setbox0 = \hbox{}%
+      \def\toctype{unn}%
+      \gdef\thissection{#1}%
+    \else\ifx\temptype\Yomitfromtockeyword
+      % for @headings -- no section number, don't include in toc,
+      % and don't redefine \thissection.
+      \setbox0 = \hbox{}%
+      \def\toctype{omit}%
+      \let\sectionlevel=\empty
+    \else\ifx\temptype\Yappendixkeyword
+      \setbox0 = \hbox{#4\enspace}%
+      \def\toctype{app}%
+      \gdef\thissection{#1}%
+    \else
+      \setbox0 = \hbox{#4\enspace}%
+      \def\toctype{num}%
+      \gdef\thissection{#1}%
+    \fi\fi\fi
+    %
+    % Write the toc entry (before \donoderef).  See comments in \chfplain.
+    \writetocentry{\toctype\sectionlevel}{#1}{#4}%
+    %
+    % Write the node reference (= pdf destination for pdftex).
+    % Again, see comments in \chfplain.
+    \donoderef{#3}%
+    %
+    % Output the actual section heading.
     \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
-          \hangindent = \wd0 % zero if no section number
-          \unhbox0 #3}%
+          \hangindent=\wd0  % zero if no section number
+          \unhbox0 #1}%
   }%
-  \ifdim\parskip<10pt \nobreak\kern10pt\nobreak\kern-\parskip\fi \nobreak
+  % Add extra space after the heading -- half of whatever came above it.
+  % Don't allow stretch, though.
+  \kern .5 \csname #2headingskip\endcsname
+  %
+  % Do not let the kern be a potential breakpoint, as it would be if it
+  % was followed by glue.
+  \nobreak
+  %
+  % We'll almost certainly start a paragraph next, so don't let that
+  % glue accumulate.  (Not a breakpoint because it's preceded by a
+  % discardable item.)
+  \vskip-\parskip
+  %
+  % This \nobreak is purely so the last item on the list is a \penalty
+  % of 10000.  This is so other code, for instance \parsebodycommon, can
+  % check for and avoid allowing breakpoints.  Otherwise, it would
+  % insert a valid breakpoint between:
+  %   @section sec-whatever
+  %   @deffn def-whatever
+  \nobreak
 }
 
 
-\message{toc printing,}
-% Finish up the main text and prepare to read what we've written
-% to \contentsfile.
+\message{toc,}
+% Table of contents.
+\newwrite\tocfile
+
+% Write an entry to the toc file, opening it if necessary.
+% Called from @chapter, etc.  
+% 
+% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
+% We append the current node name (if any) and page number as additional
+% arguments for the \{chap,sec,...}entry macros which will eventually
+% read this.  The node name is used in the pdf outlines as the
+% destination to jump to.
+% 
+% We open the .toc file for writing here instead of at @setfilename (or
+% any other fixed time) so that @contents can be anywhere in the document.
+% But if #1 is `omit', then we don't do anything.  This is used for the
+% table of contents chapter openings themselves.
+%
+\newif\iftocfileopened
+\def\omitkeyword{omit}%
+%
+\def\writetocentry#1#2#3{%
+  \edef\writetoctype{#1}%
+  \ifx\writetoctype\omitkeyword \else
+    \iftocfileopened\else
+      \immediate\openout\tocfile = \jobname.toc
+      \global\tocfileopenedtrue
+    \fi
+    %
+    \iflinks
+      \toks0 = {#2}%
+      \toks2 = \expandafter{\lastnode}%
+      \edef\temp{\write\tocfile{\realbackslash #1entry{\the\toks0}{#3}%
+                               {\the\toks2}{\noexpand\folio}}}%
+      \temp
+    \fi
+  \fi
+  %
+  % Tell \shipout to create a pdf destination on each page, if we're
+  % writing pdf.  These are used in the table of contents.  We can't
+  % just write one on every page because the title pages are numbered
+  % 1 and 2 (the page numbers aren't printed), and so are the first
+  % two pages of the document.  Thus, we'd have two destinations named
+  % `1', and two named `2'.
+  \ifpdf \global\pdfmakepagedesttrue \fi
+}
 
 \newskip\contentsrightmargin \contentsrightmargin=1in
+\newcount\savepageno
+\newcount\lastnegativepageno \lastnegativepageno = -1
+
+% Prepare to read what we've written to \tocfile.
+%
 \def\startcontents#1{%
-   % If @setchapternewpage on, and @headings double, the contents should
-   % start on an odd page, unlike chapters.  Thus, we maintain
-   % \contentsalignmacro in parallel with \pagealignmacro.
-   % From: Torbjorn Granlund <tege@matematik.su.se>
-   \contentsalignmacro
-   \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.
+  % If @setchapternewpage on, and @headings double, the contents should
+  % start on an odd page, unlike chapters.  Thus, we maintain
+  % \contentsalignmacro in parallel with \pagealignmacro.
+  % From: Torbjorn Granlund <tege@matematik.su.se>
+  \contentsalignmacro
+  \immediate\closeout\tocfile
+  %
+  % Don't need to put `Contents' or `Short Contents' in the headline.
+  % It is abundantly clear what they are.
+  \def\thischapter{}%
+  \chapmacro{#1}{Yomitfromtoc}{}%
+  %
+  \savepageno = \pageno
+  \begingroup                  % Set up to handle contents files properly.
+    \catcode`\\=0  \catcode`\{=1  \catcode`\}=2  \catcode`\@=11
+    % We can't do this, because then an actual ^ in a section
+    % title fails, e.g., @chapter ^ -- exponentiation.  --karl, 9jul97.
+    %\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.
+    %
+    % Roman numerals for page numbers.
+    \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
 }
 
 
 % Normal (long) toc.
-\outer\def\contents{%
-   \startcontents{\putwordTableofContents}%
+\def\contents{%
+  \startcontents{\putwordTOC}%
+    \openin 1 \jobname.toc
+    \ifeof 1 \else
       \input \jobname.toc
-   \endgroup
-   \vfill \eject
+    \fi
+    \vfill \eject
+    \contentsalignmacro % in case @setchapternewpage odd is in effect
+    \ifeof 1 \else
+      \pdfmakeoutlines
+    \fi
+    \closein 1
+  \endgroup
+  \lastnegativepageno = \pageno
+  \global\pageno = \savepageno
 }
 
 % 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
-      \hyphenpenalty = 10000
-      \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{}
+\def\summarycontents{%
+  \startcontents{\putwordShortTOC}%
+    %
+    \let\numchapentry = \shortchapentry
+    \let\appentry = \shortchapentry
+    \let\unnchapentry = \shortunnchapentry
+    % We want a true roman here for the page numbers.
+    \secfonts
+    \let\rm=\shortcontrm \let\bf=\shortcontbf
+    \let\sl=\shortcontsl \let\tt=\shortconttt
+    \rm
+    \hyphenpenalty = 10000
+    \advance\baselineskip by 1pt % Open it up a little.
+    \def\numsecentry##1##2##3##4{}
+    \let\appsecentry = \numsecentry
+    \let\unnsecentry = \numsecentry
+    \let\numsubsecentry = \numsecentry
+    \let\appsubsecentry = \numsecentry
+    \let\unnsubsecentry = \numsecentry
+    \let\numsubsubsecentry = \numsecentry
+    \let\appsubsubsecentry = \numsecentry
+    \let\unnsubsubsecentry = \numsecentry
+    \openin 1 \jobname.toc
+    \ifeof 1 \else
       \input \jobname.toc
-   \endgroup
-   \vfill \eject
+    \fi
+    \closein 1
+    \vfill \eject
+    \contentsalignmacro % in case @setchapternewpage odd is in effect
+  \endgroup
+  \lastnegativepageno = \pageno
+  \global\pageno = \savepageno
 }
 \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
-
+% The arg is, e.g., `A' for an appendix, or `3' for a chapter.
+%
 \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
+  % This space should be enough, since a single number is .5em, and the
   % widest letter (M) is 1em, at least in the Computer Modern fonts.
+  % But use \hss just in case.
   % (This space doesn't include the extra space that gets added after
   % the label; that gets put in by \shortchapentry above.)
-  \advance\dimen0 by 1.1em
-  \hbox to \dimen0{#1\hfil}%
+  % 
+  % We'd like to right-justify chapter numbers, but that looks strange
+  % with appendix letters.  And right-justifying numbers and
+  % left-justifying letters looks strange when there is less than 10
+  % chapters.  Have to read the whole toc once to know how many chapters
+  % there are before deciding ...
+  \hbox to 1em{#1\hss}%
+}
+
+% 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, ...
+
+% Chapters, in the main contents.
+\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}
+%
+% Chapters, in the short toc.
+% See comments in \dochapentry re vbox and related settings.
+\def\shortchapentry#1#2#3#4{%
+  \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%
 }
 
-\def\unnumbchapentry#1#2{\dochapentry{#1}{#2}}
-\def\shortunnumberedentry#1#2{\tocentry{#1}{\doshortpageno{#2}}}
+% Appendices, in the main contents.
+% Need the word Appendix, and a fixed-size box.
+% 
+\def\appendixbox#1{%
+  % We use M since it's probably the widest letter.
+  \setbox0 = \hbox{\putwordAppendix{} M}%
+  \hbox to \wd0{\putwordAppendix{} #1\hss}}
+%
+\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}}
+
+% Unnumbered chapters.
+\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}}
+\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}}
 
 % Sections.
-\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}}
-\def\unnumbsecentry#1#2{\dosecentry{#1}{#2}}
+\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}
+\let\appsecentry=\numsecentry
+\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}}
 
 % Subsections.
-\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}}
-\def\unnumbsubsecentry#1#2{\dosubsecentry{#1}{#2}}
+\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsecentry=\numsubsecentry
+\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
 
 % 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}}
+\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsubsecentry=\numsubsubsecentry
+\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
 
 % This parameter controls the indentation of the various levels.
-\newdimen\tocindent \tocindent = 3pc
+% Same as \defaultparindent.
+\newdimen\tocindent \tocindent = 15pt
 
 % Now for the actual typesetting. In all these, #1 is the text and #2 is the
 % page number.
@@ -3309,36 +4551,28 @@
    \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
    \begingroup
      \chapentryfonts
-     \tocentry{#1}{\dopageno{#2}}%
+     \tocentry{#1}{\dopageno\bgroup#2\egroup}%
    \endgroup
    \nobreak\vskip .25\baselineskip plus.1\baselineskip
 }
 
 \def\dosecentry#1#2{\begingroup
   \secentryfonts \leftskip=\tocindent
-  \tocentry{#1}{\dopageno{#2}}%
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
 \endgroup}
 
 \def\dosubsecentry#1#2{\begingroup
   \subsecentryfonts \leftskip=2\tocindent
-  \tocentry{#1}{\dopageno{#2}}%
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
 \endgroup}
 
 \def\dosubsubsecentry#1#2{\begingroup
   \subsubsecentryfonts \leftskip=3\tocindent
-  \tocentry{#1}{\dopageno{#2}}%
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
 \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.)
-%
-% \turnoffactive is for the sake of @" used for umlauts.
-\def\tocentry#1#2{\begingroup
-  \vskip 0pt plus1pt % allow a little stretch for the sake of nice page breaks
-  \entry{\turnoffactive #1}{\turnoffactive #2}%
-\endgroup}
+% We use the same \entry macro as for the index entries.
+\let\tocentry = \entry
 
 % Space between chapter (or whatever) number and the title.
 \def\labelspace{\hskip1em \relax}
@@ -3348,90 +4582,90 @@
 
 \def\chapentryfonts{\secfonts \rm}
 \def\secentryfonts{\textfonts}
-\let\subsecentryfonts = \textfonts
-\let\subsubsecentryfonts = \textfonts
+\def\subsecentryfonts{\textfonts}
+\def\subsubsecentryfonts{\textfonts}
 
 
 \message{environments,}
+% @foo ... @end foo.
 
+% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
+%
 % 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
-
-%{\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}
-%}
-
-% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
+%
 \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}}
 
+% The @error{} command.
 % Adapted from the TeXbook's \boxit.
+%
+\newbox\errorbox
+%
 {\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
+%
+\setbox\errorbox=\hbox to \dimen0{\hfil
    \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
    \advance\hsize by -2\dimen2 % Rules.
-   \vbox{
+   \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 % plus
-\catcode`\"=12
-\catcode`\==12
-\catcode`\|=12
-\catcode`\<=12
-\catcode`\>=12
-\escapechar=`\\
-%
-\let\,=\ptexcomma
-\let\{=\ptexlbrace
-\let\}=\ptexrbrace
-\let\.=\ptexdot
-\let\*=\ptexstar
-\let\dots=\ptexdots
-\def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
-\def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
-\def\@{@}%
-\let\bullet=\ptexbullet
-\let\b=\ptexb \let\c=\ptexc \let\i=\ptexi \let\t=\ptext
-%
-\let\Etex=\endgroup}
-
-% Define @lisp ... @endlisp.
-% @lisp does a \begingroup so it can rebind things,
-% including the definition of @endlisp (which normally is erroneous).
+\envdef\tex{%
+  \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
+  \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
+  \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
+  \catcode `\%=14
+  \catcode `\+=\other
+  \catcode `\"=\other
+  \catcode `\|=\other
+  \catcode `\<=\other
+  \catcode `\>=\other
+  \escapechar=`\\
+  %
+  \let\b=\ptexb
+  \let\bullet=\ptexbullet
+  \let\c=\ptexc
+  \let\,=\ptexcomma
+  \let\.=\ptexdot
+  \let\dots=\ptexdots
+  \let\equiv=\ptexequiv
+  \let\!=\ptexexclam
+  \let\i=\ptexi
+  \let\indent=\ptexindent
+  \let\noindent=\ptexnoindent
+  \let\{=\ptexlbrace
+  \let\+=\tabalign
+  \let\}=\ptexrbrace
+  \let\/=\ptexslash
+  \let\*=\ptexstar
+  \let\t=\ptext
+  %
+  \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
+  \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
+  \def\@{@}%
+}
+% There is no need to define \Etex.
+
+% Define @lisp ... @end lisp.
+% @lisp environment forms a group so it can rebind things,
+% including the definition of @end lisp (which normally is erroneous).
 
 % Amount to narrow the margins by for @lisp.
 \newskip\lispnarrowing \lispnarrowing=0.4in
@@ -3441,38 +4675,36 @@
 % 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
+% start of the next paragraph will insert \parskip.
 %
-\def\aboveenvbreak{{\advance\envskipamount by \parskip
-\endgraf \ifdim\lastskip<\envskipamount
-\removelastskip \penalty-50 \vskip\envskipamount \fi}}
+\def\aboveenvbreak{{%
+  % =10000 instead of <10000 because of a special case in \itemzzz, q.v.
+  \ifnum \lastpenalty=10000 \else
+    \advance\envskipamount by \parskip
+    \endgraf
+    \ifdim\lastskip<\envskipamount
+      \removelastskip
+      % it's not a good place to break if the last penalty was \nobreak
+      % or better ...
+      \ifnum\lastpenalty<10000 \penalty-50 \fi
+      \vskip\envskipamount
+    \fi
+  \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
+% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
+% environment contents.
 \font\circle=lcircle10
 \newdimen\circthick
 \newdimen\cartouter\newdimen\cartinner
@@ -3492,54 +4724,54 @@
 %
 \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
+\envdef\cartouche{%
+  \ifhmode\par\fi  % can't be in the midst of a paragraph.
+  \startsavinginserts
+  \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 18.4pt	% allow for 3pt kerns on either
+				% side, and for 6pt waste from
+				% each corner char, and rule thickness
+  \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
+	      \kern3pt
+	      \hsize=\cartinner
+	      \baselineskip=\normbskip
+	      \lineskip=\normlskip
+	      \parskip=\normpskip
+	      \vskip -\parskip
+	      \comment % For explanation, see the end of \def\group.
+}
 \def\Ecartouche{%
-                                \endgroup
-                                \kern3pt
-                        \egroup
-                        \kern3pt\vrule
-                        \hskip\rskip
-                \egroup
-                \cartbot
-        \egroup
-\endgroup
-}}
+              \ifhmode\par\fi
+	      \kern3pt
+	  \egroup
+	  \kern3pt\vrule
+	  \hskip\rskip
+      \egroup
+      \cartbot
+  \egroup
+  \checkinserts
+}
 
 
 % 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
@@ -3550,95 +4782,99 @@
   \ifx\nonarrowing\relax
     \advance \leftskip by \lispnarrowing
     \exdentamount=\lispnarrowing
-    \let\exdent=\nofillexdent
-    \let\nonarrowing=\relax
   \fi
+  \let\exdent=\nofillexdent
 }
 
-% 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}%
+% If you want all examples etc. small: @set dispenvsize small.
+% If you want even small examples the full size: @set dispenvsize nosmall.
+% This affects the following displayed environments:
+%    @example, @display, @format, @lisp
+%
+\def\smallword{small}
+\def\nosmallword{nosmall}
+\let\SETdispenvsize\relax
+\def\setnormaldispenv{%
+  \ifx\SETdispenvsize\smallword
+    \smallexamplefonts \rm
+  \fi
+}
+\def\setsmalldispenv{%
+  \ifx\SETdispenvsize\nosmallword
+  \else
+    \smallexamplefonts \rm
+  \fi
+}
 
-% This macro is
-\def\lisp{\begingroup
-  \nonfillstart
-  \let\Elisp = \nonfillfinish
-  \tt
-  \rawbackslash % have \ input char produce \ char from current font
-  \gobble
+% We often define two environments, @foo and @smallfoo.
+% Let's do it by one command:
+\def\makedispenv #1#2{
+  \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}
+  \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}
+  \expandafter\let\csname E#1\endcsname \afterenvbreak
+  \expandafter\let\csname Esmall#1\endcsname \afterenvbreak
 }
 
-% Define the \E... control sequence only if we are inside the
-% environment, so the error checking in \end will work.
+% Define two synonyms:
+\def\maketwodispenvs #1#2#3{
+  \makedispenv{#1}{#3}
+  \makedispenv{#2}{#3}
+}
+
+% @lisp: indented, narrowed, typewriter font; @example: same as @lisp.
 %
-% We must call \lisp last in the definition, since it reads the
-% return following the @example (or whatever) command.
+% @smallexample and @smalllisp: use smaller fonts.
+% Originally contributed by Pavel@xerox.
 %
-\def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp}
-\def\smallexample{\begingroup \def\Esmallexample{\nonfillfinish\endgroup}\lisp}
-\def\smalllisp{\begingroup \def\Esmalllisp{\nonfillfinish\endgroup}\lisp}
+\maketwodispenvs {lisp}{example}{%
+  \nonfillstart
+  \tt
+  \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
+  \gobble       % eat return
+}
 
-% @smallexample and @smalllisp.  This is not used unless the @smallbook
-% command is given.  Originally contributed by Pavel@xerox.
+% @display/@smalldisplay: same as @lisp except keep current font.
 %
-\def\smalllispx{\begingroup
+\makedispenv {display}{%
   \nonfillstart
-  \let\Esmalllisp = \nonfillfinish
-  \let\Esmallexample = \nonfillfinish
-  %
-  % Smaller fonts for small examples.
-  \indexfonts \tt
-  \rawbackslash % make \ output the \ character from the current font (tt)
   \gobble
 }
 
-% This is @display; same as @lisp except use roman font.
+% @format/@smallformat: same as @display except don't narrow margins.
 %
-\def\display{\begingroup
+\makedispenv{format}{%
+  \let\nonarrowing = t%
   \nonfillstart
-  \let\Edisplay = \nonfillfinish
   \gobble
 }
 
-% This is @format; same as @display except don't narrow margins.
-%
-\def\format{\begingroup
-  \let\nonarrowing = t
+% @flushleft: same as @format, but doesn't obey \SETdispenvsize.
+\envdef\flushleft{%
+  \let\nonarrowing = t%
   \nonfillstart
-  \let\Eformat = \nonfillfinish
   \gobble
 }
+\let\Eflushleft = \afterenvbreak
 
-% @flushleft (same as @format) and @flushright.
+% @flushright.
 %
-\def\flushleft{\begingroup
-  \let\nonarrowing = t
+\envdef\flushright{%
+  \let\nonarrowing = t%
   \nonfillstart
-  \let\Eflushleft = \nonfillfinish
+  \advance\leftskip by 0pt plus 1fill
   \gobble
 }
-\def\flushright{\begingroup
-  \let\nonarrowing = t
-  \nonfillstart
-  \let\Eflushright = \nonfillfinish
-  \advance\leftskip by 0pt plus 1fill
-  \gobble}
+\let\Eflushright = \afterenvbreak
+
 
 % @quotation does normal linebreaking (hence we can't use \nonfillstart)
-% and narrows the margins.
+% and narrows the margins.  We keep \parskip nonzero in general, since
+% we're doing normal filling.  So, when using \aboveenvbreak and
+% \afterenvbreak, temporarily make \parskip 0.
 %
-\def\quotation{%
-  \begingroup\inENV %This group ends at the end of the @quotation body
+\envdef\quotation{%
   {\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
@@ -3647,693 +4883,1192 @@
     \exdentamount = \lispnarrowing
     \let\nonarrowing = \relax
   \fi
+  \parsearg\quotationlabel
 }
 
-\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 = )
+% We have retained a nonzero parskip for the environment, since we're
+% doing normal filling.
+% 
+\def\Equotation{%
+  \par
+  \ifx\quotationauthor\undefined\else
+    % indent a bit.
+    \leftline{\kern 2\leftskip \sl ---\quotationauthor}%
+  \fi
+  {\parskip=0pt \afterenvbreak}%
+}
 
-{\activeparens % Now, smart parens don't turn on until &foo (see \amprm)
+% If we're given an argument, typeset it in bold with a colon after.
+\def\quotationlabel#1{%
+  \def\temp{#1}%
+  \ifx\temp\empty \else
+    {\bf #1: }%
+  \fi
+}
 
-% 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}
-% This is used to turn on special parens
-% but make & act ordinary (given that it's active).
-\gdef\boldbraxnoamp{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb\let&=\ampnr}
-
-% 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
-}
+% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
+% If we want to allow any <char> as delimiter,
+% we need the curly braces so that makeinfo sees the @verb command, eg:
+% `@verbx...x' would look like the '@verbx' command.  --janneke@gnu.org
+%
+% [Knuth]: Donald Ervin Knuth, 1996.  The TeXbook.
+%
+% [Knuth] p.344; only we need to do the other characters Texinfo sets
+% active too.  Otherwise, they get lost as the first character on a
+% verbatim line.
+\def\dospecials{%
+  \do\ \do\\\do\{\do\}\do\$\do\&%
+  \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
+  \do\<\do\>\do\|\do\@\do+\do\"%
+}
+%
+% [Knuth] p. 380
+\def\uncatcodespecials{%
+  \def\do##1{\catcode`##1=\other}\dospecials}
+%
+% [Knuth] pp. 380,381,391
+% Disable Spanish ligatures ?` and !` of \tt font
+\begingroup
+  \catcode`\`=\active\gdef`{\relax\lq}
+\endgroup
 %
-% This is the definition of ( when already inside a level of parens.
-\gdef\opnested{\char`\(\global\advance\parencount by 1 }
+% Setup for the @verb command.
 %
-\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\ }
+% Eight spaces for a tab
+\begingroup
+  \catcode`\^^I=\active
+  \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
+\endgroup
 %
-\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`\(}\global\advance\parencount by 1 }
-\def\clnr{{\sf\char`\)}\global\advance\parencount by -1 }
-\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}}%
+\def\setupverb{%
+  \tt  % easiest (and conventionally used) font for verbatim
+  \def\par{\leavevmode\endgraf}%
+  \catcode`\`=\active
+  \tabeightspaces
+  % Respect line breaks,
+  % print special symbols as themselves, and
+  % make each space count
+  % must do in this order:
+  \obeylines \uncatcodespecials \sepspaces
 }
 
-% 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
+% Setup for the @verbatim environment
 %
-% 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.
+% Real tab expansion
+\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
 %
-\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.
+\def\starttabbox{\setbox0=\hbox\bgroup}
+\begingroup
+  \catcode`\^^I=\active
+  \gdef\tabexpand{%
+    \catcode`\^^I=\active
+    \def^^I{\leavevmode\egroup
+      \dimen0=\wd0 % the width so far, or since the previous tab
+      \divide\dimen0 by\tabw
+      \multiply\dimen0 by\tabw % compute previous multiple of \tabw
+      \advance\dimen0 by\tabw  % advance to next multiple of \tabw
+      \wd0=\dimen0 \box0 \starttabbox
+    }%
+  }
+\endgroup
+\def\setupverbatim{%
+  \nonfillstart
+  \advance\leftskip by -\defbodyindent
+  % Easiest (and conventionally used) font for verbatim
+  \tt
+  \def\par{\leavevmode\egroup\box0\endgraf}%
+  \catcode`\`=\active
+  \tabexpand
+  % Respect line breaks,
+  % print special symbols as themselves, and
+  % make each space count
+  % must do in this order:
+  \obeylines \uncatcodespecials \sepspaces
+  \everypar{\starttabbox}%
+}
+
+% Do the @verb magic: verbatim text is quoted by unique
+% delimiter characters.  Before first delimiter expect a
+% right brace, after last delimiter expect closing brace:
 %
-\def\removeemptybraces\empty#1\relax{#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\doverb'{'<char>#1<char>'}'{#1}
 %
-\def\parsetpheaderline#1#2#3{%
-  #1{\removeemptybraces#2\relax}{#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 parentheses in @def}\fi%
-\interlinepenalty=10000
-\advance\rightskip by 0pt plus 1fil
-\endgraf\penalty 10000\vskip -\parskip\penalty 10000%
+% [Knuth] p. 382; only eat outer {}
+\begingroup
+  \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other
+  \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
+\endgroup
+%
+\def\verb{\begingroup\setupverb\doverb}
+%
+%
+% Do the @verbatim magic: define the macro \doverbatim so that
+% the (first) argument ends when '@end verbatim' is reached, ie:
+%
+%     \def\doverbatim#1@end verbatim{#1}
+%
+% For Texinfo it's a lot easier than for LaTeX,
+% because texinfo's \verbatim doesn't stop at '\end{verbatim}':
+% we need not redefine '\', '{' and '}'.
+%
+% Inspired by LaTeX's verbatim command set [latex.ltx]
+%
+\begingroup
+  \catcode`\ =\active
+  \obeylines %
+  % ignore everything up to the first ^^M, that's the newline at the end
+  % of the @verbatim input line itself.  Otherwise we get an extra blank
+  % line in the output.
+  \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}%
+  % We really want {...\end verbatim} in the body of the macro, but
+  % without the active space; thus we have to use \xdef and \gobble.
+\endgroup
+%
+\envdef\verbatim{%
+    \setupverbatim\doverbatim
 }
+\let\Everbatim = \afterenvbreak
+
 
-\def\deftypefunargs #1{%
-% Expand, preventing hyphenation at `-' chars.
-% Note that groups don't affect changes in \hyphenchar.
-% Use \boldbraxnoamp, not \functionparens, so that & is not special.
-\boldbraxnoamp
-\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%
+% @verbatiminclude FILE - insert text of file in verbatim environment.
+%
+\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude}
+%
+\def\doverbatiminclude#1{%
+  {%
+    \makevalueexpandable
+    \setupverbatim
+    \input #1
+    \afterenvbreak
+  }%
 }
 
-% Do complete processing of one @defun or @defunx line already parsed.
+% @copying ... @end copying.
+% Save the text away for @insertcopying later.  Many commands won't be
+% allowed in this context, but that's ok.
+%
+% We save the uninterpreted tokens, rather than creating a box.
+% Saving the text in a box would be much easier, but then all the
+% typesetting commands (@smallbook, font changes, etc.) have to be done
+% beforehand -- and a) we want @copying to be done first in the source
+% file; b) letting users define the frontmatter in as flexible order as
+% possible is very desirable.
+%
+\def\copying{\begingroup
+  % Define a command to swallow text until we reach `@end copying'.
+  % \ is the escape char in this texinfo.tex file, so it is the
+  % delimiter for the command; @ will be the escape char when we read
+  % it, but that doesn't matter.
+  \long\def\docopying##1\end copying{\gdef\copyingtext{##1}\enddocopying}%
+  %
+  % We must preserve ^^M's in the input file; see \insertcopying below.
+  \catcode`\^^M = \active
+  \docopying
+}
+
+% What we do to finish off the copying text.
+%
+\def\enddocopying{\endgroup\ignorespaces}
+
+% @insertcopying.  Here we must play games with ^^M's.  On the one hand,
+% we need them to delimit commands such as `@end quotation', so they
+% must be active.  On the other hand, we certainly don't want every
+% end-of-line to be a \par, as would happen with the normal active
+% definition of ^^M.  On the third hand, two ^^M's in a row should still
+% generate a \par.
+%
+% Our approach is to make ^^M insert a space and a penalty1 normally;
+% then it can also check if \lastpenalty=1.  If it does, then manually
+% do \par.
+%
+% This messes up the normal definitions of @c[omment], so we redefine
+% it.  Similarly for @ignore.  (These commands are used in the gcc
+% manual for man page generation.)
+%
+% Seems pretty fragile, most line-oriented commands will presumably
+% fail, but for the limited use of getting the copying text (which
+% should be quite simple) inserted, we can hope it's ok.
+%
+{\catcode`\^^M=\active %
+\gdef\insertcopying{\begingroup %
+  \parindent = 0pt  % looks wrong on title page
+  \def^^M{%
+    \ifnum \lastpenalty=1 %
+      \par %
+    \else %
+      \space \penalty 1 %
+    \fi %
+  }%
+  %
+  % Fix @c[omment] for catcode 13 ^^M's.
+  \def\c##1^^M{\ignorespaces}%
+  \let\comment = \c %
+  %
+  % Don't bother jumping through all the hoops that \doignore does, it
+  % would be very hard since the catcodes are already set.
+  \long\def\ignore##1\end ignore{\ignorespaces}%
+  %
+  \copyingtext %
+\endgroup}%
+}
 
-% @deffn Command forward-char nchars
+\message{defuns,}
+% @defun etc.
 
-\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader}
+\newskip\defbodyindent \defbodyindent=.4in
+\newskip\defargsindent \defargsindent=50pt
+\newskip\deflastargmargin \deflastargmargin=18pt
 
-\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
+% Start the processing of @deffn:
+\def\startdefun{%
+  \ifnum\lastpenalty<10000
+    \medbreak
+  \else
+    % If there are two @def commands in a row, we'll have a \nobreak,
+    % which is there to keep the function description together with its
+    % header.  But if there's nothing but headers, we need to allow a
+    % break somewhere.  Check for penalty 10002 (inserted by
+    % \defargscommonending) instead of 10000, since the sectioning
+    % commands insert a \penalty10000, and we don't want to allow a break
+    % between a section heading and a defun.
+    \ifnum\lastpenalty=10002 \penalty2000 \fi
+    %
+    % Similarly, after a section heading, do not allow a break.
+    % But do insert the glue.
+    \medskip  % preceded by discardable penalty, so not a breakpoint
+  \fi
+  %
+  \parindent=0in
+  \advance\leftskip by \defbodyindent
+  \exdentamount=\defbodyindent
 }
 
-% @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
+\def\dodefunx#1{%
+  % First, check whether we are in the right environment:
+  \checkenv#1%
+  %
+  % As above, allow line break if we have multiple x headers in a row.
+  % It's not a great place, though.
+  \ifnum\lastpenalty=10002 \penalty3000 \fi
+  %
+  % And now, it's time to reuse the body of the original defun:
+  \expandafter\gobbledefun#1%
 }
+\def\gobbledefun#1\startdefun{}
 
-% @deftypefun int foobar (int @var{foo}, float @var{bar})
+% \printdefunline \deffnheader{text}
+%
+\def\printdefunline#1#2{%
+  \begingroup
+    % call \deffnheader:
+    #1#2 \endheader
+    % common ending:
+    \interlinepenalty = 10000
+    \advance\rightskip by 0pt plus 1fil
+    \endgraf
+    \nobreak\vskip -\parskip
+    \penalty 10002  % signal to \startdefun and \dodefunx
+    % Some of the @defun-type tags do not enable magic parentheses,
+    % rendering the following check redundant.  But we don't optimize.
+    \checkparencounts
+  \endgroup
+}
 
-\def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader}
+\def\Edefun{\endgraf\medbreak}
 
-% #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
+% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;
+% the only thing remainnig is to define \deffnheader.
+%
+\def\makedefun#1{%
+  \expandafter\let\csname E#1\endcsname = \Edefun
+  \edef\temp{\noexpand\domakedefun
+    \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%
+  \temp
 }
 
-% @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar})
-
-\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader}
+% \domakedefun \deffn \deffnx \deffnheader
+%
+% Define \deffn and \deffnx, without parameters.
+% \deffnheader has to be defined explicitly.
+%
+\def\domakedefun#1#2#3{%
+  \envdef#1{%
+    \startdefun
+    \parseargusing\activeparens{\printdefunline#3}%
+  }%
+  \def#2{\dodefunx#1}%
+  \def#3%
+}
 
-% \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}
+%%% Untyped functions:
 
-% #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
-}
+% @deffn category name args
+\makedefun{deffn}{\deffngeneral{}}
 
-% @defmac == @deffn Macro
+% @deffn category class name args
+\makedefun{defop}#1 {\defopon{#1\ \putwordon}}
 
-\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader}
+% \defopon {category on}class name args
+\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
 
-\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
+% \deffngeneral {subind}category name args
+%
+\def\deffngeneral#1#2 #3 #4\endheader{%
+  % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}.
+  \dosubind{fn}{\code{#3}}{#1}%
+  \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%
 }
 
-% @defspec == @deffn Special Form
+%%% Typed functions:
 
-\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader}
+% @deftypefn category type name args
+\makedefun{deftypefn}{\deftypefngeneral{}}
 
-\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
-}
+% @deftypeop category class type name args
+\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}}
 
-% This definition is run if you use @defunx
-% anywhere other than immediately after a @defun or @defunx.
+% \deftypeopon {category on}class type name args
+\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
 
-\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\deftypemethodx #1 {\errmessage{@deftypemethodx in invalid context}}
-\def\deftypeunx #1 {\errmessage{@deftypeunx in invalid context}}
+% \deftypefngeneral {subind}category type name args
+%
+\def\deftypefngeneral#1#2 #3 #4 #5\endheader{%
+  \dosubind{fn}{\code{#4}}{#1}%
+  \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
 
-% @defmethod, and so on
+%%% Typed variables:
 
-% @defop {Funny Method} foo-class frobnicate argument
+% @deftypevr category type var args
+\makedefun{deftypevr}{\deftypecvgeneral{}}
 
-\def\defop #1 {\def\defoptype{#1}%
-\defopparsebody\Edefop\defopx\defopheader\defoptype}
+% @deftypecv category class type var args
+\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}}
 
-\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 %
-}
+% \deftypecvof {category of}class type var args
+\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }
 
-% @deftypemethod foo-class return-type foo-method args
-%
-\def\deftypemethod{%
-  \defmethparsebody\Edeftypemethod\deftypemethodx\deftypemethodheader}
+% \deftypecvgeneral {subind}category type var args
 %
-% #1 is the class name, #2 the data type, #3 the method name, #4 the args.
-\def\deftypemethodheader#1#2#3#4{%
-  \deftypefnheaderx{Method on #1}{#2}#3 #4\relax
+\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{%
+  \dosubind{vr}{\code{#4}}{#1}%
+  \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
 }
 
-% @defmethod == @defop Method
+%%% Untyped variables:
 
-\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader}
+% @defvr category var args
+\makedefun{defvr}#1 {\deftypevrheader{#1} {} }
 
-\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
+% @defcv category class var args
+\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}}
 
-\def\defcv #1 {\def\defcvtype{#1}%
-\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}
+% \defcvof {category of}class var args
+\def\defcvof#1#2 {\deftypecvof{#1}#2 {} }
 
-\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 %
+%%% Type:
+% @deftp category name args
+\makedefun{deftp}#1 #2 #3\endheader{%
+  \doind{tp}{\code{#2}}%
+  \defname{#1}{}{#2}\defunargs{#3\unskip}%
 }
 
-% @defivar == @defcv {Instance Variable}
+% Remaining @defun-like shortcuts:
+\makedefun{defun}{\deffnheader{\putwordDeffunc} }
+\makedefun{defmac}{\deffnheader{\putwordDefmac} }
+\makedefun{defspec}{\deffnheader{\putwordDefspec} }
+\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} }
+\makedefun{defvar}{\defvrheader{\putwordDefvar} }
+\makedefun{defopt}{\defvrheader{\putwordDefopt} }
+\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }
+\makedefun{defmethod}{\defopon\putwordMethodon}
+\makedefun{deftypemethod}{\deftypeopon\putwordMethodon}
+\makedefun{defivar}{\defcvof\putwordInstanceVariableof}
+\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof}
 
-\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 %
+% \defname, which formats the name of the @def (not the args).
+% #1 is the category, such as "Function".
+% #2 is the return type, if any.
+% #3 is the function name.
+% 
+% We are followed by (but not passed) the arguments, if any.
+%
+\def\defname#1#2#3{%
+  % Get the values of \leftskip and \rightskip as they were outside the @def...
+  \advance\leftskip by -\defbodyindent
+  %
+  % How we'll format the type name.  Putting it in brackets helps
+  % distinguish it from the body text that may end up on the next line
+  % just below it.
+  \def\temp{#1}%
+  \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}
+  %
+  % Figure out line sizes for the paragraph shape.
+  % The first line needs space for \box0; but if \rightskip is nonzero,
+  % we need only space for the part of \box0 which exceeds it:
+  \dimen0=\hsize  \advance\dimen0 by -\wd0  \advance\dimen0 by \rightskip
+  % The continuations:
+  \dimen2=\hsize  \advance\dimen2 by -\defargsindent
+  % (plain.tex says that \dimen1 should be used only as global.)
+  \parshape 2 0in \dimen0 \defargsindent \dimen2
+  %
+  % Put the type name to the right margin.
+  \noindent
+  \hbox to 0pt{%
+    \hfil\box0 \kern-\hsize
+    % \hsize has to be shortened this way:
+    \kern\leftskip
+    % Intentionally do not respect \rightskip, since we need the space.
+  }%
+  %
+  % Allow all lines to be underfull without complaint:
+  \tolerance=10000 \hbadness=10000
+  \exdentamount=\defbodyindent
+  {%
+    % defun fonts. We use typewriter by default (used to be bold) because:
+    % . we're printing identifiers, they should be in tt in principle.
+    % . in languages with many accents, such as Czech or French, it's
+    %   common to leave accents off identifiers.  The result looks ok in
+    %   tt, but exceedingly strange in rm.
+    % . we don't want -- and --- to be treated as ligatures.
+    % . this still does not fix the ?` and !` ligatures, but so far no
+    %   one has made identifiers using them :).
+    \df \tt
+    \def\temp{#2}% return value type
+    \ifx\temp\empty\else \tclose{\temp} \fi
+    #3% output function name
+  }%
+  {\rm\enskip}% hskip 0.5 em of \tenrm
+  %
+  \boldbrax
+  % arguments will be output next, if any.
 }
 
-% These definitions are run if you use @defmethodx, etc.,
-% anywhere other than immediately after a @defmethod, etc.
+% Print arguments in slanted roman (not ttsl), inconsistently with using
+% tt for the name.  This is because literal text is sometimes needed in
+% the argument list (groff manual), and ttsl and tt are not very
+% distinguishable.  Prevent hyphenation at `-' chars.
+% 
+\def\defunargs#1{%
+  % use sl by default (not ttsl), 
+  % tt for the names.
+  \df \sl \hyphenchar\font=0
+  %
+  % On the other hand, if an argument has two dashes (for instance), we
+  % want a way to get ttsl.  Let's try @var for that.
+  \let\var=\ttslanted
+  #1%
+  \sl\hyphenchar\font=45
+}
 
-\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}}
+% We want ()&[] to print specially on the defun line.
+%
+\def\activeparens{%
+  \catcode`\(=\active \catcode`\)=\active
+  \catcode`\[=\active \catcode`\]=\active
+  \catcode`\&=\active
+}
 
-% Now @defvar
+% Make control sequences which act like normal parenthesis chars.
+\let\lparen = ( \let\rparen = )
 
-% 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}
+% 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.
+{
+  \activeparens
+  \global\let(=\lparen \global\let)=\rparen
+  \global\let[=\lbrack \global\let]=\rbrack
+  \global\let& = \&
 
-% @defvr Counter foo-count
+  \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+  \gdef\magicamp{\let&=\amprm}
+}
 
-\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader}
+\newcount\parencount
 
-\def\defvrheader #1#2#3{\doind {vr}{\code{#2}}%
-\begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup}
+% If we encounter &foo, then turn on ()-hacking afterwards
+\newif\ifampseen
+\def\amprm#1 {\ampseentrue{\bf\&#1 }}
 
-% @defvar == @defvr Variable
+\def\parenfont{%
+  \ifampseen
+    % At the first level, print parens in roman,
+    % otherwise use the default font.
+    \ifnum \parencount=1 \rm \fi
+  \else
+    % The \sf parens (in \boldbrax) actually are a little bolder than
+    % the contained text.  This is especially needed for [ and ] .
+    \sf
+  \fi
+}
+\def\infirstlevel#1{%
+  \ifampseen
+    \ifnum\parencount=1
+      #1%
+    \fi
+  \fi
+}
+\def\bfafterword#1 {#1 \bf}
 
-\def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader}
+\def\opnr{%
+  \global\advance\parencount by 1
+  {\parenfont(}%
+  \infirstlevel \bfafterword
+}
+\def\clnr{%
+  {\parenfont)}%
+  \infirstlevel \sl
+  \global\advance\parencount by -1
+}
 
-\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
-\begingroup\defname {#1}{Variable}%
-\defvarargs {#2}\endgroup %
+\newcount\brackcount
+\def\lbrb{%
+  \global\advance\brackcount by 1
+  {\bf[}%
+}
+\def\rbrb{%
+  {\bf]}%
+  \global\advance\brackcount by -1
 }
 
-% @defopt == @defvr {User Option}
+\def\checkparencounts{%
+  \ifnum\parencount=0 \else \badparencount \fi
+  \ifnum\brackcount=0 \else \badbrackcount \fi
+}
+\def\badparencount{%
+  \errmessage{Unbalanced parentheses in @def}%
+  \global\parencount=0
+}
+\def\badbrackcount{%
+  \errmessage{Unbalanced square braces in @def}%
+  \global\brackcount=0
+}
 
-\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 %
-}
+\message{macros,}
+% @macro.
 
-% @deftypevar int foobar
+% To do this right we need a feature of e-TeX, \scantokens,
+% which we arrange to emulate with a temporary file in ordinary TeX.
+\ifx\eTeXversion\undefined
+  \newwrite\macscribble
+  \def\scantokens#1{%
+    \toks0={#1\endinput}%
+    \immediate\openout\macscribble=\jobname.tmp
+    \immediate\write\macscribble{\the\toks0}%
+    \immediate\closeout\macscribble
+    \input \jobname.tmp
+  }
+\fi
 
-\def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader}
+\def\scanmacro#1{%
+  \begingroup
+    \newlinechar`\^^M
+    \let\xeatspaces\eatspaces
+    % Undo catcode changes of \startcontents and \doprintindex
+    \catcode`\@=0 \catcode`\\=\other \escapechar=`\@
+    % ... and \example
+    \spaceisspace
+    %
+    % Append \endinput to make sure that TeX does not see the ending newline.
+    %
+    % I've verified that it is necessary both for e-TeX and for ordinary TeX
+    %							--kasal, 29nov03
+    \scantokens{#1\endinput}%
+  \endgroup
+}
 
-% #1 is the data type.  #2 is the name, perhaps followed by text that
-% is actually part of the data type, which should not be put into the index.
-\def\deftypevarheader #1#2{%
-\dovarind#2 \relax% Make entry in variables index
-\begingroup\defname {\defheaderxcond#1\relax$$$#2}{Variable}%
-\interlinepenalty=10000
-\endgraf\penalty 10000\vskip -\parskip\penalty 10000
-\endgroup}
-\def\dovarind#1 #2\relax{\doind{vr}{\code{#1}}}
+\newcount\paramno   % Count of parameters
+\newtoks\macname    % Macro name
+\newif\ifrecursive  % Is it recursive?
+\def\macrolist{}    % List of all defined macros in the form
+                    % \do\macro1\do\macro2...
+
+% Utility routines.
+% This does \let #1 = #2, except with \csnames.
+\def\cslet#1#2{%
+\expandafter\expandafter
+\expandafter\let
+\expandafter\expandafter
+\csname#1\endcsname
+\csname#2\endcsname}
 
-% @deftypevr {Global Flag} int enable
+% Trim leading and trailing spaces off a string.
+% Concepts from aro-bend problem 15 (see CTAN).
+{\catcode`\@=11
+\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
+\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
+\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
+\def\unbrace#1{#1}
+\unbrace{\gdef\trim@@@ #1 } #2@{#1}
+}
 
-\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader}
+% Trim a single trailing ^^M off a string.
+{\catcode`\^^M=\other \catcode`\Q=3%
+\gdef\eatcr #1{\eatcra #1Q^^MQ}%
+\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
+\gdef\eatcrb#1Q#2Q{#1}%
+}
 
-\def\deftypevrheader #1#2#3{\dovarind#3 \relax%
-\begingroup\defname {\defheaderxcond#2\relax$$$#3}{#1}
-\interlinepenalty=10000
-\endgraf\penalty 10000\vskip -\parskip\penalty 10000
-\endgroup}
+% Macro bodies are absorbed as an argument in a context where
+% all characters are catcode 10, 11 or 12, except \ which is active
+% (as in normal texinfo). It is necessary to change the definition of \.
 
-% This definition is run if you use @defvarx
-% anywhere other than immediately after a @defvar or @defvarx.
+% It's necessary to have hard CRs when the macro is executed. This is
+% done by  making ^^M (\endlinechar) catcode 12 when reading the macro
+% body, and then making it the \newlinechar in \scanmacro.
 
-\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}}
+\def\macrobodyctxt{%
+  \catcode`\~=\other
+  \catcode`\^=\other
+  \catcode`\_=\other
+  \catcode`\|=\other
+  \catcode`\<=\other
+  \catcode`\>=\other
+  \catcode`\+=\other
+  \catcode`\{=\other
+  \catcode`\}=\other
+  \catcode`\@=\other
+  \catcode`\^^M=\other
+  \usembodybackslash}
 
-% Now define @deftp
-% Args are printed in bold, a slight difference from @defvar.
+\def\macroargctxt{%
+  \catcode`\~=\other
+  \catcode`\^=\other
+  \catcode`\_=\other
+  \catcode`\|=\other
+  \catcode`\<=\other
+  \catcode`\>=\other
+  \catcode`\+=\other
+  \catcode`\@=\other
+  \catcode`\\=\other}
 
-\def\deftpargs #1{\bf \defvarargs{#1}}
+% \mbodybackslash is the definition of \ in @macro bodies.
+% It maps \foo\ => \csname macarg.foo\endcsname => #N
+% where N is the macro parameter number.
+% We define \csname macarg.\endcsname to be \realbackslash, so
+% \\ in macro replacement text gets you a backslash.
+
+{\catcode`@=0 @catcode`@\=@active
+ @gdef@usembodybackslash{@let\=@mbodybackslash}
+ @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
+}
+\expandafter\def\csname macarg.\endcsname{\realbackslash}
+
+\def\macro{\recursivefalse\parsearg\macroxxx}
+\def\rmacro{\recursivetrue\parsearg\macroxxx}
+
+\def\macroxxx#1{%
+  \getargs{#1}%           now \macname is the macname and \argl the arglist
+  \ifx\argl\empty       % no arguments
+     \paramno=0%
+  \else
+     \expandafter\parsemargdef \argl;%
+  \fi
+  \if1\csname ismacro.\the\macname\endcsname
+     \message{Warning: redefining \the\macname}%
+  \else
+     \expandafter\ifx\csname \the\macname\endcsname \relax
+     \else \errmessage{Macro name \the\macname\space already defined}\fi
+     \global\cslet{macsave.\the\macname}{\the\macname}%
+     \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
+     % Add the macroname to \macrolist
+     \toks0 = \expandafter{\macrolist\do}%
+     \xdef\macrolist{\the\toks0
+       \expandafter\noexpand\csname\the\macname\endcsname}%
+  \fi
+  \begingroup \macrobodyctxt
+  \ifrecursive \expandafter\parsermacbody
+  \else \expandafter\parsemacbody
+  \fi}
+
+\parseargdef\unmacro{%
+  \if1\csname ismacro.#1\endcsname
+    \global\cslet{#1}{macsave.#1}%
+    \global\expandafter\let \csname ismacro.#1\endcsname=0%
+    % Remove the macro name from \macrolist:
+    \begingroup
+      \expandafter\let\csname#1\endcsname \relax
+      \let\do\unmacrodo
+      \xdef\macrolist{\macrolist}%
+    \endgroup
+  \else
+    \errmessage{Macro #1 not defined}%
+  \fi
+}
 
-% @deftp Class window height width ...
+% Called by \do from \dounmacro on each macro.  The idea is to omit any
+% macro definitions that have been changed to \relax.
+%
+\def\unmacrodo#1{%
+  \ifx#1\relax
+    % remove this
+  \else
+    \noexpand\do \noexpand #1%
+  \fi
+}
 
-\def\deftp{\deftpparsebody\Edeftp\deftpx\deftpheader}
+% This makes use of the obscure feature that if the last token of a
+% <parameter list> is #, then the preceding argument is delimited by
+% an opening brace, and that opening brace is not consumed.
+\def\getargs#1{\getargsxxx#1{}}
+\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
+\def\getmacname #1 #2\relax{\macname={#1}}
+\def\getmacargs#1{\def\argl{#1}}
+
+% Parse the optional {params} list.  Set up \paramno and \paramlist
+% so \defmacro knows what to do.  Define \macarg.blah for each blah
+% in the params list, to be ##N where N is the position in that list.
+% That gets used by \mbodybackslash (above).
+
+% We need to get `macro parameter char #' into several definitions.
+% The technique used is stolen from LaTeX:  let \hash be something
+% unexpandable, insert that wherever you need a #, and then redefine
+% it to # just before using the token list produced.
+%
+% The same technique is used to protect \eatspaces till just before
+% the macro is used.
+
+\def\parsemargdef#1;{\paramno=0\def\paramlist{}%
+        \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,}
+\def\parsemargdefxxx#1,{%
+  \if#1;\let\next=\relax
+  \else \let\next=\parsemargdefxxx
+    \advance\paramno by 1%
+    \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
+        {\xeatspaces{\hash\the\paramno}}%
+    \edef\paramlist{\paramlist\hash\the\paramno,}%
+  \fi\next}
+
+% These two commands read recursive and nonrecursive macro bodies.
+% (They're different since rec and nonrec macros end differently.)
+
+\long\def\parsemacbody#1@end macro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+\long\def\parsermacbody#1@end rmacro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+
+% This defines the macro itself. There are six cases: recursive and
+% nonrecursive macros of zero, one, and many arguments.
+% Much magic with \expandafter here.
+% \xdef is used so that macro definitions will survive the file
+% they're defined in; @include reads the file inside a group.
+\def\defmacro{%
+  \let\hash=##% convert placeholders to macro parameter chars
+  \ifrecursive
+    \ifcase\paramno
+    % 0
+      \expandafter\xdef\csname\the\macname\endcsname{%
+        \noexpand\scanmacro{\temp}}%
+    \or % 1
+      \expandafter\xdef\csname\the\macname\endcsname{%
+         \bgroup\noexpand\macroargctxt
+         \noexpand\braceorline
+         \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+      \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+         \egroup\noexpand\scanmacro{\temp}}%
+    \else % many
+      \expandafter\xdef\csname\the\macname\endcsname{%
+         \bgroup\noexpand\macroargctxt
+         \noexpand\csname\the\macname xx\endcsname}%
+      \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+          \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+      \expandafter\expandafter
+      \expandafter\xdef
+      \expandafter\expandafter
+        \csname\the\macname xxx\endcsname
+          \paramlist{\egroup\noexpand\scanmacro{\temp}}%
+    \fi
+  \else
+    \ifcase\paramno
+    % 0
+      \expandafter\xdef\csname\the\macname\endcsname{%
+        \noexpand\norecurse{\the\macname}%
+        \noexpand\scanmacro{\temp}\egroup}%
+    \or % 1
+      \expandafter\xdef\csname\the\macname\endcsname{%
+         \bgroup\noexpand\macroargctxt
+         \noexpand\braceorline
+         \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+      \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+        \egroup
+        \noexpand\norecurse{\the\macname}%
+        \noexpand\scanmacro{\temp}\egroup}%
+    \else % many
+      \expandafter\xdef\csname\the\macname\endcsname{%
+         \bgroup\noexpand\macroargctxt
+         \expandafter\noexpand\csname\the\macname xx\endcsname}%
+      \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+          \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+      \expandafter\expandafter
+      \expandafter\xdef
+      \expandafter\expandafter
+      \csname\the\macname xxx\endcsname
+      \paramlist{%
+          \egroup
+          \noexpand\norecurse{\the\macname}%
+          \noexpand\scanmacro{\temp}\egroup}%
+    \fi
+  \fi}
 
-\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}%
-\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup}
+\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
 
-% This definition is run if you use @deftpx, etc
-% anywhere other than immediately after a @deftp, etc.
+% \braceorline decides whether the next nonwhitespace character is a
+% {.  If so it reads up to the closing }, if not, it reads the whole
+% line.  Whatever was read is then fed to the next control sequence
+% as an argument (by \parsebrace or \parsearg)
+\def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx}
+\def\braceorlinexxx{%
+  \ifx\nchar\bgroup\else
+    \expandafter\parsearg
+  \fi \next}
+
+% We mant to disable all macros during \shipout so that they are not
+% expanded by \write.
+\def\turnoffmacros{\begingroup \def\do##1{\let\noexpand##1=\relax}%
+  \edef\next{\macrolist}\expandafter\endgroup\next}
+
+
+% @alias.
+% We need some trickery to remove the optional spaces around the equal
+% sign.  Just make them active and then expand them all to nothing.
+\def\alias{\parseargusing\obeyspaces\aliasxxx}
+\def\aliasxxx #1{\aliasyyy#1\relax}
+\def\aliasyyy #1=#2\relax{%
+  {%
+    \expandafter\let\obeyedspace=\empty
+    \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}%
+  }%
+  \next
+}
 
-\def\deftpx #1 {\errmessage{@deftpx in invalid context}}
 
+\message{cross references,}
 
-\message{cross reference,}
-% Define cross-reference macros
-\newwrite \auxfile
+\newwrite\auxfile
 
-\newif\ifhavexrefs  % True if xref values are known.
+\newif\ifhavexrefs    % True if xref values are known.
 \newif\ifwarnedxrefs  % True if we warned once that they aren't known.
 
-% @inforef is simple.
+% @inforef is relatively simple.
 \def\inforef #1{\inforefzzz #1,,,,**}
 \def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
   node \samp{\ignorespaces#1{}}}
 
-% \setref{foo} defines a cross-reference point named foo.
+% @node's only job in TeX is to define \lastnode, which is used in
+% cross-references.  The @node line might or might not have commas, and
+% might or might not have spaces before the first comma, like:
+% @node foo , bar , ...
+% We don't want such trailing spaces in the node name.
+% 
+\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse}
+%
+% also remove a trailing comma, in case of something like this:
+% @node Help-Cross,  ,  , Cross-refs
+\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse}
+\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}}
+
+\let\nwnode=\node
+\let\lastnode=\empty
+
+% Write a cross-reference definition for the current node.  #1 is the
+% type (Ynumbered, Yappendix, Ynothing).
+% 
+\def\donoderef#1{%
+  \ifx\lastnode\empty\else
+    \setref{\lastnode}{#1}%
+    \global\let\lastnode=\empty
+  \fi
+}
+
+% @anchor{NAME} -- define xref target at arbitrary point.
+%
+\newcount\savesfregister
+%
+\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
+\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
+\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
+
+% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
+% anchor), which consists of three parts:
+% 1) NAME-title - the current sectioning name taken from \thissection,
+%                 or the anchor name.
+% 2) NAME-snt   - section number and type, passed as the SNT arg, or
+%                 empty for anchors.
+% 3) NAME-pg    - the page number.
+% 
+% This is called from \donoderef, \anchor, and \dofloat.  In the case of
+% floats, there is an additional part, which is not written here:
+% 4) NAME-lof   - the text as it should appear in a @listoffloats.
+% 
+\def\setref#1#2{%
+  \pdfmkdest{#1}%
+  \iflinks
+    {%
+      \atdummies  % preserve commands, but don't expand them
+      \turnoffactive
+      \otherbackslash
+      \edef\writexrdef##1##2{%
+	\write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef
+	  ##1}{##2}}% these are parameters of \writexrdef
+      }%
+      \toks0 = \expandafter{\thissection}%
+      \immediate \writexrdef{title}{\the\toks0 }%
+      \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
+      \writexrdef{pg}{\folio}% will be written later, during \shipout
+    }%
+  \fi
+}
 
-\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.
+% @xref, @pxref, and @ref generate cross-references.  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
+  \unsepspaces
   \def\printedmanual{\ignorespaces #5}%
-  \def\printednodename{\ignorespaces #3}%
-  \setbox1=\hbox{\printedmanual}%
-  \setbox0=\hbox{\printednodename}%
+  \def\printedrefname{\ignorespaces #3}%
+  \setbox1=\hbox{\printedmanual\unskip}%
+  \setbox0=\hbox{\printedrefname\unskip}%
   \ifdim \wd0 = 0pt
     % No printed node name was explicitly given.
     \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
       % Use the node name inside the square brackets.
-      \def\printednodename{\ignorespaces #1}%
+      \def\printedrefname{\ignorespaces #1}%
     \else
       % Use the actual chapter/section title appear inside
       % the square brackets.  Use the real section title if we have it.
-      \ifdim \wd1>0pt%
+      \ifdim \wd1 > 0pt
         % It is in another manual, so we don't have it.
-        \def\printednodename{\ignorespaces #1}%
+        \def\printedrefname{\ignorespaces #1}%
       \else
         \ifhavexrefs
           % We know the real title if we have the xref values.
-          \def\printednodename{\refx{#1-title}{}}%
+          \def\printedrefname{\refx{#1-title}{}}%
         \else
           % Otherwise just copy the Info node name.
-          \def\printednodename{\ignorespaces #1}%
+          \def\printedrefname{\ignorespaces #1}%
         \fi%
       \fi
     \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}{}%
+  % Make link in pdf output.
+  \ifpdf
+    \leavevmode
+    \getfilename{#4}%
+    {\turnoffactive \otherbackslash
+     \ifnum\filenamelength>0
+       \startlink attr{/Border [0 0 0]}%
+         goto file{\the\filename.pdf} name{#1}%
+     \else
+       \startlink attr{/Border [0 0 0]}%
+         goto name{\pdfmkpgn{#1}}%
+     \fi
+    }%
+    \linkcolor
   \fi
+  %
+  % Float references are printed completely differently: "Figure 1.2"
+  % instead of "[somenode], p.3".  We distinguish them by the
+  % LABEL-title being set to a magic string.
+  {%
+    % Have to otherify everything special to allow the \csname to
+    % include an _ in the xref name, etc.
+    \indexnofonts
+    \turnoffactive
+    \otherbackslash
+    \expandafter\global\expandafter\let\expandafter\Xthisreftitle
+      \csname XR#1-title\endcsname
+  }%
+  \iffloat\Xthisreftitle
+    % If the user specified the print name (third arg) to the ref,
+    % print it instead of our usual "Figure 1.2".
+    \ifdim\wd0 = 0pt
+      \refx{#1-snt}%
+    \else
+      \printedrefname
+    \fi
+    %
+    % if the user also gave the printed manual name (fifth arg), append
+    % "in MANUALNAME". 
+    \ifdim \wd1 > 0pt
+      \space \putwordin{} \cite{\printedmanual}%
+    \fi
+  \else
+    % node/anchor (non-float) references.
+    % 
+    % 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{} ``\printedrefname'' \putwordin{} \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 \otherbackslash
+       % Only output a following space if the -snt ref is nonempty; for
+       % @unnumbered and @anchor, it won't be.
+       \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
+       \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
+      }%
+      % output the `[mynode]' via a macro so it can be overridden.
+      \xrefprintnodename\printedrefname
+      %
+      % But we always want a comma and a space:
+      ,\space
+      %
+      % output the `page 3'.
+      \turnoffactive \otherbackslash \putwordpage\tie\refx{#1-pg}{}%
+    \fi
+  \fi
+  \endlink
 \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
-\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}
+% This macro is called from \xrefX for the `[nodename]' part of xref
+% output.  It's a separate macro only so it can be changed more easily,
+% since square brackets don't work well in some documents.  Particularly
+% one that Bob is working on :).
+%
+\def\xrefprintnodename#1{[#1]}
 
-% 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.
+% Things referred to by \setref.
 %
-\ifx\inputlineno\thisisundefined
-  \let\linenumber = \empty % Non-3.0.
-\else
-  \def\linenumber{\the\inputlineno:\space}
-\fi
+\def\Ynothing{}
+\def\Yomitfromtoc{}
+\def\Ynumbered{%
+  \ifnum\secno=0
+    \putwordChapter@tie \the\chapno
+  \else \ifnum\subsecno=0
+    \putwordSection@tie \the\chapno.\the\secno
+  \else \ifnum\subsubsecno=0
+    \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
+  \else
+    \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
+  \fi\fi\fi
+}
+\def\Yappendix{%
+  \ifnum\secno=0
+     \putwordAppendix@tie @char\the\appendixno{}%
+  \else \ifnum\subsecno=0
+     \putwordSection@tie @char\the\appendixno.\the\secno
+  \else \ifnum\subsubsecno=0
+    \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
+  \else
+    \putwordSection@tie
+      @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
+  \fi\fi\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
+  {%
+    \indexnofonts
+    \otherbackslash
+    \expandafter\global\expandafter\let\expandafter\thisrefX
+      \csname XR#1\endcsname
+  }%
+  \ifx\thisrefX\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.}%
+    \angleleft un\-de\-fined\angleright
+    \iflinks
+      \ifhavexrefs
+        \message{\linenumber Undefined cross reference `#1'.}%
+      \else
+        \ifwarnedxrefs\else
+          \global\warnedxrefstrue
+          \message{Cross reference values unknown; you must run TeX again.}%
+        \fi
       \fi
     \fi
   \else
     % It's defined, so just use it.
-    \csname X#1\endcsname
+    \thisrefX
   \fi
   #2% Output the suffix in any case.
 }
 
-% This is the macro invoked by entries in the aux file.
-\def\xrdef #1#2{{%
-  \catcode`\'=\other
-  \expandafter\gdef\csname X#1\endcsname{#2}%
-}}
+% This is the macro invoked by entries in the aux file.  Usually it's
+% just a \def (we prepend XR to the control sequence name to avoid
+% collisions).  But if this is a float type, we have more work to do.
+%
+\def\xrdef#1#2{%
+  \expandafter\gdef\csname XR#1\endcsname{#2}% remember this xref value.
+  %
+  % Was that xref control sequence that we just defined for a float?
+  \expandafter\iffloat\csname XR#1\endcsname
+    % it was a float, and we have the (safe) float type in \iffloattype.
+    \expandafter\let\expandafter\floatlist
+      \csname floatlist\iffloattype\endcsname
+    % 
+    % Is this the first time we've seen this float type?
+    \expandafter\ifx\floatlist\relax
+      \toks0 = {\do}% yes, so just \do
+    \else
+      % had it before, so preserve previous elements in list.
+      \toks0 = \expandafter{\floatlist\do}%
+    \fi
+    %
+    % Remember this xref in the control sequence \floatlistFLOATTYPE,
+    % for later use in \listoffloats.
+    \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0{#1}}%
+  \fi
+}
 
 % Read the last existing aux file, if any.  No error if none exists.
+% 
+\def\tryauxfile{%
+  \openin 1 \jobname.aux
+  \ifeof 1 \else
+    \readauxfile
+    \global\havexrefstrue
+  \fi
+  \closein 1
+}
+
 \def\readauxfile{\begingroup
   \catcode`\^^@=\other
-  \catcode`\\x01=\other
-  \catcode`\\x02=\other
+  \catcode`\^^A=\other
+  \catcode`\^^B=\other
   \catcode`\^^C=\other
   \catcode`\^^D=\other
   \catcode`\^^E=\other
   \catcode`\^^F=\other
   \catcode`\^^G=\other
   \catcode`\^^H=\other
-  \catcode`\\v=\other
+  \catcode`\^^K=\other
   \catcode`\^^L=\other
-  \catcode`\\x0e=\other
-  \catcode`\\x0f=\other
-  \catcode`\\x10=\other
-  \catcode`\\x11=\other
-  \catcode`\\x12=\other
-  \catcode`\\x13=\other
-  \catcode`\\x14=\other
-  \catcode`\\x15=\other
-  \catcode`\\x16=\other
-  \catcode`\\x17=\other
-  \catcode`\\x18=\other
-  \catcode`\\x19=\other
-  \catcode26=\other
+  \catcode`\^^N=\other
+  \catcode`\^^P=\other
+  \catcode`\^^Q=\other
+  \catcode`\^^R=\other
+  \catcode`\^^S=\other
+  \catcode`\^^T=\other
+  \catcode`\^^U=\other
+  \catcode`\^^V=\other
+  \catcode`\^^W=\other
+  \catcode`\^^X=\other
+  \catcode`\^^Z=\other
   \catcode`\^^[=\other
   \catcode`\^^\=\other
   \catcode`\^^]=\other
   \catcode`\^^^=\other
   \catcode`\^^_=\other
-  \catcode`\@=\other
-  \catcode`\^=\other
-  % It was suggested to define this as 7, which would allow ^^e4 etc.
+  % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
   % in xref tags, i.e., node names.  But since ^^e4 notation isn't
   % supported in the main text, it doesn't seem desirable.  Furthermore,
   % that is not enough: for node names that actually contain a ^
@@ -4346,6 +6081,9 @@
   % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
   % and then to call \auxhat in \setq.
   %
+  \catcode`\^=\other
+  %
+  % Special characters.  Should be turned off anyway, but...
   \catcode`\~=\other
   \catcode`\[=\other
   \catcode`\]=\other
@@ -4357,9 +6095,19 @@
   \catcode`\$=\other
   \catcode`\#=\other
   \catcode`\&=\other
-  % `\+ does not work, so use 43.
-  \catcode43=\other
-  % Make the characters 128-255 be printing characters
+  \catcode`\%=\other
+  \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
+  %
+  % This is to support \ in node names and titles, since the \
+  % characters end up in a \csname.  It's easier than
+  % leaving it active and making its active definition an actual \
+  % character.  What I don't understand is why it works in the *value*
+  % of the xrdef.  Seems like it should be a catcode12 \, and that
+  % should not typeset properly.  But it works, so I'm moving on for
+  % now.  --karl, 15jan04.
+  \catcode`\\=\other
+  %
+  % Make the characters 128-255 be printing characters.
   {%
     \count 1=128
     \def\loop{%
@@ -4368,31 +6116,18 @@
       \ifnum \count 1<256 \loop \fi
     }%
   }%
-  % The aux file uses ' as the escape (for now).
-  % 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.
+  %
+  % @ is our escape character in .aux files, and we need braces.
   \catcode`\{=1
   \catcode`\}=2
-  \catcode`\%=\other
-  \catcode`\'=0
-  \catcode`\\=\other
+  \catcode`\@=0
   %
-  \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
+  \input \jobname.aux
 \endgroup}
 
 
-% Footnotes.
+\message{insertions,}
+% including footnotes.
 
 \newcount \footnoteno
 
@@ -4403,40 +6138,42 @@
 % space to prevent strange expansion errors.)
 \def\supereject{\par\penalty -20000\footnoteno =0 }
 
-% @footnotestyle is meaningful for info output only..
+% @footnotestyle is meaningful for info output only.
 \let\footnotestyle=\comment
 
-\let\ptexfootnote=\footnote
-
 {\catcode `\@=11
 %
 % Auto-number footnotes.  Otherwise like plain.
 \gdef\footnote{%
+  \let\indent=\ptexindent
+  \let\noindent=\ptexnoindent
   \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
+  \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi
   %
   % Remove inadvertent blank space before typesetting the footnote number.
   \unskip
   \thisfootno\@sf
-  \footnotezzz
+  \dofootnote
 }%
 
 % 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.
 %
-% Oh yes, they do; otherwise, @ifset and anything else that uses
-% \parseargline fail inside footnotes because the tokens are fixed when
+% Oh yes, they do; otherwise, @ifset (and anything else that uses
+% \parseargline) fails inside footnotes because the tokens are fixed when
 % the footnote is read.  --karl, 16nov96.
 %
-\long\gdef\footnotezzz{\insert\footins\bgroup
+\gdef\dofootnote{%
+  \insert\footins\bgroup
   % 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.
+  \hsize=\pagewidth
   \interlinepenalty\interfootnotelinepenalty
   \splittopskip\ht\strutbox % top baseline for broken footnotes
   \splitmaxdepth\dp\strutbox
@@ -4447,8 +6184,17 @@
   \xspaceskip\z@skip
   \parindent\defaultparindent
   %
-  % Hang the footnote text off the number.
-  \hang
+  \smallfonts \rm
+  %
+  % Because we use hanging indentation in footnotes, a @noindent appears
+  % to exdent this text, so make it be a no-op.  makeinfo does not use
+  % hanging indentation so @noindent can still be needed within footnote
+  % text after an @example or the like (not that this is good style).
+  \let\noindent = \relax
+  %
+  % Hang the footnote text off the number.  Use \everypar in case the
+  % footnote extends for more than one paragraph.
+  \everypar = {\hang}%
   \textindent{\thisfootno}%
   %
   % Don't crash into the line above the footnote text.  Since this
@@ -4457,97 +6203,428 @@
   \footstrut
   \futurelet\next\fo@t
 }
-\def\fo@t{\ifcat\bgroup\noexpand\next \let\next\f@@t
-  \else\let\next\f@t\fi \next}
-\def\f@@t{\bgroup\aftergroup\@foot\let\next}
-\def\f@t#1{#1\@foot}
-\def\@foot{\strut\egroup}
-
 }%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}
+% In case a @footnote appears in a vbox, save the footnote text and create
+% the real \insert just after the vbox finished.  Otherwise, the insertion
+% would be lost.
+% Similarily, if a @footnote appears inside an alignment, save the footnote
+% text to a box and make the \insert when a row of the table is finished.
+% And the same can be done for other insert classes.  --kasal, 16nov03.
+
+% Replace the \insert primitive by a cheating macro.
+% Deeper inside, just make sure that the saved insertions are not spilled
+% out prematurely.
+%
+\def\startsavinginserts{%
+  \ifx \insert\ptexinsert
+    \let\insert\saveinsert
+  \else
+    \let\checkinserts\relax
+  \fi
+}
+
+% This \insert replacement works for both \insert\footins{foo} and
+% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}.
 %
-\def\setleading#1{%
-  \normalbaselineskip = #1\relax
-  \normallineskip = \lineskipfactor\normalbaselineskip
-  \normalbaselines
-  \setbox\strutbox =\hbox{%
-    \vrule width0pt height\strutheightpercent\baselineskip
-                    depth \strutdepthpercent \baselineskip
-  }%
+\def\saveinsert#1{%
+  \edef\next{\noexpand\savetobox \makeSAVEname#1}%
+  \afterassignment\next
+  % swallow the left brace
+  \let\temp =
 }
+\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}}
+\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1}
 
-% @| 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\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi}
+
+\def\placesaveins#1{%
+  \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname
+    {\box#1}%
+}
+
+% eat @SAVE -- beware, all of them have catcode \other:
+{
+  \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials  %  ;-)
+  \gdef\gobblesave @SAVE{}
+}
+
+% initialization:
+\def\newsaveins #1{%
+  \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}%
+  \next
+}
+\def\newsaveinsX #1{%
+  \csname newbox\endcsname #1%
+  \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts
+    \checksaveins #1}%
+}
+
+% initialize:
+\let\checkinserts\empty
+\newsaveins\footins
+\newsaveins\margin
+
+
+% @image.  We use the macros from epsf.tex to support this.
+% If epsf.tex is not installed and @image is used, we complain.
+%
+% Check for and read epsf.tex up front.  If we read it only at @image
+% time, we might be inside a group, and then its definitions would get
+% undone and the next image would fail.
+\openin 1 = epsf.tex
+\ifeof 1 \else
+  % Do not bother showing banner with epsf.tex v2.7k (available in
+  % doc/epsf.tex and on ctan).
+  \def\epsfannounce{\toks0 = }%
+  \input epsf.tex
+\fi
+\closein 1
 %
-\def\|{%
-  % \vadjust can only be used in horizontal mode.
-  \leavevmode
+% We will only complain once about lack of epsf.tex.
+\newif\ifwarnednoepsf
+\newhelp\noepsfhelp{epsf.tex must be installed for images to
+  work.  It is also included in the Texinfo distribution, or you can get
+  it from ftp://tug.org/tex/epsf.tex.}
+%
+\def\image#1{%
+  \ifx\epsfbox\undefined
+    \ifwarnednoepsf \else
+      \errhelp = \noepsfhelp
+      \errmessage{epsf.tex not found, images will be ignored}%
+      \global\warnednoepsftrue
+    \fi
+  \else
+    \imagexxx #1,,,,,\finish
+  \fi
+}
+%
+% Arguments to @image:
+% #1 is (mandatory) image filename; we tack on .eps extension.
+% #2 is (optional) width, #3 is (optional) height.
+% #4 is (ignored optional) html alt text.
+% #5 is (ignored optional) extension.
+% #6 is just the usual extra ignored arg for parsing this stuff.
+\newif\ifimagevmode
+\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
+  \catcode`\^^M = 5     % in case we're inside an example
+  \normalturnoffactive  % allow _ et al. in names
+  % If the image is by itself, center it.
+  \ifvmode
+    \imagevmodetrue
+    \nobreak\bigskip
+    % Usually we'll have text after the image which will insert
+    % \parskip glue, so insert it here too to equalize the space
+    % above and below.
+    \nobreak\vskip\parskip
+    \nobreak
+    \line\bgroup\hss
+  \fi
   %
-  % 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
+  % Output the image.
+  \ifpdf
+    \dopdfimage{#1}{#2}{#3}%
+  \else
+    % \epsfbox itself resets \epsf?size at each figure.
+    \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
+    \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
+    \epsfbox{#1.eps}%
+  \fi
+  %
+  \ifimagevmode \hss \egroup \bigbreak \fi  % space after the image
+\endgroup}
+
+
+% @float FLOATTYPE,LOC ... @end float for displayed figures, tables, etc.
+% We don't actually implement floating yet, we just plop the float "here".
+% But it seemed the best name for the future.
+% 
+\envparseargdef\float{\dofloat #1,,,\finish}
+
+% #1 is the optional FLOATTYPE, the text label for this float, typically
+% "Figure", "Table", "Example", etc.  Can't contain commas.  If omitted,
+% this float will not be numbered and cannot be referred to.
+% 
+% #2 is the optional xref label.  Also must be present for the float to
+% be referable.
+% 
+% #3 is the optional positioning argument; for now, it is ignored.  It
+% will somehow specify the positions allowed to float to (here, top, bottom).
+% 
+% We keep a separate counter for each FLOATTYPE, which we reset at each
+% chapter-level command.
+\let\resetallfloatnos=\empty
+%
+\def\dofloat#1,#2,#3,#4\finish{%
+  \let\thiscaption=\empty
+  \let\thisshortcaption=\empty
+  %
+  % don't lose footnotes inside @float.
+  \startsavinginserts
+  %
+  % We can't be used inside a paragraph.
+  \par
+  %
+  \vtop\bgroup
+    \def\floattype{#1}%
+    \def\floatlabel{#2}%
+    \def\floatloc{#3}% we do nothing with this yet.
     %
-    % \vadjust-items are inserted at the left edge of the type.  So
-    % the \llap here moves out into the left-hand margin.
-    \llap{%
+    \ifx\floattype\empty
+      \let\safefloattype=\empty
+    \else
+      {%
+        % the floattype might have accents or other special characters,
+        % but we need to use it in a control sequence name.
+        \indexnofonts
+        \turnoffactive
+        \xdef\safefloattype{\floattype}%
+      }%
+    \fi
+    %
+    % If label is given but no type, we handle that as the empty type.
+    \ifx\floatlabel\empty \else
+      % We want each FLOATTYPE to be numbered separately (Figure 1,
+      % Table 1, Figure 2, ...).  (And if no label, no number.)
+      % 
+      \expandafter\getfloatno\csname\safefloattype floatno\endcsname
+      \global\advance\floatno by 1
       %
-      % For a thicker or thinner bar, change the `1pt'.
-      \vrule height\baselineskip width1pt
+      {%
+        % This magic value for \thissection is output by \setref as the
+        % XREFLABEL-title value.  \xrefX uses it to distinguish float
+        % labels (which have a completely different output format) from
+        % node and anchor labels.  And \xrdef uses it to construct the
+        % lists of floats.
+        % 
+        \edef\thissection{\floatmagic=\safefloattype}%
+        \setref{\floatlabel}{Yfloat}%
+      }%
+    \fi
+    %
+    % start with \parskip glue, I guess.
+    \vskip\parskip
+    %
+    % Don't suppress indentation if a float happens to start a section.
+    \restorefirstparagraphindent
+}
+
+% we have these possibilities:
+% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap
+% @float Foo,lbl & no caption:    Foo 1.1
+% @float Foo & @caption{Cap}:     Foo: Cap
+% @float Foo & no caption:        Foo
+% @float ,lbl & Caption{Cap}:     1.1: Cap
+% @float ,lbl & no caption:       1.1
+% @float & @caption{Cap}:         Cap
+% @float & no caption:
+%
+\def\Efloat{%
+    \let\floatident = \empty
+    %
+    % In all cases, if we have a float type, it comes first.
+    \ifx\floattype\empty \else \def\floatident{\floattype}\fi
+    %
+    % If we have an xref label, the number comes next.
+    \ifx\floatlabel\empty \else
+      \ifx\floattype\empty \else % if also had float type, need tie first.
+        \appendtomacro\floatident{\tie}%
+      \fi
+      % the number.
+      \appendtomacro\floatident{\chaplevelprefix\the\floatno}%
+    \fi
+    %
+    % Start the printed caption with what we've constructed in
+    % \floatident, but keep it separate; we need \floatident again.
+    \let\captionline = \floatident
+    %
+    \ifx\thiscaption\empty \else
+      \ifx\floatident\empty \else
+	\appendtomacro\captionline{: }% had ident, so need a colon between
+      \fi
       %
-      % This is the space between the bar and the text.
-      \hskip 12pt
-    }%
-  }%
+      % caption text.
+      \appendtomacro\captionline\thiscaption
+    \fi
+    %
+    % If we have anything to print, print it, with space before.
+    % Eventually this needs to become an \insert.
+    \ifx\captionline\empty \else
+      \vskip.5\parskip
+      \captionline
+    \fi
+    %
+    % If have an xref label, write the list of floats info.  Do this
+    % after the caption, to avoid chance of it being a breakpoint.
+    \ifx\floatlabel\empty \else
+      % Write the text that goes in the lof to the aux file as
+      % \floatlabel-lof.  Besides \floatident, we include the short
+      % caption if specified, else the full caption if specified, else nothing.
+      {%
+        \atdummies \turnoffactive \otherbackslash
+        \immediate\write\auxfile{@xrdef{\floatlabel-lof}{%
+          \floatident
+          \ifx\thisshortcaption\empty
+            \ifx\thiscaption\empty \else : \thiscaption \fi
+          \else
+            : \thisshortcaption
+          \fi
+        }}%
+      }%
+    \fi
+    %
+    % Space below caption, if we printed anything.
+    \ifx\printedsomething\empty \else \vskip\parskip \fi
+  \egroup  % end of \vtop
+  \checkinserts
 }
 
-% 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).
+% Append the tokens #2 to the definition of macro #1, not expanding either.
+% 
+\newtoks\appendtomacroAtoks
+\newtoks\appendtomacroBtoks
+\def\appendtomacro#1#2{%
+  \appendtomacroAtoks = \expandafter{#1}%
+  \appendtomacroBtoks = {#2}%
+  \edef#1{\the\appendtomacroAtoks \the\appendtomacroBtoks}%
+}
+
+% @caption, @shortcaption are easy.
+% 
+\long\def\caption#1{\checkenv\float \def\thiscaption{#1}}
+\def\shortcaption#1{\checkenv\float \def\thisshortcaption{#1}}
+
+% The parameter is the control sequence identifying the counter we are
+% going to use.  Create it if it doesn't exist and assign it to \floatno.
+\def\getfloatno#1{%
+  \ifx#1\relax
+      % Haven't seen this figure type before.
+      \csname newcount\endcsname #1%
+      %
+      % Remember to reset this floatno at the next chap.
+      \expandafter\gdef\expandafter\resetallfloatnos
+        \expandafter{\resetallfloatnos #1=0 }%
+  \fi
+  \let\floatno#1%
+}
+
+% \setref calls this to get the XREFLABEL-snt value.  We want an @xref
+% to the FLOATLABEL to expand to "Figure 3.1".  We call \setref when we
+% first read the @float command.
+% 
+\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}%
+
+% Magic string used for the XREFLABEL-title value, so \xrefX can
+% distinguish floats from other xref types.
+\def\floatmagic{!!float!!}
+
+% #1 is the control sequence we are passed; we expand into a conditional
+% which is true if #1 represents a float ref.  That is, the magic
+% \thissection value which we \setref above.
+% 
+\def\iffloat#1{\expandafter\doiffloat#1==\finish}
 %
-\def\finalout{\overfullrule=0pt}
+% #1 is (maybe) the \floatmagic string.  If so, #2 will be the
+% (safe) float type for this float.  We set \iffloattype to #2.
+% 
+\def\doiffloat#1=#2=#3\finish{%
+  \def\temp{#1}%
+  \def\iffloattype{#2}%
+  \ifx\temp\floatmagic
+}
 
+% @listoffloats FLOATTYPE - print a list of floats like a table of contents.
+% 
+\parseargdef\listoffloats{%
+  \def\floattype{#1}% floattype
+  {%
+    % the floattype might have accents or other special characters,
+    % but we need to use it in a control sequence name.
+    \indexnofonts
+    \turnoffactive
+    \xdef\safefloattype{\floattype}%
+  }%
+  %
+  % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE.
+  \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax
+    \ifhavexrefs
+      % if the user said @listoffloats foo but never @float foo.
+      \message{\linenumber No `\safefloattype' floats to list.}%
+    \fi
+  \else
+    \begingroup
+      \leftskip=\tocindent  % indent these entries like a toc
+      \let\do=\listoffloatsdo
+      \csname floatlist\safefloattype\endcsname
+    \endgroup
+  \fi
+}
 
-% End of control word definitions.
+% This is called on each entry in a list of floats.  We're passed the
+% xref label, in the form LABEL-title, which is how we save it in the
+% aux file.  We strip off the -title and look up \XRLABEL-lof, which
+% has the text we're supposed to typeset here.
+% 
+% Figures without xref labels will not be included in the list (since
+% they won't appear in the aux file).
+% 
+\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish}
+\def\listoffloatsdoentry#1-title\finish{{%
+  % Can't fully expand XR#1-lof because it can contain anything.  Just
+  % pass the control sequence.  On the other hand, XR#1-pg is just the
+  % page number, and we want to fully expand that so we can get a link
+  % in pdf output.
+  \toksA = \expandafter{\csname XR#1-lof\endcsname}%
+  %
+  % use the same \entry macro we use to generate the TOC and index.
+  \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}%
+  \writeentry
+}}
 
-\message{and turning on texinfo input format.}
+\message{localization,}
+% and i18n.
 
-\def\openindices{%
-   \newindex{cp}%
-   \newcodeindex{fn}%
-   \newcodeindex{vr}%
-   \newcodeindex{tp}%
-   \newcodeindex{ky}%
-   \newcodeindex{pg}%
+% @documentlanguage is usually given very early, just after
+% @setfilename.  If done too late, it may not override everything
+% properly.  Single argument is the language abbreviation.
+% It would be nice if we could set up a hyphenation file here.
+%
+\parseargdef\documentlanguage{%
+  \tex % read txi-??.tex file in plain TeX.
+    % Read the file if it exists.
+    \openin 1 txi-#1.tex
+    \ifeof 1
+      \errhelp = \nolanghelp
+      \errmessage{Cannot read language file txi-#1.tex}%
+    \else
+      \input txi-#1.tex
+    \fi
+    \closein 1
+  \endgroup
 }
+\newhelp\nolanghelp{The given language definition file cannot be found or
+is empty.  Maybe you need to install it?  In the current directory
+should work if nowhere else does.}
+
+
+% @documentencoding should change something in TeX eventually, most
+% likely, but for now just recognize it.
+\let\documentencoding = \comment
 
-% Set some numeric style parameters, for 8.5 x 11 format.
 
-\hsize = 6in
-\hoffset = .25in
+% Page size parameters.
+%
 \newdimen\defaultparindent \defaultparindent = 15pt
-\parindent = \defaultparindent
-\parskip 3pt plus 2pt minus 1pt
-\setleading{13.2pt}
-\advance\topskip by 1.2cm
 
 \chapheadingskip = 15pt plus 4pt minus 2pt
 \secheadingskip = 12pt plus 3pt minus 2pt
 \subsecheadingskip = 9pt plus 2pt minus 2pt
 
 % Prevent underfull vbox error messages.
-\vbadness=10000
+\vbadness = 10000
+
+% Don't be so finicky about underfull hboxes, either.
+\hbadness = 2000
 
 % Following George Bush, just get rid of widows and orphans.
 \widowpenalty=10000
@@ -4556,101 +6633,181 @@
 % 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.
+% \hsize.  We call this whenever the paper size is set.
 %
-\ifx\emergencystretch\thisisundefined
-  % Allow us to assign to \emergencystretch anyway.
-  \def\emergencystretch{\dimen0}%
-\else
-  \emergencystretch = \hsize
-  \divide\emergencystretch by 45
-\fi
+\def\setemergencystretch{%
+  \ifx\emergencystretch\thisisundefined
+    % Allow us to assign to \emergencystretch anyway.
+    \def\emergencystretch{\dimen0}%
+  \else
+    \emergencystretch = .15\hsize
+  \fi
+}
 
-% Use @smallbook to reset parameters for 7x9.5 format  (or else 7x9.25)
-\def\smallbook{
-  \global\chapheadingskip = 15pt plus 4pt minus 2pt
-  \global\secheadingskip = 12pt plus 3pt minus 2pt
-  \global\subsecheadingskip = 9pt plus 2pt minus 2pt
-  %
-  \global\lispnarrowing = 0.3in
-  \setleading{12pt}
-  \advance\topskip by -1cm
-  \global\parskip 2pt 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}
+% Parameters in order: 1) textheight; 2) textwidth; 3) voffset;
+% 4) hoffset; 5) binding offset; 6) topskip; 7) physical page height; 8)
+% physical page width.
+%
+% We also call \setleading{\textleading}, so the caller should define
+% \textleading.  The caller should also set \parskip.
+%
+\def\internalpagesizes#1#2#3#4#5#6#7#8{%
+  \voffset = #3\relax
+  \topskip = #6\relax
+  \splittopskip = \topskip
+  %
+  \vsize = #1\relax
+  \advance\vsize by \topskip
+  \outervsize = \vsize
+  \advance\outervsize by 2\topandbottommargin
+  \pageheight = \vsize
+  %
+  \hsize = #2\relax
+  \outerhsize = \hsize
+  \advance\outerhsize by 0.5in
+  \pagewidth = \hsize
+  %
+  \normaloffset = #4\relax
+  \bindingoffset = #5\relax
+  %
+  \ifpdf
+    \pdfpageheight #7\relax
+    \pdfpagewidth #8\relax
+  \fi
+  %
+  \setleading{\textleading}
+  %
+  \parindent = \defaultparindent
+  \setemergencystretch
 }
 
+% @letterpaper (the default).
+\def\letterpaper{{\globaldefs = 1
+  \parskip = 3pt plus 2pt minus 1pt
+  \textleading = 13.2pt
+  %
+  % If page is nothing but text, make it come out even.
+  \internalpagesizes{46\baselineskip}{6in}%
+                    {\voffset}{.25in}%
+                    {\bindingoffset}{36pt}%
+                    {11in}{8.5in}%
+}}
+
+% Use @smallbook to reset parameters for 7x9.5 (or so) format.
+\def\smallbook{{\globaldefs = 1
+  \parskip = 2pt plus 1pt
+  \textleading = 12pt
+  %
+  \internalpagesizes{7.5in}{5in}%
+                    {\voffset}{.25in}%
+                    {\bindingoffset}{16pt}%
+                    {9.25in}{7in}%
+  %
+  \lispnarrowing = 0.3in
+  \tolerance = 700
+  \hfuzz = 1pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = .5cm
+}}
+
 % 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
-}
-
-\bindingoffset=0pt
-\normaloffset=\hoffset
-\pagewidth=\hsize
-\pageheight=\vsize
-
-% Allow control of the text dimensions.  Parameters in order: textheight;
-% textwidth; voffset; hoffset; binding offset; topskip.
-% All require a dimension;
-% header is additional; added length extends the bottom of the page.
-
-\def\changepagesizes#1#2#3#4#5#6{
- \global\vsize= #1
- \global\topskip= #6
- \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}
-
-% A specific text layout, 24x15cm overall, intended for A4 paper.  Top margin
-% 29mm, hence bottom margin 28mm, nominal side margin 3cm.
-\def\afourlatex
-        {\global\tolerance=700
-        \global\hfuzz=1pt
-        \setleading{12pt}
-        \global\parskip 15pt plus 1pt
-        \advance\baselineskip by 1.6pt
-        \changepagesizes{237mm}{150mm}{3.6mm}{3.6mm}{3mm}{7mm}
-        }
-
-% Use @afourwide to print on European A4 paper in wide format.
-\def\afourwide{\afourpaper
-\changepagesizes{9.5in}{6.5in}{\hoffset}{\normaloffset}{\bindingoffset}{7mm}}
+\def\afourpaper{{\globaldefs = 1
+  \parskip = 3pt plus 2pt minus 1pt
+  \textleading = 13.2pt
+  %
+  % Double-side printing via postscript on Laserjet 4050
+  % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
+  % To change the settings for a different printer or situation, adjust
+  % \normaloffset until the front-side and back-side texts align.  Then
+  % do the same for \bindingoffset.  You can set these for testing in
+  % your texinfo source file like this:
+  % @tex
+  % \global\normaloffset = -6mm
+  % \global\bindingoffset = 10mm
+  % @end tex
+  \internalpagesizes{51\baselineskip}{160mm}
+                    {\voffset}{\hoffset}%
+                    {\bindingoffset}{44pt}%
+                    {297mm}{210mm}%
+  %
+  \tolerance = 700
+  \hfuzz = 1pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = 5mm
+}}
+
+% Use @afivepaper to print on European A5 paper.
+% From romildo@urano.iceb.ufop.br, 2 July 2000.
+% He also recommends making @example and @lisp be small.
+\def\afivepaper{{\globaldefs = 1
+  \parskip = 2pt plus 1pt minus 0.1pt
+  \textleading = 12.5pt
+  %
+  \internalpagesizes{160mm}{120mm}%
+                    {\voffset}{\hoffset}%
+                    {\bindingoffset}{8pt}%
+                    {210mm}{148mm}%
+  %
+  \lispnarrowing = 0.2in
+  \tolerance = 800
+  \hfuzz = 1.2pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = 2mm
+  \tableindent = 12mm
+}}
+
+% A specific text layout, 24x15cm overall, intended for A4 paper.
+\def\afourlatex{{\globaldefs = 1
+  \afourpaper
+  \internalpagesizes{237mm}{150mm}%
+                    {\voffset}{4.6mm}%
+                    {\bindingoffset}{7mm}%
+                    {297mm}{210mm}%
+  %
+  % Must explicitly reset to 0 because we call \afourpaper.
+  \globaldefs = 0
+}}
+
+% Use @afourwide to print on A4 paper in landscape format.
+\def\afourwide{{\globaldefs = 1
+  \afourpaper
+  \internalpagesizes{241mm}{165mm}%
+                    {\voffset}{-2.95mm}%
+                    {\bindingoffset}{7mm}%
+                    {297mm}{210mm}%
+  \globaldefs = 0
+}}
+
+% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
+% Perhaps we should allow setting the margins, \topskip, \parskip,
+% and/or leading, also. Or perhaps we should compute them somehow.
+%
+\parseargdef\pagesizes{\pagesizesyyy #1,,\finish}
+\def\pagesizesyyy#1,#2,#3\finish{{%
+  \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
+  \globaldefs = 1
+  %
+  \parskip = 3pt plus 2pt minus 1pt
+  \setleading{\textleading}%
+  %
+  \dimen0 = #1
+  \advance\dimen0 by \voffset
+  %
+  \dimen2 = \hsize
+  \advance\dimen2 by \normaloffset
+  %
+  \internalpagesizes{#1}{\hsize}%
+                    {\voffset}{\normaloffset}%
+                    {\bindingoffset}{44pt}%
+                    {\dimen0}{\dimen2}%
+}}
+
+% Set default to letter.
+%
+\letterpaper
+
+
+\message{and turning on texinfo input format.}
 
 % Define macros to output various characters with catcode for normal text.
 \catcode`\"=\other
@@ -4661,6 +6818,7 @@
 \catcode`\<=\other
 \catcode`\>=\other
 \catcode`\+=\other
+\catcode`\$=\other
 \def\normaldoublequote{"}
 \def\normaltilde{~}
 \def\normalcaret{^}
@@ -4669,9 +6827,10 @@
 \def\normalless{<}
 \def\normalgreater{>}
 \def\normalplus{+}
+\def\normaldollar{$}%$ font-lock fix
 
-% 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,
+% This macro is used to make a character print one way in \tt
+% (where it can probably be output as-is), 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
@@ -4679,7 +6838,13 @@
 % 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}
+\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
+
+% Same as above, but check for italic font.  Actually this also catches
+% non-italic slanted fonts since it is impossible to distinguish them from
+% italic fonts.  But since this is only used by $ and it uses \sl anyway
+% this is not a problem.
+\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
 
 % Turn off all special characters except @
 % (and those which the user can use as if they were ordinary).
@@ -4687,10 +6852,10 @@
 % use math or other variants that look better in normal text.
 
 \catcode`\"=\active
-\def\activedoublequote{{\tt \char '042}}
+\def\activedoublequote{{\tt\char34}}
 \let"=\activedoublequote
 \catcode`\~=\active
-\def~{{\tt \char '176}}
+\def~{{\tt\char126}}
 \chardef\hat=`\^
 \catcode`\^=\active
 \def^{{\tt \hat}}
@@ -4698,10 +6863,10 @@
 \catcode`\_=\active
 \def_{\ifusingtt\normalunderscore\_}
 % Subroutine for the previous macro.
-\def\_{\leavevmode \kern.06em \vbox{\hrule width.3em height.1ex}}
+\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
 
 \catcode`\|=\active
-\def|{{\tt \char '174}}
+\def|{{\tt\char124}}
 \chardef \less=`\<
 \catcode`\<=\active
 \def<{{\tt \less}}
@@ -4710,15 +6875,8 @@
 \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`+=\active
-\catcode`\_=\active
+\catcode`\$=\active
+\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
 
 % If a .fmt file is being used, characters that might appear in a file
 % name cannot be active until we have parsed the command line.
@@ -4728,45 +6886,48 @@
 
 \catcode`\@=0
 
-% \rawbackslashxx output one backslash character in current font
-\global\chardef\rawbackslashxx=`\\
-%{\catcode`\\=\other
-%@gdef@rawbackslashxx{\}}
-
-% \rawbackslash redefines \ as input to do \rawbackslashxx.
+% \backslashcurfont outputs one backslash character in current font,
+% as in \char`\\.
+\global\chardef\backslashcurfont=`\\
+\global\let\rawbackslashxx=\backslashcurfont  % let existing .??s files work
+
+% \rawbackslash defines an active \ to do \backslashcurfont.
+% \otherbackslash defines an active \ to be a literal `\' character with
+% catcode other.
 {\catcode`\\=\active
-@gdef@rawbackslash{@let\=@rawbackslashxx }}
+ @gdef@rawbackslash{@let\=@backslashcurfont}
+ @gdef@otherbackslash{@let\=@realbackslash}
+}
 
-% \normalbackslash outputs one backslash in fixed width font.
-\def\normalbackslash{{\tt\rawbackslashxx}}
+% \realbackslash is an actual character `\' with catcode other.
+{\catcode`\\=\other @gdef@realbackslash{\}}
 
-% Say @foo, not \foo, in error messages.
-\escapechar=`\@
+% \normalbackslash outputs one backslash in fixed width font.
+\def\normalbackslash{{\tt\backslashcurfont}}
 
-% \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}
+@def@turnoffactive{%
+  @let"=@normaldoublequote
+  @let\=@realbackslash
+  @let~=@normaltilde
+  @let^=@normalcaret
+  @let_=@normalunderscore
+  @let|=@normalverticalbar
+  @let<=@normalless
+  @let>=@normalgreater
+  @let+=@normalplus
+  @let$=@normaldollar %$ font-lock fix
+  @unsepspaces
+}
+
+% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
+% the literal character `\'.  (Thus, \ is not expandable when this is in
+% effect.)
+%
+@def@normalturnoffactive{@turnoffactive @let\=@normalbackslash}
 
 % Make _ and + \other characters, temporarily.
 % This is canceled by @fixbackslash.
@@ -4785,16 +6946,31 @@
 % Also back turn on active characters that might appear in the input
 % file name, in case not using a pre-dumped format.
 %
-@gdef@fixbackslash{@ifx\@eatinput @let\ = @normalbackslash @fi
-  @catcode`+=@active @catcode`@_=@active}
+@gdef@fixbackslash{%
+  @ifx\@eatinput @let\ = @normalbackslash @fi
+  @catcode`+=@active
+  @catcode`@_=@active
+}
+
+% Say @foo, not \foo, in error messages.
+@escapechar = `@@
 
-%% 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
+% These look ok in all fonts, so just make them not special.
+@catcode`@& = @other
+@catcode`@# = @other
+@catcode`@% = @other
 
-@textfonts
-@rm
 
 @c Local variables:
+@c eval: (add-hook 'write-file-hooks 'time-stamp)
 @c page-delimiter: "^\\\\message"
+@c time-stamp-start: "def\\\\texinfoversion{"
+@c time-stamp-format: "%:y-%02m-%02d.%02H"
+@c time-stamp-end: "}"
 @c End:
+
+@c vim:sw=2:
+
+@ignore
+   arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115
+@end ignore

[-- Attachment #1.2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]

[-- Attachment #2: Type: text/plain, Size: 140 bytes --]

_______________________________________________
Help-gnats mailing list
Help-gnats@gnu.org
http://lists.gnu.org/mailman/listinfo/help-gnats

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2005-02-24 18:42 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-02-23  5:39 [PATCH] Removing gnats/man and config/* Chad Walstrom
2005-02-24 11:17 ` Mike M. Volokhov
2005-02-24 18:10   ` Chad Walstrom
2005-02-24 18:42     ` Mark D. Baushke

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).