* lisp.h: Conditionally define interval structure and macros.
[bpt/emacs.git] / src / lisp.h
CommitLineData
3cfe6dfd 1/* Fundamental definitions for GNU Emacs Lisp interpreter.
4746118a 2 Copyright (C) 1985, 1986, 1987, 1992 Free Software Foundation, Inc.
3cfe6dfd
JB
3
4This file is part of GNU Emacs.
5
6GNU Emacs is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
4746118a 8the Free Software Foundation; either version 2, or (at your option)
3cfe6dfd
JB
9any later version.
10
11GNU Emacs is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Emacs; see the file COPYING. If not, write to
18the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20
21/* Define the fundamental Lisp data structures */
22
23/* This is the set of Lisp data types */
24
25enum Lisp_Type
26 {
27 /* Integer. XINT(obj) is the integer value. */
28 Lisp_Int,
29
30 /* Symbol. XSYMBOL (object) points to a struct Lisp_Symbol. */
31 Lisp_Symbol,
32
33 /* Marker (buffer ptr). XMARKER(object) points to a struct Lisp_Marker. */
34 Lisp_Marker,
35
36 /* String. XSTRING (object) points to a struct Lisp_String.
37 The length of the string, and its contents, are stored therein. */
38 Lisp_String,
39
40 /* Vector of Lisp objects. XVECTOR(object) points to a struct Lisp_Vector.
41 The length of the vector, and its contents, are stored therein. */
42 Lisp_Vector,
43
44 /* Cons. XCONS (object) points to a struct Lisp_Cons. */
45 Lisp_Cons,
46
47 /* Byte-compiled function. A vector of 4 to 6 elements which are the
48 arglist, bytecode-string, constant vector, stack size,
49 (optional) doc string, and (optional) interactive spec. */
50 Lisp_Compiled,
51
52 /* Editor buffer. XBUFFER(obj) points to a struct buffer. */
53 Lisp_Buffer,
54
55 /* Built-in function. XSUBR(obj) points to a struct Lisp_Subr
56 which describes how to call the function, and its documentation,
57 as well as pointing to the code. */
58 Lisp_Subr,
59
60 /* Internal value return by subroutines of read.
61 The user never sees this data type.
62 Its value is just a number. */
63 Lisp_Internal,
64
65 /* Forwarding pointer to an int variable.
66 This is allowed only in the value cell of a symbol,
67 and it means that the symbol's value really lives in the
68 specified int variable.
69 XINTPTR(obj) points to the int variable. */
70 Lisp_Intfwd,
71
72 /* Boolean forwarding pointer to an int variable.
73 This is like Lisp_Intfwd except that the ostensible
74 "value" of the symbol is t if the int variable is nonzero,
75 nil if it is zero. XINTPTR(obj) points to the int variable. */
76 Lisp_Boolfwd,
77
78 /* Object describing a connection to a subprocess.
79 It points to storage of type struct Lisp_Process */
80 Lisp_Process,
81
82 /* Forwarding pointer to a Lisp_Object variable.
83 This is allowed only in the value cell of a symbol,
84 and it means that the symbol's value really lives in the
85 specified variable.
86 XOBJFWD(obj) points to the Lisp_Object variable. */
87 Lisp_Objfwd,
88
ff11dfa1 89 /* Pointer to a vector-like object describing a display frame
3cfe6dfd 90 on which Emacs can display a window hierarchy. */
ff11dfa1 91 Lisp_Frame,
3cfe6dfd
JB
92
93 /* Used when a FILE * value needs to be passed
94 in an argument of type Lisp_Object.
95 You must do *(FILE **) XPNTR(obj) to get the value.
96 The user will never see this data type. */
97 Lisp_Internal_Stream,
98
99 /* Used in a symbol value cell when the symbol's value is per-buffer.
e5d77022
JB
100 The actual contents are a cons cell which starts a list like this:
101 (REALVALUE BUFFER CURRENT-ALIST-ELEMENT . DEFAULT-VALUE).
102
103 BUFFER is the last buffer for which this symbol's value was
104 made up to date.
105
106 CURRENT-ALIST-ELEMENT is a pointer to an element of BUFFER's
107 local_var_alist, that being the element whose car is this
108 variable. Or it can be a pointer to the
109 (CURRENT-ALIST-ELEMENT . DEFAULT-VALUE),
110 if BUFFER does not have an element in its alist for this
111 variable (that is, if BUFFER sees the default value of this
112 variable).
113
114 If we want to examine or set the value and BUFFER is current,
115 we just examine or set REALVALUE. If BUFFER is not current, we
116 store the current REALVALUE value into CURRENT-ALIST-ELEMENT,
117 then find the appropriate alist element for the buffer now
118 current and set up CURRENT-ALIST-ELEMENT. Then we set
119 REALVALUE out of that element, and store into BUFFER.
120
121 If we are setting the variable and the current buffer does not
122 have an alist entry for this variable, an alist entry is
123 created.
124
125 Note that REALVALUE can be a forwarding pointer. Each time it
bad481d4
JB
126 is examined or set, forwarding must be done. Each time we
127 switch buffers, buffer-local variables which forward into C
128 variables are swapped immediately, so the C code can assume
129 that they are always up to date. */
3cfe6dfd
JB
130 Lisp_Buffer_Local_Value,
131
132 /* Like Lisp_Buffer_Local_Value with one difference:
35a4d143
RS
133 merely setting the variable while some buffer is current
134 does not cause that buffer to have its own local value of this variable.
135 Only make-local-variable does that. */
3cfe6dfd
JB
136 Lisp_Some_Buffer_Local_Value,
137
138
139 /* Like Lisp_Objfwd except that value lives in a slot
140 in the current buffer. Value is byte index of slot within buffer */
141 Lisp_Buffer_Objfwd,
142
143 /* In symbol value cell, means var is unbound.
144 In symbol function cell, means function name is undefined. */
145 Lisp_Void,
146
147 /* Window used for Emacs display.
148 Data inside looks like a Lisp_Vector. */
149 Lisp_Window,
150
151 /* Used by save,set,restore-window-configuration */
152 Lisp_Window_Configuration
153
154#ifdef LISP_FLOAT_TYPE
155 ,
156 Lisp_Float
157#endif /* LISP_FLOAT_TYPE */
158 };
159
160#ifndef NO_UNION_TYPE
161
162#ifndef BIG_ENDIAN
163
164/* Definition of Lisp_Object for little-endian machines. */
165
166typedef
167union Lisp_Object
168 {
169 /* Used for comparing two Lisp_Objects;
170 also, positive integers can be accessed fast this way. */
171 int i;
172
173 struct
174 {
175 int val: 24;
176 char type;
177 } s;
178 struct
179 {
180 unsigned int val: 24;
181 char type;
182 } u;
183 struct
184 {
185 unsigned int val: 24;
186 enum Lisp_Type type: 7;
187 /* The markbit is not really part of the value of a Lisp_Object,
188 and is always zero except during garbage collection. */
189 unsigned int markbit: 1;
190 } gu;
191 }
192Lisp_Object;
193
194#else /* If BIG_ENDIAN */
195
196typedef
197union Lisp_Object
198 {
199 /* Used for comparing two Lisp_Objects;
200 also, positive integers can be accessed fast this way. */
201 int i;
202
203 struct
204 {
205 char type;
206 int val: 24;
207 } s;
208 struct
209 {
210 char type;
211 unsigned int val: 24;
212 } u;
213 struct
214 {
215 /* The markbit is not really part of the value of a Lisp_Object,
216 and is always zero except during garbage collection. */
217 unsigned int markbit: 1;
218 enum Lisp_Type type: 7;
219 unsigned int val: 24;
220 } gu;
221 }
222Lisp_Object;
223
224#endif /* BIG_ENDIAN */
225
226#endif /* NO_UNION_TYPE */
227
228
229/* If union type is not wanted, define Lisp_Object as just a number
230 and define the macros below to extract fields by shifting */
231
232#ifdef NO_UNION_TYPE
233
234#define Lisp_Object int
235
236/* These values are overridden by the m- file on some machines. */
237#ifndef VALBITS
238#define VALBITS 24
239#endif
240
241#ifndef GCTYPEBITS
242#define GCTYPEBITS 7
243#endif
244
245#ifndef VALMASK
246#define VALMASK ((1<<VALBITS) - 1)
247#endif
248#define GCTYPEMASK ((1<<GCTYPEBITS) - 1)
249#define MARKBIT (1 << (VALBITS + GCTYPEBITS))
250
251#endif /* NO_UNION_TYPE */
252\f
253/* These macros extract various sorts of values from a Lisp_Object.
254 For example, if tem is a Lisp_Object whose type is Lisp_Cons,
255 XCONS (tem) is the struct Lisp_Cons * pointing to the memory for that cons. */
256
257#ifdef NO_UNION_TYPE
258
259/* One need to override this if there must be high bits set in data space
260 (doing the result of the below & ((1 << (GCTYPE + 1)) - 1) would work
261 on all machines, but would penalise machines which don't need it)
262 */
263#ifndef XTYPE
264#define XTYPE(a) ((enum Lisp_Type) ((a) >> VALBITS))
265#endif
266
267#ifndef XSETTYPE
268#define XSETTYPE(a, b) ((a) = XUINT (a) | ((int)(b) << VALBITS))
269#endif
270
271/* Use XFASTINT for fast retrieval and storage of integers known
272 to be positive. This takes advantage of the fact that Lisp_Int is 0. */
273#define XFASTINT(a) (a)
274
275/* Extract the value of a Lisp_Object as a signed integer. */
276
277#ifndef XINT /* Some machines need to do this differently. */
e065a56e 278#define XINT(a) (((a) << (INTBITS-VALBITS)) >> (INTBITS-VALBITS))
3cfe6dfd
JB
279#endif
280
281/* Extract the value as an unsigned integer. This is a basis
282 for extracting it as a pointer to a structure in storage. */
283
284#ifndef XUINT
285#define XUINT(a) ((a) & VALMASK)
286#endif
287
288#ifndef XPNTR
289#ifdef HAVE_SHM
290/* In this representation, data is found in two widely separated segments. */
29eab336 291extern int pure_size;
3cfe6dfd 292#define XPNTR(a) \
29eab336 293 (XUINT (a) | (XUINT (a) > pure_size ? DATA_SEG_BITS : PURE_SEG_BITS))
3cfe6dfd
JB
294#else /* not HAVE_SHM */
295#ifdef DATA_SEG_BITS
296/* This case is used for the rt-pc.
297 In the diffs I was given, it checked for ptr = 0
298 and did not adjust it in that case.
299 But I don't think that zero should ever be found
300 in a Lisp object whose data type says it points to something. */
301#define XPNTR(a) (XUINT (a) | DATA_SEG_BITS)
302#else
303#define XPNTR(a) XUINT (a)
304#endif
305#endif /* not HAVE_SHM */
306#endif /* no XPNTR */
307
308#ifndef XSETINT
309#define XSETINT(a, b) ((a) = ((a) & ~VALMASK) | ((b) & VALMASK))
310#endif
311
312#ifndef XSETUINT
313#define XSETUINT(a, b) XSETINT (a, b)
314#endif
315
316#ifndef XSETPNTR
317#define XSETPNTR(a, b) XSETINT (a, b)
318#endif
319
320#ifndef XSET
321#define XSET(var, type, ptr) \
322 ((var) = ((int)(type) << VALBITS) + ((int) (ptr) & VALMASK))
323#endif
324
325/* During garbage collection, XGCTYPE must be used for extracting types
326 so that the mark bit is ignored. XMARKBIT accesses the markbit.
327 Markbits are used only in particular slots of particular structure types.
328 Other markbits are always zero.
329 Outside of garbage collection, all mark bits are always zero. */
330
331#ifndef XGCTYPE
332#define XGCTYPE(a) ((enum Lisp_Type) (((a) >> VALBITS) & GCTYPEMASK))
333#endif
334
335#if VALBITS + GCTYPEBITS == INTBITS - 1
336/* Make XMARKBIT faster if mark bit is sign bit. */
337#ifndef XMARKBIT
338#define XMARKBIT(a) ((a) < 0)
339#endif
340#endif /* markbit is sign bit */
341
342#ifndef XMARKBIT
343#define XMARKBIT(a) ((a) & MARKBIT)
344#endif
345
346#ifndef XSETMARKBIT
347#define XSETMARKBIT(a,b) ((a) = ((a) & ~MARKBIT) | ((b) ? MARKBIT : 0))
348#endif
349
350#ifndef XMARK
351#define XMARK(a) ((a) |= MARKBIT)
352#endif
353
354#ifndef XUNMARK
355#define XUNMARK(a) ((a) &= ~MARKBIT)
356#endif
357
358#endif /* NO_UNION_TYPE */
359
360#ifndef NO_UNION_TYPE
361
362#define XTYPE(a) ((enum Lisp_Type) (a).u.type)
363#define XSETTYPE(a, b) ((a).u.type = (char) (b))
364
365/* Use XFASTINT for fast retrieval and storage of integers known
366 to be positive. This takes advantage of the fact that Lisp_Int is 0. */
367#define XFASTINT(a) ((a).i)
368
369#ifdef EXPLICIT_SIGN_EXTEND
370/* Make sure we sign-extend; compilers have been known to fail to do so. */
371#define XINT(a) (((a).i << 8) >> 8)
372#else
373#define XINT(a) ((a).s.val)
374#endif /* EXPLICIT_SIGN_EXTEND */
375
376#define XUINT(a) ((a).u.val)
377#define XPNTR(a) ((a).u.val)
378#define XSETINT(a, b) ((a).s.val = (int) (b))
379#define XSETUINT(a, b) ((a).s.val = (int) (b))
380#define XSETPNTR(a, b) ((a).s.val = (int) (b))
381
382#define XSET(var, vartype, ptr) \
383 (((var).s.type = ((char) (vartype))), ((var).s.val = ((int) (ptr))))
384
385/* During garbage collection, XGCTYPE must be used for extracting types
386 so that the mark bit is ignored. XMARKBIT access the markbit.
387 Markbits are used only in particular slots of particular structure types.
388 Other markbits are always zero.
389 Outside of garbage collection, all mark bits are always zero. */
390
391#define XGCTYPE(a) ((a).gu.type)
392#define XMARKBIT(a) ((a).gu.markbit)
393#define XSETMARKBIT(a,b) (XMARKBIT(a) = (b))
394#define XMARK(a) (XMARKBIT(a) = 1)
395#define XUNMARK(a) (XMARKBIT(a) = 0)
396
397#endif /* NO_UNION_TYPE */
398
399
400#define XCONS(a) ((struct Lisp_Cons *) XPNTR(a))
401#define XBUFFER(a) ((struct buffer *) XPNTR(a))
402#define XVECTOR(a) ((struct Lisp_Vector *) XPNTR(a))
403#define XSUBR(a) ((struct Lisp_Subr *) XPNTR(a))
404#define XSTRING(a) ((struct Lisp_String *) XPNTR(a))
405#define XSYMBOL(a) ((struct Lisp_Symbol *) XPNTR(a))
406#define XFUNCTION(a) ((Lisp_Object (*)()) XPNTR(a))
407#define XMARKER(a) ((struct Lisp_Marker *) XPNTR(a))
408#define XOBJFWD(a) ((Lisp_Object *) XPNTR(a))
409#define XINTPTR(a) ((int *) XPNTR(a))
410#define XWINDOW(a) ((struct window *) XPNTR(a))
411#define XPROCESS(a) ((struct Lisp_Process *) XPNTR(a))
412#define XFLOAT(a) ((struct Lisp_Float *) XPNTR(a))
413
414#define XSETCONS(a, b) XSETPNTR(a, (int) (b))
415#define XSETBUFFER(a, b) XSETPNTR(a, (int) (b))
416#define XSETVECTOR(a, b) XSETPNTR(a, (int) (b))
417#define XSETSUBR(a, b) XSETPNTR(a, (int) (b))
418#define XSETSTRING(a, b) XSETPNTR(a, (int) (b))
419#define XSETSYMBOL(a, b) XSETPNTR(a, (int) (b))
420#define XSETFUNCTION(a, b) XSETPNTR(a, (int) (b))
421#define XSETMARKER(a, b) XSETPNTR(a, (int) (b))
422#define XSETOBJFWD(a, b) XSETPNTR(a, (int) (b))
423#define XSETINTPTR(a, b) XSETPNTR(a, (int) (b))
424#define XSETWINDOW(a, b) XSETPNTR(a, (int) (b))
425#define XSETPROCESS(a, b) XSETPNTR(a, (int) (b))
426#define XSETFLOAT(a, b) XSETPNTR(a, (int) (b))
427\f
e221eae3
JA
428#ifdef USE_TEXT_PROPERTIES
429/* Basic data type for use of intervals. See the macros in intervals.h */
430
431struct interval
432{
433 /* The first group of entries deal with the tree structure. */
434
435 unsigned int total_length; /* Length of myself and both children. */
436 unsigned int position; /* Cache of interval's character position */
437 struct interval *left; /* Intervals which precede me. */
438 struct interval *right; /* Intervals which succeed me. */
439 struct interval *parent; /* Parent in the tree, or the Lisp_Object
440 containing this interval tree. */
441
442 /* The remaining components are `properties' of the interval.
443 The first four are duplicates for things which can be on the list,
444 for purposes of speed. */
445
446 unsigned char write_protect; /* Non-zero means can't modify. */
447 unsigned char visible; /* Zero means don't display. */
448 unsigned char front_hungry; /* Non-zero means text inserted just
449 before this interval goes into it. */
450 unsigned char rear_hungry; /* Likewise for just after it. */
451
452 Lisp_Object plist; /* Properties of this interval. */
453};
454
455typedef struct interval *INTERVAL;
456
457/* Complain if object is not string or buffer type */
458#define CHECK_STRING_OR_BUFFER(x, i) \
459 { if (XTYPE ((x)) != Lisp_String && XTYPE ((x)) != Lisp_Buffer) \
460 x = wrong_type_argument (Qbuffer_or_string_p, (x)); }
461
462/* Macro used to conditionally compile intervals into certain data
463 structures. See, e.g., struct Lisp_String below. */
464#define DECLARE_INTERVALS INTERVAL intervals;
465
466/* Macro used to condionally compile interval initialization into
467 certain code. See, e.g., alloc.c. */
468#define INITIALIZE_INTERVAL(ptr,val) ptr->intervals = val
469
470#else /* No text properties */
471
472/* If no intervals are used, make the above definitions go away. */
473
474#define CHECK_STRING_OR_BUFFER(x, i)
475
476#define INTERVAL
477#define DECLARE_INTERVALS
478#define INITIALIZE_INTERVAL(ptr,val)
479
480#endif /* USE_TEXT_PROPERTIES */
481\f
3cfe6dfd
JB
482/* In a cons, the markbit of the car is the gc mark bit */
483
484struct Lisp_Cons
485 {
486 Lisp_Object car, cdr;
487 };
488
489/* Like a cons, but records info on where the text lives that it was read from */
490/* This is not really in use now */
491
492struct Lisp_Buffer_Cons
493 {
494 Lisp_Object car, cdr;
495 struct buffer *buffer;
496 int bufpos;
497 };
498
499/* In a string or vector, the sign bit of the `size' is the gc mark bit */
500
501struct Lisp_String
502 {
503 int size;
e221eae3 504 DECLARE_INTERVALS /* `data' field must be last. */
3cfe6dfd
JB
505 unsigned char data[1];
506 };
507
508struct Lisp_Vector
509 {
510 int size;
511 struct Lisp_Vector *next;
512 Lisp_Object contents[1];
513 };
514
515/* In a symbol, the markbit of the plist is used as the gc mark bit */
516
517struct Lisp_Symbol
518 {
519 struct Lisp_String *name;
520 Lisp_Object value;
521 Lisp_Object function;
522 Lisp_Object plist;
523 struct Lisp_Symbol *next; /* -> next symbol in this obarray bucket */
524 };
525
526struct Lisp_Subr
527 {
528 Lisp_Object (*function) ();
529 short min_args, max_args;
530 char *symbol_name;
531 char *prompt;
532 char *doc;
533 };
534
535/* In a marker, the markbit of the chain field is used as the gc mark bit */
536
537struct Lisp_Marker
538 {
539 struct buffer *buffer;
540 Lisp_Object chain;
541 int bufpos;
542 int modified;
543 };
544
545#ifdef LISP_FLOAT_TYPE
546/* Optional Lisp floating point type */
547struct Lisp_Float
548 {
549 Lisp_Object type; /* essentially used for mark-bit
550 and chaining when on free-list */
551 double data;
552 };
553#endif /* LISP_FLOAT_TYPE */
554
555/* A character, declared with the following typedef, is a member
556 of some character set associated with the current buffer. */
557typedef unsigned char UCHAR;
558
559/* Meanings of slots in a Lisp_Compiled: */
560
561#define COMPILED_ARGLIST 0
562#define COMPILED_BYTECODE 1
563#define COMPILED_CONSTANTS 2
564#define COMPILED_STACK_DEPTH 3
565#define COMPILED_DOC_STRING 4
566#define COMPILED_INTERACTIVE 5
567\f
568/* Data type checking */
569
efb859b4 570#define NILP(x) (XFASTINT (x) == XFASTINT (Qnil))
3cfe6dfd 571
4746118a
JB
572#ifdef LISP_FLOAT_TYPE
573#define NUMBERP(x) (XTYPE (x) == Lisp_Int || XTYPE (x) == Lisp_Float)
574#else
575#define NUMBERP(x) (XTYPE (x) == Lisp_Int)
576#endif
577
3cfe6dfd
JB
578/* #define LISTP(x) (XTYPE ((x)) == Lisp_Cons)*/
579#define CONSP(x) (XTYPE ((x)) == Lisp_Cons)
580#define EQ(x, y) (XFASTINT (x) == XFASTINT (y))
581
4746118a 582
3cfe6dfd 583#define CHECK_LIST(x, i) \
efb859b4 584 { if ((XTYPE ((x)) != Lisp_Cons) && !NILP (x)) x = wrong_type_argument (Qlistp, (x)); }
3cfe6dfd
JB
585
586#define CHECK_STRING(x, i) \
587 { if (XTYPE ((x)) != Lisp_String) x = wrong_type_argument (Qstringp, (x)); }
588
589#define CHECK_CONS(x, i) \
590 { if (XTYPE ((x)) != Lisp_Cons) x = wrong_type_argument (Qconsp, (x)); }
591
592#define CHECK_SYMBOL(x, i) \
593 { if (XTYPE ((x)) != Lisp_Symbol) x = wrong_type_argument (Qsymbolp, (x)); }
594
595#define CHECK_VECTOR(x, i) \
596 { if (XTYPE ((x)) != Lisp_Vector) x = wrong_type_argument (Qvectorp, (x)); }
597
598#define CHECK_BUFFER(x, i) \
599 { if (XTYPE ((x)) != Lisp_Buffer) x = wrong_type_argument (Qbufferp, (x)); }
600
601#define CHECK_WINDOW(x, i) \
602 { if (XTYPE ((x)) != Lisp_Window) x = wrong_type_argument (Qwindowp, (x)); }
603
604#define CHECK_PROCESS(x, i) \
605 { if (XTYPE ((x)) != Lisp_Process) x = wrong_type_argument (Qprocessp, (x)); }
606
607#define CHECK_NUMBER(x, i) \
608 { if (XTYPE ((x)) != Lisp_Int) x = wrong_type_argument (Qintegerp, (x)); }
609
610#define CHECK_NATNUM(x, i) \
611 { if (XTYPE ((x)) != Lisp_Int || XINT ((x)) < 0) \
612 x = wrong_type_argument (Qnatnump, (x)); }
613
614#define CHECK_MARKER(x, i) \
615 { if (XTYPE ((x)) != Lisp_Marker) x = wrong_type_argument (Qmarkerp, (x)); }
616
617#define CHECK_NUMBER_COERCE_MARKER(x, i) \
618 { if (XTYPE ((x)) == Lisp_Marker) XFASTINT (x) = marker_position (x); \
619 else if (XTYPE ((x)) != Lisp_Int) x = wrong_type_argument (Qinteger_or_marker_p, (x)); }
620
621#ifdef LISP_FLOAT_TYPE
622
623#ifndef DBL_DIG
624#define DBL_DIG 20
625#endif
626
627#define XFLOATINT(n) extract_float((n))
628
629#define CHECK_FLOAT(x, i) \
630{ if (XTYPE (x) != Lisp_Float) \
631 x = wrong_type_argument (Qfloatp, (x)); }
632
633#define CHECK_NUMBER_OR_FLOAT(x, i) \
634{ if (XTYPE (x) != Lisp_Float && XTYPE (x) != Lisp_Int) \
464f8898 635 x = wrong_type_argument (Qnumberp, (x)); }
3cfe6dfd
JB
636
637#define CHECK_NUMBER_OR_FLOAT_COERCE_MARKER(x, i) \
638{ if (XTYPE (x) == Lisp_Marker) XFASTINT (x) = marker_position (x); \
639 else if (XTYPE (x) != Lisp_Int && XTYPE (x) != Lisp_Float) \
464f8898 640 x = wrong_type_argument (Qnumber_or_marker_p, (x)); }
3cfe6dfd
JB
641
642#else /* Not LISP_FLOAT_TYPE */
643
644#define CHECK_NUMBER_OR_FLOAT CHECK_NUMBER
645
646#define CHECK_NUMBER_OR_FLOAT_COERCE_MARKER CHECK_NUMBER_COERCE_MARKER
647
648#define XFLOATINT(n) XINT((n))
649#endif /* LISP_FLOAT_TYPE */
650
3cfe6dfd
JB
651/* Cast pointers to this type to compare them. Some machines want int. */
652#ifndef PNTR_COMPARISON_TYPE
653#define PNTR_COMPARISON_TYPE unsigned int
654#endif
655\f
656/* Define a built-in function for calling from Lisp.
657 `lname' should be the name to give the function in Lisp,
658 as a null-terminated C string.
659 `fnname' should be the name of the function in C.
660 By convention, it starts with F.
661 `sname' should be the name for the C constant structure
662 that records information on this function for internal use.
663 By convention, it should be the same as `fnname' but with S instead of F.
664 It's too bad that C macros can't compute this from `fnname'.
665 `minargs' should be a number, the minimum number of arguments allowed.
666 `maxargs' should be a number, the maximum number of arguments allowed,
667 or else MANY or UNEVALLED.
668 MANY means pass a vector of evaluated arguments,
669 in the form of an integer number-of-arguments
670 followed by the address of a vector of Lisp_Objects
671 which contains the argument values.
672 UNEVALLED means pass the list of unevaluated arguments
673 `prompt' says how to read arguments for an interactive call.
674 This can be zero or a C string.
675 Zero means that interactive calls are not allowed.
676 A string is interpreted in a hairy way:
677 it should contain one line for each argument to be read, terminated by \n.
678 The first character of the line controls the type of parsing:
679 s -- read a string.
680 S -- read a symbol.
681 k -- read a key sequence and return it as a string.
682 a -- read a function name (symbol) with completion.
683 C -- read a command name (symbol) with completion.
684 v -- read a variable name (symbol) with completion.
685 b -- read a buffer name (a string) with completion.
686 B -- buffer name, may be existing buffer or may not be.
687 f -- read a file name, file must exist.
688 F -- read a file name, file need not exist.
689 n -- read a number.
690 c -- read a character and return it as a number.
691 p -- use the numeric value of the prefix argument.
692 P -- use raw value of prefix - can be nil, -, (NUMBER) or NUMBER.
693 x -- read a Lisp object from the minibuffer.
694 X -- read a Lisp form from the minibuffer and use its value.
695 A null string means call interactively with no arguments.
696 `doc' is documentation for the user.
697*/
698
699#define DEFUN(lname, fnname, sname, minargs, maxargs, prompt, doc) \
700 Lisp_Object fnname (); \
701 struct Lisp_Subr sname = {fnname, minargs, maxargs, lname, prompt, 0}; \
702 Lisp_Object fnname
703
704/* defsubr (Sname);
705 is how we define the symbol for function `name' at start-up time. */
706extern void defsubr ();
707
708#define MANY -2
709#define UNEVALLED -1
710
711extern void defvar_lisp ();
712extern void defvar_bool ();
713extern void defvar_int ();
714
715/* Macros we use to define forwarded Lisp variables.
716 These are used in the syms_of_FILENAME functions. */
717
718#define DEFVARLISP(lname, vname, doc) defvar_lisp (lname, vname)
719#define DEFVARBOOL(lname, vname, doc) defvar_bool (lname, vname)
720#define DEFVARINT(lname, vname, doc) defvar_int (lname, vname)
721#define DEFVARPERBUFFER(lname, vname, doc) \
722 defvar_per_buffer (lname, vname)
723
724#define DEFVAR_LISP(lname, vname, doc) defvar_lisp (lname, vname)
725#define DEFVAR_LISP_NOPRO(lname, vname, doc) defvar_lisp_nopro (lname, vname)
726#define DEFVAR_BOOL(lname, vname, doc) defvar_bool (lname, vname)
727#define DEFVAR_INT(lname, vname, doc) defvar_int (lname, vname)
ef15f270
JB
728#define DEFVAR_PER_BUFFER(lname, vname, type, doc) \
729 defvar_per_buffer (lname, vname, type, 0)
3cfe6dfd 730\f
78ca380c
JB
731/* Structure for recording Lisp call stack for backtrace purposes. */
732
733/* The special binding stack holds the outer values of variables while
734 they are bound by a function application or a let form, stores the
735 code to be executed for Lisp unwind-protect forms, and stores the C
736 functions to be called for record_unwind_protect.
737
738 If func is non-zero, undoing this binding applies func to old_value;
739 This implements record_unwind_protect.
740 If func is zero and symbol is nil, undoing this binding evaluates
741 the list of forms in old_value; this implements Lisp's unwind-protect
742 form.
743 Otherwise, undoing this binding stores old_value as symbol's value; this
744 undoes the bindings made by a let form or function call. */
3cfe6dfd
JB
745struct specbinding
746 {
747 Lisp_Object symbol, old_value;
748 Lisp_Object (*func) ();
749 Lisp_Object unused; /* Dividing by 16 is faster than by 12 */
750 };
751
752extern struct specbinding *specpdl;
753extern struct specbinding *specpdl_ptr;
754extern int specpdl_size;
755
78ca380c 756/* Everything needed to describe an active condition case. */
3cfe6dfd
JB
757struct handler
758 {
78ca380c 759 /* The handler clauses and variable from the condition-case form. */
3cfe6dfd
JB
760 Lisp_Object handler;
761 Lisp_Object var;
78ca380c
JB
762
763 /* Used to effect the longjump out to the handler. */
3cfe6dfd 764 struct catchtag *tag;
78ca380c
JB
765
766 /* The next enclosing handler. */
3cfe6dfd
JB
767 struct handler *next;
768 };
769
770extern struct handler *handlerlist;
771
772extern struct catchtag *catchlist;
773extern struct backtrace *backtrace_list;
774
775/* An address near the bottom of the stack.
776 Tells GC how to save a copy of the stack. */
777extern char *stack_bottom;
778
779/* Check quit-flag and quit if it is non-nil. */
780
781#define QUIT \
efb859b4 782 if (!NILP (Vquit_flag) && NILP (Vinhibit_quit)) \
3cfe6dfd
JB
783 { Vquit_flag = Qnil; Fsignal (Qquit, Qnil); }
784
785/* Nonzero if ought to quit now. */
786
efb859b4 787#define QUITP (!NILP (Vquit_flag) && NILP (Vinhibit_quit))
3cfe6dfd
JB
788\f
789/* 1 if CH is upper case. */
790
7b15897a
JB
791#define UPPERCASEP(CH) \
792 (XSTRING (current_buffer->downcase_table)->data[CH] != (CH))
3cfe6dfd
JB
793
794/* 1 if CH is lower case. */
795
796#define LOWERCASEP(CH) \
7b15897a
JB
797 (!UPPERCASEP (CH) \
798 && XSTRING (current_buffer->upcase_table)->data[CH] != (CH))
3cfe6dfd
JB
799
800/* 1 if CH is neither upper nor lower case. */
801
802#define NOCASEP(CH) (XSTRING (current_buffer->upcase_table)->data[CH] == (CH))
803
804/* Upcase a character, or make no change if that cannot be done. */
805
7b15897a
JB
806#define UPCASE(CH) \
807 (XSTRING (current_buffer->downcase_table)->data[CH] == (CH) \
808 ? UPCASE1 (CH) : (CH))
3cfe6dfd
JB
809
810/* Upcase a character known to be not upper case. */
811
812#define UPCASE1(CH) (XSTRING (current_buffer->upcase_table)->data[CH])
813
814/* Downcase a character, or make no change if that cannot be done. */
815
816#define DOWNCASE(CH) (XSTRING (current_buffer->downcase_table)->data[CH])
817
818/* Current buffer's map from characters to lower-case characters. */
819
820#define DOWNCASE_TABLE XSTRING (current_buffer->downcase_table)->data
821
822/* Table mapping each char to the next char with the same lowercase version.
823 This mapping is a no-op only for characters that don't have case. */
824#define UPCASE_TABLE XSTRING (current_buffer->upcase_table)->data
825
826extern Lisp_Object Vascii_downcase_table, Vascii_upcase_table;
827\f
828/* number of bytes of structure consed since last GC */
829
830extern int consing_since_gc;
831
832/* threshold for doing another gc */
833
834extern int gc_cons_threshold;
835
836/* Structure for recording stack slots that need marking */
837
838/* This is a chain of structures, each of which points at a Lisp_Object variable
839 whose value should be marked in garbage collection.
840 Normally every link of the chain is an automatic variable of a function,
841 and its `val' points to some argument or local variable of the function.
842 On exit to the function, the chain is set back to the value it had on entry.
843 This way, no link remains in the chain when the stack frame containing the link disappears.
844
845 Every function that can call Feval must protect in this fashion all
846 Lisp_Object variables whose contents will be used again. */
847
848extern struct gcpro *gcprolist;
849
850struct gcpro
851 {
852 struct gcpro *next;
853 Lisp_Object *var; /* Address of first protected variable */
854 int nvars; /* Number of consecutive protected variables */
855 };
856
857#define GCPRO1(varname) \
858 {gcpro1.next = gcprolist; gcpro1.var = &varname; gcpro1.nvars = 1; \
859 gcprolist = &gcpro1; }
860
861#define GCPRO2(varname1, varname2) \
862 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
863 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
864 gcprolist = &gcpro2; }
865
866#define GCPRO3(varname1, varname2, varname3) \
867 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
868 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
869 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
870 gcprolist = &gcpro3; }
871
872#define GCPRO4(varname1, varname2, varname3, varname4) \
873 {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
874 gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
875 gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
876 gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \
877 gcprolist = &gcpro4; }
878
879/* Call staticpro (&var) to protect static variable `var'. */
880
881void staticpro();
882
883#define UNGCPRO (gcprolist = gcpro1.next)
884
885/* Evaluate expr, UNGCPRO, and then return the value of expr. */
886#define RETURN_UNGCPRO(expr) \
887 do \
888 { \
889 Lisp_Object ret_ungc_val; \
890 ret_ungc_val = (expr); \
891 UNGCPRO; \
892 return ret_ungc_val; \
893 } \
894 while (0)
895\f
896/* Defined in data.c */
897extern Lisp_Object Qnil, Qt, Qquote, Qlambda, Qsubr, Qunbound;
898extern Lisp_Object Qerror_conditions, Qerror_message, Qtop_level;
899extern Lisp_Object Qerror, Qquit, Qwrong_type_argument, Qargs_out_of_range;
900extern Lisp_Object Qvoid_variable, Qvoid_function;
901extern Lisp_Object Qsetting_constant, Qinvalid_read_syntax;
902extern Lisp_Object Qinvalid_function, Qwrong_number_of_arguments, Qno_catch;
903extern Lisp_Object Qend_of_file, Qarith_error;
904extern Lisp_Object Qbeginning_of_buffer, Qend_of_buffer, Qbuffer_read_only;
905
4de86b16 906extern Lisp_Object Qintegerp, Qnumberp, Qnatnump, Qsymbolp, Qlistp, Qconsp;
3cfe6dfd
JB
907extern Lisp_Object Qstringp, Qarrayp, Qsequencep, Qbufferp;
908extern Lisp_Object Qchar_or_string_p, Qmarkerp, Qvectorp;
4de86b16
RS
909extern Lisp_Object Qinteger_or_marker_p, Qnumber_or_marker_p;
910extern Lisp_Object Qboundp, Qfboundp;
3cfe6dfd
JB
911extern Lisp_Object Qcdr;
912
913#ifdef LISP_FLOAT_TYPE
914extern Lisp_Object Qfloatp, Qinteger_or_floatp, Qinteger_or_float_or_marker_p;
915#endif /* LISP_FLOAT_TYPE */
916
ff11dfa1 917extern Lisp_Object Qframep;
3cfe6dfd
JB
918
919extern Lisp_Object Feq (), Fnull (), Flistp (), Fconsp (), Fatom (), Fnlistp ();
920extern Lisp_Object Fintegerp (), Fnatnump (), Fsymbolp ();
921extern Lisp_Object Fvectorp (), Fstringp (), Farrayp (), Fsequencep ();
922extern Lisp_Object Fbufferp (), Fmarkerp (), Fsubrp (), Fchar_or_string_p ();
923extern Lisp_Object Finteger_or_marker_p ();
924#ifdef LISP_FLOAT_TYPE
925extern Lisp_Object Ffloatp(), Finteger_or_floatp();
926extern Lisp_Object Finteger_or_float_or_marker_p(), Ftruncate();
927#endif /* LISP_FLOAT_TYPE */
928
929extern Lisp_Object Fcar (), Fcar_safe(), Fcdr (), Fcdr_safe();
930extern Lisp_Object Fsetcar (), Fsetcdr ();
931extern Lisp_Object Fboundp (), Ffboundp (), Fmakunbound (), Ffmakunbound ();
932extern Lisp_Object Fsymbol_function (), Fsymbol_plist (), Fsymbol_name ();
ffd56f97 933extern Lisp_Object indirect_function (), Findirect_function ();
3cfe6dfd 934extern Lisp_Object Ffset (), Fsetplist ();
760cbdd3 935extern Lisp_Object Fsymbol_value (), find_symbol_value (), Fset ();
3cfe6dfd
JB
936extern Lisp_Object Fdefault_value (), Fset_default ();
937
938extern Lisp_Object Faref (), Faset (), Farray_length ();
939
940extern Lisp_Object Fstring_to_int (), Fint_to_string ();
941extern Lisp_Object Feqlsign (), Fgtr (), Flss (), Fgeq (), Fleq (), Fneq (), Fzerop ();
942extern Lisp_Object Fplus (), Fminus (), Ftimes (), Fquo (), Frem (), Fmax (), Fmin ();
943extern Lisp_Object Flogand (), Flogior (), Flogxor (), Flognot (), Flsh (), Fash ();
944extern Lisp_Object Fadd1 (), Fsub1 ();
945
946extern Lisp_Object make_number ();
947extern void args_out_of_range ();
948extern void args_out_of_range_3 ();
949extern Lisp_Object wrong_type_argument ();
950#ifdef LISP_FLOAT_TYPE
951extern Lisp_Object Ffloat_to_int(), Fint_to_float();
952extern double extract_float();
953#endif /* LISP_FLOAT_TYPE */
954
955/* Defined in fns.c */
956extern Lisp_Object Qstring_lessp;
957extern Lisp_Object Vfeatures;
958extern Lisp_Object Fidentity (), Frandom ();
959extern Lisp_Object Flength ();
960extern Lisp_Object Fappend (), Fconcat (), Fvconcat (), Fcopy_sequence ();
961extern Lisp_Object Fsubstring ();
962extern Lisp_Object Fnthcdr (), Fmemq (), Fassq (), Fassoc ();
963extern Lisp_Object Frassq (), Fdelq (), Fsort ();
964extern Lisp_Object Freverse (), Fnreverse (), Fget (), Fput (), Fequal ();
965extern Lisp_Object Ffillarray (), Fnconc (), Fmapcar (), Fmapconcat ();
966extern Lisp_Object Fy_or_n_p (), do_yes_or_no_p ();
967extern Lisp_Object Ffeaturep (), Frequire () , Fprovide ();
968extern Lisp_Object concat2 (), nconc2 ();
969extern Lisp_Object assq_no_quit ();
970
971/* Defined in alloc.c */
972extern Lisp_Object Vpurify_flag;
973extern Lisp_Object Fcons (), Flist(), Fmake_list ();
974extern Lisp_Object Fmake_vector (), Fvector (), Fmake_symbol (), Fmake_marker ();
975extern Lisp_Object Fmake_string (), build_string (), make_string ();
9453ea7b 976extern Lisp_Object make_array (), make_uninit_string ();
3cfe6dfd
JB
977extern Lisp_Object Fpurecopy (), make_pure_string ();
978extern Lisp_Object pure_cons (), make_pure_vector ();
979extern Lisp_Object Fgarbage_collect ();
980
981/* Defined in print.c */
982extern Lisp_Object Vprin1_to_string_buffer;
983extern Lisp_Object Fprin1 (), Fprin1_to_string (), Fprinc ();
984extern Lisp_Object Fterpri (), Fprint ();
985extern Lisp_Object Vstandard_output, Qstandard_output;
9453ea7b 986extern Lisp_Object Qexternal_debugging_output;
3cfe6dfd
JB
987extern void temp_output_buffer_setup (), temp_output_buffer_show ();
988extern int print_level, print_escape_newlines;
989extern Lisp_Object Qprint_escape_newlines;
990
991/* Defined in lread.c */
992extern Lisp_Object Qvariable_documentation, Qstandard_input;
993extern Lisp_Object Vobarray, Vstandard_input;
994extern Lisp_Object Fread (), Fread_from_string ();
995extern Lisp_Object Fintern (), Fintern_soft (), Fload ();
996extern Lisp_Object Fget_file_char (), Fread_char ();
997extern Lisp_Object Feval_current_buffer (), Feval_region ();
998extern Lisp_Object intern (), oblookup ();
999
1000/* Defined in eval.c */
1001extern Lisp_Object Qautoload, Qexit, Qinteractive, Qcommandp, Qdefun, Qmacro;
ad236261 1002extern Lisp_Object Vinhibit_quit, Qinhibit_quit, Vquit_flag;
3cfe6dfd
JB
1003extern Lisp_Object Vmocklisp_arguments, Qmocklisp, Qmocklisp_arguments;
1004extern Lisp_Object Vautoload_queue;
1005extern Lisp_Object Vrun_hooks;
1006extern Lisp_Object Fand (), For (), Fif (), Fprogn (), Fprog1 (), Fprog2 ();
1007extern Lisp_Object Fsetq (), Fquote ();
1008extern Lisp_Object Fuser_variable_p (), Finteractive_p ();
1009extern Lisp_Object Fdefun (), Flet (), FletX (), Fwhile ();
1010extern Lisp_Object Fcatch (), Fthrow (), Funwind_protect ();
1011extern Lisp_Object Fcondition_case (), Fsignal ();
1012extern Lisp_Object Ffunction_type (), Fautoload (), Fcommandp ();
1013extern Lisp_Object Feval (), Fapply (), Ffuncall ();
1014extern Lisp_Object Fglobal_set (), Fglobal_value (), Fbacktrace ();
1015extern Lisp_Object apply1 (), call0 (), call1 (), call2 (), call3 ();
1016extern Lisp_Object apply_lambda ();
1017extern Lisp_Object internal_catch ();
1018extern Lisp_Object internal_condition_case ();
1019extern Lisp_Object unbind_to ();
1020extern void error ();
1021extern Lisp_Object un_autoload ();
1022
1023/* Defined in editfns.c */
1024extern Lisp_Object Vprefix_arg, Qminus, Vcurrent_prefix_arg;
1025extern Lisp_Object Fgoto_char ();
1026extern Lisp_Object Fpoint_min_marker (), Fpoint_max_marker ();
1027extern Lisp_Object Fpoint_min (), Fpoint_max ();
1028extern Lisp_Object Fpoint (), Fpoint_marker (), Fmark_marker ();
760cbdd3
JB
1029extern Lisp_Object Ffollowing_char (), Fprevious_char (), Fchar_after ();
1030extern Lisp_Object Finsert ();
3cfe6dfd
JB
1031extern Lisp_Object Feolp (), Feobp (), Fbolp (), Fbobp ();
1032extern Lisp_Object Fformat (), format1 ();
ffd56f97
JB
1033extern Lisp_Object make_buffer_string (), Fbuffer_substring ();
1034extern Lisp_Object Fbuffer_string ();
3cfe6dfd
JB
1035extern Lisp_Object Fstring_equal (), Fstring_lessp (), Fbuffer_substring_lessp ();
1036extern Lisp_Object save_excursion_save (), save_restriction_save ();
1037extern Lisp_Object save_excursion_restore (), save_restriction_restore ();
1038extern Lisp_Object Fchar_to_string ();
1039
1040/* defined in buffer.c */
1041extern Lisp_Object Vbuffer_alist;
1042extern Lisp_Object Fget_buffer (), Fget_buffer_create (), Fset_buffer ();
1043extern Lisp_Object Fbarf_if_buffer_read_only ();
1044extern Lisp_Object Fcurrent_buffer (), Fswitch_to_buffer (), Fpop_to_buffer ();
1045extern Lisp_Object Fother_buffer ();
1046extern struct buffer *all_buffers;
1047
1048/* defined in marker.c */
1049
1050extern Lisp_Object Fmarker_position (), Fmarker_buffer ();
1051extern Lisp_Object Fcopy_marker ();
1052
1053/* Defined in fileio.c */
1054
1055extern Lisp_Object Qfile_error;
1056extern Lisp_Object Ffile_name_as_directory ();
1057extern Lisp_Object Fexpand_file_name (), Ffile_name_nondirectory ();
1058extern Lisp_Object Fsubstitute_in_file_name ();
1059extern Lisp_Object Ffile_symlink_p ();
1060
1061/* Defined in abbrev.c */
1062
1063extern Lisp_Object Vfundamental_mode_abbrev_table;
1064
1065/* defined in search.c */
1066extern Lisp_Object Fstring_match ();
1067extern Lisp_Object Fscan_buffer ();
1068
1069/* defined in minibuf.c */
1070
1071extern Lisp_Object last_minibuf_string;
1072extern Lisp_Object read_minibuf (), Fcompleting_read ();
1073extern Lisp_Object Fread_from_minibuffer ();
1074extern Lisp_Object Fread_variable (), Fread_buffer (), Fread_key_sequence ();
1075extern Lisp_Object Fread_minibuffer (), Feval_minibuffer ();
1076extern Lisp_Object Fread_string (), Fread_file_name ();
1077extern Lisp_Object Fread_no_blanks_input ();
1078
1079/* Defined in callint.c */
1080
1081extern Lisp_Object Vcommand_history;
1082extern Lisp_Object Qcall_interactively;
1083extern Lisp_Object Fcall_interactively ();
1084extern Lisp_Object Fprefix_numeric_value ();
1085
1086/* defined in casefiddle.c */
1087
1088extern Lisp_Object Fdowncase (), Fupcase (), Fcapitalize ();
1089
1090/* defined in keyboard.c */
1091
1092extern Lisp_Object Qdisabled;
1093extern Lisp_Object Vhelp_form, Vtop_level;
1094extern Lisp_Object Fdiscard_input (), Frecursive_edit ();
1095extern Lisp_Object Fcommand_execute (), Finput_pending_p ();
3cfe6dfd
JB
1096
1097/* defined in keymap.c */
1098
1099extern Lisp_Object Qkeymap;
1100extern Lisp_Object current_global_map;
1101extern Lisp_Object Fkey_description (), Fsingle_key_description ();
1102extern Lisp_Object Fwhere_is_internal ();
1103extern Lisp_Object access_keymap (), store_in_keymap ();
1104extern Lisp_Object get_keyelt (), get_keymap();
1105
1106/* defined in indent.c */
1107extern Lisp_Object Fvertical_motion (), Findent_to (), Fcurrent_column ();
1108
1109/* defined in window.c */
1110extern Lisp_Object Qwindowp;
1111extern Lisp_Object Fget_buffer_window ();
1112extern Lisp_Object Fsave_window_excursion ();
1113extern Lisp_Object Fset_window_configuration (), Fcurrent_window_configuration ();
9453ea7b
JB
1114extern Lisp_Object Fcoordinates_in_window_p ();
1115extern Lisp_Object Fwindow_at ();
3cfe6dfd 1116
ff11dfa1
JB
1117/* defined in frame.c */
1118extern Lisp_Object Fframep ();
1119extern Lisp_Object Fselect_frame ();
1120extern Lisp_Object Ffocus_frame ();
1121extern Lisp_Object Funfocus_frame ();
1122extern Lisp_Object Fselected_frame ();
1123extern Lisp_Object Fwindow_frame ();
1124extern Lisp_Object Fframe_root_window ();
1125extern Lisp_Object Fframe_selected_window ();
1126extern Lisp_Object Fframe_list ();
1127extern Lisp_Object Fnext_frame ();
1128extern Lisp_Object Fdelete_frame ();
3cfe6dfd
JB
1129extern Lisp_Object Fread_mouse_position ();
1130extern Lisp_Object Fset_mouse_position ();
ff11dfa1
JB
1131extern Lisp_Object Fmake_frame_visible ();
1132extern Lisp_Object Fmake_frame_invisible ();
1133extern Lisp_Object Ficonify_frame ();
1134extern Lisp_Object Fdeiconify_frame ();
1135extern Lisp_Object Fframe_visible_p ();
1136extern Lisp_Object Fvisible_frame_list ();
1137extern Lisp_Object Fframe_parameters ();
1138extern Lisp_Object Fmodify_frame_parameters ();
1139extern Lisp_Object Fframe_pixel_size ();
1140extern Lisp_Object Fframe_height ();
1141extern Lisp_Object Fframe_width ();
1142extern Lisp_Object Fset_frame_height ();
1143extern Lisp_Object Fset_frame_width ();
1144extern Lisp_Object Fset_frame_size ();
1145extern Lisp_Object Fset_frame_position ();
3cfe6dfd
JB
1146#ifndef HAVE_X11
1147extern Lisp_Object Frubber_band_rectangle ();
1148#endif /* HAVE_X11 */
1149
1150/* defined in emacs.c */
1151extern Lisp_Object decode_env_path ();
1152/* Nonzero means don't do interactive redisplay and don't change tty modes */
1153extern int noninteractive;
1154/* Nonzero means don't do use window-system-specific display code */
1155extern int inhibit_window_system;
1156
1157/* defined in process.c */
1158extern Lisp_Object Fget_process (), Fget_buffer_process (), Fprocessp ();
1159extern Lisp_Object Fprocess_status (), Fkill_process ();
1160
1161/* defined in callproc.c */
9453ea7b 1162extern Lisp_Object Vexec_path, Vexec_directory, Vdata_directory;
3cfe6dfd 1163
3cfe6dfd
JB
1164/* defined in doc.c */
1165extern Lisp_Object Vdoc_file_name;
1166extern Lisp_Object Fsubstitute_command_keys ();
1167extern Lisp_Object Fdocumentation (), Fdocumentation_property ();
1168
1169/* defined in bytecode.c */
1170extern Lisp_Object Qbytecode;
1171
1172/* defined in macros.c */
1173extern Lisp_Object Qexecute_kbd_macro;
1174extern Lisp_Object Fexecute_kbd_macro ();
1175
1176/* Nonzero means Emacs has already been initialized.
1177 Used during startup to detect startup of dumped Emacs. */
1178extern int initialized;
1179
1180extern int immediate_quit; /* Nonzero means ^G can quit instantly */
1181
1182extern void debugger ();
1183
1184extern char *malloc (), *realloc (), *getenv (), *ctime (), *getwd ();
1185extern long *xmalloc (), *xrealloc ();
1186
efb859b4 1187extern char *egetenv ();