X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/f23d76bdefbd4c06e14d69e99e50d35ce91c8226..631248e534884a75e3b7baaf7d1b83897e607ff2:/src/lisp.h?ds=sidebyside diff --git a/src/lisp.h b/src/lisp.h index f4b93ff9dc..288d9642b8 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -1,13 +1,14 @@ /* 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. -GNU Emacs is free software; you can redistribute it and/or modify +GNU Emacs is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 3, or (at your option) -any later version. +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. GNU Emacs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -15,9 +16,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with GNU Emacs; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -Boston, MA 02110-1301, USA. */ +along with GNU Emacs. If not, see . */ #ifndef EMACS_LISP_H #define EMACS_LISP_H @@ -349,7 +348,9 @@ enum pvec_type PVEC_HASH_TABLE = 0x40000, PVEC_TERMINAL = 0x80000, PVEC_SUB_CHAR_TABLE = 0x100000, - PVEC_TYPE_MASK = 0x1ffe00 + PVEC_FONT = 0x200000, + PVEC_OTHER = 0x400000, + PVEC_TYPE_MASK = 0x7ffe00 #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 @@ -587,8 +588,12 @@ extern size_t pure_size; /* 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. */ @@ -719,6 +724,13 @@ extern int string_bytes P_ ((struct Lisp_String *)); (STR) = empty_unibyte_string; \ else XSTRING (STR)->size_byte = -1; } while (0) +/* Mark STR as a multibyte string. Assure that STR contains only + ASCII characters in advance. */ +#define STRING_SET_MULTIBYTE(STR) \ + do { if (EQ (STR, empty_unibyte_string)) \ + (STR) = empty_multibyte_string; \ + else XSTRING (STR)->size_byte = XSTRING (STR)->size; } while (0) + /* Get text properties. */ #define STRING_INTERVALS(STR) (XSTRING (STR)->intervals + 0) @@ -981,7 +993,7 @@ struct Lisp_Symbol #define SYMBOL_VALUE(sym) \ (XSYMBOL (sym)->indirect_variable \ - ? XSYMBOL (indirect_variable (sym))->value \ + ? indirect_variable (XSYMBOL (sym))->value \ : XSYMBOL (sym)->value) /* Set SYM's value to VAL, taking defvaralias into account. */ @@ -989,7 +1001,7 @@ struct Lisp_Symbol #define SET_SYMBOL_VALUE(sym, val) \ do { \ if (XSYMBOL (sym)->indirect_variable) \ - XSYMBOL (indirect_variable ((sym)))->value = (val); \ + indirect_variable (XSYMBOL (sym))->value = (val); \ else \ XSYMBOL (sym)->value = (val); \ } while (0) @@ -1127,16 +1139,20 @@ struct Lisp_Hash_Table struct Lisp_Misc_Any /* Supertype of all Misc types. */ { - int type : 16; /* = Lisp_Misc_Marker */ + 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; @@ -1209,6 +1225,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; }; @@ -1281,7 +1298,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; @@ -1292,7 +1309,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; @@ -1302,7 +1319,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 @@ -1316,7 +1333,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; @@ -1406,50 +1423,61 @@ typedef unsigned char UCHAR; 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 0x7FC00000 - /* Mask bits for character code. */ -#define GLYPH_MASK_CHAR 0x003FFFFF /* The lowest 22 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 @@ -1658,8 +1686,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 (); \ @@ -2108,8 +2135,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 @@ -2237,7 +2263,7 @@ EXFUN (Fadd1, 1); EXFUN (Fsub1, 1); EXFUN (Fmake_variable_buffer_local, 1); -extern Lisp_Object indirect_variable P_ ((Lisp_Object)); +extern struct Lisp_Symbol *indirect_variable (struct Lisp_Symbol *); extern Lisp_Object long_to_cons P_ ((unsigned long)); extern unsigned long cons_to_long P_ ((Lisp_Object)); extern void args_out_of_range P_ ((Lisp_Object, Lisp_Object)) NO_RETURN; @@ -2272,8 +2298,8 @@ EXFUN (Ffind_operation_coding_system, MANY); EXFUN (Fupdate_coding_systems_internal, 0); EXFUN (Fencode_coding_string, 4); EXFUN (Fdecode_coding_string, 4); -extern Lisp_Object detect_coding_system P_ ((const unsigned char *, int, - int, int, int, Lisp_Object)); +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)); @@ -2287,8 +2313,8 @@ EXFUN (Funibyte_char_to_multibyte, 1); 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 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; @@ -2394,8 +2420,8 @@ 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)); @@ -2439,7 +2465,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_ ((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)); @@ -2568,7 +2594,11 @@ EXFUN (Fmake_byte_code, MANY); EXFUN (Fmake_bool_vector, 2); 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)); @@ -2752,6 +2782,7 @@ EXFUN (Ffetch_bytecode, 1); extern void init_eval_once P_ ((void)); extern Lisp_Object safe_call P_ ((int, Lisp_Object *)); extern Lisp_Object safe_call1 P_ ((Lisp_Object, Lisp_Object)); +extern Lisp_Object safe_call2 (Lisp_Object, Lisp_Object, Lisp_Object); extern void init_eval P_ ((void)); extern void syms_of_eval P_ ((void)); @@ -2825,6 +2856,7 @@ 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); @@ -2941,11 +2973,11 @@ EXFUN (Fread_minibuffer, 2); EXFUN (Feval_minibuffer, 2); EXFUN (Fread_string, 5); EXFUN (Fread_no_blanks_input, 3); +EXFUN (Fassoc_string, 3); extern Lisp_Object get_minibuffer P_ ((int)); extern void temp_echo_area_glyphs P_ ((Lisp_Object)); extern void init_minibuf_once P_ ((void)); extern void syms_of_minibuf P_ ((void)); -extern void keys_of_minibuf P_ ((void)); /* Defined in callint.c */ @@ -3000,6 +3032,7 @@ EXFUN (Fset_output_flow_control, 2); EXFUN (Fset_input_meta_mode, 2); EXFUN (Fset_quit_char, 1); EXFUN (Fset_input_mode, 4); +extern Lisp_Object pending_funcalls; extern int detect_input_pending P_ ((void)); extern int detect_input_pending_ignore_squeezables P_ ((void)); extern int detect_input_pending_run_timers P_ ((int)); @@ -3245,9 +3278,10 @@ 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 @@ -3357,11 +3391,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.