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