comparison src/lisp.h @ 853:2b6fa2618f76

[xemacs-hg @ 2002-05-28 08:44:22 by ben] merge my stderr-proc ws make-docfile.c: Fix places where we forget to check for EOF. code-init.el: Don't use CRLF conversion by default on process output. CMD.EXE and friends work both ways but Cygwin programs don't like the CRs. code-process.el, multicast.el, process.el: Removed. Improvements to call-process-internal: -- allows a buffer to be specified for input and stderr output -- use it on all systems -- implement C-g as documented -- clean up and comment call-process-region uses new call-process facilities; no temp file. remove duplicate funs in process.el. comment exactly how coding systems work and fix various problems. open-multicast-group now does similar coding-system frobbing to open-network-stream. dumped-lisp.el, faces.el, msw-faces.el: Fix some hidden errors due to code not being defined at the right time. xemacs.mak: Add -DSTRICT. ================================================================ ALLOW SEPARATION OF STDOUT AND STDERR IN PROCESSES ================================================================ Standard output and standard error can be processed separately in a process. Each can have its own buffer, its own mark in that buffer, and its filter function. You can specify a separate buffer for stderr in `start-process' to get things started, or use the new primitives: set-process-stderr-buffer process-stderr-buffer process-stderr-mark set-process-stderr-filter process-stderr-filter Also, process-send-region takes a 4th optional arg, a buffer. Currently always uses a pipe() under Unix to read the error output. (#### Would a PTY be better?) sysdep.h, sysproc.h, unexfreebsd.c, unexsunos4.c, nt.c, emacs.c, callproc.c, symsinit.h, sysdep.c, Makefile.in.in, process-unix.c: Delete callproc.c. Move child_setup() to process-unix.c. wait_for_termination() now only needed on a few really old systems. console-msw.h, event-Xt.c, event-msw.c, event-stream.c, event-tty.c, event-unixoid.c, events.h, process-nt.c, process-unix.c, process.c, process.h, procimpl.h: Rewrite the process methods to handle a separate channel for error input. Create Lstreams for reading in the error channel. Many process methods need change. In general the changes are fairly clear as they involve duplicating what's used for reading the normal stdout and changing for stderr -- although tedious, as such changes are required throughout the entire process code. Rewrote the code that reads process output to do two loops, one for stdout and one for stderr. gpmevent.c, tooltalk.c: set_process_filter takes an argument for stderr. ================================================================ NEW ERROR-TRAPPING MECHANISM ================================================================ Totally rewrite error trapping code to be unified and support more features. Basic function is call_trapping_problems(), which lets you specify, by means of flags, what sorts of problems you want trapped. these can include -- quit -- errors -- throws past the function -- creation of "display objects" (e.g. buffers) -- deletion of already-existing "display objects" (e.g. buffers) -- modification of already-existing buffers -- entering the debugger -- gc -- errors->warnings (ala suspended errors) etc. All other error funs rewritten in terms of this one. Various older mechanisms removed or rewritten. window.c, insdel.c, console.c, buffer.c, device.c, frame.c: When creating a display object, added call to note_object_created(), for use with trapping_problems mechanism. When deleting, call check_allowed_operation() and note_object deleted(). The trapping-problems code records the objects created since the call-trapping-problems began. Those objects can be deleted, but none others (i.e. previously existing ones). bytecode.c, cmdloop.c: internal_catch takes another arg. eval.c: Add long comments describing the "five lists" used to maintain state (backtrace, gcpro, specbind, etc.) in the Lisp engine. backtrace.h, eval.c: Implement trapping-problems mechanism, eliminate old mechanisms or redo in terms of new one. frame.c, gutter.c: Flush out the concept of "critical display section", defined by the in_display() var. Use an internal_bind() to get it reset, rather than just doing it at end, because there may be a non-local exit. event-msw.c, event-stream.c, console-msw.h, device.c, dialog-msw.c, frame.c, frame.h, intl.c, toolbar.c, menubar-msw.c, redisplay.c, alloc.c, menubar-x.c: Make use of new trapping-errors stuff and rewrite code based on old mechanisms. glyphs-widget.c, redisplay.h: Protect calling Lisp in redisplay. insdel.c: Protect hooks against deleting existing buffers. frame-msw.c: Use EQ, not EQUAL in hash tables whose keys are just numbers. Otherwise we run into stickiness in redisplay because internal_equal() can QUIT. ================================================================ SIGNAL, C-G CHANGES ================================================================ Here we change the way that C-g interacts with event reading. The idea is that a C-g occurring while we're reading a user event should be read as C-g, but elsewhere should be a QUIT. The former code did all sorts of bizarreness -- requiring that no QUIT occurs anywhere in event-reading code (impossible to enforce given the stuff called or Lisp code invoked), and having some weird system involving enqueue/dequeue of a C-g and interaction with Vquit_flag -- and it didn't work. Now, we simply enclose all code where we want C-g read as an event with {begin/end}_dont_check_for_quit(). This completely turns off the mechanism that checks (and may remove or alter) C-g in the read-ahead queues, so we just get the C-g normal. Signal.c documents this very carefully. cmdloop.c: Correct use of dont_check_for_quit to new scheme, remove old out-of-date comments. event-stream.c: Fix C-g handling to actually work. device-x.c: Disable quit checking when err out. signal.c: Cleanup. Add large descriptive comment. process-unix.c, process-nt.c, sysdep.c: Use QUIT instead of REALLY_QUIT. It's not necessary to use REALLY_QUIT and just confuses the issue. lisp.h: Comment quit handlers. ================================================================ CONS CHANGES ================================================================ free_cons() now takes a Lisp_Object not the result of XCONS(). car and cdr have been renamed so that they don't get used directly; go through XCAR(), XCDR() instead. alloc.c, dired.c, editfns.c, emodules.c, fns.c, glyphs-msw.c, glyphs-x.c, glyphs.c, keymap.c, minibuf.c, search.c, eval.c, lread.c, lisp.h: Correct free_cons calling convention: now takes Lisp_Object, not Lisp_Cons chartab.c: Eliminate direct use of ->car, ->cdr, should be black box. callint.c: Rewrote using EXTERNAL_LIST_LOOP to avoid use of Lisp_Cons. ================================================================ USE INTERNAL-BIND-* ================================================================ eval.c: Cleanups of these funs. alloc.c, fileio.c, undo.c, specifier.c, text.c, profile.c, lread.c, redisplay.c, menubar-x.c, macros.c: Rewrote to use internal_bind_int() and internal_bind_lisp_object() in place of whatever varied and cumbersome mechanisms were formerly there. ================================================================ SPECBIND SANITY ================================================================ backtrace.h: - Improved comments backtrace.h, bytecode.c, eval.c: Add new mechanism check_specbind_stack_sanity() for sanity checking code each time the catchlist or specbind stack change. Removed older prototype of same mechanism. ================================================================ MISC ================================================================ lisp.h, insdel.c, window.c, device.c, console.c, buffer.c: Fleshed out authorship. device-msw.c: Correct bad Unicode-ization. print.c: Be more careful when not initialized or in fatal error handling. search.c: Eliminate running_asynch_code, an FSF holdover. alloc.c: Added comments about gc-cons-threshold. dialog-x.c: Use begin_gc_forbidden() around code to build up a widget value tree, like in menubar-x.c. gui.c: Use Qunbound not Qnil as the default for gethash. lisp-disunion.h, lisp-union.h: Added warnings on use of VOID_TO_LISP(). lisp.h: Use ERROR_CHECK_STRUCTURES to turn on ERROR_CHECK_TRAPPING_PROBLEMS and ERROR_CHECK_TYPECHECK lisp.h: Add assert_with_message. lisp.h: Add macros for gcproing entire arrays. (You could do this before but it required manual twiddling the gcpro structure.) lisp.h: Add prototypes for new functions defined elsewhere.
author ben
date Tue, 28 May 2002 08:45:36 +0000
parents e7ee5f8bde58
children 2c12fe2da451
comparison
equal deleted inserted replaced
852:d83885ef293b 853:2b6fa2618f76
19 along with XEmacs; see the file COPYING. If not, write to 19 along with XEmacs; see the file COPYING. If not, write to
20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */ 21 Boston, MA 02111-1307, USA. */
22 22
23 /* Synched up with: FSF 19.30. */ 23 /* Synched up with: FSF 19.30. */
24
25 /* Authorship:
26
27 Based on code from pre-release FSF 19, c. 1991.
28 Various changes by Jamie Zawinski 1991-1994:
29 converting to ANSI C, splitting out function prototypes to a separate
30 file (later moved back for unknown reasons by Steve Baur?), debug-gcpro
31 stuff (now moribund).
32 ANSI-fication of DEFUN macros by Felix Lee, c. 1992?
33 NOT_REACHED, DOESNT_RETURN, PRINTF_ARGS by Richard Mlynarik, c. 1994.
34 Many changes over the years corresponding to Lisp_Object definition
35 changes, esp. by Richard Mlynarik (c. 1993) and Kyle Jones (c. 1998).
36 See alloc.c for more details.
37 Overhauled and reordered by Ben Wing, 1995-1996, and many things added:
38 Dynarrs, REALLOC macros, asserts, typedefs, inline header code,
39 first LIST_LOOP macros, CONCHECK_*, all error-checking code
40 (e.g. error-checking versions of XFOO macros), structure read syntax,
41 weak lists, lcrecord lists, reworking of quit handling, object hashing,
42 nested GCPRO, character objects and Ebola checking, memory usage stats,
43 others.
44 LOADHIST changes from Steve Baur, c. 1997?
45 Various macro-related changes by Martin Buchholz, 1998-1999:
46 LIST_LOOP macros greatly expanded and tortoise-hared;
47 RETURN_SANS_WARNINGS; reworked DEFUN macros; EXFUN macros (???).
48 */
24 49
25 #ifndef INCLUDED_lisp_h_ 50 #ifndef INCLUDED_lisp_h_
26 #define INCLUDED_lisp_h_ 51 #define INCLUDED_lisp_h_
27 52
28 /************************************************************************/ 53 /************************************************************************/
42 #include <ctype.h> 67 #include <ctype.h>
43 #include <stdarg.h> 68 #include <stdarg.h>
44 #include <stddef.h> /* offsetof */ 69 #include <stddef.h> /* offsetof */
45 #include <sys/types.h> 70 #include <sys/types.h>
46 #include <limits.h> 71 #include <limits.h>
72
73 /* --------------------- error-checking sublevels --------------------- */
74
75 /* The large categories established by configure can be subdivided into
76 smaller subcategories, for problems in specific modules. You can't
77 control this using configure, but you can manually stick in a define as
78 necessary. */
79
80 #ifdef ERROR_CHECK_STRUCTURES
81 /* Check for problems with the catch list and specbind stack */
82 #define ERROR_CHECK_CATCH
83 /* Check for insufficient use of call_trapping_problems(), particularly
84 due to glyph-related changes causing eval or QUIT within redisplay */
85 #define ERROR_CHECK_TRAPPING_PROBLEMS
86 #endif
47 87
48 /* ------------------------ definition of EMACS_INT ------------------- */ 88 /* ------------------------ definition of EMACS_INT ------------------- */
49 89
50 /* EMACS_INT is the underlying integral type into which a Lisp_Object must fit. 90 /* EMACS_INT is the underlying integral type into which a Lisp_Object must fit.
51 In particular, it must be large enough to contain a pointer. 91 In particular, it must be large enough to contain a pointer.
893 /* Highly dubious kludge */ 933 /* Highly dubious kludge */
894 /* (thanks, Jamie, I feel better now -- ben) */ 934 /* (thanks, Jamie, I feel better now -- ben) */
895 void assert_failed (const char *, int, const char *); 935 void assert_failed (const char *, int, const char *);
896 # define abort() (assert_failed (__FILE__, __LINE__, "abort()")) 936 # define abort() (assert_failed (__FILE__, __LINE__, "abort()"))
897 # define assert(x) ((x) ? (void) 0 : assert_failed (__FILE__, __LINE__, #x)) 937 # define assert(x) ((x) ? (void) 0 : assert_failed (__FILE__, __LINE__, #x))
938 # define assert_with_message(x, msg) \
939 ((x) ? (void) 0 : assert_failed (__FILE__, __LINE__, msg))
898 # define assert_at_line(x, file, line) \ 940 # define assert_at_line(x, file, line) \
899 ((x) ? (void) 0 : assert_failed (file, line, #x)) 941 ((x) ? (void) 0 : assert_failed (file, line, #x))
900 #else 942 #else
901 # ifdef DEBUG_XEMACS 943 # ifdef DEBUG_XEMACS
902 # define assert(x) ((x) ? (void) 0 : (void) abort ()) 944 # define assert(x) ((x) ? (void) 0 : (void) abort ())
945 # define assert_with_message(x, msg) ((x) ? (void) 0 : (void) abort ())
903 # define assert_at_line(x, file, line) assert (x) 946 # define assert_at_line(x, file, line) assert (x)
904 # else 947 # else
905 # define assert(x) ((void) 0) 948 # define assert(x) ((void) 0)
949 # define assert_with_message(x, msg)
906 # define assert_at_line(x, file, line) assert (x) 950 # define assert_at_line(x, file, line) assert (x)
907 # endif 951 # endif
952 #endif
953
954 /* ####
955 Why the hell do we do this??????????????????????????????? */
956 /*#ifdef DEBUG_XEMACS*/
957 #define REGISTER
958 #define register
959 /*#else*/
960 /*#define REGISTER register*/
961 /*#endif*/
962
963
964 /* EMACS_INT is the underlying integral type into which a Lisp_Object must fit.
965 In particular, it must be large enough to contain a pointer.
966 config.h can override this, e.g. to use `long long' for bigger lisp ints.
967
968 #### In point of fact, it would NOT be a good idea for config.h to mess
969 with EMACS_INT. A lot of code makes the basic assumption that EMACS_INT
970 is the size of a pointer. */
971
972 #ifndef SIZEOF_EMACS_INT
973 # define SIZEOF_EMACS_INT SIZEOF_VOID_P
908 #endif 974 #endif
909 975
910 #if 0 976 #if 0
911 #ifdef USE_ASSERTIONS 977 #ifdef USE_ASSERTIONS
912 /* Highly dubious kludge */ 978 /* Highly dubious kludge */
1142 #ifdef MEMORY_USAGE_STATS 1208 #ifdef MEMORY_USAGE_STATS
1143 struct overhead_stats; 1209 struct overhead_stats;
1144 Bytecount Dynarr_memory_usage (void *d, struct overhead_stats *stats); 1210 Bytecount Dynarr_memory_usage (void *d, struct overhead_stats *stats);
1145 #endif 1211 #endif
1146 1212
1147 1213 /* Counts of bytes or chars */
1148 /************************************************************************/
1149 /* typedefs */
1150 /************************************************************************/
1151 1214
1152 /* Note that the simplest typedefs are near the top of this file. */ 1215 /* Note that the simplest typedefs are near the top of this file. */
1153 1216
1154 /* We put typedefs here so that prototype declarations don't choke. 1217 /* We put typedefs here so that prototype declarations don't choke.
1155 Note that we don't actually declare the structures here (except 1218 Note that we don't actually declare the structures here (except
1491 /* In a cons, the markbit of the car is the gc mark bit */ 1554 /* In a cons, the markbit of the car is the gc mark bit */
1492 1555
1493 struct Lisp_Cons 1556 struct Lisp_Cons
1494 { 1557 {
1495 struct lrecord_header lheader; 1558 struct lrecord_header lheader;
1496 Lisp_Object car, cdr; 1559 Lisp_Object car_, cdr_;
1497 }; 1560 };
1498 typedef struct Lisp_Cons Lisp_Cons; 1561 typedef struct Lisp_Cons Lisp_Cons;
1499 1562
1500 #if 0 /* FSFmacs */ 1563 #if 0 /* FSFmacs */
1501 /* Like a cons, but records info on where the text lives that it was read from */ 1564 /* Like a cons, but records info on where the text lives that it was read from */
1520 #define MARK_CONS(c) MARK_RECORD_HEADER (&((c)->lheader)) 1583 #define MARK_CONS(c) MARK_RECORD_HEADER (&((c)->lheader))
1521 1584
1522 extern Lisp_Object Qnil; 1585 extern Lisp_Object Qnil;
1523 1586
1524 #define NILP(x) EQ (x, Qnil) 1587 #define NILP(x) EQ (x, Qnil)
1525 #define XCAR(a) (XCONS (a)->car) 1588 #define cons_car(a) ((a)->car_)
1526 #define XCDR(a) (XCONS (a)->cdr) 1589 #define cons_cdr(a) ((a)->cdr_)
1590 #define XCAR(a) (XCONS (a)->car_)
1591 #define XCDR(a) (XCONS (a)->cdr_)
1592 #define XSETCAR(a, b) (XCONS (a)->car_ = (b))
1593 #define XSETCDR(a, b) (XCONS (a)->cdr_ = (b))
1527 #define LISTP(x) (CONSP(x) || NILP(x)) 1594 #define LISTP(x) (CONSP(x) || NILP(x))
1528 1595
1529 #define CHECK_LIST(x) do { \ 1596 #define CHECK_LIST(x) do { \
1530 if (!LISTP (x)) \ 1597 if (!LISTP (x)) \
1531 dead_wrong_type_argument (Qlistp, x); \ 1598 dead_wrong_type_argument (Qlistp, x); \
2161 2228
2162 /* Number of longs required to hold LEN bits */ 2229 /* Number of longs required to hold LEN bits */
2163 #define BIT_VECTOR_LONG_STORAGE(len) \ 2230 #define BIT_VECTOR_LONG_STORAGE(len) \
2164 (((len) + LONGBITS_POWER_OF_2 - 1) >> LONGBITS_LOG2) 2231 (((len) + LONGBITS_POWER_OF_2 - 1) >> LONGBITS_LOG2)
2165 2232
2233
2166 /*------------------------------ symbol --------------------------------*/ 2234 /*------------------------------ symbol --------------------------------*/
2167 2235
2168 typedef struct Lisp_Symbol Lisp_Symbol; 2236 typedef struct Lisp_Symbol Lisp_Symbol;
2169 struct Lisp_Symbol 2237 struct Lisp_Symbol
2170 { 2238 {
2204 #define XSYMBOL_PLIST(s) (XSYMBOL (s)->plist) 2272 #define XSYMBOL_PLIST(s) (XSYMBOL (s)->plist)
2205 2273
2206 2274
2207 /*------------------------------- subr ---------------------------------*/ 2275 /*------------------------------- subr ---------------------------------*/
2208 2276
2277 /* A function that takes no arguments and returns a Lisp_Object.
2278 We could define such types for n arguments, if needed. */
2209 typedef Lisp_Object (*lisp_fn_t) (void); 2279 typedef Lisp_Object (*lisp_fn_t) (void);
2210 2280
2211 struct Lisp_Subr 2281 struct Lisp_Subr
2212 { 2282 {
2213 struct lrecord_header lheader; 2283 struct lrecord_header lheader;
2691 2761
2692 /************************************************************************/ 2762 /************************************************************************/
2693 /* Checking for QUIT */ 2763 /* Checking for QUIT */
2694 /************************************************************************/ 2764 /************************************************************************/
2695 2765
2766 /* The exact workings of this mechanism are described in detail in signal.c. */
2767
2696 /* Asynchronous events set something_happened, and then are processed 2768 /* Asynchronous events set something_happened, and then are processed
2697 within the QUIT macro. At this point, we are guaranteed to not be in 2769 within the QUIT macro. At this point, we are guaranteed to not be in
2698 any sensitive code. */ 2770 any sensitive code. */
2699 2771
2700 extern volatile int something_happened; 2772 extern volatile int something_happened;
2701 extern int dont_check_for_quit; 2773 extern int dont_check_for_quit;
2702 int check_what_happened (void); 2774 void check_what_happened (void);
2703 2775
2704 extern volatile int quit_check_signal_happened; 2776 extern volatile int quit_check_signal_happened;
2705 extern volatile int quit_check_signal_tick_count; 2777 extern volatile int quit_check_signal_tick_count;
2706 int check_quit (void); 2778 void check_quit (void);
2707 2779
2708 void signal_quit (void); 2780 void signal_quit (void);
2709 2781
2782 extern int dont_check_for_quit;
2783 int begin_dont_check_for_quit (void);
2784 int begin_do_check_for_quit (void);
2785
2786 /* Nonzero if the values of `quit-flag' and `inhibit-quit' indicate
2787 that a quit should be signalled. */
2710 #define QUIT_FLAG_SAYS_SHOULD_QUIT \ 2788 #define QUIT_FLAG_SAYS_SHOULD_QUIT \
2711 (!NILP (Vquit_flag) && \ 2789 (!NILP (Vquit_flag) && \
2712 (NILP (Vinhibit_quit) \ 2790 (NILP (Vinhibit_quit) \
2713 || (EQ (Vquit_flag, Qcritical) && !dont_check_for_quit))) 2791 || (EQ (Vquit_flag, Qcritical) && !dont_check_for_quit)))
2714 2792
2715 /* Nonzero if ought to quit now. */ 2793 /* Nonzero if ought to quit now. This is the "efficient" version, which
2794 respects the flags set to indicate whether the full quit check should
2795 be done. Therefore it may be inaccurate (i.e. lagging reality), esp.
2796 when poll for quit is used.
2797
2798 This is defined for code that wants to allow quitting, but needs to
2799 do some cleanup if that happens. (You could always register the cleanup
2800 code using record_unwind_protect(), but sometimes it makes more sense
2801 to do it using QUITP.) To use this macro, just call it at the
2802 appropriate time, and if its value is non-zero, do your cleanup code
2803 and then call QUIT.
2804
2805 A different version (below) is used for the actual QUIT macro. */
2716 #define QUITP \ 2806 #define QUITP \
2717 ((quit_check_signal_happened ? check_quit () : 0), \ 2807 ((quit_check_signal_happened ? check_quit () : (void) 0), \
2718 QUIT_FLAG_SAYS_SHOULD_QUIT) 2808 QUIT_FLAG_SAYS_SHOULD_QUIT)
2719 2809
2720 /* QUIT used to call QUITP, but there are some places where QUITP 2810 /* This is the version actually called by QUIT. The difference
2721 is called directly, and check_what_happened() should only be called 2811 between it and QUITP is that it also has side effects in that it
2722 when Emacs is actually ready to quit because it could do things 2812 will handle anything else that has recently signalled itself
2723 like switch threads. */ 2813 asynchronously and wants to be handled now. Currently this
2814 includes executing asynchronous timeouts that may have been set
2815 from Lisp or from the poll-for-quit or poll-for-sigchld
2816 timers. (#### It seems that, to be slightly more accurate, we
2817 should also process poll-for-quit timers in the above version.
2818 However, this mechanism is inherently approximate, so it really
2819 doesn't matter much.) In the future, it might also include doing a
2820 thread context switch. Callers of QUITP generally don't except
2821 random side effects to happen, so we have this different
2822 version. */
2724 #define INTERNAL_QUITP \ 2823 #define INTERNAL_QUITP \
2725 ((something_happened ? check_what_happened () : 0), \ 2824 ((something_happened ? check_what_happened () : (void) 0), \
2726 QUIT_FLAG_SAYS_SHOULD_QUIT) 2825 QUIT_FLAG_SAYS_SHOULD_QUIT)
2727 2826
2728 #define INTERNAL_REALLY_QUITP \
2729 (check_what_happened (), \
2730 QUIT_FLAG_SAYS_SHOULD_QUIT)
2731
2732 /* Check quit-flag and quit if it is non-nil. Also do any other things 2827 /* Check quit-flag and quit if it is non-nil. Also do any other things
2733 that might have gotten queued until it was safe. */ 2828 that are triggered by asynchronous events and might want to be
2829 handled. */
2734 #define QUIT do { if (INTERNAL_QUITP) signal_quit (); } while (0) 2830 #define QUIT do { if (INTERNAL_QUITP) signal_quit (); } while (0)
2735
2736 #define REALLY_QUIT do { if (INTERNAL_REALLY_QUITP) signal_quit (); } while (0)
2737 2831
2738 2832
2739 /************************************************************************/ 2833 /************************************************************************/
2740 /* hashing */ 2834 /* hashing */
2741 /************************************************************************/ 2835 /************************************************************************/
2922 gcpro3.next = &gcpro2, gcpro3.var = &var3, gcpro3.nvars = 1, \ 3016 gcpro3.next = &gcpro2, gcpro3.var = &var3, gcpro3.nvars = 1, \
2923 gcpro4.next = &gcpro3, gcpro4.var = &var4, gcpro4.nvars = 1, \ 3017 gcpro4.next = &gcpro3, gcpro4.var = &var4, gcpro4.nvars = 1, \
2924 gcpro5.next = &gcpro4, gcpro5.var = &var5, gcpro5.nvars = 1, \ 3018 gcpro5.next = &gcpro4, gcpro5.var = &var5, gcpro5.nvars = 1, \
2925 gcprolist = &gcpro5 )) 3019 gcprolist = &gcpro5 ))
2926 3020
3021 #define GCPRO1_ARRAY(array, n) ((void) ( \
3022 gcpro1.next = gcprolist, gcpro1.var = array, gcpro1.nvars = n, \
3023 gcprolist = &gcpro1 ))
3024
3025 #define GCPRO2_ARRAY(array1, n1, array2, n2) ((void) ( \
3026 gcpro1.next = gcprolist, gcpro1.var = array1, gcpro1.nvars = n1, \
3027 gcpro2.next = &gcpro1, gcpro2.var = array2, gcpro2.nvars = n2, \
3028 gcprolist = &gcpro2 ))
3029
3030 #define GCPRO3_ARRAY(array1, n1, array2, n2, array3, n3) ((void) ( \
3031 gcpro1.next = gcprolist, gcpro1.var = array1, gcpro1.nvars = n1, \
3032 gcpro2.next = &gcpro1, gcpro2.var = array2, gcpro2.nvars = n2, \
3033 gcpro3.next = &gcpro2, gcpro3.var = array3, gcpro3.nvars = n3, \
3034 gcprolist = &gcpro3 ))
3035
2927 #define UNGCPRO ((void) (gcprolist = gcpro1.next)) 3036 #define UNGCPRO ((void) (gcprolist = gcpro1.next))
2928 3037
2929 #define NGCPRO1(var1) ((void) ( \ 3038 #define NGCPRO1(var1) ((void) ( \
2930 ngcpro1.next = gcprolist, ngcpro1.var = &var1, ngcpro1.nvars = 1, \ 3039 ngcpro1.next = gcprolist, ngcpro1.var = &var1, ngcpro1.nvars = 1, \
2931 gcprolist = &ngcpro1 )) 3040 gcprolist = &ngcpro1 ))
2954 ngcpro3.next = &ngcpro2, ngcpro3.var = &var3, ngcpro3.nvars = 1, \ 3063 ngcpro3.next = &ngcpro2, ngcpro3.var = &var3, ngcpro3.nvars = 1, \
2955 ngcpro4.next = &ngcpro3, ngcpro4.var = &var4, ngcpro4.nvars = 1, \ 3064 ngcpro4.next = &ngcpro3, ngcpro4.var = &var4, ngcpro4.nvars = 1, \
2956 ngcpro5.next = &ngcpro4, ngcpro5.var = &var5, ngcpro5.nvars = 1, \ 3065 ngcpro5.next = &ngcpro4, ngcpro5.var = &var5, ngcpro5.nvars = 1, \
2957 gcprolist = &ngcpro5 )) 3066 gcprolist = &ngcpro5 ))
2958 3067
3068 #define NGCPRO1_ARRAY(array, n) ((void) ( \
3069 ngcpro1.next = gcprolist, ngcpro1.var = array, ngcpro1.nvars = n, \
3070 gcprolist = &ngcpro1 ))
3071
3072 #define NGCPRO2_ARRAY(array1, n1, array2, n2) ((void) ( \
3073 ngcpro1.next = gcprolist, ngcpro1.var = array1, ngcpro1.nvars = n1, \
3074 ngcpro2.next = &ngcpro1, ngcpro2.var = array2, ngcpro2.nvars = n2, \
3075 gcprolist = &ngcpro2 ))
3076
3077 #define NGCPRO3_ARRAY(array1, n1, array2, n2, array3, n3) ((void) ( \
3078 ngcpro1.next = gcprolist, ngcpro1.var = array1, ngcpro1.nvars = n1, \
3079 ngcpro2.next = &ngcpro1, ngcpro2.var = array2, ngcpro2.nvars = n2, \
3080 ngcpro3.next = &ngcpro2, ngcpro3.var = array3, ngcpro3.nvars = n3, \
3081 gcprolist = &ngcpro3 ))
3082
2959 #define NUNGCPRO ((void) (gcprolist = ngcpro1.next)) 3083 #define NUNGCPRO ((void) (gcprolist = ngcpro1.next))
2960 3084
2961 #define NNGCPRO1(var1) ((void) ( \ 3085 #define NNGCPRO1(var1) ((void) ( \
2962 nngcpro1.next = gcprolist, nngcpro1.var = &var1, nngcpro1.nvars = 1, \ 3086 nngcpro1.next = gcprolist, nngcpro1.var = &var1, nngcpro1.nvars = 1, \
2963 gcprolist = &nngcpro1 )) 3087 gcprolist = &nngcpro1 ))
2985 nngcpro2.next = &nngcpro1, nngcpro2.var = &var2, nngcpro2.nvars = 1, \ 3109 nngcpro2.next = &nngcpro1, nngcpro2.var = &var2, nngcpro2.nvars = 1, \
2986 nngcpro3.next = &nngcpro2, nngcpro3.var = &var3, nngcpro3.nvars = 1, \ 3110 nngcpro3.next = &nngcpro2, nngcpro3.var = &var3, nngcpro3.nvars = 1, \
2987 nngcpro4.next = &nngcpro3, nngcpro4.var = &var4, nngcpro4.nvars = 1, \ 3111 nngcpro4.next = &nngcpro3, nngcpro4.var = &var4, nngcpro4.nvars = 1, \
2988 nngcpro5.next = &nngcpro4, nngcpro5.var = &var5, nngcpro5.nvars = 1, \ 3112 nngcpro5.next = &nngcpro4, nngcpro5.var = &var5, nngcpro5.nvars = 1, \
2989 gcprolist = &nngcpro5 )) 3113 gcprolist = &nngcpro5 ))
3114
3115 #define NNGCPRO1_ARRAY(array, n) ((void) ( \
3116 nngcpro1.next = gcprolist, nngcpro1.var = array, nngcpro1.nvars = n, \
3117 gcprolist = &nngcpro1 ))
3118
3119 #define NNGCPRO2_ARRAY(array1, n1, array2, n2) ((void) ( \
3120 nngcpro1.next = gcprolist, nngcpro1.var = array1, nngcpro1.nvars = n1, \
3121 nngcpro2.next = &nngcpro1, nngcpro2.var = array2, nngcpro2.nvars = n2, \
3122 gcprolist = &nngcpro2 ))
3123
3124 #define NNGCPRO3_ARRAY(array1, n1, array2, n2, array3, n3) ((void) ( \
3125 nngcpro1.next = gcprolist, nngcpro1.var = array1, nngcpro1.nvars = n1, \
3126 nngcpro2.next = &nngcpro1, nngcpro2.var = array2, nngcpro2.nvars = n2, \
3127 nngcpro3.next = &nngcpro2, nngcpro3.var = array3, nngcpro3.nvars = n3, \
3128 gcprolist = &nngcpro3 ))
2990 3129
2991 #define NNUNGCPRO ((void) (gcprolist = nngcpro1.next)) 3130 #define NNUNGCPRO ((void) (gcprolist = nngcpro1.next))
2992 3131
2993 #endif /* ! DEBUG_GCPRO */ 3132 #endif /* ! DEBUG_GCPRO */
2994 3133
3179 Lisp_Object list6 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, 3318 Lisp_Object list6 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object,
3180 Lisp_Object, Lisp_Object); 3319 Lisp_Object, Lisp_Object);
3181 DECLARE_DOESNT_RETURN (memory_full (void)); 3320 DECLARE_DOESNT_RETURN (memory_full (void));
3182 void disksave_object_finalization (void); 3321 void disksave_object_finalization (void);
3183 extern int purify_flag; 3322 extern int purify_flag;
3184 extern int gc_currently_forbidden;
3185 extern EMACS_INT gc_generation_number[1]; 3323 extern EMACS_INT gc_generation_number[1];
3186 int c_readonly (Lisp_Object); 3324 int c_readonly (Lisp_Object);
3187 int lisp_readonly (Lisp_Object); 3325 int lisp_readonly (Lisp_Object);
3188 Lisp_Object build_intstring (const Intbyte *); 3326 Lisp_Object build_intstring (const Intbyte *);
3189 Lisp_Object build_string (const CIntbyte *); 3327 Lisp_Object build_string (const CIntbyte *);
3194 Lisp_Object make_ext_string (const Extbyte *, EMACS_INT, Lisp_Object); 3332 Lisp_Object make_ext_string (const Extbyte *, EMACS_INT, Lisp_Object);
3195 void init_string_ascii_begin (Lisp_Object string); 3333 void init_string_ascii_begin (Lisp_Object string);
3196 Lisp_Object make_uninit_string (Bytecount); 3334 Lisp_Object make_uninit_string (Bytecount);
3197 Lisp_Object make_float (double); 3335 Lisp_Object make_float (double);
3198 Lisp_Object make_string_nocopy (const Intbyte *, Bytecount); 3336 Lisp_Object make_string_nocopy (const Intbyte *, Bytecount);
3199 void free_cons (Lisp_Cons *); 3337 void free_cons (Lisp_Object);
3200 void free_list (Lisp_Object); 3338 void free_list (Lisp_Object);
3201 void free_alist (Lisp_Object); 3339 void free_alist (Lisp_Object);
3202 void mark_conses_in_list (Lisp_Object); 3340 void mark_conses_in_list (Lisp_Object);
3203 void free_marker (Lisp_Marker *); 3341 void free_marker (Lisp_Marker *);
3204 int object_dead_p (Lisp_Object); 3342 int object_dead_p (Lisp_Object);
3270 /* Defined in bytecode.c */ 3408 /* Defined in bytecode.c */
3271 EXFUN (Fbyte_code, 3); 3409 EXFUN (Fbyte_code, 3);
3272 3410
3273 DECLARE_DOESNT_RETURN (invalid_byte_code 3411 DECLARE_DOESNT_RETURN (invalid_byte_code
3274 (const CIntbyte *reason, Lisp_Object frob)); 3412 (const CIntbyte *reason, Lisp_Object frob));
3275
3276 /* Defined in callproc.c */
3277 Intbyte *egetenv (const CIntbyte *var);
3278 void eputenv (const CIntbyte *var, const CIntbyte *value);
3279 extern int env_initted;
3280 3413
3281 /* Defined in callint.c */ 3414 /* Defined in callint.c */
3282 EXFUN (Fcall_interactively, 3); 3415 EXFUN (Fcall_interactively, 3);
3283 EXFUN (Fprefix_numeric_value, 1); 3416 EXFUN (Fprefix_numeric_value, 1);
3284 3417
3467 /* Nonzero means don't do interactive redisplay and don't change tty modes */ 3600 /* Nonzero means don't do interactive redisplay and don't change tty modes */
3468 extern int noninteractive, noninteractive1; 3601 extern int noninteractive, noninteractive1;
3469 extern int inhibit_non_essential_printing_operations; 3602 extern int inhibit_non_essential_printing_operations;
3470 extern int preparing_for_armageddon; 3603 extern int preparing_for_armageddon;
3471 extern Fixnum emacs_priority; 3604 extern Fixnum emacs_priority;
3472 extern int running_asynch_code;
3473 extern int suppress_early_error_handler_backtrace; 3605 extern int suppress_early_error_handler_backtrace;
3474 void debug_break (void); 3606 void debug_break (void);
3475 int debug_can_access_memory (void *ptr, Bytecount len); 3607 int debug_can_access_memory (void *ptr, Bytecount len);
3476 void really_abort (void); 3608 void really_abort (void);
3477 void zero_out_command_line_status_vars (void); 3609 void zero_out_command_line_status_vars (void);
3491 EXFUN (Ffunctionp, 1); 3623 EXFUN (Ffunctionp, 1);
3492 EXFUN (Finteractive_p, 0); 3624 EXFUN (Finteractive_p, 0);
3493 EXFUN (Fprogn, UNEVALLED); 3625 EXFUN (Fprogn, UNEVALLED);
3494 EXFUN (Fsignal, 2); 3626 EXFUN (Fsignal, 2);
3495 EXFUN (Fthrow, 2); 3627 EXFUN (Fthrow, 2);
3628 EXFUN (Fcall_with_condition_handler, MANY);
3629 EXFUN (Ffunction_max_args, 1);
3630 EXFUN (Ffunction_min_args, 1);
3496 3631
3497 DECLARE_DOESNT_RETURN (signal_error_1 (Lisp_Object, Lisp_Object)); 3632 DECLARE_DOESNT_RETURN (signal_error_1 (Lisp_Object, Lisp_Object));
3498 void maybe_signal_error_1 (Lisp_Object, Lisp_Object, Lisp_Object, 3633 void maybe_signal_error_1 (Lisp_Object, Lisp_Object, Lisp_Object,
3499 Error_Behavior); 3634 Error_Behavior);
3500 Lisp_Object maybe_signal_continuable_error_1 (Lisp_Object, Lisp_Object, 3635 Lisp_Object maybe_signal_continuable_error_1 (Lisp_Object, Lisp_Object,
3650 Lisp_Object); 3785 Lisp_Object);
3651 Lisp_Object call6_in_buffer (struct buffer *, Lisp_Object, Lisp_Object, 3786 Lisp_Object call6_in_buffer (struct buffer *, Lisp_Object, Lisp_Object,
3652 Lisp_Object, Lisp_Object, Lisp_Object, 3787 Lisp_Object, Lisp_Object, Lisp_Object,
3653 Lisp_Object, Lisp_Object); 3788 Lisp_Object, Lisp_Object);
3654 Lisp_Object eval_in_buffer (struct buffer *, Lisp_Object); 3789 Lisp_Object eval_in_buffer (struct buffer *, Lisp_Object);
3655 Lisp_Object call0_with_handler (Lisp_Object, Lisp_Object); 3790
3656 Lisp_Object call1_with_handler (Lisp_Object, Lisp_Object, Lisp_Object); 3791 struct call_trapping_problems_result
3657 Lisp_Object eval_in_buffer_trapping_errors (const CIntbyte *, struct buffer *, 3792 {
3658 Lisp_Object); 3793 int caught_error, caught_throw;
3659 Lisp_Object run_hook_trapping_errors (const CIntbyte *, Lisp_Object); 3794 Lisp_Object error_conditions, data;
3660 Lisp_Object safe_run_hook_trapping_errors (const CIntbyte *, Lisp_Object, int); 3795 Lisp_Object backtrace;
3661 Lisp_Object call0_trapping_errors (const CIntbyte *, Lisp_Object); 3796 Lisp_Object thrown_tag;
3662 Lisp_Object call1_trapping_errors (const CIntbyte *, Lisp_Object, Lisp_Object); 3797 Lisp_Object thrown_value;
3663 Lisp_Object call2_trapping_errors (const CIntbyte *, 3798 };
3664 Lisp_Object, Lisp_Object, Lisp_Object); 3799
3665 Lisp_Object call_with_suspended_errors (lisp_fn_t, volatile Lisp_Object, Lisp_Object, 3800 #define NO_INHIBIT_ERRORS (1<<0)
3801 #define NO_INHIBIT_THROWS (1<<1)
3802 #define INTERNAL_INHIBIT_ERRORS (1<<0)
3803 #define INTERNAL_INHIBIT_THROWS (1<<1)
3804 #define INHIBIT_WARNING_ISSUE (1<<2)
3805 #define ISSUE_WARNINGS_AT_DEBUG_LEVEL (1<<3)
3806 #define INHIBIT_QUIT (1<<4)
3807 #define UNINHIBIT_QUIT (1<<5)
3808 #define INHIBIT_GC (1<<6)
3809 #define INHIBIT_EXISTING_PERMANENT_DISPLAY_OBJECT_DELETION (1<<7)
3810 #define INHIBIT_EXISTING_CODING_SYSTEM_DELETION (1<<8)
3811 #define INHIBIT_EXISTING_CHARSET_DELETION (1<<9)
3812 #define INHIBIT_PERMANENT_DISPLAY_OBJECT_CREATION (1<<10)
3813 #define INHIBIT_CODING_SYSTEM_CREATION (1<<11)
3814 #define INHIBIT_CHARSET_CREATION (1<<12)
3815 #define INHIBIT_EXISTING_BUFFER_TEXT_MODIFICATION (1<<13)
3816 #define INHIBIT_ANY_CHANGE_AFFECTING_REDISPLAY (1<<14)
3817 #define INHIBIT_ENTERING_DEBUGGER (1<<15)
3818 #define CALL_WITH_SUSPENDED_ERRORS (1<<16)
3819
3820 enum check_allowed_operation
3821 {
3822 OPERATION_DELETE_OBJECT,
3823 OPERATION_CREATE_OBJECT,
3824 OPERATION_MODIFY_BUFFER_TEXT,
3825 OPERATION_MODIFY_OBJECT_PROPERTY,
3826 };
3827
3828 int get_inhibit_flags (void);
3829 void check_allowed_operation (int what, Lisp_Object obj, Lisp_Object prop);
3830 void note_object_created (Lisp_Object obj);
3831 void note_object_deleted (Lisp_Object obj);
3832 Lisp_Object call_with_condition_handler (Lisp_Object (*handler) (Lisp_Object,
3833 Lisp_Object,
3834 Lisp_Object),
3835 Lisp_Object handler_arg,
3836 Lisp_Object (*fun) (Lisp_Object),
3837 Lisp_Object arg);
3838 Lisp_Object call_trapping_problems (Lisp_Object warning_class,
3839 const char *warning_string,
3840 int flags,
3841 struct call_trapping_problems_result
3842 *problem,
3843 Lisp_Object (*fun) (void *),
3844 void *arg);
3845 Lisp_Object va_call_trapping_problems (Lisp_Object warning_class,
3846 const char *warning_string,
3847 int flags,
3848 struct call_trapping_problems_result
3849 *problem,
3850 lisp_fn_t fun, int nargs, ...);
3851 Lisp_Object call0_trapping_problems (const char *, Lisp_Object, int);
3852 Lisp_Object call1_trapping_problems (const char *, Lisp_Object, Lisp_Object,
3853 int);
3854 Lisp_Object call2_trapping_problems (const char *, Lisp_Object, Lisp_Object,
3855 Lisp_Object, int);
3856 Lisp_Object call3_trapping_problems (const char *, Lisp_Object, Lisp_Object,
3857 Lisp_Object, Lisp_Object, int);
3858 Lisp_Object call4_trapping_problems (const char *, Lisp_Object, Lisp_Object,
3859 Lisp_Object, Lisp_Object, Lisp_Object,
3860 int);
3861 Lisp_Object call5_trapping_problems (const char *, Lisp_Object, Lisp_Object,
3862 Lisp_Object, Lisp_Object, Lisp_Object,
3863 Lisp_Object, int);
3864 Lisp_Object eval_in_buffer_trapping_problems (const char *, struct buffer *,
3865 Lisp_Object, int);
3866 Lisp_Object run_hook_trapping_problems (const char *, Lisp_Object, int);
3867 Lisp_Object safe_run_hook_trapping_problems (const char *, Lisp_Object, int);
3868 Lisp_Object run_hook_with_args_in_buffer_trapping_problems (const char
3869 *warning_string,
3870 struct buffer
3871 *buf, int nargs,
3872 Lisp_Object *args,
3873 enum
3874 run_hooks_condition
3875 cond, int flags);
3876 Lisp_Object run_hook_with_args_trapping_problems (const char *warning_string,
3877 int nargs,
3878 Lisp_Object *args,
3879 enum run_hooks_condition
3880 cond,
3881 int flags);
3882 Lisp_Object va_run_hook_with_args_trapping_problems (const char
3883 *warning_string,
3884 Lisp_Object hook_var,
3885 int nargs, ...);
3886 Lisp_Object va_run_hook_with_args_in_buffer_trapping_problems (const char
3887 *warning_string,
3888 struct buffer
3889 *buf,
3890 Lisp_Object
3891 hook_var,
3892 int nargs, ...);
3893 Lisp_Object call_with_suspended_errors (lisp_fn_t, Lisp_Object,
3894 Lisp_Object,
3666 Error_Behavior, int, ...); 3895 Error_Behavior, int, ...);
3667 /* C Code should be using internal_catch, record_unwind_p, condition_case_1 */ 3896 /* C Code should be using internal_catch, record_unwind_p, condition_case_1 */
3668 Lisp_Object internal_catch (Lisp_Object, Lisp_Object (*) (Lisp_Object), 3897 Lisp_Object internal_catch (Lisp_Object, Lisp_Object (*) (Lisp_Object),
3669 Lisp_Object, int * volatile); 3898 Lisp_Object, int * volatile,
3899 Lisp_Object * volatile);
3670 Lisp_Object condition_case_1 (Lisp_Object, 3900 Lisp_Object condition_case_1 (Lisp_Object,
3671 Lisp_Object (*) (Lisp_Object), 3901 Lisp_Object (*) (Lisp_Object),
3672 Lisp_Object, 3902 Lisp_Object,
3673 Lisp_Object (*) (Lisp_Object, Lisp_Object), 3903 Lisp_Object (*) (Lisp_Object, Lisp_Object),
3674 Lisp_Object); 3904 Lisp_Object);
3675 Lisp_Object condition_case_3 (Lisp_Object, Lisp_Object, Lisp_Object); 3905 Lisp_Object condition_case_3 (Lisp_Object, Lisp_Object, Lisp_Object);
3676 Lisp_Object unbind_to_1 (int, Lisp_Object); 3906 Lisp_Object unbind_to_1 (int, Lisp_Object);
3677 #define unbind_to(obj) unbind_to_1 (obj, Qnil) 3907 #define unbind_to(obj) unbind_to_1 (obj, Qnil)
3678 void specbind (Lisp_Object, Lisp_Object); 3908 void specbind (Lisp_Object, Lisp_Object);
3679 int record_unwind_protect (Lisp_Object (*) (Lisp_Object), Lisp_Object); 3909 int record_unwind_protect (Lisp_Object (*) (Lisp_Object), Lisp_Object);
3910 int record_unwind_protect_freeing (void *ptr);
3680 int record_unwind_protect_freeing_dynarr (void *ptr); 3911 int record_unwind_protect_freeing_dynarr (void *ptr);
3681 int internal_bind_int (int *addr, int newval); 3912 int internal_bind_int (int *addr, int newval);
3682 int internal_bind_lisp_object (Lisp_Object *addr, Lisp_Object newval); 3913 int internal_bind_lisp_object (Lisp_Object *addr, Lisp_Object newval);
3683 void do_autoload (Lisp_Object, Lisp_Object); 3914 void do_autoload (Lisp_Object, Lisp_Object);
3684 Lisp_Object un_autoload (Lisp_Object); 3915 Lisp_Object un_autoload (Lisp_Object);
3962 Lisp_Object external_plist_get (Lisp_Object *, Lisp_Object, 4193 Lisp_Object external_plist_get (Lisp_Object *, Lisp_Object,
3963 int, Error_Behavior); 4194 int, Error_Behavior);
3964 void external_plist_put (Lisp_Object *, Lisp_Object, 4195 void external_plist_put (Lisp_Object *, Lisp_Object,
3965 Lisp_Object, int, Error_Behavior); 4196 Lisp_Object, int, Error_Behavior);
3966 int external_remprop (Lisp_Object *, Lisp_Object, int, Error_Behavior); 4197 int external_remprop (Lisp_Object *, Lisp_Object, int, Error_Behavior);
4198 int internal_equal_trapping_problems (Lisp_Object warning_class,
4199 const char *warning_string,
4200 int flags,
4201 struct call_trapping_problems_result *p,
4202 int retval,
4203 Lisp_Object obj1, Lisp_Object obj2,
4204 int depth);
3967 int internal_equal (Lisp_Object, Lisp_Object, int); 4205 int internal_equal (Lisp_Object, Lisp_Object, int);
3968 int internal_equalp (Lisp_Object obj1, Lisp_Object obj2, int depth); 4206 int internal_equalp (Lisp_Object obj1, Lisp_Object obj2, int depth);
3969 Lisp_Object concat2 (Lisp_Object, Lisp_Object); 4207 Lisp_Object concat2 (Lisp_Object, Lisp_Object);
3970 Lisp_Object concat3 (Lisp_Object, Lisp_Object, Lisp_Object); 4208 Lisp_Object concat3 (Lisp_Object, Lisp_Object, Lisp_Object);
3971 Lisp_Object vconcat2 (Lisp_Object, Lisp_Object); 4209 Lisp_Object vconcat2 (Lisp_Object, Lisp_Object);
4197 4435
4198 DECLARE_DOESNT_RETURN (report_process_error (const char *, Lisp_Object)); 4436 DECLARE_DOESNT_RETURN (report_process_error (const char *, Lisp_Object));
4199 DECLARE_DOESNT_RETURN (report_network_error (const char *, Lisp_Object)); 4437 DECLARE_DOESNT_RETURN (report_network_error (const char *, Lisp_Object));
4200 extern Lisp_Object Vlisp_EXEC_SUFFIXES; 4438 extern Lisp_Object Vlisp_EXEC_SUFFIXES;
4201 4439
4440 Intbyte *egetenv (const CIntbyte *var);
4441 void eputenv (const CIntbyte *var, const CIntbyte *value);
4442 extern int env_initted;
4443
4202 /* Defined in profile.c */ 4444 /* Defined in profile.c */
4203 void mark_profiling_info (void); 4445 void mark_profiling_info (void);
4204 void profile_increase_call_count (Lisp_Object); 4446 void profile_increase_call_count (Lisp_Object);
4205 extern int profiling_active; 4447 extern int profiling_active;
4206 extern int profiling_redisplay_flag; 4448 extern int profiling_redisplay_flag;
4251 extern Fixnum warn_about_possibly_incompatible_back_references; 4493 extern Fixnum warn_about_possibly_incompatible_back_references;
4252 4494
4253 4495
4254 /* Defined in signal.c */ 4496 /* Defined in signal.c */
4255 void init_interrupts_late (void); 4497 void init_interrupts_late (void);
4256 int begin_dont_check_for_quit (void);
4257 4498
4258 /* Defined in sound.c */ 4499 /* Defined in sound.c */
4259 EXFUN (Fding, 3); 4500 EXFUN (Fding, 3);
4260 4501
4261 void init_device_sound (struct device *); 4502 void init_device_sound (struct device *);