Annotation of 43BSDReno/contrib/emacs-18.55/src/data.c, revision 1.1.1.1

1.1       root        1: /* Primitive operations on Lisp data types for GNU Emacs Lisp interpreter.
                      2:    Copyright (C) 1985, 1986 Free Software Foundation, Inc.
                      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: #include <signal.h>
                     23: 
                     24: #include "config.h"
                     25: #include "lisp.h"
                     26: 
                     27: #ifndef standalone
                     28: #include "buffer.h"
                     29: #endif
                     30: 
                     31: Lisp_Object Qnil, Qt, Qquote, Qlambda, Qsubr, Qunbound;
                     32: Lisp_Object Qerror_conditions, Qerror_message, Qtop_level;
                     33: Lisp_Object Qerror, Qquit, Qwrong_type_argument, Qargs_out_of_range;
                     34: Lisp_Object Qvoid_variable, Qvoid_function;
                     35: Lisp_Object Qsetting_constant, Qinvalid_read_syntax;
                     36: Lisp_Object Qinvalid_function, Qwrong_number_of_arguments, Qno_catch;
                     37: Lisp_Object Qend_of_file, Qarith_error;
                     38: Lisp_Object Qbeginning_of_buffer, Qend_of_buffer, Qbuffer_read_only;
                     39: Lisp_Object Qintegerp, Qnatnump, Qsymbolp, Qlistp, Qconsp;
                     40: Lisp_Object Qstringp, Qarrayp, Qsequencep, Qbufferp;
                     41: Lisp_Object Qchar_or_string_p, Qmarkerp, Qinteger_or_marker_p, Qvectorp;
                     42: Lisp_Object Qboundp, Qfboundp;
                     43: Lisp_Object Qcdr;
                     44: 
                     45: Lisp_Object
                     46: wrong_type_argument (predicate, value)
                     47:      register Lisp_Object predicate, value;
                     48: {
                     49:   register Lisp_Object tem;
                     50:   do
                     51:     {
                     52:       if (!EQ (Vmocklisp_arguments, Qt))
                     53:        {
                     54:         if (XTYPE (value) == Lisp_String &&
                     55:             (EQ (predicate, Qintegerp) || EQ (predicate, Qinteger_or_marker_p)))
                     56:           return Fstring_to_int (value, Qt);
                     57:         if (XTYPE (value) == Lisp_Int && EQ (predicate, Qstringp))
                     58:           return Fint_to_string (value);
                     59:        }
                     60:       value = Fsignal (Qwrong_type_argument, Fcons (predicate, Fcons (value, Qnil)));
                     61:       tem = call1 (predicate, value);
                     62:     }
                     63:   while (NULL (tem));
                     64:   return value;
                     65: }
                     66: 
                     67: pure_write_error ()
                     68: {
                     69:   error ("Attempt to modify read-only object");
                     70: }
                     71: 
                     72: void
                     73: args_out_of_range (a1, a2)
                     74:      Lisp_Object a1, a2;
                     75: {
                     76:   while (1)
                     77:     Fsignal (Qargs_out_of_range, Fcons (a1, Fcons (a2, Qnil)));
                     78: }
                     79: 
                     80: void
                     81: args_out_of_range_3 (a1, a2, a3)
                     82:      Lisp_Object a1, a2, a3;
                     83: {
                     84:   while (1)
                     85:     Fsignal (Qargs_out_of_range, Fcons (a1, Fcons (a2, Fcons (a3, Qnil))));
                     86: }
                     87: 
                     88: Lisp_Object
                     89: make_number (num)
                     90:      int num;
                     91: {
                     92:   register Lisp_Object val;
                     93:   XSET (val, Lisp_Int, num);
                     94:   return val;
                     95: }
                     96: 
                     97: /* On some machines, XINT needs a temporary location.
                     98:    Here it is, in case it is needed.  */
                     99: 
                    100: int sign_extend_temp;
                    101: 
                    102: /* On a few machines, XINT can only be done by calling this.  */
                    103: 
                    104: int
                    105: sign_extend_lisp_int (num)
                    106:      int num;
                    107: {
                    108:   if (num & (1 << (VALBITS - 1)))
                    109:     return num | ((-1) << VALBITS);
                    110:   else
                    111:     return num & ((1 << VALBITS) - 1);
                    112: }
                    113: 
                    114: /* Data type predicates */
                    115: 
                    116: DEFUN ("eq", Feq, Seq, 2, 2, 0,
                    117:   "T if the two args are the same Lisp object.")
                    118:   (obj1, obj2)
                    119:      Lisp_Object obj1, obj2;
                    120: {
                    121:   if (EQ (obj1, obj2))
                    122:     return Qt;
                    123:   return Qnil;
                    124: }
                    125: 
                    126: DEFUN ("null", Fnull, Snull, 1, 1, 0, "T if OBJECT is nil.")
                    127:   (obj)
                    128:      Lisp_Object obj;
                    129: {
                    130:   if (NULL (obj))
                    131:     return Qt;
                    132:   return Qnil;
                    133: }
                    134: 
                    135: DEFUN ("consp", Fconsp, Sconsp, 1, 1, 0, "T if OBJECT is a cons cell.")
                    136:   (obj)
                    137:      Lisp_Object obj;
                    138: {
                    139:   if (XTYPE (obj) == Lisp_Cons)
                    140:     return Qt;
                    141:   return Qnil;
                    142: }
                    143: 
                    144: DEFUN ("atom", Fatom, Satom, 1, 1, 0, "T if OBJECT is not a cons cell.  This includes nil.")
                    145:   (obj)
                    146:      Lisp_Object obj;
                    147: {
                    148:   if (XTYPE (obj) == Lisp_Cons)
                    149:     return Qnil;
                    150:   return Qt;
                    151: }
                    152: 
                    153: DEFUN ("listp", Flistp, Slistp, 1, 1, 0, "T if OBJECT is a list.  This includes nil.")
                    154:   (obj)
                    155:      Lisp_Object obj;
                    156: {
                    157:   if (XTYPE (obj) == Lisp_Cons || NULL (obj))
                    158:     return Qt;
                    159:   return Qnil;
                    160: }
                    161: 
                    162: DEFUN ("nlistp", Fnlistp, Snlistp, 1, 1, 0, "T if OBJECT is not a list.  Lists include nil.")
                    163:   (obj)
                    164:      Lisp_Object obj;
                    165: {
                    166:   if (XTYPE (obj) == Lisp_Cons || NULL (obj))
                    167:     return Qnil;
                    168:   return Qt;
                    169: }
                    170: 
                    171: DEFUN ("integerp", Fintegerp, Sintegerp, 1, 1, 0, "T if OBJECT is a number.")
                    172:   (obj)
                    173:      Lisp_Object obj;
                    174: {
                    175:   if (XTYPE (obj) == Lisp_Int)
                    176:     return Qt;
                    177:   return Qnil;
                    178: }
                    179: 
                    180: DEFUN ("natnump", Fnatnump, Snatnump, 1, 1, 0, "T if OBJECT is a nonnegative number.")
                    181:   (obj)
                    182:      Lisp_Object obj;
                    183: {
                    184:   if (XTYPE (obj) == Lisp_Int && XINT (obj) >= 0)
                    185:     return Qt;
                    186:   return Qnil;
                    187: }
                    188: 
                    189: DEFUN ("symbolp", Fsymbolp, Ssymbolp, 1, 1, 0, "T if OBJECT is a symbol.")
                    190:   (obj)
                    191:      Lisp_Object obj;
                    192: {
                    193:   if (XTYPE (obj) == Lisp_Symbol)
                    194:     return Qt;
                    195:   return Qnil;
                    196: }
                    197: 
                    198: DEFUN ("vectorp", Fvectorp, Svectorp, 1, 1, 0, "T if OBJECT is a vector.")
                    199:   (obj)
                    200:      Lisp_Object obj;
                    201: {
                    202:   if (XTYPE (obj) == Lisp_Vector)
                    203:     return Qt;
                    204:   return Qnil;
                    205: }
                    206: 
                    207: DEFUN ("stringp", Fstringp, Sstringp, 1, 1, 0, "T if OBJECT is a string.")
                    208:   (obj)
                    209:      Lisp_Object obj;
                    210: {
                    211:   if (XTYPE (obj) == Lisp_String)
                    212:     return Qt;
                    213:   return Qnil;
                    214: }
                    215: 
                    216: DEFUN ("arrayp", Farrayp, Sarrayp, 1, 1, 0, "T if OBJECT is an array (string or vector).")
                    217:   (obj)
                    218:      Lisp_Object obj;
                    219: {
                    220:   if (XTYPE (obj) == Lisp_Vector || XTYPE (obj) == Lisp_String)
                    221:     return Qt;
                    222:   return Qnil;
                    223: }
                    224: 
                    225: DEFUN ("sequencep", Fsequencep, Ssequencep, 1, 1, 0,
                    226:   "T if OBJECT is a sequence (list or array).")
                    227:   (obj)
                    228:      register Lisp_Object obj;
                    229: {
                    230:   if (CONSP (obj) || NULL (obj) ||
                    231:       XTYPE (obj) == Lisp_Vector || XTYPE (obj) == Lisp_String)
                    232:     return Qt;
                    233:   return Qnil;
                    234: }
                    235: 
                    236: DEFUN ("bufferp", Fbufferp, Sbufferp, 1, 1, 0, "T if OBJECT is an editor buffer.")
                    237:   (obj)
                    238:      Lisp_Object obj;
                    239: {
                    240:   if (XTYPE (obj) == Lisp_Buffer)
                    241:     return Qt;
                    242:   return Qnil;
                    243: }
                    244: 
                    245: DEFUN ("markerp", Fmarkerp, Smarkerp, 1, 1, 0, "T if OBJECT is a marker (editor pointer).")
                    246:   (obj)
                    247:      Lisp_Object obj;
                    248: {
                    249:   if (XTYPE (obj) == Lisp_Marker)
                    250:     return Qt;
                    251:   return Qnil;
                    252: }
                    253: 
                    254: DEFUN ("integer-or-marker-p", Finteger_or_marker_p, Sinteger_or_marker_p, 1, 1, 0,
                    255:   "T if OBJECT is an integer or a marker (editor pointer).")
                    256:   (obj)
                    257:      register Lisp_Object obj;
                    258: {
                    259:   if (XTYPE (obj) == Lisp_Marker || XTYPE (obj) == Lisp_Int)
                    260:     return Qt;
                    261:   return Qnil;
                    262: }
                    263: 
                    264: DEFUN ("subrp", Fsubrp, Ssubrp, 1, 1, 0, "T if OBJECT is a built-in function.")
                    265:   (obj)
                    266:      Lisp_Object obj;
                    267: {
                    268:   if (XTYPE (obj) == Lisp_Subr)
                    269:     return Qt;
                    270:   return Qnil;
                    271: }
                    272: 
                    273: DEFUN ("char-or-string-p", Fchar_or_string_p, Schar_or_string_p, 1, 1, 0, "T if OBJECT is a character (a number) or a string.")
                    274:   (obj)
                    275:      register Lisp_Object obj;
                    276: {
                    277:   if (XTYPE (obj) == Lisp_Int || XTYPE (obj) == Lisp_String)
                    278:     return Qt;
                    279:   return Qnil;
                    280: }
                    281: 
                    282: /* Extract and set components of lists */
                    283: 
                    284: DEFUN ("car", Fcar, Scar, 1, 1, 0,
                    285:   "Return the car of CONSCELL.  If arg is nil, return nil.")
                    286:   (list)
                    287:      register Lisp_Object list;
                    288: {
                    289:   while (1)
                    290:     {
                    291:       if (XTYPE (list) == Lisp_Cons)
                    292:        return XCONS (list)->car;
                    293:       else if (EQ (list, Qnil))
                    294:        return Qnil;
                    295:       else
                    296:        list = wrong_type_argument (Qlistp, list);
                    297:     }
                    298: }
                    299: 
                    300: DEFUN ("car-safe", Fcar_safe, Scar_safe, 1, 1, 0,
                    301:   "Return the car of OBJECT if it is a cons cell, or else  nil.")
                    302:   (object)
                    303:      Lisp_Object object;
                    304: {
                    305:   if (XTYPE (object) == Lisp_Cons)
                    306:     return XCONS (object)->car;
                    307:   else
                    308:     return Qnil;
                    309: }
                    310: 
                    311: DEFUN ("cdr", Fcdr, Scdr, 1, 1, 0,
                    312:   "Return the cdr of CONSCELL.  If arg is nil, return nil.")
                    313:   (list)
                    314:      register Lisp_Object list;
                    315: {
                    316:   while (1)
                    317:     {
                    318:       if (XTYPE (list) == Lisp_Cons)
                    319:        return XCONS (list)->cdr;
                    320:       else if (EQ (list, Qnil))
                    321:        return Qnil;
                    322:       else
                    323:        list = wrong_type_argument (Qlistp, list);
                    324:     }
                    325: }
                    326: 
                    327: DEFUN ("cdr-safe", Fcdr_safe, Scdr_safe, 1, 1, 0,
                    328:   "Return the cdr of OBJECT if it is a cons cell, or else  nil.")
                    329:   (object)
                    330:      Lisp_Object object;
                    331: {
                    332:   if (XTYPE (object) == Lisp_Cons)
                    333:     return XCONS (object)->cdr;
                    334:   else
                    335:     return Qnil;
                    336: }
                    337: 
                    338: DEFUN ("setcar", Fsetcar, Ssetcar, 2, 2, 0,
                    339:   "Set the car of CONSCELL to be NEWCAR.  Returns NEWCAR.")
                    340:   (cell, newcar)
                    341:      register Lisp_Object cell, newcar;
                    342: {
                    343:   if (XTYPE (cell) != Lisp_Cons)
                    344:     cell = wrong_type_argument (Qconsp, cell);
                    345: 
                    346:   CHECK_IMPURE (cell);
                    347:   XCONS (cell)->car = newcar;
                    348:   return newcar;
                    349: }
                    350: 
                    351: DEFUN ("setcdr", Fsetcdr, Ssetcdr, 2, 2, 0,
                    352:   "Set the cdr of CONSCELL to be NEWCDR.  Returns NEWCDR.")
                    353:   (cell, newcdr)
                    354:      register Lisp_Object cell, newcdr;
                    355: {
                    356:   if (XTYPE (cell) != Lisp_Cons)
                    357:     cell = wrong_type_argument (Qconsp, cell);
                    358: 
                    359:   CHECK_IMPURE (cell);
                    360:   XCONS (cell)->cdr = newcdr;
                    361:   return newcdr;
                    362: }
                    363: 
                    364: /* Extract and set components of symbols */
                    365: 
                    366: DEFUN ("boundp", Fboundp, Sboundp, 1, 1, 0, "T if SYMBOL's value is not void.")
                    367:   (sym)
                    368:      register Lisp_Object sym;
                    369: {
                    370:   CHECK_SYMBOL (sym, 0);
                    371:   return (XTYPE (XSYMBOL (sym)->value) == Lisp_Void
                    372:          || EQ (XSYMBOL (sym)->value, Qunbound))
                    373:         ? Qnil : Qt;
                    374: }
                    375: 
                    376: DEFUN ("fboundp", Ffboundp, Sfboundp, 1, 1, 0, "T if SYMBOL's function definition is not void.")
                    377:   (sym)
                    378:      register Lisp_Object sym;
                    379: {
                    380:   CHECK_SYMBOL (sym, 0);
                    381:   return (XTYPE (XSYMBOL (sym)->function) == Lisp_Void
                    382:          || EQ (XSYMBOL (sym)->function, Qunbound))
                    383:         ? Qnil : Qt;
                    384: }
                    385: 
                    386: DEFUN ("makunbound", Fmakunbound, Smakunbound, 1, 1, 0, "Make SYMBOL's value be void.")
                    387:   (sym)
                    388:      register Lisp_Object sym;
                    389: {
                    390:   CHECK_SYMBOL (sym, 0);
                    391:   XSYMBOL (sym)->value = Qunbound;
                    392:   return sym;
                    393: }
                    394: 
                    395: DEFUN ("fmakunbound", Ffmakunbound, Sfmakunbound, 1, 1, 0, "Make SYMBOL's function definition be void.")
                    396:   (sym)
                    397:      register Lisp_Object sym;
                    398: {
                    399:   CHECK_SYMBOL (sym, 0);
                    400:   XSYMBOL (sym)->function = Qunbound;
                    401:   return sym;
                    402: }
                    403: 
                    404: DEFUN ("symbol-function", Fsymbol_function, Ssymbol_function, 1, 1, 0,
                    405:   "Return SYMBOL's function definition.")
                    406:   (sym)
                    407:      register Lisp_Object sym;
                    408: {
                    409:   CHECK_SYMBOL (sym, 0);
                    410:   if (EQ (XSYMBOL (sym)->function, Qunbound))
                    411:     return Fsignal (Qvoid_function, Fcons (sym, Qnil));
                    412:   return XSYMBOL (sym)->function;
                    413: }
                    414: 
                    415: DEFUN ("symbol-plist", Fsymbol_plist, Ssymbol_plist, 1, 1, 0, "Return SYMBOL's property list.")
                    416:   (sym)
                    417:      register Lisp_Object sym;
                    418: {
                    419:   CHECK_SYMBOL (sym, 0);
                    420:   return XSYMBOL (sym)->plist;
                    421: }
                    422: 
                    423: DEFUN ("symbol-name", Fsymbol_name, Ssymbol_name, 1, 1, 0, "Return SYMBOL's name, a string.")
                    424:   (sym)
                    425:      register Lisp_Object sym;
                    426: {
                    427:   register Lisp_Object name;
                    428: 
                    429:   CHECK_SYMBOL (sym, 0);
                    430:   XSET (name, Lisp_String, XSYMBOL (sym)->name);
                    431:   return name;
                    432: }
                    433: 
                    434: DEFUN ("fset", Ffset, Sfset, 2, 2, 0,
                    435:   "Set SYMBOL's function definition to NEWVAL, and return NEWVAL.")
                    436:   (sym, newdef)
                    437:      register Lisp_Object sym, newdef;
                    438: {
                    439:   CHECK_SYMBOL (sym, 0);
                    440:   if (!NULL (Vautoload_queue) && !EQ (XSYMBOL (sym)->function, Qunbound))
                    441:     Vautoload_queue = Fcons (Fcons (sym, XSYMBOL (sym)->function),
                    442:                             Vautoload_queue);
                    443:   XSYMBOL (sym)->function = newdef;
                    444:   return newdef;
                    445: }
                    446: 
                    447: DEFUN ("setplist", Fsetplist, Ssetplist, 2, 2, 0,
                    448:   "Set SYMBOL's property list to NEWVAL, and return NEWVAL.")
                    449:   (sym, newplist)
                    450:      register Lisp_Object sym, newplist;
                    451: {
                    452:   CHECK_SYMBOL (sym, 0);
                    453:   XSYMBOL (sym)->plist = newplist;
                    454:   return newplist;
                    455: }
                    456: 
                    457: /* Getting and setting values of symbols */
                    458: 
                    459: /* Given the raw contents of a symbol value cell,
                    460:  return the Lisp value of the symbol. */
                    461: 
                    462: Lisp_Object
                    463: do_symval_forwarding (valcontents)
                    464:      register Lisp_Object valcontents;
                    465: {
                    466:   register Lisp_Object val;
                    467: #ifdef SWITCH_ENUM_BUG
                    468:   switch ((int) XTYPE (valcontents))
                    469: #else
                    470:   switch (XTYPE (valcontents))
                    471: #endif
                    472:     {
                    473:     case Lisp_Intfwd:
                    474:       XSET (val, Lisp_Int, *XINTPTR (valcontents));
                    475:       return val;
                    476: 
                    477:     case Lisp_Boolfwd:
                    478:       if (*XINTPTR (valcontents))
                    479:        return Qt;
                    480:       return Qnil;
                    481: 
                    482:     case Lisp_Objfwd:
                    483:       return *XOBJFWD (valcontents);
                    484: 
                    485:     case Lisp_Buffer_Objfwd:
                    486:       return *(Lisp_Object *)(XUINT (valcontents) + (char *)bf_cur);
                    487:     }
                    488:   return valcontents;
                    489: }
                    490: 
                    491: void
                    492: store_symval_forwarding (sym, valcontents, newval)
                    493:      Lisp_Object sym;
                    494:      register Lisp_Object valcontents, newval;
                    495: {
                    496: #ifdef SWITCH_ENUM_BUG
                    497:   switch ((int) XTYPE (valcontents))
                    498: #else
                    499:   switch (XTYPE (valcontents))
                    500: #endif
                    501:     {
                    502:     case Lisp_Intfwd:
                    503:       CHECK_NUMBER (newval, 1);
                    504:       *XINTPTR (valcontents) = XINT (newval);
                    505:       break;
                    506: 
                    507:     case Lisp_Boolfwd:
                    508:       *XINTPTR (valcontents) = NULL(newval) ? 0 : 1;
                    509:       break;
                    510: 
                    511:     case Lisp_Objfwd:
                    512:       *XOBJFWD (valcontents) = newval;
                    513:       break;
                    514: 
                    515:     case Lisp_Buffer_Objfwd:
                    516:       *(Lisp_Object *)(XUINT (valcontents) + (char *)bf_cur) = newval;
                    517:       break;
                    518: 
                    519:     default:
                    520:       valcontents = XSYMBOL (sym)->value;
                    521:       if (XTYPE (valcontents) == Lisp_Buffer_Local_Value ||
                    522:          XTYPE (valcontents) == Lisp_Some_Buffer_Local_Value)
                    523:        XCONS (XSYMBOL (sym)->value)->car = newval;
                    524:       else
                    525:        XSYMBOL (sym)->value = newval;
                    526:     }
                    527: }
                    528: 
                    529: /* Note that it must not be possible to quit within this function.
                    530:    Great care is required for this.  */
                    531: 
                    532: DEFUN ("symbol-value", Fsymbol_value, Ssymbol_value, 1, 1, 0, "Return SYMBOL's value.")
                    533:   (sym)
                    534:      Lisp_Object sym;
                    535: {
                    536:   register Lisp_Object valcontents, tem1;
                    537:   register Lisp_Object val;
                    538:   CHECK_SYMBOL (sym, 0);
                    539:   valcontents = XSYMBOL (sym)->value;
                    540: 
                    541:  retry:
                    542: #ifdef SWITCH_ENUM_BUG
                    543:   switch ((int) XTYPE (valcontents))
                    544: #else
                    545:   switch (XTYPE (valcontents))
                    546: #endif
                    547:     {
                    548:     case Lisp_Buffer_Local_Value:
                    549:     case Lisp_Some_Buffer_Local_Value:
                    550:       /* valcontents is a list
                    551:         (REALVALUE BUFFER CURRENT-ALIST-ELEMENT . DEFAULT-VALUE)).
                    552: 
                    553:         CURRENT-ALIST-ELEMENT is a pointer to an element of BUFFER's
                    554:        local_var_alist, that being the element whose car is this variable.
                    555:         Or it can be a pointer to the (CURRENT-ALIST-ELEMENT . DEFAULT-VALUE), if BUFFER
                    556:        does not have an element in its alist for this variable.
                    557: 
                    558:        If the current buffer is not BUFFER, we store the current REALVALUE value into
                    559:        CURRENT-ALIST-ELEMENT, then find the appropriate alist element for
                    560:        the buffer now current and set up CURRENT-ALIST-ELEMENT.
                    561:        Then we set REALVALUE out of that element, and store into BUFFER.
                    562:        Note that REALVALUE can be a forwarding pointer. */
                    563: 
                    564:       tem1 = XCONS (XCONS (valcontents)->cdr)->car;
                    565:       if (NULL (tem1) || bf_cur != XBUFFER (tem1))
                    566:        {
                    567:          tem1 = XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->car;
                    568:           Fsetcdr (tem1, do_symval_forwarding (XCONS (valcontents)->car));
                    569:          tem1 = assq_no_quit (sym, bf_cur->local_var_alist);
                    570:          if (NULL (tem1))
                    571:            tem1 = XCONS (XCONS (valcontents)->cdr)->cdr;
                    572:          XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->car = tem1;
                    573:          XSET (XCONS (XCONS (valcontents)->cdr)->car, Lisp_Buffer, bf_cur);
                    574:          store_symval_forwarding (sym, XCONS (valcontents)->car, Fcdr (tem1));
                    575:        }
                    576:       valcontents = XCONS (valcontents)->car;
                    577:       goto retry;
                    578: 
                    579:     case Lisp_Intfwd:
                    580:       XSET (val, Lisp_Int, *XINTPTR (valcontents));
                    581:       return val;
                    582: 
                    583:     case Lisp_Boolfwd:
                    584:       if (*XINTPTR (valcontents))
                    585:        return Qt;
                    586:       return Qnil;
                    587: 
                    588:     case Lisp_Objfwd:
                    589:       return *XOBJFWD (valcontents);
                    590: 
                    591:     case Lisp_Buffer_Objfwd:
                    592:       return *(Lisp_Object *)(XUINT (valcontents) + (char *)bf_cur);
                    593: 
                    594:     case Lisp_Symbol:
                    595:       /* For a symbol, check whether it is 'unbound. */
                    596:       if (!EQ (valcontents, Qunbound))
                    597:        break;
                    598:       /* drops through! */
                    599:     case Lisp_Void:
                    600:       return Fsignal (Qvoid_variable, Fcons (sym, Qnil));
                    601:     }
                    602:   return valcontents;
                    603: }
                    604: 
                    605: DEFUN ("default-value", Fdefault_value, Sdefault_value, 1, 1, 0,
                    606:   "Return SYMBOL's default value.\n\
                    607: This is the value that is seen in buffers that do not have their own values\n\
                    608: for this variable.")
                    609:   (sym)
                    610:      Lisp_Object sym;
                    611: {
                    612:   register Lisp_Object valcontents;
                    613: 
                    614:   CHECK_SYMBOL (sym, 0);
                    615:   valcontents = XSYMBOL (sym)->value;
                    616:   if (XTYPE (valcontents) == Lisp_Buffer_Objfwd)
                    617:     {
                    618:       register int idx = XUINT (valcontents);
                    619: 
                    620:       if (*(int *) (idx + (char *) &buffer_local_flags) != 0)
                    621:        return *(Lisp_Object *)(idx + (char *) &buffer_defaults);
                    622:     }
                    623: 
                    624:   if (XTYPE (valcontents) == Lisp_Buffer_Local_Value ||
                    625:       XTYPE (valcontents) == Lisp_Some_Buffer_Local_Value)
                    626:     return XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->cdr;
                    627:   return Fsymbol_value (sym);
                    628: }
                    629: 
                    630: DEFUN ("set", Fset, Sset, 2, 2, 0,
                    631:   "Set SYMBOL's value to NEWVAL, and return NEWVAL.")
                    632:   (sym, newval)
                    633:      register Lisp_Object sym, newval;
                    634: {
                    635: #ifndef RTPC_REGISTER_BUG
                    636:   register Lisp_Object valcontents, tem1, current_alist_element;
                    637: #else /* RTPC_REGISTER_BUG */
                    638:   register Lisp_Object tem1;
                    639:   Lisp_Object valcontents, current_alist_element;
                    640: #endif /* RTPC_REGISTER_BUG */
                    641: 
                    642:   CHECK_SYMBOL (sym, 0);
                    643:   if (NULL (sym) || EQ (sym, Qt))
                    644:     return Fsignal (Qsetting_constant, Fcons (sym, Qnil));
                    645:   valcontents = XSYMBOL (sym)->value;
                    646: 
                    647:   if (XTYPE (valcontents) == Lisp_Buffer_Objfwd)
                    648:     {
                    649:       register int idx = XUINT (valcontents);
                    650:       register int mask = *(int *)(idx + (char *) &buffer_local_flags);
                    651:       if (mask > 0)
                    652:        bf_cur->local_var_flags |= mask;
                    653:     }
                    654: 
                    655:   if (XTYPE (valcontents) == Lisp_Buffer_Local_Value ||
                    656:       XTYPE (valcontents) == Lisp_Some_Buffer_Local_Value)
                    657:     {
                    658:       /* valcontents is a list
                    659:         (REALVALUE BUFFER CURRENT-ALIST-ELEMENT . DEFAULT-VALUE)).
                    660: 
                    661:         CURRENT-ALIST-ELEMENT is a pointer to an element of BUFFER's
                    662:        local_var_alist, that being the element whose car is this variable.
                    663:         Or it can be a pointer to the (CURRENT-ALIST-ELEMENT . DEFAULT-VALUE), if BUFFER
                    664:        does not have an element in its alist for this variable.
                    665: 
                    666:        If the current buffer is not BUFFER, we store the current REALVALUE value into
                    667:        CURRENT-ALIST-ELEMENT, then find the appropriate alist element for
                    668:        the buffer now current and set up CURRENT-ALIST-ELEMENT.
                    669:        Then we set REALVALUE out of that element, and store into BUFFER.
                    670:        Note that REALVALUE can be a forwarding pointer. */
                    671: 
                    672:       current_alist_element = XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->car;
                    673:       if (bf_cur != ((XTYPE (valcontents) == Lisp_Some_Buffer_Local_Value)
                    674:                     ? XBUFFER (XCONS (XCONS (valcontents)->cdr)->car)
                    675:                     : XBUFFER (XCONS (current_alist_element)->car)))
                    676:        {
                    677:           Fsetcdr (current_alist_element, do_symval_forwarding (XCONS (valcontents)->car));
                    678: 
                    679:          tem1 = Fassq (sym, bf_cur->local_var_alist);
                    680:          if (NULL (tem1))
                    681:            /* This buffer sees the default value still.
                    682:               If type is Lisp_Some_Buffer_Local_Value, set the default value.
                    683:               If type is Lisp_Buffer_Local_Value, give this buffer a local value
                    684:                and set that.  */
                    685:            if (XTYPE (valcontents) == Lisp_Some_Buffer_Local_Value)
                    686:              tem1 = XCONS (XCONS (valcontents)->cdr)->cdr;
                    687:            else
                    688:              {
                    689:                tem1 = Fcons (sym, Fcdr (current_alist_element));
                    690:                bf_cur->local_var_alist = Fcons (tem1, bf_cur->local_var_alist);
                    691:              }
                    692:          XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->car = tem1;
                    693:          XSET (XCONS (XCONS (valcontents)->cdr)->car, Lisp_Buffer, bf_cur);
                    694:        }
                    695:       valcontents = XCONS (valcontents)->car;
                    696:     }
                    697:   store_symval_forwarding (sym, valcontents, newval);
                    698:   return newval;
                    699: }
                    700: 
                    701: DEFUN ("set-default", Fset_default, Sset_default, 2, 2, 0,
                    702:   "Set SYMBOL's default value to VAL.  SYMBOL and VAL are evaluated.\n\
                    703: The default value is seen in buffers that do not have their own values\n\
                    704: for this variable.")
                    705:   (sym, value)
                    706:      Lisp_Object sym, value;
                    707: {
                    708:   register Lisp_Object valcontents, current_alist_element, alist_element_buffer;
                    709: 
                    710:   CHECK_SYMBOL (sym, 0);
                    711:   valcontents = XSYMBOL (sym)->value;
                    712: 
                    713:   /* Handle variables like case-fold-search that have special slots
                    714:      in the buffer.  Make them work apparently like Lisp_Buffer_Local_Value
                    715:      variables.  */
                    716:   if (XTYPE (valcontents) == Lisp_Buffer_Objfwd)
                    717:     {
                    718:       register int idx = XUINT (valcontents);
                    719: #ifndef RTPC_REGISTER_BUG
                    720:       register struct buffer *b;
                    721: #else
                    722:       struct buffer *b;
                    723: #endif
                    724:       register int mask = *(int *) (idx + (char *) &buffer_local_flags);
                    725: 
                    726:       if (mask > 0)
                    727:        {
                    728:          *(Lisp_Object *)(idx + (char *) &buffer_defaults) = value;
                    729:          for (b = all_buffers; b; b = b->next)
                    730:            if (!(b->local_var_flags & mask))
                    731:              *(Lisp_Object *)(idx + (char *) b) = value;
                    732:        }
                    733:       return value;
                    734:     }
                    735: 
                    736:   if (XTYPE (valcontents) != Lisp_Buffer_Local_Value &&
                    737:       XTYPE (valcontents) != Lisp_Some_Buffer_Local_Value)
                    738:     return Fset (sym, value);
                    739: 
                    740:   /* Store new value into the DEFAULT-VALUE slot */
                    741:   XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->cdr = value;
                    742: 
                    743:   /* If that slot is current, we must set the REALVALUE slot too */
                    744:   current_alist_element = XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->car;
                    745:   alist_element_buffer = Fcar (current_alist_element);
                    746:   if (EQ (alist_element_buffer, current_alist_element))
                    747:     store_symval_forwarding (sym, XCONS (valcontents)->car, value);
                    748: 
                    749:   return value;
                    750: }
                    751: 
                    752: DEFUN ("setq-default", Fsetq_default, Ssetq_default, 2, UNEVALLED, 0,
                    753:   "Set SYMBOL's default value to VAL.  VAL is evaluated; SYMBOL is not.\n\
                    754: The default value is seen in buffers that do not have their own values\n\
                    755: for this variable.")
                    756:   (args)
                    757:      Lisp_Object args;
                    758: {
                    759:   register Lisp_Object val;
                    760:   struct gcpro gcpro1;
                    761: 
                    762:   GCPRO1 (args);
                    763:   val = Feval (Fcar (Fcdr (args)));
                    764:   UNGCPRO;
                    765:   return Fset_default (Fcar (args), val);
                    766: }
                    767: 
                    768: DEFUN ("make-variable-buffer-local", Fmake_variable_buffer_local, Smake_variable_buffer_local,
                    769:   1, 1, "vMake Variable Buffer Local: ",
                    770:   "Make VARIABLE have a separate value for each buffer.\n\
                    771: At any time, the value for the current buffer is in effect.\n\
                    772: There is also a default value which is seen in any buffer which has not yet\n\
                    773: set its own value.\n\
                    774: The function `default-value' gets the default value and `set-default' sets it.\n\
                    775: Using `set' or `setq' to set the variable causes it to have a separate value\n\
                    776: for the current buffer if it was previously using the default value.")
                    777:   (sym)
                    778:      register Lisp_Object sym;
                    779: {
                    780:   register Lisp_Object tem, valcontents;
                    781: 
                    782:   CHECK_SYMBOL (sym, 0);
                    783: 
                    784:   if (EQ (sym, Qnil) || EQ (sym, Qt))
                    785:     error ("Symbol %s may not be buffer-local", XSYMBOL (sym)->name->data);
                    786: 
                    787:   valcontents = XSYMBOL (sym)->value;
                    788:   if ((XTYPE (valcontents) == Lisp_Buffer_Local_Value) ||
                    789:       (XTYPE (valcontents) == Lisp_Buffer_Objfwd))
                    790:     return sym;
                    791:   if (XTYPE (valcontents) == Lisp_Some_Buffer_Local_Value)
                    792:     {
                    793:       XSETTYPE (XSYMBOL (sym)->value, Lisp_Buffer_Local_Value);
                    794:       return sym;
                    795:     }
                    796:   if (EQ (valcontents, Qunbound))
                    797:     XSYMBOL (sym)->value = Qnil;
                    798:   tem = Fcons (Qnil, Fsymbol_value (sym));
                    799:   XCONS (tem)->car = tem;
                    800:   XSYMBOL (sym)->value = Fcons (XSYMBOL (sym)->value, Fcons (Fcurrent_buffer (), tem));
                    801:   XSETTYPE (XSYMBOL (sym)->value, Lisp_Buffer_Local_Value);
                    802:   return sym;
                    803: }
                    804: 
                    805: DEFUN ("make-local-variable", Fmake_local_variable, Smake_local_variable,
                    806:   1, 1, "vMake Local Variable: ",
                    807:   "Make VARIABLE have a separate value in the current buffer.\n\
                    808: Other buffers will continue to share a common default value.\n\
                    809: See also `make-variable-buffer-local'.")
                    810:   (sym)
                    811:      register Lisp_Object sym;
                    812: {
                    813:   register Lisp_Object tem, valcontents;
                    814: 
                    815:   CHECK_SYMBOL (sym, 0);
                    816: 
                    817:   if (EQ (sym, Qnil) || EQ (sym, Qt))
                    818:     error ("Symbol %s may not be buffer-local", XSYMBOL (sym)->name->data);
                    819: 
                    820:   valcontents = XSYMBOL (sym)->value;
                    821:   if ((XTYPE (valcontents) == Lisp_Buffer_Local_Value) ||
                    822:       (XTYPE (valcontents) == Lisp_Buffer_Objfwd))
                    823:     return sym;
                    824:   /* Make sure sym is set up to hold per-buffer values */
                    825:   if (XTYPE (valcontents) != Lisp_Some_Buffer_Local_Value)
                    826:     {
                    827:       if (EQ (valcontents, Qunbound))
                    828:        XSYMBOL (sym)->value = Qnil;
                    829:       tem = Fcons (Qnil, Fsymbol_value (sym));
                    830:       XCONS (tem)->car = tem;
                    831:       XSYMBOL (sym)->value = Fcons (XSYMBOL (sym)->value, Fcons (Qnil, tem));
                    832:       XSETTYPE (XSYMBOL (sym)->value, Lisp_Some_Buffer_Local_Value);
                    833:     }
                    834:   /* Make sure this buffer has its own value of sym */
                    835:   tem = Fassq (sym, bf_cur->local_var_alist);
                    836:   if (NULL (tem))
                    837:     {
                    838:       bf_cur->local_var_alist
                    839:         = Fcons (Fcons (sym, XCONS (XCONS (XCONS (XSYMBOL (sym)->value)->cdr)->cdr)->cdr),
                    840:                 bf_cur->local_var_alist);
                    841: 
                    842:       /* Make sure symbol does not think it is set up for this buffer;
                    843:         force it to look once again for this buffer's value */
                    844:       {
                    845:        /* This local variable avoids "expression to complex" on IBM RT.  */
                    846:        Lisp_Object xs;
                    847:     
                    848:        xs = XSYMBOL (sym)->value;
                    849:        if (bf_cur == XBUFFER (XCONS (XCONS (xs)->cdr)->car))
                    850:          XCONS (XCONS (XSYMBOL (sym)->value)->cdr)->car = Qnil; 
                    851:       }
                    852:     }
                    853:   return sym;
                    854: }
                    855: 
                    856: DEFUN ("kill-local-variable", Fkill_local_variable, Skill_local_variable,
                    857:   1, 1, "vKill Local Variable: ",
                    858:   "Make VARIABLE no longer have a separate value in the current buffer.\n\
                    859: From now on the default value will apply in this buffer.")
                    860:   (sym)
                    861:      register Lisp_Object sym;
                    862: {
                    863:   register Lisp_Object tem, valcontents;
                    864: 
                    865:   CHECK_SYMBOL (sym, 0);
                    866: 
                    867:   valcontents = XSYMBOL (sym)->value;
                    868: 
                    869:   if (XTYPE (valcontents) == Lisp_Buffer_Objfwd)
                    870:     {
                    871:       register int idx = XUINT (valcontents);
                    872:       register int mask = *(int *) (idx + (char *) &buffer_local_flags);
                    873: 
                    874:       if (mask > 0)
                    875:        {
                    876:          *(Lisp_Object *)(idx + (char *) bf_cur)
                    877:            = *(Lisp_Object *)(idx + (char *) &buffer_defaults);
                    878:          bf_cur->local_var_flags &= ~mask;
                    879:        }
                    880:       return sym;
                    881:     }
                    882: 
                    883:   if (XTYPE (valcontents) != Lisp_Buffer_Local_Value &&
                    884:       XTYPE (valcontents) != Lisp_Some_Buffer_Local_Value)
                    885:     return sym;
                    886: 
                    887:   /* Get rid of this buffer's alist element, if any */
                    888: 
                    889:   tem = Fassq (sym, bf_cur->local_var_alist);
                    890:   if (!NULL (tem))
                    891:     bf_cur->local_var_alist = Fdelq (tem, bf_cur->local_var_alist);
                    892: 
                    893:   /* Make sure symbol does not think it is set up for this buffer;
                    894:      force it to look once again for this buffer's value */
                    895:   {
                    896:     Lisp_Object sv;
                    897:     sv = XSYMBOL (sym)->value;
                    898:     if (bf_cur == XBUFFER (XCONS (XCONS (sv)->cdr)->car))
                    899:       XCONS (XCONS (sv)->cdr)->car = Qnil;
                    900:   }
                    901: 
                    902:   return sym;
                    903: }
                    904: 
                    905: /* Extract and set vector and string elements */
                    906: 
                    907: DEFUN ("aref", Faref, Saref, 2, 2, 0,
                    908:   "Return the element of ARRAY at index INDEX.\n\
                    909: ARRAY may be a vector or a string.  INDEX starts at 0.")
                    910:   (vector, idx)
                    911:      register Lisp_Object vector;
                    912:      Lisp_Object idx;
                    913: {
                    914:   register int idxval;
                    915: 
                    916:   CHECK_NUMBER (idx, 1);
                    917:   idxval = XINT (idx);
                    918:   if (XTYPE (vector) != Lisp_Vector && XTYPE (vector) != Lisp_String)
                    919:     vector = wrong_type_argument (Qarrayp, vector);
                    920:   if (idxval < 0 || idxval >= XVECTOR (vector)->size)
                    921:     args_out_of_range (vector, idx);
                    922:   if (XTYPE (vector) == Lisp_Vector)
                    923:     return XVECTOR (vector)->contents[idxval];
                    924:   else
                    925:     {
                    926:       Lisp_Object val;
                    927:       XFASTINT (val) = (unsigned char) XSTRING (vector)->data[idxval];
                    928:       return val;
                    929:     }
                    930: }
                    931: 
                    932: DEFUN ("aset", Faset, Saset, 3, 3, 0,
                    933:   "Store into the element of ARRAY at index INDEX the value NEWVAL.\n\
                    934: ARRAY may be a vector or a string.  INDEX starts at 0.")
                    935:   (vector, idx, newelt)
                    936:      register Lisp_Object vector;
                    937:      Lisp_Object idx, newelt;
                    938: {
                    939:   register int idxval;
                    940: 
                    941:   CHECK_NUMBER (idx, 1);
                    942:   idxval = XINT (idx);
                    943:   if (XTYPE (vector) != Lisp_Vector && XTYPE (vector) != Lisp_String)
                    944:     vector = wrong_type_argument (Qarrayp, vector);
                    945:   if (idxval < 0 || idxval >= XVECTOR (vector)->size)
                    946:     args_out_of_range (vector, idx);
                    947:   CHECK_IMPURE (vector);
                    948: 
                    949:   if (XTYPE (vector) == Lisp_Vector)
                    950:     XVECTOR (vector)->contents[idxval] = newelt;
                    951:   else
                    952:     XSTRING (vector)->data[idxval] = XINT (newelt);
                    953: 
                    954:   return newelt;
                    955: }
                    956: 
                    957: Lisp_Object
                    958: Farray_length (vector)
                    959:      register Lisp_Object vector;
                    960: {
                    961:   register Lisp_Object size;
                    962:   if (XTYPE (vector) != Lisp_Vector && XTYPE (vector) != Lisp_String)
                    963:     vector = wrong_type_argument (Qarrayp, vector);
                    964:   XFASTINT (size) = XVECTOR (vector)->size;
                    965:   return size;
                    966: }
                    967: 
                    968: /* Arithmetic functions */
                    969: 
                    970: DEFUN ("=", Feqlsign, Seqlsign, 2, 2, 0,
                    971:   "T if two args, both numbers, are equal.")
                    972:   (num1, num2)
                    973:      register Lisp_Object num1, num2;
                    974: {
                    975:   CHECK_NUMBER_COERCE_MARKER (num1, 0);
                    976:   CHECK_NUMBER_COERCE_MARKER (num2, 0);
                    977: 
                    978:   if (XINT (num1) == XINT (num2))
                    979:     return Qt;
                    980:   return Qnil;
                    981: }
                    982: 
                    983: DEFUN ("<", Flss, Slss, 2, 2, 0,
                    984:   "T if first arg is less than second arg.  Both must be numbers.")
                    985:   (num1, num2)
                    986:      register Lisp_Object num1, num2;
                    987: {
                    988:   CHECK_NUMBER_COERCE_MARKER (num1, 0);
                    989:   CHECK_NUMBER_COERCE_MARKER (num2, 0);
                    990: 
                    991:   if (XINT (num1) < XINT (num2))
                    992:     return Qt;
                    993:   return Qnil;
                    994: }
                    995: 
                    996: DEFUN (">", Fgtr, Sgtr, 2, 2, 0,
                    997:   "T if first arg is greater than second arg.  Both must be numbers.")
                    998:   (num1, num2)
                    999:      register Lisp_Object num1, num2;
                   1000: {
                   1001:   CHECK_NUMBER_COERCE_MARKER (num1, 0);
                   1002:   CHECK_NUMBER_COERCE_MARKER (num2, 0);
                   1003: 
                   1004:   if (XINT (num1) > XINT (num2))
                   1005:     return Qt;
                   1006:   return Qnil;
                   1007: }
                   1008: 
                   1009: DEFUN ("<=", Fleq, Sleq, 2, 2, 0,
                   1010:   "T if first arg is less than or equal to second arg.  Both must be numbers.")
                   1011:   (num1, num2)
                   1012:      register Lisp_Object num1, num2;
                   1013: {
                   1014:   CHECK_NUMBER_COERCE_MARKER (num1, 0);
                   1015:   CHECK_NUMBER_COERCE_MARKER (num2, 0);
                   1016: 
                   1017:   if (XINT (num1) <= XINT (num2))
                   1018:     return Qt;
                   1019:   return Qnil;
                   1020: }
                   1021: 
                   1022: DEFUN (">=", Fgeq, Sgeq, 2, 2, 0,
                   1023:   "T if first arg is greater than or equal to second arg.  Both must be numbers.")
                   1024:   (num1, num2)
                   1025:      register Lisp_Object num1, num2;
                   1026: {
                   1027:   CHECK_NUMBER_COERCE_MARKER (num1, 0);
                   1028:   CHECK_NUMBER_COERCE_MARKER (num2, 0);
                   1029: 
                   1030:   if (XINT (num1) >= XINT (num2))
                   1031:     return Qt;
                   1032:   return Qnil;
                   1033: }
                   1034: 
                   1035: DEFUN ("/=", Fneq, Sneq, 2, 2, 0,
                   1036:   "T if first arg is not equal to second arg.  Both must be numbers.")
                   1037:   (num1, num2)
                   1038:      register Lisp_Object num1, num2;
                   1039: {
                   1040:   CHECK_NUMBER_COERCE_MARKER (num1, 0);
                   1041:   CHECK_NUMBER_COERCE_MARKER (num2, 0);
                   1042: 
                   1043:   if (XINT (num1) != XINT (num2))
                   1044:     return Qt;
                   1045:   return Qnil;
                   1046: }
                   1047: 
                   1048: DEFUN ("zerop", Fzerop, Szerop, 1, 1, 0, "T if NUMBER is zero.")
                   1049:   (num)
                   1050:      register Lisp_Object num;
                   1051: {
                   1052:   CHECK_NUMBER (num, 0);
                   1053: 
                   1054:   if (!XINT (num))
                   1055:     return Qt;
                   1056:   return Qnil;
                   1057: }
                   1058: 
                   1059: DEFUN ("int-to-string", Fint_to_string, Sint_to_string, 1, 1, 0,
                   1060:   "Convert INT to a string by printing it in decimal, with minus sign if negative.")
                   1061:   (num)
                   1062:      Lisp_Object num;
                   1063: {
                   1064:   char buffer[20];
                   1065: 
                   1066:   CHECK_NUMBER (num, 0);
                   1067:   sprintf (buffer, "%d", XINT (num));
                   1068:   return build_string (buffer);
                   1069: }
                   1070: 
                   1071: DEFUN ("string-to-int", Fstring_to_int, Sstring_to_int, 1, 1, 0,
                   1072:   "Convert STRING to an integer by parsing it as a decimal number.\n\
                   1073: Optional second arg FLAG non-nil means also convert \"yes\" to 1, \"no\" to 0.")
                   1074:   (str, flag)
                   1075:      register Lisp_Object str, flag;
                   1076: {
                   1077:   CHECK_STRING (str, 0);
                   1078:   if (!NULL (flag) && !strcmp (XSTRING (str)->data, "yes"))
                   1079:     return make_number (1);
                   1080:   if (!NULL (flag) && !strcmp (XSTRING (str)->data, "no"))
                   1081:     return make_number (0);
                   1082:   return make_number (atoi (XSTRING (str)->data));
                   1083: }
                   1084:   
                   1085: enum arithop
                   1086:   { Aadd, Asub, Amult, Adiv, Alogand, Alogior, Alogxor, Amax, Amin };
                   1087: 
                   1088: Lisp_Object
                   1089: arith_driver
                   1090:   (code, nargs, args)
                   1091:      enum arithop code;
                   1092:      int nargs;
                   1093:      register Lisp_Object *args;
                   1094: {
                   1095:   register Lisp_Object val;
                   1096:   register int argnum;
                   1097:   register int accum;
                   1098:   register int next;
                   1099: 
                   1100: #ifdef SWITCH_ENUM_BUG
                   1101:   switch ((int) code)
                   1102: #else
                   1103:   switch (code)
                   1104: #endif
                   1105:     {
                   1106:     case Alogior:
                   1107:     case Alogxor:
                   1108:     case Aadd:
                   1109:     case Asub:
                   1110:       accum = 0; break;
                   1111:     case Amult:
                   1112:       accum = 1; break;
                   1113:     case Alogand:
                   1114:       accum = -1; break;
                   1115:     }
                   1116: 
                   1117:   for (argnum = 0; argnum < nargs; argnum++)
                   1118:     {
                   1119:       val = args[argnum];    /* using args[argnum] as argument to CHECK_NUMBER_... */
                   1120:       CHECK_NUMBER_COERCE_MARKER (val, argnum);
                   1121:       args[argnum] = val;    /* runs into a compiler bug. */
                   1122:       next = XINT (args[argnum]);
                   1123: #ifdef SWITCH_ENUM_BUG
                   1124:       switch ((int) code)
                   1125: #else
                   1126:       switch (code)
                   1127: #endif
                   1128:        {
                   1129:        case Aadd: accum += next; break;
                   1130:        case Asub:
                   1131:          if (!argnum && nargs != 1)
                   1132:            next = - next;
                   1133:          accum -= next;
                   1134:          break;
                   1135:        case Amult: accum *= next; break;
                   1136:        case Adiv:
                   1137:          if (!argnum) accum = next;
                   1138:          else accum /= next;
                   1139:          break;
                   1140:        case Alogand: accum &= next; break;
                   1141:        case Alogior: accum |= next; break;
                   1142:        case Alogxor: accum ^= next; break;
                   1143:        case Amax: if (!argnum || next > accum) accum = next; break;
                   1144:        case Amin: if (!argnum || next < accum) accum = next; break;
                   1145:        }
                   1146:     }
                   1147: 
                   1148:   XSET (val, Lisp_Int, accum);
                   1149:   return val;
                   1150: }
                   1151: 
                   1152: DEFUN ("+", Fplus, Splus, 0, MANY, 0,
                   1153:   "Return sum of any number of numbers.")
                   1154:   (nargs, args)
                   1155:      int nargs;
                   1156:      Lisp_Object *args;
                   1157: {
                   1158:   return arith_driver (Aadd, nargs, args);
                   1159: }
                   1160: 
                   1161: DEFUN ("-", Fminus, Sminus, 0, MANY, 0,
                   1162:   "Negate number or subtract numbers.\n\
                   1163: With one arg, negates it.  With more than one arg,\n\
                   1164: subtracts all but the first from the first.")
                   1165:   (nargs, args)
                   1166:      int nargs;
                   1167:      Lisp_Object *args;
                   1168: {
                   1169:   return arith_driver (Asub, nargs, args);
                   1170: }
                   1171: 
                   1172: DEFUN ("*", Ftimes, Stimes, 0, MANY, 0,
                   1173:   "Returns product of any number of numbers.")
                   1174:   (nargs, args)
                   1175:      int nargs;
                   1176:      Lisp_Object *args;
                   1177: {
                   1178:   return arith_driver (Amult, nargs, args);
                   1179: }
                   1180: 
                   1181: DEFUN ("/", Fquo, Squo, 2, MANY, 0,
                   1182:   "Returns first argument divided by rest of arguments.")
                   1183:   (nargs, args)
                   1184:      int nargs;
                   1185:      Lisp_Object *args;
                   1186: {
                   1187:   return arith_driver (Adiv, nargs, args);
                   1188: }
                   1189: 
                   1190: DEFUN ("%", Frem, Srem, 2, 2, 0,
                   1191:   "Returns remainder of first arg divided by second.")
                   1192:   (num1, num2)
                   1193:      register Lisp_Object num1, num2;
                   1194: {
                   1195:   Lisp_Object val;
                   1196: 
                   1197:   CHECK_NUMBER (num1, 0);
                   1198:   CHECK_NUMBER (num2, 1);
                   1199: 
                   1200:   XSET (val, Lisp_Int, XINT (num1) % XINT (num2));
                   1201:   return val;
                   1202: }
                   1203: 
                   1204: DEFUN ("max", Fmax, Smax, 1, MANY, 0,
                   1205:   "Return largest of all the arguments (which must be numbers.)")
                   1206:   (nargs, args)
                   1207:      int nargs;
                   1208:      Lisp_Object *args;
                   1209: {
                   1210:   return arith_driver (Amax, nargs, args);
                   1211: }
                   1212: 
                   1213: DEFUN ("min", Fmin, Smin, 1, MANY, 0,
                   1214:   "Return smallest of all the arguments (which must be numbers.)")
                   1215:   (nargs, args)
                   1216:      int nargs;
                   1217:      Lisp_Object *args;
                   1218: {
                   1219:   return arith_driver (Amin, nargs, args);
                   1220: }
                   1221: 
                   1222: DEFUN ("logand", Flogand, Slogand, 0, MANY, 0,
                   1223:   "Return bitwise and of all the arguments (numbers).")
                   1224:   (nargs, args)
                   1225:      int nargs;
                   1226:      Lisp_Object *args;
                   1227: {
                   1228:   return arith_driver (Alogand, nargs, args);
                   1229: }
                   1230: 
                   1231: DEFUN ("logior", Flogior, Slogior, 0, MANY, 0,
                   1232:   "Return bitwise or of all the arguments (numbers).")
                   1233:   (nargs, args)
                   1234:      int nargs;
                   1235:      Lisp_Object *args;
                   1236: {
                   1237:   return arith_driver (Alogior, nargs, args);
                   1238: }
                   1239: 
                   1240: DEFUN ("logxor", Flogxor, Slogxor, 0, MANY, 0,
                   1241:   "Return bitwise exclusive-or of all the arguments (numbers).")
                   1242:   (nargs, args)
                   1243:      int nargs;
                   1244:      Lisp_Object *args;
                   1245: {
                   1246:   return arith_driver (Alogxor, nargs, args);
                   1247: }
                   1248: 
                   1249: DEFUN ("ash", Fash, Sash, 2, 2, 0,
                   1250:   "Return VALUE with its bits shifted left by COUNT.\n\
                   1251: If COUNT is negative, shifting is actually to the right.\n\
                   1252: In this case, the sign bit is duplicated.")
                   1253:   (num1, num2)
                   1254:      register Lisp_Object num1, num2;
                   1255: {
                   1256:   register Lisp_Object val;
                   1257: 
                   1258:   CHECK_NUMBER (num1, 0);
                   1259:   CHECK_NUMBER (num2, 1);
                   1260: 
                   1261:   if (XINT (num2) > 0)
                   1262:     XSET (val, Lisp_Int, XINT (num1) << XFASTINT (num2));
                   1263:   else
                   1264:     XSET (val, Lisp_Int, XINT (num1) >> -XINT (num2));
                   1265:   return val;
                   1266: }
                   1267: 
                   1268: DEFUN ("lsh", Flsh, Slsh, 2, 2, 0,
                   1269:   "Return VALUE with its bits shifted left by COUNT.\n\
                   1270: If COUNT is negative, shifting is actually to the right.\n\
                   1271: In this case,  zeros are shifted in on the left.")
                   1272:   (num1, num2)
                   1273:      register Lisp_Object num1, num2;
                   1274: {
                   1275:   register Lisp_Object val;
                   1276: 
                   1277:   CHECK_NUMBER (num1, 0);
                   1278:   CHECK_NUMBER (num2, 1);
                   1279: 
                   1280:   if (XINT (num2) > 0)
                   1281:     XSET (val, Lisp_Int, (unsigned) XFASTINT (num1) << XFASTINT (num2));
                   1282:   else
                   1283:     XSET (val, Lisp_Int, (unsigned) XFASTINT (num1) >> -XINT (num2));
                   1284:   return val;
                   1285: }
                   1286: 
                   1287: DEFUN ("1+", Fadd1, Sadd1, 1, 1, 0,
                   1288:   "Return NUMBER plus one.")
                   1289:   (num)
                   1290:      register Lisp_Object num;
                   1291: {
                   1292:   CHECK_NUMBER_COERCE_MARKER (num, 0);
                   1293:   XSETINT (num, XFASTINT (num) + 1);
                   1294:   return num;
                   1295: }
                   1296: 
                   1297: DEFUN ("1-", Fsub1, Ssub1, 1, 1, 0,
                   1298:   "Return NUMBER minus one.")
                   1299:   (num)
                   1300:      register Lisp_Object num;
                   1301: {
                   1302:   CHECK_NUMBER_COERCE_MARKER (num, 0);
                   1303:   XSETINT (num, XFASTINT (num) - 1);
                   1304:   return num;
                   1305: }
                   1306: 
                   1307: DEFUN ("lognot", Flognot, Slognot, 1, 1, 0,
                   1308:   "Return the bitwise complement of ARG.")
                   1309:   (num)
                   1310:      register Lisp_Object num;
                   1311: {
                   1312:   CHECK_NUMBER (num, 0);
                   1313:   XSETINT (num, ~XFASTINT (num));
                   1314:   return num;
                   1315: }
                   1316: 
                   1317: void
                   1318: syms_of_data ()
                   1319: {
                   1320:   Qquote = intern ("quote");
                   1321:   Qlambda = intern ("lambda");
                   1322:   Qsubr = intern ("subr");
                   1323:   Qerror_conditions = intern ("error-conditions");
                   1324:   Qerror_message = intern ("error-message");
                   1325:   Qtop_level = intern ("top-level");
                   1326: 
                   1327:   Qerror = intern ("error");
                   1328:   Qquit = intern ("quit");
                   1329:   Qwrong_type_argument = intern ("wrong-type-argument");
                   1330:   Qargs_out_of_range = intern ("args-out-of-range");
                   1331:   Qvoid_function = intern ("void-function");
                   1332:   Qvoid_variable = intern ("void-variable");
                   1333:   Qsetting_constant = intern ("setting-constant");
                   1334:   Qinvalid_read_syntax = intern ("invalid-read-syntax");
                   1335: 
                   1336:   Qinvalid_function = intern ("invalid-function");
                   1337:   Qwrong_number_of_arguments = intern ("wrong-number-of-arguments");
                   1338:   Qno_catch = intern ("no-catch");
                   1339:   Qend_of_file = intern ("end-of-file");
                   1340:   Qarith_error = intern ("arith-error");
                   1341:   Qbeginning_of_buffer = intern ("beginning-of-buffer");
                   1342:   Qend_of_buffer = intern ("end-of-buffer");
                   1343:   Qbuffer_read_only = intern ("buffer-read-only");
                   1344: 
                   1345:   Qlistp = intern ("listp");
                   1346:   Qconsp = intern ("consp");
                   1347:   Qsymbolp = intern ("symbolp");
                   1348:   Qintegerp = intern ("integerp");
                   1349:   Qnatnump = intern ("natnump");
                   1350:   Qstringp = intern ("stringp");
                   1351:   Qarrayp = intern ("arrayp");
                   1352:   Qsequencep = intern ("sequencep");
                   1353:   Qbufferp = intern ("bufferp");
                   1354:   Qvectorp = intern ("vectorp");
                   1355:   Qchar_or_string_p = intern ("char-or-string-p");
                   1356:   Qmarkerp = intern ("markerp");
                   1357:   Qinteger_or_marker_p = intern ("integer-or-marker-p");
                   1358:   Qboundp = intern ("boundp");
                   1359:   Qfboundp = intern ("fboundp");
                   1360: 
                   1361:   Qcdr = intern ("cdr");
                   1362: 
                   1363:   /* ERROR is used as a signaler for random errors for which nothing else is right */
                   1364: 
                   1365:   Fput (Qerror, Qerror_conditions,
                   1366:        Fcons (Qerror, Qnil));
                   1367:   Fput (Qerror, Qerror_message,
                   1368:        build_string ("error"));
                   1369: 
                   1370:   Fput (Qquit, Qerror_conditions,
                   1371:        Fcons (Qquit, Qnil));
                   1372:   Fput (Qquit, Qerror_message,
                   1373:        build_string ("Quit"));
                   1374: 
                   1375:   Fput (Qwrong_type_argument, Qerror_conditions,
                   1376:        Fcons (Qwrong_type_argument, Fcons (Qerror, Qnil)));
                   1377:   Fput (Qwrong_type_argument, Qerror_message,
                   1378:        build_string ("Wrong type argument"));
                   1379: 
                   1380:   Fput (Qargs_out_of_range, Qerror_conditions,
                   1381:        Fcons (Qargs_out_of_range, Fcons (Qerror, Qnil)));
                   1382:   Fput (Qargs_out_of_range, Qerror_message,
                   1383:        build_string ("Args out of range"));
                   1384: 
                   1385:   Fput (Qvoid_function, Qerror_conditions,
                   1386:        Fcons (Qvoid_function, Fcons (Qerror, Qnil)));
                   1387:   Fput (Qvoid_function, Qerror_message,
                   1388:        build_string ("Symbol's function definition is void"));
                   1389: 
                   1390:   Fput (Qvoid_variable, Qerror_conditions,
                   1391:        Fcons (Qvoid_variable, Fcons (Qerror, Qnil)));
                   1392:   Fput (Qvoid_variable, Qerror_message,
                   1393:        build_string ("Symbol's value as variable is void"));
                   1394: 
                   1395:   Fput (Qsetting_constant, Qerror_conditions,
                   1396:        Fcons (Qsetting_constant, Fcons (Qerror, Qnil)));
                   1397:   Fput (Qsetting_constant, Qerror_message,
                   1398:        build_string ("Attempt to set a constant symbol"));
                   1399: 
                   1400:   Fput (Qinvalid_read_syntax, Qerror_conditions,
                   1401:        Fcons (Qinvalid_read_syntax, Fcons (Qerror, Qnil)));
                   1402:   Fput (Qinvalid_read_syntax, Qerror_message,
                   1403:        build_string ("Invalid read syntax"));
                   1404: 
                   1405:   Fput (Qinvalid_function, Qerror_conditions,
                   1406:        Fcons (Qinvalid_function, Fcons (Qerror, Qnil)));
                   1407:   Fput (Qinvalid_function, Qerror_message,
                   1408:        build_string ("Invalid function"));
                   1409: 
                   1410:   Fput (Qwrong_number_of_arguments, Qerror_conditions,
                   1411:        Fcons (Qwrong_number_of_arguments, Fcons (Qerror, Qnil)));
                   1412:   Fput (Qwrong_number_of_arguments, Qerror_message,
                   1413:        build_string ("Wrong number of arguments"));
                   1414: 
                   1415:   Fput (Qno_catch, Qerror_conditions,
                   1416:        Fcons (Qno_catch, Fcons (Qerror, Qnil)));
                   1417:   Fput (Qno_catch, Qerror_message,
                   1418:        build_string ("No catch for tag"));
                   1419: 
                   1420:   Fput (Qend_of_file, Qerror_conditions,
                   1421:        Fcons (Qend_of_file, Fcons (Qerror, Qnil)));
                   1422:   Fput (Qend_of_file, Qerror_message,
                   1423:        build_string ("End of file during parsing"));
                   1424: 
                   1425:   Fput (Qarith_error, Qerror_conditions,
                   1426:        Fcons (Qarith_error, Fcons (Qerror, Qnil)));
                   1427:   Fput (Qarith_error, Qerror_message,
                   1428:        build_string ("Arithmetic error"));
                   1429: 
                   1430:   Fput (Qbeginning_of_buffer, Qerror_conditions,
                   1431:        Fcons (Qbeginning_of_buffer, Fcons (Qerror, Qnil)));
                   1432:   Fput (Qbeginning_of_buffer, Qerror_message,
                   1433:        build_string ("Beginning of buffer"));
                   1434: 
                   1435:   Fput (Qend_of_buffer, Qerror_conditions,
                   1436:        Fcons (Qend_of_buffer, Fcons (Qerror, Qnil)));
                   1437:   Fput (Qend_of_buffer, Qerror_message,
                   1438:        build_string ("End of buffer"));
                   1439: 
                   1440:   Fput (Qbuffer_read_only, Qerror_conditions,
                   1441:        Fcons (Qbuffer_read_only, Fcons (Qerror, Qnil)));
                   1442:   Fput (Qbuffer_read_only, Qerror_message,
                   1443:        build_string ("Buffer is read-only"));
                   1444: 
                   1445:   staticpro (&Qnil);
                   1446:   staticpro (&Qt);
                   1447:   staticpro (&Qquote);
                   1448:   staticpro (&Qlambda);
                   1449:   staticpro (&Qsubr);
                   1450:   staticpro (&Qunbound);
                   1451:   staticpro (&Qerror_conditions);
                   1452:   staticpro (&Qerror_message);
                   1453:   staticpro (&Qtop_level);
                   1454: 
                   1455:   staticpro (&Qerror);
                   1456:   staticpro (&Qquit);
                   1457:   staticpro (&Qwrong_type_argument);
                   1458:   staticpro (&Qargs_out_of_range);
                   1459:   staticpro (&Qvoid_function);
                   1460:   staticpro (&Qvoid_variable);
                   1461:   staticpro (&Qsetting_constant);
                   1462:   staticpro (&Qinvalid_read_syntax);
                   1463:   staticpro (&Qwrong_number_of_arguments);
                   1464:   staticpro (&Qinvalid_function);
                   1465:   staticpro (&Qno_catch);
                   1466:   staticpro (&Qend_of_file);
                   1467:   staticpro (&Qarith_error);
                   1468:   staticpro (&Qbeginning_of_buffer);
                   1469:   staticpro (&Qend_of_buffer);
                   1470:   staticpro (&Qbuffer_read_only);
                   1471: 
                   1472:   staticpro (&Qlistp);
                   1473:   staticpro (&Qconsp);
                   1474:   staticpro (&Qsymbolp);
                   1475:   staticpro (&Qintegerp);
                   1476:   staticpro (&Qnatnump);
                   1477:   staticpro (&Qstringp);
                   1478:   staticpro (&Qarrayp);
                   1479:   staticpro (&Qsequencep);
                   1480:   staticpro (&Qbufferp);
                   1481:   staticpro (&Qvectorp);
                   1482:   staticpro (&Qchar_or_string_p);
                   1483:   staticpro (&Qmarkerp);
                   1484:   staticpro (&Qinteger_or_marker_p);
                   1485:   staticpro (&Qboundp);
                   1486:   staticpro (&Qfboundp);
                   1487:   staticpro (&Qcdr);
                   1488: 
                   1489:   defsubr (&Seq);
                   1490:   defsubr (&Snull);
                   1491:   defsubr (&Slistp);
                   1492:   defsubr (&Snlistp);
                   1493:   defsubr (&Sconsp);
                   1494:   defsubr (&Satom);
                   1495:   defsubr (&Sintegerp);
                   1496:   defsubr (&Snatnump);
                   1497:   defsubr (&Ssymbolp);
                   1498:   defsubr (&Sstringp);
                   1499:   defsubr (&Svectorp);
                   1500:   defsubr (&Sarrayp);
                   1501:   defsubr (&Ssequencep);
                   1502:   defsubr (&Sbufferp);
                   1503:   defsubr (&Smarkerp);
                   1504:   defsubr (&Sinteger_or_marker_p);
                   1505:   defsubr (&Ssubrp);
                   1506:   defsubr (&Schar_or_string_p);
                   1507:   defsubr (&Scar);
                   1508:   defsubr (&Scdr);
                   1509:   defsubr (&Scar_safe);
                   1510:   defsubr (&Scdr_safe);
                   1511:   defsubr (&Ssetcar);
                   1512:   defsubr (&Ssetcdr);
                   1513:   defsubr (&Ssymbol_function);
                   1514:   defsubr (&Ssymbol_plist);
                   1515:   defsubr (&Ssymbol_name);
                   1516:   defsubr (&Smakunbound);
                   1517:   defsubr (&Sfmakunbound);
                   1518:   defsubr (&Sboundp);
                   1519:   defsubr (&Sfboundp);
                   1520:   defsubr (&Sfset);
                   1521:   defsubr (&Ssetplist);
                   1522:   defsubr (&Ssymbol_value);
                   1523:   defsubr (&Sset);
                   1524:   defsubr (&Sdefault_value);
                   1525:   defsubr (&Sset_default);
                   1526:   defsubr (&Ssetq_default);
                   1527:   defsubr (&Smake_variable_buffer_local);
                   1528:   defsubr (&Smake_local_variable);
                   1529:   defsubr (&Skill_local_variable);
                   1530:   defsubr (&Saref);
                   1531:   defsubr (&Saset);
                   1532:   defsubr (&Sint_to_string);
                   1533:   defsubr (&Sstring_to_int);
                   1534:   defsubr (&Seqlsign);
                   1535:   defsubr (&Slss);
                   1536:   defsubr (&Sgtr);
                   1537:   defsubr (&Sleq);
                   1538:   defsubr (&Sgeq);
                   1539:   defsubr (&Sneq);
                   1540:   defsubr (&Szerop);
                   1541:   defsubr (&Splus);
                   1542:   defsubr (&Sminus);
                   1543:   defsubr (&Stimes);
                   1544:   defsubr (&Squo);
                   1545:   defsubr (&Srem);
                   1546:   defsubr (&Smax);
                   1547:   defsubr (&Smin);
                   1548:   defsubr (&Slogand);
                   1549:   defsubr (&Slogior);
                   1550:   defsubr (&Slogxor);
                   1551:   defsubr (&Slsh);
                   1552:   defsubr (&Sash);
                   1553:   defsubr (&Sadd1);
                   1554:   defsubr (&Ssub1);
                   1555:   defsubr (&Slognot);
                   1556: }
                   1557: 
                   1558: arith_error (signo)
                   1559:      int signo;
                   1560: {
                   1561: #ifdef USG
                   1562:   /* USG systems forget handlers when they are used;
                   1563:      must reestablish each time */
                   1564:   signal (signo, arith_error);
                   1565: #endif /* USG */
                   1566: #ifdef BSD4_1
                   1567:   sigrelse (SIGFPE);
                   1568: #else /* not BSD4_1 */
                   1569:   sigsetmask (0);
                   1570: #endif /* not BSD4_1 */
                   1571: 
                   1572:   Fsignal (Qarith_error, Qnil);
                   1573: }
                   1574: 
                   1575: init_data ()
                   1576: {
                   1577:   /* Don't do this if just dumping out.
                   1578:      We don't want to call `signal' in this case
                   1579:      so that we don't have trouble with dumping
                   1580:      signal-delivering routines in an inconsistent state.  */
                   1581: #ifndef CANNOT_DUMP
                   1582:   if (!initialized)
                   1583:     return;
                   1584: #endif /* CANNOT_DUMP */
                   1585:   signal (SIGFPE, arith_error);
                   1586: #ifdef uts
                   1587:   signal (SIGEMT, arith_error);
                   1588: #endif /* uts */
                   1589: }

unix.superglobalmegacorp.com

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