X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/03c9ed7793211df41b54804ea28797f3ca6d2932..d4881c6acbb41cfd507b533efdd2cdaaf5eac204:/src/lisp.h diff --git a/src/lisp.h b/src/lisp.h index 62ead3e4d3..6e043199f8 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -1,5 +1,5 @@ /* Fundamental definitions for GNU Emacs Lisp interpreter. - Copyright (C) 1985,86,87,93,94,95,97,98,1999,2000 + Copyright (C) 1985,86,87,93,94,95,97,98,1999,2000, 2001 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -26,6 +26,14 @@ Boston, MA 02111-1307, 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 +#endif /* 0*/ + /* These are default choices for the types to use. */ #ifdef _LP64 @@ -53,7 +61,7 @@ extern void die P_((const char *, const char *, int)); #ifdef ENABLE_CHECKING #define CHECK(check,msg) ((check || suppress_checking \ - ? 0 \ + ? (void) 0 \ : die (msg, __FILE__, __LINE__)), \ 0) @@ -67,6 +75,13 @@ extern void die P_((const char *, const char *, int)); #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 @@ -178,25 +193,25 @@ union Lisp_Object { /* Used for comparing two Lisp_Objects; also, positive integers can be accessed fast this way. */ - int i; + EMACS_INT i; struct { - int val: VALBITS; - int type: GCTYPEBITS+1; + EMACS_INT val : VALBITS; + EMACS_INT type : GCTYPEBITS + 1; } s; struct { - unsigned int val: VALBITS; - int type: GCTYPEBITS+1; + EMACS_UINT val : VALBITS; + EMACS_INT type : GCTYPEBITS + 1; } u; struct { - unsigned int val: VALBITS; - enum Lisp_Type type: GCTYPEBITS; + EMACS_UINT val : VALBITS; + enum Lisp_Type type : GCTYPEBITS; /* The markbit is not really part of the value of a Lisp_Object, and is always zero except during garbage collection. */ - unsigned int markbit: 1; + EMACS_UINT markbit : 1; } gu; } Lisp_Object; @@ -208,25 +223,25 @@ union Lisp_Object { /* Used for comparing two Lisp_Objects; also, positive integers can be accessed fast this way. */ - int i; + EMACS_INT i; struct { - int type: GCTYPEBITS+1; - int val: VALBITS; + EMACS_INT type : GCTYPEBITS+1; + EMACS_INT val : VALBITS; } s; struct { - int type: GCTYPEBITS+1; - unsigned int val: VALBITS; + EMACS_INT type : GCTYPEBITS+1; + EMACS_UINT val : VALBITS; } u; struct { /* The markbit is not really part of the value of a Lisp_Object, and is always zero except during garbage collection. */ - unsigned int markbit: 1; - enum Lisp_Type type: GCTYPEBITS; - unsigned int val: VALBITS; + EMACS_UINT markbit : 1; + enum Lisp_Type type : GCTYPEBITS; + EMACS_UINT val : VALBITS; } gu; } Lisp_Object; @@ -331,14 +346,15 @@ enum pvec_type /* Extract the value of a Lisp_Object as a signed integer. */ #ifndef XINT /* Some machines need to do this differently. */ -#define XINT(a) (((a) << (BITS_PER_EMACS_INT-VALBITS)) >> (BITS_PER_EMACS_INT-VALBITS)) +#define XINT(a) ((EMACS_INT) (((a) << (BITS_PER_EMACS_INT - VALBITS)) \ + >> (BITS_PER_EMACS_INT - VALBITS))) #endif /* Extract the value as an unsigned integer. This is a basis for extracting it as a pointer to a structure in storage. */ #ifndef XUINT -#define XUINT(a) ((a) & VALMASK) +#define XUINT(a) ((EMACS_UINT) ((a) & VALMASK)) #endif #ifndef XPNTR @@ -419,7 +435,8 @@ extern int pure_size; #ifdef EXPLICIT_SIGN_EXTEND /* Make sure we sign-extend; compilers have been known to fail to do so. */ -#define XINT(a) (((a).i << (BITS_PER_INT-VALBITS)) >> (BITS_PER_INT-VALBITS)) +#define XINT(a) (((a).i << (BITS_PER_EMACS_INT - VALBITS)) \ + >> (BITS_PER_EMACS_INT - VALBITS)) #else #define XINT(a) ((a).s.val) #endif /* EXPLICIT_SIGN_EXTEND */ @@ -428,7 +445,7 @@ extern int pure_size; #define XPNTR(a) ((a).u.val) #define XSET(var, vartype, ptr) \ - (((var).s.val = ((int) (ptr))), ((var).s.type = ((char) (vartype)))) + (((var).s.val = ((EMACS_INT) (ptr))), ((var).s.type = ((char) (vartype)))) #if __GNUC__ >= 2 && defined (__OPTIMIZE__) #define make_number(N) \ @@ -454,7 +471,7 @@ extern Lisp_Object make_number (); /* Extract a value or address from a Lisp_Object. */ #define XCONS(a) (eassert (GC_CONSP(a)),(struct Lisp_Cons *) XPNTR(a)) -#define XVECTOR(a) ((struct Lisp_Vector *) 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)) @@ -611,9 +628,20 @@ struct Lisp_Cons (XSTRING (STR)->size_byte >= 0) /* Return the length in bytes of STR. */ + +#ifdef GC_CHECK_STRING_BYTES + +struct Lisp_String; +extern int string_bytes P_ ((struct Lisp_String *)); +#define STRING_BYTES(S) string_bytes ((S)) + +#else /* not GC_CHECK_STRING_BYTES */ + #define STRING_BYTES(STR) \ ((STR)->size_byte < 0 ? (STR)->size : (STR)->size_byte) +#endif /* not GC_CHECK_STRING_BYTES */ + /* Set the length in bytes of STR. */ #define SET_STRING_BYTES(STR, SIZE) ((STR)->size_byte = (SIZE)) @@ -623,7 +651,7 @@ struct Lisp_String { EMACS_INT size; EMACS_INT size_byte; - DECLARE_INTERVALS /* `data' field must be last. */ + INTERVAL intervals; /* text properties in this string */ unsigned char *data; }; @@ -1194,8 +1222,7 @@ typedef unsigned char UCHAR; #define GLYPH_FACE(f, g) (FAST_GLYPH_FACE (g)) /* Return 1 iff GLYPH contains valid character code. */ -#define GLYPH_CHAR_VALID_P(glyph) \ - ((GLYPH) (FAST_GLYPH_CHAR (glyph)) <= MAX_CHAR) +#define GLYPH_CHAR_VALID_P(glyph) CHAR_VALID_P (FAST_GLYPH_CHAR (glyph), 1) /* The ID of the mode line highlighting face. */ #define GLYPH_MODE_LINE_FACE 1 @@ -1479,12 +1506,15 @@ extern void defvar_kboard P_ ((char *, int)); form. Otherwise, the element is a variable binding. + If the symbol field is a symbol, it is an ordinary variable binding. - Otherwise, it should be a structure (SYMBOL BUFFER . BUFFER), - which represents having bound BUFFER's local value, - or (SYMBOL nil . BUFFER), which represents having bound the default - value when BUFFER was current (buffer not having any local binding - for SYMBOL). */ + + Otherwise, it should be a structure (SYMBOL WHERE + . CURRENT-BUFFER), which means having bound a local value while + CURRENT-BUFFER was active. If WHERE is nil this means we saw the + default value when binding SYMBOL. WHERE being a buffer or frame + means we saw a buffer-local or frame-local value. Other values of + WHERE mean an internal error. */ struct specbinding { @@ -1497,6 +1527,8 @@ extern struct specbinding *specpdl; extern struct specbinding *specpdl_ptr; extern int specpdl_size; +#define BINDING_STACK_SIZE() (specpdl_ptr - specpdl) + /* Everything needed to describe an active condition case. */ struct handler { @@ -1621,14 +1653,19 @@ extern int gc_cons_threshold; extern struct gcpro *gcprolist; struct gcpro - { - struct gcpro *next; - Lisp_Object *var; /* Address of first protected variable */ - int nvars; /* Number of consecutive protected variables */ +{ + struct gcpro *next; + + /* Address of first protected variable. */ + volatile Lisp_Object *var; + + /* Number of consecutive protected variables. */ + int nvars; + #ifdef DEBUG_GCPRO - int level; + int level; #endif - }; +}; /* Values of GC_MARK_STACK during compilation: @@ -1884,13 +1921,15 @@ EXFUN (Fash, 2); EXFUN (Fadd1, 1); EXFUN (Fsub1, 1); +EXFUN (Fmake_variable_buffer_local, 1); 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)); extern void args_out_of_range_3 P_ ((Lisp_Object, Lisp_Object, Lisp_Object)); extern Lisp_Object wrong_type_argument P_ ((Lisp_Object, Lisp_Object)); -extern void store_symval_forwarding P_ ((Lisp_Object, Lisp_Object, Lisp_Object)); +extern void store_symval_forwarding P_ ((Lisp_Object, Lisp_Object, + Lisp_Object, struct buffer *)); extern Lisp_Object do_symval_forwarding P_ ((Lisp_Object)); extern Lisp_Object set_internal P_ ((Lisp_Object, Lisp_Object, struct buffer *, int)); extern void syms_of_data P_ ((void)); @@ -1914,7 +1953,7 @@ EXFUN (Fread_non_nil_coding_system, 1); EXFUN (Ffind_operation_coding_system, MANY); EXFUN (Fencode_coding_string, 3); EXFUN (Fdecode_coding_string, 3); -extern Lisp_Object detect_coding_system P_ ((unsigned char *, int, int)); +extern Lisp_Object detect_coding_system P_ ((unsigned char *, int, int, int)); Lisp_Object code_convert_string_norecord P_ ((Lisp_Object, Lisp_Object, int)); extern void init_coding P_ ((void)); extern void init_coding_once P_ ((void)); @@ -1947,6 +1986,7 @@ extern void init_syntax_once P_ ((void)); extern void syms_of_syntax P_ ((void)); /* Defined in fns.c */ +extern int use_dialog_box; 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)); @@ -2100,7 +2140,9 @@ extern void syms_of_display P_ ((void)); extern void safe_bcopy P_ ((char *, char *, int)); /* Defined in xdisp.c */ -extern Lisp_Object Qinhibit_redisplay; +extern Lisp_Object Qinhibit_point_motion_hooks; +extern Lisp_Object Qinhibit_redisplay, Qdisplay; +extern Lisp_Object Qinhibit_eval_during_redisplay; extern Lisp_Object Qmessage_truncate_lines; extern Lisp_Object Vmessage_log_max; extern int message_enable_multibyte; @@ -2108,6 +2150,7 @@ extern Lisp_Object echo_area_buffer[2]; extern void check_message_stack P_ ((void)); extern void setup_echo_area_for_printing P_ ((int)); extern int push_message P_ ((void)); +extern Lisp_Object push_message_unwind P_ ((Lisp_Object)); extern void pop_message P_ ((void)); extern void restore_message P_ ((void)); extern Lisp_Object current_message P_ ((void)); @@ -2129,13 +2172,14 @@ extern void truncate_echo_area P_ ((int)); extern void redisplay P_ ((void)); extern int check_point_in_composition P_ ((struct buffer *, int, struct buffer *, int)); -extern void redisplay_preserve_echo_area P_ ((void)); +extern void redisplay_preserve_echo_area P_ ((int)); extern void mark_window_display_accurate P_ ((Lisp_Object, int)); extern int invisible_p P_ ((Lisp_Object, Lisp_Object)); extern void prepare_menu_bars P_ ((void)); extern void syms_of_xdisp P_ ((void)); extern void init_xdisp P_ ((void)); -extern Lisp_Object eval_form P_ ((Lisp_Object)); +extern Lisp_Object safe_eval P_ ((Lisp_Object)); +extern int pos_visible_p P_ ((struct window *, int, int *, int)); /* Defined in vm-limit.c. */ extern void memory_warnings P_ ((POINTER_TYPE *, void (*warnfun) ())); @@ -2181,7 +2225,12 @@ 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_vectorlike P_ ((EMACS_INT)); +extern struct Lisp_Vector *allocate_vector P_ ((EMACS_INT)); +extern struct Lisp_Vector *allocate_other_vector P_ ((EMACS_INT)); +extern struct Lisp_Hash_Table *allocate_hash_table P_ ((void)); +extern struct window *allocate_window P_ ((void)); +extern struct frame *allocate_frame P_ ((void)); +extern struct Lisp_Process *allocate_process P_ ((void)); extern int gc_in_progress; extern Lisp_Object make_float P_ ((double)); extern void display_malloc_warning P_ ((void)); @@ -2257,6 +2306,7 @@ extern Lisp_Object Vautoload_queue; extern Lisp_Object Vdebug_on_error; extern Lisp_Object Vsignaling_function; extern int handling_signal; +extern int interactive_p P_ ((int)); /* To run a normal hook, use the appropriate function from the list below. The calling convention: @@ -2287,7 +2337,7 @@ EXFUN (Flet, UNEVALLED); EXFUN (FletX, UNEVALLED); EXFUN (Fwhile, UNEVALLED); EXFUN (Fcatch, UNEVALLED); -EXFUN (Fthrow, 2); +EXFUN (Fthrow, 2) NO_RETURN; EXFUN (Funwind_protect, UNEVALLED); EXFUN (Fcondition_case, UNEVALLED); EXFUN (Fsignal, 2); @@ -2314,12 +2364,13 @@ extern Lisp_Object internal_condition_case_2 P_ ((Lisp_Object (*) (int, Lisp_Obj extern void specbind P_ ((Lisp_Object, Lisp_Object)); extern void record_unwind_protect P_ ((Lisp_Object (*) (Lisp_Object), Lisp_Object)); extern Lisp_Object unbind_to P_ ((int, Lisp_Object)); -extern void error P_ ((/* char *, ... */)); +extern void error P_ ((/* char *, ... */)) NO_RETURN; extern void do_autoload P_ ((Lisp_Object, Lisp_Object)); extern Lisp_Object un_autoload P_ ((Lisp_Object)); EXFUN (Ffetch_bytecode, 1); extern void init_eval_once P_ ((void)); -extern Lisp_Object call_function P_ ((int, Lisp_Object *)); +extern Lisp_Object safe_call P_ ((int, Lisp_Object *)); +extern Lisp_Object safe_call1 P_ ((Lisp_Object, Lisp_Object)); extern void init_eval P_ ((void)); extern void syms_of_eval P_ ((void)); @@ -2377,8 +2428,10 @@ EXFUN (Ffield_string, 1); EXFUN (Fdelete_field, 1); EXFUN (Ffield_beginning, 2); EXFUN (Ffield_string_no_properties, 1); +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)); extern char *no_switch_window P_ ((Lisp_Object window)); EXFUN (Fset_buffer_multibyte, 1); @@ -2412,6 +2465,7 @@ extern Lisp_Object Qoverlayp; extern Lisp_Object get_truename_buffer P_ ((Lisp_Object)); extern struct buffer *all_buffers; EXFUN (Fprevious_overlay_change, 1); +EXFUN (Fbuffer_file_name, 1); extern void init_buffer_once P_ ((void)); extern void init_buffer P_ ((void)); extern void syms_of_buffer P_ ((void)); @@ -2480,6 +2534,7 @@ EXFUN (Fmatch_data, 2); EXFUN (Fset_match_data, 1); EXFUN (Fmatch_beginning, 1); EXFUN (Fmatch_end, 1); +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, char *)); extern int scan_buffer P_ ((int, int, int, int, int *, int)); @@ -2537,6 +2592,9 @@ extern void syms_of_casetab P_ ((void)); /* defined in keyboard.c */ +extern int echoing; +extern Lisp_Object echo_message_buffer; +extern void cancel_echoing P_ ((void)); extern Lisp_Object Qdisabled, QCfilter; extern Lisp_Object Vtty_erase_char, Vhelp_form, Vtop_level; extern int input_pending; @@ -2561,9 +2619,11 @@ extern void record_auto_save P_ ((void)); 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)); /* defined in keymap.c */ +#define KEYMAPP(m) (!NILP (get_keymap (m, 0, 0))) extern Lisp_Object Qkeymap, Qmenu_bar; extern Lisp_Object current_global_map; EXFUN (Fmake_sparse_keymap, 1); @@ -2574,11 +2634,9 @@ EXFUN (Fkey_binding, 2); EXFUN (Fkey_description, 1); EXFUN (Fsingle_key_description, 2); EXFUN (Fwhere_is_internal, 4); -extern Lisp_Object access_keymap P_ ((Lisp_Object, Lisp_Object, int, int)); -extern Lisp_Object store_in_keymap P_ ((Lisp_Object, Lisp_Object, Lisp_Object)); +extern Lisp_Object access_keymap P_ ((Lisp_Object, Lisp_Object, int, int, int)); extern Lisp_Object get_keyelt P_ ((Lisp_Object, int)); -extern Lisp_Object get_keymap P_ ((Lisp_Object)); -extern Lisp_Object get_keymap_1 P_ ((Lisp_Object, int, int)); +extern Lisp_Object get_keymap P_ ((Lisp_Object, int, int)); extern void describe_vector P_ ((Lisp_Object, Lisp_Object, void (*) (Lisp_Object), int, Lisp_Object, Lisp_Object, int *, int)); @@ -2587,7 +2645,6 @@ extern void describe_map_tree P_ ((Lisp_Object, int, Lisp_Object, Lisp_Object, extern int current_minor_maps P_ ((Lisp_Object **, Lisp_Object **)); extern void initial_define_key P_ ((Lisp_Object, int, char *)); extern void initial_define_lispy_key P_ ((Lisp_Object, char *, char *)); -extern void fix_submap_inheritance P_ ((Lisp_Object, Lisp_Object, Lisp_Object)); extern void syms_of_keymap P_ ((void)); extern void keys_of_keymap P_ ((void)); @@ -2603,6 +2660,7 @@ extern void syms_of_indent P_ ((void)); /* defined in window.c */ extern Lisp_Object Qwindowp, Qwindow_live_p; +extern Lisp_Object Vwindow_list; EXFUN (Fwindow_end, 2); EXFUN (Fselected_window, 0); EXFUN (Fnext_window, 3); @@ -2617,7 +2675,7 @@ EXFUN (Fcurrent_window_configuration, 1); extern int compare_window_configurations P_ ((Lisp_Object, Lisp_Object, int)); EXFUN (Fcoordinates_in_window_p, 2); EXFUN (Fwindow_at, 3); -EXFUN (Fpos_visible_in_window_p, 2); +EXFUN (Fpos_visible_in_window_p, 3); extern void mark_window_cursors_off P_ ((struct window *)); extern int window_internal_height P_ ((struct window *)); extern int window_internal_width P_ ((struct window *)); @@ -2634,7 +2692,7 @@ extern void keys_of_window P_ ((void)); 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, Lisp_Object, int)); +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); @@ -2653,6 +2711,7 @@ EXFUN (Fmake_frame_invisible, 2); EXFUN (Ficonify_frame, 1); EXFUN (Fframe_visible_p, 1); EXFUN (Fvisible_frame_list, 0); +EXFUN (Fframe_parameter, 2); EXFUN (Fframe_parameters, 1); EXFUN (Fmodify_frame_parameters, 2); EXFUN (Fset_frame_height, 3); @@ -2762,7 +2821,7 @@ extern void syms_of_undo P_ ((void)); /* defined in textprop.c */ extern Lisp_Object Qmodification_hooks; -extern Lisp_Object Qrear_nonsticky, Qfont; +extern Lisp_Object Qrear_nonsticky, Qfont, Qmouse_face; extern Lisp_Object Qinsert_in_front_hooks, Qinsert_behind_hooks; EXFUN (Fnext_property_change, 3); EXFUN (Fnext_single_property_change, 4); @@ -2845,7 +2904,7 @@ extern void syms_of_mocklisp P_ ((void)); /* Defined in term.c */ extern void syms_of_term P_ ((void)); -extern void fatal (); +extern void fatal () NO_RETURN; #ifdef HAVE_X_WINDOWS /* Defined in fontset.c */ @@ -2863,6 +2922,7 @@ extern int getloadavg P_ ((double *, int)); /* Defined in xfns.c */ extern void syms_of_xfns P_ ((void)); extern void init_xfns P_ ((void)); +extern Lisp_Object Vx_resource_name; EXFUN (Fxw_display_color_p, 1); #endif /* HAVE_X_WINDOWS */ @@ -2887,7 +2947,9 @@ extern void xfree P_ ((POINTER_TYPE *)); extern char *xstrdup P_ ((char *)); +#ifndef USE_CRT_DLL extern char *egetenv P_ ((char *)); +#endif /* Set up the name of the machine we're running on. */ extern void init_system_name P_ ((void));