Qcall_interactively and Qexecute_kbd_macro are now static.
[bpt/emacs.git] / src / lisp.h
CommitLineData
3cfe6dfd 1/* Fundamental definitions for GNU Emacs Lisp interpreter.
e2017fe2 2
ab422c4d
PE
3Copyright (C) 1985-1987, 1993-1995, 1997-2013 Free Software Foundation,
4Inc.
3cfe6dfd
JB
5
6This file is part of GNU Emacs.
7
b9b1cc14 8GNU Emacs is free software: you can redistribute it and/or modify
3cfe6dfd 9it under the terms of the GNU General Public License as published by
b9b1cc14
GM
10the Free Software Foundation, either version 3 of the License, or
11(at your option) any later version.
3cfe6dfd
JB
12
13GNU Emacs is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
b9b1cc14 19along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
3cfe6dfd 20
6b61353c
KH
21#ifndef EMACS_LISP_H
22#define EMACS_LISP_H
23
0328b6de 24#include <setjmp.h>
e32a5799 25#include <stdalign.h>
6a8033e1 26#include <stdarg.h>
f5d9e83a 27#include <stdbool.h>
89887d67 28#include <stddef.h>
4d7e6e51 29#include <float.h>
8ac068ac 30#include <inttypes.h>
dd3482fe 31#include <limits.h>
6a8033e1 32
be44ca6c
PE
33#include <intprops.h>
34
f162bcc3
PE
35INLINE_HEADER_BEGIN
36#ifndef LISP_INLINE
37# define LISP_INLINE INLINE
38#endif
39
03a660a6
PE
40/* The ubiquitous max and min macros. */
41#undef min
42#undef max
43#define max(a, b) ((a) > (b) ? (a) : (b))
44#define min(a, b) ((a) < (b) ? (a) : (b))
45
34374650
PE
46/* EMACS_INT - signed integer wide enough to hold an Emacs value
47 EMACS_INT_MAX - maximum value of EMACS_INT; can be used in #if
48 pI - printf length modifier for EMACS_INT
49 EMACS_UINT - unsigned variant of EMACS_INT */
71f88e00 50#ifndef EMACS_INT_MAX
34374650 51# if LONG_MAX < LLONG_MAX && defined WIDE_EMACS_INT
71f88e00
PE
52typedef long long int EMACS_INT;
53typedef unsigned long long int EMACS_UINT;
34374650 54# define EMACS_INT_MAX LLONG_MAX
47be4ab5 55# define pI "ll"
34374650 56# elif INT_MAX < LONG_MAX
71f88e00
PE
57typedef long int EMACS_INT;
58typedef unsigned long int EMACS_UINT;
34374650 59# define EMACS_INT_MAX LONG_MAX
47be4ab5
PE
60# define pI "l"
61# else
71f88e00
PE
62typedef int EMACS_INT;
63typedef unsigned int EMACS_UINT;
34374650 64# define EMACS_INT_MAX INT_MAX
47be4ab5
PE
65# define pI ""
66# endif
68c45bf0 67#endif
34374650
PE
68
69/* Number of bits in some machine integer types. */
70enum
71 {
72 BITS_PER_CHAR = CHAR_BIT,
73 BITS_PER_SHORT = CHAR_BIT * sizeof (short),
74 BITS_PER_INT = CHAR_BIT * sizeof (int),
75 BITS_PER_LONG = CHAR_BIT * sizeof (long int),
76 BITS_PER_EMACS_INT = CHAR_BIT * sizeof (EMACS_INT)
77 };
ce99fd65 78
a81d11a3
PE
79/* printmax_t and uprintmax_t are types for printing large integers.
80 These are the widest integers that are supported for printing.
81 pMd etc. are conversions for printing them.
82 On C99 hosts, there's no problem, as even the widest integers work.
83 Fall back on EMACS_INT on pre-C99 hosts. */
84#ifdef PRIdMAX
85typedef intmax_t printmax_t;
86typedef uintmax_t uprintmax_t;
87# define pMd PRIdMAX
88# define pMu PRIuMAX
89#else
90typedef EMACS_INT printmax_t;
91typedef EMACS_UINT uprintmax_t;
92# define pMd pI"d"
93# define pMu pI"u"
94#endif
95
9c4c5f81
PE
96/* Use pD to format ptrdiff_t values, which suffice for indexes into
97 buffers and strings. Emacs never allocates objects larger than
98 PTRDIFF_MAX bytes, as they cause problems with pointer subtraction.
99 In C99, pD can always be "t"; configure it here for the sake of
100 pre-C99 libraries such as glibc 2.0 and Solaris 8. */
101#if PTRDIFF_MAX == INT_MAX
102# define pD ""
103#elif PTRDIFF_MAX == LONG_MAX
104# define pD "l"
105#elif PTRDIFF_MAX == LLONG_MAX
106# define pD "ll"
107#else
108# define pD "t"
109#endif
110
e0b8c689 111/* Extra internal type checking? */
c6129d7e 112
310fbfa8
PE
113/* Define an Emacs version of 'assert (COND)', since some
114 system-defined 'assert's are flaky. COND should be free of side
115 effects; it may or may not be evaluated. */
116#ifndef ENABLE_CHECKING
117# define eassert(X) ((void) (0 && (X))) /* Check that X compiles. */
118#else /* ENABLE_CHECKING */
c6129d7e 119
845ca893 120extern _Noreturn void die (const char *, const char *, int);
244ed907 121
383b707e
KR
122/* The suppress_checking variable is initialized to 0 in alloc.c. Set
123 it to 1 using a debugger to temporarily disable aborting on
124 detected internal inconsistencies or error conditions.
125
383b707e 126 In some cases, a good compiler may be able to optimize away the
310fbfa8 127 eassert macro altogether, e.g., if XSTRING (x) uses eassert to test
383b707e
KR
128 STRINGP (x), but a particular use of XSTRING is invoked only after
129 testing that STRINGP (x) is true, making the test redundant. */
fce31d69 130extern bool suppress_checking EXTERNALLY_VISIBLE;
244ed907 131
310fbfa8
PE
132# define eassert(cond) \
133 ((cond) || suppress_checking \
134 ? (void) 0 \
135 : die ("assertion failed: " # cond, __FILE__, __LINE__))
3694b4ab 136#endif /* ENABLE_CHECKING */
b9466edb 137\f
646b5f55
AS
138/* Use the configure flag --enable-check-lisp-object-type to make
139 Lisp_Object use a struct type instead of the default int. The flag
140 causes CHECK_LISP_OBJECT_TYPE to be defined. */
b86cfd28 141
b9466edb 142/***** Select the tagging scheme. *****/
646b5f55 143/* The following option controls the tagging scheme:
b9466edb
SM
144 - USE_LSB_TAG means that we can assume the least 3 bits of pointers are
145 always 0, and we can thus use them to hold tag bits, without
146 restricting our addressing space.
147
bfe3e0a2
PE
148 If ! USE_LSB_TAG, then use the top 3 bits for tagging, thus
149 restricting our possible address range.
b9466edb
SM
150
151 USE_LSB_TAG not only requires the least 3 bits of pointers returned by
152 malloc to be 0 but also needs to be able to impose a mult-of-8 alignment
153 on the few static Lisp_Objects used: all the defsubr as well
154 as the two special buffers buffer_defaults and buffer_local_symbols. */
155
4706125e
PE
156enum Lisp_Bits
157 {
158 /* Number of bits in a Lisp_Object tag. This can be used in #if,
159 and for GDB's sake also as a regular symbol. */
160 GCTYPEBITS =
8c9afb46 161#define GCTYPEBITS 3
4706125e
PE
162 GCTYPEBITS,
163
b6b3b294
PE
164 /* 2**GCTYPEBITS. This must be a macro that expands to a literal
165 integer constant, for MSVC. */
e32a5799 166#define GCALIGNMENT 8
e32a5799 167
4706125e
PE
168 /* Number of bits in a Lisp_Object value, not counting the tag. */
169 VALBITS = BITS_PER_EMACS_INT - GCTYPEBITS,
1781b9e9 170
4706125e
PE
171 /* Number of bits in a Lisp fixnum tag. */
172 INTTYPEBITS = GCTYPEBITS - 1,
173
174 /* Number of bits in a Lisp fixnum value, not counting the tag. */
175 FIXNUM_BITS = VALBITS + 1
176 };
34374650 177
e32a5799
PE
178#if GCALIGNMENT != 1 << GCTYPEBITS
179# error "GCALIGNMENT and GCTYPEBITS are inconsistent"
180#endif
181
34374650
PE
182/* The maximum value that can be stored in a EMACS_INT, assuming all
183 bits other than the type bits contribute to a nonnegative signed value.
184 This can be used in #if, e.g., '#if VAL_MAX < UINTPTR_MAX' below. */
185#define VAL_MAX (EMACS_INT_MAX >> (GCTYPEBITS - 1))
310f5bd4 186
bfe3e0a2
PE
187/* Unless otherwise specified, use USE_LSB_TAG on systems where: */
188#ifndef USE_LSB_TAG
189/* 1. We know malloc returns a multiple of 8. */
190# if (defined GNU_MALLOC || defined DOUG_LEA_MALLOC || defined __GLIBC__ \
191 || defined DARWIN_OS || defined __sun)
192/* 2. We can specify multiple-of-8 alignment on static variables. */
e32a5799 193# ifdef alignas
bfe3e0a2
PE
194/* 3. Pointers-as-ints exceed VAL_MAX.
195 On hosts where pointers-as-ints do not exceed VAL_MAX, USE_LSB_TAG is:
27f3c637
PE
196 a. unnecessary, because the top bits of an EMACS_INT are unused, and
197 b. slower, because it typically requires extra masking.
bfe3e0a2
PE
198 So, default USE_LSB_TAG to 1 only on hosts where it might be useful. */
199# if VAL_MAX < UINTPTR_MAX
200# define USE_LSB_TAG 1
201# endif
310f5bd4 202# endif
b9466edb
SM
203# endif
204#endif
5eceb8fb
PE
205#ifdef USE_LSB_TAG
206# undef USE_LSB_TAG
4706125e 207enum enum_USE_LSB_TAG { USE_LSB_TAG = 1 };
5eceb8fb
PE
208# define USE_LSB_TAG 1
209#else
4706125e 210enum enum_USE_LSB_TAG { USE_LSB_TAG = 0 };
bfe3e0a2
PE
211# define USE_LSB_TAG 0
212#endif
b9466edb 213
e32a5799
PE
214#ifndef alignas
215# define alignas(alignment) /* empty */
bfe3e0a2 216# if USE_LSB_TAG
e32a5799 217# error "USE_LSB_TAG requires alignas"
b9466edb 218# endif
b9466edb
SM
219#endif
220
e0b8c689 221
99a3d506 222/* Define the fundamental Lisp data structures. */
3cfe6dfd 223
c95a4266
EZ
224/* This is the set of Lisp data types. If you want to define a new
225 data type, read the comments after Lisp_Fwd_Type definition
226 below. */
3cfe6dfd 227
2b570124
PE
228/* Lisp integers use 2 tags, to give them one extra bit, thus
229 extending their range from, e.g., -2^28..2^28-1 to -2^29..2^29-1. */
eff1c190 230#define INTMASK (EMACS_INT_MAX >> (INTTYPEBITS - 1))
2b570124 231#define case_Lisp_Int case Lisp_Int0: case Lisp_Int1
d5040d2d 232#define LISP_INT_TAG_P(x) (((x) & ~Lisp_Int1) == 0)
2de9f71c 233
a6fc3b5c
EZ
234/* Stolen from GDB. The only known compiler that doesn't support
235 enums in bitfields is MSVC. */
236#ifdef _MSC_VER
237#define ENUM_BF(TYPE) unsigned int
238#else
239#define ENUM_BF(TYPE) enum TYPE
240#endif
241
242
3cfe6dfd
JB
243enum Lisp_Type
244 {
99a3d506 245 /* Integer. XINT (obj) is the integer value. */
2de9f71c 246 Lisp_Int0 = 0,
d5040d2d 247 Lisp_Int1 = USE_LSB_TAG ? 1 << INTTYPEBITS : 1,
3cfe6dfd 248
99a3d506 249 /* Symbol. XSYMBOL (object) points to a struct Lisp_Symbol. */
2de9f71c 250 Lisp_Symbol = 2,
3cfe6dfd 251
84d1833e
KH
252 /* Miscellaneous. XMISC (object) points to a union Lisp_Misc,
253 whose first member indicates the subtype. */
2de9f71c 254 Lisp_Misc = 3,
3cfe6dfd
JB
255
256 /* String. XSTRING (object) points to a struct Lisp_String.
99a3d506 257 The length of the string, and its contents, are stored therein. */
d5040d2d 258 Lisp_String = USE_LSB_TAG ? 1 : 1 << INTTYPEBITS,
3cfe6dfd 259
b5088f80 260 /* Vector of Lisp objects, or something resembling it.
7c06ac2b 261 XVECTOR (object) points to a struct Lisp_Vector, which contains
b5088f80
KH
262 the size and contents. The size field also contains the type
263 information, if it's not a real vector object. */
2de9f71c 264 Lisp_Vectorlike = 5,
3cfe6dfd 265
99a3d506 266 /* Cons. XCONS (object) points to a struct Lisp_Cons. */
2de9f71c 267 Lisp_Cons = 6,
4d1207f6 268
2de9f71c 269 Lisp_Float = 7,
3cfe6dfd
JB
270 };
271
a32fa736 272/* This is the set of data types that share a common structure.
c98adc1b
KH
273 The first member of the structure is a type code from this set.
274 The enum values are arbitrary, but we'll use large numbers to make it
275 more likely that we'll spot the error if a random word in memory is
276 mistakenly interpreted as a Lisp_Misc. */
1c4ca5a3
KH
277enum Lisp_Misc_Type
278 {
c98adc1b 279 Lisp_Misc_Free = 0x5eab,
84d1833e 280 Lisp_Misc_Marker,
99a3d506 281 Lisp_Misc_Overlay,
222151aa 282 Lisp_Misc_Save_Value,
99a3d506
RS
283 /* Currently floats are not a misc type,
284 but let's define this in case we want to change that. */
285 Lisp_Misc_Float,
286 /* This is not a type code. It is for range checking. */
287 Lisp_Misc_Limit
1c4ca5a3
KH
288 };
289
ce5b453a
SM
290/* These are the types of forwarding objects used in the value slot
291 of symbols for special built-in variables whose value is stored in
292 C variables. */
293enum Lisp_Fwd_Type
294 {
295 Lisp_Fwd_Int, /* Fwd to a C `int' variable. */
296 Lisp_Fwd_Bool, /* Fwd to a C boolean var. */
297 Lisp_Fwd_Obj, /* Fwd to a C Lisp_Object variable. */
298 Lisp_Fwd_Buffer_Obj, /* Fwd to a Lisp_Object field of buffers. */
299 Lisp_Fwd_Kboard_Obj, /* Fwd to a Lisp_Object field of kboards. */
300 };
301
c95a4266
EZ
302/* If you want to define a new Lisp data type, here are some
303 instructions. See the thread at
304 http://lists.gnu.org/archive/html/emacs-devel/2012-10/msg00561.html
305 for more info.
306
307 First, there are already a couple of Lisp types that can be used if
308 your new type does not need to be exposed to Lisp programs nor
309 displayed to users. These are Lisp_Save_Value, a Lisp_Misc
791ef5f8 310 subtype; and PVEC_OTHER, a kind of vectorlike object. The former
c95a4266
EZ
311 is suitable for temporarily stashing away pointers and integers in
312 a Lisp object (see the existing uses of make_save_value and
313 XSAVE_VALUE). The latter is useful for vector-like Lisp objects
314 that need to be used as part of other objects, but which are never
315 shown to users or Lisp code (search for PVEC_OTHER in xterm.c for
316 an example).
317
318 These two types don't look pretty when printed, so they are
319 unsuitable for Lisp objects that can be exposed to users.
320
321 To define a new data type, add one more Lisp_Misc subtype or one
322 more pseudovector subtype. Pseudovectors are more suitable for
323 objects with several slots that need to support fast random access,
791ef5f8 324 while Lisp_Misc types are for everything else. A pseudovector object
c95a4266
EZ
325 provides one or more slots for Lisp objects, followed by struct
326 members that are accessible only from C. A Lisp_Misc object is a
327 wrapper for a C struct that can contain anything you like.
328
8847a0de
DA
329 Explicit freeing is discouraged for Lisp objects in general. But if
330 you really need to exploit this, use Lisp_Misc (check free_misc in
331 alloc.c to see why). There is no way to free a vectorlike object.
332
c95a4266
EZ
333 To add a new pseudovector type, extend the pvec_type enumeration;
334 to add a new Lisp_Misc, extend the Lisp_Misc_Type enumeration.
335
336 For a Lisp_Misc, you will also need to add your entry to union
337 Lisp_Misc (but make sure the first word has the same structure as
338 the others, starting with a 16-bit member of the Lisp_Misc_Type
339 enumeration and a 1-bit GC markbit) and make sure the overall size
340 of the union is not increased by your addition.
341
8847a0de
DA
342 For a new pseudovector, it's highly desirable to limit the size
343 of your data type by VBLOCK_BYTES_MAX bytes (defined in alloc.c).
344 Otherwise you will need to change sweep_vectors (also in alloc.c).
345
c95a4266
EZ
346 Then you will need to add switch branches in print.c (in
347 print_object, to print your object, and possibly also in
348 print_preprocess) and to alloc.c, to mark your object (in
349 mark_object) and to free it (in gc_sweep). The latter is also the
350 right place to call any code specific to your data type that needs
351 to run when the object is recycled -- e.g., free any additional
352 resources allocated for it that are not Lisp objects. You can even
353 make a pointer to the function that frees the resources a slot in
354 your object -- this way, the same object could be used to represent
355 several disparate C structures. */
356
646b5f55 357#ifdef CHECK_LISP_OBJECT_TYPE
3cfe6dfd 358
646b5f55
AS
359typedef struct { EMACS_INT i; } Lisp_Object;
360
361#define XLI(o) (o).i
f162bcc3 362LISP_INLINE Lisp_Object
646b5f55
AS
363XIL (EMACS_INT i)
364{
365 Lisp_Object o = { i };
366 return o;
367}
3cfe6dfd 368
f162bcc3 369LISP_INLINE Lisp_Object
f3fbd155
KR
370LISP_MAKE_RVALUE (Lisp_Object o)
371{
372 return o;
373}
bfe3e0a2
PE
374
375#define LISP_INITIALLY_ZERO {0}
f3fbd155 376
4706125e
PE
377#undef CHECK_LISP_OBJECT_TYPE
378enum CHECK_LISP_OBJECT_TYPE { CHECK_LISP_OBJECT_TYPE = 1 };
646b5f55 379#else /* CHECK_LISP_OBJECT_TYPE */
3cfe6dfd 380
646b5f55 381/* If a struct type is not wanted, define Lisp_Object as just a number. */
3cfe6dfd 382
c003141f 383typedef EMACS_INT Lisp_Object;
646b5f55
AS
384#define XLI(o) (o)
385#define XIL(i) (i)
e7032e7c 386#define LISP_MAKE_RVALUE(o) (0 + (o))
bfe3e0a2 387#define LISP_INITIALLY_ZERO 0
4706125e 388enum CHECK_LISP_OBJECT_TYPE { CHECK_LISP_OBJECT_TYPE = 0 };
646b5f55 389#endif /* CHECK_LISP_OBJECT_TYPE */
3cfe6dfd 390
d311d28c 391/* In the size word of a vector, this bit means the vector has been marked. */
846d69ac 392
79ea6c20
PE
393static ptrdiff_t const ARRAY_MARK_FLAG
394#define ARRAY_MARK_FLAG PTRDIFF_MIN
395 = ARRAY_MARK_FLAG;
846d69ac 396
b5088f80
KH
397/* In the size word of a struct Lisp_Vector, this bit means it's really
398 some other vector-like object. */
f162bcc3
PE
399static ptrdiff_t const PSEUDOVECTOR_FLAG
400#define PSEUDOVECTOR_FLAG (PTRDIFF_MAX - PTRDIFF_MAX / 2)
401 = PSEUDOVECTOR_FLAG;
b5088f80 402
303a5c93 403/* In a pseudovector, the size field actually contains a word with one
6aea7528
DA
404 PSEUDOVECTOR_FLAG bit set, and one of the following values extracted
405 with PVEC_TYPE_MASK to indicate the actual type. */
99a3d506
RS
406enum pvec_type
407{
6aea7528 408 PVEC_NORMAL_VECTOR,
ee28be33
SM
409 PVEC_FREE,
410 PVEC_PROCESS,
411 PVEC_FRAME,
412 PVEC_WINDOW,
413 PVEC_BOOL_VECTOR,
414 PVEC_BUFFER,
415 PVEC_HASH_TABLE,
416 PVEC_TERMINAL,
417 PVEC_WINDOW_CONFIGURATION,
418 PVEC_SUBR,
419 PVEC_OTHER,
914adc42
DA
420 /* These should be last, check internal_equal to see why. */
421 PVEC_COMPILED,
422 PVEC_CHAR_TABLE,
423 PVEC_SUB_CHAR_TABLE,
424 PVEC_FONT /* Should be last because it's used for range checking. */
99a3d506 425};
b5088f80 426
4706125e
PE
427/* DATA_SEG_BITS forces extra bits to be or'd in with any pointers
428 which were stored in a Lisp_Object. */
429#ifndef DATA_SEG_BITS
430# define DATA_SEG_BITS 0
431#endif
432enum { gdb_DATA_SEG_BITS = DATA_SEG_BITS };
433#undef DATA_SEG_BITS
434
435enum More_Lisp_Bits
1781b9e9 436 {
4706125e
PE
437 DATA_SEG_BITS = gdb_DATA_SEG_BITS,
438
439 /* For convenience, we also store the number of elements in these bits.
440 Note that this size is not necessarily the memory-footprint size, but
441 only the number of Lisp_Object fields (that need to be traced by GC).
442 The distinction is used, e.g., by Lisp_Process, which places extra
443 non-Lisp_Object fields at the end of the structure. */
914adc42 444 PSEUDOVECTOR_SIZE_BITS = 12,
1781b9e9 445 PSEUDOVECTOR_SIZE_MASK = (1 << PSEUDOVECTOR_SIZE_BITS) - 1,
914adc42
DA
446
447 /* To calculate the memory footprint of the pseudovector, it's useful
448 to store the size of non-Lisp area in word_size units here. */
449 PSEUDOVECTOR_REST_BITS = 12,
04a2d0d3 450 PSEUDOVECTOR_REST_MASK = (((1 << PSEUDOVECTOR_REST_BITS) - 1)
914adc42
DA
451 << PSEUDOVECTOR_SIZE_BITS),
452
453 /* Used to extract pseudovector subtype information. */
454 PSEUDOVECTOR_AREA_BITS = PSEUDOVECTOR_SIZE_BITS + PSEUDOVECTOR_REST_BITS,
455 PVEC_TYPE_MASK = 0x3f << PSEUDOVECTOR_AREA_BITS,
1781b9e9 456
4706125e
PE
457 /* Number of bits to put in each character in the internal representation
458 of bool vectors. This should not vary across implementations. */
459 BOOL_VECTOR_BITS_PER_CHAR = 8
460 };
3cfe6dfd
JB
461\f
462/* These macros extract various sorts of values from a Lisp_Object.
463 For example, if tem is a Lisp_Object whose type is Lisp_Cons,
99a3d506 464 XCONS (tem) is the struct Lisp_Cons * pointing to the memory for that cons. */
3cfe6dfd 465
bfe3e0a2 466#if USE_LSB_TAG
6b61353c 467
c32af1e4
PE
468enum lsb_bits
469 {
470 TYPEMASK = (1 << GCTYPEBITS) - 1,
471 VALMASK = ~ TYPEMASK
472 };
2b570124
PE
473#define XTYPE(a) ((enum Lisp_Type) (XLI (a) & TYPEMASK))
474#define XINT(a) (XLI (a) >> INTTYPEBITS)
475#define XUINT(a) ((EMACS_UINT) XLI (a) >> INTTYPEBITS)
476#define make_number(N) XIL ((EMACS_INT) (N) << INTTYPEBITS)
e7032e7c 477#define make_lisp_ptr(ptr, type) \
2b570124 478 (eassert (XTYPE (XIL ((intptr_t) (ptr))) == 0), /* Check alignment. */ \
e7032e7c 479 XIL ((type) | (intptr_t) (ptr)))
6b61353c 480
2b570124
PE
481#define XPNTR(a) ((intptr_t) (XLI (a) & ~TYPEMASK))
482#define XUNTAG(a, type) ((intptr_t) (XLI (a) - (type)))
6b61353c
KH
483
484#else /* not USE_LSB_TAG */
485
a8333d03
PE
486static EMACS_INT const VALMASK
487#define VALMASK VAL_MAX
488 = VALMASK;
6b61353c 489
2b570124 490#define XTYPE(a) ((enum Lisp_Type) ((EMACS_UINT) XLI (a) >> VALBITS))
3cfe6dfd 491
221f4ef3
KH
492/* For integers known to be positive, XFASTINT provides fast retrieval
493 and XSETFASTINT provides fast storage. This takes advantage of the
2b570124
PE
494 fact that Lisp integers have zero-bits in their tags. */
495#define XFASTINT(a) (XLI (a) + 0)
496#define XSETFASTINT(a, b) ((a) = XIL (b))
3cfe6dfd 497
2de9f71c 498/* Extract the value of a Lisp_Object as a (un)signed integer. */
3cfe6dfd 499
2b570124
PE
500#define XINT(a) (XLI (a) << INTTYPEBITS >> INTTYPEBITS)
501#define XUINT(a) ((EMACS_UINT) (XLI (a) & INTMASK))
502#define make_number(N) XIL ((EMACS_INT) (N) & INTMASK)
3cfe6dfd 503
e7032e7c
SM
504#define make_lisp_ptr(ptr, type) \
505 (XIL ((EMACS_INT) ((EMACS_UINT) (type) << VALBITS) \
506 + ((intptr_t) (ptr) & VALMASK)))
b7acde90 507
19634648 508/* DATA_SEG_BITS forces extra bits to be or'd in with any pointers
e7032e7c 509 which were stored in a Lisp_Object. */
2b570124 510#define XPNTR(a) ((uintptr_t) ((XLI (a) & VALMASK)) | DATA_SEG_BITS))
b7acde90 511
6b61353c 512#endif /* not USE_LSB_TAG */
3cfe6dfd 513
61ddb1b9
SM
514/* Return a (Lisp-integer sized) hash of the Lisp_Object value. Happens to be
515 like XUINT right now, but XUINT should only be applied to objects we know
516 are integers. */
517#define XHASH(a) XUINT (a)
518
b349d111
SM
519/* For integers known to be positive, XFASTINT sometimes provides
520 faster retrieval and XSETFASTINT provides faster storage.
521 If not, fallback on the non-accelerated path. */
522#ifndef XFASTINT
523# define XFASTINT(a) (XINT (a))
524# define XSETFASTINT(a, b) (XSETINT (a, b))
525#endif
526
b263a6b0
PE
527/* Extract the pointer value of the Lisp object A, under the
528 assumption that A's type is TYPE. This is a fallback
529 implementation if nothing faster is available. */
530#ifndef XUNTAG
531# define XUNTAG(a, type) XPNTR (a)
532#endif
533
61ddb1b9 534#define EQ(x, y) (XLI (x) == XLI (y))
b9466edb 535
0de4bb68 536/* Largest and smallest representable fixnum values. These are the C
0d879dca 537 values. They are macros for use in static initializers. */
2b570124 538#define MOST_POSITIVE_FIXNUM (EMACS_INT_MAX >> INTTYPEBITS)
0de4bb68
PE
539#define MOST_NEGATIVE_FIXNUM (-1 - MOST_POSITIVE_FIXNUM)
540
987c9327
AS
541/* Value is non-zero if I doesn't fit into a Lisp fixnum. It is
542 written this way so that it also works if I is of unsigned
2e6578fb 543 type or if I is a NaN. */
dc8e8b07
GM
544
545#define FIXNUM_OVERFLOW_P(i) \
2e6578fb 546 (! ((0 <= (i) || MOST_NEGATIVE_FIXNUM <= (i)) && (i) <= MOST_POSITIVE_FIXNUM))
dc8e8b07 547
f162bcc3 548LISP_INLINE ptrdiff_t
d311d28c
PE
549clip_to_bounds (ptrdiff_t lower, EMACS_INT num, ptrdiff_t upper)
550{
551 return num < lower ? lower : num <= upper ? num : upper;
552}
553
99a3d506 554/* Extract a value or address from a Lisp_Object. */
3cfe6dfd 555
b263a6b0
PE
556#define XCONS(a) (eassert (CONSP (a)), \
557 (struct Lisp_Cons *) XUNTAG (a, Lisp_Cons))
558#define XVECTOR(a) (eassert (VECTORLIKEP (a)), \
559 (struct Lisp_Vector *) XUNTAG (a, Lisp_Vectorlike))
560#define XSTRING(a) (eassert (STRINGP (a)), \
561 (struct Lisp_String *) XUNTAG (a, Lisp_String))
562#define XSYMBOL(a) (eassert (SYMBOLP (a)), \
563 (struct Lisp_Symbol *) XUNTAG (a, Lisp_Symbol))
564#define XFLOAT(a) (eassert (FLOATP (a)), \
565 (struct Lisp_Float *) XUNTAG (a, Lisp_Float))
7c06ac2b
RS
566
567/* Misc types. */
c9f6631c 568
b263a6b0 569#define XMISC(a) ((union Lisp_Misc *) XUNTAG (a, Lisp_Misc))
5e617bc2 570#define XMISCANY(a) (eassert (MISCP (a)), &(XMISC (a)->u_any))
67ee9f6e 571#define XMISCTYPE(a) (XMISCANY (a)->type)
5e617bc2
JB
572#define XMARKER(a) (eassert (MARKERP (a)), &(XMISC (a)->u_marker))
573#define XOVERLAY(a) (eassert (OVERLAYP (a)), &(XMISC (a)->u_overlay))
574#define XSAVE_VALUE(a) (eassert (SAVE_VALUEP (a)), &(XMISC (a)->u_save_value))
ce5b453a
SM
575
576/* Forwarding object types. */
577
578#define XFWDTYPE(a) (a->u_intfwd.type)
579#define XINTFWD(a) (eassert (INTFWDP (a)), &((a)->u_intfwd))
580#define XBOOLFWD(a) (eassert (BOOLFWDP (a)), &((a)->u_boolfwd))
581#define XOBJFWD(a) (eassert (OBJFWDP (a)), &((a)->u_objfwd))
19fa82b9 582#define XBUFFER_OBJFWD(a) \
ce5b453a 583 (eassert (BUFFER_OBJFWDP (a)), &((a)->u_buffer_objfwd))
19fa82b9 584#define XKBOARD_OBJFWD(a) \
ce5b453a 585 (eassert (KBOARD_OBJFWDP (a)), &((a)->u_kboard_objfwd))
3cfe6dfd 586
7c06ac2b 587/* Pseudovector types. */
c9f6631c 588
b263a6b0
PE
589#define XPROCESS(a) (eassert (PROCESSP (a)), \
590 (struct Lisp_Process *) XUNTAG (a, Lisp_Vectorlike))
591#define XWINDOW(a) (eassert (WINDOWP (a)), \
592 (struct window *) XUNTAG (a, Lisp_Vectorlike))
593#define XTERMINAL(a) (eassert (TERMINALP (a)), \
594 (struct terminal *) XUNTAG (a, Lisp_Vectorlike))
595#define XSUBR(a) (eassert (SUBRP (a)), \
596 (struct Lisp_Subr *) XUNTAG (a, Lisp_Vectorlike))
597#define XBUFFER(a) (eassert (BUFFERP (a)), \
598 (struct buffer *) XUNTAG (a, Lisp_Vectorlike))
599#define XCHAR_TABLE(a) (eassert (CHAR_TABLE_P (a)), \
600 (struct Lisp_Char_Table *) XUNTAG (a, Lisp_Vectorlike))
601#define XSUB_CHAR_TABLE(a) (eassert (SUB_CHAR_TABLE_P (a)), \
602 ((struct Lisp_Sub_Char_Table *) \
603 XUNTAG (a, Lisp_Vectorlike)))
604#define XBOOL_VECTOR(a) (eassert (BOOL_VECTOR_P (a)), \
605 ((struct Lisp_Bool_Vector *) \
606 XUNTAG (a, Lisp_Vectorlike)))
99a3d506 607
99a3d506 608/* Construct a Lisp_Object from a value or address. */
7c06ac2b 609
ff55dfe8
PE
610#define XSETINT(a, b) ((a) = make_number (b))
611#define XSETCONS(a, b) ((a) = make_lisp_ptr (b, Lisp_Cons))
612#define XSETVECTOR(a, b) ((a) = make_lisp_ptr (b, Lisp_Vectorlike))
613#define XSETSTRING(a, b) ((a) = make_lisp_ptr (b, Lisp_String))
614#define XSETSYMBOL(a, b) ((a) = make_lisp_ptr (b, Lisp_Symbol))
615#define XSETFLOAT(a, b) ((a) = make_lisp_ptr (b, Lisp_Float))
7c06ac2b
RS
616
617/* Misc types. */
c9f6631c 618
ff55dfe8 619#define XSETMISC(a, b) ((a) = make_lisp_ptr (b, Lisp_Misc))
a7aa28f6 620#define XSETMARKER(a, b) (XSETMISC (a, b), XMISCTYPE (a) = Lisp_Misc_Marker)
7c06ac2b
RS
621
622/* Pseudovector types. */
c9f6631c 623
914adc42
DA
624#define XSETPVECTYPE(v, code) \
625 ((v)->header.size |= PSEUDOVECTOR_FLAG | ((code) << PSEUDOVECTOR_AREA_BITS))
626#define XSETPVECTYPESIZE(v, code, lispsize, restsize) \
ee28be33 627 ((v)->header.size = (PSEUDOVECTOR_FLAG \
914adc42
DA
628 | ((code) << PSEUDOVECTOR_AREA_BITS) \
629 | ((restsize) << PSEUDOVECTOR_SIZE_BITS) \
630 | (lispsize)))
aa0b0087
PE
631
632/* The cast to struct vectorlike_header * avoids aliasing issues. */
7c06ac2b 633#define XSETPSEUDOVECTOR(a, b, code) \
7555c33f
SM
634 XSETTYPED_PSEUDOVECTOR (a, b, \
635 (((struct vectorlike_header *) \
636 XUNTAG (a, Lisp_Vectorlike)) \
637 ->size), \
638 code)
eab3844f 639#define XSETTYPED_PSEUDOVECTOR(a, b, size, code) \
beb9f745 640 (XSETVECTOR (a, b), \
eab3844f 641 eassert ((size & (PSEUDOVECTOR_FLAG | PVEC_TYPE_MASK)) \
914adc42 642 == (PSEUDOVECTOR_FLAG | (code << PSEUDOVECTOR_AREA_BITS))))
aa0b0087 643
7c06ac2b
RS
644#define XSETWINDOW_CONFIGURATION(a, b) \
645 (XSETPSEUDOVECTOR (a, b, PVEC_WINDOW_CONFIGURATION))
646#define XSETPROCESS(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_PROCESS))
647#define XSETWINDOW(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_WINDOW))
49e49fb5 648#define XSETTERMINAL(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_TERMINAL))
914adc42 649#define XSETSUBR(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_SUBR))
7c06ac2b 650#define XSETCOMPILED(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_COMPILED))
99a3d506 651#define XSETBUFFER(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_BUFFER))
608ff985
RS
652#define XSETCHAR_TABLE(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_CHAR_TABLE))
653#define XSETBOOL_VECTOR(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_BOOL_VECTOR))
1842abb2 654#define XSETSUB_CHAR_TABLE(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_SUB_CHAR_TABLE))
c9f6631c
GM
655
656/* Convenience macros for dealing with Lisp arrays. */
657
915b2a6a 658#define AREF(ARRAY, IDX) XVECTOR ((ARRAY))->contents[IDX]
77b37c05 659#define ASIZE(ARRAY) XVECTOR ((ARRAY))->header.size
4b75ffab 660#define ASET(ARRAY, IDX, VAL) \
6af64513 661 (eassert (0 <= (IDX) && (IDX) < ASIZE (ARRAY)), \
4939150c 662 XVECTOR (ARRAY)->contents[IDX] = (VAL))
c9f6631c 663
d90a14e0
GM
664/* Convenience macros for dealing with Lisp strings. */
665
674537ea 666#define SDATA(string) (XSTRING (string)->data + 0)
b9466edb
SM
667#define SREF(string, index) (SDATA (string)[index] + 0)
668#define SSET(string, index, new) (SDATA (string)[index] = (new))
7412b6fd
KR
669#define SCHARS(string) (XSTRING (string)->size + 0)
670#define SBYTES(string) (STRING_BYTES (XSTRING (string)) + 0)
671
51b59d79
PE
672/* Avoid "differ in sign" warnings. */
673#define SSDATA(x) ((char *) SDATA (x))
674
7412b6fd
KR
675#define STRING_SET_CHARS(string, newsize) \
676 (XSTRING (string)->size = (newsize))
d90a14e0 677
101d50c8 678#define STRING_COPYIN(string, index, new, count) \
72af86bd 679 memcpy (SDATA (string) + index, new, count)
101d50c8 680
c8a39089
KS
681/* Type checking. */
682
683#define CHECK_TYPE(ok, Qxxxp, x) \
684 do { if (!(ok)) wrong_type_argument (Qxxxp, (x)); } while (0)
685
c644523b 686/* Deprecated and will be removed soon. */
e34f7f79
DA
687
688#define INTERNAL_FIELD(field) field ## _
c8a39089 689
5f6bf5fe 690/* See the macros in intervals.h. */
e221eae3
JA
691
692typedef struct interval *INTERVAL;
693
8e99d072 694/* Complain if object is not string or buffer type. */
874cc80e 695#define CHECK_STRING_OR_BUFFER(x) \
c8a39089
KS
696 CHECK_TYPE (STRINGP (x) || BUFFERP (x), Qbuffer_or_string_p, x)
697
3cfe6dfd
JB
698struct Lisp_Cons
699 {
d8a05828 700 /* Car of this cons cell. */
c644523b 701 Lisp_Object car;
d8a05828 702
3a623fee
AS
703 union
704 {
d8a05828 705 /* Cdr of this cons cell. */
c644523b 706 Lisp_Object cdr;
d8a05828
DA
707
708 /* Used to chain conses on a free list. */
3a623fee
AS
709 struct Lisp_Cons *chain;
710 } u;
3cfe6dfd
JB
711 };
712
b7acde90 713/* Take the car or cdr of something known to be a cons cell. */
f3fbd155
KR
714/* The _AS_LVALUE macros shouldn't be used outside of the minimal set
715 of code that has to know what a cons cell looks like. Other code not
716 part of the basic lisp implementation should assume that the car and cdr
717 fields are not accessible as lvalues. (What if we want to switch to
718 a copying collector someday? Cached cons cell field addresses may be
719 invalidated at arbitrary points.) */
c644523b
DA
720#define XCAR_AS_LVALUE(c) (XCONS (c)->car)
721#define XCDR_AS_LVALUE(c) (XCONS (c)->u.cdr)
b7acde90 722
f3fbd155 723/* Use these from normal code. */
5e617bc2
JB
724#define XCAR(c) LISP_MAKE_RVALUE (XCAR_AS_LVALUE (c))
725#define XCDR(c) LISP_MAKE_RVALUE (XCDR_AS_LVALUE (c))
f3fbd155
KR
726
727/* Use these to set the fields of a cons cell.
728
729 Note that both arguments may refer to the same object, so 'n'
730 should not be read after 'c' is first modified. Also, neither
731 argument should be evaluated more than once; side effects are
732 especially common in the second argument. */
5e617bc2
JB
733#define XSETCAR(c,n) (XCAR_AS_LVALUE (c) = (n))
734#define XSETCDR(c,n) (XCDR_AS_LVALUE (c) = (n))
f3fbd155 735
b7acde90
KH
736/* Take the car or cdr of something whose type is not known. */
737#define CAR(c) \
738 (CONSP ((c)) ? XCAR ((c)) \
739 : NILP ((c)) ? Qnil \
915b2a6a 740 : wrong_type_argument (Qlistp, (c)))
b7acde90
KH
741
742#define CDR(c) \
743 (CONSP ((c)) ? XCDR ((c)) \
744 : NILP ((c)) ? Qnil \
915b2a6a 745 : wrong_type_argument (Qlistp, (c)))
b7acde90 746
c8a39089
KS
747/* Take the car or cdr of something whose type is not known. */
748#define CAR_SAFE(c) \
749 (CONSP ((c)) ? XCAR ((c)) : Qnil)
750
751#define CDR_SAFE(c) \
752 (CONSP ((c)) ? XCDR ((c)) : Qnil)
753
fce31d69 754/* True if STR is a multibyte string. */
d8fc7ce4
KH
755#define STRING_MULTIBYTE(STR) \
756 (XSTRING (STR)->size_byte >= 0)
757
758/* Return the length in bytes of STR. */
35f464a7
GM
759
760#ifdef GC_CHECK_STRING_BYTES
761
762struct Lisp_String;
d311d28c 763extern ptrdiff_t string_bytes (struct Lisp_String *);
35f464a7
GM
764#define STRING_BYTES(S) string_bytes ((S))
765
766#else /* not GC_CHECK_STRING_BYTES */
767
d8fc7ce4
KH
768#define STRING_BYTES(STR) \
769 ((STR)->size_byte < 0 ? (STR)->size : (STR)->size_byte)
770
35f464a7
GM
771#endif /* not GC_CHECK_STRING_BYTES */
772
c9d624c6
PE
773/* An upper bound on the number of bytes in a Lisp string, not
774 counting the terminating null. This a tight enough bound to
775 prevent integer overflow errors that would otherwise occur during
776 string size calculations. A string cannot contain more bytes than
777 a fixnum can represent, nor can it be so long that C pointer
778 arithmetic stops working on the string plus its terminating null.
779 Although the actual size limit (see STRING_BYTES_MAX in alloc.c)
780 may be a bit smaller than STRING_BYTES_BOUND, calculating it here
781 would expose alloc.c internal details that we'd rather keep
03a660a6
PE
782 private.
783
88fb40b4 784 This is a macro for use in static initializers, and a constant for
03a660a6 785 visibility to GDB. The cast to ptrdiff_t ensures that
88fb40b4 786 the macro is signed. */
03a660a6 787static ptrdiff_t const STRING_BYTES_BOUND =
c9d624c6 788#define STRING_BYTES_BOUND \
88fb40b4 789 ((ptrdiff_t) min (MOST_POSITIVE_FIXNUM, min (SIZE_MAX, PTRDIFF_MAX) - 1))
03a660a6 790 STRING_BYTES_BOUND;
d1f3d2af 791
491c2516 792/* Mark STR as a unibyte string. */
2c668b9a
JB
793#define STRING_SET_UNIBYTE(STR) \
794 do { if (EQ (STR, empty_multibyte_string)) \
795 (STR) = empty_unibyte_string; \
796 else XSTRING (STR)->size_byte = -1; } while (0)
491c2516 797
94ef4d69
KH
798/* Mark STR as a multibyte string. Assure that STR contains only
799 ASCII characters in advance. */
800#define STRING_SET_MULTIBYTE(STR) \
801 do { if (EQ (STR, empty_unibyte_string)) \
802 (STR) = empty_multibyte_string; \
803 else XSTRING (STR)->size_byte = XSTRING (STR)->size; } while (0)
804
ee28be33 805/* In a string or vector, the sign bit of the `size' is the gc mark bit. */
3cfe6dfd
JB
806
807struct Lisp_String
808 {
d311d28c
PE
809 ptrdiff_t size;
810 ptrdiff_t size_byte;
ee28be33 811 INTERVAL intervals; /* Text properties in this string. */
f05d7ea2 812 unsigned char *data;
3cfe6dfd
JB
813 };
814
aa0b0087 815/* Header of vector-like objects. This documents the layout constraints on
914adc42 816 vectors and pseudovectors (objects of PVEC_xxx subtype). It also prevents
aa0b0087
PE
817 compilers from being fooled by Emacs's type punning: the XSETPSEUDOVECTOR
818 and PSEUDOVECTORP macros cast their pointers to struct vectorlike_header *,
819 because when two such pointers potentially alias, a compiler won't
820 incorrectly reorder loads and stores to their size fields. See
821 <http://debbugs.gnu.org/cgi/bugreport.cgi?bug=8546>. */
b102ceb1 822struct vectorlike_header
3cfe6dfd 823 {
914adc42 824 /* The only field contains various pieces of information:
ee28be33
SM
825 - The MSB (ARRAY_MARK_FLAG) holds the gcmarkbit.
826 - The next bit (PSEUDOVECTOR_FLAG) indicates whether this is a plain
827 vector (0) or a pseudovector (1).
828 - If PSEUDOVECTOR_FLAG is 0, the rest holds the size (number
829 of slots) of the vector.
914adc42
DA
830 - If PSEUDOVECTOR_FLAG is 1, the rest is subdivided into three fields:
831 - a) pseudovector subtype held in PVEC_TYPE_MASK field;
832 - b) number of Lisp_Objects slots at the beginning of the object
833 held in PSEUDOVECTOR_SIZE_MASK field. These objects are always
834 traced by the GC;
835 - c) size of the rest fields held in PSEUDOVECTOR_REST_MASK and
836 measured in word_size units. Rest fields may also include
837 Lisp_Objects, but these objects usually needs some special treatment
838 during GC.
839 There are some exceptions. For PVEC_FREE, b) is always zero. For
840 PVEC_BOOL_VECTOR and PVEC_SUBR, both b) and c) are always zero.
841 Current layout limits the pseudovectors to 63 PVEC_xxx subtypes,
842 4095 Lisp_Objects in GC-ed area and 4095 word-sized other slots. */
d311d28c 843 ptrdiff_t size;
eab3844f
PE
844 };
845
663e2b3f
DA
846/* Regular vector is just a header plus array of Lisp_Objects. */
847
eab3844f
PE
848struct Lisp_Vector
849 {
b102ceb1 850 struct vectorlike_header header;
3cfe6dfd
JB
851 Lisp_Object contents[1];
852 };
853
663e2b3f
DA
854/* A boolvector is a kind of vectorlike, with contents are like a string. */
855
856struct Lisp_Bool_Vector
857 {
858 /* HEADER.SIZE is the vector's size field. It doesn't have the real size,
859 just the subtype information. */
860 struct vectorlike_header header;
861 /* This is the size in bits. */
862 EMACS_INT size;
863 /* This contains the actual bits, packed into bytes. */
864 unsigned char data[1];
865 };
866
867/* Some handy constants for calculating sizes
868 and offsets, mostly of vectorlike objects. */
869
870enum
871 {
872 header_size = offsetof (struct Lisp_Vector, contents),
873 bool_header_size = offsetof (struct Lisp_Bool_Vector, data),
874 word_size = sizeof (Lisp_Object)
875 };
876
94225242 877/* If a struct is made to look like a vector, this macro returns the length
4115d3f7 878 of the shortest vector that would hold that struct. */
663e2b3f
DA
879
880#define VECSIZE(type) \
881 ((sizeof (type) - header_size + word_size - 1) / word_size)
94225242 882
d0ebe33a
SM
883/* Like VECSIZE, but used when the pseudo-vector has non-Lisp_Object fields
884 at the end and we need to compute the number of Lisp_Object fields (the
885 ones that the GC needs to trace). */
663e2b3f
DA
886
887#define PSEUDOVECSIZE(type, nonlispfield) \
888 ((offsetof (type, nonlispfield) - header_size) / word_size)
d0ebe33a 889
1842abb2 890/* A char-table is a kind of vectorlike, with contents are like a
ea724a01 891 vector but with a few other slots. For some purposes, it makes
1842abb2 892 sense to handle a char-table with type struct Lisp_Vector. An
ea724a01
KH
893 element of a char table can be any Lisp objects, but if it is a sub
894 char-table, we treat it a table that contains information of a
1842abb2
KH
895 specific range of characters. A sub char-table has the same
896 structure as a vector. A sub char table appears only in an element
897 of a char-table, and there's no way to access it directly from
898 Emacs Lisp program. */
608ff985 899
d9da2f45
KH
900#ifdef __GNUC__
901
902#define CHAR_TABLE_REF_ASCII(CT, IDX) \
903 ({struct Lisp_Char_Table *_tbl = NULL; \
904 Lisp_Object _val; \
905 do { \
906 _tbl = _tbl ? XCHAR_TABLE (_tbl->parent) : XCHAR_TABLE (CT); \
907 _val = (! SUB_CHAR_TABLE_P (_tbl->ascii) ? _tbl->ascii \
908 : XSUB_CHAR_TABLE (_tbl->ascii)->contents[IDX]); \
909 if (NILP (_val)) \
910 _val = _tbl->defalt; \
911 } while (NILP (_val) && ! NILP (_tbl->parent)); \
912 _val; })
c5c21b70 913
d9da2f45
KH
914#else /* not __GNUC__ */
915
916#define CHAR_TABLE_REF_ASCII(CT, IDX) \
917 (! NILP (XCHAR_TABLE (CT)->ascii) \
918 ? (! SUB_CHAR_TABLE_P (XCHAR_TABLE (CT)->ascii) \
919 ? XCHAR_TABLE (CT)->ascii \
920 : ! NILP (XSUB_CHAR_TABLE (XCHAR_TABLE (CT)->ascii)->contents[IDX]) \
921 ? XSUB_CHAR_TABLE (XCHAR_TABLE (CT)->ascii)->contents[IDX] \
922 : char_table_ref ((CT), (IDX))) \
923 : char_table_ref ((CT), (IDX)))
924
925#endif /* not __GNUC__ */
926
ea204efb
PE
927/* Compute A OP B, using the unsigned comparison operator OP. A and B
928 should be integer expressions. This is not the same as
53964682 929 mathematical comparison; for example, UNSIGNED_CMP (0, <, -1)
ea204efb
PE
930 returns 1. For efficiency, prefer plain unsigned comparison if A
931 and B's sizes both fit (after integer promotion). */
932#define UNSIGNED_CMP(a, op, b) \
933 (max (sizeof ((a) + 0), sizeof ((b) + 0)) <= sizeof (unsigned) \
934 ? ((a) + (unsigned) 0) op ((b) + (unsigned) 0) \
935 : ((a) + (uintmax_t) 0) op ((b) + (uintmax_t) 0))
936
15206ed9 937/* Nonzero iff C is an ASCII character. */
ea204efb 938#define ASCII_CHAR_P(c) UNSIGNED_CMP (c, <, 0x80)
15206ed9 939
b96656ce 940/* Almost equivalent to Faref (CT, IDX) with optimization for ASCII
1842abb2 941 characters. Do not check validity of CT. */
d9da2f45
KH
942#define CHAR_TABLE_REF(CT, IDX) \
943 (ASCII_CHAR_P (IDX) ? CHAR_TABLE_REF_ASCII ((CT), (IDX)) \
1842abb2 944 : char_table_ref ((CT), (IDX)))
b96656ce
KH
945
946/* Equivalent to Faset (CT, IDX, VAL) with optimization for ASCII and
c497dce4 947 8-bit European characters. Do not check validity of CT. */
1842abb2 948#define CHAR_TABLE_SET(CT, IDX, VAL) \
193e32d9 949 (ASCII_CHAR_P (IDX) && SUB_CHAR_TABLE_P (XCHAR_TABLE (CT)->ascii) \
34dabdb7 950 ? set_sub_char_table_contents (XCHAR_TABLE (CT)->ascii, IDX, VAL) \
1842abb2
KH
951 : char_table_set (CT, IDX, VAL))
952
03a660a6
PE
953enum CHARTAB_SIZE_BITS
954 {
955 CHARTAB_SIZE_BITS_0 = 6,
956 CHARTAB_SIZE_BITS_1 = 4,
957 CHARTAB_SIZE_BITS_2 = 5,
958 CHARTAB_SIZE_BITS_3 = 7
959 };
1842abb2
KH
960
961extern const int chartab_size[4];
962
608ff985
RS
963struct Lisp_Char_Table
964 {
eab3844f 965 /* HEADER.SIZE is the vector's size field, which also holds the
608ff985 966 pseudovector type information. It holds the size, too.
c73bd236
MB
967 The size counts the defalt, parent, purpose, ascii,
968 contents, and extras slots. */
b102ceb1 969 struct vectorlike_header header;
1842abb2 970
608ff985
RS
971 /* This holds a default value,
972 which is used whenever the value for a specific character is nil. */
973 Lisp_Object defalt;
ea724a01 974
8f924df7
KH
975 /* This points to another char table, which we inherit from when the
976 value for a specific character is nil. The `defalt' slot takes
977 precedence over this. */
608ff985 978 Lisp_Object parent;
1842abb2 979
8f924df7
KH
980 /* This is a symbol which says what kind of use this char-table is
981 meant for. */
7f73dc9d 982 Lisp_Object purpose;
1842abb2 983
8f924df7
KH
984 /* The bottom sub char-table for characters of the range 0..127. It
985 is nil if none of ASCII character has a specific value. */
986 Lisp_Object ascii;
1842abb2 987
8f924df7 988 Lisp_Object contents[(1 << CHARTAB_SIZE_BITS_0)];
1842abb2 989
8f924df7 990 /* These hold additional data. It is a vector. */
608ff985
RS
991 Lisp_Object extras[1];
992 };
993
1842abb2 994struct Lisp_Sub_Char_Table
8f924df7 995 {
eab3844f 996 /* HEADER.SIZE is the vector's size field, which also holds the
8f924df7 997 pseudovector type information. It holds the size, too. */
b102ceb1 998 struct vectorlike_header header;
1842abb2 999
8f924df7 1000 /* Depth of this sub char-table. It should be 1, 2, or 3. A sub
78edd3b7 1001 char-table of depth 1 contains 16 elements, and each element
8f924df7
KH
1002 covers 4096 (128*32) characters. A sub char-table of depth 2
1003 contains 32 elements, and each element covers 128 characters. A
1004 sub char-table of depth 3 contains 128 elements, and each element
1005 is for one character. */
1006 Lisp_Object depth;
1842abb2 1007
8f924df7
KH
1008 /* Minimum character covered by the sub char-table. */
1009 Lisp_Object min_char;
1842abb2 1010
34dabdb7 1011 /* Use set_sub_char_table_contents to set this. */
8f924df7
KH
1012 Lisp_Object contents[1];
1013 };
608ff985 1014
7c06ac2b
RS
1015/* This structure describes a built-in function.
1016 It is generated by the DEFUN macro only.
914adc42 1017 defsubr makes it into a Lisp object. */
e98227af 1018
3cfe6dfd
JB
1019struct Lisp_Subr
1020 {
914adc42 1021 struct vectorlike_header header;
c0f2f16b
DN
1022 union {
1023 Lisp_Object (*a0) (void);
1024 Lisp_Object (*a1) (Lisp_Object);
1025 Lisp_Object (*a2) (Lisp_Object, Lisp_Object);
1026 Lisp_Object (*a3) (Lisp_Object, Lisp_Object, Lisp_Object);
1027 Lisp_Object (*a4) (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
1028 Lisp_Object (*a5) (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
1029 Lisp_Object (*a6) (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
1030 Lisp_Object (*a7) (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
1031 Lisp_Object (*a8) (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
d5273788 1032 Lisp_Object (*aUNEVALLED) (Lisp_Object args);
f66c7cf8 1033 Lisp_Object (*aMANY) (ptrdiff_t, Lisp_Object *);
c0f2f16b 1034 } function;
3cfe6dfd 1035 short min_args, max_args;
5e2327cf 1036 const char *symbol_name;
89dc303e
DN
1037 const char *intspec;
1038 const char *doc;
3cfe6dfd 1039 };
5010d3b8 1040
03a660a6
PE
1041/* This is the number of slots that every char table must have. This
1042 counts the ordinary slots and the top, defalt, parent, and purpose
1043 slots. */
1044enum CHAR_TABLE_STANDARD_SLOTS
1045 {
1046 CHAR_TABLE_STANDARD_SLOTS = VECSIZE (struct Lisp_Char_Table) - 1
1047 };
1048
1049/* Return the number of "extra" slots in the char table CT. */
1050
1051#define CHAR_TABLE_EXTRA_SLOTS(CT) \
1052 (((CT)->header.size & PSEUDOVECTOR_SIZE_MASK) - CHAR_TABLE_STANDARD_SLOTS)
1053
5010d3b8 1054\f
a32fa736
GM
1055/***********************************************************************
1056 Symbols
1057 ***********************************************************************/
1058
1059/* Interned state of a symbol. */
1060
1061enum symbol_interned
1062{
1063 SYMBOL_UNINTERNED = 0,
1064 SYMBOL_INTERNED = 1,
1065 SYMBOL_INTERNED_IN_INITIAL_OBARRAY = 2
1066};
1067
ce5b453a
SM
1068enum symbol_redirect
1069{
1070 SYMBOL_PLAINVAL = 4,
1071 SYMBOL_VARALIAS = 1,
1072 SYMBOL_LOCALIZED = 2,
9aba6043 1073 SYMBOL_FORWARDED = 3
ce5b453a
SM
1074};
1075
a32fa736
GM
1076struct Lisp_Symbol
1077{
a84f89d5
SM
1078 unsigned gcmarkbit : 1;
1079
ce5b453a
SM
1080 /* Indicates where the value can be found:
1081 0 : it's a plain var, the value is in the `value' field.
1082 1 : it's a varalias, the value is really in the `alias' symbol.
1083 2 : it's a localized var, the value is in the `blv' object.
9aba6043 1084 3 : it's a forwarding variable, the value is in `forward'. */
a6fc3b5c 1085 ENUM_BF (symbol_redirect) redirect : 3;
a32fa736
GM
1086
1087 /* Non-zero means symbol is constant, i.e. changing its value
ce5b453a
SM
1088 should signal an error. If the value is 3, then the var
1089 can be changed, but only by `defconst'. */
1090 unsigned constant : 2;
a32fa736
GM
1091
1092 /* Interned state of the symbol. This is an enumerator from
1093 enum symbol_interned. */
1094 unsigned interned : 2;
1e973bc7 1095
b9598260
SM
1096 /* Non-zero means that this variable has been explicitly declared
1097 special (with `defvar' etc), and shouldn't be lexically bound. */
1098 unsigned declared_special : 1;
a32fa736 1099
c644523b
DA
1100 /* The symbol's name, as a Lisp string. */
1101 Lisp_Object name;
a32fa736 1102
9aba6043
SM
1103 /* Value of the symbol or Qunbound if unbound. Which alternative of the
1104 union is used depends on the `redirect' field above. */
ce5b453a 1105 union {
c644523b 1106 Lisp_Object value;
ce5b453a
SM
1107 struct Lisp_Symbol *alias;
1108 struct Lisp_Buffer_Local_Value *blv;
1109 union Lisp_Fwd *fwd;
1110 } val;
a32fa736 1111
eadf1faa 1112 /* Function value of the symbol or Qnil if not fboundp. */
c644523b 1113 Lisp_Object function;
a32fa736
GM
1114
1115 /* The symbol's property list. */
c644523b 1116 Lisp_Object plist;
e2c0561e 1117
a32fa736
GM
1118 /* Next symbol in obarray bucket, if the symbol is interned. */
1119 struct Lisp_Symbol *next;
1120};
1121
74d70085
KR
1122/* Value is name of symbol. */
1123
c644523b
DA
1124#define SYMBOL_VAL(sym) \
1125 (eassert ((sym)->redirect == SYMBOL_PLAINVAL), sym->val.value)
1126#define SYMBOL_ALIAS(sym) \
ce5b453a 1127 (eassert ((sym)->redirect == SYMBOL_VARALIAS), (sym)->val.alias)
c644523b 1128#define SYMBOL_BLV(sym) \
ce5b453a 1129 (eassert ((sym)->redirect == SYMBOL_LOCALIZED), (sym)->val.blv)
c644523b 1130#define SYMBOL_FWD(sym) \
ce5b453a 1131 (eassert ((sym)->redirect == SYMBOL_FORWARDED), (sym)->val.fwd)
c644523b
DA
1132#define SET_SYMBOL_VAL(sym, v) \
1133 (eassert ((sym)->redirect == SYMBOL_PLAINVAL), (sym)->val.value = (v))
1134#define SET_SYMBOL_ALIAS(sym, v) \
ce5b453a 1135 (eassert ((sym)->redirect == SYMBOL_VARALIAS), (sym)->val.alias = (v))
c644523b 1136#define SET_SYMBOL_BLV(sym, v) \
ce5b453a 1137 (eassert ((sym)->redirect == SYMBOL_LOCALIZED), (sym)->val.blv = (v))
c644523b 1138#define SET_SYMBOL_FWD(sym, v) \
ce5b453a
SM
1139 (eassert ((sym)->redirect == SYMBOL_FORWARDED), (sym)->val.fwd = (v))
1140
c644523b 1141#define SYMBOL_NAME(sym) XSYMBOL (sym)->name
74d70085 1142
a32fa736
GM
1143/* Value is non-zero if SYM is an interned symbol. */
1144
c644523b
DA
1145#define SYMBOL_INTERNED_P(sym) \
1146 (XSYMBOL (sym)->interned != SYMBOL_UNINTERNED)
a32fa736
GM
1147
1148/* Value is non-zero if SYM is interned in initial_obarray. */
1149
c644523b
DA
1150#define SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P(sym) \
1151 (XSYMBOL (sym)->interned == SYMBOL_INTERNED_IN_INITIAL_OBARRAY)
a32fa736
GM
1152
1153/* Value is non-zero if symbol is considered a constant, i.e. its
1154 value cannot be changed (there is an exception for keyword symbols,
1155 whose value can be set to the keyword symbol itself). */
1156
c644523b 1157#define SYMBOL_CONSTANT_P(sym) XSYMBOL (sym)->constant
a32fa736 1158
c644523b 1159#define DEFSYM(sym, name) \
cd3520a4
JB
1160 do { (sym) = intern_c_string ((name)); staticpro (&(sym)); } while (0)
1161
a32fa736 1162\f
5010d3b8
GM
1163/***********************************************************************
1164 Hash Tables
1165 ***********************************************************************/
1166
1167/* The structure of a Lisp hash table. */
1168
b7432bb2
SM
1169struct hash_table_test
1170{
1171 /* Name of the function used to compare keys. */
1172 Lisp_Object name;
1173
1174 /* User-supplied hash function, or nil. */
1175 Lisp_Object user_hash_function;
1176
1177 /* User-supplied key comparison function, or nil. */
1178 Lisp_Object user_cmp_function;
1179
1180 /* C function to compare two keys. */
1181 bool (*cmpfn) (struct hash_table_test *t, Lisp_Object, Lisp_Object);
1182
1183 /* C function to compute hash code. */
1184 EMACS_UINT (*hashfn) (struct hash_table_test *t, Lisp_Object);
1185};
1186
5010d3b8
GM
1187struct Lisp_Hash_Table
1188{
eab3844f 1189 /* This is for Lisp; the hash table code does not refer to it. */
b102ceb1 1190 struct vectorlike_header header;
e2c0561e 1191
5010d3b8
GM
1192 /* Nil if table is non-weak. Otherwise a symbol describing the
1193 weakness of the table. */
1194 Lisp_Object weak;
e2c0561e 1195
5010d3b8
GM
1196 /* When the table is resized, and this is an integer, compute the
1197 new size by adding this to the old size. If a float, compute the
1198 new size by multiplying the old size with this factor. */
1199 Lisp_Object rehash_size;
1200
1201 /* Resize hash table when number of entries/ table size is >= this
1202 ratio, a float. */
1203 Lisp_Object rehash_threshold;
1204
5010d3b8
GM
1205 /* Vector of hash codes.. If hash[I] is nil, this means that that
1206 entry I is unused. */
1207 Lisp_Object hash;
1208
1209 /* Vector used to chain entries. If entry I is free, next[I] is the
1210 entry number of the next free item. If entry I is non-free,
1211 next[I] is the index of the next entry in the collision chain. */
1212 Lisp_Object next;
1213
1214 /* Index of first free entry in free list. */
1215 Lisp_Object next_free;
1216
1217 /* Bucket vector. A non-nil entry is the index of the first item in
1218 a collision chain. This vector's size can be larger than the
1219 hash table size to reduce collisions. */
1220 Lisp_Object index;
1221
878f97ff 1222 /* Only the fields above are traced normally by the GC. The ones below
78edd3b7 1223 `count' are special and are either ignored by the GC or traced in
878f97ff
SM
1224 a special way (e.g. because of weakness). */
1225
1226 /* Number of key/value entries in the table. */
d311d28c 1227 ptrdiff_t count;
878f97ff
SM
1228
1229 /* Vector of keys and values. The key of item I is found at index
1230 2 * I, the value is found at index 2 * I + 1.
1231 This is gc_marked specially if the table is weak. */
1232 Lisp_Object key_and_value;
1233
b7432bb2
SM
1234 /* The comparison and hash functions. */
1235 struct hash_table_test test;
1236
6c661ec9
SM
1237 /* Next weak hash table if this is a weak hash table. The head
1238 of the list is in weak_hash_tables. */
1239 struct Lisp_Hash_Table *next_weak;
5010d3b8
GM
1240};
1241
1242
1243#define XHASH_TABLE(OBJ) \
b263a6b0 1244 ((struct Lisp_Hash_Table *) XUNTAG (OBJ, Lisp_Vectorlike))
5010d3b8
GM
1245
1246#define XSET_HASH_TABLE(VAR, PTR) \
1247 (XSETPSEUDOVECTOR (VAR, PTR, PVEC_HASH_TABLE))
1248
1249#define HASH_TABLE_P(OBJ) PSEUDOVECTORP (OBJ, PVEC_HASH_TABLE)
5010d3b8 1250
c8a39089
KS
1251#define CHECK_HASH_TABLE(x) \
1252 CHECK_TYPE (HASH_TABLE_P (x), Qhash_table_p, x)
5010d3b8 1253
141788b5
SM
1254/* Value is the key part of entry IDX in hash table H. */
1255
915b2a6a 1256#define HASH_KEY(H, IDX) AREF ((H)->key_and_value, 2 * (IDX))
141788b5
SM
1257
1258/* Value is the value part of entry IDX in hash table H. */
1259
915b2a6a 1260#define HASH_VALUE(H, IDX) AREF ((H)->key_and_value, 2 * (IDX) + 1)
141788b5
SM
1261
1262/* Value is the index of the next entry following the one at IDX
1263 in hash table H. */
1264
915b2a6a 1265#define HASH_NEXT(H, IDX) AREF ((H)->next, (IDX))
141788b5
SM
1266
1267/* Value is the hash code computed for entry IDX in hash table H. */
1268
915b2a6a 1269#define HASH_HASH(H, IDX) AREF ((H)->hash, (IDX))
141788b5
SM
1270
1271/* Value is the index of the element in hash table H that is the
1272 start of the collision list at index IDX in the index vector of H. */
1273
915b2a6a 1274#define HASH_INDEX(H, IDX) AREF ((H)->index, (IDX))
141788b5
SM
1275
1276/* Value is the size of hash table H. */
1277
77b37c05 1278#define HASH_TABLE_SIZE(H) ASIZE ((H)->next)
141788b5 1279
5010d3b8
GM
1280/* Default size for hash tables if not specified. */
1281
03a660a6 1282enum DEFAULT_HASH_SIZE { DEFAULT_HASH_SIZE = 65 };
5010d3b8
GM
1283
1284/* Default threshold specifying when to resize a hash table. The
1285 value gives the ratio of current entries in the hash table and the
1286 size of the hash table. */
1287
185ee146 1288static double const DEFAULT_REHASH_THRESHOLD = 0.8;
5010d3b8
GM
1289
1290/* Default factor by which to increase the size of a hash table. */
1291
185ee146 1292static double const DEFAULT_REHASH_SIZE = 1.5;
5010d3b8 1293
04a2d0d3
PE
1294/* Combine two integers X and Y for hashing. The result might not fit
1295 into a Lisp integer. */
1296
1297LISP_INLINE EMACS_UINT
1298sxhash_combine (EMACS_UINT x, EMACS_UINT y)
1299{
1300 return (x << 4) + (x >> (BITS_PER_EMACS_INT - 4)) + y;
1301}
1302
eff1c190
PE
1303/* Hash X, returning a value that fits into a fixnum. */
1304
1305LISP_INLINE EMACS_UINT
1306SXHASH_REDUCE (EMACS_UINT x)
1307{
1308 return (x ^ x >> (BITS_PER_EMACS_INT - FIXNUM_BITS)) & INTMASK;
1309}
1310
7c06ac2b
RS
1311/* These structures are used for various misc types. */
1312
67ee9f6e
SM
1313struct Lisp_Misc_Any /* Supertype of all Misc types. */
1314{
a6fc3b5c 1315 ENUM_BF (Lisp_Misc_Type) type : 16; /* = Lisp_Misc_??? */
67ee9f6e
SM
1316 unsigned gcmarkbit : 1;
1317 int spacer : 15;
1318};
1319
3cfe6dfd 1320struct Lisp_Marker
308e97d0 1321{
a6fc3b5c 1322 ENUM_BF (Lisp_Misc_Type) type : 16; /* = Lisp_Misc_Marker */
a84f89d5 1323 unsigned gcmarkbit : 1;
9bb13d08
KH
1324 int spacer : 13;
1325 /* This flag is temporarily used in the functions
1326 decode/encode_coding_object to record that the marker position
1327 must be adjusted after the conversion. */
1328 unsigned int need_adjustment : 1;
308e97d0
RS
1329 /* 1 means normal insertion at the marker's position
1330 leaves the marker after the inserted text. */
1331 unsigned int insertion_type : 1;
b9466edb
SM
1332 /* This is the buffer that the marker points into, or 0 if it points nowhere.
1333 Note: a chain of markers can contain markers pointing into different
1334 buffers (the chain is per buffer_text rather than per buffer, so it's
1335 shared between indirect buffers). */
1336 /* This is used for (other than NULL-checking):
1337 - Fmarker_buffer
1338 - Fset_marker: check eq(oldbuf, newbuf) to avoid unchain+rechain.
1339 - unchain_marker: to find the list from which to unchain.
ce5b453a 1340 - Fkill_buffer: to only unchain the markers of current indirect buffer.
b9466edb 1341 */
308e97d0 1342 struct buffer *buffer;
4ed24bf3
RS
1343
1344 /* The remaining fields are meaningless in a marker that
1345 does not point anywhere. */
1346
1347 /* For markers that point somewhere,
1348 this is used to chain of all the markers in a given buffer. */
d6aa1876
SM
1349 /* We could remove it and use an array in buffer_text instead.
1350 That would also allow to preserve it ordered. */
c0ac2f4a 1351 struct Lisp_Marker *next;
4ed24bf3 1352 /* This is the char position where the marker points. */
d311d28c 1353 ptrdiff_t charpos;
ce5b453a
SM
1354 /* This is the byte position.
1355 It's mostly used as a charpos<->bytepos cache (i.e. it's not directly
1356 used to implement the functionality of markers, but rather to (ab)use
1357 markers as a cache for char<->byte mappings). */
d311d28c 1358 ptrdiff_t bytepos;
308e97d0 1359};
3cfe6dfd 1360
7555c33f
SM
1361/* START and END are markers in the overlay's buffer, and
1362 PLIST is the overlay's property list. */
1363struct Lisp_Overlay
fa691a83
DA
1364/* An overlay's real data content is:
1365 - plist
1366 - buffer (really there are two buffer pointers, one per marker,
1367 and both points to the same buffer)
1368 - insertion type of both ends (per-marker fields)
1369 - start & start byte (of start marker)
1370 - end & end byte (of end marker)
1371 - next (singly linked list of overlays)
1372 - next fields of start and end markers (singly linked list of markers).
1373 I.e. 9words plus 2 bits, 3words of which are for external linked lists.
1374*/
7555c33f
SM
1375 {
1376 ENUM_BF (Lisp_Misc_Type) type : 16; /* = Lisp_Misc_Overlay */
1377 unsigned gcmarkbit : 1;
1378 int spacer : 15;
1379 struct Lisp_Overlay *next;
c644523b
DA
1380 Lisp_Object start;
1381 Lisp_Object end;
1382 Lisp_Object plist;
7555c33f
SM
1383 };
1384
73ebd38f
DA
1385/* Types of data which may be saved in a Lisp_Save_Value. */
1386
1387enum
1388 {
1389 SAVE_UNUSED,
1390 SAVE_INTEGER,
1391 SAVE_POINTER,
1392 SAVE_OBJECT
1393 };
1394
468afbac
DA
1395/* Special object used to hold a different values for later use.
1396
1397 This is mostly used to package C integers and pointers to call
1398 record_unwind_protect. Typical task is to pass just one C pointer
1399 to unwind function. You should pack pointer with make_save_pointer
1400 and then get it back with XSAVE_POINTER, e.g.:
1401
1402 ...
1403 struct my_data *md = get_my_data ();
1404 record_unwind_protect (my_unwind, make_save_pointer (md));
1405 ...
1406
1407 Lisp_Object my_unwind (Lisp_Object arg)
1408 {
1409 struct my_data *md = XSAVE_POINTER (arg, 0);
1410 ...
1411 }
1412
1413 If yon need to pass more than just one C pointer, you should
1414 use make_save_value. This function allows you to pack up to
1415 4 integers, pointers or Lisp_Objects and conveniently get them
1416 back with XSAVE_POINTER, XSAVE_INTEGER and XSAVE_OBJECT macros:
1417
1418 ...
1419 struct my_data *md = get_my_data ();
1420 ptrdiff_t my_offset = get_my_offset ();
1421 Lisp_Object my_object = get_my_object ();
1422 record_unwind_protect
1423 (my_unwind, make_save_value ("pio", md, my_offset, my_object));
1424 ...
1425
1426 Lisp_Object my_unwind (Lisp_Object arg)
1427 {
1428 struct my_data *md = XSAVE_POINTER (arg, 0);
1429 ptrdiff_t my_offset = XSAVE_INTEGER (arg, 1);
1430 Lisp_Object my_object = XSAVE_OBJECT (arg, 2);
1431 ...
1432 }
1433
1434 If ENABLE_CHECKING is in effect, XSAVE_xxx macros do type checking of the
1435 saved objects and raise eassert if type of the saved object doesn't match
1436 the type which is extracted. In the example above, XSAVE_INTEGER (arg, 2)
1437 or XSAVE_OBJECT (arg, 1) are wrong because integer was saved in slot 1 and
1438 Lisp_Object was saved in slot 2 of ARG. */
73ebd38f 1439
7555c33f
SM
1440struct Lisp_Save_Value
1441 {
1442 ENUM_BF (Lisp_Misc_Type) type : 16; /* = Lisp_Misc_Save_Value */
1443 unsigned gcmarkbit : 1;
73ebd38f
DA
1444 int spacer : 6;
1445 /* If `area' is nonzero, `data[0].pointer' is the address of a memory area
1446 containing `data[1].integer' potential Lisp_Objects. The rest of `data'
1447 fields are unused. */
1448 unsigned area : 1;
1449 /* If `area' is zero, `data[N]' may hold different objects which type is
1450 encoded in `typeN' fields as described by the anonymous enum above.
1451 E.g. if `type0' is SAVE_INTEGER, `data[0].integer' is in use. */
1452 unsigned type0 : 2;
1453 unsigned type1 : 2;
1454 unsigned type2 : 2;
1455 unsigned type3 : 2;
1456 union {
1457 void *pointer;
1458 ptrdiff_t integer;
1459 Lisp_Object object;
1460 } data[4];
7555c33f
SM
1461 };
1462
2b30549c
DA
1463/* Macro to set and extract Nth saved pointer. Type
1464 checking is ugly because it's used as an lvalue. */
73ebd38f 1465
2b30549c
DA
1466#define XSAVE_POINTER(obj, n) \
1467 XSAVE_VALUE (obj)->data[(eassert (XSAVE_VALUE (obj)->type \
1468 ## n == SAVE_POINTER), n)].pointer
73ebd38f 1469
b17b4d0f 1470/* Likewise for the saved integer. */
73ebd38f 1471
2b30549c
DA
1472#define XSAVE_INTEGER(obj, n) \
1473 XSAVE_VALUE (obj)->data[(eassert (XSAVE_VALUE (obj)->type \
1474 ## n == SAVE_INTEGER), n)].integer
7555c33f 1475
2b30549c
DA
1476/* Macro to extract Nth saved object. This is never used as
1477 an lvalue, so we can do more convenient type checking. */
1b971ac1
DA
1478
1479#define XSAVE_OBJECT(obj, n) \
1480 (eassert (XSAVE_VALUE (obj)->type ## n == SAVE_OBJECT), \
1481 XSAVE_VALUE (obj)->data[n].object)
1482
7555c33f
SM
1483/* A miscellaneous object, when it's on the free list. */
1484struct Lisp_Free
1485 {
1486 ENUM_BF (Lisp_Misc_Type) type : 16; /* = Lisp_Misc_Free */
1487 unsigned gcmarkbit : 1;
1488 int spacer : 15;
1489 union Lisp_Misc *chain;
1490 };
1491
1492/* To get the type field of a union Lisp_Misc, use XMISCTYPE.
1493 It uses one of these struct subtypes to get the type field. */
1494
1495union Lisp_Misc
1496 {
1497 struct Lisp_Misc_Any u_any; /* Supertype of all Misc types. */
1498 struct Lisp_Free u_free;
1499 struct Lisp_Marker u_marker;
1500 struct Lisp_Overlay u_overlay;
1501 struct Lisp_Save_Value u_save_value;
1502 };
1503
ee4c9ce4
KH
1504/* Forwarding pointer to an int variable.
1505 This is allowed only in the value cell of a symbol,
1506 and it means that the symbol's value really lives in the
1507 specified int variable. */
1508struct Lisp_Intfwd
84d1833e 1509 {
ce5b453a 1510 enum Lisp_Fwd_Type type; /* = Lisp_Fwd_Int */
31ade731 1511 EMACS_INT *intvar;
ee4c9ce4
KH
1512 };
1513
1514/* Boolean forwarding pointer to an int variable.
1515 This is like Lisp_Intfwd except that the ostensible
1516 "value" of the symbol is t if the int variable is nonzero,
1517 nil if it is zero. */
1518struct Lisp_Boolfwd
1519 {
ce5b453a 1520 enum Lisp_Fwd_Type type; /* = Lisp_Fwd_Bool */
f5d9e83a 1521 bool *boolvar;
ee4c9ce4
KH
1522 };
1523
1524/* Forwarding pointer to a Lisp_Object variable.
1525 This is allowed only in the value cell of a symbol,
1526 and it means that the symbol's value really lives in the
1527 specified variable. */
1528struct Lisp_Objfwd
1529 {
ce5b453a 1530 enum Lisp_Fwd_Type type; /* = Lisp_Fwd_Obj */
ee4c9ce4
KH
1531 Lisp_Object *objvar;
1532 };
1533
1534/* Like Lisp_Objfwd except that value lives in a slot in the
1535 current buffer. Value is byte index of slot within buffer. */
1536struct Lisp_Buffer_Objfwd
1537 {
ce5b453a 1538 enum Lisp_Fwd_Type type; /* = Lisp_Fwd_Buffer_Obj */
ee4c9ce4 1539 int offset;
58cc0a01
DA
1540 /* One of Qnil, Qintegerp, Qsymbolp, Qstringp, Qfloatp or Qnumberp. */
1541 Lisp_Object predicate;
84d1833e
KH
1542 };
1543
65d0110b
RS
1544/* struct Lisp_Buffer_Local_Value is used in a symbol value cell when
1545 the symbol has buffer-local or frame-local bindings. (Exception:
1546 some buffer-local variables are built-in, with their values stored
1547 in the buffer structure itself. They are handled differently,
1548 using struct Lisp_Buffer_Objfwd.)
1549
1550 The `realvalue' slot holds the variable's current value, or a
1551 forwarding pointer to where that value is kept. This value is the
1552 one that corresponds to the loaded binding. To read or set the
1553 variable, you must first make sure the right binding is loaded;
1554 then you can access the value in (or through) `realvalue'.
e2c0561e 1555
65d0110b
RS
1556 `buffer' and `frame' are the buffer and frame for which the loaded
1557 binding was found. If those have changed, to make sure the right
1558 binding is loaded it is necessary to find which binding goes with
1559 the current buffer and selected frame, then load it. To load it,
1560 first unload the previous binding, then copy the value of the new
1561 binding into `realvalue' (or through it). Also update
1562 LOADED-BINDING to point to the newly loaded binding.
7d65f1c2 1563
78edd3b7
JB
1564 `local_if_set' indicates that merely setting the variable creates a
1565 local binding for the current buffer. Otherwise the latter, setting
1566 the variable does not do that; only make-local-variable does that. */
65d0110b 1567
7d65f1c2
KH
1568struct Lisp_Buffer_Local_Value
1569 {
67ee9f6e 1570 /* 1 means that merely setting the variable creates a local
7555c33f 1571 binding for the current buffer. */
67ee9f6e 1572 unsigned int local_if_set : 1;
ce5b453a
SM
1573 /* 1 means this variable can have frame-local bindings, otherwise, it is
1574 can have buffer-local bindings. The two cannot be combined. */
1575 unsigned int frame_local : 1;
1576 /* 1 means that the binding now loaded was found.
7555c33f 1577 Presumably equivalent to (defcell!=valcell). */
ce5b453a
SM
1578 unsigned int found : 1;
1579 /* If non-NULL, a forwarding to the C var where it should also be set. */
1580 union Lisp_Fwd *fwd; /* Should never be (Buffer|Kboard)_Objfwd. */
1581 /* The buffer or frame for which the loaded binding was found. */
1582 Lisp_Object where;
1583 /* A cons cell that holds the default value. It has the form
1584 (SYMBOL . DEFAULT-VALUE). */
1585 Lisp_Object defcell;
1586 /* The cons cell from `where's parameter alist.
1587 It always has the form (SYMBOL . VALUE)
1588 Note that if `forward' is non-nil, VALUE may be out of date.
1589 Also if the currently loaded binding is the default binding, then
1590 this is `eq'ual to defcell. */
1591 Lisp_Object valcell;
7d65f1c2
KH
1592 };
1593
f334de0e 1594/* Like Lisp_Objfwd except that value lives in a slot in the
32462604
KH
1595 current kboard. */
1596struct Lisp_Kboard_Objfwd
f334de0e 1597 {
ce5b453a 1598 enum Lisp_Fwd_Type type; /* = Lisp_Fwd_Kboard_Obj */
f334de0e
KH
1599 int offset;
1600 };
1601
ce5b453a
SM
1602union Lisp_Fwd
1603 {
d55c12ed
AS
1604 struct Lisp_Intfwd u_intfwd;
1605 struct Lisp_Boolfwd u_boolfwd;
1606 struct Lisp_Objfwd u_objfwd;
1607 struct Lisp_Buffer_Objfwd u_buffer_objfwd;
1608 struct Lisp_Kboard_Objfwd u_kboard_objfwd;
84d1833e 1609 };
7c06ac2b 1610\f
7555c33f 1611/* Lisp floating point type. */
3cfe6dfd
JB
1612struct Lisp_Float
1613 {
3a623fee
AS
1614 union
1615 {
3a623fee 1616 double data;
3a623fee
AS
1617 struct Lisp_Float *chain;
1618 } u;
3cfe6dfd 1619 };
8f34f70a 1620
7e63e0c3
DA
1621#define XFLOAT_DATA(f) (0 ? XFLOAT (f)->u.data : XFLOAT (f)->u.data)
1622#define XFLOAT_INIT(f, n) (XFLOAT (f)->u.data = (n))
3cfe6dfd 1623
4d7e6e51
PE
1624/* Most hosts nowadays use IEEE floating point, so they use IEC 60559
1625 representations, have infinities and NaNs, and do not trap on
1626 exceptions. Define IEEE_FLOATING_POINT if this host is one of the
1627 typical ones. The C11 macro __STDC_IEC_559__ is close to what is
1628 wanted here, but is not quite right because Emacs does not require
1629 all the features of C11 Annex F (and does not require C11 at all,
1630 for that matter). */
1631#define IEEE_FLOATING_POINT (FLT_RADIX == 2 && FLT_MANT_DIG == 24 \
1632 && FLT_MIN_EXP == -125 && FLT_MAX_EXP == 128)
1633
3cfe6dfd 1634/* A character, declared with the following typedef, is a member
99a3d506 1635 of some character set associated with the current buffer. */
b2ba7b00
RS
1636#ifndef _UCHAR_T /* Protect against something in ctab.h on AIX. */
1637#define _UCHAR_T
3cfe6dfd 1638typedef unsigned char UCHAR;
b2ba7b00 1639#endif
3cfe6dfd
JB
1640
1641/* Meanings of slots in a Lisp_Compiled: */
1642
03a660a6
PE
1643enum Lisp_Compiled
1644 {
1645 COMPILED_ARGLIST = 0,
1646 COMPILED_BYTECODE = 1,
1647 COMPILED_CONSTANTS = 2,
1648 COMPILED_STACK_DEPTH = 3,
1649 COMPILED_DOC_STRING = 4,
1650 COMPILED_INTERACTIVE = 5
1651 };
88dbfee5 1652
d03f79ef
JB
1653/* Flag bits in a character. These also get used in termhooks.h.
1654 Richard Stallman <rms@gnu.ai.mit.edu> thinks that MULE
7c06ac2b
RS
1655 (MUlti-Lingual Emacs) might need 22 bits for the character value
1656 itself, so we probably shouldn't use any bits lower than 0x0400000. */
03a660a6
PE
1657enum char_bits
1658 {
1659 CHAR_ALT = 0x0400000,
1660 CHAR_SUPER = 0x0800000,
1661 CHAR_HYPER = 0x1000000,
1662 CHAR_SHIFT = 0x2000000,
1663 CHAR_CTL = 0x4000000,
1664 CHAR_META = 0x8000000,
1665
1666 CHAR_MODIFIER_MASK =
88fb40b4 1667 CHAR_ALT | CHAR_SUPER | CHAR_HYPER | CHAR_SHIFT | CHAR_CTL | CHAR_META,
03a660a6
PE
1668
1669 /* Actually, the current Emacs uses 22 bits for the character value
1670 itself. */
1671 CHARACTERBITS = 22
1672 };
048151c1
KH
1673
1674
6b768554 1675
703f2808 1676\f
ec9ed378
KS
1677/* The glyph datatype, used to represent characters on the display.
1678 It consists of a char code and a face id. */
1679
1680typedef struct {
1681 int ch;
1682 int face_id;
1683} GLYPH;
703f2808
JB
1684
1685/* Return a glyph's character code. */
ec9ed378 1686#define GLYPH_CHAR(glyph) ((glyph).ch)
703f2808
JB
1687
1688/* Return a glyph's face ID. */
ec9ed378 1689#define GLYPH_FACE(glyph) ((glyph).face_id)
49b0dd75 1690
ec9ed378
KS
1691#define SET_GLYPH_CHAR(glyph, char) ((glyph).ch = (char))
1692#define SET_GLYPH_FACE(glyph, face) ((glyph).face_id = (face))
1693#define SET_GLYPH(glyph, char, face) ((glyph).ch = (char), (glyph).face_id = (face))
703f2808 1694
e0f24100 1695/* Return 1 if GLYPH contains valid character code. */
2638320e 1696#define GLYPH_CHAR_VALID_P(glyph) CHAR_VALID_P (GLYPH_CHAR (glyph))
ec9ed378
KS
1697
1698
1699/* Glyph Code from a display vector may either be an integer which
1700 encodes a char code in the lower CHARACTERBITS bits and a (very small)
1701 face-id in the upper bits, or it may be a cons (CHAR . FACE-ID). */
1702
d311d28c
PE
1703#define GLYPH_CODE_P(gc) \
1704 (CONSP (gc) \
1705 ? (CHARACTERP (XCAR (gc)) \
1706 && RANGED_INTEGERP (0, XCDR (gc), MAX_FACE_ID)) \
1707 : (RANGED_INTEGERP \
1708 (0, gc, \
1709 (MAX_FACE_ID < TYPE_MAXIMUM (EMACS_INT) >> CHARACTERBITS \
1710 ? ((EMACS_INT) MAX_FACE_ID << CHARACTERBITS) | MAX_CHAR \
1711 : TYPE_MAXIMUM (EMACS_INT)))))
ec9ed378 1712
d311d28c 1713/* The following are valid only if GLYPH_CODE_P (gc). */
ec9ed378 1714
d311d28c
PE
1715#define GLYPH_CODE_CHAR(gc) \
1716 (CONSP (gc) ? XINT (XCAR (gc)) : XINT (gc) & ((1 << CHARACTERBITS) - 1))
ec9ed378 1717
d311d28c
PE
1718#define GLYPH_CODE_FACE(gc) \
1719 (CONSP (gc) ? XINT (XCDR (gc)) : XINT (gc) >> CHARACTERBITS)
ec9ed378 1720
ec9ed378
KS
1721#define SET_GLYPH_FROM_GLYPH_CODE(glyph, gc) \
1722 do \
1723 { \
1724 if (CONSP (gc)) \
1725 SET_GLYPH (glyph, XINT (XCAR (gc)), XINT (XCDR (gc))); \
1726 else \
1727 SET_GLYPH (glyph, (XINT (gc) & ((1 << CHARACTERBITS)-1)), \
1728 (XINT (gc) >> CHARACTERBITS)); \
1729 } \
1730 while (0)
3cfe6dfd 1731\f
7ea692f6
EZ
1732/* Structure to hold mouse highlight data. This is here because other
1733 header files need it for defining struct x_output etc. */
1734typedef struct {
1735 /* These variables describe the range of text currently shown in its
1736 mouse-face, together with the window they apply to. As long as
1737 the mouse stays within this range, we need not redraw anything on
1738 its account. Rows and columns are glyph matrix positions in
1739 MOUSE_FACE_WINDOW. */
1740 int mouse_face_beg_row, mouse_face_beg_col;
1741 int mouse_face_beg_x, mouse_face_beg_y;
1742 int mouse_face_end_row, mouse_face_end_col;
1743 int mouse_face_end_x, mouse_face_end_y;
7ea692f6
EZ
1744 Lisp_Object mouse_face_window;
1745 int mouse_face_face_id;
1746 Lisp_Object mouse_face_overlay;
1747
7ea692f6
EZ
1748 /* FRAME and X, Y position of mouse when last checked for
1749 highlighting. X and Y can be negative or out of range for the frame. */
1750 struct frame *mouse_face_mouse_frame;
1751 int mouse_face_mouse_x, mouse_face_mouse_y;
1752
350f51ad
DA
1753 /* Nonzero if part of the text currently shown in
1754 its mouse-face is beyond the window end. */
1755 unsigned mouse_face_past_end : 1;
1756
7ea692f6 1757 /* Nonzero means defer mouse-motion highlighting. */
350f51ad 1758 unsigned mouse_face_defer : 1;
7ea692f6
EZ
1759
1760 /* Nonzero means that the mouse highlight should not be shown. */
350f51ad 1761 unsigned mouse_face_hidden : 1;
7ea692f6
EZ
1762} Mouse_HLInfo;
1763\f
e7032e7c 1764/* Data type checking. */
3cfe6dfd 1765
3c7a4fa3 1766#define NILP(x) EQ (x, Qnil)
3cfe6dfd 1767
c5af3bb9 1768#define NUMBERP(x) (INTEGERP (x) || FLOATP (x))
a4a9f09f 1769#define NATNUMP(x) (INTEGERP (x) && XINT (x) >= 0)
4746118a 1770
ca9ce8f2
PE
1771#define RANGED_INTEGERP(lo, x, hi) \
1772 (INTEGERP (x) && (lo) <= XINT (x) && XINT (x) <= (hi))
1773#define TYPE_RANGED_INTEGERP(type, x) \
d311d28c
PE
1774 (TYPE_SIGNED (type) \
1775 ? RANGED_INTEGERP (TYPE_MINIMUM (type), x, TYPE_MAXIMUM (type)) \
1776 : RANGED_INTEGERP (0, x, TYPE_MAXIMUM (type)))
ca9ce8f2 1777
2de9f71c 1778#define INTEGERP(x) (LISP_INT_TAG_P (XTYPE ((x))))
edfa9106 1779#define SYMBOLP(x) (XTYPE ((x)) == Lisp_Symbol)
84d1833e 1780#define MISCP(x) (XTYPE ((x)) == Lisp_Misc)
b5088f80 1781#define VECTORLIKEP(x) (XTYPE ((x)) == Lisp_Vectorlike)
edfa9106 1782#define STRINGP(x) (XTYPE ((x)) == Lisp_String)
3cfe6dfd 1783#define CONSP(x) (XTYPE ((x)) == Lisp_Cons)
7c06ac2b 1784
edfa9106 1785#define FLOATP(x) (XTYPE ((x)) == Lisp_Float)
77b37c05 1786#define VECTORP(x) (VECTORLIKEP (x) && !(ASIZE (x) & PSEUDOVECTOR_FLAG))
a7aa28f6 1787#define OVERLAYP(x) (MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Overlay)
a7aa28f6 1788#define MARKERP(x) (MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Marker)
19fa82b9 1789#define SAVE_VALUEP(x) (MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Save_Value)
edfa9106 1790
32e5c58c
SM
1791#define AUTOLOADP(x) (CONSP (x) && EQ (Qautoload, XCAR (x)))
1792
ce5b453a
SM
1793#define INTFWDP(x) (XFWDTYPE (x) == Lisp_Fwd_Int)
1794#define BOOLFWDP(x) (XFWDTYPE (x) == Lisp_Fwd_Bool)
1795#define OBJFWDP(x) (XFWDTYPE (x) == Lisp_Fwd_Obj)
1796#define BUFFER_OBJFWDP(x) (XFWDTYPE (x) == Lisp_Fwd_Buffer_Obj)
1797#define KBOARD_OBJFWDP(x) (XFWDTYPE (x) == Lisp_Fwd_Kboard_Obj)
7c06ac2b 1798
aa0b0087
PE
1799/* True if object X is a pseudovector whose code is CODE. The cast to struct
1800 vectorlike_header * avoids aliasing issues. */
7c06ac2b 1801#define PSEUDOVECTORP(x, code) \
ee28be33
SM
1802 TYPED_PSEUDOVECTORP (x, vectorlike_header, code)
1803
1804#define PSEUDOVECTOR_TYPEP(v, code) \
1805 (((v)->size & (PSEUDOVECTOR_FLAG | PVEC_TYPE_MASK)) \
914adc42 1806 == (PSEUDOVECTOR_FLAG | ((code) << PSEUDOVECTOR_AREA_BITS)))
eab3844f
PE
1807
1808/* True if object X, with internal type struct T *, is a pseudovector whose
1809 code is CODE. */
1810#define TYPED_PSEUDOVECTORP(x, t, code) \
7c06ac2b 1811 (VECTORLIKEP (x) \
ee28be33 1812 && PSEUDOVECTOR_TYPEP ((struct t *) XUNTAG (x, Lisp_Vectorlike), code))
7c06ac2b 1813
7c06ac2b
RS
1814/* Test for specific pseudovector types. */
1815#define WINDOW_CONFIGURATIONP(x) PSEUDOVECTORP (x, PVEC_WINDOW_CONFIGURATION)
7c06ac2b 1816#define PROCESSP(x) PSEUDOVECTORP (x, PVEC_PROCESS)
7c06ac2b 1817#define WINDOWP(x) PSEUDOVECTORP (x, PVEC_WINDOW)
49e49fb5 1818#define TERMINALP(x) PSEUDOVECTORP (x, PVEC_TERMINAL)
914adc42 1819#define SUBRP(x) PSEUDOVECTORP (x, PVEC_SUBR)
7c06ac2b 1820#define COMPILEDP(x) PSEUDOVECTORP (x, PVEC_COMPILED)
99a3d506 1821#define BUFFERP(x) PSEUDOVECTORP (x, PVEC_BUFFER)
608ff985 1822#define CHAR_TABLE_P(x) PSEUDOVECTORP (x, PVEC_CHAR_TABLE)
1842abb2 1823#define SUB_CHAR_TABLE_P(x) PSEUDOVECTORP (x, PVEC_SUB_CHAR_TABLE)
608ff985 1824#define BOOL_VECTOR_P(x) PSEUDOVECTORP (x, PVEC_BOOL_VECTOR)
7c06ac2b 1825#define FRAMEP(x) PSEUDOVECTORP (x, PVEC_FRAME)
ea724a01 1826
6b61353c
KH
1827/* Test for image (image . spec) */
1828#define IMAGEP(x) (CONSP (x) && EQ (XCAR (x), Qimage))
1829
c8a39089
KS
1830/* Array types. */
1831
1832#define ARRAYP(x) \
1833 (VECTORP (x) || STRINGP (x) || CHAR_TABLE_P (x) || BOOL_VECTOR_P (x))
7c06ac2b 1834\f
874cc80e 1835#define CHECK_LIST(x) \
c8a39089
KS
1836 CHECK_TYPE (CONSP (x) || NILP (x), Qlistp, x)
1837
1838#define CHECK_LIST_CONS(x, y) \
1839 CHECK_TYPE (CONSP (x), Qlistp, y)
1840
1841#define CHECK_LIST_END(x, y) \
1842 CHECK_TYPE (NILP (x), Qlistp, y)
3cfe6dfd 1843
874cc80e 1844#define CHECK_STRING(x) \
c8a39089 1845 CHECK_TYPE (STRINGP (x), Qstringp, x)
3cfe6dfd 1846
57ddb5d0 1847#define CHECK_STRING_CAR(x) \
c8a39089 1848 CHECK_TYPE (STRINGP (XCAR (x)), Qstringp, XCAR (x))
57ddb5d0 1849
874cc80e 1850#define CHECK_CONS(x) \
c8a39089 1851 CHECK_TYPE (CONSP (x), Qconsp, x)
3cfe6dfd 1852
874cc80e 1853#define CHECK_SYMBOL(x) \
c8a39089 1854 CHECK_TYPE (SYMBOLP (x), Qsymbolp, x)
3cfe6dfd 1855
874cc80e 1856#define CHECK_CHAR_TABLE(x) \
c8a39089 1857 CHECK_TYPE (CHAR_TABLE_P (x), Qchar_table_p, x)
608ff985 1858
874cc80e 1859#define CHECK_VECTOR(x) \
c8a39089 1860 CHECK_TYPE (VECTORP (x), Qvectorp, x)
3cfe6dfd 1861
c8a39089
KS
1862#define CHECK_VECTOR_OR_STRING(x) \
1863 CHECK_TYPE (VECTORP (x) || STRINGP (x), Qarrayp, x)
1864
78edd3b7 1865#define CHECK_ARRAY(x, Qxxxp) \
c8a39089
KS
1866 CHECK_TYPE (ARRAYP (x), Qxxxp, x)
1867
1868#define CHECK_VECTOR_OR_CHAR_TABLE(x) \
1869 CHECK_TYPE (VECTORP (x) || CHAR_TABLE_P (x), Qvector_or_char_table_p, x)
7f73dc9d 1870
874cc80e 1871#define CHECK_BUFFER(x) \
c8a39089 1872 CHECK_TYPE (BUFFERP (x), Qbufferp, x)
3cfe6dfd 1873
874cc80e 1874#define CHECK_WINDOW(x) \
c8a39089
KS
1875 CHECK_TYPE (WINDOWP (x), Qwindowp, x)
1876
1877#define CHECK_WINDOW_CONFIGURATION(x) \
1878 CHECK_TYPE (WINDOW_CONFIGURATIONP (x), Qwindow_configuration_p, x)
3cfe6dfd 1879
874cc80e 1880#define CHECK_PROCESS(x) \
c8a39089
KS
1881 CHECK_TYPE (PROCESSP (x), Qprocessp, x)
1882
1883#define CHECK_SUBR(x) \
1884 CHECK_TYPE (SUBRP (x), Qsubrp, x)
3cfe6dfd 1885
874cc80e 1886#define CHECK_NUMBER(x) \
c8a39089 1887 CHECK_TYPE (INTEGERP (x), Qintegerp, x)
3cfe6dfd 1888
874cc80e 1889#define CHECK_NATNUM(x) \
c8a39089 1890 CHECK_TYPE (NATNUMP (x), Qwholenump, x)
3cfe6dfd 1891
af5a5a98 1892#define CHECK_RANGED_INTEGER(x, lo, hi) \
d311d28c
PE
1893 do { \
1894 CHECK_NUMBER (x); \
1895 if (! ((lo) <= XINT (x) && XINT (x) <= (hi))) \
1896 args_out_of_range_3 \
1897 (x, \
1898 make_number ((lo) < 0 && (lo) < MOST_NEGATIVE_FIXNUM \
1899 ? MOST_NEGATIVE_FIXNUM \
1900 : (lo)), \
1901 make_number (min (hi, MOST_POSITIVE_FIXNUM))); \
1902 } while (0)
1903#define CHECK_TYPE_RANGED_INTEGER(type, x) \
1904 do { \
1905 if (TYPE_SIGNED (type)) \
af5a5a98 1906 CHECK_RANGED_INTEGER (x, TYPE_MINIMUM (type), TYPE_MAXIMUM (type)); \
d311d28c 1907 else \
af5a5a98 1908 CHECK_RANGED_INTEGER (x, 0, TYPE_MAXIMUM (type)); \
d311d28c
PE
1909 } while (0)
1910
874cc80e 1911#define CHECK_MARKER(x) \
c8a39089 1912 CHECK_TYPE (MARKERP (x), Qmarkerp, x)
3cfe6dfd 1913
874cc80e 1914#define CHECK_NUMBER_COERCE_MARKER(x) \
221f4ef3 1915 do { if (MARKERP ((x))) XSETFASTINT (x, marker_position (x)); \
c8a39089 1916 else CHECK_TYPE (INTEGERP (x), Qinteger_or_marker_p, x); } while (0)
3cfe6dfd 1917
3cfe6dfd
JB
1918#define XFLOATINT(n) extract_float((n))
1919
78edd3b7 1920#define CHECK_FLOAT(x) \
c8a39089 1921 CHECK_TYPE (FLOATP (x), Qfloatp, x)
3cfe6dfd 1922
78edd3b7 1923#define CHECK_NUMBER_OR_FLOAT(x) \
c8a39089 1924 CHECK_TYPE (FLOATP (x) || INTEGERP (x), Qnumberp, x)
3cfe6dfd 1925
874cc80e 1926#define CHECK_NUMBER_OR_FLOAT_COERCE_MARKER(x) \
78edd3b7 1927 do { if (MARKERP (x)) XSETFASTINT (x, marker_position (x)); \
c8a39089 1928 else CHECK_TYPE (INTEGERP (x) || FLOATP (x), Qnumber_or_marker_p, x); } while (0)
3cfe6dfd 1929
874cc80e 1930#define CHECK_OVERLAY(x) \
c8a39089 1931 CHECK_TYPE (OVERLAYP (x), Qoverlayp, x)
20280af7 1932
f3fbd155
KR
1933/* Since we can't assign directly to the CAR or CDR fields of a cons
1934 cell, use these when checking that those fields contain numbers. */
874cc80e 1935#define CHECK_NUMBER_CAR(x) \
f3fbd155
KR
1936 do { \
1937 Lisp_Object tmp = XCAR (x); \
874cc80e 1938 CHECK_NUMBER (tmp); \
f3fbd155
KR
1939 XSETCAR ((x), tmp); \
1940 } while (0)
1941
874cc80e 1942#define CHECK_NUMBER_CDR(x) \
f3fbd155
KR
1943 do { \
1944 Lisp_Object tmp = XCDR (x); \
874cc80e 1945 CHECK_NUMBER (tmp); \
f3fbd155
KR
1946 XSETCDR ((x), tmp); \
1947 } while (0)
1948
8f924df7
KH
1949#define CHECK_NATNUM_CAR(x) \
1950 do { \
1951 Lisp_Object tmp = XCAR (x); \
1952 CHECK_NATNUM (tmp); \
1953 XSETCAR ((x), tmp); \
1954 } while (0)
1955
1956#define CHECK_NATNUM_CDR(x) \
1957 do { \
1958 Lisp_Object tmp = XCDR (x); \
1959 CHECK_NATNUM (tmp); \
1960 XSETCDR ((x), tmp); \
1961 } while (0)
3cfe6dfd
JB
1962\f
1963/* Define a built-in function for calling from Lisp.
1964 `lname' should be the name to give the function in Lisp,
1965 as a null-terminated C string.
1966 `fnname' should be the name of the function in C.
1967 By convention, it starts with F.
1968 `sname' should be the name for the C constant structure
1969 that records information on this function for internal use.
1970 By convention, it should be the same as `fnname' but with S instead of F.
1971 It's too bad that C macros can't compute this from `fnname'.
1972 `minargs' should be a number, the minimum number of arguments allowed.
1973 `maxargs' should be a number, the maximum number of arguments allowed,
1974 or else MANY or UNEVALLED.
1975 MANY means pass a vector of evaluated arguments,
1976 in the form of an integer number-of-arguments
1977 followed by the address of a vector of Lisp_Objects
1978 which contains the argument values.
1979 UNEVALLED means pass the list of unevaluated arguments
4bca9161
MC
1980 `intspec' says how interactive arguments are to be fetched.
1981 If the string starts with a `(', `intspec' is evaluated and the resulting
1982 list is the list of arguments.
1983 If it's a string that doesn't start with `(', the value should follow
1984 the one of the doc string for `interactive'.
3cfe6dfd 1985 A null string means call interactively with no arguments.
eab9d423 1986 `doc' is documentation for the user. */
3cfe6dfd 1987
c451d7b1 1988/* This version of DEFUN declares a function prototype with the right
99a3d506 1989 arguments, so we can catch errors with maxargs at compile-time. */
a6fc3b5c
EZ
1990#ifdef _MSC_VER
1991#define DEFUN(lname, fnname, sname, minargs, maxargs, intspec, doc) \
1992 Lisp_Object fnname DEFUN_ARGS_ ## maxargs ; \
e32a5799 1993 static struct Lisp_Subr alignas (GCALIGNMENT) sname = \
914adc42
DA
1994 { { (PVEC_SUBR << PSEUDOVECTOR_AREA_BITS) \
1995 | (sizeof (struct Lisp_Subr) / sizeof (EMACS_INT)) }, \
a6fc3b5c
EZ
1996 { (Lisp_Object (__cdecl *)(void))fnname }, \
1997 minargs, maxargs, lname, intspec, 0}; \
1998 Lisp_Object fnname
1999#else /* not _MSC_VER */
2000#define DEFUN(lname, fnname, sname, minargs, maxargs, intspec, doc) \
2001 Lisp_Object fnname DEFUN_ARGS_ ## maxargs ; \
e32a5799 2002 static struct Lisp_Subr alignas (GCALIGNMENT) sname = \
914adc42
DA
2003 { { PVEC_SUBR << PSEUDOVECTOR_AREA_BITS }, \
2004 { .a ## maxargs = fnname }, \
a6fc3b5c
EZ
2005 minargs, maxargs, lname, intspec, 0}; \
2006 Lisp_Object fnname
2007#endif
c451d7b1
RS
2008
2009/* Note that the weird token-substitution semantics of ANSI C makes
99a3d506 2010 this work for MANY and UNEVALLED. */
f66c7cf8 2011#define DEFUN_ARGS_MANY (ptrdiff_t, Lisp_Object *)
c451d7b1
RS
2012#define DEFUN_ARGS_UNEVALLED (Lisp_Object)
2013#define DEFUN_ARGS_0 (void)
2014#define DEFUN_ARGS_1 (Lisp_Object)
2015#define DEFUN_ARGS_2 (Lisp_Object, Lisp_Object)
2016#define DEFUN_ARGS_3 (Lisp_Object, Lisp_Object, Lisp_Object)
2017#define DEFUN_ARGS_4 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object)
2018#define DEFUN_ARGS_5 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, \
2019 Lisp_Object)
2020#define DEFUN_ARGS_6 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, \
2021 Lisp_Object, Lisp_Object)
2022#define DEFUN_ARGS_7 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, \
2023 Lisp_Object, Lisp_Object, Lisp_Object)
5593f7e3
KH
2024#define DEFUN_ARGS_8 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, \
2025 Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object)
276680c4 2026
78edd3b7 2027/* Non-zero if OBJ is a Lisp function. */
e1f29348 2028#define FUNCTIONP(OBJ) functionp(OBJ)
e2c0561e 2029
3cfe6dfd 2030/* defsubr (Sname);
d19b9aa8 2031 is how we define the symbol for function `name' at start-up time. */
383e0970 2032extern void defsubr (struct Lisp_Subr *);
3cfe6dfd 2033
03a660a6
PE
2034enum maxargs
2035 {
2036 MANY = -2,
2037 UNEVALLED = -1
2038 };
3cfe6dfd 2039
ce5b453a
SM
2040extern void defvar_lisp (struct Lisp_Objfwd *, const char *, Lisp_Object *);
2041extern void defvar_lisp_nopro (struct Lisp_Objfwd *, const char *, Lisp_Object *);
f5d9e83a 2042extern void defvar_bool (struct Lisp_Boolfwd *, const char *, bool *);
ce5b453a
SM
2043extern void defvar_int (struct Lisp_Intfwd *, const char *, EMACS_INT *);
2044extern void defvar_kboard (struct Lisp_Kboard_Objfwd *, const char *, int);
3cfe6dfd
JB
2045
2046/* Macros we use to define forwarded Lisp variables.
29208e82 2047 These are used in the syms_of_FILENAME functions.
51b59d79 2048
29208e82
TT
2049 An ordinary (not in buffer_defaults, per-buffer, or per-keyboard)
2050 lisp variable is actually a field in `struct emacs_globals'. The
2051 field's name begins with "f_", which is a convention enforced by
2052 these macros. Each such global has a corresponding #define in
2053 globals.h; the plain name should be used in the code.
2054
2055 E.g., the global "cons_cells_consed" is declared as "int
2056 f_cons_cells_consed" in globals.h, but there is a define:
2057
2058 #define cons_cells_consed globals.f_cons_cells_consed
2059
2060 All C code uses the `cons_cells_consed' name. This is all done
2061 this way to support indirection for multi-threaded Emacs. */
3cfe6dfd 2062
ce5b453a
SM
2063#define DEFVAR_LISP(lname, vname, doc) \
2064 do { \
2065 static struct Lisp_Objfwd o_fwd; \
29208e82 2066 defvar_lisp (&o_fwd, lname, &globals.f_ ## vname); \
ce5b453a
SM
2067 } while (0)
2068#define DEFVAR_LISP_NOPRO(lname, vname, doc) \
2069 do { \
2070 static struct Lisp_Objfwd o_fwd; \
29208e82 2071 defvar_lisp_nopro (&o_fwd, lname, &globals.f_ ## vname); \
ce5b453a
SM
2072 } while (0)
2073#define DEFVAR_BOOL(lname, vname, doc) \
2074 do { \
2075 static struct Lisp_Boolfwd b_fwd; \
29208e82 2076 defvar_bool (&b_fwd, lname, &globals.f_ ## vname); \
ce5b453a
SM
2077 } while (0)
2078#define DEFVAR_INT(lname, vname, doc) \
2079 do { \
2080 static struct Lisp_Intfwd i_fwd; \
29208e82 2081 defvar_int (&i_fwd, lname, &globals.f_ ## vname); \
ce5b453a 2082 } while (0)
92d2947b 2083
422745d0
TT
2084#define DEFVAR_BUFFER_DEFAULTS(lname, vname, doc) \
2085 do { \
2086 static struct Lisp_Objfwd o_fwd; \
eb4916d7 2087 defvar_lisp_nopro (&o_fwd, lname, &BVAR (&buffer_defaults, vname)); \
422745d0
TT
2088 } while (0)
2089
ce5b453a
SM
2090#define DEFVAR_KBOARD(lname, vname, doc) \
2091 do { \
2092 static struct Lisp_Kboard_Objfwd ko_fwd; \
437b2cb4 2093 defvar_kboard (&ko_fwd, lname, offsetof (KBOARD, vname ## _)); \
ce5b453a 2094 } while (0)
0328b6de
PE
2095\f
2096/* Save and restore the instruction and environment pointers,
2097 without affecting the signal mask. */
2098
2099#ifdef HAVE__SETJMP
2100typedef jmp_buf sys_jmp_buf;
2101# define sys_setjmp(j) _setjmp (j)
2102# define sys_longjmp(j, v) _longjmp (j, v)
2103#elif defined HAVE_SIGSETJMP
2104typedef sigjmp_buf sys_jmp_buf;
2105# define sys_setjmp(j) sigsetjmp (j, 0)
2106# define sys_longjmp(j, v) siglongjmp (j, v)
2107#else
7105c8cb
EZ
2108/* A platform that uses neither _longjmp nor siglongjmp; assume
2109 longjmp does not affect the sigmask. */
0328b6de
PE
2110typedef jmp_buf sys_jmp_buf;
2111# define sys_setjmp(j) setjmp (j)
2112# define sys_longjmp(j, v) longjmp (j, v)
2113#endif
df7cd53b 2114
3cfe6dfd 2115\f
78ca380c
JB
2116/* Structure for recording Lisp call stack for backtrace purposes. */
2117
2118/* The special binding stack holds the outer values of variables while
2119 they are bound by a function application or a let form, stores the
2120 code to be executed for Lisp unwind-protect forms, and stores the C
2121 functions to be called for record_unwind_protect.
2122
2123 If func is non-zero, undoing this binding applies func to old_value;
2124 This implements record_unwind_protect.
5fd6e274
RS
2125
2126 Otherwise, the element is a variable binding.
e2c0561e 2127
5fd6e274 2128 If the symbol field is a symbol, it is an ordinary variable binding.
e2c0561e 2129
78edd3b7
JB
2130 Otherwise, it should be a structure (SYMBOL WHERE . CURRENT-BUFFER),
2131 which means having bound a local value while CURRENT-BUFFER was active.
2132 If WHERE is nil this means we saw the default value when binding SYMBOL.
2133 WHERE being a buffer or frame means we saw a buffer-local or frame-local
2134 value. Other values of WHERE mean an internal error. */
5fd6e274 2135
383e0970 2136typedef Lisp_Object (*specbinding_func) (Lisp_Object);
07c9ebd6 2137
3cfe6dfd
JB
2138struct specbinding
2139 {
a7af5886
SM
2140 Lisp_Object symbol, old_value;
2141 specbinding_func func;
e7032e7c 2142 Lisp_Object unused; /* Dividing by 16 is faster than by 12. */
3cfe6dfd
JB
2143 };
2144
2145extern struct specbinding *specpdl;
a7af5886 2146extern struct specbinding *specpdl_ptr;
d311d28c 2147extern ptrdiff_t specpdl_size;
3cfe6dfd 2148
d311d28c 2149#define SPECPDL_INDEX() (specpdl_ptr - specpdl)
acb8dc44 2150
c2d7786e
TM
2151struct backtrace
2152{
2153 struct backtrace *next;
e7c1b6ef 2154 Lisp_Object function;
c2d7786e
TM
2155 Lisp_Object *args; /* Points to vector of args. */
2156 ptrdiff_t nargs; /* Length of vector. */
2157 /* Nonzero means call value of debugger when done with this operation. */
2158 unsigned int debug_on_exit : 1;
2159};
2160
2161extern struct backtrace *backtrace_list;
2162
50f2e553
PE
2163/* Everything needed to describe an active condition case.
2164
2165 Members are volatile if their values need to survive _longjmp when
2166 a 'struct handler' is a local variable. */
3cfe6dfd
JB
2167struct handler
2168 {
78ca380c 2169 /* The handler clauses and variable from the condition-case form. */
992dd91a
RS
2170 /* For a handler set up in Lisp code, this is always a list.
2171 For an internal handler set up by internal_condition_case*,
2172 this can instead be the symbol t or `error'.
2173 t: handle all conditions.
2174 error: handle all conditions, and errors can run the debugger
2175 or display a backtrace. */
3cfe6dfd 2176 Lisp_Object handler;
50f2e553
PE
2177
2178 Lisp_Object volatile var;
2179
22bbbd42
RS
2180 /* Fsignal stores here the condition-case clause that applies,
2181 and Fcondition_case thus knows which clause to run. */
50f2e553 2182 Lisp_Object volatile chosen_clause;
78ca380c
JB
2183
2184 /* Used to effect the longjump out to the handler. */
3cfe6dfd 2185 struct catchtag *tag;
78ca380c
JB
2186
2187 /* The next enclosing handler. */
3cfe6dfd
JB
2188 struct handler *next;
2189 };
2190
d7306fe6
DN
2191/* This structure helps implement the `catch' and `throw' control
2192 structure. A struct catchtag contains all the information needed
2193 to restore the state of the interpreter after a non-local jump.
2194
2195 Handlers for error conditions (represented by `struct handler'
2196 structures) just point to a catch tag to do the cleanup required
2197 for their jumps.
2198
2199 catchtag structures are chained together in the C calling stack;
2200 the `next' member points to the next outer catchtag.
2201
2202 A call like (throw TAG VAL) searches for a catchtag whose `tag'
2203 member is TAG, and then unbinds to it. The `val' member is used to
2204 hold VAL while the stack is unwound; `val' is returned as the value
2205 of the catch form.
2206
2207 All the other members are concerned with restoring the interpreter
50f2e553 2208 state.
d7306fe6 2209
50f2e553
PE
2210 Members are volatile if their values need to survive _longjmp when
2211 a 'struct catchtag' is a local variable. */
d7306fe6
DN
2212struct catchtag
2213{
2214 Lisp_Object tag;
50f2e553
PE
2215 Lisp_Object volatile val;
2216 struct catchtag *volatile next;
d7306fe6 2217 struct gcpro *gcpro;
0328b6de 2218 sys_jmp_buf jmp;
d7306fe6
DN
2219 struct backtrace *backlist;
2220 struct handler *handlerlist;
d311d28c 2221 EMACS_INT lisp_eval_depth;
50f2e553 2222 ptrdiff_t volatile pdlcount;
d7306fe6
DN
2223 int poll_suppress_count;
2224 int interrupt_input_blocked;
2225 struct byte_stack *byte_stack;
2226};
2227
22bbbd42
RS
2228extern Lisp_Object memory_signal_data;
2229
3cfe6dfd
JB
2230/* An address near the bottom of the stack.
2231 Tells GC how to save a copy of the stack. */
2232extern char *stack_bottom;
2233
4742f524
RS
2234/* Check quit-flag and quit if it is non-nil.
2235 Typing C-g does not directly cause a quit; it only sets Vquit_flag.
2236 So the program needs to do QUIT at times when it is safe to quit.
2237 Every loop that might run for a long time or might not exit
2238 ought to do QUIT at least once, at a safe place.
2239 Unless that is impossible, of course.
2240 But it is very desirable to avoid creating loops where QUIT is impossible.
2241
2242 Exception: if you set immediate_quit to nonzero,
2243 then the handler that responds to the C-g does the quit itself.
2244 This is a good thing to do around a loop that has no side effects
6c07aac2
AS
2245 and (in particular) cannot call arbitrary Lisp code.
2246
2247 If quit-flag is set to `kill-emacs' the SIGINT handler has received
2248 a request to exit Emacs when it is safe to do. */
3cfe6dfd 2249
383e0970 2250extern void process_pending_signals (void);
88d69b7d 2251extern bool volatile pending_signals;
6b61353c 2252
7dbda6df 2253extern void process_quit_flag (void);
a69a6e61
GM
2254#define QUIT \
2255 do { \
2256 if (!NILP (Vquit_flag) && NILP (Vinhibit_quit)) \
6d5eb5b0 2257 process_quit_flag (); \
0caaedb1
PE
2258 else if (pending_signals) \
2259 process_pending_signals (); \
a69a6e61 2260 } while (0)
3cfe6dfd 2261
6b61353c 2262
3cfe6dfd
JB
2263/* Nonzero if ought to quit now. */
2264
efb859b4 2265#define QUITP (!NILP (Vquit_flag) && NILP (Vinhibit_quit))
3cfe6dfd 2266\f
31cd66f3
PE
2267extern Lisp_Object Vascii_downcase_table;
2268extern Lisp_Object Vascii_canon_table;
3cfe6dfd 2269\f
99a3d506 2270/* Structure for recording stack slots that need marking. */
3cfe6dfd 2271
78edd3b7
JB
2272/* This is a chain of structures, each of which points at a Lisp_Object
2273 variable whose value should be marked in garbage collection.
2274 Normally every link of the chain is an automatic variable of a function,
2275 and its `val' points to some argument or local variable of the function.
2276 On exit to the function, the chain is set back to the value it had on entry.
2277 This way, no link remains in the chain when the stack frame containing the
2278 link disappears.
3cfe6dfd 2279
78edd3b7
JB
2280 Every function that can call Feval must protect in this fashion all
2281 Lisp_Object variables whose contents will be used again. */
3cfe6dfd
JB
2282
2283extern struct gcpro *gcprolist;
2284
2285struct gcpro
834168ef
GM
2286{
2287 struct gcpro *next;
e2c0561e 2288
834168ef
GM
2289 /* Address of first protected variable. */
2290 volatile Lisp_Object *var;
e2c0561e 2291
834168ef 2292 /* Number of consecutive protected variables. */
f66c7cf8 2293 ptrdiff_t nvars;
e2c0561e 2294
4742f524 2295#ifdef DEBUG_GCPRO
834168ef 2296 int level;
4742f524 2297#endif
834168ef 2298};
3cfe6dfd 2299
1216f5e4
GM
2300/* Values of GC_MARK_STACK during compilation:
2301
2302 0 Use GCPRO as before
2303 1 Do the real thing, make GCPROs and UNGCPRO no-ops.
2304 2 Mark the stack, and check that everything GCPRO'd is
2305 marked.
2306 3 Mark using GCPRO's, mark stack last, and count how many
444b01bb 2307 dead objects are kept alive.
1216f5e4 2308
444b01bb
PE
2309 Formerly, method 0 was used. Currently, method 1 is used unless
2310 otherwise specified by hand when building, e.g.,
2311 "make CPPFLAGS='-DGC_MARK_STACK=GC_USE_GCPROS_AS_BEFORE'".
2312 Methods 2 and 3 are present mainly to debug the transition from 0 to 1. */
1216f5e4
GM
2313
2314#define GC_USE_GCPROS_AS_BEFORE 0
2315#define GC_MAKE_GCPROS_NOOPS 1
2316#define GC_MARK_STACK_CHECK_GCPROS 2
2317#define GC_USE_GCPROS_CHECK_ZOMBIES 3
2318
2319#ifndef GC_MARK_STACK
b948ce8b 2320#define GC_MARK_STACK GC_MAKE_GCPROS_NOOPS
1216f5e4
GM
2321#endif
2322
b286858c
SM
2323/* Whether we do the stack marking manually. */
2324#define BYTE_MARK_STACK !(GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS \
2325 || GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS)
2326
2327
1216f5e4
GM
2328#if GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS
2329
9f0443f9 2330/* Do something silly with gcproN vars just so gcc shuts up. */
656c33dc 2331/* You get warnings from MIPSPro... */
9f0443f9 2332
dbf31225
PE
2333#define GCPRO1(varname) ((void) gcpro1)
2334#define GCPRO2(varname1, varname2) ((void) gcpro2, (void) gcpro1)
2335#define GCPRO3(varname1, varname2, varname3) \
2336 ((void) gcpro3, (void) gcpro2, (void) gcpro1)
2337#define GCPRO4(varname1, varname2, varname3, varname4) \
2338 ((void) gcpro4, (void) gcpro3, (void) gcpro2, (void) gcpro1)
2339#define GCPRO5(varname1, varname2, varname3, varname4, varname5) \
2340 ((void) gcpro5, (void) gcpro4, (void) gcpro3, (void) gcpro2, (void) gcpro1)
2341#define GCPRO6(varname1, varname2, varname3, varname4, varname5, varname6) \
2342 ((void) gcpro6, (void) gcpro5, (void) gcpro4, (void) gcpro3, (void) gcpro2, \
2343 (void) gcpro1)
2344#define UNGCPRO ((void) 0)
1216f5e4
GM
2345
2346#else /* GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS */
2347
4742f524
RS
2348#ifndef DEBUG_GCPRO
2349
dbf31225
PE
2350#define GCPRO1(varname) \
2351 {gcpro1.next = gcprolist; gcpro1.var = &varname; gcpro1.nvars = 1; \
2352 gcprolist = &gcpro1; }
2353
2354#define GCPRO2(varname1, varname2) \
2355 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
2356 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
2357 gcprolist = &gcpro2; }
2358
2359#define GCPRO3(varname1, varname2, varname3) \
2360 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
2361 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
2362 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
2363 gcprolist = &gcpro3; }
2364
2365#define GCPRO4(varname1, varname2, varname3, varname4) \
2366 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
2367 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
2368 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
2369 gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \
2370 gcprolist = &gcpro4; }
2371
2372#define GCPRO5(varname1, varname2, varname3, varname4, varname5) \
2373 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
2374 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
2375 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
2376 gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \
2377 gcpro5.next = &gcpro4; gcpro5.var = &varname5; gcpro5.nvars = 1; \
2378 gcprolist = &gcpro5; }
2379
2380#define GCPRO6(varname1, varname2, varname3, varname4, varname5, varname6) \
2381 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
2382 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
2383 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
2384 gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \
2385 gcpro5.next = &gcpro4; gcpro5.var = &varname5; gcpro5.nvars = 1; \
2386 gcpro6.next = &gcpro5; gcpro6.var = &varname6; gcpro6.nvars = 1; \
2387 gcprolist = &gcpro6; }
2388
2389#define UNGCPRO (gcprolist = gcpro1.next)
3cfe6dfd 2390
4742f524 2391#else
e98227af 2392
4742f524
RS
2393extern int gcpro_level;
2394
dbf31225
PE
2395#define GCPRO1(varname) \
2396 {gcpro1.next = gcprolist; gcpro1.var = &varname; gcpro1.nvars = 1; \
2397 gcpro1.level = gcpro_level++; \
2398 gcprolist = &gcpro1; }
2399
2400#define GCPRO2(varname1, varname2) \
2401 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
2402 gcpro1.level = gcpro_level; \
2403 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
2404 gcpro2.level = gcpro_level++; \
2405 gcprolist = &gcpro2; }
2406
2407#define GCPRO3(varname1, varname2, varname3) \
2408 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
2409 gcpro1.level = gcpro_level; \
2410 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
2411 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
2412 gcpro3.level = gcpro_level++; \
2413 gcprolist = &gcpro3; }
2414
2415#define GCPRO4(varname1, varname2, varname3, varname4) \
2416 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
2417 gcpro1.level = gcpro_level; \
2418 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
2419 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
2420 gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \
2421 gcpro4.level = gcpro_level++; \
2422 gcprolist = &gcpro4; }
2423
2424#define GCPRO5(varname1, varname2, varname3, varname4, varname5) \
2425 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
2426 gcpro1.level = gcpro_level; \
2427 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
2428 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
2429 gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \
2430 gcpro5.next = &gcpro4; gcpro5.var = &varname5; gcpro5.nvars = 1; \
2431 gcpro5.level = gcpro_level++; \
2432 gcprolist = &gcpro5; }
2433
2434#define GCPRO6(varname1, varname2, varname3, varname4, varname5, varname6) \
2435 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
2436 gcpro1.level = gcpro_level; \
2437 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
2438 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
2439 gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \
2440 gcpro5.next = &gcpro4; gcpro5.var = &varname5; gcpro5.nvars = 1; \
2441 gcpro6.next = &gcpro5; gcpro6.var = &varname6; gcpro6.nvars = 1; \
2442 gcpro6.level = gcpro_level++; \
2443 gcprolist = &gcpro6; }
2444
2445#define UNGCPRO \
2446 ((--gcpro_level != gcpro1.level) \
1088b922 2447 ? (emacs_abort (), 0) \
dbf31225 2448 : ((gcprolist = gcpro1.next), 0))
4742f524
RS
2449
2450#endif /* DEBUG_GCPRO */
1216f5e4
GM
2451#endif /* GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS */
2452
3cfe6dfd 2453
5db82c9d 2454/* Evaluate expr, UNGCPRO, and then return the value of expr. */
c47b8d02 2455#define RETURN_UNGCPRO(expr) \
0868e74e 2456do \
c47b8d02
RS
2457 { \
2458 Lisp_Object ret_ungc_val; \
2459 ret_ungc_val = (expr); \
2460 UNGCPRO; \
2461 return ret_ungc_val; \
2462 } \
0868e74e 2463while (0)
4742f524
RS
2464
2465/* Call staticpro (&var) to protect static variable `var'. */
2466
383e0970 2467void staticpro (Lisp_Object *);
3cfe6dfd 2468\f
2f69f2ec
RS
2469/* Declare a Lisp-callable function. The MAXARGS parameter has the same
2470 meaning as in the DEFUN macro, and is used to construct a prototype. */
2f69f2ec
RS
2471/* We can use the same trick as in the DEFUN macro to generate the
2472 appropriate prototype. */
2473#define EXFUN(fnname, maxargs) \
2474 extern Lisp_Object fnname DEFUN_ARGS_ ## maxargs
2f69f2ec 2475
526a2be7
AS
2476/* Forward declarations for prototypes. */
2477struct window;
2478struct frame;
2f69f2ec 2479
4939150c
PE
2480/* Simple access functions. */
2481
f162bcc3 2482LISP_INLINE Lisp_Object *
4939150c
PE
2483aref_addr (Lisp_Object array, ptrdiff_t idx)
2484{
2485 return & XVECTOR (array)->contents[idx];
2486}
2487
8834c57a
PE
2488LISP_INLINE void
2489gc_aset (Lisp_Object array, ptrdiff_t idx, Lisp_Object val)
2490{
1175def2
PE
2491 /* Like ASET, but also can be used in the garbage collector:
2492 sweep_weak_table calls set_hash_key etc. while the table is marked. */
8834c57a
PE
2493 eassert (0 <= idx && idx < (ASIZE (array) & ~ARRAY_MARK_FLAG));
2494 XVECTOR (array)->contents[idx] = val;
2495}
2496
086ca913
DA
2497/* Copy COUNT Lisp_Objects from ARGS to contents of V starting from OFFSET. */
2498
2499LISP_INLINE void
2500vcopy (Lisp_Object v, ptrdiff_t offset, Lisp_Object *args, ptrdiff_t count)
2501{
1b9d9d16
PE
2502 eassert (0 <= offset && 0 <= count && offset + count <= ASIZE (v));
2503 memcpy (XVECTOR (v)->contents + offset, args, count * sizeof *args);
086ca913
DA
2504}
2505
2506/* Functions to modify hash tables. */
2507
f162bcc3 2508LISP_INLINE void
e83064be
DA
2509set_hash_key_and_value (struct Lisp_Hash_Table *h, Lisp_Object key_and_value)
2510{
2511 h->key_and_value = key_and_value;
2512}
2513
2514LISP_INLINE void
2515set_hash_key_slot (struct Lisp_Hash_Table *h, ptrdiff_t idx, Lisp_Object val)
4939150c 2516{
8834c57a 2517 gc_aset (h->key_and_value, 2 * idx, val);
4939150c
PE
2518}
2519
f162bcc3 2520LISP_INLINE void
e83064be 2521set_hash_value_slot (struct Lisp_Hash_Table *h, ptrdiff_t idx, Lisp_Object val)
4939150c 2522{
8834c57a 2523 gc_aset (h->key_and_value, 2 * idx + 1, val);
4939150c
PE
2524}
2525
f162bcc3 2526LISP_INLINE void
e83064be
DA
2527set_hash_next (struct Lisp_Hash_Table *h, Lisp_Object next)
2528{
2529 h->next = next;
2530}
2531
2532LISP_INLINE void
2533set_hash_next_slot (struct Lisp_Hash_Table *h, ptrdiff_t idx, Lisp_Object val)
4939150c 2534{
8834c57a 2535 gc_aset (h->next, idx, val);
4939150c
PE
2536}
2537
f162bcc3 2538LISP_INLINE void
e83064be
DA
2539set_hash_hash (struct Lisp_Hash_Table *h, Lisp_Object hash)
2540{
2541 h->hash = hash;
2542}
2543
2544LISP_INLINE void
2545set_hash_hash_slot (struct Lisp_Hash_Table *h, ptrdiff_t idx, Lisp_Object val)
4939150c 2546{
8834c57a 2547 gc_aset (h->hash, idx, val);
4939150c
PE
2548}
2549
f162bcc3 2550LISP_INLINE void
e83064be
DA
2551set_hash_index (struct Lisp_Hash_Table *h, Lisp_Object index)
2552{
2553 h->index = index;
2554}
2555
2556LISP_INLINE void
2557set_hash_index_slot (struct Lisp_Hash_Table *h, ptrdiff_t idx, Lisp_Object val)
4939150c 2558{
8834c57a 2559 gc_aset (h->index, idx, val);
4939150c
PE
2560}
2561
c644523b
DA
2562/* Use these functions to set Lisp_Object
2563 or pointer slots of struct Lisp_Symbol. */
2564
2565LISP_INLINE void
2566set_symbol_name (Lisp_Object sym, Lisp_Object name)
2567{
2568 XSYMBOL (sym)->name = name;
2569}
2570
2571LISP_INLINE void
2572set_symbol_function (Lisp_Object sym, Lisp_Object function)
2573{
2574 XSYMBOL (sym)->function = function;
2575}
2576
2577LISP_INLINE void
2578set_symbol_plist (Lisp_Object sym, Lisp_Object plist)
2579{
2580 XSYMBOL (sym)->plist = plist;
2581}
2582
2583LISP_INLINE void
2584set_symbol_next (Lisp_Object sym, struct Lisp_Symbol *next)
2585{
2586 XSYMBOL (sym)->next = next;
2587}
2588
a04e2c62
DA
2589/* Buffer-local (also frame-local) variable access functions. */
2590
2591LISP_INLINE int
2592blv_found (struct Lisp_Buffer_Local_Value *blv)
2593{
2594 eassert (blv->found == !EQ (blv->defcell, blv->valcell));
2595 return blv->found;
2596}
2597
2598LISP_INLINE void
2599set_blv_found (struct Lisp_Buffer_Local_Value *blv, int found)
2600{
2601 eassert (found == !EQ (blv->defcell, blv->valcell));
2602 blv->found = found;
2603}
2604
2605LISP_INLINE Lisp_Object
2606blv_value (struct Lisp_Buffer_Local_Value *blv)
2607{
2608 return XCDR (blv->valcell);
2609}
2610
2611LISP_INLINE void
2612set_blv_value (struct Lisp_Buffer_Local_Value *blv, Lisp_Object val)
2613{
2614 XSETCDR (blv->valcell, val);
2615}
2616
2617LISP_INLINE void
2618set_blv_where (struct Lisp_Buffer_Local_Value *blv, Lisp_Object val)
2619{
2620 blv->where = val;
2621}
2622
2623LISP_INLINE void
2624set_blv_defcell (struct Lisp_Buffer_Local_Value *blv, Lisp_Object val)
2625{
2626 blv->defcell = val;
2627}
2628
2629LISP_INLINE void
2630set_blv_valcell (struct Lisp_Buffer_Local_Value *blv, Lisp_Object val)
2631{
2632 blv->valcell = val;
2633}
2634
c644523b
DA
2635/* Set overlay's property list. */
2636
2637LISP_INLINE void
2638set_overlay_plist (Lisp_Object overlay, Lisp_Object plist)
2639{
2640 XOVERLAY (overlay)->plist = plist;
2641}
2642
ad8c997f
DA
2643/* Get text properties of S. */
2644
2645LISP_INLINE INTERVAL
0c94c8d6 2646string_intervals (Lisp_Object s)
ad8c997f
DA
2647{
2648 return XSTRING (s)->intervals;
2649}
2650
2651/* Set text properties of S to I. */
2652
2653LISP_INLINE void
0c94c8d6 2654set_string_intervals (Lisp_Object s, INTERVAL i)
ad8c997f
DA
2655{
2656 XSTRING (s)->intervals = i;
2657}
2658
742af32f
PE
2659/* Set a Lisp slot in TABLE to VAL. Most code should use this instead
2660 of setting slots directly. */
2661
2662LISP_INLINE void
2663set_char_table_ascii (Lisp_Object table, Lisp_Object val)
2664{
2665 XCHAR_TABLE (table)->ascii = val;
2666}
2667LISP_INLINE void
2668set_char_table_defalt (Lisp_Object table, Lisp_Object val)
2669{
2670 XCHAR_TABLE (table)->defalt = val;
2671}
2672LISP_INLINE void
2673set_char_table_parent (Lisp_Object table, Lisp_Object val)
2674{
2675 XCHAR_TABLE (table)->parent = val;
2676}
2677LISP_INLINE void
2678set_char_table_purpose (Lisp_Object table, Lisp_Object val)
2679{
2680 XCHAR_TABLE (table)->purpose = val;
2681}
2682
a098c930
DA
2683/* Set different slots in (sub)character tables. */
2684
2685LISP_INLINE void
34dabdb7 2686set_char_table_extras (Lisp_Object table, ptrdiff_t idx, Lisp_Object val)
a098c930
DA
2687{
2688 eassert (0 <= idx && idx < CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (table)));
2689 XCHAR_TABLE (table)->extras[idx] = val;
2690}
2691
2692LISP_INLINE void
34dabdb7 2693set_char_table_contents (Lisp_Object table, ptrdiff_t idx, Lisp_Object val)
a098c930
DA
2694{
2695 eassert (0 <= idx && idx < (1 << CHARTAB_SIZE_BITS_0));
2696 XCHAR_TABLE (table)->contents[idx] = val;
2697}
2698
2699LISP_INLINE void
34dabdb7 2700set_sub_char_table_contents (Lisp_Object table, ptrdiff_t idx, Lisp_Object val)
a098c930
DA
2701{
2702 XSUB_CHAR_TABLE (table)->contents[idx] = val;
2703}
2704
f6d62986 2705/* Defined in data.c. */
955cbe7b 2706extern Lisp_Object Qnil, Qt, Qquote, Qlambda, Qunbound;
3cfe6dfd 2707extern Lisp_Object Qerror_conditions, Qerror_message, Qtop_level;
955cbe7b 2708extern Lisp_Object Qerror, Qquit, Qargs_out_of_range;
3cfe6dfd 2709extern Lisp_Object Qvoid_variable, Qvoid_function;
955cbe7b 2710extern Lisp_Object Qinvalid_read_syntax;
3cfe6dfd 2711extern Lisp_Object Qinvalid_function, Qwrong_number_of_arguments, Qno_catch;
71873e2b 2712extern Lisp_Object Quser_error, Qend_of_file, Qarith_error, Qmark_inactive;
3cfe6dfd 2713extern Lisp_Object Qbeginning_of_buffer, Qend_of_buffer, Qbuffer_read_only;
6b61353c 2714extern Lisp_Object Qtext_read_only;
e6cba650 2715extern Lisp_Object Qinteractive_form;
99f3388e 2716extern Lisp_Object Qcircular_list;
955cbe7b 2717extern Lisp_Object Qintegerp, Qwholenump, Qsymbolp, Qlistp, Qconsp;
3cfe6dfd 2718extern Lisp_Object Qstringp, Qarrayp, Qsequencep, Qbufferp;
6b61353c 2719extern Lisp_Object Qchar_or_string_p, Qmarkerp, Qinteger_or_marker_p, Qvectorp;
cde20f41 2720extern Lisp_Object Qbuffer_or_string_p;
955cbe7b 2721extern Lisp_Object Qfboundp;
6b61353c
KH
2722extern Lisp_Object Qchar_table_p, Qvector_or_char_table_p;
2723
3cfe6dfd
JB
2724extern Lisp_Object Qcdr;
2725
c990426a 2726extern Lisp_Object Qrange_error, Qoverflow_error;
3cfe6dfd 2727
6b61353c
KH
2728extern Lisp_Object Qfloatp;
2729extern Lisp_Object Qnumberp, Qnumber_or_marker_p;
2730
b52d6985 2731extern Lisp_Object Qbuffer, Qinteger, Qsymbol;
3cfe6dfd 2732
a35ebb81
CY
2733extern Lisp_Object Qfont_spec, Qfont_entity, Qfont_object;
2734
5994c183
PE
2735EXFUN (Fbyteorder, 0) ATTRIBUTE_CONST;
2736
e7032e7c 2737/* Defined in data.c. */
383e0970 2738extern Lisp_Object indirect_function (Lisp_Object);
383e0970 2739extern Lisp_Object find_symbol_value (Lisp_Object);
2f69f2ec 2740
be44ca6c
PE
2741/* Convert the integer I to an Emacs representation, either the integer
2742 itself, or a cons of two or three integers, or if all else fails a float.
2743 I should not have side effects. */
2744#define INTEGER_TO_CONS(i) \
2745 (! FIXNUM_OVERFLOW_P (i) \
2746 ? make_number (i) \
2747 : ! ((FIXNUM_OVERFLOW_P (INTMAX_MIN >> 16) \
2748 || FIXNUM_OVERFLOW_P (UINTMAX_MAX >> 16)) \
2749 && FIXNUM_OVERFLOW_P ((i) >> 16)) \
2750 ? Fcons (make_number ((i) >> 16), make_number ((i) & 0xffff)) \
2751 : ! ((FIXNUM_OVERFLOW_P (INTMAX_MIN >> 16 >> 24) \
2752 || FIXNUM_OVERFLOW_P (UINTMAX_MAX >> 16 >> 24)) \
2753 && FIXNUM_OVERFLOW_P ((i) >> 16 >> 24)) \
2754 ? Fcons (make_number ((i) >> 16 >> 24), \
2755 Fcons (make_number ((i) >> 16 & 0xffffff), \
2756 make_number ((i) & 0xffff))) \
2757 : make_float (i))
2758
2759/* Convert the Emacs representation CONS back to an integer of type
2760 TYPE, storing the result the variable VAR. Signal an error if CONS
2761 is not a valid representation or is out of range for TYPE. */
2762#define CONS_TO_INTEGER(cons, type, var) \
2763 (TYPE_SIGNED (type) \
2764 ? ((var) = cons_to_signed (cons, TYPE_MINIMUM (type), TYPE_MAXIMUM (type))) \
2765 : ((var) = cons_to_unsigned (cons, TYPE_MAXIMUM (type))))
2766extern intmax_t cons_to_signed (Lisp_Object, intmax_t, intmax_t);
2767extern uintmax_t cons_to_unsigned (Lisp_Object, uintmax_t);
2768
ad97b375 2769extern struct Lisp_Symbol *indirect_variable (struct Lisp_Symbol *);
845ca893
PE
2770extern _Noreturn void args_out_of_range (Lisp_Object, Lisp_Object);
2771extern _Noreturn void args_out_of_range_3 (Lisp_Object, Lisp_Object,
2772 Lisp_Object);
2773extern _Noreturn Lisp_Object wrong_type_argument (Lisp_Object, Lisp_Object);
ce5b453a 2774extern Lisp_Object do_symval_forwarding (union Lisp_Fwd *);
de1339b0 2775extern void set_internal (Lisp_Object, Lisp_Object, Lisp_Object, bool);
383e0970 2776extern void syms_of_data (void);
383e0970 2777extern void swap_in_global_binding (struct Lisp_Symbol *);
3cfe6dfd 2778
a37e10f9 2779/* Defined in cmds.c */
383e0970
J
2780extern void syms_of_cmds (void);
2781extern void keys_of_cmds (void);
a37e10f9 2782
e7032e7c 2783/* Defined in coding.c. */
2f7c71a1 2784extern Lisp_Object Qcharset;
d311d28c 2785extern Lisp_Object detect_coding_system (const unsigned char *, ptrdiff_t,
f10fe38f 2786 ptrdiff_t, bool, bool, Lisp_Object);
383e0970
J
2787extern void init_coding (void);
2788extern void init_coding_once (void);
2789extern void syms_of_coding (void);
1842abb2 2790
e7032e7c 2791/* Defined in character.c. */
5994c183 2792EXFUN (Fmax_char, 0) ATTRIBUTE_CONST;
d311d28c
PE
2793extern ptrdiff_t chars_in_text (const unsigned char *, ptrdiff_t);
2794extern ptrdiff_t multibyte_chars_in_text (const unsigned char *, ptrdiff_t);
5994c183
PE
2795extern int multibyte_char_to_unibyte (int) ATTRIBUTE_CONST;
2796extern int multibyte_char_to_unibyte_safe (int) ATTRIBUTE_CONST;
2f7c71a1
AS
2797extern void syms_of_character (void);
2798
e7032e7c 2799/* Defined in charset.c. */
383e0970
J
2800extern void init_charset (void);
2801extern void init_charset_once (void);
2802extern void syms_of_charset (void);
8f924df7
KH
2803/* Structure forward declarations. */
2804struct charset;
5e741a41 2805
e7032e7c 2806/* Defined in composite.c. */
383e0970 2807extern void syms_of_composite (void);
5e741a41 2808
e7032e7c 2809/* Defined in syntax.c. */
383e0970
J
2810extern void init_syntax_once (void);
2811extern void syms_of_syntax (void);
a37e10f9 2812
e7032e7c 2813/* Defined in fns.c. */
99f3388e 2814extern Lisp_Object QCrehash_size, QCrehash_threshold;
ca9ce8f2 2815enum { NEXT_ALMOST_PRIME_LIMIT = 11 };
5994c183
PE
2816EXFUN (Fidentity, 1) ATTRIBUTE_CONST;
2817extern EMACS_INT next_almost_prime (EMACS_INT) ATTRIBUTE_CONST;
d311d28c 2818extern Lisp_Object larger_vector (Lisp_Object, ptrdiff_t, ptrdiff_t);
383e0970 2819extern void sweep_weak_hash_tables (void);
e6cba650 2820extern Lisp_Object Qcursor_in_echo_area;
3cfe6dfd 2821extern Lisp_Object Qstring_lessp;
53371430 2822extern Lisp_Object QCsize, QCtest, QCweakness, Qequal, Qeq;
3cc5a532 2823EMACS_UINT hash_string (char const *, ptrdiff_t);
0de4bb68 2824EMACS_UINT sxhash (Lisp_Object, int);
b7432bb2
SM
2825Lisp_Object make_hash_table (struct hash_table_test, Lisp_Object, Lisp_Object,
2826 Lisp_Object, Lisp_Object);
d3411f89
PE
2827ptrdiff_t hash_lookup (struct Lisp_Hash_Table *, Lisp_Object, EMACS_UINT *);
2828ptrdiff_t hash_put (struct Lisp_Hash_Table *, Lisp_Object, Lisp_Object,
0de4bb68 2829 EMACS_UINT);
53371430 2830extern struct hash_table_test hashtest_eql, hashtest_equal;
404dbd37 2831
d311d28c
PE
2832extern Lisp_Object substring_both (Lisp_Object, ptrdiff_t, ptrdiff_t,
2833 ptrdiff_t, ptrdiff_t);
383e0970 2834extern Lisp_Object do_yes_or_no_p (Lisp_Object);
383e0970
J
2835extern Lisp_Object concat2 (Lisp_Object, Lisp_Object);
2836extern Lisp_Object concat3 (Lisp_Object, Lisp_Object, Lisp_Object);
2837extern Lisp_Object nconc2 (Lisp_Object, Lisp_Object);
2838extern Lisp_Object assq_no_quit (Lisp_Object, Lisp_Object);
2839extern Lisp_Object assoc_no_quit (Lisp_Object, Lisp_Object);
2840extern void clear_string_char_byte_cache (void);
d311d28c
PE
2841extern ptrdiff_t string_char_to_byte (Lisp_Object, ptrdiff_t);
2842extern ptrdiff_t string_byte_to_char (Lisp_Object, ptrdiff_t);
383e0970
J
2843extern Lisp_Object string_to_multibyte (Lisp_Object);
2844extern Lisp_Object string_make_unibyte (Lisp_Object);
383e0970 2845extern void syms_of_fns (void);
2f69f2ec 2846
e7032e7c 2847/* Defined in floatfns.c. */
383e0970 2848extern double extract_float (Lisp_Object);
383e0970 2849extern void syms_of_floatfns (void);
3d608a86 2850extern Lisp_Object fmod_float (Lisp_Object x, Lisp_Object y);
3cfe6dfd 2851
e7032e7c 2852/* Defined in fringe.c. */
383e0970
J
2853extern void syms_of_fringe (void);
2854extern void init_fringe (void);
524c7aa6
PE
2855#ifdef HAVE_WINDOW_SYSTEM
2856extern void mark_fringe_data (void);
383e0970 2857extern void init_fringe_once (void);
524c7aa6 2858#endif /* HAVE_WINDOW_SYSTEM */
6b61353c 2859
e7032e7c 2860/* Defined in image.c. */
955cbe7b
PE
2861extern Lisp_Object QCascent, QCmargin, QCrelief;
2862extern Lisp_Object QCconversion;
0766b489 2863extern int x_bitmap_mask (struct frame *, ptrdiff_t);
aa15c6bb 2864extern void reset_image_types (void);
383e0970 2865extern void syms_of_image (void);
6b61353c 2866
e7032e7c 2867/* Defined in insdel.c. */
b8b31967 2868extern Lisp_Object Qinhibit_modification_hooks;
d311d28c 2869extern void move_gap_both (ptrdiff_t, ptrdiff_t);
845ca893 2870extern _Noreturn void buffer_overflow (void);
d311d28c 2871extern void make_gap (ptrdiff_t);
eefd7278 2872extern void make_gap_1 (struct buffer *, ptrdiff_t);
d311d28c 2873extern ptrdiff_t copy_text (const unsigned char *, unsigned char *,
a08d4ba7 2874 ptrdiff_t, bool, bool);
ae19ba7c 2875extern int count_combining_before (const unsigned char *,
d311d28c 2876 ptrdiff_t, ptrdiff_t, ptrdiff_t);
ae19ba7c 2877extern int count_combining_after (const unsigned char *,
d311d28c
PE
2878 ptrdiff_t, ptrdiff_t, ptrdiff_t);
2879extern void insert (const char *, ptrdiff_t);
2880extern void insert_and_inherit (const char *, ptrdiff_t);
d311d28c 2881extern void insert_1_both (const char *, ptrdiff_t, ptrdiff_t,
a08d4ba7 2882 bool, bool, bool);
d311d28c
PE
2883extern void insert_from_gap (ptrdiff_t, ptrdiff_t);
2884extern void insert_from_string (Lisp_Object, ptrdiff_t, ptrdiff_t,
a08d4ba7
PE
2885 ptrdiff_t, ptrdiff_t, bool);
2886extern void insert_from_buffer (struct buffer *, ptrdiff_t, ptrdiff_t, bool);
ae19ba7c
SM
2887extern void insert_char (int);
2888extern void insert_string (const char *);
d311d28c
PE
2889extern void insert_before_markers (const char *, ptrdiff_t);
2890extern void insert_before_markers_and_inherit (const char *, ptrdiff_t);
2891extern void insert_from_string_before_markers (Lisp_Object, ptrdiff_t,
2892 ptrdiff_t, ptrdiff_t,
a08d4ba7 2893 ptrdiff_t, bool);
d311d28c 2894extern void del_range (ptrdiff_t, ptrdiff_t);
a08d4ba7
PE
2895extern Lisp_Object del_range_1 (ptrdiff_t, ptrdiff_t, bool, bool);
2896extern void del_range_byte (ptrdiff_t, ptrdiff_t, bool);
2897extern void del_range_both (ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t, bool);
d311d28c 2898extern Lisp_Object del_range_2 (ptrdiff_t, ptrdiff_t,
a08d4ba7 2899 ptrdiff_t, ptrdiff_t, bool);
20edc1c9 2900extern void modify_region_1 (ptrdiff_t, ptrdiff_t, bool);
d311d28c
PE
2901extern void prepare_to_modify_buffer (ptrdiff_t, ptrdiff_t, ptrdiff_t *);
2902extern void signal_after_change (ptrdiff_t, ptrdiff_t, ptrdiff_t);
2903extern void adjust_after_insert (ptrdiff_t, ptrdiff_t, ptrdiff_t,
2904 ptrdiff_t, ptrdiff_t);
2905extern void adjust_markers_for_delete (ptrdiff_t, ptrdiff_t,
2906 ptrdiff_t, ptrdiff_t);
a08d4ba7 2907extern void replace_range (ptrdiff_t, ptrdiff_t, Lisp_Object, bool, bool, bool);
d311d28c 2908extern void replace_range_2 (ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t,
a08d4ba7 2909 const char *, ptrdiff_t, ptrdiff_t, bool);
ae19ba7c 2910extern void syms_of_insdel (void);
c98adc1b 2911
e7032e7c 2912/* Defined in dispnew.c. */
9e4bf381
PE
2913#if (defined PROFILING \
2914 && (defined __FreeBSD__ || defined GNU_LINUX || defined __MINGW32__))
845ca893 2915_Noreturn void __executable_start (void);
9e4bf381 2916#endif
37b793e6 2917extern Lisp_Object selected_frame;
7684e57b 2918extern Lisp_Object Vwindow_system;
59ea14cd 2919extern Lisp_Object sit_for (Lisp_Object, bool, int);
383e0970
J
2920extern void init_display (void);
2921extern void syms_of_display (void);
1747fb16 2922
e7032e7c 2923/* Defined in xdisp.c. */
c6ae41f3 2924extern Lisp_Object Qinhibit_point_motion_hooks;
016c7a15 2925extern Lisp_Object Qinhibit_redisplay, Qdisplay;
99f3388e 2926extern Lisp_Object Qmenu_bar_update_hook;
29208e82 2927extern Lisp_Object Qwindow_scroll_functions;
99f3388e 2928extern Lisp_Object Qoverriding_local_map, Qoverriding_terminal_local_map;
8a52f00a 2929extern Lisp_Object Qimage, Qtext, Qboth, Qboth_horiz, Qtext_image_horiz;
89dc303e 2930extern Lisp_Object Qspace, Qcenter, QCalign_to;
99f3388e
DN
2931extern Lisp_Object Qbar, Qhbar, Qbox, Qhollow;
2932extern Lisp_Object Qleft_margin, Qright_margin;
b932f8b1 2933extern Lisp_Object Qglyphless_char;
89dc303e 2934extern Lisp_Object QCdata, QCfile;
99f3388e 2935extern Lisp_Object QCmap;
e6cba650 2936extern Lisp_Object Qrisky_local_variable;
b932f8b1 2937extern struct frame *last_glyphless_glyph_frame;
d311d28c 2938extern int last_glyphless_glyph_face_id;
b932f8b1 2939extern int last_glyphless_glyph_merged_face_id;
99f3388e 2940extern int noninteractive_need_newline;
986113df 2941extern Lisp_Object echo_area_buffer[2];
89dc303e 2942extern void add_to_log (const char *, Lisp_Object, Lisp_Object);
383e0970
J
2943extern void check_message_stack (void);
2944extern void setup_echo_area_for_printing (int);
fce31d69 2945extern bool push_message (void);
383e0970
J
2946extern Lisp_Object pop_message_unwind (Lisp_Object);
2947extern Lisp_Object restore_message_unwind (Lisp_Object);
383e0970
J
2948extern void restore_message (void);
2949extern Lisp_Object current_message (void);
383e0970 2950extern void clear_message (int, int);
1e973bc7 2951extern void message (const char *, ...) ATTRIBUTE_FORMAT_PRINTF (1, 2);
a8fe7202
AS
2952extern void message1 (const char *);
2953extern void message1_nolog (const char *);
b09cca6a
SM
2954extern void message3 (Lisp_Object);
2955extern void message3_nolog (Lisp_Object);
0063fdb1 2956extern void message_dolog (const char *, ptrdiff_t, bool, bool);
a8fe7202 2957extern void message_with_string (const char *, Lisp_Object, int);
383e0970
J
2958extern void message_log_maybe_newline (void);
2959extern void update_echo_area (void);
d311d28c 2960extern void truncate_echo_area (ptrdiff_t);
383e0970 2961extern void redisplay (void);
383e0970
J
2962extern void redisplay_preserve_echo_area (int);
2963extern void prepare_menu_bars (void);
c4bf5bc3 2964
383e0970
J
2965void set_frame_cursor_types (struct frame *, Lisp_Object);
2966extern void syms_of_xdisp (void);
2967extern void init_xdisp (void);
2968extern Lisp_Object safe_eval (Lisp_Object);
d311d28c 2969extern int pos_visible_p (struct window *, ptrdiff_t, int *,
383e0970 2970 int *, int *, int *, int *, int *);
c98adc1b 2971
e7032e7c 2972/* Defined in xsettings.c. */
383e0970 2973extern void syms_of_xsettings (void);
637fa988 2974
15b0ced5 2975/* Defined in vm-limit.c. */
261cb4bb 2976extern void memory_warnings (void *, void (*warnfun) (const char *));
9043c90a 2977
e7032e7c 2978/* Defined in alloc.c. */
383e0970 2979extern void check_pure_size (void);
73ebd38f 2980extern void free_misc (Lisp_Object);
413d18e7 2981extern void allocate_string_data (struct Lisp_String *, EMACS_INT, EMACS_INT);
a8fe7202 2982extern void malloc_warning (const char *);
845ca893
PE
2983extern _Noreturn void memory_full (size_t);
2984extern _Noreturn void buffer_memory_full (ptrdiff_t);
fce31d69 2985extern bool survives_gc_p (Lisp_Object);
383e0970 2986extern void mark_object (Lisp_Object);
69003fd8 2987#if defined REL_ALLOC && !defined SYSTEM_MALLOC
84dfc8a7 2988extern void refill_memory_reserve (void);
69003fd8 2989#endif
50c77428 2990extern const char *pending_malloc_warning;
9730daca 2991extern Lisp_Object zero_vector;
89dc303e 2992extern Lisp_Object *stack_base;
dac616ff
DA
2993extern EMACS_INT consing_since_gc;
2994extern EMACS_INT gc_relative_threshold;
2995extern EMACS_INT memory_full_cons_threshold;
2f7c71a1
AS
2996extern Lisp_Object list1 (Lisp_Object);
2997extern Lisp_Object list2 (Lisp_Object, Lisp_Object);
2998extern Lisp_Object list3 (Lisp_Object, Lisp_Object, Lisp_Object);
2999extern Lisp_Object list4 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
3000extern Lisp_Object list5 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object,
3001 Lisp_Object);
3438fe21 3002enum constype {CONSTYPE_HEAP, CONSTYPE_PURE};
694b6c97 3003extern Lisp_Object listn (enum constype, ptrdiff_t, Lisp_Object, ...);
845ca893 3004extern _Noreturn void string_overflow (void);
d311d28c 3005extern Lisp_Object make_string (const char *, ptrdiff_t);
26bccfae
PE
3006extern Lisp_Object make_formatted_string (char *, const char *, ...)
3007 ATTRIBUTE_FORMAT_PRINTF (2, 3);
d311d28c 3008extern Lisp_Object make_unibyte_string (const char *, ptrdiff_t);
d7ea76b4
DA
3009
3010/* Make unibyte string from C string when the length isn't known. */
3011
f162bcc3 3012LISP_INLINE Lisp_Object
d7ea76b4
DA
3013build_unibyte_string (const char *str)
3014{
3015 return make_unibyte_string (str, strlen (str));
3016}
3017
d311d28c 3018extern Lisp_Object make_multibyte_string (const char *, ptrdiff_t, ptrdiff_t);
383e0970 3019extern Lisp_Object make_event_array (int, Lisp_Object *);
413d18e7
EZ
3020extern Lisp_Object make_uninit_string (EMACS_INT);
3021extern Lisp_Object make_uninit_multibyte_string (EMACS_INT, EMACS_INT);
d311d28c 3022extern Lisp_Object make_string_from_bytes (const char *, ptrdiff_t, ptrdiff_t);
14162469 3023extern Lisp_Object make_specified_string (const char *,
fce31d69
PE
3024 ptrdiff_t, ptrdiff_t, bool);
3025extern Lisp_Object make_pure_string (const char *, ptrdiff_t, ptrdiff_t, bool);
2a0213a6
DA
3026extern Lisp_Object make_pure_c_string (const char *, ptrdiff_t);
3027
3028/* Make a string allocated in pure space, use STR as string data. */
3029
f162bcc3 3030LISP_INLINE Lisp_Object
2a0213a6
DA
3031build_pure_c_string (const char *str)
3032{
3033 return make_pure_c_string (str, strlen (str));
3034}
1130ecfc
DA
3035
3036/* Make a string from the data at STR, treating it as multibyte if the
3037 data warrants. */
3038
f162bcc3 3039LISP_INLINE Lisp_Object
1130ecfc
DA
3040build_string (const char *str)
3041{
3042 return make_string (str, strlen (str));
3043}
3044
383e0970 3045extern Lisp_Object pure_cons (Lisp_Object, Lisp_Object);
3017f87f 3046extern void make_byte_code (struct Lisp_Vector *);
3d80c99f 3047extern Lisp_Object Qautomatic_gc;
7f73dc9d 3048extern Lisp_Object Qchar_table_extra_slots;
383e0970 3049extern struct Lisp_Vector *allocate_vector (EMACS_INT);
25721f5b 3050
8b17a8b9 3051/* Make an uninitialized vector for SIZE objects. NOTE: you must
25721f5b
DA
3052 be sure that GC cannot happen until the vector is completely
3053 initialized. E.g. the following code is likely to crash:
3054
3055 v = make_uninit_vector (3);
3056 ASET (v, 0, obj0);
3057 ASET (v, 1, Ffunction_can_gc ());
3058 ASET (v, 2, obj1); */
3059
3060LISP_INLINE Lisp_Object
3061make_uninit_vector (ptrdiff_t size)
3062{
3063 Lisp_Object v;
3064 struct Lisp_Vector *p;
3065
3066 p = allocate_vector (size);
3067 XSETVECTOR (v, p);
3068 return v;
3069}
3070
914adc42 3071extern struct Lisp_Vector *allocate_pseudovector (int, int, enum pvec_type);
30f95089
SM
3072#define ALLOCATE_PSEUDOVECTOR(typ,field,tag) \
3073 ((typ*) \
3074 allocate_pseudovector \
3075 (VECSIZE (typ), PSEUDOVECSIZE (typ, field), tag))
383e0970
J
3076extern struct Lisp_Hash_Table *allocate_hash_table (void);
3077extern struct window *allocate_window (void);
3078extern struct frame *allocate_frame (void);
3079extern struct Lisp_Process *allocate_process (void);
3080extern struct terminal *allocate_terminal (void);
fce31d69
PE
3081extern bool gc_in_progress;
3082extern bool abort_on_gc;
383e0970
J
3083extern Lisp_Object make_float (double);
3084extern void display_malloc_warning (void);
d311d28c 3085extern ptrdiff_t inhibit_garbage_collection (void);
468afbac
DA
3086extern Lisp_Object make_save_value (const char *, ...);
3087extern Lisp_Object make_save_pointer (void *);
d7a7fda3 3088extern Lisp_Object build_overlay (Lisp_Object, Lisp_Object, Lisp_Object);
383e0970
J
3089extern void free_marker (Lisp_Object);
3090extern void free_cons (struct Lisp_Cons *);
3091extern void init_alloc_once (void);
3092extern void init_alloc (void);
3093extern void syms_of_alloc (void);
3094extern struct buffer * allocate_buffer (void);
3095extern int valid_lisp_object_p (Lisp_Object);
7e63e0c3
DA
3096#ifdef GC_CHECK_CONS_LIST
3097extern void check_cons_list (void);
3098#else
3099#define check_cons_list() ((void) 0)
3100#endif
3cfe6dfd 3101
a041960a 3102#ifdef REL_ALLOC
e7032e7c 3103/* Defined in ralloc.c. */
a041960a
PE
3104extern void *r_alloc (void **, size_t);
3105extern void r_alloc_free (void **);
3106extern void *r_re_alloc (void **, size_t);
3107extern void r_alloc_reset_variable (void **, void **);
57b81a9f 3108extern void r_alloc_inhibit_buffer_relocation (int);
a041960a
PE
3109#endif
3110
e7032e7c 3111/* Defined in chartab.c. */
383e0970 3112extern Lisp_Object copy_char_table (Lisp_Object);
383e0970
J
3113extern Lisp_Object char_table_ref (Lisp_Object, int);
3114extern Lisp_Object char_table_ref_and_range (Lisp_Object, int,
3115 int *, int *);
e757f1c6
PE
3116extern void char_table_set (Lisp_Object, int, Lisp_Object);
3117extern void char_table_set_range (Lisp_Object, int, int, Lisp_Object);
383e0970
J
3118extern int char_table_translate (Lisp_Object, int);
3119extern void map_char_table (void (*) (Lisp_Object, Lisp_Object,
3120 Lisp_Object),
3121 Lisp_Object, Lisp_Object, Lisp_Object);
e6cba650
DN
3122extern void map_char_table_for_charset (void (*c_function) (Lisp_Object, Lisp_Object),
3123 Lisp_Object, Lisp_Object,
3124 Lisp_Object, struct charset *,
3125 unsigned, unsigned);
5cc7f7af 3126extern Lisp_Object uniprop_table (Lisp_Object);
383e0970 3127extern void syms_of_chartab (void);
1842abb2 3128
e7032e7c 3129/* Defined in print.c. */
3cfe6dfd 3130extern Lisp_Object Vprin1_to_string_buffer;
42c8bc9b 3131extern void debug_print (Lisp_Object) EXTERNALLY_VISIBLE;
29208e82 3132extern Lisp_Object Qstandard_output;
9453ea7b 3133extern Lisp_Object Qexternal_debugging_output;
383e0970 3134extern void temp_output_buffer_setup (const char *);
29208e82 3135extern int print_level;
3cfe6dfd 3136extern Lisp_Object Qprint_escape_newlines;
a8fe7202 3137extern void write_string (const char *, int);
a8fe7202
AS
3138extern void print_error_message (Lisp_Object, Lisp_Object, const char *,
3139 Lisp_Object);
526a2be7 3140extern Lisp_Object internal_with_output_to_temp_buffer
383e0970 3141 (const char *, Lisp_Object (*) (Lisp_Object), Lisp_Object);
03a660a6 3142enum FLOAT_TO_STRING_BUFSIZE { FLOAT_TO_STRING_BUFSIZE = 350 };
99027bdd 3143extern int float_to_string (char *, double);
383e0970 3144extern void syms_of_print (void);
526a2be7 3145
e7032e7c 3146/* Defined in doprnt.c. */
c2d1e36d
PE
3147extern ptrdiff_t doprnt (char *, ptrdiff_t, const char *, const char *,
3148 va_list);
62f19c19
PE
3149extern ptrdiff_t esprintf (char *, char const *, ...)
3150 ATTRIBUTE_FORMAT_PRINTF (2, 3);
62f19c19
PE
3151extern ptrdiff_t exprintf (char **, ptrdiff_t *, char const *, ptrdiff_t,
3152 char const *, ...)
3153 ATTRIBUTE_FORMAT_PRINTF (5, 6);
3154extern ptrdiff_t evxprintf (char **, ptrdiff_t *, char const *, ptrdiff_t,
3155 char const *, va_list)
3156 ATTRIBUTE_FORMAT_PRINTF (5, 0);
e6c3da20 3157
ea6c7ae6 3158/* Defined in lread.c. */
3cfe6dfd 3159extern Lisp_Object Qvariable_documentation, Qstandard_input;
99f3388e 3160extern Lisp_Object Qbackquote, Qcomma, Qcomma_at, Qcomma_dot, Qfunction;
a411ac43 3161extern Lisp_Object Qlexical_binding;
383e0970 3162extern Lisp_Object check_obarray (Lisp_Object);
e8df9267
DA
3163extern Lisp_Object intern_1 (const char *, ptrdiff_t);
3164extern Lisp_Object intern_c_string_1 (const char *, ptrdiff_t);
d311d28c 3165extern Lisp_Object oblookup (Lisp_Object, const char *, ptrdiff_t, ptrdiff_t);
c5e3de70 3166#define LOADHIST_ATTACH(x) \
d6d23852
SM
3167 do { \
3168 if (initialized) Vcurrent_load_list = Fcons (x, Vcurrent_load_list); \
3169 } while (0)
383e0970
J
3170extern int openp (Lisp_Object, Lisp_Object, Lisp_Object,
3171 Lisp_Object *, Lisp_Object);
7cded46f 3172extern Lisp_Object string_to_number (char const *, int, bool);
383e0970
J
3173extern void map_obarray (Lisp_Object, void (*) (Lisp_Object, Lisp_Object),
3174 Lisp_Object);
a8fe7202 3175extern void dir_warning (const char *, Lisp_Object);
383e0970
J
3176extern void close_load_descs (void);
3177extern void init_obarray (void);
3178extern void init_lread (void);
3179extern void syms_of_lread (void);
3cfe6dfd 3180
f162bcc3 3181LISP_INLINE Lisp_Object
e8df9267
DA
3182intern (const char *str)
3183{
3184 return intern_1 (str, strlen (str));
3185}
3186
f162bcc3 3187LISP_INLINE Lisp_Object
e8df9267
DA
3188intern_c_string (const char *str)
3189{
3190 return intern_c_string_1 (str, strlen (str));
3191}
3192
f6d62986 3193/* Defined in eval.c. */
61b108cc 3194extern Lisp_Object Qautoload, Qexit, Qinteractive, Qcommandp, Qmacro;
a411ac43 3195extern Lisp_Object Qinhibit_quit, Qinternal_interpreter_environment, Qclosure;
955cbe7b 3196extern Lisp_Object Qand_rest;
3cfe6dfd 3197extern Lisp_Object Vautoload_queue;
fab88cb7 3198extern Lisp_Object Vsignaling_function;
d1f55f16 3199extern Lisp_Object inhibit_lisp_code;
244ed907
PE
3200#if BYTE_MARK_STACK
3201extern struct catchtag *catchlist;
3202extern struct handler *handlerlist;
3203#endif
f1b6e5fc
SM
3204/* To run a normal hook, use the appropriate function from the list below.
3205 The calling convention:
3206
846d69ac 3207 if (!NILP (Vrun_hooks))
f1b6e5fc
SM
3208 call1 (Vrun_hooks, Qmy_funny_hook);
3209
3210 should no longer be used. */
3cfe6dfd 3211extern Lisp_Object Vrun_hooks;
383e0970 3212extern void run_hook_with_args_2 (Lisp_Object, Lisp_Object, Lisp_Object);
f66c7cf8 3213extern Lisp_Object run_hook_with_args (ptrdiff_t nargs, Lisp_Object *args,
f6d62986 3214 Lisp_Object (*funcall)
f66c7cf8 3215 (ptrdiff_t nargs, Lisp_Object *args));
845ca893
PE
3216extern _Noreturn void xsignal (Lisp_Object, Lisp_Object);
3217extern _Noreturn void xsignal0 (Lisp_Object);
3218extern _Noreturn void xsignal1 (Lisp_Object, Lisp_Object);
3219extern _Noreturn void xsignal2 (Lisp_Object, Lisp_Object, Lisp_Object);
3220extern _Noreturn void xsignal3 (Lisp_Object, Lisp_Object, Lisp_Object,
3221 Lisp_Object);
3222extern _Noreturn void signal_error (const char *, Lisp_Object);
defb1411 3223extern Lisp_Object eval_sub (Lisp_Object form);
383e0970
J
3224extern Lisp_Object apply1 (Lisp_Object, Lisp_Object);
3225extern Lisp_Object call0 (Lisp_Object);
3226extern Lisp_Object call1 (Lisp_Object, Lisp_Object);
3227extern Lisp_Object call2 (Lisp_Object, Lisp_Object, Lisp_Object);
3228extern Lisp_Object call3 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
3229extern Lisp_Object call4 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
3230extern Lisp_Object call5 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
3231extern Lisp_Object call6 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
3232extern Lisp_Object call7 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
383e0970
J
3233extern Lisp_Object internal_catch (Lisp_Object, Lisp_Object (*) (Lisp_Object), Lisp_Object);
3234extern Lisp_Object internal_lisp_condition_case (Lisp_Object, Lisp_Object, Lisp_Object);
3235extern Lisp_Object internal_condition_case (Lisp_Object (*) (void), Lisp_Object, Lisp_Object (*) (Lisp_Object));
3236extern Lisp_Object internal_condition_case_1 (Lisp_Object (*) (Lisp_Object), Lisp_Object, Lisp_Object, Lisp_Object (*) (Lisp_Object));
3237extern Lisp_Object internal_condition_case_2 (Lisp_Object (*) (Lisp_Object, Lisp_Object), Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object (*) (Lisp_Object));
cc92c454
SM
3238extern Lisp_Object internal_condition_case_n
3239 (Lisp_Object (*) (ptrdiff_t, Lisp_Object *), ptrdiff_t, Lisp_Object *,
3240 Lisp_Object, Lisp_Object (*) (Lisp_Object, ptrdiff_t, Lisp_Object *));
383e0970
J
3241extern void specbind (Lisp_Object, Lisp_Object);
3242extern void record_unwind_protect (Lisp_Object (*) (Lisp_Object), Lisp_Object);
d311d28c 3243extern Lisp_Object unbind_to (ptrdiff_t, Lisp_Object);
845ca893
PE
3244extern _Noreturn void error (const char *, ...) ATTRIBUTE_FORMAT_PRINTF (1, 2);
3245extern _Noreturn void verror (const char *, va_list)
3246 ATTRIBUTE_FORMAT_PRINTF (1, 0);
383e0970 3247extern Lisp_Object un_autoload (Lisp_Object);
7f7e0167 3248extern Lisp_Object call_debugger (Lisp_Object arg);
383e0970 3249extern void init_eval_once (void);
6cd7a139 3250extern Lisp_Object safe_call (ptrdiff_t, Lisp_Object, ...);
383e0970 3251extern Lisp_Object safe_call1 (Lisp_Object, Lisp_Object);
58555d81 3252extern Lisp_Object safe_call2 (Lisp_Object, Lisp_Object, Lisp_Object);
383e0970 3253extern void init_eval (void);
244ed907 3254#if BYTE_MARK_STACK
8b2c52e9 3255extern void mark_backtrace (void);
244ed907 3256#endif
383e0970 3257extern void syms_of_eval (void);
3cfe6dfd 3258
7abaf5cc 3259/* Defined in editfns.c. */
e6cba650 3260extern Lisp_Object Qfield;
383e0970 3261extern void insert1 (Lisp_Object);
a8fe7202 3262extern Lisp_Object format2 (const char *, Lisp_Object, Lisp_Object);
383e0970
J
3263extern Lisp_Object save_excursion_save (void);
3264extern Lisp_Object save_restriction_save (void);
3265extern Lisp_Object save_excursion_restore (Lisp_Object);
3266extern Lisp_Object save_restriction_restore (Lisp_Object);
845ca893 3267extern _Noreturn void time_overflow (void);
a08d4ba7 3268extern Lisp_Object make_buffer_string (ptrdiff_t, ptrdiff_t, bool);
d311d28c 3269extern Lisp_Object make_buffer_string_both (ptrdiff_t, ptrdiff_t, ptrdiff_t,
a08d4ba7 3270 ptrdiff_t, bool);
383e0970
J
3271extern void init_editfns (void);
3272extern void syms_of_editfns (void);
a8fe7202 3273extern void set_time_zone_rule (const char *);
3cfe6dfd 3274
7abaf5cc 3275/* Defined in buffer.c. */
37ef52bb 3276extern bool mouse_face_overlay_overlaps (Lisp_Object);
845ca893 3277extern _Noreturn void nsberror (Lisp_Object);
d311d28c
PE
3278extern void adjust_overlays_for_insert (ptrdiff_t, ptrdiff_t);
3279extern void adjust_overlays_for_delete (ptrdiff_t, ptrdiff_t);
3280extern void fix_start_end_in_overlays (ptrdiff_t, ptrdiff_t);
37ef52bb 3281extern void report_overlay_modification (Lisp_Object, Lisp_Object, bool,
383e0970 3282 Lisp_Object, Lisp_Object, Lisp_Object);
37ef52bb 3283extern bool overlay_touches_p (ptrdiff_t);
29208e82 3284extern Lisp_Object Vbuffer_alist;
2f7c71a1 3285extern Lisp_Object set_buffer_if_live (Lisp_Object);
9397e56f 3286extern Lisp_Object other_buffer_safely (Lisp_Object);
955cbe7b 3287extern Lisp_Object Qpriority, Qwindow, Qbefore_string, Qafter_string;
383e0970 3288extern Lisp_Object get_truename_buffer (Lisp_Object);
383e0970
J
3289extern void init_buffer_once (void);
3290extern void init_buffer (void);
3291extern void syms_of_buffer (void);
3292extern void keys_of_buffer (void);
3cfe6dfd 3293
7abaf5cc 3294/* Defined in marker.c. */
3cfe6dfd 3295
d311d28c
PE
3296extern ptrdiff_t marker_position (Lisp_Object);
3297extern ptrdiff_t marker_byte_position (Lisp_Object);
383e0970 3298extern void clear_charpos_cache (struct buffer *);
d311d28c
PE
3299extern ptrdiff_t buf_charpos_to_bytepos (struct buffer *, ptrdiff_t);
3300extern ptrdiff_t buf_bytepos_to_charpos (struct buffer *, ptrdiff_t);
eeaea515 3301extern void unchain_marker (struct Lisp_Marker *marker);
383e0970 3302extern Lisp_Object set_marker_restricted (Lisp_Object, Lisp_Object, Lisp_Object);
d311d28c 3303extern Lisp_Object set_marker_both (Lisp_Object, Lisp_Object, ptrdiff_t, ptrdiff_t);
383e0970 3304extern Lisp_Object set_marker_restricted_both (Lisp_Object, Lisp_Object,
eeaea515 3305 ptrdiff_t, ptrdiff_t);
657924ff 3306extern Lisp_Object build_marker (struct buffer *, ptrdiff_t, ptrdiff_t);
383e0970 3307extern void syms_of_marker (void);
3cfe6dfd 3308
e7032e7c 3309/* Defined in fileio.c. */
3cfe6dfd
JB
3310
3311extern Lisp_Object Qfile_error;
99f3388e 3312extern Lisp_Object Qfile_exists_p;
e6cba650
DN
3313extern Lisp_Object Qfile_directory_p;
3314extern Lisp_Object Qinsert_file_contents;
7684e57b 3315extern Lisp_Object Qfile_name_history;
383e0970 3316extern Lisp_Object expand_and_dir_to_file (Lisp_Object, Lisp_Object);
e7032e7c 3317EXFUN (Fread_file_name, 6); /* Not a normal DEFUN. */
383e0970
J
3318extern Lisp_Object close_file_unwind (Lisp_Object);
3319extern Lisp_Object restore_point_unwind (Lisp_Object);
845ca893 3320extern _Noreturn void report_file_error (const char *, Lisp_Object);
7d80ea23 3321extern bool internal_delete_file (Lisp_Object);
8654f9d7 3322extern Lisp_Object emacs_readlinkat (int, const char *);
73dcdb9f
PE
3323extern bool file_directory_p (const char *);
3324extern bool file_accessible_directory_p (const char *);
9fe43ff6 3325extern void init_fileio (void);
383e0970 3326extern void syms_of_fileio (void);
f75d7a91 3327extern Lisp_Object make_temp_name (Lisp_Object, bool);
b86cfd28 3328extern Lisp_Object Qdelete_file;
bb385a92 3329extern bool check_existing (const char *);
3cfe6dfd 3330
e7032e7c 3331/* Defined in search.c. */
383e0970 3332extern void shrink_regexp_cache (void);
383e0970 3333extern void restore_search_regs (void);
383e0970 3334extern void record_unwind_save_match_data (void);
dbd37a95
PE
3335struct re_registers;
3336extern struct re_pattern_buffer *compile_pattern (Lisp_Object,
3337 struct re_registers *,
0063fdb1 3338 Lisp_Object, int, bool);
d311d28c 3339extern ptrdiff_t fast_string_match (Lisp_Object, Lisp_Object);
d923b542
DA
3340extern ptrdiff_t fast_c_string_match_ignore_case (Lisp_Object, const char *,
3341 ptrdiff_t);
d311d28c
PE
3342extern ptrdiff_t fast_string_match_ignore_case (Lisp_Object, Lisp_Object);
3343extern ptrdiff_t fast_looking_at (Lisp_Object, ptrdiff_t, ptrdiff_t,
3344 ptrdiff_t, ptrdiff_t, Lisp_Object);
a84b7c53 3345extern ptrdiff_t find_newline (ptrdiff_t, ptrdiff_t, ptrdiff_t,
2a14a4f1 3346 ptrdiff_t *, ptrdiff_t *, bool);
d311d28c 3347extern EMACS_INT scan_newline (ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t,
9fa1de30 3348 EMACS_INT, bool);
d311d28c 3349extern ptrdiff_t find_next_newline (ptrdiff_t, int);
2a14a4f1
DA
3350extern ptrdiff_t find_next_newline_no_quit (ptrdiff_t, ptrdiff_t, ptrdiff_t *);
3351extern ptrdiff_t find_before_next_newline (ptrdiff_t, ptrdiff_t,
3352 ptrdiff_t, ptrdiff_t *);
383e0970
J
3353extern void syms_of_search (void);
3354extern void clear_regexp_cache (void);
3cfe6dfd 3355
464d5a5e 3356/* Defined in minibuf.c. */
3cfe6dfd 3357
e6cba650 3358extern Lisp_Object Qcompletion_ignore_case;
99f3388e 3359extern Lisp_Object Vminibuffer_list;
3cfe6dfd 3360extern Lisp_Object last_minibuf_string;
62f19c19 3361extern Lisp_Object get_minibuffer (EMACS_INT);
383e0970
J
3362extern void init_minibuf_once (void);
3363extern void syms_of_minibuf (void);
3cfe6dfd 3364
464d5a5e 3365/* Defined in callint.c. */
3cfe6dfd 3366
29208e82 3367extern Lisp_Object Qminus, Qplus;
99f3388e 3368extern Lisp_Object Qwhen;
6e65b9cc 3369extern Lisp_Object Qmouse_leave_buffer_hook;
383e0970 3370extern void syms_of_callint (void);
3cfe6dfd 3371
464d5a5e 3372/* Defined in casefiddle.c. */
3cfe6dfd 3373
99f3388e 3374extern Lisp_Object Qidentity;
383e0970
J
3375extern void syms_of_casefiddle (void);
3376extern void keys_of_casefiddle (void);
3cfe6dfd 3377
464d5a5e 3378/* Defined in casetab.c. */
1747fb16 3379
383e0970
J
3380extern void init_casetab_once (void);
3381extern void syms_of_casetab (void);
1747fb16 3382
464d5a5e 3383/* Defined in keyboard.c. */
3cfe6dfd 3384
54cd1651 3385extern Lisp_Object echo_message_buffer;
417750de 3386extern struct kboard *echo_kboard;
383e0970 3387extern void cancel_echoing (void);
1425dcb6 3388extern Lisp_Object Qdisabled, QCfilter;
955cbe7b
PE
3389extern Lisp_Object Qup, Qdown, Qbottom;
3390extern Lisp_Object Qtop;
464d5a5e 3391extern Lisp_Object last_undo_boundary;
9fa1de30 3392extern bool input_pending;
383e0970
J
3393extern Lisp_Object menu_bar_items (Lisp_Object);
3394extern Lisp_Object tool_bar_items (Lisp_Object, int *);
383e0970 3395extern void discard_mouse_events (void);
4d7e6e51
PE
3396#ifdef USABLE_SIGIO
3397void handle_input_available_signal (int);
3398#endif
58555d81 3399extern Lisp_Object pending_funcalls;
9fa1de30
PE
3400extern bool detect_input_pending (void);
3401extern bool detect_input_pending_ignore_squeezables (void);
3402extern bool detect_input_pending_run_timers (bool);
383e0970 3403extern void safe_run_hooks (Lisp_Object);
a8fe7202 3404extern void cmd_error_internal (Lisp_Object, const char *);
383e0970
J
3405extern Lisp_Object command_loop_1 (void);
3406extern Lisp_Object recursive_edit_1 (void);
3407extern void record_auto_save (void);
4752793e 3408extern void force_auto_save_soon (void);
383e0970
J
3409extern void init_keyboard (void);
3410extern void syms_of_keyboard (void);
3411extern void keys_of_keyboard (void);
3cfe6dfd 3412
464d5a5e 3413/* Defined in indent.c. */
d311d28c 3414extern ptrdiff_t current_column (void);
383e0970 3415extern void invalidate_current_column (void);
578098f3 3416extern bool indented_beyond_p (ptrdiff_t, ptrdiff_t, EMACS_INT);
383e0970 3417extern void syms_of_indent (void);
3cfe6dfd 3418
464d5a5e 3419/* Defined in frame.c. */
9fb0c957 3420extern Lisp_Object Qonly, Qnone;
362fb47a 3421extern Lisp_Object Qvisible;
383e0970
J
3422extern void store_frame_param (struct frame *, Lisp_Object, Lisp_Object);
3423extern void store_in_alist (Lisp_Object *, Lisp_Object, Lisp_Object);
3424extern Lisp_Object do_switch_frame (Lisp_Object, int, int, Lisp_Object);
81626931 3425#if HAVE_NS
383e0970 3426extern Lisp_Object get_frame_param (struct frame *, Lisp_Object);
81626931 3427#endif
383e0970 3428extern void frames_discard_buffer (Lisp_Object);
383e0970 3429extern void syms_of_frame (void);
3cfe6dfd 3430
464d5a5e 3431/* Defined in emacs.c. */
99f3388e
DN
3432extern char **initial_argv;
3433extern int initial_argc;
5e617bc2 3434#if defined (HAVE_X_WINDOWS) || defined (HAVE_NS)
1882aa38 3435extern bool display_arg;
89dc303e 3436#endif
a8fe7202 3437extern Lisp_Object decode_env_path (const char *, const char *);
2c668b9a 3438extern Lisp_Object empty_unibyte_string, empty_multibyte_string;
e6cba650 3439extern Lisp_Object Qfile_name_handler_alist;
4d7e6e51 3440extern _Noreturn void terminate_due_to_signal (int, int);
6c07aac2 3441extern Lisp_Object Qkill_emacs;
aa15c6bb
JB
3442#ifdef WINDOWSNT
3443extern Lisp_Object Vlibrary_cache;
3444#endif
68c45bf0 3445#if HAVE_SETLOCALE
383e0970
J
3446void fixup_locale (void);
3447void synchronize_system_messages_locale (void);
3448void synchronize_system_time_locale (void);
68c45bf0
PE
3449#else
3450#define setlocale(category, locale)
3451#define fixup_locale()
ca9c0567
PE
3452#define synchronize_system_messages_locale()
3453#define synchronize_system_time_locale()
68c45bf0 3454#endif
1882aa38 3455extern void shut_down_emacs (int, Lisp_Object);
ff808935 3456
1882aa38
PE
3457/* True means don't do interactive redisplay and don't change tty modes. */
3458extern bool noninteractive;
3459
3460/* True means remove site-lisp directories from load-path. */
3461extern bool no_site_lisp;
66b7b0fe 3462
ff808935
DN
3463/* Pipe used to send exit notification to the daemon parent at
3464 startup. */
3465extern int daemon_pipe[2];
3466#define IS_DAEMON (daemon_pipe[1] != 0)
3467
1882aa38
PE
3468/* True if handling a fatal error already. */
3469extern bool fatal_error_in_progress;
3470
3471/* True means don't do use window-system-specific display code. */
3472extern bool inhibit_window_system;
3473/* True means that a filter or a sentinel is running. */
3474extern bool running_asynch_code;
3cfe6dfd 3475
6c60eb9f 3476/* Defined in process.c. */
89dc303e 3477extern Lisp_Object QCtype, Qlocal;
6efad63b 3478extern Lisp_Object Qprocessp;
383e0970 3479extern void kill_buffer_processes (Lisp_Object);
9fa1de30 3480extern int wait_reading_process_output (intmax_t, int, int, bool,
383e0970
J
3481 Lisp_Object,
3482 struct Lisp_Process *,
3483 int);
f1dd8073
PE
3484/* Max value for the first argument of wait_reading_process_output. */
3485#if __GNUC__ == 3 || (__GNUC__ == 4 && __GNUC_MINOR__ <= 5)
3486/* Work around a bug in GCC 3.4.2, known to be fixed in GCC 4.6.3.
3487 The bug merely causes a bogus warning, but the warning is annoying. */
3488# define WAIT_READING_MAX min (TYPE_MAXIMUM (time_t), INTMAX_MAX)
3489#else
3490# define WAIT_READING_MAX INTMAX_MAX
3491#endif
383e0970
J
3492extern void add_keyboard_wait_descriptor (int);
3493extern void delete_keyboard_wait_descriptor (int);
4475bec4 3494#ifdef HAVE_GPM
383e0970
J
3495extern void add_gpm_wait_descriptor (int);
3496extern void delete_gpm_wait_descriptor (int);
4475bec4 3497#endif
383e0970 3498extern void close_process_descs (void);
b82da769 3499extern void init_process_emacs (void);
383e0970
J
3500extern void syms_of_process (void);
3501extern void setup_process_coding_systems (Lisp_Object);
3cfe6dfd 3502
6bd8c144 3503#ifndef DOS_NT
845ca893 3504 _Noreturn
6bd8c144 3505#endif
2f221583 3506extern int child_setup (int, int, int, char **, bool, Lisp_Object);
383e0970
J
3507extern void init_callproc_1 (void);
3508extern void init_callproc (void);
3509extern void set_initial_environment (void);
3510extern void syms_of_callproc (void);
3cfe6dfd 3511
e7032e7c 3512/* Defined in doc.c. */
99f3388e 3513extern Lisp_Object Qfunction_documentation;
383e0970 3514extern Lisp_Object read_doc_string (Lisp_Object);
a08d4ba7 3515extern Lisp_Object get_doc_string (Lisp_Object, bool, bool);
383e0970 3516extern void syms_of_doc (void);
a08d4ba7 3517extern int read_bytecode_char (bool);
3cfe6dfd 3518
e7032e7c 3519/* Defined in bytecode.c. */
383e0970 3520extern void syms_of_bytecode (void);
35c7a974 3521extern struct byte_stack *byte_stack_list;
244ed907 3522#if BYTE_MARK_STACK
383e0970 3523extern void mark_byte_stack (void);
b286858c 3524#endif
383e0970 3525extern void unmark_byte_stack (void);
0ee81a0c 3526extern Lisp_Object exec_byte_code (Lisp_Object, Lisp_Object, Lisp_Object,
f66c7cf8 3527 Lisp_Object, ptrdiff_t, Lisp_Object *);
3cfe6dfd 3528
e7032e7c 3529/* Defined in macros.c. */
383e0970
J
3530extern void init_macros (void);
3531extern void syms_of_macros (void);
3cfe6dfd 3532
e7032e7c 3533/* Defined in undo.c. */
89dc303e 3534extern Lisp_Object Qapply;
a387611b 3535extern Lisp_Object Qinhibit_read_only;
383e0970 3536extern void truncate_undo_list (struct buffer *);
d311d28c
PE
3537extern void record_marker_adjustment (Lisp_Object, ptrdiff_t);
3538extern void record_insert (ptrdiff_t, ptrdiff_t);
3539extern void record_delete (ptrdiff_t, Lisp_Object);
383e0970 3540extern void record_first_change (void);
d311d28c
PE
3541extern void record_change (ptrdiff_t, ptrdiff_t);
3542extern void record_property_change (ptrdiff_t, ptrdiff_t,
c8a66ab8 3543 Lisp_Object, Lisp_Object,
383e0970
J
3544 Lisp_Object);
3545extern void syms_of_undo (void);
e7032e7c 3546/* Defined in textprop.c. */
5f6bf5fe 3547extern Lisp_Object Qfont, Qmouse_face;
c2d8811c 3548extern Lisp_Object Qinsert_in_front_hooks, Qinsert_behind_hooks;
e6cba650
DN
3549extern Lisp_Object Qfront_sticky, Qrear_nonsticky;
3550extern Lisp_Object Qminibuffer_prompt;
3551
383e0970 3552extern void report_interval_modification (Lisp_Object, Lisp_Object);
8537f1cb 3553
e7032e7c 3554/* Defined in menu.c. */
383e0970 3555extern void syms_of_menu (void);
febcacdd 3556
e7032e7c 3557/* Defined in xmenu.c. */
383e0970 3558extern void syms_of_xmenu (void);
526a2be7 3559
e7032e7c 3560/* Defined in termchar.h. */
28d7d09f
KL
3561struct tty_display_info;
3562
e7032e7c 3563/* Defined in termhooks.h. */
6ed8eeff 3564struct terminal;
28d440ab 3565
e7032e7c 3566/* Defined in sysdep.c. */
2412f586 3567#ifndef HAVE_GET_CURRENT_DIR_NAME
383e0970 3568extern char *get_current_dir_name (void);
2b94e598 3569#endif
383e0970 3570extern void stuff_char (char c);
322aea6d 3571extern void init_foreground_group (void);
383e0970
J
3572extern void init_sigio (int);
3573extern void sys_subshell (void);
3574extern void sys_suspend (void);
3575extern void discard_tty_input (void);
b8956427
PE
3576extern void block_tty_out_signal (void);
3577extern void unblock_tty_out_signal (void);
383e0970
J
3578extern void init_sys_modes (struct tty_display_info *);
3579extern void reset_sys_modes (struct tty_display_info *);
3580extern void init_all_sys_modes (void);
3581extern void reset_all_sys_modes (void);
5994c183 3582extern void flush_pending_output (int) ATTRIBUTE_CONST;
383e0970
J
3583extern void child_setup_tty (int);
3584extern void setup_pty (int);
3585extern int set_window_size (int, int, int);
ede49d71 3586extern EMACS_INT get_random (void);
0e23ef9d
PE
3587extern void seed_random (void *, ptrdiff_t);
3588extern void init_random (void);
cf29dd84 3589extern void emacs_backtrace (int);
1088b922 3590extern _Noreturn void emacs_abort (void) NO_INLINE;
383e0970
J
3591extern int emacs_open (const char *, int, int);
3592extern int emacs_close (int);
d311d28c
PE
3593extern ptrdiff_t emacs_read (int, char *, ptrdiff_t);
3594extern ptrdiff_t emacs_write (int, const char *, ptrdiff_t);
526a2be7 3595
383e0970
J
3596extern void unlock_all_files (void);
3597extern void lock_file (Lisp_Object);
3598extern void unlock_file (Lisp_Object);
3599extern void unlock_buffer (struct buffer *);
3600extern void syms_of_filelock (void);
15b0ced5 3601
e7032e7c 3602/* Defined in sound.c. */
383e0970 3603extern void syms_of_sound (void);
46abf440 3604
e7032e7c 3605/* Defined in category.c. */
383e0970
J
3606extern void init_category_once (void);
3607extern Lisp_Object char_category_set (int);
3608extern void syms_of_category (void);
46abf440 3609
e7032e7c 3610/* Defined in ccl.c. */
383e0970 3611extern void syms_of_ccl (void);
46abf440 3612
e7032e7c 3613/* Defined in dired.c. */
383e0970
J
3614extern void syms_of_dired (void);
3615extern Lisp_Object directory_files_internal (Lisp_Object, Lisp_Object,
3616 Lisp_Object, Lisp_Object,
86ec63ba 3617 bool, Lisp_Object);
46abf440 3618
e7032e7c 3619/* Defined in term.c. */
e6cba650 3620extern int *char_ins_del_vector;
383e0970 3621extern void syms_of_term (void);
845ca893
PE
3622extern _Noreturn void fatal (const char *msgid, ...)
3623 ATTRIBUTE_FORMAT_PRINTF (1, 2);
46abf440 3624
e7032e7c 3625/* Defined in terminal.c. */
383e0970 3626extern void syms_of_terminal (void);
ed8dad6b 3627
e7032e7c 3628/* Defined in font.c. */
383e0970
J
3629extern void syms_of_font (void);
3630extern void init_font (void);
b86cfd28 3631
4f48f1ab 3632#ifdef HAVE_WINDOW_SYSTEM
e7032e7c 3633/* Defined in fontset.c. */
383e0970 3634extern void syms_of_fontset (void);
4f48f1ab 3635
e7032e7c 3636/* Defined in xfns.c, w32fns.c, or macfns.c. */
99f3388e 3637extern Lisp_Object Qfont_param;
46abf440
AS
3638#endif
3639
477f1e50
EZ
3640#ifdef WINDOWSNT
3641/* Defined on w32notify.c. */
3642extern void syms_of_w32notify (void);
3643#endif
3644
81606b10
RS
3645/* Defined in inotify.c */
3646#ifdef HAVE_INOTIFY
3647extern void syms_of_inotify (void);
3648#endif
3649
e7032e7c 3650/* Defined in xfaces.c. */
955cbe7b
PE
3651extern Lisp_Object Qdefault, Qtool_bar, Qfringe;
3652extern Lisp_Object Qheader_line, Qscroll_bar, Qcursor;
3653extern Lisp_Object Qmode_line_inactive;
e6cba650 3654extern Lisp_Object Qface;
89dc303e 3655extern Lisp_Object Qnormal;
0e9c8657
JB
3656extern Lisp_Object QCfamily, QCweight, QCslant;
3657extern Lisp_Object QCheight, QCname, QCwidth, QCforeground, QCbackground;
a411ac43
PE
3658extern Lisp_Object Qextra_light, Qlight, Qsemi_light, Qsemi_bold;
3659extern Lisp_Object Qbold, Qextra_bold, Qultra_bold;
3660extern Lisp_Object Qoblique, Qitalic;
99f3388e 3661extern Lisp_Object Vface_alternative_font_family_alist;
99f3388e 3662extern Lisp_Object Vface_alternative_font_registry_alist;
383e0970 3663extern void syms_of_xfaces (void);
46abf440
AS
3664
3665#ifdef HAVE_X_WINDOWS
e7032e7c 3666/* Defined in xfns.c. */
383e0970 3667extern void syms_of_xfns (void);
46abf440 3668
e7032e7c 3669/* Defined in xsmfns.c. */
383e0970 3670extern void syms_of_xsmfns (void);
e02207d4 3671
e7032e7c 3672/* Defined in xselect.c. */
383e0970 3673extern void syms_of_xselect (void);
46abf440 3674
e7032e7c 3675/* Defined in xterm.c. */
383e0970 3676extern void syms_of_xterm (void);
4f48f1ab 3677#endif /* HAVE_X_WINDOWS */
4baa6f88 3678
7af07b96 3679#ifdef HAVE_WINDOW_SYSTEM
e7032e7c 3680/* Defined in xterm.c, nsterm.m, w32term.c. */
7af07b96
AS
3681extern char *x_get_keysym_name (int);
3682#endif /* HAVE_WINDOW_SYSTEM */
3683
381408e2 3684#ifdef HAVE_LIBXML2
e7032e7c 3685/* Defined in xml.c. */
381408e2 3686extern void syms_of_xml (void);
9078ead6 3687extern void xml_cleanup_parser (void);
381408e2
LMI
3688#endif
3689
4d0ac3d7 3690#ifdef HAVE_MENUS
07b87a10 3691/* Defined in (x|w32)fns.c, nsfns.m... */
383e0970 3692extern int have_menus_p (void);
4d0ac3d7 3693#endif
b86cfd28
EZ
3694
3695#ifdef HAVE_DBUS
e7032e7c 3696/* Defined in dbusbind.c. */
383e0970 3697void syms_of_dbusbind (void);
b86cfd28 3698#endif
36e053eb 3699
ad942b63
SM
3700
3701/* Defined in profiler.c. */
6521894d 3702extern bool profiler_memory_running;
c2d7786e 3703extern void malloc_probe (size_t);
c2d7786e
TM
3704extern void syms_of_profiler (void);
3705
ad942b63 3706
36e053eb 3707#ifdef DOS_NT
e7032e7c 3708/* Defined in msdos.c, w32.c. */
36e053eb
DN
3709extern char *emacs_root_dir (void);
3710#endif /* DOS_NT */
83925baa 3711\f
1882aa38 3712/* True means Emacs has already been initialized.
3cfe6dfd 3713 Used during startup to detect startup of dumped Emacs. */
1882aa38 3714extern bool initialized;
3cfe6dfd 3715
9fa1de30
PE
3716/* True means ^G can quit instantly. */
3717extern bool immediate_quit;
3cfe6dfd 3718
261cb4bb 3719extern void *xmalloc (size_t);
23f86fce 3720extern void *xzalloc (size_t);
261cb4bb
PE
3721extern void *xrealloc (void *, size_t);
3722extern void xfree (void *);
0065d054
PE
3723extern void *xnmalloc (ptrdiff_t, ptrdiff_t);
3724extern void *xnrealloc (void *, ptrdiff_t, ptrdiff_t);
3725extern void *xpalloc (void *, ptrdiff_t *, ptrdiff_t, ptrdiff_t, ptrdiff_t);
074b6efe 3726
383e0970 3727extern char *xstrdup (const char *);
5745a7df 3728extern void xputenv (const char *);
3cfe6dfd 3729
a8fe7202 3730extern char *egetenv (const char *);
e98227af 3731
5d6be39f 3732/* Set up the name of the machine we're running on. */
383e0970 3733extern void init_system_name (void);
881a5a80 3734
d7a0a7c9
PE
3735/* Return the absolute value of X. X should be a signed integer
3736 expression without side effects, and X's absolute value should not
3737 exceed the maximum for its promoted type. This is called 'eabs'
3738 because 'abs' is reserved by the C standard. */
555b10b0 3739#define eabs(x) ((x) < 0 ? -(x) : (x))
096e8667 3740
53ede3f4
GM
3741/* Return a fixnum or float, depending on whether VAL fits in a Lisp
3742 fixnum. */
3743
3744#define make_fixnum_or_float(val) \
cbeff735 3745 (FIXNUM_OVERFLOW_P (val) ? make_float (val) : make_number (val))
6b61353c 3746
79518a8d
KS
3747/* SAFE_ALLOCA normally allocates memory on the stack, but if size is
3748 larger than MAX_ALLOCA, use xmalloc to avoid overflowing the stack. */
3749
e7032e7c 3750enum MAX_ALLOCA { MAX_ALLOCA = 16 * 1024 };
79518a8d
KS
3751
3752extern Lisp_Object safe_alloca_unwind (Lisp_Object);
98c6f1e3 3753extern void *record_xmalloc (size_t);
79518a8d
KS
3754
3755#define USE_SAFE_ALLOCA \
2f221583 3756 ptrdiff_t sa_count = SPECPDL_INDEX (); bool sa_must_free = 0
79518a8d 3757
a9e6bacc
KS
3758/* SAFE_ALLOCA allocates a simple buffer. */
3759
98c6f1e3
PE
3760#define SAFE_ALLOCA(size) ((size) < MAX_ALLOCA \
3761 ? alloca (size) \
3762 : (sa_must_free = 1, record_xmalloc (size)))
79518a8d 3763
0065d054
PE
3764/* SAFE_NALLOCA sets BUF to a newly allocated array of MULTIPLIER *
3765 NITEMS items, each of the same type as *BUF. MULTIPLIER must
3766 positive. The code is tuned for MULTIPLIER being a constant. */
3767
468afbac
DA
3768#define SAFE_NALLOCA(buf, multiplier, nitems) \
3769 do { \
3770 if ((nitems) <= MAX_ALLOCA / sizeof *(buf) / (multiplier)) \
3771 (buf) = alloca (sizeof *(buf) * (multiplier) * (nitems)); \
3772 else \
0065d054
PE
3773 { \
3774 (buf) = xnmalloc (nitems, sizeof *(buf) * (multiplier)); \
3775 sa_must_free = 1; \
3776 record_unwind_protect (safe_alloca_unwind, \
468afbac 3777 make_save_pointer (buf)); \
0065d054
PE
3778 } \
3779 } while (0)
3780
a9e6bacc
KS
3781/* SAFE_FREE frees xmalloced memory and enables GC as needed. */
3782
c33188d9 3783#define SAFE_FREE() \
79518a8d 3784 do { \
c33188d9
KS
3785 if (sa_must_free) { \
3786 sa_must_free = 0; \
79518a8d 3787 unbind_to (sa_count, Qnil); \
c33188d9 3788 } \
79518a8d
KS
3789 } while (0)
3790
3791
5f5d6c62
KS
3792/* SAFE_ALLOCA_LISP allocates an array of Lisp_Objects. */
3793
663e2b3f
DA
3794#define SAFE_ALLOCA_LISP(buf, nelt) \
3795 do { \
3796 if ((nelt) < MAX_ALLOCA / word_size) \
3797 buf = alloca ((nelt) * word_size); \
3798 else if ((nelt) < min (PTRDIFF_MAX, SIZE_MAX) / word_size) \
3799 { \
3800 Lisp_Object arg_; \
3801 buf = xmalloc ((nelt) * word_size); \
468afbac 3802 arg_ = make_save_value ("pi", buf, nelt); \
73ebd38f 3803 XSAVE_VALUE (arg_)->area = 1; \
663e2b3f
DA
3804 sa_must_free = 1; \
3805 record_unwind_protect (safe_alloca_unwind, arg_); \
3806 } \
3807 else \
3808 memory_full (SIZE_MAX); \
5f5d6c62
KS
3809 } while (0)
3810
79518a8d 3811
29208e82
TT
3812#include "globals.h"
3813
dac616ff
DA
3814/* Check whether it's time for GC, and run it if so. */
3815
f162bcc3 3816LISP_INLINE void
dac616ff
DA
3817maybe_gc (void)
3818{
3819 if ((consing_since_gc > gc_cons_threshold
3820 && consing_since_gc > gc_relative_threshold)
3821 || (!NILP (Vmemory_full)
3822 && consing_since_gc > memory_full_cons_threshold))
3823 Fgarbage_collect ();
3824}
3825
e1f29348
BR
3826LISP_INLINE int
3827functionp (Lisp_Object object)
3828{
3829 if (SYMBOLP (object) && !NILP (Ffboundp (object)))
3830 {
3831 object = Findirect_function (object, Qt);
3832
3833 if (CONSP (object) && EQ (XCAR (object), Qautoload))
3834 {
3835 /* Autoloaded symbols are functions, except if they load
3836 macros or keymaps. */
3837 int i;
3838 for (i = 0; i < 4 && CONSP (object); i++)
3839 object = XCDR (object);
3840
3841 return ! (CONSP (object) && !NILP (XCAR (object)));
3842 }
3843 }
3844
3845 if (SUBRP (object))
3846 return XSUBR (object)->max_args != UNEVALLED;
3847 else if (COMPILEDP (object))
3848 return 1;
3849 else if (CONSP (object))
3850 {
3851 Lisp_Object car = XCAR (object);
3852 return EQ (car, Qlambda) || EQ (car, Qclosure);
3853 }
3854 else
3855 return 0;
3856}
3857
f162bcc3
PE
3858INLINE_HEADER_END
3859
6b61353c 3860#endif /* EMACS_LISP_H */