X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/beb9f7453ae9a4473cf43a16c186a090d77c4b3b..5371d722ecd94db9d5b3b21f4b91d073a38bd73b:/src/lisp.h diff --git a/src/lisp.h b/src/lisp.h index 43daded691..333b6a2a92 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -1,6 +1,7 @@ /* Fundamental definitions for GNU Emacs Lisp interpreter. Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1997, 1998, 1999, 2000, - 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. + 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 + Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -84,6 +85,20 @@ extern void die P_((const char *, const char *, int)) NO_RETURN; #ifdef ENABLE_CHECKING +/* The suppress_checking variable is initialized to 0 in alloc.c. Set + it to 1 using a debugger to temporarily disable aborting on + detected internal inconsistencies or error conditions. + + Testing suppress_checking after the supplied condition ensures that + the side effects produced by CHECK will be consistent, independent + of whether ENABLE_CHECKING is defined, or whether the checks are + suppressed at run time. + + In some cases, a good compiler may be able to optimize away the + CHECK macro altogether, e.g., if XSTRING (x) uses CHECK to test + STRINGP (x), but a particular use of XSTRING is invoked only after + testing that STRINGP (x) is true, making the test redundant. */ + #define CHECK(check,msg) (((check) || suppress_checking \ ? (void) 0 \ : die ((msg), __FILE__, __LINE__)), \ @@ -214,7 +229,6 @@ enum Lisp_Misc_Type Lisp_Misc_Objfwd, Lisp_Misc_Buffer_Objfwd, Lisp_Misc_Buffer_Local_Value, - Lisp_Misc_Some_Buffer_Local_Value, Lisp_Misc_Overlay, Lisp_Misc_Kboard_Objfwd, Lisp_Misc_Save_Value, @@ -335,7 +349,9 @@ enum pvec_type PVEC_BUFFER = 0x20000, PVEC_HASH_TABLE = 0x40000, PVEC_TERMINAL = 0x80000, - PVEC_TYPE_MASK = 0xffe00 + PVEC_SUB_CHAR_TABLE = 0x100000, + PVEC_OTHER = 0x200000, + PVEC_TYPE_MASK = 0x2ffe00 #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 @@ -461,17 +477,6 @@ extern Lisp_Object make_number P_ ((EMACS_INT)); #define EQ(x, y) (XHASH (x) == XHASH (y)) -/* During garbage collection, XGCTYPE must be used for extracting types - so that the mark bit is ignored. XMARKBIT accesses the markbit. - Markbits are used only in particular slots of particular structure types. - Other markbits are always zero. - Outside of garbage collection, all mark bits are always zero. */ - -#ifndef XGCTYPE -/* The distinction does not exist now that the MARKBIT has been eliminated. */ -#define XGCTYPE(a) XTYPE (a) -#endif - #ifndef XPNTR #ifdef HAVE_SHM /* In this representation, data is found in two widely separated segments. */ @@ -513,35 +518,40 @@ extern size_t pure_size; /* Extract a value or address from a Lisp_Object. */ -#define XCONS(a) (eassert (GC_CONSP(a)),(struct Lisp_Cons *) XPNTR(a)) -#define XVECTOR(a) (eassert (GC_VECTORLIKEP(a)),(struct Lisp_Vector *) XPNTR(a)) -#define XSTRING(a) (eassert (GC_STRINGP(a)),(struct Lisp_String *) XPNTR(a)) -#define XSYMBOL(a) (eassert (GC_SYMBOLP(a)),(struct Lisp_Symbol *) XPNTR(a)) -#define XFLOAT(a) (eassert (GC_FLOATP(a)),(struct Lisp_Float *) XPNTR(a)) +#define XCONS(a) (eassert (CONSP(a)),(struct Lisp_Cons *) XPNTR(a)) +#define XVECTOR(a) (eassert (VECTORLIKEP(a)),(struct Lisp_Vector *) XPNTR(a)) +#define XSTRING(a) (eassert (STRINGP(a)),(struct Lisp_String *) XPNTR(a)) +#define XSYMBOL(a) (eassert (SYMBOLP(a)),(struct Lisp_Symbol *) XPNTR(a)) +#define XFLOAT(a) (eassert (FLOATP(a)),(struct Lisp_Float *) XPNTR(a)) /* Misc types. */ #define XMISC(a) ((union Lisp_Misc *) XPNTR(a)) -#define XMISCTYPE(a) (XMARKER (a)->type) -#define XMARKER(a) (&(XMISC(a)->u_marker)) -#define XINTFWD(a) (&(XMISC(a)->u_intfwd)) -#define XBOOLFWD(a) (&(XMISC(a)->u_boolfwd)) -#define XOBJFWD(a) (&(XMISC(a)->u_objfwd)) -#define XBUFFER_OBJFWD(a) (&(XMISC(a)->u_buffer_objfwd)) -#define XBUFFER_LOCAL_VALUE(a) (&(XMISC(a)->u_buffer_local_value)) -#define XOVERLAY(a) (&(XMISC(a)->u_overlay)) -#define XKBOARD_OBJFWD(a) (&(XMISC(a)->u_kboard_objfwd)) -#define XSAVE_VALUE(a) (&(XMISC(a)->u_save_value)) +#define XMISCANY(a) (eassert (MISCP (a)), &(XMISC(a)->u_any)) +#define XMISCTYPE(a) (XMISCANY (a)->type) +#define XMARKER(a) (eassert (MARKERP (a)), &(XMISC(a)->u_marker)) +#define XINTFWD(a) (eassert (INTFWDP (a)), &(XMISC(a)->u_intfwd)) +#define XBOOLFWD(a) (eassert (BOOLFWDP (a)), &(XMISC(a)->u_boolfwd)) +#define XOBJFWD(a) (eassert (OBJFWDP (a)), &(XMISC(a)->u_objfwd)) +#define XOVERLAY(a) (eassert (OVERLAYP (a)), &(XMISC(a)->u_overlay)) +#define XSAVE_VALUE(a) (eassert (SAVE_VALUEP (a)), &(XMISC(a)->u_save_value)) +#define XBUFFER_OBJFWD(a) \ + (eassert (BUFFER_OBJFWDP (a)), &(XMISC(a)->u_buffer_objfwd)) +#define XBUFFER_LOCAL_VALUE(a) \ + (eassert (BUFFER_LOCAL_VALUEP (a)), &(XMISC(a)->u_buffer_local_value)) +#define XKBOARD_OBJFWD(a) \ + (eassert (KBOARD_OBJFWDP (a)), &(XMISC(a)->u_kboard_objfwd)) /* Pseudovector types. */ -#define XPROCESS(a) (eassert (GC_PROCESSP(a)),(struct Lisp_Process *) XPNTR(a)) -#define XWINDOW(a) (eassert (GC_WINDOWP(a)),(struct window *) XPNTR(a)) -#define XTERMINAL(a) (eassert (GC_TERMINALP(a)),(struct terminal *) XPNTR(a)) -#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) (eassert (GC_CHAR_TABLE_P (a)), (struct Lisp_Char_Table *) XPNTR(a)) -#define XBOOL_VECTOR(a) (eassert (GC_BOOL_VECTOR_P (a)), (struct Lisp_Bool_Vector *) XPNTR(a)) +#define XPROCESS(a) (eassert (PROCESSP(a)),(struct Lisp_Process *) XPNTR(a)) +#define XWINDOW(a) (eassert (WINDOWP(a)),(struct window *) XPNTR(a)) +#define XTERMINAL(a) (eassert (TERMINALP(a)),(struct terminal *) XPNTR(a)) +#define XSUBR(a) (eassert (SUBRP(a)),(struct Lisp_Subr *) XPNTR(a)) +#define XBUFFER(a) (eassert (BUFFERP(a)),(struct buffer *) XPNTR(a)) +#define XCHAR_TABLE(a) (eassert (CHAR_TABLE_P (a)), (struct Lisp_Char_Table *) XPNTR(a)) +#define XSUB_CHAR_TABLE(a) (eassert (SUB_CHAR_TABLE_P (a)), (struct Lisp_Sub_Char_Table *) XPNTR(a)) +#define XBOOL_VECTOR(a) (eassert (BOOL_VECTOR_P (a)), (struct Lisp_Bool_Vector *) XPNTR(a)) /* Construct a Lisp_Object from a value or address. */ @@ -574,12 +584,17 @@ extern size_t pure_size; #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. */ #define AREF(ARRAY, IDX) XVECTOR ((ARRAY))->contents[IDX] -#define ASET(ARRAY, IDX, VAL) (AREF ((ARRAY), (IDX)) = (VAL)) #define ASIZE(ARRAY) XVECTOR ((ARRAY))->size +/* The IDX==IDX tries to detect when the macro argument is side-effecting. */ +#define ASET(ARRAY, IDX, VAL) \ + (eassert ((IDX) == (IDX)), \ + eassert ((IDX) >= 0 && (IDX) < ASIZE (ARRAY)), \ + AREF ((ARRAY), (IDX)) = (VAL)) /* Convenience macros for dealing with Lisp strings. */ @@ -754,49 +769,20 @@ struct Lisp_Vector ((OFFSETOF(type, nonlispfield) - OFFSETOF(struct Lisp_Vector, contents[0])) \ / sizeof (Lisp_Object)) -/* 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 - -/* These are the slot of the default values for single byte - characters. As 0x9A is never be a charset-id, it is safe to use - that slot for ASCII. 0x9E and 0x80 are charset-ids of - eight-bit-control and eight-bit-graphic respectively. */ -#define CHAR_TABLE_DEFAULT_SLOT_ASCII (0x9A + 128) -#define CHAR_TABLE_DEFAULT_SLOT_8_BIT_CONTROL (0x9E + 128) -#define CHAR_TABLE_DEFAULT_SLOT_8_BIT_GRAPHIC (0x80 + 128) - -/* 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. */ @@ -804,70 +790,92 @@ struct Lisp_Vector (((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) \ + ((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, - return IDX. +/* Almost equivalent to Faref (CT, IDX). However, if the result is + not a character, return IDX. 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) + 8-bit European characters. Do not check validity of CT. */ +#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. */ + The size counts the defalt, parent, purpose, ascii, + contents, and extras slots. */ EMACS_UINT 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. */ + /* 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'. */ + + /* This is a symbol which says what kind of use this char-table is + meant for. */ Lisp_Object purpose; - /* These hold additional data. */ + + /* 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 { @@ -1076,7 +1084,6 @@ struct Lisp_Hash_Table (XSETPSEUDOVECTOR (VAR, PTR, PVEC_HASH_TABLE)) #define HASH_TABLE_P(OBJ) PSEUDOVECTORP (OBJ, PVEC_HASH_TABLE) -#define GC_HASH_TABLE_P(x) GC_PSEUDOVECTORP (x, PVEC_HASH_TABLE) #define CHECK_HASH_TABLE(x) \ CHECK_TYPE (HASH_TABLE_P (x), Qhash_table_p, x) @@ -1124,11 +1131,22 @@ struct Lisp_Hash_Table /* These structures are used for various misc types. */ +struct Lisp_Misc_Any /* Supertype of all Misc types. */ +{ + enum Lisp_Misc_Type type : 16; /* = Lisp_Misc_Marker */ + unsigned gcmarkbit : 1; + int spacer : 15; +}; + struct Lisp_Marker { - int type : 16; /* = Lisp_Misc_Marker */ + enum Lisp_Misc_Type type : 16; /* = Lisp_Misc_Marker */ unsigned gcmarkbit : 1; - int spacer : 14; + int spacer : 13; + /* This flag is temporarily used in the functions + decode/encode_coding_object to record that the marker position + must be adjusted after the conversion. */ + unsigned int need_adjustment : 1; /* 1 means normal insertion at the marker's position leaves the marker after the inserted text. */ unsigned int insertion_type : 1; @@ -1201,6 +1219,7 @@ struct Lisp_Buffer_Objfwd int type : 16; /* = Lisp_Misc_Buffer_Objfwd */ unsigned gcmarkbit : 1; int spacer : 15; + Lisp_Object slottype; /* Qnil, Lisp_Int, Lisp_Symbol, or Lisp_String. */ int offset; }; @@ -1224,19 +1243,19 @@ struct Lisp_Buffer_Objfwd binding into `realvalue' (or through it). Also update LOADED-BINDING to point to the newly loaded binding. - Lisp_Misc_Buffer_Local_Value and Lisp_Misc_Some_Buffer_Local_Value - both use this kind of structure. With the former, merely setting - the variable creates a local binding for the current buffer. With - the latter, setting the variable does not do that; only - make-local-variable does that. */ + `local_if_set' indicates that merely setting the variable creates a local + binding for the current buffer. Otherwise the latter, setting the + variable does not do that; only make-local-variable does that. */ struct Lisp_Buffer_Local_Value { - int type : 16; /* = Lisp_Misc_Buffer_Local_Value - or Lisp_Misc_Some_Buffer_Local_Value */ + int type : 16; /* = Lisp_Misc_Buffer_Local_Value */ unsigned gcmarkbit : 1; - int spacer : 12; + int spacer : 11; + /* 1 means that merely setting the variable creates a local + binding for the current buffer */ + unsigned int local_if_set : 1; /* 1 means this variable is allowed to have frame-local bindings, so check for them when looking for the proper binding. */ unsigned int check_frame : 1; @@ -1273,7 +1292,7 @@ struct Lisp_Buffer_Local_Value PLIST is the overlay's property list. */ struct Lisp_Overlay { - int type : 16; /* = Lisp_Misc_Overlay */ + enum Lisp_Misc_Type type : 16; /* = Lisp_Misc_Overlay */ unsigned gcmarkbit : 1; int spacer : 15; struct Lisp_Overlay *next; @@ -1284,7 +1303,7 @@ struct Lisp_Overlay current kboard. */ struct Lisp_Kboard_Objfwd { - int type : 16; /* = Lisp_Misc_Kboard_Objfwd */ + enum Lisp_Misc_Type type : 16; /* = Lisp_Misc_Kboard_Objfwd */ unsigned gcmarkbit : 1; int spacer : 15; int offset; @@ -1294,7 +1313,7 @@ struct Lisp_Kboard_Objfwd This type of object is used in the arg to record_unwind_protect. */ struct Lisp_Save_Value { - int type : 16; /* = Lisp_Misc_Save_Value */ + enum Lisp_Misc_Type type : 16; /* = Lisp_Misc_Save_Value */ unsigned gcmarkbit : 1; int spacer : 14; /* If DOGC is set, POINTER is the address of a memory @@ -1308,7 +1327,7 @@ struct Lisp_Save_Value /* A miscellaneous object, when it's on the free list. */ struct Lisp_Free { - int type : 16; /* = Lisp_Misc_Free */ + enum Lisp_Misc_Type type : 16; /* = Lisp_Misc_Free */ unsigned gcmarkbit : 1; int spacer : 15; union Lisp_Misc *chain; @@ -1326,7 +1345,8 @@ struct Lisp_Free union Lisp_Misc { - struct Lisp_Free u_free; + struct Lisp_Misc_Any u_any; /* Supertype of all Misc types. */ + struct Lisp_Free u_free; /* Includes padding to force alignment. */ struct Lisp_Marker u_marker; struct Lisp_Intfwd u_intfwd; struct Lisp_Boolfwd u_boolfwd; @@ -1389,58 +1409,69 @@ typedef unsigned char UCHAR; (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 allocated at the place pointed by the second argument. - Thers are 6 modifiers, each consumes 2 chars. + There are 6 modifiers, each consumes 2 chars. The octal form of a character code consumes (1 + CHARACTERBITS / 3 + 1) chars (including backslash at the head). We need one more byte for string terminator `\0'. */ #define KEY_DESCRIPTION_SIZE ((2 * 6) + 1 + (CHARACTERBITS / 3) + 1 + 1) -/* The glyph datatype, used to represent characters on the display. */ - -/* Glyph code to use as an index to the glyph table. If it is out of - range for the glyph table, or the corresonding element in the table - is nil, the low 8 bits are the single byte character code, and the - bits above are the numeric face ID. If FID is the face ID of a - glyph on a frame F, then F->display.x->faces[FID] contains the - description of that face. This is an int instead of a short, so we - can support a good bunch of face ID's (2^(31 - 8)); given that we - have no mechanism for tossing unused frame face ID's yet, we'll - probably run out of 255 pretty quickly. - This is always -1 for a multibyte character. */ -#define GLYPH int - -/* Mask bits for face. */ -#define GLYPH_MASK_FACE 0x7FF80000 - /* Mask bits for character code. */ -#define GLYPH_MASK_CHAR 0x0007FFFF /* The lowest 19 bits */ - -/* The FAST macros assume that we already know we're in an X window. */ - -/* Set a character code and a face ID in a glyph G. */ -#define FAST_MAKE_GLYPH(char, face) ((char) | ((face) << CHARACTERBITS)) +/* The glyph datatype, used to represent characters on the display. + It consists of a char code and a face id. */ + +typedef struct { + int ch; + int face_id; +} GLYPH; /* Return a glyph's character code. */ -#define FAST_GLYPH_CHAR(glyph) ((glyph) & GLYPH_MASK_CHAR) +#define GLYPH_CHAR(glyph) ((glyph).ch) /* Return a glyph's face ID. */ -#define FAST_GLYPH_FACE(glyph) (((glyph) & GLYPH_MASK_FACE) >> CHARACTERBITS) +#define GLYPH_FACE(glyph) ((glyph).face_id) -/* Slower versions that test the frame type first. */ -#define MAKE_GLYPH(f, char, face) (FAST_MAKE_GLYPH (char, face)) -#define GLYPH_CHAR(f, g) (FAST_GLYPH_CHAR (g)) -#define GLYPH_FACE(f, g) (FAST_GLYPH_FACE (g)) +#define SET_GLYPH_CHAR(glyph, char) ((glyph).ch = (char)) +#define SET_GLYPH_FACE(glyph, face) ((glyph).face_id = (face)) +#define SET_GLYPH(glyph, char, face) ((glyph).ch = (char), (glyph).face_id = (face)) /* Return 1 if GLYPH contains valid character code. */ -#define GLYPH_CHAR_VALID_P(glyph) CHAR_VALID_P (FAST_GLYPH_CHAR (glyph), 1) +#define GLYPH_CHAR_VALID_P(glyph) CHAR_VALID_P (GLYPH_CHAR (glyph), 1) + + +/* Glyph Code from a display vector may either be an integer which + encodes a char code in the lower CHARACTERBITS bits and a (very small) + face-id in the upper bits, or it may be a cons (CHAR . FACE-ID). */ + +#define GLYPH_CODE_CHAR(gc) \ + (CONSP (gc) ? XINT (XCAR (gc)) : INTEGERP (gc) ? (XINT (gc) & ((1 << CHARACTERBITS)-1)) : 0) + +#define GLYPH_CODE_FACE(gc) \ + (CONSP (gc) ? XINT (XCDR (gc)) : INTEGERP (gc) ? (XINT (gc) >> CHARACTERBITS) : DEFAULT_FACE_ID) + +/* Return 1 if glyph code from display vector contains valid character code. */ +#define GLYPH_CODE_CHAR_VALID_P(gc) CHAR_VALID_P (GLYPH_CODE_CHAR (gc), 1) + +#define GLYPH_CODE_P(gc) ((CONSP (gc) && INTEGERP (XCAR (gc)) && INTEGERP (XCDR (gc))) || INTEGERP (gc)) + +/* Only called when GLYPH_CODE_P (gc) is true. */ +#define SET_GLYPH_FROM_GLYPH_CODE(glyph, gc) \ + do \ + { \ + if (CONSP (gc)) \ + SET_GLYPH (glyph, XINT (XCAR (gc)), XINT (XCDR (gc))); \ + else \ + SET_GLYPH (glyph, (XINT (gc) & ((1 << CHARACTERBITS)-1)), \ + (XINT (gc) >> CHARACTERBITS)); \ + } \ + while (0) /* The ID of the mode line highlighting face. */ #define GLYPH_MODE_LINE_FACE 1 @@ -1448,48 +1479,29 @@ typedef unsigned char UCHAR; /* Data type checking */ #define NILP(x) EQ (x, Qnil) -#define GC_NILP(x) GC_EQ (x, Qnil) #define NUMBERP(x) (INTEGERP (x) || FLOATP (x)) -#define GC_NUMBERP(x) (GC_INTEGERP (x) || GC_FLOATP (x)) #define NATNUMP(x) (INTEGERP (x) && XINT (x) >= 0) -#define GC_NATNUMP(x) (GC_INTEGERP (x) && XINT (x) >= 0) #define INTEGERP(x) (XTYPE ((x)) == Lisp_Int) -#define GC_INTEGERP(x) INTEGERP (x) #define SYMBOLP(x) (XTYPE ((x)) == Lisp_Symbol) -#define GC_SYMBOLP(x) (XGCTYPE ((x)) == Lisp_Symbol) #define MISCP(x) (XTYPE ((x)) == Lisp_Misc) -#define GC_MISCP(x) (XGCTYPE ((x)) == Lisp_Misc) #define VECTORLIKEP(x) (XTYPE ((x)) == Lisp_Vectorlike) -#define GC_VECTORLIKEP(x) (XGCTYPE ((x)) == Lisp_Vectorlike) #define STRINGP(x) (XTYPE ((x)) == Lisp_String) -#define GC_STRINGP(x) (XGCTYPE ((x)) == Lisp_String) #define CONSP(x) (XTYPE ((x)) == Lisp_Cons) -#define GC_CONSP(x) (XGCTYPE ((x)) == Lisp_Cons) #define FLOATP(x) (XTYPE ((x)) == Lisp_Float) -#define GC_FLOATP(x) (XGCTYPE ((x)) == Lisp_Float) -#define VECTORP(x) (VECTORLIKEP (x) && !(XVECTOR (x)->size & PSEUDOVECTOR_FLAG)) -#define GC_VECTORP(x) (GC_VECTORLIKEP (x) && !(XVECTOR (x)->size & PSEUDOVECTOR_FLAG)) +#define VECTORP(x) (VECTORLIKEP (x) && !(XVECTOR (x)->size & PSEUDOVECTOR_FLAG)) #define OVERLAYP(x) (MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Overlay) -#define GC_OVERLAYP(x) (GC_MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Overlay) #define MARKERP(x) (MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Marker) -#define GC_MARKERP(x) (GC_MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Marker) #define INTFWDP(x) (MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Intfwd) -#define GC_INTFWDP(x) (GC_MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Intfwd) #define BOOLFWDP(x) (MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Boolfwd) -#define GC_BOOLFWDP(x) (GC_MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Boolfwd) #define OBJFWDP(x) (MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Objfwd) -#define GC_OBJFWDP(x) (GC_MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Objfwd) #define BUFFER_OBJFWDP(x) (MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Buffer_Objfwd) -#define GC_BUFFER_OBJFWDP(x) (GC_MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Buffer_Objfwd) #define BUFFER_LOCAL_VALUEP(x) (MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Buffer_Local_Value) -#define GC_BUFFER_LOCAL_VALUEP(x) (GC_MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Buffer_Local_Value) #define SOME_BUFFER_LOCAL_VALUEP(x) (MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Some_Buffer_Local_Value) -#define GC_SOME_BUFFER_LOCAL_VALUEP(x) (GC_MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Some_Buffer_Local_Value) #define KBOARD_OBJFWDP(x) (MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Kboard_Objfwd) -#define GC_KBOARD_OBJFWDP(x) (GC_MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Kboard_Objfwd) +#define SAVE_VALUEP(x) (MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Save_Value) /* True if object X is a pseudovector whose code is CODE. */ @@ -1498,36 +1510,18 @@ typedef unsigned char UCHAR; && (((XVECTOR (x)->size & (PSEUDOVECTOR_FLAG | (code)))) \ == (PSEUDOVECTOR_FLAG | (code)))) -/* True if object X is a pseudovector whose code is CODE. - This one works during GC. */ -#define GC_PSEUDOVECTORP(x, code) \ - (GC_VECTORLIKEP (x) \ - && (((XVECTOR (x)->size & (PSEUDOVECTOR_FLAG | (code)))) \ - == (PSEUDOVECTOR_FLAG | (code)))) - /* Test for specific pseudovector types. */ #define WINDOW_CONFIGURATIONP(x) PSEUDOVECTORP (x, PVEC_WINDOW_CONFIGURATION) -#define GC_WINDOW_CONFIGURATIONP(x) GC_PSEUDOVECTORP (x, PVEC_WINDOW_CONFIGURATION) #define PROCESSP(x) PSEUDOVECTORP (x, PVEC_PROCESS) -#define GC_PROCESSP(x) GC_PSEUDOVECTORP (x, PVEC_PROCESS) #define WINDOWP(x) PSEUDOVECTORP (x, PVEC_WINDOW) -#define GC_WINDOWP(x) GC_PSEUDOVECTORP (x, PVEC_WINDOW) #define TERMINALP(x) PSEUDOVECTORP (x, PVEC_TERMINAL) -#define GC_TERMINALP(x) GC_PSEUDOVECTORP (x, PVEC_TERMINAL) #define SUBRP(x) PSEUDOVECTORP (x, PVEC_SUBR) -#define GC_SUBRP(x) GC_PSEUDOVECTORP (x, PVEC_SUBR) #define COMPILEDP(x) PSEUDOVECTORP (x, PVEC_COMPILED) -#define GC_COMPILEDP(x) GC_PSEUDOVECTORP (x, PVEC_COMPILED) #define BUFFERP(x) PSEUDOVECTORP (x, PVEC_BUFFER) -#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 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)) /* Test for image (image . spec) */ #define IMAGEP(x) (CONSP (x) && EQ (XCAR (x), Qimage)) @@ -1537,8 +1531,6 @@ typedef unsigned char UCHAR; #define ARRAYP(x) \ (VECTORP (x) || STRINGP (x) || CHAR_TABLE_P (x) || BOOL_VECTOR_P (x)) -#define GC_EQ(x, y) EQ (x, y) - #define CHECK_LIST(x) \ CHECK_TYPE (CONSP (x) || NILP (x), Qlistp, x) @@ -1644,6 +1636,20 @@ typedef unsigned char UCHAR; XSETCDR ((x), tmp); \ } while (0) +#define CHECK_NATNUM_CAR(x) \ + do { \ + Lisp_Object tmp = XCAR (x); \ + CHECK_NATNUM (tmp); \ + XSETCAR ((x), tmp); \ + } while (0) + +#define CHECK_NATNUM_CDR(x) \ + do { \ + Lisp_Object tmp = XCDR (x); \ + CHECK_NATNUM (tmp); \ + XSETCDR ((x), tmp); \ + } while (0) + /* Cast pointers to this type to compare them. Some machines want int. */ #ifndef PNTR_COMPARISON_TYPE #define PNTR_COMPARISON_TYPE EMACS_UINT @@ -1674,8 +1680,7 @@ typedef unsigned char UCHAR; A null string means call interactively with no arguments. `doc' is documentation for the user. */ -#if (!defined (__STDC__) && !defined (PROTOTYPES)) \ - || defined (USE_NONANSI_DEFUN) +#if (!defined (__STDC__) && !defined (PROTOTYPES)) #define DEFUN(lname, fnname, sname, minargs, maxargs, intspec, doc) \ Lisp_Object fnname (); \ @@ -2124,8 +2129,7 @@ void staticpro P_ ((Lisp_Object *)); /* Declare a Lisp-callable function. The MAXARGS parameter has the same meaning as in the DEFUN macro, and is used to construct a prototype. */ -#if (!defined (__STDC__) && !defined (PROTOTYPES)) \ - || defined (USE_NONANSI_DEFUN) +#if (!defined (__STDC__) && !defined (PROTOTYPES)) #define EXFUN(fnname, maxargs) \ extern Lisp_Object fnname () #else @@ -2278,34 +2282,44 @@ extern void keys_of_cmds P_ ((void)); /* Defined in coding.c */ EXFUN (Fcoding_system_p, 1); +EXFUN (Fcoding_system_base, 1); +EXFUN (Fcoding_system_eol_type, 1); +EXFUN (Fcheck_coding_system, 1); EXFUN (Fcheck_coding_system, 1); EXFUN (Fread_coding_system, 2); 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_ ((const unsigned char *, int, int, - int)); +EXFUN (Fencode_coding_string, 4); +EXFUN (Fdecode_coding_string, 4); +extern Lisp_Object detect_coding_system P_ ((const unsigned char *, EMACS_INT, + EMACS_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)); +EXFUN (Funibyte_char_to_multibyte, 1); /* Defined in charset.c */ -extern EMACS_INT nonascii_insert_offset; -extern Lisp_Object Vnonascii_translation_table; EXFUN (Fchar_bytes, 1); EXFUN (Fchar_width, 1); EXFUN (Fstring, MANY); -extern int chars_in_text P_ ((const unsigned char *, int)); -extern int multibyte_chars_in_text P_ ((const unsigned char *, int)); -extern int unibyte_char_to_multibyte P_ ((int)); +extern EMACS_INT chars_in_text P_ ((const unsigned char *, EMACS_INT)); +extern EMACS_INT multibyte_chars_in_text P_ ((const unsigned char *, EMACS_INT)); extern int multibyte_char_to_unibyte P_ ((int, Lisp_Object)); +extern int multibyte_char_to_unibyte_safe P_ ((int)); extern Lisp_Object Qcharset; +extern void init_charset P_ ((void)); extern void init_charset_once P_ ((void)); extern void syms_of_charset P_ ((void)); +/* Structure forward declarations. */ +struct charset; + +/* Defined in composite.c */ +extern void syms_of_composite P_ ((void)); /* Defined in syntax.c */ EXFUN (Fforward_word, 1); @@ -2323,9 +2337,8 @@ extern int next_almost_prime P_ ((int)); 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, @@ -2340,6 +2353,7 @@ void remove_hash_entry P_ ((struct Lisp_Hash_Table *, int)); 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); @@ -2398,9 +2412,10 @@ extern Lisp_Object concat2 P_ ((Lisp_Object, Lisp_Object)); extern Lisp_Object concat3 P_ ((Lisp_Object, Lisp_Object, Lisp_Object)); extern Lisp_Object nconc2 P_ ((Lisp_Object, Lisp_Object)); extern Lisp_Object assq_no_quit P_ ((Lisp_Object, Lisp_Object)); +extern Lisp_Object assoc_no_quit P_ ((Lisp_Object, Lisp_Object)); extern void clear_string_char_byte_cache P_ ((void)); -extern int string_char_to_byte P_ ((Lisp_Object, int)); -extern int string_byte_to_char P_ ((Lisp_Object, int)); +extern EMACS_INT string_char_to_byte P_ ((Lisp_Object, EMACS_INT)); +extern EMACS_INT string_byte_to_char P_ ((Lisp_Object, EMACS_INT)); extern Lisp_Object string_make_multibyte P_ ((Lisp_Object)); extern Lisp_Object string_to_multibyte P_ ((Lisp_Object)); extern Lisp_Object string_make_unibyte P_ ((Lisp_Object)); @@ -2408,18 +2423,10 @@ EXFUN (Fcopy_alist, 1); EXFUN (Fplist_get, 2); EXFUN (Fplist_put, 3); EXFUN (Fplist_member, 2); -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, Lisp_Object, int, - int *)); -extern Lisp_Object char_table_ref_and_index P_ ((Lisp_Object, int, int *)); extern void syms_of_fns P_ ((void)); /* Defined in floatfns.c */ @@ -2452,6 +2459,7 @@ extern void insert P_ ((const unsigned char *, int)); extern void insert_and_inherit P_ ((const unsigned char *, int)); extern void insert_1 P_ ((const unsigned char *, int, int, int, int)); extern void insert_1_both P_ ((const unsigned char *, int, int, int, int, int)); +extern void insert_from_gap P_ ((EMACS_INT, EMACS_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)); @@ -2578,11 +2586,13 @@ extern Lisp_Object make_pure_vector P_ ((EMACS_INT)); 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)); +extern struct Lisp_Vector *allocate_pseudovector P_ ((int memlen, int lisplen, EMACS_INT tag)); +#define ALLOCATE_PSEUDOVECTOR(typ,field,tag) \ + ((typ*) \ + allocate_pseudovector \ + (VECSIZE (typ), PSEUDOVECSIZE (typ, field), tag)) extern struct Lisp_Hash_Table *allocate_hash_table P_ ((void)); extern struct window *allocate_window P_ ((void)); extern struct frame *allocate_frame P_ ((void)); @@ -2603,6 +2613,31 @@ extern void syms_of_alloc P_ ((void)); extern struct buffer * allocate_buffer P_ ((void)); extern int valid_lisp_object_p P_ ((Lisp_Object)); +/* 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)); +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)); @@ -2814,8 +2849,10 @@ extern void report_overlay_modification P_ ((Lisp_Object, Lisp_Object, int, Lisp_Object, Lisp_Object, Lisp_Object)); extern int overlay_touches_p P_ ((int)); extern Lisp_Object Vbuffer_alist, Vinhibit_read_only; +EXFUN (Fbuffer_list, 1); EXFUN (Fget_buffer, 1); EXFUN (Fget_buffer_create, 1); +EXFUN (Fgenerate_new_buffer_name, 2); EXFUN (Fset_buffer, 1); EXFUN (set_buffer_if_live, 1); EXFUN (Fbarf_if_buffer_read_only, 0); @@ -3043,7 +3080,6 @@ EXFUN (Fvisible_frame_list, 0); EXFUN (Fframe_parameter, 2); EXFUN (Fframe_parameters, 1); EXFUN (Fmodify_frame_parameters, 2); -EXFUN (Fframe_with_environment, 1); EXFUN (Fset_frame_height, 3); EXFUN (Fset_frame_width, 3); EXFUN (Fset_frame_size, 3); @@ -3160,7 +3196,9 @@ extern Lisp_Object Qinsert_in_front_hooks, Qinsert_behind_hooks; EXFUN (Fnext_single_property_change, 4); EXFUN (Fnext_single_char_property_change, 4); EXFUN (Fprevious_single_property_change, 4); +EXFUN (Fget_text_property, 3); EXFUN (Fput_text_property, 5); +EXFUN (Fget_text_property, 3); EXFUN (Fprevious_char_property_change, 2); EXFUN (Fnext_char_property_change, 2); extern void report_interval_modification P_ ((Lisp_Object, Lisp_Object)); @@ -3220,6 +3258,7 @@ extern void init_sound P_ ((void)); /* 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 */ @@ -3231,15 +3270,17 @@ extern void syms_of_dired P_ ((void)); /* Defined in term.c */ extern void syms_of_term P_ ((void)); -extern void fatal () NO_RETURN; +extern void fatal P_ ((const char *msgid, ...)) NO_RETURN; /* Defined in terminal.c */ +EXFUN (Fdelete_terminal, 2); extern void syms_of_terminal P_ ((void)); #ifdef HAVE_WINDOW_SYSTEM /* Defined in fontset.c */ extern void syms_of_fontset P_ ((void)); -EXFUN (Fset_fontset_font, 4); +EXFUN (Fset_fontset_font, 5); +EXFUN (Fnew_fontset, 2); /* Defined in xfns.c, w32fns.c, or macfns.c */ EXFUN (Fxw_display_color_p, 1); @@ -3294,6 +3335,11 @@ extern void syms_of_mac P_ ((void)); extern void init_mac_osx_environment P_ ((void)); #endif /* MAC_OSX */ #endif /* MAC_OS */ + +#ifdef HAVE_MENUS +/* Defined in (x|mac|w32)fns.c... */ +extern int have_menus_p P_ ((void)); +#endif /* Nonzero means Emacs has already been initialized. Used during startup to detect startup of dumped Emacs. */ @@ -3337,11 +3383,7 @@ extern Lisp_Object Vdirectory_sep_char; #define IS_ANY_SEP(_c_) (IS_DIRECTORY_SEP (_c_)) #endif -#ifdef SWITCH_ENUM_BUG -#define SWITCH_ENUM_CAST(x) ((int)(x)) -#else #define SWITCH_ENUM_CAST(x) (x) -#endif /* Loop over Lisp list LIST. Signal an error if LIST is not a proper list, or if it contains circles. @@ -3380,9 +3422,11 @@ extern Lisp_Object Vdirectory_sep_char; #define min(a, b) ((a) < (b) ? (a) : (b)) #define max(a, b) ((a) > (b) ? (a) : (b)) -/* Make sure we have abs defined */ -#if !defined(abs) -#define abs(x) ((x) < 0 ? -(x) : (x)) +/* We used to use `abs', but that clashes with system headers on some + platforms, and using a name reserved by Standard C is a bad idea + anyway. */ +#if !defined(eabs) +#define eabs(x) ((x) < 0 ? -(x) : (x)) #endif /* Return a fixnum or float, depending on whether VAL fits in a Lisp