From: tomo Date: Wed, 10 May 2000 03:32:01 +0000 (+0000) Subject: Initial revision X-Git-Tag: r21-2-32~2^2 X-Git-Url: http://git.chise.org/gitweb/?a=commitdiff_plain;h=a92fd34d4e19af388237a0913a5c30ddbcfdde7a;p=chise%2Fxemacs-chise.git.1 Initial revision --- diff --git a/info/lispref.info-45 b/info/lispref.info-45 new file mode 100644 index 0000000..f6e4355 --- /dev/null +++ b/info/lispref.info-45 @@ -0,0 +1,1316 @@ +This is ../info/lispref.info, produced by makeinfo version 4.0 from +lispref/lispref.texi. + +INFO-DIR-SECTION XEmacs Editor +START-INFO-DIR-ENTRY +* Lispref: (lispref). XEmacs Lisp Reference Manual. +END-INFO-DIR-ENTRY + + Edition History: + + GNU Emacs Lisp Reference Manual Second Edition (v2.01), May 1993 GNU +Emacs Lisp Reference Manual Further Revised (v2.02), August 1993 Lucid +Emacs Lisp Reference Manual (for 19.10) First Edition, March 1994 +XEmacs Lisp Programmer's Manual (for 19.12) Second Edition, April 1995 +GNU Emacs Lisp Reference Manual v2.4, June 1995 XEmacs Lisp +Programmer's Manual (for 19.13) Third Edition, July 1995 XEmacs Lisp +Reference Manual (for 19.14 and 20.0) v3.1, March 1996 XEmacs Lisp +Reference Manual (for 19.15 and 20.1, 20.2, 20.3) v3.2, April, May, +November 1997 XEmacs Lisp Reference Manual (for 21.0) v3.3, April 1998 + + Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995 Free Software +Foundation, Inc. Copyright (C) 1994, 1995 Sun Microsystems, Inc. +Copyright (C) 1995, 1996 Ben Wing. + + Permission is granted to make and distribute verbatim copies of this +manual provided the copyright notice and this permission notice are +preserved on all copies. + + Permission is granted to copy and distribute modified versions of +this manual under the conditions for verbatim copying, provided that the +entire resulting derived work is distributed under the terms of a +permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that this permission notice may be stated in a +translation approved by the Foundation. + + Permission is granted to copy and distribute modified versions of +this manual under the conditions for verbatim copying, provided also +that the section entitled "GNU General Public License" is included +exactly as in the original, and provided that the entire resulting +derived work is distributed under the terms of a permission notice +identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the section entitled "GNU General Public License" +may be included in a translation approved by the Free Software +Foundation instead of in the original English. + + +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. + + +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'. + + +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::. + + +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:: + + +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. + + +File: lispref.info, Node: Standard Hooks, Next: Index, Prev: Standard Keymaps, Up: Top + +Standard Hooks +************** + + The following is a list of hook variables that let you provide +functions to be called from within Emacs on suitable occasions. + + Most of these variables have names ending with `-hook'. They are +"normal hooks", run by means of `run-hooks'. The value of such a hook +is a list of functions. The recommended way to put a new function on +such a hook is to call `add-hook'. *Note Hooks::, for more information +about using hooks. + + The variables whose names end in `-function' have single functions +as their values. Usually there is a specific reason why the variable is +not a normal hook, such as the need to pass arguments to the function. +(In older Emacs versions, some of these variables had names ending in +`-hook' even though they were not normal hooks.) + + The variables whose names end in `-hooks' or `-functions' have lists +of functions as their values, but these functions are called in a +special way (they are passed arguments, or else their values are used). + +`activate-menubar-hook' + +`activate-popup-menu-hook' + +`ad-definition-hooks' + +`adaptive-fill-function' + +`add-log-current-defun-function' + +`after-change-functions' + +`after-delete-annotation-hook' + +`after-init-hook' + +`after-insert-file-functions' + +`after-revert-hook' + +`after-save-hook' + +`after-set-visited-file-name-hooks' + +`after-write-file-hooks' + +`auto-fill-function' + +`auto-save-hook' + +`before-change-functions' + +`before-delete-annotation-hook' + +`before-init-hook' + +`before-revert-hook' + +`blink-paren-function' + +`buffers-menu-switch-to-buffer-function' + +`c++-mode-hook' + +`c-delete-function' + +`c-mode-common-hook' + +`c-mode-hook' + +`c-special-indent-hook' + +`calendar-load-hook' + +`change-major-mode-hook' + +`command-history-hook' + +`comment-indent-function' + +`compilation-buffer-name-function' + +`compilation-exit-message-function' + +`compilation-finish-function' + +`compilation-parse-errors-function' + +`compilation-mode-hook' + +`create-console-hook' + +`create-device-hook' + +`create-frame-hook' + +`dabbrev-friend-buffer-function' + +`dabbrev-select-buffers-function' + +`delete-console-hook' + +`delete-device-hook' + +`delete-frame-hook' + +`deselect-frame-hook' + +`diary-display-hook' + +`diary-hook' + +`dired-after-readin-hook' + +`dired-before-readin-hook' + +`dired-load-hook' + +`dired-mode-hook' + +`disabled-command-hook' + +`display-buffer-function' + +`ediff-after-setup-control-frame-hook' + +`ediff-after-setup-windows-hook' + +`ediff-before-setup-control-frame-hook' + +`ediff-before-setup-windows-hook' + +`ediff-brief-help-message-function' + +`ediff-cleanup-hook' + +`ediff-control-frame-position-function' + +`ediff-display-help-hook' + +`ediff-focus-on-regexp-matches-function' + +`ediff-forward-word-function' + +`ediff-hide-regexp-matches-function' + +`ediff-keymap-setup-hook' + +`ediff-load-hook' + +`ediff-long-help-message-function' + +`ediff-make-wide-display-function' + +`ediff-merge-split-window-function' + +`ediff-meta-action-function' + +`ediff-meta-redraw-function' + +`ediff-mode-hook' + +`ediff-prepare-buffer-hook' + +`ediff-quit-hook' + +`ediff-registry-setup-hook' + +`ediff-select-hook' + +`ediff-session-action-function' + +`ediff-session-group-setup-hook' + +`ediff-setup-diff-regions-function' + +`ediff-show-registry-hook' + +`ediff-show-session-group-hook' + +`ediff-skip-diff-region-function' + +`ediff-split-window-function' + +`ediff-startup-hook' + +`ediff-suspend-hook' + +`ediff-toggle-read-only-function' + +`ediff-unselect-hook' + +`ediff-window-setup-function' + +`edit-picture-hook' + +`electric-buffer-menu-mode-hook' + +`electric-command-history-hook' + +`electric-help-mode-hook' + +`emacs-lisp-mode-hook' + +`fill-paragraph-function' + +`find-file-hooks' + +`find-file-not-found-hooks' + +`first-change-hook' + +`font-lock-after-fontify-buffer-hook' + +`font-lock-beginning-of-syntax-function' + +`font-lock-mode-hook' + +`fume-found-function-hook' + +`fume-list-mode-hook' + +`fume-rescan-buffer-hook' + +`fume-sort-function' + +`gnus-startup-hook' + +`hack-local-variables-hook' + +`highlight-headers-follow-url-function' + +`hyper-apropos-mode-hook' + +`indent-line-function' + +`indent-mim-hook' + +`indent-region-function' + +`initial-calendar-window-hook' + +`isearch-mode-end-hook' + +`isearch-mode-hook' + +`java-mode-hook' + +`kill-buffer-hook' + +`kill-buffer-query-functions' + +`kill-emacs-hook' + +`kill-emacs-query-functions' + +`kill-hooks' + +`LaTeX-mode-hook' + +`latex-mode-hook' + +`ledit-mode-hook' + +`lisp-indent-function' + +`lisp-interaction-mode-hook' + +`lisp-mode-hook' + +`list-diary-entries-hook' + +`load-read-function' + +`log-message-filter-function' + +`m2-mode-hook' + +`mail-citation-hook' + +`mail-mode-hook' + +`mail-setup-hook' + +`make-annotation-hook' + +`makefile-mode-hook' + +`map-frame-hook' + +`mark-diary-entries-hook' + +`medit-mode-hook' + +`menu-no-selection-hook' + +`mh-compose-letter-hook' + +`mh-folder-mode-hook' + +`mh-letter-mode-hook' + +`mim-mode-hook' + +`minibuffer-exit-hook' + +`minibuffer-setup-hook' + +`mode-motion-hook' + +`mouse-enter-frame-hook' + +`mouse-leave-frame-hook' + +`mouse-track-cleanup-hook' + +`mouse-track-click-hook' + +`mouse-track-down-hook' + +`mouse-track-drag-hook' + +`mouse-track-drag-up-hook' + +`mouse-track-up-hook' + +`mouse-yank-function' + +`news-mode-hook' + +`news-reply-mode-hook' + +`news-setup-hook' + +`nongregorian-diary-listing-hook' + +`nongregorian-diary-marking-hook' + +`nroff-mode-hook' + +`objc-mode-hook' + +`outline-mode-hook' + +`perl-mode-hook' + +`plain-TeX-mode-hook' + +`post-command-hook' + +`post-gc-hook' + +`pre-abbrev-expand-hook' + +`pre-command-hook' + +`pre-display-buffer-function' + +`pre-gc-hook' + +`pre-idle-hook' + +`print-diary-entries-hook' + +`prolog-mode-hook' + +`protect-innocence-hook' + +`remove-message-hook' + +`revert-buffer-function' + +`revert-buffer-insert-contents-function' + +`rmail-edit-mode-hook' + +`rmail-mode-hook' + +`rmail-retry-setup-hook' + +`rmail-summary-mode-hook' + +`scheme-indent-hook' + +`scheme-mode-hook' + +`scribe-mode-hook' + +`select-frame-hook' + +`send-mail-function' + +`shell-mode-hook' + +`shell-set-directory-error-hook' + +`special-display-function' + +`suspend-hook' + +`suspend-resume-hook' + +`temp-buffer-show-function' + +`term-setup-hook' + +`terminal-mode-hook' + +`terminal-mode-break-hook' + +`TeX-mode-hook' + +`tex-mode-hook' + +`text-mode-hook' + +`today-visible-calendar-hook' + +`today-invisible-calendar-hook' + +`tooltalk-message-handler-hook' + +`tooltalk-pattern-handler-hook' + +`tooltalk-unprocessed-message-hook' + +`unmap-frame-hook' + +`vc-checkin-hook' + +`vc-checkout-writable-buffer-hook' + +`vc-log-after-operation-hook' + +`vc-make-buffer-writable-hook' + +`view-hook' + +`vm-arrived-message-hook' + +`vm-arrived-messages-hook' + +`vm-chop-full-name-function' + +`vm-display-buffer-hook' + +`vm-edit-message-hook' + +`vm-forward-message-hook' + +`vm-iconify-frame-hook' + +`vm-inhibit-write-file-hook' + +`vm-key-functions' + +`vm-mail-hook' + +`vm-mail-mode-hook' + +`vm-menu-setup-hook' + +`vm-mode-hook' + +`vm-quit-hook' + +`vm-rename-current-buffer-function' + +`vm-reply-hook' + +`vm-resend-bounced-message-hook' + +`vm-resend-message-hook' + +`vm-retrieved-spooled-mail-hook' + +`vm-select-message-hook' + +`vm-select-new-message-hook' + +`vm-select-unread-message-hook' + +`vm-send-digest-hook' + +`vm-summary-mode-hook' + +`vm-summary-pointer-update-hook' + +`vm-summary-redo-hook' + +`vm-summary-update-hook' + +`vm-undisplay-buffer-hook' + +`vm-visit-folder-hook' + +`window-setup-hook' + +`write-contents-hooks' + +`write-file-data-hooks' + +`write-file-hooks' + +`write-region-annotate-functions' + +`x-lost-selection-hooks' + +`x-sent-selection-hooks' + +`zmacs-activate-region-hook' + +`zmacs-deactivate-region-hook' + +`zmacs-update-region-hook' diff --git a/info/lispref.info-46 b/info/lispref.info-46 new file mode 100644 index 0000000..11acac1 --- /dev/null +++ b/info/lispref.info-46 @@ -0,0 +1,3464 @@ +This is ../info/lispref.info, produced by makeinfo version 4.0 from +lispref/lispref.texi. + +INFO-DIR-SECTION XEmacs Editor +START-INFO-DIR-ENTRY +* Lispref: (lispref). XEmacs Lisp Reference Manual. +END-INFO-DIR-ENTRY + + Edition History: + + GNU Emacs Lisp Reference Manual Second Edition (v2.01), May 1993 GNU +Emacs Lisp Reference Manual Further Revised (v2.02), August 1993 Lucid +Emacs Lisp Reference Manual (for 19.10) First Edition, March 1994 +XEmacs Lisp Programmer's Manual (for 19.12) Second Edition, April 1995 +GNU Emacs Lisp Reference Manual v2.4, June 1995 XEmacs Lisp +Programmer's Manual (for 19.13) Third Edition, July 1995 XEmacs Lisp +Reference Manual (for 19.14 and 20.0) v3.1, March 1996 XEmacs Lisp +Reference Manual (for 19.15 and 20.1, 20.2, 20.3) v3.2, April, May, +November 1997 XEmacs Lisp Reference Manual (for 21.0) v3.3, April 1998 + + Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995 Free Software +Foundation, Inc. Copyright (C) 1994, 1995 Sun Microsystems, Inc. +Copyright (C) 1995, 1996 Ben Wing. + + Permission is granted to make and distribute verbatim copies of this +manual provided the copyright notice and this permission notice are +preserved on all copies. + + Permission is granted to copy and distribute modified versions of +this manual under the conditions for verbatim copying, provided that the +entire resulting derived work is distributed under the terms of a +permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that this permission notice may be stated in a +translation approved by the Foundation. + + Permission is granted to copy and distribute modified versions of +this manual under the conditions for verbatim copying, provided also +that the section entitled "GNU General Public License" is included +exactly as in the original, and provided that the entire resulting +derived work is distributed under the terms of a permission notice +identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the section entitled "GNU General Public License" +may be included in a translation approved by the Free Software +Foundation instead of in the original English. + + +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. +* : Functions for Key Lookup. +* =: Comparison of Numbers. +* >: Comparison of Numbers. +* >=: Comparison of Numbers. +* ? in character constant: Character Type. +* ? in regexp: Syntax of Regexps. +* @ in interactive: Using Interactive. +* [ in regexp: Syntax of Regexps. +* [...] (Edebug): Specification List. +* \ in character constant: Character Type. +* \ in display: Truncation. +* \ in printing: Output Functions. +* \ in regexp: Syntax of Regexps. +* \ in replacement: Replacing Match. +* \ in strings: String Type. +* \ in symbols: Symbol Type. +* \' in regexp: Syntax of Regexps. +* \(?: in regexp: Syntax of Regexps. +* \< in regexp: Syntax of Regexps. +* \= in regexp: Syntax of Regexps. +* \> in regexp: Syntax of Regexps. +* \` in regexp: Syntax of Regexps. +* \a: Character Type. +* \b: Character Type. +* \B in regexp: Syntax of Regexps. +* \b in regexp: Syntax of Regexps. +* \e: Character Type. +* \f: Character Type. +* \n: Character Type. +* \n in print: Output Variables. +* \N in replacement: Replacing Match. +* \r: Character Type. +* \S in regexp: Syntax of Regexps. +* \s in regexp: Syntax of Regexps. +* \t: Character Type. +* \v: Character Type. +* \W in regexp: Syntax of Regexps. +* \w in regexp: Syntax of Regexps. +* \{n,m\} in regexp: Syntax of Regexps. +* ] in regexp: Syntax of Regexps. +* ^ in regexp: Syntax of Regexps. +* _ in interactive: Using Interactive. +* `: Backquote. +* ` (Edebug): Debugging Backquote. +* ` (list substitution): Backquote. +* abbrev: Abbrevs. +* abbrev table: Abbrevs. +* abbrev tables in modes: Major Mode Conventions. +* abbrev-all-caps: Abbrev Expansion. +* abbrev-expansion: Abbrev Expansion. +* abbrev-file-name: Abbrev Files. +* abbrev-mode: Abbrev Mode. +* abbrev-prefix-mark: Abbrev Expansion. +* abbrev-start-location: Abbrev Expansion. +* abbrev-start-location-buffer: Abbrev Expansion. +* abbrev-symbol: Abbrev Expansion. +* abbrev-table-name-list: Abbrev Tables. +* abbreviate-file-name: Directory Names. +* abbrevs-changed: Abbrev Files. +* abort-recursive-edit: Recursive Editing. +* aborting: Recursive Editing. +* abs: Arithmetic Operations. +* absolute file name: Relative File Names. +* accelerate-menu: Menu Accelerator Functions. +* accept-process-output: Accepting Output. +* accessibility of a file: Testing Accessibility. +* accessible portion (of a buffer): Narrowing. +* accessible-keymaps: Scanning Keymaps. +* acos: Math Functions. +* acosh: Math Functions. +* activate-menubar-hook: Menubar. +* activate-popup-menu-hook: Pop-Up Menus. +* active display table: Active Display Table. +* active keymap: Active Keymaps. +* active-minibuffer-window: Minibuffer Misc. +* add-abbrev: Defining Abbrevs. +* add-hook: Hooks. +* add-menu: Modifying Menus. +* add-menu-button: Modifying Menus. +* add-menu-item: Modifying Menus. +* add-name-to-file: Changing File Attributes. +* add-spec-list-to-specifier: Adding Specifications. +* add-spec-to-specifier: Adding Specifications. +* add-submenu: Modifying Menus. +* add-text-properties: Changing Properties. +* add-timeout: Timers. +* add-to-list: Setting Variables. +* add-tooltalk-message-arg: Elisp Interface for Sending Messages. +* add-tooltalk-pattern-arg: Elisp Interface for Receiving Messages. +* add-tooltalk-pattern-attribute: Elisp Interface for Receiving Messages. +* address field of register: Cons Cell Type. +* after-change-function: Change Hooks. +* after-change-functions: Change Hooks. +* after-find-file: Subroutines of Visiting. +* after-init-hook: Init File. +* after-insert-file-functions: Saving Properties. +* after-load-alist: Hooks for Loading. +* after-revert-hook: Reverting. +* after-save-hook: Saving Buffers. +* aliases, for variables: Variable Aliases. +* alist: Association Lists. +* alist-to-plist: Converting Plists To/From Alists. +* all-annotations: Locating Annotations. +* all-completions: Basic Completion. +* and: Combining Conditions. +* annotation: Annotations. +* annotation hooks: Annotation Hooks. +* annotation-action: Annotation Properties. +* annotation-data: Annotation Properties. +* annotation-down-glyph: Annotation Properties. +* annotation-face: Annotation Properties. +* annotation-glyph: Annotation Properties. +* annotation-layout: Annotation Properties. +* annotation-list: Locating Annotations. +* annotation-menu: Annotation Properties. +* annotation-side: Annotation Properties. +* annotation-visible: Annotation Properties. +* annotation-width: Annotation Properties. +* annotationp: Annotation Primitives. +* annotations-at: Locating Annotations. +* annotations-in-region: Locating Annotations. +* anonymous function: Anonymous Functions. +* anonymous lambda expressions (Edebug): Instrumenting. +* apostrophe for quoting: Quoting. +* append: Building Lists. +* append-to-file: Writing to Files. +* apply: Calling Functions. +* apply, and debugging: Internals of Debugger. +* apropos: Help Functions. +* aref: Array Functions. +* argument binding: Argument List. +* argument descriptors: Using Interactive. +* argument evaluation form: Using Interactive. +* argument prompt: Using Interactive. +* arguments, reading: Minibuffers. +* arith-error example: Handling Errors. +* arith-error in division: Arithmetic Operations. +* arithmetic shift: Bitwise Operations. +* array: Arrays. +* array elements: Array Functions. +* arrayp: Array Functions. +* ASCII character codes: Character Type. +* aset: Array Functions. +* ash: Bitwise Operations. +* asin: Math Functions. +* asinh: Math Functions. +* ask-user-about-lock: File Locks. +* ask-user-about-supersession-threat: Modification Time. +* asking the user questions: Yes-or-No Queries. +* assoc: Association Lists. +* association list: Association Lists. +* assq: Association Lists. +* asynchronous subprocess: Asynchronous Processes. +* atan: Math Functions. +* atanh: Math Functions. +* atom <1>: List-related Predicates. +* atom: Cons Cell Type. +* atomic extent: Atomic Extents. +* atoms: List-related Predicates. +* attributes of text: Text Properties. +* Auto Fill mode: Auto Filling. +* auto-fill-function: Auto Filling. +* auto-lower-frame: Raising and Lowering. +* auto-mode-alist: Auto Major Mode. +* auto-raise-frame: Raising and Lowering. +* auto-save-default: Auto-Saving. +* auto-save-file-format: Format Conversion. +* auto-save-file-name-p: Auto-Saving. +* auto-save-hook: Auto-Saving. +* auto-save-interval: Auto-Saving. +* auto-save-list-file-name: Auto-Saving. +* auto-save-mode: Auto-Saving. +* auto-save-timeout: Auto-Saving. +* auto-save-visited-file-name: Auto-Saving. +* auto-saving: Auto-Saving. +* autoload <1>: Domain Specification. +* autoload: Autoload. +* autoload errors: Autoload. +* automatically buffer-local: Intro to Buffer-Local. +* available fonts: Font Instance Names. +* back-to-indentation: Motion by Indent. +* background pixmap: Merging Faces. +* backquote (Edebug): Debugging Backquote. +* backquote (list substitution): Backquote. +* backslash in character constant: Character Type. +* backslash in strings: String Type. +* backslash in symbols: Symbol Type. +* backspace: Character Type. +* backtrace: Internals of Debugger. +* backtrace-debug: Internals of Debugger. +* backtrace-frame: Internals of Debugger. +* backtracking: Backtracking. +* backup file: Backup Files. +* backup files, how to make them: Rename or Copy. +* backup-buffer: Making Backups. +* backup-by-copying: Rename or Copy. +* backup-by-copying-when-linked: Rename or Copy. +* backup-by-copying-when-mismatch: Rename or Copy. +* backup-enable-predicate: Making Backups. +* backup-file-name-p: Backup Names. +* backup-inhibited: Making Backups. +* backward-char: Character Motion. +* backward-delete-char-untabify: Deletion. +* backward-list: List Motion. +* backward-prefix-chars: Motion and Syntax. +* backward-sexp: List Motion. +* backward-to-indentation: Motion by Indent. +* backward-word: Word Motion. +* balancing parentheses: Blinking. +* barf-if-buffer-read-only: Read Only Buffers. +* base buffer: Indirect Buffers. +* base64: Transformations. +* base64-decode-region: Transformations. +* base64-decode-string: Transformations. +* base64-encode-region: Transformations. +* base64-encode-string: Transformations. +* batch mode: Batch Mode. +* batch-byte-compile: Compilation Functions. +* batch-byte-recompile-directory: Compilation Functions. +* beep: Beeping. +* beeping: Beeping. +* before point, insertion: Insertion. +* before-change-function: Change Hooks. +* before-change-functions: Change Hooks. +* before-init-hook: Init File. +* before-revert-hook: Reverting. +* beginning of line: Text Lines. +* beginning of line in regexp: Syntax of Regexps. +* beginning-of-buffer: Buffer End Motion. +* beginning-of-defun: List Motion. +* beginning-of-line: Text Lines. +* bell: Beeping. +* bell character: Character Type. +* bell-volume: Beeping. +* binary files and text files: Files and MS-DOS. +* binary-process-input: MS-DOS Subprocesses. +* binary-process-output: MS-DOS Subprocesses. +* bind-text-domain: Level 3 Primitives. +* binding arguments: Argument List. +* binding local variables: Local Variables. +* binding of a key: Keymap Terminology. +* bit vector: Bit Vectors. +* bit vector length: Sequence Functions. +* bit-vector: Bit Vector Functions. +* bit-vector-p: Bit Vector Functions. +* bitp: Bit Vector Functions. +* bitwise and: Bitwise Operations. +* bitwise exclusive or: Bitwise Operations. +* bitwise not: Bitwise Operations. +* bitwise or: Bitwise Operations. +* blink-matching-open: Blinking. +* blink-matching-paren: Blinking. +* blink-matching-paren-delay: Blinking. +* blink-matching-paren-distance: Blinking. +* blink-paren-function: Blinking. +* blink-paren-hook: Blinking. +* blinking: Blinking. +* bobp: Near Point. +* body of function: Lambda Components. +* bold: Font Instance Characteristics. +* bolp: Near Point. +* bookmark-map: Standard Keymaps. +* boolean: nil and t. +* boolean-specifier-p: Specifier Types. +* bootstrapping XEmacs from temacs: Building XEmacs. +* bottom-gutter: Specifying a Gutter. +* bottom-gutter-height: Other Gutter Variables. +* bottom-gutter-visible-p: Other Gutter Variables. +* bottom-toolbar: Specifying the Toolbar. +* bottom-toolbar-height: Other Toolbar Variables. +* bottom-toolbar-visible-p: Other Toolbar Variables. +* boundp: Void Variables. +* box diagrams, for lists: Cons Cell Type. +* box representation for lists: Lists as Boxes. +* break: Debugger. +* breakpoints: Breakpoints. +* bucket (in obarray): Creating Symbols. +* buffer: Buffers. +* buffer contents: Text. +* buffer file name: Buffer File Name. +* buffer input stream: Input Streams. +* buffer list: The Buffer List. +* buffer modification: Buffer Modification. +* buffer names: Buffer Names. +* buffer output stream: Output Streams. +* buffer text notation: Buffer Text Notation. +* buffer, read-only: Read Only Buffers. +* buffer-auto-save-file-name: Auto-Saving. +* buffer-backed-up: Making Backups. +* buffer-base-buffer: Indirect Buffers. +* buffer-disable-undo: Maintaining Undo. +* buffer-enable-undo: Maintaining Undo. +* buffer-end: Point. +* buffer-file-format: Format Conversion. +* buffer-file-name: Buffer File Name. +* buffer-file-number: Buffer File Name. +* buffer-file-truename: Buffer File Name. +* buffer-file-type: Files and MS-DOS. +* buffer-flush-undo: Maintaining Undo. +* buffer-glyph-p: Glyph Types. +* buffer-indirect-children: Indirect Buffers. +* buffer-invisibility-spec: Invisible Text. +* buffer-list: The Buffer List. +* buffer-live-p: Killing Buffers. +* buffer-local variables: Buffer-Local Variables. +* buffer-local variables in modes: Major Mode Conventions. +* buffer-local-variables: Creating Buffer-Local. +* Buffer-menu-mode-map: Standard Keymaps. +* buffer-modified-p: Buffer Modification. +* buffer-modified-tick: Buffer Modification. +* buffer-name: Buffer Names. +* buffer-offer-save <1>: Killing Buffers. +* buffer-offer-save: Saving Buffers. +* buffer-read-only: Read Only Buffers. +* buffer-saved-size <1>: Point. +* buffer-saved-size: Auto-Saving. +* buffer-size: Point. +* buffer-string: Buffer Contents. +* buffer-substring: Buffer Contents. +* buffer-undo-list: Undo. +* bufferp: Buffer Basics. +* buffers menu: Buffers Menu. +* buffers, controlled in windows: Buffers and Windows. +* buffers, creating: Creating Buffers. +* buffers, killing: Killing Buffers. +* buffers-menu-filter: Menu Filters. +* buffers-menu-max-size: Buffers Menu. +* buffers-menu-switch-to-buffer-function: Buffers Menu. +* building lists: Building Lists. +* building XEmacs: Building XEmacs. +* built-in function: What Is a Function. +* bury-buffer: The Buffer List. +* busy-pointer-glyph: Mouse Pointer. +* button-event-p: Event Predicates. +* button-press-event-p: Event Predicates. +* button-release-event-p: Event Predicates. +* bvconcat: Bit Vector Functions. +* byte-code <1>: Compilation Functions. +* byte-code: Byte Compilation. +* byte-code function: Compiled-Function Objects. +* byte-code interpreter: Compilation Functions. +* byte-compile: Compilation Functions. +* byte-compile-dynamic: Dynamic Loading. +* byte-compile-dynamic-docstrings: Docs and Compilation. +* byte-compile-file: Compilation Functions. +* byte-compiling macros: Compiling Macros. +* byte-compiling require: Named Features. +* byte-recompile-directory: Compilation Functions. +* byte-recompile-directory-ignore-errors-p: Compilation Functions. +* bytes: Strings and Characters. +* c++-mode-map: Standard Keymaps. +* C-c: Prefix Keys. +* C-g: Quitting. +* C-h: Prefix Keys. +* C-M-x: Instrumenting. +* c-mode-abbrev-table: Standard Abbrev Tables. +* c-mode-map: Standard Keymaps. +* c-mode-syntax-table: Standard Syntax Tables. +* C-q: Flow Control. +* C-s: Flow Control. +* C-x: Prefix Keys. +* C-x 4: Prefix Keys. +* C-x 5: Prefix Keys. +* C-x a: Prefix Keys. +* C-x n: Prefix Keys. +* C-x r: Prefix Keys. +* caaaar: List Elements. +* caaadr: List Elements. +* caaar: List Elements. +* caadar: List Elements. +* caaddr: List Elements. +* caadr: List Elements. +* caar: List Elements. +* cadaar: List Elements. +* cadadr: List Elements. +* cadar: List Elements. +* caddar: List Elements. +* cadddr: List Elements. +* caddr: List Elements. +* cadr: List Elements. +* call stack: Internals of Debugger. +* call-interactively: Interactive Call. +* call-process: Synchronous Processes. +* call-process-region: Synchronous Processes. +* calling a function: Calling Functions. +* cancel-debug-on-entry: Function Debugging. +* canonicalize-inst-list: Adding Specifications. +* canonicalize-inst-pair: Adding Specifications. +* canonicalize-lax-plist: Working With Lax Plists. +* canonicalize-plist: Working With Normal Plists. +* canonicalize-spec: Adding Specifications. +* canonicalize-spec-list: Adding Specifications. +* canonicalize-tag-set: Specifier Tag Functions. +* capitalization: Character Case. +* capitalize: Character Case. +* capitalize-region: Case Changes. +* capitalize-word: Case Changes. +* car: List Elements. +* car-safe: List Elements. +* case changes: Case Changes. +* case in replacements: Replacing Match. +* case-fold-search: Searching and Case. +* case-replace: Searching and Case. +* case-table-p: Case Tables. +* catch: Catch and Throw. +* category-designator-p: Category Tables. +* category-table: Category Tables. +* category-table-p: Category Tables. +* category-table-value-p: Category Tables. +* CBREAK: Flow Control. +* ccl-elapsed-time: Calling CCL. +* ccl-execute: Calling CCL. +* ccl-execute-on-string: Calling CCL. +* ccl-reset-elapsed-time: Calling CCL. +* cdaaar: List Elements. +* cdaadr: List Elements. +* cdaar: List Elements. +* cdadar: List Elements. +* cdaddr: List Elements. +* cdadr: List Elements. +* cdar: List Elements. +* cddaar: List Elements. +* cddadr: List Elements. +* cddar: List Elements. +* cdddar: List Elements. +* cddddr: List Elements. +* cdddr: List Elements. +* cddr: List Elements. +* CDE dt: CDE dt. +* cdr: List Elements. +* cdr-safe: List Elements. +* ceiling: Numeric Conversions. +* centering point: Vertical Scrolling. +* cerror: Signaling Errors. +* change hooks: Change Hooks. +* change-major-mode-hook: Major Mode Conventions. +* changing key bindings: Changing Key Bindings. +* changing to another buffer: Current Buffer. +* changing window size: Resizing Windows. +* char table type: Char Table Type. +* char-after: Near Point. +* char-before: Near Point. +* char-charset: MULE Characters. +* char-equal: Text Comparison. +* char-int: Character Codes. +* char-int confoundance disease: Character Type. +* char-int-p: Character Codes. +* char-octet: MULE Characters. +* char-or-char-int-p: Character Codes. +* char-or-string-p: Predicates for Strings. +* char-syntax: Syntax Table Functions. +* char-table-p: Char Tables. +* char-table-type: Char Table Types. +* char-table-type-list: Char Table Types. +* char-to-string: String Conversion. +* char=: Text Comparison. +* character arrays: Strings and Characters. +* character case: Character Case. +* character descriptor: Character Descriptors. +* character insertion: Commands for Insertion. +* character printing: Describing Characters. +* character set (in regexp): Syntax of Regexps. +* character to string: String Conversion. +* character-to-event: Converting Events. +* characteristics of font instances: Font Instance Characteristics. +* characterp: Predicates for Characters. +* characters: Strings and Characters. +* characters for interactive codes: Interactive Codes. +* character quote: Syntax Class Table. +* charset type: Charset Type. +* charset-ccl-program: Charset Property Functions. +* charset-chars: Charset Property Functions. +* charset-columns: Charset Property Functions. +* charset-dimension: Charset Property Functions. +* charset-direction: Charset Property Functions. +* charset-doc-string: Charset Property Functions. +* charset-final: Charset Property Functions. +* charset-from-attributes: Basic Charset Functions. +* charset-graphic: Charset Property Functions. +* charset-list: Basic Charset Functions. +* charset-name: Charset Property Functions. +* charset-property: Charset Property Functions. +* charset-registry: Charset Property Functions. +* charset-reverse-direction-charset: Basic Charset Functions. +* charsetp: Charsets. +* check-argument-type: Signaling Errors. +* check-gutter-button-syntax: Gutter Descriptor Format. +* check-toolbar-button-syntax: Toolbar Descriptor Format. +* check-valid-char-table-value: Working With Char Tables. +* check-valid-inst-list: Specifier Validation Functions. +* check-valid-instantiator: Specifier Validation Functions. +* check-valid-plist: Property Lists. +* check-valid-spec-list: Specifier Validation Functions. +* child process: Processes. +* children, of extent: Extent Parents. +* CL note--allocate more storage: Garbage Collection. +* CL note--case of letters: Symbol Type. +* CL note--default optional arg: Argument List. +* CL note--integers vrs eq: Comparison of Numbers. +* CL note--lack union, set: Sets And Lists. +* CL note--only throw in Emacs: Catch and Throw. +* CL note--rplaca vrs setcar: Modifying Lists. +* CL note--set local: Setting Variables. +* CL note--special forms compared: Special Forms. +* CL note--special variables: Variable Scoping. +* CL note--symbol in obarrays: Creating Symbols. +* cl-read: Reading in Edebug. +* cl-specs.el: Instrumenting. +* cl.el (Edebug): Instrumenting. +* cleanup forms: Cleanups. +* clear-abbrev-table: Abbrev Tables. +* clear-message: The Echo Area. +* clear-range-table: Working With Range Tables. +* clear-visited-file-modtime: Modification Time. +* close parenthesis: Blinking. +* close-database: Connecting to a Database. +* close parenthesis character: Syntax Class Table. +* closures not available: Extent. +* clrhash: Working With Hash Tables. +* codes, interactive, description of: Interactive Codes. +* coding standards: Tips. +* coding system type: Coding System Type. +* coding-category-list: Detection of Textual Encoding. +* coding-category-system: Detection of Textual Encoding. +* coding-priority-list: Detection of Textual Encoding. +* coding-system-base: Basic Coding System Functions. +* coding-system-doc-string: Coding System Property Functions. +* coding-system-list: Basic Coding System Functions. +* coding-system-name: Basic Coding System Functions. +* coding-system-p: Coding Systems. +* coding-system-property: Coding System Property Functions. +* coding-system-type: Coding System Property Functions. +* color instance type: Color Instance Type. +* color instances: Color Instances. +* color-instance-name: Color Instance Properties. +* color-instance-p: Color Instances. +* color-instance-rgb-components: Color Instance Properties. +* color-name: Color Convenience Functions. +* color-pixmap-image-instance-p: Image Instance Types. +* color-rgb-components: Color Convenience Functions. +* color-specifier-p <1>: Color Specifiers. +* color-specifier-p: Specifier Types. +* colorize-image-instance: Image Instance Functions. +* colors: Colors. +* columns: Columns. +* command: What Is a Function. +* command descriptions: A Sample Function Description. +* command history: Command History. +* command in keymap: Key Lookup. +* command line arguments: Command Line Arguments. +* command line options: Command Line Arguments. +* command loop: Command Loop. +* command loop, recursive: Recursive Editing. +* command-debug-status: Internals of Debugger. +* command-execute: Interactive Call. +* command-history: Command History. +* command-history-map: Standard Keymaps. +* command-line: Command Line Arguments. +* command-line-args: Command Line Arguments. +* command-line-functions: Command Line Arguments. +* command-line-processed: Command Line Arguments. +* command-switch-alist: Command Line Arguments. +* commandp: Interactive Call. +* commandp example: High-Level Completion. +* commands, defining: Defining Commands. +* comment syntax: Syntax Class Table. +* comments: Comments. +* comment ender: Syntax Class Table. +* comment starter: Syntax Class Table. +* Common Lisp: Lisp History. +* Common Lisp (Edebug): Instrumenting. +* compare-buffer-substrings: Comparing Text. +* comparing buffer text: Comparing Text. +* comparison of modification time: Modification Time. +* compilation: Byte Compilation. +* compilation functions: Compilation Functions. +* compile-defun: Compilation Functions. +* compiled function: Compiled-Function Objects. +* compiled-function-arglist: Compiled-Function Objects. +* compiled-function-constants: Compiled-Function Objects. +* compiled-function-doc-string: Compiled-Function Objects. +* compiled-function-domain: Compiled-Function Objects. +* compiled-function-instructions: Compiled-Function Objects. +* compiled-function-interactive: Compiled-Function Objects. +* compiled-function-p: What Is a Function. +* compiled-function-stack-size: Compiled-Function Objects. +* complete key: Keymap Terminology. +* completing-read: Minibuffer Completion. +* completion: Completion. +* completion, file name: File Name Completion. +* completion, user name: User Name Completion. +* completion-auto-help: Completion Commands. +* completion-ignore-case: Basic Completion. +* completion-ignored-extensions: File Name Completion. +* complex arguments: Minibuffers. +* complex command: Command History. +* complex-buffers-menu-p: Buffers Menu. +* compose-region: Composite Characters. +* composite-char-string: Composite Characters. +* concat: Creating Strings. +* concatenating lists: Rearrangement. +* concatenating strings: Creating Strings. +* cond: Conditionals. +* condition name: Error Symbols. +* condition-case: Handling Errors. +* conditional evaluation: Conditionals. +* cons: Building Lists. +* cons cell as box: Lists as Boxes. +* cons cells: Building Lists. +* consing: Building Lists. +* console-device-list: Basic Console Functions. +* console-disable-input: Console and Device I/O. +* console-enable-input: Console and Device I/O. +* console-list: Basic Console Functions. +* console-live-p: Connecting to a Console or Device. +* console-type-image-conversion-list: Image Instantiator Conversion. +* consolep: Consoles and Devices. +* consoles: Consoles and Devices. +* consp: List-related Predicates. +* continuation lines: Truncation. +* continuation-glyph: Redisplay Glyphs. +* continue-process: Signals to Processes. +* control character printing: Describing Characters. +* control characters: Character Type. +* control characters in display: Usual Display. +* control characters, reading: Quoted Character Input. +* control structures: Control Structures. +* control-arrow-glyph: Redisplay Glyphs. +* Control-X-prefix: Prefix Keys. +* conventions for writing minor modes: Minor Mode Conventions. +* conversion of image instantiators: Image Instantiator Conversion. +* conversion of strings: String Conversion. +* copy-alist: Association Lists. +* copy-category-table: Category Tables. +* copy-coding-system: Basic Coding System Functions. +* copy-event: Working With Events. +* copy-extent: Detached Extents. +* copy-face: Basic Face Functions. +* copy-file: Changing File Attributes. +* copy-hash-table: Introduction to Hash Tables. +* copy-keymap: Creating Keymaps. +* copy-marker: Creating Markers. +* copy-range-table: Introduction to Range Tables. +* copy-region-as-kill: Kill Functions. +* copy-sequence: Sequence Functions. +* copy-specifier: Other Specification Functions. +* copy-syntax-table: Syntax Table Functions. +* copying alists: Association Lists. +* copying bit vectors: Bit Vector Functions. +* copying files: Changing File Attributes. +* copying lists: Building Lists. +* copying sequences: Sequence Functions. +* copying strings: Creating Strings. +* copying vectors: Vector Functions. +* cos: Math Functions. +* cosh: Math Functions. +* count-lines: Text Lines. +* count-loop: A Sample Function Description. +* counting columns: Columns. +* coverage testing: Coverage Testing. +* create-device-hook: Connecting to a Console or Device. +* create-file-buffer: Subroutines of Visiting. +* create-frame-hook: Frame Hooks. +* create-tooltalk-message: Elisp Interface for Sending Messages. +* create-tooltalk-pattern: Elisp Interface for Receiving Messages. +* creating buffers: Creating Buffers. +* creating keymaps: Creating Keymaps. +* ctl-arrow: Usual Display. +* ctl-x-4-map <1>: Standard Keymaps. +* ctl-x-4-map: Prefix Keys. +* ctl-x-5-map <1>: Standard Keymaps. +* ctl-x-5-map: Prefix Keys. +* ctl-x-map <1>: Standard Keymaps. +* ctl-x-map: Prefix Keys. +* cube-root: Math Functions. +* current binding: Local Variables. +* current buffer: Current Buffer. +* current buffer excursion: Excursions. +* current buffer mark: The Mark. +* current buffer point and mark (Edebug): Edebug Display Update. +* current buffer position: Point. +* current command: Command Loop Info. +* current stack frame: Using Debugger. +* current-buffer: Current Buffer. +* current-case-table: Case Tables. +* current-column: Columns. +* current-fill-column: Margins. +* current-frame-configuration: Frame Configurations. +* current-global-map: Active Keymaps. +* current-indentation: Primitive Indent. +* current-input-mode: Input Modes. +* current-justification: Filling. +* current-keymaps: Active Keymaps. +* current-kill: Low-Level Kill Ring. +* current-left-margin: Margins. +* current-local-map: Active Keymaps. +* current-menubar: Menubar. +* current-message: The Echo Area. +* current-minor-mode-maps: Active Keymaps. +* current-mouse-event: Command Loop Info. +* current-prefix-arg: Prefix Command Arguments. +* current-time: Time of Day. +* current-time-string: Time of Day. +* current-time-zone: Time of Day. +* current-window-configuration: Window Configurations. +* cursor (mouse): Mouse Pointer. +* cursor-in-echo-area: The Echo Area. +* cust-print: Printing in Edebug. +* cut buffer: X Selections. +* cyclic ordering of windows: Cyclic Window Ordering. +* data type: Lisp Data Types. +* data-directory: Accessing Documentation. +* database: Databases. +* database type: Database Type. +* database-file-name: Other Database Functions. +* database-last-error: Other Database Functions. +* database-live-p: Connecting to a Database. +* database-subtype: Other Database Functions. +* database-type: Other Database Functions. +* databasep: Databases. +* deallocate-event: Working With Events. +* debug: Invoking the Debugger. +* debug-allocation: Garbage Collection. +* debug-allocation-backtrace: Garbage Collection. +* debug-ignored-errors: Error Debugging. +* debug-on-entry: Function Debugging. +* debug-on-error: Error Debugging. +* debug-on-error use: Processing of Errors. +* debug-on-next-call: Internals of Debugger. +* debug-on-quit: Infinite Loops. +* debug-on-signal: Error Debugging. +* debug-on-signal use: Handling Errors. +* debugger <1>: Internals of Debugger. +* debugger: Debugger. +* debugger command list: Debugger Commands. +* debugger-mode-map: Standard Keymaps. +* debugging errors: Error Debugging. +* debugging specific functions: Function Debugging. +* decode-big5-char: Big5 and Shift-JIS Functions. +* decode-coding-region: Encoding and Decoding Text. +* decode-shift-jis-char: Big5 and Shift-JIS Functions. +* decode-time: Time Conversion. +* decoding file formats: Format Conversion. +* decompose-region: Composite Characters. +* decrement field of register: Cons Cell Type. +* dedicated window: Choosing Window. +* deep binding: Impl of Scope. +* def-edebug-spec: Instrumenting Macro Calls. +* defalias: Defining Functions. +* default argument string: Interactive Codes. +* default init file: Init File. +* default value: Default Value. +* default-abbrev-mode: Abbrev Mode. +* default-boundp: Default Value. +* default-buffer-file-type: Files and MS-DOS. +* default-case-fold-search: Searching and Case. +* default-ctl-arrow: Usual Display. +* default-deselect-frame-hook: Raising and Lowering. +* default-directory: File Name Expansion. +* default-file-modes: Changing File Attributes. +* default-fill-column: Margins. +* default-frame-name: Frame Name. +* default-frame-plist: Initial Properties. +* default-gutter: Specifying a Gutter. +* default-gutter-height: Other Gutter Variables. +* default-gutter-position: Specifying a Gutter. +* default-gutter-visible-p: Other Gutter Variables. +* default-gutter-width: Other Gutter Variables. +* default-justification: Filling. +* default-major-mode: Auto Major Mode. +* default-menubar: Menubar. +* default-minibuffer-frame: Minibuffers and Frames. +* default-modeline-format: Modeline Variables. +* default-popup-menu: Pop-Up Menus. +* default-select-frame-hook: Raising and Lowering. +* default-text-properties: Examining Properties. +* default-toolbar: Specifying the Toolbar. +* default-toolbar-height: Other Toolbar Variables. +* default-toolbar-position: Specifying the Toolbar. +* default-toolbar-visible-p: Other Toolbar Variables. +* default-toolbar-width: Other Toolbar Variables. +* default-truncate-lines: Truncation. +* default-value: Default Value. +* default-x-device: Resources. +* default.el: Start-up Summary. +* defconst <1>: Domain Specification. +* defconst: Defining Variables. +* defcustom: Variable Definitions. +* defgroup: Group Definitions. +* define-abbrev: Defining Abbrevs. +* define-abbrev-table: Abbrev Tables. +* define-derived-mode: Derived Modes. +* define-error: Error Symbols. +* define-function: Defining Functions. +* define-key: Changing Key Bindings. +* define-logical-name: Changing File Attributes. +* define-obsolete-function-alias: Obsoleteness. +* define-obsolete-variable-alias: Obsoleteness. +* define-prefix-command: Prefix Keys. +* define-specifier-tag: Specifier Tag Functions. +* defining a function: Defining Functions. +* defining commands: Defining Commands. +* defining-kbd-macro: Keyboard Macros. +* definition of a symbol: Definitions. +* defmacro: Defining Macros. +* defsubst: Inline Functions. +* defun: Defining Functions. +* defun-prompt-regexp: List Motion. +* defvar <1>: Domain Specification. +* defvar: Defining Variables. +* defvaralias: Variable Aliases. +* deiconify-frame: Visibility of Frames. +* delete: Sets And Lists. +* delete previous char: Deletion. +* delete-annotation: Annotation Primitives. +* delete-auto-save-file-if-necessary: Auto-Saving. +* delete-auto-save-files: Auto-Saving. +* delete-backward-char: Deletion. +* delete-blank-lines: User-Level Deletion. +* delete-char: Deletion. +* delete-device: Connecting to a Console or Device. +* delete-device-hook: Connecting to a Console or Device. +* delete-directory: Create/Delete Dirs. +* delete-exited-processes: Deleting Processes. +* delete-extent: Creating and Modifying Extents. +* delete-file: Changing File Attributes. +* delete-frame: Deleting Frames. +* delete-frame-hook: Frame Hooks. +* delete-horizontal-space: User-Level Deletion. +* delete-indentation: User-Level Deletion. +* delete-menu-item: Modifying Menus. +* delete-old-versions: Numbered Backups. +* delete-other-windows: Deleting Windows. +* delete-process: Deleting Processes. +* delete-region: Deletion. +* delete-to-left-margin: Margins. +* delete-window: Deleting Windows. +* delete-windows-on: Deleting Windows. +* deleting files: Changing File Attributes. +* deleting processes: Deleting Processes. +* deleting whitespace: User-Level Deletion. +* deleting windows: Deleting Windows. +* deletion of elements: Sets And Lists. +* deletion of frames: Deleting Frames. +* deletion vs killing: Deletion. +* delq: Sets And Lists. +* demibold: Font Instance Characteristics. +* describe-bindings: Scanning Keymaps. +* describe-bindings-internal: Scanning Keymaps. +* describe-buffer-case-table: Case Tables. +* describe-mode: Mode Help. +* describe-prefix-bindings: Help Functions. +* describe-tooltalk-message: Elisp Interface for Receiving Messages. +* description for interactive codes: Interactive Codes. +* description format: Format of Descriptions. +* deselect-frame-hook: Frame Hooks. +* destroy-tooltalk-message: Elisp Interface for Sending Messages. +* destroy-tooltalk-pattern: Elisp Interface for Receiving Messages. +* destructive-alist-to-plist: Converting Plists To/From Alists. +* destructive-plist-to-alist: Converting Plists To/From Alists. +* detach-extent: Detached Extents. +* detached extent: Detached Extents. +* detect-coding-region: Detection of Textual Encoding. +* device-baud-rate <1>: Terminal Output. +* device-baud-rate: Console and Device I/O. +* device-class: Console Types and Device Classes. +* device-frame-list <1>: Basic Device Functions. +* device-frame-list: Finding All Frames. +* device-list: Basic Device Functions. +* device-live-p: Connecting to a Console or Device. +* device-matches-specifier-tag-set-p: Specifier Tag Functions. +* device-matching-specifier-tag-list: Specifier Tag Functions. +* device-or-frame-p: Basic Device Functions. +* device-or-frame-type: Console Types and Device Classes. +* device-type: Console Types and Device Classes. +* device-x-display: Connecting to a Console or Device. +* devicep: Consoles and Devices. +* devices: Consoles and Devices. +* dgettext: Level 3 Primitives. +* diagrams, boxed, for lists: Cons Cell Type. +* dialog box: Dialog Boxes. +* digit-argument: Prefix Command Arguments. +* ding: Beeping. +* directory name: Directory Names. +* directory name abbreviation: Directory Names. +* directory part (of file name): File Name Components. +* directory-abbrev-alist: Directory Names. +* directory-file-name: Directory Names. +* directory-files: Contents of Directories. +* directory-oriented functions: Contents of Directories. +* dired-kept-versions: Numbered Backups. +* dired-mode-map: Standard Keymaps. +* disable undo: Maintaining Undo. +* disable-command: Disabling Commands. +* disable-menu-item: Modifying Menus. +* disable-timeout: Timers. +* disabled: Disabling Commands. +* disabled command: Disabling Commands. +* disabled-command-hook: Disabling Commands. +* disassemble: Disassembly. +* disassembled byte-code: Disassembly. +* discard input: Peeking and Discarding. +* discard-input: Peeking and Discarding. +* dispatch-event: Dispatching an Event. +* dispatching an event: Dispatching an Event. +* display columns: Size and Position. +* display lines: Size and Position. +* display order: Extent Endpoints. +* display table: Display Tables. +* display update: Refresh Screen. +* display-buffer: Choosing Window. +* display-buffer-function: Choosing Window. +* display-completion-list: Completion Commands. +* display-error: Processing of Errors. +* display-message: The Echo Area. +* display-warning: Warnings. +* display-warning-minimum-level: Warnings. +* display-warning-suppressed-classes: Warnings. +* displaying a buffer: Displaying Buffers. +* do-auto-save: Auto-Saving. +* DOC (documentation) file: Documentation Basics. +* doc-directory: Accessing Documentation. +* documentation: Accessing Documentation. +* documentation conventions: Documentation Basics. +* documentation for major mode: Mode Help. +* documentation notation: Evaluation Notation. +* documentation of function: Function Documentation. +* documentation strings: Documentation. +* documentation, keys in: Keys in Documentation. +* documentation-property: Accessing Documentation. +* domain: Level 3 Primitives. +* domain (in a specifier): Specifiers In-Depth. +* domain-of: Level 3 Primitives. +* dotted lists (Edebug): Specification List. +* dotted pair notation: Dotted Pair Notation. +* double-quote in strings: String Type. +* down-list: List Motion. +* downcase: Character Case. +* downcase-region: Case Changes. +* downcase-word: Case Changes. +* downcasing in lookup-key: Key Sequence Input. +* drag: Drag Interface. +* drag and drop: Drag and Drop. +* Drag API: Drag Interface. +* dribble file: Recording Input. +* drop: Drop Interface. +* Drop API: Drop Interface. +* dump-emacs: Building XEmacs. +* duplicable extent: Duplicable Extents. +* dynamic loading of documentation: Docs and Compilation. +* dynamic loading of functions: Dynamic Loading. +* dynamic scoping: Variable Scoping. +* echo area: The Echo Area. +* echo-keystrokes <1>: The Echo Area. +* echo-keystrokes: Command Loop Info. +* edebug: Embedded Breakpoints. +* Edebug: Edebug. +* Edebug execution modes: Edebug Execution Modes. +* Edebug mode: Edebug. +* Edebug specification list: Specification List. +* edebug-`: Debugging Backquote. +* edebug-all-defs <1>: Edebug Options. +* edebug-all-defs: Instrumenting. +* edebug-all-forms <1>: Edebug Options. +* edebug-all-forms: Instrumenting. +* edebug-continue-kbd-macro: Edebug Options. +* edebug-display-freq-count: Coverage Testing. +* edebug-eval-top-level-form: Instrumenting. +* edebug-global-break-condition <1>: Edebug Options. +* edebug-global-break-condition: Global Break Condition. +* edebug-initial-mode: Edebug Options. +* edebug-on-error <1>: Edebug Options. +* edebug-on-error: Trapping Errors. +* edebug-on-quit <1>: Edebug Options. +* edebug-on-quit: Trapping Errors. +* edebug-print-circle <1>: Edebug Options. +* edebug-print-circle: Printing in Edebug. +* edebug-print-length <1>: Edebug Options. +* edebug-print-length: Printing in Edebug. +* edebug-print-level <1>: Edebug Options. +* edebug-print-level: Printing in Edebug. +* edebug-print-trace-after <1>: Edebug Options. +* edebug-print-trace-after: Tracing. +* edebug-print-trace-before <1>: Edebug Options. +* edebug-print-trace-before: Tracing. +* edebug-save-displayed-buffer-points <1>: Edebug Options. +* edebug-save-displayed-buffer-points: Edebug Display Update. +* edebug-save-windows <1>: Edebug Options. +* edebug-save-windows: Edebug Display Update. +* edebug-set-global-break-condition: Global Break Condition. +* edebug-setup-hook: Edebug Options. +* edebug-test-coverage: Edebug Options. +* edebug-trace <1>: Edebug Options. +* edebug-trace: Tracing. +* edebug-tracing: Tracing. +* edebug-unwrap: Specification List. +* edebug-unwrap-results <1>: Edebug Options. +* edebug-unwrap-results: Debugging Backquote. +* edit-abbrevs-map: Standard Keymaps. +* edit-and-eval-command: Object from Minibuffer. +* edit-menu-filter: Menu Filters. +* edit-tab-stops-map: Standard Keymaps. +* editing types: Editing Types. +* editor command loop: Command Loop. +* eighth: List Elements. +* electric-buffer-menu-mode-map: Standard Keymaps. +* electric-future-map: A Sample Variable Description. +* electric-history-map: Standard Keymaps. +* element (of list): Lists. +* elements of sequences: Sequence Functions. +* elt: Sequence Functions. +* emacs-build-time: Building XEmacs. +* emacs-lisp-mode-map: Standard Keymaps. +* emacs-lisp-mode-syntax-table: Standard Syntax Tables. +* emacs-major-version: Building XEmacs. +* emacs-minor-version: Building XEmacs. +* emacs-pid: System Environment. +* emacs-version: Building XEmacs. +* EMACSLOADPATH environment variable: How Programs Do Loading. +* embedded breakpoints: Embedded Breakpoints. +* empty list: Cons Cell Type. +* enable-command: Disabling Commands. +* enable-flow-control: Flow Control. +* enable-flow-control-on: Flow Control. +* enable-local-eval: Auto Major Mode. +* enable-local-variables: Auto Major Mode. +* enable-menu-item: Modifying Menus. +* enable-recursive-minibuffers: Minibuffer Misc. +* encode-big5-char: Big5 and Shift-JIS Functions. +* encode-coding-region: Encoding and Decoding Text. +* encode-shift-jis-char: Big5 and Shift-JIS Functions. +* encode-time: Time Conversion. +* encoding file formats: Format Conversion. +* end of buffer marker: Creating Markers. +* end-of-buffer: Buffer End Motion. +* end-of-defun: List Motion. +* end-of-file: Input Functions. +* end-of-line: Text Lines. +* enlarge-window: Resizing Windows. +* enlarge-window-horizontally: Resizing Windows. +* enlarge-window-pixels: Resizing Windows. +* enqueue-eval-event: Reading One Event. +* environment: Intro Eval. +* environment variable access: System Environment. +* environment variables, subprocesses: Subprocess Creation. +* eobp: Near Point. +* eolp: Near Point. +* eq: Equality Predicates. +* equal: Equality Predicates. +* equality: Equality Predicates. +* erase-buffer: Deletion. +* error: Signaling Errors. +* error cleanup: Cleanups. +* error debugging: Error Debugging. +* error display: The Echo Area. +* error handler: Handling Errors. +* error in debug: Invoking the Debugger. +* error message notation: Error Messages. +* error name: Error Symbols. +* error symbol: Error Symbols. +* error-conditions: Error Symbols. +* error-message-string: Processing of Errors. +* errors: Errors. +* esc-map: Prefix Keys. +* ESC-prefix: Prefix Keys. +* escape <1>: Syntax Class Table. +* escape: Character Type. +* escape characters: Output Variables. +* escape characters in printing: Output Functions. +* escape sequence: Character Type. +* eval: Eval. +* eval, and debugging: Internals of Debugger. +* eval-and-compile: Eval During Compile. +* eval-buffer: Eval. +* eval-current-buffer (Edebug): Instrumenting. +* eval-defun (Edebug): Instrumenting. +* eval-event-p: Event Predicates. +* eval-expression (Edebug): Instrumenting. +* eval-minibuffer: Object from Minibuffer. +* eval-region: Eval. +* eval-region (Edebug): Instrumenting. +* eval-when-compile: Eval During Compile. +* evaluated expression argument: Interactive Codes. +* evaluation: Evaluation. +* evaluation error: Local Variables. +* evaluation list (Edebug): Eval List. +* evaluation notation: Evaluation Notation. +* evaluation of buffer contents: Eval. +* event printing: Describing Characters. +* event-buffer: Window-Level Event Position Info. +* event-button: Accessing Other Event Info. +* event-closest-point: Event Text Position Info. +* event-device: Accessing Other Event Info. +* event-frame: Frame-Level Event Position Info. +* event-function: Accessing Other Event Info. +* event-glyph-extent: Event Glyph Position Info. +* event-glyph-x-pixel: Event Glyph Position Info. +* event-glyph-y-pixel: Event Glyph Position Info. +* event-key: Accessing Other Event Info. +* event-live-p: Event Predicates. +* event-matches-key-specifier-p: Key Sequences. +* event-modifier-bits: Accessing Other Event Info. +* event-modifiers: Accessing Other Event Info. +* event-object: Accessing Other Event Info. +* event-over-border-p: Other Event Position Info. +* event-over-glyph-p: Event Glyph Position Info. +* event-over-modeline-p: Event Text Position Info. +* event-over-text-area-p: Event Text Position Info. +* event-over-toolbar-p: Event Toolbar Position Info. +* event-point: Event Text Position Info. +* event-process: Accessing Other Event Info. +* event-timestamp: Accessing Other Event Info. +* event-to-character: Converting Events. +* event-toolbar-button: Event Toolbar Position Info. +* event-type: Event Contents. +* event-window: Window-Level Event Position Info. +* event-window-x-pixel: Window-Level Event Position Info. +* event-window-y-pixel: Window-Level Event Position Info. +* event-x: Event Text Position Info. +* event-x-pixel: Frame-Level Event Position Info. +* event-y: Event Text Position Info. +* event-y-pixel: Frame-Level Event Position Info. +* eventp: Events. +* events: Events. +* events-to-keys: Converting Events. +* examining windows: Buffers and Windows. +* examples of using interactive: Interactive Examples. +* exchange-point-and-mark: The Mark. +* excursion: Excursions. +* exec-directory: Subprocess Creation. +* exec-path: Subprocess Creation. +* execute program: Subprocess Creation. +* execute with prefix argument: Interactive Call. +* execute-extended-command: Interactive Call. +* execute-kbd-macro: Keyboard Macros. +* executing-macro: Keyboard Macros. +* execution speed: Compilation Tips. +* exit: Recursive Editing. +* exit recursive editing: Recursive Editing. +* exit-minibuffer: Minibuffer Misc. +* exit-recursive-edit: Recursive Editing. +* exiting XEmacs: Getting Out. +* exp: Math Functions. +* expand-abbrev: Abbrev Expansion. +* expand-file-name: File Name Expansion. +* expansion of file names: File Name Expansion. +* expansion of macros: Expansion. +* expression: Intro Eval. +* expression prefix: Syntax Class Table. +* expt: Math Functions. +* extended-command-history: Minibuffer History. +* extent <1>: Extents. +* extent: Variable Scoping. +* extent children: Extent Parents. +* extent end position: Extent Endpoints. +* extent endpoint: Extent Endpoints. +* extent order: Extent Endpoints. +* extent parent: Extent Parents. +* extent priority: Intro to Extents. +* extent property: Extent Properties. +* extent replica: Duplicable Extents. +* extent start position: Extent Endpoints. +* extent, duplicable: Duplicable Extents. +* extent, unique: Duplicable Extents. +* extent-at: Finding Extents. +* extent-begin-glyph: Extent Properties. +* extent-begin-glyph-layout: Extent Properties. +* extent-children: Extent Parents. +* extent-descendants: Extent Parents. +* extent-detached-p: Detached Extents. +* extent-end-glyph: Extent Properties. +* extent-end-glyph-layout: Extent Properties. +* extent-end-position: Extent Endpoints. +* extent-face: Extent Properties. +* extent-in-region-p: Mapping Over Extents. +* extent-keymap: Extent Properties. +* extent-length: Extent Endpoints. +* extent-list: Finding Extents. +* extent-live-p: Creating and Modifying Extents. +* extent-mouse-face: Extent Properties. +* extent-object: Creating and Modifying Extents. +* extent-parent: Extent Parents. +* extent-priority: Extent Properties. +* extent-properties: Extent Properties. +* extent-property: Extent Properties. +* extent-start-position: Extent Endpoints. +* extentp: Extents. +* extents, locating: Finding Extents. +* extents, mapping: Mapping Over Extents. +* face type: Face Type. +* face-background: Face Convenience Functions. +* face-background-instance: Face Convenience Functions. +* face-background-pixmap: Face Convenience Functions. +* face-background-pixmap-instance: Face Convenience Functions. +* face-boolean-specifier-p: Specifier Types. +* face-differs-from-default-p: Other Face Display Functions. +* face-equal: Other Face Display Functions. +* face-font: Face Convenience Functions. +* face-font-instance: Face Convenience Functions. +* face-font-name: Face Convenience Functions. +* face-foreground: Face Convenience Functions. +* face-foreground-instance: Face Convenience Functions. +* face-list: Basic Face Functions. +* face-property: Face Properties. +* face-property-instance: Face Properties. +* face-underline-p: Face Convenience Functions. +* facep: Basic Face Functions. +* faces: Faces and Window-System Objects. +* fallback (in a specifier): Specifier Instancing. +* false: nil and t. +* fboundp: Function Cells. +* fceiling: Rounding Operations. +* featurep: Named Features. +* features: Named Features. +* fetch-bytecode: Dynamic Loading. +* ffloor: Rounding Operations. +* field width: Formatting Strings. +* fifth: List Elements. +* file accessibility: Testing Accessibility. +* file age: Testing Accessibility. +* file attributes: File Attributes. +* file format conversion: Format Conversion. +* file hard link: Changing File Attributes. +* file locks: File Locks. +* file mode specification error: Auto Major Mode. +* file modes and MS-DOS: Changing File Attributes. +* file modification time: Testing Accessibility. +* file name completion subroutines: File Name Completion. +* file name of buffer: Buffer File Name. +* file name of directory: Directory Names. +* file names: File Names. +* file names in directory: Contents of Directories. +* file open error: Subroutines of Visiting. +* file symbolic links: Kinds of Files. +* file types on MS-DOS: Files and MS-DOS. +* file with multiple names: Changing File Attributes. +* file-accessible-directory-p: Testing Accessibility. +* file-already-exists: Changing File Attributes. +* file-attributes: File Attributes. +* file-directory-p: Kinds of Files. +* file-error: How Programs Do Loading. +* file-executable-p: Testing Accessibility. +* file-exists-p: Testing Accessibility. +* file-local-copy: Magic File Names. +* file-locked: File Locks. +* file-locked-p: File Locks. +* file-menu-filter: Menu Filters. +* file-modes: File Attributes. +* file-name-absolute-p: Relative File Names. +* file-name-all-completions: File Name Completion. +* file-name-as-directory: Directory Names. +* file-name-buffer-file-type-alist: Files and MS-DOS. +* file-name-completion: File Name Completion. +* file-name-directory: File Name Components. +* file-name-history: Minibuffer History. +* file-name-nondirectory: File Name Components. +* file-name-sans-extension: File Name Components. +* file-name-sans-versions: File Name Components. +* file-newer-than-file-p: Testing Accessibility. +* file-newest-backup: Backup Names. +* file-nlinks: File Attributes. +* file-ownership-preserved-p: Testing Accessibility. +* file-precious-flag: Saving Buffers. +* file-readable-p: Testing Accessibility. +* file-regular-p: Kinds of Files. +* file-relative-name: File Name Expansion. +* file-supersession: Modification Time. +* file-symlink-p: Kinds of Files. +* file-truename: Truenames. +* file-writable-p: Testing Accessibility. +* fill-column: Margins. +* fill-individual-paragraphs: Filling. +* fill-individual-varying-indent: Filling. +* fill-paragraph: Filling. +* fill-paragraph-function: Filling. +* fill-prefix: Margins. +* fill-region: Filling. +* fill-region-as-paragraph: Filling. +* fillarray: Array Functions. +* filling a paragraph: Filling. +* filling, automatic: Auto Filling. +* filling, explicit: Filling. +* filter function: Filter Functions. +* find-backup-file-name: Backup Names. +* find-buffer-file-type: Files and MS-DOS. +* find-charset: Basic Charset Functions. +* find-charset-region: MULE Characters. +* find-charset-string: MULE Characters. +* find-coding-system: Basic Coding System Functions. +* find-file: Visiting Functions. +* find-file-binary: Files and MS-DOS. +* find-file-hooks: Visiting Functions. +* find-file-name-handler: Magic File Names. +* find-file-noselect: Visiting Functions. +* find-file-not-found-hooks: Visiting Functions. +* find-file-other-window: Visiting Functions. +* find-file-read-only: Visiting Functions. +* find-file-text: Files and MS-DOS. +* find-menu-item: Modifying Menus. +* finding files: Visiting Files. +* finding windows: Selecting Windows. +* first: List Elements. +* first-change-hook: Change Hooks. +* fixup-whitespace: User-Level Deletion. +* float: Numeric Conversions. +* float-output-format: Output Variables. +* floating-point numbers, printing: Output Variables. +* floatp: Predicates on Numbers. +* floor: Numeric Conversions. +* flow control characters: Flow Control. +* flush input: Peeking and Discarding. +* fmakunbound: Function Cells. +* focus-frame: Input Focus. +* following-char: Near Point. +* font instance characteristics: Font Instance Characteristics. +* font instance name: Font Instance Names. +* font instance size: Font Instance Size. +* font instance type: Font Instance Type. +* font-instance-name: Font Instance Names. +* font-instance-p: Font Instances. +* font-instance-properties: Font Instance Characteristics. +* font-instance-truename: Font Instance Names. +* font-name: Font Convenience Functions. +* font-properties: Font Convenience Functions. +* font-specifier-p <1>: Font Specifiers. +* font-specifier-p: Specifier Types. +* font-truename: Font Convenience Functions. +* fonts <1>: Fonts. +* fonts: Some Terms. +* fonts available: Font Instance Names. +* foo: A Sample Function Description. +* for: Argument Evaluation. +* force-cursor-redisplay: Refresh Screen. +* force-highlight-extent: Extents and Events. +* forcing redisplay: Waiting. +* format: Formatting Strings. +* format definition: Format Conversion. +* format of keymaps: Format of Keymaps. +* format of menus: Menu Format. +* format of the menubar: Menubar Format. +* format precision: Formatting Strings. +* format specification: Formatting Strings. +* format-alist: Format Conversion. +* format-buffers-menu-line: Buffers Menu. +* format-find-file: Format Conversion. +* format-insert-file: Format Conversion. +* format-time-string: Time Conversion. +* format-write-file: Format Conversion. +* formatting strings: Formatting Strings. +* formfeed: Character Type. +* forms: Intro Eval. +* forward-char: Character Motion. +* forward-comment: Parsing Expressions. +* forward-line: Text Lines. +* forward-list: List Motion. +* forward-sexp: List Motion. +* forward-to-indentation: Motion by Indent. +* forward-word: Word Motion. +* fourth: List Elements. +* frame: Frames. +* frame configuration: Frame Configurations. +* frame hooks: Frame Hooks. +* frame name: Frame Name. +* frame of terminal: Basic Windows. +* frame position: Size and Position. +* frame size: Size and Position. +* frame visibility: Visibility of Frames. +* frame-device: Basic Device Functions. +* frame-height: Size and Position. +* frame-icon-title-format: Frame Titles. +* frame-iconified-p: Visibility of Frames. +* frame-list: Finding All Frames. +* frame-live-p: Deleting Frames. +* frame-name: Frame Name. +* frame-pixel-height: Size and Position. +* frame-pixel-width: Size and Position. +* frame-properties: Property Access. +* frame-property: Property Access. +* frame-root-window: Frames and Windows. +* frame-selected-window: Frames and Windows. +* frame-title-format: Frame Titles. +* frame-top-window: Frames and Windows. +* frame-totally-visible-p: Visibility of Frames. +* frame-visible-p: Visibility of Frames. +* frame-width: Size and Position. +* framep: Frames. +* free list: Garbage Collection. +* frequency counts: Coverage Testing. +* fround: Rounding Operations. +* fset: Function Cells. +* ftp-login: Cleanups. +* ftruncate: Rounding Operations. +* funcall: Calling Functions. +* funcall, and debugging: Internals of Debugger. +* function <1>: Anonymous Functions. +* function: What Is a Function. +* function call: Function Forms. +* function call debugging: Function Debugging. +* function cell: Symbol Components. +* function cell in autoload: Autoload. +* function definition: Function Names. +* function descriptions: A Sample Function Description. +* function form evaluation: Function Forms. +* function input stream: Input Streams. +* function invocation: Calling Functions. +* function name: Function Names. +* function output stream: Output Streams. +* function quoting: Anonymous Functions. +* function-interactive: Using Interactive. +* function-key-map: Translating Input. +* function-obsoleteness-doc: Obsoleteness. +* functionals: Calling Functions. +* functions in modes: Major Mode Conventions. +* functions, making them interactive: Defining Commands. +* Fundamental mode: Major Modes. +* fundamental-mode: Auto Major Mode. +* fundamental-mode-abbrev-table: Standard Abbrev Tables. +* garbage collector: Garbage Collection. +* garbage-collect: Garbage Collection. +* gc-cons-threshold: Garbage Collection. +* gc-message: Garbage Collection. +* gc-pointer-glyph <1>: Garbage Collection. +* gc-pointer-glyph: Mouse Pointer. +* generate-new-buffer: Creating Buffers. +* generate-new-buffer-name: Buffer Names. +* generic-specifier-p: Specifier Types. +* get: Object Plists. +* get-buffer: Buffer Names. +* get-buffer-create: Creating Buffers. +* get-buffer-process: Process Buffers. +* get-buffer-window: Buffers and Windows. +* get-char-property: Examining Properties. +* get-char-table: Working With Char Tables. +* get-charset: Basic Charset Functions. +* get-coding-system: Basic Coding System Functions. +* get-database: Working With a Database. +* get-file-buffer: Buffer File Name. +* get-largest-window: Selecting Windows. +* get-lru-window: Selecting Windows. +* get-process: Process Information. +* get-range-char-table: Working With Char Tables. +* get-range-table: Working With Range Tables. +* get-register: Registers. +* get-text-property: Examining Properties. +* get-tooltalk-message-attribute: Elisp Interface for Sending Messages. +* getenv: System Environment. +* getf: Other Plists. +* gethash: Working With Hash Tables. +* gettext: Level 3 Primitives. +* global binding: Local Variables. +* global break condition: Global Break Condition. +* global keymap: Active Keymaps. +* global mark ring: The Mark. +* global variable: Global Variables. +* global-abbrev-table: Standard Abbrev Tables. +* global-key-binding: Functions for Key Lookup. +* global-map: Active Keymaps. +* global-mark-ring: The Mark. +* global-mode-string: Modeline Variables. +* global-popup-menu: Pop-Up Menus. +* global-set-key: Key Binding Commands. +* global-unset-key: Key Binding Commands. +* glyph type: Glyph Type. +* glyph-ascent: Glyph Dimensions. +* glyph-baseline: Glyph Convenience Functions. +* glyph-baseline-instance: Glyph Convenience Functions. +* glyph-contrib-p: Glyph Convenience Functions. +* glyph-contrib-p-instance: Glyph Convenience Functions. +* glyph-descent: Glyph Dimensions. +* glyph-face: Glyph Convenience Functions. +* glyph-height: Glyph Dimensions. +* glyph-image: Glyph Convenience Functions. +* glyph-image-instance: Glyph Convenience Functions. +* glyph-property: Glyph Properties. +* glyph-property-instance: Glyph Properties. +* glyph-type: Glyph Types. +* glyph-type-list: Glyph Types. +* glyph-width: Glyph Dimensions. +* glyphp: Glyphs. +* glyphs: Glyphs. +* goto-char: Character Motion. +* goto-line: Text Lines. +* gutter: Gutter. +* gutter-buttons-captioned-p: Other Gutter Variables. +* gutter-make-button-list: Gutter Descriptor Format. +* gutter-specifier-p: Specifying a Gutter. +* hack-local-variables: Auto Major Mode. +* handling errors: Handling Errors. +* hash notation: Printed Representation. +* hash table: Hash Tables. +* hash table type: Hash Table Type. +* hash table, weak: Weak Hash Tables. +* hash-table-count: Introduction to Hash Tables. +* hash-table-p: Hash Tables. +* hash-table-rehash-size: Introduction to Hash Tables. +* hash-table-rehash-threshold: Introduction to Hash Tables. +* hash-table-size: Introduction to Hash Tables. +* hash-table-test: Introduction to Hash Tables. +* hash-table-weakness: Introduction to Hash Tables. +* hashing: Creating Symbols. +* header comments: Library Headers. +* help for major mode: Mode Help. +* help-char: Help Functions. +* help-command: Help Functions. +* help-form: Help Functions. +* help-map <1>: Standard Keymaps. +* help-map: Help Functions. +* Helper-describe-bindings: Help Functions. +* Helper-help: Help Functions. +* Helper-help-map: Standard Keymaps. +* hide-annotation: Annotation Properties. +* highlight-extent: Extents and Events. +* history list: Minibuffer History. +* history of commands: Command History. +* HOME environment variable: Subprocess Creation. +* hooks: Hooks. +* hooks for loading: Hooks for Loading. +* hooks for text changes: Change Hooks. +* horizontal position: Columns. +* horizontal scrolling: Horizontal Scrolling. +* hscroll-glyph: Redisplay Glyphs. +* icon-glyph-p: Glyph Types. +* iconified frame: Visibility of Frames. +* iconify-frame: Visibility of Frames. +* identity: Calling Functions. +* IEEE floating point: Float Basics. +* if: Conditionals. +* ignore: Calling Functions. +* ignored-local-variables: Auto Major Mode. +* image instance type: Image Instance Type. +* image instance types: Image Instance Types. +* image instances: Image Instances. +* image instantiator conversion: Image Instantiator Conversion. +* image specifiers: Image Specifiers. +* image-instance-background: Image Instance Functions. +* image-instance-depth: Image Instance Functions. +* image-instance-file-name: Image Instance Functions. +* image-instance-foreground: Image Instance Functions. +* image-instance-height: Image Instance Functions. +* image-instance-hotspot-x: Image Instance Functions. +* image-instance-hotspot-y: Image Instance Functions. +* image-instance-mask-file-name: Image Instance Functions. +* image-instance-name: Image Instance Functions. +* image-instance-p: Image Instances. +* image-instance-string: Image Instance Functions. +* image-instance-type: Image Instance Types. +* image-instance-type-list: Image Instance Types. +* image-instance-width: Image Instance Functions. +* image-instantiator-format-list: Image Specifiers. +* image-specifier-p <1>: Image Specifiers. +* image-specifier-p: Specifier Types. +* implicit progn: Sequencing. +* inc: Simple Macro. +* indent-according-to-mode: Mode-Specific Indent. +* indent-code-rigidly: Region Indent. +* indent-for-tab-command: Mode-Specific Indent. +* indent-line-function: Mode-Specific Indent. +* indent-region: Region Indent. +* indent-region-function: Region Indent. +* indent-relative: Relative Indent. +* indent-relative-maybe: Relative Indent. +* indent-rigidly: Region Indent. +* indent-tabs-mode: Primitive Indent. +* indent-to: Primitive Indent. +* indent-to-left-margin: Margins. +* indentation: Indentation. +* indenting with parentheses: Parsing Expressions. +* indirect buffers: Indirect Buffers. +* indirect specifications: Specification List. +* indirect variables: Variable Aliases. +* indirect-function: Function Indirection. +* indirect-variable: Variable Aliases. +* indirection: Function Indirection. +* infinite loops: Infinite Loops. +* infinite recursion: Local Variables. +* infinity: Float Basics. +* Info-edit-map: Standard Keymaps. +* Info-minibuffer-history: Minibuffer History. +* Info-mode-map: Standard Keymaps. +* inherit: Syntax Class Table. +* inheriting a keymap's bindings: Inheritance and Keymaps. +* inhibit-default-init: Init File. +* inhibit-file-name-handlers: Magic File Names. +* inhibit-file-name-operation: Magic File Names. +* inhibit-quit: Quitting. +* inhibit-read-only: Read Only Buffers. +* inhibit-startup-echo-area-message: Start-up Summary. +* inhibit-startup-message: Start-up Summary. +* init file: Init File. +* initial-frame-plist: Initial Properties. +* initial-gutter-spec: Other Gutter Variables. +* initial-major-mode: Auto Major Mode. +* initial-toolbar-spec: Other Toolbar Variables. +* initialization: Start-up Summary. +* inline functions: Inline Functions. +* innermost containing parentheses: Parsing Expressions. +* input events: Events. +* input focus: Input Focus. +* input modes: Input Modes. +* input stream: Input Streams. +* input-pending-p: Peeking and Discarding. +* insert: Insertion. +* insert-abbrev-table-description: Abbrev Tables. +* insert-before-markers: Insertion. +* insert-buffer: Commands for Insertion. +* insert-buffer-substring: Insertion. +* insert-char: Insertion. +* insert-default-directory: Reading File Names. +* insert-directory: Contents of Directories. +* insert-directory-program: Contents of Directories. +* insert-extent: Detached Extents. +* insert-file-contents: Reading from Files. +* insert-register: Registers. +* insert-string: Insertion. +* inserting killed text: Yank Commands. +* insertion before point: Insertion. +* insertion of text: Insertion. +* inside comment: Parsing Expressions. +* inside margin: Annotation Basics. +* inside string: Parsing Expressions. +* inst-list (in a specifier): Specifiers In-Depth. +* inst-pair (in a specifier): Specifiers In-Depth. +* installation-directory: System Environment. +* instance (in a specifier): Specifiers In-Depth. +* instancing (in a specifier): Specifiers In-Depth. +* instantiator (in a specifier): Specifiers In-Depth. +* int-char: Character Codes. +* int-to-string: String Conversion. +* integer to decimal: String Conversion. +* integer to hexadecimal: Formatting Strings. +* integer to octal: Formatting Strings. +* integer to string: String Conversion. +* integer-char-or-marker-p: Predicates on Markers. +* integer-or-char-p: Predicates for Characters. +* integer-or-marker-p: Predicates on Markers. +* integer-specifier-p: Specifier Types. +* integerp: Predicates on Numbers. +* integers: Numbers. +* interactive: Using Interactive. +* interactive call: Interactive Call. +* interactive code description: Interactive Codes. +* interactive commands (Edebug): Instrumenting. +* interactive completion: Interactive Codes. +* interactive function: Defining Commands. +* interactive, examples of using: Interactive Examples. +* interactive-p: Interactive Call. +* intern: Creating Symbols. +* intern-soft: Creating Symbols. +* internal-doc-file-name: Accessing Documentation. +* interning: Creating Symbols. +* interpreter: Evaluation. +* interpreter-mode-alist: Auto Major Mode. +* interprogram-cut-function: Low-Level Kill Ring. +* interprogram-paste-function: Low-Level Kill Ring. +* interrupt-process: Signals to Processes. +* invalid function: Function Indirection. +* invalid prefix key error: Changing Key Bindings. +* invalid-function: Function Indirection. +* invalid-read-syntax: Printed Representation. +* invalid-regexp: Syntax of Regexps. +* invert-face: Other Face Display Functions. +* invisible frame: Visibility of Frames. +* invisible text: Invisible Text. +* invisible-text-glyph: Redisplay Glyphs. +* invocation-directory: System Environment. +* invocation-name: System Environment. +* isearch-mode-map: Standard Keymaps. +* ISO Latin 1: Case Tables. +* ISO Latin-1 characters (input): Translating Input. +* iso-syntax: Case Tables. +* iso-transl: Translating Input. +* italic: Font Instance Characteristics. +* iteration: Iteration. +* itimer-edit-map: Standard Keymaps. +* joining lists: Rearrangement. +* just-one-space: User-Level Deletion. +* justify-current-line: Filling. +* kept-new-versions: Numbered Backups. +* kept-old-versions: Numbered Backups. +* key: Keymap Terminology. +* key binding: Keymap Terminology. +* key lookup: Key Lookup. +* key sequence: Key Sequence Input. +* key sequence error: Changing Key Bindings. +* key sequence input: Key Sequence Input. +* key sequences: Key Sequences. +* key translation function: Translating Input. +* key-binding: Functions for Key Lookup. +* key-description: Describing Characters. +* key-press-event-p: Event Predicates. +* key-translation-map: Translating Input. +* keyboard macro execution: Interactive Call. +* keyboard macro termination: Beeping. +* keyboard macros: Keyboard Macros. +* keyboard macros (Edebug): Edebug Execution Modes. +* keyboard menu accelerators: Menu Accelerators. +* keyboard-quit: Quitting. +* keymap: Keymaps. +* keymap entry: Key Lookup. +* keymap format: Format of Keymaps. +* keymap in keymap: Key Lookup. +* keymap inheritance: Inheritance and Keymaps. +* keymap parent: Inheritance and Keymaps. +* keymap-default-binding: Inheritance and Keymaps. +* keymap-fullness: Scanning Keymaps. +* keymap-name: Creating Keymaps. +* keymap-parents: Inheritance and Keymaps. +* keymap-prompt: Other Keymap Functions. +* keymapp: Format of Keymaps. +* keymaps in modes: Major Mode Conventions. +* keys in documentation strings: Keys in Documentation. +* keystroke: Keymap Terminology. +* keystroke command: What Is a Function. +* keywordp: Specification List. +* kill command repetition: Command Loop Info. +* kill ring: The Kill Ring. +* kill-all-local-variables: Creating Buffer-Local. +* kill-append: Low-Level Kill Ring. +* kill-buffer: Killing Buffers. +* kill-buffer-hook: Killing Buffers. +* kill-buffer-query-functions: Killing Buffers. +* kill-emacs: Killing XEmacs. +* kill-emacs-hook: Killing XEmacs. +* kill-emacs-query-functions: Killing XEmacs. +* kill-local-variable: Creating Buffer-Local. +* kill-new: Low-Level Kill Ring. +* kill-process: Signals to Processes. +* kill-region: Kill Functions. +* kill-ring: Internals of Kill Ring. +* kill-ring-max: Internals of Kill Ring. +* kill-ring-yank-pointer: Internals of Kill Ring. +* killing buffers: Killing Buffers. +* killing XEmacs: Killing XEmacs. +* lambda expression: Lambda Expressions. +* lambda expression in hook: Hooks. +* lambda in debug: Invoking the Debugger. +* lambda in keymap: Key Lookup. +* lambda list: Lambda Components. +* lambda-list (Edebug): Specification List. +* lambda-list-keywordp: Specification List. +* last-abbrev: Abbrev Expansion. +* last-abbrev-location: Abbrev Expansion. +* last-abbrev-text: Abbrev Expansion. +* last-command: Command Loop Info. +* last-command-char: Command Loop Info. +* last-command-event: Command Loop Info. +* last-input-char: Peeking and Discarding. +* last-input-event: Peeking and Discarding. +* last-kbd-macro: Keyboard Macros. +* Latin-1 character set (input): Translating Input. +* lax-plist-get: Working With Lax Plists. +* lax-plist-member: Working With Lax Plists. +* lax-plist-put: Working With Lax Plists. +* lax-plist-remprop: Working With Lax Plists. +* lax-plists-eq: Working With Lax Plists. +* lax-plists-equal: Working With Lax Plists. +* layout policy: Annotation Basics. +* layout types: Annotation Basics. +* lazy loading: Dynamic Loading. +* LDAP: LDAP Support. +* ldap-close: Opening and Closing a LDAP Connection. +* ldap-default-base: LDAP Variables. +* ldap-default-host: LDAP Variables. +* ldap-default-port: LDAP Variables. +* ldap-host: The LDAP Lisp Object. +* ldap-host-parameters-alist: LDAP Variables. +* ldap-live-p: The LDAP Lisp Object. +* ldap-open: Opening and Closing a LDAP Connection. +* ldap-search: The High-Level LDAP API. +* ldap-search-internal: Searching on a LDAP Server (Low-level). +* ldapp: The LDAP Lisp Object. +* left-gutter: Specifying a Gutter. +* left-gutter-visible-p: Other Gutter Variables. +* left-gutter-width: Other Gutter Variables. +* left-margin: Margins. +* left-margin-width: Margin Primitives. +* left-toolbar: Specifying the Toolbar. +* left-toolbar-visible-p: Other Toolbar Variables. +* left-toolbar-width: Other Toolbar Variables. +* length: Sequence Functions. +* let: Local Variables. +* let*: Local Variables. +* let-specifier: Adding Specifications. +* lexical binding (Edebug): Edebug Eval. +* lexical comparison: Text Comparison. +* library: Loading. +* library compilation: Compilation Functions. +* library header comments: Library Headers. +* line wrapping: Truncation. +* lines: Text Lines. +* lines in region: Text Lines. +* linking files: Changing File Attributes. +* Lisp debugger: Debugger. +* Lisp expression motion: List Motion. +* Lisp history: Lisp History. +* Lisp library: Loading. +* Lisp nesting error: Eval. +* Lisp object: Lisp Data Types. +* Lisp printer: Output Functions. +* Lisp reader: Streams Intro. +* lisp-interaction-mode-map: Standard Keymaps. +* lisp-mode-abbrev-table: Standard Abbrev Tables. +* lisp-mode-map: Standard Keymaps. +* lisp-mode.el: Example Major Modes. +* list <1>: Building Lists. +* list: Lists. +* list elements: List Elements. +* list form evaluation: Classifying Lists. +* list in keymap: Key Lookup. +* list length: Sequence Functions. +* list motion: List Motion. +* list structure: Cons Cells. +* list-buffers: The Buffer List. +* list-buffers-directory: Buffer File Name. +* list-fonts: Font Instance Names. +* list-processes: Process Information. +* listp: List-related Predicates. +* lists and cons cells: Cons Cells. +* lists as sets: Sets And Lists. +* lists represented as boxes: Lists as Boxes. +* literal evaluation: Self-Evaluating Forms. +* lmessage: The Echo Area. +* ln: Changing File Attributes. +* load: How Programs Do Loading. +* load error with require: Named Features. +* load errors: How Programs Do Loading. +* load-average: System Environment. +* load-default-sounds: Beeping. +* load-history: Unloading. +* load-ignore-elc-files: How Programs Do Loading. +* load-in-progress: How Programs Do Loading. +* load-path: How Programs Do Loading. +* load-read-function: How Programs Do Loading. +* load-sound-file: Beeping. +* load-warn-when-source-newer: How Programs Do Loading. +* load-warn-when-source-only: How Programs Do Loading. +* loading: Loading. +* loading hooks: Hooks for Loading. +* loadup.el: Building XEmacs. +* local binding: Local Variables. +* local keymap: Active Keymaps. +* local variables: Local Variables. +* local-abbrev-table: Standard Abbrev Tables. +* local-key-binding: Functions for Key Lookup. +* local-set-key: Key Binding Commands. +* local-unset-key: Key Binding Commands. +* local-variable-p: Creating Buffer-Local. +* local-write-file-hooks: Saving Buffers. +* locale (in a specifier): Specifiers In-Depth. +* locate-file: How Programs Do Loading. +* locate-file-clear-hashing: How Programs Do Loading. +* lock-buffer: File Locks. +* log: Math Functions. +* log-message-ignore-labels: The Echo Area. +* log-message-ignore-regexps: The Echo Area. +* log-message-max-size: The Echo Area. +* log-warning-minimum-level: Warnings. +* log-warning-suppressed-classes: Warnings. +* log10: Math Functions. +* logand: Bitwise Operations. +* logb: Float Basics. +* logical and: Bitwise Operations. +* logical exclusive or: Bitwise Operations. +* logical inclusive or: Bitwise Operations. +* logical not: Bitwise Operations. +* logical shift: Bitwise Operations. +* logior: Bitwise Operations. +* lognot: Bitwise Operations. +* logxor: Bitwise Operations. +* looking-at: Regexp Search. +* lookup-key: Functions for Key Lookup. +* loops, infinite: Infinite Loops. +* lower case: Character Case. +* lower-frame: Raising and Lowering. +* lowering a frame: Raising and Lowering. +* lsh: Bitwise Operations. +* lwarn: Warnings. +* M-x: Interactive Call. +* Maclisp: Lisp History. +* macro: What Is a Function. +* macro argument evaluation: Argument Evaluation. +* macro call: Expansion. +* macro call evaluation: Macro Forms. +* macro compilation: Compilation Functions. +* macro descriptions: A Sample Function Description. +* macro expansion: Expansion. +* macroexpand: Expansion. +* macros: Macros. +* magic file names: Magic File Names. +* mail-host-address: System Environment. +* major mode: Major Modes. +* major mode hook: Major Mode Conventions. +* major mode keymap: Active Keymaps. +* major-mode: Mode Help. +* make-abbrev-table: Abbrev Tables. +* make-annotation: Annotation Primitives. +* make-auto-save-file-name: Auto-Saving. +* make-backup-file-name: Backup Names. +* make-backup-files: Making Backups. +* make-bit-vector: Bit Vector Functions. +* make-byte-code: Compiled-Function Objects. +* make-char: MULE Characters. +* make-char-table: Working With Char Tables. +* make-charset: Basic Charset Functions. +* make-coding-system: Basic Coding System Functions. +* make-composite-char: Composite Characters. +* make-device: Connecting to a Console or Device. +* make-directory: Create/Delete Dirs. +* make-display-table: Display Table Format. +* make-event: Working With Events. +* make-extent: Creating and Modifying Extents. +* make-face: Basic Face Functions. +* make-file-part: Creating a Partial File. +* make-font-instance: Font Instances. +* make-frame: Creating Frames. +* make-frame-invisible: Visibility of Frames. +* make-frame-visible: Visibility of Frames. +* make-glyph: Creating Glyphs. +* make-glyph-internal: Creating Glyphs. +* make-hash-table: Introduction to Hash Tables. +* make-icon-glyph: Creating Glyphs. +* make-image-instance: Image Instance Functions. +* make-image-specifier: Image Specifiers. +* make-indirect-buffer: Indirect Buffers. +* make-keymap: Creating Keymaps. +* make-list: Building Lists. +* make-local-hook: Hooks. +* make-local-variable: Creating Buffer-Local. +* make-marker: Creating Markers. +* make-obsolete: Obsoleteness. +* make-obsolete-variable: Obsoleteness. +* make-pointer-glyph: Creating Glyphs. +* make-range-table: Introduction to Range Tables. +* make-reverse-direction-charset: Basic Charset Functions. +* make-sparse-keymap: Creating Keymaps. +* make-specifier: Creating Specifiers. +* make-specifier-and-init: Creating Specifiers. +* make-string: Creating Strings. +* make-symbol: Creating Symbols. +* make-symbolic-link: Changing File Attributes. +* make-syntax-table: Syntax Table Functions. +* make-temp-name: Unique File Names. +* make-tooltalk-message: Elisp Interface for Sending Messages. +* make-tooltalk-pattern: Elisp Interface for Receiving Messages. +* make-tty-device: Connecting to a Console or Device. +* make-variable-buffer-local: Creating Buffer-Local. +* make-vector: Vector Functions. +* make-weak-list: Weak Lists. +* make-x-device: Connecting to a Console or Device. +* makunbound: Void Variables. +* Manual-page-minibuffer-history: Minibuffer History. +* map-char-table: Working With Char Tables. +* map-database: Working With a Database. +* map-extent-children: Mapping Over Extents. +* map-extents: Mapping Over Extents. +* map-frame-hook: Frame Hooks. +* map-keymap: Scanning Keymaps. +* map-range-table: Working With Range Tables. +* map-specifier: Other Specification Functions. +* map-y-or-n-p: Multiple Queries. +* mapatoms: Creating Symbols. +* mapcar: Mapping Functions. +* mapcar-extents: Mapping Over Extents. +* mapconcat: Mapping Functions. +* maphash: Working With Hash Tables. +* mapping functions: Mapping Functions. +* margin: Annotation Basics. +* margin width: Margin Primitives. +* mark: The Mark. +* mark excursion: Excursions. +* mark ring: The Mark. +* mark, the: The Mark. +* mark-marker: The Mark. +* mark-ring: The Mark. +* mark-ring-max: The Mark. +* marker argument: Interactive Codes. +* marker garbage collection: Overview of Markers. +* marker input stream: Input Streams. +* marker output stream: Output Streams. +* marker relocation: Overview of Markers. +* marker-buffer: Information from Markers. +* marker-position: Information from Markers. +* markerp: Predicates on Markers. +* markers: Markers. +* markers as numbers: Overview of Markers. +* markers vs. extents: Overview of Markers. +* match data: Match Data. +* match-beginning: Simple Match Data. +* match-data: Entire Match Data. +* match-end: Simple Match Data. +* match-string: Simple Match Data. +* mathematical functions: Math Functions. +* max: Comparison of Numbers. +* max-lisp-eval-depth: Eval. +* max-specpdl-size: Local Variables. +* md5: Transformations. +* MD5 digests: Transformations. +* member: Sets And Lists. +* membership in a list: Sets And Lists. +* memory allocation: Garbage Collection. +* memory-limit: Garbage Collection. +* memq: Sets And Lists. +* menu: Menus. +* menu accelerators: Menu Accelerators. +* menu filters: Menu Filters. +* menu format: Menu Format. +* menu-accelerator-enabled: Menu Accelerator Functions. +* menu-accelerator-map: Menu Accelerator Functions. +* menu-accelerator-modifiers: Menu Accelerator Functions. +* menu-accelerator-prefix: Menu Accelerator Functions. +* menu-no-selection-hook: Menubar. +* menubar: Menubar. +* menubar format: Menubar Format. +* menubar-configuration: Menu Format. +* menubar-pointer-glyph: Mouse Pointer. +* menubar-show-keybindings: Menubar. +* message: The Echo Area. +* meta character printing: Describing Characters. +* meta-prefix-char: Functions for Key Lookup. +* min: Comparison of Numbers. +* minibuffer: Minibuffers. +* minibuffer history: Minibuffer History. +* minibuffer input: Recursive Editing. +* minibuffer window: Cyclic Window Ordering. +* minibuffer-complete: Completion Commands. +* minibuffer-complete-and-exit: Completion Commands. +* minibuffer-complete-word: Completion Commands. +* minibuffer-completion-confirm: Completion Commands. +* minibuffer-completion-help: Completion Commands. +* minibuffer-completion-predicate: Completion Commands. +* minibuffer-completion-table: Completion Commands. +* minibuffer-depth: Minibuffer Misc. +* minibuffer-exit-hook: Minibuffer Misc. +* minibuffer-frame-plist: Initial Properties. +* minibuffer-help-form: Minibuffer Misc. +* minibuffer-history: Minibuffer History. +* minibuffer-local-completion-map <1>: Standard Keymaps. +* minibuffer-local-completion-map: Completion Commands. +* minibuffer-local-isearch-map: Standard Keymaps. +* minibuffer-local-map <1>: Standard Keymaps. +* minibuffer-local-map: Text from Minibuffer. +* minibuffer-local-must-match-map <1>: Standard Keymaps. +* minibuffer-local-must-match-map: Completion Commands. +* minibuffer-prompt: Minibuffer Misc. +* minibuffer-prompt-width: Minibuffer Misc. +* minibuffer-scroll-window: Minibuffer Misc. +* minibuffer-setup-hook: Minibuffer Misc. +* minibuffer-window: Minibuffer Misc. +* minibuffer-window-active-p: Minibuffer Misc. +* minimum window size: Resizing Windows. +* minor mode: Minor Modes. +* minor mode conventions: Minor Mode Conventions. +* minor-mode-alist: Modeline Variables. +* minor-mode-key-binding: Functions for Key Lookup. +* minor-mode-map-alist: Active Keymaps. +* misc-user-event-p: Event Predicates. +* mod: Arithmetic Operations. +* mode: Modes. +* mode help: Mode Help. +* mode hook: Major Mode Conventions. +* mode loading: Major Mode Conventions. +* mode variable: Minor Mode Conventions. +* mode-class property: Major Mode Conventions. +* mode-name: Modeline Variables. +* mode-popup-menu: Pop-Up Menus. +* mode-specific-map <1>: Standard Keymaps. +* mode-specific-map: Prefix Keys. +* modeline: Modeline Format. +* modeline construct: Modeline Data. +* modeline-buffer-identification: Modeline Variables. +* modeline-format: Modeline Data. +* modeline-map <1>: Standard Keymaps. +* modeline-map: Active Keymaps. +* modeline-modified: Modeline Variables. +* modeline-pointer-glyph: Mouse Pointer. +* modeline-process: Modeline Variables. +* modification flag (of buffer): Buffer Modification. +* modification of lists: Rearrangement. +* modification time, comparison of: Modification Time. +* modify-syntax-entry: Syntax Table Functions. +* modulus: Arithmetic Operations. +* momentary-string-display: Temporary Displays. +* mono-pixmap-image-instance-p: Image Instance Types. +* motion-event-p: Event Predicates. +* mouse cursor: Mouse Pointer. +* mouse pointer: Mouse Pointer. +* mouse-event-p: Event Predicates. +* mouse-grabbed-buffer: Active Keymaps. +* mouse-highlight-priority: Extents and Events. +* move-marker: Changing Markers. +* move-to-column: Columns. +* move-to-left-margin: Margins. +* move-to-window-line: Screen Lines. +* MS-DOS and file modes: Changing File Attributes. +* MS-DOS file types: Files and MS-DOS. +* MSWindows OLE: MSWindows OLE. +* multilingual string formatting: Formatting Strings. +* multiple windows: Basic Windows. +* named function: Function Names. +* NaN: Float Basics. +* narrow-to-page: Narrowing. +* narrow-to-region: Narrowing. +* narrowing: Narrowing. +* natnum-specifier-p: Specifier Types. +* natnump: Predicates on Numbers. +* natural numbers: Predicates on Numbers. +* nconc: Rearrangement. +* negative infinity: Float Basics. +* negative-argument: Prefix Command Arguments. +* network connection: Network. +* new file message: Subroutines of Visiting. +* newline <1>: Commands for Insertion. +* newline: Character Type. +* newline and Auto Fill mode: Commands for Insertion. +* newline in print: Output Functions. +* newline in strings: String Type. +* newline-and-indent: Mode-Specific Indent. +* next input: Peeking and Discarding. +* next-command-event: Reading One Event. +* next-event: Reading One Event. +* next-extent: Finding Extents. +* next-frame: Finding All Frames. +* next-history-element: Minibuffer Misc. +* next-matching-history-element: Minibuffer Misc. +* next-property-change: Property Search. +* next-screen-context-lines: Vertical Scrolling. +* next-single-property-change: Property Search. +* next-window: Cyclic Window Ordering. +* nil: Constant Variables. +* nil and lists: Cons Cells. +* nil in keymap: Key Lookup. +* nil in lists: Cons Cell Type. +* nil input stream: Input Streams. +* nil output stream: Output Streams. +* nil, uses of: nil and t. +* ninth: List Elements. +* nlistp: List-related Predicates. +* no-catch: Catch and Throw. +* no-redraw-on-reenter: Refresh Screen. +* nondirectory part (of file name): File Name Components. +* noninteractive: Batch Mode. +* noninteractive use: Batch Mode. +* nonlocal exits: Nonlocal Exits. +* nonprinting characters, reading: Quoted Character Input. +* nontext-pointer-glyph: Mouse Pointer. +* normal-mode: Auto Major Mode. +* not: Combining Conditions. +* not-modified: Buffer Modification. +* nothing-image-instance-p: Image Instance Types. +* nreverse: Rearrangement. +* nth: List Elements. +* nthcdr: List Elements. +* null: List-related Predicates. +* number equality: Comparison of Numbers. +* number-char-or-marker-p: Predicates on Markers. +* number-or-marker-p: Predicates on Markers. +* number-to-string: String Conversion. +* numberp: Predicates on Numbers. +* numbers: Numbers. +* numeric prefix: Formatting Strings. +* numeric prefix argument: Prefix Command Arguments. +* numeric prefix argument usage: Interactive Codes. +* obarray: Creating Symbols. +* obarray in completion: Basic Completion. +* objc-mode-map: Standard Keymaps. +* object: Lisp Data Types. +* object to string: Output Functions. +* object-plist: Object Plists. +* oblique: Font Instance Characteristics. +* obsolete buffer: Modification Time. +* occur-mode-map: Standard Keymaps. +* octal character code: Character Type. +* octal character input: Quoted Character Input. +* octal-escape-glyph: Redisplay Glyphs. +* OffiX DND: OffiX DND. +* old-eq: Equality Predicates. +* one-window-p: Splitting Windows. +* only-global-abbrevs: Defining Abbrevs. +* open-database: Connecting to a Database. +* open-dribble-file: Recording Input. +* open-network-stream: Network. +* open-termscript: Terminal Output. +* open parenthesis character: Syntax Class Table. +* operating system environment: System Environment. +* option descriptions: A Sample Variable Description. +* optional arguments: Argument List. +* options on command line: Command Line Arguments. +* or: Combining Conditions. +* order of extents: Extent Endpoints. +* ordering of windows, cyclic: Cyclic Window Ordering. +* other-buffer: The Buffer List. +* other-window: Cyclic Window Ordering. +* other-window-scroll-buffer: Vertical Scrolling. +* Outline mode: Substitution. +* output from processes: Output from Processes. +* output stream: Output Streams. +* outside margin: Annotation Basics. +* overflow: Integer Basics. +* overlay arrow: Overlay Arrow. +* overlay-arrow-position: Overlay Arrow. +* overlay-arrow-string: Overlay Arrow. +* overriding-local-map <1>: Standard Keymaps. +* overriding-local-map: Active Keymaps. +* overriding-terminal-local-map: Active Keymaps. +* overwrite-mode: Commands for Insertion. +* padding: Formatting Strings. +* page-delimiter: Standard Regexps. +* paired delimiter: Syntax Class Table. +* paragraph-separate: Standard Regexps. +* paragraph-start: Standard Regexps. +* parent of a keymap: Inheritance and Keymaps. +* parent process: Processes. +* parent, of extent: Extent Parents. +* parenthesis: Cons Cell Type. +* parenthesis depth: Parsing Expressions. +* parenthesis matching: Blinking. +* parenthesis syntax: Syntax Class Table. +* parse state: Parsing Expressions. +* parse-partial-sexp: Parsing Expressions. +* parse-sexp-ignore-comments: Parsing Expressions. +* parsing: Syntax Tables. +* partial files: Partial Files. +* passwd-echo: Reading a Password. +* passwd-invert-frame-when-keyboard-grabbed: Reading a Password. +* passwords, reading: Reading a Password. +* PATH environment variable: Subprocess Creation. +* path-separator: System Environment. +* pausing: Waiting. +* peeking at input: Peeking and Discarding. +* percent symbol in modeline: Modeline Data. +* perform-replace: Search and Replace. +* performance analysis: Coverage Testing. +* permanent local variable: Creating Buffer-Local. +* permission: File Attributes. +* pg-coding-system: libpq Lisp Variables. +* pg:authtype: libpq Lisp Variables. +* pg:client-encoding: libpq Lisp Variables. +* pg:cost-heap: libpq Lisp Variables. +* pg:cost-index: libpq Lisp Variables. +* pg:database: libpq Lisp Variables. +* pg:date-style: libpq Lisp Variables. +* pg:geqo: libpq Lisp Variables. +* pg:host: libpq Lisp Variables. +* pg:options: libpq Lisp Variables. +* pg:port: libpq Lisp Variables. +* pg:realm: libpq Lisp Variables. +* pg:tty: libpq Lisp Variables. +* pg:tz: libpq Lisp Variables. +* pg:user: libpq Lisp Variables. +* pgres::polling-active: libpq Lisp Symbols and DataTypes. +* pgres::polling-failed: libpq Lisp Symbols and DataTypes. +* pgres::polling-ok: libpq Lisp Symbols and DataTypes. +* pgres::polling-reading: libpq Lisp Symbols and DataTypes. +* pgres::polling-writing: libpq Lisp Symbols and DataTypes. +* pipes: Asynchronous Processes. +* play-sound: Beeping. +* play-sound-file: Beeping. +* plist: Property Lists. +* plist, symbol: Symbol Properties. +* plist-get: Working With Normal Plists. +* plist-member: Working With Normal Plists. +* plist-put: Working With Normal Plists. +* plist-remprop: Working With Normal Plists. +* plist-to-alist: Converting Plists To/From Alists. +* plists-eq <1>: Other Plists. +* plists-eq: Working With Normal Plists. +* plists-equal <1>: Other Plists. +* plists-equal: Working With Normal Plists. +* point: Point. +* point excursion: Excursions. +* point in window: Window Point. +* point with narrowing: Point. +* point-marker: Creating Markers. +* point-max: Point. +* point-max-marker: Creating Markers. +* point-min: Point. +* point-min-marker: Creating Markers. +* pointer (mouse): Mouse Pointer. +* pointer-glyph-p: Glyph Types. +* pointer-image-instance-p: Image Instance Types. +* pop-global-mark: The Mark. +* pop-mark: The Mark. +* pop-to-buffer: Displaying Buffers. +* pop-up menu: Pop-Up Menus. +* pop-up-frame-function: Choosing Window. +* pop-up-frame-plist: Choosing Window. +* pop-up-frames: Choosing Window. +* pop-up-windows: Choosing Window. +* popup-buffer-menu: Pop-Up Menus. +* popup-dialog-box: Dialog Box Functions. +* popup-menu: Pop-Up Menus. +* popup-menu-titles: Pop-Up Menus. +* popup-menu-up-p: Pop-Up Menus. +* popup-menubar-menu: Pop-Up Menus. +* popup-mode-menu: Pop-Up Menus. +* pos-visible-in-window-p: Window Start. +* position (in buffer): Positions. +* position argument: Interactive Codes. +* position in window: Window Point. +* position of frame: Size and Position. +* position of window: Position of Window. +* positive infinity: Float Basics. +* posix-looking-at: POSIX Regexps. +* posix-search-backward: POSIX Regexps. +* posix-search-forward: POSIX Regexps. +* posix-string-match: POSIX Regexps. +* post-command-hook: Command Overview. +* post-gc-hook: Garbage Collection. +* PostgreSQL: PostgreSQL Support. +* pq-binary-tuples: libpq Lisp Symbols and DataTypes. +* pq-clear: Other libpq Functions. +* pq-client-encoding: Other libpq Functions. +* pq-cmd-status: libpq Lisp Symbols and DataTypes. +* pq-cmd-tuples: libpq Lisp Symbols and DataTypes. +* pq-conn-defaults: Other libpq Functions. +* pq-connect-poll: Asynchronous Interface Functions. +* pq-connect-start: Asynchronous Interface Functions. +* pq-connectdb: Synchronous Interface Functions. +* pq-consume-input: Asynchronous Interface Functions. +* pq-env-2-encoding: Other libpq Functions. +* pq-exec: Synchronous Interface Functions. +* pq-finish: Other libpq Functions. +* pq-flush: Asynchronous Interface Functions. +* pq-fmod: libpq Lisp Symbols and DataTypes. +* pq-fname: libpq Lisp Symbols and DataTypes. +* pq-fnumber: libpq Lisp Symbols and DataTypes. +* pq-fsize: libpq Lisp Symbols and DataTypes. +* pq-ftype: libpq Lisp Symbols and DataTypes. +* pq-get-is-null: libpq Lisp Symbols and DataTypes. +* pq-get-length: libpq Lisp Symbols and DataTypes. +* pq-get-result: Asynchronous Interface Functions. +* pq-get-value: libpq Lisp Symbols and DataTypes. +* pq-is-busy: Asynchronous Interface Functions. +* pq-is-nonblocking: Asynchronous Interface Functions. +* pq-lo-close: Unimplemented libpq Functions. +* pq-lo-creat: Unimplemented libpq Functions. +* pq-lo-export: Large Object Support. +* pq-lo-import: Large Object Support. +* pq-lo-lseek: Unimplemented libpq Functions. +* pq-lo-open: Unimplemented libpq Functions. +* pq-lo-read: Unimplemented libpq Functions. +* pq-lo-tell: Unimplemented libpq Functions. +* pq-lo-unlink: Unimplemented libpq Functions. +* pq-lo-write: Unimplemented libpq Functions. +* pq-make-empty-pgresult: libpq Lisp Symbols and DataTypes. +* pq-nfields: libpq Lisp Symbols and DataTypes. +* pq-notifies: Synchronous Interface Functions. +* pq-ntuples: libpq Lisp Symbols and DataTypes. +* pq-oid-value: libpq Lisp Symbols and DataTypes. +* pq-pgconn: libpq Lisp Symbols and DataTypes. +* pq-res-status: libpq Lisp Symbols and DataTypes. +* pq-reset: Synchronous Interface Functions. +* pq-reset-cancel: Asynchronous Interface Functions. +* pq-reset-poll: Asynchronous Interface Functions. +* pq-reset-start: Asynchronous Interface Functions. +* pq-result-error-message: libpq Lisp Symbols and DataTypes. +* pq-result-status: libpq Lisp Symbols and DataTypes. +* pq-send-query: Asynchronous Interface Functions. +* pq-set-client-encoding: Other libpq Functions. +* pq-set-nonblocking: Asynchronous Interface Functions. +* PQdisplayTuples: Unimplemented libpq Functions. +* PQmblen: Unimplemented libpq Functions. +* PQprint: Unimplemented libpq Functions. +* PQprintTuples: Unimplemented libpq Functions. +* PQsetenv: Synchronous Interface Functions. +* PQsetenvAbort: Asynchronous Interface Functions. +* PQsetenvPoll: Asynchronous Interface Functions. +* PQsetenvStart: Asynchronous Interface Functions. +* PQsocket: Unimplemented libpq Functions. +* PQtrace: Unimplemented libpq Functions. +* PQuntrace: Unimplemented libpq Functions. +* pre-abbrev-expand-hook: Abbrev Expansion. +* pre-command-hook: Command Overview. +* pre-gc-hook: Garbage Collection. +* preceding-char: Near Point. +* precision of formatted numbers: Formatting Strings. +* predicates: Type Predicates. +* prefix argument: Prefix Command Arguments. +* prefix argument unreading: Peeking and Discarding. +* prefix command: Prefix Keys. +* prefix key: Prefix Keys. +* prefix-arg: Prefix Command Arguments. +* prefix-help-command: Help Functions. +* prefix-numeric-value: Prefix Command Arguments. +* preventing backtracking: Specification List. +* preventing prefix key: Key Lookup. +* previous complete subexpression: Parsing Expressions. +* previous-extent: Finding Extents. +* previous-frame: Finding All Frames. +* previous-history-element: Minibuffer Misc. +* previous-matching-history-element: Minibuffer Misc. +* previous-property-change: Property Search. +* previous-single-property-change: Property Search. +* previous-window: Cyclic Window Ordering. +* primitive: What Is a Function. +* primitive type: Lisp Data Types. +* primitive types: Primitive Types. +* primitive-undo: Undo. +* prin1: Output Functions. +* prin1-to-string: Output Functions. +* princ: Output Functions. +* print: Output Functions. +* print example: Output Streams. +* print name cell: Symbol Components. +* print-escape-newlines: Output Variables. +* print-gensym: Output Variables. +* print-help-return-message: Help Functions. +* print-length: Output Variables. +* print-level: Output Variables. +* print-readably <1>: Output Variables. +* print-readably: Printing in Edebug. +* print-string-length: Output Variables. +* printed representation: Printed Representation. +* printed representation for characters: Character Type. +* printing: Streams Intro. +* printing (Edebug): Printing in Edebug. +* printing circular structures: Printing in Edebug. +* printing floating-point numbers: Output Variables. +* printing limits: Output Variables. +* printing notation: Printing Notation. +* printing readably: Output Variables. +* printing uninterned symbols: Output Variables. +* priority of an extent: Intro to Extents. +* process: Processes. +* process filter: Filter Functions. +* process input: Input to Processes. +* process output: Output from Processes. +* process sentinel: Sentinels. +* process signals: Signals to Processes. +* process window size: Process Window Size. +* process-buffer: Process Buffers. +* process-command: Process Information. +* process-connection-type: Asynchronous Processes. +* process-environment: System Environment. +* process-event-p: Event Predicates. +* process-exit-status: Process Information. +* process-filter: Filter Functions. +* process-id: Process Information. +* process-kill-without-query: Deleting Processes. +* process-kill-without-query-p: Process Information. +* process-list: Process Information. +* process-mark: Process Buffers. +* process-name: Process Information. +* process-send-eof: Input to Processes. +* process-send-region: Input to Processes. +* process-send-string: Input to Processes. +* process-sentinel: Sentinels. +* process-status: Process Information. +* process-tty-name: Process Information. +* processp: Processes. +* profile.el: Compilation Tips. +* profiling: Compilation Tips. +* prog1: Sequencing. +* prog2: Sequencing. +* progn: Sequencing. +* program arguments: Subprocess Creation. +* program directories: Subprocess Creation. +* programmed completion: Programmed Completion. +* programming types: Programming Types. +* properties of strings: String Properties. +* properties of text: Text Properties. +* property list: Property Lists. +* property list cell (symbol): Symbol Components. +* property list, symbol: Symbol Properties. +* property lists vs association lists: Plists and Alists. +* property of an extent: Extent Properties. +* protected forms: Cleanups. +* provide: Named Features. +* providing features: Named Features. +* PTYs: Asynchronous Processes. +* punctuation character: Syntax Class Table. +* pure storage: Pure Storage. +* pure-bytes-used: Pure Storage. +* purecopy: Pure Storage. +* purify-flag: Pure Storage. +* push-mark: The Mark. +* put: Object Plists. +* put-char-table: Working With Char Tables. +* put-database: Working With a Database. +* put-range-table: Working With Range Tables. +* put-text-property: Changing Properties. +* putf: Other Plists. +* puthash: Working With Hash Tables. +* query-replace-history: Minibuffer History. +* query-replace-map <1>: Standard Keymaps. +* query-replace-map: Search and Replace. +* querying the user: Yes-or-No Queries. +* question mark in character constant: Character Type. +* quietly-read-abbrev-file: Abbrev Files. +* quit-flag: Quitting. +* quit-process: Signals to Processes. +* quitting: Quitting. +* quitting from infinite loop: Infinite Loops. +* quote: Quoting. +* quote character: Parsing Expressions. +* quoted character input: Quoted Character Input. +* quoted-insert suppression: Changing Key Bindings. +* quoting: Quoting. +* quoting characters in printing: Output Functions. +* quoting using apostrophe: Quoting. +* raise-frame: Raising and Lowering. +* raising a frame: Raising and Lowering. +* random: Random Numbers. +* random numbers: Random Numbers. +* range table type: Range Table Type. +* Range Tables: Range Tables. +* range-table-p: Range Tables. +* rassoc: Association Lists. +* rassq: Association Lists. +* raw prefix argument: Prefix Command Arguments. +* raw prefix argument usage: Interactive Codes. +* re-search-backward: Regexp Search. +* re-search-forward: Regexp Search. +* read: Input Functions. +* read command name: Interactive Call. +* read syntax: Printed Representation. +* read syntax for characters: Character Type. +* read-buffer: High-Level Completion. +* read-char: Reading One Event. +* read-command: High-Level Completion. +* read-expression: Object from Minibuffer. +* read-expression-history: Minibuffer History. +* read-expression-map: Standard Keymaps. +* read-file-name: Reading File Names. +* read-from-minibuffer: Text from Minibuffer. +* read-from-string: Input Functions. +* read-key-sequence: Key Sequence Input. +* read-minibuffer: Object from Minibuffer. +* read-only buffer: Read Only Buffers. +* read-only buffers in interactive: Using Interactive. +* read-passwd: Reading a Password. +* read-quoted-char: Quoted Character Input. +* read-quoted-char quitting: Quitting. +* read-shell-command-map: Standard Keymaps. +* read-string: Text from Minibuffer. +* read-variable: High-Level Completion. +* reading: Streams Intro. +* reading (Edebug): Reading in Edebug. +* reading interactive arguments: Interactive Codes. +* reading symbols: Creating Symbols. +* rearrangement of lists: Rearrangement. +* rebinding: Changing Key Bindings. +* receiving ToolTalk messages: Receiving Messages. +* recent-auto-save-p: Auto-Saving. +* recent-keys: Recording Input. +* recent-keys-ring-size: Recording Input. +* recenter: Vertical Scrolling. +* record command history: Interactive Call. +* recursion: Iteration. +* recursion-depth: Recursive Editing. +* recursive command loop: Recursive Editing. +* recursive editing level: Recursive Editing. +* recursive evaluation: Intro Eval. +* recursive-edit: Recursive Editing. +* redo: Undo. +* redraw-display: Refresh Screen. +* redraw-frame: Refresh Screen. +* redraw-modeline: Modeline Format. +* refresh display: Refresh Screen. +* regexp: Regular Expressions. +* regexp alternative: Syntax of Regexps. +* regexp grouping: Syntax of Regexps. +* regexp searching: Regexp Search. +* regexp-history: Minibuffer History. +* regexp-quote: Syntax of Regexps. +* regexps used standardly in editing: Standard Regexps. +* region argument: Interactive Codes. +* region, the: The Region. +* region-active-p: The Region. +* region-beginning: The Region. +* region-end: The Region. +* region-exists-p: The Region. +* register-alist: Registers. +* register-ccl-program: Calling CCL. +* register-tooltalk-pattern: Elisp Interface for Receiving Messages. +* registers: Registers. +* regular expression: Regular Expressions. +* regular expression searching: Regexp Search. +* reindent-then-newline-and-indent: Mode-Specific Indent. +* relabel-menu-item: Modifying Menus. +* relative file name: Relative File Names. +* remainder: Arithmetic Operations. +* remassoc: Association Lists. +* remassq: Association Lists. +* remhash: Working With Hash Tables. +* remove-database: Working With a Database. +* remove-face-property: Face Properties. +* remove-glyph-property: Glyph Properties. +* remove-hook: Hooks. +* remove-range-table: Working With Range Tables. +* remove-specifier: Other Specification Functions. +* remove-text-properties: Changing Properties. +* remprop: Object Plists. +* remrassoc: Association Lists. +* remrassq: Association Lists. +* rename-auto-save-file: Auto-Saving. +* rename-buffer: Buffer Names. +* rename-file: Changing File Attributes. +* renaming files: Changing File Attributes. +* repeated loading: Repeated Loading. +* replace bindings: Changing Key Bindings. +* replace characters: Substitution. +* replace-buffer-in-windows: Displaying Buffers. +* replace-match: Replacing Match. +* replacement: Search and Replace. +* repositioning format arguments: Formatting Strings. +* require: Named Features. +* require-final-newline: Saving Buffers. +* requiring features: Named Features. +* reset-char-table: Working With Char Tables. +* resize redisplay: Size and Position. +* rest arguments: Argument List. +* restriction (in a buffer): Narrowing. +* resume (cf. no-redraw-on-reenter): Refresh Screen. +* return: Character Type. +* return-tooltalk-message: Elisp Interface for Sending Messages. +* reveal-annotation: Annotation Properties. +* reverse: Building Lists. +* reversing a list: Rearrangement. +* revert-buffer: Reverting. +* revert-buffer-function: Reverting. +* revert-buffer-insert-file-contents-function: Reverting. +* right-gutter: Specifying a Gutter. +* right-gutter-visible-p: Other Gutter Variables. +* right-gutter-width: Other Gutter Variables. +* right-margin-width: Margin Primitives. +* right-toolbar: Specifying the Toolbar. +* right-toolbar-visible-p: Other Toolbar Variables. +* right-toolbar-width: Other Toolbar Variables. +* rm: Changing File Attributes. +* round: Numeric Conversions. +* rounding in conversions: Numeric Conversions. +* rounding without conversion: Rounding Operations. +* rplaca: Modifying Lists. +* rplacd: Modifying Lists. +* run time stack: Internals of Debugger. +* run-emacs-from-temacs: Building XEmacs. +* run-hooks: Hooks. +* runnable temacs: Building XEmacs. +* same-window-buffer-names: Choosing Window. +* same-window-regexps: Choosing Window. +* save-abbrevs: Abbrev Files. +* save-buffer: Saving Buffers. +* save-current-buffer: Excursions. +* save-excursion: Excursions. +* save-excursion (Edebug): Edebug Display Update. +* save-match-data: Saving Match Data. +* save-restriction: Narrowing. +* save-selected-frame: Input Focus. +* save-selected-window <1>: Excursions. +* save-selected-window: Selecting Windows. +* save-some-buffers: Saving Buffers. +* save-window-excursion: Window Configurations. +* saving text properties: Saving Properties. +* saving window information: Window Configurations. +* scan-lists: Parsing Expressions. +* scan-sexps: Parsing Expressions. +* scope: Variable Scoping. +* screen layout: Window Configuration Type. +* scroll-conservatively: Vertical Scrolling. +* scroll-down: Vertical Scrolling. +* scroll-left: Horizontal Scrolling. +* scroll-other-window: Vertical Scrolling. +* scroll-right: Horizontal Scrolling. +* scroll-step: Vertical Scrolling. +* scroll-up: Vertical Scrolling. +* scrollbar-pointer-glyph: Mouse Pointer. +* scrollbars: Scrollbars. +* scrolling vertically: Vertical Scrolling. +* search-backward: String Search. +* search-failed: String Search. +* search-forward: String Search. +* searching: Searching and Matching. +* searching and case: Searching and Case. +* searching for regexp: Regexp Search. +* second: List Elements. +* select-console: The Selected Console and Device. +* select-device: The Selected Console and Device. +* select-frame: Input Focus. +* select-frame-hook: Frame Hooks. +* select-window: Selecting Windows. +* selected frame: Input Focus. +* selected window: Basic Windows. +* selected-console: The Selected Console and Device. +* selected-device: The Selected Console and Device. +* selected-frame: Input Focus. +* selected-window: Selecting Windows. +* selecting a buffer: Current Buffer. +* selecting windows: Selecting Windows. +* selection (for X windows): X Selections. +* selection-pointer-glyph: Mouse Pointer. +* selective display: Selective Display. +* selective-display: Selective Display. +* selective-display-ellipses: Selective Display. +* self-evaluating form: Self-Evaluating Forms. +* self-insert-and-exit: Minibuffer Misc. +* self-insert-command: Commands for Insertion. +* self-insert-command override: Changing Key Bindings. +* self-insert-command, minor modes: Keymaps and Minor Modes. +* self-insertion: Commands for Insertion. +* send-string-to-terminal: Terminal Output. +* send-tooltalk-message: Elisp Interface for Sending Messages. +* sending signals: Signals to Processes. +* sending ToolTalk messages: Sending Messages. +* sentence-end: Standard Regexps. +* sentinel: Sentinels. +* sequence: Sequences Arrays Vectors. +* sequence length: Sequence Functions. +* sequencep: Sequence Functions. +* set: Setting Variables. +* set-annotation-action: Annotation Properties. +* set-annotation-data: Annotation Properties. +* set-annotation-down-glyph: Annotation Properties. +* set-annotation-face: Annotation Properties. +* set-annotation-glyph: Annotation Properties. +* set-annotation-layout: Annotation Properties. +* set-annotation-menu: Annotation Properties. +* set-auto-mode: Auto Major Mode. +* set-buffer: Current Buffer. +* set-buffer-auto-saved: Auto-Saving. +* set-buffer-major-mode: Auto Major Mode. +* set-buffer-menubar: Menubar. +* set-buffer-modified-p: Buffer Modification. +* set-case-syntax: Case Tables. +* set-case-syntax-delims: Case Tables. +* set-case-syntax-pair: Case Tables. +* set-case-table: Case Tables. +* set-category-table: Category Tables. +* set-charset-ccl-program: Charset Property Functions. +* set-coding-category-system: Detection of Textual Encoding. +* set-coding-priority-list: Detection of Textual Encoding. +* set-console-type-image-conversion-list: Image Instantiator Conversion. +* set-default: Default Value. +* set-default-file-modes: Changing File Attributes. +* set-default-gutter-position: Specifying a Gutter. +* set-default-toolbar-position: Specifying the Toolbar. +* set-device-baud-rate <1>: Terminal Output. +* set-device-baud-rate: Console and Device I/O. +* set-extent-begin-glyph: Extent Properties. +* set-extent-begin-glyph-layout: Extent Properties. +* set-extent-end-glyph: Extent Properties. +* set-extent-end-glyph-layout: Extent Properties. +* set-extent-endpoints: Extent Endpoints. +* set-extent-face: Extent Properties. +* set-extent-initial-redisplay-function: Extent Properties. +* set-extent-keymap: Extent Properties. +* set-extent-mouse-face: Extent Properties. +* set-extent-parent: Extent Parents. +* set-extent-priority: Extent Properties. +* set-extent-properties: Extent Properties. +* set-extent-property: Extent Properties. +* set-face-background: Face Convenience Functions. +* set-face-background-pixmap: Face Convenience Functions. +* set-face-font: Face Convenience Functions. +* set-face-foreground: Face Convenience Functions. +* set-face-property: Face Properties. +* set-face-underline-p: Face Convenience Functions. +* set-file-modes: Changing File Attributes. +* set-frame-configuration: Frame Configurations. +* set-frame-pointer: Mouse Pointer. +* set-frame-position: Size and Position. +* set-frame-properties: Property Access. +* set-frame-property: Property Access. +* set-frame-size: Size and Position. +* set-glyph-baseline: Glyph Convenience Functions. +* set-glyph-contrib-p: Glyph Convenience Functions. +* set-glyph-face: Glyph Convenience Functions. +* set-glyph-image: Glyph Convenience Functions. +* set-glyph-property: Glyph Properties. +* set-input-mode: Input Modes. +* set-keymap-default-binding: Inheritance and Keymaps. +* set-keymap-name: Creating Keymaps. +* set-keymap-parents: Inheritance and Keymaps. +* set-keymap-prompt: Other Keymap Functions. +* set-left-margin: Margins. +* set-mark: The Mark. +* set-marker: Changing Markers. +* set-match-data: Entire Match Data. +* set-menubar: Menubar. +* set-menubar-dirty-flag: Menubar. +* set-process-buffer: Process Buffers. +* set-process-filter: Filter Functions. +* set-process-sentinel: Sentinels. +* set-process-window-size: Process Window Size. +* set-recent-keys-ring-size: Recording Input. +* set-register: Registers. +* set-right-margin: Margins. +* set-specifier: Adding Specifications. +* set-standard-case-table: Case Tables. +* set-syntax-table: Syntax Table Functions. +* set-text-properties: Changing Properties. +* set-tooltalk-message-attribute: Elisp Interface for Sending Messages. +* set-visited-file-modtime: Modification Time. +* set-visited-file-name: Buffer File Name. +* set-weak-list-list: Weak Lists. +* set-window-buffer: Buffers and Windows. +* set-window-buffer-dedicated: Choosing Window. +* set-window-configuration: Window Configurations. +* set-window-dedicated-p: Choosing Window. +* set-window-hscroll: Horizontal Scrolling. +* set-window-point: Window Point. +* set-window-start: Window Start. +* setcar: Setcar. +* setcdr: Setcdr. +* setenv: System Environment. +* setplist: Object Plists. +* setprv: System Environment. +* setq: Setting Variables. +* setq-default: Default Value. +* sets: Sets And Lists. +* setting modes of files: Changing File Attributes. +* setting-constant: Constant Variables. +* seventh: List Elements. +* sexp motion: List Motion. +* shadowing of variables: Local Variables. +* shallow binding: Impl of Scope. +* shared-lisp-mode-map: Standard Keymaps. +* Shell mode modeline-format: Modeline Data. +* shell-command-history: Minibuffer History. +* shrink-window: Resizing Windows. +* shrink-window-horizontally: Resizing Windows. +* shrink-window-pixels: Resizing Windows. +* side effect: Intro Eval. +* signal: Signaling Errors. +* signal-error: Signaling Errors. +* signal-process: Signals to Processes. +* signaling errors: Signaling Errors. +* signals: Signals to Processes. +* sin: Math Functions. +* single-key-description: Describing Characters. +* sinh: Math Functions. +* sit-for: Waiting. +* site-init.el: Building XEmacs. +* site-load.el: Building XEmacs. +* site-run-file: Init File. +* site-start.el: Start-up Summary. +* sixth: List Elements. +* size of frame: Size and Position. +* size of window: Size of Window. +* skip-chars-backward: Skipping Characters. +* skip-chars-forward: Skipping Characters. +* skip-syntax-backward: Motion and Syntax. +* skip-syntax-forward: Motion and Syntax. +* skipping characters: Skipping Characters. +* skipping comments: Parsing Expressions. +* sleep-for: Waiting. +* Snarf-documentation: Accessing Documentation. +* sort: Rearrangement. +* sort-columns: Sorting. +* sort-fields: Sorting. +* sort-lines: Sorting. +* sort-numeric-fields: Sorting. +* sort-pages: Sorting. +* sort-paragraphs: Sorting. +* sort-regexp-fields: Sorting. +* sort-subr: Sorting. +* sorting lists: Rearrangement. +* sorting text: Sorting. +* sound: Beeping. +* sound-alist: Beeping. +* special: Major Mode Conventions. +* special form descriptions: A Sample Function Description. +* special form evaluation: Special Forms. +* special forms: Primitive Function Type. +* special forms (Edebug): Instrumenting. +* special forms for control structures: Control Structures. +* special-display-buffer-names: Choosing Window. +* special-display-frame-plist: Choosing Window. +* special-display-function: Choosing Window. +* special-display-popup-frame: Choosing Window. +* special-display-regexps: Choosing Window. +* specification (in a specifier): Specifiers In-Depth. +* specifier: Specifiers. +* specifier type: Specifier Type. +* specifier, domain: Specifiers In-Depth. +* specifier, fallback: Specifier Instancing. +* specifier, inst-list: Specifiers In-Depth. +* specifier, inst-pair: Specifiers In-Depth. +* specifier, instance: Specifiers In-Depth. +* specifier, instancing: Specifiers In-Depth. +* specifier, instantiator: Specifiers In-Depth. +* specifier, locale: Specifiers In-Depth. +* specifier, specification: Specifiers In-Depth. +* specifier, tag: Specifiers In-Depth. +* specifier, tag set: Specifiers In-Depth. +* specifier-fallback: Retrieving Specifications. +* specifier-instance: Specifier Instancing Functions. +* specifier-instance-from-inst-list: Specifier Instancing Functions. +* specifier-locale-type-from-locale: Other Specification Functions. +* specifier-spec-list: Retrieving Specifications. +* specifier-specs: Retrieving Specifications. +* specifier-tag-list: Specifier Tag Functions. +* specifier-tag-predicate: Specifier Tag Functions. +* specifier-type: Specifier Types. +* specifierp: Specifiers. +* speedups: Compilation Tips. +* splicing (with backquote): Backquote. +* split-height-threshold: Choosing Window. +* split-line: Commands for Insertion. +* split-path: Regexp Search. +* split-string: Regexp Search. +* split-window: Splitting Windows. +* split-window-horizontally: Splitting Windows. +* split-window-vertically: Splitting Windows. +* splitting windows: Splitting Windows. +* sqrt: Math Functions. +* stable sort: Rearrangement. +* standard regexps used in editing: Standard Regexps. +* standard-case-table: Case Tables. +* standard-category-table: Category Tables. +* standard-input: Input Functions. +* standard-output: Output Variables. +* standard-syntax-table: Standard Syntax Tables. +* standards of coding style: Tips. +* start up of XEmacs: Start-up Summary. +* start-process: Asynchronous Processes. +* start-process-shell-command: Asynchronous Processes. +* startup.el: Start-up Summary. +* stop points: Using Edebug. +* stop-process: Signals to Processes. +* stopping an infinite loop: Infinite Loops. +* stopping on events: Global Break Condition. +* store-match-data: Entire Match Data. +* stream (for printing): Output Streams. +* stream (for reading): Input Streams. +* string: Creating Strings. +* string equality: Text Comparison. +* string in keymap: Key Lookup. +* string input stream: Input Streams. +* string length: Sequence Functions. +* string length, maximum when printing: Output Variables. +* string properties: String Properties. +* string search: String Search. +* string to character: String Conversion. +* string to number: String Conversion. +* string to object: Input Functions. +* string, writing a doc string: Documentation Basics. +* string-equal: Text Comparison. +* string-lessp: Text Comparison. +* string-match: Regexp Search. +* string-modified-tick: Modifying Strings. +* string-to-char: String Conversion. +* string-to-int: String Conversion. +* string-to-number: String Conversion. +* string<: Text Comparison. +* string=: Text Comparison. +* stringp: Predicates for Strings. +* strings: Strings and Characters. +* strings, formatting them: Formatting Strings. +* strings, modifying: Modifying Strings. +* string quote: Syntax Class Table. +* subprocess: Processes. +* subr: What Is a Function. +* subrp: What Is a Function. +* subsidiary-coding-system: Basic Coding System Functions. +* subst-char-in-region: Substitution. +* substitute-command-keys: Keys in Documentation. +* substitute-in-file-name: File Name Expansion. +* substitute-key-definition: Changing Key Bindings. +* substituting keys in documentation: Keys in Documentation. +* substring: Creating Strings. +* subwindow type: Subwindow Type. +* subwindow-image-instance-p: Image Instance Types. +* subwindowp: Subwindows. +* suppress-keymap: Changing Key Bindings. +* suspend (cf. no-redraw-on-reenter): Refresh Screen. +* suspend evaluation: Recursive Editing. +* suspend-emacs: Suspending XEmacs. +* suspend-hook: Suspending XEmacs. +* suspend-resume-hook: Suspending XEmacs. +* suspending XEmacs: Suspending XEmacs. +* switch-to-buffer: Displaying Buffers. +* switch-to-buffer-other-window: Displaying Buffers. +* switches on command line: Command Line Arguments. +* switching to a buffer: Displaying Buffers. +* symbol: Symbols. +* symbol components: Symbol Components. +* symbol equality: Creating Symbols. +* symbol evaluation: Symbol Forms. +* symbol function indirection: Function Indirection. +* symbol in keymap: Key Lookup. +* symbol name hashing: Creating Symbols. +* symbol-function: Function Cells. +* symbol-name: Creating Symbols. +* symbol-plist: Object Plists. +* symbol-value: Accessing Variables. +* symbolp: Symbols. +* symbol constituent: Syntax Class Table. +* synchronous subprocess: Synchronous Processes. +* syntax classes: Syntax Descriptors. +* syntax descriptor: Syntax Descriptors. +* syntax error (Edebug): Backtracking. +* syntax flags: Syntax Flags. +* syntax for characters: Character Type. +* syntax table: Syntax Tables. +* syntax table example: Example Major Modes. +* syntax table internals: Syntax Table Internals. +* syntax tables in modes: Major Mode Conventions. +* syntax-table: Syntax Table Functions. +* syntax-table-p: Syntax Basics. +* system-configuration: System Environment. +* system-name: System Environment. +* system-type: System Environment. +* t: Constant Variables. +* t and truth: nil and t. +* t input stream: Input Streams. +* t output stream: Output Streams. +* tab: Character Type. +* tab deletion: Deletion. +* tab-stop-list: Indent Tabs. +* tab-to-tab-stop: Indent Tabs. +* tab-width: Usual Display. +* tabs stops for indentation: Indent Tabs. +* tag (in a specifier): Specifiers In-Depth. +* tag on run time stack: Catch and Throw. +* tag set (in a specifier): Specifiers In-Depth. +* tan: Math Functions. +* tanh: Math Functions. +* TCP: Network. +* temacs: Building XEmacs. +* temp-buffer-show-function: Temporary Displays. +* temp-directory: Unique File Names. +* tenth: List Elements. +* TERM environment variable: Terminal-Specific. +* term-file-prefix: Terminal-Specific. +* term-setup-hook: Terminal-Specific. +* Termcap: Terminal-Specific. +* terminal frame <1>: Frames. +* terminal frame: Basic Windows. +* terminal input: Terminal Input. +* terminal input modes: Input Modes. +* terminal output: Terminal Output. +* terminal-device: Console Types and Device Classes. +* terminal-specific initialization: Terminal-Specific. +* terminate keyboard macro: Peeking and Discarding. +* termscript file: Terminal Output. +* terpri: Output Functions. +* testing types: Type Predicates. +* text: Text. +* text files and binary files: Files and MS-DOS. +* text insertion: Insertion. +* text parsing: Syntax Tables. +* text properties: Text Properties. +* text properties in files: Saving Properties. +* text-char-description: Describing Characters. +* text-image-instance-p: Image Instance Types. +* text-mode-abbrev-table: Standard Abbrev Tables. +* text-mode-map: Standard Keymaps. +* text-mode-syntax-table: Standard Syntax Tables. +* text-pointer-glyph: Mouse Pointer. +* text-properties-at: Examining Properties. +* text-property-any: Property Search. +* text-property-not-all: Property Search. +* third: List Elements. +* this-command: Command Loop Info. +* this-command-keys: Command Loop Info. +* throw: Catch and Throw. +* throw example: Recursive Editing. +* tiled windows: Basic Windows. +* timeout-event-p: Event Predicates. +* timing programs: Compilation Tips. +* tips: Tips. +* toggle-read-only: Read Only Buffers. +* toolbar: Toolbar. +* toolbar button type: Toolbar Button Type. +* toolbar-buttons-captioned-p: Other Toolbar Variables. +* toolbar-make-button-list: Toolbar Descriptor Format. +* toolbar-map <1>: Standard Keymaps. +* toolbar-map: Active Keymaps. +* toolbar-pointer-glyph: Mouse Pointer. +* toolbar-specifier-p <1>: Specifier Types. +* toolbar-specifier-p: Specifying the Toolbar. +* ToolTalk: ToolTalk Support. +* ToolTalk message: Sending Messages. +* ToolTalk pattern: Receiving Messages. +* top-gutter: Specifying a Gutter. +* top-gutter-height: Other Gutter Variables. +* top-gutter-visible-p: Other Gutter Variables. +* top-level: Recursive Editing. +* top-level form: Loading. +* top-toolbar: Specifying the Toolbar. +* top-toolbar-height: Other Toolbar Variables. +* top-toolbar-visible-p: Other Toolbar Variables. +* tq-close: Transaction Queues. +* tq-create: Transaction Queues. +* tq-enqueue: Transaction Queues. +* tracing: Tracing. +* transaction queue: Transaction Queues. +* transcendental functions: Math Functions. +* translate-region: Substitution. +* translating input events: Translating Input. +* transpose-regions: Transposition. +* true: nil and t. +* truename (of file): Truenames. +* truncate: Numeric Conversions. +* truncate-lines: Truncation. +* truncate-partial-width-windows: Truncation. +* truncation-glyph: Redisplay Glyphs. +* truth value: nil and t. +* try-completion: Basic Completion. +* two's complement: Integer Basics. +* type: Lisp Data Types. +* type checking: Type Predicates. +* type predicates: Type Predicates. +* type-of: Type Predicates. +* unbinding keys: Key Binding Commands. +* undefined: Functions for Key Lookup. +* undefined in keymap: Key Lookup. +* undefined key: Keymap Terminology. +* undo avoidance: Substitution. +* undo-boundary: Undo. +* undo-limit: Maintaining Undo. +* undo-strong-limit: Maintaining Undo. +* unexec: Building XEmacs. +* unhandled-file-name-directory: Magic File Names. +* unintern: Creating Symbols. +* uninterned symbol: Creating Symbols. +* uninterned symbols, printing: Output Variables. +* unique extents: Duplicable Extents. +* universal-argument: Prefix Command Arguments. +* unload-feature: Unloading. +* unloading: Unloading. +* unlock-buffer: File Locks. +* unmap-frame-hook: Frame Hooks. +* unread-command-event: Peeking and Discarding. +* unread-command-events: Peeking and Discarding. +* unreading: Input Streams. +* unregister-tooltalk-pattern: Elisp Interface for Receiving Messages. +* unwind-protect: Cleanups. +* unwinding: Cleanups. +* up-list: List Motion. +* upcase: Character Case. +* upcase-region: Case Changes. +* upcase-word: Case Changes. +* update display: Refresh Screen. +* update-directory-autoloads: Autoload. +* update-file-autoloads: Autoload. +* upper case: Character Case. +* upper case key sequence: Key Sequence Input. +* use-global-map: Active Keymaps. +* use-hard-newlines: Filling. +* use-left-overflow: Margin Primitives. +* use-local-map: Active Keymaps. +* use-right-overflow: Margin Primitives. +* user name completion subroutines: User Name Completion. +* user option: Defining Variables. +* user-defined error: Error Symbols. +* user-full-name: User Identification. +* user-home-directory: User Identification. +* user-login-name: User Identification. +* user-mail-address: User Identification. +* user-name-all-completions: User Name Completion. +* user-name-completion: User Name Completion. +* user-name-completion-1: User Name Completion. +* user-real-login-name: User Identification. +* user-real-uid: User Identification. +* user-uid: User Identification. +* user-variable-p: Defining Variables. +* user-variable-p example: High-Level Completion. +* valid-char-table-type-p: Char Table Types. +* valid-char-table-value-p: Working With Char Tables. +* valid-device-class-p: Console Types and Device Classes. +* valid-device-type-p: Console Types and Device Classes. +* valid-glyph-type-p: Glyph Types. +* valid-image-instance-type-p: Image Instance Types. +* valid-image-instantiator-format-p: Image Specifiers. +* valid-inst-list-p: Specifier Validation Functions. +* valid-instantiator-p: Specifier Validation Functions. +* valid-plist-p: Property Lists. +* valid-spec-list-p: Specifier Validation Functions. +* valid-specifier-domain-p: Specifier Validation Functions. +* valid-specifier-locale-p: Specifier Validation Functions. +* valid-specifier-locale-type-p: Specifier Validation Functions. +* valid-specifier-tag-p <1>: Specifier Validation Functions. +* valid-specifier-tag-p: Specifier Tag Functions. +* valid-specifier-tag-set-p: Specifier Tag Functions. +* valid-specifier-type-p: Specifier Validation Functions. +* value cell: Symbol Components. +* value of expression: Evaluation. +* values: Eval. +* variable: Variables. +* variable aliases: Variable Aliases. +* variable definition: Defining Variables. +* variable descriptions: A Sample Variable Description. +* variable limit error: Local Variables. +* variable-alias: Variable Aliases. +* variable-documentation: Documentation Basics. +* variable-obsoleteness-doc: Obsoleteness. +* variables, buffer-local: Buffer-Local Variables. +* variables, indirect: Variable Aliases. +* vc-mode: Modeline Variables. +* vconcat: Vector Functions. +* vector <1>: Vector Functions. +* vector: Vectors. +* vector evaluation: Self-Evaluating Forms. +* vector length: Sequence Functions. +* vectorp: Vector Functions. +* verify-visited-file-modtime: Modification Time. +* version number (in file name): File Name Components. +* version-control: Numbered Backups. +* vertical scrolling: Vertical Scrolling. +* vertical tab: Character Type. +* vertical-motion: Screen Lines. +* vertical-motion-pixels: Screen Lines. +* view-file: Visiting Functions. +* view-mode-map: Standard Keymaps. +* view-register: Registers. +* visible frame: Visibility of Frames. +* visible-bell: Beeping. +* visible-frame-list: Finding All Frames. +* visited file: Buffer File Name. +* visited file mode: Auto Major Mode. +* visited-file-modtime: Modification Time. +* visiting files: Visiting Files. +* void function: Function Indirection. +* void function cell: Function Cells. +* void variable: Void Variables. +* void-function: Function Cells. +* void-variable: Void Variables. +* waiting: Waiting. +* waiting for command key input: Peeking and Discarding. +* waiting-for-user-input-p: Sentinels. +* wakeup: Subprocess Creation. +* walk-windows: Cyclic Window Ordering. +* weak hash table: Weak Hash Tables. +* weak list: Weak Lists. +* weak list type: Weak List Type. +* weak-list-list: Weak Lists. +* weak-list-p: Weak Lists. +* weak-list-type: Weak Lists. +* where-is-internal: Scanning Keymaps. +* while: Iteration. +* whitespace: Character Type. +* whitespace character: Syntax Class Table. +* widen: Narrowing. +* widening: Narrowing. +* window: Basic Windows. +* window configuration (Edebug): Edebug Display Update. +* window configurations: Window Configurations. +* window excursions: Excursions. +* window ordering, cyclic: Cyclic Window Ordering. +* window point: Window Point. +* window position <1>: Position of Window. +* window position: Window Point. +* window resizing: Resizing Windows. +* window size: Size of Window. +* window size, changing: Resizing Windows. +* window splitting: Splitting Windows. +* window system types: Window-System Types. +* window top line: Window Start. +* window-buffer: Buffers and Windows. +* window-configuration-p: Window Configurations. +* window-dedicated-p: Choosing Window. +* window-displayed-text-pixel-height: Size of Window. +* window-end: Window Start. +* window-frame: Frames and Windows. +* window-height: Size of Window. +* window-highest-p: Position of Window. +* window-hscroll: Horizontal Scrolling. +* window-left-margin-pixel-width: Margin Primitives. +* window-live-p: Deleting Windows. +* window-lowest-p: Position of Window. +* window-min-height: Resizing Windows. +* window-min-width: Resizing Windows. +* window-minibuffer-p: Minibuffer Misc. +* window-pixel-edges: Position of Window. +* window-pixel-height: Size of Window. +* window-pixel-width: Size of Window. +* window-point: Window Point. +* window-right-margin-pixel-width: Margin Primitives. +* window-setup-hook: Terminal-Specific. +* window-size-change-functions: Resizing Windows. +* window-start: Window Start. +* window-system objects: Faces and Window-System Objects. +* window-text-area-pixel-edges: Position of Window. +* window-text-area-pixel-height: Size of Window. +* window-text-area-pixel-width: Size of Window. +* window-width: Size of Window. +* windowp: Basic Windows. +* windows, controlling precisely: Buffers and Windows. +* with-current-buffer: Excursions. +* with-output-to-temp-buffer: Temporary Displays. +* with-selected-frame: Input Focus. +* with-temp-file: Excursions. +* word search: String Search. +* word-search-backward: String Search. +* word-search-forward: String Search. +* words-include-escapes: Word Motion. +* word constituent: Syntax Class Table. +* write-abbrev-file: Abbrev Files. +* write-char: Output Functions. +* write-contents-hooks: Saving Buffers. +* write-file: Saving Buffers. +* write-file-hooks: Saving Buffers. +* write-region: Writing to Files. +* write-region-annotate-functions: Saving Properties. +* writing a documentation string: Documentation Basics. +* wrong-number-of-arguments: Argument List. +* wrong-type-argument: Type Predicates. +* X: X-Windows. +* X resource type: X Resource Type. +* X window frame: Frames. +* x-allow-sendevents: X Miscellaneous. +* x-bitmap-file-path <1>: X Miscellaneous. +* x-bitmap-file-path: Image Specifiers. +* x-debug-events: X Miscellaneous. +* x-debug-mode: X Miscellaneous. +* x-disown-selection: X Selections. +* x-display-visual-class: Server Data. +* x-emacs-application-class: Resources. +* x-find-larger-font: Font Instance Size. +* x-find-smaller-font: Font Instance Size. +* x-font-size: Font Instance Size. +* x-get-cutbuffer: X Selections. +* x-get-resource: Resources. +* x-get-selection: X Selections. +* x-grab-keyboard: Grabs. +* x-grab-pointer: Grabs. +* x-library-search-path: X Miscellaneous. +* x-make-font-bold: Font Instance Characteristics. +* x-make-font-bold-italic: Font Instance Characteristics. +* x-make-font-italic: Font Instance Characteristics. +* x-make-font-unbold: Font Instance Characteristics. +* x-make-font-unitalic: Font Instance Characteristics. +* x-own-selection: X Selections. +* x-put-resource: Resources. +* x-server-vendor: Server Data. +* x-server-version: Server Data. +* x-set-frame-icon-pixmap: Frame Titles. +* x-store-cutbuffer: X Selections. +* x-ungrab-keyboard: Grabs. +* x-ungrab-pointer: Grabs. +* x-valid-keysym-name-p: X Miscellaneous. +* x-window-id: X Miscellaneous. +* X-Windows: X-Windows. +* XEmacs event standard notation: Describing Characters. +* xpm-color-symbols: Image Specifiers. +* y-or-n-p: Yes-or-No Queries. +* y-or-n-p-maybe-dialog-box: Yes-or-No Queries. +* yank: Yank Commands. +* yank suppression: Changing Key Bindings. +* yank-pop: Yank Commands. +* yes-or-no questions: Yes-or-No Queries. +* yes-or-no-p: Yes-or-No Queries. +* yes-or-no-p-dialog-box: Yes-or-No Queries. +* yes-or-no-p-maybe-dialog-box: Yes-or-No Queries. +* zero-length extent: Extent Endpoints. +* zerop: Predicates on Numbers. +* zmacs-activate-region: The Region. +* zmacs-activate-region-hook: The Region. +* zmacs-deactivate-region: The Region. +* zmacs-deactivate-region-hook: The Region. +* zmacs-region-stays: The Region. +* zmacs-regions: The Region. +* zmacs-update-region: The Region. +* zmacs-update-region-hook: The Region. +* | in regexp: Syntax of Regexps. + + diff --git a/info/xemacs.info-22 b/info/xemacs.info-22 new file mode 100644 index 0000000..912f44b --- /dev/null +++ b/info/xemacs.info-22 @@ -0,0 +1,795 @@ +This is ../info/xemacs.info, produced by makeinfo version 4.0 from +xemacs/xemacs.texi. + +INFO-DIR-SECTION XEmacs Editor +START-INFO-DIR-ENTRY +* XEmacs: (xemacs). XEmacs Editor. +END-INFO-DIR-ENTRY + + This file documents the XEmacs editor. + + Copyright (C) 1985, 1986, 1988 Richard M. Stallman. Copyright (C) +1991, 1992, 1993, 1994 Lucid, Inc. Copyright (C) 1993, 1994 Sun +Microsystems, Inc. Copyright (C) 1995 Amdahl Corporation. + + Permission is granted to make and distribute verbatim copies of this +manual provided the copyright notice and this permission notice are +preserved on all copies. + + Permission is granted to copy and distribute modified versions of +this manual under the conditions for verbatim copying, provided also +that the sections entitled "The GNU Manifesto", "Distribution" and "GNU +General Public License" are included exactly as in the original, and +provided that the entire resulting derived work is distributed under the +terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the sections entitled "The GNU Manifesto", +"Distribution" and "GNU General Public License" may be included in a +translation approved by the author instead of in the original English. + + +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. + + +File: xemacs.info, Node: Concept Index, Next: Frame, Prev: Variable Index, Up: Top + +Concept Index +************* + +* Menu: + +* .mailrc file: Mail Headers. +* // in file name: Minibuffer File. +* Abbrev mode: Minor Modes. +* abbrevs: Abbrevs. +* aborting: Quitting. +* accumulating text: Accumulating Text. +* active fields (customization buffer): Customization Groups. +* active regions: Active Regions. +* adding menu items: Menu Customization. +* adding menus: Menu Customization. +* againformation: Dissociated Press. +* Apps menu <1>: Apps Menu. +* Apps menu: Pull-down Menus. +* apropos: Apropos. +* architecture-specific directories: Startup Paths. +* arguments (from shell): Command Switches. +* ASCII: Intro to Keystrokes. +* Asm mode: Asm Mode. +* astronomical day numbers: Calendar Systems. +* audible bell, changing: Audible Bell. +* Auto Delete Selection menu item: Options Menu. +* Auto Fill mode <1>: Minor Modes. +* Auto Fill mode <2>: Comments. +* Auto Fill mode: Auto Fill. +* Auto-Save mode: Auto Save. +* autoload: Loading. +* backup file: Backup. +* batch mode: Command Switches. +* bell, changing: Audible Bell. +* binary packages: Package Terminology. +* binding: Commands. +* blank lines <1>: Comments. +* blank lines: Blank Lines. +* body lines (Outline mode): Outline Format. +* bold font: Face Customization. +* bookmarks: Bookmarks. +* boredom: Amusements. +* buffer: Frame. +* buffer menu: Several Buffers. +* buffers: Buffers. +* Buffers menu <1>: Buffers Menu. +* Buffers menu: Pull-down Menus. +* Buffers Menu Length... menu item: Options Menu. +* Buffers Sub-Menus menu item: Options Menu. +* buggestion: Dissociated Press. +* bugs: Bugs. +* byte code: Compiling Libraries. +* C: Programs. +* C mode: Program Modes. +* calendar: Calendar/Diary. +* calendar and LaTeX: LaTeX Calendar. +* calendar, first day of week: Move to Beginning or End. +* candle lighting times: Sexp Diary Entries. +* case conversion <1>: Case. +* case conversion: Fixing Case. +* Case Sensitive Search menu item: Options Menu. +* centering: Fill Commands. +* change log: Change Log. +* changing buffers: Select Buffer. +* changing menu items: Menu Customization. +* character set: Intro to Keystrokes. +* checking in files: Concepts of VC. +* checking out files: Concepts of VC. +* Chinese: Mule. +* Chinese calendar: Calendar Systems. +* Clear menu item: Edit Menu. +* clipboard selections: X Clipboard Selection. +* coding systems: Coding Systems. +* command <1>: Key Bindings. +* command: Commands. +* command history: Repetition. +* command line arguments: Command Switches. +* command name: Key Bindings. +* comments: Comments. +* comparing files: Comparing Files. +* compilation errors: Compilation. +* compiling files: Compilation. +* completion: Completion. +* completion (symbol names): Lisp Completion. +* continuation line: Continuation Lines. +* Control-Meta: Lists. +* Coptic calendar: Calendar Systems. +* Copy menu item: Edit Menu. +* copying files: Misc File Ops. +* copying text <1>: Accumulating Text. +* copying text: Yanking. +* core distribution: Using Packages. +* crashes: Auto Save. +* creating directories: File Names. +* creating files: Visiting. +* current buffer: Buffers. +* current stack frame: Lisp Debug. +* cursor <1>: Basic. +* cursor: Point. +* customization <1>: Customization. +* customization <2>: Lisp Indent. +* customization: Commands. +* customization buffer: Easy Customization. +* customization groups: Customization Groups. +* customizing faces: Face Customization. +* cut buffers: X Selection Commands. +* Cut menu item: Edit Menu. +* cutting: Killing. +* day of year: General Calendar. +* daylight savings time: Daylight Savings. +* debugger: Lisp Debug. +* default argument: Minibuffer. +* defuns: Defuns. +* Delete Frame menu item: File Menu. +* deleting menu items: Menu Customization. +* deletion <1>: Killing. +* deletion: Basic. +* deletion (of files) <1>: Misc File Ops. +* deletion (of files): Dired. +* diary: Diary. +* diary buffer: Fancy Diary Display. +* diary file: Format of Diary File. +* ding: Audible Bell. +* directories: Startup Paths. +* directory hierarchies: Startup Paths. +* directory listing: ListDir. +* Dired: Dired. +* disabled command: Disabling. +* disabling menu items: Menu Customization. +* Distribution: License. +* doctor: Total Frustration. +* double slash in file name: Minibuffer File. +* drastic changes: Reverting. +* dribble file: Bugs. +* early package hierarchies: Startup Paths. +* echo area: Echo Area. +* Edit menu <1>: Edit Menu. +* Edit menu: Pull-down Menus. +* editable fields (customization buffer): Customization Groups. +* editing level, recursive <1>: Quitting. +* editing level, recursive: Recursive Edit. +* EDT: Emulation. +* Eliza: Total Frustration. +* Emacs initialization file: Init File. +* Emacs-Lisp mode: Lisp Eval. +* enabling menu items: Menu Customization. +* encoding of characters: Mule. +* End Macro Recording menu item: Edit Menu. +* entering Emacs: Entering Emacs. +* entering XEmacs: Entering Emacs. +* environment: Single Shell. +* error log: Compilation. +* etags program: Create Tags Table. +* Ethiopic calendar: Calendar Systems. +* Execute Last Macro menu item: Edit Menu. +* Exit Emacs menu item: File Menu. +* exiting <1>: Recursive Edit. +* exiting: Exiting. +* expansion (of abbrevs): Abbrevs. +* expression: Lists. +* file dates: Interlocking. +* file directory: ListDir. +* File menu <1>: File Menu. +* File menu: Pull-down Menus. +* file names: File Names. +* file protection: Interlocking. +* files <1>: Visiting. +* files <2>: Files. +* files: Basic. +* fill prefix: Fill Prefix. +* filling: Filling. +* Font menu item: Options Menu. +* fonts and faces: Face Customization. +* formfeed: Pages. +* Fortran mode: Fortran. +* frame: Frame. +* French Revolutionary calendar: Calendar Systems. +* function <1>: Key Bindings. +* function: Commands. +* General Public License: License. +* global keymap: Keymaps. +* global substitution: Replace. +* graphic characters: Basic. +* Greek: Mule. +* Gregorian calendar: Other Calendars. +* grinding: Grinding. +* hardcopy: Hardcopy. +* header (TeX mode): TeX Print. +* headers (of mail message): Mail Headers. +* heading lines (Outline mode): Outline Format. +* Hebrew calendar: Calendar Systems. +* help: Help. +* Help menu <1>: Help Menu. +* Help menu: Pull-down Menus. +* hierarchies: Startup Paths. +* history of commands: Repetition. +* history of minibuffer input: Minibuffer History. +* holiday forms: Holiday Customizing. +* holidays: Holidays. +* horizontal scrolling: Horizontal Scrolling. +* ignoriginal: Dissociated Press. +* indentation <1>: Comments. +* indentation <2>: Grinding. +* indentation: Indentation. +* inferior process: Compilation. +* Info: Misc Help. +* init file: Init File. +* input methods: Input Methods. +* Insert File... menu item: File Menu. +* insertion: Basic. +* international scripts: Mule. +* interval operator (in regexps): Etags Regexps. +* invisible lines: Outline Mode. +* IPA: Mule. +* Islamic calendar: Calendar Systems. +* ISO commercial calendar: Calendar Systems. +* italic font: Face Customization. +* Japanese: Mule. +* Julian calendar: Calendar Systems. +* Julian day numbers: Calendar Systems. +* justification: Fill Commands. +* key rebinding, permanent: Init File. +* key rebinding, this session: Rebinding. +* keyboard macros: Keyboard Macros. +* keycode: Super and Hyper Keys. +* keymap <1>: Keymaps. +* keymap: Commands. +* keystroke: Intro to Keystrokes. +* keysym: Intro to Keystrokes. +* keysyms: Super and Hyper Keys. +* Kill Buffer menu item: File Menu. +* kill ring: Yanking. +* killing: Killing. +* killing Emacs: Exiting. +* Korean: Mule. +* language environments: Language Environments. +* last package hierarchies: Startup Paths. +* late package hierarchies: Startup Paths. +* LaTeX: TeX Mode. +* libraries: Lisp Libraries. +* license to copy XEmacs: License. +* line number: Position Info. +* Lisp: Programs. +* Lisp mode: Program Modes. +* list: Lists. +* loading libraries: Loading. +* loading Lisp code: Lisp Libraries. +* local keymap: Keymaps. +* local variables: Locals. +* local variables in files: File Variables. +* locking and version control: Concepts of VC. +* log entry: Editing with VC. +* mail <1>: Reading Mail. +* mail: Sending Mail. +* major modes: Major Modes. +* make: Compilation. +* manuals, on-line: Misc Help. +* mark: Mark. +* mark ring <1>: Mark and Region. +* mark ring: Mark Ring. +* Markov chain: Dissociated Press. +* master file: Concepts of VC. +* matching parentheses: Matching. +* Mayan calendar: Calendar Systems. +* Mayan calendar round: Mayan Calendar. +* Mayan haab calendar: Mayan Calendar. +* Mayan long count: Mayan Calendar. +* Mayan tzolkin calendar: Mayan Calendar. +* menus <1>: Change Window. +* menus: Pull-down Menus. +* message <1>: Reading Mail. +* message: Sending Mail. +* Meta: Words. +* minibuffer <1>: Keymaps. +* minibuffer <2>: M-x. +* minibuffer: Minibuffer. +* minibuffer history: Minibuffer History. +* minor modes: Minor Modes. +* mistakes, correcting <1>: Fixit. +* mistakes, correcting: Undo. +* mocklisp: Mocklisp. +* mode hook: Program Modes. +* mode line <1>: Minor Modes. +* mode line: Mode Line. +* mode, Term: Term Mode. +* modified (buffer): Visiting. +* modifier key: Intro to Keystrokes. +* modifier mapping: Super and Hyper Keys. +* moon, phases of: Lunar Phases. +* mouse operations: Additional Mouse Operations. +* mouse selection: Mouse Selection. +* moving inside the calendar: Calendar Motion. +* moving text: Yanking. +* MULE: Mule. +* multi-frame XEmacs: XEmacs under X. +* multibyte characters: Mule. +* named configurations (RCS): Snapshot Caveats. +* narrowing: Narrowing. +* New Frame menu item: File Menu. +* newline: Basic. +* non-incremental search: Non-Incremental Search. +* nroff: Nroff Mode. +* numeric arguments: Arguments. +* omer count: Sexp Diary Entries. +* on-line manuals: Misc Help. +* Open File, New Frame... menu item: File Menu. +* Open File... menu item: File Menu. +* option <1>: Examining. +* option: Variables. +* Options menu <1>: Options Menu. +* Options menu: Pull-down Menus. +* other editors: Emulation. +* outlines: Outline Mode. +* outragedy: Dissociated Press. +* Overstrike menu item: Options Menu. +* Overwrite mode: Minor Modes. +* package hierarchies: Startup Paths. +* package path: Startup Paths. +* packages: Packages. +* page number: Position Info. +* pages: Pages. +* paragraphs: Paragraphs. +* parasha, weekly: Sexp Diary Entries. +* Paren Highlighting menu item: Options Menu. +* parentheses: Matching. +* Paste menu item: Edit Menu. +* pasting: Yanking. +* path: Startup Paths. +* paths: Startup Paths. +* per-buffer variables: Locals. +* Persian calendar: Calendar Systems. +* phases of the moon: Lunar Phases. +* pictures: Picture. +* point <1>: Basic. +* point: Point. +* pointer face: Mouse Selection. +* pointer shapes: Mouse Selection. +* prefix key sequence: Key Sequences. +* presidentagon: Dissociated Press. +* primary selections: X Selection Commands. +* Print Buffer menu item: File Menu. +* prompt: Minibuffer. +* properbose: Dissociated Press. +* Pull-down Menus <1>: Change Window. +* Pull-down Menus: Pull-down Menus. +* query replace: Query Replace. +* quitting: Quitting. +* quitting (in search): Incremental Search. +* quoting: Basic. +* random sentences: CONX. +* RCS: Concepts of VC. +* Read Only menu item: Options Menu. +* read-only buffer: Misc Buffer. +* rebinding keys, permanently: Init File. +* rebinding keys, this session: Rebinding. +* rectangle <1>: Rectangles in Picture. +* rectangle: RegRect. +* rectangles: Rectangles. +* recursive editing level <1>: Quitting. +* recursive editing level: Recursive Edit. +* redefining keys: Key Bindings Using Strings. +* regexp: Regexp Search. +* region <1>: Case. +* region: Mark. +* registered file: Concepts of VC. +* registers: Registers. +* regular expression: Regexp Search. +* regular packages: Package Terminology. +* removing directories: File Names. +* replacement: Replace. +* restriction: Narrowing. +* Revert Buffer menu item: File Menu. +* root of a hierarchy: Startup Paths. +* rosh hodesh: Sexp Diary Entries. +* Russian: Mule. +* Save Buffer As ... menu item: File Menu. +* Save Buffer menu item: File Menu. +* Save Options: Options Menu. +* saving: Visiting. +* saving option value: Changing an Option. +* SCCS: Concepts of VC. +* Scheme mode: Program Modes. +* scrolling: Scrolling. +* scrolling in the calendar: Scroll Calendar. +* searching: Search. +* selected buffer: Buffers. +* selected window: Basic Window. +* selective display: Outline Mode. +* self-documentation: Help. +* sentences: Sentences. +* setting option value: Changing an Option. +* setting variables: Examining. +* sexp: Lists. +* sexp diary entries: Sexp Diary Entries. +* shell commands: Shell. +* Shell mode: Shell Mode. +* shift modifer: Representing Keystrokes. +* shrinking XEmacs frame: Exiting. +* simultaneous editing: Interlocking. +* single-file packages: Package Terminology. +* site-specific directories: Startup Paths. +* Size menu item: Options Menu. +* slashes repeated in file name: Minibuffer File. +* snapshots and version control: Snapshots. +* sorting: Sorting. +* sorting diary entries: Fancy Diary Display. +* source packages: Package Terminology. +* spelling: Spelling. +* Split Frame: File Menu. +* Start Macro Recording menu item: Edit Menu. +* startup paths: Startup Paths. +* string substitution: Replace. +* subshell: Shell. +* subtree (Outline mode): Outline Visibility. +* sunrise and sunset: Sunrise/Sunset. +* suspending: Exiting. +* switching buffers: Select Buffer. +* Syntax Highlighting menu item: Options Menu. +* syntax table <1>: Syntax. +* syntax table: Words. +* tags table: Tags. +* Teach Extended Commands menu item: Options Menu. +* techniquitous: Dissociated Press. +* television: Appending Kills. +* Term mode: Term Mode. +* termscript file: Bugs. +* TeX: TeX Mode. +* text: Text. +* Text mode: Text Mode. +* Tools menu <1>: Tools Menu. +* Tools menu: Pull-down Menus. +* top level: Mode Line. +* transposition <1>: Lists. +* transposition <2>: Words. +* transposition: Transpose. +* truncation: Continuation Lines. +* typos: Fixit. +* Un-split (Keep Others): File Menu. +* Un-split (Keep This): File Menu. +* undo: Undo. +* Undo menu item: Edit Menu. +* variable: Variables. +* variables: Commands. +* version control: Version Control. +* version-specific directories: Startup Paths. +* vi: Emulation. +* viewing: Misc File Ops. +* Viper: Emulation. +* visiting: Visiting. +* visiting files: Visiting. +* weeks, which day they start on: Move to Beginning or End. +* Weight menu item: Options Menu. +* widening: Narrowing. +* window: Frame. +* windows: Windows. +* Windows menu: Change Window. +* word search: Word Search. +* words <1>: Case. +* words <2>: Words. +* words: Fixing Case. +* work file: Concepts of VC. +* X resources: X Resources. +* yahrzeits <1>: Sexp Diary Entries. +* yahrzeits: From Other Calendar. +* yanking: Yanking. + + diff --git a/lib-src/make-dump-id.c b/lib-src/make-dump-id.c new file mode 100644 index 0000000..dba2a9c --- /dev/null +++ b/lib-src/make-dump-id.c @@ -0,0 +1,59 @@ +/* Generate a unique dump-id for use with the portable dumper. + Copyright (C) 2000 Olivier Galibert, Martin Buchholz + +This file is part of XEmacs. + +XEmacs is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +XEmacs is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with XEmacs; see the file COPYING. If not, write to +the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include +#include +#include +#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 \n" + "unsigned int dump_id = %uU;\n", + generate_dump_id ()); + + if ((fclose (f)) != 0) + { + perror ("close dump-id.c"); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} diff --git a/man/lispref/gutter.texi b/man/lispref/gutter.texi new file mode 100644 index 0000000..4da9fa2 --- /dev/null +++ b/man/lispref/gutter.texi @@ -0,0 +1,395 @@ +@c -*-texinfo-*- +@c This is part of the XEmacs Lisp Reference Manual. +@c Copyright (C) 1994, 1995 Ben Wing. +@c Copyright (C) 1999 Andy Piper. +@c Copyright (C) 1999 Stephen J. Turnbull. +@c See the file lispref.texi for copying conditions. +@setfilename ../../info/gutter.info +@node Gutter, Scrollbars, Toolbar, top +@chapter Gutter +@cindex gutter + + A gutter is a rectangle displayed along one edge of a frame. It +can contain arbitrary text or graphics. + +@menu +* Gutter Intro:: An introduction. +* Gutter Descriptor Format:: How to create a gutter. +* Specifying a Gutter:: Setting a gutter's contents. +* Other Gutter Variables:: Controlling the size of gutters. +* Common Gutter Widgets:: Things to put in gutters. +@end menu + +@node Gutter Intro, Gutter Descriptor Format, , Gutter +@section Gutter Intro + + A @dfn{gutter} is a rectangle displayed along one edge of a frame. It +can contain arbitrary text or graphics. It could be considered a +generalization of a toolbar, although toolbars are not currently +implemented using gutters. + + In XEmacs, a gutter can be displayed along any of the four edges +of the frame, and two or more different edges can be displaying +gutters simultaneously. The contents, thickness, and visibility of +the gutters can be controlled separately, and the values can +be per-buffer, per-frame, etc., using specifiers (@pxref{Specifiers}). + + Normally, there is one gutter displayed in a frame. Usually, this is +the default gutter, containing buffer tabs, but modes cab override this +and substitute their own gutter. This default gutter is usually +positioned along the top of the frame, but this can be changed using +@code{set-default-gutter-position}. + + Note that, for each of the gutter properties (contents, thickness, +and visibility), there is a separate specifier for each of the four +gutter positions (top, bottom, left, and right), and an additional +specifier for the ``default'' gutter, i.e. the gutter whose +position is controlled by @code{set-default-gutter-position}. The +way this works is that @code{set-default-gutter-position} arranges +things so that the appropriate position-specific specifiers for the +default position inherit from the corresponding default specifiers. +That way, if the position-specific specifier does not give a value +(which it usually doesn't), then the value from the default +specifier applies. If you want to control the default gutter, you +just change the default specifiers, and everything works. A package +such as VM that wants to put its own gutter in a different location +from the default just sets the position-specific specifiers, and if +the user sets the default gutter to the same position, it will just +not be visible. + +@node Gutter Descriptor Format, Specifying a Gutter, Gutter Intro, Gutter +@section Gutter Descriptor Format + + The contents of a gutter are specified using a @dfn{gutter descriptor}. +The format of a gutter descriptor is a list of @dfn{gutter button +descriptors}. Each gutter button descriptor is a vector in one of the +following formats: + +@itemize @bullet +@item +@code{[@var{glyph-list} @var{function} @var{enabled-p} @var{help}]} +@item +@code{[:style @var{2d-or-3d}]} +@item +@code{[:style @var{2d-or-3d} :size @var{width-or-height}]} +@item +@code{[:size @var{width-or-height} :style @var{2d-or-3d}]} +@end itemize + + Optionally, one of the gutter button descriptors may be @code{nil} +instead of a vector; this signifies the division between the gutter +buttons that are to be displayed flush-left, and the buttons to be +displayed flush-right. + + The first vector format above specifies a normal gutter button; +the others specify blank areas in the gutter. + + For the first vector format: + +@itemize @bullet +@item +@var{glyph-list} should be a list of one to six glyphs (as created by +@code{make-glyph}) or a symbol whose value is such a list. The first +glyph, which must be provided, is the glyph used to display the gutter +button when it is in the ``up'' (not pressed) state. The optional +second glyph is for displaying the button when it is in the ``down'' +(pressed) state. The optional third glyph is for when the button is +disabled. The last three glyphs are for displaying the button in the +``up'', ``down'', and ``disabled'' states, respectively, but are used +when the user has called for captioned gutter buttons (using +@code{gutter-buttons-captioned-p}). The function +@code{gutter-make-button-list} is useful in creating these glyph lists. + +@item +Even if you do not provide separate down-state and disabled-state +glyphs, the user will still get visual feedback to indicate which +state the button is in. Buttons in the up-state are displayed +with a shadowed border that gives a raised appearance to the +button. Buttons in the down-state are displayed with shadows that +give a recessed appearance. Buttons in the disabled state are +displayed with no shadows, giving a 2-d effect. + +@item +If some of the gutter glyphs are not provided, they inherit as follows: + +@example + UP: up + DOWN: down -> up + DISABLED: disabled -> up + CAP-UP: cap-up -> up + CAP-DOWN: cap-down -> cap-up -> down -> up + CAP-DISABLED: cap-disabled -> cap-up -> disabled -> up +@end example + +@item +The second element @var{function} is a function to be called when the +gutter button is activated (i.e. when the mouse is released over the +gutter button, if the press occurred in the gutter). It can be any +form accepted by @code{call-interactively}, since this is how it is +invoked. + +@item +The third element @var{enabled-p} specifies whether the gutter button +is enabled (disabled buttons do nothing when they are activated, and are +displayed differently; see above). It should be either a boolean or a +form that evaluates to a boolean. + +@item +The fourth element @var{help}, if non-@code{nil}, should be a string. +This string is displayed in the echo area when the mouse passes over the +gutter button. +@end itemize + + For the other vector formats (specifying blank areas of the gutter): + +@itemize @bullet +@item +@var{2d-or-3d} should be one of the symbols @code{2d} or @code{3d}, +indicating whether the area is displayed with shadows (giving it a +raised, 3-d appearance) or without shadows (giving it a flat +appearance). + +@item +@var{width-or-height} specifies the length, in pixels, of the blank +area. If omitted, it defaults to a device-specific value (8 pixels for +X devices). +@end itemize + +@defun gutter-make-button-list up &optional down disabled cap-up cap-down cap-disabled +This function calls @code{make-glyph} on each arg and returns a list of +the results. This is useful for setting the first argument of a gutter +button descriptor (typically, the result of this function is assigned +to a symbol, which is specified as the first argument of the gutter +button descriptor). +@end defun + +@defun check-gutter-button-syntax button &optional noerror +Verify the syntax of entry @var{button} in a gutter description list. +If you want to verify the syntax of a gutter description list as a +whole, use @code{check-valid-instantiator} with a specifier type of +@code{gutter}. +@end defun + +@node Specifying a Gutter, Other Gutter Variables, Gutter Descriptor Format, Gutter +@section Specifying a Gutter + + In order to specify the contents of a gutter, set one of the specifier +variables @code{default-gutter}, @code{top-gutter}, +@code{bottom-gutter}, @code{left-gutter}, or @code{right-gutter}. +These are specifiers, which means you set them with @code{set-specifier} +and query them with @code{specifier-specs} or @code{specifier-instance}. +You will get an error if you try to set them using @code{setq}. The +valid instantiators for these specifiers are gutter descriptors, as +described above. @xref{Specifiers}, for more information. + + Most of the time, you will set @code{default-gutter}, which allows +the user to choose where the gutter should go. + +@defvr Specifier default-gutter +The position of this gutter is specified in the function +@code{default-gutter-position}. If the corresponding +position-specific gutter (e.g. @code{top-gutter} if +@code{default-gutter-position} is @code{top}) does not specify a +gutter in a particular domain, then the value of @code{default-gutter} +in that domain, of any, will be used instead. +@end defvr + + Note that the gutter at any particular position will not be displayed +unless its thickness (width or height, depending on orientation) is +non-zero and its visibility status is true. The thickness is controlled +by the specifiers @code{top-gutter-height}, +@code{bottom-gutter-height}, @code{left-gutter-width}, and +@code{right-gutter-width}, and the visibility status is controlled by +the specifiers @code{top-gutter-visible-p}, +@code{bottom-gutter-visible-p}, @code{left-gutter-visible-p}, and +@code{right-gutter-visible-p} (@pxref{Other Gutter Variables}). + +@defun set-default-gutter-position position +This function sets the position that the @code{default-gutter} will be +displayed at. Valid positions are the symbols @code{top}, +@code{bottom}, @code{left} and @code{right}. What this actually does is +set the fallback specifier for the position-specific specifier +corresponding to the given position to @code{default-gutter}, and set +the fallbacks for the other position-specific specifiers to @code{nil}. +It also does the same thing for the position-specific thickness and +visibility specifiers, which inherit from one of +@code{default-gutter-height} or @code{default-gutter-width}, and from +@code{default-gutter-visible-p}, respectively (@pxref{Other Gutter +Variables}). +@end defun + +@defun default-gutter-position +This function returns the position that the @code{default-gutter} will +be displayed at. +@end defun + + You can also explicitly set a gutter at a particular position. When +redisplay determines what to display at a particular position in a +particular domain (i.e. window), it first consults the position-specific +gutter. If that does not yield a gutter descriptor, the +@code{default-gutter} is consulted if @code{default-gutter-position} +indicates this position. + +@defvr Specifier top-gutter +Specifier for the gutter at the top of the frame. +@end defvr + +@defvr Specifier bottom-gutter +Specifier for the gutter at the bottom of the frame. +@end defvr + +@defvr Specifier left-gutter +Specifier for the gutter at the left edge of the frame. +@end defvr + +@defvr Specifier right-gutter +Specifier for the gutter at the right edge of the frame. +@end defvr + +@defun gutter-specifier-p object +This function returns non-nil if @var{object} is a gutter specifier. +Gutter specifiers are the actual objects contained in the gutter +variables described above, and their valid instantiators are +gutter descriptors (@pxref{Gutter Descriptor Format}). +@end defun + +@node Other Gutter Variables, Common Gutter Widgets, Specifying a Gutter, Gutter +@section Other Gutter Variables + + The variables to control the gutter thickness, visibility status, and +captioned status are all specifiers. @xref{Specifiers}. + +@defvr Specifier default-gutter-height +This specifies the height of the default gutter, if it's oriented +horizontally. The position of the default gutter is specified by the +function @code{set-default-gutter-position}. If the corresponding +position-specific gutter thickness specifier +(e.g. @code{top-gutter-height} if @code{default-gutter-position} is +@code{top}) does not specify a thickness in a particular domain (a +window or a frame), then the value of @code{default-gutter-height} or +@code{default-gutter-width} (depending on the gutter orientation) in +that domain, if any, will be used instead. +@end defvr + +@defvr Specifier default-gutter-width +This specifies the width of the default gutter, if it's oriented +vertically. This behaves like @code{default-gutter-height}. +@end defvr + + Note that @code{default-gutter-height} is only used when +@code{default-gutter-position} is @code{top} or @code{bottom}, and +@code{default-gutter-width} is only used when +@code{default-gutter-position} is @code{left} or @code{right}. + +@defvr Specifier top-gutter-height +This specifies the height of the top gutter. +@end defvr + +@defvr Specifier bottom-gutter-height +This specifies the height of the bottom gutter. +@end defvr + +@defvr Specifier left-gutter-width +This specifies the width of the left gutter. +@end defvr + +@defvr Specifier right-gutter-width +This specifies the width of the right gutter. +@end defvr + + Note that all of the position-specific gutter thickness specifiers +have a fallback value of zero when they do not correspond to the +default gutter. Therefore, you will have to set a non-zero thickness +value if you want a position-specific gutter to be displayed. + +@defvr Specifier default-gutter-visible-p +This specifies whether the default gutter is visible. The position of +the default gutter is specified by the function +@code{set-default-gutter-position}. If the corresponding position-specific +gutter visibility specifier (e.g. @code{top-gutter-visible-p} if +@code{default-gutter-position} is @code{top}) does not specify a +visible-p value in a particular domain (a window or a frame), then the +value of @code{default-gutter-visible-p} in that domain, if any, will +be used instead. +@end defvr + +@defvr Specifier top-gutter-visible-p +This specifies whether the top gutter is visible. +@end defvr + +@defvr Specifier bottom-gutter-visible-p +This specifies whether the bottom gutter is visible. +@end defvr + +@defvr Specifier left-gutter-visible-p +This specifies whether the left gutter is visible. +@end defvr + +@defvr Specifier right-gutter-visible-p +This specifies whether the right gutter is visible. +@end defvr + +@code{default-gutter-visible-p} and all of the position-specific +gutter visibility specifiers have a fallback value of true. + + Internally, gutter thickness and visibility specifiers are instantiated +in both window and frame domains, for different purposes. The value in +the domain of a frame's selected window specifies the actual gutter +thickness or visibility that you will see in that frame. The value in +the domain of a frame itself specifies the gutter thickness or +visibility that is used in frame geometry calculations. + + Thus, for example, if you set the frame width to 80 characters and the +left gutter width for that frame to 68 pixels, then the frame will be +sized to fit 80 characters plus a 68-pixel left gutter. If you then +set the left gutter width to 0 for a particular buffer (or if that +buffer does not specify a left gutter or has a nil value specified for +@code{left-gutter-visible-p}), you will find that, when that buffer is +displayed in the selected window, the window will have a width of 86 or +87 characters -- the frame is sized for a 68-pixel left gutter but the +selected window specifies that the left gutter is not visible, so it is +expanded to take up the slack. + +@defvr Specifier gutter-buttons-captioned-p +Whether gutter buttons are captioned. This affects which glyphs from a +gutter button descriptor are chosen. @xref{Gutter Descriptor Format}. +@end defvr + + You can also reset the gutter to what it was when XEmacs started up. + +@defvr Constant initial-gutter-spec +The gutter descriptor used to initialize @code{default-gutter} at +startup. +@end defvr + +@node Common Gutter Widgets, , Other Gutter Variables, Gutter +@section Common Gutter Widgets + + A gutter can contain arbitrary text. So, for example, in an Info +buffer you could put the title of the current node in the top gutter, +and it would not scroll out of view in a long node. (This is an +artificial example, since usually the node name is sufficiently +descriptive, and Info puts that in the mode line.) + + A more common use for the gutter is to hold some kind of active +widget. The buffer-tab facility, available in all XEmacs frames, +creates an array of file-folder-like tabs, which the user can click with +the mouse to switch buffers. W3 uses a progress-bar widget in the +bottom gutter to give a visual indication of the progress of +time-consuming operations like downloading. + +@menu +* Buffer Tabs:: Tabbed divider index metaphor for switching buffers. +* Progress Bars:: Visual indication of operation progress. +@end menu + +@node Buffer Tabs, Progress Bars, , Common Gutter Widgets +@section Buffer Tabs + + Not documented yet. + +@node Progress Bars, , Buffer Tabs, Common Gutter Widgets +@section Progress Bars + + Not documented yet. + diff --git a/man/lispref/postgresql.texi b/man/lispref/postgresql.texi new file mode 100644 index 0000000..982cc95 --- /dev/null +++ b/man/lispref/postgresql.texi @@ -0,0 +1,1254 @@ +@c -*-texinfo-*- +@c This is part of the XEmacs Lisp Reference Manual. +@c Copyright (C) 2000 Electrotechnical Laboratory, JAPAN +@c Licensed to the Free Software Foundation +@c See the file lispref.texi for copying conditions. +@c Thank you Oscar Figueiredo! This file was shamelessly cloned from +@c ldap.texi. +@setfilename ../../info/postgresql.info +@node PostgreSQL Support, Internationalization, LDAP Support, top +@chapter PostgreSQL Support +@cindex PostgreSQL + +XEmacs can be linked with PostgreSQL libpq run-time support to provide +relational database access from Emacs Lisp code. + +@menu +* Building XEmacs with PostgreSQL support:: +* XEmacs PostgreSQL libpq API:: +* XEmacs PostgreSQL libpq Examples:: +@end menu + +@node Building XEmacs with PostgreSQL support, XEmacs PostgreSQL libpq API, ,PostgreSQL Support +@comment node-name, next, previous, up +@section Building XEmacs with PostgreSQL support + +XEmacs PostgreSQL support requires linking to the PostgreSQL libpq.so +library. Describing how to build and install PostgreSQL is beyond the +scope of this document, see the PostgreSQL manual for details. + +If you have installed XEmacs from one of the binary kits on +(@url{ftp://ftp.xemacs.org/}), or are using an XEmacs binary from a CD +ROM, you should have XEmacs PostgreSQL support by default. If you are +building XEmacs from source on a Linux system with PostgreSQL installed +into the default location, it should be autodetected when you run +configure. If you have installed PostgreSQL into its non-Linux default +location, @file{/usr/local/pgsql}, you must specify +@code{--site-prefixes=/usr/local/pgsql} when you run configure. If +you installed PostgreSQL into another location, use that instead of +@file{/usr/local/pgsql} when specifying @code{--site-prefixes}. + +As of XEmacs 21.2, PostgreSQL versions 6.5.3 and 7.0 are supported. +XEmacs Lisp support for V7.0 is somewhat more extensive than support for +V6.5. In particular, asynchronous queries are supported. + +@node XEmacs PostgreSQL libpq API, XEmacs PostgreSQL libpq Examples, Building XEmacs with PostgreSQL support, PostgreSQL Support +@comment node-name, next, previous, up +@section XEmacs PostgreSQL libpq API + +XEmacs PostgreSQL API is intended to be a policy-free, low-level binding +to libpq. The intent is to provide all the basic functionality and then +let high level Lisp code decide its own policies. + +This documentation assumes that the reader has knowledge of SQL, but +requires no prior knowledge of libpq. + +There are many examples in this manual and some setup will be required. +In order to run most of the following examples, the following code needs +to be executed. In addition to the data is in this table, nearly all of +the examples will assume that the free variable @code{P} refers to this +database connection. The examples in the original edition of this +manual were run against Postgres 7.0beta1. + +@example +(progn + (setq P (pq-connectdb "")) + ;; id is the primary key, shikona is a Japanese word that + ;; means `the professional name of a Sumo wrestler', and + ;; rank is the Sumo rank name. + (pq-exec P (concat "CREATE TABLE xemacs_test" + " (id int, shikona text, rank text);")) + (pq-exec P "COPY xemacs_test FROM stdin;") + (pq-put-line P "1\tMusashimaru\tYokuzuna\n") + (pq-put-line P "2\tDejima\tOozeki\n") + (pq-put-line P "3\tMusoyama\tSekiwake\n") + (pq-put-line P "4\tMiyabiyama\tSekiwake\n") + (pq-put-line P "5\tWakanoyama\tMaegashira\n") + (pq-put-line P "\\.\n") + (pq-end-copy P)) + @result{} nil +@end example + +@menu +* libpq Lisp Variables:: +* libpq Lisp Symbols and DataTypes:: +* Synchronous Interface Functions:: +* Asynchronous Interface Functions:: +* Large Object Support:: +* Other libpq Functions:: +* Unimplemented libpq Functions:: +@end menu + +@node libpq Lisp Variables, libpq Lisp Symbols and DataTypes, XEmacs PostgreSQL libpq API, XEmacs PostgreSQL libpq API +@comment node-name, next, previous, up +@subsection libpq Lisp Variables + +Various Unix environment variables are used by libpq to provide defaults +to the many different parameters. In the XEmacs Lisp API, these +environment variables are bound to Lisp variables to provide more +convenient access to Lisp Code. These variables are passed to the +backend database server during the establishment of a database +connection and when the @code{pq-setenv} call is made. + +@defvar pg:host +Initialized from the @var{PGHOST} environment variable. The default +host to connect to. +@end defvar + +@defvar pg:user +Initialized from the @var{PGUSER} environment variable. The default +database user name. +@end defvar + +@defvar pg:options +Initialized from the @var{PGOPTIONS} environment variable. Default +additional server options. +@end defvar + +@defvar pg:port +Initialized from the @var{PGPORT} environment variable. The default TCP +port to connect to. +@end defvar + +@defvar pg:tty +Initialized from the @var{PGTTY} environment variable. The default +debugging TTY. + +Compatibility note: Debugging TTYs are turned off in the XEmacs Lisp +binding. +@end defvar + +@defvar pg:database +Initialized from the @var{PGDATABASE} environment variable. The default +database to connect to. +@end defvar + +@defvar pg:realm +Initialized from the @var{PGREALM} environment variable. The default +Kerberos realm. +@end defvar + +@defvar pg:client-encoding +Initialized from the @var{PGCLIENTENCODING} environment variable. The +default client encoding. + +Compatibility note: This variable is not present in non-Mule XEmacsen. +This variable is not present in versions of libpq prior to 7.0. +In the current implementation, client encoding is equivalent to the +@code{file-name-coding-system} format. +@end defvar + +@c unused +@defvar pg:authtype +Initialized from the @var{PGAUTHTYPE} environment variable. The default +authentication scheme used. + +Compatibility note: This variable is unused in versions of libpq after +6.5. It is not implemented at all in the XEmacs Lisp binding. +@end defvar + +@defvar pg:geqo +Initialized from the @var{PGGEQO} environment variable. Genetic +optimizer options. +@end defvar + +@defvar pg:cost-index +Initialized from the @var{PGCOSTINDEX} environment variable. Cost index +options. +@end defvar + +@defvar pg:cost-heap +Initialized from the @var{PGCOSTHEAP} environment variable. Cost heap +options. +@end defvar + +@defvar pg:tz +Initialized from the @var{PGTZ} environment variable. Default +timezone. +@end defvar + +@defvar pg:date-style +Initialized from the @var{PGDATESTYLE} environment variable. Default +date style in returned date objects. +@end defvar + +@defvar pg-coding-system +This is a variable controlling which coding system is used to encode +non-ASCII strings sent to the database. + +Compatibility Note: This variable is not present in InfoDock. +@end defvar + +@node libpq Lisp Symbols and DataTypes, Synchronous Interface Functions, libpq Lisp Variables, XEmacs PostgreSQL libpq API +@comment node-name, next, previous, up +@subsection libpq Lisp Symbols and Datatypes + +The following set of symbols are used to represent the intermediate +states involved in the asynchronous interface. + +@defvr {Symbol} pgres::polling-failed +Undocumented. A fatal error has occurred during processing of an +asynchronous operation. +@end defvr + +@defvr {Symbol} pgres::polling-reading +An intermediate status return during an asynchronous operation. It +indicates that one may use @code{select} before polling again. +@end defvr + +@defvr {Symbol} pgres::polling-writing +An intermediate status return during an asynchronous operation. It +indicates that one may use @code{select} before polling again. +@end defvr + +@defvr {Symbol} pgres::polling-ok +An asynchronous operation has successfully completed. +@end defvr + +@defvr {Symbol} pgres::polling-active +An intermediate status return during an asynchronous operation. One can +call the poll function again immediately. +@end defvr + +@defun pq-pgconn conn field +@var{conn} A database connection object. +@var{field} A symbol indicating which field of PGconn to fetch. Possible +values are shown in the following table. +@table @code +@item pq::db +Database name +@item pq::user +Database user name +@item pq::pass +Database user's password +@item pq::host +Hostname database server is running on +@item pq::port +TCP port number used in the connection +@item pq::tty +Debugging TTY + +Compatibility note: Debugging TTYs are not used in the XEmacs Lisp API. +@item pq::options +Additional server options +@item pq::status +Connection status. Possible return values are shown in the following +table. +@table @code +@item pg::connection-ok +The normal, connected status. +@item pg::connection-bad +The connection is not open and the PGconn object needs to be deleted by +@code{pq-finish}. +@item pg::connection-started +An asynchronous connection has been started, but is not yet complete. +@item pg::connection-made +An asynchronous connect has been made, and there is data waiting to be sent. +@item pg::connection-awaiting-response +Awaiting data from the backend during an asynchronous connection. +@item pg::connection-auth-ok +Received authentication, waiting for the backend to start up. +@item pg::connection-setenv +Negotiating environment during an asynchronous connection. +@end table +@item pq::error-message +The last error message that was delivered to this connection. +@item pq::backend-pid +The process ID of the backend database server. +@end table +@end defun + +The @code{PGresult} object is used by libpq to encapsulate the results +of queries. The printed representation takes on four forms. When the +PGresult object contains tuples from an SQL @code{SELECT} it will look +like: + +@example +(setq R (pq-exec P "SELECT * FROM xemacs_test;")) + @result{} # +@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{} # +@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{} # +@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{} # +@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{} # +(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{} +(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{} # +(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{} # +(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{} # +(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{} # +(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{} # +(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{} # +(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{} # +(pq-cmd-status R) + @result{} "INSERT 542086 1" +(setq R (pq-exec P "UPDATE xemacs_test SET rank='retired' + WHERE shikona='Wakanohana';")) + @result{} # +(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{} # +(pq-cmd-tuples R) + @result{} "1" +(setq R (pq-exec P "SELECT * from xemacs_test;")) + @result{} # +(pq-cmd-tuples R) + @result{} "" +(setq R (pq-exec P "DELETE FROM xemacs_test + WHERE shikona LIKE '%hana';")) + @result{} # +(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{} # +(pq-oid-value R) + @result{} 542089 +(setq R (pq-exec P "SELECT shikona FROM xemacs_test + WHERE rank='Maegashira';")) + @result{} # +(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{} # +@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 + # +@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{} # +@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{} # +@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{} # +@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{} # +@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{} (#) +@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{} (# # #) +@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{} # +(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{} # +@end example diff --git a/nt/config.inc.samp b/nt/config.inc.samp new file mode 100644 index 0000000..c49da6b --- /dev/null +++ b/nt/config.inc.samp @@ -0,0 +1,72 @@ +# -*- mode: makefile -*- + +############################################################################ + +INSTALL_DIR=c:\Program Files\XEmacs\XEmacs-$(XEMACS_VERSION_STRING) + +PACKAGE_PREFIX=c:\Program Files\XEmacs + +############################################################################ + +# Multilingual support (not currently working). +HAVE_MULE=0 + +# Native MS Windows support. +HAVE_MSW=1 + +# X Windows support. +HAVE_X=0 +X11_DIR= + +############################################################################ + +# Set this to enable XPM support (virtually mandatory), and specify +# the directory containing xpm. +HAVE_XPM=1 +XPM_DIR=f:\src\xpm-3.4k + +# Set this to enable GIF support. +HAVE_GIF=1 + +# Set this to enable PNG support (virtually mandatory), and specify +# the directories containing png and zlib. +HAVE_PNG=1 +PNG_DIR=f:\src\libpng-1.0.3 +ZLIB_DIR=f:\src\zlib + +# Set this to enable TIFF support, and specify the directory containing tiff. +HAVE_TIFF=0 +TIFF_DIR= + +# Set this to enable JPEG support, and specify the directory containing jpeg. +HAVE_JPEG=0 +JPEG_DIR= + +# Set this to enable XFace support, and specify the directory containing +# compface. +HAVE_XFACE=0 +COMPFACE_DIR= + +############################################################################ + +# Set this to specify the location of makeinfo. (If not set, XEmacs will +# attempt to use its built-in texinfo support when building info files.) +MAKEINFO=f:\src\texinfo-4.0\makeinfo\makeinfo.exe + +############################################################################ + +# Set this to enable some debug code that doesn't slow things down. +DEBUG_XEMACS=1 + +# Set this to see exactly which compilation commands are being run (not +# generally recommended). +VERBOSECC=0 + +############################################################################ + +# Some technical options. + +USE_MINIMAL_TAGBITS=0 +USE_INDEXED_LRECORD_IMPLEMENTATION=0 +USE_PORTABLE_DUMPER=0 +GUNG_HO=0 diff --git a/nt/xemacs.dsp b/nt/xemacs.dsp new file mode 100644 index 0000000..f317c9c --- /dev/null +++ b/nt/xemacs.dsp @@ -0,0 +1,1392 @@ +# Microsoft Developer Studio Project File - Name="xemacs" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 5.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) External Target" 0x0106 + +CFG=xemacs - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "xemacs.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "xemacs.mak" CFG="xemacs - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "xemacs - Win32 Release" (based on "Win32 (x86) External Target") +!MESSAGE "xemacs - Win32 Debug" (based on "Win32 (x86) External Target") +!MESSAGE + +# Begin Project +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" + +!IF "$(CFG)" == "xemacs - Win32 Release" + +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Cmd_Line "NMAKE /f xemacs.mak" +# PROP BASE Rebuild_Opt "/a" +# PROP BASE Target_File "xemacs.exe" +# PROP BASE Bsc_Name "xemacs.bsc" +# PROP BASE Target_Dir "" +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Cmd_Line "NMAKE /f xemacs.mak" +# PROP Rebuild_Opt "/a" +# PROP Target_File "xemacs.exe" +# PROP Bsc_Name "xemacs.bsc" +# PROP Target_Dir "" + +!ELSEIF "$(CFG)" == "xemacs - Win32 Debug" + +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Cmd_Line "NMAKE /f xemacs.mak" +# PROP BASE Rebuild_Opt "/a" +# PROP BASE Target_File "xemacs.exe" +# PROP BASE Bsc_Name "xemacs.bsc" +# PROP BASE Target_Dir "" +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Cmd_Line "NMAKE /f xemacs.mak" +# PROP Rebuild_Opt "/a" +# PROP Target_File "..\src\xemacs.exe" +# PROP Bsc_Name "..\src\temacs.bsc" +# PROP Target_Dir "" + +!ENDIF + +# Begin Target + +# Name "xemacs - Win32 Release" +# Name "xemacs - Win32 Debug" + +!IF "$(CFG)" == "xemacs - Win32 Release" + +!ELSEIF "$(CFG)" == "xemacs - Win32 Debug" + +!ENDIF + +# Begin Source File + +SOURCE=..\src\abbrev.c +# End Source File +# Begin Source File + +SOURCE=..\src\alloc.c +# End Source File +# Begin Source File + +SOURCE=..\src\alloca.c +# End Source File +# Begin Source File + +SOURCE=..\src\backtrace.h +# End Source File +# Begin Source File + +SOURCE="..\src\balloon-x.c" +# End Source File +# Begin Source File + +SOURCE=..\src\balloon_help.c +# End Source File +# Begin Source File + +SOURCE=..\src\balloon_help.h +# End Source File +# Begin Source File + +SOURCE=..\src\bitmaps.h +# End Source File +# Begin Source File + +SOURCE=..\src\blocktype.c +# End Source File +# Begin Source File + +SOURCE=..\src\blocktype.h +# End Source File +# Begin Source File + +SOURCE="..\src\broken-sun.h" +# End Source File +# Begin Source File + +SOURCE=..\src\buffer.c +# End Source File +# Begin Source File + +SOURCE=..\src\buffer.h +# End Source File +# Begin Source File + +SOURCE=..\src\bufslots.h +# End Source File +# Begin Source File + +SOURCE=..\src\bytecode.c +# End Source File +# Begin Source File + +SOURCE=..\src\bytecode.h +# End Source File +# Begin Source File + +SOURCE=..\src\callint.c +# End Source File +# Begin Source File + +SOURCE=..\src\callproc.c +# End Source File +# Begin Source File + +SOURCE=..\src\casefiddle.c +# End Source File +# Begin Source File + +SOURCE=..\src\casetab.c +# End Source File +# Begin Source File + +SOURCE=..\src\chartab.c +# End Source File +# Begin Source File + +SOURCE=..\src\chartab.h +# End Source File +# Begin Source File + +SOURCE=..\src\cm.c +# End Source File +# Begin Source File + +SOURCE=..\src\cm.h +# End Source File +# Begin Source File + +SOURCE=..\src\cmdloop.c +# End Source File +# Begin Source File + +SOURCE=..\src\cmds.c +# End Source File +# Begin Source File + +SOURCE=..\src\commands.h +# End Source File +# Begin Source File + +SOURCE=..\src\config.h +# End Source File +# Begin Source File + +SOURCE=..\src\conslots.h +# End Source File +# Begin Source File + +SOURCE="..\src\console-msw.c" +# End Source File +# Begin Source File + +SOURCE="..\src\console-msw.h" +# End Source File +# Begin Source File + +SOURCE="..\src\console-stream.c" +# End Source File +# Begin Source File + +SOURCE="..\src\console-stream.h" +# End Source File +# Begin Source File + +SOURCE="..\src\console-tty.c" +# End Source File +# Begin Source File + +SOURCE="..\src\console-tty.h" +# End Source File +# Begin Source File + +SOURCE="..\src\console-x.c" +# End Source File +# Begin Source File + +SOURCE="..\src\console-x.h" +# End Source File +# Begin Source File + +SOURCE=..\src\console.c +# End Source File +# Begin Source File + +SOURCE=..\src\console.h +# End Source File +# Begin Source File + +SOURCE=..\src\data.c +# End Source File +# Begin Source File + +SOURCE=..\src\database.c +# End Source File +# Begin Source File + +SOURCE=..\src\database.h +# End Source File +# Begin Source File + +SOURCE=..\src\debug.c +# End Source File +# Begin Source File + +SOURCE=..\src\debug.h +# End Source File +# Begin Source File + +SOURCE="..\src\device-msw.c" +# End Source File +# Begin Source File + +SOURCE="..\src\device-tty.c" +# End Source File +# Begin Source File + +SOURCE="..\src\device-x.c" +# End Source File +# Begin Source File + +SOURCE=..\src\device.c +# End Source File +# Begin Source File + +SOURCE=..\src\device.h +# End Source File +# Begin Source File + +SOURCE=..\src\dgif_lib.c +# End Source File +# Begin Source File + +SOURCE="..\src\dialog-msw.c" +# End Source File +# Begin Source File + +SOURCE="..\src\dialog-x.c" +# End Source File +# Begin Source File + +SOURCE=..\src\dialog.c +# End Source File +# Begin Source File + +SOURCE="..\src\dired-msw.c" +# End Source File +# Begin Source File + +SOURCE=..\src\dired.c +# End Source File +# Begin Source File + +SOURCE=..\src\doc.c +# End Source File +# Begin Source File + +SOURCE=..\src\doprnt.c +# End Source File +# Begin Source File + +SOURCE=..\src\dragdrop.c +# End Source File +# Begin Source File + +SOURCE=..\src\dragdrop.h +# End Source File +# Begin Source File + +SOURCE=..\src\dynarr.c +# End Source File +# Begin Source File + +SOURCE=..\src\ecrt0.c +# End Source File +# Begin Source File + +SOURCE=..\src\editfns.c +# End Source File +# Begin Source File + +SOURCE=..\src\eldap.c +# End Source File +# Begin Source File + +SOURCE=..\src\eldap.h +# End Source File +# Begin Source File + +SOURCE=..\src\elhash.c +# End Source File +# Begin Source File + +SOURCE=..\src\elhash.h +# End Source File +# Begin Source File + +SOURCE=..\src\Emacs.ad.h +# End Source File +# Begin Source File + +SOURCE=..\src\emacs.c +# End Source File +# Begin Source File + +SOURCE=..\src\EmacsFrame.c +# End Source File +# Begin Source File + +SOURCE=..\src\EmacsFrame.h +# End Source File +# Begin Source File + +SOURCE=..\src\EmacsFrameP.h +# End Source File +# Begin Source File + +SOURCE=..\src\EmacsManager.c +# End Source File +# Begin Source File + +SOURCE=..\src\EmacsManager.h +# End Source File +# Begin Source File + +SOURCE=..\src\EmacsManagerP.h +# End Source File +# Begin Source File + +SOURCE="..\src\EmacsShell-sub.c" +# End Source File +# Begin Source File + +SOURCE=..\src\EmacsShell.c +# End Source File +# Begin Source File + +SOURCE=..\src\EmacsShell.h +# End Source File +# Begin Source File + +SOURCE=..\src\EmacsShellP.h +# End Source File +# Begin Source File + +SOURCE=..\src\emodules.c +# End Source File +# Begin Source File + +SOURCE=..\src\emodules.h +# End Source File +# Begin Source File + +SOURCE=..\src\esd.c +# End Source File +# Begin Source File + +SOURCE=..\src\eval.c +# End Source File +# Begin Source File + +SOURCE="..\src\event-msw.c" +# End Source File +# Begin Source File + +SOURCE="..\src\event-stream.c" +# End Source File +# Begin Source File + +SOURCE="..\src\event-tty.c" +# End Source File +# Begin Source File + +SOURCE="..\src\event-unixoid.c" +# End Source File +# Begin Source File + +SOURCE="..\src\event-Xt.c" +# End Source File +# Begin Source File + +SOURCE="..\src\events-mod.h" +# End Source File +# Begin Source File + +SOURCE=..\src\events.c +# End Source File +# Begin Source File + +SOURCE=..\src\events.h +# End Source File +# Begin Source File + +SOURCE=..\src\extents.c +# End Source File +# Begin Source File + +SOURCE=..\src\extents.h +# End Source File +# Begin Source File + +SOURCE="..\src\ExternalClient-Xlib.c" +# End Source File +# Begin Source File + +SOURCE=..\src\ExternalClient.c +# End Source File +# Begin Source File + +SOURCE=..\src\ExternalClient.h +# End Source File +# Begin Source File + +SOURCE=..\src\ExternalClientP.h +# End Source File +# Begin Source File + +SOURCE=..\src\ExternalShell.c +# End Source File +# Begin Source File + +SOURCE=..\src\ExternalShell.h +# End Source File +# Begin Source File + +SOURCE=..\src\ExternalShellP.h +# End Source File +# Begin Source File + +SOURCE="..\src\extw-Xlib.c" +# End Source File +# Begin Source File + +SOURCE="..\src\extw-Xlib.h" +# End Source File +# Begin Source File + +SOURCE="..\src\extw-Xt.c" +# End Source File +# Begin Source File + +SOURCE="..\src\extw-Xt.h" +# End Source File +# Begin Source File + +SOURCE=..\src\faces.c +# End Source File +# Begin Source File + +SOURCE=..\src\faces.h +# End Source File +# Begin Source File + +SOURCE="..\src\file-coding.c" +# End Source File +# Begin Source File + +SOURCE="..\src\file-coding.h" +# End Source File +# Begin Source File + +SOURCE=..\src\fileio.c +# End Source File +# Begin Source File + +SOURCE=..\src\filelock.c +# End Source File +# Begin Source File + +SOURCE=..\src\filemode.c +# End Source File +# Begin Source File + +SOURCE=..\src\floatfns.c +# End Source File +# Begin Source File + +SOURCE=..\src\fns.c +# End Source File +# Begin Source File + +SOURCE="..\src\font-lock.c" +# End Source File +# Begin Source File + +SOURCE="..\src\frame-msw.c" +# End Source File +# Begin Source File + +SOURCE="..\src\frame-tty.c" +# End Source File +# Begin Source File + +SOURCE="..\src\frame-x.c" +# End Source File +# Begin Source File + +SOURCE=..\src\frame.c +# End Source File +# Begin Source File + +SOURCE=..\src\frame.h +# End Source File +# Begin Source File + +SOURCE=..\src\frameslots.h +# End Source File +# Begin Source File + +SOURCE="..\src\free-hook.c" +# End Source File +# Begin Source File + +SOURCE=..\src\general.c +# End Source File +# Begin Source File + +SOURCE=..\src\getloadavg.c +# End Source File +# Begin Source File + +SOURCE=..\src\getpagesize.h +# End Source File +# Begin Source File + +SOURCE=..\src\gif_io.c +# End Source File +# Begin Source File + +SOURCE=..\src\gifrlib.h +# End Source File +# Begin Source File + +SOURCE="..\src\glyphs-eimage.c" +# End Source File +# Begin Source File + +SOURCE="..\src\glyphs-msw.c" +# End Source File +# Begin Source File + +SOURCE="..\src\glyphs-msw.h" +# End Source File +# Begin Source File + +SOURCE="..\src\glyphs-widget.c" +# End Source File +# Begin Source File + +SOURCE="..\src\glyphs-x.c" +# End Source File +# Begin Source File + +SOURCE="..\src\glyphs-x.h" +# End Source File +# Begin Source File + +SOURCE=..\src\glyphs.c +# End Source File +# Begin Source File + +SOURCE=..\src\glyphs.h +# End Source File +# Begin Source File + +SOURCE=..\src\gmalloc.c +# End Source File +# Begin Source File + +SOURCE=..\src\gpmevent.c +# End Source File +# Begin Source File + +SOURCE=..\src\gpmevent.h +# End Source File +# Begin Source File + +SOURCE="..\src\gui-msw.c" +# End Source File +# Begin Source File + +SOURCE="..\src\gui-x.c" +# End Source File +# Begin Source File + +SOURCE="..\src\gui-x.h" +# End Source File +# Begin Source File + +SOURCE=..\src\gui.c +# End Source File +# Begin Source File + +SOURCE=..\src\gui.h +# End Source File +# Begin Source File + +SOURCE=..\src\gutter.c +# End Source File +# Begin Source File + +SOURCE=..\src\gutter.h +# End Source File +# Begin Source File + +SOURCE=..\src\hash.c +# End Source File +# Begin Source File + +SOURCE=..\src\hash.h +# End Source File +# Begin Source File + +SOURCE=..\src\hftctl.c +# End Source File +# Begin Source File + +SOURCE=..\src\hpplay.c +# End Source File +# Begin Source File + +SOURCE=..\src\imgproc.c +# End Source File +# Begin Source File + +SOURCE=..\src\imgproc.h +# End Source File +# Begin Source File + +SOURCE=..\src\indent.c +# End Source File +# Begin Source File + +SOURCE=..\src\inline.c +# End Source File +# Begin Source File + +SOURCE="..\src\input-method-motif.c" +# End Source File +# Begin Source File + +SOURCE="..\src\input-method-xfs.c" +# End Source File +# Begin Source File + +SOURCE="..\src\input-method-xlib.c" +# End Source File +# Begin Source File + +SOURCE=..\src\insdel.c +# End Source File +# Begin Source File + +SOURCE=..\src\insdel.h +# End Source File +# Begin Source File + +SOURCE=..\src\intl.c +# End Source File +# Begin Source File + +SOURCE="..\src\iso-wide.h" +# End Source File +# Begin Source File + +SOURCE=..\src\keymap.c +# End Source File +# Begin Source File + +SOURCE=..\src\keymap.h +# End Source File +# Begin Source File + +SOURCE=..\src\lastfile.c +# End Source File +# Begin Source File + +SOURCE=..\src\libsst.c +# End Source File +# Begin Source File + +SOURCE=..\src\libsst.h +# End Source File +# Begin Source File + +SOURCE=..\src\libst.h +# End Source File +# Begin Source File + +SOURCE="..\src\line-number.c" +# End Source File +# Begin Source File + +SOURCE="..\src\line-number.h" +# End Source File +# Begin Source File + +SOURCE=..\src\linuxplay.c +# End Source File +# Begin Source File + +SOURCE="..\src\lisp-disunion.h" +# End Source File +# Begin Source File + +SOURCE="..\src\lisp-union.h" +# End Source File +# Begin Source File + +SOURCE=..\src\lisp.h +# End Source File +# Begin Source File + +SOURCE=..\src\lread.c +# End Source File +# Begin Source File + +SOURCE=..\src\lrecord.h +# End Source File +# Begin Source File + +SOURCE=..\src\lstream.c +# End Source File +# Begin Source File + +SOURCE=..\src\lstream.h +# End Source File +# Begin Source File + +SOURCE=..\src\macros.c +# End Source File +# Begin Source File + +SOURCE=..\src\macros.h +# End Source File +# Begin Source File + +SOURCE=..\src\malloc.c +# End Source File +# Begin Source File + +SOURCE=..\src\marker.c +# End Source File +# Begin Source File + +SOURCE=..\src\md5.c +# End Source File +# Begin Source File + +SOURCE="..\src\mem-limits.h" +# End Source File +# Begin Source File + +SOURCE="..\src\menubar-msw.c" +# End Source File +# Begin Source File + +SOURCE="..\src\menubar-msw.h" +# End Source File +# Begin Source File + +SOURCE="..\src\menubar-x.c" +# End Source File +# Begin Source File + +SOURCE=..\src\menubar.c +# End Source File +# Begin Source File + +SOURCE=..\src\menubar.h +# End Source File +# Begin Source File + +SOURCE=..\src\minibuf.c +# End Source File +# Begin Source File + +SOURCE=..\src\miscplay.c +# End Source File +# Begin Source File + +SOURCE=..\src\miscplay.h +# End Source File +# Begin Source File + +SOURCE="..\src\mule-canna.c" +# End Source File +# Begin Source File + +SOURCE="..\src\mule-ccl.c" +# End Source File +# Begin Source File + +SOURCE="..\src\mule-ccl.h" +# End Source File +# Begin Source File + +SOURCE="..\src\mule-charset.c" +# End Source File +# Begin Source File + +SOURCE="..\src\mule-charset.h" +# End Source File +# Begin Source File + +SOURCE="..\src\mule-mcpath.c" +# End Source File +# Begin Source File + +SOURCE="..\src\mule-mcpath.h" +# End Source File +# Begin Source File + +SOURCE="..\src\mule-wnnfns.c" +# End Source File +# Begin Source File + +SOURCE=..\src\mule.c +# End Source File +# Begin Source File + +SOURCE=..\src\nas.c +# End Source File +# Begin Source File + +SOURCE=..\src\ndir.h +# End Source File +# Begin Source File + +SOURCE=..\src\nt.c +# End Source File +# Begin Source File + +SOURCE=..\src\nt.h +# End Source File +# Begin Source File + +SOURCE=..\src\ntheap.c +# End Source File +# Begin Source File + +SOURCE=..\src\ntheap.h +# End Source File +# Begin Source File + +SOURCE=..\src\ntplay.c +# End Source File +# Begin Source File + +SOURCE=..\src\ntproc.c +# End Source File +# Begin Source File + +SOURCE="..\src\objects-msw.c" +# End Source File +# Begin Source File + +SOURCE="..\src\objects-msw.h" +# End Source File +# Begin Source File + +SOURCE="..\src\objects-tty.c" +# End Source File +# Begin Source File + +SOURCE="..\src\objects-tty.h" +# End Source File +# Begin Source File + +SOURCE="..\src\objects-x.c" +# End Source File +# Begin Source File + +SOURCE="..\src\objects-x.h" +# End Source File +# Begin Source File + +SOURCE=..\src\objects.c +# End Source File +# Begin Source File + +SOURCE=..\src\objects.h +# End Source File +# Begin Source File + +SOURCE="..\src\offix-cursors.h" +# End Source File +# Begin Source File + +SOURCE="..\src\offix-types.h" +# End Source File +# Begin Source File + +SOURCE=..\src\offix.c +# End Source File +# Begin Source File + +SOURCE=..\src\offix.h +# End Source File +# Begin Source File + +SOURCE=..\src\opaque.c +# End Source File +# Begin Source File + +SOURCE=..\src\opaque.h +# End Source File +# Begin Source File + +SOURCE=..\src\paths.h +# End Source File +# Begin Source File + +SOURCE="..\src\pre-crt0.c" +# End Source File +# Begin Source File + +SOURCE=..\src\print.c +# End Source File +# Begin Source File + +SOURCE="..\src\process-nt.c" +# End Source File +# Begin Source File + +SOURCE="..\src\process-unix.c" +# End Source File +# Begin Source File + +SOURCE=..\src\process.c +# End Source File +# Begin Source File + +SOURCE=..\src\process.h +# End Source File +# Begin Source File + +SOURCE=..\src\procimpl.h +# End Source File +# Begin Source File + +SOURCE=..\src\profile.c +# End Source File +# Begin Source File + +SOURCE=..\src\ralloc.c +# End Source File +# Begin Source File + +SOURCE=..\src\rangetab.c +# End Source File +# Begin Source File + +SOURCE=..\src\rangetab.h +# End Source File +# Begin Source File + +SOURCE=..\src\realpath.c +# End Source File +# Begin Source File + +SOURCE="..\src\redisplay-msw.c" +# End Source File +# Begin Source File + +SOURCE="..\src\redisplay-output.c" +# End Source File +# Begin Source File + +SOURCE="..\src\redisplay-tty.c" +# End Source File +# Begin Source File + +SOURCE="..\src\redisplay-x.c" +# End Source File +# Begin Source File + +SOURCE=..\src\redisplay.c +# End Source File +# Begin Source File + +SOURCE=..\src\redisplay.h +# End Source File +# Begin Source File + +SOURCE=..\src\regex.c +# End Source File +# Begin Source File + +SOURCE=..\src\regex.h +# End Source File +# Begin Source File + +SOURCE="..\src\scrollbar-msw.c" +# End Source File +# Begin Source File + +SOURCE="..\src\scrollbar-msw.h" +# End Source File +# Begin Source File + +SOURCE="..\src\scrollbar-x.c" +# End Source File +# Begin Source File + +SOURCE="..\src\scrollbar-x.h" +# End Source File +# Begin Source File + +SOURCE=..\src\scrollbar.c +# End Source File +# Begin Source File + +SOURCE=..\src\scrollbar.h +# End Source File +# Begin Source File + +SOURCE=..\src\search.c +# End Source File +# Begin Source File + +SOURCE="..\src\select-msw.c" +# End Source File +# Begin Source File + +SOURCE="..\src\select-x.c" +# End Source File +# Begin Source File + +SOURCE=..\src\select.c +# End Source File +# Begin Source File + +SOURCE=..\src\select.h +# End Source File +# Begin Source File + +SOURCE=..\src\sgiplay.c +# End Source File +# Begin Source File + +SOURCE=..\src\sheap.c +# End Source File +# Begin Source File + +SOURCE=..\src\signal.c +# End Source File +# Begin Source File + +SOURCE=..\src\sound.c +# End Source File +# Begin Source File + +SOURCE=..\src\specifier.c +# End Source File +# Begin Source File + +SOURCE=..\src\specifier.h +# End Source File +# Begin Source File + +SOURCE=..\src\strcat.c +# End Source File +# Begin Source File + +SOURCE=..\src\strcmp.c +# End Source File +# Begin Source File + +SOURCE=..\src\strcpy.c +# End Source File +# Begin Source File + +SOURCE=..\src\strftime.c +# End Source File +# Begin Source File + +SOURCE="..\src\sunOS-fix.c" +# End Source File +# Begin Source File + +SOURCE=..\src\sunplay.c +# End Source File +# Begin Source File + +SOURCE=..\src\sunpro.c +# End Source File +# Begin Source File + +SOURCE=..\src\symbols.c +# End Source File +# Begin Source File + +SOURCE=..\src\symeval.h +# End Source File +# Begin Source File + +SOURCE=..\src\symsinit.h +# End Source File +# Begin Source File + +SOURCE=..\src\syntax.c +# End Source File +# Begin Source File + +SOURCE=..\src\syntax.h +# End Source File +# Begin Source File + +SOURCE=..\src\sysdep.c +# End Source File +# Begin Source File + +SOURCE=..\src\sysdep.h +# End Source File +# Begin Source File + +SOURCE=..\src\sysdir.h +# End Source File +# Begin Source File + +SOURCE=..\src\sysdll.c +# End Source File +# Begin Source File + +SOURCE=..\src\sysdll.h +# End Source File +# Begin Source File + +SOURCE=..\src\sysfile.h +# End Source File +# Begin Source File + +SOURCE=..\src\sysfloat.h +# End Source File +# Begin Source File + +SOURCE=..\src\sysproc.h +# End Source File +# Begin Source File + +SOURCE=..\src\syspwd.h +# End Source File +# Begin Source File + +SOURCE=..\src\syssignal.h +# End Source File +# Begin Source File + +SOURCE=..\src\systime.h +# End Source File +# Begin Source File + +SOURCE=..\src\systty.h +# End Source File +# Begin Source File + +SOURCE=..\src\syswait.h +# End Source File +# Begin Source File + +SOURCE=..\src\termcap.c +# End Source File +# Begin Source File + +SOURCE=..\src\terminfo.c +# End Source File +# Begin Source File + +SOURCE="..\src\toolbar-msw.c" +# End Source File +# Begin Source File + +SOURCE="..\src\toolbar-x.c" +# End Source File +# Begin Source File + +SOURCE=..\src\toolbar.c +# End Source File +# Begin Source File + +SOURCE=..\src\toolbar.h +# End Source File +# Begin Source File + +SOURCE=..\src\tooltalk.c +# End Source File +# Begin Source File + +SOURCE=..\src\tooltalk.h +# End Source File +# Begin Source File + +SOURCE=..\src\tparam.c +# End Source File +# Begin Source File + +SOURCE=..\src\undo.c +# End Source File +# Begin Source File + +SOURCE=..\src\unexaix.c +# End Source File +# Begin Source File + +SOURCE=..\src\unexalpha.c +# End Source File +# Begin Source File + +SOURCE=..\src\unexapollo.c +# End Source File +# Begin Source File + +SOURCE=..\src\unexconvex.c +# End Source File +# Begin Source File + +SOURCE=..\src\unexcw.c +# End Source File +# Begin Source File + +SOURCE=..\src\unexec.c +# End Source File +# Begin Source File + +SOURCE=..\src\unexelf.c +# End Source File +# Begin Source File + +SOURCE=..\src\unexelfsgi.c +# End Source File +# Begin Source File + +SOURCE=..\src\unexencap.c +# End Source File +# Begin Source File + +SOURCE=..\src\unexenix.c +# End Source File +# Begin Source File + +SOURCE=..\src\unexfreebsd.c +# End Source File +# Begin Source File + +SOURCE=..\src\unexfx2800.c +# End Source File +# Begin Source File + +SOURCE=..\src\unexhp9k3.c +# End Source File +# Begin Source File + +SOURCE=..\src\unexhp9k800.c +# End Source File +# Begin Source File + +SOURCE=..\src\unexmips.c +# End Source File +# Begin Source File + +SOURCE=..\src\unexnext.c +# End Source File +# Begin Source File + +SOURCE=..\src\unexnt.c +# End Source File +# Begin Source File + +SOURCE=..\src\unexsni.c +# End Source File +# Begin Source File + +SOURCE="..\src\unexsol2-6.c" +# End Source File +# Begin Source File + +SOURCE=..\src\unexsol2.c +# End Source File +# Begin Source File + +SOURCE=..\src\unexsunos4.c +# End Source File +# Begin Source File + +SOURCE=..\src\universe.h +# End Source File +# Begin Source File + +SOURCE="..\src\vm-limit.c" +# End Source File +# Begin Source File + +SOURCE=..\src\widget.c +# End Source File +# Begin Source File + +SOURCE=..\src\window.c +# End Source File +# Begin Source File + +SOURCE=..\src\window.h +# End Source File +# Begin Source File + +SOURCE=..\src\winslots.h +# End Source File +# Begin Source File + +SOURCE=.\xemacs.mak +# End Source File +# Begin Source File + +SOURCE=..\src\xgccache.c +# End Source File +# Begin Source File + +SOURCE=..\src\xgccache.h +# End Source File +# Begin Source File + +SOURCE=..\src\xintrinsic.h +# End Source File +# Begin Source File + +SOURCE=..\src\xintrinsicp.h +# End Source File +# Begin Source File + +SOURCE=..\src\xmmanagerp.h +# End Source File +# Begin Source File + +SOURCE=..\src\xmprimitivep.h +# End Source File +# Begin Source File + +SOURCE=..\src\xmu.c +# End Source File +# Begin Source File + +SOURCE=..\src\xmu.h +# End Source File +# End Target +# End Project diff --git a/nt/xemacs.dsw b/nt/xemacs.dsw new file mode 100644 index 0000000..e9a8ca9 --- /dev/null +++ b/nt/xemacs.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 5.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "xemacs"=".\xemacs.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/src/alloc.h b/src/alloc.h new file mode 100644 index 0000000..2d06759 --- /dev/null +++ b/src/alloc.h @@ -0,0 +1,58 @@ +/* Allocations header + Copyright (C) 2000 Olivier Galibert + +This file is part of XEmacs. + +XEmacs is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +XEmacs is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with XEmacs; see the file COPYING. If not, write to +the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* Synched up with: Not in FSF. */ + +#ifndef INCLUDED_alloc_h_ +#define INCLUDED_alloc_h_ + +struct pdump_dumpstructinfo +{ + void *data; + const struct struct_description *desc; +}; + +struct pdump_dumpopaqueinfo +{ + void *data; + size_t size; +}; + +/* staticpro structures */ +extern Lisp_Object *staticvec[]; +extern int staticidx; + +/* dumpstruct structures */ +extern struct pdump_dumpstructinfo dumpstructvec[]; +extern int dumpstructidx; + +/* dumpopaque structures */ +extern struct pdump_dumpopaqueinfo dumpopaquevec[]; +extern int dumpopaqueidx; + +/* pdump_wire structures */ +extern Lisp_Object *pdump_wirevec[]; +extern int pdump_wireidx; + +/* pdump_wire_list structures */ +extern Lisp_Object *pdump_wirevec_list[]; +extern int pdump_wireidx_list; + +#endif /* INCLUDED_alloc_h_ */ diff --git a/src/dump-id.h b/src/dump-id.h new file mode 100644 index 0000000..45dc9c1 --- /dev/null +++ b/src/dump-id.h @@ -0,0 +1,6 @@ +#ifndef INCLUDED_dump_id_h_ +#define INCLUDED_dump_id_h_ + +extern unsigned int dump_id; + +#endif diff --git a/src/dumper.c b/src/dumper.c new file mode 100644 index 0000000..1bb3172 --- /dev/null +++ b/src/dumper.c @@ -0,0 +1,1355 @@ +/* Portable data dumper for XEmacs. + Copyright (C) 1999-2000 Olivier Galibert + +This file is part of XEmacs. + +XEmacs is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +XEmacs is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with XEmacs; see the file COPYING. If not, write to +the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* Synched up with: Not in FSF. */ + +#include +#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 +#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; icount; 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; iname, + 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; isize*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; iobj))->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; jsave_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; jsave_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 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; idescription; + while (elmt) + { + f (elmt, idesc); + elmt = elmt->next; + } + } + + for (i=0; idescription; + 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; isave_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; isave_offset; + write (pdump_fd, &adr, sizeof (adr)); + } +} + +static void +pdump_dump_opaquevec (void) +{ + int i; + for (i=0; idescription; + 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; idescription; + 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; jcount; 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; isave_offset; + write (pdump_fd, &pdump_wirevec[i], sizeof (pdump_wirevec[i])); + write (pdump_fd, &obj, sizeof (obj)); + } + + for (i=0; idescription; + 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; iname, pdump_alert_undump_object[i]); + } + if (!none) + return; + + for (i=0; isignature, 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; inb_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; iexe_path && !IS_DIRECTORY_SEP (*w) && (*w != '-') && (*w != '.')); + } + while (w>exe_path && !IS_DIRECTORY_SEP (*w)); + return 0; +} + +int pdump_load(const char *argv0) +{ + char exe_path[PATH_MAX]; + char *w; +#ifdef WINDOWSNT + GetModuleFileName (NULL, exe_name, PATH_MAX); +#else /* !WINDOWSNT */ + const char *dir, *p; + + dir = argv0; + if (dir[0] == '-') + { + /* XEmacs as a login shell, oh goody! */ + dir = getenv("SHELL"); + } + + p = dir + strlen(dir); + while (p != dir && !IS_ANY_SEP (p[-1])) p--; + + if (p != dir) + { + /* invocation-name includes a directory component -- presumably it + is relative to cwd, not $PATH */ + strcpy (exe_path, dir); + } + else + { + const char *path = getenv ("PATH"); + const char *name = p; + for (;;) + { + p = path; + while (*p && *p != SEPCHAR) + p++; + if (p == path) + { + exe_path[0] = '.'; + w = exe_path + 1; + } + else + { + memcpy (exe_path, path, p - path); + w = exe_path + (p - path); + } + if (!IS_DIRECTORY_SEP (w[-1])) + { + *w++ = '/'; + } + strcpy(w, name); + + /* ### #$%$#^$^@%$^#%@$ ! */ +#ifdef access +#undef access +#endif + + if (!access (exe_path, X_OK)) + break; + if (!*p) + { + /* Oh well, let's have some kind of default */ + sprintf (exe_path, "./%s", name); + break; + } + path = p+1; + } + } +#endif /* WINDOWSNT */ + + if (pdump_file_try (exe_path)) + { + pdump_load_finish (); + return 1; + } + +#ifdef WINDOWSNT + if (pdump_resource_get ()) + { + if (pdump_load_check ()) + { + pdump_load_finish (); + return 1; + } + pdump_free (); + } +#endif + + return 0; +} diff --git a/src/dumper.h b/src/dumper.h new file mode 100644 index 0000000..901bd1c --- /dev/null +++ b/src/dumper.h @@ -0,0 +1,30 @@ +/* Portable data dumper for XEmacs. + Copyright (C) 1999-2000 Olivier Galibert + +This file is part of XEmacs. + +XEmacs is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +XEmacs is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with XEmacs; see the file COPYING. If not, write to +the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* Synched up with: Not in FSF. */ + +#ifndef INCLUDED_dumper_h +#define INCLUDED_dumper_h + +void pdump_objects_unmark (void); +void pdump (void); +int pdump_load (const char *argv0); + +#endif /* INCLUDED_dumper_h */ diff --git a/src/postgresql.c b/src/postgresql.c new file mode 100644 index 0000000..724b043 --- /dev/null +++ b/src/postgresql.c @@ -0,0 +1,2133 @@ +/* + postgresql.c -- Emacs Lisp binding to libpq.so + Copyright (C) 2000 Electrotechnical Laboratory, JAPAN. + Licensed to the Free Software Foundation. + + Author: SL Baur + Maintainer: SL Baur + +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 + +/* 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 +/* 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, "#"); /* 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, "#", /* evil! */ + !strlen (host) ? "localhost" : host, + port, + user, + db); + } + else if (cst == CONNECTION_BAD) + strcpy (buf, "#"); /* evil! */ + else + strcpy (buf, "#"); /* 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 "#" +#define RESULT_CMD_TUPLES_FMT "#" +#define RESULT_DEFAULT_FMT "#" +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, "#"); /* 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 = "#"; + 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 to stdout" +asynchronously, that is without blocking. Having issued the COPY command +and gotten a PGRES_COPY_OUT response, the app should call PQconsumeInput +and this routine until the end-of-data signal is detected. Unlike +PQgetline, this routine takes responsibility for detecting end-of-data. + +On each call, PQgetlineAsync will return data if a complete newline- +terminated data line is available in libpq's input buffer, or if the +incoming data line is too long to fit in the buffer offered by the caller. +Otherwise, no data is returned until the rest of the line arrives. + +If -1 is returned, the end-of-data signal has been recognized (and removed +from libpq's input buffer). The caller *must* next call PQendcopy and +then return to normal processing. + +RETURNS: + -1 if the end-of-copy-data marker has been recognized + 0 if no data is available + >0 the number of bytes returned. +The data returned will not extend beyond a newline character. If possible +a whole line will be returned at one time. But if the buffer offered by +the caller is too small to hold a line sent by the backend, then a partial +data line will be returned. This can be detected by testing whether the +last returned byte is '\n' or not. +The returned string is *not* null-terminated. +*/ + (conn)) +{ + PGconn *P; + char buffer[BLCKSZ]; + int ret; + + CHECK_PGCONN (conn); + + P = (XPGCONN (conn))->pgconn; + CHECK_LIVE_CONNECTION (P); + + ret = PQgetlineAsync (P, buffer, sizeof (buffer)); + + if (ret == -1) return Qt; /* done! */ + else if (!ret) return Qnil; /* no data yet */ + else return Fcons (make_int (ret), + make_ext_string (buffer, ret, PG_OS_CODING)); +} + +DEFUN ("pq-put-nbytes", Fpq_put_nbytes, 2, 2, 0, /* +Asynchronous copy out. +*/ + (conn, data)) +{ + /* NULs are not allowed. I don't think this matters at this time. */ + PGconn *P; + char *c_data; + + CHECK_PGCONN (conn); + CHECK_STRING (data); + + P = (XPGCONN (conn))->pgconn; + CHECK_LIVE_CONNECTION (P); + TO_EXTERNAL_FORMAT (LISP_STRING, data, + C_STRING_ALLOCA, c_data, Qnative); + + return !PQputnbytes (P, c_data, strlen (c_data)) ? Qt : Qnil; +} + +DEFUN ("pq-end-copy", Fpq_end_copy, 1, 1, 0, /* +End a copying operation. +*/ + (conn)) +{ + PGconn *P; + + CHECK_PGCONN (conn); + P = (XPGCONN (conn))->pgconn; + CHECK_LIVE_CONNECTION (P); + + return PQendcopy (P) ? Qt : Qnil; +} + +/* The setenv suite of functions. The author of the libpq manual doesn't + know a whole lot about them, and neither do I. +*/ +#if !defined (HAVE_POSTGRESQLV7) || defined (LIBPQ_7_0_IS_FIXED) +DEFUN ("pq-setenv", Fpq_setenv, 1, 1, 0, /* +Set environmental parameters on the backend synchronously. +Returns t if the operation was successful, nil otherwise. +*/ + (conn)) +{ + PGconn *P; + + CHECK_PGCONN (conn); + P = (XPGCONN (conn))->pgconn; + CHECK_LIVE_CONNECTION (P); + + return PQsetenv (P) ? Qt : Qnil; +} +#endif + +#ifdef LIBPQ_7_0_IS_FIXED + +DEFUN ("pq-setenv-start", Fpq_setenv_start, 1, 1, 0, /* +Set environmental parameters on the backend asynchronously. +A PGsetenvHandle is returned on success, nil otherwise. +*/ + (conn)) +{ + PGconn *P; + PGsetenvHandle *handle; + Lisp_setenvHandle *lseh; + + CHECK_PGCONN (conn); + P = (XPGCONN (conn))->pgconn; + CHECK_LIVE_CONNECTION (P); + + handle = PQsetenvStart (P); + if (!handle) error ("out of memory?"); + + lseh = allocate_pgsetenv (); + lseh->setenv = handle; + + return make_pgsetenv (lseh); +} + +DEFUN ("pq-setenv-poll", Fpq_setenv_poll, 1, 1, 0, /* +Poll an asynchronous setenv operation for completion. +*/ + (conn)) +{ + PGconn *P; + PostgresPollingStatusType pst; + + CHECK_PGCONN (conn); + P = (XPGCONN (conn))->pgconn; + CHECK_LIVE_CONNECTION (P); + + pst = PQsetenvPoll (P); + switch (pst) + { + case PGRES_POLLING_FAILED: + /* Something Bad has happened */ + { + char *e = PQerrorMessage (P); + error ("libpq: %s", e); + } + case PGRES_POLLING_OK: + return Qpgres_polling_ok; + case PGRES_POLLING_READING: + return Qpgres_polling_reading; + case PGRES_POLLING_WRITING: + return Qpgres_polling_writing; + case PGRES_POLLING_ACTIVE: + return Qpgres_polling_active; + default: + /* they've added a new field we don't know about */ + error ("Help! Unknown status code %08x from backend!", PS); + } +} + +DEFUN ("pq-setenv-abort", Fpq_setenv_abort, 1, 1, 0, /* +Attempt to abort an in-progress asynchronous setenv operation. +*/ + (handle)) +{ + PGsetenvHandle *h; + + CHECK_PGSETENV (handle); + h = (XPGSETENV (handle))->pgsetenv; + PUKE_IF_NULL (h); + + PQsetenvAbort (h); + /* PQsetenvAbort usually free(3)'s the handle, don't take any chances. */ + (XSETENV (handle))->pgsetenv = (PGsetenvHandle *)NULL; + + return Qt; +} +#endif /* LIBPQ_7_0_IS_FIXED */ + +void +syms_of_postgresql(void) +{ +#ifndef RUNNING_XEMACS_21_1 + INIT_LRECORD_IMPLEMENTATION (pgconn); + INIT_LRECORD_IMPLEMENTATION (pgresult); +#ifdef LIBPQ_7_0_IS_FIXED + INIT_LRECORD_IMPLEMENTATION (pgsetenv); +#endif +#endif + defsymbol (&Qpostgresql, "postgresql"); + + /* opaque exported types */ + defsymbol (&Qpgconnp, "pgconnp"); + defsymbol (&Qpgresultp, "pgresultp"); + + /* connection status types */ + defsymbol (&Qpg_connection_ok, "pg::connection-ok"); + defsymbol (&Qpg_connection_bad, "pg::connection-bad"); + defsymbol (&Qpg_connection_started, "pg::connection-started"); + defsymbol (&Qpg_connection_made, "pg::connection-made"); + defsymbol (&Qpg_connection_awaiting_response, "pg::connection-awaiting-response"); + defsymbol (&Qpg_connection_auth_ok, "pg::connection-auth-ok"); + defsymbol (&Qpg_connection_setenv, "pg::connection-setenv"); + + /* Fields of PGconn */ + defsymbol (&Qpqdb, "pq::db"); + defsymbol (&Qpquser, "pq::user"); + defsymbol (&Qpqpass, "pq::pass"); + defsymbol (&Qpqhost, "pq::host"); + defsymbol (&Qpqport, "pq::port"); + defsymbol (&Qpqtty, "pq::tty"); + defsymbol (&Qpqoptions, "pq::options"); + defsymbol (&Qpqstatus, "pq::status"); + defsymbol (&Qpqerrormessage, "pq::error-message"); + defsymbol (&Qpqbackendpid, "pq::backend-pid"); + + /* Query status results */ + defsymbol (&Qpgres_empty_query, "pgres::empty-query"); + defsymbol (&Qpgres_command_ok, "pgres::command-ok"); + defsymbol (&Qpgres_tuples_ok, "pgres::tuples-ok"); + defsymbol (&Qpgres_copy_out, "pgres::copy-out"); + defsymbol (&Qpgres_copy_in, "pgres::copy-in"); + defsymbol (&Qpgres_bad_response, "pgres::bad-response"); + defsymbol (&Qpgres_nonfatal_error, "pgres::nonfatal-error"); + defsymbol (&Qpgres_fatal_error, "pgres::fatal-error"); + + /* Poll status results */ + defsymbol (&Qpgres_polling_failed, "pgres::polling-failed"); + defsymbol (&Qpgres_polling_reading, "pgres::polling-reading"); + defsymbol (&Qpgres_polling_writing, "pgres::polling-writing"); + defsymbol (&Qpgres_polling_ok, "pgres::polling-ok"); + defsymbol (&Qpgres_polling_active, "pgres::polling-active"); + +#ifdef HAVE_POSTGRESQLV7 + DEFSUBR (Fpq_connect_start); + DEFSUBR (Fpq_connect_poll); +#ifdef MULE + DEFSUBR (Fpq_client_encoding); + DEFSUBR (Fpq_set_client_encoding); +#endif /* MULE */ +#endif /* HAVE_POSTGRESQLV7 */ + DEFSUBR (Fpq_conn_defaults); + DEFSUBR (Fpq_connectdb); + DEFSUBR (Fpq_finish); + DEFSUBR (Fpq_clear); + DEFSUBR (Fpq_is_busy); + DEFSUBR (Fpq_consume_input); + + DEFSUBR (Fpq_reset); +#ifdef HAVE_POSTGRESQLV7 + DEFSUBR (Fpq_reset_start); + DEFSUBR (Fpq_reset_poll); +#endif + DEFSUBR (Fpq_request_cancel); + DEFSUBR (Fpq_pgconn); + + DEFSUBR (Fpq_exec); + DEFSUBR (Fpq_send_query); + DEFSUBR (Fpq_get_result); + DEFSUBR (Fpq_result_status); + DEFSUBR (Fpq_res_status); + DEFSUBR (Fpq_result_error_message); + DEFSUBR (Fpq_ntuples); + DEFSUBR (Fpq_nfields); + DEFSUBR (Fpq_binary_tuples); + DEFSUBR (Fpq_fname); + DEFSUBR (Fpq_fnumber); + DEFSUBR (Fpq_ftype); + DEFSUBR (Fpq_fsize); + DEFSUBR (Fpq_fmod); + /***/ + DEFSUBR (Fpq_get_value); + DEFSUBR (Fpq_get_length); + DEFSUBR (Fpq_get_is_null); + DEFSUBR (Fpq_cmd_status); + DEFSUBR (Fpq_cmd_tuples); + DEFSUBR (Fpq_oid_value); + +#ifdef HAVE_POSTGRESQLV7 + DEFSUBR (Fpq_set_nonblocking); + DEFSUBR (Fpq_is_nonblocking); + DEFSUBR (Fpq_flush); +#endif + DEFSUBR (Fpq_notifies); + +#if defined (HAVE_POSTGRESQLV7) && defined(MULE) + DEFSUBR (Fpq_env_2_encoding); +#endif + + DEFSUBR (Fpq_lo_import); + DEFSUBR (Fpq_lo_export); + + DEFSUBR (Fpq_make_empty_pgresult); + + /* copy in/out functions */ + DEFSUBR (Fpq_get_line); + DEFSUBR (Fpq_put_line); + DEFSUBR (Fpq_get_line_async); + DEFSUBR (Fpq_put_nbytes); + DEFSUBR (Fpq_end_copy); + + /* The value of the setenv functions is questioned in the libpq manual. */ +#if !defined (HAVE_POSTGRESQLV7) || defined (LIBPQ_7_0_IS_FIXED) + DEFSUBR (Fpq_setenv); +#endif +#ifdef LIBPQ_7_0_IS_FIXED + DEFSUBR (Fpq_setenv_start); + DEFSUBR (Fpq_setenv_poll); + DEFSUBR (Fpq_setenv_abort); +#endif /* LIBPQ_7_0_IS_FIXED */ +} + +void +vars_of_postgresql(void) +{ + char *p; + + Fprovide (Qpostgresql); +#ifdef HAVE_POSTGRESQLV7 + Fprovide (intern ("postgresqlv7")); +#endif +#ifndef RUNNING_XEMACS_21_1 + Vpg_coding_system = Qnative; + DEFVAR_LISP ("pg-coding-system", &Vpg_coding_system /* +Default Postgres client coding system. +*/ ); +#endif + + if ((p = getenv ("PGHOST"))) + { + VXPGHOST = build_ext_string (p, PG_OS_CODING); + } + else + { + VXPGHOST = Qnil; + } + DEFVAR_LISP ("pg:host", &VXPGHOST /* +Default PostgreSQL server name. +If not set, the server running on the local host is used. The +initial value is set from the PGHOST environment variable. +*/ ); + + if ((p = getenv ("PGUSER"))) + { + VXPGUSER = build_ext_string (p, PG_OS_CODING); + } + else + { + VXPGUSER = Qnil; + } + DEFVAR_LISP ("pg:user", &VXPGUSER /* +Default PostgreSQL user name. +This value is used when connecting to a database for authentication. +The initial value is set from the PGUSER environment variable. +*/ ); + + if ((p = getenv ("PGOPTIONS"))) + { + VXPGOPTIONS = build_ext_string (p, PG_OS_CODING); + } + else + { + VXPGOPTIONS = Qnil; + } + DEFVAR_LISP ("pg:options", &VXPGOPTIONS /* +Default PostgreSQL user name. +This value is used when connecting to a database for authentication. +The initial value is set from the PGUSER environment variable. +*/ ); + + if ((p = getenv ("PGPORT"))) + { + VXPGPORT = make_int (atoi (p)); + } + else + { + VXPGPORT = Qnil; + } + DEFVAR_LISP ("pg:port", &VXPGPORT /* +Default port to connect to PostgreSQL backend. +This value is used when connecting to a database. +The initial value is set from the PGPORT environment variable. +*/ ); + + if ((p = getenv ("PGTTY"))) + { + VXPGTTY = build_ext_string (p, PG_OS_CODING); + } + else + { + VXPGTTY = Qnil; + } + DEFVAR_LISP ("pg:tty", &VXPGTTY /* +Default debugging TTY. +There is no useful setting of this variable in the XEmacs Lisp API. +The initial value is set from the PGTTY environment variable. +*/ ); + + if ((p = getenv ("PGDATABASE"))) + { + VXPGDATABASE = build_ext_string (p, PG_OS_CODING); + } + else + { + VXPGDATABASE = Qnil; + } + DEFVAR_LISP ("pg:database", &VXPGDATABASE /* +Default database to connect to. +The initial value is set from the PGDATABASE environment variable. +*/ ); + + if ((p = getenv ("PGREALM"))) + { + VXPGREALM = build_ext_string (p, PG_OS_CODING); + } + else + { + VXPGREALM = Qnil; + } + DEFVAR_LISP ("pg:realm", &VXPGREALM /* +Default kerberos realm to use for authentication. +The initial value is set from the PGREALM environment variable. +*/ ); + +#ifdef MULE + /* It's not clear whether this is any use. My intent is to + autodetect the coding system from the database. */ + if ((p = getenv ("PGCLIENTENCODING"))) + { + VXPGCLIENTENCODING = build_ext_string (p, PG_OS_CODING); + } + else + { + VXPGCLIENTENCODING = Qnil; + } + DEFVAR_LISP ("pg:client-encoding", &VXPGCLIENTENCODING /* +Default client encoding to use. +The initial value is set from the PGCLIENTENCODING environment variable. +*/ ); +#endif + +#if !defined(HAVE_POSTGRESQLV7) + if ((p = getenv ("PGAUTHTYPE"))) + { + VXPGAUTHTYPE = build_ext_string (p, PG_OS_CODING); + } + else + { + VXPGAUTHTYPE = Qnil; + } + DEFVAR_LISP ("pg:authtype", &VXPGAUTHTYPE /* +Default authentication to use. +The initial value is set from the PGAUTHTYPE environment variable. + +WARNING: This variable has gone away in versions of PostgreSQL newer +than 6.5. +*/ ); +#endif + + if ((p = getenv ("PGGEQO"))) + { + VXPGGEQO = build_ext_string (p, PG_OS_CODING); + } + else + { + VXPGGEQO = Qnil; + } + DEFVAR_LISP ("pg:geqo", &VXPGGEQO /* +Genetic Query Optimizer options. +The initial value is set from the PGGEQO environment variable. +*/ ); + + if ((p = getenv ("PGCOSTINDEX"))) + { + VXPGCOSTINDEX = build_ext_string (p, PG_OS_CODING); + } + else + { + VXPGCOSTINDEX = Qnil; + } + DEFVAR_LISP ("pg:cost-index", &VXPGCOSTINDEX /* +Default cost index options. +The initial value is set from the PGCOSTINDEX environment variable. +*/ ); + + if ((p = getenv ("PGCOSTHEAP"))) + { + VXPGCOSTHEAP = build_ext_string (p, PG_OS_CODING); + } + else + { + VXPGCOSTHEAP = Qnil; + } + DEFVAR_LISP ("pg:cost-heap", &VXPGCOSTHEAP /* +Default cost heap options. +The initial value is set from the PGCOSTHEAP environment variable. +*/ ); + + if ((p = getenv ("PGTZ"))) + { + VXPGTZ = build_ext_string (p, PG_OS_CODING); + } + else + { + VXPGTZ = Qnil; + } + DEFVAR_LISP ("pg:tz", &VXPGTZ /* +Default timezone to use. +The initial value is set from the PGTZ environment variable. +*/ ); + + if ((p = getenv ("PGDATESTYLE"))) + { + VXPGDATESTYLE = build_ext_string (p, PG_OS_CODING); + } + else + { + VXPGDATESTYLE = Qnil; + } + DEFVAR_LISP ("pg:date-style", &VXPGDATESTYLE /* +Default date style to use. +The initial value is set from the PGDATESTYLE environment variable. +*/ ); +} diff --git a/src/postgresql.h b/src/postgresql.h new file mode 100644 index 0000000..e13d96a --- /dev/null +++ b/src/postgresql.h @@ -0,0 +1,87 @@ +/* + postgresql.h -- Emacs Lisp binding to libpq.so + Copyright (C) 2000 Electrotechnical Laboratory, JAPAN. + Licensed to the Free Software Foundation. + + Author: SL Baur + Maintainer: SL Baur + +Please send patches to this file to me first before submitting them to +xemacs-patches. +*/ + +#ifndef XEMACS_POSTGRESQL_H__ +#define XEMACS_POSTGRESQL_H__ 1 + +#define BLCKSZ 8192 /* size of a default Postres disk block */ +/* + This file contains the GCC bug workaround code for the private + LRECORD types. +*/ + +/* PGconn is an opaque object and we need to be able to store them in + Lisp code because libpq supports multiple connections. +*/ +struct Lisp_PGconn +{ + struct lcrecord_header header; + PGconn *pgconn; +}; +typedef struct Lisp_PGconn Lisp_PGconn; + +DECLARE_LRECORD (pgconn, Lisp_PGconn); + +#define XPGCONN(x) XRECORD (x, pgconn, Lisp_PGconn) +#define XSETPGCONN(x, p) XSETRECORD (x, p, pgconn) +#define PGCONNP(x) RECORDP (x, pgconn) +#define CHECK_PGCONN(x) CHECK_RECORD (x, pgconn) +#define CONCHECK_PGCONN(x) CONCHECK_RECORD (x, pgconn) + +/****/ + +/* PGresult is an opaque object and we need to be able to store them in + Lisp code. +*/ +struct Lisp_PGresult +{ + struct lcrecord_header header; + PGresult *pgresult; +}; +typedef struct Lisp_PGresult Lisp_PGresult; + +DECLARE_LRECORD (pgresult, Lisp_PGresult); + +#define XPGRESULT(x) XRECORD (x, pgresult, Lisp_PGresult) +#define XSETPGRESULT(x, p) XSETRECORD (x, p, pgresult) +#define PGRESULTP(x) RECORDP (x, pgresult) +#define CHECK_PGRESULT(x) CHECK_RECORD (x, pgresult) +#define CONCHECK_PGRESULT(x) CONCHECK_RECORD (x, pgresult) + +/****/ +#ifdef HAVE_POSTGRESQLV7 + +#ifdef LIBPQ_7_0_IS_FIXED /* this is broken in released 7.0b1 */ + +/* PGsetenvHandle is an opaque object and we need to be able to store + them in Lisp code in order to make asynchronous environment calls. +*/ +struct Lisp_PGsetenvHandle +{ + struct lcrecord_header header; + PGsetenvHandle *pgsetenv; +}; +typedef struct Lisp_PGsetenvHandle Lisp_PGsetenvHandle; + +DECLARE_LRECORD (pgsetenv, Lisp_PGsetenvHandle); + +#define XPGSETENV(x) XRECORD (x, pgsetenv, Lisp_PGsetenvHandle) +#define XSETPGSETENV(x, p) XSETRECORD (x, p, pgsetenv) +#define PGSETENVP(x) RECORDP (x, pgsetenv) +#define CHECK_PGSETENV(x) CHECK_RECORD (x, pgsetenv) +#define CONCHECK_PGSETENV(x) CONCHECK_RECORD (x, pgsetenv) + +#endif /* LIBPQ_7_0_IS_FIXED */ + +#endif /* HAVE_POSTGRESQLV7 */ + +#endif /* XEMACS_POSTGRESQL_H__ */ diff --git a/tests/automated/c-tests.el b/tests/automated/c-tests.el new file mode 100644 index 0000000..718cdb1 --- /dev/null +++ b/tests/automated/c-tests.el @@ -0,0 +1,43 @@ +;; Copyright (C) 2000 Martin Buchholz + +;; Author: Martin Buchholz +;; Maintainer: Martin Buchholz +;; 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)))))