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