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