X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/479440d29ce6b6ada79074a6791a6f315762ed71..1599821a5c8d6eee6066a0cfb497eaba7fc579e7:/src/lisp.h diff --git a/src/lisp.h b/src/lisp.h index bcaee43c55..2eaa098705 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -1,6 +1,6 @@ /* Fundamental definitions for GNU Emacs Lisp interpreter. - Copyright (C) 1985,86,87,93,94,95,97,98,1999,2000,01,02,03,2004 - Free Software Foundation, Inc. + Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1997, 1998, 1999, 2000, + 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -16,8 +16,8 @@ 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., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ +the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +Boston, MA 02110-1301, USA. */ #ifndef EMACS_LISP_H #define EMACS_LISP_H @@ -35,8 +35,29 @@ Boston, MA 02111-1307, USA. */ 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 */ +#ifdef GC_CHECK_CONS_LIST +#define CHECK_CONS_LIST() check_cons_list() +#else +#define CHECK_CONS_LIST() 0 +#endif /* These are default choices for the types to use. */ #ifdef _LP64 @@ -232,7 +253,7 @@ LISP_MAKE_RVALUE (Lisp_Object o) /* If union type is not wanted, define Lisp_Object as just a number. */ #ifdef NO_UNION_TYPE -#define Lisp_Object EMACS_INT +typedef EMACS_INT Lisp_Object; #define LISP_MAKE_RVALUE(o) (0+(o)) #endif /* NO_UNION_TYPE */ @@ -304,11 +325,13 @@ enum pvec_type /* First, try and define DECL_ALIGN(type,var) which declares a static variable VAR of type TYPE with the added requirement that it be TYPEBITS-aligned. */ -#ifndef DECL_ALIGN +#ifndef NO_DECL_ALIGN +# ifndef DECL_ALIGN /* What compiler directive should we use for non-gcc compilers? -stef */ -# if defined (__GNUC__) -# define DECL_ALIGN(type, var) \ - type __attribute__ ((__aligned__ (1 << GCTYPEBITS))) var +# if defined (__GNUC__) +# define DECL_ALIGN(type, var) \ + type __attribute__ ((__aligned__ (1 << GCTYPEBITS))) var +# endif # endif #endif @@ -323,7 +346,7 @@ enum pvec_type # endif #endif -/* Just remove the alignment annotation if we don't use it. */ +/* If we cannot use 8-byte alignment, make DECL_ALIGN a no-op. */ #ifndef DECL_ALIGN # ifdef USE_LSB_TAG # error "USE_LSB_TAG used without defining DECL_ALIGN" @@ -428,10 +451,10 @@ enum pvec_type #define make_number(N) \ (__extension__ ({ Lisp_Object _l; _l.s.val = (N); _l.s.type = Lisp_Int; _l; })) #else -extern Lisp_Object make_number (); +extern Lisp_Object make_number P_ ((EMACS_INT)); #endif -#define EQ(x, y) ((x).s.val == (y).s.val && (x).s.type == (y).s.type) +#define EQ(x, y) ((x).i == (y).i) #endif /* NO_UNION_TYPE */ @@ -461,7 +484,11 @@ extern size_t pure_size; in a Lisp object whose data type says it points to something. */ #define XPNTR(a) (XUINT (a) | DATA_SEG_BITS) #else -#define XPNTR(a) XUINT (a) +/* Some versions of gcc seem to consider the bitfield width when + issuing the "cast to pointer from integer of different size" + warning, so the cast is here to widen the value back to its natural + size. */ +#define XPNTR(a) ((EMACS_INT) XUINT (a)) #endif #endif /* not HAVE_SHM */ #endif /* no XPNTR */ @@ -577,9 +604,19 @@ struct Lisp_Cons /* Please do not use the names of these elements in code other than the core lisp implementation. Use XCAR and XCDR below. */ #ifdef HIDE_LISP_IMPLEMENTATION - Lisp_Object car_, cdr_; + Lisp_Object car_; + union + { + Lisp_Object cdr_; + struct Lisp_Cons *chain; + } u; #else - Lisp_Object car, cdr; + Lisp_Object car; + union + { + Lisp_Object cdr; + struct Lisp_Cons *chain; + } u; #endif }; @@ -592,10 +629,10 @@ struct Lisp_Cons invalidated at arbitrary points.) */ #ifdef HIDE_LISP_IMPLEMENTATION #define XCAR_AS_LVALUE(c) (XCONS ((c))->car_) -#define XCDR_AS_LVALUE(c) (XCONS ((c))->cdr_) +#define XCDR_AS_LVALUE(c) (XCONS ((c))->u.cdr_) #else #define XCAR_AS_LVALUE(c) (XCONS ((c))->car) -#define XCDR_AS_LVALUE(c) (XCONS ((c))->cdr) +#define XCDR_AS_LVALUE(c) (XCONS ((c))->u.cdr) #endif /* Use these from normal code. */ @@ -697,6 +734,14 @@ struct Lisp_Vector 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 @@ -1244,17 +1289,21 @@ union Lisp_Misc /* Lisp floating point type */ struct Lisp_Float { + union + { #ifdef HIDE_LISP_IMPLEMENTATION - double data_; + double data_; #else - double data; + double data; #endif + struct Lisp_Float *chain; + } u; }; #ifdef HIDE_LISP_IMPLEMENTATION -#define XFLOAT_DATA(f) (XFLOAT (f)->data_) +#define XFLOAT_DATA(f) (XFLOAT (f)->u.data_) #else -#define XFLOAT_DATA(f) (XFLOAT (f)->data) +#define XFLOAT_DATA(f) (XFLOAT (f)->u.data) #endif /* A character, declared with the following typedef, is a member @@ -1374,7 +1423,7 @@ typedef unsigned char UCHAR; /* Data type checking */ -#define NILP(x) (XFASTINT (x) == XFASTINT (Qnil)) +#define NILP(x) EQ (x, Qnil) #define GC_NILP(x) GC_EQ (x, Qnil) #define NUMBERP(x) (INTEGERP (x) || FLOATP (x)) @@ -1653,8 +1702,16 @@ extern void defvar_kboard P_ ((char *, int)); #define DEFVAR_LISP_NOPRO(lname, vname, doc) defvar_lisp_nopro (lname, vname) #define DEFVAR_BOOL(lname, vname, doc) defvar_bool (lname, vname) #define DEFVAR_INT(lname, vname, doc) defvar_int (lname, vname) + +/* TYPE is nil for a general Lisp variable. + An integer specifies a type; then only LIsp values + with that type code are allowed (except that nil is allowed too). + LNAME is the LIsp-level variable name. + VNAME is the name of the buffer slot. + DOC is a dummy where you write the doc string as a comment. */ #define DEFVAR_PER_BUFFER(lname, vname, type, doc) \ defvar_per_buffer (lname, vname, type, 0) + #define DEFVAR_KBOARD(lname, vname, doc) \ defvar_kboard (lname, \ (int)((char *)(¤t_kboard->vname) \ @@ -1687,13 +1744,13 @@ typedef Lisp_Object (*specbinding_func) P_ ((Lisp_Object)); struct specbinding { - volatile Lisp_Object symbol, old_value; - volatile specbinding_func func; + Lisp_Object symbol, old_value; + specbinding_func func; Lisp_Object unused; /* Dividing by 16 is faster than by 12 */ }; extern struct specbinding *specpdl; -extern volatile struct specbinding *specpdl_ptr; +extern struct specbinding *specpdl_ptr; extern int specpdl_size; extern EMACS_INT max_specpdl_size; @@ -1750,11 +1807,15 @@ extern char *stack_bottom; #ifdef SYNC_INPUT extern void handle_async_input P_ ((void)); extern int interrupt_input_pending; + #define QUIT \ do { \ if (!NILP (Vquit_flag) && NILP (Vinhibit_quit)) \ { \ + Lisp_Object flag = Vquit_flag; \ Vquit_flag = Qnil; \ + if (EQ (Vthrow_on_input, flag)) \ + Fthrow (Vthrow_on_input, Qt); \ Fsignal (Qquit, Qnil); \ } \ else if (interrupt_input_pending) \ @@ -1767,7 +1828,10 @@ extern int interrupt_input_pending; do { \ if (!NILP (Vquit_flag) && NILP (Vinhibit_quit)) \ { \ + Lisp_Object flag = Vquit_flag; \ Vquit_flag = Qnil; \ + if (EQ (Vthrow_on_input, flag)) \ + Fthrow (Vthrow_on_input, Qt); \ Fsignal (Qquit, Qnil); \ } \ } while (0) @@ -1823,16 +1887,21 @@ extern Lisp_Object case_temp2; NATNUMP (case_temp2)) \ ? XFASTINT (case_temp2) : case_temp1) -extern Lisp_Object Vascii_downcase_table; +extern Lisp_Object Vascii_downcase_table, Vascii_upcase_table; +extern Lisp_Object Vascii_canon_table, Vascii_eqv_table; /* Number of bytes of structure consed since last GC. */ extern int consing_since_gc; -/* Threshold for doing another gc. */ +/* Thresholds for doing another gc. */ extern EMACS_INT gc_cons_threshold; +extern EMACS_INT gc_relative_threshold; + +extern EMACS_INT memory_full_cons_threshold; + /* Structure for recording stack slots that need marking. */ /* This is a chain of structures, each of which points at a Lisp_Object variable @@ -2110,7 +2179,7 @@ EXFUN (Fsymbol_function, 1); EXFUN (Fsymbol_plist, 1); EXFUN (Fsymbol_name, 1); extern Lisp_Object indirect_function P_ ((Lisp_Object)); -EXFUN (Findirect_function, 1); +EXFUN (Findirect_function, 2); EXFUN (Ffset, 2); EXFUN (Fsetplist, 2); EXFUN (Fsymbol_value, 1); @@ -2301,10 +2370,10 @@ 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 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)); EXFUN (Fcopy_alist, 1); EXFUN (Fplist_get, 2); -EXFUN (Fsafe_plist_get, 2); EXFUN (Fplist_put, 3); EXFUN (Fplist_member, 2); EXFUN (Fset_char_table_parent, 2); @@ -2430,7 +2499,7 @@ extern void syms_of_xdisp P_ ((void)); extern void init_xdisp P_ ((void)); extern Lisp_Object safe_eval P_ ((Lisp_Object)); extern int pos_visible_p P_ ((struct window *, int, int *, - int *, int *, int)); + int *, int *, int *, int)); /* Defined in vm-limit.c. */ extern void memory_warnings P_ ((POINTER_TYPE *, void (*warnfun) ())); @@ -2438,6 +2507,7 @@ extern void memory_warnings P_ ((POINTER_TYPE *, void (*warnfun) ())); /* Defined in alloc.c */ extern void check_pure_size P_ ((void)); extern void allocate_string_data P_ ((struct Lisp_String *, int, int)); +extern void reset_malloc_hooks P_ ((void)); extern void uninterrupt_malloc P_ ((void)); extern void malloc_warning P_ ((char *)); extern void memory_full P_ ((void)); @@ -2497,6 +2567,7 @@ extern void init_alloc_once P_ ((void)); extern void init_alloc P_ ((void)); 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 print.c */ extern Lisp_Object Vprin1_to_string_buffer; @@ -2532,6 +2603,7 @@ EXFUN (Fread_from_string, 3); EXFUN (Fintern, 2); EXFUN (Fintern_soft, 2); EXFUN (Fload, 5); +EXFUN (Fget_load_suffixes, 0); EXFUN (Fget_file_char, 0); EXFUN (Fread_char, 2); EXFUN (Fread_event, 2); @@ -2543,7 +2615,7 @@ extern Lisp_Object oblookup P_ ((Lisp_Object, const char *, int, int)); #define LOADHIST_ATTACH(x) \ if (initialized) Vcurrent_load_list = Fcons (x, Vcurrent_load_list) extern Lisp_Object Vcurrent_load_list; -extern Lisp_Object Vload_history, Vload_suffixes; +extern Lisp_Object Vload_history, Vload_suffixes, Vload_file_rep_suffixes; extern int openp P_ ((Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object *, Lisp_Object)); extern int isfloat_string P_ ((char *)); @@ -2614,6 +2686,7 @@ extern Lisp_Object call6 P_ ((Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object EXFUN (Fdo_auto_save, 2); extern Lisp_Object apply_lambda P_ ((Lisp_Object, Lisp_Object, int)); extern Lisp_Object internal_catch P_ ((Lisp_Object, Lisp_Object (*) (Lisp_Object), Lisp_Object)); +extern Lisp_Object internal_lisp_condition_case P_ ((Lisp_Object, Lisp_Object, Lisp_Object)); extern Lisp_Object internal_condition_case P_ ((Lisp_Object (*) (void), Lisp_Object, Lisp_Object (*) (Lisp_Object))); extern Lisp_Object internal_condition_case_1 P_ ((Lisp_Object (*) (Lisp_Object), Lisp_Object, Lisp_Object, Lisp_Object (*) (Lisp_Object))); extern Lisp_Object internal_condition_case_2 P_ ((Lisp_Object (*) (int, Lisp_Object *), int, Lisp_Object *, Lisp_Object, Lisp_Object (*) (Lisp_Object))); @@ -2659,7 +2732,6 @@ EXFUN (Fbobp, 0); EXFUN (Fformat, MANY); EXFUN (Fmessage, MANY); extern Lisp_Object format2 P_ ((char *, Lisp_Object, Lisp_Object)); -extern Lisp_Object make_buffer_string P_ ((int, int, int)); EXFUN (Fbuffer_substring, 2); EXFUN (Fbuffer_string, 0); extern Lisp_Object save_excursion_save P_ ((void)); @@ -2678,7 +2750,6 @@ extern Lisp_Object make_buffer_string P_ ((int, int, int)); extern Lisp_Object make_buffer_string_both P_ ((int, int, int, int, int)); extern void init_editfns P_ ((void)); extern void syms_of_editfns P_ ((void)); -EXFUN (Fcurrent_message, 0); extern Lisp_Object Vinhibit_field_text_motion; EXFUN (Fconstrain_to_field, 5); EXFUN (Ffield_string, 1); @@ -2720,6 +2791,7 @@ EXFUN (Fbuffer_disable_undo, 1); EXFUN (Fbuffer_enable_undo, 1); EXFUN (Ferase_buffer, 0); extern Lisp_Object Qoverlayp; +extern Lisp_Object Qevaporate; extern Lisp_Object get_truename_buffer P_ ((Lisp_Object)); extern struct buffer *all_buffers; EXFUN (Fprevious_overlay_change, 1); @@ -2775,7 +2847,6 @@ extern Lisp_Object close_file_unwind P_ ((Lisp_Object)); extern void report_file_error P_ ((const char *, Lisp_Object)); extern int internal_delete_file P_ ((Lisp_Object)); extern void syms_of_fileio P_ ((void)); -EXFUN (Fmake_temp_name, 1); extern void init_fileio_once P_ ((void)); extern Lisp_Object make_temp_name P_ ((Lisp_Object, int)); EXFUN (Fmake_symbolic_link, 3); @@ -2787,11 +2858,12 @@ extern void syms_of_abbrev P_ ((void)); /* defined in search.c */ extern void shrink_regexp_cache P_ ((void)); EXFUN (Fstring_match, 3); -extern void restore_match_data P_ ((void)); -EXFUN (Fmatch_data, 2); -EXFUN (Fset_match_data, 1); +extern void restore_search_regs P_ ((void)); +EXFUN (Fmatch_data, 3); +EXFUN (Fset_match_data, 2); EXFUN (Fmatch_beginning, 1); EXFUN (Fmatch_end, 1); +extern void record_unwind_save_match_data P_ ((void)); 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 *)); @@ -2808,7 +2880,7 @@ extern void syms_of_search P_ ((void)); extern Lisp_Object last_minibuf_string; extern void choose_minibuf_frame P_ ((void)); EXFUN (Fcompleting_read, 8); -EXFUN (Fread_from_minibuffer, 7); +EXFUN (Fread_from_minibuffer, 8); EXFUN (Fread_variable, 2); EXFUN (Fread_buffer, 3); EXFUN (Fread_minibuffer, 2); @@ -2856,6 +2928,7 @@ extern struct kboard *echo_kboard; extern void cancel_echoing P_ ((void)); extern Lisp_Object Qdisabled, QCfilter; extern Lisp_Object Vtty_erase_char, Vhelp_form, Vtop_level; +extern Lisp_Object Vthrow_on_input; extern int input_pending; EXFUN (Fdiscard_input, 0); EXFUN (Frecursive_edit, 0); @@ -2870,6 +2943,7 @@ EXFUN (Fevent_convert_list, 1); EXFUN (Fread_key_sequence, 5); EXFUN (Fset_input_mode, 4); 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)); extern void safe_run_hooks P_ ((Lisp_Object)); extern void cmd_error_internal P_ ((Lisp_Object, char *)); @@ -2904,7 +2978,7 @@ extern Lisp_Object do_switch_frame P_ ((Lisp_Object, int, int)); 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, 2); +EXFUN (Fselect_frame, 1); EXFUN (Fselected_frame, 0); EXFUN (Fwindow_frame, 1); EXFUN (Fframe_root_window, 1); @@ -2972,12 +3046,9 @@ extern int wait_reading_process_output P_ ((int, int, int, int, Lisp_Object, struct Lisp_Process *, int)); -extern void deactivate_process P_ ((Lisp_Object)); extern void add_keyboard_wait_descriptor P_ ((int)); extern void delete_keyboard_wait_descriptor P_ ((int)); extern void close_process_descs P_ ((void)); -extern void status_notify P_ ((void)); -extern int read_process_output P_ ((Lisp_Object, int)); extern void init_process P_ ((void)); extern void syms_of_process P_ ((void)); extern void setup_process_coding_systems P_ ((Lisp_Object)); @@ -3021,7 +3092,7 @@ extern void syms_of_macros P_ ((void)); /* defined in undo.c */ extern Lisp_Object Qinhibit_read_only; EXFUN (Fundo_boundary, 0); -extern Lisp_Object truncate_undo_list P_ ((Lisp_Object, int, int, int)); +extern void truncate_undo_list P_ ((struct buffer *)); extern void record_marker_adjustment P_ ((Lisp_Object, int)); extern void record_insert P_ ((int, int)); extern void record_delete P_ ((int, Lisp_Object)); @@ -3030,6 +3101,7 @@ extern void record_change P_ ((int, int)); extern void record_property_change P_ ((int, int, Lisp_Object, Lisp_Object, Lisp_Object)); extern void syms_of_undo P_ ((void)); +extern Lisp_Object Vundo_outer_limit; /* defined in textprop.c */ extern Lisp_Object Qfont, Qmouse_face; @@ -3048,10 +3120,13 @@ extern Lisp_Object next_single_char_property_change P_ ((Lisp_Object, /* defined in xmenu.c */ EXFUN (Fx_popup_menu, 2); -EXFUN (Fx_popup_dialog, 2); +EXFUN (Fx_popup_dialog, 3); extern void syms_of_xmenu P_ ((void)); /* defined in sysdep.c */ +#ifndef HAVE_GET_CURRENT_DIR_NAME +extern char *get_current_dir_name P_ ((void)); +#endif extern void stuff_char P_ ((char c)); extern void init_sigio P_ ((int)); extern void request_sigio P_ ((void)); @@ -3061,7 +3136,6 @@ extern void sys_subshell P_ ((void)); extern void sys_suspend P_ ((void)); extern void discard_tty_input P_ ((void)); extern void init_sys_modes P_ ((void)); -extern void reset_sys_modes P_ ((void)); extern void get_frame_size P_ ((int *, int *)); extern void wait_for_termination P_ ((int)); extern void flush_pending_output P_ ((int)); @@ -3114,8 +3188,10 @@ EXFUN (Fset_fontset_font, 4); /* Defined in xfaces.c */ extern void syms_of_xfaces P_ ((void)); +#ifndef HAVE_GETLOADAVG /* Defined in getloadavg.c */ extern int getloadavg P_ ((double *, int)); +#endif #ifdef HAVE_X_WINDOWS /* Defined in xfns.c */ @@ -3136,9 +3212,6 @@ extern void syms_of_xselect P_ ((void)); /* Defined in xterm.c */ extern void syms_of_xterm P_ ((void)); -/* Defined in getloadavg.c */ -extern int getloadavg P_ ((double [], int)); - #ifdef MSDOS /* Defined in msdos.c */ EXFUN (Fmsdos_downcase_filename, 1);