|
|
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.