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