summaryrefslogtreecommitdiff
path: root/src/lisp.h
diff options
context:
space:
mode:
authorKenichi Handa <handa@m17n.org>1997-04-07 07:12:13 +0000
committerKenichi Handa <handa@m17n.org>1997-04-07 07:12:13 +0000
commitc71a047bf8ba4a460132d3f79d220dfb32143ead (patch)
treeaeda8d726e0be4d6960b8863c4c40507361e4542 /src/lisp.h
parent9fd7b6d566a0c35a8b6a4bf434743da062770edb (diff)
downloademacs-c71a047bf8ba4a460132d3f79d220dfb32143ead.tar.gz
(CHAR_TABLE_STANDARD_SLOTS): Now 4 more slots than
CHAR_TABLE_ORDINARY_SLOTS for top, defalt, parent, and purpose. (SUB_CHAR_TABLE_ORDINARY_SLOTS, SUB_CHAR_TABLE_STANDARD_SLOTS): New macros. (struct Lisp_Char_Table): New member `top'. The member `defalt' is moved before `contents' so that XCHAT_TABLE (val)->defalt can also be used for a sub char table. (SUB_CHAR_TABLE_P): New macro. (make_sub_char_table): Extern it.
Diffstat (limited to 'src/lisp.h')
-rw-r--r--src/lisp.h51
1 files changed, 41 insertions, 10 deletions
diff --git a/src/lisp.h b/src/lisp.h
index ac351d88af9..54af82be6e1 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -564,22 +564,41 @@ struct Lisp_Vector
Lisp_Object contents[1];
};
-/* A char table is a kind of vectorlike, with contents are like a vector
- but with a few other slots. For some purposes, it makes sense
- to handle a chartable with type struct Lisp_Vector. */
-
+/* A char table is a kind of vectorlike, with contents are like a
+ vector but with a few other slots. For some purposes, it makes
+ sense to handle a chartable with type struct Lisp_Vector. An
+ element of a char table can be any Lisp objects, but if it is a sub
+ char-table, we treat it a table that contains information of a
+ group of characters of the same charsets or a specific character of
+ a charset. A sub char-table has the same structure as a char table
+ except for that the former omits several slots at the tail. A sub
+ char table appears only in an element of a char table, and there's
+ no way to access it directly from Emacs Lisp program. */
+
/* This is the number of slots that apply to characters or character
sets. The first 128 are for ASCII, the next 128 are for 8-bit
- European characters, and the last 128 are for multibyte characters. */
+ European characters, and the last 128 are for multibyte characters.
+ The first 256 are indexed by the code itself, but the last 128 are
+ indexed by (charset-id + 128). */
#define CHAR_TABLE_ORDINARY_SLOTS 384
/* This is the number of slots that apply to characters of ASCII and
8-bit Europeans only. */
#define CHAR_TABLE_SINGLE_BYTE_SLOTS 256
-/* This is the number of slots that every char table must have.
- This counts the ordinary slots and the parent and defalt slots. */
-#define CHAR_TABLE_STANDARD_SLOTS (CHAR_TABLE_ORDINARY_SLOTS + 3)
+/* This is the number of slots that every char table must have. This
+ counts the ordinary slots and the top, defalt, parent, and purpose
+ slots. */
+#define CHAR_TABLE_STANDARD_SLOTS (CHAR_TABLE_ORDINARY_SLOTS + 4)
+
+/* This is the number of slots that apply to position-code-1 and
+ position-code-2 of a multibyte character at the 2nd and 3rd level
+ sub char tables respectively. */
+#define SUB_CHAR_TABLE_ORDINARY_SLOTS 128
+
+/* This is the number of slots that every sub char table must have.
+ This counts the ordinary slots and the top and defalt slot. */
+#define SUB_CHAR_TABLE_STANDARD_SLOTS (SUB_CHAR_TABLE_ORDINARY_SLOTS + 2)
/* Return the number of "extra" slots in the char table CT. */
@@ -609,13 +628,22 @@ struct Lisp_Char_Table
{
/* This is the vector's size field, which also holds the
pseudovector type information. It holds the size, too.
- The size counts the defalt and parent slots. */
+ The size counts the top, defalt, purpose, and parent slots.
+ The last three are not counted if this is a sub char table. */
EMACS_INT size;
struct Lisp_Vector *next;
- Lisp_Object contents[CHAR_TABLE_ORDINARY_SLOTS];
+ /* This holds a flag to tell if this is a top level char table (t)
+ or a sub char table (nil). */
+ Lisp_Object top;
/* This holds a default value,
which is used whenever the value for a specific character is nil. */
Lisp_Object defalt;
+ /* This holds an actual value of each element. A sub char table
+ has only SUB_CHAR_TABLE_ORDINARY_SLOTS number of elements. */
+ Lisp_Object contents[CHAR_TABLE_ORDINARY_SLOTS];
+
+ /* A sub char table doesn't has the following slots. */
+
/* This points to another char table, which we inherit from
when the value for a specific character is nil.
The `defalt' slot takes precedence over this. */
@@ -1034,6 +1062,8 @@ typedef unsigned char UCHAR;
#define GC_BOOL_VECTOR_P(x) GC_PSEUDOVECTORP (x, PVEC_BOOL_VECTOR)
#define FRAMEP(x) PSEUDOVECTORP (x, PVEC_FRAME)
#define GC_FRAMEP(x) GC_PSEUDOVECTORP (x, PVEC_FRAME)
+
+#define SUB_CHAR_TABLE_P(x) (CHAR_TABLE_P (x) && NILP (XCHAR_TABLE (x)->top))
#define EQ(x, y) (XFASTINT (x) == XFASTINT (y))
#define GC_EQ(x, y) (XGCTYPE (x) == XGCTYPE (y) && XPNTR (x) == XPNTR (y))
@@ -1544,6 +1574,7 @@ extern Lisp_Object pure_cons (), make_pure_vector ();
extern Lisp_Object Fgarbage_collect ();
extern Lisp_Object Fmake_byte_code ();
extern Lisp_Object Fmake_bool_vector (), Fmake_char_table ();
+extern Lisp_Object make_sub_char_table ();
extern Lisp_Object Qchar_table_extra_slots;
extern struct Lisp_Vector *allocate_vectorlike ();
extern int gc_in_progress;