(tags-loop-scan): Set default value to an error form.
[bpt/emacs.git] / src / data.c
1 /* Primitive operations on Lisp data types for GNU Emacs Lisp interpreter.
2 Copyright (C) 1985, 1986, 1988, 1992 Free Software Foundation, Inc.
3
4 This file is part of GNU Emacs.
5
6 GNU Emacs is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 1, or (at your option)
9 any later version.
10
11 GNU Emacs is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs; see the file COPYING. If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20
21 #include <signal.h>
22
23 #include "config.h"
24 #include "lisp.h"
25 #include "puresize.h"
26
27 #ifndef standalone
28 #include "buffer.h"
29 #endif
30
31 #include "syssignal.h"
32
33 #ifdef LISP_FLOAT_TYPE
34 #include <math.h>
35 #endif /* LISP_FLOAT_TYPE */
36
37 Lisp_Object Qnil, Qt, Qquote, Qlambda, Qsubr, Qunbound;
38 Lisp_Object Qerror_conditions, Qerror_message, Qtop_level;
39 Lisp_Object Qerror, Qquit, Qwrong_type_argument, Qargs_out_of_range;
40 Lisp_Object Qvoid_variable, Qvoid_function, Qcyclic_function_indirection;
41 Lisp_Object Qsetting_constant, Qinvalid_read_syntax;
42 Lisp_Object Qinvalid_function, Qwrong_number_of_arguments, Qno_catch;
43 Lisp_Object Qend_of_file, Qarith_error;
44 Lisp_Object Qbeginning_of_buffer, Qend_of_buffer, Qbuffer_read_only;
45 Lisp_Object Qintegerp, Qnatnump, Qsymbolp, Qlistp, Qconsp;
46 Lisp_Object Qstringp, Qarrayp, Qsequencep, Qbufferp;
47 Lisp_Object Qchar_or_string_p, Qmarkerp, Qinteger_or_marker_p, Qvectorp;
48 Lisp_Object Qbuffer_or_string_p;
49 Lisp_Object Qboundp, Qfboundp;
50 Lisp_Object Qcdr;
51
52 #ifdef LISP_FLOAT_TYPE
53 Lisp_Object Qfloatp;
54 Lisp_Object Qnumberp, Qnumber_or_marker_p;
55 #endif
56
57 static Lisp_Object swap_in_symval_forwarding ();
58
59 Lisp_Object
60 wrong_type_argument (predicate, value)
61 register Lisp_Object predicate, value;
62 {
63 register Lisp_Object tem;
64 do
65 {
66 if (!EQ (Vmocklisp_arguments, Qt))
67 {
68 if (XTYPE (value) == Lisp_String &&
69 (EQ (predicate, Qintegerp) || EQ (predicate, Qinteger_or_marker_p)))
70 return Fstring_to_int (value, Qt);
71 if (XTYPE (value) == Lisp_Int && EQ (predicate, Qstringp))
72 return Fint_to_string (value);
73 }
74 value = Fsignal (Qwrong_type_argument, Fcons (predicate, Fcons (value, Qnil)));
75 tem = call1 (predicate, value);
76 }
77 while (NILP (tem));
78 return value;
79 }
80
81 pure_write_error ()
82 {
83 error ("Attempt to modify read-only object");
84 }
85
86 void
87 args_out_of_range (a1, a2)
88 Lisp_Object a1, a2;
89 {
90 while (1)
91 Fsignal (Qargs_out_of_range, Fcons (a1, Fcons (a2, Qnil)));
92 }
93
94 void
95 args_out_of_range_3 (a1, a2, a3)
96 Lisp_Object a1, a2, a3;
97 {
98 while (1)
99 Fsignal (Qargs_out_of_range, Fcons (a1, Fcons (a2, Fcons (a3, Qnil))));
100 }
101
102 Lisp_Object
103 make_number (num)
104 int num;
105 {
106 register Lisp_Object val;
107 XSET (val, Lisp_Int, num);
108 return val;
109 }
110
111 /* On some machines, XINT needs a temporary location.
112 Here it is, in case it is needed. */
113
114 int sign_extend_temp;
115
116 /* On a few machines, XINT can only be done by calling this. */
117
118 int
119 sign_extend_lisp_int (num)
120 int num;
121 {
122 if (num & (1 << (VALBITS - 1)))
123 return num | ((-1) << VALBITS);
124 else
125 return num & ((1 << VALBITS) - 1);
126 }
127 \f
128 /* Data type predicates */
129
130 DEFUN ("eq", Feq, Seq, 2, 2, 0,
131 "T if the two args are the same Lisp object.")
132 (obj1, obj2)
133 Lisp_Object obj1, obj2;
134 {
135 if (EQ (obj1, obj2))
136 return Qt;
137 return Qnil;
138 }
139
140 DEFUN ("null", Fnull, Snull, 1, 1, 0, "T if OBJECT is nil.")
141 (obj)
142 Lisp_Object obj;
143 {
144 if (NILP (obj))
145 return Qt;
146 return Qnil;
147 }
148
149 DEFUN ("consp", Fconsp, Sconsp, 1, 1, 0, "T if OBJECT is a cons cell.")
150 (obj)
151 Lisp_Object obj;
152 {
153 if (XTYPE (obj) == Lisp_Cons)
154 return Qt;
155 return Qnil;
156 }
157
158 DEFUN ("atom", Fatom, Satom, 1, 1, 0, "T if OBJECT is not a cons cell. This includes nil.")
159 (obj)
160 Lisp_Object obj;
161 {
162 if (XTYPE (obj) == Lisp_Cons)
163 return Qnil;
164 return Qt;
165 }
166
167 DEFUN ("listp", Flistp, Slistp, 1, 1, 0, "T if OBJECT is a list. This includes nil.")
168 (obj)
169 Lisp_Object obj;
170 {
171 if (XTYPE (obj) == Lisp_Cons || NILP (obj))
172 return Qt;
173 return Qnil;
174 }
175
176 DEFUN ("nlistp", Fnlistp, Snlistp, 1, 1, 0, "T if OBJECT is not a list. Lists include nil.")
177 (obj)
178 Lisp_Object obj;
179 {
180 if (XTYPE (obj) == Lisp_Cons || NILP (obj))
181 return Qnil;
182 return Qt;
183 }
184 \f
185 DEFUN ("symbolp", Fsymbolp, Ssymbolp, 1, 1, 0, "T if OBJECT is a symbol.")
186 (obj)
187 Lisp_Object obj;
188 {
189 if (XTYPE (obj) == Lisp_Symbol)
190 return Qt;
191 return Qnil;
192 }
193
194 DEFUN ("vectorp", Fvectorp, Svectorp, 1, 1, 0, "T if OBJECT is a vector.")
195 (obj)
196 Lisp_Object obj;
197 {
198 if (XTYPE (obj) == Lisp_Vector)
199 return Qt;
200 return Qnil;
201 }
202
203 DEFUN ("stringp", Fstringp, Sstringp, 1, 1, 0, "T if OBJECT is a string.")
204 (obj)
205 Lisp_Object obj;
206 {
207 if (XTYPE (obj) == Lisp_String)
208 return Qt;
209 return Qnil;
210 }
211
212 DEFUN ("arrayp", Farrayp, Sarrayp, 1, 1, 0, "T if OBJECT is an array (string or vector).")
213 (obj)
214 Lisp_Object obj;
215 {
216 if (XTYPE (obj) == Lisp_Vector || XTYPE (obj) == Lisp_String)
217 return Qt;
218 return Qnil;
219 }
220
221 DEFUN ("sequencep", Fsequencep, Ssequencep, 1, 1, 0,
222 "T if OBJECT is a sequence (list or array).")
223 (obj)
224 register Lisp_Object obj;
225 {
226 if (CONSP (obj) || NILP (obj) ||
227 XTYPE (obj) == Lisp_Vector || XTYPE (obj) == Lisp_String)
228 return Qt;
229 return Qnil;
230 }
231
232 DEFUN ("bufferp", Fbufferp, Sbufferp, 1, 1, 0, "T if OBJECT is an editor buffer.")
233 (obj)
234 Lisp_Object obj;
235 {
236 if (XTYPE (obj) == Lisp_Buffer)
237 return Qt;
238 return Qnil;
239 }
240
241 DEFUN ("markerp", Fmarkerp, Smarkerp, 1, 1, 0, "T if OBJECT is a marker (editor pointer).")
242 (obj)
243 Lisp_Object obj;
244 {
245 if (XTYPE (obj) == Lisp_Marker)
246 return Qt;
247 return Qnil;
248 }
249
250 DEFUN ("subrp", Fsubrp, Ssubrp, 1, 1, 0, "T if OBJECT is a built-in function.")
251 (obj)
252 Lisp_Object obj;
253 {
254 if (XTYPE (obj) == Lisp_Subr)
255 return Qt;
256 return Qnil;
257 }
258
259 DEFUN ("compiled-function-p", Fcompiled_function_p, Scompiled_function_p,
260 1, 1, 0, "T if OBJECT is a compiled function object.")
261 (obj)
262 Lisp_Object obj;
263 {
264 if (XTYPE (obj) == Lisp_Compiled)
265 return Qt;
266 return Qnil;
267 }
268
269 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.")
270 (obj)
271 register Lisp_Object obj;
272 {
273 if (XTYPE (obj) == Lisp_Int || XTYPE (obj) == Lisp_String)
274 return Qt;
275 return Qnil;
276 }
277 \f
278 DEFUN ("integerp", Fintegerp, Sintegerp, 1, 1, 0, "T if OBJECT is a number.")
279 (obj)
280 Lisp_Object obj;
281 {
282 if (XTYPE (obj) == Lisp_Int)
283 return Qt;
284 return Qnil;
285 }
286
287 DEFUN ("integer-or-marker-p", Finteger_or_marker_p, Sinteger_or_marker_p, 1, 1, 0,
288 "T if OBJECT is an integer or a marker (editor pointer).")
289 (obj)
290 register Lisp_Object obj;
291 {
292 if (XTYPE (obj) == Lisp_Marker || XTYPE (obj) == Lisp_Int)
293 return Qt;
294 return Qnil;
295 }
296
297 DEFUN ("natnump", Fnatnump, Snatnump, 1, 1, 0, "T if OBJECT is a nonnegative number.")
298 (obj)
299 Lisp_Object obj;
300 {
301 if (XTYPE (obj) == Lisp_Int && XINT (obj) >= 0)
302 return Qt;
303 return Qnil;
304 }
305
306 DEFUN ("numberp", Fnumberp, Snumberp, 1, 1, 0,
307 "T if OBJECT is a number (floating point or integer).")
308 (obj)
309 Lisp_Object obj;
310 {
311 if (0
312 #ifdef LISP_FLOAT_TYPE
313 || XTYPE (obj) == Lisp_Float
314 #endif
315 || XTYPE (obj) == Lisp_Int)
316 return Qt;
317 return Qnil;
318 }
319
320 DEFUN ("number-or-marker-p", Fnumber_or_marker_p,
321 Snumber_or_marker_p, 1, 1, 0,
322 "T if OBJECT is a number or a marker.")
323 (obj)
324 Lisp_Object obj;
325 {
326 if (XTYPE (obj) == Lisp_Int
327 #ifdef LISP_FLOAT_TYPE
328 || XTYPE (obj) == Lisp_Float
329 #endif
330 || XTYPE (obj) == Lisp_Marker)
331 return Qt;
332 return Qnil;
333 }
334
335 #ifdef LISP_FLOAT_TYPE
336 DEFUN ("floatp", Ffloatp, Sfloatp, 1, 1, 0,
337 "T if OBJECT is a floating point number.")
338 (obj)
339 Lisp_Object obj;
340 {
341 if (XTYPE (obj) == Lisp_Float)
342 return Qt;
343 return Qnil;
344 }
345 #endif /* LISP_FLOAT_TYPE */
346 \f
347 /* Extract and set components of lists */
348
349 DEFUN ("car", Fcar, Scar, 1, 1, 0,
350 "Return the car of CONSCELL. If arg is nil, return nil.\n\
351 Error if arg is not nil and not a cons cell. See also `car-safe'.")
352 (list)
353 register Lisp_Object list;
354 {
355 while (1)
356 {
357 if (XTYPE (list) == Lisp_Cons)
358 return XCONS (list)->car;
359 else if (EQ (list, Qnil))
360 return Qnil;
361 else
362 list = wrong_type_argument (Qlistp, list);
363 }
364 }
365
366 DEFUN ("car-safe", Fcar_safe, Scar_safe, 1, 1, 0,
367 "Return the car of OBJECT if it is a cons cell, or else nil.")
368 (object)
369 Lisp_Object object;
370 {
371 if (XTYPE (object) == Lisp_Cons)
372 return XCONS (object)->car;
373 else
374 return Qnil;
375 }
376
377 DEFUN ("cdr", Fcdr, Scdr, 1, 1, 0,
378 "Return the cdr of CONSCELL. If arg is nil, return nil.\n\
379 Error if arg is not nil and not a cons cell. See also `cdr-safe'.")
380
381 (list)
382 register Lisp_Object list;
383 {
384 while (1)
385 {
386 if (XTYPE (list) == Lisp_Cons)
387 return XCONS (list)->cdr;
388 else if (EQ (list, Qnil))
389 return Qnil;
390 else
391 list = wrong_type_argument (Qlistp, list);
392 }
393 }
394
395 DEFUN ("cdr-safe", Fcdr_safe, Scdr_safe, 1, 1, 0,
396 "Return the cdr of OBJECT if it is a cons cell, or else nil.")
397 (object)
398 Lisp_Object object;
399 {
400 if (XTYPE (object) == Lisp_Cons)
401 return XCONS (object)->cdr;
402 else
403 return Qnil;
404 }
405
406 DEFUN ("setcar", Fsetcar, Ssetcar, 2, 2, 0,
407 "Set the car of CONSCELL to be NEWCAR. Returns NEWCAR.")
408 (cell, newcar)
409 register Lisp_Object cell, newcar;
410 {
411 if (XTYPE (cell) != Lisp_Cons)
412 cell = wrong_type_argument (Qconsp, cell);
413
414 CHECK_IMPURE (cell);
415 XCONS (cell)->car = newcar;
416 return newcar;
417 }
418
419 DEFUN ("setcdr", Fsetcdr, Ssetcdr, 2, 2, 0,
420 "Set the cdr of CONSCELL to be NEWCDR. Returns NEWCDR.")
421 (cell, newcdr)
422 register Lisp_Object cell, newcdr;
423 {
424 if (XTYPE (cell) != Lisp_Cons)
425 cell = wrong_type_argument (Qconsp, cell);
426
427 CHECK_IMPURE (cell);
428 XCONS (cell)->cdr = newcdr;
429 return newcdr;
430 }
431 \f
432 /* Extract and set components of symbols */
433
434 DEFUN ("boundp", Fboundp, Sboundp, 1, 1, 0, "T if SYMBOL's value is not void.")
435 (sym)
436 register Lisp_Object sym;
437 {
438 Lisp_Object valcontents;
439 CHECK_SYMBOL (sym, 0);
440
441 valcontents = XSYMBOL (sym)->value;
442
443 #ifdef SWITCH_ENUM_BUG
444 switch ((int) XTYPE (valcontents))
445 #else
446 switch (XTYPE (valcontents))
447 #endif
448 {
449 case Lisp_Buffer_Local_Value:
450 case Lisp_Some_Buffer_Local_Value:
451 valcontents = swap_in_symval_forwarding (sym, valcontents);
452 }
453
454 return (XTYPE (valcontents) == Lisp_Void || EQ (valcontents, Qunbound)
455 ? Qnil : Qt);
456 }
457
458 DEFUN ("fboundp", Ffboundp, Sfboundp, 1, 1, 0, "T if SYMBOL's function definition is not void.")
459 (sym)
460 register Lisp_Object sym;
461 {
462 CHECK_SYMBOL (sym, 0);
463 return (XTYPE (XSYMBOL (sym)->function) == Lisp_Void
464 || EQ (XSYMBOL (sym)->function, Qunbound))
465 ? Qnil : Qt;
466 }
467
468 DEFUN ("makunbound", Fmakunbound, Smakunbound, 1, 1, 0, "Make SYMBOL's value be void.")
469 (sym)
470 register Lisp_Object sym;
471 {
472 CHECK_SYMBOL (sym, 0);
473 if (NILP (sym) || EQ (sym, Qt))
474 return Fsignal (Qsetting_constant, Fcons (sym, Qnil));
475 Fset (sym, Qunbound);
476 return sym;
477 }
478
479 DEFUN ("fmakunbound", Ffmakunbound, Sfmakunbound, 1, 1, 0, "Make SYMBOL's function definition be void.")
480 (sym)
481 register Lisp_Object sym;
482 {
483 CHECK_SYMBOL (sym, 0);
484 XSYMBOL (sym)->function = Qunbound;
485 return sym;
486 }
487
488 DEFUN ("symbol-function", Fsymbol_function, Ssymbol_function, 1, 1, 0,
489 "Return SYMBOL's function definition. Error if that is void.")
490 (symbol)
491 register Lisp_Object symbol;
492 {
493 CHECK_SYMBOL (symbol, 0);
494 if (EQ (XSYMBOL (symbol)->function, Qunbound))
495 return Fsignal (Qvoid_function, Fcons (symbol, Qnil));
496 return XSYMBOL (symbol)->function;
497 }
498
499 DEFUN ("symbol-plist", Fsymbol_plist, Ssymbol_plist, 1, 1, 0, "Return SYMBOL's property list.")
500 (sym)
501 register Lisp_Object sym;
502 {
503 CHECK_SYMBOL (sym, 0);
504 return XSYMBOL (sym)->plist;
505 }
506
507 DEFUN ("symbol-name", Fsymbol_name, Ssymbol_name, 1, 1, 0, "Return SYMBOL's name, a string.")
508 (sym)
509 register Lisp_Object sym;
510 {
511 register Lisp_Object name;
512
513 CHECK_SYMBOL (sym, 0);
514 XSET (name, Lisp_String, XSYMBOL (sym)->name);
515 return name;
516 }
517
518 DEFUN ("fset", Ffset, Sfset, 2, 2, 0,
519 "Set SYMBOL's function definition to NEWVAL, and return NEWVAL.")
520 (sym, newdef)
521 register Lisp_Object sym, newdef;
522 {
523 CHECK_SYMBOL (sym, 0);
524 if (!NILP (Vautoload_queue) && !EQ (XSYMBOL (sym)->function, Qunbound))
525 Vautoload_queue = Fcons (Fcons (sym, XSYMBOL (sym)->function),
526 Vautoload_queue);
527 XSYMBOL (sym)->function = newdef;
528 return newdef;
529 }
530
531 DEFUN ("setplist", Fsetplist, Ssetplist, 2, 2, 0,
532 "Set SYMBOL's property list to NEWVAL, and return NEWVAL.")
533 (sym, newplist)
534 register Lisp_Object sym, newplist;
535 {
536 CHECK_SYMBOL (sym, 0);
537 XSYMBOL (sym)->plist = newplist;
538 return newplist;
539 }
540
541 \f
542 /* Getting and setting values of symbols */
543
544 /* Given the raw contents of a symbol value cell,
545 return the Lisp value of the symbol.
546 This does not handle buffer-local variables; use
547 swap_in_symval_forwarding for that. */
548
549 Lisp_Object
550 do_symval_forwarding (valcontents)
551 register Lisp_Object valcontents;
552 {
553 register Lisp_Object val;
554 #ifdef SWITCH_ENUM_BUG
555 switch ((int) XTYPE (valcontents))
556 #else
557 switch (XTYPE (valcontents))
558 #endif
559 {
560 case Lisp_Intfwd:
561 XSET (val, Lisp_Int, *XINTPTR (valcontents));
562 return val;
563
564 case Lisp_Boolfwd:
565 if (*XINTPTR (valcontents))
566 return Qt;
567 return Qnil;
568
569 case Lisp_Objfwd:
570 return *XOBJFWD (valcontents);
571
572 case Lisp_Buffer_Objfwd:
573 return *(Lisp_Object *)(XUINT (valcontents) + (char *)current_buffer);
574 }
575 return valcontents;
576 }
577
578 /* Store NEWVAL into SYM, where VALCONTENTS is found in the value cell
579 of SYM. If SYM is buffer-local, VALCONTENTS should be the
580 buffer-independent contents of the value cell: forwarded just one
581 step past the buffer-localness. */
582
583 void
584 store_symval_forwarding (sym, valcontents, newval)
585 Lisp_Object sym;
586 register Lisp_Object valcontents, newval;
587 {
588 #ifdef SWITCH_ENUM_BUG
589 switch ((int) XTYPE (valcontents))
590 #else
591 switch (XTYPE (valcontents))
592 #endif
593 {
594 case Lisp_Intfwd:
595 CHECK_NUMBER (newval, 1);
596 *XINTPTR (valcontents) = XINT (newval);
597 break;
598
599 case Lisp_Boolfwd:
600 *XINTPTR (valcontents) = NILP(newval) ? 0 : 1;
601 break;
602
603 case Lisp_Objfwd:
604 *XOBJFWD (valcontents) = newval;
605 break;
606
607 case Lisp_Buffer_Objfwd:
608 {
609 unsigned int offset = XUINT (valcontents);
610 Lisp_Object type =
611 *(Lisp_Object *)(offset + (char *)&buffer_local_types);
612
613 if (! NILP (type) && ! NILP (newval)
614 && XTYPE (newval) != XINT (type))
615 buffer_slot_type_mismatch (valcontents, newval);
616
617 *(Lisp_Object *)(XUINT (valcontents) + (char *)current_buffer)
618 = newval;
619 break;
620 }
621
622 default:
623 valcontents = XSYMBOL (sym)->value;
624 if (XTYPE (valcontents) == Lisp_Buffer_Local_Value
625 || XTYPE (valcontents) == Lisp_Some_Buffer_Local_Value)
626 XCONS (XSYMBOL (sym)->value)->car = newval;
627 else
628 XSYMBOL (sym)->value = newval;
629 }
630 }
631
632 /* Set up the buffer-local symbol SYM for validity in the current
633 buffer. VALCONTENTS is the contents of its value cell.
634 Return the value forwarded one step past the buffer-local indicator. */
635
636 static Lisp_Object
637 swap_in_symval_forwarding (sym, valcontents)
638 Lisp_Object sym, valcontents;
639 {
640 /* valcontents is a list
641 (REALVALUE BUFFER CURRENT-ALIST-ELEMENT . DEFAULT-VALUE)).
642
643 CURRENT-ALIST-ELEMENT is a pointer to an element of BUFFER's
644 local_var_alist, that being the element whose car is this
645 variable. Or it can be a pointer to the
646 (CURRENT-ALIST-ELEMENT . DEFAULT-VALUE), if BUFFER does not have
647 an element in its alist for this variable.
648
649 If the current buffer is not BUFFER, we store the current
650 REALVALUE value into CURRENT-ALIST-ELEMENT, then find the
651 appropriate alist element for the buffer now current and set up
652 CURRENT-ALIST-ELEMENT. Then we set REALVALUE out of that
653 element, and store into BUFFER.
654
655 Note that REALVALUE can be a forwarding pointer. */
656
657 register Lisp_Object tem1;
658 tem1 = XCONS (XCONS (valcontents)->cdr)->car;
659
660 if (NILP (tem1) || current_buffer != XBUFFER (tem1))
661 {
662 tem1 = XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->car;
663 Fsetcdr (tem1, do_symval_forwarding (XCONS (valcontents)->car));
664 tem1 = assq_no_quit (sym, current_buffer->local_var_alist);
665 if (NILP (tem1))
666 tem1 = XCONS (XCONS (valcontents)->cdr)->cdr;
667 XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->car = tem1;
668 XSET (XCONS (XCONS (valcontents)->cdr)->car, Lisp_Buffer, current_buffer);
669 store_symval_forwarding (sym, XCONS (valcontents)->car, Fcdr (tem1));
670 }
671 return XCONS (valcontents)->car;
672 }
673 \f
674 /* Find the value of a symbol, returning Qunbound if it's not bound.
675 This is helpful for code which just wants to get a variable's value
676 if it has one, without signalling an error.
677 Note that it must not be possible to quit
678 within this function. Great care is required for this. */
679
680 Lisp_Object
681 find_symbol_value (sym)
682 Lisp_Object sym;
683 {
684 register Lisp_Object valcontents, tem1;
685 register Lisp_Object val;
686 CHECK_SYMBOL (sym, 0);
687 valcontents = XSYMBOL (sym)->value;
688
689 retry:
690 #ifdef SWITCH_ENUM_BUG
691 switch ((int) XTYPE (valcontents))
692 #else
693 switch (XTYPE (valcontents))
694 #endif
695 {
696 case Lisp_Buffer_Local_Value:
697 case Lisp_Some_Buffer_Local_Value:
698 valcontents = swap_in_symval_forwarding (sym, valcontents);
699 goto retry;
700
701 case Lisp_Intfwd:
702 XSET (val, Lisp_Int, *XINTPTR (valcontents));
703 return val;
704
705 case Lisp_Boolfwd:
706 if (*XINTPTR (valcontents))
707 return Qt;
708 return Qnil;
709
710 case Lisp_Objfwd:
711 return *XOBJFWD (valcontents);
712
713 case Lisp_Buffer_Objfwd:
714 return *(Lisp_Object *)(XUINT (valcontents) + (char *)current_buffer);
715
716 case Lisp_Void:
717 return Qunbound;
718 }
719
720 return valcontents;
721 }
722
723 DEFUN ("symbol-value", Fsymbol_value, Ssymbol_value, 1, 1, 0,
724 "Return SYMBOL's value. Error if that is void.")
725 (sym)
726 Lisp_Object sym;
727 {
728 Lisp_Object val = find_symbol_value (sym);
729
730 if (EQ (val, Qunbound))
731 return Fsignal (Qvoid_variable, Fcons (sym, Qnil));
732 else
733 return val;
734 }
735
736 DEFUN ("set", Fset, Sset, 2, 2, 0,
737 "Set SYMBOL's value to NEWVAL, and return NEWVAL.")
738 (sym, newval)
739 register Lisp_Object sym, newval;
740 {
741 int voide = (XTYPE (newval) == Lisp_Void || EQ (newval, Qunbound));
742
743 #ifndef RTPC_REGISTER_BUG
744 register Lisp_Object valcontents, tem1, current_alist_element;
745 #else /* RTPC_REGISTER_BUG */
746 register Lisp_Object tem1;
747 Lisp_Object valcontents, current_alist_element;
748 #endif /* RTPC_REGISTER_BUG */
749
750 CHECK_SYMBOL (sym, 0);
751 if (NILP (sym) || EQ (sym, Qt))
752 return Fsignal (Qsetting_constant, Fcons (sym, Qnil));
753 valcontents = XSYMBOL (sym)->value;
754
755 if (XTYPE (valcontents) == Lisp_Buffer_Objfwd)
756 {
757 register int idx = XUINT (valcontents);
758 register int mask = *(int *)(idx + (char *) &buffer_local_flags);
759 if (mask > 0)
760 current_buffer->local_var_flags |= mask;
761 }
762
763 else if (XTYPE (valcontents) == Lisp_Buffer_Local_Value
764 || XTYPE (valcontents) == Lisp_Some_Buffer_Local_Value)
765 {
766 /* valcontents is actually a pointer to a cons heading something like:
767 (REALVALUE BUFFER CURRENT-ALIST-ELEMENT . DEFAULT-VALUE).
768
769 BUFFER is the last buffer for which this symbol's value was
770 made up to date.
771
772 CURRENT-ALIST-ELEMENT is a pointer to an element of BUFFER's
773 local_var_alist, that being the element whose car is this
774 variable. Or it can be a pointer to the
775 (CURRENT-ALIST-ELEMENT . DEFAULT-VALUE), if BUFFER does not
776 have an element in its alist for this variable (that is, if
777 BUFFER sees the default value of this variable).
778
779 If we want to examine or set the value and BUFFER is current,
780 we just examine or set REALVALUE. If BUFFER is not current, we
781 store the current REALVALUE value into CURRENT-ALIST-ELEMENT,
782 then find the appropriate alist element for the buffer now
783 current and set up CURRENT-ALIST-ELEMENT. Then we set
784 REALVALUE out of that element, and store into BUFFER.
785
786 If we are setting the variable and the current buffer does
787 not have an alist entry for this variable, an alist entry is
788 created.
789
790 Note that REALVALUE can be a forwarding pointer. Each time
791 it is examined or set, forwarding must be done. */
792
793 /* What value are we caching right now? */
794 current_alist_element =
795 XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->car;
796
797 /* If the current buffer is not the buffer whose binding is
798 currently cached, or if it's a Lisp_Buffer_Local_Value and
799 we're looking at the default value, the cache is invalid; we
800 need to write it out, and find the new CURRENT-ALIST-ELEMENT. */
801 if ((current_buffer
802 != XBUFFER (XCONS (XCONS (valcontents)->cdr)->car))
803 || (XTYPE (valcontents) == Lisp_Buffer_Local_Value
804 && EQ (XCONS (current_alist_element)->car,
805 current_alist_element)))
806 {
807 /* Write out the cached value for the old buffer; copy it
808 back to its alist element. This works if the current
809 buffer only sees the default value, too. */
810 Fsetcdr (current_alist_element,
811 do_symval_forwarding (XCONS (valcontents)->car));
812
813 /* Find the new value for CURRENT-ALIST-ELEMENT. */
814 tem1 = Fassq (sym, current_buffer->local_var_alist);
815 if (NILP (tem1))
816 {
817 /* This buffer still sees the default value. */
818
819 /* If the variable is a Lisp_Some_Buffer_Local_Value,
820 make CURRENT-ALIST-ELEMENT point to itself,
821 indicating that we're seeing the default value. */
822 if (XTYPE (valcontents) == Lisp_Some_Buffer_Local_Value)
823 tem1 = XCONS (XCONS (valcontents)->cdr)->cdr;
824
825 /* If it's a Lisp_Buffer_Local_Value, give this buffer a
826 new assoc for a local value and set
827 CURRENT-ALIST-ELEMENT to point to that. */
828 else
829 {
830 tem1 = Fcons (sym, Fcdr (current_alist_element));
831 current_buffer->local_var_alist =
832 Fcons (tem1, current_buffer->local_var_alist);
833 }
834 }
835 /* Cache the new buffer's assoc in CURRENT-ALIST-ELEMENT. */
836 XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->car = tem1;
837
838 /* Set BUFFER, now that CURRENT-ALIST-ELEMENT is accurate. */
839 XSET (XCONS (XCONS (valcontents)->cdr)->car,
840 Lisp_Buffer, current_buffer);
841 }
842 valcontents = XCONS (valcontents)->car;
843 }
844
845 /* If storing void (making the symbol void), forward only through
846 buffer-local indicator, not through Lisp_Objfwd, etc. */
847 if (voide)
848 store_symval_forwarding (sym, Qnil, newval);
849 else
850 store_symval_forwarding (sym, valcontents, newval);
851
852 return newval;
853 }
854 \f
855 /* Access or set a buffer-local symbol's default value. */
856
857 /* Return the default value of SYM, but don't check for voidness.
858 Return Qunbound or a Lisp_Void object if it is void. */
859
860 Lisp_Object
861 default_value (sym)
862 Lisp_Object sym;
863 {
864 register Lisp_Object valcontents;
865
866 CHECK_SYMBOL (sym, 0);
867 valcontents = XSYMBOL (sym)->value;
868
869 /* For a built-in buffer-local variable, get the default value
870 rather than letting do_symval_forwarding get the current value. */
871 if (XTYPE (valcontents) == Lisp_Buffer_Objfwd)
872 {
873 register int idx = XUINT (valcontents);
874
875 if (*(int *) (idx + (char *) &buffer_local_flags) != 0)
876 return *(Lisp_Object *)(idx + (char *) &buffer_defaults);
877 }
878
879 /* Handle user-created local variables. */
880 if (XTYPE (valcontents) == Lisp_Buffer_Local_Value
881 || XTYPE (valcontents) == Lisp_Some_Buffer_Local_Value)
882 {
883 /* If var is set up for a buffer that lacks a local value for it,
884 the current value is nominally the default value.
885 But the current value slot may be more up to date, since
886 ordinary setq stores just that slot. So use that. */
887 Lisp_Object current_alist_element, alist_element_car;
888 current_alist_element
889 = XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->car;
890 alist_element_car = XCONS (current_alist_element)->car;
891 if (EQ (alist_element_car, current_alist_element))
892 return do_symval_forwarding (XCONS (valcontents)->car);
893 else
894 return XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->cdr;
895 }
896 /* For other variables, get the current value. */
897 return do_symval_forwarding (valcontents);
898 }
899
900 DEFUN ("default-boundp", Fdefault_boundp, Sdefault_boundp, 1, 1, 0,
901 "Return T if SYMBOL has a non-void default value.\n\
902 This is the value that is seen in buffers that do not have their own values\n\
903 for this variable.")
904 (sym)
905 Lisp_Object sym;
906 {
907 register Lisp_Object value;
908
909 value = default_value (sym);
910 return (XTYPE (value) == Lisp_Void || EQ (value, Qunbound)
911 ? Qnil : Qt);
912 }
913
914 DEFUN ("default-value", Fdefault_value, Sdefault_value, 1, 1, 0,
915 "Return SYMBOL's default value.\n\
916 This is the value that is seen in buffers that do not have their own values\n\
917 for this variable. The default value is meaningful for variables with\n\
918 local bindings in certain buffers.")
919 (sym)
920 Lisp_Object sym;
921 {
922 register Lisp_Object value;
923
924 value = default_value (sym);
925 if (XTYPE (value) == Lisp_Void || EQ (value, Qunbound))
926 return Fsignal (Qvoid_variable, Fcons (sym, Qnil));
927 return value;
928 }
929
930 DEFUN ("set-default", Fset_default, Sset_default, 2, 2, 0,
931 "Set SYMBOL's default value to VAL. SYMBOL and VAL are evaluated.\n\
932 The default value is seen in buffers that do not have their own values\n\
933 for this variable.")
934 (sym, value)
935 Lisp_Object sym, value;
936 {
937 register Lisp_Object valcontents, current_alist_element, alist_element_buffer;
938
939 CHECK_SYMBOL (sym, 0);
940 valcontents = XSYMBOL (sym)->value;
941
942 /* Handle variables like case-fold-search that have special slots
943 in the buffer. Make them work apparently like Lisp_Buffer_Local_Value
944 variables. */
945 if (XTYPE (valcontents) == Lisp_Buffer_Objfwd)
946 {
947 register int idx = XUINT (valcontents);
948 #ifndef RTPC_REGISTER_BUG
949 register struct buffer *b;
950 #else
951 struct buffer *b;
952 #endif
953 register int mask = *(int *) (idx + (char *) &buffer_local_flags);
954
955 if (mask > 0)
956 {
957 *(Lisp_Object *)(idx + (char *) &buffer_defaults) = value;
958 for (b = all_buffers; b; b = b->next)
959 if (!(b->local_var_flags & mask))
960 *(Lisp_Object *)(idx + (char *) b) = value;
961 }
962 return value;
963 }
964
965 if (XTYPE (valcontents) != Lisp_Buffer_Local_Value &&
966 XTYPE (valcontents) != Lisp_Some_Buffer_Local_Value)
967 return Fset (sym, value);
968
969 /* Store new value into the DEFAULT-VALUE slot */
970 XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->cdr = value;
971
972 /* If that slot is current, we must set the REALVALUE slot too */
973 current_alist_element = XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->car;
974 alist_element_buffer = Fcar (current_alist_element);
975 if (EQ (alist_element_buffer, current_alist_element))
976 store_symval_forwarding (sym, XCONS (valcontents)->car, value);
977
978 return value;
979 }
980
981 DEFUN ("setq-default", Fsetq_default, Ssetq_default, 2, UNEVALLED, 0,
982 "\
983 (setq-default SYM VAL SYM VAL ...): set each SYM's default value to its VAL.\n\
984 VAL is evaluated; SYM is not. The default value is seen in buffers that do\n\
985 not have their own values for this variable.")
986 (args)
987 Lisp_Object args;
988 {
989 register Lisp_Object args_left;
990 register Lisp_Object val, sym;
991 struct gcpro gcpro1;
992
993 if (NILP (args))
994 return Qnil;
995
996 args_left = args;
997 GCPRO1 (args);
998
999 do
1000 {
1001 val = Feval (Fcar (Fcdr (args_left)));
1002 sym = Fcar (args_left);
1003 Fset_default (sym, val);
1004 args_left = Fcdr (Fcdr (args_left));
1005 }
1006 while (!NILP (args_left));
1007
1008 UNGCPRO;
1009 return val;
1010 }
1011 \f
1012 /* Lisp functions for creating and removing buffer-local variables. */
1013
1014 DEFUN ("make-variable-buffer-local", Fmake_variable_buffer_local, Smake_variable_buffer_local,
1015 1, 1, "vMake Variable Buffer Local: ",
1016 "Make VARIABLE have a separate value for each buffer.\n\
1017 At any time, the value for the current buffer is in effect.\n\
1018 There is also a default value which is seen in any buffer which has not yet\n\
1019 set its own value.\n\
1020 Using `set' or `setq' to set the variable causes it to have a separate value\n\
1021 for the current buffer if it was previously using the default value.\n\
1022 The function `default-value' gets the default value and `set-default' sets it.")
1023 (sym)
1024 register Lisp_Object sym;
1025 {
1026 register Lisp_Object tem, valcontents;
1027
1028 CHECK_SYMBOL (sym, 0);
1029
1030 if (EQ (sym, Qnil) || EQ (sym, Qt))
1031 error ("Symbol %s may not be buffer-local", XSYMBOL (sym)->name->data);
1032
1033 valcontents = XSYMBOL (sym)->value;
1034 if ((XTYPE (valcontents) == Lisp_Buffer_Local_Value) ||
1035 (XTYPE (valcontents) == Lisp_Buffer_Objfwd))
1036 return sym;
1037 if (XTYPE (valcontents) == Lisp_Some_Buffer_Local_Value)
1038 {
1039 XSETTYPE (XSYMBOL (sym)->value, Lisp_Buffer_Local_Value);
1040 return sym;
1041 }
1042 if (EQ (valcontents, Qunbound))
1043 XSYMBOL (sym)->value = Qnil;
1044 tem = Fcons (Qnil, Fsymbol_value (sym));
1045 XCONS (tem)->car = tem;
1046 XSYMBOL (sym)->value = Fcons (XSYMBOL (sym)->value, Fcons (Fcurrent_buffer (), tem));
1047 XSETTYPE (XSYMBOL (sym)->value, Lisp_Buffer_Local_Value);
1048 return sym;
1049 }
1050
1051 DEFUN ("make-local-variable", Fmake_local_variable, Smake_local_variable,
1052 1, 1, "vMake Local Variable: ",
1053 "Make VARIABLE have a separate value in the current buffer.\n\
1054 Other buffers will continue to share a common default value.\n\
1055 See also `make-variable-buffer-local'.\n\n\
1056 If the variable is already arranged to become local when set,\n\
1057 this function causes a local value to exist for this buffer,\n\
1058 just as if the variable were set.")
1059 (sym)
1060 register Lisp_Object sym;
1061 {
1062 register Lisp_Object tem, valcontents;
1063
1064 CHECK_SYMBOL (sym, 0);
1065
1066 if (EQ (sym, Qnil) || EQ (sym, Qt))
1067 error ("Symbol %s may not be buffer-local", XSYMBOL (sym)->name->data);
1068
1069 valcontents = XSYMBOL (sym)->value;
1070 if (XTYPE (valcontents) == Lisp_Buffer_Local_Value
1071 || XTYPE (valcontents) == Lisp_Buffer_Objfwd)
1072 {
1073 tem = Fboundp (sym);
1074
1075 /* Make sure the symbol has a local value in this particular buffer,
1076 by setting it to the same value it already has. */
1077 Fset (sym, (EQ (tem, Qt) ? Fsymbol_value (sym) : Qunbound));
1078 return sym;
1079 }
1080 /* Make sure sym is set up to hold per-buffer values */
1081 if (XTYPE (valcontents) != Lisp_Some_Buffer_Local_Value)
1082 {
1083 if (EQ (valcontents, Qunbound))
1084 XSYMBOL (sym)->value = Qnil;
1085 tem = Fcons (Qnil, do_symval_forwarding (valcontents));
1086 XCONS (tem)->car = tem;
1087 XSYMBOL (sym)->value = Fcons (XSYMBOL (sym)->value, Fcons (Qnil, tem));
1088 XSETTYPE (XSYMBOL (sym)->value, Lisp_Some_Buffer_Local_Value);
1089 }
1090 /* Make sure this buffer has its own value of sym */
1091 tem = Fassq (sym, current_buffer->local_var_alist);
1092 if (NILP (tem))
1093 {
1094 current_buffer->local_var_alist
1095 = Fcons (Fcons (sym, XCONS (XCONS (XCONS (XSYMBOL (sym)->value)->cdr)->cdr)->cdr),
1096 current_buffer->local_var_alist);
1097
1098 /* Make sure symbol does not think it is set up for this buffer;
1099 force it to look once again for this buffer's value */
1100 {
1101 /* This local variable avoids "expression too complex" on IBM RT. */
1102 Lisp_Object xs;
1103
1104 xs = XSYMBOL (sym)->value;
1105 if (current_buffer == XBUFFER (XCONS (XCONS (xs)->cdr)->car))
1106 XCONS (XCONS (XSYMBOL (sym)->value)->cdr)->car = Qnil;
1107 }
1108 }
1109
1110 /* If the symbol forwards into a C variable, then swap in the
1111 variable for this buffer immediately. If C code modifies the
1112 variable before we swap in, then that new value will clobber the
1113 default value the next time we swap. */
1114 valcontents = XCONS (XSYMBOL (sym)->value)->car;
1115 if (XTYPE (valcontents) == Lisp_Intfwd
1116 || XTYPE (valcontents) == Lisp_Boolfwd
1117 || XTYPE (valcontents) == Lisp_Objfwd)
1118 swap_in_symval_forwarding (sym, XSYMBOL (sym)->value);
1119
1120 return sym;
1121 }
1122
1123 DEFUN ("kill-local-variable", Fkill_local_variable, Skill_local_variable,
1124 1, 1, "vKill Local Variable: ",
1125 "Make VARIABLE no longer have a separate value in the current buffer.\n\
1126 From now on the default value will apply in this buffer.")
1127 (sym)
1128 register Lisp_Object sym;
1129 {
1130 register Lisp_Object tem, valcontents;
1131
1132 CHECK_SYMBOL (sym, 0);
1133
1134 valcontents = XSYMBOL (sym)->value;
1135
1136 if (XTYPE (valcontents) == Lisp_Buffer_Objfwd)
1137 {
1138 register int idx = XUINT (valcontents);
1139 register int mask = *(int *) (idx + (char *) &buffer_local_flags);
1140
1141 if (mask > 0)
1142 {
1143 *(Lisp_Object *)(idx + (char *) current_buffer)
1144 = *(Lisp_Object *)(idx + (char *) &buffer_defaults);
1145 current_buffer->local_var_flags &= ~mask;
1146 }
1147 return sym;
1148 }
1149
1150 if (XTYPE (valcontents) != Lisp_Buffer_Local_Value &&
1151 XTYPE (valcontents) != Lisp_Some_Buffer_Local_Value)
1152 return sym;
1153
1154 /* Get rid of this buffer's alist element, if any */
1155
1156 tem = Fassq (sym, current_buffer->local_var_alist);
1157 if (!NILP (tem))
1158 current_buffer->local_var_alist = Fdelq (tem, current_buffer->local_var_alist);
1159
1160 /* Make sure symbol does not think it is set up for this buffer;
1161 force it to look once again for this buffer's value */
1162 {
1163 Lisp_Object sv;
1164 sv = XSYMBOL (sym)->value;
1165 if (current_buffer == XBUFFER (XCONS (XCONS (sv)->cdr)->car))
1166 XCONS (XCONS (sv)->cdr)->car = Qnil;
1167 }
1168
1169 return sym;
1170 }
1171 \f
1172 /* Find the function at the end of a chain of symbol function indirections. */
1173
1174 /* If OBJECT is a symbol, find the end of its function chain and
1175 return the value found there. If OBJECT is not a symbol, just
1176 return it. If there is a cycle in the function chain, signal a
1177 cyclic-function-indirection error.
1178
1179 This is like Findirect_function, except that it doesn't signal an
1180 error if the chain ends up unbound. */
1181 Lisp_Object
1182 indirect_function (object)
1183 register Lisp_Object object;
1184 {
1185 Lisp_Object tortise, hare;
1186
1187 hare = tortise = object;
1188
1189 for (;;)
1190 {
1191 if (XTYPE (hare) != Lisp_Symbol || EQ (hare, Qunbound))
1192 break;
1193 hare = XSYMBOL (hare)->function;
1194 if (XTYPE (hare) != Lisp_Symbol || EQ (hare, Qunbound))
1195 break;
1196 hare = XSYMBOL (hare)->function;
1197
1198 tortise = XSYMBOL (tortise)->function;
1199
1200 if (EQ (hare, tortise))
1201 Fsignal (Qcyclic_function_indirection, Fcons (object, Qnil));
1202 }
1203
1204 return hare;
1205 }
1206
1207 DEFUN ("indirect-function", Findirect_function, Sindirect_function, 1, 1, 0,
1208 "Return the function at the end of OBJECT's function chain.\n\
1209 If OBJECT is a symbol, follow all function indirections and return the final\n\
1210 function binding.\n\
1211 If OBJECT is not a symbol, just return it.\n\
1212 Signal a void-function error if the final symbol is unbound.\n\
1213 Signal a cyclic-function-indirection error if there is a loop in the\n\
1214 function chain of symbols.")
1215 (object)
1216 register Lisp_Object object;
1217 {
1218 Lisp_Object result;
1219
1220 result = indirect_function (object);
1221
1222 if (EQ (result, Qunbound))
1223 return Fsignal (Qvoid_function, Fcons (object, Qnil));
1224 return result;
1225 }
1226 \f
1227 /* Extract and set vector and string elements */
1228
1229 DEFUN ("aref", Faref, Saref, 2, 2, 0,
1230 "Return the element of ARRAY at index INDEX.\n\
1231 ARRAY may be a vector or a string, or a byte-code object. INDEX starts at 0.")
1232 (array, idx)
1233 register Lisp_Object array;
1234 Lisp_Object idx;
1235 {
1236 register int idxval;
1237
1238 CHECK_NUMBER (idx, 1);
1239 idxval = XINT (idx);
1240 if (XTYPE (array) != Lisp_Vector && XTYPE (array) != Lisp_String
1241 && XTYPE (array) != Lisp_Compiled)
1242 array = wrong_type_argument (Qarrayp, array);
1243 if (idxval < 0 || idxval >= XVECTOR (array)->size)
1244 args_out_of_range (array, idx);
1245 if (XTYPE (array) == Lisp_String)
1246 {
1247 Lisp_Object val;
1248 XFASTINT (val) = (unsigned char) XSTRING (array)->data[idxval];
1249 return val;
1250 }
1251 else
1252 return XVECTOR (array)->contents[idxval];
1253 }
1254
1255 DEFUN ("aset", Faset, Saset, 3, 3, 0,
1256 "Store into the element of ARRAY at index INDEX the value NEWVAL.\n\
1257 ARRAY may be a vector or a string. INDEX starts at 0.")
1258 (array, idx, newelt)
1259 register Lisp_Object array;
1260 Lisp_Object idx, newelt;
1261 {
1262 register int idxval;
1263
1264 CHECK_NUMBER (idx, 1);
1265 idxval = XINT (idx);
1266 if (XTYPE (array) != Lisp_Vector && XTYPE (array) != Lisp_String)
1267 array = wrong_type_argument (Qarrayp, array);
1268 if (idxval < 0 || idxval >= XVECTOR (array)->size)
1269 args_out_of_range (array, idx);
1270 CHECK_IMPURE (array);
1271
1272 if (XTYPE (array) == Lisp_Vector)
1273 XVECTOR (array)->contents[idxval] = newelt;
1274 else
1275 {
1276 CHECK_NUMBER (newelt, 2);
1277 XSTRING (array)->data[idxval] = XINT (newelt);
1278 }
1279
1280 return newelt;
1281 }
1282
1283 Lisp_Object
1284 Farray_length (array)
1285 register Lisp_Object array;
1286 {
1287 register Lisp_Object size;
1288 if (XTYPE (array) != Lisp_Vector && XTYPE (array) != Lisp_String
1289 && XTYPE (array) != Lisp_Compiled)
1290 array = wrong_type_argument (Qarrayp, array);
1291 XFASTINT (size) = XVECTOR (array)->size;
1292 return size;
1293 }
1294 \f
1295 /* Arithmetic functions */
1296
1297 enum comparison { equal, notequal, less, grtr, less_or_equal, grtr_or_equal };
1298
1299 Lisp_Object
1300 arithcompare (num1, num2, comparison)
1301 Lisp_Object num1, num2;
1302 enum comparison comparison;
1303 {
1304 double f1, f2;
1305 int floatp = 0;
1306
1307 #ifdef LISP_FLOAT_TYPE
1308 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num1, 0);
1309 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num2, 0);
1310
1311 if (XTYPE (num1) == Lisp_Float || XTYPE (num2) == Lisp_Float)
1312 {
1313 floatp = 1;
1314 f1 = (XTYPE (num1) == Lisp_Float) ? XFLOAT (num1)->data : XINT (num1);
1315 f2 = (XTYPE (num2) == Lisp_Float) ? XFLOAT (num2)->data : XINT (num2);
1316 }
1317 #else
1318 CHECK_NUMBER_COERCE_MARKER (num1, 0);
1319 CHECK_NUMBER_COERCE_MARKER (num2, 0);
1320 #endif /* LISP_FLOAT_TYPE */
1321
1322 switch (comparison)
1323 {
1324 case equal:
1325 if (floatp ? f1 == f2 : XINT (num1) == XINT (num2))
1326 return Qt;
1327 return Qnil;
1328
1329 case notequal:
1330 if (floatp ? f1 != f2 : XINT (num1) != XINT (num2))
1331 return Qt;
1332 return Qnil;
1333
1334 case less:
1335 if (floatp ? f1 < f2 : XINT (num1) < XINT (num2))
1336 return Qt;
1337 return Qnil;
1338
1339 case less_or_equal:
1340 if (floatp ? f1 <= f2 : XINT (num1) <= XINT (num2))
1341 return Qt;
1342 return Qnil;
1343
1344 case grtr:
1345 if (floatp ? f1 > f2 : XINT (num1) > XINT (num2))
1346 return Qt;
1347 return Qnil;
1348
1349 case grtr_or_equal:
1350 if (floatp ? f1 >= f2 : XINT (num1) >= XINT (num2))
1351 return Qt;
1352 return Qnil;
1353 }
1354 }
1355
1356 DEFUN ("=", Feqlsign, Seqlsign, 2, 2, 0,
1357 "T if two args, both numbers or markers, are equal.")
1358 (num1, num2)
1359 register Lisp_Object num1, num2;
1360 {
1361 return arithcompare (num1, num2, equal);
1362 }
1363
1364 DEFUN ("<", Flss, Slss, 2, 2, 0,
1365 "T if first arg is less than second arg. Both must be numbers or markers.")
1366 (num1, num2)
1367 register Lisp_Object num1, num2;
1368 {
1369 return arithcompare (num1, num2, less);
1370 }
1371
1372 DEFUN (">", Fgtr, Sgtr, 2, 2, 0,
1373 "T if first arg is greater than second arg. Both must be numbers or markers.")
1374 (num1, num2)
1375 register Lisp_Object num1, num2;
1376 {
1377 return arithcompare (num1, num2, grtr);
1378 }
1379
1380 DEFUN ("<=", Fleq, Sleq, 2, 2, 0,
1381 "T if first arg is less than or equal to second arg.\n\
1382 Both must be numbers or markers.")
1383 (num1, num2)
1384 register Lisp_Object num1, num2;
1385 {
1386 return arithcompare (num1, num2, less_or_equal);
1387 }
1388
1389 DEFUN (">=", Fgeq, Sgeq, 2, 2, 0,
1390 "T if first arg is greater than or equal to second arg.\n\
1391 Both must be numbers or markers.")
1392 (num1, num2)
1393 register Lisp_Object num1, num2;
1394 {
1395 return arithcompare (num1, num2, grtr_or_equal);
1396 }
1397
1398 DEFUN ("/=", Fneq, Sneq, 2, 2, 0,
1399 "T if first arg is not equal to second arg. Both must be numbers or markers.")
1400 (num1, num2)
1401 register Lisp_Object num1, num2;
1402 {
1403 return arithcompare (num1, num2, notequal);
1404 }
1405
1406 DEFUN ("zerop", Fzerop, Szerop, 1, 1, 0, "T if NUMBER is zero.")
1407 (num)
1408 register Lisp_Object num;
1409 {
1410 #ifdef LISP_FLOAT_TYPE
1411 CHECK_NUMBER_OR_FLOAT (num, 0);
1412
1413 if (XTYPE(num) == Lisp_Float)
1414 {
1415 if (XFLOAT(num)->data == 0.0)
1416 return Qt;
1417 return Qnil;
1418 }
1419 #else
1420 CHECK_NUMBER (num, 0);
1421 #endif /* LISP_FLOAT_TYPE */
1422
1423 if (!XINT (num))
1424 return Qt;
1425 return Qnil;
1426 }
1427 \f
1428 DEFUN ("int-to-string", Fint_to_string, Sint_to_string, 1, 1, 0,
1429 "Convert INT to a string by printing it in decimal.\n\
1430 Uses a minus sign if negative.")
1431 (num)
1432 Lisp_Object num;
1433 {
1434 char buffer[20];
1435
1436 #ifndef LISP_FLOAT_TYPE
1437 CHECK_NUMBER (num, 0);
1438 #else
1439 CHECK_NUMBER_OR_FLOAT (num, 0);
1440
1441 if (XTYPE(num) == Lisp_Float)
1442 {
1443 char pigbuf[350]; /* see comments in float_to_string */
1444
1445 float_to_string (pigbuf, XFLOAT(num)->data);
1446 return build_string (pigbuf);
1447 }
1448 #endif /* LISP_FLOAT_TYPE */
1449
1450 sprintf (buffer, "%d", XINT (num));
1451 return build_string (buffer);
1452 }
1453
1454 DEFUN ("string-to-int", Fstring_to_int, Sstring_to_int, 1, 1, 0,
1455 "Convert STRING to an integer by parsing it as a decimal number.")
1456 (str)
1457 register Lisp_Object str;
1458 {
1459 CHECK_STRING (str, 0);
1460
1461 #ifdef LISP_FLOAT_TYPE
1462 if (isfloat_string (XSTRING (str)->data))
1463 return make_float (atof (XSTRING (str)->data));
1464 #endif /* LISP_FLOAT_TYPE */
1465
1466 return make_number (atoi (XSTRING (str)->data));
1467 }
1468 \f
1469 enum arithop
1470 { Aadd, Asub, Amult, Adiv, Alogand, Alogior, Alogxor, Amax, Amin };
1471
1472 extern Lisp_Object float_arith_driver ();
1473
1474 Lisp_Object
1475 arith_driver
1476 (code, nargs, args)
1477 enum arithop code;
1478 int nargs;
1479 register Lisp_Object *args;
1480 {
1481 register Lisp_Object val;
1482 register int argnum;
1483 register int accum;
1484 register int next;
1485
1486 #ifdef SWITCH_ENUM_BUG
1487 switch ((int) code)
1488 #else
1489 switch (code)
1490 #endif
1491 {
1492 case Alogior:
1493 case Alogxor:
1494 case Aadd:
1495 case Asub:
1496 accum = 0; break;
1497 case Amult:
1498 accum = 1; break;
1499 case Alogand:
1500 accum = -1; break;
1501 }
1502
1503 for (argnum = 0; argnum < nargs; argnum++)
1504 {
1505 val = args[argnum]; /* using args[argnum] as argument to CHECK_NUMBER_... */
1506 #ifdef LISP_FLOAT_TYPE
1507 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val, argnum);
1508
1509 if (XTYPE (val) == Lisp_Float) /* time to do serious math */
1510 return (float_arith_driver ((double) accum, argnum, code,
1511 nargs, args));
1512 #else
1513 CHECK_NUMBER_COERCE_MARKER (val, argnum);
1514 #endif /* LISP_FLOAT_TYPE */
1515 args[argnum] = val; /* runs into a compiler bug. */
1516 next = XINT (args[argnum]);
1517 #ifdef SWITCH_ENUM_BUG
1518 switch ((int) code)
1519 #else
1520 switch (code)
1521 #endif
1522 {
1523 case Aadd: accum += next; break;
1524 case Asub:
1525 if (!argnum && nargs != 1)
1526 next = - next;
1527 accum -= next;
1528 break;
1529 case Amult: accum *= next; break;
1530 case Adiv:
1531 if (!argnum) accum = next;
1532 else accum /= next;
1533 break;
1534 case Alogand: accum &= next; break;
1535 case Alogior: accum |= next; break;
1536 case Alogxor: accum ^= next; break;
1537 case Amax: if (!argnum || next > accum) accum = next; break;
1538 case Amin: if (!argnum || next < accum) accum = next; break;
1539 }
1540 }
1541
1542 XSET (val, Lisp_Int, accum);
1543 return val;
1544 }
1545
1546 #ifdef LISP_FLOAT_TYPE
1547 Lisp_Object
1548 float_arith_driver (accum, argnum, code, nargs, args)
1549 double accum;
1550 register int argnum;
1551 enum arithop code;
1552 int nargs;
1553 register Lisp_Object *args;
1554 {
1555 register Lisp_Object val;
1556 double next;
1557
1558 for (; argnum < nargs; argnum++)
1559 {
1560 val = args[argnum]; /* using args[argnum] as argument to CHECK_NUMBER_... */
1561 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val, argnum);
1562
1563 if (XTYPE (val) == Lisp_Float)
1564 {
1565 next = XFLOAT (val)->data;
1566 }
1567 else
1568 {
1569 args[argnum] = val; /* runs into a compiler bug. */
1570 next = XINT (args[argnum]);
1571 }
1572 #ifdef SWITCH_ENUM_BUG
1573 switch ((int) code)
1574 #else
1575 switch (code)
1576 #endif
1577 {
1578 case Aadd:
1579 accum += next;
1580 break;
1581 case Asub:
1582 if (!argnum && nargs != 1)
1583 next = - next;
1584 accum -= next;
1585 break;
1586 case Amult:
1587 accum *= next;
1588 break;
1589 case Adiv:
1590 if (!argnum)
1591 accum = next;
1592 else
1593 accum /= next;
1594 break;
1595 case Alogand:
1596 case Alogior:
1597 case Alogxor:
1598 return wrong_type_argument (Qinteger_or_marker_p, val);
1599 case Amax:
1600 if (!argnum || next > accum)
1601 accum = next;
1602 break;
1603 case Amin:
1604 if (!argnum || next < accum)
1605 accum = next;
1606 break;
1607 }
1608 }
1609
1610 return make_float (accum);
1611 }
1612 #endif /* LISP_FLOAT_TYPE */
1613
1614 DEFUN ("+", Fplus, Splus, 0, MANY, 0,
1615 "Return sum of any number of arguments, which are numbers or markers.")
1616 (nargs, args)
1617 int nargs;
1618 Lisp_Object *args;
1619 {
1620 return arith_driver (Aadd, nargs, args);
1621 }
1622
1623 DEFUN ("-", Fminus, Sminus, 0, MANY, 0,
1624 "Negate number or subtract numbers or markers.\n\
1625 With one arg, negates it. With more than one arg,\n\
1626 subtracts all but the first from the first.")
1627 (nargs, args)
1628 int nargs;
1629 Lisp_Object *args;
1630 {
1631 return arith_driver (Asub, nargs, args);
1632 }
1633
1634 DEFUN ("*", Ftimes, Stimes, 0, MANY, 0,
1635 "Returns product of any number of arguments, which are numbers or markers.")
1636 (nargs, args)
1637 int nargs;
1638 Lisp_Object *args;
1639 {
1640 return arith_driver (Amult, nargs, args);
1641 }
1642
1643 DEFUN ("/", Fquo, Squo, 2, MANY, 0,
1644 "Returns first argument divided by all the remaining arguments.\n\
1645 The arguments must be numbers or markers.")
1646 (nargs, args)
1647 int nargs;
1648 Lisp_Object *args;
1649 {
1650 return arith_driver (Adiv, nargs, args);
1651 }
1652
1653 DEFUN ("%", Frem, Srem, 2, 2, 0,
1654 "Returns remainder of first arg divided by second.\n\
1655 Both must be numbers or markers.")
1656 (num1, num2)
1657 register Lisp_Object num1, num2;
1658 {
1659 Lisp_Object val;
1660
1661 #ifdef LISP_FLOAT_TYPE
1662 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num1, 0);
1663 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num2, 0);
1664
1665 if (XTYPE (num1) == Lisp_Float || XTYPE (num2) == Lisp_Float)
1666 {
1667 double f1, f2;
1668
1669 f1 = XTYPE (num1) == Lisp_Float ? XFLOAT (num1)->data : XINT (num1);
1670 f2 = XTYPE (num2) == Lisp_Float ? XFLOAT (num2)->data : XINT (num2);
1671 #if defined (USG) || defined (sun) || defined (ultrix) || defined (hpux)
1672 f1 = fmod (f1, f2);
1673 #else
1674 f1 = drem (f1, f2);
1675 #endif
1676 if (f1 < 0)
1677 f1 += f2;
1678 return (make_float (f1));
1679 }
1680 #else /* not LISP_FLOAT_TYPE */
1681 CHECK_NUMBER_COERCE_MARKER (num1, 0);
1682 CHECK_NUMBER_COERCE_MARKER (num2, 1);
1683 #endif /* not LISP_FLOAT_TYPE */
1684
1685 XSET (val, Lisp_Int, XINT (num1) % XINT (num2));
1686 return val;
1687 }
1688
1689 DEFUN ("max", Fmax, Smax, 1, MANY, 0,
1690 "Return largest of all the arguments (which must be numbers or markers).\n\
1691 The value is always a number; markers are converted to numbers.")
1692 (nargs, args)
1693 int nargs;
1694 Lisp_Object *args;
1695 {
1696 return arith_driver (Amax, nargs, args);
1697 }
1698
1699 DEFUN ("min", Fmin, Smin, 1, MANY, 0,
1700 "Return smallest of all the arguments (which must be numbers or markers).\n\
1701 The value is always a number; markers are converted to numbers.")
1702 (nargs, args)
1703 int nargs;
1704 Lisp_Object *args;
1705 {
1706 return arith_driver (Amin, nargs, args);
1707 }
1708
1709 DEFUN ("logand", Flogand, Slogand, 0, MANY, 0,
1710 "Return bitwise-and of all the arguments.\n\
1711 Arguments may be integers, or markers converted to integers.")
1712 (nargs, args)
1713 int nargs;
1714 Lisp_Object *args;
1715 {
1716 return arith_driver (Alogand, nargs, args);
1717 }
1718
1719 DEFUN ("logior", Flogior, Slogior, 0, MANY, 0,
1720 "Return bitwise-or of all the arguments.\n\
1721 Arguments may be integers, or markers converted to integers.")
1722 (nargs, args)
1723 int nargs;
1724 Lisp_Object *args;
1725 {
1726 return arith_driver (Alogior, nargs, args);
1727 }
1728
1729 DEFUN ("logxor", Flogxor, Slogxor, 0, MANY, 0,
1730 "Return bitwise-exclusive-or of all the arguments.\n\
1731 Arguments may be integers, or markers converted to integers.")
1732 (nargs, args)
1733 int nargs;
1734 Lisp_Object *args;
1735 {
1736 return arith_driver (Alogxor, nargs, args);
1737 }
1738
1739 DEFUN ("ash", Fash, Sash, 2, 2, 0,
1740 "Return VALUE with its bits shifted left by COUNT.\n\
1741 If COUNT is negative, shifting is actually to the right.\n\
1742 In this case, the sign bit is duplicated.")
1743 (num1, num2)
1744 register Lisp_Object num1, num2;
1745 {
1746 register Lisp_Object val;
1747
1748 CHECK_NUMBER (num1, 0);
1749 CHECK_NUMBER (num2, 1);
1750
1751 if (XINT (num2) > 0)
1752 XSET (val, Lisp_Int, XINT (num1) << XFASTINT (num2));
1753 else
1754 XSET (val, Lisp_Int, XINT (num1) >> -XINT (num2));
1755 return val;
1756 }
1757
1758 DEFUN ("lsh", Flsh, Slsh, 2, 2, 0,
1759 "Return VALUE with its bits shifted left by COUNT.\n\
1760 If COUNT is negative, shifting is actually to the right.\n\
1761 In this case, zeros are shifted in on the left.")
1762 (num1, num2)
1763 register Lisp_Object num1, num2;
1764 {
1765 register Lisp_Object val;
1766
1767 CHECK_NUMBER (num1, 0);
1768 CHECK_NUMBER (num2, 1);
1769
1770 if (XINT (num2) > 0)
1771 XSET (val, Lisp_Int, (unsigned) XFASTINT (num1) << XFASTINT (num2));
1772 else
1773 XSET (val, Lisp_Int, (unsigned) XFASTINT (num1) >> -XINT (num2));
1774 return val;
1775 }
1776
1777 DEFUN ("1+", Fadd1, Sadd1, 1, 1, 0,
1778 "Return NUMBER plus one. NUMBER may be a number or a marker.\n\
1779 Markers are converted to integers.")
1780 (num)
1781 register Lisp_Object num;
1782 {
1783 #ifdef LISP_FLOAT_TYPE
1784 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num, 0);
1785
1786 if (XTYPE (num) == Lisp_Float)
1787 return (make_float (1.0 + XFLOAT (num)->data));
1788 #else
1789 CHECK_NUMBER_COERCE_MARKER (num, 0);
1790 #endif /* LISP_FLOAT_TYPE */
1791
1792 XSETINT (num, XFASTINT (num) + 1);
1793 return num;
1794 }
1795
1796 DEFUN ("1-", Fsub1, Ssub1, 1, 1, 0,
1797 "Return NUMBER minus one. NUMBER may be a number or a marker.\n\
1798 Markers are converted to integers.")
1799 (num)
1800 register Lisp_Object num;
1801 {
1802 #ifdef LISP_FLOAT_TYPE
1803 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num, 0);
1804
1805 if (XTYPE (num) == Lisp_Float)
1806 return (make_float (-1.0 + XFLOAT (num)->data));
1807 #else
1808 CHECK_NUMBER_COERCE_MARKER (num, 0);
1809 #endif /* LISP_FLOAT_TYPE */
1810
1811 XSETINT (num, XFASTINT (num) - 1);
1812 return num;
1813 }
1814
1815 DEFUN ("lognot", Flognot, Slognot, 1, 1, 0,
1816 "Return the bitwise complement of ARG. ARG must be an integer.")
1817 (num)
1818 register Lisp_Object num;
1819 {
1820 CHECK_NUMBER (num, 0);
1821 XSETINT (num, ~XFASTINT (num));
1822 return num;
1823 }
1824 \f
1825 void
1826 syms_of_data ()
1827 {
1828 Qquote = intern ("quote");
1829 Qlambda = intern ("lambda");
1830 Qsubr = intern ("subr");
1831 Qerror_conditions = intern ("error-conditions");
1832 Qerror_message = intern ("error-message");
1833 Qtop_level = intern ("top-level");
1834
1835 Qerror = intern ("error");
1836 Qquit = intern ("quit");
1837 Qwrong_type_argument = intern ("wrong-type-argument");
1838 Qargs_out_of_range = intern ("args-out-of-range");
1839 Qvoid_function = intern ("void-function");
1840 Qcyclic_function_indirection = intern ("cyclic-function-indirection");
1841 Qvoid_variable = intern ("void-variable");
1842 Qsetting_constant = intern ("setting-constant");
1843 Qinvalid_read_syntax = intern ("invalid-read-syntax");
1844
1845 Qinvalid_function = intern ("invalid-function");
1846 Qwrong_number_of_arguments = intern ("wrong-number-of-arguments");
1847 Qno_catch = intern ("no-catch");
1848 Qend_of_file = intern ("end-of-file");
1849 Qarith_error = intern ("arith-error");
1850 Qbeginning_of_buffer = intern ("beginning-of-buffer");
1851 Qend_of_buffer = intern ("end-of-buffer");
1852 Qbuffer_read_only = intern ("buffer-read-only");
1853
1854 Qlistp = intern ("listp");
1855 Qconsp = intern ("consp");
1856 Qsymbolp = intern ("symbolp");
1857 Qintegerp = intern ("integerp");
1858 Qnatnump = intern ("natnump");
1859 Qstringp = intern ("stringp");
1860 Qarrayp = intern ("arrayp");
1861 Qsequencep = intern ("sequencep");
1862 Qbufferp = intern ("bufferp");
1863 Qvectorp = intern ("vectorp");
1864 Qchar_or_string_p = intern ("char-or-string-p");
1865 Qmarkerp = intern ("markerp");
1866 Qbuffer_or_string_p = intern ("buffer-or-string-p");
1867 Qinteger_or_marker_p = intern ("integer-or-marker-p");
1868 Qboundp = intern ("boundp");
1869 Qfboundp = intern ("fboundp");
1870
1871 #ifdef LISP_FLOAT_TYPE
1872 Qfloatp = intern ("floatp");
1873 Qnumberp = intern ("numberp");
1874 Qnumber_or_marker_p = intern ("number-or-marker-p");
1875 #endif /* LISP_FLOAT_TYPE */
1876
1877 Qcdr = intern ("cdr");
1878
1879 /* ERROR is used as a signaler for random errors for which nothing else is right */
1880
1881 Fput (Qerror, Qerror_conditions,
1882 Fcons (Qerror, Qnil));
1883 Fput (Qerror, Qerror_message,
1884 build_string ("error"));
1885
1886 Fput (Qquit, Qerror_conditions,
1887 Fcons (Qquit, Qnil));
1888 Fput (Qquit, Qerror_message,
1889 build_string ("Quit"));
1890
1891 Fput (Qwrong_type_argument, Qerror_conditions,
1892 Fcons (Qwrong_type_argument, Fcons (Qerror, Qnil)));
1893 Fput (Qwrong_type_argument, Qerror_message,
1894 build_string ("Wrong type argument"));
1895
1896 Fput (Qargs_out_of_range, Qerror_conditions,
1897 Fcons (Qargs_out_of_range, Fcons (Qerror, Qnil)));
1898 Fput (Qargs_out_of_range, Qerror_message,
1899 build_string ("Args out of range"));
1900
1901 Fput (Qvoid_function, Qerror_conditions,
1902 Fcons (Qvoid_function, Fcons (Qerror, Qnil)));
1903 Fput (Qvoid_function, Qerror_message,
1904 build_string ("Symbol's function definition is void"));
1905
1906 Fput (Qcyclic_function_indirection, Qerror_conditions,
1907 Fcons (Qcyclic_function_indirection, Fcons (Qerror, Qnil)));
1908 Fput (Qcyclic_function_indirection, Qerror_message,
1909 build_string ("Symbol's chain of function indirections contains a loop"));
1910
1911 Fput (Qvoid_variable, Qerror_conditions,
1912 Fcons (Qvoid_variable, Fcons (Qerror, Qnil)));
1913 Fput (Qvoid_variable, Qerror_message,
1914 build_string ("Symbol's value as variable is void"));
1915
1916 Fput (Qsetting_constant, Qerror_conditions,
1917 Fcons (Qsetting_constant, Fcons (Qerror, Qnil)));
1918 Fput (Qsetting_constant, Qerror_message,
1919 build_string ("Attempt to set a constant symbol"));
1920
1921 Fput (Qinvalid_read_syntax, Qerror_conditions,
1922 Fcons (Qinvalid_read_syntax, Fcons (Qerror, Qnil)));
1923 Fput (Qinvalid_read_syntax, Qerror_message,
1924 build_string ("Invalid read syntax"));
1925
1926 Fput (Qinvalid_function, Qerror_conditions,
1927 Fcons (Qinvalid_function, Fcons (Qerror, Qnil)));
1928 Fput (Qinvalid_function, Qerror_message,
1929 build_string ("Invalid function"));
1930
1931 Fput (Qwrong_number_of_arguments, Qerror_conditions,
1932 Fcons (Qwrong_number_of_arguments, Fcons (Qerror, Qnil)));
1933 Fput (Qwrong_number_of_arguments, Qerror_message,
1934 build_string ("Wrong number of arguments"));
1935
1936 Fput (Qno_catch, Qerror_conditions,
1937 Fcons (Qno_catch, Fcons (Qerror, Qnil)));
1938 Fput (Qno_catch, Qerror_message,
1939 build_string ("No catch for tag"));
1940
1941 Fput (Qend_of_file, Qerror_conditions,
1942 Fcons (Qend_of_file, Fcons (Qerror, Qnil)));
1943 Fput (Qend_of_file, Qerror_message,
1944 build_string ("End of file during parsing"));
1945
1946 Fput (Qarith_error, Qerror_conditions,
1947 Fcons (Qarith_error, Fcons (Qerror, Qnil)));
1948 Fput (Qarith_error, Qerror_message,
1949 build_string ("Arithmetic error"));
1950
1951 Fput (Qbeginning_of_buffer, Qerror_conditions,
1952 Fcons (Qbeginning_of_buffer, Fcons (Qerror, Qnil)));
1953 Fput (Qbeginning_of_buffer, Qerror_message,
1954 build_string ("Beginning of buffer"));
1955
1956 Fput (Qend_of_buffer, Qerror_conditions,
1957 Fcons (Qend_of_buffer, Fcons (Qerror, Qnil)));
1958 Fput (Qend_of_buffer, Qerror_message,
1959 build_string ("End of buffer"));
1960
1961 Fput (Qbuffer_read_only, Qerror_conditions,
1962 Fcons (Qbuffer_read_only, Fcons (Qerror, Qnil)));
1963 Fput (Qbuffer_read_only, Qerror_message,
1964 build_string ("Buffer is read-only"));
1965
1966 staticpro (&Qnil);
1967 staticpro (&Qt);
1968 staticpro (&Qquote);
1969 staticpro (&Qlambda);
1970 staticpro (&Qsubr);
1971 staticpro (&Qunbound);
1972 staticpro (&Qerror_conditions);
1973 staticpro (&Qerror_message);
1974 staticpro (&Qtop_level);
1975
1976 staticpro (&Qerror);
1977 staticpro (&Qquit);
1978 staticpro (&Qwrong_type_argument);
1979 staticpro (&Qargs_out_of_range);
1980 staticpro (&Qvoid_function);
1981 staticpro (&Qcyclic_function_indirection);
1982 staticpro (&Qvoid_variable);
1983 staticpro (&Qsetting_constant);
1984 staticpro (&Qinvalid_read_syntax);
1985 staticpro (&Qwrong_number_of_arguments);
1986 staticpro (&Qinvalid_function);
1987 staticpro (&Qno_catch);
1988 staticpro (&Qend_of_file);
1989 staticpro (&Qarith_error);
1990 staticpro (&Qbeginning_of_buffer);
1991 staticpro (&Qend_of_buffer);
1992 staticpro (&Qbuffer_read_only);
1993
1994 staticpro (&Qlistp);
1995 staticpro (&Qconsp);
1996 staticpro (&Qsymbolp);
1997 staticpro (&Qintegerp);
1998 staticpro (&Qnatnump);
1999 staticpro (&Qstringp);
2000 staticpro (&Qarrayp);
2001 staticpro (&Qsequencep);
2002 staticpro (&Qbufferp);
2003 staticpro (&Qvectorp);
2004 staticpro (&Qchar_or_string_p);
2005 staticpro (&Qmarkerp);
2006 staticpro (&Qbuffer_or_string_p);
2007 staticpro (&Qinteger_or_marker_p);
2008 #ifdef LISP_FLOAT_TYPE
2009 staticpro (&Qfloatp);
2010 staticpro (&Qnumberp);
2011 staticpro (&Qnumber_or_marker_p);
2012 #endif /* LISP_FLOAT_TYPE */
2013
2014 staticpro (&Qboundp);
2015 staticpro (&Qfboundp);
2016 staticpro (&Qcdr);
2017
2018 defsubr (&Seq);
2019 defsubr (&Snull);
2020 defsubr (&Slistp);
2021 defsubr (&Snlistp);
2022 defsubr (&Sconsp);
2023 defsubr (&Satom);
2024 defsubr (&Sintegerp);
2025 defsubr (&Sinteger_or_marker_p);
2026 defsubr (&Snumberp);
2027 defsubr (&Snumber_or_marker_p);
2028 #ifdef LISP_FLOAT_TYPE
2029 defsubr (&Sfloatp);
2030 #endif /* LISP_FLOAT_TYPE */
2031 defsubr (&Snatnump);
2032 defsubr (&Ssymbolp);
2033 defsubr (&Sstringp);
2034 defsubr (&Svectorp);
2035 defsubr (&Sarrayp);
2036 defsubr (&Ssequencep);
2037 defsubr (&Sbufferp);
2038 defsubr (&Smarkerp);
2039 defsubr (&Ssubrp);
2040 defsubr (&Scompiled_function_p);
2041 defsubr (&Schar_or_string_p);
2042 defsubr (&Scar);
2043 defsubr (&Scdr);
2044 defsubr (&Scar_safe);
2045 defsubr (&Scdr_safe);
2046 defsubr (&Ssetcar);
2047 defsubr (&Ssetcdr);
2048 defsubr (&Ssymbol_function);
2049 defsubr (&Sindirect_function);
2050 defsubr (&Ssymbol_plist);
2051 defsubr (&Ssymbol_name);
2052 defsubr (&Smakunbound);
2053 defsubr (&Sfmakunbound);
2054 defsubr (&Sboundp);
2055 defsubr (&Sfboundp);
2056 defsubr (&Sfset);
2057 defsubr (&Ssetplist);
2058 defsubr (&Ssymbol_value);
2059 defsubr (&Sset);
2060 defsubr (&Sdefault_boundp);
2061 defsubr (&Sdefault_value);
2062 defsubr (&Sset_default);
2063 defsubr (&Ssetq_default);
2064 defsubr (&Smake_variable_buffer_local);
2065 defsubr (&Smake_local_variable);
2066 defsubr (&Skill_local_variable);
2067 defsubr (&Saref);
2068 defsubr (&Saset);
2069 defsubr (&Sint_to_string);
2070 defsubr (&Sstring_to_int);
2071 defsubr (&Seqlsign);
2072 defsubr (&Slss);
2073 defsubr (&Sgtr);
2074 defsubr (&Sleq);
2075 defsubr (&Sgeq);
2076 defsubr (&Sneq);
2077 defsubr (&Szerop);
2078 defsubr (&Splus);
2079 defsubr (&Sminus);
2080 defsubr (&Stimes);
2081 defsubr (&Squo);
2082 defsubr (&Srem);
2083 defsubr (&Smax);
2084 defsubr (&Smin);
2085 defsubr (&Slogand);
2086 defsubr (&Slogior);
2087 defsubr (&Slogxor);
2088 defsubr (&Slsh);
2089 defsubr (&Sash);
2090 defsubr (&Sadd1);
2091 defsubr (&Ssub1);
2092 defsubr (&Slognot);
2093 }
2094
2095 SIGTYPE
2096 arith_error (signo)
2097 int signo;
2098 {
2099 #ifdef USG
2100 /* USG systems forget handlers when they are used;
2101 must reestablish each time */
2102 signal (signo, arith_error);
2103 #endif /* USG */
2104 #ifdef VMS
2105 /* VMS systems are like USG. */
2106 signal (signo, arith_error);
2107 #endif /* VMS */
2108 #ifdef BSD4_1
2109 sigrelse (SIGFPE);
2110 #else /* not BSD4_1 */
2111 sigsetmask (SIGEMPTYMASK);
2112 #endif /* not BSD4_1 */
2113
2114 Fsignal (Qarith_error, Qnil);
2115 }
2116
2117 init_data ()
2118 {
2119 /* Don't do this if just dumping out.
2120 We don't want to call `signal' in this case
2121 so that we don't have trouble with dumping
2122 signal-delivering routines in an inconsistent state. */
2123 #ifndef CANNOT_DUMP
2124 if (!initialized)
2125 return;
2126 #endif /* CANNOT_DUMP */
2127 signal (SIGFPE, arith_error);
2128
2129 #ifdef uts
2130 signal (SIGEMT, arith_error);
2131 #endif /* uts */
2132 }