1 /* Primitive operations on Lisp data types for GNU Emacs Lisp interpreter.
2 Copyright (C) 1985, 1986, 1988, 1993 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 1, 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, 675 Mass Ave, Cambridge, MA 02139, USA. */
31 #include "syssignal.h"
33 #if 0 /* That is untrue--XINT is used below, and it uses INTBITS.
34 What in the world is values.h, anyway? */
36 /* These are redefined in values.h and not used here */
43 #ifdef LISP_FLOAT_TYPE
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
60 #endif /* LISP_FLOAT_TYPE */
63 extern double atof ();
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
, Qwholenump
, 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
;
81 Lisp_Object Qrange_error
, Qdomain_error
, Qsingularity_error
;
82 Lisp_Object Qoverflow_error
, Qunderflow_error
;
84 #ifdef LISP_FLOAT_TYPE
86 Lisp_Object Qnumberp
, Qnumber_or_marker_p
;
89 static Lisp_Object
swap_in_symval_forwarding ();
92 wrong_type_argument (predicate
, value
)
93 register Lisp_Object predicate
, value
;
95 register Lisp_Object tem
;
98 if (!EQ (Vmocklisp_arguments
, Qt
))
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
);
106 value
= Fsignal (Qwrong_type_argument
, Fcons (predicate
, Fcons (value
, Qnil
)));
107 tem
= call1 (predicate
, value
);
115 error ("Attempt to modify read-only object");
119 args_out_of_range (a1
, a2
)
123 Fsignal (Qargs_out_of_range
, Fcons (a1
, Fcons (a2
, Qnil
)));
127 args_out_of_range_3 (a1
, a2
, a3
)
128 Lisp_Object a1
, a2
, a3
;
131 Fsignal (Qargs_out_of_range
, Fcons (a1
, Fcons (a2
, Fcons (a3
, Qnil
))));
138 register Lisp_Object val
;
139 XSET (val
, Lisp_Int
, num
);
143 /* On some machines, XINT needs a temporary location.
144 Here it is, in case it is needed. */
146 int sign_extend_temp
;
148 /* On a few machines, XINT can only be done by calling this. */
151 sign_extend_lisp_int (num
)
154 if (num
& (1 << (VALBITS
- 1)))
155 return num
| ((-1) << VALBITS
);
157 return num
& ((1 << VALBITS
) - 1);
160 /* Data type predicates */
162 DEFUN ("eq", Feq
, Seq
, 2, 2, 0,
163 "T if the two args are the same Lisp object.")
165 Lisp_Object obj1
, obj2
;
172 DEFUN ("null", Fnull
, Snull
, 1, 1, 0, "T if OBJECT is nil.")
181 DEFUN ("consp", Fconsp
, Sconsp
, 1, 1, 0, "T if OBJECT is a cons cell.")
185 if (XTYPE (obj
) == Lisp_Cons
)
190 DEFUN ("atom", Fatom
, Satom
, 1, 1, 0, "T if OBJECT is not a cons cell. This includes nil.")
194 if (XTYPE (obj
) == Lisp_Cons
)
199 DEFUN ("listp", Flistp
, Slistp
, 1, 1, 0, "T if OBJECT is a list. This includes nil.")
203 if (XTYPE (obj
) == Lisp_Cons
|| NILP (obj
))
208 DEFUN ("nlistp", Fnlistp
, Snlistp
, 1, 1, 0, "T if OBJECT is not a list. Lists include nil.")
212 if (XTYPE (obj
) == Lisp_Cons
|| NILP (obj
))
217 DEFUN ("symbolp", Fsymbolp
, Ssymbolp
, 1, 1, 0, "T if OBJECT is a symbol.")
221 if (XTYPE (obj
) == Lisp_Symbol
)
226 DEFUN ("vectorp", Fvectorp
, Svectorp
, 1, 1, 0, "T if OBJECT is a vector.")
230 if (XTYPE (obj
) == Lisp_Vector
)
235 DEFUN ("stringp", Fstringp
, Sstringp
, 1, 1, 0, "T if OBJECT is a string.")
239 if (XTYPE (obj
) == Lisp_String
)
244 DEFUN ("arrayp", Farrayp
, Sarrayp
, 1, 1, 0, "T if OBJECT is an array (string or vector).")
248 if (XTYPE (obj
) == Lisp_Vector
|| XTYPE (obj
) == Lisp_String
)
253 DEFUN ("sequencep", Fsequencep
, Ssequencep
, 1, 1, 0,
254 "T if OBJECT is a sequence (list or array).")
256 register Lisp_Object obj
;
258 if (CONSP (obj
) || NILP (obj
) ||
259 XTYPE (obj
) == Lisp_Vector
|| XTYPE (obj
) == Lisp_String
)
264 DEFUN ("bufferp", Fbufferp
, Sbufferp
, 1, 1, 0, "T if OBJECT is an editor buffer.")
268 if (XTYPE (obj
) == Lisp_Buffer
)
273 DEFUN ("markerp", Fmarkerp
, Smarkerp
, 1, 1, 0, "T if OBJECT is a marker (editor pointer).")
277 if (XTYPE (obj
) == Lisp_Marker
)
282 DEFUN ("subrp", Fsubrp
, Ssubrp
, 1, 1, 0, "T if OBJECT is a built-in function.")
286 if (XTYPE (obj
) == Lisp_Subr
)
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.")
296 if (XTYPE (obj
) == Lisp_Compiled
)
301 DEFUN ("char-or-string-p", Fchar_or_string_p
, Schar_or_string_p
, 1, 1, 0,
302 "T if OBJECT is a character (an integer) or a string.")
304 register Lisp_Object obj
;
306 if (XTYPE (obj
) == Lisp_Int
|| XTYPE (obj
) == Lisp_String
)
311 DEFUN ("integerp", Fintegerp
, Sintegerp
, 1, 1, 0, "T if OBJECT is an integer.")
315 if (XTYPE (obj
) == Lisp_Int
)
320 DEFUN ("integer-or-marker-p", Finteger_or_marker_p
, Sinteger_or_marker_p
, 1, 1, 0,
321 "T if OBJECT is an integer or a marker (editor pointer).")
323 register Lisp_Object obj
;
325 if (XTYPE (obj
) == Lisp_Marker
|| XTYPE (obj
) == Lisp_Int
)
330 DEFUN ("natnump", Fnatnump
, Snatnump
, 1, 1, 0,
331 "T if OBJECT is a nonnegative integer.")
335 if (XTYPE (obj
) == Lisp_Int
&& XINT (obj
) >= 0)
340 DEFUN ("numberp", Fnumberp
, Snumberp
, 1, 1, 0,
341 "T if OBJECT is a number (floating point or integer).")
351 DEFUN ("number-or-marker-p", Fnumber_or_marker_p
,
352 Snumber_or_marker_p
, 1, 1, 0,
353 "T if OBJECT is a number or a marker.")
358 || XTYPE (obj
) == Lisp_Marker
)
363 #ifdef LISP_FLOAT_TYPE
364 DEFUN ("floatp", Ffloatp
, Sfloatp
, 1, 1, 0,
365 "T if OBJECT is a floating point number.")
369 if (XTYPE (obj
) == Lisp_Float
)
373 #endif /* LISP_FLOAT_TYPE */
375 /* Extract and set components of lists */
377 DEFUN ("car", Fcar
, Scar
, 1, 1, 0,
378 "Return the car of CONSCELL. If arg is nil, return nil.\n\
379 Error if arg is not nil and not a cons cell. See also `car-safe'.")
381 register Lisp_Object list
;
385 if (XTYPE (list
) == Lisp_Cons
)
386 return XCONS (list
)->car
;
387 else if (EQ (list
, Qnil
))
390 list
= wrong_type_argument (Qlistp
, list
);
394 DEFUN ("car-safe", Fcar_safe
, Scar_safe
, 1, 1, 0,
395 "Return the car of OBJECT if it is a cons cell, or else nil.")
399 if (XTYPE (object
) == Lisp_Cons
)
400 return XCONS (object
)->car
;
405 DEFUN ("cdr", Fcdr
, Scdr
, 1, 1, 0,
406 "Return the cdr of CONSCELL. If arg is nil, return nil.\n\
407 Error if arg is not nil and not a cons cell. See also `cdr-safe'.")
410 register Lisp_Object list
;
414 if (XTYPE (list
) == Lisp_Cons
)
415 return XCONS (list
)->cdr
;
416 else if (EQ (list
, Qnil
))
419 list
= wrong_type_argument (Qlistp
, list
);
423 DEFUN ("cdr-safe", Fcdr_safe
, Scdr_safe
, 1, 1, 0,
424 "Return the cdr of OBJECT if it is a cons cell, or else nil.")
428 if (XTYPE (object
) == Lisp_Cons
)
429 return XCONS (object
)->cdr
;
434 DEFUN ("setcar", Fsetcar
, Ssetcar
, 2, 2, 0,
435 "Set the car of CONSCELL to be NEWCAR. Returns NEWCAR.")
437 register Lisp_Object cell
, newcar
;
439 if (XTYPE (cell
) != Lisp_Cons
)
440 cell
= wrong_type_argument (Qconsp
, cell
);
443 XCONS (cell
)->car
= newcar
;
447 DEFUN ("setcdr", Fsetcdr
, Ssetcdr
, 2, 2, 0,
448 "Set the cdr of CONSCELL to be NEWCDR. Returns NEWCDR.")
450 register Lisp_Object cell
, newcdr
;
452 if (XTYPE (cell
) != Lisp_Cons
)
453 cell
= wrong_type_argument (Qconsp
, cell
);
456 XCONS (cell
)->cdr
= newcdr
;
460 /* Extract and set components of symbols */
462 DEFUN ("boundp", Fboundp
, Sboundp
, 1, 1, 0, "T if SYMBOL's value is not void.")
464 register Lisp_Object sym
;
466 Lisp_Object valcontents
;
467 CHECK_SYMBOL (sym
, 0);
469 valcontents
= XSYMBOL (sym
)->value
;
471 #ifdef SWITCH_ENUM_BUG
472 switch ((int) XTYPE (valcontents
))
474 switch (XTYPE (valcontents
))
477 case Lisp_Buffer_Local_Value
:
478 case Lisp_Some_Buffer_Local_Value
:
479 valcontents
= swap_in_symval_forwarding (sym
, valcontents
);
482 return (XTYPE (valcontents
) == Lisp_Void
|| EQ (valcontents
, Qunbound
)
486 DEFUN ("fboundp", Ffboundp
, Sfboundp
, 1, 1, 0, "T if SYMBOL's function definition is not void.")
488 register Lisp_Object sym
;
490 CHECK_SYMBOL (sym
, 0);
491 return (XTYPE (XSYMBOL (sym
)->function
) == Lisp_Void
492 || EQ (XSYMBOL (sym
)->function
, Qunbound
))
496 DEFUN ("makunbound", Fmakunbound
, Smakunbound
, 1, 1, 0, "Make SYMBOL's value be void.")
498 register Lisp_Object sym
;
500 CHECK_SYMBOL (sym
, 0);
501 if (NILP (sym
) || EQ (sym
, Qt
))
502 return Fsignal (Qsetting_constant
, Fcons (sym
, Qnil
));
503 Fset (sym
, Qunbound
);
507 DEFUN ("fmakunbound", Ffmakunbound
, Sfmakunbound
, 1, 1, 0, "Make SYMBOL's function definition be void.")
509 register Lisp_Object sym
;
511 CHECK_SYMBOL (sym
, 0);
512 XSYMBOL (sym
)->function
= Qunbound
;
516 DEFUN ("symbol-function", Fsymbol_function
, Ssymbol_function
, 1, 1, 0,
517 "Return SYMBOL's function definition. Error if that is void.")
519 register Lisp_Object symbol
;
521 CHECK_SYMBOL (symbol
, 0);
522 if (EQ (XSYMBOL (symbol
)->function
, Qunbound
))
523 return Fsignal (Qvoid_function
, Fcons (symbol
, Qnil
));
524 return XSYMBOL (symbol
)->function
;
527 DEFUN ("symbol-plist", Fsymbol_plist
, Ssymbol_plist
, 1, 1, 0, "Return SYMBOL's property list.")
529 register Lisp_Object sym
;
531 CHECK_SYMBOL (sym
, 0);
532 return XSYMBOL (sym
)->plist
;
535 DEFUN ("symbol-name", Fsymbol_name
, Ssymbol_name
, 1, 1, 0, "Return SYMBOL's name, a string.")
537 register Lisp_Object sym
;
539 register Lisp_Object name
;
541 CHECK_SYMBOL (sym
, 0);
542 XSET (name
, Lisp_String
, XSYMBOL (sym
)->name
);
546 DEFUN ("fset", Ffset
, Sfset
, 2, 2, 0,
547 "Set SYMBOL's function definition to NEWVAL, and return NEWVAL.")
549 register Lisp_Object sym
, newdef
;
551 CHECK_SYMBOL (sym
, 0);
553 if (!NILP (Vautoload_queue
) && !EQ (XSYMBOL (sym
)->function
, Qunbound
))
554 Vautoload_queue
= Fcons (Fcons (sym
, XSYMBOL (sym
)->function
),
556 XSYMBOL (sym
)->function
= newdef
;
560 /* This name should be removed once it is eliminated from elsewhere. */
562 DEFUN ("defalias", Fdefalias
, Sdefalias
, 2, 2, 0,
563 "Set SYMBOL's function definition to NEWVAL, and return NEWVAL.\n\
564 Associates the function with the current load file, if any.")
566 register Lisp_Object sym
, newdef
;
568 CHECK_SYMBOL (sym
, 0);
569 if (!NILP (Vautoload_queue
) && !EQ (XSYMBOL (sym
)->function
, Qunbound
))
570 Vautoload_queue
= Fcons (Fcons (sym
, XSYMBOL (sym
)->function
),
572 XSYMBOL (sym
)->function
= newdef
;
573 LOADHIST_ATTACH (sym
);
577 DEFUN ("define-function", Fdefine_function
, Sdefine_function
, 2, 2, 0,
578 "Set SYMBOL's function definition to NEWVAL, and return NEWVAL.\n\
579 Associates the function with the current load file, if any.")
581 register Lisp_Object sym
, newdef
;
583 CHECK_SYMBOL (sym
, 0);
584 if (!NILP (Vautoload_queue
) && !EQ (XSYMBOL (sym
)->function
, Qunbound
))
585 Vautoload_queue
= Fcons (Fcons (sym
, XSYMBOL (sym
)->function
),
587 XSYMBOL (sym
)->function
= newdef
;
588 LOADHIST_ATTACH (sym
);
592 DEFUN ("setplist", Fsetplist
, Ssetplist
, 2, 2, 0,
593 "Set SYMBOL's property list to NEWVAL, and return NEWVAL.")
595 register Lisp_Object sym
, newplist
;
597 CHECK_SYMBOL (sym
, 0);
598 XSYMBOL (sym
)->plist
= newplist
;
603 /* Getting and setting values of symbols */
605 /* Given the raw contents of a symbol value cell,
606 return the Lisp value of the symbol.
607 This does not handle buffer-local variables; use
608 swap_in_symval_forwarding for that. */
611 do_symval_forwarding (valcontents
)
612 register Lisp_Object valcontents
;
614 register Lisp_Object val
;
615 #ifdef SWITCH_ENUM_BUG
616 switch ((int) XTYPE (valcontents
))
618 switch (XTYPE (valcontents
))
622 XSET (val
, Lisp_Int
, *XINTPTR (valcontents
));
626 if (*XINTPTR (valcontents
))
631 return *XOBJFWD (valcontents
);
633 case Lisp_Buffer_Objfwd
:
634 return *(Lisp_Object
*)(XUINT (valcontents
) + (char *)current_buffer
);
639 /* Store NEWVAL into SYM, where VALCONTENTS is found in the value cell
640 of SYM. If SYM is buffer-local, VALCONTENTS should be the
641 buffer-independent contents of the value cell: forwarded just one
642 step past the buffer-localness. */
645 store_symval_forwarding (sym
, valcontents
, newval
)
647 register Lisp_Object valcontents
, newval
;
649 #ifdef SWITCH_ENUM_BUG
650 switch ((int) XTYPE (valcontents
))
652 switch (XTYPE (valcontents
))
656 CHECK_NUMBER (newval
, 1);
657 *XINTPTR (valcontents
) = XINT (newval
);
661 *XINTPTR (valcontents
) = NILP(newval
) ? 0 : 1;
665 *XOBJFWD (valcontents
) = newval
;
668 case Lisp_Buffer_Objfwd
:
670 unsigned int offset
= XUINT (valcontents
);
673 type
= *(Lisp_Object
*)(offset
+ (char *)&buffer_local_types
);
674 if (! NILP (type
) && ! NILP (newval
)
675 && XTYPE (newval
) != XINT (type
))
676 buffer_slot_type_mismatch (valcontents
, newval
);
678 *(Lisp_Object
*)(XUINT (valcontents
) + (char *)current_buffer
)
684 valcontents
= XSYMBOL (sym
)->value
;
685 if (XTYPE (valcontents
) == Lisp_Buffer_Local_Value
686 || XTYPE (valcontents
) == Lisp_Some_Buffer_Local_Value
)
687 XCONS (XSYMBOL (sym
)->value
)->car
= newval
;
689 XSYMBOL (sym
)->value
= newval
;
693 /* Set up the buffer-local symbol SYM for validity in the current
694 buffer. VALCONTENTS is the contents of its value cell.
695 Return the value forwarded one step past the buffer-local indicator. */
698 swap_in_symval_forwarding (sym
, valcontents
)
699 Lisp_Object sym
, valcontents
;
701 /* valcontents is a list
702 (REALVALUE BUFFER CURRENT-ALIST-ELEMENT . DEFAULT-VALUE)).
704 CURRENT-ALIST-ELEMENT is a pointer to an element of BUFFER's
705 local_var_alist, that being the element whose car is this
706 variable. Or it can be a pointer to the
707 (CURRENT-ALIST-ELEMENT . DEFAULT-VALUE), if BUFFER does not have
708 an element in its alist for this variable.
710 If the current buffer is not BUFFER, we store the current
711 REALVALUE value into CURRENT-ALIST-ELEMENT, then find the
712 appropriate alist element for the buffer now current and set up
713 CURRENT-ALIST-ELEMENT. Then we set REALVALUE out of that
714 element, and store into BUFFER.
716 Note that REALVALUE can be a forwarding pointer. */
718 register Lisp_Object tem1
;
719 tem1
= XCONS (XCONS (valcontents
)->cdr
)->car
;
721 if (NILP (tem1
) || current_buffer
!= XBUFFER (tem1
))
723 tem1
= XCONS (XCONS (XCONS (valcontents
)->cdr
)->cdr
)->car
;
724 Fsetcdr (tem1
, do_symval_forwarding (XCONS (valcontents
)->car
));
725 tem1
= assq_no_quit (sym
, current_buffer
->local_var_alist
);
727 tem1
= XCONS (XCONS (valcontents
)->cdr
)->cdr
;
728 XCONS (XCONS (XCONS (valcontents
)->cdr
)->cdr
)->car
= tem1
;
729 XSET (XCONS (XCONS (valcontents
)->cdr
)->car
, Lisp_Buffer
, current_buffer
);
730 store_symval_forwarding (sym
, XCONS (valcontents
)->car
, Fcdr (tem1
));
732 return XCONS (valcontents
)->car
;
735 /* Find the value of a symbol, returning Qunbound if it's not bound.
736 This is helpful for code which just wants to get a variable's value
737 if it has one, without signalling an error.
738 Note that it must not be possible to quit
739 within this function. Great care is required for this. */
742 find_symbol_value (sym
)
745 register Lisp_Object valcontents
, tem1
;
746 register Lisp_Object val
;
747 CHECK_SYMBOL (sym
, 0);
748 valcontents
= XSYMBOL (sym
)->value
;
751 #ifdef SWITCH_ENUM_BUG
752 switch ((int) XTYPE (valcontents
))
754 switch (XTYPE (valcontents
))
757 case Lisp_Buffer_Local_Value
:
758 case Lisp_Some_Buffer_Local_Value
:
759 valcontents
= swap_in_symval_forwarding (sym
, valcontents
);
763 XSET (val
, Lisp_Int
, *XINTPTR (valcontents
));
767 if (*XINTPTR (valcontents
))
772 return *XOBJFWD (valcontents
);
774 case Lisp_Buffer_Objfwd
:
775 return *(Lisp_Object
*)(XUINT (valcontents
) + (char *)current_buffer
);
784 DEFUN ("symbol-value", Fsymbol_value
, Ssymbol_value
, 1, 1, 0,
785 "Return SYMBOL's value. Error if that is void.")
791 val
= find_symbol_value (sym
);
792 if (EQ (val
, Qunbound
))
793 return Fsignal (Qvoid_variable
, Fcons (sym
, Qnil
));
798 DEFUN ("set", Fset
, Sset
, 2, 2, 0,
799 "Set SYMBOL's value to NEWVAL, and return NEWVAL.")
801 register Lisp_Object sym
, newval
;
803 int voide
= (XTYPE (newval
) == Lisp_Void
|| EQ (newval
, Qunbound
));
805 #ifndef RTPC_REGISTER_BUG
806 register Lisp_Object valcontents
, tem1
, current_alist_element
;
807 #else /* RTPC_REGISTER_BUG */
808 register Lisp_Object tem1
;
809 Lisp_Object valcontents
, current_alist_element
;
810 #endif /* RTPC_REGISTER_BUG */
812 CHECK_SYMBOL (sym
, 0);
813 if (NILP (sym
) || EQ (sym
, Qt
))
814 return Fsignal (Qsetting_constant
, Fcons (sym
, Qnil
));
815 valcontents
= XSYMBOL (sym
)->value
;
817 if (XTYPE (valcontents
) == Lisp_Buffer_Objfwd
)
819 register int idx
= XUINT (valcontents
);
820 register int mask
= *(int *)(idx
+ (char *) &buffer_local_flags
);
822 current_buffer
->local_var_flags
|= mask
;
825 else if (XTYPE (valcontents
) == Lisp_Buffer_Local_Value
826 || XTYPE (valcontents
) == Lisp_Some_Buffer_Local_Value
)
828 /* valcontents is actually a pointer to a cons heading something like:
829 (REALVALUE BUFFER CURRENT-ALIST-ELEMENT . DEFAULT-VALUE).
831 BUFFER is the last buffer for which this symbol's value was
834 CURRENT-ALIST-ELEMENT is a pointer to an element of BUFFER's
835 local_var_alist, that being the element whose car is this
836 variable. Or it can be a pointer to the
837 (CURRENT-ALIST-ELEMENT . DEFAULT-VALUE), if BUFFER does not
838 have an element in its alist for this variable (that is, if
839 BUFFER sees the default value of this variable).
841 If we want to examine or set the value and BUFFER is current,
842 we just examine or set REALVALUE. If BUFFER is not current, we
843 store the current REALVALUE value into CURRENT-ALIST-ELEMENT,
844 then find the appropriate alist element for the buffer now
845 current and set up CURRENT-ALIST-ELEMENT. Then we set
846 REALVALUE out of that element, and store into BUFFER.
848 If we are setting the variable and the current buffer does
849 not have an alist entry for this variable, an alist entry is
852 Note that REALVALUE can be a forwarding pointer. Each time
853 it is examined or set, forwarding must be done. */
855 /* What value are we caching right now? */
856 current_alist_element
=
857 XCONS (XCONS (XCONS (valcontents
)->cdr
)->cdr
)->car
;
859 /* If the current buffer is not the buffer whose binding is
860 currently cached, or if it's a Lisp_Buffer_Local_Value and
861 we're looking at the default value, the cache is invalid; we
862 need to write it out, and find the new CURRENT-ALIST-ELEMENT. */
864 != XBUFFER (XCONS (XCONS (valcontents
)->cdr
)->car
))
865 || (XTYPE (valcontents
) == Lisp_Buffer_Local_Value
866 && EQ (XCONS (current_alist_element
)->car
,
867 current_alist_element
)))
869 /* Write out the cached value for the old buffer; copy it
870 back to its alist element. This works if the current
871 buffer only sees the default value, too. */
872 Fsetcdr (current_alist_element
,
873 do_symval_forwarding (XCONS (valcontents
)->car
));
875 /* Find the new value for CURRENT-ALIST-ELEMENT. */
876 tem1
= Fassq (sym
, current_buffer
->local_var_alist
);
879 /* This buffer still sees the default value. */
881 /* If the variable is a Lisp_Some_Buffer_Local_Value,
882 make CURRENT-ALIST-ELEMENT point to itself,
883 indicating that we're seeing the default value. */
884 if (XTYPE (valcontents
) == Lisp_Some_Buffer_Local_Value
)
885 tem1
= XCONS (XCONS (valcontents
)->cdr
)->cdr
;
887 /* If it's a Lisp_Buffer_Local_Value, give this buffer a
888 new assoc for a local value and set
889 CURRENT-ALIST-ELEMENT to point to that. */
892 tem1
= Fcons (sym
, Fcdr (current_alist_element
));
893 current_buffer
->local_var_alist
=
894 Fcons (tem1
, current_buffer
->local_var_alist
);
897 /* Cache the new buffer's assoc in CURRENT-ALIST-ELEMENT. */
898 XCONS (XCONS (XCONS (valcontents
)->cdr
)->cdr
)->car
= tem1
;
900 /* Set BUFFER, now that CURRENT-ALIST-ELEMENT is accurate. */
901 XSET (XCONS (XCONS (valcontents
)->cdr
)->car
,
902 Lisp_Buffer
, current_buffer
);
904 valcontents
= XCONS (valcontents
)->car
;
907 /* If storing void (making the symbol void), forward only through
908 buffer-local indicator, not through Lisp_Objfwd, etc. */
910 store_symval_forwarding (sym
, Qnil
, newval
);
912 store_symval_forwarding (sym
, valcontents
, newval
);
917 /* Access or set a buffer-local symbol's default value. */
919 /* Return the default value of SYM, but don't check for voidness.
920 Return Qunbound or a Lisp_Void object if it is void. */
926 register Lisp_Object valcontents
;
928 CHECK_SYMBOL (sym
, 0);
929 valcontents
= XSYMBOL (sym
)->value
;
931 /* For a built-in buffer-local variable, get the default value
932 rather than letting do_symval_forwarding get the current value. */
933 if (XTYPE (valcontents
) == Lisp_Buffer_Objfwd
)
935 register int idx
= XUINT (valcontents
);
937 if (*(int *) (idx
+ (char *) &buffer_local_flags
) != 0)
938 return *(Lisp_Object
*)(idx
+ (char *) &buffer_defaults
);
941 /* Handle user-created local variables. */
942 if (XTYPE (valcontents
) == Lisp_Buffer_Local_Value
943 || XTYPE (valcontents
) == Lisp_Some_Buffer_Local_Value
)
945 /* If var is set up for a buffer that lacks a local value for it,
946 the current value is nominally the default value.
947 But the current value slot may be more up to date, since
948 ordinary setq stores just that slot. So use that. */
949 Lisp_Object current_alist_element
, alist_element_car
;
950 current_alist_element
951 = XCONS (XCONS (XCONS (valcontents
)->cdr
)->cdr
)->car
;
952 alist_element_car
= XCONS (current_alist_element
)->car
;
953 if (EQ (alist_element_car
, current_alist_element
))
954 return do_symval_forwarding (XCONS (valcontents
)->car
);
956 return XCONS (XCONS (XCONS (valcontents
)->cdr
)->cdr
)->cdr
;
958 /* For other variables, get the current value. */
959 return do_symval_forwarding (valcontents
);
962 DEFUN ("default-boundp", Fdefault_boundp
, Sdefault_boundp
, 1, 1, 0,
963 "Return T if SYMBOL has a non-void default value.\n\
964 This is the value that is seen in buffers that do not have their own values\n\
969 register Lisp_Object value
;
971 value
= default_value (sym
);
972 return (XTYPE (value
) == Lisp_Void
|| EQ (value
, Qunbound
)
976 DEFUN ("default-value", Fdefault_value
, Sdefault_value
, 1, 1, 0,
977 "Return SYMBOL's default value.\n\
978 This is the value that is seen in buffers that do not have their own values\n\
979 for this variable. The default value is meaningful for variables with\n\
980 local bindings in certain buffers.")
984 register Lisp_Object value
;
986 value
= default_value (sym
);
987 if (XTYPE (value
) == Lisp_Void
|| EQ (value
, Qunbound
))
988 return Fsignal (Qvoid_variable
, Fcons (sym
, Qnil
));
992 DEFUN ("set-default", Fset_default
, Sset_default
, 2, 2, 0,
993 "Set SYMBOL's default value to VAL. SYMBOL and VAL are evaluated.\n\
994 The default value is seen in buffers that do not have their own values\n\
997 Lisp_Object sym
, value
;
999 register Lisp_Object valcontents
, current_alist_element
, alist_element_buffer
;
1001 CHECK_SYMBOL (sym
, 0);
1002 valcontents
= XSYMBOL (sym
)->value
;
1004 /* Handle variables like case-fold-search that have special slots
1005 in the buffer. Make them work apparently like Lisp_Buffer_Local_Value
1007 if (XTYPE (valcontents
) == Lisp_Buffer_Objfwd
)
1009 register int idx
= XUINT (valcontents
);
1010 #ifndef RTPC_REGISTER_BUG
1011 register struct buffer
*b
;
1015 register int mask
= *(int *) (idx
+ (char *) &buffer_local_flags
);
1019 *(Lisp_Object
*)(idx
+ (char *) &buffer_defaults
) = value
;
1020 for (b
= all_buffers
; b
; b
= b
->next
)
1021 if (!(b
->local_var_flags
& mask
))
1022 *(Lisp_Object
*)(idx
+ (char *) b
) = value
;
1027 if (XTYPE (valcontents
) != Lisp_Buffer_Local_Value
&&
1028 XTYPE (valcontents
) != Lisp_Some_Buffer_Local_Value
)
1029 return Fset (sym
, value
);
1031 /* Store new value into the DEFAULT-VALUE slot */
1032 XCONS (XCONS (XCONS (valcontents
)->cdr
)->cdr
)->cdr
= value
;
1034 /* If that slot is current, we must set the REALVALUE slot too */
1035 current_alist_element
= XCONS (XCONS (XCONS (valcontents
)->cdr
)->cdr
)->car
;
1036 alist_element_buffer
= Fcar (current_alist_element
);
1037 if (EQ (alist_element_buffer
, current_alist_element
))
1038 store_symval_forwarding (sym
, XCONS (valcontents
)->car
, value
);
1043 DEFUN ("setq-default", Fsetq_default
, Ssetq_default
, 2, UNEVALLED
, 0,
1045 \(setq-default SYM VAL SYM VAL...): set each SYM's default value to its VAL.\n\
1046 VAL is evaluated; SYM is not. The default value is seen in buffers that do\n\
1047 not have their own values for this variable.")
1051 register Lisp_Object args_left
;
1052 register Lisp_Object val
, sym
;
1053 struct gcpro gcpro1
;
1063 val
= Feval (Fcar (Fcdr (args_left
)));
1064 sym
= Fcar (args_left
);
1065 Fset_default (sym
, val
);
1066 args_left
= Fcdr (Fcdr (args_left
));
1068 while (!NILP (args_left
));
1074 /* Lisp functions for creating and removing buffer-local variables. */
1076 DEFUN ("make-variable-buffer-local", Fmake_variable_buffer_local
, Smake_variable_buffer_local
,
1077 1, 1, "vMake Variable Buffer Local: ",
1078 "Make VARIABLE have a separate value for each buffer.\n\
1079 At any time, the value for the current buffer is in effect.\n\
1080 There is also a default value which is seen in any buffer which has not yet\n\
1081 set its own value.\n\
1082 Using `set' or `setq' to set the variable causes it to have a separate value\n\
1083 for the current buffer if it was previously using the default value.\n\
1084 The function `default-value' gets the default value and `set-default' sets it.")
1086 register Lisp_Object sym
;
1088 register Lisp_Object tem
, valcontents
;
1090 CHECK_SYMBOL (sym
, 0);
1092 if (EQ (sym
, Qnil
) || EQ (sym
, Qt
))
1093 error ("Symbol %s may not be buffer-local", XSYMBOL (sym
)->name
->data
);
1095 valcontents
= XSYMBOL (sym
)->value
;
1096 if ((XTYPE (valcontents
) == Lisp_Buffer_Local_Value
) ||
1097 (XTYPE (valcontents
) == Lisp_Buffer_Objfwd
))
1099 if (XTYPE (valcontents
) == Lisp_Some_Buffer_Local_Value
)
1101 XSETTYPE (XSYMBOL (sym
)->value
, Lisp_Buffer_Local_Value
);
1104 if (EQ (valcontents
, Qunbound
))
1105 XSYMBOL (sym
)->value
= Qnil
;
1106 tem
= Fcons (Qnil
, Fsymbol_value (sym
));
1107 XCONS (tem
)->car
= tem
;
1108 XSYMBOL (sym
)->value
= Fcons (XSYMBOL (sym
)->value
, Fcons (Fcurrent_buffer (), tem
));
1109 XSETTYPE (XSYMBOL (sym
)->value
, Lisp_Buffer_Local_Value
);
1113 DEFUN ("make-local-variable", Fmake_local_variable
, Smake_local_variable
,
1114 1, 1, "vMake Local Variable: ",
1115 "Make VARIABLE have a separate value in the current buffer.\n\
1116 Other buffers will continue to share a common default value.\n\
1117 \(The buffer-local value of VARIABLE starts out as the same value\n\
1118 VARIABLE previously had. If VARIABLE was void, it remains void.\)\n\
1119 See also `make-variable-buffer-local'.\n\n\
1120 If the variable is already arranged to become local when set,\n\
1121 this function causes a local value to exist for this buffer,\n\
1122 just as if the variable were set.")
1124 register Lisp_Object sym
;
1126 register Lisp_Object tem
, valcontents
;
1128 CHECK_SYMBOL (sym
, 0);
1130 if (EQ (sym
, Qnil
) || EQ (sym
, Qt
))
1131 error ("Symbol %s may not be buffer-local", XSYMBOL (sym
)->name
->data
);
1133 valcontents
= XSYMBOL (sym
)->value
;
1134 if (XTYPE (valcontents
) == Lisp_Buffer_Local_Value
1135 || XTYPE (valcontents
) == Lisp_Buffer_Objfwd
)
1137 tem
= Fboundp (sym
);
1139 /* Make sure the symbol has a local value in this particular buffer,
1140 by setting it to the same value it already has. */
1141 Fset (sym
, (EQ (tem
, Qt
) ? Fsymbol_value (sym
) : Qunbound
));
1144 /* Make sure sym is set up to hold per-buffer values */
1145 if (XTYPE (valcontents
) != Lisp_Some_Buffer_Local_Value
)
1147 tem
= Fcons (Qnil
, do_symval_forwarding (valcontents
));
1148 XCONS (tem
)->car
= tem
;
1149 XSYMBOL (sym
)->value
= Fcons (XSYMBOL (sym
)->value
, Fcons (Qnil
, tem
));
1150 XSETTYPE (XSYMBOL (sym
)->value
, Lisp_Some_Buffer_Local_Value
);
1152 /* Make sure this buffer has its own value of sym */
1153 tem
= Fassq (sym
, current_buffer
->local_var_alist
);
1156 current_buffer
->local_var_alist
1157 = Fcons (Fcons (sym
, XCONS (XCONS (XCONS (XSYMBOL (sym
)->value
)->cdr
)->cdr
)->cdr
),
1158 current_buffer
->local_var_alist
);
1160 /* Make sure symbol does not think it is set up for this buffer;
1161 force it to look once again for this buffer's value */
1163 /* This local variable avoids "expression too complex" on IBM RT. */
1166 xs
= XSYMBOL (sym
)->value
;
1167 if (current_buffer
== XBUFFER (XCONS (XCONS (xs
)->cdr
)->car
))
1168 XCONS (XCONS (XSYMBOL (sym
)->value
)->cdr
)->car
= Qnil
;
1172 /* If the symbol forwards into a C variable, then swap in the
1173 variable for this buffer immediately. If C code modifies the
1174 variable before we swap in, then that new value will clobber the
1175 default value the next time we swap. */
1176 valcontents
= XCONS (XSYMBOL (sym
)->value
)->car
;
1177 if (XTYPE (valcontents
) == Lisp_Intfwd
1178 || XTYPE (valcontents
) == Lisp_Boolfwd
1179 || XTYPE (valcontents
) == Lisp_Objfwd
)
1180 swap_in_symval_forwarding (sym
, XSYMBOL (sym
)->value
);
1185 DEFUN ("kill-local-variable", Fkill_local_variable
, Skill_local_variable
,
1186 1, 1, "vKill Local Variable: ",
1187 "Make VARIABLE no longer have a separate value in the current buffer.\n\
1188 From now on the default value will apply in this buffer.")
1190 register Lisp_Object sym
;
1192 register Lisp_Object tem
, valcontents
;
1194 CHECK_SYMBOL (sym
, 0);
1196 valcontents
= XSYMBOL (sym
)->value
;
1198 if (XTYPE (valcontents
) == Lisp_Buffer_Objfwd
)
1200 register int idx
= XUINT (valcontents
);
1201 register int mask
= *(int *) (idx
+ (char *) &buffer_local_flags
);
1205 *(Lisp_Object
*)(idx
+ (char *) current_buffer
)
1206 = *(Lisp_Object
*)(idx
+ (char *) &buffer_defaults
);
1207 current_buffer
->local_var_flags
&= ~mask
;
1212 if (XTYPE (valcontents
) != Lisp_Buffer_Local_Value
&&
1213 XTYPE (valcontents
) != Lisp_Some_Buffer_Local_Value
)
1216 /* Get rid of this buffer's alist element, if any */
1218 tem
= Fassq (sym
, current_buffer
->local_var_alist
);
1220 current_buffer
->local_var_alist
= Fdelq (tem
, current_buffer
->local_var_alist
);
1222 /* Make sure symbol does not think it is set up for this buffer;
1223 force it to look once again for this buffer's value */
1226 sv
= XSYMBOL (sym
)->value
;
1227 if (current_buffer
== XBUFFER (XCONS (XCONS (sv
)->cdr
)->car
))
1228 XCONS (XCONS (sv
)->cdr
)->car
= Qnil
;
1234 /* Find the function at the end of a chain of symbol function indirections. */
1236 /* If OBJECT is a symbol, find the end of its function chain and
1237 return the value found there. If OBJECT is not a symbol, just
1238 return it. If there is a cycle in the function chain, signal a
1239 cyclic-function-indirection error.
1241 This is like Findirect_function, except that it doesn't signal an
1242 error if the chain ends up unbound. */
1244 indirect_function (object
)
1245 register Lisp_Object object
;
1247 Lisp_Object tortoise
, hare
;
1249 hare
= tortoise
= object
;
1253 if (XTYPE (hare
) != Lisp_Symbol
|| EQ (hare
, Qunbound
))
1255 hare
= XSYMBOL (hare
)->function
;
1256 if (XTYPE (hare
) != Lisp_Symbol
|| EQ (hare
, Qunbound
))
1258 hare
= XSYMBOL (hare
)->function
;
1260 tortoise
= XSYMBOL (tortoise
)->function
;
1262 if (EQ (hare
, tortoise
))
1263 Fsignal (Qcyclic_function_indirection
, Fcons (object
, Qnil
));
1269 DEFUN ("indirect-function", Findirect_function
, Sindirect_function
, 1, 1, 0,
1270 "Return the function at the end of OBJECT's function chain.\n\
1271 If OBJECT is a symbol, follow all function indirections and return the final\n\
1272 function binding.\n\
1273 If OBJECT is not a symbol, just return it.\n\
1274 Signal a void-function error if the final symbol is unbound.\n\
1275 Signal a cyclic-function-indirection error if there is a loop in the\n\
1276 function chain of symbols.")
1278 register Lisp_Object object
;
1282 result
= indirect_function (object
);
1284 if (EQ (result
, Qunbound
))
1285 return Fsignal (Qvoid_function
, Fcons (object
, Qnil
));
1289 /* Extract and set vector and string elements */
1291 DEFUN ("aref", Faref
, Saref
, 2, 2, 0,
1292 "Return the element of ARRAY at index INDEX.\n\
1293 ARRAY may be a vector or a string, or a byte-code object. INDEX starts at 0.")
1295 register Lisp_Object array
;
1298 register int idxval
;
1300 CHECK_NUMBER (idx
, 1);
1301 idxval
= XINT (idx
);
1302 if (XTYPE (array
) != Lisp_Vector
&& XTYPE (array
) != Lisp_String
1303 && XTYPE (array
) != Lisp_Compiled
)
1304 array
= wrong_type_argument (Qarrayp
, array
);
1305 if (idxval
< 0 || idxval
>= XVECTOR (array
)->size
)
1306 args_out_of_range (array
, idx
);
1307 if (XTYPE (array
) == Lisp_String
)
1310 XFASTINT (val
) = (unsigned char) XSTRING (array
)->data
[idxval
];
1314 return XVECTOR (array
)->contents
[idxval
];
1317 DEFUN ("aset", Faset
, Saset
, 3, 3, 0,
1318 "Store into the element of ARRAY at index IDX the value NEWELT.\n\
1319 ARRAY may be a vector or a string. IDX starts at 0.")
1320 (array
, idx
, newelt
)
1321 register Lisp_Object array
;
1322 Lisp_Object idx
, newelt
;
1324 register int idxval
;
1326 CHECK_NUMBER (idx
, 1);
1327 idxval
= XINT (idx
);
1328 if (XTYPE (array
) != Lisp_Vector
&& XTYPE (array
) != Lisp_String
)
1329 array
= wrong_type_argument (Qarrayp
, array
);
1330 if (idxval
< 0 || idxval
>= XVECTOR (array
)->size
)
1331 args_out_of_range (array
, idx
);
1332 CHECK_IMPURE (array
);
1334 if (XTYPE (array
) == Lisp_Vector
)
1335 XVECTOR (array
)->contents
[idxval
] = newelt
;
1338 CHECK_NUMBER (newelt
, 2);
1339 XSTRING (array
)->data
[idxval
] = XINT (newelt
);
1346 Farray_length (array
)
1347 register Lisp_Object array
;
1349 register Lisp_Object size
;
1350 if (XTYPE (array
) != Lisp_Vector
&& XTYPE (array
) != Lisp_String
1351 && XTYPE (array
) != Lisp_Compiled
)
1352 array
= wrong_type_argument (Qarrayp
, array
);
1353 XFASTINT (size
) = XVECTOR (array
)->size
;
1357 /* Arithmetic functions */
1359 enum comparison
{ equal
, notequal
, less
, grtr
, less_or_equal
, grtr_or_equal
};
1362 arithcompare (num1
, num2
, comparison
)
1363 Lisp_Object num1
, num2
;
1364 enum comparison comparison
;
1369 #ifdef LISP_FLOAT_TYPE
1370 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num1
, 0);
1371 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num2
, 0);
1373 if (XTYPE (num1
) == Lisp_Float
|| XTYPE (num2
) == Lisp_Float
)
1376 f1
= (XTYPE (num1
) == Lisp_Float
) ? XFLOAT (num1
)->data
: XINT (num1
);
1377 f2
= (XTYPE (num2
) == Lisp_Float
) ? XFLOAT (num2
)->data
: XINT (num2
);
1380 CHECK_NUMBER_COERCE_MARKER (num1
, 0);
1381 CHECK_NUMBER_COERCE_MARKER (num2
, 0);
1382 #endif /* LISP_FLOAT_TYPE */
1387 if (floatp
? f1
== f2
: XINT (num1
) == XINT (num2
))
1392 if (floatp
? f1
!= f2
: XINT (num1
) != XINT (num2
))
1397 if (floatp
? f1
< f2
: XINT (num1
) < XINT (num2
))
1402 if (floatp
? f1
<= f2
: XINT (num1
) <= XINT (num2
))
1407 if (floatp
? f1
> f2
: XINT (num1
) > XINT (num2
))
1412 if (floatp
? f1
>= f2
: XINT (num1
) >= XINT (num2
))
1421 DEFUN ("=", Feqlsign
, Seqlsign
, 2, 2, 0,
1422 "T if two args, both numbers or markers, are equal.")
1424 register Lisp_Object num1
, num2
;
1426 return arithcompare (num1
, num2
, equal
);
1429 DEFUN ("<", Flss
, Slss
, 2, 2, 0,
1430 "T if first arg is less than second arg. Both must be numbers or markers.")
1432 register Lisp_Object num1
, num2
;
1434 return arithcompare (num1
, num2
, less
);
1437 DEFUN (">", Fgtr
, Sgtr
, 2, 2, 0,
1438 "T if first arg is greater than second arg. Both must be numbers or markers.")
1440 register Lisp_Object num1
, num2
;
1442 return arithcompare (num1
, num2
, grtr
);
1445 DEFUN ("<=", Fleq
, Sleq
, 2, 2, 0,
1446 "T if first arg is less than or equal to second arg.\n\
1447 Both must be numbers or markers.")
1449 register Lisp_Object num1
, num2
;
1451 return arithcompare (num1
, num2
, less_or_equal
);
1454 DEFUN (">=", Fgeq
, Sgeq
, 2, 2, 0,
1455 "T if first arg is greater than or equal to second arg.\n\
1456 Both must be numbers or markers.")
1458 register Lisp_Object num1
, num2
;
1460 return arithcompare (num1
, num2
, grtr_or_equal
);
1463 DEFUN ("/=", Fneq
, Sneq
, 2, 2, 0,
1464 "T if first arg is not equal to second arg. Both must be numbers or markers.")
1466 register Lisp_Object num1
, num2
;
1468 return arithcompare (num1
, num2
, notequal
);
1471 DEFUN ("zerop", Fzerop
, Szerop
, 1, 1, 0, "T if NUMBER is zero.")
1473 register Lisp_Object num
;
1475 #ifdef LISP_FLOAT_TYPE
1476 CHECK_NUMBER_OR_FLOAT (num
, 0);
1478 if (XTYPE(num
) == Lisp_Float
)
1480 if (XFLOAT(num
)->data
== 0.0)
1485 CHECK_NUMBER (num
, 0);
1486 #endif /* LISP_FLOAT_TYPE */
1493 /* Convert between 32-bit values and pairs of lispy 24-bit values. */
1499 unsigned int top
= i
>> 16;
1500 unsigned int bot
= i
& 0xFFFF;
1502 return make_number (bot
);
1504 return Fcons (make_number (-1), make_number (bot
));
1505 return Fcons (make_number (top
), make_number (bot
));
1512 Lisp_Object top
, bot
;
1515 top
= XCONS (c
)->car
;
1516 bot
= XCONS (c
)->cdr
;
1518 bot
= XCONS (bot
)->car
;
1519 return ((XINT (top
) << 16) | XINT (bot
));
1522 DEFUN ("number-to-string", Fnumber_to_string
, Snumber_to_string
, 1, 1, 0,
1523 "Convert NUM to a string by printing it in decimal.\n\
1524 Uses a minus sign if negative.\n\
1525 NUM may be an integer or a floating point number.")
1531 #ifndef LISP_FLOAT_TYPE
1532 CHECK_NUMBER (num
, 0);
1534 CHECK_NUMBER_OR_FLOAT (num
, 0);
1536 if (XTYPE(num
) == Lisp_Float
)
1538 char pigbuf
[350]; /* see comments in float_to_string */
1540 float_to_string (pigbuf
, XFLOAT(num
)->data
);
1541 return build_string (pigbuf
);
1543 #endif /* LISP_FLOAT_TYPE */
1545 sprintf (buffer
, "%d", XINT (num
));
1546 return build_string (buffer
);
1549 DEFUN ("string-to-number", Fstring_to_number
, Sstring_to_number
, 1, 1, 0,
1550 "Convert STRING to a number by parsing it as a decimal number.\n\
1551 This parses both integers and floating point numbers.\n\
1552 It ignores leading spaces and tabs.")
1554 register Lisp_Object str
;
1558 CHECK_STRING (str
, 0);
1560 p
= XSTRING (str
)->data
;
1562 /* Skip any whitespace at the front of the number. Some versions of
1563 atoi do this anyway, so we might as well make Emacs lisp consistent. */
1564 while (*p
== ' ' || *p
== '\t')
1567 #ifdef LISP_FLOAT_TYPE
1568 if (isfloat_string (p
))
1569 return make_float (atof (p
));
1570 #endif /* LISP_FLOAT_TYPE */
1572 return make_number (atoi (p
));
1576 { Aadd
, Asub
, Amult
, Adiv
, Alogand
, Alogior
, Alogxor
, Amax
, Amin
};
1578 extern Lisp_Object
float_arith_driver ();
1581 arith_driver (code
, nargs
, args
)
1584 register Lisp_Object
*args
;
1586 register Lisp_Object val
;
1587 register int argnum
;
1591 #ifdef SWITCH_ENUM_BUG
1608 for (argnum
= 0; argnum
< nargs
; argnum
++)
1610 val
= args
[argnum
]; /* using args[argnum] as argument to CHECK_NUMBER_... */
1611 #ifdef LISP_FLOAT_TYPE
1612 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val
, argnum
);
1614 if (XTYPE (val
) == Lisp_Float
) /* time to do serious math */
1615 return (float_arith_driver ((double) accum
, argnum
, code
,
1618 CHECK_NUMBER_COERCE_MARKER (val
, argnum
);
1619 #endif /* LISP_FLOAT_TYPE */
1620 args
[argnum
] = val
; /* runs into a compiler bug. */
1621 next
= XINT (args
[argnum
]);
1622 #ifdef SWITCH_ENUM_BUG
1628 case Aadd
: accum
+= next
; break;
1630 if (!argnum
&& nargs
!= 1)
1634 case Amult
: accum
*= next
; break;
1636 if (!argnum
) accum
= next
;
1640 Fsignal (Qarith_error
, Qnil
);
1644 case Alogand
: accum
&= next
; break;
1645 case Alogior
: accum
|= next
; break;
1646 case Alogxor
: accum
^= next
; break;
1647 case Amax
: if (!argnum
|| next
> accum
) accum
= next
; break;
1648 case Amin
: if (!argnum
|| next
< accum
) accum
= next
; break;
1652 XSET (val
, Lisp_Int
, accum
);
1656 #ifdef LISP_FLOAT_TYPE
1659 #define isnan(x) ((x) != (x))
1662 float_arith_driver (accum
, argnum
, code
, nargs
, args
)
1664 register int argnum
;
1667 register Lisp_Object
*args
;
1669 register Lisp_Object val
;
1672 for (; argnum
< nargs
; argnum
++)
1674 val
= args
[argnum
]; /* using args[argnum] as argument to CHECK_NUMBER_... */
1675 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val
, argnum
);
1677 if (XTYPE (val
) == Lisp_Float
)
1679 next
= XFLOAT (val
)->data
;
1683 args
[argnum
] = val
; /* runs into a compiler bug. */
1684 next
= XINT (args
[argnum
]);
1686 #ifdef SWITCH_ENUM_BUG
1696 if (!argnum
&& nargs
!= 1)
1709 Fsignal (Qarith_error
, Qnil
);
1716 return wrong_type_argument (Qinteger_or_marker_p
, val
);
1718 if (!argnum
|| isnan (next
) || next
> accum
)
1722 if (!argnum
|| isnan (next
) || next
< accum
)
1728 return make_float (accum
);
1730 #endif /* LISP_FLOAT_TYPE */
1732 DEFUN ("+", Fplus
, Splus
, 0, MANY
, 0,
1733 "Return sum of any number of arguments, which are numbers or markers.")
1738 return arith_driver (Aadd
, nargs
, args
);
1741 DEFUN ("-", Fminus
, Sminus
, 0, MANY
, 0,
1742 "Negate number or subtract numbers or markers.\n\
1743 With one arg, negates it. With more than one arg,\n\
1744 subtracts all but the first from the first.")
1749 return arith_driver (Asub
, nargs
, args
);
1752 DEFUN ("*", Ftimes
, Stimes
, 0, MANY
, 0,
1753 "Returns product of any number of arguments, which are numbers or markers.")
1758 return arith_driver (Amult
, nargs
, args
);
1761 DEFUN ("/", Fquo
, Squo
, 2, MANY
, 0,
1762 "Returns first argument divided by all the remaining arguments.\n\
1763 The arguments must be numbers or markers.")
1768 return arith_driver (Adiv
, nargs
, args
);
1771 DEFUN ("%", Frem
, Srem
, 2, 2, 0,
1772 "Returns remainder of first arg divided by second.\n\
1773 Both must be integers or markers.")
1775 register Lisp_Object num1
, num2
;
1779 CHECK_NUMBER_COERCE_MARKER (num1
, 0);
1780 CHECK_NUMBER_COERCE_MARKER (num2
, 1);
1782 if (XFASTINT (num2
) == 0)
1783 Fsignal (Qarith_error
, Qnil
);
1785 XSET (val
, Lisp_Int
, XINT (num1
) % XINT (num2
));
1794 #ifdef HAVE_DREM /* Some systems use this non-standard name. */
1795 return (drem (f1
, f2
));
1796 #else /* Other systems don't seem to have it at all. */
1797 return (f1
- f2
* floor (f1
/f2
));
1800 #endif /* ! HAVE_FMOD */
1802 DEFUN ("mod", Fmod
, Smod
, 2, 2, 0,
1803 "Returns X modulo Y.\n\
1804 The result falls between zero (inclusive) and Y (exclusive).\n\
1805 Both X and Y must be numbers or markers.")
1807 register Lisp_Object num1
, num2
;
1812 #ifdef LISP_FLOAT_TYPE
1813 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num1
, 0);
1814 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num2
, 1);
1816 if (XTYPE (num1
) == Lisp_Float
|| XTYPE (num2
) == Lisp_Float
)
1820 f1
= XTYPE (num1
) == Lisp_Float
? XFLOAT (num1
)->data
: XINT (num1
);
1821 f2
= XTYPE (num2
) == Lisp_Float
? XFLOAT (num2
)->data
: XINT (num2
);
1823 Fsignal (Qarith_error
, Qnil
);
1826 /* If the "remainder" comes out with the wrong sign, fix it. */
1827 if ((f1
< 0) != (f2
< 0))
1829 return (make_float (f1
));
1831 #else /* not LISP_FLOAT_TYPE */
1832 CHECK_NUMBER_COERCE_MARKER (num1
, 0);
1833 CHECK_NUMBER_COERCE_MARKER (num2
, 1);
1834 #endif /* not LISP_FLOAT_TYPE */
1840 Fsignal (Qarith_error
, Qnil
);
1844 /* If the "remainder" comes out with the wrong sign, fix it. */
1845 if ((i1
< 0) != (i2
< 0))
1848 XSET (val
, Lisp_Int
, i1
);
1852 DEFUN ("max", Fmax
, Smax
, 1, MANY
, 0,
1853 "Return largest of all the arguments (which must be numbers or markers).\n\
1854 The value is always a number; markers are converted to numbers.")
1859 return arith_driver (Amax
, nargs
, args
);
1862 DEFUN ("min", Fmin
, Smin
, 1, MANY
, 0,
1863 "Return smallest of all the arguments (which must be numbers or markers).\n\
1864 The value is always a number; markers are converted to numbers.")
1869 return arith_driver (Amin
, nargs
, args
);
1872 DEFUN ("logand", Flogand
, Slogand
, 0, MANY
, 0,
1873 "Return bitwise-and of all the arguments.\n\
1874 Arguments may be integers, or markers converted to integers.")
1879 return arith_driver (Alogand
, nargs
, args
);
1882 DEFUN ("logior", Flogior
, Slogior
, 0, MANY
, 0,
1883 "Return bitwise-or of all the arguments.\n\
1884 Arguments may be integers, or markers converted to integers.")
1889 return arith_driver (Alogior
, nargs
, args
);
1892 DEFUN ("logxor", Flogxor
, Slogxor
, 0, MANY
, 0,
1893 "Return bitwise-exclusive-or of all the arguments.\n\
1894 Arguments may be integers, or markers converted to integers.")
1899 return arith_driver (Alogxor
, nargs
, args
);
1902 DEFUN ("ash", Fash
, Sash
, 2, 2, 0,
1903 "Return VALUE with its bits shifted left by COUNT.\n\
1904 If COUNT is negative, shifting is actually to the right.\n\
1905 In this case, the sign bit is duplicated.")
1907 register Lisp_Object num1
, num2
;
1909 register Lisp_Object val
;
1911 CHECK_NUMBER (num1
, 0);
1912 CHECK_NUMBER (num2
, 1);
1914 if (XINT (num2
) > 0)
1915 XSET (val
, Lisp_Int
, XINT (num1
) << XFASTINT (num2
));
1917 XSET (val
, Lisp_Int
, XINT (num1
) >> -XINT (num2
));
1921 DEFUN ("lsh", Flsh
, Slsh
, 2, 2, 0,
1922 "Return VALUE with its bits shifted left by COUNT.\n\
1923 If COUNT is negative, shifting is actually to the right.\n\
1924 In this case, zeros are shifted in on the left.")
1926 register Lisp_Object num1
, num2
;
1928 register Lisp_Object val
;
1930 CHECK_NUMBER (num1
, 0);
1931 CHECK_NUMBER (num2
, 1);
1933 if (XINT (num2
) > 0)
1934 XSET (val
, Lisp_Int
, (unsigned) XFASTINT (num1
) << XFASTINT (num2
));
1936 XSET (val
, Lisp_Int
, (unsigned) XFASTINT (num1
) >> -XINT (num2
));
1940 DEFUN ("1+", Fadd1
, Sadd1
, 1, 1, 0,
1941 "Return NUMBER plus one. NUMBER may be a number or a marker.\n\
1942 Markers are converted to integers.")
1944 register Lisp_Object num
;
1946 #ifdef LISP_FLOAT_TYPE
1947 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num
, 0);
1949 if (XTYPE (num
) == Lisp_Float
)
1950 return (make_float (1.0 + XFLOAT (num
)->data
));
1952 CHECK_NUMBER_COERCE_MARKER (num
, 0);
1953 #endif /* LISP_FLOAT_TYPE */
1955 XSETINT (num
, XFASTINT (num
) + 1);
1959 DEFUN ("1-", Fsub1
, Ssub1
, 1, 1, 0,
1960 "Return NUMBER minus one. NUMBER may be a number or a marker.\n\
1961 Markers are converted to integers.")
1963 register Lisp_Object num
;
1965 #ifdef LISP_FLOAT_TYPE
1966 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num
, 0);
1968 if (XTYPE (num
) == Lisp_Float
)
1969 return (make_float (-1.0 + XFLOAT (num
)->data
));
1971 CHECK_NUMBER_COERCE_MARKER (num
, 0);
1972 #endif /* LISP_FLOAT_TYPE */
1974 XSETINT (num
, XFASTINT (num
) - 1);
1978 DEFUN ("lognot", Flognot
, Slognot
, 1, 1, 0,
1979 "Return the bitwise complement of ARG. ARG must be an integer.")
1981 register Lisp_Object num
;
1983 CHECK_NUMBER (num
, 0);
1984 XSETINT (num
, ~XFASTINT (num
));
1991 Lisp_Object error_tail
, arith_tail
;
1993 Qquote
= intern ("quote");
1994 Qlambda
= intern ("lambda");
1995 Qsubr
= intern ("subr");
1996 Qerror_conditions
= intern ("error-conditions");
1997 Qerror_message
= intern ("error-message");
1998 Qtop_level
= intern ("top-level");
2000 Qerror
= intern ("error");
2001 Qquit
= intern ("quit");
2002 Qwrong_type_argument
= intern ("wrong-type-argument");
2003 Qargs_out_of_range
= intern ("args-out-of-range");
2004 Qvoid_function
= intern ("void-function");
2005 Qcyclic_function_indirection
= intern ("cyclic-function-indirection");
2006 Qvoid_variable
= intern ("void-variable");
2007 Qsetting_constant
= intern ("setting-constant");
2008 Qinvalid_read_syntax
= intern ("invalid-read-syntax");
2010 Qinvalid_function
= intern ("invalid-function");
2011 Qwrong_number_of_arguments
= intern ("wrong-number-of-arguments");
2012 Qno_catch
= intern ("no-catch");
2013 Qend_of_file
= intern ("end-of-file");
2014 Qarith_error
= intern ("arith-error");
2015 Qbeginning_of_buffer
= intern ("beginning-of-buffer");
2016 Qend_of_buffer
= intern ("end-of-buffer");
2017 Qbuffer_read_only
= intern ("buffer-read-only");
2018 Qmark_inactive
= intern ("mark-inactive");
2020 Qlistp
= intern ("listp");
2021 Qconsp
= intern ("consp");
2022 Qsymbolp
= intern ("symbolp");
2023 Qintegerp
= intern ("integerp");
2024 Qnatnump
= intern ("natnump");
2025 Qwholenump
= intern ("wholenump");
2026 Qstringp
= intern ("stringp");
2027 Qarrayp
= intern ("arrayp");
2028 Qsequencep
= intern ("sequencep");
2029 Qbufferp
= intern ("bufferp");
2030 Qvectorp
= intern ("vectorp");
2031 Qchar_or_string_p
= intern ("char-or-string-p");
2032 Qmarkerp
= intern ("markerp");
2033 Qbuffer_or_string_p
= intern ("buffer-or-string-p");
2034 Qinteger_or_marker_p
= intern ("integer-or-marker-p");
2035 Qboundp
= intern ("boundp");
2036 Qfboundp
= intern ("fboundp");
2038 #ifdef LISP_FLOAT_TYPE
2039 Qfloatp
= intern ("floatp");
2040 Qnumberp
= intern ("numberp");
2041 Qnumber_or_marker_p
= intern ("number-or-marker-p");
2042 #endif /* LISP_FLOAT_TYPE */
2044 Qcdr
= intern ("cdr");
2046 error_tail
= Fcons (Qerror
, Qnil
);
2048 /* ERROR is used as a signaler for random errors for which nothing else is right */
2050 Fput (Qerror
, Qerror_conditions
,
2052 Fput (Qerror
, Qerror_message
,
2053 build_string ("error"));
2055 Fput (Qquit
, Qerror_conditions
,
2056 Fcons (Qquit
, Qnil
));
2057 Fput (Qquit
, Qerror_message
,
2058 build_string ("Quit"));
2060 Fput (Qwrong_type_argument
, Qerror_conditions
,
2061 Fcons (Qwrong_type_argument
, error_tail
));
2062 Fput (Qwrong_type_argument
, Qerror_message
,
2063 build_string ("Wrong type argument"));
2065 Fput (Qargs_out_of_range
, Qerror_conditions
,
2066 Fcons (Qargs_out_of_range
, error_tail
));
2067 Fput (Qargs_out_of_range
, Qerror_message
,
2068 build_string ("Args out of range"));
2070 Fput (Qvoid_function
, Qerror_conditions
,
2071 Fcons (Qvoid_function
, error_tail
));
2072 Fput (Qvoid_function
, Qerror_message
,
2073 build_string ("Symbol's function definition is void"));
2075 Fput (Qcyclic_function_indirection
, Qerror_conditions
,
2076 Fcons (Qcyclic_function_indirection
, error_tail
));
2077 Fput (Qcyclic_function_indirection
, Qerror_message
,
2078 build_string ("Symbol's chain of function indirections contains a loop"));
2080 Fput (Qvoid_variable
, Qerror_conditions
,
2081 Fcons (Qvoid_variable
, error_tail
));
2082 Fput (Qvoid_variable
, Qerror_message
,
2083 build_string ("Symbol's value as variable is void"));
2085 Fput (Qsetting_constant
, Qerror_conditions
,
2086 Fcons (Qsetting_constant
, error_tail
));
2087 Fput (Qsetting_constant
, Qerror_message
,
2088 build_string ("Attempt to set a constant symbol"));
2090 Fput (Qinvalid_read_syntax
, Qerror_conditions
,
2091 Fcons (Qinvalid_read_syntax
, error_tail
));
2092 Fput (Qinvalid_read_syntax
, Qerror_message
,
2093 build_string ("Invalid read syntax"));
2095 Fput (Qinvalid_function
, Qerror_conditions
,
2096 Fcons (Qinvalid_function
, error_tail
));
2097 Fput (Qinvalid_function
, Qerror_message
,
2098 build_string ("Invalid function"));
2100 Fput (Qwrong_number_of_arguments
, Qerror_conditions
,
2101 Fcons (Qwrong_number_of_arguments
, error_tail
));
2102 Fput (Qwrong_number_of_arguments
, Qerror_message
,
2103 build_string ("Wrong number of arguments"));
2105 Fput (Qno_catch
, Qerror_conditions
,
2106 Fcons (Qno_catch
, error_tail
));
2107 Fput (Qno_catch
, Qerror_message
,
2108 build_string ("No catch for tag"));
2110 Fput (Qend_of_file
, Qerror_conditions
,
2111 Fcons (Qend_of_file
, error_tail
));
2112 Fput (Qend_of_file
, Qerror_message
,
2113 build_string ("End of file during parsing"));
2115 arith_tail
= Fcons (Qarith_error
, error_tail
);
2116 Fput (Qarith_error
, Qerror_conditions
,
2118 Fput (Qarith_error
, Qerror_message
,
2119 build_string ("Arithmetic error"));
2121 Fput (Qbeginning_of_buffer
, Qerror_conditions
,
2122 Fcons (Qbeginning_of_buffer
, error_tail
));
2123 Fput (Qbeginning_of_buffer
, Qerror_message
,
2124 build_string ("Beginning of buffer"));
2126 Fput (Qend_of_buffer
, Qerror_conditions
,
2127 Fcons (Qend_of_buffer
, error_tail
));
2128 Fput (Qend_of_buffer
, Qerror_message
,
2129 build_string ("End of buffer"));
2131 Fput (Qbuffer_read_only
, Qerror_conditions
,
2132 Fcons (Qbuffer_read_only
, error_tail
));
2133 Fput (Qbuffer_read_only
, Qerror_message
,
2134 build_string ("Buffer is read-only"));
2136 #ifdef LISP_FLOAT_TYPE
2137 Qrange_error
= intern ("range-error");
2138 Qdomain_error
= intern ("domain-error");
2139 Qsingularity_error
= intern ("singularity-error");
2140 Qoverflow_error
= intern ("overflow-error");
2141 Qunderflow_error
= intern ("underflow-error");
2143 Fput (Qdomain_error
, Qerror_conditions
,
2144 Fcons (Qdomain_error
, arith_tail
));
2145 Fput (Qdomain_error
, Qerror_message
,
2146 build_string ("Arithmetic domain error"));
2148 Fput (Qrange_error
, Qerror_conditions
,
2149 Fcons (Qrange_error
, arith_tail
));
2150 Fput (Qrange_error
, Qerror_message
,
2151 build_string ("Arithmetic range error"));
2153 Fput (Qsingularity_error
, Qerror_conditions
,
2154 Fcons (Qsingularity_error
, Fcons (Qdomain_error
, arith_tail
)));
2155 Fput (Qsingularity_error
, Qerror_message
,
2156 build_string ("Arithmetic singularity error"));
2158 Fput (Qoverflow_error
, Qerror_conditions
,
2159 Fcons (Qoverflow_error
, Fcons (Qdomain_error
, arith_tail
)));
2160 Fput (Qoverflow_error
, Qerror_message
,
2161 build_string ("Arithmetic overflow error"));
2163 Fput (Qunderflow_error
, Qerror_conditions
,
2164 Fcons (Qunderflow_error
, Fcons (Qdomain_error
, arith_tail
)));
2165 Fput (Qunderflow_error
, Qerror_message
,
2166 build_string ("Arithmetic underflow error"));
2168 staticpro (&Qrange_error
);
2169 staticpro (&Qdomain_error
);
2170 staticpro (&Qsingularity_error
);
2171 staticpro (&Qoverflow_error
);
2172 staticpro (&Qunderflow_error
);
2173 #endif /* LISP_FLOAT_TYPE */
2177 staticpro (&Qquote
);
2178 staticpro (&Qlambda
);
2180 staticpro (&Qunbound
);
2181 staticpro (&Qerror_conditions
);
2182 staticpro (&Qerror_message
);
2183 staticpro (&Qtop_level
);
2185 staticpro (&Qerror
);
2187 staticpro (&Qwrong_type_argument
);
2188 staticpro (&Qargs_out_of_range
);
2189 staticpro (&Qvoid_function
);
2190 staticpro (&Qcyclic_function_indirection
);
2191 staticpro (&Qvoid_variable
);
2192 staticpro (&Qsetting_constant
);
2193 staticpro (&Qinvalid_read_syntax
);
2194 staticpro (&Qwrong_number_of_arguments
);
2195 staticpro (&Qinvalid_function
);
2196 staticpro (&Qno_catch
);
2197 staticpro (&Qend_of_file
);
2198 staticpro (&Qarith_error
);
2199 staticpro (&Qbeginning_of_buffer
);
2200 staticpro (&Qend_of_buffer
);
2201 staticpro (&Qbuffer_read_only
);
2202 staticpro (&Qmark_inactive
);
2204 staticpro (&Qlistp
);
2205 staticpro (&Qconsp
);
2206 staticpro (&Qsymbolp
);
2207 staticpro (&Qintegerp
);
2208 staticpro (&Qnatnump
);
2209 staticpro (&Qwholenump
);
2210 staticpro (&Qstringp
);
2211 staticpro (&Qarrayp
);
2212 staticpro (&Qsequencep
);
2213 staticpro (&Qbufferp
);
2214 staticpro (&Qvectorp
);
2215 staticpro (&Qchar_or_string_p
);
2216 staticpro (&Qmarkerp
);
2217 staticpro (&Qbuffer_or_string_p
);
2218 staticpro (&Qinteger_or_marker_p
);
2219 #ifdef LISP_FLOAT_TYPE
2220 staticpro (&Qfloatp
);
2221 staticpro (&Qnumberp
);
2222 staticpro (&Qnumber_or_marker_p
);
2223 #endif /* LISP_FLOAT_TYPE */
2225 staticpro (&Qboundp
);
2226 staticpro (&Qfboundp
);
2235 defsubr (&Sintegerp
);
2236 defsubr (&Sinteger_or_marker_p
);
2237 defsubr (&Snumberp
);
2238 defsubr (&Snumber_or_marker_p
);
2239 #ifdef LISP_FLOAT_TYPE
2241 #endif /* LISP_FLOAT_TYPE */
2242 defsubr (&Snatnump
);
2243 defsubr (&Ssymbolp
);
2244 defsubr (&Sstringp
);
2245 defsubr (&Svectorp
);
2247 defsubr (&Ssequencep
);
2248 defsubr (&Sbufferp
);
2249 defsubr (&Smarkerp
);
2251 defsubr (&Sbyte_code_function_p
);
2252 defsubr (&Schar_or_string_p
);
2255 defsubr (&Scar_safe
);
2256 defsubr (&Scdr_safe
);
2259 defsubr (&Ssymbol_function
);
2260 defsubr (&Sindirect_function
);
2261 defsubr (&Ssymbol_plist
);
2262 defsubr (&Ssymbol_name
);
2263 defsubr (&Smakunbound
);
2264 defsubr (&Sfmakunbound
);
2266 defsubr (&Sfboundp
);
2268 defsubr (&Sdefalias
);
2269 defsubr (&Sdefine_function
);
2270 defsubr (&Ssetplist
);
2271 defsubr (&Ssymbol_value
);
2273 defsubr (&Sdefault_boundp
);
2274 defsubr (&Sdefault_value
);
2275 defsubr (&Sset_default
);
2276 defsubr (&Ssetq_default
);
2277 defsubr (&Smake_variable_buffer_local
);
2278 defsubr (&Smake_local_variable
);
2279 defsubr (&Skill_local_variable
);
2282 defsubr (&Snumber_to_string
);
2283 defsubr (&Sstring_to_number
);
2284 defsubr (&Seqlsign
);
2308 Fset (Qwholenump
, Qnatnump
);
2316 /* USG systems forget handlers when they are used;
2317 must reestablish each time */
2318 signal (signo
, arith_error
);
2321 /* VMS systems are like USG. */
2322 signal (signo
, arith_error
);
2326 #else /* not BSD4_1 */
2327 sigsetmask (SIGEMPTYMASK
);
2328 #endif /* not BSD4_1 */
2330 Fsignal (Qarith_error
, Qnil
);
2335 /* Don't do this if just dumping out.
2336 We don't want to call `signal' in this case
2337 so that we don't have trouble with dumping
2338 signal-delivering routines in an inconsistent state. */
2342 #endif /* CANNOT_DUMP */
2343 signal (SIGFPE
, arith_error
);
2346 signal (SIGEMT
, arith_error
);