|
|
1.1 ! root 1: /* Fundamental definitions for GNU Emacs Lisp interpreter. ! 2: Copyright (C) 1985 Richard M. Stallman. ! 3: ! 4: This file is part of GNU Emacs. ! 5: ! 6: GNU Emacs is distributed in the hope that it will be useful, ! 7: but WITHOUT ANY WARRANTY. No author or distributor ! 8: accepts responsibility to anyone for the consequences of using it ! 9: or for whether it serves any particular purpose or works at all, ! 10: unless he says so in writing. Refer to the GNU Emacs General Public ! 11: License for full details. ! 12: ! 13: Everyone is granted permission to copy, modify and redistribute ! 14: GNU Emacs, but only under the conditions described in the ! 15: GNU Emacs General Public License. A copy of this license is ! 16: supposed to have been given to you along with GNU Emacs so you ! 17: can know your rights and responsibilities. It should be in a ! 18: file named COPYING. Among other things, the copyright notice ! 19: and this notice must be preserved on all copies. */ ! 20: ! 21: ! 22: /* Define the fundamental Lisp data structures */ ! 23: ! 24: /* This is the set of Lisp data types */ ! 25: ! 26: enum Lisp_Type ! 27: { ! 28: /* Integer. object.v.integer is the integer value. */ ! 29: Lisp_Int, ! 30: ! 31: /* Symbol. object.v.symbol points to a struct Lisp_Symbol. */ ! 32: Lisp_Symbol, ! 33: ! 34: /* Marker (editor pointer). object.v.marker points to a struct Lisp_Marker. */ ! 35: Lisp_Marker, ! 36: ! 37: /* String. object.v.string points to a struct Lisp_String. ! 38: The length of the string, and its contents, are stored therein. */ ! 39: Lisp_String, ! 40: ! 41: /* Vector of Lisp objects. object.v.vector points to a struct Lisp_Vector. ! 42: The length of the vector, and its contents, are stored therein. */ ! 43: Lisp_Vector, ! 44: ! 45: /* Cons. object.v.cons points to a struct Lisp_Cons. */ ! 46: Lisp_Cons, ! 47: ! 48: /* Treated like vector in GC, except do not set its mark bit. ! 49: Used for internal data blocks that will be explicitly freed ! 50: but which, while active, are reached by GC mark exactly once ! 51: and should be marked through like a vector. */ ! 52: Lisp_Temp_Vector, ! 53: ! 54: /* Editor buffer. obj.v.buffer points to a struct buffer. ! 55: No buffer is ever truly freed; they can be "killed", but this ! 56: just marks them as dead. */ ! 57: Lisp_Buffer, ! 58: ! 59: /* Built-in function. obj.v.subr points to a struct Lisp_Subr ! 60: which describes how to call the function, and its documentation, ! 61: as well as pointing to the code. */ ! 62: Lisp_Subr, ! 63: ! 64: /* Internal value return by subroutines of read. ! 65: The user never sees this data type. ! 66: Its value is just a number. */ ! 67: Lisp_Internal, ! 68: ! 69: /* Forwarding pointer to an int variable. ! 70: This is allowed only in the value cell of a symbol, ! 71: and it means that the symbol's value really lives in the ! 72: specified int variable. ! 73: obj.v.intptr points to the int variable. */ ! 74: Lisp_Intfwd, ! 75: ! 76: /* Boolean forwarding pointer to an int variable. ! 77: This is like Lisp_Intfwd except that the ostensible "value" of the symbol ! 78: is t if the int variable is nonzero, nil if it is zero. ! 79: obj.v.intptr points to the int variable. */ ! 80: Lisp_Boolfwd, ! 81: ! 82: /* Object describing a connection to a subprocess. ! 83: It points to storage of type struct Lisp_Process */ ! 84: Lisp_Process, ! 85: ! 86: /* Forwarding pointer to a Lisp_Object variable. ! 87: This is allowed only in the value cell of a symbol, ! 88: and it means that the symbol's value really lives in the ! 89: specified variable. ! 90: obj.v.objfwd points to the Lisp_Object variable. */ ! 91: Lisp_Objfwd, ! 92: ! 93: /* Used when the core address of a function needs to be passed ! 94: in an argument of type Lisp_Object. ! 95: obj.v.function is the pointer-to-function. ! 96: The user will never see this data type. */ ! 97: Lisp_Internal_Function, ! 98: ! 99: /* Used when a FILE * value needs to be passed ! 100: in an argument of type Lisp_Object. ! 101: You must do (FILE *) obj.v.integer to get the value. ! 102: The user will never see this data type. */ ! 103: Lisp_Internal_Stream, ! 104: ! 105: /* Used in a symbol value cell when the symbol's value is per-buffer. ! 106: The actual contents are a cons cell which starts a list like this: ! 107: (REALVALUE BUFFER CURRENT-ALIST-ELEMENT . DEFAULT-VALUE)). ! 108: ! 109: BUFFER is the last buffer for which this symbol's value was ! 110: made up to date. ! 111: ! 112: CURRENT-ALIST-ELEMENT is a pointer to an element of BUFFER's ! 113: b_local_var_alist, that being the element whose car is this variable. ! 114: Or it can be a pointer to the (CURRENT-ALIST-ELEMENT . DEFAULT-VALUE), if BUFFER ! 115: does not have an element in its alist for this variable ! 116: (that is, if BUFFER sees the default value of this variable). ! 117: ! 118: If we want to examine or set the value and BUFFER is current, ! 119: we just examine or set REALVALUE. ! 120: If BUFFER is not current, we store the current REALVALUE value into ! 121: CURRENT-ALIST-ELEMENT, then find the appropriate alist element for ! 122: the buffer now current and set up CURRENT-ALIST-ELEMENT. ! 123: Then we set REALVALUE out of that element, and store into BUFFER. ! 124: ! 125: If we are setting the variable and the current buffer does not have ! 126: an alist entry for this variable, an alist entry is created. ! 127: ! 128: Note that REALVALUE can be a forwarding pointer. ! 129: Each time it is examined or set, forwarding must be done. */ ! 130: Lisp_Buffer_Local_Value, ! 131: ! 132: /* Like Lisp_Buffer_Local_Value with one difference: ! 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. */ ! 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: ! 152: #ifndef NO_UNION_TYPE ! 153: ! 154: #ifndef BIG_ENDIAN ! 155: ! 156: /* Definition of Lisp_Object for little-endian machines. */ ! 157: ! 158: typedef ! 159: union Lisp_Object ! 160: { ! 161: /* Used for comparing two Lisp_Objects; ! 162: also, positive integers can be accessed fast this way. */ ! 163: int i; ! 164: ! 165: struct ! 166: { ! 167: int val: 24; ! 168: char type; ! 169: } s; ! 170: struct ! 171: { ! 172: unsigned int val: 24; ! 173: char type; ! 174: } u; ! 175: struct ! 176: { ! 177: unsigned int val: 24; ! 178: enum Lisp_Type type: 7; ! 179: /* The markbit is not really part of the value of a Lisp_Object, ! 180: and is always zero except during garbage collection. */ ! 181: unsigned int markbit: 1; ! 182: } gu; ! 183: } ! 184: Lisp_Object; ! 185: ! 186: #else /* If BIG_ENDIAN */ ! 187: ! 188: typedef ! 189: union Lisp_Object ! 190: { ! 191: /* Used for comparing two Lisp_Objects; ! 192: also, positive integers can be accessed fast this way. */ ! 193: int i; ! 194: ! 195: struct ! 196: { ! 197: char type; ! 198: int val: 24; ! 199: } s; ! 200: struct ! 201: { ! 202: char type; ! 203: unsigned int val: 24; ! 204: } u; ! 205: struct ! 206: { ! 207: /* The markbit is not really part of the value of a Lisp_Object, ! 208: and is always zero except during garbage collection. */ ! 209: unsigned int markbit: 1; ! 210: enum Lisp_Type type: 7; ! 211: unsigned int val: 24; ! 212: } gu; ! 213: } ! 214: Lisp_Object; ! 215: ! 216: #endif BIG_ENDIAN ! 217: ! 218: #endif NO_UNION_TYPE ! 219: ! 220: ! 221: /* If union type is not wanted, define Lisp_Object as just a number ! 222: and define the macros below to extract fields by shifting */ ! 223: ! 224: #ifdef NO_UNION_TYPE ! 225: ! 226: #define Lisp_Object int ! 227: ! 228: /* These values are overridden by the m- file on some machines. */ ! 229: #ifndef VALBITS ! 230: #define VALBITS 24 ! 231: #endif ! 232: ! 233: #ifndef GCTYPEBITS ! 234: #define GCTYPEBITS 7 ! 235: #endif ! 236: ! 237: #define VALMASK ((1<<VALBITS) - 1) ! 238: #define GCTYPEMASK ((1<<GCTYPEBITS) - 1) ! 239: #define MARKBIT (1 << (VALBITS + GCTYPEBITS)) ! 240: ! 241: #endif NO_UNION_TYPE ! 242: ! 243: /* These macros extract various sorts of values from a Lisp_Object. ! 244: For example, if tem is a Lisp_Object whose type is Lisp_Cons, ! 245: XCONS (tem) is the struct Lisp_Cons * pointing to the memory for that cons. */ ! 246: ! 247: #ifdef NO_UNION_TYPE ! 248: ! 249: #define XTYPE(a) ((enum Lisp_Type) ((a) >> VALBITS)) ! 250: #define XSETTYPE(a, b) ((a) = ((a) & VALMASK) + ((int)(b) << VALBITS)) ! 251: ! 252: /* Use XFASTINT for fast retrieval and storage of integers known ! 253: to be positive. This takes advantage of the fact that Lisp_Int is 0. */ ! 254: #define XFASTINT(a) (a) ! 255: ! 256: #define XINT(a) (((a) << INTBITS-VALBITS) >> INTBITS-VALBITS) ! 257: #define XUINT(a) ((a) & VALMASK) ! 258: ! 259: #define XSETINT(a, b) ((a) = ((a) & ~VALMASK) + ((b) & VALMASK)) ! 260: #define XSETUINT(a, b) ((a) = ((a) & ~VALMASK) + ((b) & VALMASK)) ! 261: ! 262: #define XSET(var, type, ptr) \ ! 263: ((var) = ((int)(type) << VALBITS) + ((int) (ptr) & VALMASK)) ! 264: ! 265: /* During garbage collection, XGCTYPE must be used for extracting types ! 266: so that the mark bit is ignored. XMARKBIT access the markbit. ! 267: Markbits are used only in particular slots of particular structure types. ! 268: Other markbits are always zero. ! 269: Outside of garbage collection, all mark bits are always zero. */ ! 270: ! 271: #define XGCTYPE(a) ((enum Lisp_Type) (((a) >> VALBITS) & GCTYPEMASK)) ! 272: #define XMARKBIT(a) ((a) & MARKBIT) ! 273: #define XSETMARKBIT(a,b) ((a) = ((a) & ~MARKBIT) + (b)) ! 274: #define XMARK(a) ((a) |= MARKBIT) ! 275: #define XUNMARK(a) ((a) &= ~MARKBIT) ! 276: ! 277: #endif ! 278: ! 279: #ifndef NO_UNION_TYPE ! 280: ! 281: #define XTYPE(a) ((enum Lisp_Type) (a).u.type) ! 282: #define XSETTYPE(a, b) ((a).u.type = (char) (b)) ! 283: ! 284: /* Use XFASTINT for fast retrieval and storage of integers known ! 285: to be positive. This takes advantage of the fact that Lisp_Int is 0. */ ! 286: #define XFASTINT(a) ((a).i) ! 287: ! 288: #ifdef EXPLICIT_SIGN_EXTEND ! 289: /* Make sure we sign-extend; compilers have been known to fail to do so. */ ! 290: #define XINT(a) (((a).i << 8) >> 8) ! 291: #else ! 292: #define XINT(a) ((a).s.val) ! 293: #endif ! 294: ! 295: #define XUINT(a) ((a).u.val) ! 296: #define XSETINT(a, b) ((a).s.val = (int) (b)) ! 297: #define XSETUINT(a, b) ((a).s.val = (int) (b)) ! 298: ! 299: #define XSET(var, vartype, ptr) \ ! 300: (((var).s.type = ((char) (vartype))), ((var).s.val = ((int) (ptr)))) ! 301: ! 302: /* During garbage collection, XGCTYPE must be used for extracting types ! 303: so that the mark bit is ignored. XMARKBIT access the markbit. ! 304: Markbits are used only in particular slots of particular structure types. ! 305: Other markbits are always zero. ! 306: Outside of garbage collection, all mark bits are always zero. */ ! 307: ! 308: #define XGCTYPE(a) ((a).gu.type) ! 309: #define XMARKBIT(a) ((a).gu.markbit) ! 310: #define XSETMARKBIT(a,b) (XMARKBIT(a) = (b)) ! 311: #define XMARK(a) (XMARKBIT(a) = 1) ! 312: #define XUNMARK(a) (XMARKBIT(a) = 0) ! 313: ! 314: #endif NO_UNION_TYPE ! 315: ! 316: ! 317: #define XCONS(a) ((struct Lisp_Cons *) XUINT(a)) ! 318: #define XBUFFER(a) ((struct buffer *) XUINT(a)) ! 319: #define XVECTOR(a) ((struct Lisp_Vector *) XUINT(a)) ! 320: #define XSUBR(a) ((struct Lisp_Subr *) XUINT(a)) ! 321: #define XSTRING(a) ((struct Lisp_String *) XUINT(a)) ! 322: #define XSYMBOL(a) ((struct Lisp_Symbol *) XUINT(a)) ! 323: #define XFUNCTION(a) ((Lisp_Object (*)()) XUINT(a)) ! 324: #define XMARKER(a) ((struct Lisp_Marker *) XUINT(a)) ! 325: #define XOBJFWD(a) ((Lisp_Object *) XUINT(a)) ! 326: #define XINTPTR(a) ((int *) XUINT(a)) ! 327: #define XWINDOW(a) ((struct window *) XUINT(a)) ! 328: #define XPROCESS(a) ((struct Lisp_Process *) XUINT(a)) ! 329: ! 330: #define XSETCONS(a, b) XSETUINT(a, (int) (b)) ! 331: #define XSETBUFFER(a, b) XSETUINT(a, (int) (b)) ! 332: #define XSETVECTOR(a, b) XSETUINT(a, (int) (b)) ! 333: #define XSETSUBR(a, b) XSETUINT(a, (int) (b)) ! 334: #define XSETSTRING(a, b) XSETUINT(a, (int) (b)) ! 335: #define XSETSYMBOL(a, b) XSETUINT(a, (int) (b)) ! 336: #define XSETFUNCTION(a, b) XSETUINT(a, (int) (b)) ! 337: #define XSETMARKER(a, b) XSETUINT(a, (int) (b)) ! 338: #define XSETOBJFWD(a, b) XSETUINT(a, (int) (b)) ! 339: #define XSETINTPTR(a, b) XSETUINT(a, (int) (b)) ! 340: #define XSETWINDOW(a, b) XSETUINT(a, (int) (b)) ! 341: #define XSETPROCESS(a, b) XSETUINT(a, (int) (b)) ! 342: ! 343: /* In a cons, the markbit of the car is the gc mark bit */ ! 344: ! 345: struct Lisp_Cons ! 346: { ! 347: Lisp_Object car, cdr; ! 348: }; ! 349: ! 350: /* Like a cons, but records info on where the text lives that it was read from */ ! 351: /* This is not really in use now */ ! 352: ! 353: struct Lisp_Buffer_Cons ! 354: { ! 355: Lisp_Object car, cdr; ! 356: struct buffer *buffer; ! 357: int bufpos; ! 358: }; ! 359: ! 360: /* In a string or vector, the sign bit of the `size' is the gc mark bit */ ! 361: ! 362: struct Lisp_String ! 363: { ! 364: int size; ! 365: unsigned char data[1]; ! 366: }; ! 367: ! 368: struct Lisp_Vector ! 369: { ! 370: int size; ! 371: struct Lisp_Vector *next; ! 372: Lisp_Object contents[1]; ! 373: }; ! 374: ! 375: /* In a symbol, the markbit of the plist is used as the gc mark bit */ ! 376: ! 377: struct Lisp_Symbol ! 378: { ! 379: struct Lisp_String *name; ! 380: Lisp_Object value; ! 381: Lisp_Object function; ! 382: Lisp_Object plist; ! 383: struct Lisp_Symbol *next; /* -> next symbol in this obarray bucket */ ! 384: }; ! 385: ! 386: struct Lisp_Subr ! 387: { ! 388: Lisp_Object (*function) (); ! 389: short min_args, max_args; ! 390: char *symbol_name; ! 391: char *prompt; ! 392: char *doc; ! 393: }; ! 394: ! 395: /* In a marker, the markbit of the chain field is used as the gc mark bit */ ! 396: ! 397: struct Lisp_Marker ! 398: { ! 399: struct buffer *buffer; ! 400: Lisp_Object chain; ! 401: int bufpos; ! 402: int modified; ! 403: }; ! 404: ! 405: /* Data type checking */ ! 406: ! 407: #define NULL(x) (XFASTINT (x) == XFASTINT (Qnil)) ! 408: #define LISTP(x) (XTYPE ((x)) == Lisp_Cons) ! 409: #define EQ(x, y) (XFASTINT (x) == XFASTINT (y)) ! 410: ! 411: #define CHECK_STRING(x, i) \ ! 412: { if (XTYPE ((x)) != Lisp_String) x = wrong_type_argument (Qstringp, (x)); } ! 413: ! 414: #define CHECK_SYMBOL(x, i) \ ! 415: { if (XTYPE ((x)) != Lisp_Symbol) x = wrong_type_argument (Qsymbolp, (x)); } ! 416: ! 417: #define CHECK_VECTOR(x, i) \ ! 418: { if (XTYPE ((x)) != Lisp_Vector) x = wrong_type_argument (Qvectorp, (x)); } ! 419: ! 420: #define CHECK_BUFFER(x, i) \ ! 421: { if (XTYPE ((x)) != Lisp_Buffer) x = wrong_type_argument (Qbufferp, (x)); } ! 422: ! 423: #define CHECK_WINDOW(x, i) \ ! 424: { if (XTYPE ((x)) != Lisp_Window) x = wrong_type_argument (Qwindowp, (x)); } ! 425: ! 426: #define CHECK_PROCESS(x, i) \ ! 427: { if (XTYPE ((x)) != Lisp_Process) x = wrong_type_argument (Qprocessp, (x)); } ! 428: ! 429: #define CHECK_NUMBER(x, i) \ ! 430: { if (XTYPE ((x)) != Lisp_Int) x = wrong_type_argument (Qintegerp, (x)); } ! 431: ! 432: #define CHECK_MARKER(x, i) \ ! 433: { if (XTYPE ((x)) != Lisp_Marker) x = wrong_type_argument (Qmarkerp, (x)); } ! 434: ! 435: #define CHECK_NUMBER_COERCE_MARKER(x, i) \ ! 436: { if (XTYPE ((x)) == Lisp_Marker) XFASTINT (x) = marker_position (x); \ ! 437: else if (XTYPE ((x)) != Lisp_Int) x = wrong_type_argument (Qinteger_or_marker_p, (x)); } ! 438: ! 439: #ifdef VIRT_ADDR_VARIES ! 440: /* For machines like APOLLO where text and data can go anywhere ! 441: in virtual memory. */ ! 442: #define CHECK_IMPURE(obj) \ ! 443: { extern int pure[]; \ ! 444: if (XUINT (obj) < (int) ((char *) pure + PURESIZE) \ ! 445: && XUINT (obj) >= (int) pure) \ ! 446: pure_write_error (); } ! 447: ! 448: #else /* not VIRT_ADDR_VARIES */ ! 449: ! 450: #define CHECK_IMPURE(obj) \ ! 451: { extern int my_edata; \ ! 452: if (XUINT (obj) < (unsigned int) &my_edata) \ ! 453: pure_write_error (); } ! 454: #endif /* not VIRT_ADDR_VARIES */ ! 455: ! 456: /* Define a built-in function for calling from Lisp. ! 457: `lname' should be the name to give the function in Lisp, ! 458: as a null-terminated C string. ! 459: `fnname' should be the name of the function in C. ! 460: By convention, it starts with F. ! 461: `sname' should be the name for the C constant structure ! 462: that records information on this function for internal use. ! 463: By convention, it should be the same as `fnname' but with S instead of F. ! 464: It's too bad that C macros can't compute this from `fnname'. ! 465: `minargs' should be a number, the minimum number of arguments allowed. ! 466: `maxargs' should be a number, the maximum number of arguments allowed, ! 467: or else MANY or UNEVALLED. ! 468: MANY means pass a vector of evaluated arguments, ! 469: in the form of an integer number-of-arguments ! 470: followed by the address of a vector of Lisp_Objects ! 471: which contains the argument values. ! 472: UNEVALLED means pass the list of unevaluated arguments ! 473: `prompt' says how to read arguments for an interactive call. ! 474: This can be zero or a C string. ! 475: Zero means that interactive calls are not allowed. ! 476: A string is interpreted in a hairy way: ! 477: it should contain one line for each argument to be read, terminated by \n. ! 478: The first character of the line controls the type of parsing: ! 479: s -- read a string. ! 480: S -- read a symbol. ! 481: k -- read a key sequence and return it as a string. ! 482: a -- read a function name (symbol) with completion. ! 483: C -- read a command name (symbol) with completion. ! 484: v -- read a variable name (symbol) with completion. ! 485: b -- read a buffer name (a string) with completion. ! 486: B -- buffer name, may be existing buffer or may not be. ! 487: f -- read a file name, file must exist. ! 488: F -- read a file name, file need not exist. ! 489: n -- read a number. ! 490: c -- read a character and return it as a number. ! 491: p -- use the numeric value of the prefix argument. ! 492: P -- use raw value of prefix - can be nil, -, (NUMBER) or NUMBER. ! 493: x -- read a Lisp object from the minibuffer. ! 494: X -- read a Lisp form from the minibuffer and use its value. ! 495: A null string means call interactively with no arguments. ! 496: `doc' is documentation for the user. ! 497: */ ! 498: ! 499: #define DEFUN(lname, fnname, sname, minargs, maxargs, prompt, doc) \ ! 500: Lisp_Object fnname (); \ ! 501: struct Lisp_Subr sname = {fnname, minargs, maxargs, lname, prompt, 0}; \ ! 502: Lisp_Object fnname ! 503: ! 504: /* defsubr (Sname); ! 505: is how we define the symbol for function `name' at start-up time. */ ! 506: extern void defsubr (); ! 507: ! 508: #define MANY -2 ! 509: #define UNEVALLED -1 ! 510: ! 511: #define DEFSIMPLE(lname, fnname, sname, doc, valtype, setcomp, exp) \ ! 512: DEFUN (lname, fnname, sname, 0, 0, 0, 0) () \ ! 513: { \ ! 514: Lisp_Object val; \ ! 515: XSET (val, valtype, exp); \ ! 516: return val; } ! 517: ! 518: #define DEFPRED(lname, fnname, sname, doc, boolexp) \ ! 519: DEFUN (lname, fnname, sname, 0, 0, 0, 0) () \ ! 520: { if (boolexp) return Qt; return Qnil; } ! 521: ! 522: /* Structure for recording Lisp call stack for backtrace purposes */ ! 523: ! 524: struct specbinding ! 525: { ! 526: Lisp_Object symbol, old_value; ! 527: }; ! 528: ! 529: extern struct specbinding *specpdl; ! 530: extern struct specbinding *specpdl_ptr; ! 531: extern int specpdl_size; ! 532: ! 533: struct handler ! 534: { ! 535: Lisp_Object handler; ! 536: Lisp_Object var; ! 537: struct catchtag *tag; ! 538: struct handler *next; ! 539: }; ! 540: ! 541: extern struct handler *handlerlist; ! 542: ! 543: /* Check quit-flag and quit if it is non-nil. */ ! 544: ! 545: #define QUIT \ ! 546: if (!NULL (Vquit_flag) && NULL (Vinhibit_quit)) \ ! 547: { Vquit_flag = Qnil; Fsignal (Qquit, Qnil); } ! 548: ! 549: /* number of bytes of structure consed since last GC */ ! 550: ! 551: extern int consing_since_gc; ! 552: ! 553: /* threshold for doing another gc */ ! 554: ! 555: extern int gc_cons_threshold; ! 556: ! 557: /* Structure for recording stack slots that need marking */ ! 558: ! 559: /* This is a chain of structures, each of which points at a Lisp_Object variable ! 560: whose value should be marked in garbage collection. ! 561: Normally every link of the chain is an automatic variable of a function, ! 562: and its `val' points to some argument or local variable of the function. ! 563: On exit to the function, the chain is set back to the value it had on entry. ! 564: This way, no link remains in the chain when the stack frame containing the link disappears. ! 565: ! 566: Every function that can call Feval must protect in this fashion all ! 567: Lisp_Object variables whose contents will be used again. */ ! 568: ! 569: extern struct gcpro *gcprolist; ! 570: ! 571: struct gcpro ! 572: { ! 573: struct gcpro *next; ! 574: Lisp_Object *var; /* Address of first protected variable */ ! 575: int nvars; /* Number of consecutive protected variables */ ! 576: }; ! 577: ! 578: #define GCPRO1(varname) \ ! 579: {gcpro1.next = gcprolist; gcpro1.var = &varname; gcpro1.nvars = 1; \ ! 580: gcprolist = &gcpro1; } ! 581: ! 582: #define GCPRO2(varname1, varname2) \ ! 583: {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \ ! 584: gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \ ! 585: gcprolist = &gcpro2; } ! 586: ! 587: #define GCPRO3(varname1, varname2, varname3) \ ! 588: {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \ ! 589: gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \ ! 590: gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \ ! 591: gcprolist = &gcpro3; } ! 592: ! 593: #define GCPRO4(varname1, varname2, varname3, varname4) \ ! 594: {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \ ! 595: gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \ ! 596: gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \ ! 597: gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \ ! 598: gcprolist = &gcpro4; } ! 599: ! 600: /* Call staticpro (&var) to protect static variable `var'. */ ! 601: ! 602: void staticpro(); ! 603: ! 604: #define UNGCPRO (gcprolist = gcpro1.next) ! 605: ! 606: /* Defined in data.c */ ! 607: extern Lisp_Object Qnil, Qt, Qquote, Qlambda, Qsubr, Qunbound; ! 608: extern Lisp_Object Qerror_conditions, Qerror_message, Qtop_level; ! 609: extern Lisp_Object Qerror, Qquit, Qwrong_type_argument, Qargs_out_of_range; ! 610: extern Lisp_Object Qvoid_variable, Qvoid_function; ! 611: extern Lisp_Object Qsetting_constant, Qinvalid_read_syntax; ! 612: extern Lisp_Object Qinvalid_function, Qwrong_number_of_arguments, Qno_catch; ! 613: extern Lisp_Object Qend_of_file, Qarith_error; ! 614: extern Lisp_Object Qbeginning_of_buffer, Qend_of_buffer, Qbuffer_read_only; ! 615: ! 616: extern Lisp_Object Qintegerp, Qnatnump, Qsymbolp, Qlistp, Qconsp; ! 617: extern Lisp_Object Qstringp, Qarrayp, Qsequencep, Qbufferp; ! 618: extern Lisp_Object Qchar_or_string_p, Qmarkerp, Qvectorp; ! 619: extern Lisp_Object Qinteger_or_marker_p, Qboundp, Qfboundp; ! 620: extern Lisp_Object Qcdr; ! 621: ! 622: extern Lisp_Object Feq (), Fnull (), Flistp (), Fconsp (), Fatom (), Fnlistp (); ! 623: extern Lisp_Object Fintegerp (), Fnatnump (), Fsymbolp (); ! 624: extern Lisp_Object Fvectorp (), Fstringp (), Farrayp (), Fsequencep (); ! 625: extern Lisp_Object Fbufferp (), Fmarkerp (), Fsubrp (), Fchar_or_string_p (); ! 626: extern Lisp_Object Finteger_or_marker_p (); ! 627: ! 628: extern Lisp_Object Fcar (), Fcar_safe(), Fcdr (), Fcdr_safe(); ! 629: extern Lisp_Object Fsetcar (), Fsetcdr (); ! 630: extern Lisp_Object Fboundp (), Ffboundp (), Fmakunbound (), Ffmakunbound (); ! 631: extern Lisp_Object Fsymbol_function (), Fsymbol_plist (), Fsymbol_name (); ! 632: extern Lisp_Object Ffset (), Fsetplist (); ! 633: extern Lisp_Object Fsymbol_value (), Fset (); ! 634: extern Lisp_Object Fdefault_value (), Fset_default (); ! 635: ! 636: extern Lisp_Object Faref (), Faset (), Farray_length (); ! 637: ! 638: extern Lisp_Object Fstring_to_int (), Fint_to_string (); ! 639: extern Lisp_Object Feqlsign (), Fgtr (), Flss (), Fgeq (), Fleq (), Fneq (), Fzerop (); ! 640: extern Lisp_Object Fplus (), Fminus (), Ftimes (), Fquo (), Frem (), Fmax (), Fmin (); ! 641: extern Lisp_Object Flogand (), Flogior (), Flogxor (), Flognot (), Flsh (), Fash (); ! 642: extern Lisp_Object Fadd1 (), Fsub1 (); ! 643: ! 644: extern Lisp_Object make_number (); ! 645: extern Lisp_Object wrong_type_argument (); ! 646: ! 647: /* Defined in fns.c */ ! 648: extern Lisp_Object Qstring_lessp; ! 649: extern Lisp_Object Vfeatures; ! 650: extern Lisp_Object Fidentity (), Frandom (); ! 651: extern Lisp_Object Flength (), Fstring_equal (), Fstring_lessp (); ! 652: extern Lisp_Object Fappend (), Fconcat (), Fvconcat (), Fcopy_sequence (), Fsubstring (); ! 653: extern Lisp_Object Fnth (), Fnthcdr (), Fmemq (), Fassq (), Fassoc (); ! 654: extern Lisp_Object Frassq (), Fdelq (), Fsort (); ! 655: extern Lisp_Object Freverse (), Fnreverse (), Fget (), Fput (), Fequal (); ! 656: extern Lisp_Object Ffillarray (), Fnconc (), Fmapcar (), Fmapconcat (); ! 657: extern Lisp_Object Fy_or_n_p (), Fyes_or_no_p (); ! 658: extern Lisp_Object Ffeaturep (), Frequire () , Fprovide (); ! 659: extern Lisp_Object concat2 (), nconc2 (); ! 660: ! 661: /* Defined in alloc.c */ ! 662: extern Lisp_Object Vpurify_flag; ! 663: extern Lisp_Object Fcons (), Flist(), Fmake_list (); ! 664: extern Lisp_Object Fmake_vector (), Fvector (), Fmake_symbol (), Fmake_marker (); ! 665: extern Lisp_Object Fmake_string (), build_string (), make_string(); ! 666: extern Lisp_Object Fpurecopy (), make_pure_string (); ! 667: extern Lisp_Object pure_cons (), make_pure_vector (); ! 668: extern Lisp_Object Fgarbage_collect (); ! 669: ! 670: /* Defined in print.c */ ! 671: extern Lisp_Object Vprin1_to_string_buffer; ! 672: extern Lisp_Object Fprin1 (), Fprin1_to_string (), Fprinc (); ! 673: extern Lisp_Object Fterpri (), Fprint (); ! 674: extern Lisp_Object Vstandard_output, Qstandard_output; ! 675: extern temp_output_buffer_setup (), temp_output_buffer_show (); ! 676: ! 677: /* Defined in read.c */ ! 678: extern Lisp_Object Qvariable_documentation; ! 679: extern Lisp_Object Vobarray, Vstandard_input; ! 680: extern Lisp_Object Fread (), Fread_from_string (); ! 681: extern Lisp_Object Fintern (), Fintern_soft (), Fload (); ! 682: extern Lisp_Object Fget_file_char (), Fread_char (); ! 683: extern Lisp_Object Feval_current_buffer (), Feval_region (); ! 684: extern Lisp_Object intern (), oblookup (); ! 685: ! 686: /* Defined in eval.c */ ! 687: extern Lisp_Object Qautoload, Qexit, Qinteractive, Qcommandp, Qdefun, Qmacro; ! 688: extern Lisp_Object Vinhibit_quit, Vquit_flag; ! 689: extern Lisp_Object Vmocklisp_arguments, Qmocklisp, Qmocklisp_arguments; ! 690: extern Lisp_Object Vautoload_queue; ! 691: extern Lisp_Object Fand (), For (), Fif (), Fprogn (), Fprog1 (), Fprog2 (); ! 692: extern Lisp_Object Fsetq (), Fquote (); ! 693: extern Lisp_Object Fuser_variable_p (); ! 694: extern Lisp_Object Fdefun (), Flet (), FletX (), Fwhile (); ! 695: extern Lisp_Object Fcatch (), Fthrow (), Funwind_protect (); ! 696: extern Lisp_Object Fcondition_case (), Fsignal (); ! 697: extern Lisp_Object Ffunction_type (), Fautoload (), Fdocumentation (), Fcommandp (); ! 698: extern Lisp_Object Feval (), Fapply (), Ffuncall (); ! 699: extern Lisp_Object Fglobal_set (), Fglobal_value (), Fbacktrace (); ! 700: extern Lisp_Object call1 (), call2 (), call3 (); ! 701: extern Lisp_Object apply_lambda (); ! 702: extern Lisp_Object internal_catch (); ! 703: extern Lisp_Object internal_condition_case (); ! 704: extern void unbind_to (); ! 705: extern void error (); ! 706: ! 707: /* Defined in editfns.c */ ! 708: extern Lisp_Object Vprefix_arg, Qminus, Vcurrent_prefix_arg; ! 709: extern Lisp_Object Finteractive_p (), Fgoto_char (); ! 710: extern Lisp_Object Fpoint_min_marker (), Fpoint_max_marker (); ! 711: extern Lisp_Object Fpoint_min (), Fpoint_max (); ! 712: extern Lisp_Object Fpoint (), Fmark (), Fpoint_marker (), Fmark_marker (); ! 713: extern Lisp_Object Ffollchar (), Fprevchar (), Fchar_after (), Finsert (); ! 714: extern Lisp_Object Feolp (), Feobp (), Fbolp (), Fbobp (), Fset_mark (); ! 715: extern Lisp_Object Fformat (), format1 (); ! 716: extern Lisp_Object Fgetenv (); ! 717: extern Lisp_Object Fbuffer_substring (), Fbuffer_string (); ! 718: extern Lisp_Object save_excursion_save (), save_restriction_save (); ! 719: extern Lisp_Object save_excursion_restore (), save_restriction_restore (); ! 720: extern Lisp_Object Fchar_to_string (); ! 721: ! 722: /* defined in buffer.c */ ! 723: extern Lisp_Object Vbuffer_alist; ! 724: extern Lisp_Object Fget_buffer (), Fget_buffer_create (), Fset_buffer (); ! 725: extern Lisp_Object Fbarf_if_buffer_read_only (); ! 726: extern Lisp_Object Fcurrent_buffer (), Fswitch_to_buffer (), Fpop_to_buffer (); ! 727: extern Lisp_Object Fother_buffer (); ! 728: extern struct buffer *all_buffers; ! 729: ! 730: /* defined in marker.c */ ! 731: ! 732: extern Lisp_Object Fmarker_position (), Fmarker_buffer (); ! 733: extern Lisp_Object Fcopy_marker (); ! 734: ! 735: /* Defined in fileio.c */ ! 736: ! 737: extern Lisp_Object Qfile_error; ! 738: extern Lisp_Object Fexpand_file_name (), Ffile_name_nondirectory (); ! 739: extern Lisp_Object Fsubstitute_in_file_name (); ! 740: extern Lisp_Object Ffile_symlink_p (); ! 741: ! 742: /* Defined in abbrev.c */ ! 743: ! 744: extern Lisp_Object Vfundamental_mode_abbrev_table; ! 745: ! 746: /* defined in search.c */ ! 747: ! 748: extern Lisp_Object Fstring_match (); ! 749: extern Lisp_Object Fscan_buffer (); ! 750: ! 751: /* defined in minibuf.c */ ! 752: ! 753: extern Lisp_Object last_minibuf_string; ! 754: extern Lisp_Object read_minibuf_string (), Fcompleting_read (); ! 755: extern Lisp_Object Fread_from_minibuffer (); ! 756: extern Lisp_Object Fread_variable (); ! 757: extern Lisp_Object Fread_minibuffer (), Feval_minibuffer (); ! 758: extern Lisp_Object Fread_string (), Fread_file_name (); ! 759: extern Lisp_Object Fread_no_blanks_input (); ! 760: ! 761: /* Defined in callint.c */ ! 762: ! 763: extern Lisp_Object Vcommand_history; ! 764: extern Lisp_Object Qcall_interactively; ! 765: extern Lisp_Object Fcall_interactively (); ! 766: extern Lisp_Object Fprefix_numeric_value (); ! 767: ! 768: /* defined in casefiddle.c */ ! 769: ! 770: extern Lisp_Object Fdowncase (), Fupcase (), Fcapitalize (); ! 771: ! 772: /* defined in keyboard.c */ ! 773: ! 774: extern Lisp_Object Vhelp_form, Vtop_level; ! 775: extern Lisp_Object Fdiscard_input (), Frecursive_edit (); ! 776: extern Lisp_Object Fcommand_execute (), Finput_pending_p (); ! 777: ! 778: /* defined in keymap.c */ ! 779: ! 780: extern Lisp_Object Qkeymap; ! 781: extern Lisp_Object Fkey_description (), Fsingle_key_description (); ! 782: extern Lisp_Object Fwhere_is_internal (); ! 783: extern Lisp_Object access_keymap (), store_in_keymap (); ! 784: extern Lisp_Object get_keyelt (), get_keymap(); ! 785: ! 786: /* defined in indent.c */ ! 787: extern Lisp_Object Fvertical_motion (), Findent_to (), Fcurrent_column (); ! 788: ! 789: /* defined in window.c */ ! 790: extern Lisp_Object Qwindowp; ! 791: extern Lisp_Object Fget_buffer_window (); ! 792: extern Lisp_Object Fsave_window_excursion (); ! 793: extern Lisp_Object save_window_save (); ! 794: extern Lisp_Object save_window_restore (); ! 795: ! 796: /* defined in emacs.c */ ! 797: extern Lisp_Object decode_env_path (); ! 798: /* Nonzero means don't do interactive redisplay and don't change tty modes */ ! 799: extern int noninteractive; ! 800: ! 801: /* defined in process.c */ ! 802: extern Lisp_Object Fget_process (), Fget_buffer_process (), Fprocessp (); ! 803: extern Lisp_Object Fprocess_status (), Fkill_process (); ! 804: ! 805: /* defined in callproc.c */ ! 806: extern Lisp_Object Vexec_path, Vexec_directory; ! 807: ! 808: /* defined in doc.c */ ! 809: extern Lisp_Object Vdoc_file_name; ! 810: extern Lisp_Object Fsubstitute_command_keys (); ! 811: ! 812: /* defined in bytecode.c */ ! 813: extern Lisp_Object Qbytecode; ! 814: ! 815: /* defined in macros.c */ ! 816: extern Lisp_Object Fexecute_kbd_macro (); ! 817: ! 818: extern void debugger (); ! 819: ! 820: extern char *malloc (), *realloc (), *getenv (), *ctime (), *getwd (); ! 821: extern long *xmalloc (), *xrealloc ();
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.