Merge r21-4-11-chise-0_20-=ucs.
[chise/xemacs-chise.git] / info / internals.info-7
diff --git a/info/internals.info-7 b/info/internals.info-7
deleted file mode 100644 (file)
index 79231c6..0000000
+++ /dev/null
@@ -1,1214 +0,0 @@
-This is Info file ../../info/internals.info, produced by Makeinfo
-version 1.68 from the input file internals.texi.
-
-INFO-DIR-SECTION XEmacs Editor
-START-INFO-DIR-ENTRY
-* Internals: (internals).      XEmacs Internals Manual.
-END-INFO-DIR-ENTRY
-
-   Copyright (C) 1992 - 1996 Ben Wing.  Copyright (C) 1996, 1997 Sun
-Microsystems.  Copyright (C) 1994 - 1998 Free Software Foundation.
-Copyright (C) 1994, 1995 Board of Trustees, University of Illinois.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided that the
-entire resulting derived work is distributed under the terms of a
-permission notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that this permission notice may be stated in a
-translation approved by the Foundation.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the section entitled "GNU General Public License" is included
-exactly as in the original, and provided that the entire resulting
-derived work is distributed under the terms of a permission notice
-identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that the section entitled "GNU General Public License"
-may be included in a translation approved by the Free Software
-Foundation instead of in the original English.
-
-\1f
-File: internals.info,  Node: Buffer Lists,  Next: Markers and Extents,  Prev: The Text in a Buffer,  Up: Buffers and Textual Representation
-
-Buffer Lists
-============
-
-   Recall earlier that buffers are "permanent" objects, i.e.  that they
-remain around until explicitly deleted.  This entails that there is a
-list of all the buffers in existence.  This list is actually an
-assoc-list (mapping from the buffer's name to the buffer) and is stored
-in the global variable `Vbuffer_alist'.
-
-   The order of the buffers in the list is important: the buffers are
-ordered approximately from most-recently-used to least-recently-used.
-Switching to a buffer using `switch-to-buffer', `pop-to-buffer', etc.
-and switching windows using `other-window', etc.  usually brings the
-new current buffer to the front of the list.  `switch-to-buffer',
-`other-buffer', etc. look at the beginning of the list to find an
-alternative buffer to suggest.  You can also explicitly move a buffer
-to the end of the list using `bury-buffer'.
-
-   In addition to the global ordering in `Vbuffer_alist', each frame
-has its own ordering of the list.  These lists always contain the same
-elements as in `Vbuffer_alist' although possibly in a different order.
-`buffer-list' normally returns the list for the selected frame.  This
-allows you to work in separate frames without things interfering with
-each other.
-
-   The standard way to look up a buffer given a name is `get-buffer',
-and the standard way to create a new buffer is `get-buffer-create',
-which looks up a buffer with a given name, creating a new one if
-necessary.  These operations correspond exactly with the symbol
-operations `intern-soft' and `intern', respectively.  You can also
-force a new buffer to be created using `generate-new-buffer', which
-takes a name and (if necessary) makes a unique name from this by
-appending a number, and then creates the buffer.  This is basically
-like the symbol operation `gensym'.
-
-\1f
-File: internals.info,  Node: Markers and Extents,  Next: Bufbytes and Emchars,  Prev: Buffer Lists,  Up: Buffers and Textual Representation
-
-Markers and Extents
-===================
-
-   Among the things associated with a buffer are things that are
-logically attached to certain buffer positions.  This can be used to
-keep track of a buffer position when text is inserted and deleted, so
-that it remains at the same spot relative to the text around it; to
-assign properties to particular sections of text; etc.  There are two
-such objects that are useful in this regard: they are "markers" and
-"extents".
-
-   A "marker" is simply a flag placed at a particular buffer position,
-which is moved around as text is inserted and deleted.  Markers are
-used for all sorts of purposes, such as the `mark' that is the other
-end of textual regions to be cut, copied, etc.
-
-   An "extent" is similar to two markers plus some associated
-properties, and is used to keep track of regions in a buffer as text is
-inserted and deleted, and to add properties (e.g. fonts) to particular
-regions of text.  The external interface of extents is explained
-elsewhere.
-
-   The important thing here is that markers and extents simply contain
-buffer positions in them as integers, and every time text is inserted or
-deleted, these positions must be updated.  In order to minimize the
-amount of shuffling that needs to be done, the positions in markers and
-extents (there's one per marker, two per extent) and stored in Meminds.
-This means that they only need to be moved when the text is physically
-moved in memory; since the gap structure tries to minimize this, it also
-minimizes the number of marker and extent indices that need to be
-adjusted.  Look in `insdel.c' for the details of how this works.
-
-   One other important distinction is that markers are "temporary"
-while extents are "permanent".  This means that markers disappear as
-soon as there are no more pointers to them, and correspondingly, there
-is no way to determine what markers are in a buffer if you are just
-given the buffer.  Extents remain in a buffer until they are detached
-(which could happen as a result of text being deleted) or the buffer is
-deleted, and primitives do exist to enumerate the extents in a buffer.
-
-\1f
-File: internals.info,  Node: Bufbytes and Emchars,  Next: The Buffer Object,  Prev: Markers and Extents,  Up: Buffers and Textual Representation
-
-Bufbytes and Emchars
-====================
-
-   Not yet documented.
-
-\1f
-File: internals.info,  Node: The Buffer Object,  Prev: Bufbytes and Emchars,  Up: Buffers and Textual Representation
-
-The Buffer Object
-=================
-
-   Buffers contain fields not directly accessible by the Lisp
-programmer.  We describe them here, naming them by the names used in
-the C code.  Many are accessible indirectly in Lisp programs via Lisp
-primitives.
-
-`name'
-     The buffer name is a string that names the buffer.  It is
-     guaranteed to be unique.  *Note Buffer Names: (lispref)Buffer
-     Names.
-
-`save_modified'
-     This field contains the time when the buffer was last saved, as an
-     integer.  *Note Buffer Modification: (lispref)Buffer Modification.
-
-`modtime'
-     This field contains the modification time of the visited file.  It
-     is set when the file is written or read.  Every time the buffer is
-     written to the file, this field is compared to the modification
-     time of the file.  *Note Buffer Modification: (lispref)Buffer
-     Modification.
-
-`auto_save_modified'
-     This field contains the time when the buffer was last auto-saved.
-
-`last_window_start'
-     This field contains the `window-start' position in the buffer as of
-     the last time the buffer was displayed in a window.
-
-`undo_list'
-     This field points to the buffer's undo list.  *Note Undo:
-     (lispref)Undo.
-
-`syntax_table_v'
-     This field contains the syntax table for the buffer.  *Note Syntax
-     Tables: (lispref)Syntax Tables.
-
-`downcase_table'
-     This field contains the conversion table for converting text to
-     lower case.  *Note Case Tables: (lispref)Case Tables.
-
-`upcase_table'
-     This field contains the conversion table for converting text to
-     upper case.  *Note Case Tables: (lispref)Case Tables.
-
-`case_canon_table'
-     This field contains the conversion table for canonicalizing text
-     for case-folding search.  *Note Case Tables: (lispref)Case Tables.
-
-`case_eqv_table'
-     This field contains the equivalence table for case-folding search.
-     *Note Case Tables: (lispref)Case Tables.
-
-`display_table'
-     This field contains the buffer's display table, or `nil' if it
-     doesn't have one.  *Note Display Tables: (lispref)Display Tables.
-
-`markers'
-     This field contains the chain of all markers that currently point
-     into the buffer.  Deletion of text in the buffer, and motion of
-     the buffer's gap, must check each of these markers and perhaps
-     update it.  *Note Markers: (lispref)Markers.
-
-`backed_up'
-     This field is a flag that tells whether a backup file has been
-     made for the visited file of this buffer.
-
-`mark'
-     This field contains the mark for the buffer.  The mark is a marker,
-     hence it is also included on the list `markers'.  *Note The Mark:
-     (lispref)The Mark.
-
-`mark_active'
-     This field is non-`nil' if the buffer's mark is active.
-
-`local_var_alist'
-     This field contains the association list describing the variables
-     local in this buffer, and their values, with the exception of
-     local variables that have special slots in the buffer object.
-     (Those slots are omitted from this table.)  *Note Buffer-Local
-     Variables: (lispref)Buffer-Local Variables.
-
-`modeline_format'
-     This field contains a Lisp object which controls how to display
-     the mode line for this buffer.  *Note Modeline Format:
-     (lispref)Modeline Format.
-
-`base_buffer'
-     This field holds the buffer's base buffer (if it is an indirect
-     buffer), or `nil'.
-
-\1f
-File: internals.info,  Node: MULE Character Sets and Encodings,  Next: The Lisp Reader and Compiler,  Prev: Buffers and Textual Representation,  Up: Top
-
-MULE Character Sets and Encodings
-*********************************
-
-   Recall that there are two primary ways that text is represented in
-XEmacs.  The "buffer" representation sees the text as a series of bytes
-(Bufbytes), with a variable number of bytes used per character.  The
-"character" representation sees the text as a series of integers
-(Emchars), one per character.  The character representation is a cleaner
-representation from a theoretical standpoint, and is thus used in many
-cases when lots of manipulations on a string need to be done.  However,
-the buffer representation is the standard representation used in both
-Lisp strings and buffers, and because of this, it is the "default"
-representation that text comes in.  The reason for using this
-representation is that it's compact and is compatible with ASCII.
-
-* Menu:
-
-* Character Sets::
-* Encodings::
-* Internal Mule Encodings::
-* CCL::
-
-\1f
-File: internals.info,  Node: Character Sets,  Next: Encodings,  Up: MULE Character Sets and Encodings
-
-Character Sets
-==============
-
-   A character set (or "charset") is an ordered set of characters.  A
-particular character in a charset is indexed using one or more
-"position codes", which are non-negative integers.  The number of
-position codes needed to identify a particular character in a charset is
-called the "dimension" of the charset.  In XEmacs/Mule, all charsets
-have dimension 1 or 2, and the size of all charsets (except for a few
-special cases) is either 94, 96, 94 by 94, or 96 by 96.  The range of
-position codes used to index characters from any of these types of
-character sets is as follows:
-
-     Charset type            Position code 1         Position code 2
-     ------------------------------------------------------------
-     94                      33 - 126                N/A
-     96                      32 - 127                N/A
-     94x94                   33 - 126                33 - 126
-     96x96                   32 - 127                32 - 127
-
-   Note that in the above cases position codes do not start at an
-expected value such as 0 or 1.  The reason for this will become clear
-later.
-
-   For example, Latin-1 is a 96-character charset, and JISX0208 (the
-Japanese national character set) is a 94x94-character charset.
-
-   [Note that, although the ranges above define the *valid* position
-codes for a charset, some of the slots in a particular charset may in
-fact be empty.  This is the case for JISX0208, for example, where (e.g.)
-all the slots whose first position code is in the range 118 - 127 are
-empty.]
-
-   There are three charsets that do not follow the above rules.  All of
-them have one dimension, and have ranges of position codes as follows:
-
-     Charset name            Position code 1
-     ------------------------------------
-     ASCII                   0 - 127
-     Control-1               0 - 31
-     Composite               0 - some large number
-
-   (The upper bound of the position code for composite characters has
-not yet been determined, but it will probably be at least 16,383).
-
-   ASCII is the union of two subsidiary character sets: Printing-ASCII
-(the printing ASCII character set, consisting of position codes 33 -
-126, like for a standard 94-character charset) and Control-ASCII (the
-non-printing characters that would appear in a binary file with codes 0
-- 32 and 127).
-
-   Control-1 contains the non-printing characters that would appear in a
-binary file with codes 128 - 159.
-
-   Composite contains characters that are generated by overstriking one
-or more characters from other charsets.
-
-   Note that some characters in ASCII, and all characters in Control-1,
-are "control" (non-printing) characters.  These have no printed
-representation but instead control some other function of the printing
-(e.g. TAB or 8 moves the current character position to the next tab
-stop).  All other characters in all charsets are "graphic" (printing)
-characters.
-
-   When a binary file is read in, the bytes in the file are assigned to
-character sets as follows:
-
-     Bytes           Character set           Range
-     --------------------------------------------------
-     0 - 127         ASCII                   0 - 127
-     128 - 159       Control-1               0 - 31
-     160 - 255       Latin-1                 32 - 127
-
-   This is a bit ad-hoc but gets the job done.
-
-\1f
-File: internals.info,  Node: Encodings,  Next: Internal Mule Encodings,  Prev: Character Sets,  Up: MULE Character Sets and Encodings
-
-Encodings
-=========
-
-   An "encoding" is a way of numerically representing characters from
-one or more character sets.  If an encoding only encompasses one
-character set, then the position codes for the characters in that
-character set could be used directly.  This is not possible, however, if
-more than one character set is to be used in the encoding.
-
-   For example, the conversion detailed above between bytes in a binary
-file and characters is effectively an encoding that encompasses the
-three character sets ASCII, Control-1, and Latin-1 in a stream of 8-bit
-bytes.
-
-   Thus, an encoding can be viewed as a way of encoding characters from
-a specified group of character sets using a stream of bytes, each of
-which contains a fixed number of bits (but not necessarily 8, as in the
-common usage of "byte").
-
-   Here are descriptions of a couple of common encodings:
-
-* Menu:
-
-* Japanese EUC (Extended Unix Code)::
-* JIS7::
-
-\1f
-File: internals.info,  Node: Japanese EUC (Extended Unix Code),  Next: JIS7,  Up: Encodings
-
-Japanese EUC (Extended Unix Code)
----------------------------------
-
-   This encompasses the character sets Printing-ASCII,
-Japanese-JISX0201, and Japanese-JISX0208-Kana (half-width katakana, the
-right half of JISX0201).  It uses 8-bit bytes.
-
-   Note that Printing-ASCII and Japanese-JISX0201-Kana are 94-character
-charsets, while Japanese-JISX0208 is a 94x94-character charset.
-
-   The encoding is as follows:
-
-     Character set            Representation (PC=position-code)
-     -------------            --------------
-     Printing-ASCII           PC1
-     Japanese-JISX0201-Kana   0x8E       | PC1 + 0x80
-     Japanese-JISX0208        PC1 + 0x80 | PC2 + 0x80
-     Japanese-JISX0212        PC1 + 0x80 | PC2 + 0x80
-
-\1f
-File: internals.info,  Node: JIS7,  Prev: Japanese EUC (Extended Unix Code),  Up: Encodings
-
-JIS7
-----
-
-   This encompasses the character sets Printing-ASCII,
-Japanese-JISX0201-Roman (the left half of JISX0201; this character set
-is very similar to Printing-ASCII and is a 94-character charset),
-Japanese-JISX0208, and Japanese-JISX0201-Kana.  It uses 7-bit bytes.
-
-   Unlike Japanese EUC, this is a "modal" encoding, which means that
-there are multiple states that the encoding can be in, which affect how
-the bytes are to be interpreted.  Special sequences of bytes (called
-"escape sequences") are used to change states.
-
-   The encoding is as follows:
-
-     Character set              Representation (PC=position-code)
-     -------------              --------------
-     Printing-ASCII             PC1
-     Japanese-JISX0201-Roman    PC1
-     Japanese-JISX0201-Kana     PC1
-     Japanese-JISX0208          PC1 PC2
-     
-     
-     Escape sequence   ASCII equivalent   Meaning
-     ---------------   ----------------   -------
-     0x1B 0x28 0x4A    ESC ( J            invoke Japanese-JISX0201-Roman
-     0x1B 0x28 0x49    ESC ( I            invoke Japanese-JISX0201-Kana
-     0x1B 0x24 0x42    ESC $ B            invoke Japanese-JISX0208
-     0x1B 0x28 0x42    ESC ( B            invoke Printing-ASCII
-
-   Initially, Printing-ASCII is invoked.
-
-\1f
-File: internals.info,  Node: Internal Mule Encodings,  Next: CCL,  Prev: Encodings,  Up: MULE Character Sets and Encodings
-
-Internal Mule Encodings
-=======================
-
-   In XEmacs/Mule, each character set is assigned a unique number,
-called a "leading byte".  This is used in the encodings of a character.
-Leading bytes are in the range 0x80 - 0xFF (except for ASCII, which has
-a leading byte of 0), although some leading bytes are reserved.
-
-   Charsets whose leading byte is in the range 0x80 - 0x9F are called
-"official" and are used for built-in charsets.  Other charsets are
-called "private" and have leading bytes in the range 0xA0 - 0xFF; these
-are user-defined charsets.
-
-   More specifically:
-
-     Character set           Leading byte
-     -------------           ------------
-     ASCII                   0
-     Composite               0x80
-     Dimension-1 Official    0x81 - 0x8D
-                               (0x8E is free)
-     Control-1               0x8F
-     Dimension-2 Official    0x90 - 0x99
-                               (0x9A - 0x9D are free;
-                                0x9E and 0x9F are reserved)
-     Dimension-1 Private     0xA0 - 0xEF
-     Dimension-2 Private     0xF0 - 0xFF
-
-   There are two internal encodings for characters in XEmacs/Mule.  One
-is called "string encoding" and is an 8-bit encoding that is used for
-representing characters in a buffer or string.  It uses 1 to 4 bytes per
-character.  The other is called "character encoding" and is a 19-bit
-encoding that is used for representing characters individually in a
-variable.
-
-   (In the following descriptions, we'll ignore composite characters for
-the moment.  We also give a general (structural) overview first,
-followed later by the exact details.)
-
-* Menu:
-
-* Internal String Encoding::
-* Internal Character Encoding::
-
-\1f
-File: internals.info,  Node: Internal String Encoding,  Next: Internal Character Encoding,  Up: Internal Mule Encodings
-
-Internal String Encoding
-------------------------
-
-   ASCII characters are encoded using their position code directly.
-Other characters are encoded using their leading byte followed by their
-position code(s) with the high bit set.  Characters in private character
-sets have their leading byte prefixed with a "leading byte prefix",
-which is either 0x9E or 0x9F. (No character sets are ever assigned these
-leading bytes.) Specifically:
-
-     Character set           Encoding (PC=position-code, LB=leading-byte)
-     -------------           --------
-     ASCII                   PC-1 |
-     Control-1               LB   |  PC1 + 0xA0 |
-     Dimension-1 official    LB   |  PC1 + 0x80 |
-     Dimension-1 private     0x9E |  LB         | PC1 + 0x80 |
-     Dimension-2 official    LB   |  PC1 + 0x80 | PC2 + 0x80 |
-     Dimension-2 private     0x9F |  LB         | PC1 + 0x80 | PC2 + 0x80
-
-   The basic characteristic of this encoding is that the first byte of
-all characters is in the range 0x00 - 0x9F, and the second and
-following bytes of all characters is in the range 0xA0 - 0xFF.  This
-means that it is impossible to get out of sync, or more specifically:
-
-  1. Given any byte position, the beginning of the character it is
-     within can be determined in constant time.
-
-  2. Given any byte position at the beginning of a character, the
-     beginning of the next character can be determined in constant time.
-
-  3. Given any byte position at the beginning of a character, the
-     beginning of the previous character can be determined in constant
-     time.
-
-  4. Textual searches can simply treat encoded strings as if they were
-     encoded in a one-byte-per-character fashion rather than the actual
-     multi-byte encoding.
-
-   None of the standard non-modal encodings meet all of these
-conditions.  For example, EUC satisfies only (2) and (3), while
-Shift-JIS and Big5 (not yet described) satisfy only (2). (All non-modal
-encodings must satisfy (2), in order to be unambiguous.)
-
-\1f
-File: internals.info,  Node: Internal Character Encoding,  Prev: Internal String Encoding,  Up: Internal Mule Encodings
-
-Internal Character Encoding
----------------------------
-
-   One 19-bit word represents a single character.  The word is
-separated into three fields:
-
-     Bit number:     18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
-                     <------------> <------------------> <------------------>
-     Field:                1                  2                    3
-
-   Note that fields 2 and 3 hold 7 bits each, while field 1 holds 5
-bits.
-
-     Character set           Field 1         Field 2         Field 3
-     -------------           -------         -------         -------
-     ASCII                      0               0              PC1
-        range:                                                   (00 - 7F)
-     Control-1                  0               1              PC1
-        range:                                                   (00 - 1F)
-     Dimension-1 official       0            LB - 0x80         PC1
-        range:                                    (01 - 0D)      (20 - 7F)
-     Dimension-1 private        0            LB - 0x80         PC1
-        range:                                    (20 - 6F)      (20 - 7F)
-     Dimension-2 official    LB - 0x8F         PC1             PC2
-        range:                    (01 - 0A)       (20 - 7F)      (20 - 7F)
-     Dimension-2 private     LB - 0xE1         PC1             PC2
-        range:                    (0F - 1E)       (20 - 7F)      (20 - 7F)
-     Composite                 0x1F             ?               ?
-
-   Note that character codes 0 - 255 are the same as the "binary
-encoding" described above.
-
-\1f
-File: internals.info,  Node: CCL,  Prev: Internal Mule Encodings,  Up: MULE Character Sets and Encodings
-
-CCL
-===
-
-     CCL PROGRAM SYNTAX:
-          CCL_PROGRAM := (CCL_MAIN_BLOCK
-                          [ CCL_EOF_BLOCK ])
-     
-          CCL_MAIN_BLOCK := CCL_BLOCK
-          CCL_EOF_BLOCK := CCL_BLOCK
-     
-          CCL_BLOCK := STATEMENT | (STATEMENT [STATEMENT ...])
-          STATEMENT :=
-                  SET | IF | BRANCH | LOOP | REPEAT | BREAK
-                  | READ | WRITE
-     
-          SET := (REG = EXPRESSION) | (REG SELF_OP EXPRESSION)
-                 | INT-OR-CHAR
-     
-          EXPRESSION := ARG | (EXPRESSION OP ARG)
-     
-          IF := (if EXPRESSION CCL_BLOCK CCL_BLOCK)
-          BRANCH := (branch EXPRESSION CCL_BLOCK [CCL_BLOCK ...])
-          LOOP := (loop STATEMENT [STATEMENT ...])
-          BREAK := (break)
-          REPEAT := (repeat)
-                  | (write-repeat [REG | INT-OR-CHAR | string])
-                  | (write-read-repeat REG [INT-OR-CHAR | string | ARRAY]?)
-          READ := (read REG) | (read REG REG)
-                  | (read-if REG ARITH_OP ARG CCL_BLOCK CCL_BLOCK)
-                  | (read-branch REG CCL_BLOCK [CCL_BLOCK ...])
-          WRITE := (write REG) | (write REG REG)
-                  | (write INT-OR-CHAR) | (write STRING) | STRING
-                  | (write REG ARRAY)
-          END := (end)
-     
-          REG := r0 | r1 | r2 | r3 | r4 | r5 | r6 | r7
-          ARG := REG | INT-OR-CHAR
-          OP :=   + | - | * | / | % | & | '|' | ^ | << | >> | <8 | >8 | //
-                  | < | > | == | <= | >= | !=
-          SELF_OP :=
-                  += | -= | *= | /= | %= | &= | '|=' | ^= | <<= | >>=
-          ARRAY := '[' INT-OR-CHAR ... ']'
-          INT-OR-CHAR := INT | CHAR
-     
-     MACHINE CODE:
-     
-     The machine code consists of a vector of 32-bit words.
-     The first such word specifies the start of the EOF section of the code;
-     this is the code executed to handle any stuff that needs to be done
-     (e.g. designating back to ASCII and left-to-right mode) after all
-     other encoded/decoded data has been written out.  This is not used for
-     charset CCL programs.
-     
-     REGISTER: 0..7  -- refered by RRR or rrr
-     
-     OPERATOR BIT FIELD (27-bit): XXXXXXXXXXXXXXX RRR TTTTT
-             TTTTT (5-bit): operator type
-             RRR (3-bit): register number
-             XXXXXXXXXXXXXXXX (15-bit):
-                     CCCCCCCCCCCCCCC: constant or address
-                     000000000000rrr: register number
-     
-     AAAA:   00000 +
-             00001 -
-             00010 *
-             00011 /
-             00100 %
-             00101 &
-             00110 |
-             00111 ~
-     
-             01000 <<
-             01001 >>
-             01010 <8
-             01011 >8
-             01100 //
-             01101 not used
-             01110 not used
-             01111 not used
-     
-             10000 <
-             10001 >
-             10010 ==
-             10011 <=
-             10100 >=
-             10101 !=
-     
-     OPERATORS:      TTTTT RRR XX..
-     
-     SetCS:          00000 RRR C...C      RRR = C...C
-     SetCL:          00001 RRR .....      RRR = c...c
-                     c.............c
-     SetR:           00010 RRR ..rrr      RRR = rrr
-     SetA:           00011 RRR ..rrr      RRR = array[rrr]
-                     C.............C      size of array = C...C
-                     c.............c      contents = c...c
-     
-     Jump:           00100 000 c...c      jump to c...c
-     JumpCond:       00101 RRR c...c      if (!RRR) jump to c...c
-     WriteJump:      00110 RRR c...c      Write1 RRR, jump to c...c
-     WriteReadJump:  00111 RRR c...c      Write1, Read1 RRR, jump to c...c
-     WriteCJump:     01000 000 c...c      Write1 C...C, jump to c...c
-                     C...C
-     WriteCReadJump: 01001 RRR c...c      Write1 C...C, Read1 RRR,
-                     C.............C      and jump to c...c
-     WriteSJump:     01010 000 c...c      WriteS, jump to c...c
-                     C.............C
-                     S.............S
-                     ...
-     WriteSReadJump: 01011 RRR c...c      WriteS, Read1 RRR, jump to c...c
-                     C.............C
-                     S.............S
-                     ...
-     WriteAReadJump: 01100 RRR c...c      WriteA, Read1 RRR, jump to c...c
-                     C.............C      size of array = C...C
-                     c.............c      contents = c...c
-                     ...
-     Branch:         01101 RRR C...C      if (RRR >= 0 && RRR < C..)
-                     c.............c      branch to (RRR+1)th address
-     Read1:          01110 RRR ...        read 1-byte to RRR
-     Read2:          01111 RRR ..rrr      read 2-byte to RRR and rrr
-     ReadBranch:     10000 RRR C...C      Read1 and Branch
-                     c.............c
-                     ...
-     Write1:         10001 RRR .....      write 1-byte RRR
-     Write2:         10010 RRR ..rrr      write 2-byte RRR and rrr
-     WriteC:         10011 000 .....      write 1-char C...CC
-                     C.............C
-     WriteS:         10100 000 .....      write C..-byte of string
-                     C.............C
-                     S.............S
-                     ...
-     WriteA:         10101 RRR .....      write array[RRR]
-                     C.............C      size of array = C...C
-                     c.............c      contents = c...c
-                     ...
-     End:            10110 000 .....      terminate the execution
-     
-     SetSelfCS:      10111 RRR C...C      RRR AAAAA= C...C
-                     ..........AAAAA
-     SetSelfCL:      11000 RRR .....      RRR AAAAA= c...c
-                     c.............c
-                     ..........AAAAA
-     SetSelfR:       11001 RRR ..Rrr      RRR AAAAA= rrr
-                     ..........AAAAA
-     SetExprCL:      11010 RRR ..Rrr      RRR = rrr AAAAA c...c
-                     c.............c
-                     ..........AAAAA
-     SetExprR:       11011 RRR ..rrr      RRR = rrr AAAAA Rrr
-                     ............Rrr
-                     ..........AAAAA
-     JumpCondC:      11100 RRR c...c      if !(RRR AAAAA C..) jump to c...c
-                     C.............C
-                     ..........AAAAA
-     JumpCondR:      11101 RRR c...c      if !(RRR AAAAA rrr) jump to c...c
-                     ............rrr
-                     ..........AAAAA
-     ReadJumpCondC:  11110 RRR c...c      Read1 and JumpCondC
-                     C.............C
-                     ..........AAAAA
-     ReadJumpCondR:  11111 RRR c...c      Read1 and JumpCondR
-                     ............rrr
-                     ..........AAAAA
-
-\1f
-File: internals.info,  Node: The Lisp Reader and Compiler,  Next: Lstreams,  Prev: MULE Character Sets and Encodings,  Up: Top
-
-The Lisp Reader and Compiler
-****************************
-
-   Not yet documented.
-
-\1f
-File: internals.info,  Node: Lstreams,  Next: Consoles; Devices; Frames; Windows,  Prev: The Lisp Reader and Compiler,  Up: Top
-
-Lstreams
-********
-
-   An "lstream" is an internal Lisp object that provides a generic
-buffering stream implementation.  Conceptually, you send data to the
-stream or read data from the stream, not caring what's on the other end
-of the stream.  The other end could be another stream, a file
-descriptor, a stdio stream, a fixed block of memory, a reallocating
-block of memory, etc.  The main purpose of the stream is to provide a
-standard interface and to do buffering.  Macros are defined to read or
-write characters, so the calling functions do not have to worry about
-blocking data together in order to achieve efficiency.
-
-* Menu:
-
-* Creating an Lstream::         Creating an lstream object.
-* Lstream Types::               Different sorts of things that are streamed.
-* Lstream Functions::           Functions for working with lstreams.
-* Lstream Methods::             Creating new lstream types.
-
-\1f
-File: internals.info,  Node: Creating an Lstream,  Next: Lstream Types,  Up: Lstreams
-
-Creating an Lstream
-===================
-
-   Lstreams come in different types, depending on what is being
-interfaced to.  Although the primitive for creating new lstreams is
-`Lstream_new()', generally you do not call this directly.  Instead, you
-call some type-specific creation function, which creates the lstream
-and initializes it as appropriate for the particular type.
-
-   All lstream creation functions take a MODE argument, specifying what
-mode the lstream should be opened as.  This controls whether the
-lstream is for input and output, and optionally whether data should be
-blocked up in units of MULE characters.  Note that some types of
-lstreams can only be opened for input; others only for output; and
-others can be opened either way.  #### Richard Mlynarik thinks that
-there should be a strict separation between input and output streams,
-and he's probably right.
-
-   MODE is a string, one of
-
-`"r"'
-     Open for reading.
-
-`"w"'
-     Open for writing.
-
-`"rc"'
-     Open for reading, but "read" never returns partial MULE characters.
-
-`"wc"'
-     Open for writing, but never writes partial MULE characters.
-
-\1f
-File: internals.info,  Node: Lstream Types,  Next: Lstream Functions,  Prev: Creating an Lstream,  Up: Lstreams
-
-Lstream Types
-=============
-
-stdio
-
-filedesc
-
-lisp-string
-
-fixed-buffer
-
-resizing-buffer
-
-dynarr
-
-lisp-buffer
-
-print
-
-decoding
-
-encoding
-\1f
-File: internals.info,  Node: Lstream Functions,  Next: Lstream Methods,  Prev: Lstream Types,  Up: Lstreams
-
-Lstream Functions
-=================
-
- - Function: Lstream * Lstream_new (Lstream_implementation *IMP, CONST
-          char *MODE)
-     Allocate and return a new Lstream.  This function is not really
-     meant to be called directly; rather, each stream type should
-     provide its own stream creation function, which creates the stream
-     and does any other necessary creation stuff (e.g. opening a file).
-
- - Function: void Lstream_set_buffering (Lstream *LSTR,
-          Lstream_buffering BUFFERING, int BUFFERING_SIZE)
-     Change the buffering of a stream.  See `lstream.h'.  By default the
-     buffering is `STREAM_BLOCK_BUFFERED'.
-
- - Function: int Lstream_flush (Lstream *LSTR)
-     Flush out any pending unwritten data in the stream.  Clear any
-     buffered input data.  Returns 0 on success, -1 on error.
-
- - Macro: int Lstream_putc (Lstream *STREAM, int C)
-     Write out one byte to the stream.  This is a macro and so it is
-     very efficient.  The C argument is only evaluated once but the
-     STREAM argument is evaluated more than once.  Returns 0 on
-     success, -1 on error.
-
- - Macro: int Lstream_getc (Lstream *STREAM)
-     Read one byte from the stream.  This is a macro and so it is very
-     efficient.  The STREAM argument is evaluated more than once.
-     Return value is -1 for EOF or error.
-
- - Macro: void Lstream_ungetc (Lstream *STREAM, int C)
-     Push one byte back onto the input queue.  This will be the next
-     byte read from the stream.  Any number of bytes can be pushed back
-     and will be read in the reverse order they were pushed back - most
-     recent first. (This is necessary for consistency - if there are a
-     number of bytes that have been unread and I read and unread a
-     byte, it needs to be the first to be read again.) This is a macro
-     and so it is very efficient.  The C argument is only evaluated
-     once but the STREAM argument is evaluated more than once.
-
- - Function: int Lstream_fputc (Lstream *STREAM, int C)
- - Function: int Lstream_fgetc (Lstream *STREAM)
- - Function: void Lstream_fungetc (Lstream *STREAM, int C)
-     Function equivalents of the above macros.
-
- - Function: int Lstream_read (Lstream *STREAM, void *DATA, int SIZE)
-     Read SIZE bytes of DATA from the stream.  Return the number of
-     bytes read.  0 means EOF. -1 means an error occurred and no bytes
-     were read.
-
- - Function: int Lstream_write (Lstream *STREAM, void *DATA, int SIZE)
-     Write SIZE bytes of DATA to the stream.  Return the number of
-     bytes written.  -1 means an error occurred and no bytes were
-     written.
-
- - Function: void Lstream_unread (Lstream *STREAM, void *DATA, int SIZE)
-     Push back SIZE bytes of DATA onto the input queue.  The next call
-     to `Lstream_read()' with the same size will read the same bytes
-     back.  Note that this will be the case even if there is other
-     pending unread data.
-
- - Function: int Lstream_close (Lstream *STREAM)
-     Close the stream.  All data will be flushed out.
-
- - Function: void Lstream_reopen (Lstream *STREAM)
-     Reopen a closed stream.  This enables I/O on it again.  This is not
-     meant to be called except from a wrapper routine that reinitializes
-     variables and such - the close routine may well have freed some
-     necessary storage structures, for example.
-
- - Function: void Lstream_rewind (Lstream *STREAM)
-     Rewind the stream to the beginning.
-
-\1f
-File: internals.info,  Node: Lstream Methods,  Prev: Lstream Functions,  Up: Lstreams
-
-Lstream Methods
-===============
-
- - Lstream Method: int reader (Lstream *STREAM, unsigned char *DATA,
-          int SIZE)
-     Read some data from the stream's end and store it into DATA, which
-     can hold SIZE bytes.  Return the number of bytes read.  A return
-     value of 0 means no bytes can be read at this time.  This may be
-     because of an EOF, or because there is a granularity greater than
-     one byte that the stream imposes on the returned data, and SIZE is
-     less than this granularity. (This will happen frequently for
-     streams that need to return whole characters, because
-     `Lstream_read()' calls the reader function repeatedly until it has
-     the number of bytes it wants or until 0 is returned.)  The lstream
-     functions do not treat a 0 return as EOF or do anything special;
-     however, the calling function will interpret any 0 it gets back as
-     EOF.  This will normally not happen unless the caller calls
-     `Lstream_read()' with a very small size.
-
-     This function can be `NULL' if the stream is output-only.
-
- - Lstream Method: int writer (Lstream *STREAM, CONST unsigned char
-          *DATA, int SIZE)
-     Send some data to the stream's end.  Data to be sent is in DATA
-     and is SIZE bytes.  Return the number of bytes sent.  This
-     function can send and return fewer bytes than is passed in; in that
-     case, the function will just be called again until there is no
-     data left or 0 is returned.  A return value of 0 means that no
-     more data can be currently stored, but there is no error; the data
-     will be squirreled away until the writer can accept data. (This is
-     useful, e.g., if you're dealing with a non-blocking file
-     descriptor and are getting `EWOULDBLOCK' errors.)  This function
-     can be `NULL' if the stream is input-only.
-
- - Lstream Method: int rewinder (Lstream *STREAM)
-     Rewind the stream.  If this is `NULL', the stream is not seekable.
-
- - Lstream Method: int seekable_p (Lstream *STREAM)
-     Indicate whether this stream is seekable - i.e. it can be rewound.
-     This method is ignored if the stream does not have a rewind
-     method.  If this method is not present, the result is determined
-     by whether a rewind method is present.
-
- - Lstream Method: int flusher (Lstream *STREAM)
-     Perform any additional operations necessary to flush the data in
-     this stream.
-
- - Lstream Method: int pseudo_closer (Lstream *STREAM)
-
- - Lstream Method: int closer (Lstream *STREAM)
-     Perform any additional operations necessary to close this stream
-     down.  May be `NULL'.  This function is called when
-     `Lstream_close()' is called or when the stream is
-     garbage-collected.  When this function is called, all pending data
-     in the stream will already have been written out.
-
- - Lstream Method: Lisp_Object marker (Lisp_Object LSTREAM, void
-          (*MARKFUN) (Lisp_Object))
-     Mark this object for garbage collection.  Same semantics as a
-     standard `Lisp_Object' marker.  This function can be `NULL'.
-
-\1f
-File: internals.info,  Node: Consoles; Devices; Frames; Windows,  Next: The Redisplay Mechanism,  Prev: Lstreams,  Up: Top
-
-Consoles; Devices; Frames; Windows
-**********************************
-
-* Menu:
-
-* Introduction to Consoles; Devices; Frames; Windows::
-* Point::
-* Window Hierarchy::
-* The Window Object::
-
-\1f
-File: internals.info,  Node: Introduction to Consoles; Devices; Frames; Windows,  Next: Point,  Up: Consoles; Devices; Frames; Windows
-
-Introduction to Consoles; Devices; Frames; Windows
-==================================================
-
-   A window-system window that you see on the screen is called a
-"frame" in Emacs terminology.  Each frame is subdivided into one or
-more non-overlapping panes, called (confusingly) "windows".  Each
-window displays the text of a buffer in it. (See above on Buffers.) Note
-that buffers and windows are independent entities: Two or more windows
-can be displaying the same buffer (potentially in different locations),
-and a buffer can be displayed in no windows.
-
-   A single display screen that contains one or more frames is called a
-"display".  Under most circumstances, there is only one display.
-However, more than one display can exist, for example if you have a
-"multi-headed" console, i.e. one with a single keyboard but multiple
-displays. (Typically in such a situation, the various displays act like
-one large display, in that the mouse is only in one of them at a time,
-and moving the mouse off of one moves it into another.) In some cases,
-the different displays will have different characteristics, e.g. one
-color and one mono.
-
-   XEmacs can display frames on multiple displays.  It can even deal
-simultaneously with frames on multiple keyboards (called "consoles" in
-XEmacs terminology).  Here is one case where this might be useful: You
-are using XEmacs on your workstation at work, and leave it running.
-Then you go home and dial in on a TTY line, and you can use the
-already-running XEmacs process to display another frame on your local
-TTY.
-
-   Thus, there is a hierarchy console -> display -> frame -> window.
-There is a separate Lisp object type for each of these four concepts.
-Furthermore, there is logically a "selected console", "selected
-display", "selected frame", and "selected window".  Each of these
-objects is distinguished in various ways, such as being the default
-object for various functions that act on objects of that type.  Note
-that every containing object rememembers the "selected" object among
-the objects that it contains: e.g. not only is there a selected window,
-but every frame remembers the last window in it that was selected, and
-changing the selected frame causes the remembered window within it to
-become the selected window.  Similar relationships apply for consoles
-to devices and devices to frames.
-
-\1f
-File: internals.info,  Node: Point,  Next: Window Hierarchy,  Prev: Introduction to Consoles; Devices; Frames; Windows,  Up: Consoles; Devices; Frames; Windows
-
-Point
-=====
-
-   Recall that every buffer has a current insertion position, called
-"point".  Now, two or more windows may be displaying the same buffer,
-and the text cursor in the two windows (i.e. `point') can be in two
-different places.  You may ask, how can that be, since each buffer has
-only one value of `point'?  The answer is that each window also has a
-value of `point' that is squirreled away in it.  There is only one
-selected window, and the value of "point" in that buffer corresponds to
-that window.  When the selected window is changed from one window to
-another displaying the same buffer, the old value of `point' is stored
-into the old window's "point" and the value of `point' from the new
-window is retrieved and made the value of `point' in the buffer.  This
-means that `window-point' for the selected window is potentially
-inaccurate, and if you want to retrieve the correct value of `point'
-for a window, you must special-case on the selected window and retrieve
-the buffer's point instead.  This is related to why
-`save-window-excursion' does not save the selected window's value of
-`point'.
-
-\1f
-File: internals.info,  Node: Window Hierarchy,  Next: The Window Object,  Prev: Point,  Up: Consoles; Devices; Frames; Windows
-
-Window Hierarchy
-================
-
-   If a frame contains multiple windows (panes), they are always created
-by splitting an existing window along the horizontal or vertical axis.
-Terminology is a bit confusing here: to "split a window horizontally"
-means to create two side-by-side windows, i.e. to make a *vertical* cut
-in a window.  Likewise, to "split a window vertically" means to create
-two windows, one above the other, by making a *horizontal* cut.
-
-   If you split a window and then split again along the same axis, you
-will end up with a number of panes all arranged along the same axis.
-The precise way in which the splits were made should not be important,
-and this is reflected internally.  Internally, all windows are arranged
-in a tree, consisting of two types of windows, "combination" windows
-(which have children, and are covered completely by those children) and
-"leaf" windows, which have no children and are visible.  Every
-combination window has two or more children, all arranged along the same
-axis.  There are (logically) two subtypes of windows, depending on
-whether their children are horizontally or vertically arrayed.  There is
-always one root window, which is either a leaf window (if the frame
-contains only one window) or a combination window (if the frame contains
-more than one window).  In the latter case, the root window will have
-two or more children, either horizontally or vertically arrayed, and
-each of those children will be either a leaf window or another
-combination window.
-
-   Here are some rules:
-
-  1. Horizontal combination windows can never have children that are
-     horizontal combination windows; same for vertical.
-
-  2. Only leaf windows can be split (obviously) and this splitting does
-     one of two things: (a) turns the leaf window into a combination
-     window and creates two new leaf children, or (b) turns the leaf
-     window into one of the two new leaves and creates the other leaf.
-     Rule (1) dictates which of these two outcomes happens.
-
-  3. Every combination window must have at least two children.
-
-  4. Leaf windows can never become combination windows.  They can be
-     deleted, however.  If this results in a violation of (3), the
-     parent combination window also gets deleted.
-
-  5. All functions that accept windows must be prepared to accept
-     combination windows, and do something sane (e.g. signal an error
-     if so).  Combination windows *do* escape to the Lisp level.
-
-  6. All windows have three fields governing their contents: these are
-     "hchild" (a list of horizontally-arrayed children), "vchild" (a
-     list of vertically-arrayed children), and "buffer" (the buffer
-     contained in a leaf window).  Exactly one of these will be
-     non-nil.  Remember that "horizontally-arrayed" means
-     "side-by-side" and "vertically-arrayed" means "one above the
-     other".
-
-  7. Leaf windows also have markers in their `start' (the first buffer
-     position displayed in the window) and `pointm' (the window's
-     stashed value of `point' - see above) fields, while combination
-     windows have nil in these fields.
-
-  8. The list of children for a window is threaded through the `next'
-     and `prev' fields of each child window.
-
-  9. *Deleted windows can be undeleted*.  This happens as a result of
-     restoring a window configuration, and is unlike frames, displays,
-     and consoles, which, once deleted, can never be restored.
-     Deleting a window does nothing except set a special `dead' bit to
-     1 and clear out the `next', `prev', `hchild', and `vchild' fields,
-     for GC purposes.
-
- 10. Most frames actually have two top-level windows - one for the
-     minibuffer and one (the "root") for everything else.  The modeline
-     (if present) separates these two.  The `next' field of the root
-     points to the minibuffer, and the `prev' field of the minibuffer
-     points to the root.  The other `next' and `prev' fields are `nil',
-     and the frame points to both of these windows.  Minibuffer-less
-     frames have no minibuffer window, and the `next' and `prev' of the
-     root window are `nil'.  Minibuffer-only frames have no root
-     window, and the `next' of the minibuffer window is `nil' but the
-     `prev' points to itself. (#### This is an artifact that should be
-     fixed.)
-
-\1f
-File: internals.info,  Node: The Window Object,  Prev: Window Hierarchy,  Up: Consoles; Devices; Frames; Windows
-
-The Window Object
-=================
-
-   Windows have the following accessible fields:
-
-`frame'
-     The frame that this window is on.
-
-`mini_p'
-     Non-`nil' if this window is a minibuffer window.
-
-`buffer'
-     The buffer that the window is displaying.  This may change often
-     during the life of the window.
-
-`dedicated'
-     Non-`nil' if this window is dedicated to its buffer.
-
-`pointm'
-     This is the value of point in the current buffer when this window
-     is selected; when it is not selected, it retains its previous
-     value.
-
-`start'
-     The position in the buffer that is the first character to be
-     displayed in the window.
-
-`force_start'
-     If this flag is non-`nil', it says that the window has been
-     scrolled explicitly by the Lisp program.  This affects what the
-     next redisplay does if point is off the screen: instead of
-     scrolling the window to show the text around point, it moves point
-     to a location that is on the screen.
-
-`last_modified'
-     The `modified' field of the window's buffer, as of the last time a
-     redisplay completed in this window.
-
-`last_point'
-     The buffer's value of point, as of the last time a redisplay
-     completed in this window.
-
-`left'
-     This is the left-hand edge of the window, measured in columns.
-     (The leftmost column on the screen is column 0.)
-
-`top'
-     This is the top edge of the window, measured in lines.  (The top
-     line on the screen is line 0.)
-
-`height'
-     The height of the window, measured in lines.
-
-`width'
-     The width of the window, measured in columns.
-
-`next'
-     This is the window that is the next in the chain of siblings.  It
-     is `nil' in a window that is the rightmost or bottommost of a
-     group of siblings.
-
-`prev'
-     This is the window that is the previous in the chain of siblings.
-     It is `nil' in a window that is the leftmost or topmost of a group
-     of siblings.
-
-`parent'
-     Internally, XEmacs arranges windows in a tree; each group of
-     siblings has a parent window whose area includes all the siblings.
-     This field points to a window's parent.
-
-     Parent windows do not display buffers, and play little role in
-     display except to shape their child windows.  Emacs Lisp programs
-     usually have no access to the parent windows; they operate on the
-     windows at the leaves of the tree, which actually display buffers.
-
-`hscroll'
-     This is the number of columns that the display in the window is
-     scrolled horizontally to the left.  Normally, this is 0.
-
-`use_time'
-     This is the last time that the window was selected.  The function
-     `get-lru-window' uses this field.
-
-`display_table'
-     The window's display table, or `nil' if none is specified for it.
-
-`update_mode_line'
-     Non-`nil' means this window's mode line needs to be updated.
-
-`base_line_number'
-     The line number of a certain position in the buffer, or `nil'.
-     This is used for displaying the line number of point in the mode
-     line.
-
-`base_line_pos'
-     The position in the buffer for which the line number is known, or
-     `nil' meaning none is known.
-
-`region_showing'
-     If the region (or part of it) is highlighted in this window, this
-     field holds the mark position that made one end of that region.
-     Otherwise, this field is `nil'.
-