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