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