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