X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/c782ad7a64166e2db58185799f3a5a9f9f625c7e..b8098ef87f7ae6a626e6f91dbffc330e9acc6b53:/src/lisp.h diff --git a/src/lisp.h b/src/lisp.h index f8b8a76f1b..d40a129830 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -18,6 +18,13 @@ 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. */ +/* Declare the prototype for a general external function. */ +#if defined (__STDC__) || defined (WINDOWSNT) +#define P_(proto) proto +#else +#define P_(proto) () +#endif + /* These are default choices for the types to use. */ #ifndef EMACS_INT @@ -236,7 +243,8 @@ enum pvec_type PVEC_CHAR_TABLE = 0x8000, PVEC_BOOL_VECTOR = 0x10000, PVEC_BUFFER = 0x20000, - PVEC_TYPE_MASK = 0x3fe00, + PVEC_HASH_TABLE = 0x40000, + PVEC_TYPE_MASK = 0x7fe00, PVEC_FLAG = PSEUDOVECTOR_FLAG }; @@ -517,12 +525,23 @@ typedef struct interval *INTERVAL; 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_; +#else Lisp_Object car, cdr; +#endif }; /* Take the car or cdr of something known to be a cons cell. */ +#ifdef HIDE_LISP_IMPLEMENTATION +#define XCAR(c) (XCONS ((c))->car_) +#define XCDR(c) (XCONS ((c))->cdr_) +#else #define XCAR(c) (XCONS ((c))->car) #define XCDR(c) (XCONS ((c))->cdr) +#endif /* Take the car or cdr of something whose type is not known. */ #define CAR(c) \ @@ -728,6 +747,110 @@ struct Lisp_Subr char *prompt; char *doc; }; + + +/*********************************************************************** + Hash Tables + ***********************************************************************/ + +/* The structure of a Lisp hash table. */ + +struct Lisp_Hash_Table +{ + /* Vector fields. The hash table code doesn't refer to these. */ + EMACS_INT size; + struct Lisp_Vector *vec_next; + + /* Function used to compare keys. */ + Lisp_Object test; + + /* Nil if table is non-weak. Otherwise a symbol describing the + weakness of the table. */ + Lisp_Object weak; + + /* When the table is resized, and this is an integer, compute the + new size by adding this to the old size. If a float, compute the + new size by multiplying the old size with this factor. */ + Lisp_Object rehash_size; + + /* Resize hash table when number of entries/ table size is >= this + ratio, a float. */ + Lisp_Object rehash_threshold; + + /* Number of key/value entries in the table. */ + Lisp_Object count; + + /* Vector of keys and values. The key of item I is found at index + 2 * I, the value is found at index 2 * I + 1. */ + Lisp_Object key_and_value; + + /* Vector of hash codes.. If hash[I] is nil, this means that that + entry I is unused. */ + Lisp_Object hash; + + /* Vector used to chain entries. If entry I is free, next[I] is the + entry number of the next free item. If entry I is non-free, + next[I] is the index of the next entry in the collision chain. */ + Lisp_Object next; + + /* Index of first free entry in free list. */ + Lisp_Object next_free; + + /* Bucket vector. A non-nil entry is the index of the first item in + a collision chain. This vector's size can be larger than the + hash table size to reduce collisions. */ + Lisp_Object index; + + /* Next weak hash table if this is a weak hash table. The head + of the list is in Vweak_hash_tables. */ + Lisp_Object next_weak; + + /* User-supplied hash function, or nil. */ + Lisp_Object user_hash_function; + + /* User-supplied key comparison function, or nil. */ + Lisp_Object user_cmp_function; + + /* C function to compare two keys. */ + int (* cmpfn) P_ ((struct Lisp_Hash_Table *, Lisp_Object, + unsigned, Lisp_Object, unsigned)); + + /* C function to compute hash code. */ + unsigned (* hashfn) P_ ((struct Lisp_Hash_Table *, Lisp_Object)); +}; + + +#define XHASH_TABLE(OBJ) \ + ((struct Lisp_Hash_Table *) XPNTR (OBJ)) + +#define XSET_HASH_TABLE(VAR, PTR) \ + (XSETPSEUDOVECTOR (VAR, PTR, PVEC_HASH_TABLE)) + +#define HASH_TABLE_P(OBJ) PSEUDOVECTORP (OBJ, PVEC_HASH_TABLE) +#define GC_HASH_TABLE_P(x) GC_PSEUDOVECTORP (x, PVEC_HASH_TABLE) + +#define CHECK_HASH_TABLE(x, i) \ + do \ + { \ + if (!HASH_TABLE_P ((x))) \ + x = wrong_type_argument (Qhash_table_p, (x)); \ + } \ + while (0) + +/* Default size for hash tables if not specified. */ + +#define DEFAULT_HASH_SIZE 65 + +/* Default threshold specifying when to resize a hash table. The + value gives the ratio of current entries in the hash table and the + size of the hash table. */ + +#define DEFAULT_REHASH_THRESHOLD 0.8 + +/* Default factor by which to increase the size of a hash table. */ + +#define DEFAULT_REHASH_SIZE 1.5 + /* These structures are used for various misc types. */ @@ -900,8 +1023,18 @@ struct Lisp_Float { Lisp_Object type; /* essentially used for mark-bit and chaining when on free-list */ +#ifdef HIDE_LISP_IMPLEMENTATION + double data_; +#else double data; +#endif }; + +#ifdef HIDE_LISP_IMPLEMENTATION +#define XFLOAT_DATA(f) (XFLOAT (f)->data_) +#else +#define XFLOAT_DATA(f) (XFLOAT (f)->data) +#endif #endif /* LISP_FLOAT_TYPE */ /* A character, declared with the following typedef, is a member @@ -931,6 +1064,10 @@ typedef unsigned char UCHAR; #define CHAR_CTL (0x4000000) #define CHAR_META (0x8000000) +#define CHAR_MODIFIER_MASK \ + (CHAR_ALT | CHAR_SUPER | CHAR_HYPER | CHAR_SHIFT | CHAR_CTL | CHAR_META) + + /* Actually, the current Emacs uses 19 bits for the character value itself. */ #define CHARACTERBITS 19 @@ -986,7 +1123,6 @@ typedef unsigned char UCHAR; /* Mask bits for character code. */ #define GLYPH_MASK_CHAR 0x0007FFFF /* The lowest 19 bits */ -#ifdef HAVE_FACES /* The FAST macros assume that we already know we're in an X window. */ /* Given a character code and a face ID, return the appropriate glyph. */ @@ -999,18 +1135,9 @@ typedef unsigned char UCHAR; #define FAST_GLYPH_FACE(glyph) (((glyph) & GLYPH_MASK_FACE) >> CHARACTERBITS) /* Slower versions that test the frame type first. */ -#define MAKE_GLYPH(f, char, face) (FRAME_TERMCAP_P (f) ? (char) \ - : FAST_MAKE_GLYPH (char, face)) -#define GLYPH_CHAR(f, g) (FRAME_TERMCAP_P (f) ? (g) : FAST_GLYPH_CHAR (g)) -#define GLYPH_FACE(f, g) (FRAME_TERMCAP_P (f) ? (0) : FAST_GLYPH_FACE (g)) -#else /* not HAVE_FACES */ -#define MAKE_GLYPH(f, char, face) (char) -#define FAST_MAKE_GLYPH(char, face) (char) -#define GLYPH_CHAR(f, g) ((g) & GLYPH_MASK_CHAR) -#define FAST_GLYPH_CHAR(g) ((g) & GLYPH_MASK_CHAR) -#define GLYPH_FACE(f, g) ((g) & GLYPH_MASK_FACE) -#define FAST_GLYPH_FACE(g) ((g) & GLYPH_MASK_FACE) -#endif /* not HAVE_FACES */ +#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)) /* Return 1 iff GLYPH contains valid character code. */ #define GLYPH_CHAR_VALID_P(glyph) \ @@ -1268,13 +1395,6 @@ typedef unsigned char UCHAR; Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object) #endif -/* Declare the prototype for a general external function. */ -#if defined (__STDC__) || defined (WINDOWSNT) -#define P_(proto) proto -#else -#define P_(proto) () -#endif - /* defsubr (Sname); is how we define the symbol for function `name' at start-up time. */ extern void defsubr P_ ((struct Lisp_Subr *)); @@ -1480,14 +1600,14 @@ void staticpro P_ ((Lisp_Object *)); /* Evaluate expr, UNGCPRO, and then return the value of expr. */ #define RETURN_UNGCPRO(expr) \ -if (1) \ +do \ { \ Lisp_Object ret_ungc_val; \ ret_ungc_val = (expr); \ UNGCPRO; \ return ret_ungc_val; \ } \ -else +while (0) /* Declare a Lisp-callable function. The MAXARGS parameter has the same meaning as in the DEFUN macro, and is used to construct a prototype. */ @@ -1648,6 +1768,8 @@ extern Lisp_Object detect_coding_system P_ ((unsigned char *, int, int)); extern void init_coding P_ ((void)); extern void init_coding_once P_ ((void)); extern void syms_of_coding P_ ((void)); +extern Lisp_Object code_convert_string_norecord P_ ((Lisp_Object, Lisp_Object, + int)); /* Defined in charset.c */ extern int nonascii_insert_offset; @@ -1673,8 +1795,38 @@ extern void init_syntax_once P_ ((void)); extern void syms_of_syntax P_ ((void)); /* Defined in fns.c */ +extern void sweep_weak_hash_tables P_ ((void)); extern Lisp_Object Qstring_lessp; extern Lisp_Object Vfeatures; +unsigned sxhash P_ ((Lisp_Object, int)); +Lisp_Object make_hash_table P_ ((Lisp_Object, Lisp_Object, Lisp_Object, + Lisp_Object, Lisp_Object, Lisp_Object, + Lisp_Object)); +Lisp_Object copy_hash_table P_ ((struct Lisp_Hash_Table *)); +int hash_lookup P_ ((struct Lisp_Hash_Table *, Lisp_Object, unsigned *)); +void 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)); +extern void init_fns P_ ((void)); +EXFUN (Fsxhash, 1); +EXFUN (Fmake_hash_table, MANY); +EXFUN (Fcopy_hash_table, 1); +EXFUN (Fhash_table_count, 1); +EXFUN (Fhash_table_rehash_size, 1); +EXFUN (Fhash_table_rehash_threshold, 1); +EXFUN (Fhash_table_size, 1); +EXFUN (Fhash_table_test, 1); +EXFUN (Fhash_table_weak, 1); +EXFUN (Fhash_table_p, 1); +EXFUN (Fclrhash, 1); +EXFUN (Fgethash, 3); +EXFUN (Fputhash, 3); +EXFUN (Fremhash, 2); +EXFUN (Fmaphash, 2); +EXFUN (Fdefine_hash_table_test, 3); + EXFUN (Fidentity, 1); EXFUN (Frandom, 1); EXFUN (Flength, 1); @@ -1724,6 +1876,7 @@ extern Lisp_Object string_make_multibyte P_ ((Lisp_Object)); extern Lisp_Object string_make_unibyte P_ ((Lisp_Object)); EXFUN (Fcopy_alist, 1); EXFUN (Fplist_get, 2); +EXFUN (Fplist_put, 3); EXFUN (Fset_char_table_parent, 2); EXFUN (Fchar_table_extra_slot, 2); EXFUN (Fset_char_table_extra_slot, 3); @@ -1780,25 +1933,38 @@ extern void replace_range P_ ((int, int, Lisp_Object, int, int, int)); extern void syms_of_insdel P_ ((void)); /* Defined in dispnew.c */ +extern Lisp_Object selected_frame; EXFUN (Fding, 1); +EXFUN (Fredraw_frame, 1); EXFUN (Fredraw_display, 0); EXFUN (Fsleep_for, 2); EXFUN (Fsit_for, 3); extern Lisp_Object sit_for P_ ((int, int, int, int, int)); -extern void quit_error_check P_ ((void)); extern void init_display P_ ((void)); 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 Vmessage_log_max; extern int message_enable_multibyte; +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 void pop_message P_ ((void)); +extern void restore_message P_ ((void)); +extern Lisp_Object current_message P_ ((void)); +extern void set_message P_ ((char *s, Lisp_Object, int, int)); +extern void clear_message P_ ((int, int)); extern void message P_ ((/* char *, ... */)); extern void message_nolog P_ ((/* char *, ... */)); extern void message1 P_ ((char *)); extern void message1_nolog P_ ((char *)); extern void message2 P_ ((char *, int, int)); extern void message2_nolog P_ ((char *, int, int)); +extern void message3 P_ ((Lisp_Object, int, int)); +extern void message3_nolog P_ ((Lisp_Object, int, int)); extern void message_dolog P_ ((char *, int, int, int)); extern void message_with_string P_ ((char *, Lisp_Object, int)); extern void message_log_maybe_newline P_ ((void)); @@ -1812,10 +1978,20 @@ extern void prepare_menu_bars P_ ((void)); extern void syms_of_xdisp P_ ((void)); extern void init_xdisp P_ ((void)); +/* Defined in vm-limit.c. */ +#ifdef __STDC__ +extern void memory_warnings P_ ((void *, void (*warnfun) ())); +#else +extern void memory_warnings P_ ((char *, void (*warnfun) ())); +#endif + /* Defined in alloc.c */ +extern void uninterrupt_malloc P_ ((void)); extern void malloc_warning P_ ((char *)); extern void memory_full P_ ((void)); extern void buffer_memory_full P_ ((void)); +extern int survives_gc_p P_ ((Lisp_Object)); +extern void mark_object P_ ((Lisp_Object *)); extern Lisp_Object Vpurify_flag; EXFUN (Fcons, 2); EXFUN (list2, 2); @@ -1864,6 +2040,7 @@ extern void syms_of_alloc P_ ((void)); /* Defined in print.c */ extern Lisp_Object Vprin1_to_string_buffer; +extern void debug_print P_ ((Lisp_Object)); EXFUN (Fprin1, 2); EXFUN (Fprin1_to_string, 2); EXFUN (Fprinc, 2); @@ -1987,6 +2164,7 @@ extern void init_eval P_ ((void)); extern void syms_of_eval P_ ((void)); /* Defined in editfns.c */ +EXFUN (Fcurrent_message, 0); EXFUN (Fgoto_char, 1); EXFUN (Fpoint_min_marker, 0); EXFUN (Fpoint_max_marker, 0); @@ -2011,6 +2189,7 @@ EXFUN (Feobp, 0); EXFUN (Fbolp, 0); EXFUN (Fbobp, 0); EXFUN (Fformat, MANY); +EXFUN (Fmessage, MANY); extern Lisp_Object format1 P_ ((/* char *, ... */)); extern Lisp_Object make_buffer_string P_ ((int, int, int)); EXFUN (Fbuffer_substring, 2); @@ -2025,14 +2204,18 @@ EXFUN (Fnarrow_to_region, 2); EXFUN (Fwiden, 0); EXFUN (Fuser_login_name, 1); EXFUN (Fsystem_name, 0); +EXFUN (Fcurrent_time, 0); extern int clip_to_bounds P_ ((int, int, int)); 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); /* defined in buffer.c */ extern void nsberror P_ ((Lisp_Object)); +extern char *no_switch_window P_ ((Lisp_Object window)); +EXFUN (Fset_buffer_multibyte, 1); EXFUN (Foverlay_start, 1); EXFUN (Foverlay_end, 1); extern void adjust_overlays_for_insert P_ ((int, int)); @@ -2092,6 +2275,7 @@ extern void syms_of_marker P_ ((void)); extern Lisp_Object Qfile_error; EXFUN (Ffind_file_name_handler, 2); EXFUN (Ffile_name_as_directory, 1); +EXFUN (Fmake_temp_name, 1); EXFUN (Fexpand_file_name, 2); EXFUN (Ffile_name_nondirectory, 1); EXFUN (Fsubstitute_in_file_name, 1); @@ -2109,9 +2293,12 @@ EXFUN (Fwrite_region, 7); EXFUN (Ffile_readable_p, 1); EXFUN (Ffile_executable_p, 1); EXFUN (Fread_file_name, 5); +extern Lisp_Object close_file_unwind P_ ((Lisp_Object)); extern void report_file_error P_ ((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)); /* Defined in abbrev.c */ @@ -2119,6 +2306,7 @@ extern Lisp_Object Vfundamental_mode_abbrev_table; 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); @@ -2189,6 +2377,7 @@ EXFUN (Frecursive_edit, 0); EXFUN (Fcommand_execute, 4); EXFUN (Finput_pending_p, 0); extern Lisp_Object menu_bar_items P_ ((Lisp_Object)); +extern Lisp_Object tool_bar_items P_ ((Lisp_Object, int *)); extern Lisp_Object Qvertical_scroll_bar; extern void discard_mouse_events (); EXFUN (Fevent_convert_list, 1); @@ -2246,6 +2435,7 @@ extern void syms_of_indent P_ ((void)); /* defined in window.c */ extern Lisp_Object Qwindowp, Qwindow_live_p; +EXFUN (Fwindow_end, 2); EXFUN (Fselected_window, 0); EXFUN (Fnext_window, 3); EXFUN (Fdelete_window, 1); @@ -2260,6 +2450,7 @@ 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); +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 *)); EXFUN (Frecenter, 1); @@ -2346,6 +2537,7 @@ extern void syms_of_process P_ ((void)); /* defined in callproc.c */ extern Lisp_Object Vexec_path, Vexec_directory, Vdata_directory; extern Lisp_Object Vdoc_directory; +EXFUN (Fcall_process, MANY); extern int child_setup P_ ((int, int, int, char **, int, Lisp_Object)); extern void init_callproc_1 P_ ((void)); extern void init_callproc P_ ((void)); @@ -2360,6 +2552,7 @@ EXFUN (Fdocumentation_property, 3); extern Lisp_Object read_doc_string P_ ((Lisp_Object)); extern Lisp_Object get_doc_string P_ ((Lisp_Object, int, int)); extern void syms_of_doc P_ ((void)); +extern int read_bytecode_char P_ ((int)); /* defined in bytecode.c */ extern Lisp_Object Qbytecode; @@ -2401,6 +2594,10 @@ EXFUN (Fprevious_char_property_change, 2); EXFUN (Fnext_char_property_change, 2); extern void report_interval_modification P_ ((Lisp_Object, Lisp_Object)); extern void syms_of_textprop P_ ((void)); +extern Lisp_Object next_single_char_property_change P_ ((Lisp_Object, + Lisp_Object, + Lisp_Object, + Lisp_Object)); /* defined in intervals.c */ extern Lisp_Object get_local_map P_ ((int, struct buffer *)); @@ -2411,6 +2608,7 @@ EXFUN (Fx_popup_dialog, 2); extern void syms_of_xmenu P_ ((void)); /* defined in sysdep.c */ +extern void stuff_char P_ ((char c)); extern void init_sigio P_ ((int)); extern void request_sigio P_ ((void)); extern void unrequest_sigio P_ ((void)); @@ -2438,6 +2636,11 @@ extern void lock_file P_ ((Lisp_Object)); extern void unlock_file P_ ((Lisp_Object)); extern void unlock_buffer P_ ((struct buffer *)); extern void syms_of_filelock P_ ((void)); +extern void init_filelock P_ ((void)); + +/* Defined in sound.c */ +extern void syms_of_sound P_ ((void)); +extern void init_sound P_ ((void)); /* Defined in category.c */ extern void init_category_once P_ ((void)); @@ -2447,6 +2650,7 @@ extern void syms_of_category P_ ((void)); extern void syms_of_ccl P_ ((void)); /* Defined in dired.c */ +EXFUN (Ffile_attributes, 1); extern void syms_of_dired P_ ((void)); /* Defined in mocklisp.c */ @@ -2454,18 +2658,26 @@ extern void syms_of_mocklisp P_ ((void)); /* Defined in term.c */ extern void syms_of_term P_ ((void)); +extern void fatal (); #ifdef HAVE_X_WINDOWS /* Defined in fontset.c */ extern void syms_of_fontset P_ ((void)); +EXFUN (Fset_fontset_font, 4); #endif /* Defined in xfaces.c */ extern void syms_of_xfaces P_ ((void)); +/* Defined in getloadavg.c */ +extern int getloadavg P_ ((double *, int)); + #ifdef HAVE_X_WINDOWS /* Defined in xfns.c */ +extern void x_set_tool_bar_lines P_ ((struct frame *, Lisp_Object, Lisp_Object)); extern void syms_of_xfns P_ ((void)); +EXFUN (Fx_hide_busy_cursor, 1); +extern void init_xfns P_ ((void)); #endif /* Defined in xselect.c */ @@ -2473,6 +2685,9 @@ 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)); /* Nonzero means Emacs has already been initialized. Used during startup to detect startup of dumped Emacs. */