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