X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/f6c741f9422833bed2fae805185754ec38b1030d..b70d9316bbf3e2482c1345d8135ddd1ee7e25ba7:/src/lisp.h diff --git a/src/lisp.h b/src/lisp.h index bcd066360b..c7b7ca1a2f 100644 --- a/src/lisp.h +++ b/src/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 @@ -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" @@ -1199,7 +1222,10 @@ struct Lisp_Save_Value { int type : 16; /* = Lisp_Misc_Save_Value */ unsigned gcmarkbit : 1; - int spacer : 15; + int spacer : 14; + /* If DOGC is set, POINTER is the address of a memory + area containing INTEGER potential Lisp_Objects. */ + unsigned int dogc : 1; void *pointer; int integer; }; @@ -1371,7 +1397,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)) @@ -1650,8 +1676,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) \ @@ -1747,11 +1781,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, Qnil); \ Fsignal (Qquit, Qnil); \ } \ else if (interrupt_input_pending) \ @@ -1764,7 +1802,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, Qnil); \ Fsignal (Qquit, Qnil); \ } \ } while (0) @@ -2275,6 +2316,7 @@ EXFUN (Felt, 2); EXFUN (Fmember, 2); EXFUN (Frassq, 2); EXFUN (Fdelq, 2); +EXFUN (Fdelete, 2); EXFUN (Fsort, 2); EXFUN (Freverse, 1); EXFUN (Fnreverse, 1); @@ -2297,9 +2339,11 @@ 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); @@ -2329,6 +2373,7 @@ extern void init_fringe P_ ((void)); extern void init_fringe_once P_ ((void)); /* Defined in image.c */ +EXFUN (Finit_image_library, 2); extern void syms_of_image P_ ((void)); extern void init_image P_ ((void)); @@ -2365,6 +2410,7 @@ 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)); /* Defined in dispnew.c */ @@ -2423,7 +2469,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) ())); @@ -2431,6 +2477,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)); @@ -2483,6 +2530,7 @@ extern Lisp_Object make_float P_ ((double)); extern void display_malloc_warning P_ ((void)); extern int inhibit_garbage_collection P_ ((void)); extern Lisp_Object make_save_value P_ ((void *, int)); +extern void free_misc P_ ((Lisp_Object)); extern void free_marker P_ ((Lisp_Object)); extern void free_cons P_ ((struct Lisp_Cons *)); extern void init_alloc_once P_ ((void)); @@ -2787,6 +2835,7 @@ 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, 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)); @@ -2799,7 +2848,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); @@ -2847,6 +2896,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); @@ -2861,6 +2911,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 *)); @@ -2884,6 +2935,10 @@ extern int indented_beyond_p P_ ((int, int, double)); extern void syms_of_indent P_ ((void)); /* defined in frame.c */ +#ifdef HAVE_WINDOW_SYSTEM +extern Lisp_Object Vx_resource_name; +extern Lisp_Object Vx_resource_class; +#endif /* HAVE_WINDOW_SYSTEM */ 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)); @@ -2955,7 +3010,10 @@ EXFUN (Fprocess_send_eof, 1); EXFUN (Fwaiting_for_user_input_p, 0); extern Lisp_Object Qprocessp; extern void kill_buffer_processes P_ ((Lisp_Object)); -extern int wait_reading_process_input P_ ((int, int, Lisp_Object, int)); +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)); @@ -3005,7 +3063,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)); +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)); @@ -3014,6 +3072,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; @@ -3104,11 +3163,12 @@ extern int getloadavg P_ ((double *, int)); #ifdef HAVE_X_WINDOWS /* Defined in xfns.c */ extern void syms_of_xfns P_ ((void)); -extern Lisp_Object Vx_resource_name; -extern Lisp_Object Vx_resource_class; -EXFUN (Fxw_display_color_p, 1); -EXFUN (Fx_file_dialog, 4); #endif /* HAVE_X_WINDOWS */ +#ifdef HAVE_WINDOW_SYSTEM +/* Defined in xfns.c, w32fns.c, or macfns.c */ +EXFUN (Fxw_display_color_p, 1); +EXFUN (Fx_file_dialog, 5); +#endif /* HAVE_WINDOW_SYSTEM */ /* Defined in xsmfns.c */ extern void syms_of_xsmfns P_ ((void)); @@ -3121,6 +3181,11 @@ 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); +#endif /* Nonzero means Emacs has already been initialized. Used during startup to detect startup of dumped Emacs. */ @@ -3134,9 +3199,7 @@ extern void xfree P_ ((POINTER_TYPE *)); extern char *xstrdup P_ ((const 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)); @@ -3243,6 +3306,61 @@ extern Lisp_Object Vdirectory_sep_char; : Fcons ((el), (check))))) +/* SAFE_ALLOCA normally allocates memory on the stack, but if size is + larger than MAX_ALLOCA, use xmalloc to avoid overflowing the stack. */ + +#define MAX_ALLOCA 16*1024 + +extern Lisp_Object safe_alloca_unwind (Lisp_Object); + +#define USE_SAFE_ALLOCA \ + int sa_count = SPECPDL_INDEX (), sa_must_free = 0 + +/* SAFE_ALLOCA allocates a simple buffer. */ + +#define SAFE_ALLOCA(buf, type, size) \ + do { \ + if ((size) < MAX_ALLOCA) \ + buf = (type) alloca (size); \ + else \ + { \ + buf = (type) xmalloc (size); \ + sa_must_free++; \ + record_unwind_protect (safe_alloca_unwind, \ + make_save_value (buf, 0)); \ + } \ + } while (0) + +/* SAFE_FREE frees xmalloced memory and enables GC as needed. */ + +#define SAFE_FREE() \ + do { \ + if (sa_must_free) { \ + sa_must_free = 0; \ + unbind_to (sa_count, Qnil); \ + } \ + } while (0) + + +/* SAFE_ALLOCA_LISP allocates an array of Lisp_Objects. */ + +#define SAFE_ALLOCA_LISP(buf, nelt) \ + do { \ + int size_ = (nelt) * sizeof (Lisp_Object); \ + if (size_ < MAX_ALLOCA) \ + buf = (Lisp_Object *) alloca (size_); \ + else \ + { \ + Lisp_Object arg_; \ + buf = (Lisp_Object *) xmalloc (size_); \ + arg_ = make_save_value (buf, nelt); \ + XSAVE_VALUE (arg_)->dogc = 1; \ + sa_must_free++; \ + record_unwind_protect (safe_alloca_unwind, arg_); \ + } \ + } while (0) + + #endif /* EMACS_LISP_H */ /* arch-tag: 9b2ed020-70eb-47ac-94ee-e1c2a5107d5e