XEmacs 21.2.22 "Mercedes".
[chise/xemacs-chise.git.1] / src / lisp.h
1 /* Fundamental definitions for XEmacs Lisp interpreter.
2    Copyright (C) 1985-1987, 1992-1995 Free Software Foundation, Inc.
3    Copyright (C) 1993-1996 Richard Mlynarik.
4    Copyright (C) 1995, 1996 Ben Wing.
5
6 This file is part of XEmacs.
7
8 XEmacs is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the
10 Free Software Foundation; either version 2, or (at your option) any
11 later version.
12
13 XEmacs is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with XEmacs; see the file COPYING.  If not, write to
20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA.  */
22
23 /* Synched up with: FSF 19.30. */
24
25 #ifndef _XEMACS_LISP_H_
26 #define _XEMACS_LISP_H_
27
28 /************************************************************************/
29 /*                        general definitions                           */
30 /************************************************************************/
31
32 /* We include the following generally useful header files so that you
33    don't have to worry about prototypes when using the standard C
34    library functions and macros.  These files shouldn't be excessively
35    large so they shouldn't cause that much of a slowdown. */
36
37 #include <stdlib.h>
38 #include <string.h>             /* primarily for memcpy, etc. */
39 #include <stdio.h>              /* NULL, etc. */
40 #include <ctype.h>
41 #include <stdarg.h>
42 #include <stddef.h>             /* offsetof */
43 #include <sys/types.h>
44
45 /* ---- Dynamic arrays ---- */
46
47 #define Dynarr_declare(type)    \
48   type *base;                   \
49   int elsize;                   \
50   int cur;                      \
51   int largest;                  \
52   int max
53
54 typedef struct dynarr
55 {
56   Dynarr_declare (void);
57 } Dynarr;
58
59 void *Dynarr_newf (int elsize);
60 void Dynarr_resize (void *dy, int size);
61 void Dynarr_insert_many (void *d, CONST void *el, int len, int start);
62 void Dynarr_delete_many (void *d, int start, int len);
63 void Dynarr_free (void *d);
64
65 #define Dynarr_new(type) ((type##_dynarr *) Dynarr_newf (sizeof(type)))
66 #define Dynarr_at(d, pos) ((d)->base[pos])
67 #define Dynarr_atp(d, pos) (&Dynarr_at (d, pos))
68 #define Dynarr_length(d) ((d)->cur)
69 #define Dynarr_largest(d) ((d)->largest)
70 #define Dynarr_reset(d) ((d)->cur = 0)
71 #define Dynarr_add_many(d, el, len) Dynarr_insert_many (d, el, len, (d)->cur)
72 #define Dynarr_insert_many_at_start(d, el, len) \
73   Dynarr_insert_many (d, el, len, 0)
74 #define Dynarr_add_literal_string(d, s) Dynarr_add_many (d, s, sizeof(s) - 1)
75 #define Dynarr_add_lisp_string(d, s) do {               \
76   struct Lisp_String *dyna_ls_s = XSTRING (s);          \
77   Dynarr_add_many (d, (char *) string_data (dyna_ls_s), \
78                    string_length (dyna_ls_s));          \
79 } while (0)
80
81 #define Dynarr_add(d, el) (                                             \
82   (d)->cur >= (d)->max ? Dynarr_resize ((d), (d)->cur+1) : (void) 0,    \
83   ((d)->base)[(d)->cur++] = (el),                                       \
84   (d)->cur > (d)->largest ? (d)->largest = (d)->cur : (int) 0)
85
86 /* The following defines will get you into real trouble if you aren't
87    careful.  But they can save a lot of execution time when used wisely. */
88 #define Dynarr_increment(d) ((d)->cur++)
89 #define Dynarr_set_size(d, n) ((d)->cur = n)
90
91 /* Minimum size in elements for dynamic array when resized; default is 32 */
92 extern int Dynarr_min_size;
93
94 #ifdef MEMORY_USAGE_STATS
95 struct overhead_stats;
96 size_t Dynarr_memory_usage (void *d, struct overhead_stats *stats);
97 #endif
98
99 #include "symsinit.h"           /* compiler warning suppression */
100
101 /* Also define min() and max(). (Some compilers put them in strange
102    places that won't be referenced by the above include files, such
103    as 'macros.h' under Solaris.) */
104
105 #ifndef min
106 #define min(a,b) (((a) <= (b)) ? (a) : (b))
107 #endif
108 #ifndef max
109 #define max(a,b) (((a) > (b)) ? (a) : (b))
110 #endif
111
112 /* Memory allocation */
113 void malloc_warning (CONST char *);
114 void *xmalloc (size_t size);
115 void *xmalloc_and_zero (size_t size);
116 void *xrealloc (void *, size_t size);
117 char *xstrdup (CONST char *);
118 /* generally useful */
119 #define countof(x) ((int) (sizeof(x)/sizeof(x[0])))
120 #define slot_offset(type, slot_name) \
121   ((unsigned) (((char *) (&(((type *)0)->slot_name))) - ((char *)0)))
122 #define xnew(type) ((type *) xmalloc (sizeof (type)))
123 #define xnew_array(type, len) ((type *) xmalloc ((len) * sizeof (type)))
124 #define xnew_and_zero(type) ((type *) xmalloc_and_zero (sizeof (type)))
125 #define xzero(lvalue) ((void) memset (&(lvalue), 0, sizeof (lvalue)))
126 #define xnew_array_and_zero(type, len) ((type *) xmalloc_and_zero ((len) * sizeof (type)))
127 #define XREALLOC_ARRAY(ptr, type, len) ((void) (ptr = (type *) xrealloc (ptr, (len) * sizeof (type))))
128 #define alloca_array(type, len) ((type *) alloca ((len) * sizeof (type)))
129
130 /* also generally useful if you want to avoid arbitrary size limits
131    but don't need a full dynamic array.  Assumes that BASEVAR points
132    to a malloced array of TYPE objects (or possibly a NULL pointer,
133    if SIZEVAR is 0), with the total size stored in SIZEVAR.  This
134    macro will realloc BASEVAR as necessary so that it can hold at
135    least NEEDED_SIZE objects.  The reallocing is done by doubling,
136    which ensures constant amortized time per element. */
137 #define DO_REALLOC(basevar, sizevar, needed_size, type) do      \
138 {                                                               \
139   /* Avoid side-effectualness. */                               \
140   /* Dammit! Macros suffer from dynamic scope! */               \
141   /* We demand inline functions! */                             \
142   size_t do_realloc_needed_size = (needed_size);                \
143   size_t do_realloc_newsize = 0;                                \
144   while ((sizevar) < (do_realloc_needed_size)) {                \
145     do_realloc_newsize = 2*(sizevar);                           \
146     if (do_realloc_newsize < 32)                                \
147       do_realloc_newsize = 32;                                  \
148     (sizevar) = do_realloc_newsize;                             \
149   }                                                             \
150   if (do_realloc_newsize)                                       \
151     XREALLOC_ARRAY (basevar, type, do_realloc_newsize);         \
152 } while (0)
153
154 #ifdef ERROR_CHECK_MALLOC
155 void xfree_1 (void *);
156 #define xfree(lvalue) do                        \
157 {                                               \
158   void **xfree_ptr = (void **) &(lvalue);       \
159   xfree_1 (*xfree_ptr);                         \
160   *xfree_ptr = (void *) 0xDEADBEEF;             \
161 } while (0)
162 #else
163 void xfree (void *);
164 #define xfree_1 xfree
165 #endif /* ERROR_CHECK_MALLOC */
166
167 #ifndef PRINTF_ARGS
168 # if defined (__GNUC__) && (__GNUC__ >= 2)
169 #  define PRINTF_ARGS(string_index,first_to_check) \
170           __attribute__ ((format (printf, string_index, first_to_check)))
171 # else
172 #  define PRINTF_ARGS(string_index,first_to_check)
173 # endif /* GNUC */
174 #endif
175
176 #ifndef DOESNT_RETURN
177 # if defined __GNUC__
178 #  if ((__GNUC__ > 2) || (__GNUC__ == 2) && (__GNUC_MINOR__ >= 5))
179 #   define DOESNT_RETURN void volatile
180 #   define DECLARE_DOESNT_RETURN(decl) \
181            extern void volatile decl __attribute__ ((noreturn))
182 #   define DECLARE_DOESNT_RETURN_GCC_ATTRIBUTE_SYNTAX_SUCKS(decl,str,idx) \
183      /* Should be able to state multiple independent __attribute__s, but  \
184         the losing syntax doesn't work that way, and screws losing cpp */ \
185            extern void volatile decl \
186                   __attribute__ ((noreturn, format (printf, str, idx)))
187 #  else
188 #   define DOESNT_RETURN void volatile
189 #   define DECLARE_DOESNT_RETURN(decl) extern void volatile decl
190 #   define DECLARE_DOESNT_RETURN_GCC_ATTRIBUTE_SYNTAX_SUCKS(decl,str,idx) \
191            extern void volatile decl PRINTF_ARGS(str,idx)
192 #  endif /* GNUC 2.5 */
193 # else
194 #  define DOESNT_RETURN void
195 #  define DECLARE_DOESNT_RETURN(decl) extern void decl
196 #  define DECLARE_DOESNT_RETURN_GCC_ATTRIBUTE_SYNTAX_SUCKS(decl,str,idx) \
197           extern void decl PRINTF_ARGS(str,idx)
198 # endif /* GNUC */
199 #endif
200
201 #ifndef ALIGNOF
202 # if defined (__GNUC__) && (__GNUC__ >= 2)
203 #  define ALIGNOF(x) __alignof (x)
204 # else
205 #  define ALIGNOF(x) sizeof (x)
206 # endif
207 #endif
208
209 #define ALIGN_SIZE(len, unit) \
210   ((((len) + (unit) - 1) / (unit)) * (unit))
211
212 /* #### Yuck, this is kind of evil */
213 #define ALIGN_PTR(ptr, unit) \
214   ((void *) ALIGN_SIZE ((long) (ptr), unit))
215
216 #ifndef DO_NOTHING
217 #define DO_NOTHING do {} while (0)
218 #endif
219
220 #ifndef DECLARE_NOTHING
221 #define DECLARE_NOTHING struct nosuchstruct
222 #endif
223
224 /* We define assert iff USE_ASSERTIONS or DEBUG_XEMACS is defined.
225    Otherwise we define it to be empty.  Quantify has shown that the
226    time the assert checks take is measurable so let's not include them
227    in production binaries. */
228
229 #ifdef USE_ASSERTIONS
230 /* Highly dubious kludge */
231 /*   (thanks, Jamie, I feel better now -- ben) */
232 DECLARE_DOESNT_RETURN (assert_failed (CONST char *, int, CONST char *));
233 # define abort() (assert_failed (__FILE__, __LINE__, "abort()"))
234 # define assert(x) ((x) ? (void) 0 : assert_failed (__FILE__, __LINE__, #x))
235 #else
236 # ifdef DEBUG_XEMACS
237 #  define assert(x) ((x) ? (void) 0 : (void) abort ())
238 # else
239 #  define assert(x)
240 # endif
241 #endif
242
243 /*#ifdef DEBUG_XEMACS*/
244 #define REGISTER
245 #define register
246 /*#else*/
247 /*#define REGISTER register*/
248 /*#endif*/
249
250
251 /* EMACS_INT is the underlying integral type into which a Lisp_Object must fit.
252    In particular, it must be large enough to contain a pointer.
253    config.h can override this, e.g. to use `long long' for bigger lisp ints. */
254
255 #ifndef SIZEOF_EMACS_INT
256 # define SIZEOF_EMACS_INT SIZEOF_VOID_P
257 #endif
258
259 #ifndef EMACS_INT
260 # if   SIZEOF_EMACS_INT == SIZEOF_LONG
261 #  define EMACS_INT long
262 # elif SIZEOF_EMACS_INT == SIZEOF_INT
263 #  define EMACS_INT int
264 # elif SIZEOF_EMACS_INT == SIZEOF_LONG_LONG
265 #  define EMACS_INT long long
266 # else
267 #  error Unable to determine suitable type for EMACS_INT
268 # endif
269 #endif
270
271 #ifndef EMACS_UINT
272 # define EMACS_UINT unsigned EMACS_INT
273 #endif
274
275 #define BITS_PER_EMACS_INT (SIZEOF_EMACS_INT * BITS_PER_CHAR)
276
277 \f
278 /************************************************************************/
279 /*                                typedefs                              */
280 /************************************************************************/
281
282 /* We put typedefs here so that prototype declarations don't choke.
283    Note that we don't actually declare the structures here (except
284    maybe for simple structures like Dynarrs); that keeps them private
285    to the routines that actually use them. */
286
287 /* The data representing the text in a buffer is logically a set
288    of Bufbytes, declared as follows. */
289
290 typedef unsigned char Bufbyte;
291
292 /* The data representing a string in "external" format (simple
293    binary format) is logically a set of Extbytes, declared as follows. */
294
295 typedef unsigned char Extbyte;
296
297 /* To the user, a buffer is made up of characters, declared as follows.
298    In the non-Mule world, characters and Bufbytes are equivalent.
299    In the Mule world, a character requires (typically) 1 to 4
300    Bufbytes for its representation in a buffer. */
301
302 typedef int Emchar;
303
304 /* Different ways of referring to a position in a buffer.  We use
305    the typedefs in preference to 'int' to make it clearer what
306    sort of position is being used.  See extents.c for a description
307    of the different positions.  We put them here instead of in
308    buffer.h (where they rightfully belong) to avoid syntax errors
309    in function prototypes. */
310
311 typedef EMACS_INT Bufpos;
312 typedef EMACS_INT Bytind;
313 typedef EMACS_INT Memind;
314
315 /* Counts of bytes or chars */
316
317 typedef EMACS_INT Bytecount;
318 typedef EMACS_INT Charcount;
319
320 /* Length in bytes of a string in external format */
321 typedef EMACS_INT Extcount;
322
323 typedef struct lstream Lstream;
324
325 typedef unsigned int face_index;
326
327 typedef struct
328 {
329   Dynarr_declare (struct face_cachel);
330 } face_cachel_dynarr;
331
332 typedef unsigned int glyph_index;
333
334 /* This is shared by process.h, events.h and others in future.
335    See events.h for description */
336 typedef unsigned int USID;
337
338 typedef struct
339 {
340   Dynarr_declare (struct glyph_cachel);
341 } glyph_cachel_dynarr;
342
343 struct buffer;                  /* "buffer.h" */
344 struct console;                 /* "console.h" */
345 struct device;                  /* "device.h" */
346 struct extent_fragment;
347 struct extent;
348 typedef struct extent *EXTENT;
349 struct frame;                   /* "frame.h" */
350 struct window;                  /* "window.h" */
351 struct Lisp_Event;              /* "events.h" */
352 typedef struct Lisp_Event Lisp_Event;
353 struct Lisp_Face;
354 typedef struct Lisp_Face Lisp_Face;
355 struct Lisp_Process;            /* "process.c" */
356 typedef struct Lisp_Process Lisp_Process;
357 struct stat;                    /* <sys/stat.h> */
358 struct Lisp_Color_Instance;
359 typedef struct Lisp_Color_Instance Lisp_Color_Instance;
360 struct Lisp_Font_Instance;
361 typedef struct Lisp_Font_Instance Lisp_Font_Instance;
362 struct Lisp_Image_Instance;
363 typedef struct Lisp_Image_Instance Lisp_Image_Instance;
364 struct Lisp_Gui_Item;
365 typedef struct Lisp_Gui_Item Lisp_Gui_Item;
366 struct display_line;
367 struct display_glyph_area;
368 struct display_box;
369 struct redisplay_info;
370 struct window_mirror;
371 struct scrollbar_instance;
372 struct font_metric_info;
373 struct face_cachel;
374 struct console_type_entry;
375
376 typedef struct
377 {
378   Dynarr_declare (Bufbyte);
379 } Bufbyte_dynarr;
380
381 typedef struct
382 {
383   Dynarr_declare (Extbyte);
384 } Extbyte_dynarr;
385
386 typedef struct
387 {
388   Dynarr_declare (Emchar);
389 } Emchar_dynarr;
390
391 typedef struct
392 {
393   Dynarr_declare (char);
394 } char_dynarr;
395
396 typedef unsigned char unsigned_char;
397 typedef struct
398 {
399   Dynarr_declare (unsigned char);
400 } unsigned_char_dynarr;
401
402 typedef unsigned long unsigned_long;
403 typedef struct
404 {
405   Dynarr_declare (unsigned long);
406 } unsigned_long_dynarr;
407
408 typedef struct
409 {
410   Dynarr_declare (int);
411 } int_dynarr;
412
413 typedef struct
414 {
415   Dynarr_declare (Bufpos);
416 } Bufpos_dynarr;
417
418 typedef struct
419 {
420   Dynarr_declare (Bytind);
421 } Bytind_dynarr;
422
423 typedef struct
424 {
425   Dynarr_declare (Charcount);
426 } Charcount_dynarr;
427
428 typedef struct
429 {
430   Dynarr_declare (Bytecount);
431 } Bytecount_dynarr;
432
433 typedef struct
434 {
435   Dynarr_declare (struct console_type_entry);
436 } console_type_entry_dynarr;
437
438 /* Need to declare this here. */
439 enum external_data_format
440 {
441   /* Binary format.  This is the simplest format and is what we
442      use in the absence of a more appropriate format.  This converts
443      according to the `binary' coding system:
444
445      a) On input, bytes 0 - 255 are converted into characters 0 - 255.
446      b) On output, characters 0 - 255 are converted into bytes 0 - 255
447         and other characters are converted into `X'.
448    */
449   FORMAT_BINARY,
450
451   /* Format used for filenames.  In the original Mule, this is
452      user-definable with the `pathname-coding-system' variable.
453      For the moment, we just use the `binary' coding system. */
454   FORMAT_FILENAME,
455
456   /* Format used for output to the terminal.  This should be controlled
457      by the `terminal-coding-system' variable.  Under kterm, this will
458      be some ISO2022 system.  On some DOS machines, this is Shift-JIS. */
459   FORMAT_TERMINAL,
460
461   /* Format used for input from the terminal.  This should be controlled
462      by the `keyboard-coding-system' variable. */
463   FORMAT_KEYBOARD,
464
465   /* Format used for the external Unix environment -- argv[], stuff
466      from getenv(), stuff from the /etc/passwd file, etc.
467
468      Perhaps should be the same as FORMAT_FILENAME. */
469   FORMAT_OS,
470
471   /* Compound-text format.  This is the standard X format used for
472      data stored in properties, selections, and the like.  This is
473      an 8-bit no-lock-shift ISO2022 coding system. */
474   FORMAT_CTEXT
475 };
476
477 #define FORMAT_NATIVE FORMAT_FILENAME
478
479 enum run_hooks_condition
480 {
481   RUN_HOOKS_TO_COMPLETION,
482   RUN_HOOKS_UNTIL_SUCCESS,
483   RUN_HOOKS_UNTIL_FAILURE
484 };
485
486 #ifdef HAVE_TOOLBARS
487 enum toolbar_pos
488 {
489   TOP_TOOLBAR,
490   BOTTOM_TOOLBAR,
491   LEFT_TOOLBAR,
492   RIGHT_TOOLBAR
493 };
494 #endif
495
496 enum edge_style
497 {
498   EDGE_ETCHED_IN,
499   EDGE_ETCHED_OUT,
500   EDGE_BEVEL_IN,
501   EDGE_BEVEL_OUT
502 };
503
504 #ifndef ERROR_CHECK_TYPECHECK
505
506 typedef enum error_behavior
507 {
508   ERROR_ME,
509   ERROR_ME_NOT,
510   ERROR_ME_WARN
511 } Error_behavior;
512
513 #define ERRB_EQ(a, b) ((a) == (b))
514
515 #else
516
517 /* By defining it like this, we provide strict type-checking
518    for code that lazily uses ints. */
519
520 typedef struct _error_behavior_struct_
521 {
522   int really_unlikely_name_to_have_accidentally_in_a_non_errb_structure;
523 } Error_behavior;
524
525 extern Error_behavior ERROR_ME;
526 extern Error_behavior ERROR_ME_NOT;
527 extern Error_behavior ERROR_ME_WARN;
528
529 #define ERRB_EQ(a, b)                                                      \
530  ((a).really_unlikely_name_to_have_accidentally_in_a_non_errb_structure == \
531   (b).really_unlikely_name_to_have_accidentally_in_a_non_errb_structure)
532
533 #endif
534
535 enum munge_me_out_the_door
536 {
537   MUNGE_ME_FUNCTION_KEY,
538   MUNGE_ME_KEY_TRANSLATION
539 };
540
541 \f
542 /************************************************************************/
543 /*                   Definition of Lisp_Object data type                */
544 /************************************************************************/
545
546 /* Define the fundamental Lisp data structures */
547
548 /* This is the set of Lisp data types */
549
550 enum Lisp_Type
551 {
552   Lisp_Type_Record,
553   Lisp_Type_Int_Even,
554   Lisp_Type_Char,
555   Lisp_Type_Int_Odd
556 };
557
558 #define POINTER_TYPE_P(type) ((type) == Lisp_Type_Record)
559
560 /* Overridden by m/next.h */
561 #ifndef ASSERT_VALID_POINTER
562 # define ASSERT_VALID_POINTER(pnt) (assert ((((EMACS_UINT) pnt) & 3) == 0))
563 #endif
564
565 #define GCMARKBITS  0
566 #define GCTYPEBITS  2
567 #define GCBITS      2
568 #define INT_GCBITS  1
569
570 #define INT_VALBITS (BITS_PER_EMACS_INT - INT_GCBITS)
571 #define VALBITS (BITS_PER_EMACS_INT - GCBITS)
572 #define EMACS_INT_MAX ((1UL << INT_VALBITS) -1UL)
573
574 #ifdef USE_UNION_TYPE
575 # include "lisp-union.h"
576 #else /* !USE_UNION_TYPE */
577 # include "lisp-disunion.h"
578 #endif /* !USE_UNION_TYPE */
579
580 #define XPNTR(x) ((void *) XPNTRVAL(x))
581
582 /* WARNING WARNING WARNING.  You must ensure on your own that proper
583    GC protection is provided for the elements in this array. */
584 typedef struct
585 {
586   Dynarr_declare (Lisp_Object);
587 } Lisp_Object_dynarr;
588
589 /* Close your eyes now lest you vomit or spontaneously combust ... */
590
591 #define HACKEQ_UNSAFE(obj1, obj2)                               \
592   (EQ (obj1, obj2) || (!POINTER_TYPE_P (XTYPE (obj1))           \
593                        && !POINTER_TYPE_P (XTYPE (obj2))        \
594                        && XCHAR_OR_INT (obj1) == XCHAR_OR_INT (obj2)))
595
596 #ifdef DEBUG_XEMACS
597 extern int debug_issue_ebola_notices;
598 int eq_with_ebola_notice (Lisp_Object, Lisp_Object);
599 #define EQ_WITH_EBOLA_NOTICE(obj1, obj2)                                \
600   (debug_issue_ebola_notices ? eq_with_ebola_notice (obj1, obj2)        \
601    : EQ (obj1, obj2))
602 #else
603 #define EQ_WITH_EBOLA_NOTICE(obj1, obj2) EQ (obj1, obj2)
604 #endif
605
606 /* OK, you can open them again */
607
608 \f
609 /************************************************************************/
610 /*                   Definitions of basic Lisp objects                  */
611 /************************************************************************/
612
613 #include "lrecord.h"
614
615 /*********** unbound ***********/
616
617 /* Qunbound is a special Lisp_Object (actually of type
618    symbol-value-forward), that can never be visible to
619    the Lisp caller and thus can be used in the C code
620    to mean "no such value". */
621
622 #define UNBOUNDP(val) EQ (val, Qunbound)
623
624 /*********** cons ***********/
625
626 /* In a cons, the markbit of the car is the gc mark bit */
627
628 struct Lisp_Cons
629 {
630   struct lrecord_header lheader;
631   Lisp_Object car, cdr;
632 };
633 typedef struct Lisp_Cons Lisp_Cons;
634
635 #if 0 /* FSFmacs */
636 /* Like a cons, but records info on where the text lives that it was read from */
637 /* This is not really in use now */
638
639 struct Lisp_Buffer_Cons
640 {
641   Lisp_Object car, cdr;
642   struct buffer *buffer;
643   int bufpos;
644 };
645 #endif
646
647 DECLARE_LRECORD (cons, Lisp_Cons);
648 #define XCONS(x) XRECORD (x, cons, Lisp_Cons)
649 #define XSETCONS(x, p) XSETRECORD (x, p, cons)
650 #define CONSP(x) RECORDP (x, cons)
651 #define CHECK_CONS(x) CHECK_RECORD (x, cons)
652 #define CONCHECK_CONS(x) CONCHECK_RECORD (x, cons)
653
654 #define CONS_MARKED_P(c) MARKED_RECORD_HEADER_P(&((c)->lheader))
655 #define MARK_CONS(c) MARK_RECORD_HEADER (&((c)->lheader))
656
657 extern Lisp_Object Qnil;
658
659 #define NILP(x)  EQ (x, Qnil)
660 #define XCAR(a) (XCONS (a)->car)
661 #define XCDR(a) (XCONS (a)->cdr)
662 #define LISTP(x) (CONSP(x) || NILP(x))
663
664 #define CHECK_LIST(x) do {                      \
665   if (!LISTP (x))                               \
666     dead_wrong_type_argument (Qlistp, x);       \
667 } while (0)
668
669 #define CONCHECK_LIST(x) do {                   \
670   if (!LISTP (x))                               \
671     x = wrong_type_argument (Qlistp, x);        \
672 } while (0)
673
674 /* For a list that's known to be in valid list format --
675    will abort() if the list is not in valid format */
676 #define LIST_LOOP(tail, list)           \
677   for (tail = list;                     \
678        !NILP (tail);                    \
679        tail = XCDR (tail))
680
681 #define LIST_LOOP_2(elt, list)          \
682   Lisp_Object tail##elt;                \
683   LIST_LOOP_3(elt, list, tail##elt)
684
685 #define LIST_LOOP_3(elt, list, tail)    \
686   for (tail = list;                     \
687        NILP (tail) ?                    \
688          0 : (elt = XCAR (tail), 1);    \
689        tail = XCDR (tail))
690
691 #define GET_LIST_LENGTH(list, len) do {         \
692   Lisp_Object GLL_tail;                         \
693   for (GLL_tail = list, len = 0;                \
694        !NILP (GLL_tail);                        \
695        GLL_tail = XCDR (GLL_tail), ++len)       \
696     DO_NOTHING;                                 \
697 } while (0)
698
699 #define GET_EXTERNAL_LIST_LENGTH(list, len)             \
700 do {                                                    \
701   Lisp_Object GELL_elt, GELL_tail;                      \
702   EXTERNAL_LIST_LOOP_4 (GELL_elt, list, GELL_tail, len) \
703     ;                                                   \
704 } while (0)
705
706 /* For a list that's known to be in valid list format, where we may
707    be deleting the current element out of the list --
708    will abort() if the list is not in valid format */
709 #define LIST_LOOP_DELETING(consvar, nextconsvar, list)          \
710   for (consvar = list;                                          \
711        !NILP (consvar) ? (nextconsvar = XCDR (consvar), 1) :0;  \
712        consvar = nextconsvar)
713
714 /* Delete all elements of external list LIST
715    satisfying CONDITION, an expression referring to variable ELT */
716 #define EXTERNAL_LIST_LOOP_DELETE_IF(elt, list, condition) do { \
717   Lisp_Object prev_tail_##list = Qnil;                          \
718   Lisp_Object tail_##list;                                      \
719   EMACS_INT len_##list;                                         \
720   EXTERNAL_LIST_LOOP_4 (elt, list, tail_##list, len_##list)     \
721     {                                                           \
722       if (condition)                                            \
723         {                                                       \
724           if (NILP (prev_tail_##list))                          \
725             list = XCDR (tail_##list);                          \
726           else                                                  \
727             XCDR (prev_tail_##list) = XCDR (tail_##list);       \
728           /* Keep tortoise from ever passing hare. */           \
729           len_##list = 0;                                       \
730         }                                                       \
731       else                                                      \
732         prev_tail_##list = tail_##list;                         \
733     }                                                           \
734 } while (0)
735
736 /* Delete all elements of true non-circular list LIST
737    satisfying CONDITION, an expression referring to variable ELT */
738 #define LIST_LOOP_DELETE_IF(elt, list, condition) do {          \
739   Lisp_Object prev_tail_##list = Qnil;                          \
740   Lisp_Object tail_##list;                                      \
741   LIST_LOOP_3 (elt, list, tail_##list)                          \
742     {                                                           \
743       if (condition)                                            \
744         {                                                       \
745           if (NILP (prev_tail_##list))                          \
746             list = XCDR (tail_##list);                          \
747           else                                                  \
748             XCDR (prev_tail_##list) = XCDR (tail_##list);       \
749         }                                                       \
750       else                                                      \
751         prev_tail_##list = tail_##list;                         \
752     }                                                           \
753 } while (0)
754
755 /* For a list that may not be in valid list format --
756    will signal an error if the list is not in valid format */
757 #define EXTERNAL_LIST_LOOP(tail, list)                  \
758   for (tail = list; !NILP (tail); tail = XCDR (tail))   \
759      if (!CONSP (tail))                                 \
760        signal_malformed_list_error (list);              \
761      else
762
763
764 /* The following macros are for traversing lisp lists.
765    Signal an error if LIST is not properly acyclic and nil-terminated.
766
767    Use tortoise/hare algorithm to check for cycles, but only if it
768    looks like the list is getting too long.  Not only is the hare
769    faster than the tortoise; it even gets a head start! */
770
771 /* Optimized and safe macros for looping over external lists.  */
772 #define CIRCULAR_LIST_SUSPICION_LENGTH 1024
773
774 #define EXTERNAL_LIST_LOOP_1(list)                                      \
775 Lisp_Object ELL1_elt, ELL1_hare, ELL1_tortoise;                         \
776 EMACS_INT ELL1_len;                                                             \
777 EXTERNAL_LIST_LOOP_6 (ELL1_elt, list, ELL1_len, ELL1_hare,              \
778                       ELL1_tortoise, CIRCULAR_LIST_SUSPICION_LENGTH)
779
780 #define EXTERNAL_LIST_LOOP_2(elt, list)                                 \
781 Lisp_Object hare_##elt, tortoise_##elt;                                 \
782 EMACS_INT len_##elt;                                                            \
783 EXTERNAL_LIST_LOOP_6 (elt, list, len_##elt, hare_##elt,                 \
784                       tortoise_##elt, CIRCULAR_LIST_SUSPICION_LENGTH)
785
786 #define EXTERNAL_LIST_LOOP_3(elt, list, tail)                           \
787 Lisp_Object tortoise_##elt;                                             \
788 EMACS_INT len_##elt;                                                            \
789 EXTERNAL_LIST_LOOP_6 (elt, list, len_##elt, tail,                       \
790                       tortoise_##elt, CIRCULAR_LIST_SUSPICION_LENGTH)
791
792 #define EXTERNAL_LIST_LOOP_4(elt, list, tail, len)                      \
793 Lisp_Object tortoise_##elt;                                             \
794 EXTERNAL_LIST_LOOP_6 (elt, list, len, tail,                             \
795                       tortoise_##elt, CIRCULAR_LIST_SUSPICION_LENGTH)
796
797
798 #define EXTERNAL_LIST_LOOP_6(elt, list, len, hare,              \
799                              tortoise, suspicion_length)        \
800   for (tortoise = hare = list, len = 0;                         \
801                                                                 \
802        (CONSP (hare) ? ((elt = XCAR (hare)), 1) :               \
803         (NILP (hare) ? 0 :                                      \
804          (signal_malformed_list_error (list), 0)));             \
805                                                                 \
806        hare = XCDR (hare),                                      \
807          ((++len < suspicion_length) ?                          \
808           ((void) 0) :                                          \
809           (((len & 1) ?                                         \
810             ((void) (tortoise = XCDR (tortoise))) :             \
811             ((void) 0))                                         \
812            ,                                                    \
813            (EQ (hare, tortoise) ?                               \
814             ((void) signal_circular_list_error (list)) :        \
815             ((void) 0)))))
816
817
818
819 /* Optimized and safe macros for looping over external alists. */
820 #define EXTERNAL_ALIST_LOOP_4(elt, elt_car, elt_cdr, list)      \
821 Lisp_Object hare_##elt, tortoise_##elt;                         \
822 EMACS_INT len_##elt;                                            \
823 EXTERNAL_ALIST_LOOP_8 (elt, elt_car, elt_cdr, list,             \
824                        len_##elt, hare_##elt, tortoise_##elt,   \
825                        CIRCULAR_LIST_SUSPICION_LENGTH)
826
827 #define EXTERNAL_ALIST_LOOP_5(elt, elt_car, elt_cdr, list, tail)        \
828 Lisp_Object tortoise_##elt;                                             \
829 EMACS_INT len_##elt;                                                    \
830 EXTERNAL_ALIST_LOOP_8 (elt, elt_car, elt_cdr, list,                     \
831                        len_##elt, tail, tortoise_##elt,                 \
832                        CIRCULAR_LIST_SUSPICION_LENGTH)                  \
833
834 #define EXTERNAL_ALIST_LOOP_6(elt, elt_car, elt_cdr, list, tail, len)   \
835 Lisp_Object tortoise_##elt;                                             \
836 EXTERNAL_ALIST_LOOP_8 (elt, elt_car, elt_cdr, list,                     \
837                        len, tail, tortoise_##elt,                       \
838                        CIRCULAR_LIST_SUSPICION_LENGTH)
839
840
841 #define EXTERNAL_ALIST_LOOP_8(elt, elt_car, elt_cdr, list, len, hare,   \
842                              tortoise, suspicion_length)                \
843 EXTERNAL_LIST_LOOP_6 (elt, list, len, hare, tortoise, suspicion_length) \
844   if (CONSP (elt) ? (elt_car = XCAR (elt), elt_cdr = XCDR (elt), 0) :1) \
845     continue;                                                           \
846   else
847
848
849 /* Optimized and safe macros for looping over external property lists. */
850 #define EXTERNAL_PROPERTY_LIST_LOOP_3(key, value, list)                 \
851 Lisp_Object key, value, hare_##key, tortoise_##key;                     \
852 EMACS_INT len_##key;                                                            \
853 EXTERNAL_PROPERTY_LIST_LOOP_7 (key, value, list, len_##key, hare_##key, \
854                      tortoise_##key, CIRCULAR_LIST_SUSPICION_LENGTH)
855
856 #define EXTERNAL_PROPERTY_LIST_LOOP_4(key, value, list, tail)           \
857 Lisp_Object key, value, tail, tortoise_##key;                           \
858 EMACS_INT len_##key;                                                            \
859 EXTERNAL_PROPERTY_LIST_LOOP_7 (key, value, list, len_##key, tail,       \
860                      tortoise_##key, CIRCULAR_LIST_SUSPICION_LENGTH)
861
862 #define EXTERNAL_PROPERTY_LIST_LOOP_5(key, value, list, tail, len)      \
863 Lisp_Object key, value, tail, tortoise_##key;                           \
864 EMACS_INT len;                                                          \
865 EXTERNAL_PROPERTY_LIST_LOOP_7 (key, value, list, len, tail,             \
866                      tortoise_##key, CIRCULAR_LIST_SUSPICION_LENGTH)
867
868
869 #define EXTERNAL_PROPERTY_LIST_LOOP_7(key, value, list, len, hare,      \
870                              tortoise, suspicion_length)                \
871   for (tortoise = hare = list, len = 0;                                 \
872                                                                         \
873        ((CONSP (hare) &&                                                \
874          (key = XCAR (hare),                                            \
875           hare = XCDR (hare),                                           \
876           CONSP (hare))) ?                                              \
877         (value = XCAR (hare), 1) :                                      \
878         (NILP (hare) ? 0 :                                              \
879          (signal_malformed_property_list_error (list), 0)));            \
880                                                                         \
881        hare = XCDR (hare),                                              \
882          ((++len < suspicion_length) ?                                  \
883           ((void) 0) :                                                  \
884           (((len & 1) ?                                                 \
885             ((void) (tortoise = XCDR (XCDR (tortoise)))) :              \
886             ((void) 0))                                                 \
887            ,                                                            \
888            (EQ (hare, tortoise) ?                                       \
889             ((void) signal_circular_property_list_error (list)) :       \
890             ((void) 0)))))
891
892 /* For a property list (alternating keywords/values) that may not be
893    in valid list format -- will signal an error if the list is not in
894    valid format.  CONSVAR is used to keep track of the iterations
895    without modifying PLIST.
896
897    We have to be tricky to still keep the same C format.*/
898 #define EXTERNAL_PROPERTY_LIST_LOOP(tail, key, value, plist)    \
899   for (tail = plist;                                            \
900        (CONSP (tail) && CONSP (XCDR (tail)) ?                   \
901         (key = XCAR (tail), value = XCAR (XCDR (tail))) :       \
902         (key = Qunbound,    value = Qunbound)),                 \
903        !NILP (tail);                                            \
904        tail = XCDR (XCDR (tail)))                               \
905     if (UNBOUNDP (key))                                         \
906       Fsignal (Qmalformed_property_list, list1 (plist));        \
907     else
908
909 #define PROPERTY_LIST_LOOP(tail, key, value, plist)     \
910   for (tail = plist;                                    \
911        NILP (tail) ? 0 :                                \
912          (key   = XCAR (tail), tail = XCDR (tail),      \
913           value = XCAR (tail), tail = XCDR (tail), 1);  \
914        )
915
916 /* Return 1 if LIST is properly acyclic and nil-terminated, else 0. */
917 INLINE int TRUE_LIST_P (Lisp_Object object);
918 INLINE int
919 TRUE_LIST_P (Lisp_Object object)
920 {
921   Lisp_Object hare, tortoise;
922   EMACS_INT len;
923
924   for (hare = tortoise = object, len = 0;
925        CONSP (hare);
926        hare = XCDR (hare), len++)
927     {
928       if (len < CIRCULAR_LIST_SUSPICION_LENGTH)
929         continue;
930
931       if (len & 1)
932         tortoise = XCDR (tortoise);
933       else if (EQ (hare, tortoise))
934         return 0;
935     }
936
937   return NILP (hare);
938 }
939
940 /* Signal an error if LIST is not properly acyclic and nil-terminated. */
941 #define CHECK_TRUE_LIST(list) do {                      \
942   Lisp_Object CTL_list = (list);                        \
943   Lisp_Object CTL_hare, CTL_tortoise;                   \
944   EMACS_INT CTL_len;                                            \
945                                                         \
946   for (CTL_hare = CTL_tortoise = CTL_list, CTL_len = 0; \
947        CONSP (CTL_hare);                                \
948        CTL_hare = XCDR (CTL_hare), CTL_len++)           \
949     {                                                   \
950       if (CTL_len < CIRCULAR_LIST_SUSPICION_LENGTH)     \
951         continue;                                       \
952                                                         \
953       if (CTL_len & 1)                                  \
954         CTL_tortoise = XCDR (CTL_tortoise);             \
955       else if (EQ (CTL_hare, CTL_tortoise))             \
956         Fsignal (Qcircular_list, list1 (CTL_list));     \
957     }                                                   \
958                                                         \
959   if (! NILP (CTL_hare))                                \
960     signal_malformed_list_error (CTL_list);             \
961 } while (0)
962
963 /*********** string ***********/
964
965 struct Lisp_String
966 {
967   struct lrecord_header lheader;
968   Bytecount size;
969   Bufbyte *data;
970   Lisp_Object plist;
971 };
972 typedef struct Lisp_String Lisp_String;
973
974 DECLARE_LRECORD (string, Lisp_String);
975 #define XSTRING(x) XRECORD (x, string, Lisp_String)
976 #define XSETSTRING(x, p) XSETRECORD (x, p, string)
977 #define STRINGP(x) RECORDP (x, string)
978 #define CHECK_STRING(x) CHECK_RECORD (x, string)
979 #define CONCHECK_STRING(x) CONCHECK_RECORD (x, string)
980
981 #ifdef MULE
982
983 Charcount bytecount_to_charcount (CONST Bufbyte *ptr, Bytecount len);
984 Bytecount charcount_to_bytecount (CONST Bufbyte *ptr, Charcount len);
985
986 #else /* not MULE */
987
988 # define bytecount_to_charcount(ptr, len) (len)
989 # define charcount_to_bytecount(ptr, len) (len)
990
991 #endif /* not MULE */
992
993 #define string_length(s) ((s)->size)
994 #define XSTRING_LENGTH(s) string_length (XSTRING (s))
995 #define XSTRING_CHAR_LENGTH(s) string_char_length (XSTRING (s))
996 #define string_data(s) ((s)->data + 0)
997 #define XSTRING_DATA(s) string_data (XSTRING (s))
998 #define string_byte(s, i) ((s)->data[i] + 0)
999 #define XSTRING_BYTE(s, i) string_byte (XSTRING (s), i)
1000 #define string_byte_addr(s, i) (&((s)->data[i]))
1001 #define set_string_length(s, len) ((void) ((s)->size = (len)))
1002 #define set_string_data(s, ptr) ((void) ((s)->data = (ptr)))
1003 #define set_string_byte(s, i, c) ((void) ((s)->data[i] = (c)))
1004
1005 void resize_string (Lisp_String *s, Bytecount pos, Bytecount delta);
1006
1007 #ifdef MULE
1008
1009 INLINE Charcount string_char_length (Lisp_String *s);
1010 INLINE Charcount
1011 string_char_length (Lisp_String *s)
1012 {
1013   return bytecount_to_charcount (string_data (s), string_length (s));
1014 }
1015
1016 # define string_char(s, i) charptr_emchar_n (string_data (s), i)
1017 # define string_char_addr(s, i) charptr_n_addr (string_data (s), i)
1018 void set_string_char (Lisp_String *s, Charcount i, Emchar c);
1019
1020 #else /* not MULE */
1021
1022 # define string_char_length(s) string_length (s)
1023 # define string_char(s, i) ((Emchar) string_byte (s, i))
1024 # define string_char_addr(s, i) string_byte_addr (s, i)
1025 # define set_string_char(s, i, c) set_string_byte (s, i, c)
1026
1027 #endif /* not MULE */
1028
1029 /*********** vector ***********/
1030
1031 struct Lisp_Vector
1032 {
1033   struct lcrecord_header header;
1034   long size;
1035   /* next is now chained through v->contents[size], terminated by Qzero.
1036      This means that pure vectors don't need a "next" */
1037   /* struct Lisp_Vector *next; */
1038   Lisp_Object contents[1];
1039 };
1040 typedef struct Lisp_Vector Lisp_Vector;
1041
1042 DECLARE_LRECORD (vector, Lisp_Vector);
1043 #define XVECTOR(x) XRECORD (x, vector, Lisp_Vector)
1044 #define XSETVECTOR(x, p) XSETRECORD (x, p, vector)
1045 #define VECTORP(x) RECORDP (x, vector)
1046 #define CHECK_VECTOR(x) CHECK_RECORD (x, vector)
1047 #define CONCHECK_VECTOR(x) CONCHECK_RECORD (x, vector)
1048
1049 #define vector_length(v) ((v)->size)
1050 #define XVECTOR_LENGTH(s) vector_length (XVECTOR (s))
1051 #define vector_data(v) ((v)->contents)
1052 #define XVECTOR_DATA(s) vector_data (XVECTOR (s))
1053
1054 /*********** bit vector ***********/
1055
1056 #if (LONGBITS < 16)
1057 #error What the hell?!
1058 #elif (LONGBITS < 32)
1059 # define LONGBITS_LOG2 4
1060 # define LONGBITS_POWER_OF_2 16
1061 #elif (LONGBITS < 64)
1062 # define LONGBITS_LOG2 5
1063 # define LONGBITS_POWER_OF_2 32
1064 #elif (LONGBITS < 128)
1065 # define LONGBITS_LOG2 6
1066 # define LONGBITS_POWER_OF_2 64
1067 #else
1068 #error You really have 128-bit integers?!
1069 #endif
1070
1071 struct Lisp_Bit_Vector
1072 {
1073   struct lrecord_header lheader;
1074   Lisp_Object next;
1075   size_t size;
1076   unsigned long bits[1];
1077 };
1078 typedef struct Lisp_Bit_Vector Lisp_Bit_Vector;
1079
1080 DECLARE_LRECORD (bit_vector, Lisp_Bit_Vector);
1081 #define XBIT_VECTOR(x) XRECORD (x, bit_vector, Lisp_Bit_Vector)
1082 #define XSETBIT_VECTOR(x, p) XSETRECORD (x, p, bit_vector)
1083 #define BIT_VECTORP(x) RECORDP (x, bit_vector)
1084 #define CHECK_BIT_VECTOR(x) CHECK_RECORD (x, bit_vector)
1085 #define CONCHECK_BIT_VECTOR(x) CONCHECK_RECORD (x, bit_vector)
1086
1087 #define BITP(x) (INTP (x) && (XINT (x) == 0 || XINT (x) == 1))
1088
1089 #define CHECK_BIT(x) do {               \
1090   if (!BITP (x))                        \
1091     dead_wrong_type_argument (Qbitp, x);\
1092 } while (0)
1093
1094 #define CONCHECK_BIT(x) do {            \
1095   if (!BITP (x))                        \
1096     x = wrong_type_argument (Qbitp, x); \
1097 } while (0)
1098
1099 #define bit_vector_length(v) ((v)->size)
1100 #define bit_vector_next(v) ((v)->next)
1101
1102 INLINE int bit_vector_bit (Lisp_Bit_Vector *v, size_t n);
1103 INLINE int
1104 bit_vector_bit (Lisp_Bit_Vector *v, size_t n)
1105 {
1106   return ((v->bits[n >> LONGBITS_LOG2] >> (n & (LONGBITS_POWER_OF_2 - 1)))
1107           & 1);
1108 }
1109
1110 INLINE void set_bit_vector_bit (Lisp_Bit_Vector *v, size_t n, int value);
1111 INLINE void
1112 set_bit_vector_bit (Lisp_Bit_Vector *v, size_t n, int value)
1113 {
1114   if (value)
1115     v->bits[n >> LONGBITS_LOG2] |= (1UL << (n & (LONGBITS_POWER_OF_2 - 1)));
1116   else
1117     v->bits[n >> LONGBITS_LOG2] &= ~(1UL << (n & (LONGBITS_POWER_OF_2 - 1)));
1118 }
1119
1120 /* Number of longs required to hold LEN bits */
1121 #define BIT_VECTOR_LONG_STORAGE(len) \
1122   (((len) + LONGBITS_POWER_OF_2 - 1) >> LONGBITS_LOG2)
1123
1124
1125 /*********** symbol ***********/
1126
1127 struct Lisp_Symbol
1128 {
1129   struct lrecord_header lheader;
1130   /* next symbol in this obarray bucket */
1131   struct Lisp_Symbol *next;
1132   struct Lisp_String *name;
1133   Lisp_Object value;
1134   Lisp_Object function;
1135   Lisp_Object plist;
1136 };
1137 typedef struct Lisp_Symbol Lisp_Symbol;
1138
1139 #define SYMBOL_IS_KEYWORD(sym)                                          \
1140   ((string_byte (symbol_name (XSYMBOL (sym)), 0) == ':')                \
1141    && EQ (sym, oblookup (Vobarray,                                      \
1142                          string_data (symbol_name (XSYMBOL (sym))),     \
1143                          string_length (symbol_name (XSYMBOL (sym))))))
1144 #define KEYWORDP(obj) (SYMBOLP (obj) && SYMBOL_IS_KEYWORD (obj))
1145
1146 DECLARE_LRECORD (symbol, Lisp_Symbol);
1147 #define XSYMBOL(x) XRECORD (x, symbol, Lisp_Symbol)
1148 #define XSETSYMBOL(x, p) XSETRECORD (x, p, symbol)
1149 #define SYMBOLP(x) RECORDP (x, symbol)
1150 #define CHECK_SYMBOL(x) CHECK_RECORD (x, symbol)
1151 #define CONCHECK_SYMBOL(x) CONCHECK_RECORD (x, symbol)
1152
1153 #define symbol_next(s) ((s)->next)
1154 #define symbol_name(s) ((s)->name)
1155 #define symbol_value(s) ((s)->value)
1156 #define symbol_function(s) ((s)->function)
1157 #define symbol_plist(s) ((s)->plist)
1158
1159 /*********** subr ***********/
1160
1161 typedef Lisp_Object (*lisp_fn_t) (void);
1162
1163 struct Lisp_Subr
1164 {
1165   struct lrecord_header lheader;
1166   short min_args, max_args;
1167   CONST char *prompt;
1168   CONST char *doc;
1169   CONST char *name;
1170   lisp_fn_t subr_fn;
1171 };
1172 typedef struct Lisp_Subr Lisp_Subr;
1173
1174 DECLARE_LRECORD (subr, Lisp_Subr);
1175 #define XSUBR(x) XRECORD (x, subr, Lisp_Subr)
1176 #define XSETSUBR(x, p) XSETRECORD (x, p, subr)
1177 #define SUBRP(x) RECORDP (x, subr)
1178 #define CHECK_SUBR(x) CHECK_RECORD (x, subr)
1179 #define CONCHECK_SUBR(x) CONCHECK_RECORD (x, subr)
1180
1181 #define subr_function(subr) (subr)->subr_fn
1182 #define subr_name(subr) (subr)->name
1183
1184 /*********** marker ***********/
1185
1186 struct Lisp_Marker
1187 {
1188   struct lrecord_header lheader;
1189   struct Lisp_Marker *next, *prev;
1190   struct buffer *buffer;
1191   Memind memind;
1192   char insertion_type;
1193 };
1194 typedef struct Lisp_Marker Lisp_Marker;
1195
1196 DECLARE_LRECORD (marker, Lisp_Marker);
1197 #define XMARKER(x) XRECORD (x, marker, Lisp_Marker)
1198 #define XSETMARKER(x, p) XSETRECORD (x, p, marker)
1199 #define MARKERP(x) RECORDP (x, marker)
1200 #define CHECK_MARKER(x) CHECK_RECORD (x, marker)
1201 #define CONCHECK_MARKER(x) CONCHECK_RECORD (x, marker)
1202
1203 /* The second check was looking for GCed markers still in use */
1204 /* if (INTP (XMARKER (x)->lheader.next.v)) abort (); */
1205
1206 #define marker_next(m) ((m)->next)
1207 #define marker_prev(m) ((m)->prev)
1208
1209 /*********** char ***********/
1210
1211 #define CHARP(x) (XTYPE (x) == Lisp_Type_Char)
1212
1213 #ifdef ERROR_CHECK_TYPECHECK
1214
1215 INLINE Emchar XCHAR (Lisp_Object obj);
1216 INLINE Emchar
1217 XCHAR (Lisp_Object obj)
1218 {
1219   assert (CHARP (obj));
1220   return XCHARVAL (obj);
1221 }
1222
1223 #else
1224
1225 #define XCHAR(x) XCHARVAL (x)
1226
1227 #endif
1228
1229 #define CHECK_CHAR(x) CHECK_NONRECORD (x, Lisp_Type_Char, Qcharacterp)
1230 #define CONCHECK_CHAR(x) CONCHECK_NONRECORD (x, Lisp_Type_Char, Qcharacterp)
1231
1232
1233 /*********** float ***********/
1234
1235 #ifdef LISP_FLOAT_TYPE
1236
1237 /* Note: the 'unused_next_' field exists only to ensure that the
1238    `next' pointer fits within the structure, for the purposes of the
1239    free list.  This makes a difference in the unlikely case of
1240    sizeof(double) being smaller than sizeof(void *). */
1241
1242 struct Lisp_Float
1243 {
1244   struct lrecord_header lheader;
1245   union { double d; struct Lisp_Float *unused_next_; } data;
1246 };
1247 typedef struct Lisp_Float Lisp_Float;
1248
1249 DECLARE_LRECORD (float, Lisp_Float);
1250 #define XFLOAT(x) XRECORD (x, float, Lisp_Float)
1251 #define XSETFLOAT(x, p) XSETRECORD (x, p, float)
1252 #define FLOATP(x) RECORDP (x, float)
1253 #define CHECK_FLOAT(x) CHECK_RECORD (x, float)
1254 #define CONCHECK_FLOAT(x) CONCHECK_RECORD (x, float)
1255
1256 #define float_data(f) ((f)->data.d)
1257 #define XFLOAT_DATA(x) float_data (XFLOAT (x))
1258
1259 #define XFLOATINT(n) extract_float (n)
1260
1261 #define CHECK_INT_OR_FLOAT(x) do {              \
1262   if (!INT_OR_FLOATP (x))                       \
1263     dead_wrong_type_argument (Qnumberp, x);     \
1264 } while (0)
1265
1266 #define CONCHECK_INT_OR_FLOAT(x) do {           \
1267   if (!INT_OR_FLOATP (x))                       \
1268     x = wrong_type_argument (Qnumberp, x);      \
1269 } while (0)
1270
1271 # define INT_OR_FLOATP(x) (INTP (x) || FLOATP (x))
1272
1273 #else /* not LISP_FLOAT_TYPE */
1274
1275 #define XFLOAT(x) --- error!  No float support. ---
1276 #define XSETFLOAT(x, p) --- error!  No float support. ---
1277 #define FLOATP(x) 0
1278 #define CHECK_FLOAT(x) --- error!  No float support. ---
1279 #define CONCHECK_FLOAT(x) --- error!  No float support. ---
1280
1281 #define XFLOATINT(n) XINT(n)
1282 #define CHECK_INT_OR_FLOAT CHECK_INT
1283 #define CONCHECK_INT_OR_FLOAT CONCHECK_INT
1284 #define INT_OR_FLOATP(x) INTP (x)
1285
1286 #endif /* not LISP_FLOAT_TYPE */
1287
1288 /*********** int ***********/
1289
1290 #define ZEROP(x) EQ (x, Qzero)
1291
1292 #ifdef ERROR_CHECK_TYPECHECK
1293
1294 INLINE EMACS_INT XINT (Lisp_Object obj);
1295 INLINE EMACS_INT
1296 XINT (Lisp_Object obj)
1297 {
1298   assert (INTP (obj));
1299   return XREALINT (obj);
1300 }
1301
1302 INLINE EMACS_INT XCHAR_OR_INT (Lisp_Object obj);
1303 INLINE EMACS_INT
1304 XCHAR_OR_INT (Lisp_Object obj)
1305 {
1306   assert (INTP (obj) || CHARP (obj));
1307   return CHARP (obj) ? XCHAR (obj) : XINT (obj);
1308 }
1309
1310 #else /* no error checking */
1311
1312 #define XINT(obj) XREALINT (obj)
1313 #define XCHAR_OR_INT(obj) (CHARP (obj) ? XCHAR (obj) : XINT (obj))
1314
1315 #endif /* no error checking */
1316
1317 #define CHECK_INT(x) do {                       \
1318   if (!INTP (x))                                \
1319     dead_wrong_type_argument (Qintegerp, x);    \
1320 } while (0)
1321
1322 #define CONCHECK_INT(x) do {                    \
1323   if (!INTP (x))                                \
1324     x = wrong_type_argument (Qintegerp, x);     \
1325 } while (0)
1326
1327 #define NATNUMP(x) (INTP (x) && XINT (x) >= 0)
1328
1329 #define CHECK_NATNUM(x) do {                    \
1330   if (!NATNUMP (x))                             \
1331     dead_wrong_type_argument (Qnatnump, x);     \
1332 } while (0)
1333
1334 #define CONCHECK_NATNUM(x) do {                 \
1335   if (!NATNUMP (x))                             \
1336     x = wrong_type_argument (Qnatnump, x);      \
1337 } while (0)
1338
1339 /* next three always continuable because they coerce their arguments. */
1340 #define CHECK_INT_COERCE_CHAR(x) do {                   \
1341   if (INTP (x))                                         \
1342     ;                                                   \
1343   else if (CHARP (x))                                   \
1344     x = make_int (XCHAR (x));                           \
1345   else                                                  \
1346     x = wrong_type_argument (Qinteger_or_char_p, x);    \
1347 } while (0)
1348
1349 #define CHECK_INT_COERCE_MARKER(x) do {                 \
1350   if (INTP (x))                                         \
1351     ;                                                   \
1352   else if (MARKERP (x))                                 \
1353     x = make_int (marker_position (x));                 \
1354   else                                                  \
1355     x = wrong_type_argument (Qinteger_or_marker_p, x);  \
1356 } while (0)
1357
1358 #define CHECK_INT_COERCE_CHAR_OR_MARKER(x) do {                 \
1359   if (INTP (x))                                                 \
1360     ;                                                           \
1361   else if (CHARP (x))                                           \
1362     x = make_int (XCHAR (x));                                   \
1363   else if (MARKERP (x))                                         \
1364     x = make_int (marker_position (x));                         \
1365   else                                                          \
1366     x = wrong_type_argument (Qinteger_char_or_marker_p, x);     \
1367 } while (0)
1368
1369
1370 /*********** readonly objects ***********/
1371     
1372 #define CHECK_C_WRITEABLE(obj)                                  \
1373   do { if (c_readonly (obj)) c_write_error (obj); } while (0)
1374
1375 #define CHECK_LISP_WRITEABLE(obj)                                       \
1376   do { if (lisp_readonly (obj)) lisp_write_error (obj); } while (0)
1377
1378 #define C_READONLY(obj) (C_READONLY_RECORD_HEADER_P(XRECORD_LHEADER (obj)))
1379 #define LISP_READONLY(obj) (LISP_READONLY_RECORD_HEADER_P(XRECORD_LHEADER (obj)))
1380
1381 /*********** structures ***********/
1382
1383 typedef struct structure_keyword_entry structure_keyword_entry;
1384 struct structure_keyword_entry
1385 {
1386   Lisp_Object keyword;
1387   int (*validate) (Lisp_Object keyword, Lisp_Object value,
1388                    Error_behavior errb);
1389 };
1390
1391 typedef struct
1392 {
1393   Dynarr_declare (structure_keyword_entry);
1394 } structure_keyword_entry_dynarr;
1395
1396 typedef struct structure_type structure_type;
1397 struct structure_type
1398 {
1399   Lisp_Object type;
1400   structure_keyword_entry_dynarr *keywords;
1401   int (*validate) (Lisp_Object data, Error_behavior errb);
1402   Lisp_Object (*instantiate) (Lisp_Object data);
1403 };
1404
1405 typedef struct
1406 {
1407   Dynarr_declare (structure_type);
1408 } structure_type_dynarr;
1409
1410 struct structure_type *define_structure_type (Lisp_Object type,
1411                                               int (*validate)
1412                                               (Lisp_Object data,
1413                                                Error_behavior errb),
1414                                               Lisp_Object (*instantiate)
1415                                               (Lisp_Object data));
1416 void define_structure_type_keyword (struct structure_type *st,
1417                                     Lisp_Object keyword,
1418                                     int (*validate) (Lisp_Object keyword,
1419                                                      Lisp_Object value,
1420                                                      Error_behavior errb));
1421
1422 /*********** weak lists ***********/
1423
1424 enum weak_list_type
1425 {
1426   /* element disappears if it's unmarked. */
1427   WEAK_LIST_SIMPLE,
1428   /* element disappears if it's a cons and either its car or
1429      cdr is unmarked. */
1430   WEAK_LIST_ASSOC,
1431   /* element disappears if it's a cons and its car is unmarked. */
1432   WEAK_LIST_KEY_ASSOC,
1433   /* element disappears if it's a cons and its cdr is unmarked. */
1434   WEAK_LIST_VALUE_ASSOC
1435 };
1436
1437 struct weak_list
1438 {
1439   struct lcrecord_header header;
1440   Lisp_Object list; /* don't mark through this! */
1441   enum weak_list_type type;
1442   Lisp_Object next_weak; /* don't mark through this! */
1443 };
1444
1445 DECLARE_LRECORD (weak_list, struct weak_list);
1446 #define XWEAK_LIST(x) XRECORD (x, weak_list, struct weak_list)
1447 #define XSETWEAK_LIST(x, p) XSETRECORD (x, p, weak_list)
1448 #define WEAK_LISTP(x) RECORDP (x, weak_list)
1449 #define CHECK_WEAK_LIST(x) CHECK_RECORD (x, weak_list)
1450 #define CONCHECK_WEAK_LIST(x) CONCHECK_RECORD (x, weak_list)
1451
1452 #define weak_list_list(w) ((w)->list)
1453 #define XWEAK_LIST_LIST(w) (XWEAK_LIST (w)->list)
1454
1455 Lisp_Object make_weak_list (enum weak_list_type type);
1456 /* The following two are only called by the garbage collector */
1457 int finish_marking_weak_lists (void);
1458 void prune_weak_lists (void);
1459
1460 /*********** lcrecord lists ***********/
1461
1462 struct lcrecord_list
1463 {
1464   struct lcrecord_header header;
1465   Lisp_Object free;
1466   size_t size;
1467   CONST struct lrecord_implementation *implementation;
1468 };
1469
1470 DECLARE_LRECORD (lcrecord_list, struct lcrecord_list);
1471 #define XLCRECORD_LIST(x) XRECORD (x, lcrecord_list, struct lcrecord_list)
1472 #define XSETLCRECORD_LIST(x, p) XSETRECORD (x, p, lcrecord_list)
1473 #define LCRECORD_LISTP(x) RECORDP (x, lcrecord_list)
1474 /* #define CHECK_LCRECORD_LIST(x) CHECK_RECORD (x, lcrecord_list)
1475    Lcrecord lists should never escape to the Lisp level, so
1476    functions should not be doing this. */
1477
1478 Lisp_Object make_lcrecord_list (size_t size,
1479                                 CONST struct lrecord_implementation
1480                                 *implementation);
1481 Lisp_Object allocate_managed_lcrecord (Lisp_Object lcrecord_list);
1482 void free_managed_lcrecord (Lisp_Object lcrecord_list, Lisp_Object lcrecord);
1483
1484 \f
1485 /************************************************************************/
1486 /*         Definitions of primitive Lisp functions and variables        */
1487 /************************************************************************/
1488
1489
1490 /* DEFUN - Define a built-in Lisp-visible C function or `subr'.
1491  `lname' should be the name to give the function in Lisp,
1492     as a null-terminated C string.
1493  `Fname' should be the C equivalent of `lname', using only characters
1494     valid in a C identifier, with an "F" prepended.
1495     The name of the C constant structure that records information
1496     on this function for internal use is "S" concatenated with Fname.
1497  `min_args' should be a number, the minimum number of arguments allowed.
1498  `max_args' should be a number, the maximum number of arguments allowed,
1499     or else MANY or UNEVALLED.
1500     MANY means pass a vector of evaluated arguments,
1501          in the form of an integer number-of-arguments
1502          followed by the address of a vector of Lisp_Objects
1503          which contains the argument values.
1504     UNEVALLED means pass the list of unevaluated arguments.
1505  `prompt' says how to read arguments for an interactive call.
1506     See the doc string for `interactive'.
1507     A null string means call interactively with no arguments.
1508  `arglist' are the comma-separated arguments (always Lisp_Objects) for
1509     the function.
1510   The docstring for the function is placed as a "C" comment between
1511     the prompt and the `args' argument.  make-docfile reads the
1512     comment and creates the DOC file from it.
1513 */
1514
1515 #define EXFUN_0 void
1516 #define EXFUN_1 Lisp_Object
1517 #define EXFUN_2 Lisp_Object,Lisp_Object
1518 #define EXFUN_3 Lisp_Object,Lisp_Object,Lisp_Object
1519 #define EXFUN_4 Lisp_Object,Lisp_Object,Lisp_Object,Lisp_Object
1520 #define EXFUN_5 Lisp_Object,Lisp_Object,Lisp_Object,Lisp_Object,Lisp_Object
1521 #define EXFUN_6 Lisp_Object,Lisp_Object,Lisp_Object,Lisp_Object,Lisp_Object, \
1522 Lisp_Object
1523 #define EXFUN_7 Lisp_Object,Lisp_Object,Lisp_Object,Lisp_Object,Lisp_Object, \
1524 Lisp_Object,Lisp_Object
1525 #define EXFUN_8 Lisp_Object,Lisp_Object,Lisp_Object,Lisp_Object,Lisp_Object, \
1526 Lisp_Object,Lisp_Object,Lisp_Object
1527 #define EXFUN_MANY int, Lisp_Object*
1528 #define EXFUN_UNEVALLED Lisp_Object
1529 #define EXFUN(sym, max_args) Lisp_Object sym (EXFUN_##max_args)
1530
1531 #define SUBR_MAX_ARGS 8
1532 #define MANY -2
1533 #define UNEVALLED -1
1534
1535 /* Can't be const, because then subr->doc is read-only and
1536    Snarf_documentation chokes */
1537
1538 #define subr_lheader_initializer { 0, 0, 0, 0 }
1539
1540 #define DEFUN(lname, Fname, min_args, max_args, prompt, arglist)        \
1541   Lisp_Object Fname (EXFUN_##max_args);                                 \
1542   static struct Lisp_Subr S##Fname = { subr_lheader_initializer,        \
1543         min_args, max_args, prompt, 0, lname, (lisp_fn_t) Fname };      \
1544   Lisp_Object Fname (DEFUN_##max_args arglist)
1545
1546 /* Heavy ANSI C preprocessor hackery to get DEFUN to declare a
1547    prototype that matches max_args, and add the obligatory
1548    `Lisp_Object' type declaration to the formal C arguments.  */
1549
1550 #define DEFUN_MANY(named_int, named_Lisp_Object) named_int, named_Lisp_Object
1551 #define DEFUN_UNEVALLED(args) Lisp_Object args
1552 #define DEFUN_0() void
1553 #define DEFUN_1(a)                                      Lisp_Object a
1554 #define DEFUN_2(a,b)             DEFUN_1(a),            Lisp_Object b
1555 #define DEFUN_3(a,b,c)           DEFUN_2(a,b),          Lisp_Object c
1556 #define DEFUN_4(a,b,c,d)         DEFUN_3(a,b,c),        Lisp_Object d
1557 #define DEFUN_5(a,b,c,d,e)       DEFUN_4(a,b,c,d),      Lisp_Object e
1558 #define DEFUN_6(a,b,c,d,e,f)     DEFUN_5(a,b,c,d,e),    Lisp_Object f
1559 #define DEFUN_7(a,b,c,d,e,f,g)   DEFUN_6(a,b,c,d,e,f),  Lisp_Object g
1560 #define DEFUN_8(a,b,c,d,e,f,g,h) DEFUN_7(a,b,c,d,e,f,g),Lisp_Object h
1561
1562 /* WARNING: If you add defines here for higher values of max_args,
1563    make sure to also fix the clauses in PRIMITIVE_FUNCALL(),
1564    and change the define of SUBR_MAX_ARGS above.  */
1565
1566 #include "symeval.h"
1567
1568 /* `specpdl' is the special binding/unwind-protect stack.
1569
1570    Knuth says (see the Jargon File):
1571    At MIT, `pdl' [abbreviation for `Push Down List'] used to
1572    be a more common synonym for `stack'.
1573    Everywhere else `stack' seems to be the preferred term.
1574
1575    specpdl_depth is the current depth of `specpdl'.
1576    Save this for use later as arg to `unbind_to'.  */
1577 extern int specpdl_depth_counter;
1578 #define specpdl_depth() specpdl_depth_counter
1579
1580 \f
1581 /************************************************************************/
1582 /*                         Checking for QUIT                            */
1583 /************************************************************************/
1584
1585 /* Asynchronous events set something_happened, and then are processed
1586    within the QUIT macro.  At this point, we are guaranteed to not be in
1587    any sensitive code. */
1588
1589 extern volatile int something_happened;
1590 int check_what_happened (void);
1591
1592 extern volatile int quit_check_signal_happened;
1593 extern volatile int quit_check_signal_tick_count;
1594 int check_quit (void);
1595
1596 void signal_quit (void);
1597
1598 /* Nonzero if ought to quit now.  */
1599 #define QUITP                                                   \
1600   ((quit_check_signal_happened ? check_quit () : 0),            \
1601    (!NILP (Vquit_flag) && (NILP (Vinhibit_quit)                 \
1602                            || EQ (Vquit_flag, Qcritical))))
1603
1604 /* QUIT used to call QUITP, but there are some places where QUITP
1605    is called directly, and check_what_happened() should only be called
1606    when Emacs is actually ready to quit because it could do things
1607    like switch threads. */
1608 #define INTERNAL_QUITP                                          \
1609   ((something_happened ? check_what_happened () : 0),           \
1610    (!NILP (Vquit_flag) &&                                       \
1611     (NILP (Vinhibit_quit) || EQ (Vquit_flag, Qcritical))))
1612
1613 #define INTERNAL_REALLY_QUITP                                   \
1614   (check_what_happened (),                                      \
1615    (!NILP (Vquit_flag) &&                                       \
1616     (NILP (Vinhibit_quit) || EQ (Vquit_flag, Qcritical))))
1617
1618 /* Check quit-flag and quit if it is non-nil.  Also do any other things
1619    that might have gotten queued until it was safe. */
1620 #define QUIT do { if (INTERNAL_QUITP) signal_quit (); } while (0)
1621
1622 #define REALLY_QUIT do { if (INTERNAL_REALLY_QUITP) signal_quit (); } while (0)
1623
1624 \f
1625 /************************************************************************/
1626 /*                               hashing                                */
1627 /************************************************************************/
1628
1629 /* #### for a 64-bit machine, we should substitute a prime just over 2^32 */
1630 #define GOOD_HASH 65599 /* prime number just over 2^16; Dragon book, p. 435 */
1631 #define HASH2(a,b)               (GOOD_HASH * (a)                     + (b))
1632 #define HASH3(a,b,c)             (GOOD_HASH * HASH2 (a,b)             + (c))
1633 #define HASH4(a,b,c,d)           (GOOD_HASH * HASH3 (a,b,c)           + (d))
1634 #define HASH5(a,b,c,d,e)         (GOOD_HASH * HASH4 (a,b,c,d)         + (e))
1635 #define HASH6(a,b,c,d,e,f)       (GOOD_HASH * HASH5 (a,b,c,d,e)       + (f))
1636 #define HASH7(a,b,c,d,e,f,g)     (GOOD_HASH * HASH6 (a,b,c,d,e,f)     + (g))
1637 #define HASH8(a,b,c,d,e,f,g,h)   (GOOD_HASH * HASH7 (a,b,c,d,e,f,g)   + (h))
1638 #define HASH9(a,b,c,d,e,f,g,h,i) (GOOD_HASH * HASH8 (a,b,c,d,e,f,g,h) + (i))
1639
1640 #define LISP_HASH(obj) ((unsigned long) LISP_TO_VOID (obj))
1641 unsigned long string_hash (CONST void *xv);
1642 unsigned long memory_hash (CONST void *xv, size_t size);
1643 unsigned long internal_hash (Lisp_Object obj, int depth);
1644 unsigned long internal_array_hash (Lisp_Object *arr, int size, int depth);
1645
1646 \f
1647 /************************************************************************/
1648 /*                       String translation                             */
1649 /************************************************************************/
1650
1651 #ifdef I18N3
1652 #ifdef HAVE_LIBINTL_H
1653 #include <libintl.h>
1654 #else
1655 char *dgettext       (CONST char *, CONST char *);
1656 char *gettext        (CONST char *);
1657 char *textdomain     (CONST char *);
1658 char *bindtextdomain (CONST char *, CONST char *);
1659 #endif /* HAVE_LIBINTL_H */
1660
1661 #define GETTEXT(x)  gettext(x)
1662 #define LISP_GETTEXT(x)  Fgettext (x)
1663 #else /* !I18N3 */
1664 #define GETTEXT(x)  (x)
1665 #define LISP_GETTEXT(x)  (x)
1666 #endif /* !I18N3 */
1667
1668 /* DEFER_GETTEXT is used to identify strings which are translated when
1669    they are referenced instead of when they are defined.
1670    These include Qerror_messages and initialized arrays of strings.
1671 */
1672 #define DEFER_GETTEXT(x) (x)
1673
1674 \f
1675 /************************************************************************/
1676 /*                   Garbage collection / GC-protection                 */
1677 /************************************************************************/
1678
1679 /* number of bytes of structure consed since last GC */
1680
1681 extern EMACS_INT consing_since_gc;
1682
1683 /* threshold for doing another gc */
1684
1685 extern EMACS_INT gc_cons_threshold;
1686
1687 /* Structure for recording stack slots that need marking */
1688
1689 /* This is a chain of structures, each of which points at a Lisp_Object
1690    variable whose value should be marked in garbage collection.
1691    Normally every link of the chain is an automatic variable of a function,
1692    and its `val' points to some argument or local variable of the function.
1693    On exit to the function, the chain is set back to the value it had on
1694    entry.  This way, no link remains in the chain when the stack frame
1695    containing the link disappears.
1696
1697    Every function that can call Feval must protect in this fashion all
1698    Lisp_Object variables whose contents will be used again. */
1699
1700 extern struct gcpro *gcprolist;
1701
1702 struct gcpro
1703 {
1704   struct gcpro *next;
1705   Lisp_Object *var;             /* Address of first protected variable */
1706   int nvars;                    /* Number of consecutive protected variables */
1707 };
1708
1709 /* Normally, you declare variables gcpro1, gcpro2, ... and use the
1710    GCPROn() macros.  However, if you need to have nested gcpro's,
1711    declare ngcpro1, ngcpro2, ... and use NGCPROn().  If you need
1712    to nest another level, use nngcpro1, nngcpro2, ... and use
1713    NNGCPROn().  If you need to nest yet another level, create
1714    the appropriate macros. */
1715
1716 #ifdef DEBUG_GCPRO
1717
1718 void debug_gcpro1 (char *, int, struct gcpro *, Lisp_Object *);
1719 void debug_gcpro2 (char *, int, struct gcpro *, struct gcpro *,
1720                    Lisp_Object *, Lisp_Object *);
1721 void debug_gcpro3 (char *, int, struct gcpro *, struct gcpro *, struct gcpro *,
1722                    Lisp_Object *, Lisp_Object *, Lisp_Object *);
1723 void debug_gcpro4 (char *, int, struct gcpro *, struct gcpro *, struct gcpro *,
1724                    struct gcpro *, Lisp_Object *, Lisp_Object *, Lisp_Object *,
1725                    Lisp_Object *);
1726 void debug_gcpro5 (char *, int, struct gcpro *, struct gcpro *, struct gcpro *,
1727                    struct gcpro *, struct gcpro *, Lisp_Object *, Lisp_Object *,
1728                    Lisp_Object *, Lisp_Object *, Lisp_Object *);
1729 void debug_ungcpro(char *, int, struct gcpro *);
1730
1731 #define GCPRO1(v) \
1732  debug_gcpro1 (__FILE__, __LINE__,&gcpro1,&v)
1733 #define GCPRO2(v1,v2) \
1734  debug_gcpro2 (__FILE__, __LINE__,&gcpro1,&gcpro2,&v1,&v2)
1735 #define GCPRO3(v1,v2,v3) \
1736  debug_gcpro3 (__FILE__, __LINE__,&gcpro1,&gcpro2,&gcpro3,&v1,&v2,&v3)
1737 #define GCPRO4(v1,v2,v3,v4) \
1738  debug_gcpro4 (__FILE__, __LINE__,&gcpro1,&gcpro2,&gcpro3,&gcpro4,\
1739                &v1,&v2,&v3,&v4)
1740 #define GCPRO5(v1,v2,v3,v4,v5) \
1741  debug_gcpro5 (__FILE__, __LINE__,&gcpro1,&gcpro2,&gcpro3,&gcpro4,&gcpro5,\
1742                &v1,&v2,&v3,&v4,&v5)
1743 #define UNGCPRO \
1744  debug_ungcpro(__FILE__, __LINE__,&gcpro1)
1745
1746 #define NGCPRO1(v) \
1747  debug_gcpro1 (__FILE__, __LINE__,&ngcpro1,&v)
1748 #define NGCPRO2(v1,v2) \
1749  debug_gcpro2 (__FILE__, __LINE__,&ngcpro1,&ngcpro2,&v1,&v2)
1750 #define NGCPRO3(v1,v2,v3) \
1751  debug_gcpro3 (__FILE__, __LINE__,&ngcpro1,&ngcpro2,&ngcpro3,&v1,&v2,&v3)
1752 #define NGCPRO4(v1,v2,v3,v4) \
1753  debug_gcpro4 (__FILE__, __LINE__,&ngcpro1,&ngcpro2,&ngcpro3,&ngcpro4,\
1754                &v1,&v2,&v3,&v4)
1755 #define NGCPRO5(v1,v2,v3,v4,v5) \
1756  debug_gcpro5 (__FILE__, __LINE__,&ngcpro1,&ngcpro2,&ngcpro3,&ngcpro4,\
1757                &ngcpro5,&v1,&v2,&v3,&v4,&v5)
1758 #define NUNGCPRO \
1759  debug_ungcpro(__FILE__, __LINE__,&ngcpro1)
1760
1761 #define NNGCPRO1(v) \
1762  debug_gcpro1 (__FILE__, __LINE__,&nngcpro1,&v)
1763 #define NNGCPRO2(v1,v2) \
1764  debug_gcpro2 (__FILE__, __LINE__,&nngcpro1,&nngcpro2,&v1,&v2)
1765 #define NNGCPRO3(v1,v2,v3) \
1766  debug_gcpro3 (__FILE__, __LINE__,&nngcpro1,&nngcpro2,&nngcpro3,&v1,&v2,&v3)
1767 #define NNGCPRO4(v1,v2,v3,v4) \
1768  debug_gcpro4 (__FILE__, __LINE__,&nngcpro1,&nngcpro2,&nngcpro3,&nngcpro4,\
1769                &v1,&v2,&v3,&v4)
1770 #define NNGCPRO5(v1,v2,v3,v4,v5) \
1771  debug_gcpro5 (__FILE__, __LINE__,&nngcpro1,&nngcpro2,&nngcpro3,&nngcpro4,\
1772                &nngcpro5,&v1,&v2,&v3,&v4,&v5)
1773 #define NNUNGCPRO \
1774  debug_ungcpro(__FILE__, __LINE__,&nngcpro1)
1775
1776 #else /* ! DEBUG_GCPRO */
1777
1778 #define GCPRO1(var1) ((void) (                                          \
1779   gcpro1.next = gcprolist, gcpro1.var = &var1, gcpro1.nvars = 1,        \
1780   gcprolist = &gcpro1 ))
1781
1782 #define GCPRO2(var1, var2) ((void) (                                    \
1783   gcpro1.next = gcprolist, gcpro1.var = &var1, gcpro1.nvars = 1,        \
1784   gcpro2.next = &gcpro1,   gcpro2.var = &var2, gcpro2.nvars = 1,        \
1785   gcprolist = &gcpro2 ))
1786
1787 #define GCPRO3(var1, var2, var3) ((void) (                              \
1788   gcpro1.next = gcprolist, gcpro1.var = &var1, gcpro1.nvars = 1,        \
1789   gcpro2.next = &gcpro1,   gcpro2.var = &var2, gcpro2.nvars = 1,        \
1790   gcpro3.next = &gcpro2,   gcpro3.var = &var3, gcpro3.nvars = 1,        \
1791   gcprolist = &gcpro3 ))
1792
1793 #define GCPRO4(var1, var2, var3, var4) ((void) (                        \
1794   gcpro1.next = gcprolist, gcpro1.var = &var1, gcpro1.nvars = 1,        \
1795   gcpro2.next = &gcpro1,   gcpro2.var = &var2, gcpro2.nvars = 1,        \
1796   gcpro3.next = &gcpro2,   gcpro3.var = &var3, gcpro3.nvars = 1,        \
1797   gcpro4.next = &gcpro3,   gcpro4.var = &var4, gcpro4.nvars = 1,        \
1798   gcprolist = &gcpro4 ))
1799
1800 #define GCPRO5(var1, var2, var3, var4, var5) ((void) (                  \
1801   gcpro1.next = gcprolist, gcpro1.var = &var1, gcpro1.nvars = 1,        \
1802   gcpro2.next = &gcpro1,   gcpro2.var = &var2, gcpro2.nvars = 1,        \
1803   gcpro3.next = &gcpro2,   gcpro3.var = &var3, gcpro3.nvars = 1,        \
1804   gcpro4.next = &gcpro3,   gcpro4.var = &var4, gcpro4.nvars = 1,        \
1805   gcpro5.next = &gcpro4,   gcpro5.var = &var5, gcpro5.nvars = 1,        \
1806   gcprolist = &gcpro5 ))
1807
1808 #define UNGCPRO ((void) (gcprolist = gcpro1.next))
1809
1810 #define NGCPRO1(var1) ((void) (                                         \
1811   ngcpro1.next = gcprolist, ngcpro1.var = &var1, ngcpro1.nvars = 1,     \
1812   gcprolist = &ngcpro1 ))
1813
1814 #define NGCPRO2(var1, var2) ((void) (                                   \
1815   ngcpro1.next = gcprolist, ngcpro1.var = &var1, ngcpro1.nvars = 1,     \
1816   ngcpro2.next = &ngcpro1,  ngcpro2.var = &var2, ngcpro2.nvars = 1,     \
1817   gcprolist = &ngcpro2 ))
1818
1819 #define NGCPRO3(var1, var2, var3) ((void) (                             \
1820   ngcpro1.next = gcprolist, ngcpro1.var = &var1, ngcpro1.nvars = 1,     \
1821   ngcpro2.next = &ngcpro1,  ngcpro2.var = &var2, ngcpro2.nvars = 1,     \
1822   ngcpro3.next = &ngcpro2,  ngcpro3.var = &var3, ngcpro3.nvars = 1,     \
1823   gcprolist = &ngcpro3 ))
1824
1825 #define NGCPRO4(var1, var2, var3, var4) ((void) (                       \
1826   ngcpro1.next = gcprolist, ngcpro1.var = &var1, ngcpro1.nvars = 1,     \
1827   ngcpro2.next = &ngcpro1,  ngcpro2.var = &var2, ngcpro2.nvars = 1,     \
1828   ngcpro3.next = &ngcpro2,  ngcpro3.var = &var3, ngcpro3.nvars = 1,     \
1829   ngcpro4.next = &ngcpro3,  ngcpro4.var = &var4, ngcpro4.nvars = 1,     \
1830   gcprolist = &ngcpro4 ))
1831
1832 #define NGCPRO5(var1, var2, var3, var4, var5) ((void) (                 \
1833   ngcpro1.next = gcprolist, ngcpro1.var = &var1, ngcpro1.nvars = 1,     \
1834   ngcpro2.next = &ngcpro1,  ngcpro2.var = &var2, ngcpro2.nvars = 1,     \
1835   ngcpro3.next = &ngcpro2,  ngcpro3.var = &var3, ngcpro3.nvars = 1,     \
1836   ngcpro4.next = &ngcpro3,  ngcpro4.var = &var4, ngcpro4.nvars = 1,     \
1837   ngcpro5.next = &ngcpro4,  ngcpro5.var = &var5, ngcpro5.nvars = 1,     \
1838   gcprolist = &ngcpro5 ))
1839
1840 #define NUNGCPRO ((void) (gcprolist = ngcpro1.next))
1841
1842 #define NNGCPRO1(var1) ((void) (                                        \
1843   nngcpro1.next = gcprolist, nngcpro1.var = &var1, nngcpro1.nvars = 1,  \
1844   gcprolist = &nngcpro1 ))
1845
1846 #define NNGCPRO2(var1, var2) ((void) (                                  \
1847   nngcpro1.next = gcprolist, nngcpro1.var = &var1, nngcpro1.nvars = 1,  \
1848   nngcpro2.next = &nngcpro1, nngcpro2.var = &var2, nngcpro2.nvars = 1,  \
1849   gcprolist = &nngcpro2 ))
1850
1851 #define NNGCPRO3(var1, var2, var3) ((void) (                            \
1852   nngcpro1.next = gcprolist, nngcpro1.var = &var1, nngcpro1.nvars = 1,  \
1853   nngcpro2.next = &nngcpro1, nngcpro2.var = &var2, nngcpro2.nvars = 1,  \
1854   nngcpro3.next = &nngcpro2, nngcpro3.var = &var3, nngcpro3.nvars = 1,  \
1855   gcprolist = &nngcpro3 ))
1856
1857 #define NNGCPRO4(var1, var2, var3, var4)  ((void) (                     \
1858   nngcpro1.next = gcprolist, nngcpro1.var = &var1, nngcpro1.nvars = 1,  \
1859   nngcpro2.next = &nngcpro1, nngcpro2.var = &var2, nngcpro2.nvars = 1,  \
1860   nngcpro3.next = &nngcpro2, nngcpro3.var = &var3, nngcpro3.nvars = 1,  \
1861   nngcpro4.next = &nngcpro3, nngcpro4.var = &var4, nngcpro4.nvars = 1,  \
1862   gcprolist = &nngcpro4 ))
1863
1864 #define NNGCPRO5(var1, var2, var3, var4, var5) ((void) (                \
1865   nngcpro1.next = gcprolist, nngcpro1.var = &var1, nngcpro1.nvars = 1,  \
1866   nngcpro2.next = &nngcpro1, nngcpro2.var = &var2, nngcpro2.nvars = 1,  \
1867   nngcpro3.next = &nngcpro2, nngcpro3.var = &var3, nngcpro3.nvars = 1,  \
1868   nngcpro4.next = &nngcpro3, nngcpro4.var = &var4, nngcpro4.nvars = 1,  \
1869   nngcpro5.next = &nngcpro4, nngcpro5.var = &var5, nngcpro5.nvars = 1,  \
1870   gcprolist = &nngcpro5 ))
1871
1872 #define NNUNGCPRO ((void) (gcprolist = nngcpro1.next))
1873
1874 #endif /* ! DEBUG_GCPRO */
1875
1876 /* Another try to fix SunPro C compiler warnings */
1877 /* "end-of-loop code not reached" */
1878 /* "statement not reached */
1879 #ifdef __SUNPRO_C
1880 #define RETURN_SANS_WARNINGS if (1) return
1881 #define RETURN_NOT_REACHED(value)
1882 #else
1883 #define RETURN_SANS_WARNINGS return
1884 #define RETURN_NOT_REACHED(value) return value;
1885 #endif
1886
1887 /* Evaluate expr, UNGCPRO, and then return the value of expr.  */
1888 #define RETURN_UNGCPRO(expr) do         \
1889 {                                       \
1890   Lisp_Object ret_ungc_val = (expr);    \
1891   UNGCPRO;                              \
1892   RETURN_SANS_WARNINGS ret_ungc_val;    \
1893 } while (0)
1894
1895 /* Evaluate expr, NUNGCPRO, UNGCPRO, and then return the value of expr.  */
1896 #define RETURN_NUNGCPRO(expr) do        \
1897 {                                       \
1898   Lisp_Object ret_ungc_val = (expr);    \
1899   NUNGCPRO;                             \
1900   UNGCPRO;                              \
1901   RETURN_SANS_WARNINGS ret_ungc_val;    \
1902 } while (0)
1903
1904 /* Evaluate expr, NNUNGCPRO, NUNGCPRO, UNGCPRO, and then return the
1905    value of expr.  */
1906 #define RETURN_NNUNGCPRO(expr) do       \
1907 {                                       \
1908   Lisp_Object ret_ungc_val = (expr);    \
1909   NNUNGCPRO;                            \
1910   NUNGCPRO;                             \
1911   UNGCPRO;                              \
1912   RETURN_SANS_WARNINGS ret_ungc_val;    \
1913 } while (0)
1914
1915 /* Evaluate expr, return it if it's not Qunbound. */
1916 #define RETURN_IF_NOT_UNBOUND(expr) do  \
1917 {                                       \
1918   Lisp_Object ret_nunb_val = (expr);    \
1919   if (!UNBOUNDP (ret_nunb_val))         \
1920     RETURN_SANS_WARNINGS ret_nunb_val;  \
1921 } while (0)
1922
1923 /* Call staticpro (&var) to protect static variable `var'. */
1924 void staticpro (Lisp_Object *);
1925
1926 /* Call staticpro_nodump (&var) to protect static variable `var'. */
1927 /* var will not be saved at dump time */
1928 void staticpro_nodump (Lisp_Object *);
1929
1930 /* Call dumpstruct(&var, &desc) to dump the structure pointed to by `var'. */
1931 void dumpstruct (void *, const struct struct_description *);
1932
1933 /* Call pdump_wire(&var) to ensure that var is properly updated after pdump. */
1934 void pdump_wire (Lisp_Object *);
1935
1936 /* Call pdump_wire(&var) to ensure that var  is properly updated after
1937    pdump.  var  must point to  a linked list  of  objects out of which
1938    some may not be dumped */
1939 void pdump_wire_list (Lisp_Object *);
1940
1941 /* Nonzero means Emacs has already been initialized.
1942    Used during startup to detect startup of dumped Emacs.  */
1943 extern int initialized;
1944
1945 #ifdef MEMORY_USAGE_STATS
1946
1947 /* This structure is used to keep statistics on the amount of memory
1948    in use.
1949
1950    WAS_REQUESTED stores the actual amount of memory that was requested
1951    of the allocation function.  The *_OVERHEAD fields store the
1952    additional amount of memory that was grabbed by the functions to
1953    facilitate allocation, reallocation, etc.  MALLOC_OVERHEAD is for
1954    memory allocated with malloc(); DYNARR_OVERHEAD is for dynamic
1955    arrays; GAP_OVERHEAD is for gap arrays.  Note that for (e.g.)
1956    dynamic arrays, there is both MALLOC_OVERHEAD and DYNARR_OVERHEAD
1957    memory: The dynamic array allocates memory above and beyond what
1958    was asked of it, and when it in turns allocates memory using
1959    malloc(), malloc() allocates memory beyond what it was asked
1960    to allocate.
1961
1962    Functions that accept a structure of this sort do not initialize
1963    the fields to 0, and add any existing values to whatever was there
1964    before; this way, you can get a cumulative effect. */
1965
1966 struct overhead_stats
1967 {
1968   int was_requested;
1969   int malloc_overhead;
1970   int dynarr_overhead;
1971   int gap_overhead;
1972 };
1973
1974 #endif /* MEMORY_USAGE_STATS */
1975
1976 #ifndef DIRECTORY_SEP
1977 #define DIRECTORY_SEP '/'
1978 #endif
1979 #ifndef IS_DIRECTORY_SEP
1980 #define IS_DIRECTORY_SEP(c) ((c) == DIRECTORY_SEP)
1981 #endif
1982 #ifndef IS_DEVICE_SEP
1983 #ifndef DEVICE_SEP
1984 #define IS_DEVICE_SEP(c) 0
1985 #else
1986 #define IS_DEVICE_SEP(c) ((c) == DEVICE_SEP)
1987 #endif
1988 #endif
1989 #ifndef IS_ANY_SEP
1990 #define IS_ANY_SEP(c) IS_DIRECTORY_SEP (c)
1991 #endif
1992
1993 #ifdef HAVE_INTTYPES_H
1994 #include <inttypes.h>
1995 #elif SIZEOF_VOID_P == SIZEOF_INT
1996 typedef int intptr_t;
1997 typedef unsigned int uintptr_t;
1998 #elif SIZEOF_VOID_P == SIZEOF_LONG
1999 typedef long intptr_t;
2000 typedef unsigned long uintptr_t;
2001 #elif defined(SIZEOF_LONG_LONG) && SIZEOF_VOID_P == SIZEOF_LONG_LONG
2002 typedef long long intptr_t;
2003 typedef unsigned long long uintptr_t;
2004 #else
2005 /* Just pray. May break, may not. */
2006 typedef long intptr_t;
2007 typedef unsigned long uintptr_t;
2008 #endif
2009
2010 /* Defined in alloc.c */
2011 void release_breathing_space (void);
2012 Lisp_Object noseeum_cons (Lisp_Object, Lisp_Object);
2013 Lisp_Object make_vector (size_t, Lisp_Object);
2014 Lisp_Object vector1 (Lisp_Object);
2015 Lisp_Object vector2 (Lisp_Object, Lisp_Object);
2016 Lisp_Object vector3 (Lisp_Object, Lisp_Object, Lisp_Object);
2017 Lisp_Object make_bit_vector (size_t, Lisp_Object);
2018 Lisp_Object make_bit_vector_from_byte_vector (unsigned char *, size_t);
2019 Lisp_Object noseeum_make_marker (void);
2020 void garbage_collect_1 (void);
2021 Lisp_Object acons (Lisp_Object, Lisp_Object, Lisp_Object);
2022 Lisp_Object cons3 (Lisp_Object, Lisp_Object, Lisp_Object);
2023 Lisp_Object list1 (Lisp_Object);
2024 Lisp_Object list2 (Lisp_Object, Lisp_Object);
2025 Lisp_Object list3 (Lisp_Object, Lisp_Object, Lisp_Object);
2026 Lisp_Object list4 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
2027 Lisp_Object list5 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object,
2028                    Lisp_Object);
2029 Lisp_Object list6 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object,
2030                    Lisp_Object, Lisp_Object);
2031 DECLARE_DOESNT_RETURN (memory_full (void));
2032 void disksave_object_finalization (void);
2033 extern int purify_flag;
2034 extern int gc_currently_forbidden;
2035 Lisp_Object restore_gc_inhibit (Lisp_Object);
2036 extern EMACS_INT gc_generation_number[1];
2037 int c_readonly (Lisp_Object);
2038 int lisp_readonly (Lisp_Object);
2039 Lisp_Object build_string (CONST char *);
2040 Lisp_Object build_ext_string (CONST char *, enum external_data_format);
2041 Lisp_Object build_translated_string (CONST char *);
2042 Lisp_Object make_string (CONST Bufbyte *, Bytecount);
2043 Lisp_Object make_ext_string (CONST Extbyte *, EMACS_INT,
2044                              enum external_data_format);
2045 Lisp_Object make_uninit_string (Bytecount);
2046 Lisp_Object make_float (double);
2047 Lisp_Object make_string_nocopy (CONST Bufbyte *, Bytecount);
2048 void free_cons (Lisp_Cons *);
2049 void free_list (Lisp_Object);
2050 void free_alist (Lisp_Object);
2051 void mark_conses_in_list (Lisp_Object);
2052 void free_marker (Lisp_Marker *);
2053 int object_dead_p (Lisp_Object);
2054 void mark_object (Lisp_Object obj);
2055 int marked_p (Lisp_Object obj);
2056
2057 #ifdef MEMORY_USAGE_STATS
2058 size_t malloced_storage_size (void *, size_t, struct overhead_stats *);
2059 size_t fixed_type_block_overhead (size_t);
2060 #endif
2061 #ifdef PDUMP
2062 void pdump (void);
2063 int pdump_load (void);
2064
2065 extern char *pdump_start, *pdump_end;
2066 #define DUMPEDP(adr) ((((char *)(adr)) < pdump_end) && (((char *)(adr)) >= pdump_start))
2067 #else
2068 #define DUMPEDP(adr) 0
2069 #endif
2070
2071 /* Defined in buffer.c */
2072 Lisp_Object make_buffer (struct buffer *);
2073 Lisp_Object get_truename_buffer (Lisp_Object);
2074 void switch_to_buffer (Lisp_Object, Lisp_Object);
2075 extern int find_file_compare_truenames;
2076 extern int find_file_use_truenames;
2077
2078 /* Defined in callproc.c */
2079 char *egetenv (CONST char *);
2080
2081 /* Defined in console.c */
2082 void stuff_buffered_input (Lisp_Object);
2083
2084 /* Defined in data.c */
2085 DECLARE_DOESNT_RETURN (c_write_error (Lisp_Object));
2086 DECLARE_DOESNT_RETURN (lisp_write_error (Lisp_Object));
2087 DECLARE_DOESNT_RETURN (args_out_of_range (Lisp_Object, Lisp_Object));
2088 DECLARE_DOESNT_RETURN (args_out_of_range_3 (Lisp_Object, Lisp_Object,
2089                                             Lisp_Object));
2090 Lisp_Object wrong_type_argument (Lisp_Object, Lisp_Object);
2091 DECLARE_DOESNT_RETURN (dead_wrong_type_argument (Lisp_Object, Lisp_Object));
2092 void check_int_range (EMACS_INT, EMACS_INT, EMACS_INT);
2093
2094 enum arith_comparison {
2095   arith_equal,
2096   arith_notequal,
2097   arith_less,
2098   arith_grtr,
2099   arith_less_or_equal,
2100   arith_grtr_or_equal };
2101 Lisp_Object arithcompare (Lisp_Object, Lisp_Object, enum arith_comparison);
2102
2103 Lisp_Object word_to_lisp (unsigned int);
2104 unsigned int lisp_to_word (Lisp_Object);
2105
2106 /* Defined in dired.c */
2107 Lisp_Object make_directory_hash_table (CONST char *);
2108 Lisp_Object wasteful_word_to_lisp (unsigned int);
2109
2110 /* Defined in doc.c */
2111 Lisp_Object unparesseuxify_doc_string (int, EMACS_INT, char *, Lisp_Object);
2112 Lisp_Object read_doc_string (Lisp_Object);
2113
2114 /* Defined in doprnt.c */
2115 Bytecount emacs_doprnt_c (Lisp_Object, CONST Bufbyte *, Lisp_Object,
2116                           Bytecount, ...);
2117 Bytecount emacs_doprnt_va (Lisp_Object, CONST Bufbyte *, Lisp_Object,
2118                            Bytecount, va_list);
2119 Bytecount emacs_doprnt_lisp (Lisp_Object, CONST Bufbyte *, Lisp_Object,
2120                              Bytecount, int, CONST Lisp_Object *);
2121 Bytecount emacs_doprnt_lisp_2 (Lisp_Object, CONST Bufbyte *, Lisp_Object,
2122                                Bytecount, int, ...);
2123 Lisp_Object emacs_doprnt_string_c (CONST Bufbyte *, Lisp_Object,
2124                                    Bytecount, ...);
2125 Lisp_Object emacs_doprnt_string_va (CONST Bufbyte *, Lisp_Object,
2126                                     Bytecount, va_list);
2127 Lisp_Object emacs_doprnt_string_lisp (CONST Bufbyte *, Lisp_Object,
2128                                       Bytecount, int, CONST Lisp_Object *);
2129 Lisp_Object emacs_doprnt_string_lisp_2 (CONST Bufbyte *, Lisp_Object,
2130                                         Bytecount, int, ...);
2131
2132 /* Defined in editfns.c */
2133 void uncache_home_directory (void);
2134 char *get_home_directory (void);
2135 char *user_login_name (uid_t *);
2136 Bufpos bufpos_clip_to_bounds (Bufpos, Bufpos, Bufpos);
2137 Bytind bytind_clip_to_bounds (Bytind, Bytind, Bytind);
2138 void buffer_insert1 (struct buffer *, Lisp_Object);
2139 Lisp_Object make_string_from_buffer (struct buffer *, Bufpos, Charcount);
2140 Lisp_Object make_string_from_buffer_no_extents (struct buffer *, Bufpos, Charcount);
2141 Lisp_Object save_excursion_save (void);
2142 Lisp_Object save_restriction_save (void);
2143 Lisp_Object save_excursion_restore (Lisp_Object);
2144 Lisp_Object save_restriction_restore (Lisp_Object);
2145
2146 /* Defined in emacsfns.c */
2147 Lisp_Object save_current_buffer_restore (Lisp_Object);
2148
2149 /* Defined in emacs.c */
2150 DECLARE_DOESNT_RETURN_GCC_ATTRIBUTE_SYNTAX_SUCKS (fatal (CONST char *,
2151                                                            ...), 1, 2);
2152 int stderr_out (CONST char *, ...) PRINTF_ARGS (1, 2);
2153 int stdout_out (CONST char *, ...) PRINTF_ARGS (1, 2);
2154 SIGTYPE fatal_error_signal (int);
2155 Lisp_Object make_arg_list (int, char **);
2156 void make_argc_argv (Lisp_Object, int *, char ***);
2157 void free_argc_argv (char **);
2158 Lisp_Object decode_env_path (CONST char *, CONST char *);
2159 Lisp_Object decode_path (CONST char *);
2160 /* Nonzero means don't do interactive redisplay and don't change tty modes */
2161 extern int noninteractive;
2162 extern int preparing_for_armageddon;
2163 extern int emacs_priority;
2164 extern int running_asynch_code;
2165 extern int suppress_early_error_handler_backtrace;
2166
2167 /* Defined in eval.c */
2168 DECLARE_DOESNT_RETURN (signal_error (Lisp_Object, Lisp_Object));
2169 void maybe_signal_error (Lisp_Object, Lisp_Object, Lisp_Object, Error_behavior);
2170 Lisp_Object maybe_signal_continuable_error (Lisp_Object, Lisp_Object,
2171                                             Lisp_Object, Error_behavior);
2172 DECLARE_DOESNT_RETURN_GCC_ATTRIBUTE_SYNTAX_SUCKS (error (CONST char *,
2173                                                            ...), 1, 2);
2174 void maybe_error (Lisp_Object, Error_behavior, CONST char *,
2175                   ...) PRINTF_ARGS (3, 4);
2176 Lisp_Object continuable_error (CONST char *, ...) PRINTF_ARGS (1, 2);
2177 Lisp_Object maybe_continuable_error (Lisp_Object, Error_behavior,
2178                                      CONST char *, ...) PRINTF_ARGS (3, 4);
2179 DECLARE_DOESNT_RETURN (signal_simple_error (CONST char *, Lisp_Object));
2180 void maybe_signal_simple_error (CONST char *, Lisp_Object,
2181                                 Lisp_Object, Error_behavior);
2182 Lisp_Object signal_simple_continuable_error (CONST char *, Lisp_Object);
2183 Lisp_Object maybe_signal_simple_continuable_error (CONST char *, Lisp_Object,
2184                                                    Lisp_Object, Error_behavior);
2185 DECLARE_DOESNT_RETURN_GCC_ATTRIBUTE_SYNTAX_SUCKS (error_with_frob
2186                                                     (Lisp_Object, CONST char *,
2187                                                      ...), 2, 3);
2188 void maybe_error_with_frob (Lisp_Object, Lisp_Object, Error_behavior,
2189                             CONST char *, ...) PRINTF_ARGS (4, 5);
2190 Lisp_Object continuable_error_with_frob (Lisp_Object, CONST char *,
2191                                          ...) PRINTF_ARGS (2, 3);
2192 Lisp_Object maybe_continuable_error_with_frob
2193 (Lisp_Object, Lisp_Object, Error_behavior, CONST char *, ...) PRINTF_ARGS (4, 5);
2194 DECLARE_DOESNT_RETURN (signal_simple_error_2 (CONST char *,
2195                                               Lisp_Object, Lisp_Object));
2196 void maybe_signal_simple_error_2 (CONST char *, Lisp_Object, Lisp_Object,
2197                                   Lisp_Object, Error_behavior);
2198 Lisp_Object signal_simple_continuable_error_2 (CONST char *,
2199                                                Lisp_Object, Lisp_Object);
2200 Lisp_Object maybe_signal_simple_continuable_error_2 (CONST char *, Lisp_Object,
2201                                                      Lisp_Object, Lisp_Object,
2202                                                      Error_behavior);
2203 void signal_malformed_list_error (Lisp_Object);
2204 void signal_malformed_property_list_error (Lisp_Object);
2205 void signal_circular_list_error (Lisp_Object);
2206 void signal_circular_property_list_error (Lisp_Object);
2207 void signal_void_function_error (Lisp_Object);
2208 Lisp_Object run_hook_with_args_in_buffer (struct buffer *, int, Lisp_Object *,
2209                                           enum run_hooks_condition);
2210 Lisp_Object run_hook_with_args (int, Lisp_Object *, enum run_hooks_condition);
2211 void va_run_hook_with_args (Lisp_Object, int, ...);
2212 void va_run_hook_with_args_in_buffer (struct buffer *, Lisp_Object, int, ...);
2213 Lisp_Object run_hook (Lisp_Object);
2214 Lisp_Object apply1 (Lisp_Object, Lisp_Object);
2215 Lisp_Object call0 (Lisp_Object);
2216 Lisp_Object call1 (Lisp_Object, Lisp_Object);
2217 Lisp_Object call2 (Lisp_Object, Lisp_Object, Lisp_Object);
2218 Lisp_Object call3 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
2219 Lisp_Object call4 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object,
2220                    Lisp_Object);
2221 Lisp_Object call5 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object,
2222                    Lisp_Object, Lisp_Object);
2223 Lisp_Object call6 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object,
2224                    Lisp_Object, Lisp_Object, Lisp_Object);
2225 Lisp_Object call7 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object,
2226                    Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
2227 Lisp_Object call8 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object,
2228                    Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object,
2229                    Lisp_Object);
2230 Lisp_Object call0_in_buffer (struct buffer *, Lisp_Object);
2231 Lisp_Object call1_in_buffer (struct buffer *, Lisp_Object, Lisp_Object);
2232 Lisp_Object call2_in_buffer (struct buffer *, Lisp_Object, Lisp_Object,
2233                              Lisp_Object);
2234 Lisp_Object call3_in_buffer (struct buffer *, Lisp_Object, Lisp_Object,
2235                              Lisp_Object, Lisp_Object);
2236 Lisp_Object call4_in_buffer (struct buffer *, Lisp_Object, Lisp_Object,
2237                              Lisp_Object, Lisp_Object, Lisp_Object);
2238 Lisp_Object call5_in_buffer (struct buffer *, Lisp_Object, Lisp_Object,
2239                              Lisp_Object, Lisp_Object, Lisp_Object,
2240                              Lisp_Object);
2241 Lisp_Object call6_in_buffer (struct buffer *, Lisp_Object, Lisp_Object,
2242                              Lisp_Object, Lisp_Object, Lisp_Object,
2243                              Lisp_Object, Lisp_Object);
2244 Lisp_Object eval_in_buffer (struct buffer *, Lisp_Object);
2245 Lisp_Object call0_with_handler (Lisp_Object, Lisp_Object);
2246 Lisp_Object call1_with_handler (Lisp_Object, Lisp_Object, Lisp_Object);
2247 Lisp_Object eval_in_buffer_trapping_errors (CONST char *, struct buffer *,
2248                                             Lisp_Object);
2249 Lisp_Object run_hook_trapping_errors (CONST char *, Lisp_Object);
2250 Lisp_Object safe_run_hook_trapping_errors (CONST char *, Lisp_Object, int);
2251 Lisp_Object call0_trapping_errors (CONST char *, Lisp_Object);
2252 Lisp_Object call1_trapping_errors (CONST char *, Lisp_Object, Lisp_Object);
2253 Lisp_Object call2_trapping_errors (CONST char *,
2254                                    Lisp_Object, Lisp_Object, Lisp_Object);
2255 Lisp_Object call_with_suspended_errors (lisp_fn_t, volatile Lisp_Object, Lisp_Object,
2256                                         Error_behavior, int, ...);
2257 /* C Code should be using internal_catch, record_unwind_p, condition_case_1 */
2258 Lisp_Object internal_catch (Lisp_Object, Lisp_Object (*) (Lisp_Object),
2259                             Lisp_Object, int * volatile);
2260 Lisp_Object condition_case_1 (Lisp_Object,
2261                               Lisp_Object (*) (Lisp_Object),
2262                               Lisp_Object,
2263                               Lisp_Object (*) (Lisp_Object, Lisp_Object),
2264                               Lisp_Object);
2265 Lisp_Object condition_case_3 (Lisp_Object, Lisp_Object, Lisp_Object);
2266 Lisp_Object unbind_to (int, Lisp_Object);
2267 void specbind (Lisp_Object, Lisp_Object);
2268 void record_unwind_protect (Lisp_Object (*) (Lisp_Object), Lisp_Object);
2269 void do_autoload (Lisp_Object, Lisp_Object);
2270 Lisp_Object un_autoload (Lisp_Object);
2271 void warn_when_safe_lispobj (Lisp_Object, Lisp_Object, Lisp_Object);
2272 void warn_when_safe (Lisp_Object, Lisp_Object, CONST char *,
2273                      ...) PRINTF_ARGS (3, 4);
2274
2275
2276 /* Defined in event-stream.c */
2277 void wait_delaying_user_input (int (*) (void *), void *);
2278 int detect_input_pending (void);
2279 void reset_this_command_keys (Lisp_Object, int);
2280 Lisp_Object enqueue_misc_user_event (Lisp_Object, Lisp_Object, Lisp_Object);
2281 Lisp_Object enqueue_misc_user_event_pos (Lisp_Object, Lisp_Object,
2282                                          Lisp_Object, int, int, int, int);
2283
2284 /* Defined in event-Xt.c */
2285 void signal_special_Xt_user_event (Lisp_Object, Lisp_Object, Lisp_Object);
2286
2287
2288 /* Defined in events.c */
2289 void clear_event_resource (void);
2290 Lisp_Object allocate_event (void);
2291 int event_to_character (Lisp_Event *, int, int, int);
2292
2293 /* Defined in fileio.c */
2294 void record_auto_save (void);
2295 void force_auto_save_soon (void);
2296 DECLARE_DOESNT_RETURN (report_file_error (CONST char *, Lisp_Object));
2297 void maybe_report_file_error (CONST char *, Lisp_Object,
2298                               Lisp_Object, Error_behavior);
2299 DECLARE_DOESNT_RETURN (signal_file_error (CONST char *, Lisp_Object));
2300 void maybe_signal_file_error (CONST char *, Lisp_Object,
2301                               Lisp_Object, Error_behavior);
2302 DECLARE_DOESNT_RETURN (signal_double_file_error (CONST char *, CONST char *,
2303                                                  Lisp_Object));
2304 void maybe_signal_double_file_error (CONST char *, CONST char *,
2305                                      Lisp_Object, Lisp_Object, Error_behavior);
2306 DECLARE_DOESNT_RETURN (signal_double_file_error_2 (CONST char *, CONST char *,
2307                                                    Lisp_Object, Lisp_Object));
2308 void maybe_signal_double_file_error_2 (CONST char *, CONST char *,
2309                                        Lisp_Object, Lisp_Object, Lisp_Object,
2310                                        Error_behavior);
2311 Lisp_Object lisp_strerror (int);
2312 Lisp_Object expand_and_dir_to_file (Lisp_Object, Lisp_Object);
2313 ssize_t read_allowing_quit (int, void *, size_t);
2314 ssize_t write_allowing_quit (int, CONST void *, size_t);
2315 int internal_delete_file (Lisp_Object);
2316
2317 /* Defined in filelock.c */
2318 void lock_file (Lisp_Object);
2319 void unlock_file (Lisp_Object);
2320 void unlock_all_files (void);
2321 void unlock_buffer (struct buffer *);
2322
2323 /* Defined in filemode.c */
2324 void filemodestring (struct stat *, char *);
2325
2326 /* Defined in floatfns.c */
2327 double extract_float (Lisp_Object);
2328
2329 /* Defined in fns.c */
2330 Lisp_Object list_sort (Lisp_Object, Lisp_Object,
2331                        int (*) (Lisp_Object, Lisp_Object, Lisp_Object));
2332 Lisp_Object merge (Lisp_Object, Lisp_Object, Lisp_Object);
2333
2334 void bump_string_modiff (Lisp_Object);
2335 Lisp_Object memq_no_quit (Lisp_Object, Lisp_Object);
2336 Lisp_Object assoc_no_quit (Lisp_Object, Lisp_Object);
2337 Lisp_Object assq_no_quit (Lisp_Object, Lisp_Object);
2338 Lisp_Object rassq_no_quit (Lisp_Object, Lisp_Object);
2339 Lisp_Object delq_no_quit (Lisp_Object, Lisp_Object);
2340 Lisp_Object delq_no_quit_and_free_cons (Lisp_Object, Lisp_Object);
2341 Lisp_Object remassoc_no_quit (Lisp_Object, Lisp_Object);
2342 Lisp_Object remassq_no_quit (Lisp_Object, Lisp_Object);
2343 Lisp_Object remrassq_no_quit (Lisp_Object, Lisp_Object);
2344
2345 int plists_differ (Lisp_Object, Lisp_Object, int, int, int);
2346 Lisp_Object internal_plist_get (Lisp_Object, Lisp_Object);
2347 void internal_plist_put (Lisp_Object *, Lisp_Object, Lisp_Object);
2348 int internal_remprop (Lisp_Object *, Lisp_Object);
2349 Lisp_Object external_plist_get (Lisp_Object *, Lisp_Object,
2350                                 int, Error_behavior);
2351 void external_plist_put (Lisp_Object *, Lisp_Object,
2352                          Lisp_Object, int, Error_behavior);
2353 int external_remprop (Lisp_Object *, Lisp_Object, int, Error_behavior);
2354 int internal_equal (Lisp_Object, Lisp_Object, int);
2355 Lisp_Object concat2 (Lisp_Object, Lisp_Object);
2356 Lisp_Object concat3 (Lisp_Object, Lisp_Object, Lisp_Object);
2357 Lisp_Object vconcat2 (Lisp_Object, Lisp_Object);
2358 Lisp_Object vconcat3 (Lisp_Object, Lisp_Object, Lisp_Object);
2359 Lisp_Object nconc2 (Lisp_Object, Lisp_Object);
2360 Lisp_Object bytecode_nconc2 (Lisp_Object *);
2361 void check_losing_bytecode (CONST char *, Lisp_Object);
2362
2363 /* Defined in getloadavg.c */
2364 int getloadavg (double[], int);
2365
2366 /* Defined in glyphs.c */
2367 Error_behavior decode_error_behavior_flag (Lisp_Object);
2368 Lisp_Object encode_error_behavior_flag (Error_behavior);
2369
2370 /* Defined in indent.c */
2371 int bi_spaces_at_point (struct buffer *, Bytind);
2372 int column_at_point (struct buffer *, Bufpos, int);
2373 int string_column_at_point (struct Lisp_String *, Bufpos, int);
2374 int current_column (struct buffer *);
2375 void invalidate_current_column (void);
2376 Bufpos vmotion (struct window *, Bufpos, int, int *);
2377 Bufpos vmotion_pixels (Lisp_Object, Bufpos, int, int, int *);
2378
2379 /* Defined in keymap.c */
2380 void where_is_to_char (Lisp_Object, char *);
2381
2382 /* Defined in lread.c */
2383 void ebolify_bytecode_constants (Lisp_Object);
2384 void close_load_descs (void);
2385 int locate_file (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object *, int);
2386 EXFUN (Flocate_file_clear_hashing, 1);
2387 int isfloat_string (CONST char *);
2388
2389 /* Well, I've decided to enable this. -- ben */
2390 /* And I've decided to make it work right.  -- sb */
2391 #define LOADHIST
2392 /* Define the following symbol to enable load history of dumped files */
2393 #define LOADHIST_DUMPED
2394 /* Define the following symbol to enable load history of C source */
2395 #define LOADHIST_BUILTIN
2396
2397 #ifdef LOADHIST /* this is just a stupid idea */
2398 #define LOADHIST_ATTACH(x) \
2399  do { if (initialized) Vcurrent_load_list = Fcons (x, Vcurrent_load_list); } \
2400  while (0)
2401 #else /*! LOADHIST */
2402 # define LOADHIST_ATTACH(x)
2403 #endif /*! LOADHIST */
2404
2405 /* Defined in marker.c */
2406 Bytind bi_marker_position (Lisp_Object);
2407 Bufpos marker_position (Lisp_Object);
2408 void set_bi_marker_position (Lisp_Object, Bytind);
2409 void set_marker_position (Lisp_Object, Bufpos);
2410 void unchain_marker (Lisp_Object);
2411 Lisp_Object noseeum_copy_marker (Lisp_Object, Lisp_Object);
2412 Lisp_Object set_marker_restricted (Lisp_Object, Lisp_Object, Lisp_Object);
2413 #ifdef MEMORY_USAGE_STATS
2414 int compute_buffer_marker_usage (struct buffer *, struct overhead_stats *);
2415 #endif
2416
2417 /* Defined in menubar.c */
2418 extern int popup_menu_up_p;
2419 extern int menubar_show_keybindings;
2420 extern int popup_menu_titles;
2421
2422 /* Defined in minibuf.c */
2423 extern int minibuf_level;
2424 Charcount scmp_1 (CONST Bufbyte *, CONST Bufbyte *, Charcount, int);
2425 #define scmp(s1, s2, len) scmp_1 (s1, s2, len, completion_ignore_case)
2426 extern int completion_ignore_case;
2427 int regexp_ignore_completion_p (CONST Bufbyte *, Lisp_Object,
2428                                 Bytecount, Bytecount);
2429 Lisp_Object clear_echo_area (struct frame *, Lisp_Object, int);
2430 Lisp_Object clear_echo_area_from_print (struct frame *, Lisp_Object, int);
2431 void echo_area_append (struct frame *, CONST Bufbyte *, Lisp_Object,
2432                        Bytecount, Bytecount, Lisp_Object);
2433 void echo_area_message (struct frame *, CONST Bufbyte *, Lisp_Object,
2434                         Bytecount, Bytecount, Lisp_Object);
2435 Lisp_Object echo_area_status (struct frame *);
2436 int echo_area_active (struct frame *);
2437 Lisp_Object echo_area_contents (struct frame *);
2438 void message_internal (CONST Bufbyte *, Lisp_Object, Bytecount, Bytecount);
2439 void message_append_internal (CONST Bufbyte *, Lisp_Object,
2440                               Bytecount, Bytecount);
2441 void message (CONST char *, ...) PRINTF_ARGS (1, 2);
2442 void message_append (CONST char *, ...) PRINTF_ARGS (1, 2);
2443 void message_no_translate (CONST char *, ...) PRINTF_ARGS (1, 2);
2444 void clear_message (void);
2445
2446 /* Defined in print.c */
2447 void write_string_to_stdio_stream (FILE *, struct console *,
2448                                    CONST Bufbyte *, Bytecount, Bytecount,
2449                                    enum external_data_format);
2450 void debug_print (Lisp_Object);
2451 void debug_short_backtrace (int);
2452 void temp_output_buffer_setup (Lisp_Object);
2453 void temp_output_buffer_show (Lisp_Object, Lisp_Object);
2454 /* NOTE: Do not call this with the data of a Lisp_String.  Use princ.
2455  * Note: stream should be defaulted before calling
2456  *  (eg Qnil means stdout, not Vstandard_output, etc) */
2457 void write_c_string (CONST char *, Lisp_Object);
2458 /* Same goes for this function. */
2459 void write_string_1 (CONST Bufbyte *, Bytecount, Lisp_Object);
2460 void print_cons (Lisp_Object, Lisp_Object, int);
2461 void print_vector (Lisp_Object, Lisp_Object, int);
2462 void print_string (Lisp_Object, Lisp_Object, int);
2463 void long_to_string (char *, long);
2464 void print_internal (Lisp_Object, Lisp_Object, int);
2465 void print_symbol (Lisp_Object, Lisp_Object, int);
2466 void print_float (Lisp_Object, Lisp_Object, int);
2467 extern int print_escape_newlines;
2468 extern int print_readably;
2469 Lisp_Object internal_with_output_to_temp_buffer (Lisp_Object,
2470                                                  Lisp_Object (*) (Lisp_Object),
2471                                                  Lisp_Object, Lisp_Object);
2472 void float_to_string (char *, double);
2473 void internal_object_printer (Lisp_Object, Lisp_Object, int);
2474
2475 /* Defined in profile.c */
2476 void mark_profiling_info (void);
2477 void profile_increase_call_count (Lisp_Object);
2478 extern int profiling_active;
2479 extern int profiling_redisplay_flag;
2480
2481 /* Defined in rangetab.c */
2482 void put_range_table (Lisp_Object, EMACS_INT, EMACS_INT, Lisp_Object);
2483 int unified_range_table_bytes_needed (Lisp_Object);
2484 int unified_range_table_bytes_used (void *);
2485 void unified_range_table_copy_data (Lisp_Object, void *);
2486 Lisp_Object unified_range_table_lookup (void *, EMACS_INT, Lisp_Object);
2487 int unified_range_table_nentries (void *);
2488 void unified_range_table_get_range (void *, int, EMACS_INT *, EMACS_INT *,
2489                                     Lisp_Object *);
2490
2491 /* Defined in search.c */
2492 struct re_pattern_buffer;
2493 struct re_registers;
2494 Bufpos scan_buffer (struct buffer *, Emchar, Bufpos, Bufpos, EMACS_INT, EMACS_INT *, int);
2495 Bufpos find_next_newline (struct buffer *, Bufpos, int);
2496 Bufpos find_next_newline_no_quit (struct buffer *, Bufpos, int);
2497 Bytind bi_find_next_newline_no_quit (struct buffer *, Bytind, int);
2498 Bytind bi_find_next_emchar_in_string (struct Lisp_String*, Emchar, Bytind, EMACS_INT);
2499 Bufpos find_before_next_newline (struct buffer *, Bufpos, Bufpos, int);
2500 struct re_pattern_buffer *compile_pattern (Lisp_Object, struct re_registers *,
2501                                            char *, int, Error_behavior);
2502 Bytecount fast_string_match (Lisp_Object,  CONST Bufbyte *,
2503                              Lisp_Object, Bytecount,
2504                              Bytecount, int, Error_behavior, int);
2505 Bytecount fast_lisp_string_match (Lisp_Object, Lisp_Object);
2506 void restore_match_data (void);
2507
2508 /* Defined in signal.c */
2509 void init_interrupts_late (void);
2510 extern int dont_check_for_quit;
2511 void begin_dont_check_for_quit (void);
2512 void emacs_sleep (int);
2513
2514 /* Defined in sound.c */
2515 void init_device_sound (struct device *);
2516
2517 /* Defined in specifier.c */
2518 Lisp_Object specifier_instance (Lisp_Object, Lisp_Object, Lisp_Object,
2519                                 Error_behavior, int, int, Lisp_Object);
2520 Lisp_Object specifier_instance_no_quit (Lisp_Object, Lisp_Object, Lisp_Object,
2521                                         Error_behavior, int, Lisp_Object);
2522
2523 /* Defined in symbols.c */
2524 int hash_string (CONST Bufbyte *, Bytecount);
2525 Lisp_Object intern (CONST char *);
2526 Lisp_Object oblookup (Lisp_Object, CONST Bufbyte *, Bytecount);
2527 void map_obarray (Lisp_Object, int (*) (Lisp_Object, void *), void *);
2528 Lisp_Object indirect_function (Lisp_Object, int);
2529 Lisp_Object symbol_value_in_buffer (Lisp_Object, Lisp_Object);
2530 void kill_buffer_local_variables (struct buffer *);
2531 int symbol_value_buffer_local_info (Lisp_Object, struct buffer *);
2532 Lisp_Object find_symbol_value (Lisp_Object);
2533 Lisp_Object find_symbol_value_quickly (Lisp_Object, int);
2534 Lisp_Object top_level_value (Lisp_Object);
2535 void reject_constant_symbols (Lisp_Object sym, Lisp_Object newval,
2536                               int function_p,
2537                               Lisp_Object follow_past_lisp_magic);
2538
2539 /* Defined in syntax.c */
2540 Bufpos scan_words (struct buffer *, Bufpos, int);
2541
2542 /* Defined in undo.c */
2543 Lisp_Object truncate_undo_list (Lisp_Object, int, int);
2544 void record_extent (Lisp_Object, int);
2545 void record_insert (struct buffer *, Bufpos, Charcount);
2546 void record_delete (struct buffer *, Bufpos, Charcount);
2547 void record_change (struct buffer *, Bufpos, Charcount);
2548
2549 /* Defined in unex*.c */
2550 int unexec (char *, char *, uintptr_t, uintptr_t, uintptr_t);
2551 #ifdef RUN_TIME_REMAP
2552 int run_time_remap (char *);
2553 #endif
2554
2555 /* Defined in vm-limit.c */
2556 void memory_warnings (void *, void (*) (CONST char *));
2557
2558 /* Defined in window.c */
2559 Lisp_Object save_window_excursion_unwind (Lisp_Object);
2560 Lisp_Object display_buffer (Lisp_Object, Lisp_Object, Lisp_Object);
2561
2562 /* The following were machine generated 19980312 */
2563
2564
2565 EXFUN (Faccept_process_output, 3);
2566 EXFUN (Fadd1, 1);
2567 EXFUN (Fadd_spec_to_specifier, 5);
2568 EXFUN (Fadd_timeout, 4);
2569 EXFUN (Fappend, MANY);
2570 EXFUN (Fapply, MANY);
2571 EXFUN (Faref, 2);
2572 EXFUN (Faset, 3);
2573 EXFUN (Fassoc, 2);
2574 EXFUN (Fassq, 2);
2575 EXFUN (Fbacktrace, 2);
2576 EXFUN (Fbeginning_of_line, 2);
2577 EXFUN (Fbobp, 1);
2578 EXFUN (Fbolp, 1);
2579 EXFUN (Fboundp, 1);
2580 EXFUN (Fbuffer_substring, 3);
2581 EXFUN (Fbuilt_in_variable_type, 1);
2582 EXFUN (Fbyte_code, 3);
2583 EXFUN (Fcall_interactively, 3);
2584 EXFUN (Fcanonicalize_lax_plist, 2);
2585 EXFUN (Fcanonicalize_plist, 2);
2586 EXFUN (Fcar, 1);
2587 EXFUN (Fcar_safe, 1);
2588 EXFUN (Fcdr, 1);
2589 EXFUN (Fchar_after, 2);
2590 EXFUN (Fchar_to_string, 1);
2591 EXFUN (Fcheck_valid_plist, 1);
2592 EXFUN (Fclear_range_table, 1);
2593 EXFUN (Fcoding_category_list, 0);
2594 EXFUN (Fcoding_category_system, 1);
2595 EXFUN (Fcoding_priority_list, 0);
2596 EXFUN (Fcoding_system_charset, 2);
2597 EXFUN (Fcoding_system_doc_string, 1);
2598 EXFUN (Fcoding_system_list, 0);
2599 EXFUN (Fcoding_system_name, 1);
2600 EXFUN (Fcoding_system_p, 1);
2601 EXFUN (Fcoding_system_property, 2);
2602 EXFUN (Fcoding_system_type, 1);
2603 EXFUN (Fcommand_execute, 3);
2604 EXFUN (Fcommandp, 1);
2605 EXFUN (Fconcat, MANY);
2606 EXFUN (Fcons, 2);
2607 EXFUN (Fcopy_alist, 1);
2608 EXFUN (Fcopy_coding_system, 2);
2609 EXFUN (Fcopy_event, 2);
2610 EXFUN (Fcopy_list, 1);
2611 EXFUN (Fcopy_marker, 2);
2612 EXFUN (Fcopy_sequence, 1);
2613 EXFUN (Fcopy_tree, 2);
2614 EXFUN (Fcurrent_window_configuration, 1);
2615 EXFUN (Fdecode_big5_char, 1);
2616 EXFUN (Fdecode_coding_region, 4);
2617 EXFUN (Fdecode_shift_jis_char, 1);
2618 EXFUN (Fdefault_boundp, 1);
2619 EXFUN (Fdefault_value, 1);
2620 EXFUN (Fdefine_key, 3);
2621 EXFUN (Fdelete_region, 3);
2622 EXFUN (Fdelete_process, 1);
2623 EXFUN (Fdelq, 2);
2624 EXFUN (Fdestructive_alist_to_plist, 1);
2625 EXFUN (Fdetect_coding_region, 3);
2626 EXFUN (Fdgettext, 2);
2627 EXFUN (Fding, 3);
2628 EXFUN (Fdirectory_file_name, 1);
2629 EXFUN (Fdisable_timeout, 1);
2630 EXFUN (Fdiscard_input, 0);
2631 EXFUN (Fdispatch_event, 1);
2632 EXFUN (Fdisplay_error, 2);
2633 EXFUN (Fdo_auto_save, 2);
2634 EXFUN (Fdowncase, 2);
2635 EXFUN (Felt, 2);
2636 EXFUN (Fencode_big5_char, 1);
2637 EXFUN (Fencode_coding_region, 4);
2638 EXFUN (Fencode_shift_jis_char, 1);
2639 EXFUN (Fend_of_line, 2);
2640 EXFUN (Fenqueue_eval_event, 2);
2641 EXFUN (Feobp, 1);
2642 EXFUN (Feolp, 1);
2643 EXFUN (Fequal, 2);
2644 EXFUN (Ferror_message_string, 1);
2645 EXFUN (Feval, 1);
2646 EXFUN (Fevent_to_character, 4);
2647 EXFUN (Fexecute_kbd_macro, 2);
2648 EXFUN (Fexpand_abbrev, 0);
2649 EXFUN (Fexpand_file_name, 2);
2650 EXFUN (Fextent_at, 5);
2651 EXFUN (Fextent_property, 3);
2652 EXFUN (Ffboundp, 1);
2653 EXFUN (Ffile_accessible_directory_p, 1);
2654 EXFUN (Ffile_directory_p, 1);
2655 EXFUN (Ffile_executable_p, 1);
2656 EXFUN (Ffile_exists_p, 1);
2657 EXFUN (Ffile_name_absolute_p, 1);
2658 EXFUN (Ffile_name_as_directory, 1);
2659 EXFUN (Ffile_name_directory, 1);
2660 EXFUN (Ffile_name_nondirectory, 1);
2661 EXFUN (Ffile_readable_p, 1);
2662 EXFUN (Ffile_symlink_p, 1);
2663 EXFUN (Ffile_truename, 2);
2664 EXFUN (Ffind_coding_system, 1);
2665 EXFUN (Ffind_file_name_handler, 2);
2666 EXFUN (Ffollowing_char, 1);
2667 EXFUN (Fformat, MANY);
2668 EXFUN (Fforward_char, 2);
2669 EXFUN (Fforward_line, 2);
2670 EXFUN (Ffset, 2);
2671 EXFUN (Ffuncall, MANY);
2672 EXFUN (Fgeq, MANY);
2673 EXFUN (Fget, 3);
2674 EXFUN (Fget_buffer_process, 1);
2675 EXFUN (Fget_coding_system, 1);
2676 EXFUN (Fget_process, 1);
2677 EXFUN (Fget_range_table, 3);
2678 EXFUN (Fgettext, 1);
2679 EXFUN (Fgoto_char, 2);
2680 EXFUN (Fgtr, MANY);
2681 EXFUN (Findent_to, 3);
2682 EXFUN (Findirect_function, 1);
2683 EXFUN (Finsert, MANY);
2684 EXFUN (Finsert_buffer_substring, 3);
2685 EXFUN (Finsert_char, 4);
2686 EXFUN (Finsert_file_contents_internal, 7);
2687 EXFUN (Finteractive_p, 0);
2688 EXFUN (Fintern, 2);
2689 EXFUN (Fintern_soft, 2);
2690 EXFUN (Fkey_description, 1);
2691 EXFUN (Fkill_emacs, 1);
2692 EXFUN (Fkill_local_variable, 1);
2693 EXFUN (Flax_plist_get, 3);
2694 EXFUN (Flax_plist_remprop, 2);
2695 EXFUN (Flength, 1);
2696 EXFUN (Fleq, MANY);
2697 EXFUN (Flist, MANY);
2698 EXFUN (Flistp, 1);
2699 #ifdef HAVE_SHLIB
2700 EXFUN (Flist_modules, 0);
2701 EXFUN (Fload_module, 3);
2702 #endif
2703 EXFUN (Flss, MANY);
2704 EXFUN (Fmake_byte_code, MANY);
2705 EXFUN (Fmake_coding_system, 4);
2706 EXFUN (Fmake_glyph_internal, 1);
2707 EXFUN (Fmake_list, 2);
2708 EXFUN (Fmake_marker, 0);
2709 EXFUN (Fmake_range_table, 0);
2710 EXFUN (Fmake_sparse_keymap, 1);
2711 EXFUN (Fmake_string, 2);
2712 EXFUN (Fmake_symbol, 1);
2713 EXFUN (Fmake_vector, 2);
2714 EXFUN (Fmapcar, 2);
2715 EXFUN (Fmarker_buffer, 1);
2716 EXFUN (Fmarker_position, 1);
2717 EXFUN (Fmatch_beginning, 1);
2718 EXFUN (Fmatch_end, 1);
2719 EXFUN (Fmax, MANY);
2720 EXFUN (Fmember, 2);
2721 EXFUN (Fmemq, 2);
2722 EXFUN (Fmin, MANY);
2723 EXFUN (Fminus, MANY);
2724 EXFUN (Fnarrow_to_region, 3);
2725 EXFUN (Fnconc, MANY);
2726 EXFUN (Fnext_event, 2);
2727 EXFUN (Fnreverse, 1);
2728 EXFUN (Fnthcdr, 2);
2729 EXFUN (Fnumber_to_string, 1);
2730 EXFUN (Fold_assq, 2);
2731 EXFUN (Fold_equal, 2);
2732 EXFUN (Fold_member, 2);
2733 EXFUN (Fold_memq, 2);
2734 EXFUN (Fplist_get, 3);
2735 EXFUN (Fplist_member, 2);
2736 EXFUN (Fplist_put, 3);
2737 EXFUN (Fplus, MANY);
2738 EXFUN (Fpoint, 1);
2739 EXFUN (Fpoint_marker, 2);
2740 EXFUN (Fpoint_max, 1);
2741 EXFUN (Fpoint_min, 1);
2742 EXFUN (Fpreceding_char, 1);
2743 EXFUN (Fprefix_numeric_value, 1);
2744 EXFUN (Fprin1, 2);
2745 EXFUN (Fprin1_to_string, 2);
2746 EXFUN (Fprinc, 2);
2747 EXFUN (Fprint, 2);
2748 EXFUN (Fprocess_status, 1);
2749 EXFUN (Fprogn, UNEVALLED);
2750 EXFUN (Fprovide, 1);
2751 EXFUN (Fput, 3);
2752 EXFUN (Fput_range_table, 4);
2753 EXFUN (Fput_text_property, 5);
2754 EXFUN (Fquo, MANY);
2755 EXFUN (Frassq, 2);
2756 EXFUN (Fread, 1);
2757 EXFUN (Fread_key_sequence, 3);
2758 EXFUN (Freally_free, 1);
2759 EXFUN (Frem, 2);
2760 EXFUN (Fremassq, 2);
2761 EXFUN (Fselected_frame, 1);
2762 EXFUN (Fset, 2);
2763 EXFUN (Fset_coding_category_system, 2);
2764 EXFUN (Fset_coding_priority_list, 1);
2765 EXFUN (Fset_default, 2);
2766 EXFUN (Fset_marker, 3);
2767 EXFUN (Fset_standard_case_table, 1);
2768 EXFUN (Fsetcar, 2);
2769 EXFUN (Fsetcdr, 2);
2770 EXFUN (Fsignal, 2);
2771 EXFUN (Fsit_for, 2);
2772 EXFUN (Fskip_chars_backward, 3);
2773 EXFUN (Fskip_chars_forward, 3);
2774 EXFUN (Fsleep_for, 1);
2775 EXFUN (Fsort, 2);
2776 EXFUN (Fspecifier_spec_list, 4);
2777 EXFUN (Fstring_equal, 2);
2778 EXFUN (Fstring_lessp, 2);
2779 EXFUN (Fstring_match, 4);
2780 EXFUN (Fsub1, 1);
2781 EXFUN (Fsubr_max_args, 1);
2782 EXFUN (Fsubr_min_args, 1);
2783 EXFUN (Fsubsidiary_coding_system, 2);
2784 EXFUN (Fsubstitute_command_keys, 1);
2785 EXFUN (Fsubstitute_in_file_name, 1);
2786 EXFUN (Fsubstring, 3);
2787 EXFUN (Fsymbol_function, 1);
2788 EXFUN (Fsymbol_name, 1);
2789 EXFUN (Fsymbol_plist, 1);
2790 EXFUN (Fsymbol_value, 1);
2791 EXFUN (Fsystem_name, 0);
2792 EXFUN (Fthrow, 2);
2793 EXFUN (Ftimes, MANY);
2794 EXFUN (Ftruncate, 1);
2795 EXFUN (Fundo_boundary, 0);
2796 EXFUN (Funhandled_file_name_directory, 1);
2797 EXFUN (Funlock_buffer, 0);
2798 EXFUN (Fupcase, 2);
2799 EXFUN (Fupcase_initials, 2);
2800 EXFUN (Fupcase_initials_region, 3);
2801 EXFUN (Fupcase_region, 3);
2802 EXFUN (Fuser_home_directory, 0);
2803 EXFUN (Fuser_login_name, 1);
2804 EXFUN (Fvector, MANY);
2805 EXFUN (Fverify_visited_file_modtime, 1);
2806 EXFUN (Fvertical_motion, 3);
2807 EXFUN (Fwiden, 1);
2808
2809
2810 extern Lisp_Object Q_style, Qactually_requested, Qactivate_menubar_hook;
2811 extern Lisp_Object Qafter, Qall, Qand;
2812 extern Lisp_Object Qarith_error, Qarrayp, Qassoc, Qat, Qautodetect, Qautoload;
2813 extern Lisp_Object Qbackground, Qbackground_pixmap, Qbad_variable, Qbefore;
2814 extern Lisp_Object Qbeginning_of_buffer, Qbig5, Qbinary, Qbitmap, Qbitp, Qblinking;
2815 extern Lisp_Object Qboolean, Qbottom, Qbuffer;
2816 extern Lisp_Object Qbuffer_glyph_p, Qbuffer_live_p, Qbuffer_read_only, Qbutton;
2817 extern Lisp_Object Qbyte_code, Qcall_interactively, Qcategory;
2818 extern Lisp_Object Qcategory_designator_p, Qcategory_table_value_p, Qccl, Qcdr;
2819 extern Lisp_Object Qchannel, Qchar, Qchar_or_string_p, Qcharacter, Qcharacterp;
2820 extern Lisp_Object Qchars, Qcharset_g0, Qcharset_g1, Qcharset_g2, Qcharset_g3;
2821 extern Lisp_Object Qcenter, Qcircular_list, Qcircular_property_list;
2822 extern Lisp_Object Qcoding_system_error;
2823 extern Lisp_Object Qcolor, Qcolor_pixmap_image_instance_p;
2824 extern Lisp_Object Qcolumns, Qcommand, Qcommandp, Qcompletion_ignore_case;
2825 extern Lisp_Object Qconsole, Qconsole_live_p, Qconst_specifier, Qcr, Qcritical;
2826 extern Lisp_Object Qcrlf, Qctext, Qcurrent_menubar, Qcursor;
2827 extern Lisp_Object Qcyclic_variable_indirection, Qdata, Qdead, Qdecode;
2828 extern Lisp_Object Qdefault, Qdefun, Qdelete, Qdelq, Qdevice, Qdevice_live_p;
2829 extern Lisp_Object Qdim, Qdimension, Qdisabled, Qdisplay, Qdisplay_table;
2830 extern Lisp_Object Qdoc_string, Qdomain_error, Qdynarr_overhead;
2831 extern Lisp_Object Qempty, Qencode, Qend_of_buffer, Qend_of_file, Qend_open;
2832 extern Lisp_Object Qeol_cr, Qeol_crlf, Qeol_lf, Qeol_type, Qeq, Qeql, Qequal;
2833 extern Lisp_Object Qerror, Qerror_conditions, Qerror_message, Qescape_quoted;
2834 extern Lisp_Object Qeval, Qevent_live_p, Qexit, Qextent_live_p, Qextents;
2835 extern Lisp_Object Qexternal_debugging_output, Qface, Qfeaturep, Qfile_error;
2836 extern Lisp_Object Qfont, Qforce_g0_on_output, Qforce_g1_on_output;
2837 extern Lisp_Object Qforce_g2_on_output, Qforce_g3_on_output, Qforeground;
2838 extern Lisp_Object Qformat, Qframe, Qframe_live_p, Qfunction, Qgap_overhead;
2839 extern Lisp_Object Qgeneric, Qgeometry, Qglobal, Qheight, Qhighlight, Qhorizontal, Qicon;
2840 extern Lisp_Object Qicon_glyph_p, Qid, Qidentity, Qimage, Qinfo, Qinherit;
2841 extern Lisp_Object Qinhibit_quit, Qinhibit_read_only;
2842 extern Lisp_Object Qinput_charset_conversion, Qinteger;
2843 extern Lisp_Object Qinteger_char_or_marker_p, Qinteger_or_char_p;
2844 extern Lisp_Object Qinteger_or_marker_p, Qintegerp, Qinteractive, Qinternal;
2845 extern Lisp_Object Qinvalid_function, Qinvalid_read_syntax, Qio_error;
2846 extern Lisp_Object Qiso2022, Qkey, Qkey_assoc, Qkeymap, Qlambda, Qlayout, Qleft, Qlf;
2847 extern Lisp_Object Qlist, Qlistp, Qload, Qlock_shift, Qmacro, Qmagic;
2848 extern Lisp_Object Qmalformed_list, Qmalformed_property_list;
2849 extern Lisp_Object Qmalloc_overhead, Qmark, Qmarkers;
2850 extern Lisp_Object Qmax, Qmemory, Qmessage, Qminus, Qmnemonic, Qmodifiers;
2851 extern Lisp_Object Qmono_pixmap_image_instance_p, Qmotion;
2852 extern Lisp_Object Qmouse_leave_buffer_hook, Qmswindows, Qname, Qnas, Qnatnump;
2853 extern Lisp_Object Qno_ascii_cntl, Qno_ascii_eol, Qno_catch;
2854 extern Lisp_Object Qno_conversion, Qno_iso6429, Qnone, Qnot, Qnothing;
2855 extern Lisp_Object Qnothing_image_instance_p, Qnotice;
2856 extern Lisp_Object Qnumber_char_or_marker_p, Qnumberp;
2857 extern Lisp_Object Qobject, Qold_assoc, Qold_delete, Qold_delq, Qold_rassoc;
2858 extern Lisp_Object Qold_rassq, Qonly, Qor, Qother, Qoutput_charset_conversion;
2859 extern Lisp_Object Qoverflow_error, Qpoint, Qpointer, Qpointer_glyph_p;
2860 extern Lisp_Object Qpointer_image_instance_p, Qpost_read_conversion;
2861 extern Lisp_Object Qpre_write_conversion, Qprint, Qprint_length;
2862 extern Lisp_Object Qprint_string_length, Qprocess, Qprogn, Qprovide, Qquit;
2863 extern Lisp_Object Qquote, Qrange_error, Qrassoc, Qrassq, Qread_char;
2864 extern Lisp_Object Qread_from_minibuffer, Qreally_early_error_handler;
2865 extern Lisp_Object Qregion_beginning, Qregion_end, Qrequire, Qresource;
2866 extern Lisp_Object Qreturn, Qreverse, Qright, Qrun_hooks, Qsans_modifiers;
2867 extern Lisp_Object Qsave_buffers_kill_emacs, Qsearch, Qselected, Qself_insert_command;
2868 extern Lisp_Object Qsequencep, Qsetting_constant, Qseven, Qshift_jis, Qshort;
2869 extern Lisp_Object Qsignal, Qsimple, Qsingularity_error, Qsize, Qspace;
2870 extern Lisp_Object Qspecifier, Qstandard_input, Qstandard_output, Qstart_open;
2871 extern Lisp_Object Qstream, Qstring, Qstring_lessp, Qsubwindow;
2872 extern Lisp_Object Qsubwindow_image_instance_p, Qsymbol, Qsyntax, Qt, Qtest;
2873 extern Lisp_Object Qtext, Qtext_image_instance_p, Qtimeout, Qtimestamp;
2874 extern Lisp_Object Qtoolbar, Qtop, Qtop_level, Qtrue_list_p, Qtty, Qtype;
2875 extern Lisp_Object Qunbound, Qundecided, Qundefined, Qunderflow_error;
2876 extern Lisp_Object Qunderline, Qunimplemented, Quser_files_and_directories;
2877 extern Lisp_Object Qvalue_assoc, Qvalues;
2878 extern Lisp_Object Qvariable_documentation, Qvariable_domain, Qvertical;
2879 extern Lisp_Object Qvoid_function, Qvoid_variable, Qwarning, Qwidth, Qwidget, Qwindow;
2880 extern Lisp_Object Qwindow_live_p, Qwindow_system, Qwrong_number_of_arguments;
2881 extern Lisp_Object Qwrong_type_argument, Qx, Qy, Qyes_or_no_p;
2882 extern Lisp_Object Vactivate_menubar_hook, Vascii_canon_table;
2883 extern Lisp_Object Vascii_downcase_table, Vascii_eqv_table;
2884 extern Lisp_Object Vascii_upcase_table, Vautoload_queue, Vbinary_process_input;
2885 extern Lisp_Object Vbinary_process_output, Vblank_menubar;
2886 extern Lisp_Object Vcharset_ascii, Vcharset_composite, Vcharset_control_1;
2887 extern Lisp_Object Vcoding_system_for_read, Vcoding_system_for_write;
2888 extern Lisp_Object Vcoding_system_hash_table, Vcommand_history;
2889 extern Lisp_Object Vcommand_line_args, Vconfigure_info_directory;
2890 extern Lisp_Object Vconfigure_site_directory, Vconfigure_site_module_directory;
2891 extern Lisp_Object Vconsole_list, Vcontrolling_terminal;
2892 extern Lisp_Object Vcurrent_compiled_function_annotation, Vcurrent_load_list;
2893 extern Lisp_Object Vcurrent_mouse_event, Vcurrent_prefix_arg, Vdata_directory;
2894 extern Lisp_Object Vdisabled_command_hook, Vdoc_directory, Vinternal_doc_file_name;
2895 extern Lisp_Object Vecho_area_buffer, Vemacs_major_version;
2896 extern Lisp_Object Vemacs_minor_version, Vexec_directory, Vexec_path;
2897 extern Lisp_Object Vexecuting_macro, Vfeatures, Vfile_domain;
2898 extern Lisp_Object Vfile_name_coding_system, Vinhibit_quit;
2899 extern Lisp_Object Vinvocation_directory, Vinvocation_name;
2900 extern Lisp_Object Vkeyboard_coding_system, Vlast_command, Vlast_command_char;
2901 extern Lisp_Object Vlast_command_event, Vlast_input_event;
2902 extern Lisp_Object Vload_file_name_internal;
2903 extern Lisp_Object Vload_file_name_internal_the_purecopy, Vload_history;
2904 extern Lisp_Object Vload_path, Vmark_even_if_inactive, Vmenubar_configuration;
2905 extern Lisp_Object Vminibuf_preprompt, Vminibuf_prompt, Vminibuffer_zero;
2906 extern Lisp_Object Vmirror_ascii_canon_table, Vmirror_ascii_downcase_table;
2907 extern Lisp_Object Vmirror_ascii_eqv_table, Vmirror_ascii_upcase_table;
2908 extern Lisp_Object Vmodule_directory, Vmswindows_downcase_file_names;
2909 extern Lisp_Object Vmswindows_get_true_file_attributes, Vobarray;
2910 extern Lisp_Object Vprint_length, Vprint_level, Vprocess_environment;
2911 extern Lisp_Object Vquit_flag;
2912 extern Lisp_Object Vrecent_keys_ring, Vshell_file_name, Vsite_directory;
2913 extern Lisp_Object Vsite_module_directory;
2914 extern Lisp_Object Vstandard_input, Vstandard_output, Vstdio_str;
2915 extern Lisp_Object Vsynchronous_sounds, Vsystem_name, Vterminal_coding_system;
2916 extern Lisp_Object Vthis_command_keys, Vunread_command_event;
2917 extern Lisp_Object Vwin32_generate_fake_inodes, Vwin32_pipe_read_delay;
2918 extern Lisp_Object Vx_initial_argv_list;
2919
2920 extern Lisp_Object Qmakunbound, Qset;
2921
2922 #endif /* _XEMACS_LISP_H_ */