Remove `LISP_FLOAT_TYPE' and `standalone'.
[bpt/emacs.git] / src / lisp.h
CommitLineData
3cfe6dfd 1/* Fundamental definitions for GNU Emacs Lisp interpreter.
f05d7ea2
GM
2 Copyright (C) 1985,86,87,93,94,95,97,98,1999,2000
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
5010d3b8
GM
22/* Declare the prototype for a general external function. */
23#if defined (__STDC__) || defined (WINDOWSNT)
24#define P_(proto) proto
25#else
26#define P_(proto) ()
27#endif
28
3cfe6dfd 29
ce99fd65 30/* These are default choices for the types to use. */
68c45bf0
PE
31#ifdef _LP64
32#ifndef EMACS_INT
33#define EMACS_INT long
34#define BITS_PER_EMACS_INT BITS_PER_LONG
35#endif
36#ifndef EMACS_UINT
37#define EMACS_UINT unsigned long
38#endif
39#else /* not _LP64 */
ce99fd65
RS
40#ifndef EMACS_INT
41#define EMACS_INT int
1747fb16 42#define BITS_PER_EMACS_INT BITS_PER_INT
ce99fd65
RS
43#endif
44#ifndef EMACS_UINT
45#define EMACS_UINT unsigned int
46#endif
68c45bf0 47#endif
ce99fd65 48
99a3d506 49/* Define the fundamental Lisp data structures. */
3cfe6dfd 50
99a3d506 51/* This is the set of Lisp data types. */
3cfe6dfd
JB
52
53enum Lisp_Type
54 {
99a3d506 55 /* Integer. XINT (obj) is the integer value. */
3cfe6dfd
JB
56 Lisp_Int,
57
99a3d506 58 /* Symbol. XSYMBOL (object) points to a struct Lisp_Symbol. */
3cfe6dfd
JB
59 Lisp_Symbol,
60
84d1833e
KH
61 /* Miscellaneous. XMISC (object) points to a union Lisp_Misc,
62 whose first member indicates the subtype. */
63 Lisp_Misc,
3cfe6dfd
JB
64
65 /* String. XSTRING (object) points to a struct Lisp_String.
99a3d506 66 The length of the string, and its contents, are stored therein. */
3cfe6dfd
JB
67 Lisp_String,
68
b5088f80 69 /* Vector of Lisp objects, or something resembling it.
7c06ac2b 70 XVECTOR (object) points to a struct Lisp_Vector, which contains
b5088f80
KH
71 the size and contents. The size field also contains the type
72 information, if it's not a real vector object. */
73 Lisp_Vectorlike,
3cfe6dfd 74
99a3d506 75 /* Cons. XCONS (object) points to a struct Lisp_Cons. */
3cfe6dfd
JB
76 Lisp_Cons,
77
20280af7 78 Lisp_Float,
4d1207f6
RS
79
80 /* This is not a type code. It is for range checking. */
e2ba196c 81 Lisp_Type_Limit
3cfe6dfd
JB
82 };
83
84d1833e 84/* This is the set of datatypes that share a common structure.
c98adc1b
KH
85 The first member of the structure is a type code from this set.
86 The enum values are arbitrary, but we'll use large numbers to make it
87 more likely that we'll spot the error if a random word in memory is
88 mistakenly interpreted as a Lisp_Misc. */
1c4ca5a3
KH
89enum Lisp_Misc_Type
90 {
c98adc1b 91 Lisp_Misc_Free = 0x5eab,
84d1833e 92 Lisp_Misc_Marker,
ee4c9ce4
KH
93 Lisp_Misc_Intfwd,
94 Lisp_Misc_Boolfwd,
95 Lisp_Misc_Objfwd,
7d65f1c2
KH
96 Lisp_Misc_Buffer_Objfwd,
97 Lisp_Misc_Buffer_Local_Value,
ce7d8eec 98 Lisp_Misc_Some_Buffer_Local_Value,
99a3d506 99 Lisp_Misc_Overlay,
32462604 100 Lisp_Misc_Kboard_Objfwd,
99a3d506
RS
101 /* Currently floats are not a misc type,
102 but let's define this in case we want to change that. */
103 Lisp_Misc_Float,
104 /* This is not a type code. It is for range checking. */
105 Lisp_Misc_Limit
1c4ca5a3
KH
106 };
107
e2ba196c
KH
108/* These values are overridden by the m- file on some machines. */
109#ifndef VALBITS
68c45bf0 110#define VALBITS (BITS_PER_EMACS_INT - 4)
e2ba196c
KH
111#endif
112
113#ifndef GCTYPEBITS
114#define GCTYPEBITS 3
115#endif
116
d0ee1a95
GM
117#if 0 /* This doesn't work on some systems that don't allow enumerators
118 > INT_MAX, and it won't work for long long EMACS_INT. These
119 values are now found in emacs.c as EMACS_INT variables. */
120
c9ddd39d
KH
121/* Make these values available in GDB, which sees enums but not macros. */
122
123enum gdb_lisp_params
124{
125 gdb_valbits = VALBITS,
126 gdb_gctypebits = GCTYPEBITS,
68be917d 127 gdb_emacs_intbits = sizeof (EMACS_INT) * BITS_PER_CHAR,
c9ddd39d
KH
128#ifdef DATA_SEG_BITS
129 gdb_data_seg_bits = DATA_SEG_BITS
130#else
131 gdb_data_seg_bits = 0
132#endif
133};
134
d0ee1a95
GM
135#endif /* 0 */
136
3cfe6dfd
JB
137#ifndef NO_UNION_TYPE
138
c451d7b1 139#ifndef WORDS_BIG_ENDIAN
3cfe6dfd
JB
140
141/* Definition of Lisp_Object for little-endian machines. */
142
143typedef
144union Lisp_Object
145 {
146 /* Used for comparing two Lisp_Objects;
99a3d506 147 also, positive integers can be accessed fast this way. */
3cfe6dfd
JB
148 int i;
149
150 struct
151 {
e2ba196c
KH
152 int val: VALBITS;
153 int type: GCTYPEBITS+1;
3cfe6dfd
JB
154 } s;
155 struct
156 {
e2ba196c
KH
157 unsigned int val: VALBITS;
158 int type: GCTYPEBITS+1;
3cfe6dfd
JB
159 } u;
160 struct
161 {
e2ba196c
KH
162 unsigned int val: VALBITS;
163 enum Lisp_Type type: GCTYPEBITS;
3cfe6dfd
JB
164 /* The markbit is not really part of the value of a Lisp_Object,
165 and is always zero except during garbage collection. */
166 unsigned int markbit: 1;
167 } gu;
168 }
169Lisp_Object;
170
c451d7b1 171#else /* If WORDS_BIG_ENDIAN */
3cfe6dfd
JB
172
173typedef
174union Lisp_Object
175 {
176 /* Used for comparing two Lisp_Objects;
99a3d506 177 also, positive integers can be accessed fast this way. */
3cfe6dfd
JB
178 int i;
179
180 struct
181 {
e2ba196c
KH
182 int type: GCTYPEBITS+1;
183 int val: VALBITS;
3cfe6dfd
JB
184 } s;
185 struct
186 {
e2ba196c
KH
187 int type: GCTYPEBITS+1;
188 unsigned int val: VALBITS;
3cfe6dfd
JB
189 } u;
190 struct
191 {
192 /* The markbit is not really part of the value of a Lisp_Object,
193 and is always zero except during garbage collection. */
194 unsigned int markbit: 1;
e2ba196c
KH
195 enum Lisp_Type type: GCTYPEBITS;
196 unsigned int val: VALBITS;
3cfe6dfd
JB
197 } gu;
198 }
199Lisp_Object;
200
c451d7b1 201#endif /* WORDS_BIG_ENDIAN */
3cfe6dfd
JB
202
203#endif /* NO_UNION_TYPE */
204
205
1c5ca8b6 206/* If union type is not wanted, define Lisp_Object as just a number. */
3cfe6dfd
JB
207
208#ifdef NO_UNION_TYPE
627a9502 209#define Lisp_Object EMACS_INT
1c5ca8b6 210#endif /* NO_UNION_TYPE */
3cfe6dfd 211
3cfe6dfd 212#ifndef VALMASK
627a9502 213#define VALMASK ((((EMACS_INT) 1)<<VALBITS) - 1)
3cfe6dfd 214#endif
627a9502 215#define GCTYPEMASK ((((EMACS_INT) 1)<<GCTYPEBITS) - 1)
846d69ac
RS
216
217/* Two flags that are set during GC. On some machines, these flags
218 are defined differently by the m- file. */
219
220/* This is set in the car of a cons and in the plist slot of a symbol
221 to indicate it is marked. Likewise in the plist slot of an interval,
222 the chain slot of a marker, the type slot of a float, and the name
223 slot of a buffer.
224
225 In strings, this bit in the size field indicates that the string
226 is a "large" one, one which was separately malloc'd
227 rather than being part of a string block. */
228
627a9502 229#ifndef MARKBIT
68c45bf0 230#define MARKBIT ((EMACS_INT) ((EMACS_UINT) 1 << (VALBITS + GCTYPEBITS)))
627a9502 231#endif /*MARKBIT */
3cfe6dfd 232
846d69ac
RS
233/* In the size word of a vector, this bit means the vector has been marked.
234 In the size word of a large string, likewise. */
235
236#ifndef ARRAY_MARK_FLAG
237#define ARRAY_MARK_FLAG ((MARKBIT >> 1) & ~MARKBIT)
238#endif /* no ARRAY_MARK_FLAG */
239
b5088f80
KH
240/* In the size word of a struct Lisp_Vector, this bit means it's really
241 some other vector-like object. */
242#ifndef PSEUDOVECTOR_FLAG
243#define PSEUDOVECTOR_FLAG ((ARRAY_MARK_FLAG >> 1) & ~ARRAY_MARK_FLAG)
244#endif
245
303a5c93 246/* In a pseudovector, the size field actually contains a word with one
b5088f80
KH
247 PSEUDOVECTOR_FLAG bit set, and exactly one of the following bits to
248 indicate the actual type. */
99a3d506
RS
249enum pvec_type
250{
251 PVEC_NORMAL_VECTOR = 0,
99a3d506
RS
252 PVEC_PROCESS = 0x200,
253 PVEC_FRAME = 0x400,
254 PVEC_COMPILED = 0x800,
255 PVEC_WINDOW = 0x1000,
256 PVEC_WINDOW_CONFIGURATION = 0x2000,
257 PVEC_SUBR = 0x4000,
608ff985
RS
258 PVEC_CHAR_TABLE = 0x8000,
259 PVEC_BOOL_VECTOR = 0x10000,
260 PVEC_BUFFER = 0x20000,
5010d3b8 261 PVEC_HASH_TABLE = 0x40000,
cee971ad
GM
262 PVEC_TYPE_MASK = 0x7fe00
263
264#if 0 /* This is used to make the value of PSEUDOVECTOR_FLAG available to
265 GDB. It doesn't work on OS Alpha. Moved to a variable in
266 emacs.c. */
e3d48049 267 PVEC_FLAG = PSEUDOVECTOR_FLAG
cee971ad 268#endif
99a3d506 269};
b5088f80
KH
270
271/* For convenience, we also store the number of elements in these bits. */
608ff985 272#define PSEUDOVECTOR_SIZE_MASK 0x1ff
3cfe6dfd
JB
273\f
274/* These macros extract various sorts of values from a Lisp_Object.
275 For example, if tem is a Lisp_Object whose type is Lisp_Cons,
99a3d506 276 XCONS (tem) is the struct Lisp_Cons * pointing to the memory for that cons. */
3cfe6dfd
JB
277
278#ifdef NO_UNION_TYPE
279
280/* One need to override this if there must be high bits set in data space
281 (doing the result of the below & ((1 << (GCTYPE + 1)) - 1) would work
282 on all machines, but would penalise machines which don't need it)
283 */
284#ifndef XTYPE
285#define XTYPE(a) ((enum Lisp_Type) ((a) >> VALBITS))
286#endif
287
288#ifndef XSETTYPE
627a9502 289#define XSETTYPE(a, b) ((a) = XUINT (a) | ((EMACS_INT)(b) << VALBITS))
3cfe6dfd
JB
290#endif
291
221f4ef3
KH
292/* For integers known to be positive, XFASTINT provides fast retrieval
293 and XSETFASTINT provides fast storage. This takes advantage of the
294 fact that Lisp_Int is 0. */
e43ec785 295#define XFASTINT(a) ((a) + 0)
221f4ef3 296#define XSETFASTINT(a, b) ((a) = (b))
3cfe6dfd
JB
297
298/* Extract the value of a Lisp_Object as a signed integer. */
299
300#ifndef XINT /* Some machines need to do this differently. */
68c45bf0 301#define XINT(a) (((a) << (BITS_PER_EMACS_INT-VALBITS)) >> (BITS_PER_EMACS_INT-VALBITS))
3cfe6dfd
JB
302#endif
303
304/* Extract the value as an unsigned integer. This is a basis
305 for extracting it as a pointer to a structure in storage. */
306
307#ifndef XUINT
308#define XUINT(a) ((a) & VALMASK)
309#endif
310
311#ifndef XPNTR
312#ifdef HAVE_SHM
313/* In this representation, data is found in two widely separated segments. */
29eab336 314extern int pure_size;
3cfe6dfd 315#define XPNTR(a) \
29eab336 316 (XUINT (a) | (XUINT (a) > pure_size ? DATA_SEG_BITS : PURE_SEG_BITS))
3cfe6dfd
JB
317#else /* not HAVE_SHM */
318#ifdef DATA_SEG_BITS
319/* This case is used for the rt-pc.
320 In the diffs I was given, it checked for ptr = 0
321 and did not adjust it in that case.
322 But I don't think that zero should ever be found
323 in a Lisp object whose data type says it points to something. */
324#define XPNTR(a) (XUINT (a) | DATA_SEG_BITS)
325#else
326#define XPNTR(a) XUINT (a)
327#endif
328#endif /* not HAVE_SHM */
329#endif /* no XPNTR */
330
3cfe6dfd
JB
331#ifndef XSET
332#define XSET(var, type, ptr) \
627a9502 333 ((var) = ((EMACS_INT)(type) << VALBITS) + ((EMACS_INT) (ptr) & VALMASK))
3cfe6dfd
JB
334#endif
335
b7acde90
KH
336/* Convert a C integer into a Lisp_Object integer. */
337
338#define make_number(N) \
339 ((((EMACS_INT) (N)) & VALMASK) | ((EMACS_INT) Lisp_Int) << VALBITS)
340
3cfe6dfd
JB
341/* During garbage collection, XGCTYPE must be used for extracting types
342 so that the mark bit is ignored. XMARKBIT accesses the markbit.
343 Markbits are used only in particular slots of particular structure types.
344 Other markbits are always zero.
345 Outside of garbage collection, all mark bits are always zero. */
346
347#ifndef XGCTYPE
348#define XGCTYPE(a) ((enum Lisp_Type) (((a) >> VALBITS) & GCTYPEMASK))
349#endif
350
1747fb16 351#if VALBITS + GCTYPEBITS == BITS_PER_EMACS_INT - 1
3cfe6dfd
JB
352/* Make XMARKBIT faster if mark bit is sign bit. */
353#ifndef XMARKBIT
354#define XMARKBIT(a) ((a) < 0)
355#endif
356#endif /* markbit is sign bit */
357
358#ifndef XMARKBIT
359#define XMARKBIT(a) ((a) & MARKBIT)
360#endif
361
362#ifndef XSETMARKBIT
363#define XSETMARKBIT(a,b) ((a) = ((a) & ~MARKBIT) | ((b) ? MARKBIT : 0))
364#endif
365
366#ifndef XMARK
367#define XMARK(a) ((a) |= MARKBIT)
368#endif
369
370#ifndef XUNMARK
371#define XUNMARK(a) ((a) &= ~MARKBIT)
372#endif
373
374#endif /* NO_UNION_TYPE */
375
376#ifndef NO_UNION_TYPE
377
378#define XTYPE(a) ((enum Lisp_Type) (a).u.type)
379#define XSETTYPE(a, b) ((a).u.type = (char) (b))
380
221f4ef3
KH
381/* For integers known to be positive, XFASTINT provides fast retrieval
382 and XSETFASTINT provides fast storage. This takes advantage of the
383 fact that Lisp_Int is 0. */
e43ec785 384#define XFASTINT(a) ((a).i + 0)
221f4ef3 385#define XSETFASTINT(a, b) ((a).i = (b))
3cfe6dfd
JB
386
387#ifdef EXPLICIT_SIGN_EXTEND
388/* Make sure we sign-extend; compilers have been known to fail to do so. */
68be917d 389#define XINT(a) (((a).i << (BITS_PER_INT-VALBITS)) >> (BITS_PER_INT-VALBITS))
3cfe6dfd
JB
390#else
391#define XINT(a) ((a).s.val)
392#endif /* EXPLICIT_SIGN_EXTEND */
393
394#define XUINT(a) ((a).u.val)
395#define XPNTR(a) ((a).u.val)
3cfe6dfd
JB
396
397#define XSET(var, vartype, ptr) \
398 (((var).s.type = ((char) (vartype))), ((var).s.val = ((int) (ptr))))
399
e98227af
KH
400extern Lisp_Object make_number ();
401
3cfe6dfd
JB
402/* During garbage collection, XGCTYPE must be used for extracting types
403 so that the mark bit is ignored. XMARKBIT access the markbit.
404 Markbits are used only in particular slots of particular structure types.
405 Other markbits are always zero.
406 Outside of garbage collection, all mark bits are always zero. */
407
408#define XGCTYPE(a) ((a).gu.type)
409#define XMARKBIT(a) ((a).gu.markbit)
410#define XSETMARKBIT(a,b) (XMARKBIT(a) = (b))
411#define XMARK(a) (XMARKBIT(a) = 1)
412#define XUNMARK(a) (XMARKBIT(a) = 0)
413
414#endif /* NO_UNION_TYPE */
415
99a3d506 416/* Extract a value or address from a Lisp_Object. */
3cfe6dfd
JB
417
418#define XCONS(a) ((struct Lisp_Cons *) XPNTR(a))
3cfe6dfd 419#define XVECTOR(a) ((struct Lisp_Vector *) XPNTR(a))
3cfe6dfd
JB
420#define XSTRING(a) ((struct Lisp_String *) XPNTR(a))
421#define XSYMBOL(a) ((struct Lisp_Symbol *) XPNTR(a))
3cfe6dfd 422#define XFLOAT(a) ((struct Lisp_Float *) XPNTR(a))
7c06ac2b
RS
423
424/* Misc types. */
425#define XMISC(a) ((union Lisp_Misc *) XPNTR(a))
a7aa28f6 426#define XMISCTYPE(a) (XMARKER (a)->type)
84d1833e 427#define XMARKER(a) (&(XMISC(a)->u_marker))
ee4c9ce4
KH
428#define XINTFWD(a) (&(XMISC(a)->u_intfwd))
429#define XBOOLFWD(a) (&(XMISC(a)->u_boolfwd))
430#define XOBJFWD(a) (&(XMISC(a)->u_objfwd))
431#define XBUFFER_OBJFWD(a) (&(XMISC(a)->u_buffer_objfwd))
7d65f1c2 432#define XBUFFER_LOCAL_VALUE(a) (&(XMISC(a)->u_buffer_local_value))
ce7d8eec 433#define XOVERLAY(a) (&(XMISC(a)->u_overlay))
32462604 434#define XKBOARD_OBJFWD(a) (&(XMISC(a)->u_kboard_objfwd))
3cfe6dfd 435
7c06ac2b
RS
436/* Pseudovector types. */
437#define XPROCESS(a) ((struct Lisp_Process *) XPNTR(a))
438#define XWINDOW(a) ((struct window *) XPNTR(a))
439#define XSUBR(a) ((struct Lisp_Subr *) XPNTR(a))
99a3d506 440#define XBUFFER(a) ((struct buffer *) XPNTR(a))
608ff985
RS
441#define XCHAR_TABLE(a) ((struct Lisp_Char_Table *) XPNTR(a))
442#define XBOOL_VECTOR(a) ((struct Lisp_Bool_Vector *) XPNTR(a))
99a3d506
RS
443
444
445/* Construct a Lisp_Object from a value or address. */
7c06ac2b 446
a94ef819
KH
447#define XSETINT(a, b) XSET (a, Lisp_Int, b)
448#define XSETCONS(a, b) XSET (a, Lisp_Cons, b)
b5088f80 449#define XSETVECTOR(a, b) XSET (a, Lisp_Vectorlike, b)
a94ef819
KH
450#define XSETSTRING(a, b) XSET (a, Lisp_String, b)
451#define XSETSYMBOL(a, b) XSET (a, Lisp_Symbol, b)
a94ef819 452#define XSETFLOAT(a, b) XSET (a, Lisp_Float, b)
7c06ac2b
RS
453
454/* Misc types. */
455#define XSETMISC(a, b) XSET (a, Lisp_Misc, b)
a7aa28f6 456#define XSETMARKER(a, b) (XSETMISC (a, b), XMISCTYPE (a) = Lisp_Misc_Marker)
7c06ac2b
RS
457
458/* Pseudovector types. */
459#define XSETPSEUDOVECTOR(a, b, code) \
460 (XSETVECTOR (a, b), XVECTOR (a)->size |= PSEUDOVECTOR_FLAG | (code))
461#define XSETWINDOW_CONFIGURATION(a, b) \
462 (XSETPSEUDOVECTOR (a, b, PVEC_WINDOW_CONFIGURATION))
463#define XSETPROCESS(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_PROCESS))
464#define XSETWINDOW(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_WINDOW))
465#define XSETSUBR(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_SUBR))
466#define XSETCOMPILED(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_COMPILED))
99a3d506 467#define XSETBUFFER(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_BUFFER))
608ff985
RS
468#define XSETCHAR_TABLE(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_CHAR_TABLE))
469#define XSETBOOL_VECTOR(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_BOOL_VECTOR))
3cfe6dfd 470\f
99a3d506 471/* Basic data type for use of intervals. See the macros in intervals.h. */
e221eae3
JA
472
473struct interval
474{
99a3d506 475 /* The first group of entries deal with the tree structure. */
e221eae3 476
99a3d506
RS
477 unsigned int total_length; /* Length of myself and both children. */
478 unsigned int position; /* Cache of interval's character position. */
b4e187e2
RS
479 /* This field is usually updated
480 simultaneously with an interval
481 traversal, there is no guaranty
482 that it is valid for a random
483 interval. */
99a3d506
RS
484 struct interval *left; /* Intervals which precede me. */
485 struct interval *right; /* Intervals which succeed me. */
e8720644
JB
486
487 /* Parent in the tree, or the Lisp_Object containing this interval tree.
488
489 The mark bit on the root interval of an interval tree says
490 whether we have started (and possibly finished) marking the
491 tree. If GC comes across an interval tree whose root's parent
492 field has its markbit set, it leaves the tree alone.
493
494 You'd think we could store this information in the parent object
495 somewhere (after all, that should be visited once and then
496 ignored too, right?), but strings are GC'd strangely. */
497 struct interval *parent;
e221eae3
JA
498
499 /* The remaining components are `properties' of the interval.
500 The first four are duplicates for things which can be on the list,
99a3d506 501 for purposes of speed. */
e221eae3
JA
502
503 unsigned char write_protect; /* Non-zero means can't modify. */
99a3d506 504 unsigned char visible; /* Zero means don't display. */
cde20f41 505 unsigned char front_sticky; /* Non-zero means text inserted just
99a3d506
RS
506 before this interval goes into it. */
507 unsigned char rear_sticky; /* Likewise for just after it. */
e221eae3 508
e8720644
JB
509 /* Properties of this interval.
510 The mark bit on this field says whether this particular interval
511 tree node has been visited. Since intervals should never be
512 shared, GC aborts if it seems to have visited an interval twice. */
513 Lisp_Object plist;
e221eae3
JA
514};
515
516typedef struct interval *INTERVAL;
517
518/* Complain if object is not string or buffer type */
519#define CHECK_STRING_OR_BUFFER(x, i) \
c5af3bb9 520 { if (!STRINGP ((x)) && !BUFFERP ((x))) \
e221eae3
JA
521 x = wrong_type_argument (Qbuffer_or_string_p, (x)); }
522
523/* Macro used to conditionally compile intervals into certain data
99a3d506 524 structures. See, e.g., struct Lisp_String below. */
e221eae3
JA
525#define DECLARE_INTERVALS INTERVAL intervals;
526
eb8c3be9 527/* Macro used to conditionally compile interval initialization into
99a3d506 528 certain code. See, e.g., alloc.c. */
e221eae3
JA
529#define INITIALIZE_INTERVAL(ptr,val) ptr->intervals = val
530
e221eae3 531\f
3cfe6dfd
JB
532/* In a cons, the markbit of the car is the gc mark bit */
533
534struct Lisp_Cons
535 {
8f34f70a
KR
536 /* Please do not use the names of these elements in code other
537 than the core lisp implementation. Use XCAR and XCDR below. */
538#ifdef HIDE_LISP_IMPLEMENTATION
539 Lisp_Object car_, cdr_;
540#else
3cfe6dfd 541 Lisp_Object car, cdr;
8f34f70a 542#endif
3cfe6dfd
JB
543 };
544
b7acde90 545/* Take the car or cdr of something known to be a cons cell. */
8f34f70a
KR
546#ifdef HIDE_LISP_IMPLEMENTATION
547#define XCAR(c) (XCONS ((c))->car_)
548#define XCDR(c) (XCONS ((c))->cdr_)
549#else
b7acde90
KH
550#define XCAR(c) (XCONS ((c))->car)
551#define XCDR(c) (XCONS ((c))->cdr)
8f34f70a 552#endif
b7acde90
KH
553
554/* Take the car or cdr of something whose type is not known. */
555#define CAR(c) \
556 (CONSP ((c)) ? XCAR ((c)) \
557 : NILP ((c)) ? Qnil \
558 : wrong_type_argument (Qlistp, (c)))
559
560#define CDR(c) \
561 (CONSP ((c)) ? XCDR ((c)) \
562 : NILP ((c)) ? Qnil \
563 : wrong_type_argument (Qlistp, (c)))
564
3cfe6dfd
JB
565/* Like a cons, but records info on where the text lives that it was read from */
566/* This is not really in use now */
567
568struct Lisp_Buffer_Cons
569 {
570 Lisp_Object car, cdr;
571 struct buffer *buffer;
572 int bufpos;
573 };
574
d8fc7ce4
KH
575/* Nonzero if STR is a multibyte string. */
576#define STRING_MULTIBYTE(STR) \
577 (XSTRING (STR)->size_byte >= 0)
578
579/* Return the length in bytes of STR. */
580#define STRING_BYTES(STR) \
581 ((STR)->size_byte < 0 ? (STR)->size : (STR)->size_byte)
582
583/* Set the length in bytes of STR. */
584#define SET_STRING_BYTES(STR, SIZE) ((STR)->size_byte = (SIZE))
585
3cfe6dfd
JB
586/* In a string or vector, the sign bit of the `size' is the gc mark bit */
587
588struct Lisp_String
589 {
627a9502 590 EMACS_INT size;
a1b5012f 591 EMACS_INT size_byte;
99a3d506 592 DECLARE_INTERVALS /* `data' field must be last. */
f05d7ea2 593 unsigned char *data;
3cfe6dfd
JB
594 };
595
94225242 596/* If a struct is made to look like a vector, this macro returns the length
4115d3f7
RS
597 of the shortest vector that would hold that struct. */
598#define VECSIZE(type) ((sizeof (type) - (sizeof (struct Lisp_Vector) \
599 - sizeof (Lisp_Object)) \
600 + sizeof(Lisp_Object) - 1) /* round up */ \
94225242
KH
601 / sizeof (Lisp_Object))
602
3cfe6dfd
JB
603struct Lisp_Vector
604 {
627a9502 605 EMACS_INT size;
3cfe6dfd
JB
606 struct Lisp_Vector *next;
607 Lisp_Object contents[1];
608 };
609
ea724a01
KH
610/* A char table is a kind of vectorlike, with contents are like a
611 vector but with a few other slots. For some purposes, it makes
612 sense to handle a chartable with type struct Lisp_Vector. An
613 element of a char table can be any Lisp objects, but if it is a sub
614 char-table, we treat it a table that contains information of a
615 group of characters of the same charsets or a specific character of
616 a charset. A sub char-table has the same structure as a char table
617 except for that the former omits several slots at the tail. A sub
618 char table appears only in an element of a char table, and there's
619 no way to access it directly from Emacs Lisp program. */
e98227af 620
b96656ce
KH
621/* This is the number of slots that apply to characters or character
622 sets. The first 128 are for ASCII, the next 128 are for 8-bit
ea724a01
KH
623 European characters, and the last 128 are for multibyte characters.
624 The first 256 are indexed by the code itself, but the last 128 are
625 indexed by (charset-id + 128). */
b96656ce
KH
626#define CHAR_TABLE_ORDINARY_SLOTS 384
627
628/* This is the number of slots that apply to characters of ASCII and
629 8-bit Europeans only. */
630#define CHAR_TABLE_SINGLE_BYTE_SLOTS 256
608ff985 631
ea724a01
KH
632/* This is the number of slots that every char table must have. This
633 counts the ordinary slots and the top, defalt, parent, and purpose
634 slots. */
635#define CHAR_TABLE_STANDARD_SLOTS (CHAR_TABLE_ORDINARY_SLOTS + 4)
636
637/* This is the number of slots that apply to position-code-1 and
638 position-code-2 of a multibyte character at the 2nd and 3rd level
639 sub char tables respectively. */
640#define SUB_CHAR_TABLE_ORDINARY_SLOTS 128
641
642/* This is the number of slots that every sub char table must have.
643 This counts the ordinary slots and the top and defalt slot. */
e98227af 644#define SUB_CHAR_TABLE_STANDARD_SLOTS (SUB_CHAR_TABLE_ORDINARY_SLOTS + 2)
608ff985
RS
645
646/* Return the number of "extra" slots in the char table CT. */
647
648#define CHAR_TABLE_EXTRA_SLOTS(CT) \
649 (((CT)->size & PSEUDOVECTOR_SIZE_MASK) - CHAR_TABLE_STANDARD_SLOTS)
650
b96656ce 651/* Almost equivalent to Faref (CT, IDX) with optimization for ASCII
8ac90470
KH
652 and 8-bit Europeans characters. For these characters, do not check
653 validity of CT. Do not follow parent. */
654#define CHAR_TABLE_REF(CT, IDX) \
6185c1c0 655 ((IDX) >= 0 && (IDX) < CHAR_TABLE_SINGLE_BYTE_SLOTS \
2e34157c
RS
656 ? (!NILP (XCHAR_TABLE (CT)->contents[IDX]) \
657 ? XCHAR_TABLE (CT)->contents[IDX] \
8ac90470 658 : XCHAR_TABLE (CT)->defalt) \
2e34157c 659 : Faref (CT, make_number (IDX)))
b96656ce 660
29b7163f
RS
661/* Almost equivalent to Faref (CT, IDX) with optimization for ASCII
662 and 8-bit Europeans characters. However, if the result is nil,
663 return IDX.
664
665 For these characters, do not check validity of CT
666 and do not follow parent. */
667#define CHAR_TABLE_TRANSLATE(CT, IDX) \
668 ((IDX) < CHAR_TABLE_SINGLE_BYTE_SLOTS \
669 ? (!NILP (XCHAR_TABLE (CT)->contents[IDX]) \
670 ? XINT (XCHAR_TABLE (CT)->contents[IDX]) \
671 : IDX) \
672 : char_table_translate (CT, IDX))
673
b96656ce 674/* Equivalent to Faset (CT, IDX, VAL) with optimization for ASCII and
8ac90470
KH
675 8-bit Europeans characters. Do not check validity of CT. */
676#define CHAR_TABLE_SET(CT, IDX, VAL) \
677 do { \
678 if (XFASTINT (IDX) < CHAR_TABLE_SINGLE_BYTE_SLOTS) \
679 XCHAR_TABLE (CT)->contents[XFASTINT (IDX)] = VAL; \
680 else \
681 Faset (CT, IDX, VAL); \
b96656ce
KH
682 } while (0)
683
608ff985
RS
684struct Lisp_Char_Table
685 {
686 /* This is the vector's size field, which also holds the
687 pseudovector type information. It holds the size, too.
ea724a01
KH
688 The size counts the top, defalt, purpose, and parent slots.
689 The last three are not counted if this is a sub char table. */
608ff985
RS
690 EMACS_INT size;
691 struct Lisp_Vector *next;
ea724a01
KH
692 /* This holds a flag to tell if this is a top level char table (t)
693 or a sub char table (nil). */
694 Lisp_Object top;
608ff985
RS
695 /* This holds a default value,
696 which is used whenever the value for a specific character is nil. */
697 Lisp_Object defalt;
ea724a01
KH
698 /* This holds an actual value of each element. A sub char table
699 has only SUB_CHAR_TABLE_ORDINARY_SLOTS number of elements. */
700 Lisp_Object contents[CHAR_TABLE_ORDINARY_SLOTS];
701
702 /* A sub char table doesn't has the following slots. */
703
608ff985
RS
704 /* This points to another char table, which we inherit from
705 when the value for a specific character is nil.
706 The `defalt' slot takes precedence over this. */
707 Lisp_Object parent;
7f73dc9d
RS
708 /* This should be a symbol which says what kind of use
709 this char-table is meant for.
710 Typically now the values can be `syntax-table' and `display-table'. */
711 Lisp_Object purpose;
608ff985
RS
712 /* These hold additional data. */
713 Lisp_Object extras[1];
714 };
715
716/* A boolvector is a kind of vectorlike, with contents are like a string. */
717struct Lisp_Bool_Vector
718 {
719 /* This is the vector's size field. It doesn't have the real size,
720 just the subtype information. */
721 EMACS_INT vector_size;
722 struct Lisp_Vector *next;
723 /* This is the size in bits. */
724 EMACS_INT size;
725 /* This contains the actual bits, packed into bytes. */
726 unsigned char data[1];
727 };
728
3cfe6dfd
JB
729/* In a symbol, the markbit of the plist is used as the gc mark bit */
730
731struct Lisp_Symbol
732 {
733 struct Lisp_String *name;
734 Lisp_Object value;
735 Lisp_Object function;
736 Lisp_Object plist;
92a2515a 737 Lisp_Object obarray;
3cfe6dfd
JB
738 struct Lisp_Symbol *next; /* -> next symbol in this obarray bucket */
739 };
740
7c06ac2b
RS
741/* This structure describes a built-in function.
742 It is generated by the DEFUN macro only.
743 defsubr makes it into a Lisp object.
744
745 This type is treated in most respects as a pseudovector,
746 but since we never dynamically allocate or free them,
747 we don't need a next-vector field. */
e98227af 748
3cfe6dfd
JB
749struct Lisp_Subr
750 {
7c06ac2b 751 EMACS_INT size;
3cfe6dfd
JB
752 Lisp_Object (*function) ();
753 short min_args, max_args;
754 char *symbol_name;
755 char *prompt;
756 char *doc;
757 };
5010d3b8
GM
758
759\f
760/***********************************************************************
761 Hash Tables
762 ***********************************************************************/
763
764/* The structure of a Lisp hash table. */
765
766struct Lisp_Hash_Table
767{
768 /* Vector fields. The hash table code doesn't refer to these. */
769 EMACS_INT size;
770 struct Lisp_Vector *vec_next;
771
772 /* Function used to compare keys. */
773 Lisp_Object test;
774
775 /* Nil if table is non-weak. Otherwise a symbol describing the
776 weakness of the table. */
777 Lisp_Object weak;
778
779 /* When the table is resized, and this is an integer, compute the
780 new size by adding this to the old size. If a float, compute the
781 new size by multiplying the old size with this factor. */
782 Lisp_Object rehash_size;
783
784 /* Resize hash table when number of entries/ table size is >= this
785 ratio, a float. */
786 Lisp_Object rehash_threshold;
787
788 /* Number of key/value entries in the table. */
789 Lisp_Object count;
790
791 /* Vector of keys and values. The key of item I is found at index
792 2 * I, the value is found at index 2 * I + 1. */
793 Lisp_Object key_and_value;
794
795 /* Vector of hash codes.. If hash[I] is nil, this means that that
796 entry I is unused. */
797 Lisp_Object hash;
798
799 /* Vector used to chain entries. If entry I is free, next[I] is the
800 entry number of the next free item. If entry I is non-free,
801 next[I] is the index of the next entry in the collision chain. */
802 Lisp_Object next;
803
804 /* Index of first free entry in free list. */
805 Lisp_Object next_free;
806
807 /* Bucket vector. A non-nil entry is the index of the first item in
808 a collision chain. This vector's size can be larger than the
809 hash table size to reduce collisions. */
810 Lisp_Object index;
811
812 /* Next weak hash table if this is a weak hash table. The head
813 of the list is in Vweak_hash_tables. */
814 Lisp_Object next_weak;
815
816 /* User-supplied hash function, or nil. */
817 Lisp_Object user_hash_function;
818
819 /* User-supplied key comparison function, or nil. */
820 Lisp_Object user_cmp_function;
821
822 /* C function to compare two keys. */
823 int (* cmpfn) P_ ((struct Lisp_Hash_Table *, Lisp_Object,
824 unsigned, Lisp_Object, unsigned));
825
826 /* C function to compute hash code. */
827 unsigned (* hashfn) P_ ((struct Lisp_Hash_Table *, Lisp_Object));
828};
829
830
831#define XHASH_TABLE(OBJ) \
832 ((struct Lisp_Hash_Table *) XPNTR (OBJ))
833
834#define XSET_HASH_TABLE(VAR, PTR) \
835 (XSETPSEUDOVECTOR (VAR, PTR, PVEC_HASH_TABLE))
836
837#define HASH_TABLE_P(OBJ) PSEUDOVECTORP (OBJ, PVEC_HASH_TABLE)
838#define GC_HASH_TABLE_P(x) GC_PSEUDOVECTORP (x, PVEC_HASH_TABLE)
839
840#define CHECK_HASH_TABLE(x, i) \
841 do \
842 { \
843 if (!HASH_TABLE_P ((x))) \
844 x = wrong_type_argument (Qhash_table_p, (x)); \
845 } \
846 while (0)
847
848/* Default size for hash tables if not specified. */
849
850#define DEFAULT_HASH_SIZE 65
851
852/* Default threshold specifying when to resize a hash table. The
853 value gives the ratio of current entries in the hash table and the
854 size of the hash table. */
855
856#define DEFAULT_REHASH_THRESHOLD 0.8
857
858/* Default factor by which to increase the size of a hash table. */
859
860#define DEFAULT_REHASH_SIZE 1.5
861
ee4c9ce4 862\f
7c06ac2b
RS
863/* These structures are used for various misc types. */
864
ee4c9ce4
KH
865/* A miscellaneous object, when it's on the free list. */
866struct Lisp_Free
867 {
5bfac5a9
RS
868 int type : 16; /* = Lisp_Misc_Free */
869 int spacer : 16;
ee4c9ce4
KH
870 union Lisp_Misc *chain;
871 };
3cfe6dfd 872
609c36fe 873/* In a marker, the markbit of the chain field is used as the gc mark bit. */
3cfe6dfd 874struct Lisp_Marker
308e97d0
RS
875{
876 int type : 16; /* = Lisp_Misc_Marker */
877 int spacer : 15;
878 /* 1 means normal insertion at the marker's position
879 leaves the marker after the inserted text. */
880 unsigned int insertion_type : 1;
4ed24bf3
RS
881 /* This is the buffer that the marker points into,
882 or 0 if it points nowhere. */
308e97d0 883 struct buffer *buffer;
4ed24bf3
RS
884
885 /* The remaining fields are meaningless in a marker that
886 does not point anywhere. */
887
888 /* For markers that point somewhere,
889 this is used to chain of all the markers in a given buffer. */
308e97d0 890 Lisp_Object chain;
4ed24bf3
RS
891 /* This is the char position where the marker points. */
892 int charpos;
363aa820
RS
893 /* This is the byte position. */
894 int bytepos;
308e97d0 895};
3cfe6dfd 896
ee4c9ce4
KH
897/* Forwarding pointer to an int variable.
898 This is allowed only in the value cell of a symbol,
899 and it means that the symbol's value really lives in the
900 specified int variable. */
901struct Lisp_Intfwd
84d1833e 902 {
5bfac5a9
RS
903 int type : 16; /* = Lisp_Misc_Intfwd */
904 int spacer : 16;
ee4c9ce4
KH
905 int *intvar;
906 };
907
908/* Boolean forwarding pointer to an int variable.
909 This is like Lisp_Intfwd except that the ostensible
910 "value" of the symbol is t if the int variable is nonzero,
911 nil if it is zero. */
912struct Lisp_Boolfwd
913 {
5bfac5a9
RS
914 int type : 16; /* = Lisp_Misc_Boolfwd */
915 int spacer : 16;
ee4c9ce4
KH
916 int *boolvar;
917 };
918
919/* Forwarding pointer to a Lisp_Object variable.
920 This is allowed only in the value cell of a symbol,
921 and it means that the symbol's value really lives in the
922 specified variable. */
923struct Lisp_Objfwd
924 {
5bfac5a9
RS
925 int type : 16; /* = Lisp_Misc_Objfwd */
926 int spacer : 16;
ee4c9ce4
KH
927 Lisp_Object *objvar;
928 };
929
930/* Like Lisp_Objfwd except that value lives in a slot in the
931 current buffer. Value is byte index of slot within buffer. */
932struct Lisp_Buffer_Objfwd
933 {
5bfac5a9
RS
934 int type : 16; /* = Lisp_Misc_Buffer_Objfwd */
935 int spacer : 16;
ee4c9ce4 936 int offset;
84d1833e
KH
937 };
938
7d65f1c2
KH
939/* Used in a symbol value cell when the symbol's value is per-buffer.
940 The actual contents resemble a cons cell which starts a list like this:
941 (REALVALUE BUFFER CURRENT-ALIST-ELEMENT . DEFAULT-VALUE).
942
ce7d8eec
KH
943 The cons-like structure is for historical reasons; it might be better
944 to just put these elements into the struct, now.
945
7d65f1c2
KH
946 BUFFER is the last buffer for which this symbol's value was
947 made up to date.
948
949 CURRENT-ALIST-ELEMENT is a pointer to an element of BUFFER's
950 local_var_alist, that being the element whose car is this
951 variable. Or it can be a pointer to the
952 (CURRENT-ALIST-ELEMENT . DEFAULT-VALUE),
953 if BUFFER does not have an element in its alist for this
954 variable (that is, if BUFFER sees the default value of this
955 variable).
956
957 If we want to examine or set the value and BUFFER is current,
99a3d506 958 we just examine or set REALVALUE. If BUFFER is not current, we
7d65f1c2
KH
959 store the current REALVALUE value into CURRENT-ALIST-ELEMENT,
960 then find the appropriate alist element for the buffer now
961 current and set up CURRENT-ALIST-ELEMENT. Then we set
962 REALVALUE out of that element, and store into BUFFER.
963
964 If we are setting the variable and the current buffer does not
965 have an alist entry for this variable, an alist entry is
966 created.
967
968 Note that REALVALUE can be a forwarding pointer. Each time it
969 is examined or set, forwarding must be done. Each time we
970 switch buffers, buffer-local variables which forward into C
971 variables are swapped immediately, so the C code can assume
972 that they are always up to date.
973
974 Lisp_Misc_Buffer_Local_Value and Lisp_Misc_Some_Buffer_Local_Value
975 use the same substructure. The difference is that with the latter,
976 merely setting the variable while some buffer is current
977 does not cause that buffer to have its own local value of this variable.
978 Only make-local-variable does that. */
979struct Lisp_Buffer_Local_Value
980 {
4bfba59e
RS
981 int type : 16; /* = Lisp_Misc_Buffer_Local_Value
982 or Lisp_Misc_Some_Buffer_Local_Value */
983 int spacer : 13;
984 unsigned int check_frame : 1;
985 unsigned int found_for_buffer : 1;
986 unsigned int found_for_frame : 1;
987 Lisp_Object realvalue;
988 Lisp_Object buffer, frame;
989 Lisp_Object cdr;
7d65f1c2
KH
990 };
991
ce7d8eec
KH
992/* In an overlay object, the mark bit of the plist is used as the GC mark.
993 START and END are markers in the overlay's buffer, and
994 PLIST is the overlay's property list. */
995struct Lisp_Overlay
996 {
5bfac5a9
RS
997 int type : 16; /* = Lisp_Misc_Overlay */
998 int spacer : 16;
ce7d8eec
KH
999 Lisp_Object start, end, plist;
1000 };
5bfac5a9 1001
f334de0e 1002/* Like Lisp_Objfwd except that value lives in a slot in the
32462604
KH
1003 current kboard. */
1004struct Lisp_Kboard_Objfwd
f334de0e 1005 {
32462604 1006 int type : 16; /* = Lisp_Misc_Kboard_Objfwd */
f334de0e
KH
1007 int spacer : 16;
1008 int offset;
1009 };
1010
5bfac5a9 1011
a7aa28f6
RS
1012/* To get the type field of a union Lisp_Misc, use XMISCTYPE.
1013 It uses one of these struct subtypes to get the type field. */
1014
84d1833e
KH
1015union Lisp_Misc
1016 {
84d1833e
KH
1017 struct Lisp_Free u_free;
1018 struct Lisp_Marker u_marker;
ee4c9ce4
KH
1019 struct Lisp_Intfwd u_intfwd;
1020 struct Lisp_Boolfwd u_boolfwd;
1021 struct Lisp_Objfwd u_objfwd;
1022 struct Lisp_Buffer_Objfwd u_buffer_objfwd;
7d65f1c2 1023 struct Lisp_Buffer_Local_Value u_buffer_local_value;
ce7d8eec 1024 struct Lisp_Overlay u_overlay;
32462604 1025 struct Lisp_Kboard_Objfwd u_kboard_objfwd;
84d1833e 1026 };
7c06ac2b 1027\f
cc94f3b2 1028/* Lisp floating point type */
3cfe6dfd
JB
1029struct Lisp_Float
1030 {
e98227af 1031 Lisp_Object type; /* essentially used for mark-bit
3cfe6dfd 1032 and chaining when on free-list */
8f34f70a
KR
1033#ifdef HIDE_LISP_IMPLEMENTATION
1034 double data_;
1035#else
e98227af 1036 double data;
8f34f70a 1037#endif
3cfe6dfd 1038 };
8f34f70a
KR
1039
1040#ifdef HIDE_LISP_IMPLEMENTATION
1041#define XFLOAT_DATA(f) (XFLOAT (f)->data_)
1042#else
1043#define XFLOAT_DATA(f) (XFLOAT (f)->data)
1044#endif
3cfe6dfd
JB
1045
1046/* A character, declared with the following typedef, is a member
99a3d506 1047 of some character set associated with the current buffer. */
b2ba7b00
RS
1048#ifndef _UCHAR_T /* Protect against something in ctab.h on AIX. */
1049#define _UCHAR_T
3cfe6dfd 1050typedef unsigned char UCHAR;
b2ba7b00 1051#endif
3cfe6dfd
JB
1052
1053/* Meanings of slots in a Lisp_Compiled: */
1054
1055#define COMPILED_ARGLIST 0
1056#define COMPILED_BYTECODE 1
1057#define COMPILED_CONSTANTS 2
1058#define COMPILED_STACK_DEPTH 3
1059#define COMPILED_DOC_STRING 4
1060#define COMPILED_INTERACTIVE 5
88dbfee5 1061
d03f79ef
JB
1062/* Flag bits in a character. These also get used in termhooks.h.
1063 Richard Stallman <rms@gnu.ai.mit.edu> thinks that MULE
7c06ac2b
RS
1064 (MUlti-Lingual Emacs) might need 22 bits for the character value
1065 itself, so we probably shouldn't use any bits lower than 0x0400000. */
1066#define CHAR_ALT (0x0400000)
1067#define CHAR_SUPER (0x0800000)
1068#define CHAR_HYPER (0x1000000)
1069#define CHAR_SHIFT (0x2000000)
1070#define CHAR_CTL (0x4000000)
1071#define CHAR_META (0x8000000)
703f2808 1072
048151c1
KH
1073#define CHAR_MODIFIER_MASK \
1074 (CHAR_ALT | CHAR_SUPER | CHAR_HYPER | CHAR_SHIFT | CHAR_CTL | CHAR_META)
1075
1076
6b768554
KH
1077/* Actually, the current Emacs uses 19 bits for the character value
1078 itself. */
1079#define CHARACTERBITS 19
1080
b0ca4f56
KH
1081/* The maximum byte size consumed by push_key_description.
1082 All callers should assure that at least this size of memory is
1083 allocated at the place pointed by the second argument.
1084
1085 Thers are 6 modifiers, each consumes 2 chars.
1086 The octal form of a character code consumes
1087 (1 + CHARACTERBITS / 3 + 1) chars (including backslash at the head).
1088 We need one more byte for string terminator `\0'. */
1089#define KEY_DESCRIPTION_SIZE ((2 * 6) + 1 + (CHARACTERBITS / 3) + 1 + 1)
1090
e6faba7f
RS
1091#ifdef USE_X_TOOLKIT
1092#ifdef NO_UNION_TYPE
1093/* Use this for turning a (void *) into a Lisp_Object, as when the
1094 Lisp_Object is passed into a toolkit callback function. */
1095#define VOID_TO_LISP(larg,varg) \
1096 do { ((larg) = ((Lisp_Object) (varg))); } while (0)
1097#define CVOID_TO_LISP VOID_TO_LISP
1098
1099/* Use this for turning a Lisp_Object into a (void *), as when the
1100 Lisp_Object is passed into a toolkit callback function. */
1101#define LISP_TO_VOID(larg) ((void *) (larg))
1102#define LISP_TO_CVOID(varg) ((const void *) (larg))
1103
1104#else /* not NO_UNION_TYPE */
1105/* Use this for turning a (void *) into a Lisp_Object, as when the
1106 Lisp_Object is passed into a toolkit callback function. */
1107#define VOID_TO_LISP(larg,varg) \
1108 do { ((larg).v = (void *) (varg)); } while (0)
1109#define CVOID_TO_LISP(larg,varg) \
1110 do { ((larg).cv = (const void *) (varg)); } while (0)
1111
1112/* Use this for turning a Lisp_Object into a (void *), as when the
1113 Lisp_Object is passed into a toolkit callback function. */
1114#define LISP_TO_VOID(larg) ((larg).v)
1115#define LISP_TO_CVOID(larg) ((larg).cv)
1116#endif /* not NO_UNION_TYPE */
1117#endif /* USE_X_TOOLKIT */
1118
703f2808
JB
1119\f
1120/* The glyph datatype, used to represent characters on the display. */
1121
3b0fee46
KH
1122/* Glyph code to use as an index to the glyph table. If it is out of
1123 range for the glyph table, or the corresonding element in the table
1124 is nil, the low 8 bits are the single byte character code, and the
1125 bits above are the numeric face ID. If FID is the face ID of a
1126 glyph on a frame F, then F->display.x->faces[FID] contains the
1127 description of that face. This is an int instead of a short, so we
1128 can support a good bunch of face ID's (2^(31 - 8)); given that we
6b768554 1129 have no mechanism for tossing unused frame face ID's yet, we'll
3b0fee46
KH
1130 probably run out of 255 pretty quickly.
1131 This is always -1 for a multibyte character. */
1132#define GLYPH int
1133
6b768554 1134/* Mask bits for face. */
3b0fee46
KH
1135#define GLYPH_MASK_FACE 0x7FFFFF00
1136 /* Mask bits for character code. */
1137#define GLYPH_MASK_CHAR 0x000000FF /* The lowest 8 bits */
6b768554 1138
49b0dd75
KH
1139/* The FAST macros assume that we already know we're in an X window. */
1140
3b0fee46
KH
1141/* Set a character code and a face ID in a glyph G. */
1142#define FAST_MAKE_GLYPH(char, face) ((char) | ((face) << 8))
703f2808
JB
1143
1144/* Return a glyph's character code. */
6b768554 1145#define FAST_GLYPH_CHAR(glyph) ((glyph) & GLYPH_MASK_CHAR)
703f2808
JB
1146
1147/* Return a glyph's face ID. */
3b0fee46 1148#define FAST_GLYPH_FACE(glyph) (((glyph) & GLYPH_MASK_FACE) >> 8)
49b0dd75
KH
1149
1150/* Slower versions that test the frame type first. */
5010d3b8
GM
1151#define MAKE_GLYPH(f, char, face) (FAST_MAKE_GLYPH (char, face))
1152#define GLYPH_CHAR(f, g) (FAST_GLYPH_CHAR (g))
1153#define GLYPH_FACE(f, g) (FAST_GLYPH_FACE (g))
703f2808 1154
b96656ce
KH
1155/* Return 1 iff GLYPH contains valid character code. */
1156#define GLYPH_CHAR_VALID_P(glyph) \
1157 ((GLYPH) (FAST_GLYPH_CHAR (glyph)) <= MAX_CHAR)
1158
4606cc9d
RS
1159/* The ID of the mode line highlighting face. */
1160#define GLYPH_MODE_LINE_FACE 1
3cfe6dfd
JB
1161\f
1162/* Data type checking */
1163
efb859b4 1164#define NILP(x) (XFASTINT (x) == XFASTINT (Qnil))
f498e3b2 1165#define GC_NILP(x) GC_EQ (x, Qnil)
3cfe6dfd 1166
c5af3bb9 1167#define NUMBERP(x) (INTEGERP (x) || FLOATP (x))
c1a2bfad 1168#define GC_NUMBERP(x) (GC_INTEGERP (x) || GC_FLOATP (x))
a4a9f09f 1169#define NATNUMP(x) (INTEGERP (x) && XINT (x) >= 0)
c1a2bfad 1170#define GC_NATNUMP(x) (GC_INTEGERP (x) && XINT (x) >= 0)
4746118a 1171
edfa9106 1172#define INTEGERP(x) (XTYPE ((x)) == Lisp_Int)
c1a2bfad 1173#define GC_INTEGERP(x) (XGCTYPE ((x)) == Lisp_Int)
edfa9106 1174#define SYMBOLP(x) (XTYPE ((x)) == Lisp_Symbol)
c1a2bfad 1175#define GC_SYMBOLP(x) (XGCTYPE ((x)) == Lisp_Symbol)
84d1833e 1176#define MISCP(x) (XTYPE ((x)) == Lisp_Misc)
c1a2bfad 1177#define GC_MISCP(x) (XGCTYPE ((x)) == Lisp_Misc)
b5088f80
KH
1178#define VECTORLIKEP(x) (XTYPE ((x)) == Lisp_Vectorlike)
1179#define GC_VECTORLIKEP(x) (XGCTYPE ((x)) == Lisp_Vectorlike)
edfa9106 1180#define STRINGP(x) (XTYPE ((x)) == Lisp_String)
c1a2bfad 1181#define GC_STRINGP(x) (XGCTYPE ((x)) == Lisp_String)
3cfe6dfd 1182#define CONSP(x) (XTYPE ((x)) == Lisp_Cons)
c1a2bfad 1183#define GC_CONSP(x) (XGCTYPE ((x)) == Lisp_Cons)
7c06ac2b 1184
edfa9106 1185#define FLOATP(x) (XTYPE ((x)) == Lisp_Float)
c1a2bfad 1186#define GC_FLOATP(x) (XGCTYPE ((x)) == Lisp_Float)
b5088f80
KH
1187#define VECTORP(x) (VECTORLIKEP (x) && !(XVECTOR (x)->size & PSEUDOVECTOR_FLAG))
1188#define GC_VECTORP(x) (GC_VECTORLIKEP (x) && !(XVECTOR (x)->size & PSEUDOVECTOR_FLAG))
a7aa28f6
RS
1189#define OVERLAYP(x) (MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Overlay)
1190#define GC_OVERLAYP(x) (GC_MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Overlay)
1191#define MARKERP(x) (MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Marker)
1192#define GC_MARKERP(x) (GC_MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Marker)
1193#define INTFWDP(x) (MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Intfwd)
1194#define GC_INTFWDP(x) (GC_MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Intfwd)
1195#define BOOLFWDP(x) (MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Boolfwd)
1196#define GC_BOOLFWDP(x) (GC_MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Boolfwd)
1197#define OBJFWDP(x) (MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Objfwd)
1198#define GC_OBJFWDP(x) (GC_MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Objfwd)
1199#define BUFFER_OBJFWDP(x) (MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Buffer_Objfwd)
1200#define GC_BUFFER_OBJFWDP(x) (GC_MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Buffer_Objfwd)
1201#define BUFFER_LOCAL_VALUEP(x) (MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Buffer_Local_Value)
1202#define GC_BUFFER_LOCAL_VALUEP(x) (GC_MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Buffer_Local_Value)
1203#define SOME_BUFFER_LOCAL_VALUEP(x) (MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Some_Buffer_Local_Value)
1204#define GC_SOME_BUFFER_LOCAL_VALUEP(x) (GC_MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Some_Buffer_Local_Value)
1205#define KBOARD_OBJFWDP(x) (MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Kboard_Objfwd)
1206#define GC_KBOARD_OBJFWDP(x) (GC_MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Kboard_Objfwd)
edfa9106 1207
7c06ac2b 1208
303a5c93 1209/* True if object X is a pseudovector whose code is CODE. */
7c06ac2b
RS
1210#define PSEUDOVECTORP(x, code) \
1211 (VECTORLIKEP (x) \
1212 && (((XVECTOR (x)->size & (PSEUDOVECTOR_FLAG | (code)))) \
1213 == (PSEUDOVECTOR_FLAG | (code))))
1214
303a5c93 1215/* True if object X is a pseudovector whose code is CODE.
7c06ac2b
RS
1216 This one works during GC. */
1217#define GC_PSEUDOVECTORP(x, code) \
1218 (GC_VECTORLIKEP (x) \
1219 && (((XVECTOR (x)->size & (PSEUDOVECTOR_FLAG | (code)))) \
1220 == (PSEUDOVECTOR_FLAG | (code))))
1221
1222/* Test for specific pseudovector types. */
1223#define WINDOW_CONFIGURATIONP(x) PSEUDOVECTORP (x, PVEC_WINDOW_CONFIGURATION)
1224#define GC_WINDOW_CONFIGURATIONP(x) GC_PSEUDOVECTORP (x, PVEC_WINDOW_CONFIGURATION)
1225#define PROCESSP(x) PSEUDOVECTORP (x, PVEC_PROCESS)
1226#define GC_PROCESSP(x) GC_PSEUDOVECTORP (x, PVEC_PROCESS)
1227#define WINDOWP(x) PSEUDOVECTORP (x, PVEC_WINDOW)
1228#define GC_WINDOWP(x) GC_PSEUDOVECTORP (x, PVEC_WINDOW)
1229#define SUBRP(x) PSEUDOVECTORP (x, PVEC_SUBR)
1230#define GC_SUBRP(x) GC_PSEUDOVECTORP (x, PVEC_SUBR)
1231#define COMPILEDP(x) PSEUDOVECTORP (x, PVEC_COMPILED)
1232#define GC_COMPILEDP(x) GC_PSEUDOVECTORP (x, PVEC_COMPILED)
99a3d506
RS
1233#define BUFFERP(x) PSEUDOVECTORP (x, PVEC_BUFFER)
1234#define GC_BUFFERP(x) GC_PSEUDOVECTORP (x, PVEC_BUFFER)
608ff985
RS
1235#define CHAR_TABLE_P(x) PSEUDOVECTORP (x, PVEC_CHAR_TABLE)
1236#define GC_CHAR_TABLE_P(x) GC_PSEUDOVECTORP (x, PVEC_CHAR_TABLE)
1237#define BOOL_VECTOR_P(x) PSEUDOVECTORP (x, PVEC_BOOL_VECTOR)
1238#define GC_BOOL_VECTOR_P(x) GC_PSEUDOVECTORP (x, PVEC_BOOL_VECTOR)
7c06ac2b
RS
1239#define FRAMEP(x) PSEUDOVECTORP (x, PVEC_FRAME)
1240#define GC_FRAMEP(x) GC_PSEUDOVECTORP (x, PVEC_FRAME)
ea724a01
KH
1241
1242#define SUB_CHAR_TABLE_P(x) (CHAR_TABLE_P (x) && NILP (XCHAR_TABLE (x)->top))
7c06ac2b 1243\f
3cfe6dfd 1244#define EQ(x, y) (XFASTINT (x) == XFASTINT (y))
f498e3b2 1245#define GC_EQ(x, y) (XGCTYPE (x) == XGCTYPE (y) && XPNTR (x) == XPNTR (y))
4746118a 1246
3cfe6dfd 1247#define CHECK_LIST(x, i) \
c5af3bb9 1248 do { if (!CONSP ((x)) && !NILP (x)) x = wrong_type_argument (Qlistp, (x)); } while (0)
3cfe6dfd
JB
1249
1250#define CHECK_STRING(x, i) \
c5af3bb9 1251 do { if (!STRINGP ((x))) x = wrong_type_argument (Qstringp, (x)); } while (0)
3cfe6dfd
JB
1252
1253#define CHECK_CONS(x, i) \
c5af3bb9 1254 do { if (!CONSP ((x))) x = wrong_type_argument (Qconsp, (x)); } while (0)
3cfe6dfd
JB
1255
1256#define CHECK_SYMBOL(x, i) \
c5af3bb9 1257 do { if (!SYMBOLP ((x))) x = wrong_type_argument (Qsymbolp, (x)); } while (0)
3cfe6dfd 1258
608ff985 1259#define CHECK_CHAR_TABLE(x, i) \
a97eb3f3 1260 do { if (!CHAR_TABLE_P ((x))) \
608ff985
RS
1261 x = wrong_type_argument (Qchar_table_p, (x)); } while (0)
1262
3cfe6dfd 1263#define CHECK_VECTOR(x, i) \
c5af3bb9 1264 do { if (!VECTORP ((x))) x = wrong_type_argument (Qvectorp, (x)); } while (0)
3cfe6dfd 1265
7f73dc9d
RS
1266#define CHECK_VECTOR_OR_CHAR_TABLE(x, i) \
1267 do { if (!VECTORP ((x)) && !CHAR_TABLE_P ((x))) \
1268 x = wrong_type_argument (Qvector_or_char_table_p, (x)); \
1269 } while (0)
1270
3cfe6dfd 1271#define CHECK_BUFFER(x, i) \
c5af3bb9 1272 do { if (!BUFFERP ((x))) x = wrong_type_argument (Qbufferp, (x)); } while (0)
3cfe6dfd
JB
1273
1274#define CHECK_WINDOW(x, i) \
c5af3bb9 1275 do { if (!WINDOWP ((x))) x = wrong_type_argument (Qwindowp, (x)); } while (0)
3cfe6dfd 1276
03273ec5 1277/* This macro rejects windows on the interior of the window tree as
e98227af 1278 "dead", which is what we want; this is an argument-checking macro, and
03273ec5
JB
1279 the user should never get access to interior windows.
1280
1281 A window of any sort, leaf or interior, is dead iff the buffer,
1282 vchild, and hchild members are all nil. */
1283
1284#define CHECK_LIVE_WINDOW(x, i) \
2ad18bfd 1285 do { \
c5af3bb9 1286 if (!WINDOWP ((x)) \
03273ec5 1287 || NILP (XWINDOW ((x))->buffer)) \
806b4d9b 1288 x = wrong_type_argument (Qwindow_live_p, (x)); \
2ad18bfd 1289 } while (0)
03273ec5 1290
3cfe6dfd 1291#define CHECK_PROCESS(x, i) \
c5af3bb9 1292 do { if (!PROCESSP ((x))) x = wrong_type_argument (Qprocessp, (x)); } while (0)
3cfe6dfd
JB
1293
1294#define CHECK_NUMBER(x, i) \
c5af3bb9 1295 do { if (!INTEGERP ((x))) x = wrong_type_argument (Qintegerp, (x)); } while (0)
3cfe6dfd
JB
1296
1297#define CHECK_NATNUM(x, i) \
a4a9f09f 1298 do { if (!NATNUMP (x)) x = wrong_type_argument (Qwholenump, (x)); } while (0)
3cfe6dfd
JB
1299
1300#define CHECK_MARKER(x, i) \
c5af3bb9 1301 do { if (!MARKERP ((x))) x = wrong_type_argument (Qmarkerp, (x)); } while (0)
3cfe6dfd
JB
1302
1303#define CHECK_NUMBER_COERCE_MARKER(x, i) \
221f4ef3 1304 do { if (MARKERP ((x))) XSETFASTINT (x, marker_position (x)); \
c5af3bb9 1305 else if (!INTEGERP ((x))) x = wrong_type_argument (Qinteger_or_marker_p, (x)); } while (0)
3cfe6dfd 1306
3cfe6dfd
JB
1307#define XFLOATINT(n) extract_float((n))
1308
1309#define CHECK_FLOAT(x, i) \
c5af3bb9 1310 do { if (!FLOATP (x)) \
2ad18bfd 1311 x = wrong_type_argument (Qfloatp, (x)); } while (0)
3cfe6dfd
JB
1312
1313#define CHECK_NUMBER_OR_FLOAT(x, i) \
c5af3bb9 1314 do { if (!FLOATP (x) && !INTEGERP (x)) \
2ad18bfd 1315 x = wrong_type_argument (Qnumberp, (x)); } while (0)
3cfe6dfd
JB
1316
1317#define CHECK_NUMBER_OR_FLOAT_COERCE_MARKER(x, i) \
221f4ef3 1318 do { if (MARKERP (x)) XSETFASTINT (x, marker_position (x)); \
c5af3bb9 1319 else if (!INTEGERP (x) && !FLOATP (x)) \
2ad18bfd 1320 x = wrong_type_argument (Qnumber_or_marker_p, (x)); } while (0)
3cfe6dfd 1321
20280af7 1322#define CHECK_OVERLAY(x, i) \
c5af3bb9 1323 do { if (!OVERLAYP ((x))) x = wrong_type_argument (Qoverlayp, (x));} while (0)
20280af7 1324
3cfe6dfd
JB
1325/* Cast pointers to this type to compare them. Some machines want int. */
1326#ifndef PNTR_COMPARISON_TYPE
68c45bf0 1327#define PNTR_COMPARISON_TYPE EMACS_UINT
3cfe6dfd
JB
1328#endif
1329\f
1330/* Define a built-in function for calling from Lisp.
1331 `lname' should be the name to give the function in Lisp,
1332 as a null-terminated C string.
1333 `fnname' should be the name of the function in C.
1334 By convention, it starts with F.
1335 `sname' should be the name for the C constant structure
1336 that records information on this function for internal use.
1337 By convention, it should be the same as `fnname' but with S instead of F.
1338 It's too bad that C macros can't compute this from `fnname'.
1339 `minargs' should be a number, the minimum number of arguments allowed.
1340 `maxargs' should be a number, the maximum number of arguments allowed,
1341 or else MANY or UNEVALLED.
1342 MANY means pass a vector of evaluated arguments,
1343 in the form of an integer number-of-arguments
1344 followed by the address of a vector of Lisp_Objects
1345 which contains the argument values.
1346 UNEVALLED means pass the list of unevaluated arguments
1347 `prompt' says how to read arguments for an interactive call.
eab9d423 1348 See the doc string for `interactive'.
3cfe6dfd 1349 A null string means call interactively with no arguments.
eab9d423 1350 `doc' is documentation for the user. */
3cfe6dfd 1351
5125ca93 1352#if !defined (__STDC__) || defined (USE_NONANSI_DEFUN)
7c06ac2b
RS
1353#define DEFUN(lname, fnname, sname, minargs, maxargs, prompt, doc) \
1354 Lisp_Object fnname (); \
1355 struct Lisp_Subr sname = \
1356 { PVEC_SUBR | (sizeof (struct Lisp_Subr) / sizeof (EMACS_INT)), \
1357 fnname, minargs, maxargs, lname, prompt, 0}; \
3cfe6dfd
JB
1358 Lisp_Object fnname
1359
c451d7b1
RS
1360#else
1361
1362/* This version of DEFUN declares a function prototype with the right
99a3d506 1363 arguments, so we can catch errors with maxargs at compile-time. */
7c06ac2b
RS
1364#define DEFUN(lname, fnname, sname, minargs, maxargs, prompt, doc) \
1365 Lisp_Object fnname DEFUN_ARGS_ ## maxargs ; \
1366 struct Lisp_Subr sname = \
1367 { PVEC_SUBR | (sizeof (struct Lisp_Subr) / sizeof (EMACS_INT)), \
1368 fnname, minargs, maxargs, lname, prompt, 0}; \
c451d7b1
RS
1369 Lisp_Object fnname
1370
1371/* Note that the weird token-substitution semantics of ANSI C makes
99a3d506 1372 this work for MANY and UNEVALLED. */
c451d7b1
RS
1373#define DEFUN_ARGS_MANY (int, Lisp_Object *)
1374#define DEFUN_ARGS_UNEVALLED (Lisp_Object)
1375#define DEFUN_ARGS_0 (void)
1376#define DEFUN_ARGS_1 (Lisp_Object)
1377#define DEFUN_ARGS_2 (Lisp_Object, Lisp_Object)
1378#define DEFUN_ARGS_3 (Lisp_Object, Lisp_Object, Lisp_Object)
1379#define DEFUN_ARGS_4 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object)
1380#define DEFUN_ARGS_5 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, \
1381 Lisp_Object)
1382#define DEFUN_ARGS_6 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, \
1383 Lisp_Object, Lisp_Object)
1384#define DEFUN_ARGS_7 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, \
1385 Lisp_Object, Lisp_Object, Lisp_Object)
5593f7e3
KH
1386#define DEFUN_ARGS_8 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, \
1387 Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object)
c451d7b1
RS
1388#endif
1389
3cfe6dfd 1390/* defsubr (Sname);
99a3d506 1391 is how we define the symbol for function `name' at start-up time. */
526a2be7 1392extern void defsubr P_ ((struct Lisp_Subr *));
3cfe6dfd
JB
1393
1394#define MANY -2
1395#define UNEVALLED -1
1396
526a2be7
AS
1397extern void defvar_lisp P_ ((char *, Lisp_Object *));
1398extern void defvar_lisp_nopro P_ ((char *, Lisp_Object *));
1399extern void defvar_bool P_ ((char *, int *));
1400extern void defvar_int P_ ((char *, int *));
1401extern void defvar_per_buffer P_ ((char *, Lisp_Object *, Lisp_Object, char *));
1402extern void defvar_kboard P_ ((char *, int));
3cfe6dfd
JB
1403
1404/* Macros we use to define forwarded Lisp variables.
1405 These are used in the syms_of_FILENAME functions. */
1406
3cfe6dfd
JB
1407#define DEFVAR_LISP(lname, vname, doc) defvar_lisp (lname, vname)
1408#define DEFVAR_LISP_NOPRO(lname, vname, doc) defvar_lisp_nopro (lname, vname)
1409#define DEFVAR_BOOL(lname, vname, doc) defvar_bool (lname, vname)
1410#define DEFVAR_INT(lname, vname, doc) defvar_int (lname, vname)
ef15f270
JB
1411#define DEFVAR_PER_BUFFER(lname, vname, type, doc) \
1412 defvar_per_buffer (lname, vname, type, 0)
32462604
KH
1413#define DEFVAR_KBOARD(lname, vname, doc) \
1414 defvar_kboard (lname, \
1415 (int)((char *)(&current_kboard->vname) \
1416 - (char *)current_kboard))
3cfe6dfd 1417\f
78ca380c
JB
1418/* Structure for recording Lisp call stack for backtrace purposes. */
1419
1420/* The special binding stack holds the outer values of variables while
1421 they are bound by a function application or a let form, stores the
1422 code to be executed for Lisp unwind-protect forms, and stores the C
1423 functions to be called for record_unwind_protect.
1424
1425 If func is non-zero, undoing this binding applies func to old_value;
1426 This implements record_unwind_protect.
1427 If func is zero and symbol is nil, undoing this binding evaluates
1428 the list of forms in old_value; this implements Lisp's unwind-protect
1429 form.
5fd6e274
RS
1430
1431 Otherwise, the element is a variable binding.
1432 If the symbol field is a symbol, it is an ordinary variable binding.
1433 Otherwise, it should be a cons cell (SYMBOL . BUFFER)
1434 which represents having bound BUFFER's local value.
1435 or (SYMBOL . nil), which represents having bound the default value. */
1436
3cfe6dfd
JB
1437struct specbinding
1438 {
1439 Lisp_Object symbol, old_value;
526a2be7 1440 Lisp_Object (*func) P_ ((Lisp_Object));
3cfe6dfd
JB
1441 Lisp_Object unused; /* Dividing by 16 is faster than by 12 */
1442 };
1443
1444extern struct specbinding *specpdl;
1445extern struct specbinding *specpdl_ptr;
1446extern int specpdl_size;
1447
78ca380c 1448/* Everything needed to describe an active condition case. */
3cfe6dfd
JB
1449struct handler
1450 {
78ca380c 1451 /* The handler clauses and variable from the condition-case form. */
3cfe6dfd
JB
1452 Lisp_Object handler;
1453 Lisp_Object var;
22bbbd42
RS
1454 /* Fsignal stores here the condition-case clause that applies,
1455 and Fcondition_case thus knows which clause to run. */
1456 Lisp_Object chosen_clause;
78ca380c
JB
1457
1458 /* Used to effect the longjump out to the handler. */
3cfe6dfd 1459 struct catchtag *tag;
78ca380c
JB
1460
1461 /* The next enclosing handler. */
3cfe6dfd
JB
1462 struct handler *next;
1463 };
1464
1465extern struct handler *handlerlist;
1466
1467extern struct catchtag *catchlist;
1468extern struct backtrace *backtrace_list;
1469
22bbbd42
RS
1470extern Lisp_Object memory_signal_data;
1471
3cfe6dfd
JB
1472/* An address near the bottom of the stack.
1473 Tells GC how to save a copy of the stack. */
1474extern char *stack_bottom;
1475
4742f524
RS
1476/* Check quit-flag and quit if it is non-nil.
1477 Typing C-g does not directly cause a quit; it only sets Vquit_flag.
1478 So the program needs to do QUIT at times when it is safe to quit.
1479 Every loop that might run for a long time or might not exit
1480 ought to do QUIT at least once, at a safe place.
1481 Unless that is impossible, of course.
1482 But it is very desirable to avoid creating loops where QUIT is impossible.
1483
1484 Exception: if you set immediate_quit to nonzero,
1485 then the handler that responds to the C-g does the quit itself.
1486 This is a good thing to do around a loop that has no side effects
1487 and (in particular) cannot call arbitrary Lisp code. */
3cfe6dfd 1488
a69a6e61
GM
1489#define QUIT \
1490 do { \
1491 if (!NILP (Vquit_flag) && NILP (Vinhibit_quit)) \
1492 { \
1493 Vquit_flag = Qnil; \
1494 Fsignal (Qquit, Qnil); \
1495 } \
1496 } while (0)
3cfe6dfd
JB
1497
1498/* Nonzero if ought to quit now. */
1499
efb859b4 1500#define QUITP (!NILP (Vquit_flag) && NILP (Vinhibit_quit))
3cfe6dfd 1501\f
8ac90470 1502/* Variables used locally in the following case handling macros. */
2e34157c
RS
1503extern int case_temp1;
1504extern Lisp_Object case_temp2;
8ac90470 1505
e98227af 1506/* Current buffer's map from characters to lower-case characters. */
3cfe6dfd 1507
8ac90470 1508#define DOWNCASE_TABLE current_buffer->downcase_table
3cfe6dfd 1509
e98227af 1510/* Current buffer's map from characters to upper-case characters. */
3cfe6dfd 1511
8ac90470 1512#define UPCASE_TABLE current_buffer->upcase_table
3cfe6dfd 1513
e98227af 1514/* Downcase a character, or make no change if that cannot be done. */
3cfe6dfd 1515
8ac90470
KH
1516#define DOWNCASE(CH) \
1517 ((case_temp1 = (CH), \
1518 case_temp2 = CHAR_TABLE_REF (DOWNCASE_TABLE, case_temp1), \
1519 NATNUMP (case_temp2)) \
1520 ? XFASTINT (case_temp2) : case_temp1)
3cfe6dfd 1521
e98227af 1522/* 1 if CH is upper case. */
3cfe6dfd 1523
476d47ce 1524#define UPPERCASEP(CH) (DOWNCASE (CH) != (CH))
3cfe6dfd 1525
e98227af 1526/* 1 if CH is neither upper nor lower case. */
3cfe6dfd 1527
8ac90470 1528#define NOCASEP(CH) (UPCASE1 (CH) == (CH))
3cfe6dfd 1529
e98227af 1530/* 1 if CH is lower case. */
3cfe6dfd 1531
e98227af 1532#define LOWERCASEP(CH) (!UPPERCASEP (CH) && !NOCASEP(CH))
3cfe6dfd 1533
e98227af 1534/* Upcase a character, or make no change if that cannot be done. */
3cfe6dfd 1535
e98227af
KH
1536#define UPCASE(CH) (!UPPERCASEP (CH) ? UPCASE1 (CH) : (CH))
1537
1538/* Upcase a character known to be not upper case. */
1539
8ac90470
KH
1540#define UPCASE1(CH) \
1541 ((case_temp1 = (CH), \
1542 case_temp2 = CHAR_TABLE_REF (UPCASE_TABLE, case_temp1), \
1543 NATNUMP (case_temp2)) \
1544 ? XFASTINT (case_temp2) : case_temp1)
3cfe6dfd 1545
c6a3c83c 1546extern Lisp_Object Vascii_downcase_table;
3cfe6dfd 1547\f
99a3d506 1548/* Number of bytes of structure consed since last GC. */
3cfe6dfd
JB
1549
1550extern int consing_since_gc;
1551
99a3d506 1552/* Threshold for doing another gc. */
3cfe6dfd 1553
65deefca 1554extern int gc_cons_threshold;
3cfe6dfd 1555
99a3d506 1556/* Structure for recording stack slots that need marking. */
3cfe6dfd
JB
1557
1558/* This is a chain of structures, each of which points at a Lisp_Object variable
1559 whose value should be marked in garbage collection.
1560 Normally every link of the chain is an automatic variable of a function,
1561 and its `val' points to some argument or local variable of the function.
1562 On exit to the function, the chain is set back to the value it had on entry.
e5f55f07
BF
1563 This way, no link remains in the chain when the stack frame containing the
1564 link disappears.
3cfe6dfd
JB
1565
1566 Every function that can call Feval must protect in this fashion all
99a3d506 1567 Lisp_Object variables whose contents will be used again. */
3cfe6dfd
JB
1568
1569extern struct gcpro *gcprolist;
1570
1571struct gcpro
1572 {
1573 struct gcpro *next;
1574 Lisp_Object *var; /* Address of first protected variable */
1575 int nvars; /* Number of consecutive protected variables */
4742f524
RS
1576#ifdef DEBUG_GCPRO
1577 int level;
1578#endif
3cfe6dfd
JB
1579 };
1580
4742f524
RS
1581#ifndef DEBUG_GCPRO
1582
3cfe6dfd
JB
1583#define GCPRO1(varname) \
1584 {gcpro1.next = gcprolist; gcpro1.var = &varname; gcpro1.nvars = 1; \
1585 gcprolist = &gcpro1; }
1586
1587#define GCPRO2(varname1, varname2) \
1588 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
1589 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
1590 gcprolist = &gcpro2; }
1591
1592#define GCPRO3(varname1, varname2, varname3) \
1593 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
1594 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
1595 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
1596 gcprolist = &gcpro3; }
1597
1598#define GCPRO4(varname1, varname2, varname3, varname4) \
1599 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
1600 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
1601 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
1602 gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \
1603 gcprolist = &gcpro4; }
1604
c47b8d02
RS
1605#define GCPRO5(varname1, varname2, varname3, varname4, varname5) \
1606 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
1607 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
1608 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
1609 gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \
1610 gcpro5.next = &gcpro4; gcpro5.var = &varname5; gcpro5.nvars = 1; \
1611 gcprolist = &gcpro5; }
1612
4742f524 1613#define UNGCPRO (gcprolist = gcpro1.next)
3cfe6dfd 1614
4742f524 1615#else
e98227af 1616
4742f524
RS
1617extern int gcpro_level;
1618
1619#define GCPRO1(varname) \
1620 {gcpro1.next = gcprolist; gcpro1.var = &varname; gcpro1.nvars = 1; \
1621 gcpro1.level = gcpro_level++; \
1622 gcprolist = &gcpro1; }
1623
1624#define GCPRO2(varname1, varname2) \
1625 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
1626 gcpro1.level = gcpro_level; \
1627 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
1628 gcpro2.level = gcpro_level++; \
1629 gcprolist = &gcpro2; }
1630
1631#define GCPRO3(varname1, varname2, varname3) \
1632 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
1633 gcpro1.level = gcpro_level; \
1634 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
1635 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
1636 gcpro3.level = gcpro_level++; \
1637 gcprolist = &gcpro3; }
1638
1639#define GCPRO4(varname1, varname2, varname3, varname4) \
1640 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
1641 gcpro1.level = gcpro_level; \
1642 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
1643 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
1644 gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \
1645 gcpro4.level = gcpro_level++; \
1646 gcprolist = &gcpro4; }
1647
1648#define GCPRO5(varname1, varname2, varname3, varname4, varname5) \
1649 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
1650 gcpro1.level = gcpro_level; \
1651 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
1652 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
1653 gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \
1654 gcpro5.next = &gcpro4; gcpro5.var = &varname5; gcpro5.nvars = 1; \
1655 gcpro5.level = gcpro_level++; \
1656 gcprolist = &gcpro5; }
1657
1658#define UNGCPRO \
1659 ((--gcpro_level != gcpro1.level) \
1660 ? (abort (), 0) \
1661 : ((gcprolist = gcpro1.next), 0))
1662
1663#endif /* DEBUG_GCPRO */
3cfe6dfd 1664
5db82c9d 1665/* Evaluate expr, UNGCPRO, and then return the value of expr. */
c47b8d02 1666#define RETURN_UNGCPRO(expr) \
0868e74e 1667do \
c47b8d02
RS
1668 { \
1669 Lisp_Object ret_ungc_val; \
1670 ret_ungc_val = (expr); \
1671 UNGCPRO; \
1672 return ret_ungc_val; \
1673 } \
0868e74e 1674while (0)
4742f524
RS
1675
1676/* Call staticpro (&var) to protect static variable `var'. */
1677
1678void staticpro P_ ((Lisp_Object *));
3cfe6dfd 1679\f
2f69f2ec
RS
1680/* Declare a Lisp-callable function. The MAXARGS parameter has the same
1681 meaning as in the DEFUN macro, and is used to construct a prototype. */
1682#if !defined (__STDC__) || defined (USE_NONANSI_DEFUN)
1683#define EXFUN(fnname, maxargs) \
1684 extern Lisp_Object fnname ()
1685#else
1686/* We can use the same trick as in the DEFUN macro to generate the
1687 appropriate prototype. */
1688#define EXFUN(fnname, maxargs) \
1689 extern Lisp_Object fnname DEFUN_ARGS_ ## maxargs
1690#endif
1691
526a2be7
AS
1692/* Forward declarations for prototypes. */
1693struct window;
1694struct frame;
2f69f2ec 1695
3cfe6dfd
JB
1696/* Defined in data.c */
1697extern Lisp_Object Qnil, Qt, Qquote, Qlambda, Qsubr, Qunbound;
1698extern Lisp_Object Qerror_conditions, Qerror_message, Qtop_level;
1699extern Lisp_Object Qerror, Qquit, Qwrong_type_argument, Qargs_out_of_range;
1700extern Lisp_Object Qvoid_variable, Qvoid_function;
1701extern Lisp_Object Qsetting_constant, Qinvalid_read_syntax;
1702extern Lisp_Object Qinvalid_function, Qwrong_number_of_arguments, Qno_catch;
1703extern Lisp_Object Qend_of_file, Qarith_error;
1704extern Lisp_Object Qbeginning_of_buffer, Qend_of_buffer, Qbuffer_read_only;
6c858311 1705extern Lisp_Object Qmark_inactive, Qtext_read_only;
3cfe6dfd 1706
59b4254d
JB
1707extern Lisp_Object Qrange_error, Qdomain_error, Qsingularity_error;
1708extern Lisp_Object Qoverflow_error, Qunderflow_error;
623ed1b0 1709
07a97bf8
RS
1710extern Lisp_Object Qintegerp, Qnumberp, Qnatnump, Qwholenump;
1711extern Lisp_Object Qsymbolp, Qlistp, Qconsp;
3cfe6dfd
JB
1712extern Lisp_Object Qstringp, Qarrayp, Qsequencep, Qbufferp;
1713extern Lisp_Object Qchar_or_string_p, Qmarkerp, Qvectorp;
4de86b16 1714extern Lisp_Object Qinteger_or_marker_p, Qnumber_or_marker_p;
7f73dc9d 1715extern Lisp_Object Qchar_table_p, Qvector_or_char_table_p;
4de86b16 1716extern Lisp_Object Qboundp, Qfboundp;
cde20f41 1717extern Lisp_Object Qbuffer_or_string_p;
3cfe6dfd
JB
1718extern Lisp_Object Qcdr;
1719
3cfe6dfd 1720extern Lisp_Object Qfloatp, Qinteger_or_floatp, Qinteger_or_float_or_marker_p;
3cfe6dfd 1721
ff11dfa1 1722extern Lisp_Object Qframep;
3cfe6dfd 1723
2f69f2ec
RS
1724EXFUN (Feq, 2);
1725EXFUN (Fnull, 1);
1726EXFUN (Flistp, 1);
1727EXFUN (Fconsp, 1);
1728EXFUN (Fatom, 1);
1729EXFUN (Fnlistp, 1);
1730EXFUN (Fintegerp, 1);
1731EXFUN (Fnatnump, 1);
1732EXFUN (Fsymbolp, 1);
1733EXFUN (Fvectorp, 1);
1734EXFUN (Fstringp, 1);
a1b5012f 1735EXFUN (Fmultibyte_string_p, 1);
2f69f2ec
RS
1736EXFUN (Farrayp, 1);
1737EXFUN (Fsequencep, 1);
1738EXFUN (Fbufferp, 1);
1739EXFUN (Fmarkerp, 1);
1740EXFUN (Fsubrp, 1);
1741EXFUN (Fchar_or_string_p, 1);
1742EXFUN (Finteger_or_marker_p, 1);
2f69f2ec
RS
1743EXFUN (Ffloatp, 1);
1744EXFUN (Finteger_or_floatp, 1);
1745EXFUN (Finteger_or_float_or_marker_p, 1);
3cfe6dfd 1746
2f69f2ec
RS
1747EXFUN (Fcar, 1);
1748EXFUN (Fcar_safe, 1);
1749EXFUN (Fcdr, 1);
1750EXFUN (Fcdr_safe, 1);
1751EXFUN (Fsetcar, 2);
1752EXFUN (Fsetcdr, 2);
1753EXFUN (Fboundp, 1);
1754EXFUN (Ffboundp, 1);
1755EXFUN (Fmakunbound, 1);
1756EXFUN (Ffmakunbound, 1);
1757EXFUN (Fsymbol_function, 1);
1758EXFUN (Fsymbol_plist, 1);
1759EXFUN (Fsymbol_name, 1);
1760extern Lisp_Object indirect_function P_ ((Lisp_Object));
1761EXFUN (Findirect_function, 1);
1762EXFUN (Ffset, 2);
1763EXFUN (Fsetplist, 2);
1764EXFUN (Fsymbol_value, 1);
a154f406 1765extern Lisp_Object find_symbol_value P_ ((Lisp_Object));
2f69f2ec
RS
1766EXFUN (Fset, 2);
1767EXFUN (Fdefault_value, 1);
1768EXFUN (Fset_default, 2);
1769EXFUN (Fdefault_boundp, 1);
1770EXFUN (Fmake_local_variable, 1);
a154f406 1771EXFUN (Flocal_variable_p, 2);
2f69f2ec
RS
1772EXFUN (Flocal_variable_if_set_p, 2);
1773
1774EXFUN (Faref, 2);
1775EXFUN (Faset, 3);
1776
1777EXFUN (Fstring_to_number, 2);
1778EXFUN (Fnumber_to_string, 1);
1779EXFUN (Feqlsign, 2);
1780EXFUN (Fgtr, 2);
1781EXFUN (Flss, 2);
1782EXFUN (Fgeq, 2);
1783EXFUN (Fleq, 2);
1784EXFUN (Fneq, 2);
1785EXFUN (Fzerop, 1);
1786EXFUN (Fplus, MANY);
1787EXFUN (Fminus, MANY);
1788EXFUN (Ftimes, MANY);
1789EXFUN (Fquo, MANY);
1790EXFUN (Frem, 2);
1791EXFUN (Fmax, MANY);
1792EXFUN (Fmin, MANY);
1793EXFUN (Flogand, MANY);
1794EXFUN (Flogior, MANY);
1795EXFUN (Flogxor, MANY);
1796EXFUN (Flognot, 1);
1797EXFUN (Flsh, 2);
1798EXFUN (Fash, 2);
1799
1800EXFUN (Fadd1, 1);
1801EXFUN (Fsub1, 1);
1802
1803extern Lisp_Object long_to_cons P_ ((unsigned long));
1804extern unsigned long cons_to_long P_ ((Lisp_Object));
1805extern void args_out_of_range P_ ((Lisp_Object, Lisp_Object));
1806extern void args_out_of_range_3 P_ ((Lisp_Object, Lisp_Object, Lisp_Object));
1807extern Lisp_Object wrong_type_argument P_ ((Lisp_Object, Lisp_Object));
1808extern void store_symval_forwarding P_ ((Lisp_Object, Lisp_Object, Lisp_Object));
1809extern Lisp_Object do_symval_forwarding P_ ((Lisp_Object));
5fd6e274 1810extern Lisp_Object set_internal P_ ((Lisp_Object, Lisp_Object, struct buffer *, int));
46abf440
AS
1811extern void syms_of_data P_ ((void));
1812extern void init_data P_ ((void));
3cfe6dfd 1813
a37e10f9 1814/* Defined in cmds.c */
2f69f2ec
RS
1815EXFUN (Fend_of_line, 1);
1816EXFUN (Fforward_char, 1);
1817EXFUN (Fforward_line, 1);
526a2be7
AS
1818extern int forward_point P_ ((int));
1819extern int internal_self_insert P_ ((int, int));
46abf440
AS
1820extern void syms_of_cmds P_ ((void));
1821extern void keys_of_cmds P_ ((void));
a37e10f9 1822
6b768554 1823/* Defined in coding.c */
2f69f2ec
RS
1824EXFUN (Fcoding_system_p, 1);
1825EXFUN (Fcheck_coding_system, 1);
34ba1f2e 1826EXFUN (Fread_coding_system, 2);
2f69f2ec 1827EXFUN (Fread_non_nil_coding_system, 1);
a154f406 1828EXFUN (Ffind_operation_coding_system, MANY);
526a2be7
AS
1829EXFUN (Fencode_coding_string, 3);
1830EXFUN (Fdecode_coding_string, 3);
080cb8cd 1831extern Lisp_Object detect_coding_system P_ ((unsigned char *, int, int));
68c45bf0 1832Lisp_Object code_convert_string_norecord P_ ((Lisp_Object, Lisp_Object, int));
85ef85ae 1833extern void init_coding P_ ((void));
46abf440
AS
1834extern void init_coding_once P_ ((void));
1835extern void syms_of_coding P_ ((void));
0868e74e
GM
1836extern Lisp_Object code_convert_string_norecord P_ ((Lisp_Object, Lisp_Object,
1837 int));
6b768554 1838
5e741a41 1839/* Defined in charset.c */
b4e187e2 1840extern int nonascii_insert_offset;
bb9c978a 1841extern Lisp_Object Vnonascii_translation_table;
5e741a41 1842EXFUN (Fchar_bytes, 1);
ec5d8db7 1843EXFUN (Fchar_width, 1);
a1b5012f
RS
1844extern int chars_in_text P_ ((unsigned char *, int));
1845extern int multibyte_chars_in_text P_ ((unsigned char *, int));
4a2f9c6a 1846extern int unibyte_char_to_multibyte P_ ((int));
5666cc6f 1847extern int multibyte_char_to_unibyte P_ ((int, Lisp_Object));
b4e187e2 1848extern Lisp_Object Qcharset;
46abf440
AS
1849extern void init_charset_once P_ ((void));
1850extern void syms_of_charset P_ ((void));
5e741a41 1851
a37e10f9 1852/* Defined in syntax.c */
2f69f2ec
RS
1853EXFUN (Fforward_word, 1);
1854EXFUN (Fskip_chars_forward, 2);
1855EXFUN (Fskip_chars_backward, 2);
526a2be7
AS
1856EXFUN (Fsyntax_table_p, 1);
1857EXFUN (Fsyntax_table, 0);
1858EXFUN (Fset_syntax_table, 1);
46abf440
AS
1859extern void init_syntax_once P_ ((void));
1860extern void syms_of_syntax P_ ((void));
a37e10f9 1861
3cfe6dfd 1862/* Defined in fns.c */
838fad15 1863extern void sweep_weak_hash_tables P_ ((void));
3cfe6dfd
JB
1864extern Lisp_Object Qstring_lessp;
1865extern Lisp_Object Vfeatures;
19481752 1866extern Lisp_Object QCtest, QCweakness, Qequal;
5010d3b8
GM
1867unsigned sxhash P_ ((Lisp_Object, int));
1868Lisp_Object make_hash_table P_ ((Lisp_Object, Lisp_Object, Lisp_Object,
1869 Lisp_Object, Lisp_Object, Lisp_Object,
1870 Lisp_Object));
d9138d5d 1871Lisp_Object copy_hash_table P_ ((struct Lisp_Hash_Table *));
5010d3b8 1872int hash_lookup P_ ((struct Lisp_Hash_Table *, Lisp_Object, unsigned *));
19481752
KH
1873int hash_put P_ ((struct Lisp_Hash_Table *, Lisp_Object, Lisp_Object,
1874 unsigned));
5010d3b8
GM
1875void hash_remove P_ ((struct Lisp_Hash_Table *, Lisp_Object));
1876void hash_clear P_ ((struct Lisp_Hash_Table *));
1877void remove_hash_entry P_ ((struct Lisp_Hash_Table *, int));
15b0ced5 1878extern void init_fns P_ ((void));
5010d3b8
GM
1879EXFUN (Fsxhash, 1);
1880EXFUN (Fmake_hash_table, MANY);
d9138d5d 1881EXFUN (Fcopy_hash_table, 1);
5010d3b8
GM
1882EXFUN (Fhash_table_count, 1);
1883EXFUN (Fhash_table_rehash_size, 1);
1884EXFUN (Fhash_table_rehash_threshold, 1);
1885EXFUN (Fhash_table_size, 1);
1886EXFUN (Fhash_table_test, 1);
1887EXFUN (Fhash_table_weak, 1);
1888EXFUN (Fhash_table_p, 1);
1889EXFUN (Fclrhash, 1);
1890EXFUN (Fgethash, 3);
1891EXFUN (Fputhash, 3);
1892EXFUN (Fremhash, 2);
1893EXFUN (Fmaphash, 2);
1894EXFUN (Fdefine_hash_table_test, 3);
1895
2f69f2ec
RS
1896EXFUN (Fidentity, 1);
1897EXFUN (Frandom, 1);
1898EXFUN (Flength, 1);
1899EXFUN (Fsafe_length, 1);
1900EXFUN (Fappend, MANY);
1901EXFUN (Fconcat, MANY);
1902EXFUN (Fvconcat, MANY);
1903EXFUN (Fcopy_sequence, 1);
b4e187e2
RS
1904EXFUN (Fstring_make_multibyte, 1);
1905EXFUN (Fstring_make_unibyte, 1);
1906EXFUN (Fstring_as_multibyte, 1);
1907EXFUN (Fstring_as_unibyte, 1);
2f69f2ec 1908EXFUN (Fsubstring, 3);
a1b5012f 1909extern Lisp_Object substring_both P_ ((Lisp_Object, int, int, int, int));
2f69f2ec
RS
1910EXFUN (Fnth, 2);
1911EXFUN (Fnthcdr, 2);
1912EXFUN (Fmemq, 2);
1913EXFUN (Fassq, 2);
1914EXFUN (Fassoc, 2);
1915EXFUN (Felt, 2);
1916EXFUN (Fmember, 2);
1917EXFUN (Frassq, 2);
1918EXFUN (Fdelq, 2);
1919EXFUN (Fsort, 2);
1920EXFUN (Freverse, 1);
1921EXFUN (Fnreverse, 1);
1922EXFUN (Fget, 2);
1923EXFUN (Fput, 3);
1924EXFUN (Fequal, 2);
1925EXFUN (Ffillarray, 2);
1926EXFUN (Fnconc, MANY);
1927EXFUN (Fmapcar, 2);
1928EXFUN (Fmapconcat, 3);
1929EXFUN (Fy_or_n_p, 1);
1930extern Lisp_Object do_yes_or_no_p P_ ((Lisp_Object));
1931EXFUN (Ffeaturep, 1);
6f39b7c8 1932EXFUN (Frequire, 3);
2f69f2ec
RS
1933EXFUN (Fprovide, 1);
1934extern Lisp_Object concat2 P_ ((Lisp_Object, Lisp_Object));
1935extern Lisp_Object concat3 P_ ((Lisp_Object, Lisp_Object, Lisp_Object));
1936extern Lisp_Object nconc2 P_ ((Lisp_Object, Lisp_Object));
1937extern Lisp_Object assq_no_quit P_ ((Lisp_Object, Lisp_Object));
1c5c931a 1938extern void clear_string_char_byte_cache P_ (());
a1b5012f
RS
1939extern int string_char_to_byte P_ ((Lisp_Object, int));
1940extern int string_byte_to_char P_ ((Lisp_Object, int));
ec5d8db7
AS
1941extern Lisp_Object string_make_multibyte P_ ((Lisp_Object));
1942extern Lisp_Object string_make_unibyte P_ ((Lisp_Object));
2f69f2ec
RS
1943EXFUN (Fcopy_alist, 1);
1944EXFUN (Fplist_get, 2);
5010d3b8 1945EXFUN (Fplist_put, 3);
2f69f2ec
RS
1946EXFUN (Fset_char_table_parent, 2);
1947EXFUN (Fchar_table_extra_slot, 2);
526a2be7 1948EXFUN (Fset_char_table_extra_slot, 3);
2f69f2ec
RS
1949EXFUN (Frassoc, 2);
1950EXFUN (Fstring_equal, 2);
42d65b5f 1951EXFUN (Fcompare_strings, 7);
2f69f2ec 1952EXFUN (Fstring_lessp, 2);
ec5d8db7 1953extern int char_table_translate P_ ((Lisp_Object, int));
526a2be7
AS
1954extern void map_char_table P_ ((void (*) (Lisp_Object, Lisp_Object, Lisp_Object),
1955 Lisp_Object, Lisp_Object, Lisp_Object, int,
1956 Lisp_Object *));
46abf440 1957extern void syms_of_fns P_ ((void));
2f69f2ec
RS
1958
1959/* Defined in floatfns.c */
2f69f2ec
RS
1960extern double extract_float P_ ((Lisp_Object));
1961EXFUN (Ffloat, 1);
2f69f2ec 1962EXFUN (Ftruncate, 2);
46abf440
AS
1963extern void init_floatfns P_ ((void));
1964extern void syms_of_floatfns P_ ((void));
3cfe6dfd 1965
c98adc1b 1966/* Defined in insdel.c */
2f69f2ec 1967extern void move_gap P_ ((int));
4ed24bf3 1968extern void move_gap_both P_ ((int, int));
2f69f2ec 1969extern void make_gap P_ ((int));
a1b5012f
RS
1970extern int copy_text P_ ((unsigned char *, unsigned char *, int, int, int));
1971extern int count_size_as_multibyte P_ ((unsigned char *, int));
ec5d8db7
AS
1972extern int count_combining_before P_ ((unsigned char *, int, int, int));
1973extern int count_combining_after P_ ((unsigned char *, int, int, int));
2f69f2ec
RS
1974extern void insert P_ ((unsigned char *, int));
1975extern void insert_and_inherit P_ ((unsigned char *, int));
4ed24bf3 1976extern void insert_1 P_ ((unsigned char *, int, int, int, int));
a1b5012f
RS
1977extern void insert_1_both P_ ((unsigned char *, int, int, int, int, int));
1978extern void insert_from_string P_ ((Lisp_Object, int, int, int, int, int));
2f69f2ec
RS
1979extern void insert_from_buffer P_ ((struct buffer *, int, int, int));
1980extern void insert_char P_ ((int));
1981extern void insert_string P_ ((char *));
1982extern void insert_before_markers P_ ((unsigned char *, int));
1983extern void insert_before_markers_and_inherit P_ ((unsigned char *, int));
a1b5012f 1984extern void insert_from_string_before_markers P_ ((Lisp_Object, int, int, int, int, int));
2f69f2ec 1985extern void del_range P_ ((int, int));
7dae4502 1986extern Lisp_Object del_range_1 P_ ((int, int, int, int));
4ed24bf3
RS
1987extern void del_range_byte P_ ((int, int, int));
1988extern void del_range_both P_ ((int, int, int, int, int));
7dae4502 1989extern Lisp_Object del_range_2 P_ ((int, int, int, int, int));
2f69f2ec
RS
1990extern void modify_region P_ ((struct buffer *, int, int));
1991extern void prepare_to_modify_buffer P_ ((int, int, int *));
1992extern void signal_before_change P_ ((int, int, int *));
1993extern void signal_after_change P_ ((int, int, int));
1e94b998
KH
1994extern void adjust_after_replace P_ ((int, int, Lisp_Object, int, int));
1995extern void adjust_after_insert P_ ((int, int, int, int, int));
d8fc7ce4 1996extern void replace_range P_ ((int, int, Lisp_Object, int, int, int));
46abf440 1997extern void syms_of_insdel P_ ((void));
c98adc1b 1998
1747fb16 1999/* Defined in dispnew.c */
37b793e6 2000extern Lisp_Object selected_frame;
2f69f2ec 2001EXFUN (Fding, 1);
f5969ae9 2002EXFUN (Fredraw_frame, 1);
2f69f2ec
RS
2003EXFUN (Fredraw_display, 0);
2004EXFUN (Fsleep_for, 2);
2005EXFUN (Fsit_for, 3);
526a2be7 2006extern Lisp_Object sit_for P_ ((int, int, int, int, int));
46abf440
AS
2007extern void init_display P_ ((void));
2008extern void syms_of_display P_ ((void));
b18c598f 2009extern void safe_bcopy P_ ((char *, char *, int));
1747fb16 2010
c98adc1b 2011/* Defined in xdisp.c */
d74347bc 2012extern Lisp_Object Qinhibit_redisplay;
439ae27b 2013extern Lisp_Object Vmessage_log_max;
a1b5012f 2014extern int message_enable_multibyte;
986113df 2015extern Lisp_Object echo_area_buffer[2];
15b0ced5 2016extern void check_message_stack P_ ((void));
986113df
GM
2017extern void setup_echo_area_for_printing P_ ((int));
2018extern int push_message P_ ((void));
2019extern void pop_message P_ ((void));
2020extern void restore_message P_ ((void));
2021extern Lisp_Object current_message P_ ((void));
2022extern void set_message P_ ((char *s, Lisp_Object, int, int));
2023extern void clear_message P_ ((int, int));
2f69f2ec
RS
2024extern void message P_ ((/* char *, ... */));
2025extern void message_nolog P_ ((/* char *, ... */));
2026extern void message1 P_ ((char *));
2027extern void message1_nolog P_ ((char *));
a1b5012f 2028extern void message2 P_ ((char *, int, int));
3b4490b3 2029extern void message2_nolog P_ ((char *, int, int));
5010d3b8
GM
2030extern void message3 P_ ((Lisp_Object, int, int));
2031extern void message3_nolog P_ ((Lisp_Object, int, int));
a1b5012f
RS
2032extern void message_dolog P_ ((char *, int, int, int));
2033extern void message_with_string P_ ((char *, Lisp_Object, int));
2f69f2ec 2034extern void message_log_maybe_newline P_ ((void));
526a2be7
AS
2035extern void update_echo_area P_ ((void));
2036extern void truncate_echo_area P_ ((int));
2037extern void redisplay P_ ((void));
19481752
KH
2038extern int check_point_in_composition
2039 P_ ((struct buffer *, int, struct buffer *, int));
526a2be7
AS
2040extern void redisplay_preserve_echo_area P_ ((void));
2041extern void mark_window_display_accurate P_ ((Lisp_Object, int));
2042extern int invisible_p P_ ((Lisp_Object, Lisp_Object));
2043extern void prepare_menu_bars P_ ((void));
46abf440
AS
2044extern void syms_of_xdisp P_ ((void));
2045extern void init_xdisp P_ ((void));
c98adc1b 2046
15b0ced5
GM
2047/* Defined in vm-limit.c. */
2048#ifdef __STDC__
2049extern void memory_warnings P_ ((void *, void (*warnfun) ()));
2050#else
2051extern void memory_warnings P_ ((char *, void (*warnfun) ()));
2052#endif
2053
3cfe6dfd 2054/* Defined in alloc.c */
f05d7ea2 2055extern void allocate_string_data P_ ((struct Lisp_String *, int, int));
15b0ced5 2056extern void uninterrupt_malloc P_ ((void));
526a2be7
AS
2057extern void malloc_warning P_ ((char *));
2058extern void memory_full P_ ((void));
2059extern void buffer_memory_full P_ ((void));
5010d3b8
GM
2060extern int survives_gc_p P_ ((Lisp_Object));
2061extern void mark_object P_ ((Lisp_Object *));
3cfe6dfd 2062extern Lisp_Object Vpurify_flag;
2f69f2ec 2063EXFUN (Fcons, 2);
b4e187e2
RS
2064EXFUN (list2, 2);
2065EXFUN (list3, 3);
2066EXFUN (list4, 4);
2067EXFUN (list5, 5);
2f69f2ec
RS
2068EXFUN (Flist, MANY);
2069EXFUN (Fmake_list, 2);
2070extern Lisp_Object allocate_misc P_ ((void));
2071EXFUN (Fmake_vector, 2);
2072EXFUN (Fvector, MANY);
2073EXFUN (Fmake_symbol, 1);
2074EXFUN (Fmake_marker, 0);
2075EXFUN (Fmake_string, 2);
2076extern Lisp_Object build_string P_ ((char *));
2077extern Lisp_Object make_string P_ ((char *, int));
ec5d8db7 2078extern Lisp_Object make_unibyte_string P_ ((char *, int));
d8fc7ce4 2079extern Lisp_Object make_multibyte_string P_ ((char *, int, int));
2f69f2ec
RS
2080extern Lisp_Object make_event_array P_ ((int, Lisp_Object *));
2081extern Lisp_Object make_uninit_string P_ ((int));
a1b5012f 2082extern Lisp_Object make_uninit_multibyte_string P_ ((int, int));
d8fc7ce4
KH
2083extern Lisp_Object make_string_from_bytes P_ ((char *, int, int));
2084extern Lisp_Object make_specified_string P_ ((char *, int, int, int));
2f69f2ec 2085EXFUN (Fpurecopy, 1);
d8fc7ce4 2086extern Lisp_Object make_pure_string P_ ((char *, int, int, int));
2f69f2ec
RS
2087extern Lisp_Object pure_cons P_ ((Lisp_Object, Lisp_Object));
2088extern Lisp_Object make_pure_vector P_ ((EMACS_INT));
2089EXFUN (Fgarbage_collect, 0);
2090EXFUN (Fmake_byte_code, MANY);
2091EXFUN (Fmake_bool_vector, 2);
2092EXFUN (Fmake_char_table, 2);
2093extern Lisp_Object make_sub_char_table P_ ((Lisp_Object));
7f73dc9d 2094extern Lisp_Object Qchar_table_extra_slots;
2f69f2ec 2095extern struct Lisp_Vector *allocate_vectorlike P_ ((EMACS_INT));
4d57802e 2096extern int gc_in_progress;
2f69f2ec 2097extern Lisp_Object make_float P_ ((double));
526a2be7
AS
2098extern void display_malloc_warning P_ ((void));
2099extern int inhibit_garbage_collection P_ ((void));
2100extern void free_marker P_ ((Lisp_Object));
2101extern void free_cons P_ ((struct Lisp_Cons *));
46abf440
AS
2102extern void init_alloc_once P_ ((void));
2103extern void init_alloc P_ ((void));
2104extern void syms_of_alloc P_ ((void));
3cfe6dfd
JB
2105
2106/* Defined in print.c */
2107extern Lisp_Object Vprin1_to_string_buffer;
7de6c766 2108extern void debug_print P_ ((Lisp_Object));
2f69f2ec
RS
2109EXFUN (Fprin1, 2);
2110EXFUN (Fprin1_to_string, 2);
2111EXFUN (Fprinc, 2);
2112EXFUN (Fterpri, 1);
2113EXFUN (Fprint, 2);
2114EXFUN (Ferror_message_string, 1);
3cfe6dfd 2115extern Lisp_Object Vstandard_output, Qstandard_output;
9453ea7b 2116extern Lisp_Object Qexternal_debugging_output;
2f69f2ec 2117extern void temp_output_buffer_setup P_ ((char *));
3cfe6dfd
JB
2118extern int print_level, print_escape_newlines;
2119extern Lisp_Object Qprint_escape_newlines;
526a2be7
AS
2120extern void write_string P_ ((char *, int));
2121extern void write_string_1 P_ ((char *, int, Lisp_Object));
2122extern void print_error_message P_ ((Lisp_Object, Lisp_Object));
2123extern Lisp_Object internal_with_output_to_temp_buffer
ec5d8db7 2124 P_ ((char *, Lisp_Object (*) (Lisp_Object), Lisp_Object));
526a2be7 2125extern void float_to_string P_ ((unsigned char *, double));
46abf440 2126extern void syms_of_print P_ ((void));
526a2be7
AS
2127
2128/* Defined in doprnt.c */
2129extern int doprnt P_ ((char *, int, char *, char *, int, char **));
2130extern int doprnt_lisp P_ ((char *, int, char *, char *, int, char **));
3cfe6dfd
JB
2131
2132/* Defined in lread.c */
2133extern Lisp_Object Qvariable_documentation, Qstandard_input;
393306dd 2134extern Lisp_Object Vobarray, initial_obarray, Vstandard_input;
2f69f2ec
RS
2135EXFUN (Fread, 1);
2136EXFUN (Fread_from_string, 3);
2137EXFUN (Fintern, 2);
2138EXFUN (Fintern_soft, 2);
5d8c7983 2139EXFUN (Fload, 5);
2f69f2ec 2140EXFUN (Fget_file_char, 0);
485bf581
RS
2141EXFUN (Fread_char, 2);
2142EXFUN (Fread_event, 2);
2143extern Lisp_Object read_filtered_event P_ ((int, int, int, int));
eb542c51 2144EXFUN (Feval_region, 4);
2f69f2ec
RS
2145extern Lisp_Object intern P_ ((char *));
2146extern Lisp_Object make_symbol P_ ((char *));
a1b5012f 2147extern Lisp_Object oblookup P_ ((Lisp_Object, char *, int, int));
c5e3de70
RS
2148#define LOADHIST_ATTACH(x) \
2149 if (initialized) Vcurrent_load_list = Fcons (x, Vcurrent_load_list)
2150extern Lisp_Object Vcurrent_load_list;
2151extern Lisp_Object Vload_history;
526a2be7
AS
2152extern int openp P_ ((Lisp_Object, Lisp_Object, char *, Lisp_Object *, int));
2153extern int isfloat_string P_ ((char *));
2154extern void map_obarray P_ ((Lisp_Object, void (*) (Lisp_Object, Lisp_Object),
2155 Lisp_Object));
2156extern void dir_warning P_ ((char *, Lisp_Object));
2157extern void close_load_descs P_ ((void));
46abf440
AS
2158extern void init_obarray P_ ((void));
2159extern void init_lread P_ ((void));
2160extern void syms_of_lread P_ ((void));
3cfe6dfd
JB
2161
2162/* Defined in eval.c */
2163extern Lisp_Object Qautoload, Qexit, Qinteractive, Qcommandp, Qdefun, Qmacro;
ad236261 2164extern Lisp_Object Vinhibit_quit, Qinhibit_quit, Vquit_flag;
3cfe6dfd
JB
2165extern Lisp_Object Vmocklisp_arguments, Qmocklisp, Qmocklisp_arguments;
2166extern Lisp_Object Vautoload_queue;
973e8873 2167extern Lisp_Object Vdebug_on_error;
f1b6e5fc
SM
2168/* To run a normal hook, use the appropriate function from the list below.
2169 The calling convention:
2170
846d69ac 2171 if (!NILP (Vrun_hooks))
f1b6e5fc
SM
2172 call1 (Vrun_hooks, Qmy_funny_hook);
2173
2174 should no longer be used. */
3cfe6dfd 2175extern Lisp_Object Vrun_hooks;
2f69f2ec
RS
2176EXFUN (Frun_hooks, MANY);
2177EXFUN (Frun_hook_with_args, MANY);
2178EXFUN (Frun_hook_with_args_until_success, MANY);
2179EXFUN (Frun_hook_with_args_until_failure, MANY);
526a2be7
AS
2180extern Lisp_Object run_hook_list_with_args P_ ((Lisp_Object, int, Lisp_Object *));
2181extern void run_hook_with_args_2 P_ ((Lisp_Object, Lisp_Object, Lisp_Object));
2f69f2ec
RS
2182EXFUN (Fand, UNEVALLED);
2183EXFUN (For, UNEVALLED);
2184EXFUN (Fif, UNEVALLED);
2185EXFUN (Fprogn, UNEVALLED);
2186EXFUN (Fprog1, UNEVALLED);
2187EXFUN (Fprog2, UNEVALLED);
2188EXFUN (Fsetq, UNEVALLED);
2189EXFUN (Fquote, UNEVALLED);
2190EXFUN (Fuser_variable_p, 1);
2191EXFUN (Finteractive_p, 0);
2192EXFUN (Fdefun, UNEVALLED);
2193EXFUN (Flet, UNEVALLED);
2194EXFUN (FletX, UNEVALLED);
2195EXFUN (Fwhile, UNEVALLED);
2196EXFUN (Fcatch, UNEVALLED);
2197EXFUN (Fthrow, 2);
2198EXFUN (Funwind_protect, UNEVALLED);
2199EXFUN (Fcondition_case, UNEVALLED);
2200EXFUN (Fsignal, 2);
2201EXFUN (Fautoload, 5);
2202EXFUN (Fcommandp, 1);
2203EXFUN (Feval, 1);
2204EXFUN (Fapply, MANY);
2205EXFUN (Ffuncall, MANY);
2206EXFUN (Fbacktrace, 0);
2207extern Lisp_Object apply1 P_ ((Lisp_Object, Lisp_Object));
2208extern Lisp_Object call0 P_ ((Lisp_Object));
2209extern Lisp_Object call1 P_ ((Lisp_Object, Lisp_Object));
2210extern Lisp_Object call2 P_ ((Lisp_Object, Lisp_Object, Lisp_Object));
2211extern Lisp_Object call3 P_ ((Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object));
2212extern Lisp_Object call4 P_ ((Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object));
2213extern Lisp_Object call5 P_ ((Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object));
2214extern Lisp_Object call6 P_ ((Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object));
2215EXFUN (Fdo_auto_save, 2);
2216extern Lisp_Object apply_lambda P_ ((Lisp_Object, Lisp_Object, int));
2217extern Lisp_Object internal_catch P_ ((Lisp_Object, Lisp_Object (*) (Lisp_Object), Lisp_Object));
2218extern Lisp_Object internal_condition_case P_ ((Lisp_Object (*) (void), Lisp_Object, Lisp_Object (*) (Lisp_Object)));
2219extern Lisp_Object internal_condition_case_1 P_ ((Lisp_Object (*) (Lisp_Object), Lisp_Object, Lisp_Object, Lisp_Object (*) (Lisp_Object)));
526a2be7
AS
2220extern void specbind P_ ((Lisp_Object, Lisp_Object));
2221extern void record_unwind_protect P_ ((Lisp_Object (*) (Lisp_Object), Lisp_Object));
2f69f2ec
RS
2222extern Lisp_Object unbind_to P_ ((int, Lisp_Object));
2223extern void error P_ ((/* char *, ... */));
526a2be7 2224extern void do_autoload P_ ((Lisp_Object, Lisp_Object));
2f69f2ec
RS
2225extern Lisp_Object un_autoload P_ ((Lisp_Object));
2226EXFUN (Ffetch_bytecode, 1);
46abf440
AS
2227extern void init_eval_once P_ ((void));
2228extern void init_eval P_ ((void));
2229extern void syms_of_eval P_ ((void));
3cfe6dfd
JB
2230
2231/* Defined in editfns.c */
986113df 2232EXFUN (Fcurrent_message, 0);
2f69f2ec
RS
2233EXFUN (Fgoto_char, 1);
2234EXFUN (Fpoint_min_marker, 0);
2235EXFUN (Fpoint_max_marker, 0);
2236EXFUN (Fpoint_min, 0);
2237EXFUN (Fpoint_max, 0);
2238EXFUN (Fpoint, 0);
2239EXFUN (Fpoint_marker, 0);
2240EXFUN (Fmark_marker, 0);
2241EXFUN (Fline_beginning_position, 1);
2242EXFUN (Fline_end_position, 1);
2243EXFUN (Ffollowing_char, 0);
2244EXFUN (Fprevious_char, 0);
2245EXFUN (Fchar_after, 1);
2246EXFUN (Finsert, MANY);
2247EXFUN (Finsert_and_inherit, MANY);
2248EXFUN (Finsert_before_markers, MANY);
2249EXFUN (Finsert_buffer_substring, 3);
2250EXFUN (Finsert_char, 3);
526a2be7 2251extern void insert1 P_ ((Lisp_Object));
2f69f2ec
RS
2252EXFUN (Feolp, 0);
2253EXFUN (Feobp, 0);
2254EXFUN (Fbolp, 0);
2255EXFUN (Fbobp, 0);
2256EXFUN (Fformat, MANY);
5010d3b8 2257EXFUN (Fmessage, MANY);
2f69f2ec
RS
2258extern Lisp_Object format1 P_ ((/* char *, ... */));
2259extern Lisp_Object make_buffer_string P_ ((int, int, int));
2260EXFUN (Fbuffer_substring, 2);
2261EXFUN (Fbuffer_string, 0);
2262extern Lisp_Object save_excursion_save P_ ((void));
2263extern Lisp_Object save_restriction_save P_ ((void));
2264extern Lisp_Object save_excursion_restore P_ ((Lisp_Object));
2265extern Lisp_Object save_restriction_restore P_ ((Lisp_Object));
2266EXFUN (Fchar_to_string, 1);
2267EXFUN (Fdelete_region, 2);
2268EXFUN (Fnarrow_to_region, 2);
2269EXFUN (Fwiden, 0);
2270EXFUN (Fuser_login_name, 1);
2271EXFUN (Fsystem_name, 0);
f5969ae9 2272EXFUN (Fcurrent_time, 0);
526a2be7 2273extern int clip_to_bounds P_ ((int, int, int));
b745ec7d
KH
2274extern Lisp_Object make_buffer_string P_ ((int, int, int));
2275extern Lisp_Object make_buffer_string_both P_ ((int, int, int, int, int));
46abf440
AS
2276extern void init_editfns P_ ((void));
2277extern void syms_of_editfns P_ ((void));
4baa6f88 2278EXFUN (Fcurrent_message, 0);
8ca534c4 2279extern Lisp_Object Vinhibit_field_text_motion;
3cfe6dfd
JB
2280
2281/* defined in buffer.c */
526a2be7 2282extern void nsberror P_ ((Lisp_Object));
88d33e52 2283extern char *no_switch_window P_ ((Lisp_Object window));
986113df 2284EXFUN (Fset_buffer_multibyte, 1);
2f69f2ec
RS
2285EXFUN (Foverlay_start, 1);
2286EXFUN (Foverlay_end, 1);
2287extern void adjust_overlays_for_insert P_ ((int, int));
2288extern void adjust_overlays_for_delete P_ ((int, int));
2289extern void fix_overlays_in_range P_ ((int, int));
526a2be7
AS
2290extern void report_overlay_modification P_ ((Lisp_Object, Lisp_Object, int,
2291 Lisp_Object, Lisp_Object, Lisp_Object));
2f69f2ec 2292extern int overlay_touches_p P_ ((int));
628300ba 2293extern Lisp_Object Vbuffer_alist, Vinhibit_read_only;
2f69f2ec
RS
2294EXFUN (Fget_buffer, 1);
2295EXFUN (Fget_buffer_create, 1);
2296EXFUN (Fset_buffer, 1);
4a2f9c6a 2297EXFUN (set_buffer_if_live, 1);
2f69f2ec
RS
2298EXFUN (Fbarf_if_buffer_read_only, 0);
2299EXFUN (Fcurrent_buffer, 0);
2300EXFUN (Fswitch_to_buffer, 2);
2301EXFUN (Fpop_to_buffer, 3);
dbe7f1ef 2302EXFUN (Fother_buffer, 3);
2f69f2ec
RS
2303EXFUN (Foverlay_get, 2);
2304EXFUN (Fbuffer_modified_p, 1);
2305EXFUN (Fset_buffer_modified_p, 1);
2306EXFUN (Fkill_buffer, 1);
2307EXFUN (Fkill_all_local_variables, 0);
2308EXFUN (Fbuffer_disable_undo, 1);
2309EXFUN (Fbuffer_enable_undo, 1);
2310EXFUN (Ferase_buffer, 0);
20280af7 2311extern Lisp_Object Qoverlayp;
2f69f2ec 2312extern Lisp_Object get_truename_buffer P_ ((Lisp_Object));
3cfe6dfd 2313extern struct buffer *all_buffers;
2f69f2ec 2314EXFUN (Fprevious_overlay_change, 1);
46abf440
AS
2315extern void init_buffer_once P_ ((void));
2316extern void init_buffer P_ ((void));
2317extern void syms_of_buffer P_ ((void));
2318extern void keys_of_buffer P_ ((void));
3cfe6dfd
JB
2319
2320/* defined in marker.c */
2321
2f69f2ec
RS
2322EXFUN (Fmarker_position, 1);
2323EXFUN (Fmarker_buffer, 1);
2324EXFUN (Fcopy_marker, 2);
2325EXFUN (Fset_marker, 3);
526a2be7 2326extern int marker_position P_ ((Lisp_Object));
ec5d8db7
AS
2327extern int marker_byte_position P_ ((Lisp_Object));
2328extern void clear_charpos_cache P_ ((struct buffer *));
2329extern int charpos_to_bytepos P_ ((int));
2330extern int buf_charpos_to_bytepos P_ ((struct buffer *, int));
2331extern int buf_bytepos_to_charpos P_ ((struct buffer *, int));
526a2be7
AS
2332extern void unchain_marker P_ ((Lisp_Object));
2333extern Lisp_Object set_marker_restricted P_ ((Lisp_Object, Lisp_Object, Lisp_Object));
4ed24bf3
RS
2334extern Lisp_Object set_marker_both P_ ((Lisp_Object, Lisp_Object, int, int));
2335extern Lisp_Object set_marker_restricted_both P_ ((Lisp_Object, Lisp_Object,
2336 int, int));
46abf440 2337extern void syms_of_marker P_ ((void));
3cfe6dfd
JB
2338
2339/* Defined in fileio.c */
2340
2341extern Lisp_Object Qfile_error;
2f69f2ec
RS
2342EXFUN (Ffind_file_name_handler, 2);
2343EXFUN (Ffile_name_as_directory, 1);
f5969ae9 2344EXFUN (Fmake_temp_name, 1);
2f69f2ec
RS
2345EXFUN (Fexpand_file_name, 2);
2346EXFUN (Ffile_name_nondirectory, 1);
2347EXFUN (Fsubstitute_in_file_name, 1);
2348EXFUN (Ffile_symlink_p, 1);
2349EXFUN (Fverify_visited_file_modtime, 1);
2350EXFUN (Ffile_exists_p, 1);
2351EXFUN (Ffile_name_absolute_p, 1);
2352EXFUN (Fdirectory_file_name, 1);
2353EXFUN (Ffile_name_directory, 1);
2354extern Lisp_Object expand_and_dir_to_file P_ ((Lisp_Object, Lisp_Object));
2355EXFUN (Ffile_accessible_directory_p, 1);
2356EXFUN (Funhandled_file_name_directory, 1);
2357EXFUN (Ffile_directory_p, 1);
b4e187e2 2358EXFUN (Fwrite_region, 7);
2f69f2ec
RS
2359EXFUN (Ffile_readable_p, 1);
2360EXFUN (Ffile_executable_p, 1);
2361EXFUN (Fread_file_name, 5);
38a734b8 2362extern Lisp_Object close_file_unwind P_ ((Lisp_Object));
526a2be7
AS
2363extern void report_file_error P_ ((char *, Lisp_Object));
2364extern int internal_delete_file P_ ((Lisp_Object));
46abf440 2365extern void syms_of_fileio P_ ((void));
4baa6f88 2366EXFUN (Fmake_temp_name, 1);
15b0ced5 2367extern void init_fileio_once P_ ((void));
3cfe6dfd
JB
2368
2369/* Defined in abbrev.c */
2370
2371extern Lisp_Object Vfundamental_mode_abbrev_table;
46abf440 2372extern void syms_of_abbrev P_ ((void));
3cfe6dfd
JB
2373
2374/* defined in search.c */
838fad15 2375extern void shrink_regexp_cache P_ ((void));
2f69f2ec
RS
2376EXFUN (Fstring_match, 3);
2377extern void restore_match_data P_ ((void));
2378EXFUN (Fmatch_data, 2);
f405b38d 2379EXFUN (Fset_match_data, 1);
2f69f2ec
RS
2380EXFUN (Fmatch_beginning, 1);
2381EXFUN (Fmatch_end, 1);
526a2be7
AS
2382extern int fast_string_match P_ ((Lisp_Object, Lisp_Object));
2383extern int fast_c_string_match_ignore_case P_ ((Lisp_Object, char *));
2384extern int scan_buffer P_ ((int, int, int, int, int *, int));
4ed24bf3 2385extern int scan_newline P_ ((int, int, int, int, int, int));
526a2be7
AS
2386extern int find_next_newline P_ ((int, int));
2387extern int find_next_newline_no_quit P_ ((int, int));
2388extern int find_before_next_newline P_ ((int, int, int));
46abf440 2389extern void syms_of_search P_ ((void));
3cfe6dfd
JB
2390
2391/* defined in minibuf.c */
2392
2393extern Lisp_Object last_minibuf_string;
526a2be7 2394extern void choose_minibuf_frame P_ ((void));
ec5d8db7 2395extern int scmp P_ ((unsigned char *, unsigned char *, int));
5593f7e3
KH
2396EXFUN (Fcompleting_read, 8);
2397EXFUN (Fread_from_minibuffer, 7);
2f69f2ec
RS
2398EXFUN (Fread_variable, 2);
2399EXFUN (Fread_buffer, 3);
2400EXFUN (Fread_minibuffer, 2);
2401EXFUN (Feval_minibuffer, 2);
5593f7e3
KH
2402EXFUN (Fread_string, 5);
2403EXFUN (Fread_no_blanks_input, 3);
2f69f2ec 2404extern Lisp_Object get_minibuffer P_ ((int));
526a2be7 2405extern void temp_echo_area_glyphs P_ ((char *));
46abf440
AS
2406extern void init_minibuf_once P_ ((void));
2407extern void syms_of_minibuf P_ ((void));
2408extern void keys_of_minibuf P_ ((void));
3cfe6dfd
JB
2409
2410/* Defined in callint.c */
2411
de7885bb 2412extern Lisp_Object Qminus, Qplus, Vcurrent_prefix_arg;
3cfe6dfd 2413extern Lisp_Object Vcommand_history;
7fd61057 2414extern Lisp_Object Qcall_interactively, Qmouse_leave_buffer_hook;
2f69f2ec
RS
2415EXFUN (Fcall_interactively, 3);
2416EXFUN (Fprefix_numeric_value, 1);
46abf440 2417extern void syms_of_callint P_ ((void));
3cfe6dfd
JB
2418
2419/* defined in casefiddle.c */
2420
2f69f2ec
RS
2421EXFUN (Fdowncase, 1);
2422EXFUN (Fupcase, 1);
2423EXFUN (Fcapitalize, 1);
2424EXFUN (Fupcase_region, 2);
2425EXFUN (Fupcase_initials, 1);
2426EXFUN (Fupcase_initials_region, 2);
46abf440
AS
2427extern void syms_of_casefiddle P_ ((void));
2428extern void keys_of_casefiddle P_ ((void));
3cfe6dfd 2429
1747fb16
RS
2430/* defined in casetab.c */
2431
2f69f2ec
RS
2432EXFUN (Fset_case_table, 1);
2433EXFUN (Fset_standard_case_table, 1);
46abf440
AS
2434extern void init_casetab_once P_ ((void));
2435extern void syms_of_casetab P_ ((void));
1747fb16 2436
3cfe6dfd
JB
2437/* defined in keyboard.c */
2438
2439extern Lisp_Object Qdisabled;
4b657f72 2440extern Lisp_Object Vtty_erase_char, Vhelp_form, Vtop_level;
2f69f2ec
RS
2441EXFUN (Fdiscard_input, 0);
2442EXFUN (Frecursive_edit, 0);
2443EXFUN (Fcommand_execute, 4);
2444EXFUN (Finput_pending_p, 0);
2445extern Lisp_Object menu_bar_items P_ ((Lisp_Object));
9ea173e8 2446extern Lisp_Object tool_bar_items P_ ((Lisp_Object, int *));
f498e3b2 2447extern Lisp_Object Qvertical_scroll_bar;
084cd810 2448extern void discard_mouse_events ();
2f69f2ec 2449EXFUN (Fevent_convert_list, 1);
e271fdb3 2450EXFUN (Fread_key_sequence, 5);
526a2be7
AS
2451EXFUN (Fset_input_mode, 4);
2452extern int detect_input_pending P_ ((void));
2453extern int detect_input_pending_run_timers P_ ((int));
2454extern void safe_run_hooks P_ ((Lisp_Object));
2455extern void cmd_error_internal P_ ((Lisp_Object, char *));
2456extern Lisp_Object command_loop_1 P_ ((void));
2457extern Lisp_Object recursive_edit_1 P_ ((void));
2458extern void record_auto_save P_ ((void));
46abf440
AS
2459extern void init_keyboard P_ ((void));
2460extern void syms_of_keyboard P_ ((void));
2461extern void keys_of_keyboard P_ ((void));
3cfe6dfd
JB
2462
2463/* defined in keymap.c */
2464
c451d7b1 2465extern Lisp_Object Qkeymap, Qmenu_bar;
3cfe6dfd 2466extern Lisp_Object current_global_map;
526a2be7
AS
2467EXFUN (Fmake_sparse_keymap, 1);
2468EXFUN (Fcopy_keymap, 1);
2f69f2ec 2469EXFUN (Fdefine_key, 3);
526a2be7 2470EXFUN (Flookup_key, 3);
2f69f2ec
RS
2471EXFUN (Fkey_binding, 2);
2472EXFUN (Fkey_description, 1);
2473EXFUN (Fsingle_key_description, 1);
2474EXFUN (Fwhere_is_internal, 4);
2475extern Lisp_Object access_keymap P_ ((Lisp_Object, Lisp_Object, int, int));
2476extern Lisp_Object store_in_keymap P_ ((Lisp_Object, Lisp_Object, Lisp_Object));
2477extern Lisp_Object get_keyelt P_ ((Lisp_Object, int));
2478extern Lisp_Object get_keymap P_ ((Lisp_Object));
2479extern Lisp_Object get_keymap_1 P_ ((Lisp_Object, int, int));
526a2be7
AS
2480extern void describe_vector P_ ((Lisp_Object, Lisp_Object,
2481 void (*) (Lisp_Object), int,
2482 Lisp_Object, Lisp_Object, int *, int));
2483extern void describe_map_tree P_ ((Lisp_Object, int, Lisp_Object, Lisp_Object,
2484 char *, int, int, int));
2485extern int current_minor_maps P_ ((Lisp_Object **, Lisp_Object **));
2486extern void initial_define_key P_ ((Lisp_Object, int, char *));
2487extern void initial_define_lispy_key P_ ((Lisp_Object, char *, char *));
2488extern void fix_submap_inheritance P_ ((Lisp_Object, Lisp_Object, Lisp_Object));
46abf440
AS
2489extern void syms_of_keymap P_ ((void));
2490extern void keys_of_keymap P_ ((void));
3cfe6dfd
JB
2491
2492/* defined in indent.c */
2f69f2ec
RS
2493EXFUN (Fvertical_motion, 2);
2494EXFUN (Findent_to, 2);
2495EXFUN (Fcurrent_column, 0);
2496EXFUN (Fmove_to_column, 2);
526a2be7
AS
2497extern int current_column P_ ((void));
2498extern void invalidate_current_column P_ ((void));
4ed24bf3 2499extern int indented_beyond_p P_ ((int, int, int));
46abf440 2500extern void syms_of_indent P_ ((void));
3cfe6dfd
JB
2501
2502/* defined in window.c */
afd0d237 2503extern Lisp_Object Qwindowp, Qwindow_live_p;
5010d3b8 2504EXFUN (Fwindow_end, 2);
2f69f2ec 2505EXFUN (Fselected_window, 0);
526a2be7
AS
2506EXFUN (Fnext_window, 3);
2507EXFUN (Fdelete_window, 1);
2508EXFUN (Fselect_window, 1);
2509EXFUN (Fset_window_buffer, 2);
2f69f2ec
RS
2510EXFUN (Fget_buffer_window, 2);
2511EXFUN (Fsave_window_excursion, UNEVALLED);
526a2be7 2512EXFUN (Fsplit_window, 3);
2f69f2ec
RS
2513EXFUN (Fset_window_configuration, 1);
2514EXFUN (Fcurrent_window_configuration, 1);
b4e187e2 2515extern int compare_window_configurations P_ ((Lisp_Object, Lisp_Object, int));
2f69f2ec
RS
2516EXFUN (Fcoordinates_in_window_p, 2);
2517EXFUN (Fwindow_at, 3);
2518EXFUN (Fpos_visible_in_window_p, 2);
f5969ae9 2519extern void mark_window_cursors_off P_ ((struct window *));
526a2be7
AS
2520extern int window_internal_height P_ ((struct window *));
2521extern int window_internal_width P_ ((struct window *));
2f69f2ec
RS
2522EXFUN (Frecenter, 1);
2523EXFUN (Fscroll_other_window, 1);
2524EXFUN (Fset_window_start, 3);
2525extern void temp_output_buffer_show P_ ((Lisp_Object));
526a2be7 2526extern void replace_buffer_in_all_windows P_ ((Lisp_Object));
46abf440
AS
2527extern void init_window_once P_ ((void));
2528extern void syms_of_window P_ ((void));
2529extern void keys_of_window P_ ((void));
3cfe6dfd 2530
ff11dfa1 2531/* defined in frame.c */
362fb47a 2532extern Lisp_Object Qvisible;
526a2be7 2533extern void store_frame_param P_ ((struct frame *, Lisp_Object, Lisp_Object));
2f69f2ec
RS
2534extern void store_in_alist P_ ((Lisp_Object *, Lisp_Object, Lisp_Object));
2535extern Lisp_Object do_switch_frame P_ ((Lisp_Object, Lisp_Object, int));
526a2be7 2536extern Lisp_Object get_frame_param P_ ((struct frame *, Lisp_Object));
dbe7f1ef 2537extern Lisp_Object frame_buffer_predicate P_ ((Lisp_Object));
2f69f2ec
RS
2538EXFUN (Fframep, 1);
2539EXFUN (Fselect_frame, 2);
2540EXFUN (Fselected_frame, 0);
2541EXFUN (Fwindow_frame, 1);
2542EXFUN (Fframe_root_window, 1);
2543EXFUN (Fframe_first_window, 1);
2544EXFUN (Fframe_selected_window, 1);
2545EXFUN (Fframe_list, 0);
2546EXFUN (Fnext_frame, 2);
2547EXFUN (Fdelete_frame, 2);
2548EXFUN (Fset_mouse_position, 3);
2549EXFUN (Fmake_frame_visible, 1);
2550EXFUN (Fmake_frame_invisible, 2);
2551EXFUN (Ficonify_frame, 1);
2552EXFUN (Fframe_visible_p, 1);
2553EXFUN (Fvisible_frame_list, 0);
2554EXFUN (Fframe_parameters, 1);
2555EXFUN (Fmodify_frame_parameters, 2);
2556EXFUN (Fset_frame_height, 3);
2557EXFUN (Fset_frame_width, 3);
2558EXFUN (Fset_frame_size, 3);
2559EXFUN (Fset_frame_position, 3);
2560EXFUN (Fraise_frame, 1);
2561EXFUN (Fredirect_frame_focus, 2);
526a2be7 2562EXFUN (Fset_frame_selected_window, 2);
dbe7f1ef 2563extern Lisp_Object frame_buffer_list P_ ((Lisp_Object));
526a2be7 2564extern void frames_discard_buffer P_ ((Lisp_Object));
dbe7f1ef 2565extern void set_frame_buffer_list P_ ((Lisp_Object, Lisp_Object));
526a2be7 2566extern void frames_bury_buffer P_ ((Lisp_Object));
46abf440
AS
2567extern void syms_of_frame P_ ((void));
2568extern void keys_of_frame P_ ((void));
3cfe6dfd
JB
2569
2570/* defined in emacs.c */
2f69f2ec 2571extern Lisp_Object decode_env_path P_ ((char *, char *));
3530d534 2572extern Lisp_Object Vinvocation_name, Vinvocation_directory;
e6faba7f 2573extern Lisp_Object Vinstallation_directory;
2f69f2ec 2574EXFUN (Fkill_emacs, 1);
68c45bf0
PE
2575#if HAVE_SETLOCALE
2576void fixup_locale P_ ((void));
ca9c0567
PE
2577void synchronize_system_messages_locale P_ ((void));
2578void synchronize_system_time_locale P_ ((void));
68c45bf0
PE
2579#else
2580#define setlocale(category, locale)
2581#define fixup_locale()
ca9c0567
PE
2582#define synchronize_system_messages_locale()
2583#define synchronize_system_time_locale()
68c45bf0 2584#endif
2f69f2ec 2585void shut_down_emacs P_ ((int, int, Lisp_Object));
3cfe6dfd
JB
2586/* Nonzero means don't do interactive redisplay and don't change tty modes */
2587extern int noninteractive;
2588/* Nonzero means don't do use window-system-specific display code */
2589extern int inhibit_window_system;
99a3d506 2590/* Nonzero means that a filter or a sentinel is running. */
7074fde6 2591extern int running_asynch_code;
3cfe6dfd
JB
2592
2593/* defined in process.c */
2f69f2ec
RS
2594EXFUN (Fget_process, 1);
2595EXFUN (Fget_buffer_process, 1);
2596EXFUN (Fprocessp, 1);
2597EXFUN (Fprocess_status, 1);
2598EXFUN (Fkill_process, 2);
2599EXFUN (Fprocess_send_eof, 1);
2600EXFUN (Fwaiting_for_user_input_p, 0);
6efad63b 2601extern Lisp_Object Qprocessp;
526a2be7
AS
2602extern void kill_buffer_processes P_ ((Lisp_Object));
2603extern int wait_reading_process_input P_ ((int, int, Lisp_Object, int));
2604extern void deactivate_process P_ ((Lisp_Object));
2605extern void add_keyboard_wait_descriptor P_ ((int));
2606extern void delete_keyboard_wait_descriptor P_ ((int));
2607extern void close_process_descs P_ ((void));
2608extern void status_notify P_ ((void));
2609extern int read_process_output P_ ((Lisp_Object, int));
46abf440
AS
2610extern void init_process P_ ((void));
2611extern void syms_of_process P_ ((void));
3cfe6dfd
JB
2612
2613/* defined in callproc.c */
9453ea7b 2614extern Lisp_Object Vexec_path, Vexec_directory, Vdata_directory;
c65be0e1 2615extern Lisp_Object Vdoc_directory;
f5969ae9 2616EXFUN (Fcall_process, MANY);
526a2be7 2617extern int child_setup P_ ((int, int, int, char **, int, Lisp_Object));
46abf440
AS
2618extern void init_callproc_1 P_ ((void));
2619extern void init_callproc P_ ((void));
2620extern void set_process_environment P_ ((void));
2621extern void syms_of_callproc P_ ((void));
3cfe6dfd 2622
3cfe6dfd
JB
2623/* defined in doc.c */
2624extern Lisp_Object Vdoc_file_name;
2f69f2ec
RS
2625EXFUN (Fsubstitute_command_keys, 1);
2626EXFUN (Fdocumentation, 2);
2627EXFUN (Fdocumentation_property, 3);
2628extern Lisp_Object read_doc_string P_ ((Lisp_Object));
3dd00fc3 2629extern Lisp_Object get_doc_string P_ ((Lisp_Object, int, int));
46abf440 2630extern void syms_of_doc P_ ((void));
4baa6f88 2631extern int read_bytecode_char P_ ((int));
3cfe6dfd
JB
2632
2633/* defined in bytecode.c */
2634extern Lisp_Object Qbytecode;
2f69f2ec 2635EXFUN (Fbyte_code, 3);
46abf440 2636extern void syms_of_bytecode P_ ((void));
35c7a974
GM
2637extern struct byte_stack *byte_stack_list;
2638extern void mark_byte_stack P_ ((void));
8e6e83b3 2639extern void unmark_byte_stack P_ ((void));
3cfe6dfd
JB
2640
2641/* defined in macros.c */
2642extern Lisp_Object Qexecute_kbd_macro;
2f69f2ec 2643EXFUN (Fexecute_kbd_macro, 2);
46abf440
AS
2644extern void init_macros P_ ((void));
2645extern void syms_of_macros P_ ((void));
2646extern void keys_of_macros P_ ((void));
3cfe6dfd 2647
d20c2151 2648/* defined in undo.c */
a387611b 2649extern Lisp_Object Qinhibit_read_only;
2f69f2ec
RS
2650EXFUN (Fundo_boundary, 0);
2651extern Lisp_Object truncate_undo_list P_ ((Lisp_Object, int, int));
526a2be7
AS
2652extern void record_marker_adjustment P_ ((Lisp_Object, int));
2653extern void record_insert P_ ((int, int));
443de1d7 2654extern void record_delete P_ ((int, Lisp_Object));
526a2be7
AS
2655extern void record_first_change P_ ((void));
2656extern void record_change P_ ((int, int));
2657extern void record_property_change P_ ((int, int, Lisp_Object, Lisp_Object,
2658 Lisp_Object));
46abf440 2659extern void syms_of_undo P_ ((void));
d20c2151 2660
8537f1cb 2661/* defined in textprop.c */
c2d8811c 2662extern Lisp_Object Qmodification_hooks;
23bc39b5 2663extern Lisp_Object Qrear_nonsticky, Qfont;
c2d8811c 2664extern Lisp_Object Qinsert_in_front_hooks, Qinsert_behind_hooks;
2f69f2ec
RS
2665EXFUN (Fnext_property_change, 3);
2666EXFUN (Fnext_single_property_change, 4);
2667EXFUN (Fprevious_single_property_change, 4);
2668EXFUN (Fget_text_property, 3);
2669EXFUN (Fput_text_property, 5);
2670EXFUN (Fset_text_properties, 4);
2671EXFUN (Ftext_property_not_all, 5);
2672EXFUN (Fprevious_char_property_change, 2);
2673EXFUN (Fnext_char_property_change, 2);
526a2be7 2674extern void report_interval_modification P_ ((Lisp_Object, Lisp_Object));
46abf440 2675extern void syms_of_textprop P_ ((void));
50075fa0
GM
2676extern Lisp_Object next_single_char_property_change P_ ((Lisp_Object,
2677 Lisp_Object,
2678 Lisp_Object,
2679 Lisp_Object));
48778e46
GM
2680extern Lisp_Object set_text_properties P_ ((Lisp_Object, Lisp_Object,
2681 Lisp_Object, Lisp_Object,
2682 Lisp_Object));
8537f1cb 2683
40131ef5 2684/* defined in intervals.c */
2f69f2ec 2685extern Lisp_Object get_local_map P_ ((int, struct buffer *));
40131ef5
KH
2686
2687/* defined in xmenu.c */
2f69f2ec
RS
2688EXFUN (Fx_popup_menu, 2);
2689EXFUN (Fx_popup_dialog, 2);
46abf440 2690extern void syms_of_xmenu P_ ((void));
acb137e5 2691extern int popup_activated_flag;
526a2be7
AS
2692
2693/* defined in sysdep.c */
0868e74e 2694extern void stuff_char P_ ((char c));
526a2be7
AS
2695extern void init_sigio P_ ((int));
2696extern void request_sigio P_ ((void));
2697extern void unrequest_sigio P_ ((void));
2698extern void reset_sys_modes P_ ((void));
2699extern void sys_subshell P_ ((void));
2700extern void sys_suspend P_ ((void));
2701extern void discard_tty_input P_ ((void));
2702extern void init_sys_modes P_ ((void));
2703extern void reset_sys_modes P_ ((void));
2704extern void get_frame_size P_ ((int *, int *));
2705extern void wait_for_termination P_ ((int));
2706extern void flush_pending_output P_ ((int));
2707extern void child_setup_tty P_ ((int));
2708extern void setup_pty P_ ((int));
2709extern int set_window_size P_ ((int, int, int));
2710extern void create_process P_ ((Lisp_Object, char **, Lisp_Object));
2711extern int tabs_safe_p P_ ((void));
2712extern void init_baud_rate P_ ((void));
68c45bf0
PE
2713extern int emacs_open P_ ((char *, int, int));
2714extern int emacs_close P_ ((int));
2715extern int emacs_read P_ ((int, char *, unsigned int));
2716extern int emacs_write P_ ((int, char *, unsigned int));
526a2be7
AS
2717
2718/* defined in filelock.c */
2719EXFUN (Funlock_buffer, 0);
9ae8d912 2720EXFUN (Ffile_locked_p, 1);
526a2be7
AS
2721extern void unlock_all_files P_ ((void));
2722extern void lock_file P_ ((Lisp_Object));
2723extern void unlock_file P_ ((Lisp_Object));
2724extern void unlock_buffer P_ ((struct buffer *));
46abf440 2725extern void syms_of_filelock P_ ((void));
15b0ced5
GM
2726extern void init_filelock P_ ((void));
2727
2728/* Defined in sound.c */
2729extern void syms_of_sound P_ ((void));
2730extern void init_sound P_ ((void));
46abf440
AS
2731
2732/* Defined in category.c */
2733extern void init_category_once P_ ((void));
2734extern void syms_of_category P_ ((void));
2735
2736/* Defined in ccl.c */
2737extern void syms_of_ccl P_ ((void));
2738
2739/* Defined in dired.c */
f5969ae9 2740EXFUN (Ffile_attributes, 1);
46abf440
AS
2741extern void syms_of_dired P_ ((void));
2742
2743/* Defined in mocklisp.c */
2744extern void syms_of_mocklisp P_ ((void));
2745
2746/* Defined in term.c */
2747extern void syms_of_term P_ ((void));
b18c598f 2748extern void fatal ();
46abf440
AS
2749
2750#ifdef HAVE_X_WINDOWS
2751/* Defined in fontset.c */
2752extern void syms_of_fontset P_ ((void));
5010d3b8 2753EXFUN (Fset_fontset_font, 4);
46abf440
AS
2754#endif
2755
2756/* Defined in xfaces.c */
2757extern void syms_of_xfaces P_ ((void));
2758
7de6c766
GM
2759/* Defined in getloadavg.c */
2760extern int getloadavg P_ ((double *, int));
2761
46abf440
AS
2762#ifdef HAVE_X_WINDOWS
2763/* Defined in xfns.c */
9ea173e8 2764extern void x_set_tool_bar_lines P_ ((struct frame *, Lisp_Object, Lisp_Object));
46abf440 2765extern void syms_of_xfns P_ ((void));
4baa6f88 2766EXFUN (Fx_hide_busy_cursor, 1);
15b0ced5 2767extern void init_xfns P_ ((void));
46abf440
AS
2768#endif
2769
2770/* Defined in xselect.c */
2771extern void syms_of_xselect P_ ((void));
2772
2773/* Defined in xterm.c */
2774extern void syms_of_xterm P_ ((void));
4baa6f88
DL
2775
2776/* Defined in getloadavg.c */
2777extern int getloadavg P_ ((double [], int));
40131ef5 2778\f
3cfe6dfd
JB
2779/* Nonzero means Emacs has already been initialized.
2780 Used during startup to detect startup of dumped Emacs. */
2781extern int initialized;
2782
2783extern int immediate_quit; /* Nonzero means ^G can quit instantly */
2784
339747e4 2785extern char *getenv (), *ctime (), *getwd ();
3cfe6dfd 2786extern long *xmalloc (), *xrealloc ();
9ac0d9e0 2787extern void xfree ();
3cfe6dfd 2788
526a2be7 2789extern char *egetenv P_ ((char *));
e98227af 2790
5d6be39f 2791/* Set up the name of the machine we're running on. */
526a2be7 2792extern void init_system_name P_ ((void));
881a5a80
RS
2793
2794/* Some systems (e.g., NT) use a different path separator than Unix,
2795 in addition to a device separator. Default the path separator
2796 to '/', and don't test for a device separator in IS_ANY_SEP. */
2797
e0c07012
RS
2798#ifdef WINDOWSNT
2799extern Lisp_Object Vdirectory_sep_char;
2800#endif
2801
881a5a80
RS
2802#ifndef DIRECTORY_SEP
2803#define DIRECTORY_SEP '/'
2804#endif
881a5a80
RS
2805#ifndef IS_DIRECTORY_SEP
2806#define IS_DIRECTORY_SEP(_c_) ((_c_) == DIRECTORY_SEP)
2807#endif
2808#ifndef IS_DEVICE_SEP
2809#ifndef DEVICE_SEP
2810#define IS_DEVICE_SEP(_c_) 0
2811#else
2812#define IS_DEVICE_SEP(_c_) ((_c_) == DEVICE_SEP)
2813#endif
2814#endif
2815#ifndef IS_ANY_SEP
2816#define IS_ANY_SEP(_c_) (IS_DIRECTORY_SEP (_c_))
2817#endif
51bd4610
KH
2818
2819#ifdef SWITCH_ENUM_BUG
2820#define SWITCH_ENUM_CAST(x) ((int)(x))
2821#else
2822#define SWITCH_ENUM_CAST(x) (x)
2823#endif