# HG changeset patch # User Kenichi Handa # Date 1014947053 0 # Node ID 5e3e1d9d514f3aecdc6bdfc80de53ab0066be5c1 # Parent 7c5246c7a70b2772eed1625a02d87d812eb7feac (enum pvec_type): New member PVEC_SUB_CHAR_TABLE. (XSUB_CHAR_TABLE, XSETSUB_CHAR_TABLE): New macros. (CHAR_TABLE_ORDINARY_SLOTS, CHAR_TABLE_SINGLE_BYTE_SLOTS, SUB_CHAR_TABLE_ORDINARY_SLOTS, SUB_CHAR_TABLE_STANDARD_SLOTS): Deleted. (CHAR_TABLE_REF, CHAR_TABLE_SET): Adjusted for the new char table structure. (CHAR_TABLE_TRANSLATE): Just call char_table_translate. (CHARTAB_SIZE_BITS_0, CHARTAB_SIZE_BITS_1, CHARTAB_SIZE_BITS_2, CHARTAB_SIZE_BITS_3): New macros. (chartab_size): Extern it. (struct Lisp_Char_Table): Re-designed. (struct Lisp_Sub_Char_Table): New structure. (HASH_KEY, HASH_VALUE): Moved from fns.c. (CHARACTERBITS): Defined as 22. (GLYPH_MASK_FACE, GLYPH_MASK_CHAR): Adjusted for the above change. (SUB_CHAR_TABLE_P): Check PVEC_CHAR_TABLE. (GC_SUB_CHAR_TABLE_P): New macro. (Fencode_coding_string, Fdecode_coding_string): EXFUN Updated. (code_convert_string_norecord): Extern deleted. (init_character_once, syms_of_character, init_charset, syms_of_composite, Qeq, Fmakehash, insert_from_gap): Extern them. diff -r 7c5246c7a70b -r 5e3e1d9d514f src/lisp.h --- a/src/lisp.h Fri Mar 01 01:43:45 2002 +0000 +++ b/src/lisp.h Fri Mar 01 01:44:13 2002 +0000 @@ -298,7 +298,8 @@ PVEC_BOOL_VECTOR = 0x10000, PVEC_BUFFER = 0x20000, PVEC_HASH_TABLE = 0x40000, - PVEC_TYPE_MASK = 0x7fe00 + PVEC_SUB_CHAR_TABLE = 0x80000, + PVEC_TYPE_MASK = 0x0ffe00 #if 0 /* This is used to make the value of PSEUDOVECTOR_FLAG available to GDB. It doesn't work on OS Alpha. Moved to a variable in @@ -499,6 +500,7 @@ #define XSUBR(a) (eassert (GC_SUBRP(a)),(struct Lisp_Subr *) XPNTR(a)) #define XBUFFER(a) (eassert (GC_BUFFERP(a)),(struct buffer *) XPNTR(a)) #define XCHAR_TABLE(a) ((struct Lisp_Char_Table *) XPNTR(a)) +#define XSUB_CHAR_TABLE(a) ((struct Lisp_Sub_Char_Table *) XPNTR(a)) #define XBOOL_VECTOR(a) ((struct Lisp_Bool_Vector *) XPNTR(a)) /* Construct a Lisp_Object from a value or address. */ @@ -528,6 +530,7 @@ #define XSETBUFFER(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_BUFFER)) #define XSETCHAR_TABLE(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_CHAR_TABLE)) #define XSETBOOL_VECTOR(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_BOOL_VECTOR)) +#define XSETSUB_CHAR_TABLE(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_SUB_CHAR_TABLE)) /* Convenience macros for dealing with Lisp arrays. */ @@ -701,41 +704,20 @@ Lisp_Object contents[1]; }; -/* A char table is a kind of vectorlike, with contents are like a +/* 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 + sense to handle a char-table 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. - 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 + specific range of characters. A sub char-table has the same + structure as a vector. 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 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) +#define CHAR_TABLE_STANDARD_SLOTS (VECSIZE (struct Lisp_Char_Table) - 1) /* Return the number of "extra" slots in the char table CT. */ @@ -743,14 +725,13 @@ (((CT)->size & PSEUDOVECTOR_SIZE_MASK) - CHAR_TABLE_STANDARD_SLOTS) /* Almost equivalent to Faref (CT, IDX) with optimization for ASCII - and 8-bit Europeans characters. For these characters, do not check - validity of CT. Do not follow parent. */ -#define CHAR_TABLE_REF(CT, IDX) \ - ((IDX) >= 0 && (IDX) < CHAR_TABLE_SINGLE_BYTE_SLOTS \ - ? (!NILP (XCHAR_TABLE (CT)->contents[IDX]) \ - ? XCHAR_TABLE (CT)->contents[IDX] \ - : XCHAR_TABLE (CT)->defalt) \ - : Faref (CT, make_number (IDX))) + characters. Do not check validity of CT. */ +#define CHAR_TABLE_REF(CT, IDX) \ + (((IDX) >= 0 && ASCII_CHAR_P (IDX) \ + && SUB_CHAR_TABLE_P (XCHAR_TABLE (CT)->ascii) \ + && !NILP (XSUB_CHAR_TABLE (XCHAR_TABLE (CT)->ascii)->contents[IDX])) \ + ? XSUB_CHAR_TABLE (XCHAR_TABLE (CT)->ascii)->contents[IDX] \ + : char_table_ref ((CT), (IDX))) /* Almost equivalent to Faref (CT, IDX) with optimization for ASCII and 8-bit Europeans characters. However, if the result is nil, @@ -758,54 +739,79 @@ For these characters, do not check validity of CT and do not follow parent. */ -#define CHAR_TABLE_TRANSLATE(CT, IDX) \ - ((IDX) < CHAR_TABLE_SINGLE_BYTE_SLOTS \ - ? (!NILP (XCHAR_TABLE (CT)->contents[IDX]) \ - ? XINT (XCHAR_TABLE (CT)->contents[IDX]) \ - : IDX) \ - : char_table_translate (CT, IDX)) +#define CHAR_TABLE_TRANSLATE(CT, IDX) \ + char_table_translate (CT, IDX) /* Equivalent to Faset (CT, IDX, VAL) with optimization for ASCII and 8-bit Europeans characters. Do not check validity of CT. */ -#define CHAR_TABLE_SET(CT, IDX, VAL) \ - do { \ - if (XFASTINT (IDX) < CHAR_TABLE_SINGLE_BYTE_SLOTS) \ - XCHAR_TABLE (CT)->contents[XFASTINT (IDX)] = VAL; \ - else \ - Faset (CT, IDX, VAL); \ - } while (0) +#define CHAR_TABLE_SET(CT, IDX, VAL) \ + (((IDX) >= 0 && ASCII_CHAR_P (IDX) \ + && SUB_CHAR_TABLE_P (XCHAR_TABLE (CT)->ascii)) \ + ? XSUB_CHAR_TABLE (XCHAR_TABLE (CT)->ascii)->contents[IDX] = VAL \ + : char_table_set (CT, IDX, VAL)) + + +#define CHARTAB_SIZE_BITS_0 6 +#define CHARTAB_SIZE_BITS_1 4 +#define CHARTAB_SIZE_BITS_2 5 +#define CHARTAB_SIZE_BITS_3 7 + +extern const int chartab_size[4]; + +struct Lisp_Sub_Char_Table; 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 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; - /* 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. */ - Lisp_Object parent; - /* This should be a symbol which says what kind of use - this char-table is meant for. - Typically now the values can be `syntax-table' and `display-table'. */ - Lisp_Object purpose; - /* These hold additional data. */ - Lisp_Object extras[1]; - }; +{ + /* This is the vector's size field, which also holds the + pseudovector type information. It holds the size, too. The size + counts the defalt, parent, purpose, ascii, contents, and extras + slots. */ + EMACS_INT size; + struct Lisp_Vector *next; + + /* This holds a default value, + which is used whenever the value for a specific character is nil. */ + Lisp_Object defalt; + + /* 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. */ + Lisp_Object parent; + + /* This is a symbol which says what kind of use this char-table is + meant for. */ + Lisp_Object purpose; + + /* The bottom sub char-table for characters of the range 0..127. It + is nil if none of ASCII character has a specific value. */ + Lisp_Object ascii; + + Lisp_Object contents[(1 << CHARTAB_SIZE_BITS_0)]; + + /* These hold additional data. It is a vector. */ + Lisp_Object extras[1]; +}; + +struct Lisp_Sub_Char_Table +{ + /* This is the vector's size field, which also holds the + pseudovector type information. It holds the size, too. */ + EMACS_INT size; + struct Lisp_Vector *next; + + /* Depth of this sub char-table. It should be 1, 2, or 3. A sub + char-table of depth 1 contains 16 elments, and each element + covers 4096 (128*32) characters. A sub char-table of depth 2 + contains 32 elements, and each element covers 128 characters. A + sub char-table of depth 3 contains 128 elements, and each element + is for one character. */ + Lisp_Object depth; + + /* Minimum character covered by the sub char-table. */ + Lisp_Object min_char; + + Lisp_Object contents[1]; +}; /* A boolvector is a kind of vectorlike, with contents are like a string. */ struct Lisp_Bool_Vector @@ -1025,6 +1031,14 @@ #define DEFAULT_REHASH_SIZE 1.5 +/* Value is the key part of entry IDX in hash table H. */ + +#define HASH_KEY(H, IDX) AREF ((H)->key_and_value, 2 * (IDX)) + +/* Value is the value part of entry IDX in hash table H. */ + +#define HASH_VALUE(H, IDX) AREF ((H)->key_and_value, 2 * (IDX) + 1) + /* These structures are used for various misc types. */ @@ -1247,9 +1261,9 @@ (CHAR_ALT | CHAR_SUPER | CHAR_HYPER | CHAR_SHIFT | CHAR_CTL | CHAR_META) -/* Actually, the current Emacs uses 19 bits for the character value +/* Actually, the current Emacs uses 22 bits for the character value itself. */ -#define CHARACTERBITS 19 +#define CHARACTERBITS 22 /* The maximum byte size consumed by push_key_description. All callers should assure that at least this size of memory is @@ -1305,9 +1319,9 @@ #define GLYPH int /* Mask bits for face. */ -#define GLYPH_MASK_FACE 0x7FF80000 +#define GLYPH_MASK_FACE 0x7FC00000 /* Mask bits for character code. */ -#define GLYPH_MASK_CHAR 0x0007FFFF /* The lowest 19 bits */ +#define GLYPH_MASK_CHAR 0x003FFFFF /* The lowest 19 bits */ /* The FAST macros assume that we already know we're in an X window. */ @@ -1406,12 +1420,13 @@ #define GC_BUFFERP(x) GC_PSEUDOVECTORP (x, PVEC_BUFFER) #define CHAR_TABLE_P(x) PSEUDOVECTORP (x, PVEC_CHAR_TABLE) #define GC_CHAR_TABLE_P(x) GC_PSEUDOVECTORP (x, PVEC_CHAR_TABLE) +#define SUB_CHAR_TABLE_P(x) PSEUDOVECTORP (x, PVEC_SUB_CHAR_TABLE) +#define GC_SUB_CHAR_TABLE_P(x) GC_PSEUDOVECTORP (x, PVEC_SUB_CHAR_TABLE) #define BOOL_VECTOR_P(x) PSEUDOVECTORP (x, PVEC_BOOL_VECTOR) #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)) @@ -2088,15 +2103,17 @@ EXFUN (Fread_non_nil_coding_system, 1); EXFUN (Ffind_operation_coding_system, MANY); EXFUN (Fupdate_coding_systems_internal, 0); -EXFUN (Fencode_coding_string, 3); -EXFUN (Fdecode_coding_string, 3); -extern Lisp_Object detect_coding_system P_ ((unsigned char *, int, int, int)); -Lisp_Object code_convert_string_norecord P_ ((Lisp_Object, Lisp_Object, int)); +EXFUN (Fencode_coding_string, 4); +EXFUN (Fdecode_coding_string, 4); +extern Lisp_Object detect_coding_system P_ ((unsigned char *, int, int, int, + Lisp_Object)); extern void init_coding P_ ((void)); extern void init_coding_once P_ ((void)); extern void syms_of_coding P_ ((void)); -extern Lisp_Object code_convert_string_norecord P_ ((Lisp_Object, Lisp_Object, - int)); + +/* Defined in character.c */ +extern void init_character_once P_ ((void)); +extern void syms_of_character P_ ((void)); /* Defined in charset.c */ extern int nonascii_insert_offset; @@ -2109,9 +2126,13 @@ extern int unibyte_char_to_multibyte P_ ((int)); extern int multibyte_char_to_unibyte P_ ((int, Lisp_Object)); extern Lisp_Object Qcharset; +extern void init_charset P_ ((void)); extern void init_charset_once P_ ((void)); extern void syms_of_charset P_ ((void)); +/* Defined in composite.c */ +extern void syms_of_composite P_ ((void)); + /* Defined in syntax.c */ EXFUN (Fforward_word, 1); EXFUN (Fskip_chars_forward, 2); @@ -2128,9 +2149,8 @@ extern Lisp_Object larger_vector P_ ((Lisp_Object, int, Lisp_Object)); extern void sweep_weak_hash_tables P_ ((void)); extern Lisp_Object Qstring_lessp; -EXFUN (Foptimize_char_table, 1); extern Lisp_Object Vfeatures; -extern Lisp_Object QCtest, QCweakness, Qequal; +extern Lisp_Object QCtest, QCweakness, Qequal, Qeq; unsigned sxhash P_ ((Lisp_Object, int)); Lisp_Object make_hash_table P_ ((Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, @@ -2145,6 +2165,7 @@ extern void init_fns P_ ((void)); EXFUN (Fsxhash, 1); EXFUN (Fmake_hash_table, MANY); +EXFUN (Fmakehash, 1); EXFUN (Fcopy_hash_table, 1); EXFUN (Fhash_table_count, 1); EXFUN (Fhash_table_rehash_size, 1); @@ -2209,18 +2230,10 @@ EXFUN (Fcopy_alist, 1); EXFUN (Fplist_get, 2); EXFUN (Fplist_put, 3); -EXFUN (Fset_char_table_parent, 2); -EXFUN (Fchar_table_extra_slot, 2); -EXFUN (Fset_char_table_extra_slot, 3); EXFUN (Frassoc, 2); EXFUN (Fstring_equal, 2); EXFUN (Fcompare_strings, 7); EXFUN (Fstring_lessp, 2); -extern int char_table_translate P_ ((Lisp_Object, int)); -extern void map_char_table P_ ((void (*) (Lisp_Object, Lisp_Object, Lisp_Object), - Lisp_Object, Lisp_Object, Lisp_Object, int, - Lisp_Object *)); -extern Lisp_Object char_table_ref_and_index P_ ((Lisp_Object, int, int *)); extern void syms_of_fns P_ ((void)); /* Defined in floatfns.c */ @@ -2243,6 +2256,7 @@ extern void insert_and_inherit P_ ((unsigned char *, int)); extern void insert_1 P_ ((unsigned char *, int, int, int, int)); extern void insert_1_both P_ ((unsigned char *, int, int, int, int, int)); +extern void insert_from_gap P_ ((int, int)); extern void insert_from_string P_ ((Lisp_Object, int, int, int, int, int)); extern void insert_from_buffer P_ ((struct buffer *, int, int, int)); extern void insert_char P_ ((int)); @@ -2361,8 +2375,6 @@ EXFUN (Fgarbage_collect, 0); EXFUN (Fmake_byte_code, MANY); EXFUN (Fmake_bool_vector, 2); -EXFUN (Fmake_char_table, 2); -extern Lisp_Object make_sub_char_table P_ ((Lisp_Object)); extern Lisp_Object Qchar_table_extra_slots; extern struct Lisp_Vector *allocate_vector P_ ((EMACS_INT)); extern struct Lisp_Vector *allocate_other_vector P_ ((EMACS_INT)); @@ -2381,6 +2393,35 @@ extern void syms_of_alloc P_ ((void)); extern struct buffer * allocate_buffer P_ ((void)); +/* Defined in chartab.c */ +EXFUN (Fmake_char_table, 2); +EXFUN (Fchar_table_parent, 1); +EXFUN (Fset_char_table_parent, 2); +EXFUN (Fchar_table_extra_slot, 2); +EXFUN (Fset_char_table_extra_slot, 3); +EXFUN (Fchar_table_range, 2); +EXFUN (Fset_char_table_range, 3); +EXFUN (Fset_char_table_default, 3); +EXFUN (Foptimize_char_table, 1); +EXFUN (Fmap_char_table, 2); +extern Lisp_Object copy_char_table P_ ((Lisp_Object)); +extern Lisp_Object sub_char_table_ref P_ ((Lisp_Object, int)); +extern Lisp_Object char_table_ref P_ ((Lisp_Object, int)); +extern Lisp_Object char_table_ref_and_range P_ ((Lisp_Object, int, + int *, int *)); +extern Lisp_Object char_table_set P_ ((Lisp_Object, int, Lisp_Object)); +extern Lisp_Object char_table_set_range P_ ((Lisp_Object, int, int, + Lisp_Object)); +extern int char_table_translate P_ ((Lisp_Object, int)); +extern void map_char_table P_ ((void (*) (Lisp_Object, Lisp_Object, + Lisp_Object), + Lisp_Object, Lisp_Object, Lisp_Object, int, + Lisp_Object *)); +extern void map_charset_chars P_ ((void (*) (Lisp_Object, Lisp_Object, + Lisp_Object), + Lisp_Object, Lisp_Object, Lisp_Object)); +extern void syms_of_chartab P_ ((void)); + /* Defined in print.c */ extern Lisp_Object Vprin1_to_string_buffer; extern void debug_print P_ ((Lisp_Object)); @@ -3006,6 +3047,7 @@ /* Defined in category.c */ extern void init_category_once P_ ((void)); +extern Lisp_Object char_category_set P_ ((int)); extern void syms_of_category P_ ((void)); /* Defined in ccl.c */