Initial revision
authortomo <tomo>
Wed, 10 May 2000 03:32:01 +0000 (03:32 +0000)
committertomo <tomo>
Wed, 10 May 2000 03:32:01 +0000 (03:32 +0000)
16 files changed:
info/lispref.info-45 [new file with mode: 0644]
info/lispref.info-46 [new file with mode: 0644]
info/xemacs.info-22 [new file with mode: 0644]
lib-src/make-dump-id.c [new file with mode: 0644]
man/lispref/gutter.texi [new file with mode: 0644]
man/lispref/postgresql.texi [new file with mode: 0644]
nt/config.inc.samp [new file with mode: 0644]
nt/xemacs.dsp [new file with mode: 0644]
nt/xemacs.dsw [new file with mode: 0644]
src/alloc.h [new file with mode: 0644]
src/dump-id.h [new file with mode: 0644]
src/dumper.c [new file with mode: 0644]
src/dumper.h [new file with mode: 0644]
src/postgresql.c [new file with mode: 0644]
src/postgresql.h [new file with mode: 0644]
tests/automated/c-tests.el [new file with mode: 0644]

diff --git a/info/lispref.info-45 b/info/lispref.info-45
new file mode 100644 (file)
index 0000000..f6e4355
--- /dev/null
@@ -0,0 +1,1316 @@
+This is ../info/lispref.info, produced by makeinfo version 4.0 from
+lispref/lispref.texi.
+
+INFO-DIR-SECTION XEmacs Editor
+START-INFO-DIR-ENTRY
+* Lispref: (lispref).          XEmacs Lisp Reference Manual.
+END-INFO-DIR-ENTRY
+
+   Edition History:
+
+   GNU Emacs Lisp Reference Manual Second Edition (v2.01), May 1993 GNU
+Emacs Lisp Reference Manual Further Revised (v2.02), August 1993 Lucid
+Emacs Lisp Reference Manual (for 19.10) First Edition, March 1994
+XEmacs Lisp Programmer's Manual (for 19.12) Second Edition, April 1995
+GNU Emacs Lisp Reference Manual v2.4, June 1995 XEmacs Lisp
+Programmer's Manual (for 19.13) Third Edition, July 1995 XEmacs Lisp
+Reference Manual (for 19.14 and 20.0) v3.1, March 1996 XEmacs Lisp
+Reference Manual (for 19.15 and 20.1, 20.2, 20.3) v3.2, April, May,
+November 1997 XEmacs Lisp Reference Manual (for 21.0) v3.3, April 1998
+
+   Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995 Free Software
+Foundation, Inc.  Copyright (C) 1994, 1995 Sun Microsystems, Inc.
+Copyright (C) 1995, 1996 Ben Wing.
+
+   Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+   Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided that the
+entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+
+   Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that this permission notice may be stated in a
+translation approved by the Foundation.
+
+   Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided also
+that the section entitled "GNU General Public License" is included
+exactly as in the original, and provided that the entire resulting
+derived work is distributed under the terms of a permission notice
+identical to this one.
+
+   Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that the section entitled "GNU General Public License"
+may be included in a translation approved by the Free Software
+Foundation instead of in the original English.
+
+\1f
+File: lispref.info,  Node: Pure Storage,  Next: Garbage Collection,  Prev: Building XEmacs,  Up: Building XEmacs and Object Allocation
+
+Pure Storage
+============
+
+   XEmacs Lisp uses two kinds of storage for user-created Lisp objects:
+"normal storage" and "pure storage".  Normal storage is where all the
+new data created during an XEmacs session is kept; see the following
+section for information on normal storage.  Pure storage is used for
+certain data in the preloaded standard Lisp files--data that should
+never change during actual use of XEmacs.
+
+   Pure storage is allocated only while `temacs' is loading the
+standard preloaded Lisp libraries.  In the file `xemacs', it is marked
+as read-only (on operating systems that permit this), so that the
+memory space can be shared by all the XEmacs jobs running on the machine
+at once.  Pure storage is not expandable; a fixed amount is allocated
+when XEmacs is compiled, and if that is not sufficient for the preloaded
+libraries, `temacs' aborts with an error message.  If that happens, you
+must increase the compilation parameter `PURESIZE' using the
+`--puresize' option to `configure'.  This normally won't happen unless
+you try to preload additional libraries or add features to the standard
+ones.
+
+ - Function: purecopy object
+     This function makes a copy of OBJECT in pure storage and returns
+     it.  It copies strings by simply making a new string with the same
+     characters in pure storage.  It recursively copies the contents of
+     vectors and cons cells.  It does not make copies of other objects
+     such as symbols, but just returns them unchanged.  It signals an
+     error if asked to copy markers.
+
+     This function is a no-op except while XEmacs is being built and
+     dumped; it is usually called only in the file
+     `xemacs/lisp/prim/loaddefs.el', but a few packages call it just in
+     case you decide to preload them.
+
+ - Variable: pure-bytes-used
+     The value of this variable is the number of bytes of pure storage
+     allocated so far.  Typically, in a dumped XEmacs, this number is
+     very close to the total amount of pure storage available--if it
+     were not, we would preallocate less.
+
+ - Variable: purify-flag
+     This variable determines whether `defun' should make a copy of the
+     function definition in pure storage.  If it is non-`nil', then the
+     function definition is copied into pure storage.
+
+     This flag is `t' while loading all of the basic functions for
+     building XEmacs initially (allowing those functions to be sharable
+     and non-collectible).  Dumping XEmacs as an executable always
+     writes `nil' in this variable, regardless of the value it actually
+     has before and after dumping.
+
+     You should not change this flag in a running XEmacs.
+
+\1f
+File: lispref.info,  Node: Garbage Collection,  Prev: Pure Storage,  Up: Building XEmacs and Object Allocation
+
+Garbage Collection
+==================
+
+   When a program creates a list or the user defines a new function
+(such as by loading a library), that data is placed in normal storage.
+If normal storage runs low, then XEmacs asks the operating system to
+allocate more memory in blocks of 2k bytes.  Each block is used for one
+type of Lisp object, so symbols, cons cells, markers, etc., are
+segregated in distinct blocks in memory.  (Vectors, long strings,
+buffers and certain other editing types, which are fairly large, are
+allocated in individual blocks, one per object, while small strings are
+packed into blocks of 8k bytes. [More correctly, a string is allocated
+in two sections: a fixed size chunk containing the length, list of
+extents, etc.; and a chunk containing the actual characters in the
+string.  It is this latter chunk that is either allocated individually
+or packed into 8k blocks.  The fixed size chunk is packed into 2k
+blocks, as for conses, markers, etc.])
+
+   It is quite common to use some storage for a while, then release it
+by (for example) killing a buffer or deleting the last pointer to an
+object.  XEmacs provides a "garbage collector" to reclaim this
+abandoned storage.  (This name is traditional, but "garbage recycler"
+might be a more intuitive metaphor for this facility.)
+
+   The garbage collector operates by finding and marking all Lisp
+objects that are still accessible to Lisp programs.  To begin with, it
+assumes all the symbols, their values and associated function
+definitions, and any data presently on the stack, are accessible.  Any
+objects that can be reached indirectly through other accessible objects
+are also accessible.
+
+   When marking is finished, all objects still unmarked are garbage.  No
+matter what the Lisp program or the user does, it is impossible to refer
+to them, since there is no longer a way to reach them.  Their space
+might as well be reused, since no one will miss them.  The second
+("sweep") phase of the garbage collector arranges to reuse them.
+
+   The sweep phase puts unused cons cells onto a "free list" for future
+allocation; likewise for symbols, markers, extents, events, floats,
+compiled-function objects, and the fixed-size portion of strings.  It
+compacts the accessible small string-chars chunks so they occupy fewer
+8k blocks; then it frees the other 8k blocks.  Vectors, buffers,
+windows, and other large objects are individually allocated and freed
+using `malloc' and `free'.
+
+     Common Lisp note: unlike other Lisps, XEmacs Lisp does not call
+     the garbage collector when the free list is empty.  Instead, it
+     simply requests the operating system to allocate more storage, and
+     processing continues until `gc-cons-threshold' bytes have been
+     used.
+
+     This means that you can make sure that the garbage collector will
+     not run during a certain portion of a Lisp program by calling the
+     garbage collector explicitly just before it (provided that portion
+     of the program does not use so much space as to force a second
+     garbage collection).
+
+ - Command: garbage-collect
+     This command runs a garbage collection, and returns information on
+     the amount of space in use.  (Garbage collection can also occur
+     spontaneously if you use more than `gc-cons-threshold' bytes of
+     Lisp data since the previous garbage collection.)
+
+     `garbage-collect' returns a list containing the following
+     information:
+
+          ((USED-CONSES . FREE-CONSES)
+           (USED-SYMS . FREE-SYMS)
+           (USED-MARKERS . FREE-MARKERS)
+           USED-STRING-CHARS
+           USED-VECTOR-SLOTS
+           (PLIST))
+          
+          => ((73362 . 8325) (13718 . 164)
+          (5089 . 5098) 949121 118677
+          (conses-used 73362 conses-free 8329 cons-storage 658168
+          symbols-used 13718 symbols-free 164 symbol-storage 335216
+          bit-vectors-used 0 bit-vectors-total-length 0
+          bit-vector-storage 0 vectors-used 7882
+          vectors-total-length 118677 vector-storage 537764
+          compiled-functions-used 1336 compiled-functions-free 37
+          compiled-function-storage 44440 short-strings-used 28829
+          long-strings-used 2 strings-free 7722
+          short-strings-total-length 916657 short-string-storage 1179648
+          long-strings-total-length 32464 string-header-storage 441504
+          floats-used 3 floats-free 43 float-storage 2044 markers-used 5089
+          markers-free 5098 marker-storage 245280 events-used 103
+          events-free 835 event-storage 110656 extents-used 10519
+          extents-free 2718 extent-storage 372736
+          extent-auxiliarys-used 111 extent-auxiliarys-freed 3
+          extent-auxiliary-storage 4440 window-configurations-used 39
+          window-configurations-on-free-list 5
+          window-configurations-freed 10 window-configuration-storage 9492
+          popup-datas-used 3 popup-data-storage 72 toolbar-buttons-used 62
+          toolbar-button-storage 4960 toolbar-datas-used 12
+          toolbar-data-storage 240 symbol-value-buffer-locals-used 182
+          symbol-value-buffer-local-storage 5824
+          symbol-value-lisp-magics-used 22
+          symbol-value-lisp-magic-storage 1496
+          symbol-value-varaliases-used 43
+          symbol-value-varalias-storage 1032 opaque-lists-used 2
+          opaque-list-storage 48 color-instances-used 12
+          color-instance-storage 288 font-instances-used 5
+          font-instance-storage 180 opaques-used 11 opaque-storage 312
+          range-tables-used 1 range-table-storage 16 faces-used 34
+          face-storage 2584 glyphs-used 124 glyph-storage 4464
+          specifiers-used 775 specifier-storage 43869 weak-lists-used 786
+          weak-list-storage 18864 char-tables-used 40
+          char-table-storage 41920 buffers-used 25 buffer-storage 7000
+          extent-infos-used 457 extent-infos-freed 73
+          extent-info-storage 9140 keymaps-used 275 keymap-storage 12100
+          consoles-used 4 console-storage 384 command-builders-used 2
+          command-builder-storage 120 devices-used 2 device-storage 344
+          frames-used 3 frame-storage 624 image-instances-used 47
+          image-instance-storage 3008 windows-used 27 windows-freed 2
+          window-storage 9180 lcrecord-lists-used 15
+          lcrecord-list-storage 360 hash-tables-used 631
+          hash-table-storage 25240 streams-used 1 streams-on-free-list 3
+          streams-freed 12 stream-storage 91))
+
+     Here is a table explaining each element:
+
+    USED-CONSES
+          The number of cons cells in use.
+
+    FREE-CONSES
+          The number of cons cells for which space has been obtained
+          from the operating system, but that are not currently being
+          used.
+
+    USED-SYMS
+          The number of symbols in use.
+
+    FREE-SYMS
+          The number of symbols for which space has been obtained from
+          the operating system, but that are not currently being used.
+
+    USED-MARKERS
+          The number of markers in use.
+
+    FREE-MARKERS
+          The number of markers for which space has been obtained from
+          the operating system, but that are not currently being used.
+
+    USED-STRING-CHARS
+          The total size of all strings, in characters.
+
+    USED-VECTOR-SLOTS
+          The total number of elements of existing vectors.
+
+    PLIST
+          A list of alternating keyword/value pairs providing more
+          detailed information. (As you can see above, quite a lot of
+          information is provided.)
+
+ - User Option: gc-cons-threshold
+     The value of this variable is the number of bytes of storage that
+     must be allocated for Lisp objects after one garbage collection in
+     order to trigger another garbage collection.  A cons cell counts
+     as eight bytes, a string as one byte per character plus a few
+     bytes of overhead, and so on; space allocated to the contents of
+     buffers does not count.  Note that the subsequent garbage
+     collection does not happen immediately when the threshold is
+     exhausted, but only the next time the Lisp evaluator is called.
+
+     The initial threshold value is 500,000.  If you specify a larger
+     value, garbage collection will happen less often.  This reduces the
+     amount of time spent garbage collecting, but increases total
+     memory use.  You may want to do this when running a program that
+     creates lots of Lisp data.
+
+     You can make collections more frequent by specifying a smaller
+     value, down to 10,000.  A value less than 10,000 will remain in
+     effect only until the subsequent garbage collection, at which time
+     `garbage-collect' will set the threshold back to 10,000. (This does
+     not apply if XEmacs was configured with `--debug'.  Therefore, be
+     careful when setting `gc-cons-threshold' in that case!)
+
+ - Function: memory-limit
+     This function returns the address of the last byte XEmacs has
+     allocated, divided by 1024.  We divide the value by 1024 to make
+     sure it fits in a Lisp integer.
+
+     You can use this to get a general idea of how your actions affect
+     the memory usage.
+
+ - Variable: pre-gc-hook
+     This is a normal hook to be run just before each garbage
+     collection.  Interrupts, garbage collection, and errors are
+     inhibited while this hook runs, so be extremely careful in what
+     you add here.  In particular, avoid consing, and do not interact
+     with the user.
+
+ - Variable: post-gc-hook
+     This is a normal hook to be run just after each garbage collection.
+     Interrupts, garbage collection, and errors are inhibited while
+     this hook runs, so be extremely careful in what you add here.  In
+     particular, avoid consing, and do not interact with the user.
+
+ - Variable: gc-message
+     This is a string to print to indicate that a garbage collection is
+     in progress.  This is printed in the echo area.  If the selected
+     frame is on a window system and `gc-pointer-glyph' specifies a
+     value (i.e. a pointer image instance) in the domain of the
+     selected frame, the mouse cursor will change instead of this
+     message being printed.
+
+ - Glyph: gc-pointer-glyph
+     This holds the pointer glyph used to indicate that a garbage
+     collection is in progress.  If the selected window is on a window
+     system and this glyph specifies a value (i.e. a pointer image
+     instance) in the domain of the selected window, the cursor will be
+     changed as specified during garbage collection.  Otherwise, a
+     message will be printed in the echo area, as controlled by
+     `gc-message'.  *Note Glyphs::.
+
+   If XEmacs was configured with `--debug', you can set the following
+two variables to get direct information about all the allocation that
+is happening in a segment of Lisp code.
+
+ - Variable: debug-allocation
+     If non-zero, print out information to stderr about all objects
+     allocated.
+
+ - Variable: debug-allocation-backtrace
+     Length (in stack frames) of short backtrace printed out by
+     `debug-allocation'.
+
+\1f
+File: lispref.info,  Node: Standard Errors,  Next: Standard Buffer-Local Variables,  Prev: Building XEmacs and Object Allocation,  Up: Top
+
+Standard Errors
+***************
+
+   Here is the complete list of the error symbols in standard Emacs,
+grouped by concept.  The list includes each symbol's message (on the
+`error-message' property of the symbol) and a cross reference to a
+description of how the error can occur.
+
+   Each error symbol has an `error-conditions' property that is a list
+of symbols.  Normally this list includes the error symbol itself and
+the symbol `error'.  Occasionally it includes additional symbols, which
+are intermediate classifications, narrower than `error' but broader
+than a single error symbol.  For example, all the errors in accessing
+files have the condition `file-error'.
+
+   As a special exception, the error symbol `quit' does not have the
+condition `error', because quitting is not considered an error.
+
+   *Note Errors::, for an explanation of how errors are generated and
+handled.
+
+`SYMBOL'
+     STRING; REFERENCE.
+
+`error'
+     `"error"'
+     *Note Errors::.
+
+`quit'
+     `"Quit"'
+     *Note Quitting::.
+
+`args-out-of-range'
+     `"Args out of range"'
+     *Note Sequences Arrays Vectors::.
+
+`arith-error'
+     `"Arithmetic error"'
+     See `/' and `%' in *Note Numbers::.
+
+`beginning-of-buffer'
+     `"Beginning of buffer"'
+     *Note Motion::.
+
+`buffer-read-only'
+     `"Buffer is read-only"'
+     *Note Read Only Buffers::.
+
+`cyclic-function-indirection'
+     `"Symbol's chain of function indirections contains a loop"'
+     *Note Function Indirection::.
+
+`domain-error'
+     `"Arithmetic domain error"'
+`end-of-buffer'
+     `"End of buffer"'
+     *Note Motion::.
+
+`end-of-file'
+     `"End of file during parsing"'
+     This is not a `file-error'.
+     *Note Input Functions::.
+
+`file-error'
+     This error and its subcategories do not have error-strings,
+     because the error message is constructed from the data items alone
+     when the error condition `file-error' is present.
+     *Note Files::.
+
+`file-locked'
+     This is a `file-error'.
+     *Note File Locks::.
+
+`file-already-exists'
+     This is a `file-error'.
+     *Note Writing to Files::.
+
+`file-supersession'
+     This is a `file-error'.
+     *Note Modification Time::.
+
+`invalid-byte-code'
+     `"Invalid byte code"'
+     *Note Byte Compilation::.
+
+`invalid-function'
+     `"Invalid function"'
+     *Note Classifying Lists::.
+
+`invalid-read-syntax'
+     `"Invalid read syntax"'
+     *Note Input Functions::.
+
+`invalid-regexp'
+     `"Invalid regexp"'
+     *Note Regular Expressions::.
+
+`mark-inactive'
+     `"The mark is not active now"'
+`no-catch'
+     `"No catch for tag"'
+     *Note Catch and Throw::.
+
+`overflow-error'
+     `"Arithmetic overflow error"'
+`protected-field'
+     `"Attempt to modify a protected field"'
+`range-error'
+     `"Arithmetic range error"'
+`search-failed'
+     `"Search failed"'
+     *Note Searching and Matching::.
+
+`setting-constant'
+     `"Attempt to set a constant symbol"'
+     *Note Variables that Never Change: Constant Variables.
+
+`singularity-error'
+     `"Arithmetic singularity error"'
+`tooltalk-error'
+     `"ToolTalk error"'
+     *Note ToolTalk Support::.
+
+`undefined-keystroke-sequence'
+     `"Undefined keystroke sequence"'
+`void-function'
+     `"Symbol's function definition is void"'
+     *Note Function Cells::.
+
+`void-variable'
+     `"Symbol's value as variable is void"'
+     *Note Accessing Variables::.
+
+`wrong-number-of-arguments'
+     `"Wrong number of arguments"'
+     *Note Classifying Lists::.
+
+`wrong-type-argument'
+     `"Wrong type argument"'
+     *Note Type Predicates::.
+
+   These error types, which are all classified as special cases of
+`arith-error', can occur on certain systems for invalid use of
+mathematical functions.
+
+`domain-error'
+     `"Arithmetic domain error"'
+     *Note Math Functions::.
+
+`overflow-error'
+     `"Arithmetic overflow error"'
+     *Note Math Functions::.
+
+`range-error'
+     `"Arithmetic range error"'
+     *Note Math Functions::.
+
+`singularity-error'
+     `"Arithmetic singularity error"'
+     *Note Math Functions::.
+
+`underflow-error'
+     `"Arithmetic underflow error"'
+     *Note Math Functions::.
+
+\1f
+File: lispref.info,  Node: Standard Buffer-Local Variables,  Next: Standard Keymaps,  Prev: Standard Errors,  Up: Top
+
+Buffer-Local Variables
+**********************
+
+   The table below lists the general-purpose Emacs variables that are
+automatically local (when set) in each buffer.  Many Lisp packages
+define such variables for their internal use; we don't list them here.
+
+`abbrev-mode'
+     *note Abbrevs::
+
+`auto-fill-function'
+     *note Auto Filling::
+
+`buffer-auto-save-file-name'
+     *note Auto-Saving::
+
+`buffer-backed-up'
+     *note Backup Files::
+
+`buffer-display-table'
+     *note Display Tables::
+
+`buffer-file-format'
+     *note Format Conversion::
+
+`buffer-file-name'
+     *note Buffer File Name::
+
+`buffer-file-number'
+     *note Buffer File Name::
+
+`buffer-file-truename'
+     *note Buffer File Name::
+
+`buffer-file-type'
+     *note Files and MS-DOS::
+
+`buffer-invisibility-spec'
+     *note Invisible Text::
+
+`buffer-offer-save'
+     *note Saving Buffers::
+
+`buffer-read-only'
+     *note Read Only Buffers::
+
+`buffer-saved-size'
+     *note Point::
+
+`buffer-undo-list'
+     *note Undo::
+
+`cache-long-line-scans'
+     *note Text Lines::
+
+`case-fold-search'
+     *note Searching and Case::
+
+`ctl-arrow'
+     *note Usual Display::
+
+`comment-column'
+     *note Comments: (emacs)Comments.
+
+`default-directory'
+     *note System Environment::
+
+`defun-prompt-regexp'
+     *note List Motion::
+
+`fill-column'
+     *note Auto Filling::
+
+`goal-column'
+     *note Moving Point: (emacs)Moving Point.
+
+`left-margin'
+     *note Indentation::
+
+`local-abbrev-table'
+     *note Abbrevs::
+
+`local-write-file-hooks'
+     *note Saving Buffers::
+
+`major-mode'
+     *note Mode Help::
+
+`mark-active'
+     *note The Mark::
+
+`mark-ring'
+     *note The Mark::
+
+`minor-modes'
+     *note Minor Modes::
+
+`modeline-format'
+     *note Modeline Data::
+
+`modeline-buffer-identification'
+     *note Modeline Variables::
+
+`modeline-format'
+     *note Modeline Data::
+
+`modeline-modified'
+     *note Modeline Variables::
+
+`modeline-process'
+     *note Modeline Variables::
+
+`mode-name'
+     *note Modeline Variables::
+
+`overwrite-mode'
+     *note Insertion::
+
+`paragraph-separate'
+     *note Standard Regexps::
+
+`paragraph-start'
+     *note Standard Regexps::
+
+`point-before-scroll'
+     Used for communication between mouse commands and scroll-bar
+     commands.
+
+`require-final-newline'
+     *note Insertion::
+
+`selective-display'
+     *note Selective Display::
+
+`selective-display-ellipses'
+     *note Selective Display::
+
+`tab-width'
+     *note Usual Display::
+
+`truncate-lines'
+     *note Truncation::
+
+`vc-mode'
+     *note Modeline Variables::
+
+\1f
+File: lispref.info,  Node: Standard Keymaps,  Next: Standard Hooks,  Prev: Standard Buffer-Local Variables,  Up: Top
+
+Standard Keymaps
+****************
+
+   The following symbols are used as the names for various keymaps.
+Some of these exist when XEmacs is first started, others are loaded
+only when their respective mode is used.  This is not an exhaustive
+list.
+
+   Almost all of these maps are used as local maps.  Indeed, of the
+modes that presently exist, only Vip mode and Terminal mode ever change
+the global keymap.
+
+`bookmark-map'
+     A keymap containing bindings to bookmark functions.
+
+`Buffer-menu-mode-map'
+     A keymap used by Buffer Menu mode.
+
+`c++-mode-map'
+     A keymap used by C++ mode.
+
+`c-mode-map'
+     A keymap used by C mode.  A sparse keymap used by C mode.
+
+`command-history-map'
+     A keymap used by Command History mode.
+
+`ctl-x-4-map'
+     A keymap for subcommands of the prefix `C-x 4'.
+
+`ctl-x-5-map'
+     A keymap for subcommands of the prefix `C-x 5'.
+
+`ctl-x-map'
+     A keymap for `C-x' commands.
+
+`debugger-mode-map'
+     A keymap used by Debugger mode.
+
+`dired-mode-map'
+     A keymap for `dired-mode' buffers.
+
+`edit-abbrevs-map'
+     A keymap used in `edit-abbrevs'.
+
+`edit-tab-stops-map'
+     A keymap used in `edit-tab-stops'.
+
+`electric-buffer-menu-mode-map'
+     A keymap used by Electric Buffer Menu mode.
+
+`electric-history-map'
+     A keymap used by Electric Command History mode.
+
+`emacs-lisp-mode-map'
+     A keymap used by Emacs Lisp mode.
+
+`help-map'
+     A keymap for characters following the Help key.
+
+`Helper-help-map'
+     A keymap used by the help utility package.
+     It has the same keymap in its value cell and in its function cell.
+
+`Info-edit-map'
+     A keymap used by the `e' command of Info.
+
+`Info-mode-map'
+     A keymap containing Info commands.
+
+`isearch-mode-map'
+     A keymap that defines the characters you can type within
+     incremental search.
+
+`itimer-edit-map'
+     A keymap used when in Itimer Edit mode.
+
+`lisp-interaction-mode-map'
+     A keymap used by Lisp mode.
+
+`lisp-mode-map'
+     A keymap used by Lisp mode.
+
+     A keymap for minibuffer input with completion.
+
+`minibuffer-local-isearch-map'
+     A keymap for editing isearch strings in the minibuffer.
+
+`minibuffer-local-map'
+     Default keymap to use when reading from the minibuffer.
+
+`minibuffer-local-must-match-map'
+     A keymap for minibuffer input with completion, for exact match.
+
+`mode-specific-map'
+     The keymap for characters following `C-c'.  Note, this is in the
+     global map.  This map is not actually mode specific: its name was
+     chosen to be informative for the user in `C-h b'
+     (`display-bindings'), where it describes the main use of the `C-c'
+     prefix key.
+
+`modeline-map'
+     The keymap consulted for mouse-clicks on the modeline of a window.
+
+`objc-mode-map'
+     A keymap used in Objective C mode as a local map.
+
+`occur-mode-map'
+     A local keymap used by Occur mode.
+
+`overriding-local-map'
+     A keymap that overrides all other local keymaps.
+
+`query-replace-map'
+     A local keymap used for responses in `query-replace' and related
+     commands; also for `y-or-n-p' and `map-y-or-n-p'.  The functions
+     that use this map do not support prefix keys; they look up one
+     event at a time.
+
+`read-expression-map'
+     The minibuffer keymap used for reading Lisp expressions.
+
+`read-shell-command-map'
+     The minibuffer keymap used by shell-command and related commands.
+
+`shared-lisp-mode-map'
+     A keymap for commands shared by all sorts of Lisp modes.
+
+`text-mode-map'
+     A keymap used by Text mode.
+
+`toolbar-map'
+     The keymap consulted for mouse-clicks over a toolbar.
+
+`view-mode-map'
+     A keymap used by View mode.
+
+\1f
+File: lispref.info,  Node: Standard Hooks,  Next: Index,  Prev: Standard Keymaps,  Up: Top
+
+Standard Hooks
+**************
+
+   The following is a list of hook variables that let you provide
+functions to be called from within Emacs on suitable occasions.
+
+   Most of these variables have names ending with `-hook'.  They are
+"normal hooks", run by means of `run-hooks'.  The value of such a hook
+is a list of functions.  The recommended way to put a new function on
+such a hook is to call `add-hook'.  *Note Hooks::, for more information
+about using hooks.
+
+   The variables whose names end in `-function' have single functions
+as their values.  Usually there is a specific reason why the variable is
+not a normal hook, such as the need to pass arguments to the function.
+(In older Emacs versions, some of these variables had names ending in
+`-hook' even though they were not normal hooks.)
+
+   The variables whose names end in `-hooks' or `-functions' have lists
+of functions as their values, but these functions are called in a
+special way (they are passed arguments, or else their values are used).
+
+`activate-menubar-hook'
+
+`activate-popup-menu-hook'
+
+`ad-definition-hooks'
+
+`adaptive-fill-function'
+
+`add-log-current-defun-function'
+
+`after-change-functions'
+
+`after-delete-annotation-hook'
+
+`after-init-hook'
+
+`after-insert-file-functions'
+
+`after-revert-hook'
+
+`after-save-hook'
+
+`after-set-visited-file-name-hooks'
+
+`after-write-file-hooks'
+
+`auto-fill-function'
+
+`auto-save-hook'
+
+`before-change-functions'
+
+`before-delete-annotation-hook'
+
+`before-init-hook'
+
+`before-revert-hook'
+
+`blink-paren-function'
+
+`buffers-menu-switch-to-buffer-function'
+
+`c++-mode-hook'
+
+`c-delete-function'
+
+`c-mode-common-hook'
+
+`c-mode-hook'
+
+`c-special-indent-hook'
+
+`calendar-load-hook'
+
+`change-major-mode-hook'
+
+`command-history-hook'
+
+`comment-indent-function'
+
+`compilation-buffer-name-function'
+
+`compilation-exit-message-function'
+
+`compilation-finish-function'
+
+`compilation-parse-errors-function'
+
+`compilation-mode-hook'
+
+`create-console-hook'
+
+`create-device-hook'
+
+`create-frame-hook'
+
+`dabbrev-friend-buffer-function'
+
+`dabbrev-select-buffers-function'
+
+`delete-console-hook'
+
+`delete-device-hook'
+
+`delete-frame-hook'
+
+`deselect-frame-hook'
+
+`diary-display-hook'
+
+`diary-hook'
+
+`dired-after-readin-hook'
+
+`dired-before-readin-hook'
+
+`dired-load-hook'
+
+`dired-mode-hook'
+
+`disabled-command-hook'
+
+`display-buffer-function'
+
+`ediff-after-setup-control-frame-hook'
+
+`ediff-after-setup-windows-hook'
+
+`ediff-before-setup-control-frame-hook'
+
+`ediff-before-setup-windows-hook'
+
+`ediff-brief-help-message-function'
+
+`ediff-cleanup-hook'
+
+`ediff-control-frame-position-function'
+
+`ediff-display-help-hook'
+
+`ediff-focus-on-regexp-matches-function'
+
+`ediff-forward-word-function'
+
+`ediff-hide-regexp-matches-function'
+
+`ediff-keymap-setup-hook'
+
+`ediff-load-hook'
+
+`ediff-long-help-message-function'
+
+`ediff-make-wide-display-function'
+
+`ediff-merge-split-window-function'
+
+`ediff-meta-action-function'
+
+`ediff-meta-redraw-function'
+
+`ediff-mode-hook'
+
+`ediff-prepare-buffer-hook'
+
+`ediff-quit-hook'
+
+`ediff-registry-setup-hook'
+
+`ediff-select-hook'
+
+`ediff-session-action-function'
+
+`ediff-session-group-setup-hook'
+
+`ediff-setup-diff-regions-function'
+
+`ediff-show-registry-hook'
+
+`ediff-show-session-group-hook'
+
+`ediff-skip-diff-region-function'
+
+`ediff-split-window-function'
+
+`ediff-startup-hook'
+
+`ediff-suspend-hook'
+
+`ediff-toggle-read-only-function'
+
+`ediff-unselect-hook'
+
+`ediff-window-setup-function'
+
+`edit-picture-hook'
+
+`electric-buffer-menu-mode-hook'
+
+`electric-command-history-hook'
+
+`electric-help-mode-hook'
+
+`emacs-lisp-mode-hook'
+
+`fill-paragraph-function'
+
+`find-file-hooks'
+
+`find-file-not-found-hooks'
+
+`first-change-hook'
+
+`font-lock-after-fontify-buffer-hook'
+
+`font-lock-beginning-of-syntax-function'
+
+`font-lock-mode-hook'
+
+`fume-found-function-hook'
+
+`fume-list-mode-hook'
+
+`fume-rescan-buffer-hook'
+
+`fume-sort-function'
+
+`gnus-startup-hook'
+
+`hack-local-variables-hook'
+
+`highlight-headers-follow-url-function'
+
+`hyper-apropos-mode-hook'
+
+`indent-line-function'
+
+`indent-mim-hook'
+
+`indent-region-function'
+
+`initial-calendar-window-hook'
+
+`isearch-mode-end-hook'
+
+`isearch-mode-hook'
+
+`java-mode-hook'
+
+`kill-buffer-hook'
+
+`kill-buffer-query-functions'
+
+`kill-emacs-hook'
+
+`kill-emacs-query-functions'
+
+`kill-hooks'
+
+`LaTeX-mode-hook'
+
+`latex-mode-hook'
+
+`ledit-mode-hook'
+
+`lisp-indent-function'
+
+`lisp-interaction-mode-hook'
+
+`lisp-mode-hook'
+
+`list-diary-entries-hook'
+
+`load-read-function'
+
+`log-message-filter-function'
+
+`m2-mode-hook'
+
+`mail-citation-hook'
+
+`mail-mode-hook'
+
+`mail-setup-hook'
+
+`make-annotation-hook'
+
+`makefile-mode-hook'
+
+`map-frame-hook'
+
+`mark-diary-entries-hook'
+
+`medit-mode-hook'
+
+`menu-no-selection-hook'
+
+`mh-compose-letter-hook'
+
+`mh-folder-mode-hook'
+
+`mh-letter-mode-hook'
+
+`mim-mode-hook'
+
+`minibuffer-exit-hook'
+
+`minibuffer-setup-hook'
+
+`mode-motion-hook'
+
+`mouse-enter-frame-hook'
+
+`mouse-leave-frame-hook'
+
+`mouse-track-cleanup-hook'
+
+`mouse-track-click-hook'
+
+`mouse-track-down-hook'
+
+`mouse-track-drag-hook'
+
+`mouse-track-drag-up-hook'
+
+`mouse-track-up-hook'
+
+`mouse-yank-function'
+
+`news-mode-hook'
+
+`news-reply-mode-hook'
+
+`news-setup-hook'
+
+`nongregorian-diary-listing-hook'
+
+`nongregorian-diary-marking-hook'
+
+`nroff-mode-hook'
+
+`objc-mode-hook'
+
+`outline-mode-hook'
+
+`perl-mode-hook'
+
+`plain-TeX-mode-hook'
+
+`post-command-hook'
+
+`post-gc-hook'
+
+`pre-abbrev-expand-hook'
+
+`pre-command-hook'
+
+`pre-display-buffer-function'
+
+`pre-gc-hook'
+
+`pre-idle-hook'
+
+`print-diary-entries-hook'
+
+`prolog-mode-hook'
+
+`protect-innocence-hook'
+
+`remove-message-hook'
+
+`revert-buffer-function'
+
+`revert-buffer-insert-contents-function'
+
+`rmail-edit-mode-hook'
+
+`rmail-mode-hook'
+
+`rmail-retry-setup-hook'
+
+`rmail-summary-mode-hook'
+
+`scheme-indent-hook'
+
+`scheme-mode-hook'
+
+`scribe-mode-hook'
+
+`select-frame-hook'
+
+`send-mail-function'
+
+`shell-mode-hook'
+
+`shell-set-directory-error-hook'
+
+`special-display-function'
+
+`suspend-hook'
+
+`suspend-resume-hook'
+
+`temp-buffer-show-function'
+
+`term-setup-hook'
+
+`terminal-mode-hook'
+
+`terminal-mode-break-hook'
+
+`TeX-mode-hook'
+
+`tex-mode-hook'
+
+`text-mode-hook'
+
+`today-visible-calendar-hook'
+
+`today-invisible-calendar-hook'
+
+`tooltalk-message-handler-hook'
+
+`tooltalk-pattern-handler-hook'
+
+`tooltalk-unprocessed-message-hook'
+
+`unmap-frame-hook'
+
+`vc-checkin-hook'
+
+`vc-checkout-writable-buffer-hook'
+
+`vc-log-after-operation-hook'
+
+`vc-make-buffer-writable-hook'
+
+`view-hook'
+
+`vm-arrived-message-hook'
+
+`vm-arrived-messages-hook'
+
+`vm-chop-full-name-function'
+
+`vm-display-buffer-hook'
+
+`vm-edit-message-hook'
+
+`vm-forward-message-hook'
+
+`vm-iconify-frame-hook'
+
+`vm-inhibit-write-file-hook'
+
+`vm-key-functions'
+
+`vm-mail-hook'
+
+`vm-mail-mode-hook'
+
+`vm-menu-setup-hook'
+
+`vm-mode-hook'
+
+`vm-quit-hook'
+
+`vm-rename-current-buffer-function'
+
+`vm-reply-hook'
+
+`vm-resend-bounced-message-hook'
+
+`vm-resend-message-hook'
+
+`vm-retrieved-spooled-mail-hook'
+
+`vm-select-message-hook'
+
+`vm-select-new-message-hook'
+
+`vm-select-unread-message-hook'
+
+`vm-send-digest-hook'
+
+`vm-summary-mode-hook'
+
+`vm-summary-pointer-update-hook'
+
+`vm-summary-redo-hook'
+
+`vm-summary-update-hook'
+
+`vm-undisplay-buffer-hook'
+
+`vm-visit-folder-hook'
+
+`window-setup-hook'
+
+`write-contents-hooks'
+
+`write-file-data-hooks'
+
+`write-file-hooks'
+
+`write-region-annotate-functions'
+
+`x-lost-selection-hooks'
+
+`x-sent-selection-hooks'
+
+`zmacs-activate-region-hook'
+
+`zmacs-deactivate-region-hook'
+
+`zmacs-update-region-hook'
diff --git a/info/lispref.info-46 b/info/lispref.info-46
new file mode 100644 (file)
index 0000000..11acac1
--- /dev/null
@@ -0,0 +1,3464 @@
+This is ../info/lispref.info, produced by makeinfo version 4.0 from
+lispref/lispref.texi.
+
+INFO-DIR-SECTION XEmacs Editor
+START-INFO-DIR-ENTRY
+* Lispref: (lispref).          XEmacs Lisp Reference Manual.
+END-INFO-DIR-ENTRY
+
+   Edition History:
+
+   GNU Emacs Lisp Reference Manual Second Edition (v2.01), May 1993 GNU
+Emacs Lisp Reference Manual Further Revised (v2.02), August 1993 Lucid
+Emacs Lisp Reference Manual (for 19.10) First Edition, March 1994
+XEmacs Lisp Programmer's Manual (for 19.12) Second Edition, April 1995
+GNU Emacs Lisp Reference Manual v2.4, June 1995 XEmacs Lisp
+Programmer's Manual (for 19.13) Third Edition, July 1995 XEmacs Lisp
+Reference Manual (for 19.14 and 20.0) v3.1, March 1996 XEmacs Lisp
+Reference Manual (for 19.15 and 20.1, 20.2, 20.3) v3.2, April, May,
+November 1997 XEmacs Lisp Reference Manual (for 21.0) v3.3, April 1998
+
+   Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995 Free Software
+Foundation, Inc.  Copyright (C) 1994, 1995 Sun Microsystems, Inc.
+Copyright (C) 1995, 1996 Ben Wing.
+
+   Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+   Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided that the
+entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+
+   Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that this permission notice may be stated in a
+translation approved by the Foundation.
+
+   Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided also
+that the section entitled "GNU General Public License" is included
+exactly as in the original, and provided that the entire resulting
+derived work is distributed under the terms of a permission notice
+identical to this one.
+
+   Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that the section entitled "GNU General Public License"
+may be included in a translation approved by the Free Software
+Foundation instead of in the original English.
+
+\1f
+File: lispref.info,  Node: Index,  Prev: Standard Hooks,  Up: Top
+
+Index
+*****
+
+* Menu:
+
+* " in printing:                         Output Functions.
+* " in strings:                          String Type.
+* #$:                                    Docs and Compilation.
+* #@COUNT:                               Docs and Compilation.
+* $ in display:                          Truncation.
+* $ in regexp:                           Syntax of Regexps.
+* %:                                     Arithmetic Operations.
+* % in format:                           Formatting Strings.
+* & in replacement:                      Replacing Match.
+* &define (Edebug):                      Specification List.
+* &not (Edebug):                         Specification List.
+* &optional:                             Argument List.
+* &optional (Edebug):                    Specification List.
+* &or (Edebug):                          Specification List.
+* &rest:                                 Argument List.
+* &rest (Edebug):                        Specification List.
+* ' for quoting:                         Quoting.
+* ( in regexp:                           Syntax of Regexps.
+* (...) in lists:                        Cons Cell Type.
+* ) in regexp:                           Syntax of Regexps.
+* *:                                     Arithmetic Operations.
+* * in interactive:                      Using Interactive.
+* * in regexp:                           Syntax of Regexps.
+* *? in regexp:                          Syntax of Regexps.
+* *PQfn:                                 Unimplemented libpq Functions.
+* *PQoidStatus:                          Unimplemented libpq Functions.
+* *PQsetdb:                              Unimplemented libpq Functions.
+* *PQsetdbLogin:                         Unimplemented libpq Functions.
+* *scratch*:                             Auto Major Mode.
+* +:                                     Arithmetic Operations.
+* + in regexp:                           Syntax of Regexps.
+* +? in regexp:                          Syntax of Regexps.
+* , (with Backquote):                    Backquote.
+* ,@ (with Backquote):                   Backquote.
+* -:                                     Arithmetic Operations.
+* . in lists:                            Dotted Pair Notation.
+* . in regexp:                           Syntax of Regexps.
+* .emacs:                                Init File.
+* .emacs customization:                  Major Mode Conventions.
+* /:                                     Arithmetic Operations.
+* /=:                                    Comparison of Numbers.
+* 1+:                                    Arithmetic Operations.
+* 1-:                                    Arithmetic Operations.
+* ; in comment:                          Comments.
+* <:                                     Comparison of Numbers.
+* <=:                                    Comparison of Numbers.
+* <ESC>:                                 Functions for Key Lookup.
+* =:                                     Comparison of Numbers.
+* >:                                     Comparison of Numbers.
+* >=:                                    Comparison of Numbers.
+* ? in character constant:               Character Type.
+* ? in regexp:                           Syntax of Regexps.
+* @ in interactive:                      Using Interactive.
+* [ in regexp:                           Syntax of Regexps.
+* [...] (Edebug):                        Specification List.
+* \ in character constant:               Character Type.
+* \ in display:                          Truncation.
+* \ in printing:                         Output Functions.
+* \ in regexp:                           Syntax of Regexps.
+* \ in replacement:                      Replacing Match.
+* \ in strings:                          String Type.
+* \ in symbols:                          Symbol Type.
+* \' in regexp:                          Syntax of Regexps.
+* \(?: in regexp:                        Syntax of Regexps.
+* \< in regexp:                          Syntax of Regexps.
+* \= in regexp:                          Syntax of Regexps.
+* \> in regexp:                          Syntax of Regexps.
+* \` in regexp:                          Syntax of Regexps.
+* \a:                                    Character Type.
+* \b:                                    Character Type.
+* \B in regexp:                          Syntax of Regexps.
+* \b in regexp:                          Syntax of Regexps.
+* \e:                                    Character Type.
+* \f:                                    Character Type.
+* \n:                                    Character Type.
+* \n in print:                           Output Variables.
+* \N in replacement:                     Replacing Match.
+* \r:                                    Character Type.
+* \S in regexp:                          Syntax of Regexps.
+* \s in regexp:                          Syntax of Regexps.
+* \t:                                    Character Type.
+* \v:                                    Character Type.
+* \W in regexp:                          Syntax of Regexps.
+* \w in regexp:                          Syntax of Regexps.
+* \{n,m\} in regexp:                     Syntax of Regexps.
+* ] in regexp:                           Syntax of Regexps.
+* ^ in regexp:                           Syntax of Regexps.
+* _ in interactive:                      Using Interactive.
+* `:                                     Backquote.
+* ` (Edebug):                            Debugging Backquote.
+* ` (list substitution):                 Backquote.
+* abbrev:                                Abbrevs.
+* abbrev table:                          Abbrevs.
+* abbrev tables in modes:                Major Mode Conventions.
+* abbrev-all-caps:                       Abbrev Expansion.
+* abbrev-expansion:                      Abbrev Expansion.
+* abbrev-file-name:                      Abbrev Files.
+* abbrev-mode:                           Abbrev Mode.
+* abbrev-prefix-mark:                    Abbrev Expansion.
+* abbrev-start-location:                 Abbrev Expansion.
+* abbrev-start-location-buffer:          Abbrev Expansion.
+* abbrev-symbol:                         Abbrev Expansion.
+* abbrev-table-name-list:                Abbrev Tables.
+* abbreviate-file-name:                  Directory Names.
+* abbrevs-changed:                       Abbrev Files.
+* abort-recursive-edit:                  Recursive Editing.
+* aborting:                              Recursive Editing.
+* abs:                                   Arithmetic Operations.
+* absolute file name:                    Relative File Names.
+* accelerate-menu:                       Menu Accelerator Functions.
+* accept-process-output:                 Accepting Output.
+* accessibility of a file:               Testing Accessibility.
+* accessible portion (of a buffer):      Narrowing.
+* accessible-keymaps:                    Scanning Keymaps.
+* acos:                                  Math Functions.
+* acosh:                                 Math Functions.
+* activate-menubar-hook:                 Menubar.
+* activate-popup-menu-hook:              Pop-Up Menus.
+* active display table:                  Active Display Table.
+* active keymap:                         Active Keymaps.
+* active-minibuffer-window:              Minibuffer Misc.
+* add-abbrev:                            Defining Abbrevs.
+* add-hook:                              Hooks.
+* add-menu:                              Modifying Menus.
+* add-menu-button:                       Modifying Menus.
+* add-menu-item:                         Modifying Menus.
+* add-name-to-file:                      Changing File Attributes.
+* add-spec-list-to-specifier:            Adding Specifications.
+* add-spec-to-specifier:                 Adding Specifications.
+* add-submenu:                           Modifying Menus.
+* add-text-properties:                   Changing Properties.
+* add-timeout:                           Timers.
+* add-to-list:                           Setting Variables.
+* add-tooltalk-message-arg:              Elisp Interface for Sending Messages.
+* add-tooltalk-pattern-arg:              Elisp Interface for Receiving Messages.
+* add-tooltalk-pattern-attribute:        Elisp Interface for Receiving Messages.
+* address field of register:             Cons Cell Type.
+* after-change-function:                 Change Hooks.
+* after-change-functions:                Change Hooks.
+* after-find-file:                       Subroutines of Visiting.
+* after-init-hook:                       Init File.
+* after-insert-file-functions:           Saving Properties.
+* after-load-alist:                      Hooks for Loading.
+* after-revert-hook:                     Reverting.
+* after-save-hook:                       Saving Buffers.
+* aliases, for variables:                Variable Aliases.
+* alist:                                 Association Lists.
+* alist-to-plist:                        Converting Plists To/From Alists.
+* all-annotations:                       Locating Annotations.
+* all-completions:                       Basic Completion.
+* and:                                   Combining Conditions.
+* annotation:                            Annotations.
+* annotation hooks:                      Annotation Hooks.
+* annotation-action:                     Annotation Properties.
+* annotation-data:                       Annotation Properties.
+* annotation-down-glyph:                 Annotation Properties.
+* annotation-face:                       Annotation Properties.
+* annotation-glyph:                      Annotation Properties.
+* annotation-layout:                     Annotation Properties.
+* annotation-list:                       Locating Annotations.
+* annotation-menu:                       Annotation Properties.
+* annotation-side:                       Annotation Properties.
+* annotation-visible:                    Annotation Properties.
+* annotation-width:                      Annotation Properties.
+* annotationp:                           Annotation Primitives.
+* annotations-at:                        Locating Annotations.
+* annotations-in-region:                 Locating Annotations.
+* anonymous function:                    Anonymous Functions.
+* anonymous lambda expressions (Edebug): Instrumenting.
+* apostrophe for quoting:                Quoting.
+* append:                                Building Lists.
+* append-to-file:                        Writing to Files.
+* apply:                                 Calling Functions.
+* apply, and debugging:                  Internals of Debugger.
+* apropos:                               Help Functions.
+* aref:                                  Array Functions.
+* argument binding:                      Argument List.
+* argument descriptors:                  Using Interactive.
+* argument evaluation form:              Using Interactive.
+* argument prompt:                       Using Interactive.
+* arguments, reading:                    Minibuffers.
+* arith-error example:                   Handling Errors.
+* arith-error in division:               Arithmetic Operations.
+* arithmetic shift:                      Bitwise Operations.
+* array:                                 Arrays.
+* array elements:                        Array Functions.
+* arrayp:                                Array Functions.
+* ASCII character codes:                 Character Type.
+* aset:                                  Array Functions.
+* ash:                                   Bitwise Operations.
+* asin:                                  Math Functions.
+* asinh:                                 Math Functions.
+* ask-user-about-lock:                   File Locks.
+* ask-user-about-supersession-threat:    Modification Time.
+* asking the user questions:             Yes-or-No Queries.
+* assoc:                                 Association Lists.
+* association list:                      Association Lists.
+* assq:                                  Association Lists.
+* asynchronous subprocess:               Asynchronous Processes.
+* atan:                                  Math Functions.
+* atanh:                                 Math Functions.
+* atom <1>:                              List-related Predicates.
+* atom:                                  Cons Cell Type.
+* atomic extent:                         Atomic Extents.
+* atoms:                                 List-related Predicates.
+* attributes of text:                    Text Properties.
+* Auto Fill mode:                        Auto Filling.
+* auto-fill-function:                    Auto Filling.
+* auto-lower-frame:                      Raising and Lowering.
+* auto-mode-alist:                       Auto Major Mode.
+* auto-raise-frame:                      Raising and Lowering.
+* auto-save-default:                     Auto-Saving.
+* auto-save-file-format:                 Format Conversion.
+* auto-save-file-name-p:                 Auto-Saving.
+* auto-save-hook:                        Auto-Saving.
+* auto-save-interval:                    Auto-Saving.
+* auto-save-list-file-name:              Auto-Saving.
+* auto-save-mode:                        Auto-Saving.
+* auto-save-timeout:                     Auto-Saving.
+* auto-save-visited-file-name:           Auto-Saving.
+* auto-saving:                           Auto-Saving.
+* autoload <1>:                          Domain Specification.
+* autoload:                              Autoload.
+* autoload errors:                       Autoload.
+* automatically buffer-local:            Intro to Buffer-Local.
+* available fonts:                       Font Instance Names.
+* back-to-indentation:                   Motion by Indent.
+* background pixmap:                     Merging Faces.
+* backquote (Edebug):                    Debugging Backquote.
+* backquote (list substitution):         Backquote.
+* backslash in character constant:       Character Type.
+* backslash in strings:                  String Type.
+* backslash in symbols:                  Symbol Type.
+* backspace:                             Character Type.
+* backtrace:                             Internals of Debugger.
+* backtrace-debug:                       Internals of Debugger.
+* backtrace-frame:                       Internals of Debugger.
+* backtracking:                          Backtracking.
+* backup file:                           Backup Files.
+* backup files, how to make them:        Rename or Copy.
+* backup-buffer:                         Making Backups.
+* backup-by-copying:                     Rename or Copy.
+* backup-by-copying-when-linked:         Rename or Copy.
+* backup-by-copying-when-mismatch:       Rename or Copy.
+* backup-enable-predicate:               Making Backups.
+* backup-file-name-p:                    Backup Names.
+* backup-inhibited:                      Making Backups.
+* backward-char:                         Character Motion.
+* backward-delete-char-untabify:         Deletion.
+* backward-list:                         List Motion.
+* backward-prefix-chars:                 Motion and Syntax.
+* backward-sexp:                         List Motion.
+* backward-to-indentation:               Motion by Indent.
+* backward-word:                         Word Motion.
+* balancing parentheses:                 Blinking.
+* barf-if-buffer-read-only:              Read Only Buffers.
+* base buffer:                           Indirect Buffers.
+* base64:                                Transformations.
+* base64-decode-region:                  Transformations.
+* base64-decode-string:                  Transformations.
+* base64-encode-region:                  Transformations.
+* base64-encode-string:                  Transformations.
+* batch mode:                            Batch Mode.
+* batch-byte-compile:                    Compilation Functions.
+* batch-byte-recompile-directory:        Compilation Functions.
+* beep:                                  Beeping.
+* beeping:                               Beeping.
+* before point, insertion:               Insertion.
+* before-change-function:                Change Hooks.
+* before-change-functions:               Change Hooks.
+* before-init-hook:                      Init File.
+* before-revert-hook:                    Reverting.
+* beginning of line:                     Text Lines.
+* beginning of line in regexp:           Syntax of Regexps.
+* beginning-of-buffer:                   Buffer End Motion.
+* beginning-of-defun:                    List Motion.
+* beginning-of-line:                     Text Lines.
+* bell:                                  Beeping.
+* bell character:                        Character Type.
+* bell-volume:                           Beeping.
+* binary files and text files:           Files and MS-DOS.
+* binary-process-input:                  MS-DOS Subprocesses.
+* binary-process-output:                 MS-DOS Subprocesses.
+* bind-text-domain:                      Level 3 Primitives.
+* binding arguments:                     Argument List.
+* binding local variables:               Local Variables.
+* binding of a key:                      Keymap Terminology.
+* bit vector:                            Bit Vectors.
+* bit vector length:                     Sequence Functions.
+* bit-vector:                            Bit Vector Functions.
+* bit-vector-p:                          Bit Vector Functions.
+* bitp:                                  Bit Vector Functions.
+* bitwise and:                           Bitwise Operations.
+* bitwise exclusive or:                  Bitwise Operations.
+* bitwise not:                           Bitwise Operations.
+* bitwise or:                            Bitwise Operations.
+* blink-matching-open:                   Blinking.
+* blink-matching-paren:                  Blinking.
+* blink-matching-paren-delay:            Blinking.
+* blink-matching-paren-distance:         Blinking.
+* blink-paren-function:                  Blinking.
+* blink-paren-hook:                      Blinking.
+* blinking:                              Blinking.
+* bobp:                                  Near Point.
+* body of function:                      Lambda Components.
+* bold:                                  Font Instance Characteristics.
+* bolp:                                  Near Point.
+* bookmark-map:                          Standard Keymaps.
+* boolean:                               nil and t.
+* boolean-specifier-p:                   Specifier Types.
+* bootstrapping XEmacs from temacs:      Building XEmacs.
+* bottom-gutter:                         Specifying a Gutter.
+* bottom-gutter-height:                  Other Gutter Variables.
+* bottom-gutter-visible-p:               Other Gutter Variables.
+* bottom-toolbar:                        Specifying the Toolbar.
+* bottom-toolbar-height:                 Other Toolbar Variables.
+* bottom-toolbar-visible-p:              Other Toolbar Variables.
+* boundp:                                Void Variables.
+* box diagrams, for lists:               Cons Cell Type.
+* box representation for lists:          Lists as Boxes.
+* break:                                 Debugger.
+* breakpoints:                           Breakpoints.
+* bucket (in obarray):                   Creating Symbols.
+* buffer:                                Buffers.
+* buffer contents:                       Text.
+* buffer file name:                      Buffer File Name.
+* buffer input stream:                   Input Streams.
+* buffer list:                           The Buffer List.
+* buffer modification:                   Buffer Modification.
+* buffer names:                          Buffer Names.
+* buffer output stream:                  Output Streams.
+* buffer text notation:                  Buffer Text Notation.
+* buffer, read-only:                     Read Only Buffers.
+* buffer-auto-save-file-name:            Auto-Saving.
+* buffer-backed-up:                      Making Backups.
+* buffer-base-buffer:                    Indirect Buffers.
+* buffer-disable-undo:                   Maintaining Undo.
+* buffer-enable-undo:                    Maintaining Undo.
+* buffer-end:                            Point.
+* buffer-file-format:                    Format Conversion.
+* buffer-file-name:                      Buffer File Name.
+* buffer-file-number:                    Buffer File Name.
+* buffer-file-truename:                  Buffer File Name.
+* buffer-file-type:                      Files and MS-DOS.
+* buffer-flush-undo:                     Maintaining Undo.
+* buffer-glyph-p:                        Glyph Types.
+* buffer-indirect-children:              Indirect Buffers.
+* buffer-invisibility-spec:              Invisible Text.
+* buffer-list:                           The Buffer List.
+* buffer-live-p:                         Killing Buffers.
+* buffer-local variables:                Buffer-Local Variables.
+* buffer-local variables in modes:       Major Mode Conventions.
+* buffer-local-variables:                Creating Buffer-Local.
+* Buffer-menu-mode-map:                  Standard Keymaps.
+* buffer-modified-p:                     Buffer Modification.
+* buffer-modified-tick:                  Buffer Modification.
+* buffer-name:                           Buffer Names.
+* buffer-offer-save <1>:                 Killing Buffers.
+* buffer-offer-save:                     Saving Buffers.
+* buffer-read-only:                      Read Only Buffers.
+* buffer-saved-size <1>:                 Point.
+* buffer-saved-size:                     Auto-Saving.
+* buffer-size:                           Point.
+* buffer-string:                         Buffer Contents.
+* buffer-substring:                      Buffer Contents.
+* buffer-undo-list:                      Undo.
+* bufferp:                               Buffer Basics.
+* buffers menu:                          Buffers Menu.
+* buffers, controlled in windows:        Buffers and Windows.
+* buffers, creating:                     Creating Buffers.
+* buffers, killing:                      Killing Buffers.
+* buffers-menu-filter:                   Menu Filters.
+* buffers-menu-max-size:                 Buffers Menu.
+* buffers-menu-switch-to-buffer-function: Buffers Menu.
+* building lists:                        Building Lists.
+* building XEmacs:                       Building XEmacs.
+* built-in function:                     What Is a Function.
+* bury-buffer:                           The Buffer List.
+* busy-pointer-glyph:                    Mouse Pointer.
+* button-event-p:                        Event Predicates.
+* button-press-event-p:                  Event Predicates.
+* button-release-event-p:                Event Predicates.
+* bvconcat:                              Bit Vector Functions.
+* byte-code <1>:                         Compilation Functions.
+* byte-code:                             Byte Compilation.
+* byte-code function:                    Compiled-Function Objects.
+* byte-code interpreter:                 Compilation Functions.
+* byte-compile:                          Compilation Functions.
+* byte-compile-dynamic:                  Dynamic Loading.
+* byte-compile-dynamic-docstrings:       Docs and Compilation.
+* byte-compile-file:                     Compilation Functions.
+* byte-compiling macros:                 Compiling Macros.
+* byte-compiling require:                Named Features.
+* byte-recompile-directory:              Compilation Functions.
+* byte-recompile-directory-ignore-errors-p: Compilation Functions.
+* bytes:                                 Strings and Characters.
+* c++-mode-map:                          Standard Keymaps.
+* C-c:                                   Prefix Keys.
+* C-g:                                   Quitting.
+* C-h:                                   Prefix Keys.
+* C-M-x:                                 Instrumenting.
+* c-mode-abbrev-table:                   Standard Abbrev Tables.
+* c-mode-map:                            Standard Keymaps.
+* c-mode-syntax-table:                   Standard Syntax Tables.
+* C-q:                                   Flow Control.
+* C-s:                                   Flow Control.
+* C-x:                                   Prefix Keys.
+* C-x 4:                                 Prefix Keys.
+* C-x 5:                                 Prefix Keys.
+* C-x a:                                 Prefix Keys.
+* C-x n:                                 Prefix Keys.
+* C-x r:                                 Prefix Keys.
+* caaaar:                                List Elements.
+* caaadr:                                List Elements.
+* caaar:                                 List Elements.
+* caadar:                                List Elements.
+* caaddr:                                List Elements.
+* caadr:                                 List Elements.
+* caar:                                  List Elements.
+* cadaar:                                List Elements.
+* cadadr:                                List Elements.
+* cadar:                                 List Elements.
+* caddar:                                List Elements.
+* cadddr:                                List Elements.
+* caddr:                                 List Elements.
+* cadr:                                  List Elements.
+* call stack:                            Internals of Debugger.
+* call-interactively:                    Interactive Call.
+* call-process:                          Synchronous Processes.
+* call-process-region:                   Synchronous Processes.
+* calling a function:                    Calling Functions.
+* cancel-debug-on-entry:                 Function Debugging.
+* canonicalize-inst-list:                Adding Specifications.
+* canonicalize-inst-pair:                Adding Specifications.
+* canonicalize-lax-plist:                Working With Lax Plists.
+* canonicalize-plist:                    Working With Normal Plists.
+* canonicalize-spec:                     Adding Specifications.
+* canonicalize-spec-list:                Adding Specifications.
+* canonicalize-tag-set:                  Specifier Tag Functions.
+* capitalization:                        Character Case.
+* capitalize:                            Character Case.
+* capitalize-region:                     Case Changes.
+* capitalize-word:                       Case Changes.
+* car:                                   List Elements.
+* car-safe:                              List Elements.
+* case changes:                          Case Changes.
+* case in replacements:                  Replacing Match.
+* case-fold-search:                      Searching and Case.
+* case-replace:                          Searching and Case.
+* case-table-p:                          Case Tables.
+* catch:                                 Catch and Throw.
+* category-designator-p:                 Category Tables.
+* category-table:                        Category Tables.
+* category-table-p:                      Category Tables.
+* category-table-value-p:                Category Tables.
+* CBREAK:                                Flow Control.
+* ccl-elapsed-time:                      Calling CCL.
+* ccl-execute:                           Calling CCL.
+* ccl-execute-on-string:                 Calling CCL.
+* ccl-reset-elapsed-time:                Calling CCL.
+* cdaaar:                                List Elements.
+* cdaadr:                                List Elements.
+* cdaar:                                 List Elements.
+* cdadar:                                List Elements.
+* cdaddr:                                List Elements.
+* cdadr:                                 List Elements.
+* cdar:                                  List Elements.
+* cddaar:                                List Elements.
+* cddadr:                                List Elements.
+* cddar:                                 List Elements.
+* cdddar:                                List Elements.
+* cddddr:                                List Elements.
+* cdddr:                                 List Elements.
+* cddr:                                  List Elements.
+* CDE dt:                                CDE dt.
+* cdr:                                   List Elements.
+* cdr-safe:                              List Elements.
+* ceiling:                               Numeric Conversions.
+* centering point:                       Vertical Scrolling.
+* cerror:                                Signaling Errors.
+* change hooks:                          Change Hooks.
+* change-major-mode-hook:                Major Mode Conventions.
+* changing key bindings:                 Changing Key Bindings.
+* changing to another buffer:            Current Buffer.
+* changing window size:                  Resizing Windows.
+* char table type:                       Char Table Type.
+* char-after:                            Near Point.
+* char-before:                           Near Point.
+* char-charset:                          MULE Characters.
+* char-equal:                            Text Comparison.
+* char-int:                              Character Codes.
+* char-int confoundance disease:         Character Type.
+* char-int-p:                            Character Codes.
+* char-octet:                            MULE Characters.
+* char-or-char-int-p:                    Character Codes.
+* char-or-string-p:                      Predicates for Strings.
+* char-syntax:                           Syntax Table Functions.
+* char-table-p:                          Char Tables.
+* char-table-type:                       Char Table Types.
+* char-table-type-list:                  Char Table Types.
+* char-to-string:                        String Conversion.
+* char=:                                 Text Comparison.
+* character arrays:                      Strings and Characters.
+* character case:                        Character Case.
+* character descriptor:                  Character Descriptors.
+* character insertion:                   Commands for Insertion.
+* character printing:                    Describing Characters.
+* character set (in regexp):             Syntax of Regexps.
+* character to string:                   String Conversion.
+* character-to-event:                    Converting Events.
+* characteristics of font instances:     Font Instance Characteristics.
+* characterp:                            Predicates for Characters.
+* characters:                            Strings and Characters.
+* characters for interactive codes:      Interactive Codes.
+* character quote:                       Syntax Class Table.
+* charset type:                          Charset Type.
+* charset-ccl-program:                   Charset Property Functions.
+* charset-chars:                         Charset Property Functions.
+* charset-columns:                       Charset Property Functions.
+* charset-dimension:                     Charset Property Functions.
+* charset-direction:                     Charset Property Functions.
+* charset-doc-string:                    Charset Property Functions.
+* charset-final:                         Charset Property Functions.
+* charset-from-attributes:               Basic Charset Functions.
+* charset-graphic:                       Charset Property Functions.
+* charset-list:                          Basic Charset Functions.
+* charset-name:                          Charset Property Functions.
+* charset-property:                      Charset Property Functions.
+* charset-registry:                      Charset Property Functions.
+* charset-reverse-direction-charset:     Basic Charset Functions.
+* charsetp:                              Charsets.
+* check-argument-type:                   Signaling Errors.
+* check-gutter-button-syntax:            Gutter Descriptor Format.
+* check-toolbar-button-syntax:           Toolbar Descriptor Format.
+* check-valid-char-table-value:          Working With Char Tables.
+* check-valid-inst-list:                 Specifier Validation Functions.
+* check-valid-instantiator:              Specifier Validation Functions.
+* check-valid-plist:                     Property Lists.
+* check-valid-spec-list:                 Specifier Validation Functions.
+* child process:                         Processes.
+* children, of extent:                   Extent Parents.
+* CL note--allocate more storage:        Garbage Collection.
+* CL note--case of letters:              Symbol Type.
+* CL note--default optional arg:         Argument List.
+* CL note--integers vrs eq:              Comparison of Numbers.
+* CL note--lack union, set:              Sets And Lists.
+* CL note--only throw in Emacs:          Catch and Throw.
+* CL note--rplaca vrs setcar:            Modifying Lists.
+* CL note--set local:                    Setting Variables.
+* CL note--special forms compared:       Special Forms.
+* CL note--special variables:            Variable Scoping.
+* CL note--symbol in obarrays:           Creating Symbols.
+* cl-read:                               Reading in Edebug.
+* cl-specs.el:                           Instrumenting.
+* cl.el (Edebug):                        Instrumenting.
+* cleanup forms:                         Cleanups.
+* clear-abbrev-table:                    Abbrev Tables.
+* clear-message:                         The Echo Area.
+* clear-range-table:                     Working With Range Tables.
+* clear-visited-file-modtime:            Modification Time.
+* close parenthesis:                     Blinking.
+* close-database:                        Connecting to a Database.
+* close parenthesis character:           Syntax Class Table.
+* closures not available:                Extent.
+* clrhash:                               Working With Hash Tables.
+* codes, interactive, description of:    Interactive Codes.
+* coding standards:                      Tips.
+* coding system type:                    Coding System Type.
+* coding-category-list:                  Detection of Textual Encoding.
+* coding-category-system:                Detection of Textual Encoding.
+* coding-priority-list:                  Detection of Textual Encoding.
+* coding-system-base:                    Basic Coding System Functions.
+* coding-system-doc-string:              Coding System Property Functions.
+* coding-system-list:                    Basic Coding System Functions.
+* coding-system-name:                    Basic Coding System Functions.
+* coding-system-p:                       Coding Systems.
+* coding-system-property:                Coding System Property Functions.
+* coding-system-type:                    Coding System Property Functions.
+* color instance type:                   Color Instance Type.
+* color instances:                       Color Instances.
+* color-instance-name:                   Color Instance Properties.
+* color-instance-p:                      Color Instances.
+* color-instance-rgb-components:         Color Instance Properties.
+* color-name:                            Color Convenience Functions.
+* color-pixmap-image-instance-p:         Image Instance Types.
+* color-rgb-components:                  Color Convenience Functions.
+* color-specifier-p <1>:                 Color Specifiers.
+* color-specifier-p:                     Specifier Types.
+* colorize-image-instance:               Image Instance Functions.
+* colors:                                Colors.
+* columns:                               Columns.
+* command:                               What Is a Function.
+* command descriptions:                  A Sample Function Description.
+* command history:                       Command History.
+* command in keymap:                     Key Lookup.
+* command line arguments:                Command Line Arguments.
+* command line options:                  Command Line Arguments.
+* command loop:                          Command Loop.
+* command loop, recursive:               Recursive Editing.
+* command-debug-status:                  Internals of Debugger.
+* command-execute:                       Interactive Call.
+* command-history:                       Command History.
+* command-history-map:                   Standard Keymaps.
+* command-line:                          Command Line Arguments.
+* command-line-args:                     Command Line Arguments.
+* command-line-functions:                Command Line Arguments.
+* command-line-processed:                Command Line Arguments.
+* command-switch-alist:                  Command Line Arguments.
+* commandp:                              Interactive Call.
+* commandp example:                      High-Level Completion.
+* commands, defining:                    Defining Commands.
+* comment syntax:                        Syntax Class Table.
+* comments:                              Comments.
+* comment ender:                         Syntax Class Table.
+* comment starter:                       Syntax Class Table.
+* Common Lisp:                           Lisp History.
+* Common Lisp (Edebug):                  Instrumenting.
+* compare-buffer-substrings:             Comparing Text.
+* comparing buffer text:                 Comparing Text.
+* comparison of modification time:       Modification Time.
+* compilation:                           Byte Compilation.
+* compilation functions:                 Compilation Functions.
+* compile-defun:                         Compilation Functions.
+* compiled function:                     Compiled-Function Objects.
+* compiled-function-arglist:             Compiled-Function Objects.
+* compiled-function-constants:           Compiled-Function Objects.
+* compiled-function-doc-string:          Compiled-Function Objects.
+* compiled-function-domain:              Compiled-Function Objects.
+* compiled-function-instructions:        Compiled-Function Objects.
+* compiled-function-interactive:         Compiled-Function Objects.
+* compiled-function-p:                   What Is a Function.
+* compiled-function-stack-size:          Compiled-Function Objects.
+* complete key:                          Keymap Terminology.
+* completing-read:                       Minibuffer Completion.
+* completion:                            Completion.
+* completion, file name:                 File Name Completion.
+* completion, user name:                 User Name Completion.
+* completion-auto-help:                  Completion Commands.
+* completion-ignore-case:                Basic Completion.
+* completion-ignored-extensions:         File Name Completion.
+* complex arguments:                     Minibuffers.
+* complex command:                       Command History.
+* complex-buffers-menu-p:                Buffers Menu.
+* compose-region:                        Composite Characters.
+* composite-char-string:                 Composite Characters.
+* concat:                                Creating Strings.
+* concatenating lists:                   Rearrangement.
+* concatenating strings:                 Creating Strings.
+* cond:                                  Conditionals.
+* condition name:                        Error Symbols.
+* condition-case:                        Handling Errors.
+* conditional evaluation:                Conditionals.
+* cons:                                  Building Lists.
+* cons cell as box:                      Lists as Boxes.
+* cons cells:                            Building Lists.
+* consing:                               Building Lists.
+* console-device-list:                   Basic Console Functions.
+* console-disable-input:                 Console and Device I/O.
+* console-enable-input:                  Console and Device I/O.
+* console-list:                          Basic Console Functions.
+* console-live-p:                        Connecting to a Console or Device.
+* console-type-image-conversion-list:    Image Instantiator Conversion.
+* consolep:                              Consoles and Devices.
+* consoles:                              Consoles and Devices.
+* consp:                                 List-related Predicates.
+* continuation lines:                    Truncation.
+* continuation-glyph:                    Redisplay Glyphs.
+* continue-process:                      Signals to Processes.
+* control character printing:            Describing Characters.
+* control characters:                    Character Type.
+* control characters in display:         Usual Display.
+* control characters, reading:           Quoted Character Input.
+* control structures:                    Control Structures.
+* control-arrow-glyph:                   Redisplay Glyphs.
+* Control-X-prefix:                      Prefix Keys.
+* conventions for writing minor modes:   Minor Mode Conventions.
+* conversion of image instantiators:     Image Instantiator Conversion.
+* conversion of strings:                 String Conversion.
+* copy-alist:                            Association Lists.
+* copy-category-table:                   Category Tables.
+* copy-coding-system:                    Basic Coding System Functions.
+* copy-event:                            Working With Events.
+* copy-extent:                           Detached Extents.
+* copy-face:                             Basic Face Functions.
+* copy-file:                             Changing File Attributes.
+* copy-hash-table:                       Introduction to Hash Tables.
+* copy-keymap:                           Creating Keymaps.
+* copy-marker:                           Creating Markers.
+* copy-range-table:                      Introduction to Range Tables.
+* copy-region-as-kill:                   Kill Functions.
+* copy-sequence:                         Sequence Functions.
+* copy-specifier:                        Other Specification Functions.
+* copy-syntax-table:                     Syntax Table Functions.
+* copying alists:                        Association Lists.
+* copying bit vectors:                   Bit Vector Functions.
+* copying files:                         Changing File Attributes.
+* copying lists:                         Building Lists.
+* copying sequences:                     Sequence Functions.
+* copying strings:                       Creating Strings.
+* copying vectors:                       Vector Functions.
+* cos:                                   Math Functions.
+* cosh:                                  Math Functions.
+* count-lines:                           Text Lines.
+* count-loop:                            A Sample Function Description.
+* counting columns:                      Columns.
+* coverage testing:                      Coverage Testing.
+* create-device-hook:                    Connecting to a Console or Device.
+* create-file-buffer:                    Subroutines of Visiting.
+* create-frame-hook:                     Frame Hooks.
+* create-tooltalk-message:               Elisp Interface for Sending Messages.
+* create-tooltalk-pattern:               Elisp Interface for Receiving Messages.
+* creating buffers:                      Creating Buffers.
+* creating keymaps:                      Creating Keymaps.
+* ctl-arrow:                             Usual Display.
+* ctl-x-4-map <1>:                       Standard Keymaps.
+* ctl-x-4-map:                           Prefix Keys.
+* ctl-x-5-map <1>:                       Standard Keymaps.
+* ctl-x-5-map:                           Prefix Keys.
+* ctl-x-map <1>:                         Standard Keymaps.
+* ctl-x-map:                             Prefix Keys.
+* cube-root:                             Math Functions.
+* current binding:                       Local Variables.
+* current buffer:                        Current Buffer.
+* current buffer excursion:              Excursions.
+* current buffer mark:                   The Mark.
+* current buffer point and mark (Edebug): Edebug Display Update.
+* current buffer position:               Point.
+* current command:                       Command Loop Info.
+* current stack frame:                   Using Debugger.
+* current-buffer:                        Current Buffer.
+* current-case-table:                    Case Tables.
+* current-column:                        Columns.
+* current-fill-column:                   Margins.
+* current-frame-configuration:           Frame Configurations.
+* current-global-map:                    Active Keymaps.
+* current-indentation:                   Primitive Indent.
+* current-input-mode:                    Input Modes.
+* current-justification:                 Filling.
+* current-keymaps:                       Active Keymaps.
+* current-kill:                          Low-Level Kill Ring.
+* current-left-margin:                   Margins.
+* current-local-map:                     Active Keymaps.
+* current-menubar:                       Menubar.
+* current-message:                       The Echo Area.
+* current-minor-mode-maps:               Active Keymaps.
+* current-mouse-event:                   Command Loop Info.
+* current-prefix-arg:                    Prefix Command Arguments.
+* current-time:                          Time of Day.
+* current-time-string:                   Time of Day.
+* current-time-zone:                     Time of Day.
+* current-window-configuration:          Window Configurations.
+* cursor (mouse):                        Mouse Pointer.
+* cursor-in-echo-area:                   The Echo Area.
+* cust-print:                            Printing in Edebug.
+* cut buffer:                            X Selections.
+* cyclic ordering of windows:            Cyclic Window Ordering.
+* data type:                             Lisp Data Types.
+* data-directory:                        Accessing Documentation.
+* database:                              Databases.
+* database type:                         Database Type.
+* database-file-name:                    Other Database Functions.
+* database-last-error:                   Other Database Functions.
+* database-live-p:                       Connecting to a Database.
+* database-subtype:                      Other Database Functions.
+* database-type:                         Other Database Functions.
+* databasep:                             Databases.
+* deallocate-event:                      Working With Events.
+* debug:                                 Invoking the Debugger.
+* debug-allocation:                      Garbage Collection.
+* debug-allocation-backtrace:            Garbage Collection.
+* debug-ignored-errors:                  Error Debugging.
+* debug-on-entry:                        Function Debugging.
+* debug-on-error:                        Error Debugging.
+* debug-on-error use:                    Processing of Errors.
+* debug-on-next-call:                    Internals of Debugger.
+* debug-on-quit:                         Infinite Loops.
+* debug-on-signal:                       Error Debugging.
+* debug-on-signal use:                   Handling Errors.
+* debugger <1>:                          Internals of Debugger.
+* debugger:                              Debugger.
+* debugger command list:                 Debugger Commands.
+* debugger-mode-map:                     Standard Keymaps.
+* debugging errors:                      Error Debugging.
+* debugging specific functions:          Function Debugging.
+* decode-big5-char:                      Big5 and Shift-JIS Functions.
+* decode-coding-region:                  Encoding and Decoding Text.
+* decode-shift-jis-char:                 Big5 and Shift-JIS Functions.
+* decode-time:                           Time Conversion.
+* decoding file formats:                 Format Conversion.
+* decompose-region:                      Composite Characters.
+* decrement field of register:           Cons Cell Type.
+* dedicated window:                      Choosing Window.
+* deep binding:                          Impl of Scope.
+* def-edebug-spec:                       Instrumenting Macro Calls.
+* defalias:                              Defining Functions.
+* default argument string:               Interactive Codes.
+* default init file:                     Init File.
+* default value:                         Default Value.
+* default-abbrev-mode:                   Abbrev Mode.
+* default-boundp:                        Default Value.
+* default-buffer-file-type:              Files and MS-DOS.
+* default-case-fold-search:              Searching and Case.
+* default-ctl-arrow:                     Usual Display.
+* default-deselect-frame-hook:           Raising and Lowering.
+* default-directory:                     File Name Expansion.
+* default-file-modes:                    Changing File Attributes.
+* default-fill-column:                   Margins.
+* default-frame-name:                    Frame Name.
+* default-frame-plist:                   Initial Properties.
+* default-gutter:                        Specifying a Gutter.
+* default-gutter-height:                 Other Gutter Variables.
+* default-gutter-position:               Specifying a Gutter.
+* default-gutter-visible-p:              Other Gutter Variables.
+* default-gutter-width:                  Other Gutter Variables.
+* default-justification:                 Filling.
+* default-major-mode:                    Auto Major Mode.
+* default-menubar:                       Menubar.
+* default-minibuffer-frame:              Minibuffers and Frames.
+* default-modeline-format:               Modeline Variables.
+* default-popup-menu:                    Pop-Up Menus.
+* default-select-frame-hook:             Raising and Lowering.
+* default-text-properties:               Examining Properties.
+* default-toolbar:                       Specifying the Toolbar.
+* default-toolbar-height:                Other Toolbar Variables.
+* default-toolbar-position:              Specifying the Toolbar.
+* default-toolbar-visible-p:             Other Toolbar Variables.
+* default-toolbar-width:                 Other Toolbar Variables.
+* default-truncate-lines:                Truncation.
+* default-value:                         Default Value.
+* default-x-device:                      Resources.
+* default.el:                            Start-up Summary.
+* defconst <1>:                          Domain Specification.
+* defconst:                              Defining Variables.
+* defcustom:                             Variable Definitions.
+* defgroup:                              Group Definitions.
+* define-abbrev:                         Defining Abbrevs.
+* define-abbrev-table:                   Abbrev Tables.
+* define-derived-mode:                   Derived Modes.
+* define-error:                          Error Symbols.
+* define-function:                       Defining Functions.
+* define-key:                            Changing Key Bindings.
+* define-logical-name:                   Changing File Attributes.
+* define-obsolete-function-alias:        Obsoleteness.
+* define-obsolete-variable-alias:        Obsoleteness.
+* define-prefix-command:                 Prefix Keys.
+* define-specifier-tag:                  Specifier Tag Functions.
+* defining a function:                   Defining Functions.
+* defining commands:                     Defining Commands.
+* defining-kbd-macro:                    Keyboard Macros.
+* definition of a symbol:                Definitions.
+* defmacro:                              Defining Macros.
+* defsubst:                              Inline Functions.
+* defun:                                 Defining Functions.
+* defun-prompt-regexp:                   List Motion.
+* defvar <1>:                            Domain Specification.
+* defvar:                                Defining Variables.
+* defvaralias:                           Variable Aliases.
+* deiconify-frame:                       Visibility of Frames.
+* delete:                                Sets And Lists.
+* delete previous char:                  Deletion.
+* delete-annotation:                     Annotation Primitives.
+* delete-auto-save-file-if-necessary:    Auto-Saving.
+* delete-auto-save-files:                Auto-Saving.
+* delete-backward-char:                  Deletion.
+* delete-blank-lines:                    User-Level Deletion.
+* delete-char:                           Deletion.
+* delete-device:                         Connecting to a Console or Device.
+* delete-device-hook:                    Connecting to a Console or Device.
+* delete-directory:                      Create/Delete Dirs.
+* delete-exited-processes:               Deleting Processes.
+* delete-extent:                         Creating and Modifying Extents.
+* delete-file:                           Changing File Attributes.
+* delete-frame:                          Deleting Frames.
+* delete-frame-hook:                     Frame Hooks.
+* delete-horizontal-space:               User-Level Deletion.
+* delete-indentation:                    User-Level Deletion.
+* delete-menu-item:                      Modifying Menus.
+* delete-old-versions:                   Numbered Backups.
+* delete-other-windows:                  Deleting Windows.
+* delete-process:                        Deleting Processes.
+* delete-region:                         Deletion.
+* delete-to-left-margin:                 Margins.
+* delete-window:                         Deleting Windows.
+* delete-windows-on:                     Deleting Windows.
+* deleting files:                        Changing File Attributes.
+* deleting processes:                    Deleting Processes.
+* deleting whitespace:                   User-Level Deletion.
+* deleting windows:                      Deleting Windows.
+* deletion of elements:                  Sets And Lists.
+* deletion of frames:                    Deleting Frames.
+* deletion vs killing:                   Deletion.
+* delq:                                  Sets And Lists.
+* demibold:                              Font Instance Characteristics.
+* describe-bindings:                     Scanning Keymaps.
+* describe-bindings-internal:            Scanning Keymaps.
+* describe-buffer-case-table:            Case Tables.
+* describe-mode:                         Mode Help.
+* describe-prefix-bindings:              Help Functions.
+* describe-tooltalk-message:             Elisp Interface for Receiving Messages.
+* description for interactive codes:     Interactive Codes.
+* description format:                    Format of Descriptions.
+* deselect-frame-hook:                   Frame Hooks.
+* destroy-tooltalk-message:              Elisp Interface for Sending Messages.
+* destroy-tooltalk-pattern:              Elisp Interface for Receiving Messages.
+* destructive-alist-to-plist:            Converting Plists To/From Alists.
+* destructive-plist-to-alist:            Converting Plists To/From Alists.
+* detach-extent:                         Detached Extents.
+* detached extent:                       Detached Extents.
+* detect-coding-region:                  Detection of Textual Encoding.
+* device-baud-rate <1>:                  Terminal Output.
+* device-baud-rate:                      Console and Device I/O.
+* device-class:                          Console Types and Device Classes.
+* device-frame-list <1>:                 Basic Device Functions.
+* device-frame-list:                     Finding All Frames.
+* device-list:                           Basic Device Functions.
+* device-live-p:                         Connecting to a Console or Device.
+* device-matches-specifier-tag-set-p:    Specifier Tag Functions.
+* device-matching-specifier-tag-list:    Specifier Tag Functions.
+* device-or-frame-p:                     Basic Device Functions.
+* device-or-frame-type:                  Console Types and Device Classes.
+* device-type:                           Console Types and Device Classes.
+* device-x-display:                      Connecting to a Console or Device.
+* devicep:                               Consoles and Devices.
+* devices:                               Consoles and Devices.
+* dgettext:                              Level 3 Primitives.
+* diagrams, boxed, for lists:            Cons Cell Type.
+* dialog box:                            Dialog Boxes.
+* digit-argument:                        Prefix Command Arguments.
+* ding:                                  Beeping.
+* directory name:                        Directory Names.
+* directory name abbreviation:           Directory Names.
+* directory part (of file name):         File Name Components.
+* directory-abbrev-alist:                Directory Names.
+* directory-file-name:                   Directory Names.
+* directory-files:                       Contents of Directories.
+* directory-oriented functions:          Contents of Directories.
+* dired-kept-versions:                   Numbered Backups.
+* dired-mode-map:                        Standard Keymaps.
+* disable undo:                          Maintaining Undo.
+* disable-command:                       Disabling Commands.
+* disable-menu-item:                     Modifying Menus.
+* disable-timeout:                       Timers.
+* disabled:                              Disabling Commands.
+* disabled command:                      Disabling Commands.
+* disabled-command-hook:                 Disabling Commands.
+* disassemble:                           Disassembly.
+* disassembled byte-code:                Disassembly.
+* discard input:                         Peeking and Discarding.
+* discard-input:                         Peeking and Discarding.
+* dispatch-event:                        Dispatching an Event.
+* dispatching an event:                  Dispatching an Event.
+* display columns:                       Size and Position.
+* display lines:                         Size and Position.
+* display order:                         Extent Endpoints.
+* display table:                         Display Tables.
+* display update:                        Refresh Screen.
+* display-buffer:                        Choosing Window.
+* display-buffer-function:               Choosing Window.
+* display-completion-list:               Completion Commands.
+* display-error:                         Processing of Errors.
+* display-message:                       The Echo Area.
+* display-warning:                       Warnings.
+* display-warning-minimum-level:         Warnings.
+* display-warning-suppressed-classes:    Warnings.
+* displaying a buffer:                   Displaying Buffers.
+* do-auto-save:                          Auto-Saving.
+* DOC (documentation) file:              Documentation Basics.
+* doc-directory:                         Accessing Documentation.
+* documentation:                         Accessing Documentation.
+* documentation conventions:             Documentation Basics.
+* documentation for major mode:          Mode Help.
+* documentation notation:                Evaluation Notation.
+* documentation of function:             Function Documentation.
+* documentation strings:                 Documentation.
+* documentation, keys in:                Keys in Documentation.
+* documentation-property:                Accessing Documentation.
+* domain:                                Level 3 Primitives.
+* domain (in a specifier):               Specifiers In-Depth.
+* domain-of:                             Level 3 Primitives.
+* dotted lists (Edebug):                 Specification List.
+* dotted pair notation:                  Dotted Pair Notation.
+* double-quote in strings:               String Type.
+* down-list:                             List Motion.
+* downcase:                              Character Case.
+* downcase-region:                       Case Changes.
+* downcase-word:                         Case Changes.
+* downcasing in lookup-key:              Key Sequence Input.
+* drag:                                  Drag Interface.
+* drag and drop:                         Drag and Drop.
+* Drag API:                              Drag Interface.
+* dribble file:                          Recording Input.
+* drop:                                  Drop Interface.
+* Drop API:                              Drop Interface.
+* dump-emacs:                            Building XEmacs.
+* duplicable extent:                     Duplicable Extents.
+* dynamic loading of documentation:      Docs and Compilation.
+* dynamic loading of functions:          Dynamic Loading.
+* dynamic scoping:                       Variable Scoping.
+* echo area:                             The Echo Area.
+* echo-keystrokes <1>:                   The Echo Area.
+* echo-keystrokes:                       Command Loop Info.
+* edebug:                                Embedded Breakpoints.
+* Edebug:                                Edebug.
+* Edebug execution modes:                Edebug Execution Modes.
+* Edebug mode:                           Edebug.
+* Edebug specification list:             Specification List.
+* edebug-`:                              Debugging Backquote.
+* edebug-all-defs <1>:                   Edebug Options.
+* edebug-all-defs:                       Instrumenting.
+* edebug-all-forms <1>:                  Edebug Options.
+* edebug-all-forms:                      Instrumenting.
+* edebug-continue-kbd-macro:             Edebug Options.
+* edebug-display-freq-count:             Coverage Testing.
+* edebug-eval-top-level-form:            Instrumenting.
+* edebug-global-break-condition <1>:     Edebug Options.
+* edebug-global-break-condition:         Global Break Condition.
+* edebug-initial-mode:                   Edebug Options.
+* edebug-on-error <1>:                   Edebug Options.
+* edebug-on-error:                       Trapping Errors.
+* edebug-on-quit <1>:                    Edebug Options.
+* edebug-on-quit:                        Trapping Errors.
+* edebug-print-circle <1>:               Edebug Options.
+* edebug-print-circle:                   Printing in Edebug.
+* edebug-print-length <1>:               Edebug Options.
+* edebug-print-length:                   Printing in Edebug.
+* edebug-print-level <1>:                Edebug Options.
+* edebug-print-level:                    Printing in Edebug.
+* edebug-print-trace-after <1>:          Edebug Options.
+* edebug-print-trace-after:              Tracing.
+* edebug-print-trace-before <1>:         Edebug Options.
+* edebug-print-trace-before:             Tracing.
+* edebug-save-displayed-buffer-points <1>: Edebug Options.
+* edebug-save-displayed-buffer-points:   Edebug Display Update.
+* edebug-save-windows <1>:               Edebug Options.
+* edebug-save-windows:                   Edebug Display Update.
+* edebug-set-global-break-condition:     Global Break Condition.
+* edebug-setup-hook:                     Edebug Options.
+* edebug-test-coverage:                  Edebug Options.
+* edebug-trace <1>:                      Edebug Options.
+* edebug-trace:                          Tracing.
+* edebug-tracing:                        Tracing.
+* edebug-unwrap:                         Specification List.
+* edebug-unwrap-results <1>:             Edebug Options.
+* edebug-unwrap-results:                 Debugging Backquote.
+* edit-abbrevs-map:                      Standard Keymaps.
+* edit-and-eval-command:                 Object from Minibuffer.
+* edit-menu-filter:                      Menu Filters.
+* edit-tab-stops-map:                    Standard Keymaps.
+* editing types:                         Editing Types.
+* editor command loop:                   Command Loop.
+* eighth:                                List Elements.
+* electric-buffer-menu-mode-map:         Standard Keymaps.
+* electric-future-map:                   A Sample Variable Description.
+* electric-history-map:                  Standard Keymaps.
+* element (of list):                     Lists.
+* elements of sequences:                 Sequence Functions.
+* elt:                                   Sequence Functions.
+* emacs-build-time:                      Building XEmacs.
+* emacs-lisp-mode-map:                   Standard Keymaps.
+* emacs-lisp-mode-syntax-table:          Standard Syntax Tables.
+* emacs-major-version:                   Building XEmacs.
+* emacs-minor-version:                   Building XEmacs.
+* emacs-pid:                             System Environment.
+* emacs-version:                         Building XEmacs.
+* EMACSLOADPATH environment variable:    How Programs Do Loading.
+* embedded breakpoints:                  Embedded Breakpoints.
+* empty list:                            Cons Cell Type.
+* enable-command:                        Disabling Commands.
+* enable-flow-control:                   Flow Control.
+* enable-flow-control-on:                Flow Control.
+* enable-local-eval:                     Auto Major Mode.
+* enable-local-variables:                Auto Major Mode.
+* enable-menu-item:                      Modifying Menus.
+* enable-recursive-minibuffers:          Minibuffer Misc.
+* encode-big5-char:                      Big5 and Shift-JIS Functions.
+* encode-coding-region:                  Encoding and Decoding Text.
+* encode-shift-jis-char:                 Big5 and Shift-JIS Functions.
+* encode-time:                           Time Conversion.
+* encoding file formats:                 Format Conversion.
+* end of buffer marker:                  Creating Markers.
+* end-of-buffer:                         Buffer End Motion.
+* end-of-defun:                          List Motion.
+* end-of-file:                           Input Functions.
+* end-of-line:                           Text Lines.
+* enlarge-window:                        Resizing Windows.
+* enlarge-window-horizontally:           Resizing Windows.
+* enlarge-window-pixels:                 Resizing Windows.
+* enqueue-eval-event:                    Reading One Event.
+* environment:                           Intro Eval.
+* environment variable access:           System Environment.
+* environment variables, subprocesses:   Subprocess Creation.
+* eobp:                                  Near Point.
+* eolp:                                  Near Point.
+* eq:                                    Equality Predicates.
+* equal:                                 Equality Predicates.
+* equality:                              Equality Predicates.
+* erase-buffer:                          Deletion.
+* error:                                 Signaling Errors.
+* error cleanup:                         Cleanups.
+* error debugging:                       Error Debugging.
+* error display:                         The Echo Area.
+* error handler:                         Handling Errors.
+* error in debug:                        Invoking the Debugger.
+* error message notation:                Error Messages.
+* error name:                            Error Symbols.
+* error symbol:                          Error Symbols.
+* error-conditions:                      Error Symbols.
+* error-message-string:                  Processing of Errors.
+* errors:                                Errors.
+* esc-map:                               Prefix Keys.
+* ESC-prefix:                            Prefix Keys.
+* escape <1>:                            Syntax Class Table.
+* escape:                                Character Type.
+* escape characters:                     Output Variables.
+* escape characters in printing:         Output Functions.
+* escape sequence:                       Character Type.
+* eval:                                  Eval.
+* eval, and debugging:                   Internals of Debugger.
+* eval-and-compile:                      Eval During Compile.
+* eval-buffer:                           Eval.
+* eval-current-buffer (Edebug):          Instrumenting.
+* eval-defun (Edebug):                   Instrumenting.
+* eval-event-p:                          Event Predicates.
+* eval-expression (Edebug):              Instrumenting.
+* eval-minibuffer:                       Object from Minibuffer.
+* eval-region:                           Eval.
+* eval-region (Edebug):                  Instrumenting.
+* eval-when-compile:                     Eval During Compile.
+* evaluated expression argument:         Interactive Codes.
+* evaluation:                            Evaluation.
+* evaluation error:                      Local Variables.
+* evaluation list (Edebug):              Eval List.
+* evaluation notation:                   Evaluation Notation.
+* evaluation of buffer contents:         Eval.
+* event printing:                        Describing Characters.
+* event-buffer:                          Window-Level Event Position Info.
+* event-button:                          Accessing Other Event Info.
+* event-closest-point:                   Event Text Position Info.
+* event-device:                          Accessing Other Event Info.
+* event-frame:                           Frame-Level Event Position Info.
+* event-function:                        Accessing Other Event Info.
+* event-glyph-extent:                    Event Glyph Position Info.
+* event-glyph-x-pixel:                   Event Glyph Position Info.
+* event-glyph-y-pixel:                   Event Glyph Position Info.
+* event-key:                             Accessing Other Event Info.
+* event-live-p:                          Event Predicates.
+* event-matches-key-specifier-p:         Key Sequences.
+* event-modifier-bits:                   Accessing Other Event Info.
+* event-modifiers:                       Accessing Other Event Info.
+* event-object:                          Accessing Other Event Info.
+* event-over-border-p:                   Other Event Position Info.
+* event-over-glyph-p:                    Event Glyph Position Info.
+* event-over-modeline-p:                 Event Text Position Info.
+* event-over-text-area-p:                Event Text Position Info.
+* event-over-toolbar-p:                  Event Toolbar Position Info.
+* event-point:                           Event Text Position Info.
+* event-process:                         Accessing Other Event Info.
+* event-timestamp:                       Accessing Other Event Info.
+* event-to-character:                    Converting Events.
+* event-toolbar-button:                  Event Toolbar Position Info.
+* event-type:                            Event Contents.
+* event-window:                          Window-Level Event Position Info.
+* event-window-x-pixel:                  Window-Level Event Position Info.
+* event-window-y-pixel:                  Window-Level Event Position Info.
+* event-x:                               Event Text Position Info.
+* event-x-pixel:                         Frame-Level Event Position Info.
+* event-y:                               Event Text Position Info.
+* event-y-pixel:                         Frame-Level Event Position Info.
+* eventp:                                Events.
+* events:                                Events.
+* events-to-keys:                        Converting Events.
+* examining windows:                     Buffers and Windows.
+* examples of using interactive:         Interactive Examples.
+* exchange-point-and-mark:               The Mark.
+* excursion:                             Excursions.
+* exec-directory:                        Subprocess Creation.
+* exec-path:                             Subprocess Creation.
+* execute program:                       Subprocess Creation.
+* execute with prefix argument:          Interactive Call.
+* execute-extended-command:              Interactive Call.
+* execute-kbd-macro:                     Keyboard Macros.
+* executing-macro:                       Keyboard Macros.
+* execution speed:                       Compilation Tips.
+* exit:                                  Recursive Editing.
+* exit recursive editing:                Recursive Editing.
+* exit-minibuffer:                       Minibuffer Misc.
+* exit-recursive-edit:                   Recursive Editing.
+* exiting XEmacs:                        Getting Out.
+* exp:                                   Math Functions.
+* expand-abbrev:                         Abbrev Expansion.
+* expand-file-name:                      File Name Expansion.
+* expansion of file names:               File Name Expansion.
+* expansion of macros:                   Expansion.
+* expression:                            Intro Eval.
+* expression prefix:                     Syntax Class Table.
+* expt:                                  Math Functions.
+* extended-command-history:              Minibuffer History.
+* extent <1>:                            Extents.
+* extent:                                Variable Scoping.
+* extent children:                       Extent Parents.
+* extent end position:                   Extent Endpoints.
+* extent endpoint:                       Extent Endpoints.
+* extent order:                          Extent Endpoints.
+* extent parent:                         Extent Parents.
+* extent priority:                       Intro to Extents.
+* extent property:                       Extent Properties.
+* extent replica:                        Duplicable Extents.
+* extent start position:                 Extent Endpoints.
+* extent, duplicable:                    Duplicable Extents.
+* extent, unique:                        Duplicable Extents.
+* extent-at:                             Finding Extents.
+* extent-begin-glyph:                    Extent Properties.
+* extent-begin-glyph-layout:             Extent Properties.
+* extent-children:                       Extent Parents.
+* extent-descendants:                    Extent Parents.
+* extent-detached-p:                     Detached Extents.
+* extent-end-glyph:                      Extent Properties.
+* extent-end-glyph-layout:               Extent Properties.
+* extent-end-position:                   Extent Endpoints.
+* extent-face:                           Extent Properties.
+* extent-in-region-p:                    Mapping Over Extents.
+* extent-keymap:                         Extent Properties.
+* extent-length:                         Extent Endpoints.
+* extent-list:                           Finding Extents.
+* extent-live-p:                         Creating and Modifying Extents.
+* extent-mouse-face:                     Extent Properties.
+* extent-object:                         Creating and Modifying Extents.
+* extent-parent:                         Extent Parents.
+* extent-priority:                       Extent Properties.
+* extent-properties:                     Extent Properties.
+* extent-property:                       Extent Properties.
+* extent-start-position:                 Extent Endpoints.
+* extentp:                               Extents.
+* extents, locating:                     Finding Extents.
+* extents, mapping:                      Mapping Over Extents.
+* face type:                             Face Type.
+* face-background:                       Face Convenience Functions.
+* face-background-instance:              Face Convenience Functions.
+* face-background-pixmap:                Face Convenience Functions.
+* face-background-pixmap-instance:       Face Convenience Functions.
+* face-boolean-specifier-p:              Specifier Types.
+* face-differs-from-default-p:           Other Face Display Functions.
+* face-equal:                            Other Face Display Functions.
+* face-font:                             Face Convenience Functions.
+* face-font-instance:                    Face Convenience Functions.
+* face-font-name:                        Face Convenience Functions.
+* face-foreground:                       Face Convenience Functions.
+* face-foreground-instance:              Face Convenience Functions.
+* face-list:                             Basic Face Functions.
+* face-property:                         Face Properties.
+* face-property-instance:                Face Properties.
+* face-underline-p:                      Face Convenience Functions.
+* facep:                                 Basic Face Functions.
+* faces:                                 Faces and Window-System Objects.
+* fallback (in a specifier):             Specifier Instancing.
+* false:                                 nil and t.
+* fboundp:                               Function Cells.
+* fceiling:                              Rounding Operations.
+* featurep:                              Named Features.
+* features:                              Named Features.
+* fetch-bytecode:                        Dynamic Loading.
+* ffloor:                                Rounding Operations.
+* field width:                           Formatting Strings.
+* fifth:                                 List Elements.
+* file accessibility:                    Testing Accessibility.
+* file age:                              Testing Accessibility.
+* file attributes:                       File Attributes.
+* file format conversion:                Format Conversion.
+* file hard link:                        Changing File Attributes.
+* file locks:                            File Locks.
+* file mode specification error:         Auto Major Mode.
+* file modes and MS-DOS:                 Changing File Attributes.
+* file modification time:                Testing Accessibility.
+* file name completion subroutines:      File Name Completion.
+* file name of buffer:                   Buffer File Name.
+* file name of directory:                Directory Names.
+* file names:                            File Names.
+* file names in directory:               Contents of Directories.
+* file open error:                       Subroutines of Visiting.
+* file symbolic links:                   Kinds of Files.
+* file types on MS-DOS:                  Files and MS-DOS.
+* file with multiple names:              Changing File Attributes.
+* file-accessible-directory-p:           Testing Accessibility.
+* file-already-exists:                   Changing File Attributes.
+* file-attributes:                       File Attributes.
+* file-directory-p:                      Kinds of Files.
+* file-error:                            How Programs Do Loading.
+* file-executable-p:                     Testing Accessibility.
+* file-exists-p:                         Testing Accessibility.
+* file-local-copy:                       Magic File Names.
+* file-locked:                           File Locks.
+* file-locked-p:                         File Locks.
+* file-menu-filter:                      Menu Filters.
+* file-modes:                            File Attributes.
+* file-name-absolute-p:                  Relative File Names.
+* file-name-all-completions:             File Name Completion.
+* file-name-as-directory:                Directory Names.
+* file-name-buffer-file-type-alist:      Files and MS-DOS.
+* file-name-completion:                  File Name Completion.
+* file-name-directory:                   File Name Components.
+* file-name-history:                     Minibuffer History.
+* file-name-nondirectory:                File Name Components.
+* file-name-sans-extension:              File Name Components.
+* file-name-sans-versions:               File Name Components.
+* file-newer-than-file-p:                Testing Accessibility.
+* file-newest-backup:                    Backup Names.
+* file-nlinks:                           File Attributes.
+* file-ownership-preserved-p:            Testing Accessibility.
+* file-precious-flag:                    Saving Buffers.
+* file-readable-p:                       Testing Accessibility.
+* file-regular-p:                        Kinds of Files.
+* file-relative-name:                    File Name Expansion.
+* file-supersession:                     Modification Time.
+* file-symlink-p:                        Kinds of Files.
+* file-truename:                         Truenames.
+* file-writable-p:                       Testing Accessibility.
+* fill-column:                           Margins.
+* fill-individual-paragraphs:            Filling.
+* fill-individual-varying-indent:        Filling.
+* fill-paragraph:                        Filling.
+* fill-paragraph-function:               Filling.
+* fill-prefix:                           Margins.
+* fill-region:                           Filling.
+* fill-region-as-paragraph:              Filling.
+* fillarray:                             Array Functions.
+* filling a paragraph:                   Filling.
+* filling, automatic:                    Auto Filling.
+* filling, explicit:                     Filling.
+* filter function:                       Filter Functions.
+* find-backup-file-name:                 Backup Names.
+* find-buffer-file-type:                 Files and MS-DOS.
+* find-charset:                          Basic Charset Functions.
+* find-charset-region:                   MULE Characters.
+* find-charset-string:                   MULE Characters.
+* find-coding-system:                    Basic Coding System Functions.
+* find-file:                             Visiting Functions.
+* find-file-binary:                      Files and MS-DOS.
+* find-file-hooks:                       Visiting Functions.
+* find-file-name-handler:                Magic File Names.
+* find-file-noselect:                    Visiting Functions.
+* find-file-not-found-hooks:             Visiting Functions.
+* find-file-other-window:                Visiting Functions.
+* find-file-read-only:                   Visiting Functions.
+* find-file-text:                        Files and MS-DOS.
+* find-menu-item:                        Modifying Menus.
+* finding files:                         Visiting Files.
+* finding windows:                       Selecting Windows.
+* first:                                 List Elements.
+* first-change-hook:                     Change Hooks.
+* fixup-whitespace:                      User-Level Deletion.
+* float:                                 Numeric Conversions.
+* float-output-format:                   Output Variables.
+* floating-point numbers, printing:      Output Variables.
+* floatp:                                Predicates on Numbers.
+* floor:                                 Numeric Conversions.
+* flow control characters:               Flow Control.
+* flush input:                           Peeking and Discarding.
+* fmakunbound:                           Function Cells.
+* focus-frame:                           Input Focus.
+* following-char:                        Near Point.
+* font instance characteristics:         Font Instance Characteristics.
+* font instance name:                    Font Instance Names.
+* font instance size:                    Font Instance Size.
+* font instance type:                    Font Instance Type.
+* font-instance-name:                    Font Instance Names.
+* font-instance-p:                       Font Instances.
+* font-instance-properties:              Font Instance Characteristics.
+* font-instance-truename:                Font Instance Names.
+* font-name:                             Font Convenience Functions.
+* font-properties:                       Font Convenience Functions.
+* font-specifier-p <1>:                  Font Specifiers.
+* font-specifier-p:                      Specifier Types.
+* font-truename:                         Font Convenience Functions.
+* fonts <1>:                             Fonts.
+* fonts:                                 Some Terms.
+* fonts available:                       Font Instance Names.
+* foo:                                   A Sample Function Description.
+* for:                                   Argument Evaluation.
+* force-cursor-redisplay:                Refresh Screen.
+* force-highlight-extent:                Extents and Events.
+* forcing redisplay:                     Waiting.
+* format:                                Formatting Strings.
+* format definition:                     Format Conversion.
+* format of keymaps:                     Format of Keymaps.
+* format of menus:                       Menu Format.
+* format of the menubar:                 Menubar Format.
+* format precision:                      Formatting Strings.
+* format specification:                  Formatting Strings.
+* format-alist:                          Format Conversion.
+* format-buffers-menu-line:              Buffers Menu.
+* format-find-file:                      Format Conversion.
+* format-insert-file:                    Format Conversion.
+* format-time-string:                    Time Conversion.
+* format-write-file:                     Format Conversion.
+* formatting strings:                    Formatting Strings.
+* formfeed:                              Character Type.
+* forms:                                 Intro Eval.
+* forward-char:                          Character Motion.
+* forward-comment:                       Parsing Expressions.
+* forward-line:                          Text Lines.
+* forward-list:                          List Motion.
+* forward-sexp:                          List Motion.
+* forward-to-indentation:                Motion by Indent.
+* forward-word:                          Word Motion.
+* fourth:                                List Elements.
+* frame:                                 Frames.
+* frame configuration:                   Frame Configurations.
+* frame hooks:                           Frame Hooks.
+* frame name:                            Frame Name.
+* frame of terminal:                     Basic Windows.
+* frame position:                        Size and Position.
+* frame size:                            Size and Position.
+* frame visibility:                      Visibility of Frames.
+* frame-device:                          Basic Device Functions.
+* frame-height:                          Size and Position.
+* frame-icon-title-format:               Frame Titles.
+* frame-iconified-p:                     Visibility of Frames.
+* frame-list:                            Finding All Frames.
+* frame-live-p:                          Deleting Frames.
+* frame-name:                            Frame Name.
+* frame-pixel-height:                    Size and Position.
+* frame-pixel-width:                     Size and Position.
+* frame-properties:                      Property Access.
+* frame-property:                        Property Access.
+* frame-root-window:                     Frames and Windows.
+* frame-selected-window:                 Frames and Windows.
+* frame-title-format:                    Frame Titles.
+* frame-top-window:                      Frames and Windows.
+* frame-totally-visible-p:               Visibility of Frames.
+* frame-visible-p:                       Visibility of Frames.
+* frame-width:                           Size and Position.
+* framep:                                Frames.
+* free list:                             Garbage Collection.
+* frequency counts:                      Coverage Testing.
+* fround:                                Rounding Operations.
+* fset:                                  Function Cells.
+* ftp-login:                             Cleanups.
+* ftruncate:                             Rounding Operations.
+* funcall:                               Calling Functions.
+* funcall, and debugging:                Internals of Debugger.
+* function <1>:                          Anonymous Functions.
+* function:                              What Is a Function.
+* function call:                         Function Forms.
+* function call debugging:               Function Debugging.
+* function cell:                         Symbol Components.
+* function cell in autoload:             Autoload.
+* function definition:                   Function Names.
+* function descriptions:                 A Sample Function Description.
+* function form evaluation:              Function Forms.
+* function input stream:                 Input Streams.
+* function invocation:                   Calling Functions.
+* function name:                         Function Names.
+* function output stream:                Output Streams.
+* function quoting:                      Anonymous Functions.
+* function-interactive:                  Using Interactive.
+* function-key-map:                      Translating Input.
+* function-obsoleteness-doc:             Obsoleteness.
+* functionals:                           Calling Functions.
+* functions in modes:                    Major Mode Conventions.
+* functions, making them interactive:    Defining Commands.
+* Fundamental mode:                      Major Modes.
+* fundamental-mode:                      Auto Major Mode.
+* fundamental-mode-abbrev-table:         Standard Abbrev Tables.
+* garbage collector:                     Garbage Collection.
+* garbage-collect:                       Garbage Collection.
+* gc-cons-threshold:                     Garbage Collection.
+* gc-message:                            Garbage Collection.
+* gc-pointer-glyph <1>:                  Garbage Collection.
+* gc-pointer-glyph:                      Mouse Pointer.
+* generate-new-buffer:                   Creating Buffers.
+* generate-new-buffer-name:              Buffer Names.
+* generic-specifier-p:                   Specifier Types.
+* get:                                   Object Plists.
+* get-buffer:                            Buffer Names.
+* get-buffer-create:                     Creating Buffers.
+* get-buffer-process:                    Process Buffers.
+* get-buffer-window:                     Buffers and Windows.
+* get-char-property:                     Examining Properties.
+* get-char-table:                        Working With Char Tables.
+* get-charset:                           Basic Charset Functions.
+* get-coding-system:                     Basic Coding System Functions.
+* get-database:                          Working With a Database.
+* get-file-buffer:                       Buffer File Name.
+* get-largest-window:                    Selecting Windows.
+* get-lru-window:                        Selecting Windows.
+* get-process:                           Process Information.
+* get-range-char-table:                  Working With Char Tables.
+* get-range-table:                       Working With Range Tables.
+* get-register:                          Registers.
+* get-text-property:                     Examining Properties.
+* get-tooltalk-message-attribute:        Elisp Interface for Sending Messages.
+* getenv:                                System Environment.
+* getf:                                  Other Plists.
+* gethash:                               Working With Hash Tables.
+* gettext:                               Level 3 Primitives.
+* global binding:                        Local Variables.
+* global break condition:                Global Break Condition.
+* global keymap:                         Active Keymaps.
+* global mark ring:                      The Mark.
+* global variable:                       Global Variables.
+* global-abbrev-table:                   Standard Abbrev Tables.
+* global-key-binding:                    Functions for Key Lookup.
+* global-map:                            Active Keymaps.
+* global-mark-ring:                      The Mark.
+* global-mode-string:                    Modeline Variables.
+* global-popup-menu:                     Pop-Up Menus.
+* global-set-key:                        Key Binding Commands.
+* global-unset-key:                      Key Binding Commands.
+* glyph type:                            Glyph Type.
+* glyph-ascent:                          Glyph Dimensions.
+* glyph-baseline:                        Glyph Convenience Functions.
+* glyph-baseline-instance:               Glyph Convenience Functions.
+* glyph-contrib-p:                       Glyph Convenience Functions.
+* glyph-contrib-p-instance:              Glyph Convenience Functions.
+* glyph-descent:                         Glyph Dimensions.
+* glyph-face:                            Glyph Convenience Functions.
+* glyph-height:                          Glyph Dimensions.
+* glyph-image:                           Glyph Convenience Functions.
+* glyph-image-instance:                  Glyph Convenience Functions.
+* glyph-property:                        Glyph Properties.
+* glyph-property-instance:               Glyph Properties.
+* glyph-type:                            Glyph Types.
+* glyph-type-list:                       Glyph Types.
+* glyph-width:                           Glyph Dimensions.
+* glyphp:                                Glyphs.
+* glyphs:                                Glyphs.
+* goto-char:                             Character Motion.
+* goto-line:                             Text Lines.
+* gutter:                                Gutter.
+* gutter-buttons-captioned-p:            Other Gutter Variables.
+* gutter-make-button-list:               Gutter Descriptor Format.
+* gutter-specifier-p:                    Specifying a Gutter.
+* hack-local-variables:                  Auto Major Mode.
+* handling errors:                       Handling Errors.
+* hash notation:                         Printed Representation.
+* hash table:                            Hash Tables.
+* hash table type:                       Hash Table Type.
+* hash table, weak:                      Weak Hash Tables.
+* hash-table-count:                      Introduction to Hash Tables.
+* hash-table-p:                          Hash Tables.
+* hash-table-rehash-size:                Introduction to Hash Tables.
+* hash-table-rehash-threshold:           Introduction to Hash Tables.
+* hash-table-size:                       Introduction to Hash Tables.
+* hash-table-test:                       Introduction to Hash Tables.
+* hash-table-weakness:                   Introduction to Hash Tables.
+* hashing:                               Creating Symbols.
+* header comments:                       Library Headers.
+* help for major mode:                   Mode Help.
+* help-char:                             Help Functions.
+* help-command:                          Help Functions.
+* help-form:                             Help Functions.
+* help-map <1>:                          Standard Keymaps.
+* help-map:                              Help Functions.
+* Helper-describe-bindings:              Help Functions.
+* Helper-help:                           Help Functions.
+* Helper-help-map:                       Standard Keymaps.
+* hide-annotation:                       Annotation Properties.
+* highlight-extent:                      Extents and Events.
+* history list:                          Minibuffer History.
+* history of commands:                   Command History.
+* HOME environment variable:             Subprocess Creation.
+* hooks:                                 Hooks.
+* hooks for loading:                     Hooks for Loading.
+* hooks for text changes:                Change Hooks.
+* horizontal position:                   Columns.
+* horizontal scrolling:                  Horizontal Scrolling.
+* hscroll-glyph:                         Redisplay Glyphs.
+* icon-glyph-p:                          Glyph Types.
+* iconified frame:                       Visibility of Frames.
+* iconify-frame:                         Visibility of Frames.
+* identity:                              Calling Functions.
+* IEEE floating point:                   Float Basics.
+* if:                                    Conditionals.
+* ignore:                                Calling Functions.
+* ignored-local-variables:               Auto Major Mode.
+* image instance type:                   Image Instance Type.
+* image instance types:                  Image Instance Types.
+* image instances:                       Image Instances.
+* image instantiator conversion:         Image Instantiator Conversion.
+* image specifiers:                      Image Specifiers.
+* image-instance-background:             Image Instance Functions.
+* image-instance-depth:                  Image Instance Functions.
+* image-instance-file-name:              Image Instance Functions.
+* image-instance-foreground:             Image Instance Functions.
+* image-instance-height:                 Image Instance Functions.
+* image-instance-hotspot-x:              Image Instance Functions.
+* image-instance-hotspot-y:              Image Instance Functions.
+* image-instance-mask-file-name:         Image Instance Functions.
+* image-instance-name:                   Image Instance Functions.
+* image-instance-p:                      Image Instances.
+* image-instance-string:                 Image Instance Functions.
+* image-instance-type:                   Image Instance Types.
+* image-instance-type-list:              Image Instance Types.
+* image-instance-width:                  Image Instance Functions.
+* image-instantiator-format-list:        Image Specifiers.
+* image-specifier-p <1>:                 Image Specifiers.
+* image-specifier-p:                     Specifier Types.
+* implicit progn:                        Sequencing.
+* inc:                                   Simple Macro.
+* indent-according-to-mode:              Mode-Specific Indent.
+* indent-code-rigidly:                   Region Indent.
+* indent-for-tab-command:                Mode-Specific Indent.
+* indent-line-function:                  Mode-Specific Indent.
+* indent-region:                         Region Indent.
+* indent-region-function:                Region Indent.
+* indent-relative:                       Relative Indent.
+* indent-relative-maybe:                 Relative Indent.
+* indent-rigidly:                        Region Indent.
+* indent-tabs-mode:                      Primitive Indent.
+* indent-to:                             Primitive Indent.
+* indent-to-left-margin:                 Margins.
+* indentation:                           Indentation.
+* indenting with parentheses:            Parsing Expressions.
+* indirect buffers:                      Indirect Buffers.
+* indirect specifications:               Specification List.
+* indirect variables:                    Variable Aliases.
+* indirect-function:                     Function Indirection.
+* indirect-variable:                     Variable Aliases.
+* indirection:                           Function Indirection.
+* infinite loops:                        Infinite Loops.
+* infinite recursion:                    Local Variables.
+* infinity:                              Float Basics.
+* Info-edit-map:                         Standard Keymaps.
+* Info-minibuffer-history:               Minibuffer History.
+* Info-mode-map:                         Standard Keymaps.
+* inherit:                               Syntax Class Table.
+* inheriting a keymap's bindings:        Inheritance and Keymaps.
+* inhibit-default-init:                  Init File.
+* inhibit-file-name-handlers:            Magic File Names.
+* inhibit-file-name-operation:           Magic File Names.
+* inhibit-quit:                          Quitting.
+* inhibit-read-only:                     Read Only Buffers.
+* inhibit-startup-echo-area-message:     Start-up Summary.
+* inhibit-startup-message:               Start-up Summary.
+* init file:                             Init File.
+* initial-frame-plist:                   Initial Properties.
+* initial-gutter-spec:                   Other Gutter Variables.
+* initial-major-mode:                    Auto Major Mode.
+* initial-toolbar-spec:                  Other Toolbar Variables.
+* initialization:                        Start-up Summary.
+* inline functions:                      Inline Functions.
+* innermost containing parentheses:      Parsing Expressions.
+* input events:                          Events.
+* input focus:                           Input Focus.
+* input modes:                           Input Modes.
+* input stream:                          Input Streams.
+* input-pending-p:                       Peeking and Discarding.
+* insert:                                Insertion.
+* insert-abbrev-table-description:       Abbrev Tables.
+* insert-before-markers:                 Insertion.
+* insert-buffer:                         Commands for Insertion.
+* insert-buffer-substring:               Insertion.
+* insert-char:                           Insertion.
+* insert-default-directory:              Reading File Names.
+* insert-directory:                      Contents of Directories.
+* insert-directory-program:              Contents of Directories.
+* insert-extent:                         Detached Extents.
+* insert-file-contents:                  Reading from Files.
+* insert-register:                       Registers.
+* insert-string:                         Insertion.
+* inserting killed text:                 Yank Commands.
+* insertion before point:                Insertion.
+* insertion of text:                     Insertion.
+* inside comment:                        Parsing Expressions.
+* inside margin:                         Annotation Basics.
+* inside string:                         Parsing Expressions.
+* inst-list (in a specifier):            Specifiers In-Depth.
+* inst-pair (in a specifier):            Specifiers In-Depth.
+* installation-directory:                System Environment.
+* instance (in a specifier):             Specifiers In-Depth.
+* instancing (in a specifier):           Specifiers In-Depth.
+* instantiator (in a specifier):         Specifiers In-Depth.
+* int-char:                              Character Codes.
+* int-to-string:                         String Conversion.
+* integer to decimal:                    String Conversion.
+* integer to hexadecimal:                Formatting Strings.
+* integer to octal:                      Formatting Strings.
+* integer to string:                     String Conversion.
+* integer-char-or-marker-p:              Predicates on Markers.
+* integer-or-char-p:                     Predicates for Characters.
+* integer-or-marker-p:                   Predicates on Markers.
+* integer-specifier-p:                   Specifier Types.
+* integerp:                              Predicates on Numbers.
+* integers:                              Numbers.
+* interactive:                           Using Interactive.
+* interactive call:                      Interactive Call.
+* interactive code description:          Interactive Codes.
+* interactive commands (Edebug):         Instrumenting.
+* interactive completion:                Interactive Codes.
+* interactive function:                  Defining Commands.
+* interactive, examples of using:        Interactive Examples.
+* interactive-p:                         Interactive Call.
+* intern:                                Creating Symbols.
+* intern-soft:                           Creating Symbols.
+* internal-doc-file-name:                Accessing Documentation.
+* interning:                             Creating Symbols.
+* interpreter:                           Evaluation.
+* interpreter-mode-alist:                Auto Major Mode.
+* interprogram-cut-function:             Low-Level Kill Ring.
+* interprogram-paste-function:           Low-Level Kill Ring.
+* interrupt-process:                     Signals to Processes.
+* invalid function:                      Function Indirection.
+* invalid prefix key error:              Changing Key Bindings.
+* invalid-function:                      Function Indirection.
+* invalid-read-syntax:                   Printed Representation.
+* invalid-regexp:                        Syntax of Regexps.
+* invert-face:                           Other Face Display Functions.
+* invisible frame:                       Visibility of Frames.
+* invisible text:                        Invisible Text.
+* invisible-text-glyph:                  Redisplay Glyphs.
+* invocation-directory:                  System Environment.
+* invocation-name:                       System Environment.
+* isearch-mode-map:                      Standard Keymaps.
+* ISO Latin 1:                           Case Tables.
+* ISO Latin-1 characters (input):        Translating Input.
+* iso-syntax:                            Case Tables.
+* iso-transl:                            Translating Input.
+* italic:                                Font Instance Characteristics.
+* iteration:                             Iteration.
+* itimer-edit-map:                       Standard Keymaps.
+* joining lists:                         Rearrangement.
+* just-one-space:                        User-Level Deletion.
+* justify-current-line:                  Filling.
+* kept-new-versions:                     Numbered Backups.
+* kept-old-versions:                     Numbered Backups.
+* key:                                   Keymap Terminology.
+* key binding:                           Keymap Terminology.
+* key lookup:                            Key Lookup.
+* key sequence:                          Key Sequence Input.
+* key sequence error:                    Changing Key Bindings.
+* key sequence input:                    Key Sequence Input.
+* key sequences:                         Key Sequences.
+* key translation function:              Translating Input.
+* key-binding:                           Functions for Key Lookup.
+* key-description:                       Describing Characters.
+* key-press-event-p:                     Event Predicates.
+* key-translation-map:                   Translating Input.
+* keyboard macro execution:              Interactive Call.
+* keyboard macro termination:            Beeping.
+* keyboard macros:                       Keyboard Macros.
+* keyboard macros (Edebug):              Edebug Execution Modes.
+* keyboard menu accelerators:            Menu Accelerators.
+* keyboard-quit:                         Quitting.
+* keymap:                                Keymaps.
+* keymap entry:                          Key Lookup.
+* keymap format:                         Format of Keymaps.
+* keymap in keymap:                      Key Lookup.
+* keymap inheritance:                    Inheritance and Keymaps.
+* keymap parent:                         Inheritance and Keymaps.
+* keymap-default-binding:                Inheritance and Keymaps.
+* keymap-fullness:                       Scanning Keymaps.
+* keymap-name:                           Creating Keymaps.
+* keymap-parents:                        Inheritance and Keymaps.
+* keymap-prompt:                         Other Keymap Functions.
+* keymapp:                               Format of Keymaps.
+* keymaps in modes:                      Major Mode Conventions.
+* keys in documentation strings:         Keys in Documentation.
+* keystroke:                             Keymap Terminology.
+* keystroke command:                     What Is a Function.
+* keywordp:                              Specification List.
+* kill command repetition:               Command Loop Info.
+* kill ring:                             The Kill Ring.
+* kill-all-local-variables:              Creating Buffer-Local.
+* kill-append:                           Low-Level Kill Ring.
+* kill-buffer:                           Killing Buffers.
+* kill-buffer-hook:                      Killing Buffers.
+* kill-buffer-query-functions:           Killing Buffers.
+* kill-emacs:                            Killing XEmacs.
+* kill-emacs-hook:                       Killing XEmacs.
+* kill-emacs-query-functions:            Killing XEmacs.
+* kill-local-variable:                   Creating Buffer-Local.
+* kill-new:                              Low-Level Kill Ring.
+* kill-process:                          Signals to Processes.
+* kill-region:                           Kill Functions.
+* kill-ring:                             Internals of Kill Ring.
+* kill-ring-max:                         Internals of Kill Ring.
+* kill-ring-yank-pointer:                Internals of Kill Ring.
+* killing buffers:                       Killing Buffers.
+* killing XEmacs:                        Killing XEmacs.
+* lambda expression:                     Lambda Expressions.
+* lambda expression in hook:             Hooks.
+* lambda in debug:                       Invoking the Debugger.
+* lambda in keymap:                      Key Lookup.
+* lambda list:                           Lambda Components.
+* lambda-list (Edebug):                  Specification List.
+* lambda-list-keywordp:                  Specification List.
+* last-abbrev:                           Abbrev Expansion.
+* last-abbrev-location:                  Abbrev Expansion.
+* last-abbrev-text:                      Abbrev Expansion.
+* last-command:                          Command Loop Info.
+* last-command-char:                     Command Loop Info.
+* last-command-event:                    Command Loop Info.
+* last-input-char:                       Peeking and Discarding.
+* last-input-event:                      Peeking and Discarding.
+* last-kbd-macro:                        Keyboard Macros.
+* Latin-1 character set (input):         Translating Input.
+* lax-plist-get:                         Working With Lax Plists.
+* lax-plist-member:                      Working With Lax Plists.
+* lax-plist-put:                         Working With Lax Plists.
+* lax-plist-remprop:                     Working With Lax Plists.
+* lax-plists-eq:                         Working With Lax Plists.
+* lax-plists-equal:                      Working With Lax Plists.
+* layout policy:                         Annotation Basics.
+* layout types:                          Annotation Basics.
+* lazy loading:                          Dynamic Loading.
+* LDAP:                                  LDAP Support.
+* ldap-close:                            Opening and Closing a LDAP Connection.
+* ldap-default-base:                     LDAP Variables.
+* ldap-default-host:                     LDAP Variables.
+* ldap-default-port:                     LDAP Variables.
+* ldap-host:                             The LDAP Lisp Object.
+* ldap-host-parameters-alist:            LDAP Variables.
+* ldap-live-p:                           The LDAP Lisp Object.
+* ldap-open:                             Opening and Closing a LDAP Connection.
+* ldap-search:                           The High-Level LDAP API.
+* ldap-search-internal:                  Searching on a LDAP Server (Low-level).
+* ldapp:                                 The LDAP Lisp Object.
+* left-gutter:                           Specifying a Gutter.
+* left-gutter-visible-p:                 Other Gutter Variables.
+* left-gutter-width:                     Other Gutter Variables.
+* left-margin:                           Margins.
+* left-margin-width:                     Margin Primitives.
+* left-toolbar:                          Specifying the Toolbar.
+* left-toolbar-visible-p:                Other Toolbar Variables.
+* left-toolbar-width:                    Other Toolbar Variables.
+* length:                                Sequence Functions.
+* let:                                   Local Variables.
+* let*:                                  Local Variables.
+* let-specifier:                         Adding Specifications.
+* lexical binding (Edebug):              Edebug Eval.
+* lexical comparison:                    Text Comparison.
+* library:                               Loading.
+* library compilation:                   Compilation Functions.
+* library header comments:               Library Headers.
+* line wrapping:                         Truncation.
+* lines:                                 Text Lines.
+* lines in region:                       Text Lines.
+* linking files:                         Changing File Attributes.
+* Lisp debugger:                         Debugger.
+* Lisp expression motion:                List Motion.
+* Lisp history:                          Lisp History.
+* Lisp library:                          Loading.
+* Lisp nesting error:                    Eval.
+* Lisp object:                           Lisp Data Types.
+* Lisp printer:                          Output Functions.
+* Lisp reader:                           Streams Intro.
+* lisp-interaction-mode-map:             Standard Keymaps.
+* lisp-mode-abbrev-table:                Standard Abbrev Tables.
+* lisp-mode-map:                         Standard Keymaps.
+* lisp-mode.el:                          Example Major Modes.
+* list <1>:                              Building Lists.
+* list:                                  Lists.
+* list elements:                         List Elements.
+* list form evaluation:                  Classifying Lists.
+* list in keymap:                        Key Lookup.
+* list length:                           Sequence Functions.
+* list motion:                           List Motion.
+* list structure:                        Cons Cells.
+* list-buffers:                          The Buffer List.
+* list-buffers-directory:                Buffer File Name.
+* list-fonts:                            Font Instance Names.
+* list-processes:                        Process Information.
+* listp:                                 List-related Predicates.
+* lists and cons cells:                  Cons Cells.
+* lists as sets:                         Sets And Lists.
+* lists represented as boxes:            Lists as Boxes.
+* literal evaluation:                    Self-Evaluating Forms.
+* lmessage:                              The Echo Area.
+* ln:                                    Changing File Attributes.
+* load:                                  How Programs Do Loading.
+* load error with require:               Named Features.
+* load errors:                           How Programs Do Loading.
+* load-average:                          System Environment.
+* load-default-sounds:                   Beeping.
+* load-history:                          Unloading.
+* load-ignore-elc-files:                 How Programs Do Loading.
+* load-in-progress:                      How Programs Do Loading.
+* load-path:                             How Programs Do Loading.
+* load-read-function:                    How Programs Do Loading.
+* load-sound-file:                       Beeping.
+* load-warn-when-source-newer:           How Programs Do Loading.
+* load-warn-when-source-only:            How Programs Do Loading.
+* loading:                               Loading.
+* loading hooks:                         Hooks for Loading.
+* loadup.el:                             Building XEmacs.
+* local binding:                         Local Variables.
+* local keymap:                          Active Keymaps.
+* local variables:                       Local Variables.
+* local-abbrev-table:                    Standard Abbrev Tables.
+* local-key-binding:                     Functions for Key Lookup.
+* local-set-key:                         Key Binding Commands.
+* local-unset-key:                       Key Binding Commands.
+* local-variable-p:                      Creating Buffer-Local.
+* local-write-file-hooks:                Saving Buffers.
+* locale (in a specifier):               Specifiers In-Depth.
+* locate-file:                           How Programs Do Loading.
+* locate-file-clear-hashing:             How Programs Do Loading.
+* lock-buffer:                           File Locks.
+* log:                                   Math Functions.
+* log-message-ignore-labels:             The Echo Area.
+* log-message-ignore-regexps:            The Echo Area.
+* log-message-max-size:                  The Echo Area.
+* log-warning-minimum-level:             Warnings.
+* log-warning-suppressed-classes:        Warnings.
+* log10:                                 Math Functions.
+* logand:                                Bitwise Operations.
+* logb:                                  Float Basics.
+* logical and:                           Bitwise Operations.
+* logical exclusive or:                  Bitwise Operations.
+* logical inclusive or:                  Bitwise Operations.
+* logical not:                           Bitwise Operations.
+* logical shift:                         Bitwise Operations.
+* logior:                                Bitwise Operations.
+* lognot:                                Bitwise Operations.
+* logxor:                                Bitwise Operations.
+* looking-at:                            Regexp Search.
+* lookup-key:                            Functions for Key Lookup.
+* loops, infinite:                       Infinite Loops.
+* lower case:                            Character Case.
+* lower-frame:                           Raising and Lowering.
+* lowering a frame:                      Raising and Lowering.
+* lsh:                                   Bitwise Operations.
+* lwarn:                                 Warnings.
+* M-x:                                   Interactive Call.
+* Maclisp:                               Lisp History.
+* macro:                                 What Is a Function.
+* macro argument evaluation:             Argument Evaluation.
+* macro call:                            Expansion.
+* macro call evaluation:                 Macro Forms.
+* macro compilation:                     Compilation Functions.
+* macro descriptions:                    A Sample Function Description.
+* macro expansion:                       Expansion.
+* macroexpand:                           Expansion.
+* macros:                                Macros.
+* magic file names:                      Magic File Names.
+* mail-host-address:                     System Environment.
+* major mode:                            Major Modes.
+* major mode hook:                       Major Mode Conventions.
+* major mode keymap:                     Active Keymaps.
+* major-mode:                            Mode Help.
+* make-abbrev-table:                     Abbrev Tables.
+* make-annotation:                       Annotation Primitives.
+* make-auto-save-file-name:              Auto-Saving.
+* make-backup-file-name:                 Backup Names.
+* make-backup-files:                     Making Backups.
+* make-bit-vector:                       Bit Vector Functions.
+* make-byte-code:                        Compiled-Function Objects.
+* make-char:                             MULE Characters.
+* make-char-table:                       Working With Char Tables.
+* make-charset:                          Basic Charset Functions.
+* make-coding-system:                    Basic Coding System Functions.
+* make-composite-char:                   Composite Characters.
+* make-device:                           Connecting to a Console or Device.
+* make-directory:                        Create/Delete Dirs.
+* make-display-table:                    Display Table Format.
+* make-event:                            Working With Events.
+* make-extent:                           Creating and Modifying Extents.
+* make-face:                             Basic Face Functions.
+* make-file-part:                        Creating a Partial File.
+* make-font-instance:                    Font Instances.
+* make-frame:                            Creating Frames.
+* make-frame-invisible:                  Visibility of Frames.
+* make-frame-visible:                    Visibility of Frames.
+* make-glyph:                            Creating Glyphs.
+* make-glyph-internal:                   Creating Glyphs.
+* make-hash-table:                       Introduction to Hash Tables.
+* make-icon-glyph:                       Creating Glyphs.
+* make-image-instance:                   Image Instance Functions.
+* make-image-specifier:                  Image Specifiers.
+* make-indirect-buffer:                  Indirect Buffers.
+* make-keymap:                           Creating Keymaps.
+* make-list:                             Building Lists.
+* make-local-hook:                       Hooks.
+* make-local-variable:                   Creating Buffer-Local.
+* make-marker:                           Creating Markers.
+* make-obsolete:                         Obsoleteness.
+* make-obsolete-variable:                Obsoleteness.
+* make-pointer-glyph:                    Creating Glyphs.
+* make-range-table:                      Introduction to Range Tables.
+* make-reverse-direction-charset:        Basic Charset Functions.
+* make-sparse-keymap:                    Creating Keymaps.
+* make-specifier:                        Creating Specifiers.
+* make-specifier-and-init:               Creating Specifiers.
+* make-string:                           Creating Strings.
+* make-symbol:                           Creating Symbols.
+* make-symbolic-link:                    Changing File Attributes.
+* make-syntax-table:                     Syntax Table Functions.
+* make-temp-name:                        Unique File Names.
+* make-tooltalk-message:                 Elisp Interface for Sending Messages.
+* make-tooltalk-pattern:                 Elisp Interface for Receiving Messages.
+* make-tty-device:                       Connecting to a Console or Device.
+* make-variable-buffer-local:            Creating Buffer-Local.
+* make-vector:                           Vector Functions.
+* make-weak-list:                        Weak Lists.
+* make-x-device:                         Connecting to a Console or Device.
+* makunbound:                            Void Variables.
+* Manual-page-minibuffer-history:        Minibuffer History.
+* map-char-table:                        Working With Char Tables.
+* map-database:                          Working With a Database.
+* map-extent-children:                   Mapping Over Extents.
+* map-extents:                           Mapping Over Extents.
+* map-frame-hook:                        Frame Hooks.
+* map-keymap:                            Scanning Keymaps.
+* map-range-table:                       Working With Range Tables.
+* map-specifier:                         Other Specification Functions.
+* map-y-or-n-p:                          Multiple Queries.
+* mapatoms:                              Creating Symbols.
+* mapcar:                                Mapping Functions.
+* mapcar-extents:                        Mapping Over Extents.
+* mapconcat:                             Mapping Functions.
+* maphash:                               Working With Hash Tables.
+* mapping functions:                     Mapping Functions.
+* margin:                                Annotation Basics.
+* margin width:                          Margin Primitives.
+* mark:                                  The Mark.
+* mark excursion:                        Excursions.
+* mark ring:                             The Mark.
+* mark, the:                             The Mark.
+* mark-marker:                           The Mark.
+* mark-ring:                             The Mark.
+* mark-ring-max:                         The Mark.
+* marker argument:                       Interactive Codes.
+* marker garbage collection:             Overview of Markers.
+* marker input stream:                   Input Streams.
+* marker output stream:                  Output Streams.
+* marker relocation:                     Overview of Markers.
+* marker-buffer:                         Information from Markers.
+* marker-position:                       Information from Markers.
+* markerp:                               Predicates on Markers.
+* markers:                               Markers.
+* markers as numbers:                    Overview of Markers.
+* markers vs. extents:                   Overview of Markers.
+* match data:                            Match Data.
+* match-beginning:                       Simple Match Data.
+* match-data:                            Entire Match Data.
+* match-end:                             Simple Match Data.
+* match-string:                          Simple Match Data.
+* mathematical functions:                Math Functions.
+* max:                                   Comparison of Numbers.
+* max-lisp-eval-depth:                   Eval.
+* max-specpdl-size:                      Local Variables.
+* md5:                                   Transformations.
+* MD5 digests:                           Transformations.
+* member:                                Sets And Lists.
+* membership in a list:                  Sets And Lists.
+* memory allocation:                     Garbage Collection.
+* memory-limit:                          Garbage Collection.
+* memq:                                  Sets And Lists.
+* menu:                                  Menus.
+* menu accelerators:                     Menu Accelerators.
+* menu filters:                          Menu Filters.
+* menu format:                           Menu Format.
+* menu-accelerator-enabled:              Menu Accelerator Functions.
+* menu-accelerator-map:                  Menu Accelerator Functions.
+* menu-accelerator-modifiers:            Menu Accelerator Functions.
+* menu-accelerator-prefix:               Menu Accelerator Functions.
+* menu-no-selection-hook:                Menubar.
+* menubar:                               Menubar.
+* menubar format:                        Menubar Format.
+* menubar-configuration:                 Menu Format.
+* menubar-pointer-glyph:                 Mouse Pointer.
+* menubar-show-keybindings:              Menubar.
+* message:                               The Echo Area.
+* meta character printing:               Describing Characters.
+* meta-prefix-char:                      Functions for Key Lookup.
+* min:                                   Comparison of Numbers.
+* minibuffer:                            Minibuffers.
+* minibuffer history:                    Minibuffer History.
+* minibuffer input:                      Recursive Editing.
+* minibuffer window:                     Cyclic Window Ordering.
+* minibuffer-complete:                   Completion Commands.
+* minibuffer-complete-and-exit:          Completion Commands.
+* minibuffer-complete-word:              Completion Commands.
+* minibuffer-completion-confirm:         Completion Commands.
+* minibuffer-completion-help:            Completion Commands.
+* minibuffer-completion-predicate:       Completion Commands.
+* minibuffer-completion-table:           Completion Commands.
+* minibuffer-depth:                      Minibuffer Misc.
+* minibuffer-exit-hook:                  Minibuffer Misc.
+* minibuffer-frame-plist:                Initial Properties.
+* minibuffer-help-form:                  Minibuffer Misc.
+* minibuffer-history:                    Minibuffer History.
+* minibuffer-local-completion-map <1>:   Standard Keymaps.
+* minibuffer-local-completion-map:       Completion Commands.
+* minibuffer-local-isearch-map:          Standard Keymaps.
+* minibuffer-local-map <1>:              Standard Keymaps.
+* minibuffer-local-map:                  Text from Minibuffer.
+* minibuffer-local-must-match-map <1>:   Standard Keymaps.
+* minibuffer-local-must-match-map:       Completion Commands.
+* minibuffer-prompt:                     Minibuffer Misc.
+* minibuffer-prompt-width:               Minibuffer Misc.
+* minibuffer-scroll-window:              Minibuffer Misc.
+* minibuffer-setup-hook:                 Minibuffer Misc.
+* minibuffer-window:                     Minibuffer Misc.
+* minibuffer-window-active-p:            Minibuffer Misc.
+* minimum window size:                   Resizing Windows.
+* minor mode:                            Minor Modes.
+* minor mode conventions:                Minor Mode Conventions.
+* minor-mode-alist:                      Modeline Variables.
+* minor-mode-key-binding:                Functions for Key Lookup.
+* minor-mode-map-alist:                  Active Keymaps.
+* misc-user-event-p:                     Event Predicates.
+* mod:                                   Arithmetic Operations.
+* mode:                                  Modes.
+* mode help:                             Mode Help.
+* mode hook:                             Major Mode Conventions.
+* mode loading:                          Major Mode Conventions.
+* mode variable:                         Minor Mode Conventions.
+* mode-class property:                   Major Mode Conventions.
+* mode-name:                             Modeline Variables.
+* mode-popup-menu:                       Pop-Up Menus.
+* mode-specific-map <1>:                 Standard Keymaps.
+* mode-specific-map:                     Prefix Keys.
+* modeline:                              Modeline Format.
+* modeline construct:                    Modeline Data.
+* modeline-buffer-identification:        Modeline Variables.
+* modeline-format:                       Modeline Data.
+* modeline-map <1>:                      Standard Keymaps.
+* modeline-map:                          Active Keymaps.
+* modeline-modified:                     Modeline Variables.
+* modeline-pointer-glyph:                Mouse Pointer.
+* modeline-process:                      Modeline Variables.
+* modification flag (of buffer):         Buffer Modification.
+* modification of lists:                 Rearrangement.
+* modification time, comparison of:      Modification Time.
+* modify-syntax-entry:                   Syntax Table Functions.
+* modulus:                               Arithmetic Operations.
+* momentary-string-display:              Temporary Displays.
+* mono-pixmap-image-instance-p:          Image Instance Types.
+* motion-event-p:                        Event Predicates.
+* mouse cursor:                          Mouse Pointer.
+* mouse pointer:                         Mouse Pointer.
+* mouse-event-p:                         Event Predicates.
+* mouse-grabbed-buffer:                  Active Keymaps.
+* mouse-highlight-priority:              Extents and Events.
+* move-marker:                           Changing Markers.
+* move-to-column:                        Columns.
+* move-to-left-margin:                   Margins.
+* move-to-window-line:                   Screen Lines.
+* MS-DOS and file modes:                 Changing File Attributes.
+* MS-DOS file types:                     Files and MS-DOS.
+* MSWindows OLE:                         MSWindows OLE.
+* multilingual string formatting:        Formatting Strings.
+* multiple windows:                      Basic Windows.
+* named function:                        Function Names.
+* NaN:                                   Float Basics.
+* narrow-to-page:                        Narrowing.
+* narrow-to-region:                      Narrowing.
+* narrowing:                             Narrowing.
+* natnum-specifier-p:                    Specifier Types.
+* natnump:                               Predicates on Numbers.
+* natural numbers:                       Predicates on Numbers.
+* nconc:                                 Rearrangement.
+* negative infinity:                     Float Basics.
+* negative-argument:                     Prefix Command Arguments.
+* network connection:                    Network.
+* new file message:                      Subroutines of Visiting.
+* newline <1>:                           Commands for Insertion.
+* newline:                               Character Type.
+* newline and Auto Fill mode:            Commands for Insertion.
+* newline in print:                      Output Functions.
+* newline in strings:                    String Type.
+* newline-and-indent:                    Mode-Specific Indent.
+* next input:                            Peeking and Discarding.
+* next-command-event:                    Reading One Event.
+* next-event:                            Reading One Event.
+* next-extent:                           Finding Extents.
+* next-frame:                            Finding All Frames.
+* next-history-element:                  Minibuffer Misc.
+* next-matching-history-element:         Minibuffer Misc.
+* next-property-change:                  Property Search.
+* next-screen-context-lines:             Vertical Scrolling.
+* next-single-property-change:           Property Search.
+* next-window:                           Cyclic Window Ordering.
+* nil:                                   Constant Variables.
+* nil and lists:                         Cons Cells.
+* nil in keymap:                         Key Lookup.
+* nil in lists:                          Cons Cell Type.
+* nil input stream:                      Input Streams.
+* nil output stream:                     Output Streams.
+* nil, uses of:                          nil and t.
+* ninth:                                 List Elements.
+* nlistp:                                List-related Predicates.
+* no-catch:                              Catch and Throw.
+* no-redraw-on-reenter:                  Refresh Screen.
+* nondirectory part (of file name):      File Name Components.
+* noninteractive:                        Batch Mode.
+* noninteractive use:                    Batch Mode.
+* nonlocal exits:                        Nonlocal Exits.
+* nonprinting characters, reading:       Quoted Character Input.
+* nontext-pointer-glyph:                 Mouse Pointer.
+* normal-mode:                           Auto Major Mode.
+* not:                                   Combining Conditions.
+* not-modified:                          Buffer Modification.
+* nothing-image-instance-p:              Image Instance Types.
+* nreverse:                              Rearrangement.
+* nth:                                   List Elements.
+* nthcdr:                                List Elements.
+* null:                                  List-related Predicates.
+* number equality:                       Comparison of Numbers.
+* number-char-or-marker-p:               Predicates on Markers.
+* number-or-marker-p:                    Predicates on Markers.
+* number-to-string:                      String Conversion.
+* numberp:                               Predicates on Numbers.
+* numbers:                               Numbers.
+* numeric prefix:                        Formatting Strings.
+* numeric prefix argument:               Prefix Command Arguments.
+* numeric prefix argument usage:         Interactive Codes.
+* obarray:                               Creating Symbols.
+* obarray in completion:                 Basic Completion.
+* objc-mode-map:                         Standard Keymaps.
+* object:                                Lisp Data Types.
+* object to string:                      Output Functions.
+* object-plist:                          Object Plists.
+* oblique:                               Font Instance Characteristics.
+* obsolete buffer:                       Modification Time.
+* occur-mode-map:                        Standard Keymaps.
+* octal character code:                  Character Type.
+* octal character input:                 Quoted Character Input.
+* octal-escape-glyph:                    Redisplay Glyphs.
+* OffiX DND:                             OffiX DND.
+* old-eq:                                Equality Predicates.
+* one-window-p:                          Splitting Windows.
+* only-global-abbrevs:                   Defining Abbrevs.
+* open-database:                         Connecting to a Database.
+* open-dribble-file:                     Recording Input.
+* open-network-stream:                   Network.
+* open-termscript:                       Terminal Output.
+* open parenthesis character:            Syntax Class Table.
+* operating system environment:          System Environment.
+* option descriptions:                   A Sample Variable Description.
+* optional arguments:                    Argument List.
+* options on command line:               Command Line Arguments.
+* or:                                    Combining Conditions.
+* order of extents:                      Extent Endpoints.
+* ordering of windows, cyclic:           Cyclic Window Ordering.
+* other-buffer:                          The Buffer List.
+* other-window:                          Cyclic Window Ordering.
+* other-window-scroll-buffer:            Vertical Scrolling.
+* Outline mode:                          Substitution.
+* output from processes:                 Output from Processes.
+* output stream:                         Output Streams.
+* outside margin:                        Annotation Basics.
+* overflow:                              Integer Basics.
+* overlay arrow:                         Overlay Arrow.
+* overlay-arrow-position:                Overlay Arrow.
+* overlay-arrow-string:                  Overlay Arrow.
+* overriding-local-map <1>:              Standard Keymaps.
+* overriding-local-map:                  Active Keymaps.
+* overriding-terminal-local-map:         Active Keymaps.
+* overwrite-mode:                        Commands for Insertion.
+* padding:                               Formatting Strings.
+* page-delimiter:                        Standard Regexps.
+* paired delimiter:                      Syntax Class Table.
+* paragraph-separate:                    Standard Regexps.
+* paragraph-start:                       Standard Regexps.
+* parent of a keymap:                    Inheritance and Keymaps.
+* parent process:                        Processes.
+* parent, of extent:                     Extent Parents.
+* parenthesis:                           Cons Cell Type.
+* parenthesis depth:                     Parsing Expressions.
+* parenthesis matching:                  Blinking.
+* parenthesis syntax:                    Syntax Class Table.
+* parse state:                           Parsing Expressions.
+* parse-partial-sexp:                    Parsing Expressions.
+* parse-sexp-ignore-comments:            Parsing Expressions.
+* parsing:                               Syntax Tables.
+* partial files:                         Partial Files.
+* passwd-echo:                           Reading a Password.
+* passwd-invert-frame-when-keyboard-grabbed: Reading a Password.
+* passwords, reading:                    Reading a Password.
+* PATH environment variable:             Subprocess Creation.
+* path-separator:                        System Environment.
+* pausing:                               Waiting.
+* peeking at input:                      Peeking and Discarding.
+* percent symbol in modeline:            Modeline Data.
+* perform-replace:                       Search and Replace.
+* performance analysis:                  Coverage Testing.
+* permanent local variable:              Creating Buffer-Local.
+* permission:                            File Attributes.
+* pg-coding-system:                      libpq Lisp Variables.
+* pg:authtype:                           libpq Lisp Variables.
+* pg:client-encoding:                    libpq Lisp Variables.
+* pg:cost-heap:                          libpq Lisp Variables.
+* pg:cost-index:                         libpq Lisp Variables.
+* pg:database:                           libpq Lisp Variables.
+* pg:date-style:                         libpq Lisp Variables.
+* pg:geqo:                               libpq Lisp Variables.
+* pg:host:                               libpq Lisp Variables.
+* pg:options:                            libpq Lisp Variables.
+* pg:port:                               libpq Lisp Variables.
+* pg:realm:                              libpq Lisp Variables.
+* pg:tty:                                libpq Lisp Variables.
+* pg:tz:                                 libpq Lisp Variables.
+* pg:user:                               libpq Lisp Variables.
+* pgres::polling-active:                 libpq Lisp Symbols and DataTypes.
+* pgres::polling-failed:                 libpq Lisp Symbols and DataTypes.
+* pgres::polling-ok:                     libpq Lisp Symbols and DataTypes.
+* pgres::polling-reading:                libpq Lisp Symbols and DataTypes.
+* pgres::polling-writing:                libpq Lisp Symbols and DataTypes.
+* pipes:                                 Asynchronous Processes.
+* play-sound:                            Beeping.
+* play-sound-file:                       Beeping.
+* plist:                                 Property Lists.
+* plist, symbol:                         Symbol Properties.
+* plist-get:                             Working With Normal Plists.
+* plist-member:                          Working With Normal Plists.
+* plist-put:                             Working With Normal Plists.
+* plist-remprop:                         Working With Normal Plists.
+* plist-to-alist:                        Converting Plists To/From Alists.
+* plists-eq <1>:                         Other Plists.
+* plists-eq:                             Working With Normal Plists.
+* plists-equal <1>:                      Other Plists.
+* plists-equal:                          Working With Normal Plists.
+* point:                                 Point.
+* point excursion:                       Excursions.
+* point in window:                       Window Point.
+* point with narrowing:                  Point.
+* point-marker:                          Creating Markers.
+* point-max:                             Point.
+* point-max-marker:                      Creating Markers.
+* point-min:                             Point.
+* point-min-marker:                      Creating Markers.
+* pointer (mouse):                       Mouse Pointer.
+* pointer-glyph-p:                       Glyph Types.
+* pointer-image-instance-p:              Image Instance Types.
+* pop-global-mark:                       The Mark.
+* pop-mark:                              The Mark.
+* pop-to-buffer:                         Displaying Buffers.
+* pop-up menu:                           Pop-Up Menus.
+* pop-up-frame-function:                 Choosing Window.
+* pop-up-frame-plist:                    Choosing Window.
+* pop-up-frames:                         Choosing Window.
+* pop-up-windows:                        Choosing Window.
+* popup-buffer-menu:                     Pop-Up Menus.
+* popup-dialog-box:                      Dialog Box Functions.
+* popup-menu:                            Pop-Up Menus.
+* popup-menu-titles:                     Pop-Up Menus.
+* popup-menu-up-p:                       Pop-Up Menus.
+* popup-menubar-menu:                    Pop-Up Menus.
+* popup-mode-menu:                       Pop-Up Menus.
+* pos-visible-in-window-p:               Window Start.
+* position (in buffer):                  Positions.
+* position argument:                     Interactive Codes.
+* position in window:                    Window Point.
+* position of frame:                     Size and Position.
+* position of window:                    Position of Window.
+* positive infinity:                     Float Basics.
+* posix-looking-at:                      POSIX Regexps.
+* posix-search-backward:                 POSIX Regexps.
+* posix-search-forward:                  POSIX Regexps.
+* posix-string-match:                    POSIX Regexps.
+* post-command-hook:                     Command Overview.
+* post-gc-hook:                          Garbage Collection.
+* PostgreSQL:                            PostgreSQL Support.
+* pq-binary-tuples:                      libpq Lisp Symbols and DataTypes.
+* pq-clear:                              Other libpq Functions.
+* pq-client-encoding:                    Other libpq Functions.
+* pq-cmd-status:                         libpq Lisp Symbols and DataTypes.
+* pq-cmd-tuples:                         libpq Lisp Symbols and DataTypes.
+* pq-conn-defaults:                      Other libpq Functions.
+* pq-connect-poll:                       Asynchronous Interface Functions.
+* pq-connect-start:                      Asynchronous Interface Functions.
+* pq-connectdb:                          Synchronous Interface Functions.
+* pq-consume-input:                      Asynchronous Interface Functions.
+* pq-env-2-encoding:                     Other libpq Functions.
+* pq-exec:                               Synchronous Interface Functions.
+* pq-finish:                             Other libpq Functions.
+* pq-flush:                              Asynchronous Interface Functions.
+* pq-fmod:                               libpq Lisp Symbols and DataTypes.
+* pq-fname:                              libpq Lisp Symbols and DataTypes.
+* pq-fnumber:                            libpq Lisp Symbols and DataTypes.
+* pq-fsize:                              libpq Lisp Symbols and DataTypes.
+* pq-ftype:                              libpq Lisp Symbols and DataTypes.
+* pq-get-is-null:                        libpq Lisp Symbols and DataTypes.
+* pq-get-length:                         libpq Lisp Symbols and DataTypes.
+* pq-get-result:                         Asynchronous Interface Functions.
+* pq-get-value:                          libpq Lisp Symbols and DataTypes.
+* pq-is-busy:                            Asynchronous Interface Functions.
+* pq-is-nonblocking:                     Asynchronous Interface Functions.
+* pq-lo-close:                           Unimplemented libpq Functions.
+* pq-lo-creat:                           Unimplemented libpq Functions.
+* pq-lo-export:                          Large Object Support.
+* pq-lo-import:                          Large Object Support.
+* pq-lo-lseek:                           Unimplemented libpq Functions.
+* pq-lo-open:                            Unimplemented libpq Functions.
+* pq-lo-read:                            Unimplemented libpq Functions.
+* pq-lo-tell:                            Unimplemented libpq Functions.
+* pq-lo-unlink:                          Unimplemented libpq Functions.
+* pq-lo-write:                           Unimplemented libpq Functions.
+* pq-make-empty-pgresult:                libpq Lisp Symbols and DataTypes.
+* pq-nfields:                            libpq Lisp Symbols and DataTypes.
+* pq-notifies:                           Synchronous Interface Functions.
+* pq-ntuples:                            libpq Lisp Symbols and DataTypes.
+* pq-oid-value:                          libpq Lisp Symbols and DataTypes.
+* pq-pgconn:                             libpq Lisp Symbols and DataTypes.
+* pq-res-status:                         libpq Lisp Symbols and DataTypes.
+* pq-reset:                              Synchronous Interface Functions.
+* pq-reset-cancel:                       Asynchronous Interface Functions.
+* pq-reset-poll:                         Asynchronous Interface Functions.
+* pq-reset-start:                        Asynchronous Interface Functions.
+* pq-result-error-message:               libpq Lisp Symbols and DataTypes.
+* pq-result-status:                      libpq Lisp Symbols and DataTypes.
+* pq-send-query:                         Asynchronous Interface Functions.
+* pq-set-client-encoding:                Other libpq Functions.
+* pq-set-nonblocking:                    Asynchronous Interface Functions.
+* PQdisplayTuples:                       Unimplemented libpq Functions.
+* PQmblen:                               Unimplemented libpq Functions.
+* PQprint:                               Unimplemented libpq Functions.
+* PQprintTuples:                         Unimplemented libpq Functions.
+* PQsetenv:                              Synchronous Interface Functions.
+* PQsetenvAbort:                         Asynchronous Interface Functions.
+* PQsetenvPoll:                          Asynchronous Interface Functions.
+* PQsetenvStart:                         Asynchronous Interface Functions.
+* PQsocket:                              Unimplemented libpq Functions.
+* PQtrace:                               Unimplemented libpq Functions.
+* PQuntrace:                             Unimplemented libpq Functions.
+* pre-abbrev-expand-hook:                Abbrev Expansion.
+* pre-command-hook:                      Command Overview.
+* pre-gc-hook:                           Garbage Collection.
+* preceding-char:                        Near Point.
+* precision of formatted numbers:        Formatting Strings.
+* predicates:                            Type Predicates.
+* prefix argument:                       Prefix Command Arguments.
+* prefix argument unreading:             Peeking and Discarding.
+* prefix command:                        Prefix Keys.
+* prefix key:                            Prefix Keys.
+* prefix-arg:                            Prefix Command Arguments.
+* prefix-help-command:                   Help Functions.
+* prefix-numeric-value:                  Prefix Command Arguments.
+* preventing backtracking:               Specification List.
+* preventing prefix key:                 Key Lookup.
+* previous complete subexpression:       Parsing Expressions.
+* previous-extent:                       Finding Extents.
+* previous-frame:                        Finding All Frames.
+* previous-history-element:              Minibuffer Misc.
+* previous-matching-history-element:     Minibuffer Misc.
+* previous-property-change:              Property Search.
+* previous-single-property-change:       Property Search.
+* previous-window:                       Cyclic Window Ordering.
+* primitive:                             What Is a Function.
+* primitive type:                        Lisp Data Types.
+* primitive types:                       Primitive Types.
+* primitive-undo:                        Undo.
+* prin1:                                 Output Functions.
+* prin1-to-string:                       Output Functions.
+* princ:                                 Output Functions.
+* print:                                 Output Functions.
+* print example:                         Output Streams.
+* print name cell:                       Symbol Components.
+* print-escape-newlines:                 Output Variables.
+* print-gensym:                          Output Variables.
+* print-help-return-message:             Help Functions.
+* print-length:                          Output Variables.
+* print-level:                           Output Variables.
+* print-readably <1>:                    Output Variables.
+* print-readably:                        Printing in Edebug.
+* print-string-length:                   Output Variables.
+* printed representation:                Printed Representation.
+* printed representation for characters: Character Type.
+* printing:                              Streams Intro.
+* printing (Edebug):                     Printing in Edebug.
+* printing circular structures:          Printing in Edebug.
+* printing floating-point numbers:       Output Variables.
+* printing limits:                       Output Variables.
+* printing notation:                     Printing Notation.
+* printing readably:                     Output Variables.
+* printing uninterned symbols:           Output Variables.
+* priority of an extent:                 Intro to Extents.
+* process:                               Processes.
+* process filter:                        Filter Functions.
+* process input:                         Input to Processes.
+* process output:                        Output from Processes.
+* process sentinel:                      Sentinels.
+* process signals:                       Signals to Processes.
+* process window size:                   Process Window Size.
+* process-buffer:                        Process Buffers.
+* process-command:                       Process Information.
+* process-connection-type:               Asynchronous Processes.
+* process-environment:                   System Environment.
+* process-event-p:                       Event Predicates.
+* process-exit-status:                   Process Information.
+* process-filter:                        Filter Functions.
+* process-id:                            Process Information.
+* process-kill-without-query:            Deleting Processes.
+* process-kill-without-query-p:          Process Information.
+* process-list:                          Process Information.
+* process-mark:                          Process Buffers.
+* process-name:                          Process Information.
+* process-send-eof:                      Input to Processes.
+* process-send-region:                   Input to Processes.
+* process-send-string:                   Input to Processes.
+* process-sentinel:                      Sentinels.
+* process-status:                        Process Information.
+* process-tty-name:                      Process Information.
+* processp:                              Processes.
+* profile.el:                            Compilation Tips.
+* profiling:                             Compilation Tips.
+* prog1:                                 Sequencing.
+* prog2:                                 Sequencing.
+* progn:                                 Sequencing.
+* program arguments:                     Subprocess Creation.
+* program directories:                   Subprocess Creation.
+* programmed completion:                 Programmed Completion.
+* programming types:                     Programming Types.
+* properties of strings:                 String Properties.
+* properties of text:                    Text Properties.
+* property list:                         Property Lists.
+* property list cell (symbol):           Symbol Components.
+* property list, symbol:                 Symbol Properties.
+* property lists vs association lists:   Plists and Alists.
+* property of an extent:                 Extent Properties.
+* protected forms:                       Cleanups.
+* provide:                               Named Features.
+* providing features:                    Named Features.
+* PTYs:                                  Asynchronous Processes.
+* punctuation character:                 Syntax Class Table.
+* pure storage:                          Pure Storage.
+* pure-bytes-used:                       Pure Storage.
+* purecopy:                              Pure Storage.
+* purify-flag:                           Pure Storage.
+* push-mark:                             The Mark.
+* put:                                   Object Plists.
+* put-char-table:                        Working With Char Tables.
+* put-database:                          Working With a Database.
+* put-range-table:                       Working With Range Tables.
+* put-text-property:                     Changing Properties.
+* putf:                                  Other Plists.
+* puthash:                               Working With Hash Tables.
+* query-replace-history:                 Minibuffer History.
+* query-replace-map <1>:                 Standard Keymaps.
+* query-replace-map:                     Search and Replace.
+* querying the user:                     Yes-or-No Queries.
+* question mark in character constant:   Character Type.
+* quietly-read-abbrev-file:              Abbrev Files.
+* quit-flag:                             Quitting.
+* quit-process:                          Signals to Processes.
+* quitting:                              Quitting.
+* quitting from infinite loop:           Infinite Loops.
+* quote:                                 Quoting.
+* quote character:                       Parsing Expressions.
+* quoted character input:                Quoted Character Input.
+* quoted-insert suppression:             Changing Key Bindings.
+* quoting:                               Quoting.
+* quoting characters in printing:        Output Functions.
+* quoting using apostrophe:              Quoting.
+* raise-frame:                           Raising and Lowering.
+* raising a frame:                       Raising and Lowering.
+* random:                                Random Numbers.
+* random numbers:                        Random Numbers.
+* range table type:                      Range Table Type.
+* Range Tables:                          Range Tables.
+* range-table-p:                         Range Tables.
+* rassoc:                                Association Lists.
+* rassq:                                 Association Lists.
+* raw prefix argument:                   Prefix Command Arguments.
+* raw prefix argument usage:             Interactive Codes.
+* re-search-backward:                    Regexp Search.
+* re-search-forward:                     Regexp Search.
+* read:                                  Input Functions.
+* read command name:                     Interactive Call.
+* read syntax:                           Printed Representation.
+* read syntax for characters:            Character Type.
+* read-buffer:                           High-Level Completion.
+* read-char:                             Reading One Event.
+* read-command:                          High-Level Completion.
+* read-expression:                       Object from Minibuffer.
+* read-expression-history:               Minibuffer History.
+* read-expression-map:                   Standard Keymaps.
+* read-file-name:                        Reading File Names.
+* read-from-minibuffer:                  Text from Minibuffer.
+* read-from-string:                      Input Functions.
+* read-key-sequence:                     Key Sequence Input.
+* read-minibuffer:                       Object from Minibuffer.
+* read-only buffer:                      Read Only Buffers.
+* read-only buffers in interactive:      Using Interactive.
+* read-passwd:                           Reading a Password.
+* read-quoted-char:                      Quoted Character Input.
+* read-quoted-char quitting:             Quitting.
+* read-shell-command-map:                Standard Keymaps.
+* read-string:                           Text from Minibuffer.
+* read-variable:                         High-Level Completion.
+* reading:                               Streams Intro.
+* reading (Edebug):                      Reading in Edebug.
+* reading interactive arguments:         Interactive Codes.
+* reading symbols:                       Creating Symbols.
+* rearrangement of lists:                Rearrangement.
+* rebinding:                             Changing Key Bindings.
+* receiving ToolTalk messages:           Receiving Messages.
+* recent-auto-save-p:                    Auto-Saving.
+* recent-keys:                           Recording Input.
+* recent-keys-ring-size:                 Recording Input.
+* recenter:                              Vertical Scrolling.
+* record command history:                Interactive Call.
+* recursion:                             Iteration.
+* recursion-depth:                       Recursive Editing.
+* recursive command loop:                Recursive Editing.
+* recursive editing level:               Recursive Editing.
+* recursive evaluation:                  Intro Eval.
+* recursive-edit:                        Recursive Editing.
+* redo:                                  Undo.
+* redraw-display:                        Refresh Screen.
+* redraw-frame:                          Refresh Screen.
+* redraw-modeline:                       Modeline Format.
+* refresh display:                       Refresh Screen.
+* regexp:                                Regular Expressions.
+* regexp alternative:                    Syntax of Regexps.
+* regexp grouping:                       Syntax of Regexps.
+* regexp searching:                      Regexp Search.
+* regexp-history:                        Minibuffer History.
+* regexp-quote:                          Syntax of Regexps.
+* regexps used standardly in editing:    Standard Regexps.
+* region argument:                       Interactive Codes.
+* region, the:                           The Region.
+* region-active-p:                       The Region.
+* region-beginning:                      The Region.
+* region-end:                            The Region.
+* region-exists-p:                       The Region.
+* register-alist:                        Registers.
+* register-ccl-program:                  Calling CCL.
+* register-tooltalk-pattern:             Elisp Interface for Receiving Messages.
+* registers:                             Registers.
+* regular expression:                    Regular Expressions.
+* regular expression searching:          Regexp Search.
+* reindent-then-newline-and-indent:      Mode-Specific Indent.
+* relabel-menu-item:                     Modifying Menus.
+* relative file name:                    Relative File Names.
+* remainder:                             Arithmetic Operations.
+* remassoc:                              Association Lists.
+* remassq:                               Association Lists.
+* remhash:                               Working With Hash Tables.
+* remove-database:                       Working With a Database.
+* remove-face-property:                  Face Properties.
+* remove-glyph-property:                 Glyph Properties.
+* remove-hook:                           Hooks.
+* remove-range-table:                    Working With Range Tables.
+* remove-specifier:                      Other Specification Functions.
+* remove-text-properties:                Changing Properties.
+* remprop:                               Object Plists.
+* remrassoc:                             Association Lists.
+* remrassq:                              Association Lists.
+* rename-auto-save-file:                 Auto-Saving.
+* rename-buffer:                         Buffer Names.
+* rename-file:                           Changing File Attributes.
+* renaming files:                        Changing File Attributes.
+* repeated loading:                      Repeated Loading.
+* replace bindings:                      Changing Key Bindings.
+* replace characters:                    Substitution.
+* replace-buffer-in-windows:             Displaying Buffers.
+* replace-match:                         Replacing Match.
+* replacement:                           Search and Replace.
+* repositioning format arguments:        Formatting Strings.
+* require:                               Named Features.
+* require-final-newline:                 Saving Buffers.
+* requiring features:                    Named Features.
+* reset-char-table:                      Working With Char Tables.
+* resize redisplay:                      Size and Position.
+* rest arguments:                        Argument List.
+* restriction (in a buffer):             Narrowing.
+* resume (cf. no-redraw-on-reenter):     Refresh Screen.
+* return:                                Character Type.
+* return-tooltalk-message:               Elisp Interface for Sending Messages.
+* reveal-annotation:                     Annotation Properties.
+* reverse:                               Building Lists.
+* reversing a list:                      Rearrangement.
+* revert-buffer:                         Reverting.
+* revert-buffer-function:                Reverting.
+* revert-buffer-insert-file-contents-function: Reverting.
+* right-gutter:                          Specifying a Gutter.
+* right-gutter-visible-p:                Other Gutter Variables.
+* right-gutter-width:                    Other Gutter Variables.
+* right-margin-width:                    Margin Primitives.
+* right-toolbar:                         Specifying the Toolbar.
+* right-toolbar-visible-p:               Other Toolbar Variables.
+* right-toolbar-width:                   Other Toolbar Variables.
+* rm:                                    Changing File Attributes.
+* round:                                 Numeric Conversions.
+* rounding in conversions:               Numeric Conversions.
+* rounding without conversion:           Rounding Operations.
+* rplaca:                                Modifying Lists.
+* rplacd:                                Modifying Lists.
+* run time stack:                        Internals of Debugger.
+* run-emacs-from-temacs:                 Building XEmacs.
+* run-hooks:                             Hooks.
+* runnable temacs:                       Building XEmacs.
+* same-window-buffer-names:              Choosing Window.
+* same-window-regexps:                   Choosing Window.
+* save-abbrevs:                          Abbrev Files.
+* save-buffer:                           Saving Buffers.
+* save-current-buffer:                   Excursions.
+* save-excursion:                        Excursions.
+* save-excursion (Edebug):               Edebug Display Update.
+* save-match-data:                       Saving Match Data.
+* save-restriction:                      Narrowing.
+* save-selected-frame:                   Input Focus.
+* save-selected-window <1>:              Excursions.
+* save-selected-window:                  Selecting Windows.
+* save-some-buffers:                     Saving Buffers.
+* save-window-excursion:                 Window Configurations.
+* saving text properties:                Saving Properties.
+* saving window information:             Window Configurations.
+* scan-lists:                            Parsing Expressions.
+* scan-sexps:                            Parsing Expressions.
+* scope:                                 Variable Scoping.
+* screen layout:                         Window Configuration Type.
+* scroll-conservatively:                 Vertical Scrolling.
+* scroll-down:                           Vertical Scrolling.
+* scroll-left:                           Horizontal Scrolling.
+* scroll-other-window:                   Vertical Scrolling.
+* scroll-right:                          Horizontal Scrolling.
+* scroll-step:                           Vertical Scrolling.
+* scroll-up:                             Vertical Scrolling.
+* scrollbar-pointer-glyph:               Mouse Pointer.
+* scrollbars:                            Scrollbars.
+* scrolling vertically:                  Vertical Scrolling.
+* search-backward:                       String Search.
+* search-failed:                         String Search.
+* search-forward:                        String Search.
+* searching:                             Searching and Matching.
+* searching and case:                    Searching and Case.
+* searching for regexp:                  Regexp Search.
+* second:                                List Elements.
+* select-console:                        The Selected Console and Device.
+* select-device:                         The Selected Console and Device.
+* select-frame:                          Input Focus.
+* select-frame-hook:                     Frame Hooks.
+* select-window:                         Selecting Windows.
+* selected frame:                        Input Focus.
+* selected window:                       Basic Windows.
+* selected-console:                      The Selected Console and Device.
+* selected-device:                       The Selected Console and Device.
+* selected-frame:                        Input Focus.
+* selected-window:                       Selecting Windows.
+* selecting a buffer:                    Current Buffer.
+* selecting windows:                     Selecting Windows.
+* selection (for X windows):             X Selections.
+* selection-pointer-glyph:               Mouse Pointer.
+* selective display:                     Selective Display.
+* selective-display:                     Selective Display.
+* selective-display-ellipses:            Selective Display.
+* self-evaluating form:                  Self-Evaluating Forms.
+* self-insert-and-exit:                  Minibuffer Misc.
+* self-insert-command:                   Commands for Insertion.
+* self-insert-command override:          Changing Key Bindings.
+* self-insert-command, minor modes:      Keymaps and Minor Modes.
+* self-insertion:                        Commands for Insertion.
+* send-string-to-terminal:               Terminal Output.
+* send-tooltalk-message:                 Elisp Interface for Sending Messages.
+* sending signals:                       Signals to Processes.
+* sending ToolTalk messages:             Sending Messages.
+* sentence-end:                          Standard Regexps.
+* sentinel:                              Sentinels.
+* sequence:                              Sequences Arrays Vectors.
+* sequence length:                       Sequence Functions.
+* sequencep:                             Sequence Functions.
+* set:                                   Setting Variables.
+* set-annotation-action:                 Annotation Properties.
+* set-annotation-data:                   Annotation Properties.
+* set-annotation-down-glyph:             Annotation Properties.
+* set-annotation-face:                   Annotation Properties.
+* set-annotation-glyph:                  Annotation Properties.
+* set-annotation-layout:                 Annotation Properties.
+* set-annotation-menu:                   Annotation Properties.
+* set-auto-mode:                         Auto Major Mode.
+* set-buffer:                            Current Buffer.
+* set-buffer-auto-saved:                 Auto-Saving.
+* set-buffer-major-mode:                 Auto Major Mode.
+* set-buffer-menubar:                    Menubar.
+* set-buffer-modified-p:                 Buffer Modification.
+* set-case-syntax:                       Case Tables.
+* set-case-syntax-delims:                Case Tables.
+* set-case-syntax-pair:                  Case Tables.
+* set-case-table:                        Case Tables.
+* set-category-table:                    Category Tables.
+* set-charset-ccl-program:               Charset Property Functions.
+* set-coding-category-system:            Detection of Textual Encoding.
+* set-coding-priority-list:              Detection of Textual Encoding.
+* set-console-type-image-conversion-list: Image Instantiator Conversion.
+* set-default:                           Default Value.
+* set-default-file-modes:                Changing File Attributes.
+* set-default-gutter-position:           Specifying a Gutter.
+* set-default-toolbar-position:          Specifying the Toolbar.
+* set-device-baud-rate <1>:              Terminal Output.
+* set-device-baud-rate:                  Console and Device I/O.
+* set-extent-begin-glyph:                Extent Properties.
+* set-extent-begin-glyph-layout:         Extent Properties.
+* set-extent-end-glyph:                  Extent Properties.
+* set-extent-end-glyph-layout:           Extent Properties.
+* set-extent-endpoints:                  Extent Endpoints.
+* set-extent-face:                       Extent Properties.
+* set-extent-initial-redisplay-function: Extent Properties.
+* set-extent-keymap:                     Extent Properties.
+* set-extent-mouse-face:                 Extent Properties.
+* set-extent-parent:                     Extent Parents.
+* set-extent-priority:                   Extent Properties.
+* set-extent-properties:                 Extent Properties.
+* set-extent-property:                   Extent Properties.
+* set-face-background:                   Face Convenience Functions.
+* set-face-background-pixmap:            Face Convenience Functions.
+* set-face-font:                         Face Convenience Functions.
+* set-face-foreground:                   Face Convenience Functions.
+* set-face-property:                     Face Properties.
+* set-face-underline-p:                  Face Convenience Functions.
+* set-file-modes:                        Changing File Attributes.
+* set-frame-configuration:               Frame Configurations.
+* set-frame-pointer:                     Mouse Pointer.
+* set-frame-position:                    Size and Position.
+* set-frame-properties:                  Property Access.
+* set-frame-property:                    Property Access.
+* set-frame-size:                        Size and Position.
+* set-glyph-baseline:                    Glyph Convenience Functions.
+* set-glyph-contrib-p:                   Glyph Convenience Functions.
+* set-glyph-face:                        Glyph Convenience Functions.
+* set-glyph-image:                       Glyph Convenience Functions.
+* set-glyph-property:                    Glyph Properties.
+* set-input-mode:                        Input Modes.
+* set-keymap-default-binding:            Inheritance and Keymaps.
+* set-keymap-name:                       Creating Keymaps.
+* set-keymap-parents:                    Inheritance and Keymaps.
+* set-keymap-prompt:                     Other Keymap Functions.
+* set-left-margin:                       Margins.
+* set-mark:                              The Mark.
+* set-marker:                            Changing Markers.
+* set-match-data:                        Entire Match Data.
+* set-menubar:                           Menubar.
+* set-menubar-dirty-flag:                Menubar.
+* set-process-buffer:                    Process Buffers.
+* set-process-filter:                    Filter Functions.
+* set-process-sentinel:                  Sentinels.
+* set-process-window-size:               Process Window Size.
+* set-recent-keys-ring-size:             Recording Input.
+* set-register:                          Registers.
+* set-right-margin:                      Margins.
+* set-specifier:                         Adding Specifications.
+* set-standard-case-table:               Case Tables.
+* set-syntax-table:                      Syntax Table Functions.
+* set-text-properties:                   Changing Properties.
+* set-tooltalk-message-attribute:        Elisp Interface for Sending Messages.
+* set-visited-file-modtime:              Modification Time.
+* set-visited-file-name:                 Buffer File Name.
+* set-weak-list-list:                    Weak Lists.
+* set-window-buffer:                     Buffers and Windows.
+* set-window-buffer-dedicated:           Choosing Window.
+* set-window-configuration:              Window Configurations.
+* set-window-dedicated-p:                Choosing Window.
+* set-window-hscroll:                    Horizontal Scrolling.
+* set-window-point:                      Window Point.
+* set-window-start:                      Window Start.
+* setcar:                                Setcar.
+* setcdr:                                Setcdr.
+* setenv:                                System Environment.
+* setplist:                              Object Plists.
+* setprv:                                System Environment.
+* setq:                                  Setting Variables.
+* setq-default:                          Default Value.
+* sets:                                  Sets And Lists.
+* setting modes of files:                Changing File Attributes.
+* setting-constant:                      Constant Variables.
+* seventh:                               List Elements.
+* sexp motion:                           List Motion.
+* shadowing of variables:                Local Variables.
+* shallow binding:                       Impl of Scope.
+* shared-lisp-mode-map:                  Standard Keymaps.
+* Shell mode modeline-format:            Modeline Data.
+* shell-command-history:                 Minibuffer History.
+* shrink-window:                         Resizing Windows.
+* shrink-window-horizontally:            Resizing Windows.
+* shrink-window-pixels:                  Resizing Windows.
+* side effect:                           Intro Eval.
+* signal:                                Signaling Errors.
+* signal-error:                          Signaling Errors.
+* signal-process:                        Signals to Processes.
+* signaling errors:                      Signaling Errors.
+* signals:                               Signals to Processes.
+* sin:                                   Math Functions.
+* single-key-description:                Describing Characters.
+* sinh:                                  Math Functions.
+* sit-for:                               Waiting.
+* site-init.el:                          Building XEmacs.
+* site-load.el:                          Building XEmacs.
+* site-run-file:                         Init File.
+* site-start.el:                         Start-up Summary.
+* sixth:                                 List Elements.
+* size of frame:                         Size and Position.
+* size of window:                        Size of Window.
+* skip-chars-backward:                   Skipping Characters.
+* skip-chars-forward:                    Skipping Characters.
+* skip-syntax-backward:                  Motion and Syntax.
+* skip-syntax-forward:                   Motion and Syntax.
+* skipping characters:                   Skipping Characters.
+* skipping comments:                     Parsing Expressions.
+* sleep-for:                             Waiting.
+* Snarf-documentation:                   Accessing Documentation.
+* sort:                                  Rearrangement.
+* sort-columns:                          Sorting.
+* sort-fields:                           Sorting.
+* sort-lines:                            Sorting.
+* sort-numeric-fields:                   Sorting.
+* sort-pages:                            Sorting.
+* sort-paragraphs:                       Sorting.
+* sort-regexp-fields:                    Sorting.
+* sort-subr:                             Sorting.
+* sorting lists:                         Rearrangement.
+* sorting text:                          Sorting.
+* sound:                                 Beeping.
+* sound-alist:                           Beeping.
+* special:                               Major Mode Conventions.
+* special form descriptions:             A Sample Function Description.
+* special form evaluation:               Special Forms.
+* special forms:                         Primitive Function Type.
+* special forms (Edebug):                Instrumenting.
+* special forms for control structures:  Control Structures.
+* special-display-buffer-names:          Choosing Window.
+* special-display-frame-plist:           Choosing Window.
+* special-display-function:              Choosing Window.
+* special-display-popup-frame:           Choosing Window.
+* special-display-regexps:               Choosing Window.
+* specification (in a specifier):        Specifiers In-Depth.
+* specifier:                             Specifiers.
+* specifier type:                        Specifier Type.
+* specifier, domain:                     Specifiers In-Depth.
+* specifier, fallback:                   Specifier Instancing.
+* specifier, inst-list:                  Specifiers In-Depth.
+* specifier, inst-pair:                  Specifiers In-Depth.
+* specifier, instance:                   Specifiers In-Depth.
+* specifier, instancing:                 Specifiers In-Depth.
+* specifier, instantiator:               Specifiers In-Depth.
+* specifier, locale:                     Specifiers In-Depth.
+* specifier, specification:              Specifiers In-Depth.
+* specifier, tag:                        Specifiers In-Depth.
+* specifier, tag set:                    Specifiers In-Depth.
+* specifier-fallback:                    Retrieving Specifications.
+* specifier-instance:                    Specifier Instancing Functions.
+* specifier-instance-from-inst-list:     Specifier Instancing Functions.
+* specifier-locale-type-from-locale:     Other Specification Functions.
+* specifier-spec-list:                   Retrieving Specifications.
+* specifier-specs:                       Retrieving Specifications.
+* specifier-tag-list:                    Specifier Tag Functions.
+* specifier-tag-predicate:               Specifier Tag Functions.
+* specifier-type:                        Specifier Types.
+* specifierp:                            Specifiers.
+* speedups:                              Compilation Tips.
+* splicing (with backquote):             Backquote.
+* split-height-threshold:                Choosing Window.
+* split-line:                            Commands for Insertion.
+* split-path:                            Regexp Search.
+* split-string:                          Regexp Search.
+* split-window:                          Splitting Windows.
+* split-window-horizontally:             Splitting Windows.
+* split-window-vertically:               Splitting Windows.
+* splitting windows:                     Splitting Windows.
+* sqrt:                                  Math Functions.
+* stable sort:                           Rearrangement.
+* standard regexps used in editing:      Standard Regexps.
+* standard-case-table:                   Case Tables.
+* standard-category-table:               Category Tables.
+* standard-input:                        Input Functions.
+* standard-output:                       Output Variables.
+* standard-syntax-table:                 Standard Syntax Tables.
+* standards of coding style:             Tips.
+* start up of XEmacs:                    Start-up Summary.
+* start-process:                         Asynchronous Processes.
+* start-process-shell-command:           Asynchronous Processes.
+* startup.el:                            Start-up Summary.
+* stop points:                           Using Edebug.
+* stop-process:                          Signals to Processes.
+* stopping an infinite loop:             Infinite Loops.
+* stopping on events:                    Global Break Condition.
+* store-match-data:                      Entire Match Data.
+* stream (for printing):                 Output Streams.
+* stream (for reading):                  Input Streams.
+* string:                                Creating Strings.
+* string equality:                       Text Comparison.
+* string in keymap:                      Key Lookup.
+* string input stream:                   Input Streams.
+* string length:                         Sequence Functions.
+* string length, maximum when printing:  Output Variables.
+* string properties:                     String Properties.
+* string search:                         String Search.
+* string to character:                   String Conversion.
+* string to number:                      String Conversion.
+* string to object:                      Input Functions.
+* string, writing a doc string:          Documentation Basics.
+* string-equal:                          Text Comparison.
+* string-lessp:                          Text Comparison.
+* string-match:                          Regexp Search.
+* string-modified-tick:                  Modifying Strings.
+* string-to-char:                        String Conversion.
+* string-to-int:                         String Conversion.
+* string-to-number:                      String Conversion.
+* string<:                               Text Comparison.
+* string=:                               Text Comparison.
+* stringp:                               Predicates for Strings.
+* strings:                               Strings and Characters.
+* strings, formatting them:              Formatting Strings.
+* strings, modifying:                    Modifying Strings.
+* string quote:                          Syntax Class Table.
+* subprocess:                            Processes.
+* subr:                                  What Is a Function.
+* subrp:                                 What Is a Function.
+* subsidiary-coding-system:              Basic Coding System Functions.
+* subst-char-in-region:                  Substitution.
+* substitute-command-keys:               Keys in Documentation.
+* substitute-in-file-name:               File Name Expansion.
+* substitute-key-definition:             Changing Key Bindings.
+* substituting keys in documentation:    Keys in Documentation.
+* substring:                             Creating Strings.
+* subwindow type:                        Subwindow Type.
+* subwindow-image-instance-p:            Image Instance Types.
+* subwindowp:                            Subwindows.
+* suppress-keymap:                       Changing Key Bindings.
+* suspend (cf. no-redraw-on-reenter):    Refresh Screen.
+* suspend evaluation:                    Recursive Editing.
+* suspend-emacs:                         Suspending XEmacs.
+* suspend-hook:                          Suspending XEmacs.
+* suspend-resume-hook:                   Suspending XEmacs.
+* suspending XEmacs:                     Suspending XEmacs.
+* switch-to-buffer:                      Displaying Buffers.
+* switch-to-buffer-other-window:         Displaying Buffers.
+* switches on command line:              Command Line Arguments.
+* switching to a buffer:                 Displaying Buffers.
+* symbol:                                Symbols.
+* symbol components:                     Symbol Components.
+* symbol equality:                       Creating Symbols.
+* symbol evaluation:                     Symbol Forms.
+* symbol function indirection:           Function Indirection.
+* symbol in keymap:                      Key Lookup.
+* symbol name hashing:                   Creating Symbols.
+* symbol-function:                       Function Cells.
+* symbol-name:                           Creating Symbols.
+* symbol-plist:                          Object Plists.
+* symbol-value:                          Accessing Variables.
+* symbolp:                               Symbols.
+* symbol constituent:                    Syntax Class Table.
+* synchronous subprocess:                Synchronous Processes.
+* syntax classes:                        Syntax Descriptors.
+* syntax descriptor:                     Syntax Descriptors.
+* syntax error (Edebug):                 Backtracking.
+* syntax flags:                          Syntax Flags.
+* syntax for characters:                 Character Type.
+* syntax table:                          Syntax Tables.
+* syntax table example:                  Example Major Modes.
+* syntax table internals:                Syntax Table Internals.
+* syntax tables in modes:                Major Mode Conventions.
+* syntax-table:                          Syntax Table Functions.
+* syntax-table-p:                        Syntax Basics.
+* system-configuration:                  System Environment.
+* system-name:                           System Environment.
+* system-type:                           System Environment.
+* t:                                     Constant Variables.
+* t and truth:                           nil and t.
+* t input stream:                        Input Streams.
+* t output stream:                       Output Streams.
+* tab:                                   Character Type.
+* tab deletion:                          Deletion.
+* tab-stop-list:                         Indent Tabs.
+* tab-to-tab-stop:                       Indent Tabs.
+* tab-width:                             Usual Display.
+* tabs stops for indentation:            Indent Tabs.
+* tag (in a specifier):                  Specifiers In-Depth.
+* tag on run time stack:                 Catch and Throw.
+* tag set (in a specifier):              Specifiers In-Depth.
+* tan:                                   Math Functions.
+* tanh:                                  Math Functions.
+* TCP:                                   Network.
+* temacs:                                Building XEmacs.
+* temp-buffer-show-function:             Temporary Displays.
+* temp-directory:                        Unique File Names.
+* tenth:                                 List Elements.
+* TERM environment variable:             Terminal-Specific.
+* term-file-prefix:                      Terminal-Specific.
+* term-setup-hook:                       Terminal-Specific.
+* Termcap:                               Terminal-Specific.
+* terminal frame <1>:                    Frames.
+* terminal frame:                        Basic Windows.
+* terminal input:                        Terminal Input.
+* terminal input modes:                  Input Modes.
+* terminal output:                       Terminal Output.
+* terminal-device:                       Console Types and Device Classes.
+* terminal-specific initialization:      Terminal-Specific.
+* terminate keyboard macro:              Peeking and Discarding.
+* termscript file:                       Terminal Output.
+* terpri:                                Output Functions.
+* testing types:                         Type Predicates.
+* text:                                  Text.
+* text files and binary files:           Files and MS-DOS.
+* text insertion:                        Insertion.
+* text parsing:                          Syntax Tables.
+* text properties:                       Text Properties.
+* text properties in files:              Saving Properties.
+* text-char-description:                 Describing Characters.
+* text-image-instance-p:                 Image Instance Types.
+* text-mode-abbrev-table:                Standard Abbrev Tables.
+* text-mode-map:                         Standard Keymaps.
+* text-mode-syntax-table:                Standard Syntax Tables.
+* text-pointer-glyph:                    Mouse Pointer.
+* text-properties-at:                    Examining Properties.
+* text-property-any:                     Property Search.
+* text-property-not-all:                 Property Search.
+* third:                                 List Elements.
+* this-command:                          Command Loop Info.
+* this-command-keys:                     Command Loop Info.
+* throw:                                 Catch and Throw.
+* throw example:                         Recursive Editing.
+* tiled windows:                         Basic Windows.
+* timeout-event-p:                       Event Predicates.
+* timing programs:                       Compilation Tips.
+* tips:                                  Tips.
+* toggle-read-only:                      Read Only Buffers.
+* toolbar:                               Toolbar.
+* toolbar button type:                   Toolbar Button Type.
+* toolbar-buttons-captioned-p:           Other Toolbar Variables.
+* toolbar-make-button-list:              Toolbar Descriptor Format.
+* toolbar-map <1>:                       Standard Keymaps.
+* toolbar-map:                           Active Keymaps.
+* toolbar-pointer-glyph:                 Mouse Pointer.
+* toolbar-specifier-p <1>:               Specifier Types.
+* toolbar-specifier-p:                   Specifying the Toolbar.
+* ToolTalk:                              ToolTalk Support.
+* ToolTalk message:                      Sending Messages.
+* ToolTalk pattern:                      Receiving Messages.
+* top-gutter:                            Specifying a Gutter.
+* top-gutter-height:                     Other Gutter Variables.
+* top-gutter-visible-p:                  Other Gutter Variables.
+* top-level:                             Recursive Editing.
+* top-level form:                        Loading.
+* top-toolbar:                           Specifying the Toolbar.
+* top-toolbar-height:                    Other Toolbar Variables.
+* top-toolbar-visible-p:                 Other Toolbar Variables.
+* tq-close:                              Transaction Queues.
+* tq-create:                             Transaction Queues.
+* tq-enqueue:                            Transaction Queues.
+* tracing:                               Tracing.
+* transaction queue:                     Transaction Queues.
+* transcendental functions:              Math Functions.
+* translate-region:                      Substitution.
+* translating input events:              Translating Input.
+* transpose-regions:                     Transposition.
+* true:                                  nil and t.
+* truename (of file):                    Truenames.
+* truncate:                              Numeric Conversions.
+* truncate-lines:                        Truncation.
+* truncate-partial-width-windows:        Truncation.
+* truncation-glyph:                      Redisplay Glyphs.
+* truth value:                           nil and t.
+* try-completion:                        Basic Completion.
+* two's complement:                      Integer Basics.
+* type:                                  Lisp Data Types.
+* type checking:                         Type Predicates.
+* type predicates:                       Type Predicates.
+* type-of:                               Type Predicates.
+* unbinding keys:                        Key Binding Commands.
+* undefined:                             Functions for Key Lookup.
+* undefined in keymap:                   Key Lookup.
+* undefined key:                         Keymap Terminology.
+* undo avoidance:                        Substitution.
+* undo-boundary:                         Undo.
+* undo-limit:                            Maintaining Undo.
+* undo-strong-limit:                     Maintaining Undo.
+* unexec:                                Building XEmacs.
+* unhandled-file-name-directory:         Magic File Names.
+* unintern:                              Creating Symbols.
+* uninterned symbol:                     Creating Symbols.
+* uninterned symbols, printing:          Output Variables.
+* unique extents:                        Duplicable Extents.
+* universal-argument:                    Prefix Command Arguments.
+* unload-feature:                        Unloading.
+* unloading:                             Unloading.
+* unlock-buffer:                         File Locks.
+* unmap-frame-hook:                      Frame Hooks.
+* unread-command-event:                  Peeking and Discarding.
+* unread-command-events:                 Peeking and Discarding.
+* unreading:                             Input Streams.
+* unregister-tooltalk-pattern:           Elisp Interface for Receiving Messages.
+* unwind-protect:                        Cleanups.
+* unwinding:                             Cleanups.
+* up-list:                               List Motion.
+* upcase:                                Character Case.
+* upcase-region:                         Case Changes.
+* upcase-word:                           Case Changes.
+* update display:                        Refresh Screen.
+* update-directory-autoloads:            Autoload.
+* update-file-autoloads:                 Autoload.
+* upper case:                            Character Case.
+* upper case key sequence:               Key Sequence Input.
+* use-global-map:                        Active Keymaps.
+* use-hard-newlines:                     Filling.
+* use-left-overflow:                     Margin Primitives.
+* use-local-map:                         Active Keymaps.
+* use-right-overflow:                    Margin Primitives.
+* user name completion subroutines:      User Name Completion.
+* user option:                           Defining Variables.
+* user-defined error:                    Error Symbols.
+* user-full-name:                        User Identification.
+* user-home-directory:                   User Identification.
+* user-login-name:                       User Identification.
+* user-mail-address:                     User Identification.
+* user-name-all-completions:             User Name Completion.
+* user-name-completion:                  User Name Completion.
+* user-name-completion-1:                User Name Completion.
+* user-real-login-name:                  User Identification.
+* user-real-uid:                         User Identification.
+* user-uid:                              User Identification.
+* user-variable-p:                       Defining Variables.
+* user-variable-p example:               High-Level Completion.
+* valid-char-table-type-p:               Char Table Types.
+* valid-char-table-value-p:              Working With Char Tables.
+* valid-device-class-p:                  Console Types and Device Classes.
+* valid-device-type-p:                   Console Types and Device Classes.
+* valid-glyph-type-p:                    Glyph Types.
+* valid-image-instance-type-p:           Image Instance Types.
+* valid-image-instantiator-format-p:     Image Specifiers.
+* valid-inst-list-p:                     Specifier Validation Functions.
+* valid-instantiator-p:                  Specifier Validation Functions.
+* valid-plist-p:                         Property Lists.
+* valid-spec-list-p:                     Specifier Validation Functions.
+* valid-specifier-domain-p:              Specifier Validation Functions.
+* valid-specifier-locale-p:              Specifier Validation Functions.
+* valid-specifier-locale-type-p:         Specifier Validation Functions.
+* valid-specifier-tag-p <1>:             Specifier Validation Functions.
+* valid-specifier-tag-p:                 Specifier Tag Functions.
+* valid-specifier-tag-set-p:             Specifier Tag Functions.
+* valid-specifier-type-p:                Specifier Validation Functions.
+* value cell:                            Symbol Components.
+* value of expression:                   Evaluation.
+* values:                                Eval.
+* variable:                              Variables.
+* variable aliases:                      Variable Aliases.
+* variable definition:                   Defining Variables.
+* variable descriptions:                 A Sample Variable Description.
+* variable limit error:                  Local Variables.
+* variable-alias:                        Variable Aliases.
+* variable-documentation:                Documentation Basics.
+* variable-obsoleteness-doc:             Obsoleteness.
+* variables, buffer-local:               Buffer-Local Variables.
+* variables, indirect:                   Variable Aliases.
+* vc-mode:                               Modeline Variables.
+* vconcat:                               Vector Functions.
+* vector <1>:                            Vector Functions.
+* vector:                                Vectors.
+* vector evaluation:                     Self-Evaluating Forms.
+* vector length:                         Sequence Functions.
+* vectorp:                               Vector Functions.
+* verify-visited-file-modtime:           Modification Time.
+* version number (in file name):         File Name Components.
+* version-control:                       Numbered Backups.
+* vertical scrolling:                    Vertical Scrolling.
+* vertical tab:                          Character Type.
+* vertical-motion:                       Screen Lines.
+* vertical-motion-pixels:                Screen Lines.
+* view-file:                             Visiting Functions.
+* view-mode-map:                         Standard Keymaps.
+* view-register:                         Registers.
+* visible frame:                         Visibility of Frames.
+* visible-bell:                          Beeping.
+* visible-frame-list:                    Finding All Frames.
+* visited file:                          Buffer File Name.
+* visited file mode:                     Auto Major Mode.
+* visited-file-modtime:                  Modification Time.
+* visiting files:                        Visiting Files.
+* void function:                         Function Indirection.
+* void function cell:                    Function Cells.
+* void variable:                         Void Variables.
+* void-function:                         Function Cells.
+* void-variable:                         Void Variables.
+* waiting:                               Waiting.
+* waiting for command key input:         Peeking and Discarding.
+* waiting-for-user-input-p:              Sentinels.
+* wakeup:                                Subprocess Creation.
+* walk-windows:                          Cyclic Window Ordering.
+* weak hash table:                       Weak Hash Tables.
+* weak list:                             Weak Lists.
+* weak list type:                        Weak List Type.
+* weak-list-list:                        Weak Lists.
+* weak-list-p:                           Weak Lists.
+* weak-list-type:                        Weak Lists.
+* where-is-internal:                     Scanning Keymaps.
+* while:                                 Iteration.
+* whitespace:                            Character Type.
+* whitespace character:                  Syntax Class Table.
+* widen:                                 Narrowing.
+* widening:                              Narrowing.
+* window:                                Basic Windows.
+* window configuration (Edebug):         Edebug Display Update.
+* window configurations:                 Window Configurations.
+* window excursions:                     Excursions.
+* window ordering, cyclic:               Cyclic Window Ordering.
+* window point:                          Window Point.
+* window position <1>:                   Position of Window.
+* window position:                       Window Point.
+* window resizing:                       Resizing Windows.
+* window size:                           Size of Window.
+* window size, changing:                 Resizing Windows.
+* window splitting:                      Splitting Windows.
+* window system types:                   Window-System Types.
+* window top line:                       Window Start.
+* window-buffer:                         Buffers and Windows.
+* window-configuration-p:                Window Configurations.
+* window-dedicated-p:                    Choosing Window.
+* window-displayed-text-pixel-height:    Size of Window.
+* window-end:                            Window Start.
+* window-frame:                          Frames and Windows.
+* window-height:                         Size of Window.
+* window-highest-p:                      Position of Window.
+* window-hscroll:                        Horizontal Scrolling.
+* window-left-margin-pixel-width:        Margin Primitives.
+* window-live-p:                         Deleting Windows.
+* window-lowest-p:                       Position of Window.
+* window-min-height:                     Resizing Windows.
+* window-min-width:                      Resizing Windows.
+* window-minibuffer-p:                   Minibuffer Misc.
+* window-pixel-edges:                    Position of Window.
+* window-pixel-height:                   Size of Window.
+* window-pixel-width:                    Size of Window.
+* window-point:                          Window Point.
+* window-right-margin-pixel-width:       Margin Primitives.
+* window-setup-hook:                     Terminal-Specific.
+* window-size-change-functions:          Resizing Windows.
+* window-start:                          Window Start.
+* window-system objects:                 Faces and Window-System Objects.
+* window-text-area-pixel-edges:          Position of Window.
+* window-text-area-pixel-height:         Size of Window.
+* window-text-area-pixel-width:          Size of Window.
+* window-width:                          Size of Window.
+* windowp:                               Basic Windows.
+* windows, controlling precisely:        Buffers and Windows.
+* with-current-buffer:                   Excursions.
+* with-output-to-temp-buffer:            Temporary Displays.
+* with-selected-frame:                   Input Focus.
+* with-temp-file:                        Excursions.
+* word search:                           String Search.
+* word-search-backward:                  String Search.
+* word-search-forward:                   String Search.
+* words-include-escapes:                 Word Motion.
+* word constituent:                      Syntax Class Table.
+* write-abbrev-file:                     Abbrev Files.
+* write-char:                            Output Functions.
+* write-contents-hooks:                  Saving Buffers.
+* write-file:                            Saving Buffers.
+* write-file-hooks:                      Saving Buffers.
+* write-region:                          Writing to Files.
+* write-region-annotate-functions:       Saving Properties.
+* writing a documentation string:        Documentation Basics.
+* wrong-number-of-arguments:             Argument List.
+* wrong-type-argument:                   Type Predicates.
+* X:                                     X-Windows.
+* X resource type:                       X Resource Type.
+* X window frame:                        Frames.
+* x-allow-sendevents:                    X Miscellaneous.
+* x-bitmap-file-path <1>:                X Miscellaneous.
+* x-bitmap-file-path:                    Image Specifiers.
+* x-debug-events:                        X Miscellaneous.
+* x-debug-mode:                          X Miscellaneous.
+* x-disown-selection:                    X Selections.
+* x-display-visual-class:                Server Data.
+* x-emacs-application-class:             Resources.
+* x-find-larger-font:                    Font Instance Size.
+* x-find-smaller-font:                   Font Instance Size.
+* x-font-size:                           Font Instance Size.
+* x-get-cutbuffer:                       X Selections.
+* x-get-resource:                        Resources.
+* x-get-selection:                       X Selections.
+* x-grab-keyboard:                       Grabs.
+* x-grab-pointer:                        Grabs.
+* x-library-search-path:                 X Miscellaneous.
+* x-make-font-bold:                      Font Instance Characteristics.
+* x-make-font-bold-italic:               Font Instance Characteristics.
+* x-make-font-italic:                    Font Instance Characteristics.
+* x-make-font-unbold:                    Font Instance Characteristics.
+* x-make-font-unitalic:                  Font Instance Characteristics.
+* x-own-selection:                       X Selections.
+* x-put-resource:                        Resources.
+* x-server-vendor:                       Server Data.
+* x-server-version:                      Server Data.
+* x-set-frame-icon-pixmap:               Frame Titles.
+* x-store-cutbuffer:                     X Selections.
+* x-ungrab-keyboard:                     Grabs.
+* x-ungrab-pointer:                      Grabs.
+* x-valid-keysym-name-p:                 X Miscellaneous.
+* x-window-id:                           X Miscellaneous.
+* X-Windows:                             X-Windows.
+* XEmacs event standard notation:        Describing Characters.
+* xpm-color-symbols:                     Image Specifiers.
+* y-or-n-p:                              Yes-or-No Queries.
+* y-or-n-p-maybe-dialog-box:             Yes-or-No Queries.
+* yank:                                  Yank Commands.
+* yank suppression:                      Changing Key Bindings.
+* yank-pop:                              Yank Commands.
+* yes-or-no questions:                   Yes-or-No Queries.
+* yes-or-no-p:                           Yes-or-No Queries.
+* yes-or-no-p-dialog-box:                Yes-or-No Queries.
+* yes-or-no-p-maybe-dialog-box:          Yes-or-No Queries.
+* zero-length extent:                    Extent Endpoints.
+* zerop:                                 Predicates on Numbers.
+* zmacs-activate-region:                 The Region.
+* zmacs-activate-region-hook:            The Region.
+* zmacs-deactivate-region:               The Region.
+* zmacs-deactivate-region-hook:          The Region.
+* zmacs-region-stays:                    The Region.
+* zmacs-regions:                         The Region.
+* zmacs-update-region:                   The Region.
+* zmacs-update-region-hook:              The Region.
+* | in regexp:                           Syntax of Regexps.
+
+
diff --git a/info/xemacs.info-22 b/info/xemacs.info-22
new file mode 100644 (file)
index 0000000..912f44b
--- /dev/null
@@ -0,0 +1,795 @@
+This is ../info/xemacs.info, produced by makeinfo version 4.0 from
+xemacs/xemacs.texi.
+
+INFO-DIR-SECTION XEmacs Editor
+START-INFO-DIR-ENTRY
+* XEmacs: (xemacs).            XEmacs Editor.
+END-INFO-DIR-ENTRY
+
+   This file documents the XEmacs editor.
+
+   Copyright (C) 1985, 1986, 1988 Richard M. Stallman.  Copyright (C)
+1991, 1992, 1993, 1994 Lucid, Inc.  Copyright (C) 1993, 1994 Sun
+Microsystems, Inc.  Copyright (C) 1995 Amdahl Corporation.
+
+   Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+   Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided also
+that the sections entitled "The GNU Manifesto", "Distribution" and "GNU
+General Public License" are included exactly as in the original, and
+provided that the entire resulting derived work is distributed under the
+terms of a permission notice identical to this one.
+
+   Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that the sections entitled "The GNU Manifesto",
+"Distribution" and "GNU General Public License" may be included in a
+translation approved by the author instead of in the original English.
+
+\1f
+File: xemacs.info,  Node: Variable Index,  Next: Concept Index,  Prev: Command Index,  Up: Top
+
+Variable Index
+**************
+
+* Menu:
+
+* abbrev-all-caps:                       Expanding Abbrevs.
+* abbrev-file-name:                      Saving Abbrevs.
+* abbrev-mode:                           Abbrevs.
+* after-load-alist:                      Loading.
+* after-save-hook:                       Saving.
+* all-christian-calendar-holidays:       Holiday Customizing.
+* all-hebrew-calendar-holidays:          Holiday Customizing.
+* all-islamic-calendar-holidays:         Holiday Customizing.
+* appt-audible:                          Appt Customizing.
+* appt-display-duration:                 Appt Customizing.
+* appt-display-mode-line:                Appt Customizing.
+* appt-message-warning-time:             Appt Customizing.
+* appt-msg-window:                       Appt Customizing.
+* appt-visible:                          Appt Customizing.
+* apropos-do-all:                        Apropos.
+* auto-fill-inhibit-regexp:              Fill Commands.
+* auto-lower-frame:                      XEmacs under X.
+* auto-mode-alist:                       Choosing Modes.
+* auto-raise-frame:                      XEmacs under X.
+* auto-save-default:                     Auto Save Control.
+* auto-save-interval:                    Auto Save Control.
+* auto-save-timeout:                     Auto Save Control.
+* auto-save-visited-file-name:           Auto Save Files.
+* backup-by-copying:                     Backup Copying.
+* backup-by-copying-when-linked:         Backup Copying.
+* backup-by-copying-when-mismatch:       Backup Copying.
+* bell-volume:                           Audible Bell.
+* blink-matching-paren:                  Matching.
+* blink-matching-paren-distance:         Matching.
+* bookmark-save-flag:                    Bookmarks.
+* bookmark-search-size:                  Bookmarks.
+* buffer-file-coding-system:             Recognize Coding.
+* buffer-file-name:                      Visiting.
+* buffer-file-truename:                  Visiting.
+* buffer-read-only:                      Misc Buffer.
+* buffer-tag-table:                      Find Tag.
+* c-argdecl-indent:                      C Indent.
+* c-auto-newline:                        C Indent.
+* c-brace-imaginary-offset:              C Indent.
+* c-brace-offset:                        C Indent.
+* c-continued-statement-offset:          C Indent.
+* c-indent-level:                        C Indent.
+* c-label-offset:                        C Indent.
+* c-mode-hook:                           Program Modes.
+* c-mode-map:                            Keymaps.
+* c-tab-always-indent:                   C Indent.
+* calendar-date-display-form:            Date Display Format.
+* calendar-daylight-savings-ends:        Daylight Savings.
+* calendar-daylight-savings-ends-time:   Daylight Savings.
+* calendar-daylight-savings-starts:      Daylight Savings.
+* calendar-daylight-time-offset:         Daylight Savings.
+* calendar-daylight-time-zone-name:      Sunrise/Sunset.
+* calendar-holiday-marker:               Calendar Customizing.
+* calendar-holidays:                     Holiday Customizing.
+* calendar-latitude:                     Sunrise/Sunset.
+* calendar-load-hook:                    Calendar Customizing.
+* calendar-location-name:                Sunrise/Sunset.
+* calendar-longitude:                    Sunrise/Sunset.
+* calendar-standard-time-zone-name:      Sunrise/Sunset.
+* calendar-time-display-form:            Time Display Format.
+* calendar-time-zone:                    Sunrise/Sunset.
+* calendar-today-marker:                 Calendar Customizing.
+* calendar-week-start-day:               Move to Beginning or End.
+* case-fold-search <1>:                  Replacement and Case.
+* case-fold-search:                      Search Case.
+* case-replace:                          Replacement and Case.
+* christian-holidays:                    Holiday Customizing.
+* coding:                                Recognize Coding.
+* command-history:                       Repetition.
+* command-line-args:                     Command Switches.
+* comment-column:                        Comments.
+* comment-end:                           Comments.
+* comment-indent-hook:                   Comments.
+* comment-line-start:                    Fortran Comments.
+* comment-line-start-skip:               Fortran Comments.
+* comment-multi-line:                    Comments.
+* comment-start:                         Comments.
+* comment-start-skip:                    Comments.
+* compare-ignore-case:                   Comparing Files.
+* compile-command:                       Compilation.
+* completion-auto-help:                  Completion Options.
+* completion-ignored-extensions:         Completion Options.
+* create-frame-hook:                     XEmacs under X.
+* ctl-arrow:                             Display Vars.
+* ctl-x-map:                             Keymaps.
+* current-input-method:                  Select Input Method.
+* data-directory:                        Startup Paths.
+* data-directory-list:                   Startup Paths.
+* debug-on-error:                        Lisp Debug.
+* debug-on-quit:                         Lisp Debug.
+* default-buffer-file-coding-system:     Specify Coding.
+* default-directory:                     File Names.
+* default-directory-alist:               File Names.
+* default-frame-alist:                   XEmacs under X.
+* default-input-method:                  Select Input Method.
+* default-major-mode:                    Choosing Modes.
+* delete-auto-save-files:                Auto Save Files.
+* delete-old-versions:                   Backup Deletion.
+* describe-function-show-arglist:        Name Help.
+* diary-date-forms:                      Diary Customizing.
+* diary-display-hook:                    Fancy Diary Display.
+* diary-entry-marker:                    Calendar Customizing.
+* diary-file:                            Format of Diary File.
+* diary-list-include-blanks:             Fancy Diary Display.
+* diary-mail-days:                       Diary Commands.
+* diff-switches:                         Comparing Files.
+* dired-kept-versions:                   Dired Deletion.
+* dired-listing-switches:                Dired Enter.
+* display-buffer-function:               Pop Up Window.
+* doc-directory:                         Startup Paths.
+* echo-keystrokes:                       Display Vars.
+* emacs-lisp-mode-hook:                  Program Modes.
+* emacs-roots:                           Startup Paths.
+* EMACSDATA:                             Startup Paths.
+* EMACSLOADPATH:                         Startup Paths.
+* EMACSLOCKDIR:                          Startup Paths.
+* EMACSPATH:                             Startup Paths.
+* enable-local-variables:                File Variables.
+* enable-recursive-minibuffers:          Minibuffer Edit.
+* esc-map:                               Keymaps.
+* european-calendar-style:               Date Formats.
+* exec-directory:                        Startup Paths.
+* exec-path:                             Startup Paths.
+* explicit-shell-file-name:              Interactive Shell.
+* file-coding-system-alist:              Recognize Coding.
+* file-name-coding-system:               Specify Coding.
+* fill-column:                           Fill Commands.
+* fill-prefix:                           Fill Prefix.
+* find-file-compare-truenames:           Visiting.
+* find-file-hooks:                       Visiting.
+* find-file-not-found-hooks:             Visiting.
+* find-file-run-dired:                   Visiting.
+* find-file-use-truenames:               Visiting.
+* fortran-check-all-num-for-matching-do: ForIndent Vars.
+* fortran-comment-indent-char:           Fortran Comments.
+* fortran-comment-indent-style:          Fortran Comments.
+* fortran-comment-line-column:           Fortran Comments.
+* fortran-comment-region:                Fortran Comments.
+* fortran-continuation-char:             ForIndent Conv.
+* fortran-continuation-indent:           ForIndent Vars.
+* fortran-do-indent:                     ForIndent Vars.
+* fortran-electric-line-number:          ForIndent Num.
+* fortran-if-indent:                     ForIndent Vars.
+* fortran-line-number-indent:            ForIndent Num.
+* fortran-minimum-statement-indent:      ForIndent Vars.
+* frame-icon-title-format <1>:           Command Switches.
+* frame-icon-title-format:               XEmacs under X.
+* frame-title-format <1>:                Command Switches.
+* frame-title-format:                    XEmacs under X.
+* general-holidays:                      Holiday Customizing.
+* global-map:                            Keymaps.
+* hebrew-holidays:                       Holiday Customizing.
+* help-map:                              Keymaps.
+* holidays-in-diary-buffer:              Diary Customizing.
+* indent-tabs-mode:                      Just Spaces.
+* Info-directory-list:                   Startup Paths.
+* INFOPATH:                              Startup Paths.
+* initial-calendar-window-hook:          Calendar Customizing.
+* initial-major-mode:                    Entering Emacs.
+* input-method-highlight-flag:           Input Methods.
+* input-method-verbose-flag:             Input Methods.
+* input-ring-size:                       Interactive Shell.
+* insert-default-directory <1>:          File Names.
+* insert-default-directory:              Minibuffer File.
+* isearch-mode-map:                      Keymaps.
+* islamic-holidays:                      Holiday Customizing.
+* kept-new-versions:                     Backup Deletion.
+* kept-old-versions:                     Backup Deletion.
+* keyboard-translate-table:              Intro to Keystrokes.
+* kill-ring-max:                         Earlier Kills.
+* LaTeX-mode-hook:                       TeX Print.
+* lisp-body-indention:                   Lisp Indent.
+* lisp-directory:                        Startup Paths.
+* lisp-indent-offset:                    Lisp Indent.
+* lisp-interaction-mode-hook:            Program Modes.
+* lisp-mode-hook:                        Program Modes.
+* lisp-mode-map:                         Keymaps.
+* list-diary-entries-hook:               Included Diary Files.
+* list-directory-brief-switches:         ListDir.
+* list-directory-verbose-switches:       ListDir.
+* load-path <1>:                         Loading.
+* load-path:                             Startup Paths.
+* local-holidays:                        Holiday Customizing.
+* lock-directory:                        Startup Paths.
+* lpr-switches:                          Hardcopy.
+* mail-abbrev-mailrc-file:               Mail Headers.
+* mail-abbrev-mode-regexp:               Mail Headers.
+* mail-alias-seperator-string:           Mail Headers.
+* mail-archive-file-name:                Mail Headers.
+* mail-header-separator:                 Mail Format.
+* mail-mode-hook:                        Mail Mode.
+* make-backup-files:                     Backup.
+* make-tags-files-invisible:             Find Tag.
+* mark-diary-entries-hook:               Included Diary Files.
+* mark-diary-entries-in-calendar:        Calendar Customizing.
+* mark-holidays-in-calendar:             Calendar Customizing.
+* mark-ring:                             Mark Ring.
+* mark-ring-max:                         Mark Ring.
+* meta-flag:                             Meta Key.
+* minibuffer-confirm-incomplete <1>:     Completion Options.
+* minibuffer-confirm-incomplete:         Minibuffer Edit.
+* minibuffer-local-completion-map:       Keymaps.
+* minibuffer-local-map:                  Keymaps.
+* minibuffer-local-must-match-map:       Keymaps.
+* minibuffer-local-ns-map:               Keymaps.
+* mode-line-inverse-video:               Mode Line.
+* modeline-pointer-glyph:                Mouse Selection.
+* muddle-mode-hook:                      Program Modes.
+* next-screen-context-lines:             Scrolling.
+* no-redraw-on-reenter:                  Display Vars.
+* nongregorian-diary-listing-hook:       Hebrew/Islamic Entries.
+* nongregorian-diary-marking-hook:       Hebrew/Islamic Entries.
+* nontext-pointer-glyph:                 Mouse Selection.
+* nroff-mode-hook:                       Nroff Mode.
+* number-of-diary-entries:               Diary Customizing.
+* other-holidays:                        Holiday Customizing.
+* outline-mode-hook:                     Outline Mode.
+* outline-regexp:                        Outline Format.
+* page-delimiter:                        Pages.
+* paragraph-separate:                    Paragraphs.
+* paragraph-start:                       Paragraphs.
+* parse-sexp-ignore-comments:            Syntax Entry.
+* PATH:                                  Startup Paths.
+* picture-mode-hook:                     Picture.
+* picture-tab-chars:                     Tabs in Picture.
+* plain-TeX-mode-hook:                   TeX Print.
+* print-diary-entries-hook:              Diary Customizing.
+* repeat-complex-command-map:            Keymaps.
+* require-final-newline:                 Saving.
+* save-abbrevs:                          Saving Abbrevs.
+* scheme-mode-hook:                      Program Modes.
+* scroll-conservatively:                 Scrolling.
+* scroll-step:                           Scrolling.
+* search-slow-speed:                     Incremental Search.
+* search-slow-window-lines:              Incremental Search.
+* selective-display-ellipses <1>:        Outline Visibility.
+* selective-display-ellipses:            Display Vars.
+* sentence-end:                          Sentences.
+* shell-cd-regexp:                       Interactive Shell.
+* shell-file-name:                       Single Shell.
+* shell-popd-regexp:                     Interactive Shell.
+* shell-prompt-pattern:                  Shell Mode.
+* shell-pushd-regexp:                    Interactive Shell.
+* sound-alist:                           Audible Bell.
+* superlock-file:                        Startup Paths.
+* tab-stop-list:                         Tab Stops.
+* tab-width:                             Display Vars.
+* tag-mark-stack-max:                    Find Tag.
+* tag-table-alist <1>:                   Find Tag.
+* tag-table-alist:                       Select Tags Table.
+* tags-always-build-completion-table:    Select Tags Table.
+* tags-build-completion-table:           Find Tag.
+* tags-file-name <1>:                    Find Tag.
+* tags-file-name:                        Select Tags Table.
+* term-file-prefix:                      Terminal Init.
+* term-setup-hook:                       Terminal Init.
+* TeX-mode-hook:                         TeX Print.
+* text-mode-hook:                        Text Mode.
+* text-pointer-glyph:                    Mouse Selection.
+* today-invisible-calendar-hook:         Calendar Customizing.
+* today-visible-calendar-hook:           Calendar Customizing.
+* track-eol:                             Basic.
+* truncate-lines:                        Continuation Lines.
+* truncate-partial-width-windows:        Split Window.
+* vc-command-messages:                   Variables for Check-in/out.
+* vc-comment-alist:                      Version Headers.
+* vc-default-back-end:                   Editing with VC.
+* vc-header-alist:                       Version Headers.
+* vc-initial-comment:                    Editing with VC.
+* vc-keep-workfiles:                     Editing with VC.
+* vc-log-mode-hook:                      Log Entries.
+* vc-make-backup-files:                  Editing with VC.
+* vc-mistrust-permissions:               Variables for Check-in/out.
+* vc-path:                               Variables for Check-in/out.
+* vc-static-header-alist:                Version Headers.
+* vc-suppress-confirm:                   Variables for Check-in/out.
+* version-control:                       Backup Names.
+* view-calendar-holidays-initially:      Calendar Customizing.
+* view-diary-entries-initially:          Calendar Customizing.
+* window-min-height:                     Change Window.
+* window-min-width:                      Change Window.
+* write-file-hooks:                      Saving.
+* x-frame-defaults:                      XEmacs under X.
+* zmacs-region-stays:                    Active Regions.
+* zmacs-regions:                         Active Regions.
+
+\1f
+File: xemacs.info,  Node: Concept Index,  Next: Frame,  Prev: Variable Index,  Up: Top
+
+Concept Index
+*************
+
+* Menu:
+
+* .mailrc file:                          Mail Headers.
+* // in file name:                       Minibuffer File.
+* Abbrev mode:                           Minor Modes.
+* abbrevs:                               Abbrevs.
+* aborting:                              Quitting.
+* accumulating text:                     Accumulating Text.
+* active fields (customization buffer):  Customization Groups.
+* active regions:                        Active Regions.
+* adding menu items:                     Menu Customization.
+* adding menus:                          Menu Customization.
+* againformation:                        Dissociated Press.
+* Apps menu <1>:                         Apps Menu.
+* Apps menu:                             Pull-down Menus.
+* apropos:                               Apropos.
+* architecture-specific directories:     Startup Paths.
+* arguments (from shell):                Command Switches.
+* ASCII:                                 Intro to Keystrokes.
+* Asm mode:                              Asm Mode.
+* astronomical day numbers:              Calendar Systems.
+* audible bell, changing:                Audible Bell.
+* Auto Delete Selection menu item:       Options Menu.
+* Auto Fill mode <1>:                    Minor Modes.
+* Auto Fill mode <2>:                    Comments.
+* Auto Fill mode:                        Auto Fill.
+* Auto-Save mode:                        Auto Save.
+* autoload:                              Loading.
+* backup file:                           Backup.
+* batch mode:                            Command Switches.
+* bell, changing:                        Audible Bell.
+* binary packages:                       Package Terminology.
+* binding:                               Commands.
+* blank lines <1>:                       Comments.
+* blank lines:                           Blank Lines.
+* body lines (Outline mode):             Outline Format.
+* bold font:                             Face Customization.
+* bookmarks:                             Bookmarks.
+* boredom:                               Amusements.
+* buffer:                                Frame.
+* buffer menu:                           Several Buffers.
+* buffers:                               Buffers.
+* Buffers menu <1>:                      Buffers Menu.
+* Buffers menu:                          Pull-down Menus.
+* Buffers Menu Length... menu item:      Options Menu.
+* Buffers Sub-Menus menu item:           Options Menu.
+* buggestion:                            Dissociated Press.
+* bugs:                                  Bugs.
+* byte code:                             Compiling Libraries.
+* C:                                     Programs.
+* C mode:                                Program Modes.
+* calendar:                              Calendar/Diary.
+* calendar and LaTeX:                    LaTeX Calendar.
+* calendar, first day of week:           Move to Beginning or End.
+* candle lighting times:                 Sexp Diary Entries.
+* case conversion <1>:                   Case.
+* case conversion:                       Fixing Case.
+* Case Sensitive Search menu item:       Options Menu.
+* centering:                             Fill Commands.
+* change log:                            Change Log.
+* changing buffers:                      Select Buffer.
+* changing menu items:                   Menu Customization.
+* character set:                         Intro to Keystrokes.
+* checking in files:                     Concepts of VC.
+* checking out files:                    Concepts of VC.
+* Chinese:                               Mule.
+* Chinese calendar:                      Calendar Systems.
+* Clear menu item:                       Edit Menu.
+* clipboard selections:                  X Clipboard Selection.
+* coding systems:                        Coding Systems.
+* command <1>:                           Key Bindings.
+* command:                               Commands.
+* command history:                       Repetition.
+* command line arguments:                Command Switches.
+* command name:                          Key Bindings.
+* comments:                              Comments.
+* comparing files:                       Comparing Files.
+* compilation errors:                    Compilation.
+* compiling files:                       Compilation.
+* completion:                            Completion.
+* completion (symbol names):             Lisp Completion.
+* continuation line:                     Continuation Lines.
+* Control-Meta:                          Lists.
+* Coptic calendar:                       Calendar Systems.
+* Copy menu item:                        Edit Menu.
+* copying files:                         Misc File Ops.
+* copying text <1>:                      Accumulating Text.
+* copying text:                          Yanking.
+* core distribution:                     Using Packages.
+* crashes:                               Auto Save.
+* creating directories:                  File Names.
+* creating files:                        Visiting.
+* current buffer:                        Buffers.
+* current stack frame:                   Lisp Debug.
+* cursor <1>:                            Basic.
+* cursor:                                Point.
+* customization <1>:                     Customization.
+* customization <2>:                     Lisp Indent.
+* customization:                         Commands.
+* customization buffer:                  Easy Customization.
+* customization groups:                  Customization Groups.
+* customizing faces:                     Face Customization.
+* cut buffers:                           X Selection Commands.
+* Cut menu item:                         Edit Menu.
+* cutting:                               Killing.
+* day of year:                           General Calendar.
+* daylight savings time:                 Daylight Savings.
+* debugger:                              Lisp Debug.
+* default argument:                      Minibuffer.
+* defuns:                                Defuns.
+* Delete Frame menu item:                File Menu.
+* deleting menu items:                   Menu Customization.
+* deletion <1>:                          Killing.
+* deletion:                              Basic.
+* deletion (of files) <1>:               Misc File Ops.
+* deletion (of files):                   Dired.
+* diary:                                 Diary.
+* diary buffer:                          Fancy Diary Display.
+* diary file:                            Format of Diary File.
+* ding:                                  Audible Bell.
+* directories:                           Startup Paths.
+* directory hierarchies:                 Startup Paths.
+* directory listing:                     ListDir.
+* Dired:                                 Dired.
+* disabled command:                      Disabling.
+* disabling menu items:                  Menu Customization.
+* Distribution:                          License.
+* doctor:                                Total Frustration.
+* double slash in file name:             Minibuffer File.
+* drastic changes:                       Reverting.
+* dribble file:                          Bugs.
+* early package hierarchies:             Startup Paths.
+* echo area:                             Echo Area.
+* Edit menu <1>:                         Edit Menu.
+* Edit menu:                             Pull-down Menus.
+* editable fields (customization buffer): Customization Groups.
+* editing level, recursive <1>:          Quitting.
+* editing level, recursive:              Recursive Edit.
+* EDT:                                   Emulation.
+* Eliza:                                 Total Frustration.
+* Emacs initialization file:             Init File.
+* Emacs-Lisp mode:                       Lisp Eval.
+* enabling menu items:                   Menu Customization.
+* encoding of characters:                Mule.
+* End Macro Recording menu item:         Edit Menu.
+* entering Emacs:                        Entering Emacs.
+* entering XEmacs:                       Entering Emacs.
+* environment:                           Single Shell.
+* error log:                             Compilation.
+* etags program:                         Create Tags Table.
+* Ethiopic calendar:                     Calendar Systems.
+* Execute Last Macro menu item:          Edit Menu.
+* Exit Emacs menu item:                  File Menu.
+* exiting <1>:                           Recursive Edit.
+* exiting:                               Exiting.
+* expansion (of abbrevs):                Abbrevs.
+* expression:                            Lists.
+* file dates:                            Interlocking.
+* file directory:                        ListDir.
+* File menu <1>:                         File Menu.
+* File menu:                             Pull-down Menus.
+* file names:                            File Names.
+* file protection:                       Interlocking.
+* files <1>:                             Visiting.
+* files <2>:                             Files.
+* files:                                 Basic.
+* fill prefix:                           Fill Prefix.
+* filling:                               Filling.
+* Font menu item:                        Options Menu.
+* fonts and faces:                       Face Customization.
+* formfeed:                              Pages.
+* Fortran mode:                          Fortran.
+* frame:                                 Frame.
+* French Revolutionary calendar:         Calendar Systems.
+* function <1>:                          Key Bindings.
+* function:                              Commands.
+* General Public License:                License.
+* global keymap:                         Keymaps.
+* global substitution:                   Replace.
+* graphic characters:                    Basic.
+* Greek:                                 Mule.
+* Gregorian calendar:                    Other Calendars.
+* grinding:                              Grinding.
+* hardcopy:                              Hardcopy.
+* header (TeX mode):                     TeX Print.
+* headers (of mail message):             Mail Headers.
+* heading lines (Outline mode):          Outline Format.
+* Hebrew calendar:                       Calendar Systems.
+* help:                                  Help.
+* Help menu <1>:                         Help Menu.
+* Help menu:                             Pull-down Menus.
+* hierarchies:                           Startup Paths.
+* history of commands:                   Repetition.
+* history of minibuffer input:           Minibuffer History.
+* holiday forms:                         Holiday Customizing.
+* holidays:                              Holidays.
+* horizontal scrolling:                  Horizontal Scrolling.
+* ignoriginal:                           Dissociated Press.
+* indentation <1>:                       Comments.
+* indentation <2>:                       Grinding.
+* indentation:                           Indentation.
+* inferior process:                      Compilation.
+* Info:                                  Misc Help.
+* init file:                             Init File.
+* input methods:                         Input Methods.
+* Insert File... menu item:              File Menu.
+* insertion:                             Basic.
+* international scripts:                 Mule.
+* interval operator (in regexps):        Etags Regexps.
+* invisible lines:                       Outline Mode.
+* IPA:                                   Mule.
+* Islamic calendar:                      Calendar Systems.
+* ISO commercial calendar:               Calendar Systems.
+* italic font:                           Face Customization.
+* Japanese:                              Mule.
+* Julian calendar:                       Calendar Systems.
+* Julian day numbers:                    Calendar Systems.
+* justification:                         Fill Commands.
+* key rebinding, permanent:              Init File.
+* key rebinding, this session:           Rebinding.
+* keyboard macros:                       Keyboard Macros.
+* keycode:                               Super and Hyper Keys.
+* keymap <1>:                            Keymaps.
+* keymap:                                Commands.
+* keystroke:                             Intro to Keystrokes.
+* keysym:                                Intro to Keystrokes.
+* keysyms:                               Super and Hyper Keys.
+* Kill Buffer menu item:                 File Menu.
+* kill ring:                             Yanking.
+* killing:                               Killing.
+* killing Emacs:                         Exiting.
+* Korean:                                Mule.
+* language environments:                 Language Environments.
+* last package hierarchies:              Startup Paths.
+* late package hierarchies:              Startup Paths.
+* LaTeX:                                 TeX Mode.
+* libraries:                             Lisp Libraries.
+* license to copy XEmacs:                License.
+* line number:                           Position Info.
+* Lisp:                                  Programs.
+* Lisp mode:                             Program Modes.
+* list:                                  Lists.
+* loading libraries:                     Loading.
+* loading Lisp code:                     Lisp Libraries.
+* local keymap:                          Keymaps.
+* local variables:                       Locals.
+* local variables in files:              File Variables.
+* locking and version control:           Concepts of VC.
+* log entry:                             Editing with VC.
+* mail <1>:                              Reading Mail.
+* mail:                                  Sending Mail.
+* major modes:                           Major Modes.
+* make:                                  Compilation.
+* manuals, on-line:                      Misc Help.
+* mark:                                  Mark.
+* mark ring <1>:                         Mark and Region.
+* mark ring:                             Mark Ring.
+* Markov chain:                          Dissociated Press.
+* master file:                           Concepts of VC.
+* matching parentheses:                  Matching.
+* Mayan calendar:                        Calendar Systems.
+* Mayan calendar round:                  Mayan Calendar.
+* Mayan haab calendar:                   Mayan Calendar.
+* Mayan long count:                      Mayan Calendar.
+* Mayan tzolkin calendar:                Mayan Calendar.
+* menus <1>:                             Change Window.
+* menus:                                 Pull-down Menus.
+* message <1>:                           Reading Mail.
+* message:                               Sending Mail.
+* Meta:                                  Words.
+* minibuffer <1>:                        Keymaps.
+* minibuffer <2>:                        M-x.
+* minibuffer:                            Minibuffer.
+* minibuffer history:                    Minibuffer History.
+* minor modes:                           Minor Modes.
+* mistakes, correcting <1>:              Fixit.
+* mistakes, correcting:                  Undo.
+* mocklisp:                              Mocklisp.
+* mode hook:                             Program Modes.
+* mode line <1>:                         Minor Modes.
+* mode line:                             Mode Line.
+* mode, Term:                            Term Mode.
+* modified (buffer):                     Visiting.
+* modifier key:                          Intro to Keystrokes.
+* modifier mapping:                      Super and Hyper Keys.
+* moon, phases of:                       Lunar Phases.
+* mouse operations:                      Additional Mouse Operations.
+* mouse selection:                       Mouse Selection.
+* moving inside the calendar:            Calendar Motion.
+* moving text:                           Yanking.
+* MULE:                                  Mule.
+* multi-frame XEmacs:                    XEmacs under X.
+* multibyte characters:                  Mule.
+* named configurations (RCS):            Snapshot Caveats.
+* narrowing:                             Narrowing.
+* New Frame menu item:                   File Menu.
+* newline:                               Basic.
+* non-incremental search:                Non-Incremental Search.
+* nroff:                                 Nroff Mode.
+* numeric arguments:                     Arguments.
+* omer count:                            Sexp Diary Entries.
+* on-line manuals:                       Misc Help.
+* Open File, New Frame... menu item:     File Menu.
+* Open File... menu item:                File Menu.
+* option <1>:                            Examining.
+* option:                                Variables.
+* Options menu <1>:                      Options Menu.
+* Options menu:                          Pull-down Menus.
+* other editors:                         Emulation.
+* outlines:                              Outline Mode.
+* outragedy:                             Dissociated Press.
+* Overstrike menu item:                  Options Menu.
+* Overwrite mode:                        Minor Modes.
+* package hierarchies:                   Startup Paths.
+* package path:                          Startup Paths.
+* packages:                              Packages.
+* page number:                           Position Info.
+* pages:                                 Pages.
+* paragraphs:                            Paragraphs.
+* parasha, weekly:                       Sexp Diary Entries.
+* Paren Highlighting menu item:          Options Menu.
+* parentheses:                           Matching.
+* Paste menu item:                       Edit Menu.
+* pasting:                               Yanking.
+* path:                                  Startup Paths.
+* paths:                                 Startup Paths.
+* per-buffer variables:                  Locals.
+* Persian calendar:                      Calendar Systems.
+* phases of the moon:                    Lunar Phases.
+* pictures:                              Picture.
+* point <1>:                             Basic.
+* point:                                 Point.
+* pointer face:                          Mouse Selection.
+* pointer shapes:                        Mouse Selection.
+* prefix key sequence:                   Key Sequences.
+* presidentagon:                         Dissociated Press.
+* primary selections:                    X Selection Commands.
+* Print Buffer menu item:                File Menu.
+* prompt:                                Minibuffer.
+* properbose:                            Dissociated Press.
+* Pull-down Menus <1>:                   Change Window.
+* Pull-down Menus:                       Pull-down Menus.
+* query replace:                         Query Replace.
+* quitting:                              Quitting.
+* quitting (in search):                  Incremental Search.
+* quoting:                               Basic.
+* random sentences:                      CONX.
+* RCS:                                   Concepts of VC.
+* Read Only menu item:                   Options Menu.
+* read-only buffer:                      Misc Buffer.
+* rebinding keys, permanently:           Init File.
+* rebinding keys, this session:          Rebinding.
+* rectangle <1>:                         Rectangles in Picture.
+* rectangle:                             RegRect.
+* rectangles:                            Rectangles.
+* recursive editing level <1>:           Quitting.
+* recursive editing level:               Recursive Edit.
+* redefining keys:                       Key Bindings Using Strings.
+* regexp:                                Regexp Search.
+* region <1>:                            Case.
+* region:                                Mark.
+* registered file:                       Concepts of VC.
+* registers:                             Registers.
+* regular expression:                    Regexp Search.
+* regular packages:                      Package Terminology.
+* removing directories:                  File Names.
+* replacement:                           Replace.
+* restriction:                           Narrowing.
+* Revert Buffer menu item:               File Menu.
+* root of a hierarchy:                   Startup Paths.
+* rosh hodesh:                           Sexp Diary Entries.
+* Russian:                               Mule.
+* Save Buffer As ... menu item:          File Menu.
+* Save Buffer menu item:                 File Menu.
+* Save Options:                          Options Menu.
+* saving:                                Visiting.
+* saving option value:                   Changing an Option.
+* SCCS:                                  Concepts of VC.
+* Scheme mode:                           Program Modes.
+* scrolling:                             Scrolling.
+* scrolling in the calendar:             Scroll Calendar.
+* searching:                             Search.
+* selected buffer:                       Buffers.
+* selected window:                       Basic Window.
+* selective display:                     Outline Mode.
+* self-documentation:                    Help.
+* sentences:                             Sentences.
+* setting option value:                  Changing an Option.
+* setting variables:                     Examining.
+* sexp:                                  Lists.
+* sexp diary entries:                    Sexp Diary Entries.
+* shell commands:                        Shell.
+* Shell mode:                            Shell Mode.
+* shift modifer:                         Representing Keystrokes.
+* shrinking XEmacs frame:                Exiting.
+* simultaneous editing:                  Interlocking.
+* single-file packages:                  Package Terminology.
+* site-specific directories:             Startup Paths.
+* Size menu item:                        Options Menu.
+* slashes repeated in file name:         Minibuffer File.
+* snapshots and version control:         Snapshots.
+* sorting:                               Sorting.
+* sorting diary entries:                 Fancy Diary Display.
+* source packages:                       Package Terminology.
+* spelling:                              Spelling.
+* Split Frame:                           File Menu.
+* Start Macro Recording menu item:       Edit Menu.
+* startup paths:                         Startup Paths.
+* string substitution:                   Replace.
+* subshell:                              Shell.
+* subtree (Outline mode):                Outline Visibility.
+* sunrise and sunset:                    Sunrise/Sunset.
+* suspending:                            Exiting.
+* switching buffers:                     Select Buffer.
+* Syntax Highlighting menu item:         Options Menu.
+* syntax table <1>:                      Syntax.
+* syntax table:                          Words.
+* tags table:                            Tags.
+* Teach Extended Commands menu item:     Options Menu.
+* techniquitous:                         Dissociated Press.
+* television:                            Appending Kills.
+* Term mode:                             Term Mode.
+* termscript file:                       Bugs.
+* TeX:                                   TeX Mode.
+* text:                                  Text.
+* Text mode:                             Text Mode.
+* Tools menu <1>:                        Tools Menu.
+* Tools menu:                            Pull-down Menus.
+* top level:                             Mode Line.
+* transposition <1>:                     Lists.
+* transposition <2>:                     Words.
+* transposition:                         Transpose.
+* truncation:                            Continuation Lines.
+* typos:                                 Fixit.
+* Un-split (Keep Others):                File Menu.
+* Un-split (Keep This):                  File Menu.
+* undo:                                  Undo.
+* Undo menu item:                        Edit Menu.
+* variable:                              Variables.
+* variables:                             Commands.
+* version control:                       Version Control.
+* version-specific directories:          Startup Paths.
+* vi:                                    Emulation.
+* viewing:                               Misc File Ops.
+* Viper:                                 Emulation.
+* visiting:                              Visiting.
+* visiting files:                        Visiting.
+* weeks, which day they start on:        Move to Beginning or End.
+* Weight menu item:                      Options Menu.
+* widening:                              Narrowing.
+* window:                                Frame.
+* windows:                               Windows.
+* Windows menu:                          Change Window.
+* word search:                           Word Search.
+* words <1>:                             Case.
+* words <2>:                             Words.
+* words:                                 Fixing Case.
+* work file:                             Concepts of VC.
+* X resources:                           X Resources.
+* yahrzeits <1>:                         Sexp Diary Entries.
+* yahrzeits:                             From Other Calendar.
+* yanking:                               Yanking.
+
+
diff --git a/lib-src/make-dump-id.c b/lib-src/make-dump-id.c
new file mode 100644 (file)
index 0000000..dba2a9c
--- /dev/null
@@ -0,0 +1,59 @@
+/* Generate a unique dump-id for use with the portable dumper.
+   Copyright (C) 2000 Olivier Galibert, Martin Buchholz
+
+This file is part of XEmacs.
+
+XEmacs 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.
+
+XEmacs 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 XEmacs; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "../src/systime.h"
+
+/* Generates an (extremely) pseudo random number for the dump-id */
+static unsigned int
+generate_dump_id (void)
+{
+  EMACS_TIME thyme;
+  EMACS_GET_TIME (thyme);
+
+  return (unsigned int) (EMACS_SECS (thyme) ^ EMACS_USECS (thyme));
+}
+
+int
+main (int argc, char *argv[])
+{
+  FILE *f;
+
+  if ((f = fopen ("dump-id.c", "w")) == NULL)
+    {
+      perror ("open dump-id.c");
+      return EXIT_FAILURE;
+    }
+
+  fprintf (f,
+          "#include <dump-id.h>\n"
+          "unsigned int dump_id = %uU;\n",
+          generate_dump_id ());
+
+  if ((fclose (f)) != 0)
+    {
+      perror ("close dump-id.c");
+      return EXIT_FAILURE;
+    }
+
+  return EXIT_SUCCESS;
+}
diff --git a/man/lispref/gutter.texi b/man/lispref/gutter.texi
new file mode 100644 (file)
index 0000000..4da9fa2
--- /dev/null
@@ -0,0 +1,395 @@
+@c -*-texinfo-*-
+@c This is part of the XEmacs Lisp Reference Manual.
+@c Copyright (C) 1994, 1995 Ben Wing.
+@c Copyright (C) 1999 Andy Piper.
+@c Copyright (C) 1999 Stephen J. Turnbull.
+@c See the file lispref.texi for copying conditions.
+@setfilename ../../info/gutter.info
+@node Gutter, Scrollbars, Toolbar, top
+@chapter Gutter
+@cindex gutter
+
+  A gutter is a rectangle displayed along one edge of a frame.  It
+can contain arbitrary text or graphics.
+
+@menu
+* Gutter Intro::               An introduction.
+* Gutter Descriptor Format::   How to create a gutter.
+* Specifying a Gutter::                Setting a gutter's contents.
+* Other Gutter Variables::     Controlling the size of gutters.
+* Common Gutter Widgets::       Things to put in gutters.
+@end menu
+
+@node Gutter Intro, Gutter Descriptor Format, , Gutter
+@section Gutter Intro
+
+  A @dfn{gutter} is a rectangle displayed along one edge of a frame.  It
+can contain arbitrary text or graphics.  It could be considered a
+generalization of a toolbar, although toolbars are not currently
+implemented using gutters.
+
+  In XEmacs, a gutter can be displayed along any of the four edges
+of the frame, and two or more different edges can be displaying
+gutters simultaneously.  The contents, thickness, and visibility of
+the gutters can be controlled separately, and the values can
+be per-buffer, per-frame, etc., using specifiers (@pxref{Specifiers}).
+
+  Normally, there is one gutter displayed in a frame.  Usually, this is
+the default gutter, containing buffer tabs, but modes cab override this
+and substitute their own gutter.  This default gutter is usually
+positioned along the top of the frame, but this can be changed using
+@code{set-default-gutter-position}.
+
+  Note that, for each of the gutter properties (contents, thickness,
+and visibility), there is a separate specifier for each of the four
+gutter positions (top, bottom, left, and right), and an additional
+specifier for the ``default'' gutter, i.e. the gutter whose
+position is controlled by @code{set-default-gutter-position}.  The
+way this works is that @code{set-default-gutter-position} arranges
+things so that the appropriate position-specific specifiers for the
+default position inherit from the corresponding default specifiers.
+That way, if the position-specific specifier does not give a value
+(which it usually doesn't), then the value from the default
+specifier applies.  If you want to control the default gutter, you
+just change the default specifiers, and everything works.  A package
+such as VM that wants to put its own gutter in a different location
+from the default just sets the position-specific specifiers, and if
+the user sets the default gutter to the same position, it will just
+not be visible.
+
+@node Gutter Descriptor Format, Specifying a Gutter, Gutter Intro, Gutter
+@section Gutter Descriptor Format
+
+  The contents of a gutter are specified using a @dfn{gutter descriptor}.
+The format of a gutter descriptor is a list of @dfn{gutter button
+descriptors}.  Each gutter button descriptor is a vector in one of the
+following formats:
+
+@itemize @bullet
+@item
+@code{[@var{glyph-list} @var{function} @var{enabled-p} @var{help}]}
+@item
+@code{[:style @var{2d-or-3d}]}
+@item
+@code{[:style @var{2d-or-3d} :size @var{width-or-height}]}
+@item
+@code{[:size @var{width-or-height} :style @var{2d-or-3d}]}
+@end itemize
+
+  Optionally, one of the gutter button descriptors may be @code{nil}
+instead of a vector; this signifies the division between the gutter
+buttons that are to be displayed flush-left, and the buttons to be
+displayed flush-right.
+
+  The first vector format above specifies a normal gutter button;
+the others specify blank areas in the gutter.
+
+  For the first vector format:
+
+@itemize @bullet
+@item
+@var{glyph-list} should be a list of one to six glyphs (as created by
+@code{make-glyph}) or a symbol whose value is such a list.  The first
+glyph, which must be provided, is the glyph used to display the gutter
+button when it is in the ``up'' (not pressed) state.  The optional
+second glyph is for displaying the button when it is in the ``down''
+(pressed) state.  The optional third glyph is for when the button is
+disabled.  The last three glyphs are for displaying the button in the
+``up'', ``down'', and ``disabled'' states, respectively, but are used
+when the user has called for captioned gutter buttons (using
+@code{gutter-buttons-captioned-p}).  The function
+@code{gutter-make-button-list} is useful in creating these glyph lists.
+
+@item
+Even if you do not provide separate down-state and disabled-state
+glyphs, the user will still get visual feedback to indicate which
+state the button is in.  Buttons in the up-state are displayed
+with a shadowed border that gives a raised appearance to the
+button.  Buttons in the down-state are displayed with shadows that
+give a recessed appearance.  Buttons in the disabled state are
+displayed with no shadows, giving a 2-d effect.
+
+@item
+If some of the gutter glyphs are not provided, they inherit as follows:
+
+@example
+     UP:                up
+     DOWN:              down -> up
+     DISABLED:          disabled -> up
+     CAP-UP:            cap-up -> up
+     CAP-DOWN:          cap-down -> cap-up -> down -> up
+     CAP-DISABLED:      cap-disabled -> cap-up -> disabled -> up
+@end example
+
+@item
+The second element @var{function} is a function to be called when the
+gutter button is activated (i.e. when the mouse is released over the
+gutter button, if the press occurred in the gutter).  It can be any
+form accepted by @code{call-interactively}, since this is how it is
+invoked.
+
+@item
+The third element @var{enabled-p} specifies whether the gutter button
+is enabled (disabled buttons do nothing when they are activated, and are
+displayed differently; see above).  It should be either a boolean or a
+form that evaluates to a boolean.
+
+@item
+The fourth element @var{help}, if non-@code{nil}, should be a string.
+This string is displayed in the echo area when the mouse passes over the
+gutter button.
+@end itemize
+
+  For the other vector formats (specifying blank areas of the gutter):
+
+@itemize @bullet
+@item
+@var{2d-or-3d} should be one of the symbols @code{2d} or @code{3d},
+indicating whether the area is displayed with shadows (giving it a
+raised, 3-d appearance) or without shadows (giving it a flat
+appearance).
+
+@item
+@var{width-or-height} specifies the length, in pixels, of the blank
+area.  If omitted, it defaults to a device-specific value (8 pixels for
+X devices).
+@end itemize
+
+@defun gutter-make-button-list up &optional down disabled cap-up cap-down cap-disabled
+This function calls @code{make-glyph} on each arg and returns a list of
+the results.  This is useful for setting the first argument of a gutter
+button descriptor (typically, the result of this function is assigned
+to a symbol, which is specified as the first argument of the gutter
+button descriptor).
+@end defun
+
+@defun check-gutter-button-syntax button &optional noerror
+Verify the syntax of entry @var{button} in a gutter description list.
+If you want to verify the syntax of a gutter description list as a
+whole, use @code{check-valid-instantiator} with a specifier type of
+@code{gutter}.
+@end defun
+
+@node Specifying a Gutter, Other Gutter Variables, Gutter Descriptor Format, Gutter
+@section Specifying a Gutter
+
+  In order to specify the contents of a gutter, set one of the specifier
+variables @code{default-gutter}, @code{top-gutter},
+@code{bottom-gutter}, @code{left-gutter}, or @code{right-gutter}.
+These are specifiers, which means you set them with @code{set-specifier}
+and query them with @code{specifier-specs} or @code{specifier-instance}.
+You will get an error if you try to set them using @code{setq}.  The
+valid instantiators for these specifiers are gutter descriptors, as
+described above.  @xref{Specifiers}, for more information.
+
+  Most of the time, you will set @code{default-gutter}, which allows
+the user to choose where the gutter should go.
+
+@defvr Specifier default-gutter
+The position of this gutter is specified in the function
+@code{default-gutter-position}.  If the corresponding 
+position-specific gutter (e.g. @code{top-gutter} if
+@code{default-gutter-position} is @code{top}) does not specify a
+gutter in a particular domain, then the value of @code{default-gutter}
+in that domain, of any, will be used instead.
+@end defvr
+
+  Note that the gutter at any particular position will not be displayed
+unless its thickness (width or height, depending on orientation) is
+non-zero and its visibility status is true.  The thickness is controlled
+by the specifiers @code{top-gutter-height},
+@code{bottom-gutter-height}, @code{left-gutter-width}, and
+@code{right-gutter-width}, and the visibility status is controlled by
+the specifiers @code{top-gutter-visible-p},
+@code{bottom-gutter-visible-p}, @code{left-gutter-visible-p}, and
+@code{right-gutter-visible-p} (@pxref{Other Gutter Variables}).
+
+@defun set-default-gutter-position position
+This function sets the position that the @code{default-gutter} will be
+displayed at.  Valid positions are the symbols @code{top},
+@code{bottom}, @code{left} and @code{right}.  What this actually does is
+set the fallback specifier for the position-specific specifier
+corresponding to the given position to @code{default-gutter}, and set
+the fallbacks for the other position-specific specifiers to @code{nil}.
+It also does the same thing for the position-specific thickness and
+visibility specifiers, which inherit from one of
+@code{default-gutter-height} or @code{default-gutter-width}, and from
+@code{default-gutter-visible-p}, respectively (@pxref{Other Gutter
+Variables}).
+@end defun
+
+@defun default-gutter-position
+This function returns the position that the @code{default-gutter} will
+be displayed at.
+@end defun
+
+  You can also explicitly set a gutter at a particular position.  When
+redisplay determines what to display at a particular position in a
+particular domain (i.e. window), it first consults the position-specific
+gutter.  If that does not yield a gutter descriptor, the
+@code{default-gutter} is consulted if @code{default-gutter-position}
+indicates this position.
+
+@defvr Specifier top-gutter
+Specifier for the gutter at the top of the frame.
+@end defvr
+
+@defvr Specifier bottom-gutter
+Specifier for the gutter at the bottom of the frame.
+@end defvr
+
+@defvr Specifier left-gutter
+Specifier for the gutter at the left edge of the frame.
+@end defvr
+
+@defvr Specifier right-gutter
+Specifier for the gutter at the right edge of the frame.
+@end defvr
+
+@defun gutter-specifier-p object
+This function returns non-nil if @var{object} is a gutter specifier.
+Gutter specifiers are the actual objects contained in the gutter
+variables described above, and their valid instantiators are
+gutter descriptors (@pxref{Gutter Descriptor Format}).
+@end defun
+
+@node Other Gutter Variables, Common Gutter Widgets, Specifying a Gutter, Gutter
+@section Other Gutter Variables
+
+  The variables to control the gutter thickness, visibility status, and
+captioned status are all specifiers.  @xref{Specifiers}.
+
+@defvr Specifier default-gutter-height
+This specifies the height of the default gutter, if it's oriented
+horizontally.  The position of the default gutter is specified by the
+function @code{set-default-gutter-position}.  If the corresponding
+position-specific gutter thickness specifier
+(e.g. @code{top-gutter-height} if @code{default-gutter-position} is
+@code{top}) does not specify a thickness in a particular domain (a
+window or a frame), then the value of @code{default-gutter-height} or
+@code{default-gutter-width} (depending on the gutter orientation) in
+that domain, if any, will be used instead.
+@end defvr
+
+@defvr Specifier default-gutter-width
+This specifies the width of the default gutter, if it's oriented
+vertically.  This behaves like @code{default-gutter-height}.
+@end defvr
+
+  Note that @code{default-gutter-height} is only used when
+@code{default-gutter-position} is @code{top} or @code{bottom}, and
+@code{default-gutter-width} is only used when
+@code{default-gutter-position} is @code{left} or @code{right}.
+
+@defvr Specifier top-gutter-height
+This specifies the height of the top gutter.
+@end defvr
+
+@defvr Specifier bottom-gutter-height
+This specifies the height of the bottom gutter.
+@end defvr
+
+@defvr Specifier left-gutter-width
+This specifies the width of the left gutter.
+@end defvr
+
+@defvr Specifier right-gutter-width
+This specifies the width of the right gutter.
+@end defvr
+
+  Note that all of the position-specific gutter thickness specifiers
+have a fallback value of zero when they do not correspond to the
+default gutter.  Therefore, you will have to set a non-zero thickness
+value if you want a position-specific gutter to be displayed.
+
+@defvr Specifier default-gutter-visible-p
+This specifies whether the default gutter is visible.  The position of
+the default gutter is specified by the function
+@code{set-default-gutter-position}.  If the corresponding position-specific
+gutter visibility specifier (e.g. @code{top-gutter-visible-p} if
+@code{default-gutter-position} is @code{top}) does not specify a
+visible-p value in a particular domain (a window or a frame), then the
+value of @code{default-gutter-visible-p} in that domain, if any, will
+be used instead.
+@end defvr
+
+@defvr Specifier top-gutter-visible-p
+This specifies whether the top gutter is visible.
+@end defvr
+
+@defvr Specifier bottom-gutter-visible-p
+This specifies whether the bottom gutter is visible.
+@end defvr
+
+@defvr Specifier left-gutter-visible-p
+This specifies whether the left gutter is visible.
+@end defvr
+
+@defvr Specifier right-gutter-visible-p
+This specifies whether the right gutter is visible.
+@end defvr
+
+@code{default-gutter-visible-p} and all of the position-specific
+gutter visibility specifiers have a fallback value of true.
+
+  Internally, gutter thickness and visibility specifiers are instantiated
+in both window and frame domains, for different purposes.  The value in
+the domain of a frame's selected window specifies the actual gutter
+thickness or visibility that you will see in that frame.  The value in
+the domain of a frame itself specifies the gutter thickness or
+visibility that is used in frame geometry calculations.
+
+  Thus, for example, if you set the frame width to 80 characters and the
+left gutter width for that frame to 68 pixels, then the frame will be
+sized to fit 80 characters plus a 68-pixel left gutter.  If you then
+set the left gutter width to 0 for a particular buffer (or if that
+buffer does not specify a left gutter or has a nil value specified for
+@code{left-gutter-visible-p}), you will find that, when that buffer is
+displayed in the selected window, the window will have a width of 86 or
+87 characters -- the frame is sized for a 68-pixel left gutter but the
+selected window specifies that the left gutter is not visible, so it is
+expanded to take up the slack.
+
+@defvr Specifier gutter-buttons-captioned-p
+Whether gutter buttons are captioned.  This affects which glyphs from a
+gutter button descriptor are chosen.  @xref{Gutter Descriptor Format}.
+@end defvr
+
+  You can also reset the gutter to what it was when XEmacs started up.
+
+@defvr Constant initial-gutter-spec
+The gutter descriptor used to initialize @code{default-gutter} at
+startup.
+@end defvr
+
+@node Common Gutter Widgets, , Other Gutter Variables, Gutter
+@section Common Gutter Widgets
+
+  A gutter can contain arbitrary text.  So, for example, in an Info
+buffer you could put the title of the current node in the top gutter,
+and it would not scroll out of view in a long node.  (This is an
+artificial example, since usually the node name is sufficiently
+descriptive, and Info puts that in the mode line.)
+
+  A more common use for the gutter is to hold some kind of active
+widget.  The buffer-tab facility, available in all XEmacs frames,
+creates an array of file-folder-like tabs, which the user can click with
+the mouse to switch buffers.  W3 uses a progress-bar widget in the
+bottom gutter to give a visual indication of the progress of
+time-consuming operations like downloading.
+
+@menu
+* Buffer Tabs::         Tabbed divider index metaphor for switching buffers.
+* Progress Bars::       Visual indication of operation progress.
+@end menu
+
+@node Buffer Tabs, Progress Bars, , Common Gutter Widgets
+@section Buffer Tabs
+
+  Not documented yet.
+
+@node Progress Bars, , Buffer Tabs, Common Gutter Widgets
+@section Progress Bars
+
+  Not documented yet.
+
diff --git a/man/lispref/postgresql.texi b/man/lispref/postgresql.texi
new file mode 100644 (file)
index 0000000..982cc95
--- /dev/null
@@ -0,0 +1,1254 @@
+@c -*-texinfo-*-
+@c This is part of the XEmacs Lisp Reference Manual.
+@c Copyright (C) 2000 Electrotechnical Laboratory, JAPAN
+@c Licensed to the Free Software Foundation
+@c See the file lispref.texi for copying conditions.
+@c Thank you Oscar Figueiredo!  This file was shamelessly cloned from
+@c  ldap.texi.
+@setfilename ../../info/postgresql.info
+@node PostgreSQL Support, Internationalization, LDAP Support, top
+@chapter PostgreSQL Support
+@cindex PostgreSQL
+
+XEmacs can be linked with PostgreSQL libpq run-time support to provide
+relational database access from Emacs Lisp code.
+
+@menu
+* Building XEmacs with PostgreSQL support::
+* XEmacs PostgreSQL libpq API::
+* XEmacs PostgreSQL libpq Examples::
+@end menu
+
+@node Building XEmacs with PostgreSQL support, XEmacs PostgreSQL libpq API,  ,PostgreSQL Support
+@comment  node-name,  next,  previous,  up
+@section Building XEmacs with PostgreSQL support
+
+XEmacs PostgreSQL support requires linking to the PostgreSQL libpq.so
+library.  Describing how to build and install PostgreSQL is beyond the
+scope of this document, see the PostgreSQL manual for details.
+
+If you have installed XEmacs from one of the binary kits on
+(@url{ftp://ftp.xemacs.org/}), or are using an XEmacs binary from a CD
+ROM, you should have XEmacs PostgreSQL support by default.  If you are
+building XEmacs from source on a Linux system with PostgreSQL installed
+into the default location, it should be autodetected when you run
+configure.  If you have installed PostgreSQL into its non-Linux default
+location, @file{/usr/local/pgsql}, you must specify
+@code{--site-prefixes=/usr/local/pgsql} when you run configure.  If
+you installed PostgreSQL into another location, use that instead of
+@file{/usr/local/pgsql} when specifying @code{--site-prefixes}.
+
+As of XEmacs 21.2, PostgreSQL versions 6.5.3 and 7.0 are supported.
+XEmacs Lisp support for V7.0 is somewhat more extensive than support for
+V6.5.  In particular, asynchronous queries are supported.
+
+@node XEmacs PostgreSQL libpq API, XEmacs PostgreSQL libpq Examples, Building XEmacs with PostgreSQL support, PostgreSQL Support
+@comment  node-name,  next,  previous,  up
+@section XEmacs PostgreSQL libpq API
+
+XEmacs PostgreSQL API is intended to be a policy-free, low-level binding
+to libpq.  The intent is to provide all the basic functionality and then
+let high level Lisp code decide its own policies.
+
+This documentation assumes that the reader has knowledge of SQL, but
+requires no prior knowledge of libpq.
+
+There are many examples in this manual and some setup will be required.
+In order to run most of the following examples, the following code needs
+to be executed.  In addition to the data is in this table, nearly all of
+the examples will assume that the free variable @code{P} refers to this
+database connection.  The examples in the original edition of this
+manual were run against Postgres 7.0beta1.
+
+@example
+(progn
+  (setq P (pq-connectdb ""))
+  ;; id is the primary key, shikona is a Japanese word that
+  ;; means `the professional name of a Sumo wrestler', and
+  ;; rank is the Sumo rank name.
+  (pq-exec P (concat "CREATE TABLE xemacs_test"
+                     " (id int, shikona text, rank text);"))
+  (pq-exec P "COPY xemacs_test FROM stdin;")
+  (pq-put-line P "1\tMusashimaru\tYokuzuna\n")
+  (pq-put-line P "2\tDejima\tOozeki\n")
+  (pq-put-line P "3\tMusoyama\tSekiwake\n")
+  (pq-put-line P "4\tMiyabiyama\tSekiwake\n")
+  (pq-put-line P "5\tWakanoyama\tMaegashira\n")
+  (pq-put-line P "\\.\n")
+  (pq-end-copy P))
+     @result{} nil
+@end example
+
+@menu
+* libpq Lisp Variables::
+* libpq Lisp Symbols and DataTypes::
+* Synchronous Interface Functions::
+* Asynchronous Interface Functions::
+* Large Object Support::
+* Other libpq Functions::
+* Unimplemented libpq Functions::
+@end menu
+
+@node libpq Lisp Variables, libpq Lisp Symbols and DataTypes, XEmacs PostgreSQL libpq API, XEmacs PostgreSQL libpq API
+@comment  node-name,  next,  previous,  up
+@subsection libpq Lisp Variables
+
+Various Unix environment variables are used by libpq to provide defaults
+to the many different parameters.  In the XEmacs Lisp API, these
+environment variables are bound to Lisp variables to provide more
+convenient access to Lisp Code.  These variables are passed to the
+backend database server during the establishment of a database
+connection and when the @code{pq-setenv} call is made.
+
+@defvar pg:host
+Initialized from the @var{PGHOST} environment variable.  The default
+host to connect to.
+@end defvar
+
+@defvar pg:user
+Initialized from the @var{PGUSER} environment variable.  The default
+database user name.
+@end defvar
+
+@defvar pg:options
+Initialized from the @var{PGOPTIONS} environment variable.  Default
+additional server options.
+@end defvar
+
+@defvar pg:port
+Initialized from the @var{PGPORT} environment variable.  The default TCP
+port to connect to.
+@end defvar
+
+@defvar pg:tty
+Initialized from the @var{PGTTY} environment variable.  The default
+debugging TTY.
+
+Compatibility note:  Debugging TTYs are turned off in the XEmacs Lisp
+binding.
+@end defvar
+
+@defvar pg:database
+Initialized from the @var{PGDATABASE} environment variable.  The default
+database to connect to.
+@end defvar
+
+@defvar pg:realm
+Initialized from the @var{PGREALM} environment variable.  The default
+Kerberos realm.
+@end defvar
+
+@defvar pg:client-encoding
+Initialized from the @var{PGCLIENTENCODING} environment variable.  The
+default client encoding.
+
+Compatibility note:  This variable is not present in non-Mule XEmacsen.
+This variable is not present in versions of libpq prior to 7.0.
+In the current implementation, client encoding is equivalent to the
+@code{file-name-coding-system} format.
+@end defvar
+
+@c unused
+@defvar pg:authtype
+Initialized from the @var{PGAUTHTYPE} environment variable.  The default
+authentication scheme used.
+
+Compatibility note:  This variable is unused in versions of libpq after
+6.5.  It is not implemented at all in the XEmacs Lisp binding.
+@end defvar
+
+@defvar pg:geqo
+Initialized from the @var{PGGEQO} environment variable.  Genetic
+optimizer options.
+@end defvar
+
+@defvar pg:cost-index
+Initialized from the @var{PGCOSTINDEX} environment variable.  Cost index
+options.
+@end defvar
+
+@defvar pg:cost-heap
+Initialized from the @var{PGCOSTHEAP} environment variable.  Cost heap
+options.
+@end defvar
+
+@defvar pg:tz
+Initialized from the @var{PGTZ} environment variable.  Default
+timezone.
+@end defvar
+
+@defvar pg:date-style
+Initialized from the @var{PGDATESTYLE} environment variable.  Default
+date style in returned date objects.
+@end defvar
+
+@defvar pg-coding-system
+This is a variable controlling which coding system is used to encode
+non-ASCII strings sent to the database.
+
+Compatibility Note: This variable is not present in InfoDock.
+@end defvar
+
+@node libpq Lisp Symbols and DataTypes, Synchronous Interface Functions, libpq Lisp Variables, XEmacs PostgreSQL libpq API
+@comment  node-name,  next,  previous,  up
+@subsection libpq Lisp Symbols and Datatypes
+
+The following set of symbols are used to represent the intermediate
+states involved in the asynchronous interface.
+
+@defvr {Symbol} pgres::polling-failed
+Undocumented.  A fatal error has occurred during processing of an
+asynchronous operation.
+@end defvr
+
+@defvr {Symbol} pgres::polling-reading
+An intermediate status return during an asynchronous operation.  It
+indicates that one may use @code{select} before polling again.
+@end defvr
+
+@defvr {Symbol} pgres::polling-writing
+An intermediate status return during an asynchronous operation.  It
+indicates that one may use @code{select} before polling again.
+@end defvr
+
+@defvr {Symbol} pgres::polling-ok
+An asynchronous operation has successfully completed.
+@end defvr
+
+@defvr {Symbol} pgres::polling-active
+An intermediate status return during an asynchronous operation.  One can
+call the poll function again immediately.
+@end defvr
+
+@defun pq-pgconn conn field
+@var{conn} A database connection object.
+@var{field} A symbol indicating which field of PGconn to fetch.  Possible
+values are shown in the following table.
+@table @code
+@item pq::db
+Database name
+@item pq::user
+Database user name
+@item pq::pass
+Database user's password
+@item pq::host
+Hostname database server is running on
+@item pq::port
+TCP port number used in the connection
+@item pq::tty
+Debugging TTY
+
+Compatibility note:  Debugging TTYs are not used in the XEmacs Lisp API.
+@item pq::options
+Additional server options
+@item pq::status
+Connection status.  Possible return values are shown in the following
+table.
+@table @code
+@item pg::connection-ok
+The normal, connected status.
+@item pg::connection-bad
+The connection is not open and the PGconn object needs to be deleted by
+@code{pq-finish}.
+@item pg::connection-started
+An asynchronous connection has been started, but is not yet complete.
+@item pg::connection-made
+An asynchronous connect has been made, and there is data waiting to be sent.
+@item pg::connection-awaiting-response
+Awaiting data from the backend during an asynchronous connection.
+@item pg::connection-auth-ok
+Received authentication, waiting for the backend to start up.
+@item pg::connection-setenv
+Negotiating environment during an asynchronous connection.
+@end table
+@item pq::error-message
+The last error message that was delivered to this connection.
+@item pq::backend-pid
+The process ID of the backend database server.
+@end table
+@end defun
+
+The @code{PGresult} object is used by libpq to encapsulate the results
+of queries.  The printed representation takes on four forms.  When the
+PGresult object contains tuples from an SQL @code{SELECT} it will look
+like:
+
+@example
+(setq R (pq-exec P "SELECT * FROM xemacs_test;"))
+     @result{} #<PGresult PGRES_TUPLES_OK[5] - SELECT>
+@end example
+
+The number in brackets indicates how many rows of data are available.
+When the PGresult object is the result of a command query that doesn't
+return anything, it will look like:
+
+@example
+(pq-exec P "CREATE TABLE a_new_table (i int);")
+     @result{} #<PGresult PGRES_COMMAND_OK - CREATE>
+@end example
+
+When either the query is a command-type query that can affect a number
+of different rows, but doesn't return any of them it will look like:
+
+@example
+(progn
+  (pq-exec P "INSERT INTO a_new_table VALUES (1);")
+  (pq-exec P "INSERT INTO a_new_table VALUES (2);")
+  (pq-exec P "INSERT INTO a_new_table VALUES (3);")
+  (setq R (pq-exec P "DELETE FROM a_new_table;")))
+     @result{} #<PGresult PGRES_COMMAND_OK[3] - DELETE 3>
+@end example
+
+Lastly, when the underlying PGresult object has been deallocated
+directly by @code{pq-clear} the printed representation will look like:
+
+@example
+(progn
+  (setq R (pq-exec P "SELECT * FROM xemacs_test;"))
+  (pq-clear R)
+  R)
+     @result{} #<PGresult DEAD>
+@end example
+
+The following set of functions are accessors to various data in the PGresult
+object.
+
+@defun pq-result-status result
+Return status of a query result.
+@var{result} is a PGresult object.  The return value is one of the
+symbols in the following table.
+@table @code
+@item pgres::empty-query
+A query contained no text.  This is usually the result of a recoverable
+error, or a minor programming error.
+@item pgres::command-ok
+A query command that doesn't return anything was executed properly by
+the backend.
+@item pgres::tuples-ok
+A query command that returns tuples was executed properly by the
+backend.
+@item pgres::copy-out
+Copy Out data transfer is in progress.
+@item pgres::copy-in
+Copy In data transfer is in progress.
+@item pgres::bad-response
+An unexpected response was received from the backend.
+@item pgres::nonfatal-error
+Undocumented.  This value is returned when the libpq function
+@code{PQresultStatus} is called with a @var{NULL} pointer.
+@item pgres::fatal-error
+Undocumented.  An error has occurred in processing the query and the
+operation was not completed.
+@end table
+@end defun
+
+@defun pq-res-status result
+Return the query result status as a string, not a symbol.
+@var{result} is a PGresult object.
+
+@example
+(setq R (pq-exec P "SELECT * FROM xemacs_test;"))
+     @result{} #<PGresult PGRES_TUPLES_OK[5] - SELECT>
+(pq-res-status R)
+     @result{} "PGRES_TUPLES_OK"
+@end example
+@end defun
+
+@defun pq-result-error-message result
+Return an error message generated by the query, if any.
+@var{result} is a PGresult object.
+
+@example
+(setq R (pq-exec P "SELECT * FROM xemacs-test;"))
+     @result{} <A fatal error is signaled in the echo area>
+(pq-result-error-message R)
+     @result{} "ERROR:  parser: parse error at or near \"-\"
+"
+@end example
+@end defun
+
+@defun pq-ntuples result
+Return the number of tuples in the query result.
+@var{result} is a PGresult object.
+
+@example
+(setq R (pq-exec P "SELECT * FROM xemacs_test;"))
+     @result{} #<PGresult PGRES_TUPLES_OK[5] - SELECT>
+(pq-ntuples R)
+     @result{} 5
+@end example
+@end defun
+
+@defun pq-nfields result
+Return the number of fields in each tuple of the query result.
+@var{result} is a PGresult object.
+
+@example
+(setq R (pq-exec P "SELECT * FROM xemacs_test;"))
+     @result{} #<PGresult PGRES_TUPLES_OK[5] - SELECT>
+(pq-nfields R)
+     @result{} 3
+@end example
+@end defun
+
+@defun pq-binary-tuples result
+Returns t if binary tuples are present in the results, nil otherwise.
+@var{result} is a PGresult object.
+
+@example
+(setq R (pq-exec P "SELECT * FROM xemacs_test;"))
+     @result{} #<PGresult PGRES_TUPLES_OK[5] - SELECT>
+(pq-binary-tuples R)
+     @result{} nil
+@end example
+@end defun
+
+@defun pq-fname result field-index
+Returns the name of a specific field.
+@var{result} is a PGresult object.
+@var{field-index} is the number of the column to select from.  The first
+column is number zero.
+
+@example
+(let (i l)
+  (setq R (pq-exec P "SELECT * FROM xemacs_test;"))
+  (setq i (pq-nfields R))
+  (while (>= (decf i) 0)
+    (push (pq-fname R i) l))
+  l)
+     @result{} ("id" "shikona" "rank")
+@end example
+@end defun
+
+@defun pq-fnumber result field-name
+Return the field number corresponding to the given field name.
+-1 is returned on a bad field name.
+@var{result} is a PGresult object.
+@var{field-name} is a string representing the field name to find.
+@example
+(setq R (pq-exec P "SELECT * FROM xemacs_test;"))
+     @result{} #<PGresult PGRES_TUPLES_OK[5] - SELECT>
+(pq-fnumber R "id")
+     @result{} 0
+(pq-fnumber R "Not a field")
+     @result{} -1
+@end example
+@end defun
+
+@defun pq-ftype result field-num
+Return an integer code representing the data type of the specified column.
+@var{result} is a PGresult object.
+@var{field-num} is the field number.
+
+The return value of this function is the Object ID (Oid) in the database
+of the type.  Further queries need to be made to various system tables
+in order to convert this value into something useful.
+@end defun
+
+@defun pq-fmod result field-num
+Return the type modifier code associated with a field.  Field numbers
+start at zero.
+@var{result} is a PGresult object.
+@var{field-index} selects which field to use.
+@end defun
+
+@defun pq-fsize result field-index
+Return size of the given field.
+@var{result} is a PGresult object.
+@var{field-index} selects which field to use.
+
+@example
+(let (i l)
+  (setq R (pq-exec P "SELECT * FROM xemacs_test;"))
+  (setq i (pq-nfields R))
+  (while (>= (decf i) 0)
+    (push (list (pq-ftype R i) (pq-fsize R i)) l))
+  l)
+     @result{} ((23 23) (25 25) (25 25))
+@end example
+@end defun
+
+@defun pq-get-value result tup-num field-num
+Retrieve a return value.
+@var{result} is a PGresult object.
+@var{tup-num} selects which tuple to fetch from.
+@var{field-num} selects which field to fetch from.
+
+Both tuples and fields are numbered from zero.
+
+@example
+(setq R (pq-exec P "SELECT * FROM xemacs_test;"))
+     @result{} #<PGresult PGRES_TUPLES_OK[5] - SELECT>
+(pq-get-value R 0 1)
+     @result{} "Musashimaru"
+(pq-get-value R 1 1)
+     @result{} "Dejima"
+(pq-get-value R 2 1)
+     @result{} "Musoyama"
+@end example
+@end defun
+
+@defun pq-get-length result tup-num field-num
+Return the length of a specific value.
+@var{result} is a PGresult object.
+@var{tup-num} selects which tuple to fetch from.
+@var{field-num} selects which field to fetch from.
+
+@example
+(setq R (pq-exec P "SELECT * FROM xemacs_test;"))
+     @result{} #<PGresult PGRES_TUPLES_OK[5] - SELECT>
+(pq-get-length R 0 1)
+     @result{} 11
+(pq-get-length R 1 1)
+     @result{} 6
+(pq-get-length R 2 1)
+     @result{} 8
+@end example
+@end defun
+
+@defun pq-get-is-null result tup-num field-num
+Return t if the specific value is the SQL @var{NULL}.
+@var{result} is a PGresult object.
+@var{tup-num} selects which tuple to fetch from.
+@var{field-num} selects which field to fetch from.
+@end defun
+
+@defun pq-cmd-status result
+Return a summary string from the query.
+@var{result} is a PGresult object.
+@example
+@comment This example was written on day 3 of the 2000 Haru Basho.
+(pq-exec P "INSERT INTO xemacs_test
+            VALUES (6, 'Wakanohana', 'Yokozuna');")
+     @result{} #<PGresult PGRES_COMMAND_OK[1] - INSERT 542086 1>
+(pq-cmd-status R)
+     @result{} "INSERT 542086 1"
+(setq R (pq-exec P "UPDATE xemacs_test SET rank='retired'
+                    WHERE shikona='Wakanohana';"))
+     @result{} #<PGresult PGRES_COMMAND_OK[1] - UPDATE 1>
+(pq-cmd-status R)
+     @result{} "UPDATE 1"
+@end example
+
+Note that the first number returned from an insertion, like in the
+example, is an object ID number and will almost certainly vary from
+system to system since object ID numbers in Postgres must be unique
+across all databases.
+@end defun
+
+@defun pq-cmd-tuples result
+Return the number of tuples if the last command was an INSERT/UPDATE/DELETE.
+If the last command was something else, the empty string is returned.
+@var{result} is a PGresult object.
+
+@example
+(setq R (pq-exec P "INSERT INTO xemacs_test VALUES
+                    (7, 'Takanohana', 'Yokuzuna');"))
+     @result{} #<PGresult PGRES_COMMAND_OK[1] - INSERT 38688 1>
+(pq-cmd-tuples R)
+     @result{} "1"
+(setq R (pq-exec P "SELECT * from xemacs_test;"))
+     @result{} #<PGresult PGRES_TUPLES_OK[7] - SELECT>
+(pq-cmd-tuples R)
+     @result{} ""
+(setq R (pq-exec P "DELETE FROM xemacs_test
+                    WHERE shikona LIKE '%hana';"))
+     @result{} #<PGresult PGRES_COMMAND_OK[2] - DELETE 2>
+(pq-cmd-tuples R)
+     @result{} "2"
+@end example
+@end defun
+
+@defun pq-oid-value result
+Return the object id of the insertion if the last command was an INSERT.
+0 is returned if the last command was not an insertion.
+@var{result} is a PGresult object.
+
+In the first example, the numbers you will see on your local system will
+almost certainly be different, however the second number from the right
+in the unprintable PGresult object and the number returned by
+@code{pq-oid-value} should match.
+@example
+(setq R (pq-exec P "INSERT INTO xemacs_test VALUES
+                    (8, 'Terao', 'Maegashira');"))
+     @result{} #<PGresult PGRES_COMMAND_OK[1] - INSERT 542089 1>
+(pq-oid-value R)
+     @result{} 542089
+(setq R (pq-exec P "SELECT shikona FROM xemacs_test
+                    WHERE rank='Maegashira';"))
+     @result{} #<PGresult PGRES_TUPLES_OK[2] - SELECT>
+(pq-oid-value R)
+     @result{} 0
+@end example
+@end defun
+
+@defun pq-make-empty-pgresult conn status
+Create an empty pgresult with the given status.
+@var{conn} a database connection object
+@var{status} a value that can be returned by @code{pq-result-status}.
+
+The caller is responsible for making sure the return value gets properly
+freed.
+@end defun
+
+@node Synchronous Interface Functions, Asynchronous Interface Functions, libpq Lisp Symbols and DataTypes, XEmacs PostgreSQL libpq API
+@comment  node-name,  next,  previous,  up
+@subsection Synchronous Interface Functions
+
+@defun pq-connectdb conninfo
+Establish a (synchronous) database connection.
+@var{conninfo} A string of blank separated options.  Options are of the
+form ``@var{option} = @var{value}''.  If @var{value} contains blanks, it
+must be single quoted.  Blanks around the equal sign are optional.
+Multiple option assignments are blank separated.
+@example
+(pq-connectdb "dbname=japanese port = 25432")
+     @result{} #<PGconn localhost:25432 steve/japanese>
+@end example
+The printed representation of a database connection object has four
+fields.  The first field is the hostname where the database server is
+running (in this case localhost), the second field is the port number,
+the third field is the database user name, and the fourth field is the
+name of the database.
+
+Database connection objects which have been disconnected and will
+generate an immediate error if they are used look like:
+@example
+  #<PGconn BAD>
+@end example
+Bad connections can be reestablished with @code{pq-reset}, or deleted
+entirely with @code{pq-finish}.
+
+A database connection object that has been deleted looks like:
+@example
+(let ((P1 (pq-connectdb "")))
+  (pq-finish P1)
+  P1)
+     @result{} #<PGconn DEAD>
+@end example
+
+Note that database connection objects are the most heavy weight objects
+in XEmacs Lisp at this writing, usually representing as much as several
+megabytes of virtual memory on the machine the database server is
+running on.  It is wisest to explicitly delete them when you are
+finished with them, rather than letting garbage collection do it.  An
+example idiom is:
+
+@example
+(let ((P (pq-connectiondb "")))
+  (unwind-protect
+      (progn
+       (...)) ; access database here
+    (pq-finish P)))
+@end example
+
+The following options are available in the options string:
+@table @code
+@item authtype
+Authentication type.  Same as @var{PGAUTHTYPE}.  This is no longer used.
+@item user
+Database user name.  Same as @var{PGUSER}.
+@item password
+Database password.
+@item dbname
+Database name.  Same as @var{PGDATABASE}
+@item host
+Symbolic hostname.  Same as @var{PGHOST}.
+@item hostaddr
+Host address as four octets (eg. like 192.168.1.1).
+@item port
+TCP port to connect to.  Same as @var{PGPORT}.
+@item tty
+Debugging TTY.  Same as @var{PGTTY}.  This value is suppressed in the
+XEmacs Lisp API.
+@item options
+Extra backend database options.  Same as @var{PGOPTIONS}.
+@end table
+A database connection object is returned regardless of whether a
+connection was established or not.
+@end defun
+
+@defun pq-reset conn
+Reestablish database connection.
+@var{conn} A database connection object.
+
+This function reestablishes a database connection using the original
+connection parameters.  This is useful if something has happened to the
+TCP link and it has become broken.
+@end defun
+
+@defun pq-exec conn query
+Make a synchronous database query.
+@var{conn} A database connection object.
+@var{query} A string containing an SQL query.
+A PGresult object is returned, which in turn may be queried by its many
+accessor functions to retrieve state out of it.  If the query string
+contains multiple SQL commands, only results from the final command are
+returned.
+
+@example
+(setq R (pq-exec P "SELECT * FROM xemacs_test;
+DELETE FROM xemacs_test WHERE id=8;"))
+     @result{} #<PGresult PGRES_COMMAND_OK[1] - DELETE 1>
+@end example
+@end defun
+
+@defun pq-notifies conn
+Return the latest async notification that has not yet been handled.
+@var{conn} A database connection object.
+If there has been a notification, then a list of two elements will be returned.
+The first element contains the relation name being notified, the second
+element contains the backend process ID number.  nil is returned if there
+aren't any notifications to process.
+@end defun
+
+@defun PQsetenv conn
+Synchronous transfer of environment variables to a backend
+@var{conn} A database connection object.
+
+Environment variable transfer is done as a normal part of database
+connection.
+
+Compatibility note: This function was present but not documented in versions
+of libpq prior to 7.0.
+@end defun
+
+@node Asynchronous Interface Functions, Large Object Support, Synchronous Interface Functions, XEmacs PostgreSQL libpq API
+@comment  node-name,  next,  previous,  up
+@subsection Asynchronous Interface Functions
+
+Making command by command examples is too complex with the asynchronous
+interface functions.  See the examples section for complete calling
+sequences.
+
+@defun pq-connect-start conninfo
+Begin establishing an asynchronous database connection.
+@var{conninfo} A string containing the connection options.  See the
+documentation of @code{pq-connectdb} for a listing of all the available
+flags.
+@end defun
+
+@defun pq-connect-poll conn
+An intermediate function to be called during an asynchronous database
+connection.
+@var{conn} A database connection object.
+The result codes are documented in a previous section.
+@end defun
+
+@defun pq-is-busy conn
+Returns t if @code{pq-get-result} would block waiting for input.
+@var{conn} A database connection object.
+@end defun
+
+@defun pq-consume-input conn
+Consume any available input from the backend.
+@var{conn} A database connection object.
+
+Nil is returned if anything bad happens.
+@end defun
+
+@defun pq-reset-start conn
+Reset connection to the backend asynchronously.
+@var{conn} A database connection object.
+@end defun
+
+@defun pq-reset-poll conn
+Poll an asynchronous reset for completion
+@var{conn} A database connection object.
+@end defun
+
+@defun pq-reset-cancel conn
+Attempt to request cancellation of the current operation.
+@var{conn} A database connection object.
+
+The return value is t if the cancel request was successfully
+dispatched, nil if not (in which case conn->errorMessage is set).
+Note: successful dispatch is no guarantee that there will be any effect at
+the backend.  The application must read the operation result as usual.
+@end defun
+
+@defun pq-send-query conn query
+Submit a query to Postgres and don't wait for the result.
+@var{conn} A database connection object.
+Returns: t if successfully submitted
+         nil if error (conn->errorMessage is set)
+@end defun
+
+@defun pq-get-result conn
+Retrieve an asynchronous result from a query.
+@var{conn} A database connection object.
+
+NIL is returned when no more query work remains.
+@end defun
+
+@defun pq-set-nonblocking conn arg
+Sets the PGconn's database connection non-blocking if the arg is TRUE
+or makes it non-blocking if the arg is FALSE, this will not protect
+you from PQexec(), you'll only be safe when using the non-blocking API.
+@var{conn} A database connection object.
+@end defun
+
+@defun pq-is-nonblocking conn
+Return the blocking status of the database connection
+@var{conn} A database connection object.
+@end defun
+
+@defun pq-flush conn
+Force the write buffer to be written (or at least try)
+@var{conn} A database connection object.
+@end defun
+
+@defun PQsetenvStart conn
+Start asynchronously passing environment variables to a backend.
+@var{conn} A database connection object.
+
+Compatibility note: this function is only available with libpq-7.0.
+@end defun
+
+@defun PQsetenvPoll conn
+Check an asynchronous enviroment variables transfer for completion.
+@var{conn} A database connection object.
+
+Compatibility note: this function is only available with libpq-7.0.
+@end defun
+
+@defun PQsetenvAbort conn
+Attempt to terminate an asynchronous environment variables transfer.
+@var{conn} A database connection object.
+
+Compatibility note: this function is only available with libpq-7.0.
+@end defun
+
+@node Large Object Support, Other libpq Functions, Asynchronous Interface Functions, XEmacs PostgreSQL libpq API
+@comment  node-name,  next,  previous,  up
+@subsection Large Object Support
+
+@defun pq-lo-import conn filename
+Import a file as a large object into the database.
+@var{conn} a database connection object
+@var{filename} filename to import
+
+On success, the object id is returned.
+@end defun
+
+@defun pq-lo-export conn oid filename
+Copy a large object in the database into a file.
+@var{conn} a database connection object.
+@var{oid} object id number of a large object.
+@var{filename} filename to export to.
+@end defun
+
+@node Other libpq Functions, Unimplemented libpq Functions, Large Object Support, XEmacs PostgreSQL libpq API
+@comment  node-name,  next,  previous,  up
+@subsection Other libpq Functions
+
+@defun pq-finish conn
+Destroy a database connection object by calling free on it.
+@var{conn} a database connection object
+
+It is possible to not call this routine because the usual XEmacs garbage
+collection mechanism will call the underlying libpq routine whenever it
+is releasing stale @code{PGconn} objects.  However, this routine is
+useful in @code{unwind-protect} clauses to make connections go away
+quickly when unrecoverable errors have occurred.
+
+After calling this routine, the printed representation of the XEmacs
+wrapper object will contain the string ``DEAD''.
+@end defun
+
+@defun pq-client-encoding conn
+Return the client encoding as an integer code.
+@var{conn} a database connection object
+
+@example
+(pq-client-encoding P)
+     @result{} 1
+@end example
+
+Compatibility note: This function did not exist prior to libpq-7.0 and
+does not exist in a non-Mule XEmacs.
+@end defun
+
+@defun pq-set-client-encoding conn encoding
+Set client coding system.
+@var{conn} a database connection object
+@var{encoding} a string representing the desired coding system
+
+@example
+(pq-set-client-encoding P "EUC_JP")
+     @result{} 0
+@end example
+
+The current idiom for ensuring proper coding system conversion is the
+following (illustrated for EUC Japanese encoding):
+@example
+(setq P (pq-connectdb "..."))
+(let ((file-name-coding-system 'euc-jp)
+      (pg-coding-system 'euc-jp))
+  (pq-set-client-encoding "EUC_JP")
+  ...)
+(pq-finish P)
+@end example
+Compatibility note: This function did not exist prior to libpq-7.0 and
+does not exist in a non-Mule XEmacs.
+@end defun
+
+@defun pq-env-2-encoding
+Return the integer code representing the coding system in @var{PGCLIENTENCODING}.
+
+@example
+(pq-env-2-encoding)
+     @result{} 0
+@end example
+Compatibility note: This function did not exist prior to libpq-7.0 and
+does not exist in a non-Mule XEmacs.
+@end defun
+
+@defun pq-clear res
+Destroy a query result object by calling free() on it.
+@var{res} a query result object
+
+Note:  The memory allocation systems of libpq and XEmacs are different.
+The XEmacs representation of a query result object will have both the
+XEmacs version and the libpq version freed at the next garbage collection
+when the object is no longer being referenced.  Calling this function does
+not release the XEmacs object, it is still subject to the usual rules for
+Lisp objects.  The printed representation of the XEmacs object will contain
+the string ``DEAD'' after this routine is called indicating that it is no
+longer useful for anything.
+@end defun
+
+@defun pq-conn-defaults
+Return a data structure that represents the connection defaults.
+The data is returned as a list of lists, where each sublist contains
+info regarding a single option.
+@end defun
+
+@node Unimplemented libpq Functions, , Other libpq Functions, XEmacs PostgreSQL libpq API
+@comment  node-name,  next,  previous,  up
+@subsection Unimplemented libpq Functions
+
+@deftypefn {Unimplemented Function} PGconn *PQsetdbLogin (char *pghost, char *pgport, char *pgoptions, char *pgtty, char *dbName, char *login, char *pwd)
+Synchronous database connection.
+@var{pghost} is the hostname of the PostgreSQL backend to connect to.
+@var{pgport} is the TCP port number to use.
+@var{pgoptions} specifies other backend options.
+@var{pgtty} specifies the debugging tty to use.
+@var{dbName} specifies the database name to use.
+@var{login} specifies the database user name.
+@var{pwd} specifies the database user's password.
+
+This routine is deprecated as of libpq-7.0, and its functionality can be
+replaced by external Lisp code if needed.
+@end deftypefn
+
+@deftypefn {Unimplemented Function} PGconn *PQsetdb (char *pghost, char *pgport, char *pgoptions, char *pgtty, char *dbName)
+Synchronous database connection.
+@var{pghost} is the hostname of the PostgreSQL backend to connect to.
+@var{pgport} is the TCP port number to use.
+@var{pgoptions} specifies other backend options.
+@var{pgtty} specifies the debugging tty to use.
+@var{dbName} specifies the database name to use.
+
+This routine was deprecated in libpq-6.5.
+@end deftypefn
+
+@deftypefn {Unimplemented Function} int PQsocket (PGconn *conn)
+Return socket file descriptor to a backend database process.
+@var{conn} database connection object.
+@end deftypefn
+
+@deftypefn {Unimplemented Function} void PQprint (FILE *fout, PGresult *res, PGprintOpt *ps)
+Print out the results of a query to a designated C stream.
+@var{fout} C stream to print to
+@var{res} the query result object to print
+@var{ps} the print options structure.
+
+This routine is deprecated as of libpq-7.0 and cannot be sensibly exported
+to XEmacs Lisp.
+@end deftypefn
+
+@deftypefn {Unimplemented Function} void PQdisplayTuples (PGresult *res, FILE *fp, int fillAlign, char *fieldSep, int printHeader, int quiet)
+@var{res} query result object to print
+@var{fp} C stream to print to
+@var{fillAlign} pad the fields with spaces
+@var{fieldSep} field separator
+@var{printHeader} display headers?
+@var{quiet}
+
+This routine was deprecated in libpq-6.5.
+@end deftypefn
+
+@deftypefn {Unimplemented Function} void PQprintTuples (PGresult *res, FILE *fout, int printAttName, int terseOutput, int width)
+@var{res} query result object to print
+@var{fout} C stream to print to
+@var{printAttName} print attribute names
+@var{terseOutput} delimiter bars
+@var{width} width of column, if 0, use variable width
+
+This routine was deprecated in libpq-6.5.
+@end deftypefn
+
+@deftypefn {Unimplemented Function} int PQmblen (char *s, int encoding)
+Determine length of a multibyte encoded char at @code{*s}.
+@var{s} encoded string
+@var{encoding} type of encoding
+
+Compatibility note:  This function was introduced in libpq-7.0.
+@end deftypefn
+
+@deftypefn {Unimplemented Function} void PQtrace (PGconn *conn, FILE *debug_port)
+Enable tracing on @code{debug_port}.
+@var{conn} database connection object.
+@var{debug_port} C output stream to use.
+@end deftypefn
+
+@deftypefn {Unimplemented Function} void PQuntrace (PGconn *conn)
+Disable tracing.
+@var{conn} database connection object.
+@end deftypefn
+
+@deftypefn {Unimplemented Function} char *PQoidStatus (PGconn *conn)
+Return the object id as a string of the last tuple inserted.
+@var{conn} database connection object.
+
+Compatibility note: This function is deprecated in libpq-7.0, however it
+is used internally by the XEmacs binding code when linked against versions
+prior to 7.0.
+@end deftypefn
+
+@deftypefn {Unimplemented Function} PGresult *PQfn (PGconn *conn, int fnid, int *result_buf, int *result_len, int result_is_int, PQArgBlock *args, int nargs)
+``Fast path'' interface --- not really recommended for application use
+@var{conn} A database connection object.
+@var{fnid}
+@var{result_buf}
+@var{result_len}
+@var{result_is_int}
+@var{args}
+@var{nargs}
+@end deftypefn
+
+The following set of very low level large object functions aren't
+appropriate to be exported to Lisp.
+
+@deftypefn {Unimplemented Function} int pq-lo-open (PGconn *conn, int lobjid, int mode)
+@var{conn} a database connection object.
+@var{lobjid} a large object ID.
+@var{mode} opening modes.
+@end deftypefn
+
+@deftypefn {Unimplemented Function} int pq-lo-close (PGconn *conn, int fd)
+@var{conn} a database connection object.
+@var{fd} a large object file descriptor
+@end deftypefn
+
+@deftypefn {Unimplemented Function} int pq-lo-read (PGconn *conn, int fd, char *buf, int len)
+@var{conn} a database connection object.
+@var{fd} a large object file descriptor.
+@var{buf} buffer to read into.
+@var{len} size of buffer.
+@end deftypefn
+
+@deftypefn {Unimplemented Function} int pq-lo-write (PGconn *conn, int fd, char *buf, size_t len)
+@var{conn} a database connection object.
+@var{fd} a large object file descriptor.
+@var{buf} buffer to write from.
+@var{len} size of buffer.
+@end deftypefn
+
+@deftypefn {Unimplemented Function} int pq-lo-lseek (PGconn *conn, int fd, int offset, int whence)
+@var{conn} a database connection object.
+@var{fd} a large object file descriptor.
+@var{offset}
+@var{whence}
+@end deftypefn
+
+@deftypefn {Unimplemented Function} int pq-lo-creat (PGconn *conn, int mode)
+@var{conn} a database connection object.
+@var{mode} opening modes.
+@end deftypefn
+
+@deftypefn {Unimplemented Function} int pq-lo-tell (PGconn *conn, int fd)
+@var{conn} a database connection object.
+@var{fd} a large object file descriptor.
+@end deftypefn
+
+@deftypefn {Unimplemented Function} int pq-lo-unlink (PGconn *conn, int lobjid)
+@var{conn} a database connection object.
+@var{lbojid} a large object ID.
+@end deftypefn
+
+@node XEmacs PostgreSQL libpq Examples,  , XEmacs PostgreSQL libpq API, PostgreSQL Support
+@comment  node-name,  next,  previous,  up
+@section XEmacs PostgreSQL libpq Examples
+
+This is an example of one method of establishing an asynchronous
+connection.
+
+@example
+(defun database-poller (P)
+  (message "%S before poll" (pq-pgconn P 'pq::status))
+  (pq-connect-poll P)
+  (message "%S after poll" (pq-pgconn P 'pq::status))
+  (if (eq (pq-pgconn P 'pq::status) 'pg::connection-ok)
+      (message "Done!")
+    (add-timeout .1 'database-poller P)))
+     @result{} database-poller
+(progn
+  (setq P (pq-connect-start ""))
+  (add-timeout .1 'database-poller P))
+     @result{} pg::connection-started before poll
+     @result{} pg::connection-made after poll
+     @result{} pg::connection-made before poll
+     @result{} pg::connection-awaiting-response after poll
+     @result{} pg::connection-awaiting-response before poll
+     @result{} pg::connection-auth-ok after poll
+     @result{} pg::connection-auth-ok before poll
+     @result{} pg::connection-setenv after poll
+     @result{} pg::connection-setenv before poll
+     @result{} pg::connection-ok after poll
+     @result{} Done!
+P
+     @result{} #<PGconn localhost:25432 steve/steve>
+@end example
+
+Here is an example of one method of doing an asynchronous reset.
+
+@example
+(defun database-poller (P)
+  (let (PS)
+    (message "%S before poll" (pq-pgconn P 'pq::status))
+    (setq PS (pq-reset-poll P))
+    (message "%S after poll [%S]" (pq-pgconn P 'pq::status) PS)
+    (if (eq (pq-pgconn P 'pq::status) 'pg::connection-ok)
+       (message "Done!")
+      (add-timeout .1 'database-poller P))))
+     @result{} database-poller
+(progn
+  (pq-reset-start P)
+  (add-timeout .1 'database-poller P))
+     @result{} pg::connection-started before poll
+     @result{} pg::connection-made after poll [pgres::polling-writing]
+     @result{} pg::connection-made before poll
+     @result{} pg::connection-awaiting-response after poll [pgres::polling-reading]
+     @result{} pg::connection-awaiting-response before poll
+     @result{} pg::connection-setenv after poll [pgres::polling-reading]
+     @result{} pg::connection-setenv before poll
+     @result{} pg::connection-ok after poll [pgres::polling-ok]
+     @result{} Done!
+P
+     @result{} #<PGconn localhost:25432 steve/steve>
+@end example
+
+And finally, an asynchronous query.
+
+@example
+(defun database-poller (P)
+  (let (R)
+    (pq-consume-input P)
+    (if (pq-is-busy P)
+       (add-timeout .1 'database-poller P)
+      (setq R (pq-get-result P))
+      (if R
+         (progn
+           (push R result-list)
+           (add-timeout .1 'database-poller P))))))
+     @result{} database-poller
+(when (pq-send-query P "SELECT * FROM xemacs_test;")
+  (setq result-list nil)
+  (add-timeout .1 'database-poller P))
+     @result{} 885
+;; wait a moment
+result-list
+     @result{} (#<PGresult PGRES_TUPLES_OK - SELECT>)
+@end example
+
+Here is an example showing how multiple SQL statements in a single query
+can have all their results collected.
+@example
+;; Using the same @code{database-poller} function from the previous example
+(when (pq-send-query P "SELECT * FROM xemacs_test;
+SELECT * FROM pg_database;
+SELECT * FROM pg_user;")
+  (setq result-list nil)
+  (add-timeout .1 'database-poller P))
+     @result{} 1782
+;; wait a moment
+result-list
+     @result{} (#<PGresult PGRES_TUPLES_OK - SELECT> #<PGresult PGRES_TUPLES_OK - SELECT> #<PGresult PGRES_TUPLES_OK - SELECT>)
+@end example
+
+Here is an example which illustrates collecting all data from a query,
+including the field names.
+
+@example
+(defun pg-util-query-results (results)
+  "Retrieve results of last SQL query into a list structure."
+  (let ((i (1- (pq-ntuples R)))
+       j l1 l2)
+    (while (>= i 0)
+      (setq j (1- (pq-nfields R)))
+      (setq l2 nil)
+      (while (>= j 0)
+       (push (pq-get-value R i j) l2)
+       (decf j))
+      (push l2 l1)
+      (decf i))
+    (setq j (1- (pq-nfields R)))
+    (setq l2 nil)
+    (while (>= j 0)
+      (push (pq-fname R j) l2)
+      (decf j))
+    (push l2 l1)
+    l1))
+     @result{} pg-util-query-results
+(setq R (pq-exec P "SELECT * FROM xemacs_test ORDER BY field2 DESC;"))
+     @result{} #<PGresult PGRES_TUPLES_OK - SELECT>
+(pg-util-query-results R)
+     @result{} (("f1" "field2") ("a" "97") ("b" "97") ("stuff" "42") ("a string" "12") ("foo" "10") ("string" "2") ("text" "1"))
+@end example
+
+Here is an example of a query that uses a database cursor.
+
+@example
+(let (data R)
+  (setq R (pq-exec P "BEGIN;"))
+  (setq R (pq-exec P "DECLARE k_cursor CURSOR FOR SELECT * FROM xemacs_test ORDER BY f1 DESC;"))
+
+  (setq R (pq-exec P "FETCH k_cursor;"))
+  (while (eq (pq-ntuples R) 1)
+    (push (list (pq-get-value R 0 0) (pq-get-value R 0 1)) data)
+    (setq R (pq-exec P "FETCH k_cursor;")))
+  (setq R (pq-exec P "END;"))
+  data)
+     @result{} (("a" "97") ("a string" "12") ("b" "97") ("foo" "10") ("string" "2") ("stuff" "42") ("text" "1"))
+@end example
+
+Here's another example of cursors, this time with a Lisp macro to
+implement a mapping function over a table.
+
+@example
+(defmacro map-db (P table condition callout)
+  `(let (R)
+     (pq-exec ,P "BEGIN;")
+     (pq-exec ,P (concat "DECLARE k_cursor CURSOR FOR SELECT * FROM "
+                        ,table
+                        " "
+                        ,condition
+                        " ORDER BY f1 DESC;"))
+     (setq R (pq-exec P "FETCH k_cursor;"))
+     (while (eq (pq-ntuples R) 1)
+       (,callout (pq-get-value R 0 0) (pq-get-value R 0 1))
+       (setq R (pq-exec P "FETCH k_cursor;")))
+     (pq-exec P "END;")))
+     @result{} map-db
+(defun callback (arg1 arg2)
+  (message "arg1 = %s, arg2 = %s" arg1 arg2))
+     @result{} callback
+(map-db P "xemacs_test" "WHERE field2 > 10" callback)
+     @result{} arg1 = stuff, arg2 = 42
+     @result{} arg1 = b, arg2 = 97
+     @result{} arg1 = a string, arg2 = 12
+     @result{} arg1 = a, arg2 = 97
+     @result{} #<PGresult PGRES_COMMAND_OK - COMMIT>
+@end example
diff --git a/nt/config.inc.samp b/nt/config.inc.samp
new file mode 100644 (file)
index 0000000..c49da6b
--- /dev/null
@@ -0,0 +1,72 @@
+# -*- mode: makefile -*-
+
+############################################################################
+
+INSTALL_DIR=c:\Program Files\XEmacs\XEmacs-$(XEMACS_VERSION_STRING)
+
+PACKAGE_PREFIX=c:\Program Files\XEmacs
+
+############################################################################
+
+# Multilingual support (not currently working).
+HAVE_MULE=0
+
+# Native MS Windows support.
+HAVE_MSW=1
+
+# X Windows support.
+HAVE_X=0
+X11_DIR=
+
+############################################################################
+
+# Set this to enable XPM support (virtually mandatory), and specify
+# the directory containing xpm.
+HAVE_XPM=1
+XPM_DIR=f:\src\xpm-3.4k
+
+# Set this to enable GIF support.
+HAVE_GIF=1
+
+# Set this to enable PNG support (virtually mandatory), and specify
+# the directories containing png and zlib.
+HAVE_PNG=1
+PNG_DIR=f:\src\libpng-1.0.3
+ZLIB_DIR=f:\src\zlib
+
+# Set this to enable TIFF support, and specify the directory containing tiff.
+HAVE_TIFF=0
+TIFF_DIR=
+
+# Set this to enable JPEG support, and specify the directory containing jpeg.
+HAVE_JPEG=0
+JPEG_DIR=
+
+# Set this to enable XFace support, and specify the directory containing
+# compface.
+HAVE_XFACE=0
+COMPFACE_DIR=
+
+############################################################################
+
+# Set this to specify the location of makeinfo. (If not set, XEmacs will
+# attempt to use its built-in texinfo support when building info files.)
+MAKEINFO=f:\src\texinfo-4.0\makeinfo\makeinfo.exe
+
+############################################################################
+
+# Set this to enable some debug code that doesn't slow things down.
+DEBUG_XEMACS=1
+
+# Set this to see exactly which compilation commands are being run (not
+# generally recommended).
+VERBOSECC=0
+
+############################################################################
+
+# Some technical options.
+
+USE_MINIMAL_TAGBITS=0
+USE_INDEXED_LRECORD_IMPLEMENTATION=0
+USE_PORTABLE_DUMPER=0
+GUNG_HO=0
diff --git a/nt/xemacs.dsp b/nt/xemacs.dsp
new file mode 100644 (file)
index 0000000..f317c9c
--- /dev/null
@@ -0,0 +1,1392 @@
+# Microsoft Developer Studio Project File - Name="xemacs" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 5.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) External Target" 0x0106
+
+CFG=xemacs - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "xemacs.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "xemacs.mak" CFG="xemacs - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "xemacs - Win32 Release" (based on "Win32 (x86) External Target")
+!MESSAGE "xemacs - Win32 Debug" (based on "Win32 (x86) External Target")
+!MESSAGE 
+
+# Begin Project
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+
+!IF  "$(CFG)" == "xemacs - Win32 Release"
+
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Cmd_Line "NMAKE /f xemacs.mak"
+# PROP BASE Rebuild_Opt "/a"
+# PROP BASE Target_File "xemacs.exe"
+# PROP BASE Bsc_Name "xemacs.bsc"
+# PROP BASE Target_Dir ""
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Cmd_Line "NMAKE /f xemacs.mak"
+# PROP Rebuild_Opt "/a"
+# PROP Target_File "xemacs.exe"
+# PROP Bsc_Name "xemacs.bsc"
+# PROP Target_Dir ""
+
+!ELSEIF  "$(CFG)" == "xemacs - Win32 Debug"
+
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Cmd_Line "NMAKE /f xemacs.mak"
+# PROP BASE Rebuild_Opt "/a"
+# PROP BASE Target_File "xemacs.exe"
+# PROP BASE Bsc_Name "xemacs.bsc"
+# PROP BASE Target_Dir ""
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Cmd_Line "NMAKE /f xemacs.mak"
+# PROP Rebuild_Opt "/a"
+# PROP Target_File "..\src\xemacs.exe"
+# PROP Bsc_Name "..\src\temacs.bsc"
+# PROP Target_Dir ""
+
+!ENDIF 
+
+# Begin Target
+
+# Name "xemacs - Win32 Release"
+# Name "xemacs - Win32 Debug"
+
+!IF  "$(CFG)" == "xemacs - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "xemacs - Win32 Debug"
+
+!ENDIF 
+
+# Begin Source File
+
+SOURCE=..\src\abbrev.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\alloc.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\alloca.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\backtrace.h
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\balloon-x.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\balloon_help.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\balloon_help.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\bitmaps.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\blocktype.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\blocktype.h
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\broken-sun.h"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\buffer.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\buffer.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\bufslots.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\bytecode.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\bytecode.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\callint.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\callproc.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\casefiddle.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\casetab.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\chartab.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\chartab.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\cm.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\cm.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\cmdloop.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\cmds.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\commands.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\config.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\conslots.h
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\console-msw.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\console-msw.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\console-stream.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\console-stream.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\console-tty.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\console-tty.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\console-x.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\console-x.h"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\console.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\console.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\data.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\database.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\database.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\debug.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\debug.h
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\device-msw.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\device-tty.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\device-x.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\device.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\device.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\dgif_lib.c
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\dialog-msw.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\dialog-x.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\dialog.c
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\dired-msw.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\dired.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\doc.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\doprnt.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\dragdrop.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\dragdrop.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\dynarr.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\ecrt0.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\editfns.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\eldap.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\eldap.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\elhash.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\elhash.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\Emacs.ad.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\emacs.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\EmacsFrame.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\EmacsFrame.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\EmacsFrameP.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\EmacsManager.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\EmacsManager.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\EmacsManagerP.h
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\EmacsShell-sub.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\EmacsShell.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\EmacsShell.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\EmacsShellP.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\emodules.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\emodules.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\esd.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\eval.c
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\event-msw.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\event-stream.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\event-tty.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\event-unixoid.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\event-Xt.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\events-mod.h"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\events.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\events.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\extents.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\extents.h
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\ExternalClient-Xlib.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\ExternalClient.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\ExternalClient.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\ExternalClientP.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\ExternalShell.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\ExternalShell.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\ExternalShellP.h
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\extw-Xlib.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\extw-Xlib.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\extw-Xt.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\extw-Xt.h"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\faces.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\faces.h
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\file-coding.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\file-coding.h"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\fileio.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\filelock.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\filemode.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\floatfns.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\fns.c
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\font-lock.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\frame-msw.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\frame-tty.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\frame-x.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\frame.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\frame.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\frameslots.h
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\free-hook.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\general.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\getloadavg.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\getpagesize.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\gif_io.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\gifrlib.h
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\glyphs-eimage.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\glyphs-msw.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\glyphs-msw.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\glyphs-widget.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\glyphs-x.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\glyphs-x.h"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\glyphs.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\glyphs.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\gmalloc.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\gpmevent.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\gpmevent.h
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\gui-msw.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\gui-x.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\gui-x.h"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\gui.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\gui.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\gutter.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\gutter.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\hash.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\hash.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\hftctl.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\hpplay.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\imgproc.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\imgproc.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\indent.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\inline.c
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\input-method-motif.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\input-method-xfs.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\input-method-xlib.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\insdel.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\insdel.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\intl.c
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\iso-wide.h"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\keymap.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\keymap.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\lastfile.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\libsst.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\libsst.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\libst.h
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\line-number.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\line-number.h"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\linuxplay.c
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\lisp-disunion.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\lisp-union.h"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\lisp.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\lread.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\lrecord.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\lstream.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\lstream.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\macros.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\macros.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\malloc.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\marker.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\md5.c
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\mem-limits.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\menubar-msw.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\menubar-msw.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\menubar-x.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\menubar.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\menubar.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\minibuf.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\miscplay.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\miscplay.h
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\mule-canna.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\mule-ccl.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\mule-ccl.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\mule-charset.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\mule-charset.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\mule-mcpath.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\mule-mcpath.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\mule-wnnfns.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\mule.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\nas.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\ndir.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\nt.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\nt.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\ntheap.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\ntheap.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\ntplay.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\ntproc.c
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\objects-msw.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\objects-msw.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\objects-tty.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\objects-tty.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\objects-x.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\objects-x.h"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\objects.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\objects.h
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\offix-cursors.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\offix-types.h"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\offix.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\offix.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\opaque.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\opaque.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\paths.h
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\pre-crt0.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\print.c
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\process-nt.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\process-unix.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\process.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\process.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\procimpl.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\profile.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\ralloc.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\rangetab.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\rangetab.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\realpath.c
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\redisplay-msw.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\redisplay-output.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\redisplay-tty.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\redisplay-x.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\redisplay.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\redisplay.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\regex.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\regex.h
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\scrollbar-msw.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\scrollbar-msw.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\scrollbar-x.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\scrollbar-x.h"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\scrollbar.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\scrollbar.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\search.c
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\select-msw.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\select-x.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\select.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\select.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\sgiplay.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\sheap.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\signal.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\sound.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\specifier.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\specifier.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\strcat.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\strcmp.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\strcpy.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\strftime.c
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\sunOS-fix.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\sunplay.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\sunpro.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\symbols.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\symeval.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\symsinit.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\syntax.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\syntax.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\sysdep.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\sysdep.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\sysdir.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\sysdll.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\sysdll.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\sysfile.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\sysfloat.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\sysproc.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\syspwd.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\syssignal.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\systime.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\systty.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\syswait.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\termcap.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\terminfo.c
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\toolbar-msw.c"
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\toolbar-x.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\toolbar.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\toolbar.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\tooltalk.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\tooltalk.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\tparam.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\undo.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\unexaix.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\unexalpha.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\unexapollo.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\unexconvex.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\unexcw.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\unexec.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\unexelf.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\unexelfsgi.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\unexencap.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\unexenix.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\unexfreebsd.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\unexfx2800.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\unexhp9k3.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\unexhp9k800.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\unexmips.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\unexnext.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\unexnt.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\unexsni.c
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\unexsol2-6.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\unexsol2.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\unexsunos4.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\universe.h
+# End Source File
+# Begin Source File
+
+SOURCE="..\src\vm-limit.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\widget.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\window.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\window.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\winslots.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\xemacs.mak
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\xgccache.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\xgccache.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\xintrinsic.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\xintrinsicp.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\xmmanagerp.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\xmprimitivep.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\xmu.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\xmu.h
+# End Source File
+# End Target
+# End Project
diff --git a/nt/xemacs.dsw b/nt/xemacs.dsw
new file mode 100644 (file)
index 0000000..e9a8ca9
--- /dev/null
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 5.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "xemacs"=".\xemacs.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/src/alloc.h b/src/alloc.h
new file mode 100644 (file)
index 0000000..2d06759
--- /dev/null
@@ -0,0 +1,58 @@
+/* Allocations header
+   Copyright (C) 2000 Olivier Galibert
+
+This file is part of XEmacs.
+
+XEmacs 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.
+
+XEmacs 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 XEmacs; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* Synched up with: Not in FSF. */
+
+#ifndef INCLUDED_alloc_h_
+#define INCLUDED_alloc_h_
+
+struct pdump_dumpstructinfo
+{
+  void *data;
+  const struct struct_description *desc;
+};
+
+struct pdump_dumpopaqueinfo
+{
+  void *data;
+  size_t size;
+};
+
+/* staticpro structures */
+extern Lisp_Object *staticvec[];
+extern int staticidx;
+
+/* dumpstruct structures */
+extern struct pdump_dumpstructinfo dumpstructvec[];
+extern int dumpstructidx;
+
+/* dumpopaque structures */
+extern struct pdump_dumpopaqueinfo dumpopaquevec[];
+extern int dumpopaqueidx;
+
+/* pdump_wire structures */
+extern Lisp_Object *pdump_wirevec[];
+extern int pdump_wireidx;
+
+/* pdump_wire_list structures */
+extern Lisp_Object *pdump_wirevec_list[];
+extern int pdump_wireidx_list;
+
+#endif /* INCLUDED_alloc_h_ */
diff --git a/src/dump-id.h b/src/dump-id.h
new file mode 100644 (file)
index 0000000..45dc9c1
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef INCLUDED_dump_id_h_
+#define INCLUDED_dump_id_h_
+
+extern unsigned int dump_id;
+
+#endif
diff --git a/src/dumper.c b/src/dumper.c
new file mode 100644 (file)
index 0000000..1bb3172
--- /dev/null
@@ -0,0 +1,1355 @@
+/* Portable data dumper for XEmacs.
+   Copyright (C) 1999-2000 Olivier Galibert
+
+This file is part of XEmacs.
+
+XEmacs 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.
+
+XEmacs 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 XEmacs; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* Synched up with: Not in FSF. */
+
+#include <config.h>
+#include "lisp.h"
+#include "dump-id.h"
+#include "specifier.h"
+#include "alloc.h"
+#include "elhash.h"
+#include "sysfile.h"
+#include "console-stream.h"
+#include "dumper.h"
+
+#ifdef HAVE_MMAP
+#include <sys/mman.h>
+#endif
+
+#ifndef SEPCHAR
+#define SEPCHAR ':'
+#endif
+
+typedef struct
+{
+  const struct lrecord_description *desc;
+  int count;
+} pdump_reloc_table;
+
+static char *pdump_rt_list = 0;
+
+void
+pdump_objects_unmark (void)
+{
+  int i;
+  char *p = pdump_rt_list;
+  if (p)
+    for (;;)
+      {
+       pdump_reloc_table *rt = (pdump_reloc_table *)p;
+       p += sizeof (pdump_reloc_table);
+       if (rt->desc)
+         {
+           for (i=0; i<rt->count; i++)
+             {
+               struct lrecord_header *lh = * (struct lrecord_header **) p;
+               if (! C_READONLY_RECORD_HEADER_P (lh))
+                 UNMARK_RECORD_HEADER (lh);
+               p += sizeof (EMACS_INT);
+             }
+         } else
+           break;
+      }
+}
+
+
+/* The structure of the file
+ *
+ * 0                   - header
+ * 256                 - dumped objects
+ * stab_offset         - nb_staticpro*(Lisp_Object *) from staticvec
+ *                     - nb_staticpro*(relocated Lisp_Object) pointed to by staticpro
+ *                     - nb_structdmp*pair(void *, adr) for pointers to structures
+ *                     - lrecord_implementations_table[]
+ *                     - relocation table
+ *                      - wired variable address/value couples with the count preceding the list
+ */
+
+
+#define DUMP_SIGNATURE "XEmacsDP"
+#define DUMP_SIGNATURE_LEN (sizeof (DUMP_SIGNATURE) - 1)
+
+typedef struct
+{
+  char signature[DUMP_SIGNATURE_LEN];
+  unsigned int id;
+  EMACS_UINT stab_offset;
+  EMACS_UINT reloc_address;
+  int nb_staticpro;
+  int nb_structdmp;
+  int nb_opaquedmp;
+} dump_header;
+
+char *pdump_start, *pdump_end;
+static size_t pdump_length;
+void (*pdump_free) (void);
+
+static const unsigned char align_table[256] =
+{
+  8, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+  4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+  5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+  4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+  6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+  4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+  5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+  4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+  7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+  4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+  5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+  4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+  6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+  4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+  5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
+  4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
+};
+
+typedef struct pdump_entry_list_elmt
+{
+  struct pdump_entry_list_elmt *next;
+  const void *obj;
+  size_t size;
+  int count;
+  int is_lrecord;
+  EMACS_INT save_offset;
+} pdump_entry_list_elmt;
+
+typedef struct
+{
+  pdump_entry_list_elmt *first;
+  int align;
+  int count;
+} pdump_entry_list;
+
+typedef struct pdump_struct_list_elmt
+{
+  pdump_entry_list list;
+  const struct struct_description *sdesc;
+} pdump_struct_list_elmt;
+
+typedef struct
+{
+  pdump_struct_list_elmt *list;
+  int count;
+  int size;
+} pdump_struct_list;
+
+static pdump_entry_list pdump_object_table[256];
+static pdump_entry_list pdump_opaque_data_list;
+static pdump_struct_list pdump_struct_table;
+static pdump_entry_list_elmt *pdump_qnil;
+
+static int pdump_alert_undump_object[256];
+
+static unsigned long cur_offset;
+static size_t max_size;
+static int pdump_fd;
+static void *pdump_buf;
+
+#define PDUMP_HASHSIZE 200001
+
+static pdump_entry_list_elmt **pdump_hash;
+
+/* Since most pointers are eight bytes aligned, the >>3 allows for a better hash */
+static int
+pdump_make_hash (const void *obj)
+{
+  return ((unsigned long)(obj)>>3) % PDUMP_HASHSIZE;
+}
+
+static pdump_entry_list_elmt *
+pdump_get_entry (const void *obj)
+{
+  int pos = pdump_make_hash (obj);
+  pdump_entry_list_elmt *e;
+
+  assert (obj != 0);
+
+  while ((e = pdump_hash[pos]) != 0)
+    {
+      if (e->obj == obj)
+       return e;
+
+      pos++;
+      if (pos == PDUMP_HASHSIZE)
+       pos = 0;
+    }
+  return 0;
+}
+
+static void
+pdump_add_entry (pdump_entry_list *list, const void *obj, size_t size, int count, int is_lrecord)
+{
+  pdump_entry_list_elmt *e;
+  int align;
+  int pos = pdump_make_hash (obj);
+
+  while ((e = pdump_hash[pos]) != 0)
+    {
+      if (e->obj == obj)
+       return;
+
+      pos++;
+      if (pos == PDUMP_HASHSIZE)
+       pos = 0;
+    }
+
+  e = xnew (pdump_entry_list_elmt);
+
+  e->next = list->first;
+  e->obj = obj;
+  e->size = size;
+  e->count = count;
+  e->is_lrecord = is_lrecord;
+  list->first = e;
+
+  list->count += count;
+  pdump_hash[pos] = e;
+
+  align = align_table[size & 255];
+  if (align < 2 && is_lrecord)
+    align = 2;
+
+  if (align < list->align)
+    list->align = align;
+}
+
+static pdump_entry_list *
+pdump_get_entry_list (const struct struct_description *sdesc)
+{
+  int i;
+  for (i=0; i<pdump_struct_table.count; i++)
+    if (pdump_struct_table.list[i].sdesc == sdesc)
+      return &pdump_struct_table.list[i].list;
+
+  if (pdump_struct_table.size <= pdump_struct_table.count)
+    {
+      if (pdump_struct_table.size == -1)
+       pdump_struct_table.size = 10;
+      else
+       pdump_struct_table.size = pdump_struct_table.size * 2;
+      pdump_struct_table.list = (pdump_struct_list_elmt *)
+       xrealloc (pdump_struct_table.list,
+                 pdump_struct_table.size * sizeof (pdump_struct_list_elmt));
+    }
+  pdump_struct_table.list[pdump_struct_table.count].list.first = 0;
+  pdump_struct_table.list[pdump_struct_table.count].list.align = 8;
+  pdump_struct_table.list[pdump_struct_table.count].list.count = 0;
+  pdump_struct_table.list[pdump_struct_table.count].sdesc = sdesc;
+
+  return &pdump_struct_table.list[pdump_struct_table.count++].list;
+}
+
+static struct
+{
+  struct lrecord_header *obj;
+  int position;
+  int offset;
+} backtrace[65536];
+
+static int depth;
+
+static void pdump_backtrace (void)
+{
+  int i;
+  stderr_out ("pdump backtrace :\n");
+  for (i=0;i<depth;i++)
+    {
+      if (!backtrace[i].obj)
+       stderr_out ("  - ind. (%d, %d)\n", backtrace[i].position, backtrace[i].offset);
+      else
+       {
+         stderr_out ("  - %s (%d, %d)\n",
+                  LHEADER_IMPLEMENTATION (backtrace[i].obj)->name,
+                  backtrace[i].position,
+                  backtrace[i].offset);
+       }
+    }
+}
+
+static void pdump_register_object (Lisp_Object obj);
+static void pdump_register_struct (const void *data, const struct struct_description *sdesc, int count);
+
+static EMACS_INT
+pdump_get_indirect_count (EMACS_INT code, const struct lrecord_description *idesc, const void *idata)
+{
+  EMACS_INT count;
+  const void *irdata;
+
+  int line = XD_INDIRECT_VAL (code);
+  int delta = XD_INDIRECT_DELTA (code);
+
+  irdata = ((char *)idata) + idesc[line].offset;
+  switch (idesc[line].type)
+    {
+    case XD_SIZE_T:
+      count = *(size_t *)irdata;
+      break;
+    case XD_INT:
+      count = *(int *)irdata;
+      break;
+    case XD_LONG:
+      count = *(long *)irdata;
+      break;
+    case XD_BYTECOUNT:
+      count = *(Bytecount *)irdata;
+      break;
+    default:
+      stderr_out ("Unsupported count type : %d (line = %d, code=%ld)\n", idesc[line].type, line, (long)code);
+      pdump_backtrace ();
+      abort ();
+    }
+  count += delta;
+  return count;
+}
+
+static void
+pdump_register_sub (const void *data, const struct lrecord_description *desc, int me)
+{
+  int pos;
+
+ restart:
+  for (pos = 0; desc[pos].type != XD_END; pos++)
+    {
+      const void *rdata = (const char *)data + desc[pos].offset;
+
+      backtrace[me].position = pos;
+      backtrace[me].offset = desc[pos].offset;
+
+      switch (desc[pos].type)
+       {
+       case XD_SPECIFIER_END:
+         pos = 0;
+         desc = ((const Lisp_Specifier *)data)->methods->extra_description;
+         goto restart;
+       case XD_SIZE_T:
+       case XD_INT:
+       case XD_LONG:
+       case XD_BYTECOUNT:
+       case XD_LO_RESET_NIL:
+       case XD_INT_RESET:
+       case XD_LO_LINK:
+         break;
+       case XD_OPAQUE_DATA_PTR:
+         {
+           EMACS_INT count = desc[pos].data1;
+           if (XD_IS_INDIRECT (count))
+             count = pdump_get_indirect_count (count, desc, data);
+
+           pdump_add_entry (&pdump_opaque_data_list,
+                            *(void **)rdata,
+                            count,
+                            1,
+                            0);
+           break;
+         }
+       case XD_C_STRING:
+         {
+           const char *str = *(const char **)rdata;
+           if (str)
+             pdump_add_entry (&pdump_opaque_data_list, str, strlen (str)+1, 1, 0);
+           break;
+         }
+       case XD_DOC_STRING:
+         {
+           const char *str = *(const char **)rdata;
+           if ((EMACS_INT)str > 0)
+             pdump_add_entry (&pdump_opaque_data_list, str, strlen (str)+1, 1, 0);
+           break;
+         }
+       case XD_LISP_OBJECT:
+         {
+           const Lisp_Object *pobj = (const Lisp_Object *)rdata;
+
+           assert (desc[pos].data1 == 0);
+
+           backtrace[me].offset = (const char *)pobj - (const char *)data;
+           pdump_register_object (*pobj);
+           break;
+         }
+       case XD_LISP_OBJECT_ARRAY:
+         {
+           int i;
+           EMACS_INT count = desc[pos].data1;
+           if (XD_IS_INDIRECT (count))
+             count = pdump_get_indirect_count (count, desc, data);
+
+           for (i = 0; i < count; i++)
+             {
+               const Lisp_Object *pobj = ((const Lisp_Object *)rdata) + i;
+               Lisp_Object dobj = *pobj;
+
+               backtrace[me].offset = (const char *)pobj - (const char *)data;
+               pdump_register_object (dobj);
+             }
+           break;
+         }
+       case XD_STRUCT_PTR:
+         {
+           EMACS_INT count = desc[pos].data1;
+           const struct struct_description *sdesc = desc[pos].data2;
+           const char *dobj = *(const char **)rdata;
+           if (dobj)
+             {
+               if (XD_IS_INDIRECT (count))
+                 count = pdump_get_indirect_count (count, desc, data);
+
+               pdump_register_struct (dobj, sdesc, count);
+             }
+           break;
+         }
+       default:
+         stderr_out ("Unsupported dump type : %d\n", desc[pos].type);
+         pdump_backtrace ();
+         abort ();
+       };
+    }
+}
+
+static void
+pdump_register_object (Lisp_Object obj)
+{
+  struct lrecord_header *objh;
+
+  if (!POINTER_TYPE_P (XTYPE (obj)))
+    return;
+
+  objh = XRECORD_LHEADER (obj);
+  if (!objh)
+    return;
+
+  if (pdump_get_entry (objh))
+    return;
+
+  if (LHEADER_IMPLEMENTATION (objh)->description)
+    {
+      int me = depth++;
+      if (me>65536)
+       {
+         stderr_out ("Backtrace overflow, loop ?\n");
+         abort ();
+       }
+      backtrace[me].obj = objh;
+      backtrace[me].position = 0;
+      backtrace[me].offset = 0;
+
+      pdump_add_entry (pdump_object_table + objh->type,
+                      objh,
+                      LHEADER_IMPLEMENTATION (objh)->static_size ?
+                      LHEADER_IMPLEMENTATION (objh)->static_size :
+                      LHEADER_IMPLEMENTATION (objh)->size_in_bytes_method (objh),
+                      1,
+                      1);
+      pdump_register_sub (objh,
+                         LHEADER_IMPLEMENTATION (objh)->description,
+                         me);
+      --depth;
+    }
+  else
+    {
+      pdump_alert_undump_object[objh->type]++;
+      stderr_out ("Undumpable object type : %s\n", LHEADER_IMPLEMENTATION (objh)->name);
+      pdump_backtrace ();
+    }
+}
+
+static void
+pdump_register_struct (const void *data, const struct struct_description *sdesc, int count)
+{
+  if (data && !pdump_get_entry (data))
+    {
+      int me = depth++;
+      int i;
+      if (me>65536)
+       {
+         stderr_out ("Backtrace overflow, loop ?\n");
+         abort ();
+       }
+      backtrace[me].obj = 0;
+      backtrace[me].position = 0;
+      backtrace[me].offset = 0;
+
+      pdump_add_entry (pdump_get_entry_list (sdesc),
+                      data,
+                      sdesc->size,
+                      count,
+                      0);
+      for (i=0; i<count; i++)
+       {
+         pdump_register_sub (((char *)data) + sdesc->size*i,
+                             sdesc->description,
+                             me);
+       }
+      --depth;
+    }
+}
+
+static void
+pdump_dump_data (pdump_entry_list_elmt *elmt, const struct lrecord_description *desc)
+{
+  size_t size = elmt->size;
+  int count = elmt->count;
+  if (desc)
+    {
+      int pos, i;
+      memcpy (pdump_buf, elmt->obj, size*count);
+
+      for (i=0; i<count; i++)
+       {
+         char *cur = ((char *)pdump_buf) + i*size;
+       restart:
+         for (pos = 0; desc[pos].type != XD_END; pos++)
+           {
+             void *rdata = cur + desc[pos].offset;
+             switch (desc[pos].type)
+               {
+               case XD_SPECIFIER_END:
+                 desc = ((const Lisp_Specifier *)(elmt->obj))->methods->extra_description;
+                 goto restart;
+               case XD_SIZE_T:
+               case XD_INT:
+               case XD_LONG:
+               case XD_BYTECOUNT:
+                 break;
+               case XD_LO_RESET_NIL:
+                 {
+                   EMACS_INT num = desc[pos].data1;
+                   int j;
+                   if (XD_IS_INDIRECT (num))
+                     num = pdump_get_indirect_count (num, desc, elmt->obj);
+                   for (j=0; j<num; j++)
+                     ((EMACS_INT *)rdata)[j] = pdump_qnil->save_offset;
+                   break;
+                 }
+               case XD_INT_RESET:
+                 {
+                   EMACS_INT val = desc[pos].data1;
+                   if (XD_IS_INDIRECT (val))
+                     val = pdump_get_indirect_count (val, desc, elmt->obj);
+                   *(int *)rdata = val;
+                   break;
+                 }
+               case XD_OPAQUE_DATA_PTR:
+               case XD_C_STRING:
+               case XD_STRUCT_PTR:
+                 {
+                   void *ptr = *(void **)rdata;
+                   if (ptr)
+                     *(EMACS_INT *)rdata = pdump_get_entry (ptr)->save_offset;
+                   break;
+                 }
+               case XD_LO_LINK:
+                 {
+                   Lisp_Object obj = *(Lisp_Object *)rdata;
+                   pdump_entry_list_elmt *elmt1;
+                   for (;;)
+                     {
+                       elmt1 = pdump_get_entry (XRECORD_LHEADER (obj));
+                       if (elmt1)
+                         break;
+                       obj = *(Lisp_Object *)(desc[pos].offset + (char *)(XRECORD_LHEADER (obj)));
+                     }
+                   *(EMACS_INT *)rdata = elmt1->save_offset;
+                   break;
+                 }
+               case XD_LISP_OBJECT:
+                 {
+                   Lisp_Object *pobj = (Lisp_Object *) rdata;
+
+                   assert (desc[pos].data1 == 0);
+
+                   if (POINTER_TYPE_P (XTYPE (*pobj)) && XRECORD_LHEADER (*pobj))
+                     *(EMACS_INT *)pobj =
+                       pdump_get_entry (XRECORD_LHEADER (*pobj))->save_offset;
+                   break;
+                 }
+               case XD_LISP_OBJECT_ARRAY:
+                 {
+                   EMACS_INT num = desc[pos].data1;
+                   int j;
+                   if (XD_IS_INDIRECT (num))
+                     num = pdump_get_indirect_count (num, desc, elmt->obj);
+
+                   for (j=0; j<num; j++)
+                     {
+                       Lisp_Object *pobj = ((Lisp_Object *)rdata) + j;
+                       if (POINTER_TYPE_P (XTYPE (*pobj)) && XRECORD_LHEADER (*pobj))
+                         *(EMACS_INT *)pobj =
+                           pdump_get_entry (XRECORD_LHEADER (*pobj))->save_offset;
+                     }
+                   break;
+                 }
+               case XD_DOC_STRING:
+                 {
+                   EMACS_INT str = *(EMACS_INT *)rdata;
+                   if (str > 0)
+                     *(EMACS_INT *)rdata = pdump_get_entry ((void *)str)->save_offset;
+                   break;
+                 }
+               default:
+                 stderr_out ("Unsupported dump type : %d\n", desc[pos].type);
+                 abort ();
+               };
+           }
+       }
+    }
+  write (pdump_fd, desc ? pdump_buf : elmt->obj, size*count);
+  if (elmt->is_lrecord && ((size*count) & 3))
+    write (pdump_fd, "\0\0\0", 4-((size*count) & 3));
+}
+
+static void
+pdump_reloc_one (void *data, EMACS_INT delta, const struct lrecord_description *desc)
+{
+  int pos;
+
+ restart:
+  for (pos = 0; desc[pos].type != XD_END; pos++)
+    {
+      void *rdata = (char *)data + desc[pos].offset;
+      switch (desc[pos].type)
+       {
+       case XD_SPECIFIER_END:
+         pos = 0;
+         desc = ((const Lisp_Specifier *)data)->methods->extra_description;
+         goto restart;
+       case XD_SIZE_T:
+       case XD_INT:
+       case XD_LONG:
+       case XD_BYTECOUNT:
+       case XD_INT_RESET:
+         break;
+       case XD_OPAQUE_DATA_PTR:
+       case XD_C_STRING:
+       case XD_STRUCT_PTR:
+       case XD_LO_LINK:
+         {
+           EMACS_INT ptr = *(EMACS_INT *)rdata;
+           if (ptr)
+             *(EMACS_INT *)rdata = ptr+delta;
+           break;
+         }
+       case XD_LISP_OBJECT:
+         {
+           Lisp_Object *pobj = (Lisp_Object *) rdata;
+
+           assert (desc[pos].data1 == 0);
+
+           if (POINTER_TYPE_P (XTYPE (*pobj))
+               && ! EQ (*pobj, Qnull_pointer))
+             XSETOBJ (*pobj, XTYPE (*pobj), (char *) XPNTR (*pobj) + delta);
+
+           break;
+         }
+       case XD_LISP_OBJECT_ARRAY:
+       case XD_LO_RESET_NIL:
+         {
+           EMACS_INT num = desc[pos].data1;
+           int j;
+           if (XD_IS_INDIRECT (num))
+             num = pdump_get_indirect_count (num, desc, data);
+
+           for (j=0; j<num; j++)
+             {
+               Lisp_Object *pobj = (Lisp_Object *) rdata + j;
+
+               if (POINTER_TYPE_P (XTYPE (*pobj))
+                   && ! EQ (*pobj, Qnull_pointer))
+                 XSETOBJ (*pobj, XTYPE (*pobj), (char *) XPNTR (*pobj) + delta);
+             }
+           break;
+         }
+       case XD_DOC_STRING:
+         {
+           EMACS_INT str = *(EMACS_INT *)rdata;
+           if (str > 0)
+             *(EMACS_INT *)rdata = str + delta;
+           break;
+         }
+       default:
+         stderr_out ("Unsupported dump type : %d\n", desc[pos].type);
+         abort ();
+       };
+    }
+}
+
+static void
+pdump_allocate_offset (pdump_entry_list_elmt *elmt, const struct lrecord_description *desc)
+{
+  size_t size = (elmt->is_lrecord ? (elmt->size + 3) & ~3 : elmt->size)*elmt->count;
+  elmt->save_offset = cur_offset;
+  if (size>max_size)
+    max_size = size;
+  cur_offset += size;
+}
+
+static void
+pdump_scan_by_alignment (void (*f)(pdump_entry_list_elmt *, const struct lrecord_description *))
+{
+  int align, i;
+  const struct lrecord_description *idesc;
+  pdump_entry_list_elmt *elmt;
+  for (align=8; align>=0; align--)
+    {
+      for (i=0; i<lrecord_type_count; i++)
+       if (pdump_object_table[i].align == align)
+         {
+           elmt = pdump_object_table[i].first;
+           if (!elmt)
+             continue;
+           idesc = lrecord_implementations_table[i]->description;
+           while (elmt)
+             {
+               f (elmt, idesc);
+               elmt = elmt->next;
+             }
+         }
+
+      for (i=0; i<pdump_struct_table.count; i++)
+       if (pdump_struct_table.list[i].list.align == align)
+         {
+           elmt = pdump_struct_table.list[i].list.first;
+           idesc = pdump_struct_table.list[i].sdesc->description;
+           while (elmt)
+             {
+               f (elmt, idesc);
+               elmt = elmt->next;
+             }
+         }
+
+      elmt = pdump_opaque_data_list.first;
+      while (elmt)
+       {
+         if (align_table[elmt->size & 255] == align)
+           f (elmt, 0);
+         elmt = elmt->next;
+       }
+    }
+}
+
+static void
+pdump_dump_staticvec (void)
+{
+  EMACS_INT *reloc = xnew_array (EMACS_INT, staticidx);
+  int i;
+  write (pdump_fd, staticvec, staticidx*sizeof (Lisp_Object *));
+
+  for (i=0; i<staticidx; i++)
+    {
+      Lisp_Object obj = *staticvec[i];
+      if (POINTER_TYPE_P (XTYPE (obj)))
+       reloc[i] = pdump_get_entry (XRECORD_LHEADER (obj))->save_offset;
+      else
+       reloc[i] = *(EMACS_INT *)(staticvec[i]);
+    }
+  write (pdump_fd, reloc, staticidx*sizeof (Lisp_Object));
+  free (reloc);
+}
+
+static void
+pdump_dump_structvec (void)
+{
+  int i;
+  for (i=0; i<dumpstructidx; i++)
+    {
+      EMACS_INT adr;
+      write (pdump_fd, &(dumpstructvec[i].data), sizeof (void *));
+      adr = pdump_get_entry (*(void **)(dumpstructvec[i].data))->save_offset;
+      write (pdump_fd, &adr, sizeof (adr));
+    }
+}
+
+static void
+pdump_dump_opaquevec (void)
+{
+  int i;
+  for (i=0; i<dumpopaqueidx; i++)
+    {
+      write (pdump_fd, &(dumpopaquevec[i]), sizeof (dumpopaquevec[i]));
+      write (pdump_fd, dumpopaquevec[i].data, dumpopaquevec[i].size);
+    }
+}
+
+static void
+pdump_dump_itable (void)
+{
+  write (pdump_fd, lrecord_implementations_table, lrecord_type_count*sizeof (lrecord_implementations_table[0]));
+}
+
+static void
+pdump_dump_rtables (void)
+{
+  int i, j;
+  pdump_entry_list_elmt *elmt;
+  pdump_reloc_table rt;
+
+  for (i=0; i<lrecord_type_count; i++)
+    {
+      elmt = pdump_object_table[i].first;
+      if (!elmt)
+       continue;
+      rt.desc = lrecord_implementations_table[i]->description;
+      rt.count = pdump_object_table[i].count;
+      write (pdump_fd, &rt, sizeof (rt));
+      while (elmt)
+       {
+         EMACS_INT rdata = pdump_get_entry (elmt->obj)->save_offset;
+         write (pdump_fd, &rdata, sizeof (rdata));
+         elmt = elmt->next;
+       }
+    }
+
+  rt.desc = 0;
+  rt.count = 0;
+  write (pdump_fd, &rt, sizeof (rt));
+
+  for (i=0; i<pdump_struct_table.count; i++)
+    {
+      elmt = pdump_struct_table.list[i].list.first;
+      rt.desc = pdump_struct_table.list[i].sdesc->description;
+      rt.count = pdump_struct_table.list[i].list.count;
+      write (pdump_fd, &rt, sizeof (rt));
+      while (elmt)
+       {
+         EMACS_INT rdata = pdump_get_entry (elmt->obj)->save_offset;
+         for (j=0; j<elmt->count; j++)
+           {
+             write (pdump_fd, &rdata, sizeof (rdata));
+             rdata += elmt->size;
+           }
+         elmt = elmt->next;
+       }
+    }
+  rt.desc = 0;
+  rt.count = 0;
+  write (pdump_fd, &rt, sizeof (rt));
+}
+
+static void
+pdump_dump_wired (void)
+{
+  EMACS_INT count = pdump_wireidx + pdump_wireidx_list;
+  int i;
+
+  write (pdump_fd, &count, sizeof (count));
+
+  for (i=0; i<pdump_wireidx; i++)
+    {
+      EMACS_INT obj = pdump_get_entry (XRECORD_LHEADER (*(pdump_wirevec[i])))->save_offset;
+      write (pdump_fd, &pdump_wirevec[i], sizeof (pdump_wirevec[i]));
+      write (pdump_fd, &obj, sizeof (obj));
+    }
+
+  for (i=0; i<pdump_wireidx_list; i++)
+    {
+      Lisp_Object obj = *(pdump_wirevec_list[i]);
+      pdump_entry_list_elmt *elmt;
+      EMACS_INT res;
+
+      for (;;)
+       {
+         const struct lrecord_description *desc;
+         int pos;
+         elmt = pdump_get_entry (XRECORD_LHEADER (obj));
+         if (elmt)
+           break;
+         desc = XRECORD_LHEADER_IMPLEMENTATION (obj)->description;
+         for (pos = 0; desc[pos].type != XD_LO_LINK; pos++)
+           assert (desc[pos].type != XD_END);
+
+         obj = *(Lisp_Object *)(desc[pos].offset + (char *)(XRECORD_LHEADER (obj)));
+       }
+      res = elmt->save_offset;
+
+      write (pdump_fd, &pdump_wirevec_list[i], sizeof (pdump_wirevec_list[i]));
+      write (pdump_fd, &res, sizeof (res));
+    }
+}
+
+void
+pdump (void)
+{
+  int i;
+  Lisp_Object t_console, t_device, t_frame;
+  int none;
+  dump_header hd;
+
+  /* These appear in a DEFVAR_LISP, which does a staticpro() */
+  t_console = Vterminal_console;
+  t_frame   = Vterminal_frame;
+  t_device  = Vterminal_device;
+
+  Vterminal_console = Qnil;
+  Vterminal_frame   = Qnil;
+  Vterminal_device  = Qnil;
+
+  pdump_hash = xnew_array_and_zero (pdump_entry_list_elmt *, PDUMP_HASHSIZE);
+
+  for (i=0; i<lrecord_type_count; i++)
+    {
+      pdump_object_table[i].first = 0;
+      pdump_object_table[i].align = 8;
+      pdump_object_table[i].count = 0;
+      pdump_alert_undump_object[i] = 0;
+    }
+  pdump_struct_table.count = 0;
+  pdump_struct_table.size = -1;
+
+  pdump_opaque_data_list.first = 0;
+  pdump_opaque_data_list.align = 8;
+  pdump_opaque_data_list.count = 0;
+  depth = 0;
+
+  for (i=0; i<staticidx; i++)
+    pdump_register_object (*staticvec[i]);
+  for (i=0; i<pdump_wireidx; i++)
+    pdump_register_object (*pdump_wirevec[i]);
+
+  none = 1;
+  for (i=0; i<lrecord_type_count; i++)
+    if (pdump_alert_undump_object[i])
+      {
+       if (none)
+         printf ("Undumpable types list :\n");
+       none = 0;
+       printf ("  - %s (%d)\n", lrecord_implementations_table[i]->name, pdump_alert_undump_object[i]);
+      }
+  if (!none)
+    return;
+
+  for (i=0; i<dumpstructidx; i++)
+    pdump_register_struct (*(void **)(dumpstructvec[i].data), dumpstructvec[i].desc, 1);
+
+  memcpy (hd.signature, DUMP_SIGNATURE, DUMP_SIGNATURE_LEN);
+  hd.id = dump_id;
+  hd.reloc_address = 0;
+  hd.nb_staticpro = staticidx;
+  hd.nb_structdmp = dumpstructidx;
+  hd.nb_opaquedmp = dumpopaqueidx;
+
+  cur_offset = 256;
+  max_size = 0;
+
+  pdump_scan_by_alignment (pdump_allocate_offset);
+  pdump_qnil = pdump_get_entry (XRECORD_LHEADER (Qnil));
+
+  pdump_buf = xmalloc (max_size);
+  /* Avoid use of the `open' macro.  We want the real function. */
+#undef open
+  pdump_fd = open (EMACS_PROGNAME ".dmp",
+                  O_WRONLY | O_CREAT | O_TRUNC | OPEN_BINARY, 0666);
+  hd.stab_offset = (cur_offset + 3) & ~3;
+
+  write (pdump_fd, &hd, sizeof (hd));
+  lseek (pdump_fd, 256, SEEK_SET);
+
+  pdump_scan_by_alignment (pdump_dump_data);
+
+  lseek (pdump_fd, hd.stab_offset, SEEK_SET);
+
+  pdump_dump_staticvec ();
+  pdump_dump_structvec ();
+  pdump_dump_opaquevec ();
+  pdump_dump_itable ();
+  pdump_dump_rtables ();
+  pdump_dump_wired ();
+
+  close (pdump_fd);
+  free (pdump_buf);
+
+  free (pdump_hash);
+
+  Vterminal_console = t_console;
+  Vterminal_frame   = t_frame;
+  Vterminal_device  = t_device;
+}
+
+static int pdump_load_check (void)
+{
+  return (!memcmp (((dump_header *)pdump_start)->signature, DUMP_SIGNATURE, DUMP_SIGNATURE_LEN)
+         && ((dump_header *)pdump_start)->id == dump_id);
+}
+
+static int pdump_load_finish (void)
+{
+  int i;
+  char *p;
+  EMACS_INT delta;
+  EMACS_INT count;
+
+  pdump_end = pdump_start + pdump_length;
+
+#define PDUMP_READ(p, type) (p = (char*) (((type *) p) + 1), *((type *) p - 1))
+
+  staticidx = ((dump_header *)(pdump_start))->nb_staticpro;
+  delta = ((EMACS_INT)pdump_start) - ((dump_header *)pdump_start)->reloc_address;
+  p = pdump_start + ((dump_header *)pdump_start)->stab_offset;
+
+  /* Put back the staticvec in place */
+  memcpy (staticvec, p, staticidx*sizeof (Lisp_Object *));
+  p += staticidx*sizeof (Lisp_Object *);
+  for (i=0; i<staticidx; i++)
+    {
+      Lisp_Object obj = PDUMP_READ (p, Lisp_Object);
+      if (POINTER_TYPE_P (XTYPE (obj)))
+       XSETOBJ (obj, XTYPE (obj), (char *) XPNTR (obj) + delta);
+      *staticvec[i] = obj;
+    }
+
+  /* Put back the dumpstructs */
+  for (i=0; i<((dump_header *)pdump_start)->nb_structdmp; i++)
+    {
+      void **adr = PDUMP_READ (p, void **);
+      *adr = (void *) (PDUMP_READ (p, char *) + delta);
+    }
+
+  /* Put back the opaques */
+  for (i=0; i<((dump_header *)pdump_start)->nb_opaquedmp; i++)
+    {
+      struct pdump_dumpopaqueinfo di = PDUMP_READ (p, struct pdump_dumpopaqueinfo);
+      memcpy (di.data, p, di.size);
+      p += di.size;
+    }
+
+  /* Put back the lrecord_implementations_table */
+  /* The (void *) cast is there to make Ben happy. */
+  memcpy ((void *) lrecord_implementations_table, p, lrecord_type_count*sizeof (lrecord_implementations_table[0]));
+  p += lrecord_type_count*sizeof (lrecord_implementations_table[0]);
+
+  /* Reinitialize lrecord_markers from lrecord_implementations_table */
+  for (i=0; i < lrecord_type_count; i++)
+    if (lrecord_implementations_table[i])
+      lrecord_markers[i] = lrecord_implementations_table[i]->marker;
+
+  /* Do the relocations */
+  pdump_rt_list = p;
+  count = 2;
+  for (;;)
+    {
+      pdump_reloc_table rt = PDUMP_READ (p, pdump_reloc_table);
+      if (rt.desc)
+       {
+         for (i=0; i < rt.count; i++)
+           {
+             char *adr = delta + *(char **)p;
+             *(char **)p = adr;
+             pdump_reloc_one (adr, delta, rt.desc);
+             p += sizeof (char *);
+           }
+       } else
+         if (!(--count))
+           break;
+    }
+
+  /* Put the pdump_wire variables in place */
+  count = PDUMP_READ (p, EMACS_INT);
+
+  for (i=0; i<count; i++)
+    {
+      Lisp_Object *var = PDUMP_READ (p, Lisp_Object *);
+      Lisp_Object  obj = PDUMP_READ (p, Lisp_Object);
+
+      if (POINTER_TYPE_P (XTYPE (obj)))
+       XSETOBJ (obj, XTYPE (obj), (char *) XPNTR (obj) + delta);
+
+      *var = obj;
+    }
+
+  /* Final cleanups */
+  /*   reorganize hash tables */
+  p = pdump_rt_list;
+  for (;;)
+    {
+      pdump_reloc_table rt = PDUMP_READ (p, pdump_reloc_table);
+      if (!rt.desc)
+       break;
+      if (rt.desc == hash_table_description)
+       {
+         for (i=0; i < rt.count; i++)
+           pdump_reorganize_hash_table (PDUMP_READ (p, Lisp_Object));
+         break;
+       } else
+         p += sizeof (Lisp_Object) * rt.count;
+    }
+
+  /* Put back noninteractive1 to its real value */
+  noninteractive1 = noninteractive;
+
+  return 1;
+}
+
+#ifdef WINDOWSNT
+static void pdump_file_unmap(void)
+{
+}
+
+static int pdump_file_get(const char *path)
+{
+  HANDLE hFile;
+  HANDLE hMap;
+
+  hFile = CreateFile (path, 
+                     GENERIC_READ + GENERIC_WRITE,  /* Required for copy on write */
+                     0,                    /* Not shared */
+                     NULL,                 /* Not inheritable */
+                     OPEN_EXISTING, 
+                     FILE_ATTRIBUTE_NORMAL,
+                     NULL);                /* No template file */
+  if (hFile == INVALID_HANDLE_VALUE)
+    return 0;
+
+  pdump_length = GetFileSize (hFile, NULL);
+  hMap = CreateFileMapping (hFile,
+                           NULL,                   /* No security attributes */
+                           PAGE_WRITECOPY,   /* Copy on write */
+                           0,              /* Max size, high half */
+                           0,              /* Max size, low half */
+                           NULL);          /* Unnamed */
+  if (hMap == INVALID_HANDLE_VALUE)
+    return 0;
+
+  pdump_start = MapViewOfFile (hMap,
+                              FILE_MAP_COPY,  /* Copy on write */
+                              0,             /* Start at zero */
+                              0,
+                              0);            /* Map all of it */
+  pdump_free = pdump_file_unmap;
+  return 1;
+}
+
+static void pdump_resource_free (void)
+static int pdump_resource_get (void)
+{
+  HRSRC hRes;        /* Handle to dump resource */
+  HRSRC hResLoad;            /* Handle to loaded dump resource */
+
+  /* See Q126630 which describes how Windows NT and 95 trap writes to
+     resource sections and duplicate the page to allow the write to proceed.
+     It also describes how to make the resource section read/write (and hence
+     private to each process).  Doing this avoids the exceptions and related
+     overhead, but causes the resource section to be private to each process
+     that is running XEmacs.  Since the resource section contains little
+     other than the dumped data, which should be private to each process, we
+     make the whole resource section read/write so we don't have to copy it. */
+
+  hRes = FindResource (NULL, MAKEINTRESOURCE(101), "DUMP");
+  if (hRes == NULL)
+    return 0;
+
+  /* Found it, use the data in the resource */
+  hResLoad = LoadResource (NULL, hRes);
+  if (hResLoad == NULL)
+    return 0;
+
+  pdump_start = LockResource (hResLoad);
+  if (pdump_start == NULL)
+    return 0;
+
+  pdump_free = pdump_resource_free;
+  pdump_length = SizeofResource (NULL, hRes);
+  if (pdump_length <= sizeof(dump_header))
+    {
+      pdump_start = 0;
+      return 0;
+    }
+
+  return 1;
+}
+
+#else /* !WINDOWSNT */
+
+static void *pdump_mallocadr;
+
+static void pdump_file_free(void)
+{
+  xfree (pdump_mallocadr);
+}
+
+#ifdef HAVE_MMAP
+static void pdump_file_unmap(void)
+{
+  munmap (pdump_start, pdump_length);
+}
+#endif
+
+static int pdump_file_get(const char *path)
+{
+  int fd = open (path, O_RDONLY | OPEN_BINARY);
+  if (fd<0)
+    return 0;
+
+  pdump_length = lseek (fd, 0, SEEK_END);
+  if (pdump_length < sizeof (dump_header))
+    {
+      close (fd);
+      return 0;
+    }
+
+  lseek (fd, 0, SEEK_SET);
+
+#ifdef HAVE_MMAP
+  pdump_start = (char *) mmap (0, pdump_length, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
+  if (pdump_start != MAP_FAILED)
+    {
+      pdump_free = pdump_file_unmap;
+      close (fd);
+      return 1;
+    }
+#endif
+
+  pdump_mallocadr = xmalloc(pdump_length+255);
+  pdump_free = pdump_file_free;
+  pdump_start = (char *)((255 + (unsigned long)pdump_mallocadr) & ~255);
+  read (pdump_fd, pdump_start, pdump_length);
+
+  close (pdump_fd);
+  return 1;
+}
+#endif /* !WINDOWSNT */
+
+
+static int pdump_file_try(char *exe_path)
+{
+  char *w;
+
+  w = exe_path + strlen(exe_path);
+  do
+    {
+      sprintf (w, "-%s-%08x.dmp", EMACS_VERSION, dump_id);
+      if (pdump_file_get (exe_path))
+       {
+         if (pdump_load_check ())
+           return 1;
+         pdump_free();
+       }
+      
+      sprintf (w, "-%08x.dmp", dump_id);
+      if (pdump_file_get (exe_path))
+       {
+         if (pdump_load_check ())
+           return 1;
+         pdump_free();
+       }
+      
+      sprintf (w, ".dmp");
+      if (pdump_file_get (exe_path))
+       {
+         if (pdump_load_check ())
+           return 1;
+         pdump_free();
+       }
+      
+      do
+       w--;
+      while (w>exe_path && !IS_DIRECTORY_SEP (*w) && (*w != '-') && (*w != '.'));      
+    }
+  while (w>exe_path && !IS_DIRECTORY_SEP (*w));
+  return 0;
+}
+
+int pdump_load(const char *argv0)
+{
+  char exe_path[PATH_MAX];
+  char *w;
+#ifdef WINDOWSNT
+  GetModuleFileName (NULL, exe_name, PATH_MAX);  
+#else /* !WINDOWSNT */
+  const char *dir, *p;
+
+  dir = argv0;
+  if (dir[0] == '-')
+    {
+      /* XEmacs as a login shell, oh goody! */
+      dir = getenv("SHELL");
+    }
+
+  p = dir + strlen(dir);
+  while (p != dir && !IS_ANY_SEP (p[-1])) p--;
+  
+  if (p != dir)
+    {
+      /* invocation-name includes a directory component -- presumably it
+        is relative to cwd, not $PATH */
+      strcpy (exe_path, dir);
+    }
+  else
+    {
+      const char *path = getenv ("PATH");
+      const char *name = p;
+      for (;;)
+       {
+         p = path;
+         while (*p && *p != SEPCHAR)
+           p++;
+         if (p == path)
+           {
+             exe_path[0] = '.';
+             w = exe_path + 1;
+           }
+         else
+           {
+             memcpy (exe_path, path, p - path);
+             w = exe_path + (p - path);
+           }
+         if (!IS_DIRECTORY_SEP (w[-1]))
+           {
+             *w++ = '/';
+           }
+         strcpy(w, name);
+         
+         /* ### #$%$#^$^@%$^#%@$ ! */
+#ifdef access
+#undef access
+#endif
+         
+         if (!access (exe_path, X_OK))
+           break;
+         if (!*p)
+           {
+             /* Oh well, let's have some kind of default */
+             sprintf (exe_path, "./%s", name);
+             break;
+           }
+         path = p+1;       
+       }
+    }
+#endif /* WINDOWSNT */
+
+  if (pdump_file_try (exe_path))
+    {
+      pdump_load_finish ();
+      return 1;
+    }
+
+#ifdef WINDOWSNT
+  if (pdump_resource_get ())
+    {
+      if (pdump_load_check ())
+       {
+         pdump_load_finish ();
+         return 1;
+       }
+      pdump_free ();
+    }
+#endif
+
+  return 0;
+}
diff --git a/src/dumper.h b/src/dumper.h
new file mode 100644 (file)
index 0000000..901bd1c
--- /dev/null
@@ -0,0 +1,30 @@
+/* Portable data dumper for XEmacs.
+   Copyright (C) 1999-2000 Olivier Galibert
+
+This file is part of XEmacs.
+
+XEmacs 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.
+
+XEmacs 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 XEmacs; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* Synched up with: Not in FSF. */
+
+#ifndef INCLUDED_dumper_h
+#define INCLUDED_dumper_h
+
+void pdump_objects_unmark (void);
+void pdump (void);
+int pdump_load (const char *argv0);
+
+#endif /* INCLUDED_dumper_h */
diff --git a/src/postgresql.c b/src/postgresql.c
new file mode 100644 (file)
index 0000000..724b043
--- /dev/null
@@ -0,0 +1,2133 @@
+/*
+  postgresql.c -- Emacs Lisp binding to libpq.so
+  Copyright (C) 2000 Electrotechnical Laboratory, JAPAN.
+  Licensed to the Free Software Foundation.
+
+  Author:  SL Baur <steve@beopen.com>
+  Maintainer:  SL Baur <steve@beopen.com>
+
+Please send patches to this file to me first before submitting them to
+xemacs-patches.
+
+
+KNOWN PROBLEMS (Last update 15-March-2000)
++  None.
+
+Implementation notes:
+0. Supported PostgreSQL versions
+   This code was developed against libpq-6.5.3 and libpq-7.0-beta1.  Earlier
+   versions may work.  V7 support is more complete than V6.5 support.
+1. Mule
+   Non-ASCII databases have been tested on both 6.5 and 7.0.
+2. Asynchronous Operation
+   Starting with libpq-7.0, an asynchronous interface is offered.  This
+   binding supports the asynchronous calls to a limited extent.  Since the
+   XEmacs 21.2 core does not support a sensible interface to add managed but
+   unreadable (by XEmacs) file descriptors to the main select code, polling
+   is required to drive the asynchronous calls.  XtAppAddInput would work
+   fine, but we want to be able to use the database when running strictly in
+   tty mode.
+3. Completeness
+   Various calls have been deliberately not exported to Lisp.  The
+   unexported calls are either left-over backwards compatibility code that
+   aren't needed, calls that cannot be implemented sensibly, or calls that
+   cannot be implemented safely.  A list of all global functions in libpq
+   but not exported to Lisp is below.
+4. Policy
+   This interface tries very hard to not set any policy towards how database
+   code in Emacs Lisp will be written.
+5. Documentation
+   For full lisp programming documentation, see the XEmacs Lisp Reference
+   Manual.  For PostgreSQL documentation, see the PostgreSQL distribution.
+
+TODO (in rough order of priority):
+1. Asynchronous notifies need to be implemented to the extent they can be.
+2. The large object interface needs work with Emacs buffers in addition
+   to files.  Need two functions buffer->large_object, and large_object->
+   buffer.
+*/
+
+/*
+  Unimplemented functions: [TODO]
+  PQsetNoticeProcessor
+
+  Implemented, but undocumented functions: [TODO]
+  PQgetline (copy in/out)
+  PQputline (copy in/out)
+  PQgetlineAsync (copy in/out Asynch.)
+  PQputnbytes (copy in/out Asynch.)
+  PQendcopy (copy in/out)
+  PQsetenvStart (Asynch. Queries)
+  PQsetenvPoll (Asynch. Queries)
+  PQsetenvHandle (Asynch. Queries)
+
+  Unsupported functions:
+  PQsetdbLogin -- This function is deprecated, has a subset of the
+   functionality of PQconnectdb, and is better done in Lisp.
+  PQsetdb -- Same as for PQsetdbLogin
+  PQsocket -- Abstraction error, file descriptors should not be leaked
+   into Lisp code
+  PQprint -- print to a file descriptor, deprecated, better done in Lisp
+  PQdisplayTuples -- deprecated
+  PQprintTuples -- really, really deprecated
+  PQmblen -- Returns the length in bytes of multibyte character encoded
+   string.
+  PQtrace -- controls debug print tracing to a tty.
+  PQuntrace -- Ditto.  I don't see any way to do this sensibly.
+  PQoidStatus -- deprecated and nearly identical to PQoidValue
+  PQfn -- "Fast path" interface
+  lo_open (large object) [*]
+  lo_close (large object) [*]
+  lo_read (large object) [*]
+  lo_write (large object) [*]
+  lo_lseek (large object) [*]
+  lo_creat (large object) [*]
+  lo_tell (large object) [*]
+  lo_unlink (large object) [*]
+*/
+
+#include <config.h>
+
+/* This must be portable with XEmacs 21.1 so long as it is the official
+   released version of XEmacs and provides the basis of InfoDock.  The
+   interface to lcrecord handling has changed with 21.2, so unfortunately
+   we will need a few snippets of backwards compatibility code.
+*/
+#if (EMACS_MAJOR_VERSION == 21) && (EMACS_MINOR_VERSION < 2)
+#define RUNNING_XEMACS_21_1 1
+#endif
+
+/* #define POSTGRES_LO_IMPORT_IS_VOID 1 */
+
+#include "lisp.h"
+#include "sysdep.h"
+#include "buffer.h"
+
+#include <libpq-fe.h>
+/* Undefine the following when asynchronous setenvs are fixed in libpq. */
+/* #define LIBPQ_7_0_IS_FIXED */
+#include "postgresql.h"
+
+#ifdef RUNNING_XEMACS_21_1 /* handle interface changes */
+#define I_HATE_CONST CONST
+#define PG_OS_CODING FORMAT_FILENAME
+#define TO_EXTERNAL_FORMAT(a,from,b,to,c) GET_C_STRING_EXT_DATA_ALLOCA(from,FORMAT_FILENAME,to)
+#else
+#define I_HATE_CONST const
+#ifdef MULE
+#define PG_OS_CODING Fget_coding_system(Vpg_coding_system)
+#else
+#define PG_OS_CODING Qnative
+#endif
+Lisp_Object Vpg_coding_system;
+#endif
+
+#define CHECK_LIVE_CONNECTION(P) { \
+       if (!P || (PQstatus (P) != CONNECTION_OK)) { \
+               char *e = "bad value"; \
+               if (P) e = PQerrorMessage (P); \
+               error ("dead connection [%s]", e); \
+       } }
+#define PUKE_IF_NULL(p) { \
+       if (!p) error ("bad value"); \
+       }
+
+static Lisp_Object VXPGHOST;
+static Lisp_Object VXPGUSER;
+static Lisp_Object VXPGOPTIONS;
+static Lisp_Object VXPGPORT;
+static Lisp_Object VXPGTTY; /* This needs to be blanked! */
+static Lisp_Object VXPGDATABASE;
+static Lisp_Object VXPGREALM;
+#ifdef MULE
+static Lisp_Object VXPGCLIENTENCODING;
+#endif /* MULE */
+
+/* Other variables:
+   PGAUTHTYPE -- not used after PostgreSQL 6.5
+   PGGEQO
+   PGCOSTINDEX
+   PGCOSTHEAP
+   PGTZ
+   PGDATESTYLE
+*/
+#ifndef HAVE_POSTGRESQLV7
+static Lisp_Object VXPGAUTHTYPE;
+#endif
+static Lisp_Object VXPGGEQO, VXPGCOSTINDEX, VXPGCOSTHEAP, VXPGTZ, VXPGDATESTYLE;
+
+static Lisp_Object Qpostgresql;
+static Lisp_Object Qpg_connection_ok, Qpg_connection_bad;
+static Lisp_Object Qpg_connection_started, Qpg_connection_made;
+static Lisp_Object Qpg_connection_awaiting_response, Qpg_connection_auth_ok;
+static Lisp_Object Qpg_connection_setenv;
+
+static Lisp_Object Qpqdb, Qpquser, Qpqpass, Qpqhost, Qpqport, Qpqtty;
+static Lisp_Object Qpqoptions, Qpqstatus, Qpqerrormessage, Qpqbackendpid;
+
+static Lisp_Object Qpgres_empty_query, Qpgres_command_ok, Qpgres_tuples_ok;
+static Lisp_Object Qpgres_copy_out, Qpgres_copy_in, Qpgres_bad_response;
+static Lisp_Object Qpgres_nonfatal_error, Qpgres_fatal_error;
+
+static Lisp_Object Qpgres_polling_failed, Qpgres_polling_reading;
+static Lisp_Object Qpgres_polling_writing, Qpgres_polling_ok;
+static Lisp_Object Qpgres_polling_active;
+/****/
+
+/* PGconn is an opaque object and we need to be able to store them in
+   Lisp code because libpq supports multiple connections.
+*/
+Lisp_Object Qpgconnp;
+
+static Lisp_Object
+make_pgconn (Lisp_PGconn *pgconn)
+{
+  Lisp_Object lisp_pgconn;
+  XSETPGCONN (lisp_pgconn, pgconn);
+  return lisp_pgconn;
+}
+
+static Lisp_Object
+#ifdef RUNNING_XEMACS_21_1
+mark_pgconn (Lisp_Object obj, void (*markobj) (Lisp_Object))
+#else
+mark_pgconn (Lisp_Object obj)
+#endif
+{
+  return Qnil;
+}
+
+static void
+print_pgconn (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
+{
+  char buf[256];
+  PGconn *P;
+  ConnStatusType cst;
+  char *host="", *db="", *user="", *port="";
+
+  P = (XPGCONN (obj))->pgconn;
+
+  if (!P) /* this may happen since we allow PQfinish() to be called */
+    strcpy (buf, "#<PGconn DEAD>"); /* evil! */
+  else if ((cst = PQstatus (P)) == CONNECTION_OK)
+    {
+      if (!(host = PQhost (P)))
+       host = "";
+      port = PQport (P);
+      db = PQdb (P);
+      if (!(user = PQuser (P)))
+       user = "";
+      sprintf (buf, "#<PGconn %s:%s %s/%s>", /* evil! */
+             !strlen (host) ? "localhost" : host,
+             port,
+             user,
+             db);
+    }
+  else if (cst == CONNECTION_BAD)
+    strcpy (buf, "#<PGconn BAD>"); /* evil! */
+  else
+    strcpy (buf, "#<PGconn connecting>"); /* evil! */
+
+  if (print_readably)
+    error ("printing unreadable object %s", buf);
+  else
+    write_c_string (buf, printcharfun);
+}
+
+static Lisp_PGconn *
+allocate_pgconn (void)
+{
+#ifdef RUNNING_XEMACS_21_1
+  Lisp_PGconn *pgconn = alloc_lcrecord_type (Lisp_PGconn,
+                                            lrecord_pgconn);
+#else
+  Lisp_PGconn *pgconn = alloc_lcrecord_type (Lisp_PGconn,
+                                            &lrecord_pgconn);
+#endif
+  pgconn->pgconn = (PGconn *)NULL;
+  return pgconn;
+}
+
+static void
+finalize_pgconn (void *header, int for_disksave)
+{
+  Lisp_PGconn *pgconn = (Lisp_PGconn *)header;
+
+  if (for_disksave)
+    signal_simple_error ("Can't dump an emacs containing PGconn objects",
+                         make_pgconn (pgconn));
+
+  if (pgconn->pgconn)
+    {
+      PQfinish (pgconn->pgconn);
+      pgconn->pgconn = (PGconn *)NULL;
+    }
+}
+
+#ifdef RUNNING_XEMACS_21_1
+DEFINE_LRECORD_IMPLEMENTATION ("pgconn", pgconn,
+                              mark_pgconn, print_pgconn, finalize_pgconn,
+                              NULL, NULL,
+                              Lisp_PGconn);
+#else
+DEFINE_LRECORD_IMPLEMENTATION ("pgconn", pgconn,
+                              mark_pgconn, print_pgconn, finalize_pgconn,
+                              NULL, NULL,
+                              0,
+                              Lisp_PGconn);
+#endif
+/****/
+
+/* PGresult is an opaque object and we need to be able to store them in
+   Lisp code.
+*/
+Lisp_Object Qpgresultp;
+
+static Lisp_Object
+make_pgresult (Lisp_PGresult *pgresult)
+{
+  Lisp_Object lisp_pgresult;
+  XSETPGRESULT (lisp_pgresult, pgresult);
+  return lisp_pgresult;
+}
+
+static Lisp_Object
+#ifdef RUNNING_XEMACS_21_1
+mark_pgresult (Lisp_Object obj, void (*markobj) (Lisp_Object))
+#else
+mark_pgresult (Lisp_Object obj)
+#endif
+{
+  return Qnil;
+}
+
+#define RESULT_TUPLES_FMT "#<PGresult %s[%d] - %s>"
+#define RESULT_CMD_TUPLES_FMT "#<PGresult %s[%s] - %s>"
+#define RESULT_DEFAULT_FMT "#<PGresult %s - %s>"
+static void
+print_pgresult (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
+{
+  char buf[1024];
+  PGresult *res;
+
+  res = (XPGRESULT (obj))->pgresult;
+
+  if (res)
+    {
+      switch (PQresultStatus (res))
+       {
+       case PGRES_TUPLES_OK:
+         /* Add number of tuples of result to output */
+         sprintf (buf, RESULT_TUPLES_FMT, /* evil! */
+                  PQresStatus (PQresultStatus (res)),
+                  PQntuples (res),
+                  PQcmdStatus (res));
+         break;
+       case PGRES_COMMAND_OK:
+         /* Add number of tuples affected by output-less command */
+         if (!strlen (PQcmdTuples (res))) goto notuples;
+         sprintf (buf, RESULT_CMD_TUPLES_FMT, /* evil! */
+                  PQresStatus (PQresultStatus (res)),
+                  PQcmdTuples (res),
+                  PQcmdStatus (res));
+         break;
+       default:
+notuples:
+         /* No counts to print */
+         sprintf (buf, RESULT_DEFAULT_FMT, /* evil! */
+                  PQresStatus (PQresultStatus (res)),
+                  PQcmdStatus (res));
+         break;
+       }
+    }
+  else
+    strcpy (buf, "#<PGresult DEAD>"); /* evil! */
+
+  if (print_readably)
+    error ("printing unreadable object %s", buf);
+  else
+    write_c_string (buf, printcharfun);
+}
+
+#undef RESULT_TUPLES_FMT
+#undef RESULT_CMD_TUPLES_FMT
+#undef RESULT_DEFAULT_FMT
+
+static Lisp_PGresult *
+allocate_pgresult (void)
+{
+#ifdef RUNNING_XEMACS_21_1
+  Lisp_PGresult *pgresult = alloc_lcrecord_type (Lisp_PGresult,
+                                                lrecord_pgresult);
+#else
+  Lisp_PGresult *pgresult = alloc_lcrecord_type (Lisp_PGresult,
+                                                &lrecord_pgresult);
+#endif
+  pgresult->pgresult = (PGresult *)NULL;
+  return pgresult;
+}
+
+static void
+finalize_pgresult (void *header, int for_disksave)
+{
+  Lisp_PGresult *pgresult = (Lisp_PGresult *)header;
+
+  if (for_disksave)
+    signal_simple_error ("Can't dump an emacs containing PGresult objects",
+                         make_pgresult (pgresult));
+
+  if (pgresult->pgresult)
+    {
+      PQclear (pgresult->pgresult);
+      pgresult->pgresult = (PGresult *)NULL;
+    }
+}
+
+#ifdef RUNNING_XEMACS_21_1
+DEFINE_LRECORD_IMPLEMENTATION ("pgresult", pgresult,
+                              mark_pgresult, print_pgresult, finalize_pgresult,
+                              NULL, NULL,
+                              Lisp_PGresult);
+#else
+DEFINE_LRECORD_IMPLEMENTATION ("pgresult", pgresult,
+                              mark_pgresult, print_pgresult, finalize_pgresult,
+                              NULL, NULL,
+                              0,
+                              Lisp_PGresult);
+#endif
+
+/****/
+#ifdef HAVE_POSTGRESQLV7
+/* PGsetenvHandle is an opaque object and we need to be able to store them in
+   Lisp code so we can make asynchronous environmental calls.
+
+   Asynchronous setenv calls were introduced in libpq-7.0.
+*/
+#ifdef LIBPQ_7_0_IS_FIXED
+
+Lisp_Object Qpgsetenvp;
+
+static Lisp_Object
+make_pgsetenv (Lisp_PGsetenvHandle *pgsetenv)
+{
+  Lisp_Object lisp_pgsetenv;
+  XSETPGSETENV (lisp_pgsetenv, pgsetenv);
+  return lisp_pgsetenv;
+}
+
+static Lisp_Object
+#ifdef RUNNING_XEMACS_21_1
+mark_pgsetenv (Lisp_Object obj, void (*markobj) (Lisp_Object))
+#else
+mark_pgsetenv (Lisp_Object obj)
+#endif
+{
+  return Qnil;
+}
+
+static void
+print_pgsetenv (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
+{
+  char *fmt = "#<PGsetenvHandle %s>";
+  char buf[1024];
+  PGsetenvHandle *h;
+
+  h = (XPGSETENV (obj))->pgsetenv;
+
+  sprintf (buf, fmt, h ? "live" : "DEAD");
+
+  /* There are no accessor functions to retrieve any fields, so we must */
+  /* treat this as being completely opaque. */
+  if (print_readably)
+    error ("printing unreadable object %s", buf);
+  else
+    write_c_string (buf, printcharfun);
+}
+
+static Lisp_PGsetenvHandle *
+allocate_pgresult (void)
+{
+#ifdef RUNNING_XEMACS_21_1
+  Lisp_PGsetenvHandle *pgsetenv =
+    alloc_lcrecord_type (Lisp_PGsetenvHandle, lrecord_pgsetenv);
+#else
+  Lisp_PGsetenvHandle *pgsetenv =
+    alloc_lcrecord_type (Lisp_PGsetenvHandle, &lrecord_pgsetenv);
+#endif
+  pgsetenv->pgsetenv = (PGsetenvState *)NULL;
+  return pgsetenv;
+}
+
+static void
+finalize_pgsetenv (void *header, int for_disksave)
+{
+  Lisp_PGsetenvHandle *pgsetenv = (Lisp_PGsetenvHandle *)header;
+
+  if (for_disksave)
+    signal_simple_error ("Can't dump an emacs containing PGsetenvHandle objects",
+                         make_pgsetenv (pgsetenv));
+
+  /* #### PGsetenvHandle's are allocated with malloc(), however in
+     libpq-7.0 the treatment of them is little short of disastrous.
+     We don't dare attempt to free it, because there are many code
+     paths which lead to the handle being freed internally.  The
+     connection routines leak setenv handles and so will we until
+     libpq gets cleaned up.
+     Actually, in 7.0b1 asynchronous setenv cannot work outside libpq, so
+     these functions are disabled in this API.
+  */
+  if (pgsetenv->pgsetenv)
+    {
+      free (pgsetenv->pgsetenv);
+      pgsetenv->pgsetenv = (PGsetenvHandle *)NULL;
+    }
+}
+
+#ifdef RUNNING_XEMACS_21_1
+DEFINE_LRECORD_IMPLEMENTATION ("pgresult", pgresult,
+                              mark_pgresult, print_pgresult, finalize_pgresult,
+                              NULL, NULL,
+                              Lisp_PGresult);
+#else
+DEFINE_LRECORD_IMPLEMENTATION ("pgresult", pgresult,
+                              mark_pgresult, print_pgresult, finalize_pgresult,
+                              NULL, NULL,
+                              0,
+                              Lisp_PGresult);
+#endif /* RUNNING_XEMACS_21_1 */
+
+#endif /* LIBPQ_7_0_IS_FIXED */
+#endif /* HAVE_POSTGRESQLV7 */
+
+/***********************/
+
+/* notices */
+static void
+xemacs_notice_processor (void *arg, I_HATE_CONST char *msg)
+{
+  warn_when_safe (Qpostgresql, Qnotice, "%s", msg);
+}
+
+/* There are four ways (as of PostgreSQL v7) to connect to a database.
+   Two of them, PQsetdb and PQsetdbLogin, are deprecated.  Both of those
+   routines take a number of positional parameters and are better done in Lisp.
+   Note that PQconnectStart does not exist prior to v7.
+*/
+
+DEFUN ("pq-conn-defaults", Fpq_conn_defaults, 0, 0, 0, /*
+Return a connection default structure.
+*/
+       ())
+{
+  /* This function can GC */
+  PQconninfoOption *pcio;
+  Lisp_Object temp, temp1;
+  int i;
+
+  pcio = PQconndefaults();
+  if (!pcio) return Qnil; /* can never happen in libpq-7.0 */
+  temp = list1 (Fcons (build_ext_string (pcio[0].keyword, PG_OS_CODING),
+                      Fcons (build_ext_string (pcio[0].envvar, PG_OS_CODING),
+                             Fcons (build_ext_string (pcio[0].compiled, PG_OS_CODING),
+                                    Fcons (build_ext_string (pcio[0].val, PG_OS_CODING),
+                                           Fcons (build_ext_string (pcio[0].label, PG_OS_CODING),
+                                                  Fcons (build_ext_string (pcio[0].dispchar, PG_OS_CODING),
+                                                         Fcons (make_int (pcio[0].dispsize), Qnil))))))));
+
+  for (i = 1; pcio[i].keyword; i++)
+    {
+      temp1 = list1 (Fcons (build_ext_string (pcio[i].keyword, PG_OS_CODING),
+                           Fcons (build_ext_string (pcio[i].envvar, PG_OS_CODING),
+                                  Fcons (build_ext_string (pcio[i].compiled, PG_OS_CODING),
+                                         Fcons (build_ext_string (pcio[i].val, PG_OS_CODING),
+                                                Fcons (build_ext_string (pcio[i].label, PG_OS_CODING),
+                                                       Fcons (build_ext_string (pcio[i].dispchar, PG_OS_CODING),
+                                                              Fcons (make_int (pcio[i].dispsize), Qnil))))))));
+      {
+       Lisp_Object args[2];
+       args[0] = temp;
+       args[1] = temp1;
+       /* Fappend GCPROs its arguments */
+       temp = Fappend (2, args);
+      }
+    }
+
+  return temp;
+}
+
+/* PQconnectdb Makes a new connection to a backend.
+PGconn *PQconnectdb(const char *conninfo)
+*/
+
+DEFUN ("pq-connectdb", Fpq_connectdb, 1, 1, 0, /*
+Make a new connection to a PostgreSQL backend.
+*/
+       (conninfo))
+{
+  PGconn *P;
+  Lisp_PGconn *lisp_pgconn;
+  char *error_message = "Out of Memory?";
+  char *c_conninfo;
+
+  CHECK_STRING (conninfo);
+
+  TO_EXTERNAL_FORMAT(LISP_STRING, conninfo,
+                    C_STRING_ALLOCA, c_conninfo, Qnative);
+  P = PQconnectdb (c_conninfo);
+  if (P && (PQstatus (P) == CONNECTION_OK))
+    {
+      (void)PQsetNoticeProcessor (P, xemacs_notice_processor, NULL);
+      lisp_pgconn = allocate_pgconn();
+      lisp_pgconn->pgconn = P;
+      return make_pgconn (lisp_pgconn);
+    }
+  else
+    {
+      /* Connection failed.  Destroy the connection and signal an error. */
+      char buf[BLCKSZ];
+      strcpy (buf, error_message);
+      if (P)
+       {
+         /* storage for the error message gets erased when call PQfinish */
+         /* so we must temporarily stash it somewhere */
+         strncpy (buf, PQerrorMessage (P), sizeof (buf));
+         buf[sizeof (buf) - 1] = '\0';
+         PQfinish (P);
+       }
+      error ("libpq: %s", buf);
+    }
+}
+
+/* PQconnectStart Makes a new asynchronous connection to a backend.
+PGconn *PQconnectStart(const char *conninfo)
+*/
+
+#ifdef HAVE_POSTGRESQLV7
+DEFUN ("pq-connect-start", Fpq_connect_start, 1, 1, 0, /*
+Make a new asynchronous connection to a PostgreSQL backend.
+*/
+       (conninfo))
+{
+  PGconn *P;
+  Lisp_PGconn *lisp_pgconn;
+  char *error_message = "Out of Memory?";
+  char *c_conninfo;
+
+  CHECK_STRING (conninfo);
+  TO_EXTERNAL_FORMAT (LISP_STRING, conninfo,
+                     C_STRING_ALLOCA, c_conninfo, Qnative);
+  P = PQconnectStart (c_conninfo);
+
+  if (P && (PQstatus (P) != CONNECTION_BAD))
+    {
+      (void)PQsetNoticeProcessor (P, xemacs_notice_processor, NULL);
+      lisp_pgconn = allocate_pgconn();
+      lisp_pgconn->pgconn = P;
+
+      return make_pgconn (lisp_pgconn);
+    }
+  else
+    {
+      /* capture the error message before destroying the object */
+      char buf[BLCKSZ];
+      strcpy (buf, error_message);
+      if (P)
+       {
+         strncpy (buf, PQerrorMessage (P), sizeof (buf));
+         buf[sizeof (buf) - 1] = '\0';
+         PQfinish (P);
+       }
+      error ("libpq: %s", buf);
+    }
+}
+
+DEFUN ("pq-connect-poll", Fpq_connect_poll, 1, 1, 0, /*
+Poll an asynchronous connection for completion
+*/
+       (conn))
+{
+  PGconn *P;
+  PostgresPollingStatusType PS;
+
+  CHECK_PGCONN (conn);
+
+  P = (XPGCONN (conn))->pgconn;
+  CHECK_LIVE_CONNECTION (P);
+
+  PS = PQconnectPoll (P);
+  switch (PS)
+    {
+    case PGRES_POLLING_FAILED:
+      /* Something Bad has happened */
+      {
+       char *e = PQerrorMessage (P);
+       error ("libpq: %s", e);
+      }
+    case PGRES_POLLING_OK:
+      return Qpgres_polling_ok;
+    case PGRES_POLLING_READING:
+      return Qpgres_polling_reading;
+    case PGRES_POLLING_WRITING:
+      return Qpgres_polling_writing;
+    case PGRES_POLLING_ACTIVE:
+      return Qpgres_polling_active;
+    default:
+      /* they've added a new field we don't know about */
+      error ("Help!  Unknown status code %08x from backend!", PS);
+    }
+}
+
+#ifdef MULE
+DEFUN ("pq-client-encoding", Fpq_client_encoding, 1, 1, 0, /*
+Return client coding system.
+*/
+       (conn))
+{
+  PGconn *P;
+
+  CHECK_PGCONN (conn);
+  P = (XPGCONN (conn))->pgconn;
+  CHECK_LIVE_CONNECTION (P);
+
+  return make_int (PQclientEncoding (P));
+}
+
+DEFUN ("pq-set-client-encoding", Fpq_set_client_encoding, 2, 2, 0, /*
+Set client coding system.
+*/
+       (conn, encoding))
+{
+  PGconn *P;
+  int rc;
+  char *c_encoding;
+
+  CHECK_PGCONN (conn);
+  CHECK_STRING (encoding);
+
+  P = (XPGCONN (conn))->pgconn;
+  CHECK_LIVE_CONNECTION (P);
+
+  TO_EXTERNAL_FORMAT (LISP_STRING, encoding,
+                     C_STRING_ALLOCA, c_encoding, Qnative);
+
+  if ((rc = PQsetClientEncoding (P, c_encoding)) < 0)
+    error ("bad encoding");
+  else
+    return make_int (rc);
+}
+
+#endif
+#endif /* HAVE_POSTGRESQLV7 */
+
+/* PQfinish Close the connection to the backend. Also frees memory
+       used by the PGconn object.
+void PQfinish(PGconn *conn)
+*/
+DEFUN ("pq-finish", Fpq_finish, 1, 1, 0, /*
+Close the connection to the backend.
+*/
+       (conn))
+{
+  PGconn *P;
+
+  CHECK_PGCONN (conn);
+  P = (XPGCONN (conn))->pgconn;
+  PUKE_IF_NULL (P);
+
+  PQfinish (P);
+  /* #### PQfinish deallocates the PGconn structure, so we now have a
+     dangling pointer. */
+  /* Genocided all @'s ... */
+  (XPGCONN (conn))->pgconn = (PGconn *)NULL; /* You feel DEAD inside */
+  return Qnil;
+}
+
+DEFUN ("pq-clear", Fpq_clear, 1, 1, 0, /*
+Forcibly erase a PGresult object.
+*/
+       (res))
+{
+  PGresult *R;
+
+  CHECK_PGRESULT (res);
+  R = (XPGRESULT (res))->pgresult;
+  PUKE_IF_NULL (R);
+
+  PQclear (R);
+  /* Genocided all @'s ... */
+  (XPGRESULT (res))->pgresult = (PGresult *)NULL; /* You feel DEAD inside */
+
+  return Qnil;
+}
+
+DEFUN ("pq-is-busy", Fpq_is_busy, 1, 1, 0, /*
+Return t if PQgetResult would block waiting for input.
+*/
+       (conn))
+{
+  PGconn *P;
+
+  CHECK_PGCONN (conn);
+  P = (XPGCONN (conn))->pgconn;
+  CHECK_LIVE_CONNECTION (P);
+
+  return PQisBusy (P) ? Qt : Qnil;
+}
+
+DEFUN ("pq-consume-input", Fpq_consume_input, 1, 1, 0, /*
+Consume any available input from the backend.
+Returns nil if something bad happened.
+*/
+       (conn))
+{
+  PGconn *P;
+
+  CHECK_PGCONN (conn);
+  P = (XPGCONN (conn))->pgconn;
+  CHECK_LIVE_CONNECTION (P);
+
+  return PQconsumeInput (P) ? Qt : Qnil;
+}
+
+/* PQreset Reset the communication port with the backend.
+void PQreset(PGconn *conn)
+*/
+DEFUN ("pq-reset", Fpq_reset, 1, 1, 0, /*
+Reset the connection to the backend.
+This function will close the connection to the backend and attempt to
+reestablish a new connection to the same postmaster, using all the same
+parameters previously used.  This may be useful for error recovery if a
+working connection is lost.
+*/
+       (conn))
+{
+  PGconn *P;
+
+  CHECK_PGCONN (conn);
+  P = (XPGCONN (conn))->pgconn;
+  PUKE_IF_NULL (P);/* we can resurrect a BAD connection, but not a dead one. */
+
+  PQreset (P);
+
+  return Qnil;
+}
+
+#ifdef HAVE_POSTGRESQLV7
+DEFUN ("pq-reset-start", Fpq_reset_start, 1, 1, 0, /*
+Reset connection to the backend asynchronously.
+*/
+       (conn))
+{
+  PGconn *P;
+
+  CHECK_PGCONN (conn);
+  P = (XPGCONN (conn))->pgconn;
+  CHECK_LIVE_CONNECTION (P);
+
+  if (PQresetStart (P)) return Qt;
+  {
+    char *e = PQerrorMessage (P);
+    error ("libpq: %s", e);
+  }
+}
+
+DEFUN ("pq-reset-poll", Fpq_reset_poll, 1, 1, 0, /*
+Poll an asynchronous reset for completion
+*/
+       (conn))
+{
+  PGconn *P;
+  PostgresPollingStatusType PS;
+
+  CHECK_PGCONN (conn);
+
+  P = (XPGCONN (conn))->pgconn;
+  CHECK_LIVE_CONNECTION (P);
+
+  PS = PQresetPoll (P);
+  switch (PS)
+    {
+    case PGRES_POLLING_FAILED:
+      /* Something Bad has happened */
+      {
+       char *e = PQerrorMessage (P);
+       error ("libpq: %s", e);
+      }
+    case PGRES_POLLING_OK:
+      return Qpgres_polling_ok;
+    case PGRES_POLLING_READING:
+      return Qpgres_polling_reading;
+    case PGRES_POLLING_WRITING:
+      return Qpgres_polling_writing;
+    case PGRES_POLLING_ACTIVE:
+      return Qpgres_polling_active;
+    default:
+      /* they've added a new field we don't know about */
+      error ("Help!  Unknown status code %08x from backend!", PS);
+    }
+}
+#endif
+
+DEFUN ("pq-request-cancel", Fpq_request_cancel, 1, 1, 0, /*
+Attempt to request cancellation of the current operation.
+
+The return value is t if the cancel request was successfully
+dispatched, nil if not (in which case conn->errorMessage is set).
+Note: successful dispatch is no guarantee that there will be any effect at
+the backend.  The application must read the operation result as usual.
+*/
+       (conn))
+{
+  PGconn *P;
+
+  CHECK_PGCONN (conn);
+  P = (XPGCONN (conn))->pgconn;
+  CHECK_LIVE_CONNECTION (P);
+
+  return PQrequestCancel (P) ? Qt : Qnil;
+}
+
+/* accessor function for the PGconn object */
+DEFUN ("pq-pgconn", Fpq_pgconn, 2, 2, 0, /*
+Accessor function for the PGconn object.
+Currently recognized symbols for the field:
+pq::db            Database name
+pq::user          Database user name
+pq::pass          Database user's password
+pq::host          Hostname of PostgreSQL backend connected to
+pq::port          TCP port number of connection
+pq::tty           Debugging TTY (not used in Emacs)
+pq::options       Additional backend options
+pq::status        Connection status (either OK or BAD)
+pq::error-message Last error message from the backend
+pq::backend-pid   Process ID of backend process
+*/
+       (conn, field))
+{
+  PGconn *P;
+
+  CHECK_PGCONN (conn);
+  P = (XPGCONN (conn))->pgconn;
+  PUKE_IF_NULL (P); /* BAD connections still have state to query */
+
+  if (EQ(field, Qpqdb))
+    /* PQdb Returns the database name of the connection.
+       char *PQdb(PGconn *conn)
+     */
+    return build_ext_string (PQdb(P), PG_OS_CODING);
+  else if (EQ (field, Qpquser))
+    /* PQuser Returns the user name of the connection.
+       char *PQuser(PGconn *conn)
+     */
+    return build_ext_string (PQuser(P), PG_OS_CODING);
+  else if (EQ (field, Qpqpass))
+    /* PQpass Returns the password of the connection.
+       char *PQpass(PGconn *conn)
+     */
+    return build_ext_string (PQpass(P), PG_OS_CODING);
+  else if (EQ (field, Qpqhost))
+    /* PQhost Returns the server host name of the connection.
+       char *PQhost(PGconn *conn)
+     */
+    return build_ext_string (PQhost(P), PG_OS_CODING);
+  else if (EQ (field, Qpqport))
+    {
+      char *p;
+      /* PQport Returns the port of the connection.
+         char *PQport(PGconn *conn)
+       */
+      if ((p = PQport(P)))
+       return make_int(atoi(p));
+      else
+        return make_int(-1);
+    }
+  else if (EQ (field, Qpqtty))
+    /* PQtty Returns the debug tty of the connection.
+       char *PQtty(PGconn *conn)
+     */
+    return build_ext_string (PQtty(P), PG_OS_CODING);
+  else if (EQ (field, Qpqoptions))
+  /* PQoptions Returns the backend options used in the connection.
+     char *PQoptions(PGconn *conn)
+   */
+    return build_ext_string (PQoptions(P), PG_OS_CODING);
+  else if (EQ (field, Qpqstatus))
+    {
+      ExecStatusType est;
+      /* PQstatus Returns the status of the connection. The status can be
+        CONNECTION_OK or CONNECTION_BAD.
+        ConnStatusType PQstatus(PGconn *conn)
+      */
+      switch ((est = PQstatus (P)))
+       {
+       case CONNECTION_OK: return Qpg_connection_ok;
+       case CONNECTION_BAD: return Qpg_connection_bad;
+#ifdef HAVE_POSTGRESQLV7
+       case CONNECTION_STARTED: return Qpg_connection_started;
+       case CONNECTION_MADE: return Qpg_connection_made;
+       case CONNECTION_AWAITING_RESPONSE: return Qpg_connection_awaiting_response;
+       case CONNECTION_AUTH_OK: return Qpg_connection_auth_ok;
+       case CONNECTION_SETENV: return Qpg_connection_setenv;
+#endif /* HAVE_POSTGRESQLV7 */
+       default:
+         /* they've added a new field we don't know about */
+         error ("Help!  Unknown exec status code %08x from backend!", est);
+       }
+    }
+  else if (EQ (field, Qpqerrormessage))
+    /* PQerrorMessage Returns the error message most recently generated
+       by an operation on the connection.
+       char *PQerrorMessage(PGconn* conn);
+     */
+    return build_ext_string (PQerrorMessage(P), PG_OS_CODING);
+  else if (EQ (field, Qpqbackendpid))
+    /* PQbackendPID Returns the process ID of the backend server handling
+       this connection.
+       int PQbackendPID(PGconn *conn);
+     */
+    return make_int (PQbackendPID(P));
+  else
+    error ("bad PGconn accessor");
+}
+
+/* Query functions */
+DEFUN ("pq-exec", Fpq_exec, 2, 2, 0, /*
+Submit a query to Postgres and wait for the result.
+*/
+       (conn, query))
+{
+  PGconn *P;
+  Lisp_PGresult *lisp_pgresult;
+  PGresult *R;
+  char *c_query;
+
+  CHECK_PGCONN (conn);
+  CHECK_STRING (query);
+
+  P = (XPGCONN (conn))->pgconn;
+  CHECK_LIVE_CONNECTION (P);
+
+  TO_EXTERNAL_FORMAT (LISP_STRING, query,
+                     C_STRING_ALLOCA, c_query, Qnative);
+
+  R = PQexec (P, c_query);
+  {
+    char *tag, buf[BLCKSZ];
+
+    if (!R) error ("query: out of memory");
+    else
+      switch (PQresultStatus (R))
+       {
+       case PGRES_BAD_RESPONSE:
+         tag = "bad response [%s]";
+         goto err;
+       case PGRES_NONFATAL_ERROR:
+         tag = "non-fatal error [%s]";
+         goto err;
+       case PGRES_FATAL_ERROR:
+         tag = "fatal error [%s]";
+err:
+         strncpy (buf, PQresultErrorMessage (R), sizeof (buf));
+         buf [sizeof (buf) - 1] = '\0';
+         PQclear (R);
+         error (tag, buf);
+         /*NOTREACHED*/
+       default:
+         break;
+       }
+  }
+
+  lisp_pgresult = allocate_pgresult ();
+  lisp_pgresult->pgresult = R;
+
+  return make_pgresult (lisp_pgresult);
+}
+
+DEFUN ("pq-send-query", Fpq_send_query, 2, 2, 0, /*
+Submit a query to Postgres and don't wait for the result.
+Returns: t if successfully submitted
+         nil if error (conn->errorMessage is set)
+*/
+       (conn, query))
+{
+  PGconn *P;
+  char *c_query;
+
+  CHECK_PGCONN (conn);
+  CHECK_STRING (query);
+
+  P = (XPGCONN (conn))->pgconn;
+  CHECK_LIVE_CONNECTION (P);
+
+  TO_EXTERNAL_FORMAT (LISP_STRING, query,
+                     C_STRING_ALLOCA, c_query, Qnative);
+
+  if (PQsendQuery (P, c_query)) return Qt;
+  else error ("async query: %s", PQerrorMessage (P));
+}
+
+DEFUN ("pq-get-result", Fpq_get_result, 1, 1, 0, /*
+Retrieve an asynchronous result from a query.
+NIL is returned when no more query work remains.
+*/
+       (conn))
+{
+  PGconn *P;
+  Lisp_PGresult *lisp_pgresult;
+  PGresult *R;
+
+  CHECK_PGCONN (conn);
+
+  P = (XPGCONN (conn))->pgconn;
+  CHECK_LIVE_CONNECTION (P);
+
+  R = PQgetResult (P);
+  if (!R) return Qnil; /* not an error, there's no more data to get */
+
+  {
+    char *tag, buf[BLCKSZ];
+
+    switch (PQresultStatus (R))
+      {
+      case PGRES_BAD_RESPONSE:
+       tag = "bad response [%s]";
+       goto err;
+      case PGRES_NONFATAL_ERROR:
+       tag = "non-fatal error [%s]";
+       goto err;
+      case PGRES_FATAL_ERROR:
+       tag = "fatal error [%s]";
+err:
+       strncpy (buf, PQresultErrorMessage (R), sizeof (buf));
+       buf[sizeof (buf) - 1] = '\0';
+       PQclear (R);
+       error (tag, buf);
+       /*NOTREACHED*/
+      default:
+       break;
+      }
+  }
+
+  lisp_pgresult = allocate_pgresult();
+  lisp_pgresult->pgresult = R;
+
+  return make_pgresult (lisp_pgresult);
+}
+
+DEFUN ("pq-result-status", Fpq_result_status, 1, 1, 0, /*
+Return result status of the query.
+*/
+       (result))
+{
+  PGresult *R;
+  ExecStatusType est;
+
+  CHECK_PGRESULT (result);
+  R = (XPGRESULT (result))->pgresult;
+  PUKE_IF_NULL (R);
+
+  switch ((est = PQresultStatus (R))) {
+  case PGRES_EMPTY_QUERY: return Qpgres_empty_query;
+  case PGRES_COMMAND_OK: return Qpgres_command_ok;
+  case PGRES_TUPLES_OK: return Qpgres_tuples_ok;
+  case PGRES_COPY_OUT: return Qpgres_copy_out;
+  case PGRES_COPY_IN: return Qpgres_copy_in;
+  case PGRES_BAD_RESPONSE: return Qpgres_bad_response;
+  case PGRES_NONFATAL_ERROR: return Qpgres_nonfatal_error;
+  case PGRES_FATAL_ERROR: return Qpgres_fatal_error;
+  default:
+    /* they've added a new field we don't know about */
+    error ("Help!  Unknown exec status code %08x from backend!", est);
+  }
+}
+
+DEFUN ("pq-res-status", Fpq_res_status, 1, 1, 0, /*
+Return stringified result status of the query.
+*/
+       (result))
+{
+  PGresult *R;
+
+  CHECK_PGRESULT (result);
+  R = (XPGRESULT (result))->pgresult;
+  PUKE_IF_NULL (R);
+
+  return build_ext_string (PQresStatus (PQresultStatus (R)), PG_OS_CODING);
+}
+
+/* Sundry PGresult accessor functions */
+DEFUN ("pq-result-error-message", Fpq_result_error_message, 1, 1, 0, /*
+Return last message associated with the query.
+*/
+       (result))
+{
+  PGresult *R;
+
+  CHECK_PGRESULT (result);
+  R = (XPGRESULT (result))->pgresult;
+  PUKE_IF_NULL (R);
+
+  return build_ext_string (PQresultErrorMessage (R), PG_OS_CODING);
+}
+
+DEFUN ("pq-ntuples", Fpq_ntuples, 1, 1, 0, /*
+Return the number of tuples (instances) in the query result.
+*/
+       (result))
+{
+  PGresult *R;
+
+  CHECK_PGRESULT (result);
+  R = (XPGRESULT (result))->pgresult;
+  PUKE_IF_NULL (R);
+
+  return make_int (PQntuples (R));
+}
+
+DEFUN ("pq-nfields", Fpq_nfields, 1, 1, 0, /*
+Return the number of fields (attributes) in each tuple of the query result.
+*/
+       (result))
+{
+  PGresult *R;
+
+  CHECK_PGRESULT (result);
+  R = (XPGRESULT (result))->pgresult;
+  PUKE_IF_NULL (R);
+
+  return make_int (PQnfields (R));
+}
+
+DEFUN ("pq-binary-tuples", Fpq_binary_tuples, 1, 1, 0, /*
+Return t if the query result contains binary data, nil otherwise.
+*/
+       (result))
+{
+  PGresult *R;
+
+  CHECK_PGRESULT (result);
+  R = (XPGRESULT (result))->pgresult;
+  PUKE_IF_NULL (R);
+
+  return (PQbinaryTuples (R)) ? Qt : Qnil;
+}
+
+DEFUN ("pq-fname", Fpq_fname, 2, 2, 0, /*
+Return the field (attribute) name associated with the given field index.
+Field indices start at 0.
+*/
+       (result, field_index))
+{
+  PGresult *R;
+
+  CHECK_PGRESULT (result);
+  CHECK_INT (field_index);
+  R = (XPGRESULT (result))->pgresult;
+  PUKE_IF_NULL (R);
+
+  return build_ext_string (PQfname (R, XINT (field_index)), PG_OS_CODING);
+}
+
+DEFUN ("pq-fnumber", Fpq_fnumber, 2, 2, 0, /*
+Return the number of fields (attributes) in each tuple of the query result.
+*/
+       (result, field_name))
+{
+  PGresult *R;
+  char *c_field_name;
+
+  CHECK_PGRESULT (result);
+  CHECK_STRING (field_name);
+  R = (XPGRESULT (result))->pgresult;
+  PUKE_IF_NULL (R);
+
+  TO_EXTERNAL_FORMAT (LISP_STRING, field_name,
+                     C_STRING_ALLOCA, c_field_name, Qnative);
+
+  return make_int (PQfnumber (R, c_field_name));
+}
+
+DEFUN ("pq-ftype", Fpq_ftype, 2, 2, 0, /*
+Return the field type associated with the given field index.
+The integer returned is the internal coding of the type.  Field indices
+start at 0.
+*/
+       (result, field_num))
+{
+  PGresult *R;
+
+  CHECK_PGRESULT (result);
+  CHECK_INT (field_num);
+  R = (XPGRESULT (result))->pgresult;
+  PUKE_IF_NULL (R);
+
+  return make_int (PQftype (R, XINT (field_num)));
+}
+
+DEFUN ("pq-fsize", Fpq_fsize, 2, 2, 0, /*
+Return the field size in bytes associated with the given field index.
+Field indices start at 0.
+*/
+       (result, field_index))
+{
+  PGresult *R;
+
+  CHECK_PGRESULT (result);
+  CHECK_INT (field_index);
+  R = (XPGRESULT (result))->pgresult;
+  PUKE_IF_NULL (R);
+
+  return make_int (PQftype (R, XINT (field_index)));
+}
+
+DEFUN ("pq-fmod", Fpq_fmod, 2, 2, 0, /*
+Return the type modifier associated with a field.
+Field indices start at 0.
+*/
+       (result, field_index))
+{
+  PGresult *R;
+
+  CHECK_PGRESULT (result);
+  CHECK_INT (field_index);
+  R = (XPGRESULT (result))->pgresult;
+  PUKE_IF_NULL (R);
+
+  return make_int (PQfmod (R, XINT (field_index)));
+}
+
+DEFUN ("pq-get-value", Fpq_get_value, 3, 3, 0, /*
+Return a single field (attribute) value of one tuple of a PGresult.
+Tuple and field indices start at 0.
+*/
+       (result, tup_num, field_num))
+{
+  PGresult *R;
+
+  CHECK_PGRESULT (result);
+  CHECK_INT (tup_num);
+  CHECK_INT (field_num);
+  R = (XPGRESULT (result))->pgresult;
+  PUKE_IF_NULL (R);
+
+  return build_ext_string (PQgetvalue (R, XINT (tup_num), XINT (field_num)),
+                          PG_OS_CODING);
+}
+
+DEFUN ("pq-get-length", Fpq_get_length, 3, 3, 0, /*
+Returns the length of a field value in bytes.
+If result is binary, i.e. a result of a binary portal, then the
+length returned does NOT include the size field of the varlena.  (The
+data returned by PQgetvalue doesn't either.)
+*/
+       (result, tup_num, field_num))
+{
+  PGresult *R;
+
+  CHECK_PGRESULT (result);
+  CHECK_INT (tup_num);
+  CHECK_INT (field_num);
+  R = (XPGRESULT (result))->pgresult;
+  PUKE_IF_NULL (R);
+
+  return make_int (PQgetlength (R, XINT (tup_num), XINT (field_num)));
+}
+
+DEFUN ("pq-get-is-null", Fpq_get_is_null, 3, 3, 0, /*
+Returns the null status of a field value.
+*/
+       (result, tup_num, field_num))
+{
+  PGresult *R;
+
+  CHECK_PGRESULT (result);
+  CHECK_INT (tup_num);
+  CHECK_INT (field_num);
+  R = (XPGRESULT (result))->pgresult;
+  PUKE_IF_NULL (R);
+
+  return PQgetisnull (R, XINT (tup_num), XINT (field_num)) ? Qt : Qnil;
+}
+
+DEFUN ("pq-cmd-status", Fpq_cmd_status, 1, 1, 0, /*
+Returns the command status string from the SQL command that generated the result.
+*/
+       (result))
+{
+  PGresult *R;
+
+  CHECK_PGRESULT (result);
+  R = (XPGRESULT (result))->pgresult;
+  PUKE_IF_NULL (R);
+
+  return build_ext_string (PQcmdStatus (R), PG_OS_CODING);
+}
+
+DEFUN ("pq-cmd-tuples", Fpq_cmd_tuples, 1, 1, 0, /*
+Returns the number of rows affected by the SQL command
+*/
+       (result))
+{
+  PGresult *R;
+
+  CHECK_PGRESULT (result);
+  R = (XPGRESULT (result))->pgresult;
+  PUKE_IF_NULL (R);
+
+  return build_ext_string (PQcmdTuples (R), PG_OS_CODING);
+}
+
+DEFUN ("pq-oid-value", Fpq_oid_value, 1, 1, 0, /*
+Returns the object id of the tuple inserted.
+*/
+       (result))
+{
+  PGresult *R;
+
+  CHECK_PGRESULT (result);
+  R = (XPGRESULT (result))->pgresult;
+  PUKE_IF_NULL (R);
+
+#ifdef HAVE_POSTGRESQLV7
+  return make_int (PQoidValue (R));
+#else
+  /* Use the old interface */
+  return make_int (atoi (PQoidStatus (R)));
+#endif
+}
+
+#ifdef HAVE_POSTGRESQLV7
+DEFUN ("pq-set-nonblocking", Fpq_set_nonblocking, 2, 2, 0, /*
+Sets the PGconn's database connection non-blocking if the arg is TRUE
+or makes it non-blocking if the arg is FALSE, this will not protect
+you from PQexec(), you'll only be safe when using the non-blocking API.
+
+Needs to be called only on a connected database connection.
+*/
+       (conn, arg))
+{
+  PGconn *P;
+
+  CHECK_PGCONN (conn);
+  P = (XPGCONN (conn))->pgconn;
+  CHECK_LIVE_CONNECTION (P);
+
+  return make_int (PQsetnonblocking (P, !NILP (arg)));
+}
+
+DEFUN ("pq-is-nonblocking", Fpq_is_nonblocking, 1, 1, 0, /*
+Return the blocking status of the database connection
+*/
+       (conn))
+{
+  PGconn *P;
+
+  CHECK_PGCONN (conn);
+  P = (XPGCONN (conn))->pgconn;
+  CHECK_LIVE_CONNECTION (P);
+
+  return PQisnonblocking (P) ? Qt : Qnil;
+}
+
+DEFUN ("pq-flush", Fpq_flush, 1, 1, 0, /*
+Force the write buffer to be written (or at least try)
+*/
+       (conn))
+{
+  PGconn *P;
+
+  CHECK_PGCONN (conn);
+  P = (XPGCONN (conn))->pgconn;
+  CHECK_LIVE_CONNECTION (P);
+
+  return make_int (PQflush (P));
+}
+#endif
+
+DEFUN ("pq-notifies", Fpq_notifies, 1, 1, 0, /*
+Return the latest async notification that has not yet been handled.
+If there has been a notification, then a list of two elements will be returned.
+The first element contains the relation name being notified, the second
+element contains the backend process ID number.  nil is returned if there
+aren't any notifications to process.
+*/
+       (conn))
+{
+  /* This function cannot GC */
+  PGconn *P;
+  PGnotify *PGN;
+
+  CHECK_PGCONN (conn);
+  P = (XPGCONN (conn))->pgconn;
+  CHECK_LIVE_CONNECTION (P);
+
+  PGN = PQnotifies (P);
+  if (!PGN)
+    return Qnil;
+  else
+  {
+    Lisp_Object temp;
+
+    temp = list2 (build_ext_string (PGN->relname, PG_OS_CODING), make_int (PGN->be_pid));
+    free ((void *)PGN);
+    return temp;
+  }
+}
+
+#if defined (HAVE_POSTGRESQLV7) && defined(MULE)
+DEFUN ("pq-env-2-encoding", Fpq_env_2_encoding, 0, 0, 0, /*
+Get encoding id from environment variable PGCLIENTENCODING.
+*/
+       ())
+{
+  return make_int (PQenv2encoding ());
+}
+#endif /* MULE */
+
+DEFUN ("pq-lo-import", Fpq_lo_import, 2, 2, 0, /*
+*/
+       (conn, filename))
+{
+  PGconn *P;
+  char *c_filename;
+
+  CHECK_PGCONN (conn);
+  CHECK_STRING (filename);
+
+  P = (XPGCONN (conn))->pgconn;
+  CHECK_LIVE_CONNECTION (P);
+
+  TO_EXTERNAL_FORMAT (LISP_STRING, filename,
+                     C_STRING_ALLOCA, c_filename,
+                     Qfile_name);
+
+  return make_int ((int)lo_import (P, c_filename));
+}
+
+DEFUN ("pq-lo-export", Fpq_lo_export, 3, 3, 0, /*
+*/
+       (conn, oid, filename))
+{
+  PGconn *P;
+  char *c_filename;
+
+  CHECK_PGCONN (conn);
+  CHECK_INT (oid);
+  CHECK_STRING (filename);
+
+  P = (XPGCONN (conn))->pgconn;
+  CHECK_LIVE_CONNECTION (P);
+
+  TO_EXTERNAL_FORMAT (LISP_STRING, filename,
+                     C_STRING_ALLOCA, c_filename, Qfile_name);
+
+  return make_int ((int)lo_export (P, XINT (oid), c_filename));
+}
+
+DEFUN ("pq-make-empty-pgresult", Fpq_make_empty_pgresult, 2, 2, 0, /*
+Make an empty PGresult object with the given status.
+*/
+       (conn, status))
+{
+  PGconn *P;
+  Lisp_PGresult *lpgr;
+  PGresult *R;
+  ExecStatusType est;
+
+  CHECK_PGCONN (conn);
+  P = (XPGCONN (conn))->pgconn;
+  CHECK_LIVE_CONNECTION (P); /* needed here? */
+
+  if (EQ (status, Qpgres_empty_query)) est = PGRES_EMPTY_QUERY;
+  else if (EQ (status, Qpgres_command_ok)) est = PGRES_COMMAND_OK;
+  else if (EQ (status, Qpgres_tuples_ok)) est = PGRES_TUPLES_OK;
+  else if (EQ (status, Qpgres_copy_out)) est = PGRES_COPY_OUT;
+  else if (EQ (status, Qpgres_copy_in)) est = PGRES_COPY_IN;
+  else if (EQ (status, Qpgres_bad_response)) est = PGRES_BAD_RESPONSE;
+  else if (EQ (status, Qpgres_nonfatal_error)) est = PGRES_NONFATAL_ERROR;
+  else if (EQ (status, Qpgres_fatal_error)) est = PGRES_FATAL_ERROR;
+  else signal_simple_error ("bad status symbol", status);
+
+  R = PQmakeEmptyPGresult (P, est);
+  if (!R) error ("out of memory?");
+
+  lpgr = allocate_pgresult ();
+  lpgr->pgresult = R;
+
+  return make_pgresult (lpgr);
+}
+
+DEFUN ("pq-get-line", Fpq_get_line, 1, 1, 0, /*
+Retrieve a line from server in copy in operation.
+The return value is a dotted pair where the cons cell is an integer code:
+   -1: Copying is complete
+    0: A record is complete
+    1: A record is incomplete, it will be continued in the next `pq-get-line'
+       operation.
+and the cdr cell is returned string data.
+
+The copy operation is complete when the value `\.' (backslash dot) is
+returned.
+*/
+       (conn))
+{
+  char buffer[BLCKSZ]; /* size of a Postgres disk block */
+  PGconn *P;
+  int ret;
+
+  CHECK_PGCONN (conn);
+  P = (XPGCONN (conn))->pgconn;
+  CHECK_LIVE_CONNECTION (P);
+
+  ret = PQgetline (P, buffer, sizeof (buffer));
+
+  return Fcons (make_int (ret), build_ext_string (buffer, PG_OS_CODING));
+}
+
+DEFUN ("pq-put-line", Fpq_put_line, 2, 2, 0, /*
+Send a line to the server in copy out operation.
+
+Returns t if the operation succeeded, nil otherwise.
+*/
+       (conn, string))
+{
+  PGconn *P;
+  char *c_string;
+
+  CHECK_PGCONN (conn);
+  CHECK_STRING (string);
+
+  P = (XPGCONN (conn))->pgconn;
+  CHECK_LIVE_CONNECTION (P);
+  TO_EXTERNAL_FORMAT (LISP_STRING, string,
+                     C_STRING_ALLOCA, c_string, Qnative);
+
+  return !PQputline (P, c_string) ? Qt : Qnil;
+}
+
+DEFUN ("pq-get-line-async", Fpq_get_line_async, 1, 1, 0, /*
+Get a line from the server in copy in operation asynchronously.
+
+This routine is for applications that want to do "COPY <rel> to stdout"
+asynchronously, that is without blocking.  Having issued the COPY command
+and gotten a PGRES_COPY_OUT response, the app should call PQconsumeInput
+and this routine until the end-of-data signal is detected.  Unlike
+PQgetline, this routine takes responsibility for detecting end-of-data.
+
+On each call, PQgetlineAsync will return data if a complete newline-
+terminated data line is available in libpq's input buffer, or if the
+incoming data line is too long to fit in the buffer offered by the caller.
+Otherwise, no data is returned until the rest of the line arrives.
+
+If -1 is returned, the end-of-data signal has been recognized (and removed
+from libpq's input buffer).  The caller *must* next call PQendcopy and
+then return to normal processing.
+
+RETURNS:
+      -1    if the end-of-copy-data marker has been recognized
+      0         if no data is available
+      >0    the number of bytes returned.
+The data returned will not extend beyond a newline character.  If possible
+a whole line will be returned at one time.  But if the buffer offered by
+the caller is too small to hold a line sent by the backend, then a partial
+data line will be returned.  This can be detected by testing whether the
+last returned byte is '\n' or not.
+The returned string is *not* null-terminated.
+*/
+       (conn))
+{
+  PGconn *P;
+  char buffer[BLCKSZ];
+  int ret;
+
+  CHECK_PGCONN (conn);
+
+  P = (XPGCONN (conn))->pgconn;
+  CHECK_LIVE_CONNECTION (P);
+
+  ret = PQgetlineAsync (P, buffer, sizeof (buffer));
+
+  if (ret == -1) return Qt; /* done! */
+  else if (!ret) return Qnil; /* no data yet */
+  else return Fcons (make_int (ret),
+                    make_ext_string (buffer, ret, PG_OS_CODING));
+}
+
+DEFUN ("pq-put-nbytes", Fpq_put_nbytes, 2, 2, 0, /*
+Asynchronous copy out.
+*/
+       (conn, data))
+{
+  /* NULs are not allowed.  I don't think this matters at this time. */
+  PGconn *P;
+  char *c_data;
+
+  CHECK_PGCONN (conn);
+  CHECK_STRING (data);
+
+  P = (XPGCONN (conn))->pgconn;
+  CHECK_LIVE_CONNECTION (P);
+  TO_EXTERNAL_FORMAT (LISP_STRING, data,
+                     C_STRING_ALLOCA, c_data, Qnative);
+
+  return !PQputnbytes (P, c_data, strlen (c_data)) ? Qt : Qnil;
+}
+
+DEFUN ("pq-end-copy", Fpq_end_copy, 1, 1, 0, /*
+End a copying operation.
+*/
+       (conn))
+{
+  PGconn *P;
+
+  CHECK_PGCONN (conn);
+  P = (XPGCONN (conn))->pgconn;
+  CHECK_LIVE_CONNECTION (P);
+
+  return PQendcopy (P) ? Qt : Qnil;
+}
+
+/* The setenv suite of functions. The author of the libpq manual doesn't
+   know a whole lot about them, and neither do I.
+*/
+#if !defined (HAVE_POSTGRESQLV7) || defined (LIBPQ_7_0_IS_FIXED)
+DEFUN ("pq-setenv", Fpq_setenv, 1, 1, 0, /*
+Set environmental parameters on the backend synchronously.
+Returns t if the operation was successful, nil otherwise.
+*/
+       (conn))
+{
+  PGconn *P;
+
+  CHECK_PGCONN (conn);
+  P = (XPGCONN (conn))->pgconn;
+  CHECK_LIVE_CONNECTION (P);
+
+  return PQsetenv (P) ? Qt : Qnil;
+}
+#endif
+
+#ifdef LIBPQ_7_0_IS_FIXED
+
+DEFUN ("pq-setenv-start", Fpq_setenv_start, 1, 1, 0, /*
+Set environmental parameters on the backend asynchronously.
+A PGsetenvHandle is returned on success, nil otherwise.
+*/
+       (conn))
+{
+  PGconn *P;
+  PGsetenvHandle *handle;
+  Lisp_setenvHandle *lseh;
+
+  CHECK_PGCONN (conn);
+  P = (XPGCONN (conn))->pgconn;
+  CHECK_LIVE_CONNECTION (P);
+
+  handle = PQsetenvStart (P);
+  if (!handle) error ("out of memory?");
+
+  lseh = allocate_pgsetenv ();
+  lseh->setenv = handle;
+
+  return make_pgsetenv (lseh);
+}
+
+DEFUN ("pq-setenv-poll", Fpq_setenv_poll, 1, 1, 0, /*
+Poll an asynchronous setenv operation for completion.
+*/
+       (conn))
+{
+  PGconn *P;
+  PostgresPollingStatusType pst;
+
+  CHECK_PGCONN (conn);
+  P = (XPGCONN (conn))->pgconn;
+  CHECK_LIVE_CONNECTION (P);
+
+  pst = PQsetenvPoll (P);
+  switch (pst)
+    {
+    case PGRES_POLLING_FAILED:
+      /* Something Bad has happened */
+      {
+       char *e = PQerrorMessage (P);
+       error ("libpq: %s", e);
+      }
+    case PGRES_POLLING_OK:
+      return Qpgres_polling_ok;
+    case PGRES_POLLING_READING:
+      return Qpgres_polling_reading;
+    case PGRES_POLLING_WRITING:
+      return Qpgres_polling_writing;
+    case PGRES_POLLING_ACTIVE:
+      return Qpgres_polling_active;
+    default:
+      /* they've added a new field we don't know about */
+      error ("Help!  Unknown status code %08x from backend!", PS);
+    }
+}
+
+DEFUN ("pq-setenv-abort", Fpq_setenv_abort, 1, 1, 0, /*
+Attempt to abort an in-progress asynchronous setenv operation.
+*/
+       (handle))
+{
+  PGsetenvHandle *h;
+
+  CHECK_PGSETENV (handle);
+  h = (XPGSETENV (handle))->pgsetenv;
+  PUKE_IF_NULL (h);
+
+  PQsetenvAbort (h);
+  /* PQsetenvAbort usually free(3)'s the handle, don't take any chances. */
+  (XSETENV (handle))->pgsetenv = (PGsetenvHandle *)NULL;
+
+  return Qt;
+}
+#endif /* LIBPQ_7_0_IS_FIXED */
+
+void
+syms_of_postgresql(void)
+{
+#ifndef RUNNING_XEMACS_21_1
+  INIT_LRECORD_IMPLEMENTATION (pgconn);
+  INIT_LRECORD_IMPLEMENTATION (pgresult);
+#ifdef LIBPQ_7_0_IS_FIXED
+  INIT_LRECORD_IMPLEMENTATION (pgsetenv);
+#endif
+#endif
+  defsymbol (&Qpostgresql, "postgresql");
+
+  /* opaque exported types */
+  defsymbol (&Qpgconnp, "pgconnp");
+  defsymbol (&Qpgresultp, "pgresultp");
+
+  /* connection status types */
+  defsymbol (&Qpg_connection_ok, "pg::connection-ok");
+  defsymbol (&Qpg_connection_bad, "pg::connection-bad");
+  defsymbol (&Qpg_connection_started, "pg::connection-started");
+  defsymbol (&Qpg_connection_made, "pg::connection-made");
+  defsymbol (&Qpg_connection_awaiting_response, "pg::connection-awaiting-response");
+  defsymbol (&Qpg_connection_auth_ok, "pg::connection-auth-ok");
+  defsymbol (&Qpg_connection_setenv, "pg::connection-setenv");
+
+  /* Fields of PGconn */
+  defsymbol (&Qpqdb, "pq::db");
+  defsymbol (&Qpquser, "pq::user");
+  defsymbol (&Qpqpass, "pq::pass");
+  defsymbol (&Qpqhost, "pq::host");
+  defsymbol (&Qpqport, "pq::port");
+  defsymbol (&Qpqtty, "pq::tty");
+  defsymbol (&Qpqoptions, "pq::options");
+  defsymbol (&Qpqstatus, "pq::status");
+  defsymbol (&Qpqerrormessage, "pq::error-message");
+  defsymbol (&Qpqbackendpid, "pq::backend-pid");
+
+  /* Query status results */
+  defsymbol (&Qpgres_empty_query, "pgres::empty-query");
+  defsymbol (&Qpgres_command_ok, "pgres::command-ok");
+  defsymbol (&Qpgres_tuples_ok, "pgres::tuples-ok");
+  defsymbol (&Qpgres_copy_out, "pgres::copy-out");
+  defsymbol (&Qpgres_copy_in, "pgres::copy-in");
+  defsymbol (&Qpgres_bad_response, "pgres::bad-response");
+  defsymbol (&Qpgres_nonfatal_error, "pgres::nonfatal-error");
+  defsymbol (&Qpgres_fatal_error, "pgres::fatal-error");
+
+  /* Poll status results */
+  defsymbol (&Qpgres_polling_failed, "pgres::polling-failed");
+  defsymbol (&Qpgres_polling_reading, "pgres::polling-reading");
+  defsymbol (&Qpgres_polling_writing, "pgres::polling-writing");
+  defsymbol (&Qpgres_polling_ok, "pgres::polling-ok");
+  defsymbol (&Qpgres_polling_active, "pgres::polling-active");
+
+#ifdef HAVE_POSTGRESQLV7
+  DEFSUBR (Fpq_connect_start);
+  DEFSUBR (Fpq_connect_poll);
+#ifdef MULE
+  DEFSUBR (Fpq_client_encoding);
+  DEFSUBR (Fpq_set_client_encoding);
+#endif /* MULE */
+#endif /* HAVE_POSTGRESQLV7 */
+  DEFSUBR (Fpq_conn_defaults);
+  DEFSUBR (Fpq_connectdb);
+  DEFSUBR (Fpq_finish);
+  DEFSUBR (Fpq_clear);
+  DEFSUBR (Fpq_is_busy);
+  DEFSUBR (Fpq_consume_input);
+
+  DEFSUBR (Fpq_reset);
+#ifdef HAVE_POSTGRESQLV7
+  DEFSUBR (Fpq_reset_start);
+  DEFSUBR (Fpq_reset_poll);
+#endif
+  DEFSUBR (Fpq_request_cancel);
+  DEFSUBR (Fpq_pgconn);
+
+  DEFSUBR (Fpq_exec);
+  DEFSUBR (Fpq_send_query);
+  DEFSUBR (Fpq_get_result);
+  DEFSUBR (Fpq_result_status);
+  DEFSUBR (Fpq_res_status);
+  DEFSUBR (Fpq_result_error_message);
+  DEFSUBR (Fpq_ntuples);
+  DEFSUBR (Fpq_nfields);
+  DEFSUBR (Fpq_binary_tuples);
+  DEFSUBR (Fpq_fname);
+  DEFSUBR (Fpq_fnumber);
+  DEFSUBR (Fpq_ftype);
+  DEFSUBR (Fpq_fsize);
+  DEFSUBR (Fpq_fmod);
+  /***/
+  DEFSUBR (Fpq_get_value);
+  DEFSUBR (Fpq_get_length);
+  DEFSUBR (Fpq_get_is_null);
+  DEFSUBR (Fpq_cmd_status);
+  DEFSUBR (Fpq_cmd_tuples);
+  DEFSUBR (Fpq_oid_value);
+
+#ifdef HAVE_POSTGRESQLV7
+  DEFSUBR (Fpq_set_nonblocking);
+  DEFSUBR (Fpq_is_nonblocking);
+  DEFSUBR (Fpq_flush);
+#endif
+  DEFSUBR (Fpq_notifies);
+
+#if defined (HAVE_POSTGRESQLV7) && defined(MULE)
+  DEFSUBR (Fpq_env_2_encoding);
+#endif
+
+  DEFSUBR (Fpq_lo_import);
+  DEFSUBR (Fpq_lo_export);
+
+  DEFSUBR (Fpq_make_empty_pgresult);
+
+  /* copy in/out functions */
+  DEFSUBR (Fpq_get_line);
+  DEFSUBR (Fpq_put_line);
+  DEFSUBR (Fpq_get_line_async);
+  DEFSUBR (Fpq_put_nbytes);
+  DEFSUBR (Fpq_end_copy);
+
+  /* The value of the setenv functions is questioned in the libpq manual. */
+#if !defined (HAVE_POSTGRESQLV7) || defined (LIBPQ_7_0_IS_FIXED)
+  DEFSUBR (Fpq_setenv);
+#endif
+#ifdef LIBPQ_7_0_IS_FIXED
+  DEFSUBR (Fpq_setenv_start);
+  DEFSUBR (Fpq_setenv_poll);
+  DEFSUBR (Fpq_setenv_abort);
+#endif /* LIBPQ_7_0_IS_FIXED */
+}
+
+void
+vars_of_postgresql(void)
+{
+  char *p;
+
+  Fprovide (Qpostgresql);
+#ifdef HAVE_POSTGRESQLV7
+  Fprovide (intern ("postgresqlv7"));
+#endif
+#ifndef RUNNING_XEMACS_21_1
+  Vpg_coding_system = Qnative;
+  DEFVAR_LISP ("pg-coding-system", &Vpg_coding_system /*
+Default Postgres client coding system.
+*/ );
+#endif
+
+  if ((p = getenv ("PGHOST")))
+    {
+      VXPGHOST = build_ext_string (p, PG_OS_CODING);
+    }
+  else
+    {
+      VXPGHOST = Qnil;
+    }
+  DEFVAR_LISP ("pg:host", &VXPGHOST /*
+Default PostgreSQL server name.
+If not set, the server running on the local host is used.  The
+initial value is set from the PGHOST environment variable.
+*/ );
+
+  if ((p = getenv ("PGUSER")))
+    {
+      VXPGUSER = build_ext_string (p, PG_OS_CODING);
+    }
+  else
+    {
+      VXPGUSER = Qnil;
+    }
+  DEFVAR_LISP ("pg:user", &VXPGUSER /*
+Default PostgreSQL user name.
+This value is used when connecting to a database for authentication.
+The initial value is set from the PGUSER environment variable.
+*/ );
+
+  if ((p = getenv ("PGOPTIONS")))
+    {
+      VXPGOPTIONS = build_ext_string (p, PG_OS_CODING);
+    }
+  else
+    {
+      VXPGOPTIONS = Qnil;
+    }
+  DEFVAR_LISP ("pg:options", &VXPGOPTIONS /*
+Default PostgreSQL user name.
+This value is used when connecting to a database for authentication.
+The initial value is set from the PGUSER environment variable.
+*/ );
+
+  if ((p = getenv ("PGPORT")))
+    {
+      VXPGPORT = make_int (atoi (p));
+    }
+  else
+    {
+      VXPGPORT = Qnil;
+    }
+  DEFVAR_LISP ("pg:port", &VXPGPORT /*
+Default port to connect to PostgreSQL backend.
+This value is used when connecting to a database.
+The initial value is set from the PGPORT environment variable.
+*/ );
+
+  if ((p = getenv ("PGTTY")))
+    {
+      VXPGTTY = build_ext_string (p, PG_OS_CODING);
+    }
+  else
+    {
+      VXPGTTY = Qnil;
+    }
+  DEFVAR_LISP ("pg:tty", &VXPGTTY /*
+Default debugging TTY.
+There is no useful setting of this variable in the XEmacs Lisp API.
+The initial value is set from the PGTTY environment variable.
+*/ );
+
+  if ((p = getenv ("PGDATABASE")))
+    {
+      VXPGDATABASE = build_ext_string (p, PG_OS_CODING);
+    }
+  else
+    {
+      VXPGDATABASE = Qnil;
+    }
+  DEFVAR_LISP ("pg:database", &VXPGDATABASE /*
+Default database to connect to.
+The initial value is set from the PGDATABASE environment variable.
+*/ );
+
+  if ((p = getenv ("PGREALM")))
+    {
+      VXPGREALM = build_ext_string (p, PG_OS_CODING);
+    }
+  else
+    {
+      VXPGREALM = Qnil;
+    }
+  DEFVAR_LISP ("pg:realm", &VXPGREALM /*
+Default kerberos realm to use for authentication.
+The initial value is set from the PGREALM environment variable.
+*/ );
+
+#ifdef MULE
+  /* It's not clear whether this is any use.  My intent is to
+     autodetect the coding system from the database. */
+  if ((p = getenv ("PGCLIENTENCODING")))
+    {
+      VXPGCLIENTENCODING = build_ext_string (p, PG_OS_CODING);
+    }
+  else
+    {
+      VXPGCLIENTENCODING = Qnil;
+    }
+  DEFVAR_LISP ("pg:client-encoding", &VXPGCLIENTENCODING /*
+Default client encoding to use.
+The initial value is set from the PGCLIENTENCODING environment variable.
+*/ );
+#endif
+
+#if !defined(HAVE_POSTGRESQLV7)
+  if ((p = getenv ("PGAUTHTYPE")))
+    {
+      VXPGAUTHTYPE = build_ext_string (p, PG_OS_CODING);
+    }
+  else
+    {
+      VXPGAUTHTYPE = Qnil;
+    }
+  DEFVAR_LISP ("pg:authtype", &VXPGAUTHTYPE /*
+Default authentication to use.
+The initial value is set from the PGAUTHTYPE environment variable.
+
+WARNING:  This variable has gone away in versions of PostgreSQL newer
+than 6.5.
+*/ );
+#endif
+
+  if ((p = getenv ("PGGEQO")))
+    {
+      VXPGGEQO = build_ext_string (p, PG_OS_CODING);
+    }
+  else
+    {
+      VXPGGEQO = Qnil;
+    }
+  DEFVAR_LISP ("pg:geqo", &VXPGGEQO /*
+Genetic Query Optimizer options.
+The initial value is set from the PGGEQO environment variable.
+*/ );
+
+  if ((p = getenv ("PGCOSTINDEX")))
+    {
+      VXPGCOSTINDEX = build_ext_string (p, PG_OS_CODING);
+    }
+  else
+    {
+      VXPGCOSTINDEX = Qnil;
+    }
+  DEFVAR_LISP ("pg:cost-index", &VXPGCOSTINDEX /*
+Default cost index options.
+The initial value is set from the PGCOSTINDEX environment variable.
+*/ );
+
+  if ((p = getenv ("PGCOSTHEAP")))
+    {
+      VXPGCOSTHEAP = build_ext_string (p, PG_OS_CODING);
+    }
+  else
+    {
+      VXPGCOSTHEAP = Qnil;
+    }
+  DEFVAR_LISP ("pg:cost-heap", &VXPGCOSTHEAP /*
+Default cost heap options.
+The initial value is set from the PGCOSTHEAP environment variable.
+*/ );
+
+  if ((p = getenv ("PGTZ")))
+    {
+      VXPGTZ = build_ext_string (p, PG_OS_CODING);
+    }
+  else
+    {
+      VXPGTZ = Qnil;
+    }
+  DEFVAR_LISP ("pg:tz", &VXPGTZ /*
+Default timezone to use.
+The initial value is set from the PGTZ environment variable.
+*/ );
+
+  if ((p = getenv ("PGDATESTYLE")))
+    {
+      VXPGDATESTYLE = build_ext_string (p, PG_OS_CODING);
+    }
+  else
+    {
+      VXPGDATESTYLE = Qnil;
+    }
+  DEFVAR_LISP ("pg:date-style", &VXPGDATESTYLE /*
+Default date style to use.
+The initial value is set from the PGDATESTYLE environment variable.
+*/ );
+}
diff --git a/src/postgresql.h b/src/postgresql.h
new file mode 100644 (file)
index 0000000..e13d96a
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+  postgresql.h -- Emacs Lisp binding to libpq.so
+  Copyright (C) 2000 Electrotechnical Laboratory, JAPAN.
+  Licensed to the Free Software Foundation.
+
+  Author:  SL Baur <steve@beopen.com>
+  Maintainer:  SL Baur <steve@beopen.com>
+
+Please send patches to this file to me first before submitting them to
+xemacs-patches.
+*/
+
+#ifndef XEMACS_POSTGRESQL_H__
+#define XEMACS_POSTGRESQL_H__ 1
+
+#define BLCKSZ 8192 /* size of a default Postres disk block */
+/*
+  This file contains the GCC bug workaround code for the private
+  LRECORD types.
+*/
+
+/* PGconn is an opaque object and we need to be able to store them in
+   Lisp code because libpq supports multiple connections.
+*/
+struct Lisp_PGconn
+{
+  struct lcrecord_header header;
+  PGconn *pgconn;
+};
+typedef struct Lisp_PGconn Lisp_PGconn;
+
+DECLARE_LRECORD (pgconn, Lisp_PGconn);
+
+#define XPGCONN(x) XRECORD (x, pgconn, Lisp_PGconn)
+#define XSETPGCONN(x, p) XSETRECORD (x, p, pgconn)
+#define PGCONNP(x) RECORDP (x, pgconn)
+#define CHECK_PGCONN(x) CHECK_RECORD (x, pgconn)
+#define CONCHECK_PGCONN(x) CONCHECK_RECORD (x, pgconn)
+
+/****/
+
+/* PGresult is an opaque object and we need to be able to store them in
+   Lisp code.
+*/
+struct Lisp_PGresult
+{
+  struct lcrecord_header header;
+  PGresult *pgresult;
+};
+typedef struct Lisp_PGresult Lisp_PGresult;
+
+DECLARE_LRECORD (pgresult, Lisp_PGresult);
+
+#define XPGRESULT(x) XRECORD (x, pgresult, Lisp_PGresult)
+#define XSETPGRESULT(x, p) XSETRECORD (x, p, pgresult)
+#define PGRESULTP(x) RECORDP (x, pgresult)
+#define CHECK_PGRESULT(x) CHECK_RECORD (x, pgresult)
+#define CONCHECK_PGRESULT(x) CONCHECK_RECORD (x, pgresult)
+
+/****/
+#ifdef HAVE_POSTGRESQLV7
+
+#ifdef LIBPQ_7_0_IS_FIXED /* this is broken in released 7.0b1 */
+
+/* PGsetenvHandle is an opaque object and we need to be able to store
+   them in Lisp code in order to make asynchronous environment calls.
+*/
+struct Lisp_PGsetenvHandle
+{
+  struct lcrecord_header header;
+  PGsetenvHandle *pgsetenv;
+};
+typedef struct Lisp_PGsetenvHandle Lisp_PGsetenvHandle;
+
+DECLARE_LRECORD (pgsetenv, Lisp_PGsetenvHandle);
+
+#define XPGSETENV(x) XRECORD (x, pgsetenv, Lisp_PGsetenvHandle)
+#define XSETPGSETENV(x, p) XSETRECORD (x, p, pgsetenv)
+#define PGSETENVP(x) RECORDP (x, pgsetenv)
+#define CHECK_PGSETENV(x) CHECK_RECORD (x, pgsetenv)
+#define CONCHECK_PGSETENV(x) CONCHECK_RECORD (x, pgsetenv)
+
+#endif /* LIBPQ_7_0_IS_FIXED */
+
+#endif /* HAVE_POSTGRESQLV7 */
+
+#endif /* XEMACS_POSTGRESQL_H__ */
diff --git a/tests/automated/c-tests.el b/tests/automated/c-tests.el
new file mode 100644 (file)
index 0000000..718cdb1
--- /dev/null
@@ -0,0 +1,43 @@
+;; Copyright (C) 2000 Martin Buchholz
+
+;; Author: Martin Buchholz <martin@xemacs.org>
+;; Maintainer: Martin Buchholz <martin@xemacs.org>
+;; Created: 1998
+;; Keywords: tests
+
+;; This file is part of XEmacs.
+
+;; XEmacs 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.
+
+;; XEmacs 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 XEmacs; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+;; 02111-1307, USA.
+
+;;; Synched up with: Not in FSF.
+
+;;; Commentary:
+
+;;; Call tests in src/tests.c, which cannot be written using lisp only.
+;;; See test-harness.el for instructions on how to run these tests.
+
+(eval-when-compile
+  (condition-case nil
+      (require 'test-harness)
+    (file-error
+     (push "." load-path)
+     (when (and (boundp 'load-file-name) (stringp load-file-name))
+       (push (file-name-directory load-file-name) load-path))
+     (require 'test-harness))))
+
+(when (boundp 'test-function-list)     ; Only if configure --debug
+  (loop for fun in test-function-list do
+    (Assert (eq 'PASS (funcall fun)))))