Annotation of GNUtools/emacs/src/lisp.h, revision 1.1

1.1     ! root        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.  object.v.integer is the integer value. */
        !            28:     Lisp_Int,
        !            29: 
        !            30:     /* Symbol.  object.v.symbol points to a struct Lisp_Symbol. */
        !            31:     Lisp_Symbol,
        !            32: 
        !            33:     /* Marker (editor pointer).  object.v.marker points to a struct Lisp_Marker. */
        !            34:     Lisp_Marker,
        !            35: 
        !            36:     /* String.  object.v.string 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.  object.v.vector points to a struct Lisp_Vector.
        !            41:        The length of the vector, and its contents, are stored therein. */
        !            42:     Lisp_Vector,
        !            43: 
        !            44:     /* Cons.  object.v.cons points to a struct Lisp_Cons. */
        !            45:     Lisp_Cons,
        !            46: 
        !            47:     /* >>> No longer used */
        !            48:     Lisp_Object_Unused_1,
        !            49: #if 0
        !            50:     was...
        !            51:     /* Treated like vector in GC, except do not set its mark bit.
        !            52:        Used for internal data blocks that will be explicitly freed
        !            53:        but which, while active, are reached by GC mark exactly once
        !            54:        and should be marked through like a vector.  */
        !            55:     Lisp_Temp_Vector,
        !            56: #endif /* 0 */
        !            57: 
        !            58:     /* Editor buffer.  obj.v.buffer points to a struct buffer.
        !            59:        No buffer is ever truly freed; they can be "killed", but this
        !            60:        just marks them as dead. */
        !            61:     Lisp_Buffer,
        !            62: 
        !            63:     /* Built-in function.  obj.v.subr points to a struct Lisp_Subr
        !            64:        which describes how to call the function, and its documentation,
        !            65:        as well as pointing to the code. */
        !            66:     Lisp_Subr,
        !            67: 
        !            68:     /* Internal value return by subroutines of read.
        !            69:        The user never sees this data type.
        !            70:        Its value is just a number. */
        !            71:     Lisp_Internal,
        !            72: 
        !            73:     /* Forwarding pointer to an int variable.
        !            74:        This is allowed only in the value cell of a symbol,
        !            75:        and it means that the symbol's value really lives in the
        !            76:        specified int variable.
        !            77:        obj.v.intptr points to the int variable. */
        !            78:     Lisp_Intfwd,
        !            79: 
        !            80:     /* Boolean forwarding pointer to an int variable.
        !            81:        This is like Lisp_Intfwd except that the ostensible "value" of the symbol
        !            82:        is t if the int variable is nonzero, nil if it is zero.
        !            83:        obj.v.intptr points to the int variable. */
        !            84:     Lisp_Boolfwd,
        !            85: 
        !            86:     /* Object describing a connection to a subprocess.
        !            87:        It points to storage of type  struct Lisp_Process  */
        !            88:     Lisp_Process,
        !            89: 
        !            90:     /* Forwarding pointer to a Lisp_Object variable.
        !            91:        This is allowed only in the value cell of a symbol,
        !            92:        and it means that the symbol's value really lives in the
        !            93:        specified variable.
        !            94:        obj.v.objfwd points to the Lisp_Object variable. */
        !            95:     Lisp_Objfwd,
        !            96: 
        !            97:       /* was Lisp_Internal */
        !            98:     Lisp_Object_Unused_2,
        !            99: 
        !           100:     /* Used when a FILE * value needs to be passed
        !           101:        in an argument of type Lisp_Object.
        !           102:        You must do (FILE *) obj.v.integer to get the value.
        !           103:        The user will never see this data type. */
        !           104:     Lisp_Internal_Stream,
        !           105: 
        !           106:     /* Used in a symbol value cell when the symbol's value is per-buffer.
        !           107:         The actual contents are a cons cell which starts a list like this:
        !           108:         (REALVALUE BUFFER CURRENT-ALIST-ELEMENT . DEFAULT-VALUE)).
        !           109: 
        !           110:        BUFFER is the last buffer for which this symbol's value was
        !           111:        made up to date.
        !           112: 
        !           113:         CURRENT-ALIST-ELEMENT is a pointer to an element of BUFFER's
        !           114:        b_local_var_alist, that being the element whose car is this variable.
        !           115:         Or it can be a pointer to the (CURRENT-ALIST-ELEMENT . DEFAULT-VALUE), if BUFFER
        !           116:        does not have an element in its alist for this variable
        !           117:        (that is, if BUFFER sees the default value of this variable).
        !           118: 
        !           119:        If we want to examine or set the value and BUFFER is current,
        !           120:        we just examine or set REALVALUE.
        !           121:        If BUFFER is not current, we store the current REALVALUE value into
        !           122:        CURRENT-ALIST-ELEMENT, then find the appropriate alist element for
        !           123:        the buffer now current and set up CURRENT-ALIST-ELEMENT.
        !           124:        Then we set REALVALUE out of that element, and store into BUFFER.
        !           125: 
        !           126:        If we are setting the variable and the current buffer does not have
        !           127:        an alist entry for this variable, an alist entry is created.
        !           128: 
        !           129:        Note that REALVALUE can be a forwarding pointer.
        !           130:        Each time it is examined or set, forwarding must be done.  */
        !           131:     Lisp_Buffer_Local_Value,
        !           132: 
        !           133:     /* Like Lisp_Buffer_Local_Value with one difference:
        !           134:        merely setting the variable while some buffer is current
        !           135:        does not cause that buffer to have its own local value of this variable.
        !           136:        Only make-local-variable does that.  */
        !           137:     Lisp_Some_Buffer_Local_Value,
        !           138: 
        !           139: 
        !           140:     /* Like Lisp_Objfwd except that value lives in a slot
        !           141:        in the current buffer.  Value is byte index of slot within buffer */
        !           142:     Lisp_Buffer_Objfwd,
        !           143: 
        !           144:     /* In symbol value cell, means var is unbound.
        !           145:        In symbol function cell, means function name is undefined. */
        !           146:     Lisp_Void,
        !           147: 
        !           148:     /* Window used for Emacs display.
        !           149:        Data inside looks like a Lisp_Vector.  */
        !           150:     Lisp_Window,
        !           151: 
        !           152:     /* Used by save,set,restore-window-configuration */
        !           153:     Lisp_Window_Configuration
        !           154:   };
        !           155: 
        !           156: #ifndef NO_UNION_TYPE
        !           157: 
        !           158: #ifndef BIG_ENDIAN
        !           159: 
        !           160: /* Definition of Lisp_Object for little-endian machines.  */
        !           161: 
        !           162: typedef
        !           163: union Lisp_Object
        !           164:   {
        !           165:     /* Used for comparing two Lisp_Objects;
        !           166:        also, positive integers can be accessed fast this way. */
        !           167:     int i;
        !           168: 
        !           169:     struct
        !           170:       {
        !           171:        int val: 24;
        !           172:        char type;
        !           173:       } s;
        !           174:     struct
        !           175:       {
        !           176:        unsigned int val: 24;
        !           177:        char type;
        !           178:       } u;
        !           179:     struct
        !           180:       {
        !           181:        unsigned int val: 24;
        !           182:        enum Lisp_Type type: 7;
        !           183:        /* The markbit is not really part of the value of a Lisp_Object,
        !           184:           and is always zero except during garbage collection.  */
        !           185:        unsigned int markbit: 1;
        !           186:       } gu;
        !           187:   }
        !           188: Lisp_Object;
        !           189: 
        !           190: #else /* If BIG_ENDIAN */
        !           191: 
        !           192: typedef
        !           193: union Lisp_Object
        !           194:   {
        !           195:     /* Used for comparing two Lisp_Objects;
        !           196:        also, positive integers can be accessed fast this way. */
        !           197:     int i;
        !           198: 
        !           199:     struct
        !           200:       {
        !           201:        char type;
        !           202:        int val: 24;
        !           203:       } s;
        !           204:     struct
        !           205:       {
        !           206:        char type;
        !           207:        unsigned int val: 24;
        !           208:       } u;
        !           209:     struct
        !           210:       {
        !           211:        /* The markbit is not really part of the value of a Lisp_Object,
        !           212:           and is always zero except during garbage collection.  */
        !           213:        unsigned int markbit: 1;
        !           214:        enum Lisp_Type type: 7;
        !           215:        unsigned int val: 24;
        !           216:       } gu;
        !           217:   }
        !           218: Lisp_Object;
        !           219: 
        !           220: #endif /* BIG_ENDIAN */
        !           221: 
        !           222: #endif /* NO_UNION_TYPE */
        !           223: 
        !           224: 
        !           225: /* If union type is not wanted, define Lisp_Object as just a number
        !           226:    and define the macros below to extract fields by shifting */
        !           227: 
        !           228: #ifdef NO_UNION_TYPE
        !           229: 
        !           230: #define Lisp_Object int
        !           231: 
        !           232: /* These values are overridden by the m- file on some machines.  */
        !           233: #ifndef VALBITS
        !           234: #define VALBITS 24
        !           235: #endif
        !           236: 
        !           237: #ifndef GCTYPEBITS
        !           238: #define GCTYPEBITS 7
        !           239: #endif
        !           240: 
        !           241: #ifndef VALMASK
        !           242: #define VALMASK ((1<<VALBITS) - 1)
        !           243: #endif
        !           244: #define GCTYPEMASK ((1<<GCTYPEBITS) - 1)
        !           245: #define MARKBIT (1 << (VALBITS + GCTYPEBITS))
        !           246: 
        !           247: #endif /* NO_UNION_TYPE */
        !           248: 
        !           249: /* These macros extract various sorts of values from a Lisp_Object.
        !           250:  For example, if tem is a Lisp_Object whose type is Lisp_Cons,
        !           251:  XCONS (tem) is the struct Lisp_Cons * pointing to the memory for that cons. */
        !           252: 
        !           253: #ifdef NO_UNION_TYPE
        !           254: 
        !           255: /* One need to override this if there must be high bits set in data space
        !           256:    (doing the result of the below & ((1 << (GCTYPE + 1)) - 1) would work
        !           257:     on all machines, but would penalise machines which don't need it)
        !           258:  */
        !           259: #ifndef XTYPE
        !           260: #define XTYPE(a) ((enum Lisp_Type) ((a) >> VALBITS))
        !           261: #endif
        !           262: 
        !           263: #ifndef XSETTYPE
        !           264: #define XSETTYPE(a, b) ((a)  =  XUINT (a) | ((int)(b) << VALBITS))
        !           265: #endif
        !           266: 
        !           267: /* Use XFASTINT for fast retrieval and storage of integers known
        !           268:   to be positive.  This takes advantage of the fact that Lisp_Int is 0.  */
        !           269: #define XFASTINT(a) (a)
        !           270: 
        !           271: /* Extract the value of a Lisp_Object as a signed integer.  */
        !           272: 
        !           273: #ifndef XINT   /* Some machines need to do this differently.  */
        !           274: #define XINT(a) (((a) << (INTBITS-VALBITS)) >> (INTBITS-VALBITS))
        !           275: #endif
        !           276: 
        !           277: /* Extract the value as an unsigned integer.  This is a basis
        !           278:    for exctacting it as a pointer to a structure in storage.  */
        !           279: 
        !           280: #ifndef XUINT
        !           281: #define XUINT(a) ((a) & VALMASK)
        !           282: #endif
        !           283: 
        !           284: #ifdef HAVE_SHM
        !           285: /* In this representation, data is found in two widely separated segments.  */
        !           286: #define XPNTR(a) \
        !           287:   (XUINT (a) | (XUINT (a) > PURESIZE ? DATA_SEG_BITS : PURE_SEG_BITS))
        !           288: #else /* not HAVE_SHM */
        !           289: #ifdef DATA_SEG_BITS
        !           290: /* This case is used for the rt-pc.
        !           291:    In the diffs I was given, it checked for ptr = 0
        !           292:    and did not adjust it in that case.
        !           293:    But I don't think that zero should ever be found
        !           294:    in a Lisp object whose data type says it points to something.  */
        !           295: #define XPNTR(a) (XUINT (a) | DATA_SEG_BITS)
        !           296: #else /* not DATA_SEG_BITS */
        !           297: #define XPNTR(a) XUINT (a)
        !           298: #endif
        !           299: #endif /* not HAVE_SHM */
        !           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 access 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: /* In version 19, try 
        !           329: #if VALBITS + GCTYPEBITS == INTBITS - 1
        !           330: #define XMARKBIT(a) ((a) < 0)
        !           331: #define XSETMARKBIT(a,b) ((a) = ((a) & ~MARKBIT) | ((b) ? MARKBIT : 0))
        !           332: */
        !           333: 
        !           334: #ifndef XMARKBIT
        !           335: #define XMARKBIT(a) ((a) & MARKBIT)
        !           336: #endif
        !           337: 
        !           338: #ifndef XSETMARKBIT
        !           339: #define XSETMARKBIT(a,b) ((a) = ((a) & ~MARKBIT) | (b))
        !           340: #endif
        !           341: 
        !           342: #ifndef XMARK
        !           343: #define XMARK(a) ((a) |= MARKBIT)
        !           344: #endif
        !           345: 
        !           346: #ifndef XUNMARK
        !           347: #define XUNMARK(a) ((a) &= ~MARKBIT)
        !           348: #endif
        !           349: 
        !           350: #endif /* NO_UNION_TYPE */
        !           351: 
        !           352: #ifndef NO_UNION_TYPE
        !           353: 
        !           354: #define XTYPE(a) ((enum Lisp_Type) (a).u.type)
        !           355: #define XSETTYPE(a, b) ((a).u.type = (char) (b))
        !           356: 
        !           357: /* Use XFASTINT for fast retrieval and storage of integers known
        !           358:   to be positive.  This takes advantage of the fact that Lisp_Int is 0.  */
        !           359: #define XFASTINT(a) ((a).i)
        !           360: 
        !           361: #ifdef EXPLICIT_SIGN_EXTEND
        !           362: /* Make sure we sign-extend; compilers have been known to fail to do so.  */
        !           363: #define XINT(a) (((a).i << 8) >> 8)
        !           364: #else
        !           365: #define XINT(a) ((a).s.val)
        !           366: #endif /* EXPLICIT_SIGN_EXTEND */
        !           367: 
        !           368: #define XUINT(a) ((a).u.val)
        !           369: #define XPNTR(a) ((a).u.val)
        !           370: #define XSETINT(a, b) ((a).s.val = (int) (b))
        !           371: #define XSETUINT(a, b) ((a).s.val = (int) (b))
        !           372: #define XSETPNTR(a, b) ((a).s.val = (int) (b))
        !           373: 
        !           374: #define XSET(var, vartype, ptr) \
        !           375:    (((var).s.type = ((char) (vartype))), ((var).s.val = ((int) (ptr))))
        !           376: 
        !           377: /* During garbage collection, XGCTYPE must be used for extracting types
        !           378:  so that the mark bit is ignored.  XMARKBIT access the markbit.
        !           379:  Markbits are used only in particular slots of particular structure types.
        !           380:  Other markbits are always zero.
        !           381:  Outside of garbage collection, all mark bits are always zero.  */
        !           382: 
        !           383: #define XGCTYPE(a) ((a).gu.type)
        !           384: #define XMARKBIT(a) ((a).gu.markbit)
        !           385: #define XSETMARKBIT(a,b) (XMARKBIT(a) = (b))
        !           386: #define XMARK(a) (XMARKBIT(a) = 1)
        !           387: #define XUNMARK(a) (XMARKBIT(a) = 0)
        !           388: 
        !           389: #endif /* NO_UNION_TYPE */
        !           390: 
        !           391: 
        !           392: #define XCONS(a) ((struct Lisp_Cons *) XPNTR(a))
        !           393: #define XBUFFER(a) ((struct buffer *) XPNTR(a))
        !           394: #define XVECTOR(a) ((struct Lisp_Vector *) XPNTR(a))
        !           395: #define XSUBR(a) ((struct Lisp_Subr *) XPNTR(a))
        !           396: #define XSTRING(a) ((struct Lisp_String *) XPNTR(a))
        !           397: #define XSYMBOL(a) ((struct Lisp_Symbol *) XPNTR(a))
        !           398: #define XFUNCTION(a) ((Lisp_Object (*)()) XPNTR(a))
        !           399: #define XMARKER(a) ((struct Lisp_Marker *) XPNTR(a))
        !           400: #define XOBJFWD(a) ((Lisp_Object *) XPNTR(a))
        !           401: #define XINTPTR(a) ((int *) XPNTR(a))
        !           402: #define XWINDOW(a) ((struct window *) XPNTR(a))
        !           403: #define XPROCESS(a) ((struct Lisp_Process *) XPNTR(a))
        !           404: 
        !           405: #define XSETCONS(a, b) XSETPNTR(a, (int) (b))
        !           406: #define XSETBUFFER(a, b) XSETPNTR(a, (int) (b))
        !           407: #define XSETVECTOR(a, b) XSETPNTR(a, (int) (b))
        !           408: #define XSETSUBR(a, b) XSETPNTR(a, (int) (b))
        !           409: #define XSETSTRING(a, b) XSETPNTR(a, (int) (b))
        !           410: #define XSETSYMBOL(a, b) XSETPNTR(a, (int) (b))
        !           411: #define XSETFUNCTION(a, b) XSETPNTR(a, (int) (b))
        !           412: #define XSETMARKER(a, b) XSETPNTR(a, (int) (b))
        !           413: #define XSETOBJFWD(a, b) XSETPNTR(a, (int) (b))
        !           414: #define XSETINTPTR(a, b) XSETPNTR(a, (int) (b))
        !           415: #define XSETWINDOW(a, b) XSETPNTR(a, (int) (b))
        !           416: #define XSETPROCESS(a, b) XSETPNTR(a, (int) (b))
        !           417: 
        !           418: /* In a cons, the markbit of the car is the gc mark bit */
        !           419: 
        !           420: struct Lisp_Cons
        !           421:   {
        !           422:     Lisp_Object car, cdr;
        !           423:   };
        !           424: 
        !           425: /* Like a cons, but records info on where the text lives that it was read from */
        !           426: /* This is not really in use now */
        !           427: 
        !           428: struct Lisp_Buffer_Cons
        !           429:   {
        !           430:     Lisp_Object car, cdr;
        !           431:     struct buffer *buffer;
        !           432:     int bufpos;
        !           433:   };
        !           434: 
        !           435: /* In a string or vector, the sign bit of the `size' is the gc mark bit */
        !           436: 
        !           437: struct Lisp_String
        !           438:   {
        !           439:     int size;
        !           440:     unsigned char data[1];
        !           441:   };
        !           442: 
        !           443: struct Lisp_Vector
        !           444:   {
        !           445:     int size;
        !           446:     struct Lisp_Vector *next;
        !           447:     Lisp_Object contents[1];
        !           448:   };
        !           449: 
        !           450: /* In a symbol, the markbit of the plist is used as the gc mark bit */
        !           451: 
        !           452: struct Lisp_Symbol
        !           453:   {
        !           454:     struct Lisp_String *name;
        !           455:     Lisp_Object value;
        !           456:     Lisp_Object function;
        !           457:     Lisp_Object plist;
        !           458:     struct Lisp_Symbol *next;  /* -> next symbol in this obarray bucket */
        !           459:   };
        !           460: 
        !           461: struct Lisp_Subr
        !           462:   {
        !           463:     Lisp_Object (*function) ();
        !           464:     short min_args, max_args;
        !           465:     char *symbol_name;
        !           466:     char *prompt;
        !           467:     char *doc;
        !           468:   };
        !           469: 
        !           470: /* In a marker, the markbit of the chain field is used as the gc mark bit */
        !           471: 
        !           472: struct Lisp_Marker
        !           473:   {
        !           474:     struct buffer *buffer;
        !           475:     Lisp_Object chain;
        !           476:     int bufpos;
        !           477:   };
        !           478: 
        !           479: /* Data type checking */
        !           480: 
        !           481: #ifdef NULL
        !           482: #undef NULL
        !           483: #endif
        !           484: #define NULL(x)  (XFASTINT (x) == XFASTINT (Qnil))
        !           485: /* #define LISTP(x) (XTYPE ((x)) == Lisp_Cons)*/
        !           486: #define CONSP(x) (XTYPE ((x)) == Lisp_Cons)
        !           487: #define EQ(x, y) (XFASTINT (x) == XFASTINT (y))
        !           488: 
        !           489: #define CHECK_LIST(x, i) \
        !           490:   { if ((XTYPE ((x)) != Lisp_Cons) && !NULL (x)) x = wrong_type_argument (Qlistp, (x)); }
        !           491: 
        !           492: #define CHECK_STRING(x, i) \
        !           493:   { if (XTYPE ((x)) != Lisp_String) x = wrong_type_argument (Qstringp, (x)); }
        !           494: 
        !           495: #define CHECK_CONS(x, i) \
        !           496:   { if (XTYPE ((x)) != Lisp_Cons) x = wrong_type_argument (Qconsp, (x)); }
        !           497: 
        !           498: #define CHECK_SYMBOL(x, i) \
        !           499:   { if (XTYPE ((x)) != Lisp_Symbol) x = wrong_type_argument (Qsymbolp, (x)); }
        !           500: 
        !           501: #define CHECK_VECTOR(x, i) \
        !           502:   { if (XTYPE ((x)) != Lisp_Vector) x = wrong_type_argument (Qvectorp, (x)); }
        !           503: 
        !           504: #define CHECK_BUFFER(x, i) \
        !           505:   { if (XTYPE ((x)) != Lisp_Buffer) x = wrong_type_argument (Qbufferp, (x)); }
        !           506: 
        !           507: #define CHECK_WINDOW(x, i) \
        !           508:   { if (XTYPE ((x)) != Lisp_Window) x = wrong_type_argument (Qwindowp, (x)); }
        !           509: 
        !           510: #define CHECK_PROCESS(x, i) \
        !           511:   { if (XTYPE ((x)) != Lisp_Process) x = wrong_type_argument (Qprocessp, (x)); }
        !           512: 
        !           513: #define CHECK_NUMBER(x, i) \
        !           514:   { if (XTYPE ((x)) != Lisp_Int) x = wrong_type_argument (Qintegerp, (x)); }
        !           515: 
        !           516: #define CHECK_MARKER(x, i) \
        !           517:   { if (XTYPE ((x)) != Lisp_Marker) x = wrong_type_argument (Qmarkerp, (x)); }
        !           518: 
        !           519: #define CHECK_NUMBER_COERCE_MARKER(x, i) \
        !           520:   { if (XTYPE ((x)) == Lisp_Marker) XFASTINT (x) = marker_position (x); \
        !           521:     else if (XTYPE ((x)) != Lisp_Int) x = wrong_type_argument (Qinteger_or_marker_p, (x)); }
        !           522: 
        !           523: #ifdef VIRT_ADDR_VARIES
        !           524: 
        !           525: /* For machines like APOLLO where text and data can go anywhere
        !           526:    in virtual memory.  */
        !           527: #define CHECK_IMPURE(obj) \
        !           528:   { extern int pure[]; \
        !           529:     if ((PNTR_COMPARISON_TYPE) XPNTR (obj) < (PNTR_COMPARISON_TYPE) ((char *) pure + PURESIZE) \
        !           530:        && (PNTR_COMPARISON_TYPE) XPNTR (obj) >= (PNTR_COMPARISON_TYPE) pure) \
        !           531:       pure_write_error (); }
        !           532: 
        !           533: #else /* not VIRT_ADDR_VARIES */
        !           534: #ifdef PNTR_COMPARISON_TYPE
        !           535: 
        !           536: /* when PNTR_COMPARISON_TYPE is not the default (unsigned int) */
        !           537: #define CHECK_IMPURE(obj) \
        !           538:   { extern int my_edata; \
        !           539:     if ((PNTR_COMPARISON_TYPE) XPNTR (obj) < (PNTR_COMPARISON_TYPE) &my_edata) \
        !           540:       pure_write_error (); }
        !           541: 
        !           542: #else /* not VIRT_ADDRESS_VARIES, not PNTR_COMPARISON_TYPE */
        !           543: 
        !           544: #define CHECK_IMPURE(obj) \
        !           545:   { extern int my_edata; \
        !           546:     if (XPNTR (obj) < (unsigned int) &my_edata) \
        !           547:       pure_write_error (); }
        !           548: 
        !           549: #endif /* PNTR_COMPARISON_TYPE */
        !           550: #endif /* VIRT_ADDRESS_VARIES */
        !           551: 
        !           552: /* Cast pointers to this type to compare them.  Some machines want int.  */
        !           553: #ifndef PNTR_COMPARISON_TYPE
        !           554: #define PNTR_COMPARISON_TYPE unsigned int
        !           555: #endif
        !           556: 
        !           557: /* Define a built-in function for calling from Lisp.
        !           558:  `lname' should be the name to give the function in Lisp,
        !           559:     as a null-terminated C string.
        !           560:  `fnname' should be the name of the function in C.
        !           561:     By convention, it starts with F.
        !           562:  `sname' should be the name for the C constant structure
        !           563:     that records information on this function for internal use.
        !           564:     By convention, it should be the same as `fnname' but with S instead of F.
        !           565:     It's too bad that C macros can't compute this from `fnname'.
        !           566:  `minargs' should be a number, the minimum number of arguments allowed.
        !           567:  `maxargs' should be a number, the maximum number of arguments allowed,
        !           568:     or else MANY or UNEVALLED.
        !           569:     MANY means pass a vector of evaluated arguments,
        !           570:         in the form of an integer number-of-arguments
        !           571:         followed by the address of a vector of Lisp_Objects
        !           572:         which contains the argument values.
        !           573:     UNEVALLED means pass the list of unevaluated arguments
        !           574:  `prompt' says how to read arguments for an interactive call.
        !           575:     This can be zero or a C string.
        !           576:     Zero means that interactive calls are not allowed.
        !           577:     A string is interpreted in a hairy way:
        !           578:      it should contain one line for each argument to be read, terminated by \n.
        !           579:      The first character of the line controls the type of parsing:
        !           580:        s  --  read a string.
        !           581:        S  --  read a symbol.
        !           582:        k  --  read a key sequence and return it as a string.
        !           583:        a  --  read a function name (symbol) with completion.
        !           584:        C  --  read a command name (symbol) with completion.
        !           585:        v  --  read a variable name (symbol) with completion.
        !           586:        b  --  read a buffer name (a string) with completion.
        !           587:        B  --  buffer name, may be existing buffer or may not be.
        !           588:        f  --  read a file name, file must exist.
        !           589:        F  --  read a file name, file need not exist.
        !           590:        n  --  read a number.
        !           591:        c  --  read a character and return it as a number.
        !           592:        p  --  use the numeric value of the prefix argument.
        !           593:        P  --  use raw value of prefix - can be nil, -, (NUMBER) or NUMBER.
        !           594:        x  --  read a Lisp object from the minibuffer.
        !           595:        X  --  read a Lisp form from the minibuffer and use its value.
        !           596:     A null string means call interactively with no arguments.
        !           597:  `doc' is documentation for the user.
        !           598: */
        !           599: 
        !           600: #define DEFUN(lname, fnname, sname, minargs, maxargs, prompt, doc) \
        !           601:   Lisp_Object fnname (); \
        !           602:   struct Lisp_Subr sname = {fnname, minargs, maxargs, lname, prompt, 0}; \
        !           603:   Lisp_Object fnname
        !           604: 
        !           605: /* defsubr (Sname);
        !           606:  is how we define the symbol for function `name' at start-up time. */
        !           607: extern void defsubr ();
        !           608: 
        !           609: #define MANY -2
        !           610: #define UNEVALLED -1
        !           611: 
        !           612: /* Macros we use to define forwarded Lisp variables.
        !           613:    These are used in the syms_of_FILENAME functions.  */
        !           614: 
        !           615: #define DEFVARLISP(lname, vname, doc) defvar_lisp (lname, vname)
        !           616: #define DEFVARBOOL(lname, vname, doc) defvar_bool (lname, vname)
        !           617: #define DEFVARINT(lname, vname, doc) defvar_int (lname, vname)
        !           618: #define DEFVARPERBUFFER(lname, vname, doc)  \
        !           619:  defvar_per_buffer (lname, vname, 0)
        !           620: 
        !           621: #define DEFVAR_LISP(lname, vname, doc) defvar_lisp (lname, vname)
        !           622: #define DEFVAR_LISP_NOPRO(lname, vname, doc) defvar_lisp_nopro (lname, vname)
        !           623: #define DEFVAR_BOOL(lname, vname, doc) defvar_bool (lname, vname)
        !           624: #define DEFVAR_INT(lname, vname, doc) defvar_int (lname, vname)
        !           625: #define DEFVAR_PER_BUFFER(lname, vname, doc)  \
        !           626:  defvar_per_buffer (lname, vname, 0)
        !           627: 
        !           628: /* Structure for recording Lisp call stack for backtrace purposes */
        !           629: 
        !           630: struct specbinding
        !           631:   {
        !           632:     Lisp_Object symbol, old_value;
        !           633:     Lisp_Object (*func) ();
        !           634:     Lisp_Object unused;                /* Dividing by 16 is faster than by 12 */
        !           635:   };
        !           636: 
        !           637: extern struct specbinding *specpdl;
        !           638: extern struct specbinding *specpdl_ptr;
        !           639: extern int specpdl_size;
        !           640: 
        !           641: struct handler
        !           642:   {
        !           643:     Lisp_Object handler;
        !           644:     Lisp_Object var;
        !           645:     int poll_suppress_count;   /* No error should exit a piece of code
        !           646:                                   in which polling is suppressed.  */
        !           647:     struct catchtag *tag;
        !           648:     struct handler *next;
        !           649:   };
        !           650: 
        !           651: extern struct handler *handlerlist;
        !           652: 
        !           653: /* Check quit-flag and quit if it is non-nil. */
        !           654: 
        !           655: #define QUIT \
        !           656:   if (!NULL (Vquit_flag) && NULL (Vinhibit_quit)) \
        !           657:     { Vquit_flag = Qnil; Fsignal (Qquit, Qnil); }
        !           658: 
        !           659: /* Nonzero if ought to quit now.  */
        !           660: 
        !           661: #define QUITP (!NULL (Vquit_flag) && NULL (Vinhibit_quit))
        !           662: 
        !           663: /* 1 if CH is upper case.  */
        !           664: 
        !           665: #define UPPERCASEP(CH) (downcase_table[CH] != (CH))
        !           666: 
        !           667: /* 1 if CH is lower case.  */
        !           668: 
        !           669: #define LOWERCASEP(CH)   \
        !           670:  (downcase_table[CH] == (CH) && downcase_table[0400 + (CH)] != (CH))
        !           671: 
        !           672: /* 1 if CH is neither upper nor lower case.  */
        !           673: 
        !           674: #define NOCASEP(CH) (downcase_table[0400 + (CH)] == (CH))
        !           675: 
        !           676: /* Upcase a character, or make no change if that cannot be done.  */
        !           677: 
        !           678: #define UPCASE(CH) (downcase_table[CH] == (CH) ? UPCASE1 (CH) : (CH))
        !           679: 
        !           680: /* Upcase a character known to be not upper case.  */
        !           681: 
        !           682: #define UPCASE1(CH) downcase_table[0400 + (CH)]
        !           683: 
        !           684: /* Downcase a character, or make no change if that cannot be done. */
        !           685: 
        !           686: #define DOWNCASE(CH) downcase_table[CH]
        !           687: 
        !           688: /* number of bytes of structure consed since last GC */
        !           689: 
        !           690: extern int consing_since_gc;
        !           691: 
        !           692: /* threshold for doing another gc */
        !           693: 
        !           694: extern int gc_cons_threshold;
        !           695: 
        !           696: /* value of consing_since_gc when undos were last truncated.  */
        !           697: 
        !           698: extern int consing_at_last_truncate;
        !           699: 
        !           700: /* Structure for recording stack slots that need marking */
        !           701: 
        !           702: /* This is a chain of structures, each of which points at a Lisp_Object variable
        !           703:  whose value should be marked in garbage collection.
        !           704:  Normally every link of the chain is an automatic variable of a function,
        !           705:  and its `val' points to some argument or local variable of the function.
        !           706:  On exit to the function, the chain is set back to the value it had on entry.
        !           707:  This way, no link remains in the chain when the stack frame containing the link disappears.
        !           708: 
        !           709:  Every function that can call Feval must protect in this fashion all
        !           710:  Lisp_Object variables whose contents will be used again. */
        !           711: 
        !           712: extern struct gcpro *gcprolist;
        !           713: 
        !           714: struct gcpro
        !           715:   {
        !           716:     struct gcpro *next;
        !           717:     Lisp_Object *var;          /* Address of first protected variable */
        !           718:     int nvars;                 /* Number of consecutive protected variables */
        !           719:   };
        !           720: 
        !           721: #define GCPRO1(varname) \
        !           722:  {gcpro1.next = gcprolist; gcpro1.var = &varname; gcpro1.nvars = 1; \
        !           723:   gcprolist = &gcpro1; }
        !           724: 
        !           725: #define GCPRO2(varname1, varname2) \
        !           726:  {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
        !           727:   gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
        !           728:   gcprolist = &gcpro2; }
        !           729: 
        !           730: #define GCPRO3(varname1, varname2, varname3) \
        !           731:  {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
        !           732:   gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
        !           733:   gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
        !           734:   gcprolist = &gcpro3; }
        !           735: 
        !           736: #define GCPRO4(varname1, varname2, varname3, varname4) \
        !           737:  {gcpro1.next = gcprolist; gcpro1.var = &varname1; gcpro1.nvars = 1; \
        !           738:   gcpro2.next = &gcpro1; gcpro2.var = &varname2; gcpro2.nvars = 1; \
        !           739:   gcpro3.next = &gcpro2; gcpro3.var = &varname3; gcpro3.nvars = 1; \
        !           740:   gcpro4.next = &gcpro3; gcpro4.var = &varname4; gcpro4.nvars = 1; \
        !           741:   gcprolist = &gcpro4; }
        !           742: 
        !           743: /* Call staticpro (&var) to protect static variable `var'. */
        !           744: 
        !           745: void staticpro();
        !           746:   
        !           747: #define UNGCPRO (gcprolist = gcpro1.next)
        !           748: 
        !           749: /* Defined in data.c */
        !           750: extern Lisp_Object Qnil, Qt, Qquote, Qlambda, Qsubr, Qunbound;
        !           751: extern Lisp_Object Qerror_conditions, Qerror_message, Qtop_level;
        !           752: extern Lisp_Object Qerror, Qquit, Qwrong_type_argument, Qargs_out_of_range;
        !           753: extern Lisp_Object Qvoid_variable, Qvoid_function;
        !           754: extern Lisp_Object Qsetting_constant, Qinvalid_read_syntax;
        !           755: extern Lisp_Object Qinvalid_function, Qwrong_number_of_arguments, Qno_catch;
        !           756: extern Lisp_Object Qend_of_file, Qarith_error;
        !           757: extern Lisp_Object Qbeginning_of_buffer, Qend_of_buffer, Qbuffer_read_only;
        !           758: 
        !           759: extern Lisp_Object Qintegerp, Qnatnump, Qsymbolp, Qlistp, Qconsp;
        !           760: extern Lisp_Object Qstringp, Qarrayp, Qsequencep, Qbufferp;
        !           761: extern Lisp_Object Qchar_or_string_p, Qmarkerp, Qvectorp;
        !           762: extern Lisp_Object Qinteger_or_marker_p, Qboundp, Qfboundp;
        !           763: extern Lisp_Object Qcdr;
        !           764: 
        !           765: extern Lisp_Object Feq (), Fnull (), Flistp (), Fconsp (), Fatom (), Fnlistp ();
        !           766: extern Lisp_Object Fintegerp (), Fnatnump (), Fsymbolp ();
        !           767: extern Lisp_Object Fvectorp (), Fstringp (), Farrayp (), Fsequencep ();
        !           768: extern Lisp_Object Fbufferp (), Fmarkerp (), Fsubrp (), Fchar_or_string_p ();
        !           769: extern Lisp_Object Finteger_or_marker_p ();
        !           770: 
        !           771: extern Lisp_Object Fcar (), Fcar_safe(), Fcdr (), Fcdr_safe();
        !           772: extern Lisp_Object Fsetcar (), Fsetcdr ();
        !           773: extern Lisp_Object Fboundp (), Ffboundp (), Fmakunbound (), Ffmakunbound ();
        !           774: extern Lisp_Object Fsymbol_function (), Fsymbol_plist (), Fsymbol_name ();
        !           775: extern Lisp_Object Ffset (), Fsetplist ();
        !           776: extern Lisp_Object Fsymbol_value (), Fset ();
        !           777: extern Lisp_Object Fdefault_value (), Fset_default ();
        !           778: 
        !           779: extern Lisp_Object Faref (), Faset (), Farray_length ();
        !           780: 
        !           781: extern Lisp_Object Fstring_to_int (), Fint_to_string ();
        !           782: extern Lisp_Object Feqlsign (), Fgtr (), Flss (), Fgeq (), Fleq (), Fneq (), Fzerop ();
        !           783: extern Lisp_Object Fplus (), Fminus (), Ftimes (), Fquo (), Frem (), Fmax (), Fmin ();
        !           784: extern Lisp_Object Flogand (), Flogior (), Flogxor (), Flognot (), Flsh (), Fash ();
        !           785: extern Lisp_Object Fadd1 (), Fsub1 ();
        !           786: 
        !           787: extern Lisp_Object make_number ();
        !           788: extern void args_out_of_range ();
        !           789: extern void args_out_of_range_3 ();
        !           790: extern Lisp_Object wrong_type_argument ();
        !           791: 
        !           792: /* Defined in fns.c */
        !           793: extern Lisp_Object Qstring_lessp;
        !           794: extern Lisp_Object Vfeatures;
        !           795: extern Lisp_Object Fidentity (), Frandom ();
        !           796: extern Lisp_Object Flength ();
        !           797: extern Lisp_Object Fappend (), Fconcat (), Fvconcat (), Fcopy_sequence ();
        !           798: extern Lisp_Object Fsubstring ();
        !           799: extern Lisp_Object Fnthcdr (), Fmemq (), Fassq (), Fassoc ();
        !           800: extern Lisp_Object Frassq (), Fdelq (), Fsort ();
        !           801: extern Lisp_Object Freverse (), Fnreverse (), Fget (), Fput (), Fequal ();
        !           802: extern Lisp_Object Ffillarray (), Fnconc (), Fmapcar (), Fmapconcat ();
        !           803: extern Lisp_Object Fy_or_n_p (), Fyes_or_no_p ();
        !           804: extern Lisp_Object Ffeaturep (), Frequire () , Fprovide ();
        !           805: extern Lisp_Object concat2 (), nconc2 ();
        !           806: extern Lisp_Object assq_no_quit ();
        !           807: 
        !           808: /* Defined in alloc.c */
        !           809: extern Lisp_Object Vpurify_flag;
        !           810: extern Lisp_Object Fcons (), Flist(), Fmake_list ();
        !           811: extern Lisp_Object Fmake_vector (), Fvector (), Fmake_symbol (), Fmake_marker ();
        !           812: extern Lisp_Object Fmake_string (), build_string (), make_string();
        !           813: extern Lisp_Object Fpurecopy (), make_pure_string ();
        !           814: extern Lisp_Object pure_cons (), make_pure_vector ();
        !           815: extern Lisp_Object Fgarbage_collect ();
        !           816: 
        !           817: /* Defined in print.c */
        !           818: extern Lisp_Object Vprin1_to_string_buffer;
        !           819: extern Lisp_Object Fprin1 (), Fprin1_to_string (), Fprinc ();
        !           820: extern Lisp_Object Fterpri (), Fprint ();
        !           821: extern Lisp_Object Vstandard_output, Qstandard_output;
        !           822: extern temp_output_buffer_setup (), temp_output_buffer_show ();
        !           823: 
        !           824: /* Defined in lread.c */
        !           825: extern Lisp_Object Qvariable_documentation, Qstandard_input;
        !           826: extern Lisp_Object Vobarray, Vstandard_input;
        !           827: extern Lisp_Object Fread (), Fread_from_string ();
        !           828: extern Lisp_Object Fintern (), Fintern_soft (), Fload ();
        !           829: extern Lisp_Object Fget_file_char (), Fread_char ();
        !           830: extern Lisp_Object Feval_current_buffer (), Feval_region ();
        !           831: extern Lisp_Object intern (), oblookup ();
        !           832: 
        !           833: /* Defined in eval.c */
        !           834: extern Lisp_Object Qautoload, Qexit, Qinteractive, Qcommandp, Qdefun, Qmacro;
        !           835: extern Lisp_Object Vinhibit_quit, Vquit_flag, Qinhibit_quit;
        !           836: extern Lisp_Object Vmocklisp_arguments, Qmocklisp, Qmocklisp_arguments;
        !           837: extern Lisp_Object Vautoload_queue;
        !           838: extern Lisp_Object Fand (), For (), Fif (), Fprogn (), Fprog1 (), Fprog2 ();
        !           839: extern Lisp_Object Fsetq (), Fquote ();
        !           840: extern Lisp_Object Fuser_variable_p (), Finteractive_p ();
        !           841: extern Lisp_Object Fdefun (), Flet (), FletX (), Fwhile ();
        !           842: extern Lisp_Object Fcatch (), Fthrow (), Funwind_protect ();
        !           843: extern Lisp_Object Fcondition_case (), Fsignal ();
        !           844: extern Lisp_Object Ffunction_type (), Fautoload (), Fcommandp ();
        !           845: extern Lisp_Object Feval (), Fapply (), Ffuncall ();
        !           846: extern Lisp_Object Fglobal_set (), Fglobal_value (), Fbacktrace ();
        !           847: extern Lisp_Object apply1 (), call0 (), call1 (), call2 (), call3 ();
        !           848: extern Lisp_Object apply_lambda ();
        !           849: extern Lisp_Object internal_catch ();
        !           850: extern Lisp_Object internal_condition_case ();
        !           851: extern void unbind_to ();
        !           852: extern void error ();
        !           853: extern Lisp_Object un_autoload ();
        !           854: 
        !           855: /* Defined in editfns.c */
        !           856: extern Lisp_Object Vprefix_arg, Qminus, Vcurrent_prefix_arg;
        !           857: extern Lisp_Object Fgoto_char ();
        !           858: extern Lisp_Object Fpoint_min_marker (), Fpoint_max_marker ();
        !           859: extern Lisp_Object Fpoint_min (), Fpoint_max ();
        !           860: extern Lisp_Object Fpoint (), Fpoint_marker (), Fmark_marker ();
        !           861: extern Lisp_Object Ffollchar (), Fprevchar (), Fchar_after (), Finsert ();
        !           862: extern Lisp_Object Feolp (), Feobp (), Fbolp (), Fbobp ();
        !           863: extern Lisp_Object Fformat (), format1 ();
        !           864: extern Lisp_Object Fbuffer_substring (), Fbuffer_string ();
        !           865: extern Lisp_Object Fstring_equal (), Fstring_lessp (), Fbuffer_substring_lessp ();
        !           866: extern Lisp_Object save_excursion_save (), save_restriction_save ();
        !           867: extern Lisp_Object save_excursion_restore (), save_restriction_restore ();
        !           868: extern Lisp_Object Fchar_to_string ();
        !           869: 
        !           870: /* defined in buffer.c */
        !           871: extern Lisp_Object Vbuffer_alist;
        !           872: extern Lisp_Object Fget_buffer (), Fget_buffer_create (), Fset_buffer ();
        !           873: extern Lisp_Object Fbarf_if_buffer_read_only ();
        !           874: extern Lisp_Object Fcurrent_buffer (), Fswitch_to_buffer (), Fpop_to_buffer ();
        !           875: extern Lisp_Object Fother_buffer ();
        !           876: extern struct buffer *all_buffers;
        !           877: 
        !           878: /* defined in marker.c */
        !           879: 
        !           880: extern Lisp_Object Fmarker_position (), Fmarker_buffer ();
        !           881: extern Lisp_Object Fcopy_marker ();
        !           882: 
        !           883: /* Defined in fileio.c */
        !           884: 
        !           885: extern Lisp_Object Qfile_error;
        !           886: extern Lisp_Object Ffile_name_as_directory ();
        !           887: extern Lisp_Object Fexpand_file_name (), Ffile_name_nondirectory ();
        !           888: extern Lisp_Object Fsubstitute_in_file_name ();
        !           889: extern Lisp_Object Ffile_symlink_p ();
        !           890: 
        !           891: /* Defined in abbrev.c */
        !           892: 
        !           893: extern Lisp_Object Vfundamental_mode_abbrev_table;
        !           894: 
        !           895: /* defined in search.c */
        !           896: extern unsigned char downcase_table[];
        !           897: extern Lisp_Object Fstring_match ();
        !           898: extern Lisp_Object Fscan_buffer ();
        !           899: 
        !           900: /* defined in minibuf.c */
        !           901: 
        !           902: extern Lisp_Object last_minibuf_string, Vminibuffer_list;
        !           903: extern Lisp_Object read_minibuf (), Fcompleting_read ();
        !           904: extern Lisp_Object Fread_from_minibuffer ();
        !           905: extern Lisp_Object Fread_variable ();
        !           906: extern Lisp_Object Fread_minibuffer (), Feval_minibuffer ();
        !           907: extern Lisp_Object Fread_string (), Fread_file_name ();
        !           908: extern Lisp_Object Fread_no_blanks_input ();
        !           909: 
        !           910: /* Defined in callint.c */
        !           911: 
        !           912: extern Lisp_Object Vcommand_history;
        !           913: extern Lisp_Object Qcall_interactively;
        !           914: extern Lisp_Object Fcall_interactively ();
        !           915: extern Lisp_Object Fprefix_numeric_value ();
        !           916: 
        !           917: /* defined in casefiddle.c */
        !           918: 
        !           919: extern Lisp_Object Fdowncase (), Fupcase (), Fcapitalize ();
        !           920: 
        !           921: /* defined in keyboard.c */
        !           922: 
        !           923: extern Lisp_Object Vhelp_form, Vtop_level;
        !           924: extern Lisp_Object Fdiscard_input (), Frecursive_edit ();
        !           925: extern Lisp_Object Fcommand_execute (), Finput_pending_p ();
        !           926: extern int poll_suppress_count;
        !           927: 
        !           928: /* defined in keymap.c */
        !           929: 
        !           930: extern Lisp_Object Qkeymap;
        !           931: extern Lisp_Object Fkey_description (), Fsingle_key_description ();
        !           932: extern Lisp_Object Fwhere_is_internal ();
        !           933: extern Lisp_Object access_keymap (), store_in_keymap ();
        !           934: extern Lisp_Object get_keyelt (), get_keymap();
        !           935: 
        !           936: /* defined in indent.c */
        !           937: extern Lisp_Object Fvertical_motion (), Findent_to (), Fcurrent_column ();
        !           938: 
        !           939: /* defined in window.c */
        !           940: extern Lisp_Object Qwindowp;
        !           941: extern Lisp_Object Fget_buffer_window ();
        !           942: extern Lisp_Object Fsave_window_excursion ();
        !           943: extern Lisp_Object Fset_window_configuration (), Fcurrent_window_configuration ();
        !           944: 
        !           945: /* defined in emacs.c */
        !           946: extern Lisp_Object decode_env_path ();
        !           947: /* Nonzero means don't do interactive redisplay and don't change tty modes */
        !           948: extern int noninteractive;
        !           949: /* Nonzero means don't do use window-system-specific display code */
        !           950: extern int inhibit_window_system;
        !           951: 
        !           952: /* defined in process.c */
        !           953: extern Lisp_Object Fget_process (), Fget_buffer_process (), Fprocessp ();
        !           954: extern Lisp_Object Fprocess_status (), Fkill_process ();
        !           955: 
        !           956: /* defined in callproc.c */
        !           957: extern Lisp_Object Vexec_path, Vexec_directory;
        !           958: 
        !           959: #ifdef MAINTAIN_ENVIRONMENT
        !           960: /* defined in environ.c */
        !           961: extern int size_of_current_environ ();
        !           962: extern void get_current_environ ();
        !           963: /* extern void current_environ (); */
        !           964: extern Lisp_Object Fgetenv ();
        !           965: #endif /* MAINTAIN_ENVIRONMENT */
        !           966: 
        !           967: /* defined in doc.c */
        !           968: extern Lisp_Object Vdoc_file_name;
        !           969: extern Lisp_Object Fsubstitute_command_keys ();
        !           970: extern Lisp_Object Fdocumentation (), Fdocumentation_property ();
        !           971: 
        !           972: /* defined in bytecode.c */
        !           973: extern Lisp_Object Qbytecode;
        !           974: 
        !           975: /* defined in macros.c */
        !           976: extern Lisp_Object Fexecute_kbd_macro ();
        !           977: 
        !           978: /* Nonzero means Emacs has already been initialized.
        !           979:    Used during startup to detect startup of dumped Emacs.  */
        !           980: extern int initialized;
        !           981: 
        !           982: extern int immediate_quit;         /* Nonzero means ^G can quit instantly */
        !           983: 
        !           984: extern void debugger ();
        !           985: 
        !           986: extern char *malloc (), *realloc (), *getenv (), *ctime (), *getwd ();
        !           987: extern long *xmalloc (), *xrealloc ();
        !           988: 
        !           989: #ifdef MAINTAIN_ENVIRONMENT
        !           990: extern unsigned char *egetenv ();
        !           991: #else
        !           992: #define egetenv getenv
        !           993: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.