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