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