1 /* Primitive operations on Lisp data types for GNU Emacs Lisp interpreter.
2 Copyright (C) 1985,86,88,93,94,95,97,98,99,2000 Free Software Foundation, Inc.
4 This file is part of GNU Emacs.
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 2, or (at your option)
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.
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, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
31 #include "syssignal.h"
37 /* If IEEE_FLOATING_POINT isn't defined, default it from FLT_*. */
38 #ifndef IEEE_FLOATING_POINT
39 #if (FLT_RADIX == 2 && FLT_MANT_DIG == 24 \
40 && FLT_MIN_EXP == -125 && FLT_MAX_EXP == 128)
41 #define IEEE_FLOATING_POINT 1
43 #define IEEE_FLOATING_POINT 0
47 /* Work around a problem that happens because math.h on hpux 7
48 defines two static variables--which, in Emacs, are not really static,
49 because `static' is defined as nothing. The problem is that they are
50 here, in floatfns.c, and in lread.c.
51 These macros prevent the name conflict. */
52 #if defined (HPUX) && !defined (HPUX8)
53 #define _MAXLDBL data_c_maxldbl
54 #define _NMAXLDBL data_c_nmaxldbl
60 extern double atof ();
63 Lisp_Object Qnil
, Qt
, Qquote
, Qlambda
, Qsubr
, Qunbound
;
64 Lisp_Object Qerror_conditions
, Qerror_message
, Qtop_level
;
65 Lisp_Object Qerror
, Qquit
, Qwrong_type_argument
, Qargs_out_of_range
;
66 Lisp_Object Qvoid_variable
, Qvoid_function
, Qcyclic_function_indirection
;
67 Lisp_Object Qsetting_constant
, Qinvalid_read_syntax
;
68 Lisp_Object Qinvalid_function
, Qwrong_number_of_arguments
, Qno_catch
;
69 Lisp_Object Qend_of_file
, Qarith_error
, Qmark_inactive
;
70 Lisp_Object Qbeginning_of_buffer
, Qend_of_buffer
, Qbuffer_read_only
;
71 Lisp_Object Qtext_read_only
;
72 Lisp_Object Qintegerp
, Qnatnump
, Qwholenump
, Qsymbolp
, Qlistp
, Qconsp
;
73 Lisp_Object Qstringp
, Qarrayp
, Qsequencep
, Qbufferp
;
74 Lisp_Object Qchar_or_string_p
, Qmarkerp
, Qinteger_or_marker_p
, Qvectorp
;
75 Lisp_Object Qbuffer_or_string_p
, Qkeywordp
;
76 Lisp_Object Qboundp
, Qfboundp
;
77 Lisp_Object Qchar_table_p
, Qvector_or_char_table_p
;
80 Lisp_Object Qad_advice_info
, Qad_activate_internal
;
82 Lisp_Object Qrange_error
, Qdomain_error
, Qsingularity_error
;
83 Lisp_Object Qoverflow_error
, Qunderflow_error
;
86 Lisp_Object Qnumberp
, Qnumber_or_marker_p
;
88 static Lisp_Object Qinteger
, Qsymbol
, Qstring
, Qcons
, Qmarker
, Qoverlay
;
89 static Lisp_Object Qfloat
, Qwindow_configuration
, Qwindow
;
91 static Lisp_Object Qcompiled_function
, Qbuffer
, Qframe
, Qvector
;
92 static Lisp_Object Qchar_table
, Qbool_vector
, Qhash_table
;
93 static Lisp_Object Qsubrp
, Qmany
, Qunevalled
;
95 static Lisp_Object
swap_in_symval_forwarding ();
97 Lisp_Object
set_internal ();
100 wrong_type_argument (predicate
, value
)
101 register Lisp_Object predicate
, value
;
103 register Lisp_Object tem
;
106 if (!EQ (Vmocklisp_arguments
, Qt
))
108 if (STRINGP (value
) &&
109 (EQ (predicate
, Qintegerp
) || EQ (predicate
, Qinteger_or_marker_p
)))
110 return Fstring_to_number (value
, Qnil
);
111 if (INTEGERP (value
) && EQ (predicate
, Qstringp
))
112 return Fnumber_to_string (value
);
115 /* If VALUE is not even a valid Lisp object, abort here
116 where we can get a backtrace showing where it came from. */
117 if ((unsigned int) XGCTYPE (value
) >= Lisp_Type_Limit
)
120 value
= Fsignal (Qwrong_type_argument
, Fcons (predicate
, Fcons (value
, Qnil
)));
121 tem
= call1 (predicate
, value
);
130 error ("Attempt to modify read-only object");
134 args_out_of_range (a1
, a2
)
138 Fsignal (Qargs_out_of_range
, Fcons (a1
, Fcons (a2
, Qnil
)));
142 args_out_of_range_3 (a1
, a2
, a3
)
143 Lisp_Object a1
, a2
, a3
;
146 Fsignal (Qargs_out_of_range
, Fcons (a1
, Fcons (a2
, Fcons (a3
, Qnil
))));
149 /* On some machines, XINT needs a temporary location.
150 Here it is, in case it is needed. */
152 int sign_extend_temp
;
154 /* On a few machines, XINT can only be done by calling this. */
157 sign_extend_lisp_int (num
)
160 if (num
& (((EMACS_INT
) 1) << (VALBITS
- 1)))
161 return num
| (((EMACS_INT
) (-1)) << VALBITS
);
163 return num
& ((((EMACS_INT
) 1) << VALBITS
) - 1);
166 /* Data type predicates */
168 DEFUN ("eq", Feq
, Seq
, 2, 2, 0,
169 "Return t if the two args are the same Lisp object.")
171 Lisp_Object obj1
, obj2
;
178 DEFUN ("null", Fnull
, Snull
, 1, 1, 0, "Return t if OBJECT is nil.")
187 DEFUN ("type-of", Ftype_of
, Stype_of
, 1, 1, 0,
188 "Return a symbol representing the type of OBJECT.\n\
189 The symbol returned names the object's basic type;\n\
190 for example, (type-of 1) returns `integer'.")
194 switch (XGCTYPE (object
))
209 switch (XMISCTYPE (object
))
211 case Lisp_Misc_Marker
:
213 case Lisp_Misc_Overlay
:
215 case Lisp_Misc_Float
:
220 case Lisp_Vectorlike
:
221 if (GC_WINDOW_CONFIGURATIONP (object
))
222 return Qwindow_configuration
;
223 if (GC_PROCESSP (object
))
225 if (GC_WINDOWP (object
))
227 if (GC_SUBRP (object
))
229 if (GC_COMPILEDP (object
))
230 return Qcompiled_function
;
231 if (GC_BUFFERP (object
))
233 if (GC_CHAR_TABLE_P (object
))
235 if (GC_BOOL_VECTOR_P (object
))
237 if (GC_FRAMEP (object
))
239 if (GC_HASH_TABLE_P (object
))
251 DEFUN ("consp", Fconsp
, Sconsp
, 1, 1, 0, "Return t if OBJECT is a cons cell.")
260 DEFUN ("atom", Fatom
, Satom
, 1, 1, 0,
261 "Return t if OBJECT is not a cons cell. This includes nil.")
270 DEFUN ("listp", Flistp
, Slistp
, 1, 1, 0,
271 "Return t if OBJECT is a list. This includes nil.")
275 if (CONSP (object
) || NILP (object
))
280 DEFUN ("nlistp", Fnlistp
, Snlistp
, 1, 1, 0,
281 "Return t if OBJECT is not a list. Lists include nil.")
285 if (CONSP (object
) || NILP (object
))
290 DEFUN ("symbolp", Fsymbolp
, Ssymbolp
, 1, 1, 0,
291 "Return t if OBJECT is a symbol.")
295 if (SYMBOLP (object
))
300 /* Define this in C to avoid unnecessarily consing up the symbol
302 DEFUN ("keywordp", Fkeywordp
, Skeywordp
, 1, 1, 0,
303 "Return t if OBJECT is a keyword.\n\
304 This means that it is a symbol with a print name beginning with `:'\n\
305 interned in the initial obarray.")
310 && XSYMBOL (object
)->name
->data
[0] == ':'
311 && EQ (XSYMBOL (object
)->obarray
, initial_obarray
))
316 DEFUN ("vectorp", Fvectorp
, Svectorp
, 1, 1, 0,
317 "Return t if OBJECT is a vector.")
321 if (VECTORP (object
))
326 DEFUN ("stringp", Fstringp
, Sstringp
, 1, 1, 0,
327 "Return t if OBJECT is a string.")
331 if (STRINGP (object
))
336 DEFUN ("multibyte-string-p", Fmultibyte_string_p
, Smultibyte_string_p
,
337 1, 1, 0, "Return t if OBJECT is a multibyte string.")
341 if (STRINGP (object
) && STRING_MULTIBYTE (object
))
346 DEFUN ("char-table-p", Fchar_table_p
, Schar_table_p
, 1, 1, 0,
347 "Return t if OBJECT is a char-table.")
351 if (CHAR_TABLE_P (object
))
356 DEFUN ("vector-or-char-table-p", Fvector_or_char_table_p
,
357 Svector_or_char_table_p
, 1, 1, 0,
358 "Return t if OBJECT is a char-table or vector.")
362 if (VECTORP (object
) || CHAR_TABLE_P (object
))
367 DEFUN ("bool-vector-p", Fbool_vector_p
, Sbool_vector_p
, 1, 1, 0, "Return t if OBJECT is a bool-vector.")
371 if (BOOL_VECTOR_P (object
))
376 DEFUN ("arrayp", Farrayp
, Sarrayp
, 1, 1, 0, "Return t if OBJECT is an array (string or vector).")
380 if (VECTORP (object
) || STRINGP (object
)
381 || CHAR_TABLE_P (object
) || BOOL_VECTOR_P (object
))
386 DEFUN ("sequencep", Fsequencep
, Ssequencep
, 1, 1, 0,
387 "Return t if OBJECT is a sequence (list or array).")
389 register Lisp_Object object
;
391 if (CONSP (object
) || NILP (object
) || VECTORP (object
) || STRINGP (object
)
392 || CHAR_TABLE_P (object
) || BOOL_VECTOR_P (object
))
397 DEFUN ("bufferp", Fbufferp
, Sbufferp
, 1, 1, 0, "Return t if OBJECT is an editor buffer.")
401 if (BUFFERP (object
))
406 DEFUN ("markerp", Fmarkerp
, Smarkerp
, 1, 1, 0, "Return t if OBJECT is a marker (editor pointer).")
410 if (MARKERP (object
))
415 DEFUN ("subrp", Fsubrp
, Ssubrp
, 1, 1, 0, "Return t if OBJECT is a built-in function.")
424 DEFUN ("byte-code-function-p", Fbyte_code_function_p
, Sbyte_code_function_p
,
425 1, 1, 0, "Return t if OBJECT is a byte-compiled function object.")
429 if (COMPILEDP (object
))
434 DEFUN ("char-or-string-p", Fchar_or_string_p
, Schar_or_string_p
, 1, 1, 0,
435 "Return t if OBJECT is a character (an integer) or a string.")
437 register Lisp_Object object
;
439 if (INTEGERP (object
) || STRINGP (object
))
444 DEFUN ("integerp", Fintegerp
, Sintegerp
, 1, 1, 0, "Return t if OBJECT is an integer.")
448 if (INTEGERP (object
))
453 DEFUN ("integer-or-marker-p", Finteger_or_marker_p
, Sinteger_or_marker_p
, 1, 1, 0,
454 "Return t if OBJECT is an integer or a marker (editor pointer).")
456 register Lisp_Object object
;
458 if (MARKERP (object
) || INTEGERP (object
))
463 DEFUN ("natnump", Fnatnump
, Snatnump
, 1, 1, 0,
464 "Return t if OBJECT is a nonnegative integer.")
468 if (NATNUMP (object
))
473 DEFUN ("numberp", Fnumberp
, Snumberp
, 1, 1, 0,
474 "Return t if OBJECT is a number (floating point or integer).")
478 if (NUMBERP (object
))
484 DEFUN ("number-or-marker-p", Fnumber_or_marker_p
,
485 Snumber_or_marker_p
, 1, 1, 0,
486 "Return t if OBJECT is a number or a marker.")
490 if (NUMBERP (object
) || MARKERP (object
))
495 DEFUN ("floatp", Ffloatp
, Sfloatp
, 1, 1, 0,
496 "Return t if OBJECT is a floating point number.")
506 /* Extract and set components of lists */
508 DEFUN ("car", Fcar
, Scar
, 1, 1, 0,
509 "Return the car of LIST. If arg is nil, return nil.\n\
510 Error if arg is not nil and not a cons cell. See also `car-safe'.")
512 register Lisp_Object list
;
518 else if (EQ (list
, Qnil
))
521 list
= wrong_type_argument (Qlistp
, list
);
525 DEFUN ("car-safe", Fcar_safe
, Scar_safe
, 1, 1, 0,
526 "Return the car of OBJECT if it is a cons cell, or else nil.")
531 return XCAR (object
);
536 DEFUN ("cdr", Fcdr
, Scdr
, 1, 1, 0,
537 "Return the cdr of LIST. If arg is nil, return nil.\n\
538 Error if arg is not nil and not a cons cell. See also `cdr-safe'.")
541 register Lisp_Object list
;
547 else if (EQ (list
, Qnil
))
550 list
= wrong_type_argument (Qlistp
, list
);
554 DEFUN ("cdr-safe", Fcdr_safe
, Scdr_safe
, 1, 1, 0,
555 "Return the cdr of OBJECT if it is a cons cell, or else nil.")
560 return XCDR (object
);
565 DEFUN ("setcar", Fsetcar
, Ssetcar
, 2, 2, 0,
566 "Set the car of CELL to be NEWCAR. Returns NEWCAR.")
568 register Lisp_Object cell
, newcar
;
571 cell
= wrong_type_argument (Qconsp
, cell
);
574 XCAR (cell
) = newcar
;
578 DEFUN ("setcdr", Fsetcdr
, Ssetcdr
, 2, 2, 0,
579 "Set the cdr of CELL to be NEWCDR. Returns NEWCDR.")
581 register Lisp_Object cell
, newcdr
;
584 cell
= wrong_type_argument (Qconsp
, cell
);
587 XCDR (cell
) = newcdr
;
591 /* Extract and set components of symbols */
593 DEFUN ("boundp", Fboundp
, Sboundp
, 1, 1, 0, "Return t if SYMBOL's value is not void.")
595 register Lisp_Object symbol
;
597 Lisp_Object valcontents
;
598 CHECK_SYMBOL (symbol
, 0);
600 valcontents
= XSYMBOL (symbol
)->value
;
602 if (BUFFER_LOCAL_VALUEP (valcontents
)
603 || SOME_BUFFER_LOCAL_VALUEP (valcontents
))
604 valcontents
= swap_in_symval_forwarding (symbol
, valcontents
);
606 return (EQ (valcontents
, Qunbound
) ? Qnil
: Qt
);
609 DEFUN ("fboundp", Ffboundp
, Sfboundp
, 1, 1, 0, "Return t if SYMBOL's function definition is not void.")
611 register Lisp_Object symbol
;
613 CHECK_SYMBOL (symbol
, 0);
614 return (EQ (XSYMBOL (symbol
)->function
, Qunbound
) ? Qnil
: Qt
);
617 DEFUN ("makunbound", Fmakunbound
, Smakunbound
, 1, 1, 0, "Make SYMBOL's value be void.")
619 register Lisp_Object symbol
;
621 CHECK_SYMBOL (symbol
, 0);
622 if (NILP (symbol
) || EQ (symbol
, Qt
)
623 || (XSYMBOL (symbol
)->name
->data
[0] == ':'
624 && EQ (XSYMBOL (symbol
)->obarray
, initial_obarray
)))
625 return Fsignal (Qsetting_constant
, Fcons (symbol
, Qnil
));
626 Fset (symbol
, Qunbound
);
630 DEFUN ("fmakunbound", Ffmakunbound
, Sfmakunbound
, 1, 1, 0, "Make SYMBOL's function definition be void.")
632 register Lisp_Object symbol
;
634 CHECK_SYMBOL (symbol
, 0);
635 if (NILP (symbol
) || EQ (symbol
, Qt
))
636 return Fsignal (Qsetting_constant
, Fcons (symbol
, Qnil
));
637 XSYMBOL (symbol
)->function
= Qunbound
;
641 DEFUN ("symbol-function", Fsymbol_function
, Ssymbol_function
, 1, 1, 0,
642 "Return SYMBOL's function definition. Error if that is void.")
644 register Lisp_Object symbol
;
646 CHECK_SYMBOL (symbol
, 0);
647 if (EQ (XSYMBOL (symbol
)->function
, Qunbound
))
648 return Fsignal (Qvoid_function
, Fcons (symbol
, Qnil
));
649 return XSYMBOL (symbol
)->function
;
652 DEFUN ("symbol-plist", Fsymbol_plist
, Ssymbol_plist
, 1, 1, 0, "Return SYMBOL's property list.")
654 register Lisp_Object symbol
;
656 CHECK_SYMBOL (symbol
, 0);
657 return XSYMBOL (symbol
)->plist
;
660 DEFUN ("symbol-name", Fsymbol_name
, Ssymbol_name
, 1, 1, 0, "Return SYMBOL's name, a string.")
662 register Lisp_Object symbol
;
664 register Lisp_Object name
;
666 CHECK_SYMBOL (symbol
, 0);
667 XSETSTRING (name
, XSYMBOL (symbol
)->name
);
671 DEFUN ("fset", Ffset
, Sfset
, 2, 2, 0,
672 "Set SYMBOL's function definition to DEFINITION, and return DEFINITION.")
674 register Lisp_Object symbol
, definition
;
676 CHECK_SYMBOL (symbol
, 0);
677 if (NILP (symbol
) || EQ (symbol
, Qt
))
678 return Fsignal (Qsetting_constant
, Fcons (symbol
, Qnil
));
679 if (!NILP (Vautoload_queue
) && !EQ (XSYMBOL (symbol
)->function
, Qunbound
))
680 Vautoload_queue
= Fcons (Fcons (symbol
, XSYMBOL (symbol
)->function
),
682 XSYMBOL (symbol
)->function
= definition
;
683 /* Handle automatic advice activation */
684 if (CONSP (XSYMBOL (symbol
)->plist
) && !NILP (Fget (symbol
, Qad_advice_info
)))
686 call2 (Qad_activate_internal
, symbol
, Qnil
);
687 definition
= XSYMBOL (symbol
)->function
;
692 DEFUN ("defalias", Fdefalias
, Sdefalias
, 2, 2, 0,
693 "Set SYMBOL's function definition to DEFINITION, and return DEFINITION.\n\
694 Associates the function with the current load file, if any.")
696 register Lisp_Object symbol
, definition
;
698 definition
= Ffset (symbol
, definition
);
699 LOADHIST_ATTACH (symbol
);
703 DEFUN ("setplist", Fsetplist
, Ssetplist
, 2, 2, 0,
704 "Set SYMBOL's property list to NEWVAL, and return NEWVAL.")
706 register Lisp_Object symbol
, newplist
;
708 CHECK_SYMBOL (symbol
, 0);
709 XSYMBOL (symbol
)->plist
= newplist
;
713 DEFUN ("subr-arity", Fsubr_arity
, Ssubr_arity
, 1, 1, 0,
714 "Return minimum and maximum number of args allowed for SUBR.\n\
715 SUBR must be a built-in function.\n\
716 The returned value is a pair (MIN . MAX). MIN is the minimum number\n\
717 of args. MAX is the maximum number or the symbol `many', for a\n\
718 function with `&rest' args, or `unevalled' for a special form.")
722 short minargs
, maxargs
;
724 wrong_type_argument (Qsubrp
, subr
);
725 minargs
= XSUBR (subr
)->min_args
;
726 maxargs
= XSUBR (subr
)->max_args
;
728 return Fcons (make_number (minargs
), Qmany
);
729 else if (maxargs
== UNEVALLED
)
730 return Fcons (make_number (minargs
), Qunevalled
);
732 return Fcons (make_number (minargs
), make_number (maxargs
));
736 /* Getting and setting values of symbols */
738 /* Given the raw contents of a symbol value cell,
739 return the Lisp value of the symbol.
740 This does not handle buffer-local variables; use
741 swap_in_symval_forwarding for that. */
744 do_symval_forwarding (valcontents
)
745 register Lisp_Object valcontents
;
747 register Lisp_Object val
;
749 if (MISCP (valcontents
))
750 switch (XMISCTYPE (valcontents
))
752 case Lisp_Misc_Intfwd
:
753 XSETINT (val
, *XINTFWD (valcontents
)->intvar
);
756 case Lisp_Misc_Boolfwd
:
757 return (*XBOOLFWD (valcontents
)->boolvar
? Qt
: Qnil
);
759 case Lisp_Misc_Objfwd
:
760 return *XOBJFWD (valcontents
)->objvar
;
762 case Lisp_Misc_Buffer_Objfwd
:
763 offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
764 return PER_BUFFER_VALUE (current_buffer
, offset
);
766 case Lisp_Misc_Kboard_Objfwd
:
767 offset
= XKBOARD_OBJFWD (valcontents
)->offset
;
768 return *(Lisp_Object
*)(offset
+ (char *)current_kboard
);
773 /* Store NEWVAL into SYMBOL, where VALCONTENTS is found in the value cell
774 of SYMBOL. If SYMBOL is buffer-local, VALCONTENTS should be the
775 buffer-independent contents of the value cell: forwarded just one
776 step past the buffer-localness. */
779 store_symval_forwarding (symbol
, valcontents
, newval
)
781 register Lisp_Object valcontents
, newval
;
783 switch (SWITCH_ENUM_CAST (XTYPE (valcontents
)))
786 switch (XMISCTYPE (valcontents
))
788 case Lisp_Misc_Intfwd
:
789 CHECK_NUMBER (newval
, 1);
790 *XINTFWD (valcontents
)->intvar
= XINT (newval
);
791 if (*XINTFWD (valcontents
)->intvar
!= XINT (newval
))
792 error ("Value out of range for variable `%s'",
793 XSYMBOL (symbol
)->name
->data
);
796 case Lisp_Misc_Boolfwd
:
797 *XBOOLFWD (valcontents
)->boolvar
= NILP (newval
) ? 0 : 1;
800 case Lisp_Misc_Objfwd
:
801 *XOBJFWD (valcontents
)->objvar
= newval
;
804 case Lisp_Misc_Buffer_Objfwd
:
806 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
809 type
= PER_BUFFER_TYPE (offset
);
810 if (XINT (type
) == -1)
811 error ("Variable %s is read-only", XSYMBOL (symbol
)->name
->data
);
813 if (! NILP (type
) && ! NILP (newval
)
814 && XTYPE (newval
) != XINT (type
))
815 buffer_slot_type_mismatch (offset
);
817 PER_BUFFER_VALUE (current_buffer
, offset
) = newval
;
821 case Lisp_Misc_Kboard_Objfwd
:
822 (*(Lisp_Object
*)((char *)current_kboard
823 + XKBOARD_OBJFWD (valcontents
)->offset
))
834 valcontents
= XSYMBOL (symbol
)->value
;
835 if (BUFFER_LOCAL_VALUEP (valcontents
)
836 || SOME_BUFFER_LOCAL_VALUEP (valcontents
))
837 XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
= newval
;
839 XSYMBOL (symbol
)->value
= newval
;
843 /* Set up SYMBOL to refer to its global binding.
844 This makes it safe to alter the status of other bindings. */
847 swap_in_global_binding (symbol
)
850 Lisp_Object valcontents
, cdr
;
852 valcontents
= XSYMBOL (symbol
)->value
;
853 if (!BUFFER_LOCAL_VALUEP (valcontents
)
854 && !SOME_BUFFER_LOCAL_VALUEP (valcontents
))
856 cdr
= XBUFFER_LOCAL_VALUE (valcontents
)->cdr
;
858 /* Unload the previously loaded binding. */
860 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
));
862 /* Select the global binding in the symbol. */
864 store_symval_forwarding (symbol
, valcontents
, XCDR (cdr
));
866 /* Indicate that the global binding is set up now. */
867 XBUFFER_LOCAL_VALUE (valcontents
)->frame
= Qnil
;
868 XBUFFER_LOCAL_VALUE (valcontents
)->buffer
= Qnil
;
869 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_frame
= 0;
870 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 0;
873 /* Set up the buffer-local symbol SYMBOL for validity in the current buffer.
874 VALCONTENTS is the contents of its value cell,
875 which points to a struct Lisp_Buffer_Local_Value.
877 Return the value forwarded one step past the buffer-local stage.
878 This could be another forwarding pointer. */
881 swap_in_symval_forwarding (symbol
, valcontents
)
882 Lisp_Object symbol
, valcontents
;
884 register Lisp_Object tem1
;
885 tem1
= XBUFFER_LOCAL_VALUE (valcontents
)->buffer
;
888 || current_buffer
!= XBUFFER (tem1
)
889 || (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
890 && ! EQ (selected_frame
, XBUFFER_LOCAL_VALUE (valcontents
)->frame
)))
892 /* Unload the previously loaded binding. */
893 tem1
= XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
895 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
));
896 /* Choose the new binding. */
897 tem1
= assq_no_quit (symbol
, current_buffer
->local_var_alist
);
898 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_frame
= 0;
899 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 0;
902 if (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
)
903 tem1
= assq_no_quit (symbol
, XFRAME (selected_frame
)->param_alist
);
905 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_frame
= 1;
907 tem1
= XBUFFER_LOCAL_VALUE (valcontents
)->cdr
;
910 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 1;
912 /* Load the new binding. */
913 XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
) = tem1
;
914 XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents
)->buffer
, current_buffer
);
915 XBUFFER_LOCAL_VALUE (valcontents
)->frame
= selected_frame
;
916 store_symval_forwarding (symbol
,
917 XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
,
920 return XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
;
923 /* Find the value of a symbol, returning Qunbound if it's not bound.
924 This is helpful for code which just wants to get a variable's value
925 if it has one, without signaling an error.
926 Note that it must not be possible to quit
927 within this function. Great care is required for this. */
930 find_symbol_value (symbol
)
933 register Lisp_Object valcontents
;
934 register Lisp_Object val
;
935 CHECK_SYMBOL (symbol
, 0);
936 valcontents
= XSYMBOL (symbol
)->value
;
938 if (BUFFER_LOCAL_VALUEP (valcontents
)
939 || SOME_BUFFER_LOCAL_VALUEP (valcontents
))
940 valcontents
= swap_in_symval_forwarding (symbol
, valcontents
,
943 if (MISCP (valcontents
))
945 switch (XMISCTYPE (valcontents
))
947 case Lisp_Misc_Intfwd
:
948 XSETINT (val
, *XINTFWD (valcontents
)->intvar
);
951 case Lisp_Misc_Boolfwd
:
952 return (*XBOOLFWD (valcontents
)->boolvar
? Qt
: Qnil
);
954 case Lisp_Misc_Objfwd
:
955 return *XOBJFWD (valcontents
)->objvar
;
957 case Lisp_Misc_Buffer_Objfwd
:
958 return PER_BUFFER_VALUE (current_buffer
,
959 XBUFFER_OBJFWD (valcontents
)->offset
);
961 case Lisp_Misc_Kboard_Objfwd
:
962 return *(Lisp_Object
*)(XKBOARD_OBJFWD (valcontents
)->offset
963 + (char *)current_kboard
);
970 DEFUN ("symbol-value", Fsymbol_value
, Ssymbol_value
, 1, 1, 0,
971 "Return SYMBOL's value. Error if that is void.")
977 val
= find_symbol_value (symbol
);
978 if (EQ (val
, Qunbound
))
979 return Fsignal (Qvoid_variable
, Fcons (symbol
, Qnil
));
984 DEFUN ("set", Fset
, Sset
, 2, 2, 0,
985 "Set SYMBOL's value to NEWVAL, and return NEWVAL.")
987 register Lisp_Object symbol
, newval
;
989 return set_internal (symbol
, newval
, current_buffer
, 0);
992 /* Return 1 if SYMBOL currently has a let-binding
993 which was made in the buffer that is now current. */
996 let_shadows_buffer_binding_p (symbol
)
999 struct specbinding
*p
;
1001 for (p
= specpdl_ptr
- 1; p
>= specpdl
; p
--)
1003 && CONSP (p
->symbol
)
1004 && EQ (symbol
, XCAR (p
->symbol
))
1005 && XBUFFER (XCDR (XCDR (p
->symbol
))) == current_buffer
)
1011 /* Store the value NEWVAL into SYMBOL.
1012 If buffer-locality is an issue, BUF specifies which buffer to use.
1013 (0 stands for the current buffer.)
1015 If BINDFLAG is zero, then if this symbol is supposed to become
1016 local in every buffer where it is set, then we make it local.
1017 If BINDFLAG is nonzero, we don't do that. */
1020 set_internal (symbol
, newval
, buf
, bindflag
)
1021 register Lisp_Object symbol
, newval
;
1025 int voide
= EQ (newval
, Qunbound
);
1027 register Lisp_Object valcontents
, innercontents
, tem1
, current_alist_element
;
1030 buf
= current_buffer
;
1032 /* If restoring in a dead buffer, do nothing. */
1033 if (NILP (buf
->name
))
1036 CHECK_SYMBOL (symbol
, 0);
1037 if (NILP (symbol
) || EQ (symbol
, Qt
)
1038 || (XSYMBOL (symbol
)->name
->data
[0] == ':'
1039 && EQ (XSYMBOL (symbol
)->obarray
, initial_obarray
)
1040 && !EQ (newval
, symbol
)))
1041 return Fsignal (Qsetting_constant
, Fcons (symbol
, Qnil
));
1043 innercontents
= valcontents
= XSYMBOL (symbol
)->value
;
1045 if (BUFFER_OBJFWDP (valcontents
))
1047 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1048 int idx
= PER_BUFFER_IDX (offset
);
1051 && !let_shadows_buffer_binding_p (symbol
))
1052 SET_PER_BUFFER_VALUE_P (buf
, idx
, 1);
1055 else if (BUFFER_LOCAL_VALUEP (valcontents
)
1056 || SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1058 /* valcontents is a struct Lisp_Buffer_Local_Value. */
1060 /* What binding is loaded right now? */
1061 current_alist_element
1062 = XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
1064 /* If the current buffer is not the buffer whose binding is
1065 loaded, or if there may be frame-local bindings and the frame
1066 isn't the right one, or if it's a Lisp_Buffer_Local_Value and
1067 the default binding is loaded, the loaded binding may be the
1069 if (!BUFFERP (XBUFFER_LOCAL_VALUE (valcontents
)->buffer
)
1070 || buf
!= XBUFFER (XBUFFER_LOCAL_VALUE (valcontents
)->buffer
)
1071 || (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
1072 && !EQ (selected_frame
, XBUFFER_LOCAL_VALUE (valcontents
)->frame
))
1073 || (BUFFER_LOCAL_VALUEP (valcontents
)
1074 && EQ (XCAR (current_alist_element
),
1075 current_alist_element
)))
1077 /* The currently loaded binding is not necessarily valid.
1078 We need to unload it, and choose a new binding. */
1080 /* Write out `realvalue' to the old loaded binding. */
1081 Fsetcdr (current_alist_element
,
1082 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
));
1084 /* Find the new binding. */
1085 tem1
= Fassq (symbol
, buf
->local_var_alist
);
1086 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 1;
1087 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_frame
= 0;
1091 /* This buffer still sees the default value. */
1093 /* If the variable is a Lisp_Some_Buffer_Local_Value,
1094 or if this is `let' rather than `set',
1095 make CURRENT-ALIST-ELEMENT point to itself,
1096 indicating that we're seeing the default value.
1097 Likewise if the variable has been let-bound
1098 in the current buffer. */
1099 if (bindflag
|| SOME_BUFFER_LOCAL_VALUEP (valcontents
)
1100 || let_shadows_buffer_binding_p (symbol
))
1102 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 0;
1104 if (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
)
1105 tem1
= Fassq (symbol
,
1106 XFRAME (selected_frame
)->param_alist
);
1109 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_frame
= 1;
1111 tem1
= XBUFFER_LOCAL_VALUE (valcontents
)->cdr
;
1113 /* If it's a Lisp_Buffer_Local_Value, being set not bound,
1114 and we're not within a let that was made for this buffer,
1115 create a new buffer-local binding for the variable.
1116 That means, give this buffer a new assoc for a local value
1117 and load that binding. */
1120 tem1
= Fcons (symbol
, Fcdr (current_alist_element
));
1121 buf
->local_var_alist
1122 = Fcons (tem1
, buf
->local_var_alist
);
1126 /* Record which binding is now loaded. */
1127 XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
)
1130 /* Set `buffer' and `frame' slots for thebinding now loaded. */
1131 XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents
)->buffer
, buf
);
1132 XBUFFER_LOCAL_VALUE (valcontents
)->frame
= selected_frame
;
1134 innercontents
= XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
;
1137 /* If storing void (making the symbol void), forward only through
1138 buffer-local indicator, not through Lisp_Objfwd, etc. */
1140 store_symval_forwarding (symbol
, Qnil
, newval
);
1142 store_symval_forwarding (symbol
, innercontents
, newval
);
1144 /* If we just set a variable whose current binding is frame-local,
1145 store the new value in the frame parameter too. */
1147 if (BUFFER_LOCAL_VALUEP (valcontents
)
1148 || SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1150 /* What binding is loaded right now? */
1151 current_alist_element
1152 = XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
1154 /* If the current buffer is not the buffer whose binding is
1155 loaded, or if there may be frame-local bindings and the frame
1156 isn't the right one, or if it's a Lisp_Buffer_Local_Value and
1157 the default binding is loaded, the loaded binding may be the
1159 if (XBUFFER_LOCAL_VALUE (valcontents
)->found_for_frame
)
1160 XCDR (current_alist_element
) = newval
;
1166 /* Access or set a buffer-local symbol's default value. */
1168 /* Return the default value of SYMBOL, but don't check for voidness.
1169 Return Qunbound if it is void. */
1172 default_value (symbol
)
1175 register Lisp_Object valcontents
;
1177 CHECK_SYMBOL (symbol
, 0);
1178 valcontents
= XSYMBOL (symbol
)->value
;
1180 /* For a built-in buffer-local variable, get the default value
1181 rather than letting do_symval_forwarding get the current value. */
1182 if (BUFFER_OBJFWDP (valcontents
))
1184 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1185 if (PER_BUFFER_IDX (offset
) != 0)
1186 return PER_BUFFER_DEFAULT (offset
);
1189 /* Handle user-created local variables. */
1190 if (BUFFER_LOCAL_VALUEP (valcontents
)
1191 || SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1193 /* If var is set up for a buffer that lacks a local value for it,
1194 the current value is nominally the default value.
1195 But the `realvalue' slot may be more up to date, since
1196 ordinary setq stores just that slot. So use that. */
1197 Lisp_Object current_alist_element
, alist_element_car
;
1198 current_alist_element
1199 = XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
1200 alist_element_car
= XCAR (current_alist_element
);
1201 if (EQ (alist_element_car
, current_alist_element
))
1202 return do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
);
1204 return XCDR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
1206 /* For other variables, get the current value. */
1207 return do_symval_forwarding (valcontents
);
1210 DEFUN ("default-boundp", Fdefault_boundp
, Sdefault_boundp
, 1, 1, 0,
1211 "Return t if SYMBOL has a non-void default value.\n\
1212 This is the value that is seen in buffers that do not have their own values\n\
1213 for this variable.")
1217 register Lisp_Object value
;
1219 value
= default_value (symbol
);
1220 return (EQ (value
, Qunbound
) ? Qnil
: Qt
);
1223 DEFUN ("default-value", Fdefault_value
, Sdefault_value
, 1, 1, 0,
1224 "Return SYMBOL's default value.\n\
1225 This is the value that is seen in buffers that do not have their own values\n\
1226 for this variable. The default value is meaningful for variables with\n\
1227 local bindings in certain buffers.")
1231 register Lisp_Object value
;
1233 value
= default_value (symbol
);
1234 if (EQ (value
, Qunbound
))
1235 return Fsignal (Qvoid_variable
, Fcons (symbol
, Qnil
));
1239 DEFUN ("set-default", Fset_default
, Sset_default
, 2, 2, 0,
1240 "Set SYMBOL's default value to VAL. SYMBOL and VAL are evaluated.\n\
1241 The default value is seen in buffers that do not have their own values\n\
1242 for this variable.")
1244 Lisp_Object symbol
, value
;
1246 register Lisp_Object valcontents
, current_alist_element
, alist_element_buffer
;
1248 CHECK_SYMBOL (symbol
, 0);
1249 valcontents
= XSYMBOL (symbol
)->value
;
1251 /* Handle variables like case-fold-search that have special slots
1252 in the buffer. Make them work apparently like Lisp_Buffer_Local_Value
1254 if (BUFFER_OBJFWDP (valcontents
))
1256 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1257 int idx
= PER_BUFFER_IDX (offset
);
1259 PER_BUFFER_DEFAULT (offset
) = value
;
1261 /* If this variable is not always local in all buffers,
1262 set it in the buffers that don't nominally have a local value. */
1267 for (b
= all_buffers
; b
; b
= b
->next
)
1268 if (!PER_BUFFER_VALUE_P (b
, idx
))
1269 PER_BUFFER_VALUE (b
, offset
) = value
;
1274 if (!BUFFER_LOCAL_VALUEP (valcontents
)
1275 && !SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1276 return Fset (symbol
, value
);
1278 /* Store new value into the DEFAULT-VALUE slot. */
1279 XCDR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
) = value
;
1281 /* If the default binding is now loaded, set the REALVALUE slot too. */
1282 current_alist_element
1283 = XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
1284 alist_element_buffer
= Fcar (current_alist_element
);
1285 if (EQ (alist_element_buffer
, current_alist_element
))
1286 store_symval_forwarding (symbol
, XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
,
1292 DEFUN ("setq-default", Fsetq_default
, Ssetq_default
, 2, UNEVALLED
, 0,
1293 "Set the default value of variable VAR to VALUE.\n\
1294 VAR, the variable name, is literal (not evaluated);\n\
1295 VALUE is an expression and it is evaluated.\n\
1296 The default value of a variable is seen in buffers\n\
1297 that do not have their own values for the variable.\n\
1299 More generally, you can use multiple variables and values, as in\n\
1300 (setq-default SYMBOL VALUE SYMBOL VALUE...)\n\
1301 This sets each SYMBOL's default value to the corresponding VALUE.\n\
1302 The VALUE for the Nth SYMBOL can refer to the new default values\n\
1307 register Lisp_Object args_left
;
1308 register Lisp_Object val
, symbol
;
1309 struct gcpro gcpro1
;
1319 val
= Feval (Fcar (Fcdr (args_left
)));
1320 symbol
= Fcar (args_left
);
1321 Fset_default (symbol
, val
);
1322 args_left
= Fcdr (Fcdr (args_left
));
1324 while (!NILP (args_left
));
1330 /* Lisp functions for creating and removing buffer-local variables. */
1332 DEFUN ("make-variable-buffer-local", Fmake_variable_buffer_local
, Smake_variable_buffer_local
,
1333 1, 1, "vMake Variable Buffer Local: ",
1334 "Make VARIABLE become buffer-local whenever it is set.\n\
1335 At any time, the value for the current buffer is in effect,\n\
1336 unless the variable has never been set in this buffer,\n\
1337 in which case the default value is in effect.\n\
1338 Note that binding the variable with `let', or setting it while\n\
1339 a `let'-style binding made in this buffer is in effect,\n\
1340 does not make the variable buffer-local.\n\
1342 The function `default-value' gets the default value and `set-default' sets it.")
1344 register Lisp_Object variable
;
1346 register Lisp_Object tem
, valcontents
, newval
;
1348 CHECK_SYMBOL (variable
, 0);
1350 valcontents
= XSYMBOL (variable
)->value
;
1351 if (EQ (variable
, Qnil
) || EQ (variable
, Qt
) || KBOARD_OBJFWDP (valcontents
))
1352 error ("Symbol %s may not be buffer-local", XSYMBOL (variable
)->name
->data
);
1354 if (BUFFER_LOCAL_VALUEP (valcontents
) || BUFFER_OBJFWDP (valcontents
))
1356 if (SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1358 XMISCTYPE (XSYMBOL (variable
)->value
) = Lisp_Misc_Buffer_Local_Value
;
1361 if (EQ (valcontents
, Qunbound
))
1362 XSYMBOL (variable
)->value
= Qnil
;
1363 tem
= Fcons (Qnil
, Fsymbol_value (variable
));
1365 newval
= allocate_misc ();
1366 XMISCTYPE (newval
) = Lisp_Misc_Buffer_Local_Value
;
1367 XBUFFER_LOCAL_VALUE (newval
)->realvalue
= XSYMBOL (variable
)->value
;
1368 XBUFFER_LOCAL_VALUE (newval
)->buffer
= Fcurrent_buffer ();
1369 XBUFFER_LOCAL_VALUE (newval
)->frame
= Qnil
;
1370 XBUFFER_LOCAL_VALUE (newval
)->found_for_buffer
= 0;
1371 XBUFFER_LOCAL_VALUE (newval
)->found_for_frame
= 0;
1372 XBUFFER_LOCAL_VALUE (newval
)->check_frame
= 0;
1373 XBUFFER_LOCAL_VALUE (newval
)->cdr
= tem
;
1374 XSYMBOL (variable
)->value
= newval
;
1378 DEFUN ("make-local-variable", Fmake_local_variable
, Smake_local_variable
,
1379 1, 1, "vMake Local Variable: ",
1380 "Make VARIABLE have a separate value in the current buffer.\n\
1381 Other buffers will continue to share a common default value.\n\
1382 \(The buffer-local value of VARIABLE starts out as the same value\n\
1383 VARIABLE previously had. If VARIABLE was void, it remains void.\)\n\
1384 See also `make-variable-buffer-local'.\n\
1386 If the variable is already arranged to become local when set,\n\
1387 this function causes a local value to exist for this buffer,\n\
1388 just as setting the variable would do.\n\
1390 This function returns VARIABLE, and therefore\n\
1391 (set (make-local-variable 'VARIABLE) VALUE-EXP)\n\
1394 Do not use `make-local-variable' to make a hook variable buffer-local.\n\
1395 Use `make-local-hook' instead.")
1397 register Lisp_Object variable
;
1399 register Lisp_Object tem
, valcontents
;
1401 CHECK_SYMBOL (variable
, 0);
1403 valcontents
= XSYMBOL (variable
)->value
;
1404 if (EQ (variable
, Qnil
) || EQ (variable
, Qt
) || KBOARD_OBJFWDP (valcontents
))
1405 error ("Symbol %s may not be buffer-local", XSYMBOL (variable
)->name
->data
);
1407 if (BUFFER_LOCAL_VALUEP (valcontents
) || BUFFER_OBJFWDP (valcontents
))
1409 tem
= Fboundp (variable
);
1411 /* Make sure the symbol has a local value in this particular buffer,
1412 by setting it to the same value it already has. */
1413 Fset (variable
, (EQ (tem
, Qt
) ? Fsymbol_value (variable
) : Qunbound
));
1416 /* Make sure symbol is set up to hold per-buffer values. */
1417 if (!SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1420 tem
= Fcons (Qnil
, do_symval_forwarding (valcontents
));
1422 newval
= allocate_misc ();
1423 XMISCTYPE (newval
) = Lisp_Misc_Some_Buffer_Local_Value
;
1424 XBUFFER_LOCAL_VALUE (newval
)->realvalue
= XSYMBOL (variable
)->value
;
1425 XBUFFER_LOCAL_VALUE (newval
)->buffer
= Qnil
;
1426 XBUFFER_LOCAL_VALUE (newval
)->frame
= Qnil
;
1427 XBUFFER_LOCAL_VALUE (newval
)->found_for_buffer
= 0;
1428 XBUFFER_LOCAL_VALUE (newval
)->found_for_frame
= 0;
1429 XBUFFER_LOCAL_VALUE (newval
)->check_frame
= 0;
1430 XBUFFER_LOCAL_VALUE (newval
)->cdr
= tem
;
1431 XSYMBOL (variable
)->value
= newval
;
1433 /* Make sure this buffer has its own value of symbol. */
1434 tem
= Fassq (variable
, current_buffer
->local_var_alist
);
1437 /* Swap out any local binding for some other buffer, and make
1438 sure the current value is permanently recorded, if it's the
1440 find_symbol_value (variable
);
1442 current_buffer
->local_var_alist
1443 = Fcons (Fcons (variable
, XCDR (XBUFFER_LOCAL_VALUE (XSYMBOL (variable
)->value
)->cdr
)),
1444 current_buffer
->local_var_alist
);
1446 /* Make sure symbol does not think it is set up for this buffer;
1447 force it to look once again for this buffer's value. */
1449 Lisp_Object
*pvalbuf
;
1451 valcontents
= XSYMBOL (variable
)->value
;
1453 pvalbuf
= &XBUFFER_LOCAL_VALUE (valcontents
)->buffer
;
1454 if (current_buffer
== XBUFFER (*pvalbuf
))
1456 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 0;
1460 /* If the symbol forwards into a C variable, then load the binding
1461 for this buffer now. If C code modifies the variable before we
1462 load the binding in, then that new value will clobber the default
1463 binding the next time we unload it. */
1464 valcontents
= XBUFFER_LOCAL_VALUE (XSYMBOL (variable
)->value
)->realvalue
;
1465 if (INTFWDP (valcontents
) || BOOLFWDP (valcontents
) || OBJFWDP (valcontents
))
1466 swap_in_symval_forwarding (variable
, XSYMBOL (variable
)->value
);
1471 DEFUN ("kill-local-variable", Fkill_local_variable
, Skill_local_variable
,
1472 1, 1, "vKill Local Variable: ",
1473 "Make VARIABLE no longer have a separate value in the current buffer.\n\
1474 From now on the default value will apply in this buffer.")
1476 register Lisp_Object variable
;
1478 register Lisp_Object tem
, valcontents
;
1480 CHECK_SYMBOL (variable
, 0);
1482 valcontents
= XSYMBOL (variable
)->value
;
1484 if (BUFFER_OBJFWDP (valcontents
))
1486 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1487 int idx
= PER_BUFFER_IDX (offset
);
1491 SET_PER_BUFFER_VALUE_P (current_buffer
, idx
, 0);
1492 PER_BUFFER_VALUE (current_buffer
, offset
)
1493 = PER_BUFFER_DEFAULT (offset
);
1498 if (!BUFFER_LOCAL_VALUEP (valcontents
)
1499 && !SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1502 /* Get rid of this buffer's alist element, if any. */
1504 tem
= Fassq (variable
, current_buffer
->local_var_alist
);
1506 current_buffer
->local_var_alist
1507 = Fdelq (tem
, current_buffer
->local_var_alist
);
1509 /* If the symbol is set up with the current buffer's binding
1510 loaded, recompute its value. We have to do it now, or else
1511 forwarded objects won't work right. */
1513 Lisp_Object
*pvalbuf
;
1514 valcontents
= XSYMBOL (variable
)->value
;
1515 pvalbuf
= &XBUFFER_LOCAL_VALUE (valcontents
)->buffer
;
1516 if (current_buffer
== XBUFFER (*pvalbuf
))
1519 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 0;
1520 find_symbol_value (variable
);
1527 /* Lisp functions for creating and removing buffer-local variables. */
1529 DEFUN ("make-variable-frame-local", Fmake_variable_frame_local
, Smake_variable_frame_local
,
1530 1, 1, "vMake Variable Frame Local: ",
1531 "Enable VARIABLE to have frame-local bindings.\n\
1532 When a frame-local binding exists in the current frame,\n\
1533 it is in effect whenever the current buffer has no buffer-local binding.\n\
1534 A frame-local binding is actual a frame parameter value;\n\
1535 thus, any given frame has a local binding for VARIABLE\n\
1536 if it has a value for the frame parameter named VARIABLE.\n\
1537 See `modify-frame-parameters'.")
1539 register Lisp_Object variable
;
1541 register Lisp_Object tem
, valcontents
, newval
;
1543 CHECK_SYMBOL (variable
, 0);
1545 valcontents
= XSYMBOL (variable
)->value
;
1546 if (EQ (variable
, Qnil
) || EQ (variable
, Qt
) || KBOARD_OBJFWDP (valcontents
)
1547 || BUFFER_OBJFWDP (valcontents
))
1548 error ("Symbol %s may not be frame-local", XSYMBOL (variable
)->name
->data
);
1550 if (BUFFER_LOCAL_VALUEP (valcontents
)
1551 || SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1553 XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
= 1;
1557 if (EQ (valcontents
, Qunbound
))
1558 XSYMBOL (variable
)->value
= Qnil
;
1559 tem
= Fcons (Qnil
, Fsymbol_value (variable
));
1561 newval
= allocate_misc ();
1562 XMISCTYPE (newval
) = Lisp_Misc_Some_Buffer_Local_Value
;
1563 XBUFFER_LOCAL_VALUE (newval
)->realvalue
= XSYMBOL (variable
)->value
;
1564 XBUFFER_LOCAL_VALUE (newval
)->buffer
= Qnil
;
1565 XBUFFER_LOCAL_VALUE (newval
)->frame
= Qnil
;
1566 XBUFFER_LOCAL_VALUE (newval
)->found_for_buffer
= 0;
1567 XBUFFER_LOCAL_VALUE (newval
)->found_for_frame
= 0;
1568 XBUFFER_LOCAL_VALUE (newval
)->check_frame
= 1;
1569 XBUFFER_LOCAL_VALUE (newval
)->cdr
= tem
;
1570 XSYMBOL (variable
)->value
= newval
;
1574 DEFUN ("local-variable-p", Flocal_variable_p
, Slocal_variable_p
,
1576 "Non-nil if VARIABLE has a local binding in buffer BUFFER.\n\
1577 BUFFER defaults to the current buffer.")
1579 register Lisp_Object variable
, buffer
;
1581 Lisp_Object valcontents
;
1582 register struct buffer
*buf
;
1585 buf
= current_buffer
;
1588 CHECK_BUFFER (buffer
, 0);
1589 buf
= XBUFFER (buffer
);
1592 CHECK_SYMBOL (variable
, 0);
1594 valcontents
= XSYMBOL (variable
)->value
;
1595 if (BUFFER_LOCAL_VALUEP (valcontents
)
1596 || SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1598 Lisp_Object tail
, elt
;
1599 for (tail
= buf
->local_var_alist
; CONSP (tail
); tail
= XCDR (tail
))
1602 if (EQ (variable
, XCAR (elt
)))
1606 if (BUFFER_OBJFWDP (valcontents
))
1608 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1609 int idx
= PER_BUFFER_IDX (offset
);
1610 if (idx
== -1 || PER_BUFFER_VALUE_P (buf
, idx
))
1616 DEFUN ("local-variable-if-set-p", Flocal_variable_if_set_p
, Slocal_variable_if_set_p
,
1618 "Non-nil if VARIABLE will be local in buffer BUFFER if it is set there.\n\
1619 BUFFER defaults to the current buffer.")
1621 register Lisp_Object variable
, buffer
;
1623 Lisp_Object valcontents
;
1624 register struct buffer
*buf
;
1627 buf
= current_buffer
;
1630 CHECK_BUFFER (buffer
, 0);
1631 buf
= XBUFFER (buffer
);
1634 CHECK_SYMBOL (variable
, 0);
1636 valcontents
= XSYMBOL (variable
)->value
;
1638 /* This means that make-variable-buffer-local was done. */
1639 if (BUFFER_LOCAL_VALUEP (valcontents
))
1641 /* All these slots become local if they are set. */
1642 if (BUFFER_OBJFWDP (valcontents
))
1644 if (SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1646 Lisp_Object tail
, elt
;
1647 for (tail
= buf
->local_var_alist
; CONSP (tail
); tail
= XCDR (tail
))
1650 if (EQ (variable
, XCAR (elt
)))
1657 /* Find the function at the end of a chain of symbol function indirections. */
1659 /* If OBJECT is a symbol, find the end of its function chain and
1660 return the value found there. If OBJECT is not a symbol, just
1661 return it. If there is a cycle in the function chain, signal a
1662 cyclic-function-indirection error.
1664 This is like Findirect_function, except that it doesn't signal an
1665 error if the chain ends up unbound. */
1667 indirect_function (object
)
1668 register Lisp_Object object
;
1670 Lisp_Object tortoise
, hare
;
1672 hare
= tortoise
= object
;
1676 if (!SYMBOLP (hare
) || EQ (hare
, Qunbound
))
1678 hare
= XSYMBOL (hare
)->function
;
1679 if (!SYMBOLP (hare
) || EQ (hare
, Qunbound
))
1681 hare
= XSYMBOL (hare
)->function
;
1683 tortoise
= XSYMBOL (tortoise
)->function
;
1685 if (EQ (hare
, tortoise
))
1686 Fsignal (Qcyclic_function_indirection
, Fcons (object
, Qnil
));
1692 DEFUN ("indirect-function", Findirect_function
, Sindirect_function
, 1, 1, 0,
1693 "Return the function at the end of OBJECT's function chain.\n\
1694 If OBJECT is a symbol, follow all function indirections and return the final\n\
1695 function binding.\n\
1696 If OBJECT is not a symbol, just return it.\n\
1697 Signal a void-function error if the final symbol is unbound.\n\
1698 Signal a cyclic-function-indirection error if there is a loop in the\n\
1699 function chain of symbols.")
1701 register Lisp_Object object
;
1705 result
= indirect_function (object
);
1707 if (EQ (result
, Qunbound
))
1708 return Fsignal (Qvoid_function
, Fcons (object
, Qnil
));
1712 /* Extract and set vector and string elements */
1714 DEFUN ("aref", Faref
, Saref
, 2, 2, 0,
1715 "Return the element of ARRAY at index IDX.\n\
1716 ARRAY may be a vector, a string, a char-table, a bool-vector,\n\
1717 or a byte-code object. IDX starts at 0.")
1719 register Lisp_Object array
;
1722 register int idxval
;
1724 CHECK_NUMBER (idx
, 1);
1725 idxval
= XINT (idx
);
1726 if (STRINGP (array
))
1730 if (idxval
< 0 || idxval
>= XSTRING (array
)->size
)
1731 args_out_of_range (array
, idx
);
1732 if (! STRING_MULTIBYTE (array
))
1733 return make_number ((unsigned char) XSTRING (array
)->data
[idxval
]);
1734 idxval_byte
= string_char_to_byte (array
, idxval
);
1736 c
= STRING_CHAR (&XSTRING (array
)->data
[idxval_byte
],
1737 STRING_BYTES (XSTRING (array
)) - idxval_byte
);
1738 return make_number (c
);
1740 else if (BOOL_VECTOR_P (array
))
1744 if (idxval
< 0 || idxval
>= XBOOL_VECTOR (array
)->size
)
1745 args_out_of_range (array
, idx
);
1747 val
= (unsigned char) XBOOL_VECTOR (array
)->data
[idxval
/ BITS_PER_CHAR
];
1748 return (val
& (1 << (idxval
% BITS_PER_CHAR
)) ? Qt
: Qnil
);
1750 else if (CHAR_TABLE_P (array
))
1755 args_out_of_range (array
, idx
);
1756 if (idxval
< CHAR_TABLE_ORDINARY_SLOTS
)
1758 /* For ASCII and 8-bit European characters, the element is
1759 stored in the top table. */
1760 val
= XCHAR_TABLE (array
)->contents
[idxval
];
1762 val
= XCHAR_TABLE (array
)->defalt
;
1763 while (NILP (val
)) /* Follow parents until we find some value. */
1765 array
= XCHAR_TABLE (array
)->parent
;
1768 val
= XCHAR_TABLE (array
)->contents
[idxval
];
1770 val
= XCHAR_TABLE (array
)->defalt
;
1777 Lisp_Object sub_table
;
1779 SPLIT_CHAR (idxval
, code
[0], code
[1], code
[2]);
1780 if (code
[1] < 32) code
[1] = -1;
1781 else if (code
[2] < 32) code
[2] = -1;
1783 /* Here, the possible range of CODE[0] (== charset ID) is
1784 128..MAX_CHARSET. Since the top level char table contains
1785 data for multibyte characters after 256th element, we must
1786 increment CODE[0] by 128 to get a correct index. */
1788 code
[3] = -1; /* anchor */
1790 try_parent_char_table
:
1792 for (i
= 0; code
[i
] >= 0; i
++)
1794 val
= XCHAR_TABLE (sub_table
)->contents
[code
[i
]];
1795 if (SUB_CHAR_TABLE_P (val
))
1800 val
= XCHAR_TABLE (sub_table
)->defalt
;
1803 array
= XCHAR_TABLE (array
)->parent
;
1805 goto try_parent_char_table
;
1810 /* Here, VAL is a sub char table. We try the default value
1812 val
= XCHAR_TABLE (val
)->defalt
;
1815 array
= XCHAR_TABLE (array
)->parent
;
1817 goto try_parent_char_table
;
1825 if (VECTORP (array
))
1826 size
= XVECTOR (array
)->size
;
1827 else if (COMPILEDP (array
))
1828 size
= XVECTOR (array
)->size
& PSEUDOVECTOR_SIZE_MASK
;
1830 wrong_type_argument (Qarrayp
, array
);
1832 if (idxval
< 0 || idxval
>= size
)
1833 args_out_of_range (array
, idx
);
1834 return XVECTOR (array
)->contents
[idxval
];
1838 DEFUN ("aset", Faset
, Saset
, 3, 3, 0,
1839 "Store into the element of ARRAY at index IDX the value NEWELT.\n\
1840 ARRAY may be a vector, a string, a char-table or a bool-vector.\n\
1842 (array
, idx
, newelt
)
1843 register Lisp_Object array
;
1844 Lisp_Object idx
, newelt
;
1846 register int idxval
;
1848 CHECK_NUMBER (idx
, 1);
1849 idxval
= XINT (idx
);
1850 if (!VECTORP (array
) && !STRINGP (array
) && !BOOL_VECTOR_P (array
)
1851 && ! CHAR_TABLE_P (array
))
1852 array
= wrong_type_argument (Qarrayp
, array
);
1853 CHECK_IMPURE (array
);
1855 if (VECTORP (array
))
1857 if (idxval
< 0 || idxval
>= XVECTOR (array
)->size
)
1858 args_out_of_range (array
, idx
);
1859 XVECTOR (array
)->contents
[idxval
] = newelt
;
1861 else if (BOOL_VECTOR_P (array
))
1865 if (idxval
< 0 || idxval
>= XBOOL_VECTOR (array
)->size
)
1866 args_out_of_range (array
, idx
);
1868 val
= (unsigned char) XBOOL_VECTOR (array
)->data
[idxval
/ BITS_PER_CHAR
];
1870 if (! NILP (newelt
))
1871 val
|= 1 << (idxval
% BITS_PER_CHAR
);
1873 val
&= ~(1 << (idxval
% BITS_PER_CHAR
));
1874 XBOOL_VECTOR (array
)->data
[idxval
/ BITS_PER_CHAR
] = val
;
1876 else if (CHAR_TABLE_P (array
))
1879 args_out_of_range (array
, idx
);
1880 if (idxval
< CHAR_TABLE_ORDINARY_SLOTS
)
1881 XCHAR_TABLE (array
)->contents
[idxval
] = newelt
;
1887 SPLIT_CHAR (idxval
, code
[0], code
[1], code
[2]);
1888 if (code
[1] < 32) code
[1] = -1;
1889 else if (code
[2] < 32) code
[2] = -1;
1891 /* See the comment of the corresponding part in Faref. */
1893 code
[3] = -1; /* anchor */
1894 for (i
= 0; code
[i
+ 1] >= 0; i
++)
1896 val
= XCHAR_TABLE (array
)->contents
[code
[i
]];
1897 if (SUB_CHAR_TABLE_P (val
))
1903 /* VAL is a leaf. Create a sub char table with the
1904 default value VAL or XCHAR_TABLE (array)->defalt
1905 and look into it. */
1907 temp
= make_sub_char_table (NILP (val
)
1908 ? XCHAR_TABLE (array
)->defalt
1910 XCHAR_TABLE (array
)->contents
[code
[i
]] = temp
;
1914 XCHAR_TABLE (array
)->contents
[code
[i
]] = newelt
;
1917 else if (STRING_MULTIBYTE (array
))
1919 int idxval_byte
, new_len
, actual_len
;
1921 unsigned char *p
, workbuf
[MAX_MULTIBYTE_LENGTH
], *str
= workbuf
;
1923 if (idxval
< 0 || idxval
>= XSTRING (array
)->size
)
1924 args_out_of_range (array
, idx
);
1926 idxval_byte
= string_char_to_byte (array
, idxval
);
1927 p
= &XSTRING (array
)->data
[idxval_byte
];
1929 actual_len
= MULTIBYTE_FORM_LENGTH (p
, STRING_BYTES (XSTRING (array
)));
1930 CHECK_NUMBER (newelt
, 2);
1931 new_len
= CHAR_STRING (XINT (newelt
), str
);
1932 if (actual_len
!= new_len
)
1933 error ("Attempt to change byte length of a string");
1935 /* We can't accept a change causing byte combining. */
1936 if (!ASCII_BYTE_P (*str
)
1937 && ((idxval
> 0 && !CHAR_HEAD_P (*str
)
1938 && (prev_byte
= string_char_to_byte (array
, idxval
- 1),
1939 BYTES_BY_CHAR_HEAD (XSTRING (array
)->data
[prev_byte
])
1940 > idxval_byte
- prev_byte
))
1941 || (idxval
< XSTRING (array
)->size
- 1
1942 && !CHAR_HEAD_P (p
[actual_len
])
1943 && new_len
< BYTES_BY_CHAR_HEAD (*str
))))
1944 error ("Attempt to change char length of a string");
1950 if (idxval
< 0 || idxval
>= XSTRING (array
)->size
)
1951 args_out_of_range (array
, idx
);
1952 CHECK_NUMBER (newelt
, 2);
1953 XSTRING (array
)->data
[idxval
] = XINT (newelt
);
1959 /* Arithmetic functions */
1961 enum comparison
{ equal
, notequal
, less
, grtr
, less_or_equal
, grtr_or_equal
};
1964 arithcompare (num1
, num2
, comparison
)
1965 Lisp_Object num1
, num2
;
1966 enum comparison comparison
;
1971 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num1
, 0);
1972 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num2
, 0);
1974 if (FLOATP (num1
) || FLOATP (num2
))
1977 f1
= (FLOATP (num1
)) ? XFLOAT_DATA (num1
) : XINT (num1
);
1978 f2
= (FLOATP (num2
)) ? XFLOAT_DATA (num2
) : XINT (num2
);
1984 if (floatp
? f1
== f2
: XINT (num1
) == XINT (num2
))
1989 if (floatp
? f1
!= f2
: XINT (num1
) != XINT (num2
))
1994 if (floatp
? f1
< f2
: XINT (num1
) < XINT (num2
))
1999 if (floatp
? f1
<= f2
: XINT (num1
) <= XINT (num2
))
2004 if (floatp
? f1
> f2
: XINT (num1
) > XINT (num2
))
2009 if (floatp
? f1
>= f2
: XINT (num1
) >= XINT (num2
))
2018 DEFUN ("=", Feqlsign
, Seqlsign
, 2, 2, 0,
2019 "Return t if two args, both numbers or markers, are equal.")
2021 register Lisp_Object num1
, num2
;
2023 return arithcompare (num1
, num2
, equal
);
2026 DEFUN ("<", Flss
, Slss
, 2, 2, 0,
2027 "Return t if first arg is less than second arg. Both must be numbers or markers.")
2029 register Lisp_Object num1
, num2
;
2031 return arithcompare (num1
, num2
, less
);
2034 DEFUN (">", Fgtr
, Sgtr
, 2, 2, 0,
2035 "Return t if first arg is greater than second arg. Both must be numbers or markers.")
2037 register Lisp_Object num1
, num2
;
2039 return arithcompare (num1
, num2
, grtr
);
2042 DEFUN ("<=", Fleq
, Sleq
, 2, 2, 0,
2043 "Return t if first arg is less than or equal to second arg.\n\
2044 Both must be numbers or markers.")
2046 register Lisp_Object num1
, num2
;
2048 return arithcompare (num1
, num2
, less_or_equal
);
2051 DEFUN (">=", Fgeq
, Sgeq
, 2, 2, 0,
2052 "Return t if first arg is greater than or equal to second arg.\n\
2053 Both must be numbers or markers.")
2055 register Lisp_Object num1
, num2
;
2057 return arithcompare (num1
, num2
, grtr_or_equal
);
2060 DEFUN ("/=", Fneq
, Sneq
, 2, 2, 0,
2061 "Return t if first arg is not equal to second arg. Both must be numbers or markers.")
2063 register Lisp_Object num1
, num2
;
2065 return arithcompare (num1
, num2
, notequal
);
2068 DEFUN ("zerop", Fzerop
, Szerop
, 1, 1, 0, "Return t if NUMBER is zero.")
2070 register Lisp_Object number
;
2072 CHECK_NUMBER_OR_FLOAT (number
, 0);
2074 if (FLOATP (number
))
2076 if (XFLOAT_DATA (number
) == 0.0)
2086 /* Convert between long values and pairs of Lisp integers. */
2092 unsigned int top
= i
>> 16;
2093 unsigned int bot
= i
& 0xFFFF;
2095 return make_number (bot
);
2096 if (top
== (unsigned long)-1 >> 16)
2097 return Fcons (make_number (-1), make_number (bot
));
2098 return Fcons (make_number (top
), make_number (bot
));
2105 Lisp_Object top
, bot
;
2112 return ((XINT (top
) << 16) | XINT (bot
));
2115 DEFUN ("number-to-string", Fnumber_to_string
, Snumber_to_string
, 1, 1, 0,
2116 "Convert NUMBER to a string by printing it in decimal.\n\
2117 Uses a minus sign if negative.\n\
2118 NUMBER may be an integer or a floating point number.")
2122 char buffer
[VALBITS
];
2124 CHECK_NUMBER_OR_FLOAT (number
, 0);
2126 if (FLOATP (number
))
2128 char pigbuf
[350]; /* see comments in float_to_string */
2130 float_to_string (pigbuf
, XFLOAT_DATA (number
));
2131 return build_string (pigbuf
);
2134 if (sizeof (int) == sizeof (EMACS_INT
))
2135 sprintf (buffer
, "%d", XINT (number
));
2136 else if (sizeof (long) == sizeof (EMACS_INT
))
2137 sprintf (buffer
, "%ld", (long) XINT (number
));
2140 return build_string (buffer
);
2144 digit_to_number (character
, base
)
2145 int character
, base
;
2149 if (character
>= '0' && character
<= '9')
2150 digit
= character
- '0';
2151 else if (character
>= 'a' && character
<= 'z')
2152 digit
= character
- 'a' + 10;
2153 else if (character
>= 'A' && character
<= 'Z')
2154 digit
= character
- 'A' + 10;
2164 DEFUN ("string-to-number", Fstring_to_number
, Sstring_to_number
, 1, 2, 0,
2165 "Convert STRING to a number by parsing it as a decimal number.\n\
2166 This parses both integers and floating point numbers.\n\
2167 It ignores leading spaces and tabs.\n\
2169 If BASE, interpret STRING as a number in that base. If BASE isn't\n\
2170 present, base 10 is used. BASE must be between 2 and 16 (inclusive).\n\
2171 If the base used is not 10, floating point is not recognized.")
2173 register Lisp_Object string
, base
;
2175 register unsigned char *p
;
2180 CHECK_STRING (string
, 0);
2186 CHECK_NUMBER (base
, 1);
2188 if (b
< 2 || b
> 16)
2189 Fsignal (Qargs_out_of_range
, Fcons (base
, Qnil
));
2192 /* Skip any whitespace at the front of the number. Some versions of
2193 atoi do this anyway, so we might as well make Emacs lisp consistent. */
2194 p
= XSTRING (string
)->data
;
2195 while (*p
== ' ' || *p
== '\t')
2206 if (isfloat_string (p
) && b
== 10)
2207 val
= make_float (sign
* atof (p
));
2214 int digit
= digit_to_number (*p
++, b
);
2220 if (v
> (EMACS_UINT
) (VALMASK
>> 1))
2221 val
= make_float (sign
* v
);
2223 val
= make_number (sign
* (int) v
);
2231 { Aadd
, Asub
, Amult
, Adiv
, Alogand
, Alogior
, Alogxor
, Amax
, Amin
};
2233 extern Lisp_Object
float_arith_driver ();
2234 extern Lisp_Object
fmod_float ();
2237 arith_driver (code
, nargs
, args
)
2240 register Lisp_Object
*args
;
2242 register Lisp_Object val
;
2243 register int argnum
;
2244 register EMACS_INT accum
;
2245 register EMACS_INT next
;
2247 switch (SWITCH_ENUM_CAST (code
))
2260 for (argnum
= 0; argnum
< nargs
; argnum
++)
2262 val
= args
[argnum
]; /* using args[argnum] as argument to CHECK_NUMBER_... */
2263 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val
, argnum
);
2265 if (FLOATP (val
)) /* time to do serious math */
2266 return (float_arith_driver ((double) accum
, argnum
, code
,
2268 args
[argnum
] = val
; /* runs into a compiler bug. */
2269 next
= XINT (args
[argnum
]);
2270 switch (SWITCH_ENUM_CAST (code
))
2272 case Aadd
: accum
+= next
; break;
2274 accum
= argnum
? accum
- next
: nargs
== 1 ? - next
: next
;
2276 case Amult
: accum
*= next
; break;
2278 if (!argnum
) accum
= next
;
2282 Fsignal (Qarith_error
, Qnil
);
2286 case Alogand
: accum
&= next
; break;
2287 case Alogior
: accum
|= next
; break;
2288 case Alogxor
: accum
^= next
; break;
2289 case Amax
: if (!argnum
|| next
> accum
) accum
= next
; break;
2290 case Amin
: if (!argnum
|| next
< accum
) accum
= next
; break;
2294 XSETINT (val
, accum
);
2299 #define isnan(x) ((x) != (x))
2302 float_arith_driver (accum
, argnum
, code
, nargs
, args
)
2304 register int argnum
;
2307 register Lisp_Object
*args
;
2309 register Lisp_Object val
;
2312 for (; argnum
< nargs
; argnum
++)
2314 val
= args
[argnum
]; /* using args[argnum] as argument to CHECK_NUMBER_... */
2315 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val
, argnum
);
2319 next
= XFLOAT_DATA (val
);
2323 args
[argnum
] = val
; /* runs into a compiler bug. */
2324 next
= XINT (args
[argnum
]);
2326 switch (SWITCH_ENUM_CAST (code
))
2332 accum
= argnum
? accum
- next
: nargs
== 1 ? - next
: next
;
2342 if (! IEEE_FLOATING_POINT
&& next
== 0)
2343 Fsignal (Qarith_error
, Qnil
);
2350 return wrong_type_argument (Qinteger_or_marker_p
, val
);
2352 if (!argnum
|| isnan (next
) || next
> accum
)
2356 if (!argnum
|| isnan (next
) || next
< accum
)
2362 return make_float (accum
);
2366 DEFUN ("+", Fplus
, Splus
, 0, MANY
, 0,
2367 "Return sum of any number of arguments, which are numbers or markers.")
2372 return arith_driver (Aadd
, nargs
, args
);
2375 DEFUN ("-", Fminus
, Sminus
, 0, MANY
, 0,
2376 "Negate number or subtract numbers or markers.\n\
2377 With one arg, negates it. With more than one arg,\n\
2378 subtracts all but the first from the first.")
2383 return arith_driver (Asub
, nargs
, args
);
2386 DEFUN ("*", Ftimes
, Stimes
, 0, MANY
, 0,
2387 "Returns product of any number of arguments, which are numbers or markers.")
2392 return arith_driver (Amult
, nargs
, args
);
2395 DEFUN ("/", Fquo
, Squo
, 2, MANY
, 0,
2396 "Returns first argument divided by all the remaining arguments.\n\
2397 The arguments must be numbers or markers.")
2402 return arith_driver (Adiv
, nargs
, args
);
2405 DEFUN ("%", Frem
, Srem
, 2, 2, 0,
2406 "Returns remainder of X divided by Y.\n\
2407 Both must be integers or markers.")
2409 register Lisp_Object x
, y
;
2413 CHECK_NUMBER_COERCE_MARKER (x
, 0);
2414 CHECK_NUMBER_COERCE_MARKER (y
, 1);
2416 if (XFASTINT (y
) == 0)
2417 Fsignal (Qarith_error
, Qnil
);
2419 XSETINT (val
, XINT (x
) % XINT (y
));
2433 /* If the magnitude of the result exceeds that of the divisor, or
2434 the sign of the result does not agree with that of the dividend,
2435 iterate with the reduced value. This does not yield a
2436 particularly accurate result, but at least it will be in the
2437 range promised by fmod. */
2439 r
-= f2
* floor (r
/ f2
);
2440 while (f2
<= (r
< 0 ? -r
: r
) || ((r
< 0) != (f1
< 0) && ! isnan (r
)));
2444 #endif /* ! HAVE_FMOD */
2446 DEFUN ("mod", Fmod
, Smod
, 2, 2, 0,
2447 "Returns X modulo Y.\n\
2448 The result falls between zero (inclusive) and Y (exclusive).\n\
2449 Both X and Y must be numbers or markers.")
2451 register Lisp_Object x
, y
;
2456 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (x
, 0);
2457 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (y
, 1);
2459 if (FLOATP (x
) || FLOATP (y
))
2460 return fmod_float (x
, y
);
2466 Fsignal (Qarith_error
, Qnil
);
2470 /* If the "remainder" comes out with the wrong sign, fix it. */
2471 if (i2
< 0 ? i1
> 0 : i1
< 0)
2478 DEFUN ("max", Fmax
, Smax
, 1, MANY
, 0,
2479 "Return largest of all the arguments (which must be numbers or markers).\n\
2480 The value is always a number; markers are converted to numbers.")
2485 return arith_driver (Amax
, nargs
, args
);
2488 DEFUN ("min", Fmin
, Smin
, 1, MANY
, 0,
2489 "Return smallest of all the arguments (which must be numbers or markers).\n\
2490 The value is always a number; markers are converted to numbers.")
2495 return arith_driver (Amin
, nargs
, args
);
2498 DEFUN ("logand", Flogand
, Slogand
, 0, MANY
, 0,
2499 "Return bitwise-and of all the arguments.\n\
2500 Arguments may be integers, or markers converted to integers.")
2505 return arith_driver (Alogand
, nargs
, args
);
2508 DEFUN ("logior", Flogior
, Slogior
, 0, MANY
, 0,
2509 "Return bitwise-or of all the arguments.\n\
2510 Arguments may be integers, or markers converted to integers.")
2515 return arith_driver (Alogior
, nargs
, args
);
2518 DEFUN ("logxor", Flogxor
, Slogxor
, 0, MANY
, 0,
2519 "Return bitwise-exclusive-or of all the arguments.\n\
2520 Arguments may be integers, or markers converted to integers.")
2525 return arith_driver (Alogxor
, nargs
, args
);
2528 DEFUN ("ash", Fash
, Sash
, 2, 2, 0,
2529 "Return VALUE with its bits shifted left by COUNT.\n\
2530 If COUNT is negative, shifting is actually to the right.\n\
2531 In this case, the sign bit is duplicated.")
2533 register Lisp_Object value
, count
;
2535 register Lisp_Object val
;
2537 CHECK_NUMBER (value
, 0);
2538 CHECK_NUMBER (count
, 1);
2540 if (XINT (count
) >= BITS_PER_EMACS_INT
)
2542 else if (XINT (count
) > 0)
2543 XSETINT (val
, XINT (value
) << XFASTINT (count
));
2544 else if (XINT (count
) <= -BITS_PER_EMACS_INT
)
2545 XSETINT (val
, XINT (value
) < 0 ? -1 : 0);
2547 XSETINT (val
, XINT (value
) >> -XINT (count
));
2551 DEFUN ("lsh", Flsh
, Slsh
, 2, 2, 0,
2552 "Return VALUE with its bits shifted left by COUNT.\n\
2553 If COUNT is negative, shifting is actually to the right.\n\
2554 In this case, zeros are shifted in on the left.")
2556 register Lisp_Object value
, count
;
2558 register Lisp_Object val
;
2560 CHECK_NUMBER (value
, 0);
2561 CHECK_NUMBER (count
, 1);
2563 if (XINT (count
) >= BITS_PER_EMACS_INT
)
2565 else if (XINT (count
) > 0)
2566 XSETINT (val
, (EMACS_UINT
) XUINT (value
) << XFASTINT (count
));
2567 else if (XINT (count
) <= -BITS_PER_EMACS_INT
)
2570 XSETINT (val
, (EMACS_UINT
) XUINT (value
) >> -XINT (count
));
2574 DEFUN ("1+", Fadd1
, Sadd1
, 1, 1, 0,
2575 "Return NUMBER plus one. NUMBER may be a number or a marker.\n\
2576 Markers are converted to integers.")
2578 register Lisp_Object number
;
2580 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number
, 0);
2582 if (FLOATP (number
))
2583 return (make_float (1.0 + XFLOAT_DATA (number
)));
2585 XSETINT (number
, XINT (number
) + 1);
2589 DEFUN ("1-", Fsub1
, Ssub1
, 1, 1, 0,
2590 "Return NUMBER minus one. NUMBER may be a number or a marker.\n\
2591 Markers are converted to integers.")
2593 register Lisp_Object number
;
2595 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number
, 0);
2597 if (FLOATP (number
))
2598 return (make_float (-1.0 + XFLOAT_DATA (number
)));
2600 XSETINT (number
, XINT (number
) - 1);
2604 DEFUN ("lognot", Flognot
, Slognot
, 1, 1, 0,
2605 "Return the bitwise complement of NUMBER. NUMBER must be an integer.")
2607 register Lisp_Object number
;
2609 CHECK_NUMBER (number
, 0);
2610 XSETINT (number
, ~XINT (number
));
2617 Lisp_Object error_tail
, arith_tail
;
2619 Qquote
= intern ("quote");
2620 Qlambda
= intern ("lambda");
2621 Qsubr
= intern ("subr");
2622 Qerror_conditions
= intern ("error-conditions");
2623 Qerror_message
= intern ("error-message");
2624 Qtop_level
= intern ("top-level");
2626 Qerror
= intern ("error");
2627 Qquit
= intern ("quit");
2628 Qwrong_type_argument
= intern ("wrong-type-argument");
2629 Qargs_out_of_range
= intern ("args-out-of-range");
2630 Qvoid_function
= intern ("void-function");
2631 Qcyclic_function_indirection
= intern ("cyclic-function-indirection");
2632 Qvoid_variable
= intern ("void-variable");
2633 Qsetting_constant
= intern ("setting-constant");
2634 Qinvalid_read_syntax
= intern ("invalid-read-syntax");
2636 Qinvalid_function
= intern ("invalid-function");
2637 Qwrong_number_of_arguments
= intern ("wrong-number-of-arguments");
2638 Qno_catch
= intern ("no-catch");
2639 Qend_of_file
= intern ("end-of-file");
2640 Qarith_error
= intern ("arith-error");
2641 Qbeginning_of_buffer
= intern ("beginning-of-buffer");
2642 Qend_of_buffer
= intern ("end-of-buffer");
2643 Qbuffer_read_only
= intern ("buffer-read-only");
2644 Qtext_read_only
= intern ("text-read-only");
2645 Qmark_inactive
= intern ("mark-inactive");
2647 Qlistp
= intern ("listp");
2648 Qconsp
= intern ("consp");
2649 Qsymbolp
= intern ("symbolp");
2650 Qkeywordp
= intern ("keywordp");
2651 Qintegerp
= intern ("integerp");
2652 Qnatnump
= intern ("natnump");
2653 Qwholenump
= intern ("wholenump");
2654 Qstringp
= intern ("stringp");
2655 Qarrayp
= intern ("arrayp");
2656 Qsequencep
= intern ("sequencep");
2657 Qbufferp
= intern ("bufferp");
2658 Qvectorp
= intern ("vectorp");
2659 Qchar_or_string_p
= intern ("char-or-string-p");
2660 Qmarkerp
= intern ("markerp");
2661 Qbuffer_or_string_p
= intern ("buffer-or-string-p");
2662 Qinteger_or_marker_p
= intern ("integer-or-marker-p");
2663 Qboundp
= intern ("boundp");
2664 Qfboundp
= intern ("fboundp");
2666 Qfloatp
= intern ("floatp");
2667 Qnumberp
= intern ("numberp");
2668 Qnumber_or_marker_p
= intern ("number-or-marker-p");
2670 Qchar_table_p
= intern ("char-table-p");
2671 Qvector_or_char_table_p
= intern ("vector-or-char-table-p");
2673 Qsubrp
= intern ("subrp");
2674 Qunevalled
= intern ("unevalled");
2675 Qmany
= intern ("many");
2677 Qcdr
= intern ("cdr");
2679 /* Handle automatic advice activation */
2680 Qad_advice_info
= intern ("ad-advice-info");
2681 Qad_activate_internal
= intern ("ad-activate-internal");
2683 error_tail
= Fcons (Qerror
, Qnil
);
2685 /* ERROR is used as a signaler for random errors for which nothing else is right */
2687 Fput (Qerror
, Qerror_conditions
,
2689 Fput (Qerror
, Qerror_message
,
2690 build_string ("error"));
2692 Fput (Qquit
, Qerror_conditions
,
2693 Fcons (Qquit
, Qnil
));
2694 Fput (Qquit
, Qerror_message
,
2695 build_string ("Quit"));
2697 Fput (Qwrong_type_argument
, Qerror_conditions
,
2698 Fcons (Qwrong_type_argument
, error_tail
));
2699 Fput (Qwrong_type_argument
, Qerror_message
,
2700 build_string ("Wrong type argument"));
2702 Fput (Qargs_out_of_range
, Qerror_conditions
,
2703 Fcons (Qargs_out_of_range
, error_tail
));
2704 Fput (Qargs_out_of_range
, Qerror_message
,
2705 build_string ("Args out of range"));
2707 Fput (Qvoid_function
, Qerror_conditions
,
2708 Fcons (Qvoid_function
, error_tail
));
2709 Fput (Qvoid_function
, Qerror_message
,
2710 build_string ("Symbol's function definition is void"));
2712 Fput (Qcyclic_function_indirection
, Qerror_conditions
,
2713 Fcons (Qcyclic_function_indirection
, error_tail
));
2714 Fput (Qcyclic_function_indirection
, Qerror_message
,
2715 build_string ("Symbol's chain of function indirections contains a loop"));
2717 Fput (Qvoid_variable
, Qerror_conditions
,
2718 Fcons (Qvoid_variable
, error_tail
));
2719 Fput (Qvoid_variable
, Qerror_message
,
2720 build_string ("Symbol's value as variable is void"));
2722 Fput (Qsetting_constant
, Qerror_conditions
,
2723 Fcons (Qsetting_constant
, error_tail
));
2724 Fput (Qsetting_constant
, Qerror_message
,
2725 build_string ("Attempt to set a constant symbol"));
2727 Fput (Qinvalid_read_syntax
, Qerror_conditions
,
2728 Fcons (Qinvalid_read_syntax
, error_tail
));
2729 Fput (Qinvalid_read_syntax
, Qerror_message
,
2730 build_string ("Invalid read syntax"));
2732 Fput (Qinvalid_function
, Qerror_conditions
,
2733 Fcons (Qinvalid_function
, error_tail
));
2734 Fput (Qinvalid_function
, Qerror_message
,
2735 build_string ("Invalid function"));
2737 Fput (Qwrong_number_of_arguments
, Qerror_conditions
,
2738 Fcons (Qwrong_number_of_arguments
, error_tail
));
2739 Fput (Qwrong_number_of_arguments
, Qerror_message
,
2740 build_string ("Wrong number of arguments"));
2742 Fput (Qno_catch
, Qerror_conditions
,
2743 Fcons (Qno_catch
, error_tail
));
2744 Fput (Qno_catch
, Qerror_message
,
2745 build_string ("No catch for tag"));
2747 Fput (Qend_of_file
, Qerror_conditions
,
2748 Fcons (Qend_of_file
, error_tail
));
2749 Fput (Qend_of_file
, Qerror_message
,
2750 build_string ("End of file during parsing"));
2752 arith_tail
= Fcons (Qarith_error
, error_tail
);
2753 Fput (Qarith_error
, Qerror_conditions
,
2755 Fput (Qarith_error
, Qerror_message
,
2756 build_string ("Arithmetic error"));
2758 Fput (Qbeginning_of_buffer
, Qerror_conditions
,
2759 Fcons (Qbeginning_of_buffer
, error_tail
));
2760 Fput (Qbeginning_of_buffer
, Qerror_message
,
2761 build_string ("Beginning of buffer"));
2763 Fput (Qend_of_buffer
, Qerror_conditions
,
2764 Fcons (Qend_of_buffer
, error_tail
));
2765 Fput (Qend_of_buffer
, Qerror_message
,
2766 build_string ("End of buffer"));
2768 Fput (Qbuffer_read_only
, Qerror_conditions
,
2769 Fcons (Qbuffer_read_only
, error_tail
));
2770 Fput (Qbuffer_read_only
, Qerror_message
,
2771 build_string ("Buffer is read-only"));
2773 Fput (Qtext_read_only
, Qerror_conditions
,
2774 Fcons (Qtext_read_only
, error_tail
));
2775 Fput (Qtext_read_only
, Qerror_message
,
2776 build_string ("Text is read-only"));
2778 Qrange_error
= intern ("range-error");
2779 Qdomain_error
= intern ("domain-error");
2780 Qsingularity_error
= intern ("singularity-error");
2781 Qoverflow_error
= intern ("overflow-error");
2782 Qunderflow_error
= intern ("underflow-error");
2784 Fput (Qdomain_error
, Qerror_conditions
,
2785 Fcons (Qdomain_error
, arith_tail
));
2786 Fput (Qdomain_error
, Qerror_message
,
2787 build_string ("Arithmetic domain error"));
2789 Fput (Qrange_error
, Qerror_conditions
,
2790 Fcons (Qrange_error
, arith_tail
));
2791 Fput (Qrange_error
, Qerror_message
,
2792 build_string ("Arithmetic range error"));
2794 Fput (Qsingularity_error
, Qerror_conditions
,
2795 Fcons (Qsingularity_error
, Fcons (Qdomain_error
, arith_tail
)));
2796 Fput (Qsingularity_error
, Qerror_message
,
2797 build_string ("Arithmetic singularity error"));
2799 Fput (Qoverflow_error
, Qerror_conditions
,
2800 Fcons (Qoverflow_error
, Fcons (Qdomain_error
, arith_tail
)));
2801 Fput (Qoverflow_error
, Qerror_message
,
2802 build_string ("Arithmetic overflow error"));
2804 Fput (Qunderflow_error
, Qerror_conditions
,
2805 Fcons (Qunderflow_error
, Fcons (Qdomain_error
, arith_tail
)));
2806 Fput (Qunderflow_error
, Qerror_message
,
2807 build_string ("Arithmetic underflow error"));
2809 staticpro (&Qrange_error
);
2810 staticpro (&Qdomain_error
);
2811 staticpro (&Qsingularity_error
);
2812 staticpro (&Qoverflow_error
);
2813 staticpro (&Qunderflow_error
);
2817 staticpro (&Qquote
);
2818 staticpro (&Qlambda
);
2820 staticpro (&Qunbound
);
2821 staticpro (&Qerror_conditions
);
2822 staticpro (&Qerror_message
);
2823 staticpro (&Qtop_level
);
2825 staticpro (&Qerror
);
2827 staticpro (&Qwrong_type_argument
);
2828 staticpro (&Qargs_out_of_range
);
2829 staticpro (&Qvoid_function
);
2830 staticpro (&Qcyclic_function_indirection
);
2831 staticpro (&Qvoid_variable
);
2832 staticpro (&Qsetting_constant
);
2833 staticpro (&Qinvalid_read_syntax
);
2834 staticpro (&Qwrong_number_of_arguments
);
2835 staticpro (&Qinvalid_function
);
2836 staticpro (&Qno_catch
);
2837 staticpro (&Qend_of_file
);
2838 staticpro (&Qarith_error
);
2839 staticpro (&Qbeginning_of_buffer
);
2840 staticpro (&Qend_of_buffer
);
2841 staticpro (&Qbuffer_read_only
);
2842 staticpro (&Qtext_read_only
);
2843 staticpro (&Qmark_inactive
);
2845 staticpro (&Qlistp
);
2846 staticpro (&Qconsp
);
2847 staticpro (&Qsymbolp
);
2848 staticpro (&Qkeywordp
);
2849 staticpro (&Qintegerp
);
2850 staticpro (&Qnatnump
);
2851 staticpro (&Qwholenump
);
2852 staticpro (&Qstringp
);
2853 staticpro (&Qarrayp
);
2854 staticpro (&Qsequencep
);
2855 staticpro (&Qbufferp
);
2856 staticpro (&Qvectorp
);
2857 staticpro (&Qchar_or_string_p
);
2858 staticpro (&Qmarkerp
);
2859 staticpro (&Qbuffer_or_string_p
);
2860 staticpro (&Qinteger_or_marker_p
);
2861 staticpro (&Qfloatp
);
2862 staticpro (&Qnumberp
);
2863 staticpro (&Qnumber_or_marker_p
);
2864 staticpro (&Qchar_table_p
);
2865 staticpro (&Qvector_or_char_table_p
);
2866 staticpro (&Qsubrp
);
2868 staticpro (&Qunevalled
);
2870 staticpro (&Qboundp
);
2871 staticpro (&Qfboundp
);
2873 staticpro (&Qad_advice_info
);
2874 staticpro (&Qad_activate_internal
);
2876 /* Types that type-of returns. */
2877 Qinteger
= intern ("integer");
2878 Qsymbol
= intern ("symbol");
2879 Qstring
= intern ("string");
2880 Qcons
= intern ("cons");
2881 Qmarker
= intern ("marker");
2882 Qoverlay
= intern ("overlay");
2883 Qfloat
= intern ("float");
2884 Qwindow_configuration
= intern ("window-configuration");
2885 Qprocess
= intern ("process");
2886 Qwindow
= intern ("window");
2887 /* Qsubr = intern ("subr"); */
2888 Qcompiled_function
= intern ("compiled-function");
2889 Qbuffer
= intern ("buffer");
2890 Qframe
= intern ("frame");
2891 Qvector
= intern ("vector");
2892 Qchar_table
= intern ("char-table");
2893 Qbool_vector
= intern ("bool-vector");
2894 Qhash_table
= intern ("hash-table");
2896 staticpro (&Qinteger
);
2897 staticpro (&Qsymbol
);
2898 staticpro (&Qstring
);
2900 staticpro (&Qmarker
);
2901 staticpro (&Qoverlay
);
2902 staticpro (&Qfloat
);
2903 staticpro (&Qwindow_configuration
);
2904 staticpro (&Qprocess
);
2905 staticpro (&Qwindow
);
2906 /* staticpro (&Qsubr); */
2907 staticpro (&Qcompiled_function
);
2908 staticpro (&Qbuffer
);
2909 staticpro (&Qframe
);
2910 staticpro (&Qvector
);
2911 staticpro (&Qchar_table
);
2912 staticpro (&Qbool_vector
);
2913 staticpro (&Qhash_table
);
2917 defsubr (&Stype_of
);
2922 defsubr (&Sintegerp
);
2923 defsubr (&Sinteger_or_marker_p
);
2924 defsubr (&Snumberp
);
2925 defsubr (&Snumber_or_marker_p
);
2927 defsubr (&Snatnump
);
2928 defsubr (&Ssymbolp
);
2929 defsubr (&Skeywordp
);
2930 defsubr (&Sstringp
);
2931 defsubr (&Smultibyte_string_p
);
2932 defsubr (&Svectorp
);
2933 defsubr (&Schar_table_p
);
2934 defsubr (&Svector_or_char_table_p
);
2935 defsubr (&Sbool_vector_p
);
2937 defsubr (&Ssequencep
);
2938 defsubr (&Sbufferp
);
2939 defsubr (&Smarkerp
);
2941 defsubr (&Sbyte_code_function_p
);
2942 defsubr (&Schar_or_string_p
);
2945 defsubr (&Scar_safe
);
2946 defsubr (&Scdr_safe
);
2949 defsubr (&Ssymbol_function
);
2950 defsubr (&Sindirect_function
);
2951 defsubr (&Ssymbol_plist
);
2952 defsubr (&Ssymbol_name
);
2953 defsubr (&Smakunbound
);
2954 defsubr (&Sfmakunbound
);
2956 defsubr (&Sfboundp
);
2958 defsubr (&Sdefalias
);
2959 defsubr (&Ssetplist
);
2960 defsubr (&Ssymbol_value
);
2962 defsubr (&Sdefault_boundp
);
2963 defsubr (&Sdefault_value
);
2964 defsubr (&Sset_default
);
2965 defsubr (&Ssetq_default
);
2966 defsubr (&Smake_variable_buffer_local
);
2967 defsubr (&Smake_local_variable
);
2968 defsubr (&Skill_local_variable
);
2969 defsubr (&Smake_variable_frame_local
);
2970 defsubr (&Slocal_variable_p
);
2971 defsubr (&Slocal_variable_if_set_p
);
2974 defsubr (&Snumber_to_string
);
2975 defsubr (&Sstring_to_number
);
2976 defsubr (&Seqlsign
);
2999 defsubr (&Ssubr_arity
);
3001 XSYMBOL (Qwholenump
)->function
= XSYMBOL (Qnatnump
)->function
;
3008 #if defined(USG) && !defined(POSIX_SIGNALS)
3009 /* USG systems forget handlers when they are used;
3010 must reestablish each time */
3011 signal (signo
, arith_error
);
3014 /* VMS systems are like USG. */
3015 signal (signo
, arith_error
);
3019 #else /* not BSD4_1 */
3020 sigsetmask (SIGEMPTYMASK
);
3021 #endif /* not BSD4_1 */
3023 Fsignal (Qarith_error
, Qnil
);
3029 /* Don't do this if just dumping out.
3030 We don't want to call `signal' in this case
3031 so that we don't have trouble with dumping
3032 signal-delivering routines in an inconsistent state. */
3036 #endif /* CANNOT_DUMP */
3037 signal (SIGFPE
, arith_error
);
3040 signal (SIGEMT
, arith_error
);