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