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