Mercurial > hg > xemacs-beta
diff src/lisp.h @ 5178:97eb4942aec8
merge
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Mon, 29 Mar 2010 21:28:13 -0500 |
parents | 8b2f75cecb89 5ddbab03b0e6 |
children | 4cd28c29a7a1 |
line wrap: on
line diff
--- a/src/lisp.h Tue Feb 23 07:28:35 2010 -0600 +++ b/src/lisp.h Mon Mar 29 21:28:13 2010 -0500 @@ -85,6 +85,16 @@ %%#### marks places that need work for KKCC (the new garbage collector). + @@#### marks places that need work to get Unicode-internal working, + i.e. using UTF-8 as the internal text format. + + #### BILL! marks places that need work for GTK. + + #### GEOM! marks places needing work to fix various bugs in the handling + of window and frame sizing and positioning. Often the root of the + problems is that the code was originally written before there was a + gutter and then not completely fixed up to accommodate the gutter. + */ /************************************************************************/ @@ -1229,6 +1239,9 @@ /* Highly dubious kludge */ /* (thanks, Jamie, I feel better now -- ben) */ MODULE_API void assert_failed (const Ascbyte *, int, const Ascbyte *); +void assert_equal_failed (const Ascbyte *file, int line, EMACS_INT x, + EMACS_INT y, const Ascbyte *exprx, + const Ascbyte *expry); #define ABORT() assert_failed (__FILE__, __LINE__, "ABORT()") #define abort_with_message(msg) assert_failed (__FILE__, __LINE__, msg) @@ -1249,6 +1262,10 @@ ((x) ? (void) 0 : assert_failed (__FILE__, __LINE__, msg)) # define assert_at_line(x, file, line) \ ((x) ? (void) 0 : assert_failed (file, line, #x)) +# define assert_equal(x, y) \ + ((x) == (y) ? (void) 0 : \ + assert_equal_failed (__FILE__, __LINE__, (EMACS_INT) x, (EMACS_INT) y, \ + #x, #y)) #else /* This used to be ((void) (0)) but that triggers lots of unused variable warnings. It's pointless to force all that code to be rewritten, with @@ -1257,6 +1274,7 @@ # define assert(x) disabled_assert (x) # define assert_with_message(x, msg) disabled_assert_with_message (x, msg) # define assert_at_line(x, file, line) disabled_assert_at_line (x, file, line) +# define assert_equal(x, y) disabled_assert ((x) == (y)) #endif /************************************************************************/ @@ -1544,16 +1562,6 @@ RUN_HOOKS_UNTIL_FAILURE }; -#ifdef HAVE_TOOLBARS -enum toolbar_pos -{ - TOP_TOOLBAR, - BOTTOM_TOOLBAR, - LEFT_TOOLBAR, - RIGHT_TOOLBAR -}; -#endif - enum edge_style { EDGE_ETCHED_IN, @@ -1584,8 +1592,6 @@ /* misc */ /* ------------------------------- */ -#ifdef MEMORY_USAGE_STATS - /* This structure is used to keep statistics on the amount of memory in use. @@ -1605,15 +1611,31 @@ the fields to 0, and add any existing values to whatever was there before; this way, you can get a cumulative effect. */ -struct overhead_stats +struct usage_stats { - int was_requested; - int malloc_overhead; - int dynarr_overhead; - int gap_overhead; + Bytecount was_requested; + Bytecount malloc_overhead; + Bytecount dynarr_overhead; + Bytecount gap_overhead; }; -#endif /* MEMORY_USAGE_STATS */ +/* Generic version of usage stats structure including extra non-Lisp and + Lisp storage associated with the object, but not including the memory + used to hold the object itself. Up to 32 statistics are allowed, + in addition to the statistics in `U', which store another slice onto the + ancillary non-Lisp storage. + + Normally, each object creates its own version of this structure, e.g. + `struct window_stats', which parallels the structure in beginning with + a `struct usage_stats' and followed by Bytecount fields, so that a + pointer to that structure can be cast to a pointer of this structure + and sensible results gotten. */ + +struct generic_usage_stats +{ + struct usage_stats u; + Bytecount othervals[32]; +}; /************************************************************************/ @@ -1722,583 +1744,10 @@ } /************************************************************************/ -/** Definitions of dynamic arrays (dynarrs) and other allocators **/ +/** Definitions of dynarrs and other allocators **/ /************************************************************************/ -BEGIN_C_DECLS - -/************* Dynarr declaration *************/ - -#ifdef NEW_GC -#define DECLARE_DYNARR_LISP_IMP() \ - const struct lrecord_implementation *lisp_imp; -#else -#define DECLARE_DYNARR_LISP_IMP() -#endif - -#ifdef ERROR_CHECK_DYNARR -#define DECLARE_DYNARR_LOCKED() \ - int locked; -#else -#define DECLARE_DYNARR_LOCKED() -#endif - -#define Dynarr_declare(type) \ - struct lrecord_header header; \ - type *base; \ - DECLARE_DYNARR_LISP_IMP () \ - DECLARE_DYNARR_LOCKED () \ - int elsize_; \ - int len_; \ - int largest_; \ - int max_ - -typedef struct dynarr -{ - Dynarr_declare (void); -} Dynarr; - -#define XD_DYNARR_DESC(base_type, sub_desc) \ - { XD_BLOCK_PTR, offsetof (base_type, base), \ - XD_INDIRECT(1, 0), {sub_desc} }, \ - { XD_INT, offsetof (base_type, len_) }, \ - { XD_INT_RESET, offsetof (base_type, largest_), XD_INDIRECT(1, 0) }, \ - { XD_INT_RESET, offsetof (base_type, max_), XD_INDIRECT(1, 0) } - -#ifdef NEW_GC -#define XD_LISP_DYNARR_DESC(base_type, sub_desc) \ - { XD_LISP_OBJECT_BLOCK_PTR, offsetof (base_type, base), \ - XD_INDIRECT(1, 0), {sub_desc} }, \ - { XD_INT, offsetof (base_type, len_) }, \ - { XD_INT_RESET, offsetof (base_type, largest_), XD_INDIRECT(1, 0) }, \ - { XD_INT_RESET, offsetof (base_type, max_), XD_INDIRECT(1, 0) } -#endif /* NEW_GC */ - -/************* Dynarr verification *************/ - -/* Dynarr locking and verification. - - [I] VERIFICATION - - Verification routines simply return their basic argument, possibly - casted, but in the process perform some verification on it, aborting if - the verification fails. The verification routines take FILE and LINE - parameters, and use them to output the file and line of the caller - when an abort occurs, rather than the file and line of the inline - function, which is less than useful. - - There are three basic types of verification routines: - - (1) Verify the dynarr itself. This verifies the basic invariant - involving the length/size values: - - 0 <= Dynarr_length(d) <= Dynarr_largest(d) <= Dynarr_max(d) - - (2) Verify the dynarr itself prior to modifying it. This performs - the same verification as previously, but also checks that the - dynarr is not locked (see below). - - (3) Verify a dynarr position. Unfortunately we have to have - different verification routines depending on which kind of operation - is being performed: - - (a) For Dynarr_at(), we check that the POS is bounded by Dynarr_largest(), - i.e. 0 <= POS < Dynarr_largest(). - (b) For Dynarr_atp_allow_end(), we also have to allow - POS == Dynarr_largest(). - (c) For Dynarr_atp(), we behave largely like Dynarr_at() but make a - special exception when POS == 0 and Dynarr_largest() == 0 -- see - comment below. - (d) Some other routines contain the POS verification within their code, - and make the check 0 <= POS < Dynarr_length() or - 0 <= POS <= Dynarr_length(). - - #### It is not well worked-out whether and in what circumstances it's - allowed to use a position that is between Dynarr_length() and - Dynarr_largest(). The ideal solution is to never allow this, and require - instead that code first change the length before accessing higher - positions. That would require looking through all the code that accesses - dynarrs and fixing it appropriately (especially redisplay code, and - especially redisplay code in the vicinity of a reference to - Dynarr_largest(), since such code usually checks explicitly to see whether - there is extra stuff between Dynarr_length() and Dynarr_largest().) - - [II] LOCKING - - The idea behind dynarr locking is simple: Locking a dynarr prevents - any modification from occurring, or rather, leads to an abort upon - any attempt to modify a dynarr. - - Dynarr locking was originally added to catch some sporadic and hard-to- - debug crashes in the redisplay code where dynarrs appeared to be getting - corrupted in an unexpected fashion. The solution was to lock the - dynarrs that were getting corrupted (in this case, the display-line - dynarrs) around calls to routines that weren't supposed to be changing - these dynarrs but might somehow be calling code that modified them. - This eventually revealed that there was a reentrancy problem with - redisplay that involved the QUIT mechanism and the processing done in - order to determine whether C-g had been pressed -- this processing - involves retrieving, processing and queueing pending events to see - whether any of them result in a C-g keypress. However, at least under - MS Windows this can result in redisplay being called reentrantly. - For more info:-- - - (Info-goto-node "(internals)Critical Redisplay Sections") - -*/ - -#ifdef ERROR_CHECK_DYNARR -DECLARE_INLINE_HEADER ( -int -Dynarr_verify_pos_at (void *d, Elemcount pos, const Ascbyte *file, int line) -) -{ - Dynarr *dy = (Dynarr *) d; - /* We use `largest', not `len', because the redisplay code often - accesses stuff between len and largest. */ - assert_at_line (pos >= 0 && pos < dy->largest_, file, line); - return pos; -} - -DECLARE_INLINE_HEADER ( -int -Dynarr_verify_pos_atp (void *d, Elemcount pos, const Ascbyte *file, int line) -) -{ - Dynarr *dy = (Dynarr *) d; - /* We use `largest', not `len', because the redisplay code often - accesses stuff between len and largest. */ - /* [[ Code will often do something like ... - - val = make_bit_vector_from_byte_vector (Dynarr_atp (dyn, 0), - Dynarr_length (dyn)); - - which works fine when the Dynarr_length is non-zero, but when zero, - the result of Dynarr_atp() not only points past the end of the - allocated array, but the array may not have ever been allocated and - hence the return value is NULL. But the length of 0 causes the - pointer to never get checked. These can occur throughout the code - so we put in a special check. --ben ]] - - Update: The common idiom `Dynarr_atp (dyn, 0)' has been changed to - `Dynarr_begin (dyn)'. Possibly this special check at POS 0 can be - done only for Dynarr_begin() not for general Dynarr_atp(). --ben */ - if (pos == 0 && dy->len_ == 0) - return pos; - /* #### It's vaguely possible that some code could legitimately want to - retrieve a pointer to the position just past the end of dynarr memory. - This could happen with Dynarr_atp() but not Dynarr_at(). If so, it - will trigger this assert(). In such cases, it should be obvious that - the code wants to do this; rather than relaxing the assert, we should - probably create a new macro Dynarr_atp_allow_end() which is like - Dynarr_atp() but which allows for pointing at invalid addresses -- we - really want to check for cases of accessing just past the end of - memory, which is a likely off-by-one problem to occur and will usually - not trigger a protection fault (instead, you'll just get random - behavior, possibly overwriting other memory, which is bad). --ben */ - assert_at_line (pos >= 0 && pos < dy->largest_, file, line); - return pos; -} - -DECLARE_INLINE_HEADER ( -int -Dynarr_verify_pos_atp_allow_end (void *d, Elemcount pos, const Ascbyte *file, - int line) -) -{ - Dynarr *dy = (Dynarr *) d; - /* We use `largest', not `len', because the redisplay code often - accesses stuff between len and largest. - We also allow referencing the very end, past the end of allocated - legitimately space. See comments in Dynarr_verify_pos_atp.()*/ - assert_at_line (pos >= 0 && pos <= dy->largest_, file, line); - return pos; -} - -#else -#define Dynarr_verify_pos_at(d, pos, file, line) (pos) -#define Dynarr_verify_pos_atp(d, pos, file, line) (pos) -#define Dynarr_verify_pos_atp_allow_end(d, pos, file, line) (pos) -#endif /* ERROR_CHECK_DYNARR */ - -#ifdef ERROR_CHECK_DYNARR -DECLARE_INLINE_HEADER ( -Dynarr * -Dynarr_verify_1 (void *d, const Ascbyte *file, int line) -) -{ - Dynarr *dy = (Dynarr *) d; - assert_at_line (dy->len_ >= 0 && dy->len_ <= dy->largest_ && - dy->largest_ <= dy->max_, file, line); - return dy; -} - -DECLARE_INLINE_HEADER ( -Dynarr * -Dynarr_verify_mod_1 (void *d, const Ascbyte *file, int line) -) -{ - Dynarr *dy = (Dynarr *) d; - assert_at_line (!dy->locked, file, line); - return Dynarr_verify_1 (d, file, line); -} - -#define Dynarr_verify(d) Dynarr_verify_1 (d, __FILE__, __LINE__) -#define Dynarr_verify_mod(d) Dynarr_verify_mod_1 (d, __FILE__, __LINE__) - -DECLARE_INLINE_HEADER ( -void -Dynarr_lock (void *d) -) -{ - Dynarr *dy = Dynarr_verify_mod (d); - dy->locked = 1; -} - -DECLARE_INLINE_HEADER ( -void -Dynarr_unlock (void *d) -) -{ - Dynarr *dy = Dynarr_verify (d); - assert (dy->locked); - dy->locked = 0; -} - -#else /* not ERROR_CHECK_DYNARR */ - -#define Dynarr_verify(d) ((Dynarr *) d) -#define Dynarr_verify_mod(d) ((Dynarr *) d) -#define Dynarr_lock(d) DO_NOTHING -#define Dynarr_unlock(d) DO_NOTHING - -#endif /* ERROR_CHECK_DYNARR */ - -/************* Dynarr creation *************/ - -MODULE_API void *Dynarr_newf (Bytecount elsize); -MODULE_API void Dynarr_free (void *d); - -#ifdef NEW_GC -MODULE_API void *Dynarr_lisp_newf (Bytecount elsize, - const struct lrecord_implementation - *dynarr_imp, - const struct lrecord_implementation *imp); - -#define Dynarr_lisp_new(type, dynarr_imp, imp) \ - ((type##_dynarr *) Dynarr_lisp_newf (sizeof (type), dynarr_imp, imp)) -#define Dynarr_lisp_new2(dynarr_type, type, dynarr_imp, imp) \ - ((dynarr_type *) Dynarr_lisp_newf (sizeof (type)), dynarr_imp, imp) -#endif /* NEW_GC */ -#define Dynarr_new(type) ((type##_dynarr *) Dynarr_newf (sizeof (type))) -#define Dynarr_new2(dynarr_type, type) \ - ((dynarr_type *) Dynarr_newf (sizeof (type))) - -/************* Dynarr access *************/ - -#ifdef ERROR_CHECK_DYNARR -#define Dynarr_at(d, pos) \ - ((d)->base[Dynarr_verify_pos_at (d, pos, __FILE__, __LINE__)]) -#define Dynarr_atp_allow_end(d, pos) \ - (&((d)->base[Dynarr_verify_pos_atp_allow_end (d, pos, __FILE__, __LINE__)])) -#define Dynarr_atp(d, pos) \ - (&((d)->base[Dynarr_verify_pos_atp (d, pos, __FILE__, __LINE__)])) -#else -#define Dynarr_at(d, pos) ((d)->base[pos]) -#define Dynarr_atp(d, pos) (&Dynarr_at (d, pos)) -#define Dynarr_atp_allow_end(d, pos) Dynarr_atp (d, pos) -#endif - -/* Old #define Dynarr_atp(d, pos) (&Dynarr_at (d, pos)) */ -#define Dynarr_begin(d) Dynarr_atp (d, 0) -#define Dynarr_lastp(d) Dynarr_atp (d, Dynarr_length (d) - 1) -#define Dynarr_past_lastp(d) Dynarr_atp_allow_end (d, Dynarr_length (d)) - - -/************* Dynarr length/size retrieval and setting *************/ - -/* Retrieve the length of a dynarr. The `+ 0' is to ensure that this cannot - be used as an lvalue. */ -#define Dynarr_length(d) (Dynarr_verify (d)->len_ + 0) -/* Retrieve the largest ever length seen of a dynarr. The `+ 0' is to - ensure that this cannot be used as an lvalue. */ -#define Dynarr_largest(d) (Dynarr_verify (d)->largest_ + 0) -/* Retrieve the number of elements that fit in the currently allocated - space. The `+ 0' is to ensure that this cannot be used as an lvalue. */ -#define Dynarr_max(d) (Dynarr_verify (d)->max_ + 0) -/* Return the size in bytes of an element in a dynarr. */ -#define Dynarr_elsize(d) (Dynarr_verify (d)->elsize_ + 0) -/* Retrieve the advertised memory usage of a dynarr, i.e. the number of - bytes occupied by the elements in the dynarr, not counting any overhead. */ -#define Dynarr_sizeof(d) (Dynarr_length (d) * Dynarr_elsize (d)) - -/* Actually set the length of a dynarr. This is a low-level routine that - should not be directly used; use Dynarr_set_length() or - Dynarr_set_lengthr() instead. */ -DECLARE_INLINE_HEADER ( -void -Dynarr_set_length_1 (void *d, Elemcount len) -) -{ - Dynarr *dy = Dynarr_verify_mod (d); - dynarr_checking_assert (len >= 0 && len <= Dynarr_max (dy)); - /* Use the raw field references here otherwise we get a crash because - we've set the length but not yet fixed up the largest value. */ - dy->len_ = len; - if (dy->len_ > dy->largest_) - dy->largest_ = dy->len_; - (void) Dynarr_verify_mod (d); -} - -/* "Restricted set-length": Set the length of dynarr D to LEN, - which must be in the range [0, Dynarr_largest(d)]. */ - -DECLARE_INLINE_HEADER ( -void -Dynarr_set_lengthr (void *d, Elemcount len) -) -{ - Dynarr *dy = Dynarr_verify_mod (d); - dynarr_checking_assert (len >= 0 && len <= Dynarr_largest (dy)); - Dynarr_set_length_1 (dy, len); -} - -/* "Restricted increment": Increment the length of dynarr D by 1; the resulting - length must be in the range [0, Dynarr_largest(d)]. */ - -#define Dynarr_incrementr(d) Dynarr_set_lengthr (d, Dynarr_length (d) + 1) - - -MODULE_API void Dynarr_resize (void *d, Elemcount size); - -DECLARE_INLINE_HEADER ( -void -Dynarr_resize_to_fit (void *d, Elemcount size) -) -{ - Dynarr *dy = Dynarr_verify_mod (d); - if (size > Dynarr_max (dy)) - Dynarr_resize (dy, size); -} - -#define Dynarr_resize_to_add(d, numels) \ - Dynarr_resize_to_fit (d, Dynarr_length (d) + numels) - -/* This is an optimization. This is like Dynarr_set_length() but the length - is guaranteed to be at least as big as the existing length. */ - -DECLARE_INLINE_HEADER ( -void -Dynarr_increase_length (void *d, Elemcount len) -) -{ - Dynarr *dy = Dynarr_verify_mod (d); - dynarr_checking_assert (len >= Dynarr_length (dy)); - Dynarr_resize_to_fit (dy, len); - Dynarr_set_length_1 (dy, len); -} - -/* Set the length of dynarr D to LEN. If the length increases, resize as - necessary to fit. (NOTE: This will leave uninitialized memory. If you - aren't planning on immediately overwriting the memory, use - Dynarr_set_length_and_zero() to zero out all the memory that would - otherwise be uninitialized.) */ - -DECLARE_INLINE_HEADER ( -void -Dynarr_set_length (void *d, Elemcount len) -) -{ - Dynarr *dy = Dynarr_verify_mod (d); - Elemcount old_len = Dynarr_length (dy); - if (old_len >= len) - Dynarr_set_lengthr (dy, len); - else - Dynarr_increase_length (d, len); -} - -#define Dynarr_increment(d) Dynarr_increase_length (d, Dynarr_length (d) + 1) - -/* Zero LEN contiguous elements starting at POS. */ - -DECLARE_INLINE_HEADER ( -void -Dynarr_zero_many (void *d, Elemcount pos, Elemcount len) -) -{ - Dynarr *dy = Dynarr_verify_mod (d); - memset ((Rawbyte *) dy->base + pos*Dynarr_elsize (dy), 0, - len*Dynarr_elsize (dy)); -} - -/* This is an optimization. This is like Dynarr_set_length_and_zero() but - the length is guaranteed to be at least as big as the existing - length. */ - -DECLARE_INLINE_HEADER ( -void -Dynarr_increase_length_and_zero (void *d, Elemcount len) -) -{ - Dynarr *dy = Dynarr_verify_mod (d); - Elemcount old_len = Dynarr_length (dy); - Dynarr_increase_length (dy, len); - Dynarr_zero_many (dy, old_len, len - old_len); -} - -/* Set the length of dynarr D to LEN. If the length increases, resize as - necessary to fit and zero out all the elements between the old and new - lengths. */ - -DECLARE_INLINE_HEADER ( -void -Dynarr_set_length_and_zero (void *d, Elemcount len) -) -{ - Dynarr *dy = Dynarr_verify_mod (d); - Elemcount old_len = Dynarr_length (dy); - if (old_len >= len) - Dynarr_set_lengthr (dy, len); - else - Dynarr_increase_length_and_zero (d, len); -} - -/* Reset the dynarr's length to 0. */ -#define Dynarr_reset(d) Dynarr_set_lengthr (d, 0) - -#ifdef MEMORY_USAGE_STATS -struct overhead_stats; -Bytecount Dynarr_memory_usage (void *d, struct overhead_stats *stats); -#endif - -/************* Adding/deleting elements to/from a dynarr *************/ - -/* Set the Lisp implementation of the element at POS in dynarr D. Only - does this if the dynarr holds Lisp objects of a particular type (the - objects themselves, not pointers to them), and only under NEW_GC. */ - -#ifdef NEW_GC -#define DYNARR_SET_LISP_IMP(d, pos) \ -do { \ - if ((d)->lisp_imp) \ - set_lheader_implementation \ - ((struct lrecord_header *)&(((d)->base)[pos]), (d)->lisp_imp); \ -} while (0) -#else -#define DYNARR_SET_LISP_IMP(d, pos) DO_NOTHING -#endif /* (not) NEW_GC */ - -/* Add Element EL to the end of dynarr D. */ - -#define Dynarr_add(d, el) \ -do { \ - Elemcount _da_pos = Dynarr_length (d); \ - (void) Dynarr_verify_mod (d); \ - Dynarr_increment (d); \ - ((d)->base)[_da_pos] = (el); \ - DYNARR_SET_LISP_IMP (d, _da_pos); \ -} while (0) - -/* Set EL as the element at position POS in dynarr D. - Expand the dynarr as necessary so that its length is enough to include - position POS within it, and zero out any new elements created as a - result of expansion, other than the one at POS. */ - -#define Dynarr_set(d, pos, el) \ -do { \ - Elemcount _ds_pos = (pos); \ - (void) Dynarr_verify_mod (d); \ - if (Dynarr_length (d) < _ds_pos + 1) \ - Dynarr_increase_length_and_zero (d, _ds_pos + 1); \ - ((d)->base)[_ds_pos] = (el); \ - DYNARR_SET_LISP_IMP (d, _ds_pos); \ -} while (0) - -/* Add LEN contiguous elements, stored at BASE, to dynarr D. If BASE is - NULL, reserve space but don't store anything. */ - -DECLARE_INLINE_HEADER ( -void -Dynarr_add_many (void *d, const void *base, Elemcount len) -) -{ - /* This duplicates Dynarr_insert_many to some extent; but since it is - called so often, it seemed useful to remove the unnecessary stuff - from that function and to make it inline */ - Dynarr *dy = Dynarr_verify_mod (d); - Elemcount pos = Dynarr_length (dy); - Dynarr_increase_length (dy, Dynarr_length (dy) + len); - if (base) - memcpy ((Rawbyte *) dy->base + pos*Dynarr_elsize (dy), base, - len*Dynarr_elsize (dy)); -} - -/* Insert LEN elements, currently pointed to by BASE, into dynarr D - starting at position POS. */ - -MODULE_API void Dynarr_insert_many (void *d, const void *base, Elemcount len, - Elemcount pos); - -/* Prepend LEN elements, currently pointed to by BASE, to the beginning. */ - -#define Dynarr_prepend_many(d, base, len) Dynarr_insert_many (d, base, len, 0) - -/* Add literal string S to dynarr D, which should hold chars or unsigned - chars. The final zero byte is not stored. */ - -#define Dynarr_add_literal_string(d, s) Dynarr_add_many (d, s, sizeof (s) - 1) - -/* Convert Lisp string S to an external encoding according to CODESYS and - add to dynarr D, which should hold chars or unsigned chars. No final - zero byte is appended. */ - -/* #### This should be an inline function but LISP_STRING_TO_SIZED_EXTERNAL - isn't declared yet. */ - -#define Dynarr_add_ext_lisp_string(d, s, codesys) \ -do { \ - Lisp_Object dyna_ls_s = (s); \ - Lisp_Object dyna_ls_cs = (codesys); \ - Extbyte *dyna_ls_eb; \ - Bytecount dyna_ls_bc; \ - \ - LISP_STRING_TO_SIZED_EXTERNAL (dyna_ls_s, dyna_ls_eb, \ - dyna_ls_bc, dyna_ls_cs); \ - Dynarr_add_many (d, dyna_ls_eb, dyna_ls_bc); \ -} while (0) - -/* Delete LEN elements starting at position POS. */ - -MODULE_API void Dynarr_delete_many (void *d, Elemcount pos, Elemcount len); - -/* Pop off (i.e. delete) the last element from the dynarr and return it */ - -#define Dynarr_pop(d) \ - (dynarr_checking_assert (Dynarr_length (d) > 0), \ - Dynarr_verify_mod (d)->len_--, \ - Dynarr_at (d, Dynarr_length (d))) - -/* Delete the item at POS */ - -#define Dynarr_delete(d, pos) Dynarr_delete_many (d, pos, 1) - -/* Delete the item located at memory address P, which must be a `type *' - pointer, where `type' is the type of the elements of the dynarr. */ -#define Dynarr_delete_by_pointer(d, p) \ - Dynarr_delete_many (d, (p) - ((d)->base), 1) - -/* Delete all elements that are numerically equal to EL. */ - -#define Dynarr_delete_object(d, el) \ -do \ -{ \ - REGISTER int i; \ - for (i = Dynarr_length (d) - 1; i >= 0; i--) \ - { \ - if (el == Dynarr_at (d, i)) \ - Dynarr_delete_many (d, i, 1); \ - } \ -} while (0) +#include "array.h" /************* Dynarr typedefs *************/ @@ -2383,7 +1832,7 @@ } face_cachel_dynarr; #ifdef NEW_GC -DECLARE_LRECORD (face_cachel_dynarr, face_cachel_dynarr); +DECLARE_LISP_OBJECT (face_cachel_dynarr, face_cachel_dynarr); #define XFACE_CACHEL_DYNARR(x) \ XRECORD (x, face_cachel_dynarr, face_cachel_dynarr) #define wrap_face_cachel_dynarr(p) wrap_record (p, face_cachel_dynarr) @@ -2398,7 +1847,7 @@ } glyph_cachel_dynarr; #ifdef NEW_GC -DECLARE_LRECORD (glyph_cachel_dynarr, glyph_cachel_dynarr); +DECLARE_LISP_OBJECT (glyph_cachel_dynarr, glyph_cachel_dynarr); #define XGLYPH_CACHEL_DYNARR(x) \ XRECORD (x, glyph_cachel_dynarr, glyph_cachel_dynarr) #define wrap_glyph_cachel_dynarr(p) wrap_record (p, glyph_cachel_dynarr) @@ -2426,12 +1875,6 @@ } Lisp_Object_ptr_dynarr; -/************* Stack-like malloc/free: Another allocator *************/ - -void *stack_like_malloc (Bytecount size); -void stack_like_free (void *val); - - /************************************************************************/ /** Definitions of other basic Lisp objects **/ /************************************************************************/ @@ -2459,7 +1902,7 @@ struct Lisp_Cons { - struct lrecord_header lheader; + FROB_BLOCK_LISP_OBJECT_HEADER lheader; Lisp_Object car_, cdr_; }; typedef struct Lisp_Cons Lisp_Cons; @@ -2476,7 +1919,7 @@ }; #endif -DECLARE_MODULE_API_LRECORD (cons, Lisp_Cons); +DECLARE_MODULE_API_LISP_OBJECT (cons, Lisp_Cons); #define XCONS(x) XRECORD (x, cons, Lisp_Cons) #define wrap_cons(p) wrap_record (p, cons) #define CONSP(x) RECORDP (x, cons) @@ -3014,13 +2457,13 @@ #ifdef NEW_GC struct Lisp_String_Direct_Data { - struct lrecord_header header; + NORMAL_LISP_OBJECT_HEADER header; Bytecount size; Ibyte data[1]; }; typedef struct Lisp_String_Direct_Data Lisp_String_Direct_Data; -DECLARE_MODULE_API_LRECORD (string_direct_data, Lisp_String_Direct_Data); +DECLARE_MODULE_API_LISP_OBJECT (string_direct_data, Lisp_String_Direct_Data); #define XSTRING_DIRECT_DATA(x) \ XRECORD (x, string_direct_data, Lisp_String_Direct_Data) #define wrap_string_direct_data(p) wrap_record (p, string_direct_data) @@ -3034,13 +2477,13 @@ struct Lisp_String_Indirect_Data { - struct lrecord_header header; + NORMAL_LISP_OBJECT_HEADER header; Bytecount size; Ibyte *data; }; typedef struct Lisp_String_Indirect_Data Lisp_String_Indirect_Data; -DECLARE_MODULE_API_LRECORD (string_indirect_data, Lisp_String_Indirect_Data); +DECLARE_MODULE_API_LISP_OBJECT (string_indirect_data, Lisp_String_Indirect_Data); #define XSTRING_INDIRECT_DATA(x) \ XRECORD (x, string_indirect_data, Lisp_String_Indirect_Data) #define wrap_string_indirect_data(p) wrap_record (p, string_indirect_data) @@ -3080,7 +2523,9 @@ struct { /* WARNING: Everything before ascii_begin must agree exactly with - struct lrecord_header */ + struct lrecord_header. (Actually, the `free' field in old-GC + overlaps with ascii_begin there; we can get away with this + because in old-GC the `free' field is used only for lcrecords. */ unsigned int type :8; #ifdef NEW_GC unsigned int lisp_readonly :1; @@ -3115,7 +2560,7 @@ #define MAX_STRING_ASCII_BEGIN ((1 << 21) - 1) #endif /* not NEW_GC */ -DECLARE_MODULE_API_LRECORD (string, Lisp_String); +DECLARE_MODULE_API_LISP_OBJECT (string, Lisp_String); #define XSTRING(x) XRECORD (x, string, Lisp_String) #define wrap_string(p) wrap_record (p, string) #define STRINGP(x) RECORDP (x, string) @@ -3188,13 +2633,13 @@ struct Lisp_Vector { - struct LCRECORD_HEADER header; + NORMAL_LISP_OBJECT_HEADER header; long size; Lisp_Object contents[1]; }; typedef struct Lisp_Vector Lisp_Vector; -DECLARE_LRECORD (vector, Lisp_Vector); +DECLARE_LISP_OBJECT (vector, Lisp_Vector); #define XVECTOR(x) XRECORD (x, vector, Lisp_Vector) #define wrap_vector(p) wrap_record (p, vector) #define VECTORP(x) RECORDP (x, vector) @@ -3225,13 +2670,13 @@ struct Lisp_Bit_Vector { - struct LCRECORD_HEADER lheader; + NORMAL_LISP_OBJECT_HEADER lheader; Elemcount size; unsigned long bits[1]; }; typedef struct Lisp_Bit_Vector Lisp_Bit_Vector; -DECLARE_LRECORD (bit_vector, Lisp_Bit_Vector); +DECLARE_LISP_OBJECT (bit_vector, Lisp_Bit_Vector); #define XBIT_VECTOR(x) XRECORD (x, bit_vector, Lisp_Bit_Vector) #define wrap_bit_vector(p) wrap_record (p, bit_vector) #define BIT_VECTORP(x) RECORDP (x, bit_vector) @@ -3279,7 +2724,7 @@ /* For when we want to include a bit vector in another structure, and we know it's of a fixed size. */ #define DECLARE_INLINE_LISP_BIT_VECTOR(numbits) struct { \ - struct LCRECORD_HEADER lheader; \ + NORMAL_LISP_OBJECT_HEADER lheader; \ Elemcount size; \ unsigned long bits[BIT_VECTOR_LONG_STORAGE(numbits)]; \ } @@ -3314,7 +2759,7 @@ typedef struct Lisp_Symbol Lisp_Symbol; struct Lisp_Symbol { - struct lrecord_header lheader; + FROB_BLOCK_LISP_OBJECT_HEADER lheader; /* next symbol in this obarray bucket */ Lisp_Symbol *next; Lisp_Object name; @@ -3330,7 +2775,7 @@ XSTRING_LENGTH (symbol_name (XSYMBOL (sym)))))) #define KEYWORDP(obj) (SYMBOLP (obj) && SYMBOL_IS_KEYWORD (obj)) -DECLARE_MODULE_API_LRECORD (symbol, Lisp_Symbol); +DECLARE_MODULE_API_LISP_OBJECT (symbol, Lisp_Symbol); #define XSYMBOL(x) XRECORD (x, symbol, Lisp_Symbol) #define wrap_symbol(p) wrap_record (p, symbol) #define SYMBOLP(x) RECORDP (x, symbol) @@ -3358,7 +2803,7 @@ struct Lisp_Subr { - struct lrecord_header lheader; + FROB_BLOCK_LISP_OBJECT_HEADER lheader; short min_args; short max_args; /* #### We should make these const Ascbyte * or const Ibyte *, not const @@ -3370,7 +2815,7 @@ }; typedef struct Lisp_Subr Lisp_Subr; -DECLARE_LRECORD (subr, Lisp_Subr); +DECLARE_LISP_OBJECT (subr, Lisp_Subr); #define XSUBR(x) XRECORD (x, subr, Lisp_Subr) #define wrap_subr(p) wrap_record (p, subr) #define SUBRP(x) RECORDP (x, subr) @@ -3388,7 +2833,7 @@ typedef struct Lisp_Marker Lisp_Marker; struct Lisp_Marker { - struct lrecord_header lheader; + FROB_BLOCK_LISP_OBJECT_HEADER lheader; Lisp_Marker *next; Lisp_Marker *prev; struct buffer *buffer; @@ -3396,7 +2841,7 @@ char insertion_type; }; -DECLARE_MODULE_API_LRECORD (marker, Lisp_Marker); +DECLARE_MODULE_API_LISP_OBJECT (marker, Lisp_Marker); #define XMARKER(x) XRECORD (x, marker, Lisp_Marker) #define wrap_marker(p) wrap_record (p, marker) #define MARKERP(x) RECORDP (x, marker) @@ -3458,8 +2903,18 @@ x = wrong_type_argument (Qnatnump, x); \ } while (0) +END_C_DECLS + +/* -------------- properties of internally-formatted text ------------- */ + +#include "text.h" + /*------------------------------- char ---------------------------------*/ +BEGIN_C_DECLS + +#ifdef ERROR_CHECK_TYPES + /* NOTE: There are basic functions for converting between a character and the string representation of a character in text.h, as well as lots of other character-related stuff. There are other functions/macros for @@ -3467,31 +2922,6 @@ Ichar, the length of an Ichar when converted to text, etc. */ -#ifdef MULE - -MODULE_API int non_ascii_valid_ichar_p (Ichar ch); - -/* Return whether the given Ichar is valid. - */ - -DECLARE_INLINE_HEADER ( -int -valid_ichar_p (Ichar ch) -) -{ - return (! (ch & ~0xFF)) || non_ascii_valid_ichar_p (ch); -} - -#else /* not MULE */ - -/* This works when CH is negative, and correctly returns non-zero only when CH - is in the range [0, 255], inclusive. */ -#define valid_ichar_p(ch) (! (ch & ~0xFF)) - -#endif /* not MULE */ - -#ifdef ERROR_CHECK_TYPES - DECLARE_INLINE_HEADER ( int CHARP_1 (Lisp_Object obj, const Ascbyte *file, int line) @@ -3646,12 +3076,12 @@ struct Lisp_Float { - struct lrecord_header lheader; + FROB_BLOCK_LISP_OBJECT_HEADER lheader; union { double d; struct Lisp_Float *unused_next_; } data; }; typedef struct Lisp_Float Lisp_Float; -DECLARE_LRECORD (float, Lisp_Float); +DECLARE_LISP_OBJECT (float, Lisp_Float); #define XFLOAT(x) XRECORD (x, float, Lisp_Float) #define wrap_float(p) wrap_record (p, float) #define FLOATP(x) RECORDP (x, float) @@ -3734,7 +3164,7 @@ struct weak_box { - struct LCRECORD_HEADER header; + NORMAL_LISP_OBJECT_HEADER header; Lisp_Object value; Lisp_Object next_weak_box; /* don't mark through this! */ @@ -3744,7 +3174,7 @@ Lisp_Object make_weak_box (Lisp_Object value); Lisp_Object weak_box_ref (Lisp_Object value); -DECLARE_LRECORD (weak_box, struct weak_box); +DECLARE_LISP_OBJECT (weak_box, struct weak_box); #define XWEAK_BOX(x) XRECORD (x, weak_box, struct weak_box) #define XSET_WEAK_BOX(x, v) (XWEAK_BOX (x)->value = (v)) #define wrap_weak_box(p) wrap_record (p, weak_box) @@ -3756,7 +3186,7 @@ struct ephemeron { - struct LCRECORD_HEADER header; + NORMAL_LISP_OBJECT_HEADER header; Lisp_Object key; @@ -3781,7 +3211,7 @@ Lisp_Object zap_finalize_list(void); Lisp_Object make_ephemeron(Lisp_Object key, Lisp_Object value, Lisp_Object finalizer); -DECLARE_LRECORD(ephemeron, struct ephemeron); +DECLARE_LISP_OBJECT(ephemeron, struct ephemeron); #define XEPHEMERON(x) XRECORD (x, ephemeron, struct ephemeron) #define XEPHEMERON_REF(x) (XEPHEMERON (x)->value) #define XEPHEMERON_NEXT(x) (XCDR (XEPHEMERON(x)->cons_chain)) @@ -3815,13 +3245,13 @@ struct weak_list { - struct LCRECORD_HEADER header; + NORMAL_LISP_OBJECT_HEADER header; Lisp_Object list; /* don't mark through this! */ enum weak_list_type type; Lisp_Object next_weak; /* don't mark through this! */ }; -DECLARE_LRECORD (weak_list, struct weak_list); +DECLARE_LISP_OBJECT (weak_list, struct weak_list); #define XWEAK_LIST(x) XRECORD (x, weak_list, struct weak_list) #define wrap_weak_list(p) wrap_record (p, weak_list) #define WEAK_LISTP(x) RECORDP (x, weak_list) @@ -3839,37 +3269,6 @@ END_C_DECLS /************************************************************************/ -/* Definitions related to the format of text and of characters */ -/************************************************************************/ - -/* Note: - - "internally formatted text" and the term "internal format" in - general are likely to refer to the format of text in buffers and - strings; "externally formatted text" and the term "external format" - refer to any text format used in the O.S. or elsewhere outside of - XEmacs. The format of text and of a character are related and - there must be a one-to-one relationship (hopefully through a - relatively simple algorithmic means of conversion) between a string - of text and an equivalent array of characters, but the conversion - between the two is NOT necessarily trivial. - - In a non-Mule XEmacs, allowed characters are numbered 0 through - 255, where no fixed meaning is assigned to them, but (when - representing text, rather than bytes in a binary file) in practice - the lower half represents ASCII and the upper half some other 8-bit - character set (chosen by setting the font, case tables, syntax - tables, etc. appropriately for the character set through ad-hoc - means such as the `iso-8859-1' file and the - `standard-display-european' function). - - #### Finish this. - - */ -#include "text.h" - - -/************************************************************************/ /* Definitions of primitive Lisp functions and variables */ /************************************************************************/ @@ -3976,7 +3375,6 @@ 1, /* mark bit */ \ 1, /* c_readonly bit */ \ 1, /* lisp_readonly bit */ \ - 0 /* unused */ \ }, \ min_args, \ max_args, \ @@ -3996,7 +3394,6 @@ 1, /* mark bit */ \ 1, /* c_readonly bit */ \ 1, /* lisp_readonly bit */ \ - 0 /* unused */ \ }, \ min_args, \ max_args, \ @@ -4051,6 +3448,136 @@ while (NILP (Ffunctionp (fun))) \ signal_invalid_function_error (fun); \ } while (0) + +/************************************************************************/ +/* Parsing keyword arguments */ +/************************************************************************/ + +/* The C subr must have been declared with MANY as its max args, and this + PARSE_KEYWORDS call must come before any statements. + + FUNCTION is the name of the current function, as a symbol. + + NARGS is the count of arguments supplied to FUNCTION. + + ARGS is a pointer to the argument vector (not a Lisp vector) supplied to + FUNCTION. + + KEYWORDS_OFFSET is the offset into ARGS where the keyword arguments start. + + KEYWORD_COUNT is the number of keywords FUNCTION is normally prepared to + handle. + + KEYWORDS is a parenthesised list of those keywords, without the initial + Q_. + + KEYWORD_DEFAULTS allows you to set non-nil defaults. Put (keywordname = + initial_value) in this parameter, a collection of C statements surrounded + by parentheses and separated by the comma operator. If you don't need + this, supply NULL as KEYWORD_DEFAULTS. + + ALLOW_OTHER_KEYS corresponds to the &allow-other-keys argument list + entry in defun*; it is 1 if other keys are normally allowed, 0 + otherwise. This may be overridden in the caller by specifying + :allow-other-keys t in the argument list. + + For keywords which appear multiple times in the called argument list, the + leftmost one overrides, as specified in section 7.1.1 of the CLHS. + + If you want to check whether a given keyword argument was set (as in the + SVAR argument to defun*), supply Qunbound as its default in + KEYWORD_DEFAULTS, and examine it once PARSE_KEYWORDS is done. Lisp code + cannot supply Qunbound as an argument, so if it is still Qunbound, it was + not set. + + There is no elegant way with this macro to have one name for the keyword + and an unrelated name for the local variable, as is possible with the + ((:keyword unrelated-var)) syntax in defun* and in Common Lisp. That + shouldn't matter in practice. */ + +#define PARSE_KEYWORDS(function, nargs, args, keywords_offset, \ + keyword_count, keywords, keyword_defaults, \ + allow_other_keys) \ + DECLARE_N_KEYWORDS_##keyword_count keywords; \ + \ + do \ + { \ + Lisp_Object pk_key, pk_value; \ + Elemcount pk_i = nargs - 1; \ + Boolint pk_allow_other_keys = allow_other_keys; \ + \ + if ((nargs - keywords_offset) & 1) \ + { \ + if (!allow_other_keys \ + && !(pk_allow_other_keys \ + = non_nil_allow_other_keys_p (keywords_offset, \ + nargs, args))) \ + { \ + signal_wrong_number_of_arguments_error (function, nargs); \ + } \ + else \ + { \ + /* Ignore the trailing arg; so below always sees an even \ + number of arguments. */ \ + pk_i -= 1; \ + } \ + } \ + \ + (void)(keyword_defaults); \ + \ + /* Start from the end, because the leftmost element overrides. */ \ + while (pk_i > keywords_offset) \ + { \ + pk_value = args[pk_i--]; \ + pk_key = args[pk_i--]; \ + \ + if (0) {} \ + CHECK_N_KEYWORDS_##keyword_count keywords \ + else if (allow_other_keys || pk_allow_other_keys) \ + { \ + continue; \ + } \ + else if (!(pk_allow_other_keys \ + = non_nil_allow_other_keys_p (keywords_offset, \ + nargs, args))) \ + { \ + invalid_keyword_argument (function, pk_key); \ + } \ + } \ + } while (0) + +#define DECLARE_N_KEYWORDS_1(a) \ + Lisp_Object a = Qnil +#define DECLARE_N_KEYWORDS_2(a,b) \ + DECLARE_N_KEYWORDS_1(a), b = Qnil +#define DECLARE_N_KEYWORDS_3(a,b,c) \ + DECLARE_N_KEYWORDS_2(a,b), c = Qnil +#define DECLARE_N_KEYWORDS_4(a,b,c,d) \ + DECLARE_N_KEYWORDS_3(a,b,c), d = Qnil +#define DECLARE_N_KEYWORDS_5(a,b,c,d,e) \ + DECLARE_N_KEYWORDS_4(a,b,c,d), e = Qnil +#define DECLARE_N_KEYWORDS_6(a,b,c,d,e,f) \ + DECLARE_N_KEYWORDS_5(a,b,c,d,e), f = Qnil +#define DECLARE_N_KEYWORDS_7(a,b,c,d,e,f,g) \ + DECLARE_N_KEYWORDS_6(a,b,c,d,e,f), g = Qnil + +#define CHECK_N_KEYWORDS_1(a) \ + else if (EQ (pk_key, Q_##a)) { a = pk_value; } +#define CHECK_N_KEYWORDS_2(a,b) CHECK_N_KEYWORDS_1(a) \ + else if (EQ (pk_key, Q_##b)) { b = pk_value; } +#define CHECK_N_KEYWORDS_3(a,b,c) CHECK_N_KEYWORDS_2(a,b) \ + else if (EQ (pk_key, Q_##c)) { c = pk_value; } +#define CHECK_N_KEYWORDS_4(a,b,c,d) CHECK_N_KEYWORDS_3(a,b,c) \ + else if (EQ (pk_key, Q_##d)) { d = pk_value; } +#define CHECK_N_KEYWORDS_5(a,b,c,d,e) CHECK_N_KEYWORDS_4(a,b,c,d) \ + else if (EQ (pk_key, Q_##e)) { e = pk_value; } +#define CHECK_N_KEYWORDS_6(a,b,c,d,e,f) CHECK_N_KEYWORDS_5(a,b,c,d,e) \ + else if (EQ (pk_key, Q_##f)) { f = pk_value; } +#define CHECK_N_KEYWORDS_7(a,b,c,d,e,f,g) CHECK_N_KEYWORDS_6(a,b,c,d,e,f) \ + else if (EQ (pk_key, Q_##g)) { g = pk_value; } + +Boolint non_nil_allow_other_keys_p (Elemcount offset, int nargs, + Lisp_Object *args); /************************************************************************/ @@ -4645,8 +4172,6 @@ number of header files that need to be included -- good for a number of reasons. --ben */ -/*--------------- prototypes for various public c functions ------------*/ - /* Prototypes for all init/syms_of/vars_of initialization functions. */ #include "symsinit.h" @@ -4667,6 +4192,7 @@ MODULE_API EXFUN (Fmake_vector, 2); MODULE_API EXFUN (Fvector, MANY); +void deadbeef_memory (void *ptr, Bytecount size); #ifndef NEW_GC void release_breathing_space (void); #endif /* not NEW_GC */ @@ -4688,19 +4214,21 @@ MODULE_API Lisp_Object list3 (Lisp_Object, Lisp_Object, Lisp_Object); MODULE_API Lisp_Object list4 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object); -MODULE_API Lisp_Object list5 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, - Lisp_Object); -MODULE_API Lisp_Object list6 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, +MODULE_API Lisp_Object list5 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object); +MODULE_API Lisp_Object list6 (Lisp_Object, Lisp_Object, Lisp_Object, + Lisp_Object, Lisp_Object, Lisp_Object); +MODULE_API Lisp_Object listn (int numargs, ...); +MODULE_API Lisp_Object listu (Lisp_Object, ...); DECLARE_DOESNT_RETURN (memory_full (void)); void disksave_object_finalization (void); +void finish_object_memory_usage_stats (void); extern int purify_flag; #ifndef NEW_GC extern EMACS_INT gc_generation_number[1]; #endif /* not NEW_GC */ int c_readonly (Lisp_Object); int lisp_readonly (Lisp_Object); -MODULE_API void copy_lisp_object (Lisp_Object dst, Lisp_Object src); MODULE_API Lisp_Object build_istring (const Ibyte *); MODULE_API Lisp_Object build_cistring (const CIbyte *); MODULE_API Lisp_Object build_ascstring (const Ascbyte *); @@ -4717,21 +4245,6 @@ void free_marker (Lisp_Object); int object_dead_p (Lisp_Object); void mark_object (Lisp_Object obj); -#ifndef NEW_GC -#ifdef USE_KKCC -#ifdef DEBUG_XEMACS -void kkcc_gc_stack_push_lisp_object_1 (Lisp_Object obj, int level, int pos); -#define kkcc_gc_stack_push_lisp_object(obj, level, pos) \ - kkcc_gc_stack_push_lisp_object_1 (obj, level, pos) -void kkcc_backtrace (void); -#else -void kkcc_gc_stack_push_lisp_object_1 (Lisp_Object obj); -#define kkcc_gc_stack_push_lisp_object(obj, level, pos) \ - kkcc_gc_stack_push_lisp_object_1 (obj) -#define kkcc_backtrace() -#endif -#endif /* USE_KKCC */ -#endif /* not NEW_GC */ int marked_p (Lisp_Object obj); extern int funcall_allocation_flag; extern int need_to_garbage_collect; @@ -4740,10 +4253,7 @@ extern Lisp_Object Qpost_gc_hook, Qgarbage_collecting; void recompute_funcall_allocation_flag (void); -#ifdef MEMORY_USAGE_STATS -Bytecount malloced_storage_size (void *, Bytecount, struct overhead_stats *); -Bytecount fixed_type_block_overhead (Bytecount); -#endif +Bytecount malloced_storage_size (void *, Bytecount, struct usage_stats *); #ifdef EVENT_DATA_AS_OBJECTS Lisp_Object make_key_data (void); @@ -4806,6 +4316,7 @@ extern Lisp_Object Qbefore_change_function, Qbefore_change_functions; extern Lisp_Object Qbuffer_or_string_p, Qdefault_directory, Qfirst_change_hook; extern Lisp_Object Qpermanent_local, Vafter_change_function; +extern Lisp_Object Qbuffer_live_p; extern Lisp_Object Vafter_change_functions, Vbefore_change_function; extern Lisp_Object Vbefore_change_functions, Vbuffer_alist, Vbuffer_defaults; extern Lisp_Object Vinhibit_read_only, Vtransient_mark_mode; @@ -4821,6 +4332,12 @@ /* Defined in callint.c */ EXFUN (Fcall_interactively, 3); EXFUN (Fprefix_numeric_value, 1); +extern Lisp_Object Qcall_interactively; +extern Lisp_Object Qmouse_leave_buffer_hook; +extern Lisp_Object Qread_from_minibuffer; +extern Lisp_Object Vcommand_history; +extern Lisp_Object Vcurrent_prefix_arg; +extern Lisp_Object Vmark_even_if_inactive; /* Defined in casefiddle.c */ EXFUN (Fdowncase, 2); @@ -4835,12 +4352,28 @@ /* Defined in chartab.c */ EXFUN (Freset_char_table, 1); +extern Lisp_Object Qcategory_designator_p; +extern Lisp_Object Qcategory_table_value_p; + +/* Defined in cmdloop.c */ +extern Lisp_Object Qdisabled_command_hook; +extern Lisp_Object Qreally_early_error_handler; +extern Lisp_Object Qtop_level; +extern Lisp_Object Vdisabled_command_hook; /* Defined in cmds.c */ EXFUN (Fbeginning_of_line, 2); EXFUN (Fend_of_line, 2); EXFUN (Fforward_char, 2); EXFUN (Fforward_line, 2); +extern Lisp_Object Qself_insert_command; + +/* Defined in console.c */ +extern Lisp_Object Qconsole_live_p; +extern Lisp_Object Vconsole_list; + +/* Defined in console-stream.c */ +extern Lisp_Object Vstdio_str; /* Defined in data.c */ EXFUN (Fadd1, 1); @@ -4908,7 +4441,8 @@ Qcircular_list, Qcircular_property_list, Qconversion_error, Qcyclic_variable_indirection, Qdomain_error, Qediting_error, Qend_of_buffer, Qend_of_file, Qerror, Qfile_error, Qinternal_error, - Qinvalid_change, Qinvalid_constant, Qinvalid_function, Qinvalid_operation, + Qinvalid_change, Qinvalid_constant, Qinvalid_function, + Qinvalid_keyword_argument, Qinvalid_operation, Qinvalid_read_syntax, Qinvalid_state, Qio_error, Qlist_formation_error, Qmalformed_list, Qmalformed_property_list, Qno_catch, Qout_of_memory, Qoverflow_error, Qprinting_unreadable_object, Qquit, Qrange_error, @@ -4916,8 +4450,18 @@ Qstructure_formation_error, Qtext_conversion_error, Qunderflow_error, Qvoid_function, Qvoid_variable, Qwrong_number_of_arguments, Qwrong_type_argument; +extern Lisp_Object Qcdr; +extern Lisp_Object Qerror_lacks_explanatory_string; +extern Lisp_Object Qfile_error; +extern Lisp_Object Qsequencep; extern MODULE_API Lisp_Object Qinvalid_argument, Qsyntax_error; +/* Defined in device.c */ +extern Lisp_Object Qdevice_live_p; + +/* Defined in device-x.c */ +extern Lisp_Object Vx_initial_argv_list; + /* Defined in dired.c */ Lisp_Object make_directory_hash_table (const Ibyte *); Lisp_Object wasteful_word_to_lisp (unsigned int); @@ -4930,6 +4474,7 @@ Lisp_Object name_reloc, int standard_doc_file); Lisp_Object read_doc_string (Lisp_Object); +extern Lisp_Object Vinternal_doc_file_name; /* Defined in doprnt.c */ Bytecount emacs_doprnt_va (Lisp_Object stream, const Ibyte *format_nonreloc, @@ -5002,10 +4547,16 @@ Lisp_Object save_restriction_restore (Lisp_Object); void widen_buffer (struct buffer *b, int no_clip); int beginning_of_line_p (struct buffer *b, Charbpos pt); - -/* Defined in emacsfns.c */ Lisp_Object save_current_buffer_restore (Lisp_Object); +extern Lisp_Object Qformat; +extern Lisp_Object Qmark; +extern Lisp_Object Qpoint; +extern Lisp_Object Qregion_beginning; +extern Lisp_Object Qregion_end; +extern Lisp_Object Quser_files_and_directories; +extern Lisp_Object Vsystem_name; + /* Defined in emacs.c */ EXFUN_NORETURN (Fkill_emacs, 1); EXFUN (Frunning_temacs_p, 0); @@ -5029,12 +4580,31 @@ DECLARE_DOESNT_RETURN (really_abort (void)); void zero_out_command_line_status_vars (void); +extern Lisp_Object Qsave_buffers_kill_emacs; +extern Lisp_Object Vcommand_line_args; +extern Lisp_Object Vconfigure_info_directory; +extern Lisp_Object Vconfigure_site_directory; +extern Lisp_Object Vconfigure_site_module_directory; +extern Lisp_Object Vdata_directory; +extern Lisp_Object Vdoc_directory; +extern Lisp_Object Vemacs_major_version; +extern Lisp_Object Vemacs_minor_version; +extern Lisp_Object Vexec_directory; +extern Lisp_Object Vexec_path; +extern Lisp_Object Vinvocation_directory; +extern Lisp_Object Vinvocation_name; +extern Lisp_Object Vmodule_directory; +extern Lisp_Object Vsite_directory; +extern Lisp_Object Vsite_module_directory; + /* Defined in emodules.c */ #ifdef HAVE_SHLIB EXFUN (Flist_modules, 0); EXFUN (Fload_module, 3); extern int unloading_module; #endif +extern Lisp_Object Qdll_error; +extern Lisp_Object Qmodule; /* Defined in eval.c */ MODULE_API EXFUN (Fapply, MANY); @@ -5136,6 +4706,8 @@ Lisp_Object frob2)); void maybe_invalid_argument (const Ascbyte *, Lisp_Object, Lisp_Object, Error_Behavior); +MODULE_API DECLARE_DOESNT_RETURN (invalid_keyword_argument (Lisp_Object fun, + Lisp_Object kw)); MODULE_API DECLARE_DOESNT_RETURN (invalid_operation (const Ascbyte *reason, Lisp_Object frob)); MODULE_API DECLARE_DOESNT_RETURN (invalid_operation_2 (const Ascbyte *reason, @@ -5345,8 +4917,23 @@ ...) PRINTF_ARGS (3, 4); extern int backtrace_with_internal_sections; +extern Lisp_Object Qand_optional; +extern Lisp_Object Qand_rest; +extern Lisp_Object Qautoload; +extern Lisp_Object Qcommandp; +extern Lisp_Object Qdefun; +extern Lisp_Object Qexit; +extern Lisp_Object Qinhibit_quit; +extern Lisp_Object Qinteractive; +extern Lisp_Object Qmacro; +extern Lisp_Object Qprogn; +extern Lisp_Object Qrun_hooks; +extern Lisp_Object Qvalues; extern Lisp_Object Vdebug_on_error; extern Lisp_Object Vstack_trace_on_error; +extern Lisp_Object Vautoload_queue; + +extern MODULE_API Lisp_Object Vinhibit_quit, Vquit_flag; /* Defined in event-stream.c */ EXFUN (Faccept_process_output, 3); @@ -5368,6 +4955,19 @@ Lisp_Object, int, int, int, int); extern int modifier_keys_are_sticky; +extern Lisp_Object Qdisabled; +extern Lisp_Object Qsans_modifiers; +extern Lisp_Object Qself_insert_defer_undo; +extern Lisp_Object Vcontrolling_terminal; +extern Lisp_Object Vcurrent_mouse_event; +extern Lisp_Object Vlast_command; +extern Lisp_Object Vlast_command_char; +extern Lisp_Object Vlast_command_event; +extern Lisp_Object Vlast_input_event; +extern Lisp_Object Vrecent_keys_ring; +extern Lisp_Object Vthis_command_keys; +extern Lisp_Object Vunread_command_event; + /* Defined in event-Xt.c */ void signal_special_Xt_user_event (Lisp_Object, Lisp_Object, Lisp_Object); @@ -5382,6 +4982,22 @@ EXFUN (Fevent_x_pixel, 1); EXFUN (Fevent_y_pixel, 1); +extern Lisp_Object Qevent_live_p; + + +/* Defined in extents.c */ +extern Lisp_Object Qend_open; +extern Lisp_Object Qextent_live_p; +extern Lisp_Object Qstart_open; + +/* Defined in faces.c */ +extern Lisp_Object Qbackground; +extern Lisp_Object Qbackground_pixmap; +extern Lisp_Object Qblinking; +extern Lisp_Object Qdim; +extern Lisp_Object Qdisplay_table; +extern Lisp_Object Qforeground; +extern Lisp_Object Qunderline; /* Defined in file-coding.c */ EXFUN (Fcoding_category_list, 0); @@ -5469,6 +5085,9 @@ Ibyte *find_end_of_directory_component (const Ibyte *path, Bytecount len); +extern Lisp_Object Qfile_name_sans_extension; +extern Lisp_Object Vdirectory_sep_char; + /* Defined in filelock.c */ EXFUN (Funlock_buffer, 0); @@ -5529,7 +5148,7 @@ EXFUN (Fsort, 2); EXFUN (Fstring_equal, 2); EXFUN (Fstring_lessp, 2); -EXFUN (Fsubstring, 3); +EXFUN (Fsubseq, 3); EXFUN (Fvalid_plist_p, 1); Lisp_Object list_sort (Lisp_Object, Lisp_Object, @@ -5580,15 +5199,48 @@ Lisp_Object add_prefix_to_symbol (const Ascbyte *ascii_string, Lisp_Object symbol); +extern Lisp_Object Qidentity; +extern Lisp_Object Qstring_lessp; +extern Lisp_Object Qyes_or_no_p; +extern Lisp_Object Vfeatures; + +/* Defined in frame.c */ +extern Lisp_Object Qframe_live_p; + /* Defined in free-hook.c */ EXFUN (Freally_free, 1); +/* Defined in general.c */ +#define SYMBOL(fou) extern Lisp_Object fou +#define SYMBOL_MODULE_API(fou) extern MODULE_API Lisp_Object fou +#define SYMBOL_KEYWORD(la_cle_est_fou) extern Lisp_Object la_cle_est_fou +#define SYMBOL_GENERAL(tout_le_monde, est_fou) \ + extern Lisp_Object tout_le_monde + +#include "general-slots.h" + +#undef SYMBOL +#undef SYMBOL_MODULE_API +#undef SYMBOL_KEYWORD +#undef SYMBOL_GENERAL + /* Defined in glyphs.c */ EXFUN (Fmake_glyph_internal, 1); Error_Behavior decode_error_behavior_flag (Lisp_Object); Lisp_Object encode_error_behavior_flag (Error_Behavior); +extern Lisp_Object Qbuffer_glyph_p; +extern Lisp_Object Qcolor_pixmap_image_instance_p; +extern Lisp_Object Qicon_glyph_p; +extern Lisp_Object Qmono_pixmap_image_instance_p; +extern Lisp_Object Qnothing_image_instance_p; +extern Lisp_Object Qpointer_glyph_p; +extern Lisp_Object Qpointer_image_instance_p; +extern Lisp_Object Qsubwindow; +extern Lisp_Object Qsubwindow_image_instance_p; +extern Lisp_Object Qtext_image_instance_p; + /* Defined in glyphs-shared.c */ void shared_resource_validate (Lisp_Object instantiator); Lisp_Object shared_resource_normalize (Lisp_Object inst, @@ -5597,11 +5249,17 @@ Lisp_Object tag); extern Lisp_Object Q_resource_type, Q_resource_id; +/* Defined in glyphs-widget.c */ +extern Lisp_Object Qlayout; +extern Lisp_Object Qnative_layout; + /* Defined in gui.c */ DECLARE_DOESNT_RETURN (gui_error (const Ascbyte *reason, Lisp_Object frob)); DECLARE_DOESNT_RETURN (gui_error_2 (const Ascbyte *reason, Lisp_Object frob0, Lisp_Object frob1)); +extern Lisp_Object Qgui_error; + /* Defined in indent.c */ EXFUN (Findent_to, 3); EXFUN (Fvertical_motion, 3); @@ -5656,9 +5314,22 @@ # define LOADHIST_ATTACH(x) #endif /*! LOADHIST */ +extern Lisp_Object Qfeaturep; +extern Lisp_Object Qload; +extern Lisp_Object Qread_char; +extern Lisp_Object Qstandard_input; +extern Lisp_Object Vcurrent_load_list; +extern Lisp_Object Vfile_domain; +extern Lisp_Object Vload_file_name_internal; +extern Lisp_Object Vload_history; +extern Lisp_Object Vload_path; +extern Lisp_Object Vstandard_input; + /* Defined in macros.c */ EXFUN (Fexecute_kbd_macro, 2); +extern Lisp_Object Vexecuting_macro; + /* Defined in marker.c */ EXFUN (Fcopy_marker, 2); EXFUN (Fmake_marker, 0); @@ -5675,11 +5346,18 @@ Lisp_Object noseeum_copy_marker (Lisp_Object, Lisp_Object); Lisp_Object set_marker_restricted (Lisp_Object, Lisp_Object, Lisp_Object); #ifdef MEMORY_USAGE_STATS -int compute_buffer_marker_usage (struct buffer *, struct overhead_stats *); +Bytecount compute_buffer_marker_usage (struct buffer *b); #endif void init_buffer_markers (struct buffer *b); void uninit_buffer_markers (struct buffer *b); +/* Defined in menubar.c */ +extern Lisp_Object Qactivate_menubar_hook; +extern Lisp_Object Qcurrent_menubar; +extern Lisp_Object Vactivate_menubar_hook; +extern Lisp_Object Vblank_menubar; +extern Lisp_Object Vmenubar_configuration; + /* Defined in minibuf.c */ extern int minibuf_level; Charcount scmp_1 (const Ibyte *, const Ibyte *, Charcount, int); @@ -5704,10 +5382,26 @@ void message_no_translate (const char *, ...) PRINTF_ARGS (1, 2); void clear_message (void); +extern Lisp_Object Qcompletion_ignore_case; +extern Lisp_Object Vecho_area_buffer; +extern Lisp_Object Vminibuf_preprompt; +extern Lisp_Object Vminibuf_prompt; +extern Lisp_Object Vminibuffer_zero; + /* Defined in mule-charset.c */ EXFUN (Fmake_charset, 3); extern Lisp_Object Ql2r, Qr2l; +extern Lisp_Object Qdirection; +extern Lisp_Object Qfinal; +extern Lisp_Object Qgraphic; +extern Lisp_Object Qlong_name; +extern Lisp_Object Qregistries; +extern Lisp_Object Qreverse_direction_charset; +extern Lisp_Object Qshort_name; + +/* Defined in nt.c */ +extern Lisp_Object Vmswindows_get_true_file_attributes; /* Defined in print.c */ EXFUN (Fdisplay_error, 2); @@ -5778,13 +5472,30 @@ Lisp_Object (*) (Lisp_Object), Lisp_Object, Lisp_Object); void float_to_string (char *, double); -void internal_object_printer (Lisp_Object, Lisp_Object, int); -MODULE_API DECLARE_DOESNT_RETURN (printing_unreadable_object (const CIbyte *, +void internal_object_printer (Lisp_Object obj, Lisp_Object printcharfun, + int UNUSED (escapeflag)); +void external_object_printer (Lisp_Object obj, Lisp_Object printcharfun, + int UNUSED (escapeflag)); +MODULE_API DECLARE_DOESNT_RETURN (printing_unreadable_object_fmt (const CIbyte *, ...)) PRINTF_ARGS (1, 2); -DECLARE_DOESNT_RETURN (printing_unreadable_lcrecord (Lisp_Object obj, +DECLARE_DOESNT_RETURN (printing_unreadable_lisp_object (Lisp_Object obj, const Ibyte *name)); +extern Lisp_Object Qexternal_debugging_output; +extern Lisp_Object Qprint_length; +extern Lisp_Object Qprint_string_length; +extern Lisp_Object Qstandard_output; +extern Lisp_Object Vprint_length; +extern Lisp_Object Vprint_level; +extern Lisp_Object Vstandard_output; + +/* Defined in process.c */ +extern Lisp_Object Qnetwork_error; +extern MODULE_API Lisp_Object Qprocess_error; +extern Lisp_Object Vprocess_environment; +extern Lisp_Object Vshell_file_name; + /* Defined in rangetab.c */ EXFUN (Fclear_range_table, 1); EXFUN (Fget_range_table, 3); @@ -5846,6 +5557,9 @@ void init_device_sound (struct device *); DECLARE_DOESNT_RETURN (report_sound_error (const Ascbyte *, Lisp_Object)); +extern Lisp_Object Qsound_error; +extern Lisp_Object Vsynchronous_sounds; + /* Defined in specifier.c */ EXFUN (Fadd_spec_to_specifier, 5); EXFUN (Fspecifier_spec_list, 4); @@ -5889,6 +5603,14 @@ int function_p, Lisp_Object follow_past_lisp_magic); +extern Lisp_Object Qconst_specifier; +extern Lisp_Object Qmakunbound; +extern Lisp_Object Qset; +extern Lisp_Object Qvariable_documentation; +extern Lisp_Object Qvariable_domain; +extern MODULE_API Lisp_Object Qt, Qunbound; +extern Lisp_Object Vobarray; + /* Defined in syntax.c */ Charbpos scan_words (struct buffer *, Charbpos, int); EXFUN (Fchar_syntax, 2); @@ -6286,6 +6008,9 @@ MODULE_API int find_pos_of_existing_active_alloca_convert (const char * srctext); +/* Defined in undo.c */ +extern Lisp_Object Qinhibit_read_only; + /* Defined in unicode.c */ extern const struct sized_memory_description to_unicode_description; extern const struct sized_memory_description from_unicode_description; @@ -6296,9 +6021,9 @@ extern Lisp_Object Qutf_16, Qutf_8, Qucs_4, Qutf_7, Qutf_32; #ifdef MEMORY_USAGE_STATS Bytecount compute_from_unicode_table_size (Lisp_Object charset, - struct overhead_stats *stats); + struct usage_stats *stats); Bytecount compute_to_unicode_table_size (Lisp_Object charset, - struct overhead_stats *stats); + struct usage_stats *stats); #endif /* MEMORY_USAGE_STATS */ /* Defined in undo.c */ @@ -6323,139 +6048,11 @@ /* Defined in vm-limit.c */ void memory_warnings (void *, void (*) (const char *)); -/*--------------- prototypes for constant symbols ------------*/ - -/* #### We should get rid of this and put the prototypes back up there in - #### the per-file stuff, where they belong. */ - -/* Use the following when you have to add a bunch of symbols. */ - -/* - -(defun redo-symbols (beg end) - "Snarf any symbols out of the region and print them into a temporary buffer, -which is displayed when the function finishes. The symbols are laid out with -`extern Lisp_Object ' before each one, with as many as can fit on one line -\(the maximum line width is controlled by the constant `max-line-length' in the -code)." - (interactive "r") - (save-excursion - (goto-char beg) - (let (syms) - (while (re-search-forward "\\s-\\(Q[A-Za-z_0-9]+\\)" end t) - (push (match-string 1) syms)) - (setq syms (sort syms #'string-lessp)) - (with-output-to-temp-buffer "*Symbols*" - (let* ((col 0) - (start "extern Lisp_Object ") - (startlen (length start)) - ;; with a default-width frame of 80 chars, you can only fit - ;; 79 before wrapping. you can see this to a lower value if - ;; you don't want it right up against the right margin. - (max-line-length 79)) - (dolist (sym syms) - (cond (;; if something already on line (this will always be the - ;; case except the very first iteration), see what - ;; space we've got. (need to take into account 2 - ;; for the comma+space, 1 for the semicolon at the - ;; end.) if enough space, do it. - (and (> col 0) (< (+ col (length sym) 2) - (1- max-line-length))) - (princ ", ") - (princ sym) - (incf col 2) - (incf col (length sym))) - (t - ;; either we're first iteration or we ran out of space. - ;; if the latter, terminate the previous line. this - ;; loop is written on purpose so that it always prints - ;; at least one item, even if that would go over. - (when (> col 0) - (princ ";\n") - (setq col 0)) - (princ start) - (incf col startlen) - (princ sym) - (incf col (length sym))))) - ;; finally terminate the last line. - (princ ";\n")))))) - -*/ - -extern Lisp_Object Qactivate_menubar_hook, Qand_optional, Qand_rest, Qautoload, - Qbackground, Qbackground_pixmap, Qblinking, Qbuffer_glyph_p, Qbuffer_live_p, - Qcall_interactively, Qcategory_designator_p, - Qcategory_table_value_p, Qcdr, Qcolor_pixmap_image_instance_p, Qcommandp, - Qcompletion_ignore_case, Qconsole_live_p, Qconst_specifier, Qcurrent_menubar, - Qdefun, Qdevice_live_p, Qdim, Qdirection, Qdisabled, Qdisabled_command_hook, - Qdisplay_table, Qdll_error, Qend_open, Qerror_lacks_explanatory_string, - Qevent_live_p, Qexit, Qextent_live_p, Qexternal_debugging_output, Qfeaturep, - Qfile_error, Qfile_name_sans_extension, Qfinal, Qforeground, Qformat, - Qframe_live_p, Qgraphic, Qgui_error, Qicon_glyph_p, Qidentity, Qinhibit_quit, - Qinhibit_read_only, Qinteractive, Qlayout, Qload, Qlong_name, Qmacro, - Qmakunbound, Qmark, Qmodule, Qmono_pixmap_image_instance_p, - Qmouse_leave_buffer_hook, Qnative_layout, Qnetwork_error, - Qnothing_image_instance_p, Qpoint, Qpointer_glyph_p, - Qpointer_image_instance_p, Qprint_length, Qprint_string_length, Qprogn, - Qread_char, Qread_from_minibuffer, Qreally_early_error_handler, - Qregion_beginning, Qregion_end, Qregistries, Qreverse_direction_charset, - Qrun_hooks, Qsans_modifiers, Qsave_buffers_kill_emacs, Qself_insert_command, - Qself_insert_defer_undo, Qsequencep, Qset, Qshort_name, Qsound_error, - Qstandard_input, Qstandard_output, Qstart_open, Qstring_lessp, Qsubwindow, - Qsubwindow_image_instance_p, Qtext_image_instance_p, Qtop_level, Qunderline, - Quser_files_and_directories, Qvalues, Qvariable_documentation, - Qvariable_domain, Qwindow_live_p, Qyes_or_no_p; - -extern MODULE_API Lisp_Object Qprocess_error, Qt, Qunbound; - -#define SYMBOL(fou) extern Lisp_Object fou -#define SYMBOL_MODULE_API(fou) extern MODULE_API Lisp_Object fou -#define SYMBOL_KEYWORD(la_cle_est_fou) extern Lisp_Object la_cle_est_fou -#define SYMBOL_GENERAL(tout_le_monde, est_fou) \ - extern Lisp_Object tout_le_monde - -#include "general-slots.h" - -#undef SYMBOL -#undef SYMBOL_MODULE_API -#undef SYMBOL_KEYWORD -#undef SYMBOL_GENERAL - -/*--------------- prototypes for variables of type Lisp_Object ------------*/ - -/* #### We should get rid of this and put the prototypes back up there in - #### the per-file stuff, where they belong. */ - -extern Lisp_Object Vactivate_menubar_hook; -extern Lisp_Object Vautoload_queue, Vblank_menubar; -extern Lisp_Object Vcommand_history; -extern Lisp_Object Vcommand_line_args, Vconfigure_info_directory; -extern Lisp_Object Vconfigure_site_directory, Vconfigure_site_module_directory; -extern Lisp_Object Vconsole_list, Vcontrolling_terminal; -extern Lisp_Object Vcurrent_load_list; -extern Lisp_Object Vcurrent_mouse_event, Vcurrent_prefix_arg, Vdata_directory; -extern Lisp_Object Vdirectory_sep_char, Vdisabled_command_hook; -extern Lisp_Object Vdoc_directory, Vinternal_doc_file_name; -extern Lisp_Object Vecho_area_buffer, Vemacs_major_version; -extern Lisp_Object Vemacs_minor_version, Vexec_directory, Vexec_path; -extern Lisp_Object Vexecuting_macro, Vfeatures, Vfile_domain; -extern Lisp_Object Vinvocation_directory, Vinvocation_name; -extern Lisp_Object Vlast_command, Vlast_command_char; -extern Lisp_Object Vlast_command_event, Vlast_input_event; -extern Lisp_Object Vload_file_name_internal, Vload_history; -extern Lisp_Object Vload_path, Vmark_even_if_inactive, Vmenubar_configuration; -extern Lisp_Object Vminibuf_preprompt, Vminibuf_prompt, Vminibuffer_zero; -extern Lisp_Object Vmodule_directory, Vmswindows_downcase_file_names; -extern Lisp_Object Vmswindows_get_true_file_attributes, Vobarray; -extern Lisp_Object Vprint_length, Vprint_level, Vprocess_environment; -extern Lisp_Object Vrecent_keys_ring, Vshell_file_name, Vsite_directory; -extern Lisp_Object Vsite_module_directory; -extern Lisp_Object Vstandard_input, Vstandard_output, Vstdio_str; -extern Lisp_Object Vsynchronous_sounds, Vsystem_name; -extern Lisp_Object Vthis_command_keys, Vunread_command_event; -extern Lisp_Object Vx_initial_argv_list; - -extern MODULE_API Lisp_Object Vinhibit_quit, Vquit_flag; +/* Defined in win32.c */ +extern Lisp_Object Vmswindows_downcase_file_names; + +/* Defined in window.c */ +extern Lisp_Object Qwindow_live_p; END_C_DECLS