X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/dd559368b0db67654f643320b1d84afdabe60e97..5b95556284173d0cebc3b1378166c207afb3c495:/src/lisp.h diff --git a/src/lisp.h b/src/lisp.h index 284ee0b2b2..6444aac84d 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -1,14 +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, 2008 + 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 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 @@ -16,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 @@ -30,29 +28,8 @@ Boston, MA 02110-1301, USA. */ #define P_(proto) () #endif -#if 0 -/* Define this temporarily to hunt a bug. If defined, the size of - strings is redundantly recorded in sdata structures so that it can - be compared to the sizes recorded in Lisp strings. */ - -#define GC_CHECK_STRING_BYTES 1 - -/* Define this to check for short string overrun. */ - -#define GC_CHECK_STRING_OVERRUN 1 - -/* Define this to check the string free list. */ - -#define GC_CHECK_STRING_FREE_LIST 1 - -/* Define this to check for malloc buffer overrun. */ - -#define XMALLOC_OVERRUN_CHECK 1 - -/* Define this to check for errors in cons list. */ -/* #define GC_CHECK_CONS_LIST 1 */ - -#endif /* 0 */ +/* Use the configure flag --enable-checking[=LIST] to enable various + types of run time checks for Lisp objects. */ #ifdef GC_CHECK_CONS_LIST #define CHECK_CONS_LIST() check_cons_list() @@ -110,13 +87,6 @@ extern void die P_((const char *, const char *, int)) NO_RETURN; #endif -/* Used for making sure that Emacs is compilable in all - configurations. */ - -#ifdef USE_LISP_UNION_TYPE -#undef NO_UNION_TYPE -#endif - /* Define an Emacs version of "assert", since some system ones are flaky. */ #ifndef ENABLE_CHECKING @@ -129,10 +99,15 @@ extern void die P_((const char *, const char *, int)) NO_RETURN; #endif #endif /* ENABLE_CHECKING */ +/* Define this to make Lisp_Object use a union type instead of the + default int. FIXME: It might be better to add a flag to configure + to do this. */ +/* #define USE_LISP_UNION_TYPE */ + /***** Select the tagging scheme. *****/ /* There are basically two options that control the tagging scheme: - - NO_UNION_TYPE says that Lisp_Object should be an integer instead - of a union. + - USE_LISP_UNION_TYPE says that Lisp_Object should be a union instead + of an integer. - USE_LSB_TAG means that we can assume the least 3 bits of pointers are always 0, and we can thus use them to hold tag bits, without restricting our addressing space. @@ -161,11 +136,11 @@ extern void die P_((const char *, const char *, int)) NO_RETURN; #endif /* Let's USE_LSB_TAG on systems where we know malloc returns mult-of-8. */ -#if defined GNU_MALLOC || defined DOUG_LEA_MALLOC || defined __GLIBC__ || defined MAC_OSX +#if defined GNU_MALLOC || defined DOUG_LEA_MALLOC || defined __GLIBC__ || defined DARWIN_OS /* We also need to be able to specify mult-of-8 alignment on static vars. */ # if defined DECL_ALIGN /* We currently do not support USE_LSB_TAG with a union Lisp_Object. */ -# if defined NO_UNION_TYPE +# ifndef USE_LISP_UNION_TYPE # define USE_LSB_TAG # endif # endif @@ -248,7 +223,7 @@ enum Lisp_Misc_Type #define VALBITS (BITS_PER_EMACS_INT - GCTYPEBITS) #endif -#ifndef NO_UNION_TYPE +#ifdef USE_LISP_UNION_TYPE #ifndef WORDS_BIG_ENDIAN @@ -312,13 +287,13 @@ LISP_MAKE_RVALUE (Lisp_Object o) #define LISP_MAKE_RVALUE(o) (o) #endif -#else /* NO_UNION_TYPE */ +#else /* USE_LISP_UNION_TYPE */ /* If union type is not wanted, define Lisp_Object as just a number. */ typedef EMACS_INT Lisp_Object; #define LISP_MAKE_RVALUE(o) (0+(o)) -#endif /* NO_UNION_TYPE */ +#endif /* USE_LISP_UNION_TYPE */ /* In the size word of a vector, this bit means the vector has been marked. */ @@ -350,8 +325,9 @@ enum pvec_type PVEC_HASH_TABLE = 0x40000, PVEC_TERMINAL = 0x80000, PVEC_SUB_CHAR_TABLE = 0x100000, - PVEC_OTHER = 0x200000, - PVEC_TYPE_MASK = 0x2ffe00 + 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 @@ -375,7 +351,7 @@ enum pvec_type For example, if tem is a Lisp_Object whose type is Lisp_Cons, XCONS (tem) is the struct Lisp_Cons * pointing to the memory for that cons. */ -#ifdef NO_UNION_TYPE +#ifndef USE_LISP_UNION_TYPE /* Return a perfect hash of the Lisp_Object representation. */ #define XHASH(a) (a) @@ -441,7 +417,7 @@ enum pvec_type #endif /* not USE_LSB_TAG */ -#else /* not NO_UNION_TYPE */ +#else /* USE_LISP_UNION_TYPE */ #define XHASH(a) ((a).i) @@ -473,7 +449,7 @@ enum pvec_type extern Lisp_Object make_number P_ ((EMACS_INT)); #endif -#endif /* NO_UNION_TYPE */ +#endif /* USE_LISP_UNION_TYPE */ #define EQ(x, y) (XHASH (x) == XHASH (y)) @@ -510,11 +486,13 @@ extern size_t pure_size; I.e. (x & INTMASK) == XUINT (make_number (x)). */ #define INTMASK ((((EMACS_INT) 1) << VALBITS) - 1) -/* Value is non-zero if C integer I doesn't fit into a Lisp fixnum. */ +/* Value is non-zero if I doesn't fit into a Lisp fixnum. It is + written this way so that it also works if I is of unsigned + type. */ #define FIXNUM_OVERFLOW_P(i) \ - ((EMACS_INT)(i) > MOST_POSITIVE_FIXNUM \ - || (EMACS_INT) (i) < MOST_NEGATIVE_FIXNUM) + ((i) > MOST_POSITIVE_FIXNUM \ + || ((i) < 0 && (i) < MOST_NEGATIVE_FIXNUM)) /* Extract a value or address from a Lisp_Object. */ @@ -589,8 +567,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. */ @@ -721,6 +703,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) @@ -785,13 +774,37 @@ struct Lisp_Vector #define CHAR_TABLE_EXTRA_SLOTS(CT) \ (((CT)->size & PSEUDOVECTOR_SIZE_MASK) - CHAR_TABLE_STANDARD_SLOTS) +#ifdef __GNUC__ + +#define CHAR_TABLE_REF_ASCII(CT, IDX) \ + ({struct Lisp_Char_Table *_tbl = NULL; \ + Lisp_Object _val; \ + do { \ + _tbl = _tbl ? XCHAR_TABLE (_tbl->parent) : XCHAR_TABLE (CT); \ + _val = (! SUB_CHAR_TABLE_P (_tbl->ascii) ? _tbl->ascii \ + : XSUB_CHAR_TABLE (_tbl->ascii)->contents[IDX]); \ + if (NILP (_val)) \ + _val = _tbl->defalt; \ + } while (NILP (_val) && ! NILP (_tbl->parent)); \ + _val; }) + +#else /* not __GNUC__ */ + +#define CHAR_TABLE_REF_ASCII(CT, IDX) \ + (! NILP (XCHAR_TABLE (CT)->ascii) \ + ? (! SUB_CHAR_TABLE_P (XCHAR_TABLE (CT)->ascii) \ + ? 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))) \ + : char_table_ref ((CT), (IDX))) + +#endif /* not __GNUC__ */ + /* Almost equivalent to Faref (CT, IDX) with optimization for ASCII 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] \ +#define CHAR_TABLE_REF(CT, IDX) \ + (ASCII_CHAR_P (IDX) ? CHAR_TABLE_REF_ASCII ((CT), (IDX)) \ : char_table_ref ((CT), (IDX))) /* Almost equivalent to Faref (CT, IDX). However, if the result is @@ -983,7 +996,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. */ @@ -991,7 +1004,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) @@ -1129,14 +1142,14 @@ 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 : 13; /* This flag is temporarily used in the functions @@ -1288,7 +1301,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; @@ -1299,7 +1312,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; @@ -1309,7 +1322,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 @@ -1323,7 +1336,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; @@ -1369,9 +1382,12 @@ struct Lisp_Float }; #ifdef HIDE_LISP_IMPLEMENTATION -#define XFLOAT_DATA(f) (XFLOAT (f)->u.data_) +#define XFLOAT_DATA(f) (XFLOAT (f)->u.data_ + 0) #else -#define XFLOAT_DATA(f) (XFLOAT (f)->u.data) +#define XFLOAT_DATA(f) (XFLOAT (f)->u.data + 0) +/* This should be used only in alloc.c, which always disables + HIDE_LISP_IMPLEMENTATION. */ +#define XFLOAT_INIT(f,n) (XFLOAT (f)->u.data = (n)) #endif /* A character, declared with the following typedef, is a member @@ -1420,43 +1436,54 @@ typedef unsigned char UCHAR; #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 @@ -1636,9 +1663,7 @@ typedef unsigned char UCHAR; } while (0) /* Cast pointers to this type to compare them. Some machines want int. */ -#ifndef PNTR_COMPARISON_TYPE #define PNTR_COMPARISON_TYPE EMACS_UINT -#endif /* Define a built-in function for calling from Lisp. `lname' should be the name to give the function in Lisp, @@ -1665,8 +1690,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 (); \ @@ -1804,6 +1828,41 @@ struct handler extern struct handler *handlerlist; +/* This structure helps implement the `catch' and `throw' control + structure. A struct catchtag contains all the information needed + to restore the state of the interpreter after a non-local jump. + + Handlers for error conditions (represented by `struct handler' + structures) just point to a catch tag to do the cleanup required + for their jumps. + + catchtag structures are chained together in the C calling stack; + the `next' member points to the next outer catchtag. + + A call like (throw TAG VAL) searches for a catchtag whose `tag' + member is TAG, and then unbinds to it. The `val' member is used to + hold VAL while the stack is unwound; `val' is returned as the value + of the catch form. + + All the other members are concerned with restoring the interpreter + state. */ + +struct catchtag +{ + Lisp_Object tag; + Lisp_Object val; + struct catchtag *next; + struct gcpro *gcpro; + jmp_buf jmp; + struct backtrace *backlist; + struct handler *handlerlist; + int lisp_eval_depth; + int pdlcount; + int poll_suppress_count; + int interrupt_input_blocked; + struct byte_stack *byte_stack; +}; + extern struct catchtag *catchlist; extern struct backtrace *backtrace_list; @@ -1827,8 +1886,8 @@ extern char *stack_bottom; and (in particular) cannot call arbitrary Lisp code. */ #ifdef SYNC_INPUT -extern void handle_async_input P_ ((void)); -extern int interrupt_input_pending; +extern void process_pending_signals P_ ((void)); +extern int pending_signals; #define QUIT \ do { \ @@ -1840,8 +1899,8 @@ extern int interrupt_input_pending; Fthrow (Vthrow_on_input, Qt); \ Fsignal (Qquit, Qnil); \ } \ - else if (interrupt_input_pending) \ - handle_async_input (); \ + else if (pending_signals) \ + process_pending_signals (); \ } while (0) #else /* not SYNC_INPUT */ @@ -2115,8 +2174,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 @@ -2158,6 +2216,8 @@ extern Lisp_Object Qnumberp, Qnumber_or_marker_p; extern Lisp_Object Qinteger; +extern Lisp_Object Qfont_spec, Qfont_entity, Qfont_object; + extern void circular_list_error P_ ((Lisp_Object)) NO_RETURN; EXFUN (Finteractive_form, 1); @@ -2244,7 +2304,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; @@ -2279,8 +2339,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)); @@ -2294,8 +2354,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; @@ -2334,9 +2394,8 @@ Lisp_Object copy_hash_table P_ ((struct Lisp_Hash_Table *)); int hash_lookup P_ ((struct Lisp_Hash_Table *, Lisp_Object, unsigned *)); int hash_put P_ ((struct Lisp_Hash_Table *, Lisp_Object, Lisp_Object, unsigned)); -void hash_remove P_ ((struct Lisp_Hash_Table *, Lisp_Object)); void hash_clear P_ ((struct Lisp_Hash_Table *)); -void remove_hash_entry P_ ((struct Lisp_Hash_Table *, int)); +void init_weak_hash_tables P_ ((void)); extern void init_fns P_ ((void)); EXFUN (Fsxhash, 1); EXFUN (Fmake_hash_table, MANY); @@ -2369,6 +2428,7 @@ EXFUN (Fstring_make_unibyte, 1); EXFUN (Fstring_as_multibyte, 1); EXFUN (Fstring_as_unibyte, 1); EXFUN (Fstring_to_multibyte, 1); +EXFUN (Fstring_to_unibyte, 1); EXFUN (Fsubstring, 3); extern Lisp_Object substring_both P_ ((Lisp_Object, int, int, int, int)); EXFUN (Fnth, 2); @@ -2401,8 +2461,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)); @@ -2435,40 +2495,55 @@ extern void init_image P_ ((void)); /* Defined in insdel.c */ extern Lisp_Object Qinhibit_modification_hooks; -extern void move_gap P_ ((int)); -extern void move_gap_both P_ ((int, int)); -extern void make_gap P_ ((int)); -extern int copy_text P_ ((const unsigned char *, unsigned char *, int, int, int)); -extern int count_size_as_multibyte P_ ((const unsigned char *, int)); -extern int count_combining_before P_ ((const unsigned char *, int, int, int)); -extern int count_combining_after P_ ((const unsigned char *, int, int, int)); -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_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)); -extern void insert_string P_ ((const char *)); -extern void insert_before_markers P_ ((const unsigned char *, int)); -extern void insert_before_markers_and_inherit P_ ((const unsigned char *, int)); -extern void insert_from_string_before_markers P_ ((Lisp_Object, int, int, int, int, int)); -extern void del_range P_ ((int, int)); -extern Lisp_Object del_range_1 P_ ((int, int, int, int)); -extern void del_range_byte P_ ((int, int, int)); -extern void del_range_both P_ ((int, int, int, int, int)); -extern Lisp_Object del_range_2 P_ ((int, int, int, int, int)); -extern void modify_region P_ ((struct buffer *, int, int, int)); -extern void prepare_to_modify_buffer P_ ((int, int, int *)); -extern void signal_before_change P_ ((int, int, int *)); -extern void signal_after_change P_ ((int, int, int)); -extern void adjust_after_replace P_ ((int, int, Lisp_Object, int, int)); -extern void adjust_after_replace_noundo P_ ((int, int, int, int, int, int)); -extern void adjust_after_insert P_ ((int, int, int, int, int)); -extern void replace_range P_ ((int, int, Lisp_Object, int, int, int)); -extern void replace_range_2 P_ ((int, int, int, int, char *, int, int, int)); -extern void syms_of_insdel P_ ((void)); +extern void move_gap (EMACS_INT); +extern void move_gap_both (EMACS_INT, EMACS_INT); +extern void make_gap (EMACS_INT); +extern EMACS_INT copy_text (const unsigned char *, unsigned char *, + EMACS_INT, int, int); +extern EMACS_INT count_size_as_multibyte (const unsigned char *, EMACS_INT); +extern int count_combining_before (const unsigned char *, + EMACS_INT, EMACS_INT, EMACS_INT); +extern int count_combining_after (const unsigned char *, + EMACS_INT, EMACS_INT, EMACS_INT); +extern void insert (const unsigned char *, EMACS_INT); +extern void insert_and_inherit (const unsigned char *, EMACS_INT); +extern void insert_1 (const unsigned char *, EMACS_INT, int, int, int); +extern void insert_1_both (const unsigned char *, EMACS_INT, EMACS_INT, + int, int, int); +extern void insert_from_gap (EMACS_INT, EMACS_INT); +extern void insert_from_string (Lisp_Object, EMACS_INT, EMACS_INT, + EMACS_INT, EMACS_INT, int); +extern void insert_from_buffer (struct buffer *, EMACS_INT, EMACS_INT, int); +extern void insert_char (int); +extern void insert_string (const char *); +extern void insert_before_markers (const unsigned char *, EMACS_INT); +extern void insert_before_markers_and_inherit (const unsigned char *, + EMACS_INT); +extern void insert_from_string_before_markers (Lisp_Object, EMACS_INT, + EMACS_INT, EMACS_INT, + EMACS_INT, int); +extern void del_range (EMACS_INT, EMACS_INT); +extern Lisp_Object del_range_1 (EMACS_INT, EMACS_INT, int, int); +extern void del_range_byte (EMACS_INT, EMACS_INT, int); +extern void del_range_both (EMACS_INT, EMACS_INT, EMACS_INT, EMACS_INT, int); +extern Lisp_Object del_range_2 (EMACS_INT, EMACS_INT, + EMACS_INT, EMACS_INT, int); +extern void modify_region (struct buffer *, EMACS_INT, EMACS_INT, int); +extern void prepare_to_modify_buffer (EMACS_INT, EMACS_INT, EMACS_INT *); +extern void signal_before_change (EMACS_INT, EMACS_INT, EMACS_INT *); +extern void signal_after_change (EMACS_INT, EMACS_INT, EMACS_INT); +extern void adjust_after_replace (EMACS_INT, EMACS_INT, Lisp_Object, + EMACS_INT, EMACS_INT); +extern void adjust_after_replace_noundo (EMACS_INT, EMACS_INT, EMACS_INT, + EMACS_INT, EMACS_INT, EMACS_INT); +extern void adjust_after_insert (EMACS_INT, EMACS_INT, EMACS_INT, + EMACS_INT, EMACS_INT); +extern void adjust_markers_for_delete (EMACS_INT, EMACS_INT, + EMACS_INT, EMACS_INT); +extern void replace_range (EMACS_INT, EMACS_INT, Lisp_Object, int, int, int); +extern void replace_range_2 (EMACS_INT, EMACS_INT, EMACS_INT, EMACS_INT, + char *, EMACS_INT, EMACS_INT, int); +extern void syms_of_insdel (void); /* Defined in dispnew.c */ extern Lisp_Object selected_frame; @@ -2609,7 +2684,7 @@ 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 (Foptimize_char_table, 2); 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)); @@ -2649,7 +2724,6 @@ extern void syms_of_print P_ ((void)); /* Defined in doprnt.c */ extern int doprnt P_ ((char *, int, char *, char *, int, char **)); -extern int doprnt_lisp P_ ((char *, int, char *, char *, int, char **)); /* Defined in lread.c */ extern Lisp_Object Qvariable_documentation, Qstandard_input; @@ -2763,6 +2837,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,10 +2900,10 @@ extern void set_time_zone_rule P_ ((char *)); /* defined in buffer.c */ extern int mouse_face_overlay_overlaps P_ ((Lisp_Object)); extern void nsberror P_ ((Lisp_Object)) NO_RETURN; -extern char *no_switch_window P_ ((Lisp_Object window)); EXFUN (Fset_buffer_multibyte, 1); EXFUN (Foverlay_start, 1); EXFUN (Foverlay_end, 1); +EXFUN (Foverlay_buffer, 1); extern void adjust_overlays_for_insert P_ ((EMACS_INT, EMACS_INT)); extern void adjust_overlays_for_delete P_ ((EMACS_INT, EMACS_INT)); extern void fix_start_end_in_overlays P_ ((int, int)); @@ -2836,6 +2911,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); @@ -2844,7 +2920,6 @@ EXFUN (set_buffer_if_live, 1); EXFUN (Fbarf_if_buffer_read_only, 0); EXFUN (Fcurrent_buffer, 0); EXFUN (Fswitch_to_buffer, 2); -EXFUN (Fpop_to_buffer, 3); EXFUN (Fother_buffer, 3); EXFUN (Foverlay_get, 2); EXFUN (Fbuffer_modified_p, 1); @@ -2911,9 +2986,9 @@ extern Lisp_Object close_file_unwind P_ ((Lisp_Object)); extern void report_file_error P_ ((const char *, Lisp_Object)) NO_RETURN; extern int internal_delete_file P_ ((Lisp_Object)); extern void syms_of_fileio P_ ((void)); -extern void init_fileio_once P_ ((void)); extern Lisp_Object make_temp_name P_ ((Lisp_Object, int)); EXFUN (Fmake_symbolic_link, 3); +extern Lisp_Object Qdelete_file; /* Defined in abbrev.c */ @@ -2932,11 +3007,14 @@ EXFUN (Flooking_at, 1); extern int fast_string_match P_ ((Lisp_Object, Lisp_Object)); extern int fast_c_string_match_ignore_case P_ ((Lisp_Object, const char *)); extern int fast_string_match_ignore_case P_ ((Lisp_Object, Lisp_Object)); -extern int scan_buffer P_ ((int, int, int, int, int *, int)); -extern int scan_newline P_ ((int, int, int, int, int, int)); -extern int find_next_newline P_ ((int, int)); -extern int find_next_newline_no_quit P_ ((int, int)); -extern int find_before_next_newline P_ ((int, int, int)); +extern EMACS_INT fast_looking_at P_ ((Lisp_Object, EMACS_INT, EMACS_INT, + EMACS_INT, EMACS_INT, Lisp_Object)); +extern int scan_buffer P_ ((int, EMACS_INT, EMACS_INT, int, int *, int)); +extern int scan_newline P_ ((EMACS_INT, EMACS_INT, EMACS_INT, EMACS_INT, + int, int)); +extern int find_next_newline P_ ((EMACS_INT, int)); +extern int find_next_newline_no_quit P_ ((EMACS_INT, int)); +extern int find_before_next_newline P_ ((EMACS_INT, EMACS_INT, int)); extern void syms_of_search P_ ((void)); extern void clear_regexp_cache P_ ((void)); @@ -2952,11 +3030,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 */ @@ -3011,6 +3089,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)); @@ -3023,7 +3102,6 @@ extern void init_keyboard P_ ((void)); extern void syms_of_keyboard P_ ((void)); extern void keys_of_keyboard P_ ((void)); extern char *push_key_description P_ ((unsigned int, char *, int)); -extern void add_user_signal P_ ((int sig, const char *name)); /* defined in indent.c */ @@ -3044,11 +3122,11 @@ extern Lisp_Object Vx_resource_class; extern Lisp_Object Qvisible; extern void store_frame_param P_ ((struct frame *, Lisp_Object, Lisp_Object)); extern void store_in_alist P_ ((Lisp_Object *, Lisp_Object, Lisp_Object)); -extern Lisp_Object do_switch_frame P_ ((Lisp_Object, int, int)); +extern Lisp_Object do_switch_frame P_ ((Lisp_Object, int, int, Lisp_Object)); extern Lisp_Object get_frame_param P_ ((struct frame *, Lisp_Object)); extern Lisp_Object frame_buffer_predicate P_ ((Lisp_Object)); EXFUN (Fframep, 1); -EXFUN (Fselect_frame, 1); +EXFUN (Fselect_frame, 2); EXFUN (Fselected_frame, 0); EXFUN (Fwindow_frame, 1); EXFUN (Fframe_root_window, 1); @@ -3072,7 +3150,7 @@ EXFUN (Fset_frame_size, 3); EXFUN (Fset_frame_position, 3); EXFUN (Fraise_frame, 1); EXFUN (Fredirect_frame_focus, 2); -EXFUN (Fset_frame_selected_window, 2); +EXFUN (Fset_frame_selected_window, 3); extern Lisp_Object frame_buffer_list P_ ((Lisp_Object)); extern void frames_discard_buffer P_ ((Lisp_Object)); extern void set_frame_buffer_list P_ ((Lisp_Object, Lisp_Object)); @@ -3082,6 +3160,7 @@ extern void syms_of_frame P_ ((void)); /* defined in emacs.c */ extern Lisp_Object decode_env_path P_ ((char *, char *)); extern Lisp_Object Vinvocation_name, Vinvocation_directory; +extern Lisp_Object Vbefore_init_time, Vafter_init_time; extern Lisp_Object Vinstallation_directory; extern Lisp_Object empty_unibyte_string, empty_multibyte_string; EXFUN (Fkill_emacs, 1); @@ -3098,6 +3177,15 @@ void synchronize_system_time_locale P_ ((void)); void shut_down_emacs P_ ((int, int, Lisp_Object)); /* Nonzero means don't do interactive redisplay and don't change tty modes */ extern int noninteractive; + +/* Nonzero means don't load X resources or Windows Registry settings. */ +extern int inhibit_x_resources; + +/* Pipe used to send exit notification to the daemon parent at + startup. */ +extern int daemon_pipe[2]; +#define IS_DAEMON (daemon_pipe[1] != 0) + /* Nonzero means don't do use window-system-specific display code */ extern int inhibit_window_system; /* Nonzero means that a filter or a sentinel is running. */ @@ -3193,6 +3281,9 @@ extern Lisp_Object next_single_char_property_change P_ ((Lisp_Object, Lisp_Object, Lisp_Object)); +/* defined in menu.c */ +extern void syms_of_menu P_ ((void)); + /* defined in xmenu.c */ EXFUN (Fx_popup_menu, 2); EXFUN (Fx_popup_dialog, 3); @@ -3253,14 +3344,21 @@ extern void syms_of_ccl P_ ((void)); /* Defined in dired.c */ EXFUN (Ffile_attributes, 2); extern void syms_of_dired P_ ((void)); +extern Lisp_Object directory_files_internal P_ ((Lisp_Object, Lisp_Object, + Lisp_Object, Lisp_Object, + int, Lisp_Object)); /* Defined in term.c */ extern void syms_of_term P_ ((void)); extern void fatal P_ ((const char *msgid, ...)) NO_RETURN; /* Defined in terminal.c */ +EXFUN (Fdelete_terminal, 2); extern void syms_of_terminal P_ ((void)); +/* Defined in font.c */ +extern void syms_of_font P_ ((void)); + #ifdef HAVE_WINDOW_SYSTEM /* Defined in fontset.c */ extern void syms_of_fontset P_ ((void)); @@ -3270,10 +3368,12 @@ EXFUN (Fnew_fontset, 2); /* Defined in xfns.c, w32fns.c, or macfns.c */ EXFUN (Fxw_display_color_p, 1); EXFUN (Fx_file_dialog, 5); +EXFUN (Fx_focus_frame, 1); #endif /* Defined in xfaces.c */ EXFUN (Fclear_face_cache, 1); +EXFUN (Fx_load_color_file, 1); extern void syms_of_xfaces P_ ((void)); #ifndef HAVE_GETLOADAVG @@ -3301,30 +3401,17 @@ extern void syms_of_xterm P_ ((void)); EXFUN (Fmsdos_downcase_filename, 1); #endif -#ifdef MAC_OS -/* Defined in macfns.c */ -extern void syms_of_macfns P_ ((void)); - -/* Defined in macselect.c */ -extern void syms_of_macselect P_ ((void)); - -/* Defined in macterm.c */ -extern void syms_of_macterm P_ ((void)); - -/* Defined in macmenu.c */ -extern void syms_of_macmenu P_ ((void)); - -/* Defined in mac.c */ -extern void syms_of_mac P_ ((void)); -#ifdef MAC_OSX -extern void init_mac_osx_environment P_ ((void)); -#endif /* MAC_OSX */ -#endif /* MAC_OS */ - #ifdef HAVE_MENUS -/* Defined in (x|mac|w32)fns.c... */ +/* Defined in (x|w32)fns.c, nsfns.m... */ extern int have_menus_p P_ ((void)); #endif + +#ifdef HAVE_DBUS +/* Defined in dbusbind.c */ +int xd_pending_messages P_ ((void)); +void xd_read_queued_messages P_ ((void)); +void syms_of_dbusbind P_ ((void)); +#endif /* Nonzero means Emacs has already been initialized. Used during startup to detect startup of dumped Emacs. */ @@ -3368,11 +3455,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.