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