--- /dev/null
+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'
--- /dev/null
+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.
+* ¬ (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.
+
+
--- /dev/null
+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.
+
+
--- /dev/null
+/* 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;
+}
--- /dev/null
+@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.
+
--- /dev/null
+@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
--- /dev/null
+# -*- 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
--- /dev/null
+# 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
--- /dev/null
+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>
+{{{
+}}}
+
+###############################################################################
+
--- /dev/null
+/* 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_ */
--- /dev/null
+#ifndef INCLUDED_dump_id_h_
+#define INCLUDED_dump_id_h_
+
+extern unsigned int dump_id;
+
+#endif
--- /dev/null
+/* 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;
+}
--- /dev/null
+/* 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 */
--- /dev/null
+/*
+ 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.
+*/ );
+}
--- /dev/null
+/*
+ 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__ */
--- /dev/null
+;; 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)))))