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