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