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

* Re: [PATCH] Removing gnats/man and config/*
  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
  0 siblings, 1 reply; 4+ messages in thread
From: Mike M. Volokhov @ 2005-02-24 11:17 UTC (permalink / raw)
  To: help-gnats

[-- Attachment #1: Type: text/plain, Size: 1977 bytes --]

On Tue, 22 Feb 2005 23:15:19 -0600
Chad Walstrom <chewie@wookimus.net> wrote:

> 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. ;-)

Greetings!

I found some troubles when configuring GNATS:

$ patch -E -p1 < config-man-cleanup.diff
$ patch < gnats-wo-libiberty.diff
$ vi autoconf.ac
... some fixups in autoconf.ac (removing libiberty) ...
$ find . -name '*.orig' | xargs rm
$ autoconf -V | head -1
autoconf (GNU Autoconf) 2.59
$ autoconf -f
$ cd doc && autoconf -f && cd ..
$ cd gnats && autoconf -f && cd ..
$ cd send-pr && autoconf -f && cd ..
$ ./configure --prefix=/usr/home/mishka/gnats
....  some normal configure's stuff ....
configure: configuring in gnats
configure: running /bin/sh './configure' --prefix=/usr/home/mishka/gnats  '--prefix=/usr/home/mishka/gnats' --cache-file=/dev/null --srcdir=.
configure: error: cannot find install-sh or install.sh in . ./.. ./../..
configure: error: /bin/sh './configure' failed for gnats

This happens after moving install-sh and missing to config subdirectory.
I'm not autotools guru and just have added AC_CONFIG_AUX_DIR(../config)
to configure.{ac,in} of doc, gnats, and send-pr subdirectories to solve
this problem.

Installation also broken. At Makefile.in we have:

	INSTALL = $(srcdir)/../install-sh -c
	INSTALL_PROGRAM = @INSTALL_PROGRAM@

After configure @INSTALL_PROGRAM@ will be replaced by ${INSTALL} (at
least on my system) and thus have incorrect path.

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

Hey men, I forgot to include ansidecl.h into my latest patch! Just copy
it from include direcory, or use a new patch (attached):

	cp include/ansidecl.h gnats

All the rest seems works fine.

--
Mishka. 

[-- Attachment #2: gnats-wo-libiberty-20050224.diff.gz --]
[-- Type: application/octet-stream, Size: 24137 bytes --]

[-- Attachment #3: 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

* Re: [PATCH] Removing gnats/man and config/*
  2005-02-24 11:17 ` Mike M. Volokhov
@ 2005-02-24 18:10   ` Chad Walstrom
  2005-02-24 18:42     ` Mark D. Baushke
  0 siblings, 1 reply; 4+ messages in thread
From: Chad Walstrom @ 2005-02-24 18:10 UTC (permalink / raw)
  To: help-gnats


[-- Attachment #1.1: Type: text/plain, Size: 1935 bytes --]

Mike M. Volokhov wrote:
> I found some troubles when configuring GNATS:

DOH.  I'll break up the patch into its functional units.

I'll do the file and directory removals (config/* and gnats/man)
directly -- there really isn't a reason to post those patches since the
content removal hasn't broken anything in my testing.  I'll do this this
afternoon.

> This happens after moving install-sh and missing to config
> subdirectory.  I'm not autotools guru and just have added
> AC_CONFIG_AUX_DIR(../config) to configure.{ac,in} of doc, gnats, and
> send-pr subdirectories to solve this problem.

Let's spend some time unifying the configure.ac files into one at the
root gnats directory.  That way we won't run into this problem again.
I'll withhold the AC_CONFIG_AUX_DIR change until this is complete.
Maybe it's time to commit to automake as well.

I've been reading up on the libtool stuff, which doesn't seem to have
the AUX directory configurations, it dumps everything into the root
directory.  I'll do some more digging into this.
autoconf+automake+libtool may be powerful, but it certainly has its
learning curve.

> Installation also broken. At Makefile.in we have:
> 
> 	INSTALL = $(srcdir)/../install-sh -c
> 	INSTALL_PROGRAM = @INSTALL_PROGRAM@
> 
> After configure @INSTALL_PROGRAM@ will be replaced by ${INSTALL} (at
> least on my system) and thus have incorrect path.

Shouldn't that be $(INSTALL), not ${INSTALL}?  Anyway, I'll take a look
at that, too.

> > Next, time to test Mike's patch.  If I hear no objections, I'll commit
> > the patch later tomorrow.
> 
> Hey men, I forgot to include ansidecl.h into my latest patch! Just copy
> it from include direcory, or use a new patch (attached):
> 
> 	cp include/ansidecl.h gnats

Will do.

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

[-- 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

* Re: [PATCH] Removing gnats/man and config/*
  2005-02-24 18:10   ` Chad Walstrom
@ 2005-02-24 18:42     ` Mark D. Baushke
  0 siblings, 0 replies; 4+ messages in thread
From: Mark D. Baushke @ 2005-02-24 18:42 UTC (permalink / raw)
  To: help-gnats

Chad Walstrom <chewie@wookimus.net> writes:

> > After configure @INSTALL_PROGRAM@ will be replaced by ${INSTALL} (at
> > least on my system) and thus have incorrect path.
> 
> Shouldn't that be $(INSTALL), not ${INSTALL}?  Anyway, I'll take a look
> at that, too.

The dereferencing syntax should not matter.

Both $(variable) and ${variable} are valid references to the variable
foo in GNU make, Berkeley make, SunOS make, SGI make, nmake and pmake.

	-- Mark


_______________________________________________
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).