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