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