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
);
942 if (MISCP (valcontents
))
944 switch (XMISCTYPE (valcontents
))
946 case Lisp_Misc_Intfwd
:
947 XSETINT (val
, *XINTFWD (valcontents
)->intvar
);
950 case Lisp_Misc_Boolfwd
:
951 return (*XBOOLFWD (valcontents
)->boolvar
? Qt
: Qnil
);
953 case Lisp_Misc_Objfwd
:
954 return *XOBJFWD (valcontents
)->objvar
;
956 case Lisp_Misc_Buffer_Objfwd
:
957 return PER_BUFFER_VALUE (current_buffer
,
958 XBUFFER_OBJFWD (valcontents
)->offset
);
960 case Lisp_Misc_Kboard_Objfwd
:
961 return *(Lisp_Object
*)(XKBOARD_OBJFWD (valcontents
)->offset
962 + (char *)current_kboard
);
969 DEFUN ("symbol-value", Fsymbol_value
, Ssymbol_value
, 1, 1, 0,
970 "Return SYMBOL's value. Error if that is void.")
976 val
= find_symbol_value (symbol
);
977 if (EQ (val
, Qunbound
))
978 return Fsignal (Qvoid_variable
, Fcons (symbol
, Qnil
));
983 DEFUN ("set", Fset
, Sset
, 2, 2, 0,
984 "Set SYMBOL's value to NEWVAL, and return NEWVAL.")
986 register Lisp_Object symbol
, newval
;
988 return set_internal (symbol
, newval
, current_buffer
, 0);
991 /* Return 1 if SYMBOL currently has a let-binding
992 which was made in the buffer that is now current. */
995 let_shadows_buffer_binding_p (symbol
)
998 struct specbinding
*p
;
1000 for (p
= specpdl_ptr
- 1; p
>= specpdl
; p
--)
1002 && CONSP (p
->symbol
)
1003 && EQ (symbol
, XCAR (p
->symbol
))
1004 && XBUFFER (XCDR (XCDR (p
->symbol
))) == current_buffer
)
1010 /* Store the value NEWVAL into SYMBOL.
1011 If buffer-locality is an issue, BUF specifies which buffer to use.
1012 (0 stands for the current buffer.)
1014 If BINDFLAG is zero, then if this symbol is supposed to become
1015 local in every buffer where it is set, then we make it local.
1016 If BINDFLAG is nonzero, we don't do that. */
1019 set_internal (symbol
, newval
, buf
, bindflag
)
1020 register Lisp_Object symbol
, newval
;
1024 int voide
= EQ (newval
, Qunbound
);
1026 register Lisp_Object valcontents
, innercontents
, tem1
, current_alist_element
;
1029 buf
= current_buffer
;
1031 /* If restoring in a dead buffer, do nothing. */
1032 if (NILP (buf
->name
))
1035 CHECK_SYMBOL (symbol
, 0);
1036 if (NILP (symbol
) || EQ (symbol
, Qt
)
1037 || (XSYMBOL (symbol
)->name
->data
[0] == ':'
1038 && EQ (XSYMBOL (symbol
)->obarray
, initial_obarray
)
1039 && !EQ (newval
, symbol
)))
1040 return Fsignal (Qsetting_constant
, Fcons (symbol
, Qnil
));
1042 innercontents
= valcontents
= XSYMBOL (symbol
)->value
;
1044 if (BUFFER_OBJFWDP (valcontents
))
1046 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1047 int idx
= PER_BUFFER_IDX (offset
);
1050 && !let_shadows_buffer_binding_p (symbol
))
1051 SET_PER_BUFFER_VALUE_P (buf
, idx
, 1);
1054 else if (BUFFER_LOCAL_VALUEP (valcontents
)
1055 || SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1057 /* valcontents is a struct Lisp_Buffer_Local_Value. */
1059 /* What binding is loaded right now? */
1060 current_alist_element
1061 = XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
1063 /* If the current buffer is not the buffer whose binding is
1064 loaded, or if there may be frame-local bindings and the frame
1065 isn't the right one, or if it's a Lisp_Buffer_Local_Value and
1066 the default binding is loaded, the loaded binding may be the
1068 if (!BUFFERP (XBUFFER_LOCAL_VALUE (valcontents
)->buffer
)
1069 || buf
!= XBUFFER (XBUFFER_LOCAL_VALUE (valcontents
)->buffer
)
1070 || (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
1071 && !EQ (selected_frame
, XBUFFER_LOCAL_VALUE (valcontents
)->frame
))
1072 || (BUFFER_LOCAL_VALUEP (valcontents
)
1073 && EQ (XCAR (current_alist_element
),
1074 current_alist_element
)))
1076 /* The currently loaded binding is not necessarily valid.
1077 We need to unload it, and choose a new binding. */
1079 /* Write out `realvalue' to the old loaded binding. */
1080 Fsetcdr (current_alist_element
,
1081 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
));
1083 /* Find the new binding. */
1084 tem1
= Fassq (symbol
, buf
->local_var_alist
);
1085 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 1;
1086 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_frame
= 0;
1090 /* This buffer still sees the default value. */
1092 /* If the variable is a Lisp_Some_Buffer_Local_Value,
1093 or if this is `let' rather than `set',
1094 make CURRENT-ALIST-ELEMENT point to itself,
1095 indicating that we're seeing the default value.
1096 Likewise if the variable has been let-bound
1097 in the current buffer. */
1098 if (bindflag
|| SOME_BUFFER_LOCAL_VALUEP (valcontents
)
1099 || let_shadows_buffer_binding_p (symbol
))
1101 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 0;
1103 if (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
)
1104 tem1
= Fassq (symbol
,
1105 XFRAME (selected_frame
)->param_alist
);
1108 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_frame
= 1;
1110 tem1
= XBUFFER_LOCAL_VALUE (valcontents
)->cdr
;
1112 /* If it's a Lisp_Buffer_Local_Value, being set not bound,
1113 and we're not within a let that was made for this buffer,
1114 create a new buffer-local binding for the variable.
1115 That means, give this buffer a new assoc for a local value
1116 and load that binding. */
1119 tem1
= Fcons (symbol
, Fcdr (current_alist_element
));
1120 buf
->local_var_alist
1121 = Fcons (tem1
, buf
->local_var_alist
);
1125 /* Record which binding is now loaded. */
1126 XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
)
1129 /* Set `buffer' and `frame' slots for thebinding now loaded. */
1130 XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents
)->buffer
, buf
);
1131 XBUFFER_LOCAL_VALUE (valcontents
)->frame
= selected_frame
;
1133 innercontents
= XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
;
1136 /* If storing void (making the symbol void), forward only through
1137 buffer-local indicator, not through Lisp_Objfwd, etc. */
1139 store_symval_forwarding (symbol
, Qnil
, newval
);
1141 store_symval_forwarding (symbol
, innercontents
, newval
);
1143 /* If we just set a variable whose current binding is frame-local,
1144 store the new value in the frame parameter too. */
1146 if (BUFFER_LOCAL_VALUEP (valcontents
)
1147 || SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1149 /* What binding is loaded right now? */
1150 current_alist_element
1151 = XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
1153 /* If the current buffer is not the buffer whose binding is
1154 loaded, or if there may be frame-local bindings and the frame
1155 isn't the right one, or if it's a Lisp_Buffer_Local_Value and
1156 the default binding is loaded, the loaded binding may be the
1158 if (XBUFFER_LOCAL_VALUE (valcontents
)->found_for_frame
)
1159 XCDR (current_alist_element
) = newval
;
1165 /* Access or set a buffer-local symbol's default value. */
1167 /* Return the default value of SYMBOL, but don't check for voidness.
1168 Return Qunbound if it is void. */
1171 default_value (symbol
)
1174 register Lisp_Object valcontents
;
1176 CHECK_SYMBOL (symbol
, 0);
1177 valcontents
= XSYMBOL (symbol
)->value
;
1179 /* For a built-in buffer-local variable, get the default value
1180 rather than letting do_symval_forwarding get the current value. */
1181 if (BUFFER_OBJFWDP (valcontents
))
1183 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1184 if (PER_BUFFER_IDX (offset
) != 0)
1185 return PER_BUFFER_DEFAULT (offset
);
1188 /* Handle user-created local variables. */
1189 if (BUFFER_LOCAL_VALUEP (valcontents
)
1190 || SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1192 /* If var is set up for a buffer that lacks a local value for it,
1193 the current value is nominally the default value.
1194 But the `realvalue' slot may be more up to date, since
1195 ordinary setq stores just that slot. So use that. */
1196 Lisp_Object current_alist_element
, alist_element_car
;
1197 current_alist_element
1198 = XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
1199 alist_element_car
= XCAR (current_alist_element
);
1200 if (EQ (alist_element_car
, current_alist_element
))
1201 return do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
);
1203 return XCDR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
1205 /* For other variables, get the current value. */
1206 return do_symval_forwarding (valcontents
);
1209 DEFUN ("default-boundp", Fdefault_boundp
, Sdefault_boundp
, 1, 1, 0,
1210 "Return t if SYMBOL has a non-void default value.\n\
1211 This is the value that is seen in buffers that do not have their own values\n\
1212 for this variable.")
1216 register Lisp_Object value
;
1218 value
= default_value (symbol
);
1219 return (EQ (value
, Qunbound
) ? Qnil
: Qt
);
1222 DEFUN ("default-value", Fdefault_value
, Sdefault_value
, 1, 1, 0,
1223 "Return SYMBOL's default value.\n\
1224 This is the value that is seen in buffers that do not have their own values\n\
1225 for this variable. The default value is meaningful for variables with\n\
1226 local bindings in certain buffers.")
1230 register Lisp_Object value
;
1232 value
= default_value (symbol
);
1233 if (EQ (value
, Qunbound
))
1234 return Fsignal (Qvoid_variable
, Fcons (symbol
, Qnil
));
1238 DEFUN ("set-default", Fset_default
, Sset_default
, 2, 2, 0,
1239 "Set SYMBOL's default value to VAL. SYMBOL and VAL are evaluated.\n\
1240 The default value is seen in buffers that do not have their own values\n\
1241 for this variable.")
1243 Lisp_Object symbol
, value
;
1245 register Lisp_Object valcontents
, current_alist_element
, alist_element_buffer
;
1247 CHECK_SYMBOL (symbol
, 0);
1248 valcontents
= XSYMBOL (symbol
)->value
;
1250 /* Handle variables like case-fold-search that have special slots
1251 in the buffer. Make them work apparently like Lisp_Buffer_Local_Value
1253 if (BUFFER_OBJFWDP (valcontents
))
1255 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1256 int idx
= PER_BUFFER_IDX (offset
);
1258 PER_BUFFER_DEFAULT (offset
) = value
;
1260 /* If this variable is not always local in all buffers,
1261 set it in the buffers that don't nominally have a local value. */
1266 for (b
= all_buffers
; b
; b
= b
->next
)
1267 if (!PER_BUFFER_VALUE_P (b
, idx
))
1268 PER_BUFFER_VALUE (b
, offset
) = value
;
1273 if (!BUFFER_LOCAL_VALUEP (valcontents
)
1274 && !SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1275 return Fset (symbol
, value
);
1277 /* Store new value into the DEFAULT-VALUE slot. */
1278 XCDR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
) = value
;
1280 /* If the default binding is now loaded, set the REALVALUE slot too. */
1281 current_alist_element
1282 = XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
1283 alist_element_buffer
= Fcar (current_alist_element
);
1284 if (EQ (alist_element_buffer
, current_alist_element
))
1285 store_symval_forwarding (symbol
, XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
,
1291 DEFUN ("setq-default", Fsetq_default
, Ssetq_default
, 2, UNEVALLED
, 0,
1292 "Set the default value of variable VAR to VALUE.\n\
1293 VAR, the variable name, is literal (not evaluated);\n\
1294 VALUE is an expression and it is evaluated.\n\
1295 The default value of a variable is seen in buffers\n\
1296 that do not have their own values for the variable.\n\
1298 More generally, you can use multiple variables and values, as in\n\
1299 (setq-default SYMBOL VALUE SYMBOL VALUE...)\n\
1300 This sets each SYMBOL's default value to the corresponding VALUE.\n\
1301 The VALUE for the Nth SYMBOL can refer to the new default values\n\
1306 register Lisp_Object args_left
;
1307 register Lisp_Object val
, symbol
;
1308 struct gcpro gcpro1
;
1318 val
= Feval (Fcar (Fcdr (args_left
)));
1319 symbol
= Fcar (args_left
);
1320 Fset_default (symbol
, val
);
1321 args_left
= Fcdr (Fcdr (args_left
));
1323 while (!NILP (args_left
));
1329 /* Lisp functions for creating and removing buffer-local variables. */
1331 DEFUN ("make-variable-buffer-local", Fmake_variable_buffer_local
, Smake_variable_buffer_local
,
1332 1, 1, "vMake Variable Buffer Local: ",
1333 "Make VARIABLE become buffer-local whenever it is set.\n\
1334 At any time, the value for the current buffer is in effect,\n\
1335 unless the variable has never been set in this buffer,\n\
1336 in which case the default value is in effect.\n\
1337 Note that binding the variable with `let', or setting it while\n\
1338 a `let'-style binding made in this buffer is in effect,\n\
1339 does not make the variable buffer-local.\n\
1341 The function `default-value' gets the default value and `set-default' sets it.")
1343 register Lisp_Object variable
;
1345 register Lisp_Object tem
, valcontents
, newval
;
1347 CHECK_SYMBOL (variable
, 0);
1349 valcontents
= XSYMBOL (variable
)->value
;
1350 if (EQ (variable
, Qnil
) || EQ (variable
, Qt
) || KBOARD_OBJFWDP (valcontents
))
1351 error ("Symbol %s may not be buffer-local", XSYMBOL (variable
)->name
->data
);
1353 if (BUFFER_LOCAL_VALUEP (valcontents
) || BUFFER_OBJFWDP (valcontents
))
1355 if (SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1357 XMISCTYPE (XSYMBOL (variable
)->value
) = Lisp_Misc_Buffer_Local_Value
;
1360 if (EQ (valcontents
, Qunbound
))
1361 XSYMBOL (variable
)->value
= Qnil
;
1362 tem
= Fcons (Qnil
, Fsymbol_value (variable
));
1364 newval
= allocate_misc ();
1365 XMISCTYPE (newval
) = Lisp_Misc_Buffer_Local_Value
;
1366 XBUFFER_LOCAL_VALUE (newval
)->realvalue
= XSYMBOL (variable
)->value
;
1367 XBUFFER_LOCAL_VALUE (newval
)->buffer
= Fcurrent_buffer ();
1368 XBUFFER_LOCAL_VALUE (newval
)->frame
= Qnil
;
1369 XBUFFER_LOCAL_VALUE (newval
)->found_for_buffer
= 0;
1370 XBUFFER_LOCAL_VALUE (newval
)->found_for_frame
= 0;
1371 XBUFFER_LOCAL_VALUE (newval
)->check_frame
= 0;
1372 XBUFFER_LOCAL_VALUE (newval
)->cdr
= tem
;
1373 XSYMBOL (variable
)->value
= newval
;
1377 DEFUN ("make-local-variable", Fmake_local_variable
, Smake_local_variable
,
1378 1, 1, "vMake Local Variable: ",
1379 "Make VARIABLE have a separate value in the current buffer.\n\
1380 Other buffers will continue to share a common default value.\n\
1381 \(The buffer-local value of VARIABLE starts out as the same value\n\
1382 VARIABLE previously had. If VARIABLE was void, it remains void.\)\n\
1383 See also `make-variable-buffer-local'.\n\
1385 If the variable is already arranged to become local when set,\n\
1386 this function causes a local value to exist for this buffer,\n\
1387 just as setting the variable would do.\n\
1389 This function returns VARIABLE, and therefore\n\
1390 (set (make-local-variable 'VARIABLE) VALUE-EXP)\n\
1393 Do not use `make-local-variable' to make a hook variable buffer-local.\n\
1394 Use `make-local-hook' instead.")
1396 register Lisp_Object variable
;
1398 register Lisp_Object tem
, valcontents
;
1400 CHECK_SYMBOL (variable
, 0);
1402 valcontents
= XSYMBOL (variable
)->value
;
1403 if (EQ (variable
, Qnil
) || EQ (variable
, Qt
) || KBOARD_OBJFWDP (valcontents
))
1404 error ("Symbol %s may not be buffer-local", XSYMBOL (variable
)->name
->data
);
1406 if (BUFFER_LOCAL_VALUEP (valcontents
) || BUFFER_OBJFWDP (valcontents
))
1408 tem
= Fboundp (variable
);
1410 /* Make sure the symbol has a local value in this particular buffer,
1411 by setting it to the same value it already has. */
1412 Fset (variable
, (EQ (tem
, Qt
) ? Fsymbol_value (variable
) : Qunbound
));
1415 /* Make sure symbol is set up to hold per-buffer values. */
1416 if (!SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1419 tem
= Fcons (Qnil
, do_symval_forwarding (valcontents
));
1421 newval
= allocate_misc ();
1422 XMISCTYPE (newval
) = Lisp_Misc_Some_Buffer_Local_Value
;
1423 XBUFFER_LOCAL_VALUE (newval
)->realvalue
= XSYMBOL (variable
)->value
;
1424 XBUFFER_LOCAL_VALUE (newval
)->buffer
= Qnil
;
1425 XBUFFER_LOCAL_VALUE (newval
)->frame
= Qnil
;
1426 XBUFFER_LOCAL_VALUE (newval
)->found_for_buffer
= 0;
1427 XBUFFER_LOCAL_VALUE (newval
)->found_for_frame
= 0;
1428 XBUFFER_LOCAL_VALUE (newval
)->check_frame
= 0;
1429 XBUFFER_LOCAL_VALUE (newval
)->cdr
= tem
;
1430 XSYMBOL (variable
)->value
= newval
;
1432 /* Make sure this buffer has its own value of symbol. */
1433 tem
= Fassq (variable
, current_buffer
->local_var_alist
);
1436 /* Swap out any local binding for some other buffer, and make
1437 sure the current value is permanently recorded, if it's the
1439 find_symbol_value (variable
);
1441 current_buffer
->local_var_alist
1442 = Fcons (Fcons (variable
, XCDR (XBUFFER_LOCAL_VALUE (XSYMBOL (variable
)->value
)->cdr
)),
1443 current_buffer
->local_var_alist
);
1445 /* Make sure symbol does not think it is set up for this buffer;
1446 force it to look once again for this buffer's value. */
1448 Lisp_Object
*pvalbuf
;
1450 valcontents
= XSYMBOL (variable
)->value
;
1452 pvalbuf
= &XBUFFER_LOCAL_VALUE (valcontents
)->buffer
;
1453 if (current_buffer
== XBUFFER (*pvalbuf
))
1455 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 0;
1459 /* If the symbol forwards into a C variable, then load the binding
1460 for this buffer now. If C code modifies the variable before we
1461 load the binding in, then that new value will clobber the default
1462 binding the next time we unload it. */
1463 valcontents
= XBUFFER_LOCAL_VALUE (XSYMBOL (variable
)->value
)->realvalue
;
1464 if (INTFWDP (valcontents
) || BOOLFWDP (valcontents
) || OBJFWDP (valcontents
))
1465 swap_in_symval_forwarding (variable
, XSYMBOL (variable
)->value
);
1470 DEFUN ("kill-local-variable", Fkill_local_variable
, Skill_local_variable
,
1471 1, 1, "vKill Local Variable: ",
1472 "Make VARIABLE no longer have a separate value in the current buffer.\n\
1473 From now on the default value will apply in this buffer.")
1475 register Lisp_Object variable
;
1477 register Lisp_Object tem
, valcontents
;
1479 CHECK_SYMBOL (variable
, 0);
1481 valcontents
= XSYMBOL (variable
)->value
;
1483 if (BUFFER_OBJFWDP (valcontents
))
1485 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1486 int idx
= PER_BUFFER_IDX (offset
);
1490 SET_PER_BUFFER_VALUE_P (current_buffer
, idx
, 0);
1491 PER_BUFFER_VALUE (current_buffer
, offset
)
1492 = PER_BUFFER_DEFAULT (offset
);
1497 if (!BUFFER_LOCAL_VALUEP (valcontents
)
1498 && !SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1501 /* Get rid of this buffer's alist element, if any. */
1503 tem
= Fassq (variable
, current_buffer
->local_var_alist
);
1505 current_buffer
->local_var_alist
1506 = Fdelq (tem
, current_buffer
->local_var_alist
);
1508 /* If the symbol is set up with the current buffer's binding
1509 loaded, recompute its value. We have to do it now, or else
1510 forwarded objects won't work right. */
1512 Lisp_Object
*pvalbuf
;
1513 valcontents
= XSYMBOL (variable
)->value
;
1514 pvalbuf
= &XBUFFER_LOCAL_VALUE (valcontents
)->buffer
;
1515 if (current_buffer
== XBUFFER (*pvalbuf
))
1518 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 0;
1519 find_symbol_value (variable
);
1526 /* Lisp functions for creating and removing buffer-local variables. */
1528 DEFUN ("make-variable-frame-local", Fmake_variable_frame_local
, Smake_variable_frame_local
,
1529 1, 1, "vMake Variable Frame Local: ",
1530 "Enable VARIABLE to have frame-local bindings.\n\
1531 When a frame-local binding exists in the current frame,\n\
1532 it is in effect whenever the current buffer has no buffer-local binding.\n\
1533 A frame-local binding is actual a frame parameter value;\n\
1534 thus, any given frame has a local binding for VARIABLE\n\
1535 if it has a value for the frame parameter named VARIABLE.\n\
1536 See `modify-frame-parameters'.")
1538 register Lisp_Object variable
;
1540 register Lisp_Object tem
, valcontents
, newval
;
1542 CHECK_SYMBOL (variable
, 0);
1544 valcontents
= XSYMBOL (variable
)->value
;
1545 if (EQ (variable
, Qnil
) || EQ (variable
, Qt
) || KBOARD_OBJFWDP (valcontents
)
1546 || BUFFER_OBJFWDP (valcontents
))
1547 error ("Symbol %s may not be frame-local", XSYMBOL (variable
)->name
->data
);
1549 if (BUFFER_LOCAL_VALUEP (valcontents
)
1550 || SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1552 XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
= 1;
1556 if (EQ (valcontents
, Qunbound
))
1557 XSYMBOL (variable
)->value
= Qnil
;
1558 tem
= Fcons (Qnil
, Fsymbol_value (variable
));
1560 newval
= allocate_misc ();
1561 XMISCTYPE (newval
) = Lisp_Misc_Some_Buffer_Local_Value
;
1562 XBUFFER_LOCAL_VALUE (newval
)->realvalue
= XSYMBOL (variable
)->value
;
1563 XBUFFER_LOCAL_VALUE (newval
)->buffer
= Qnil
;
1564 XBUFFER_LOCAL_VALUE (newval
)->frame
= Qnil
;
1565 XBUFFER_LOCAL_VALUE (newval
)->found_for_buffer
= 0;
1566 XBUFFER_LOCAL_VALUE (newval
)->found_for_frame
= 0;
1567 XBUFFER_LOCAL_VALUE (newval
)->check_frame
= 1;
1568 XBUFFER_LOCAL_VALUE (newval
)->cdr
= tem
;
1569 XSYMBOL (variable
)->value
= newval
;
1573 DEFUN ("local-variable-p", Flocal_variable_p
, Slocal_variable_p
,
1575 "Non-nil if VARIABLE has a local binding in buffer BUFFER.\n\
1576 BUFFER defaults to the current buffer.")
1578 register Lisp_Object variable
, buffer
;
1580 Lisp_Object valcontents
;
1581 register struct buffer
*buf
;
1584 buf
= current_buffer
;
1587 CHECK_BUFFER (buffer
, 0);
1588 buf
= XBUFFER (buffer
);
1591 CHECK_SYMBOL (variable
, 0);
1593 valcontents
= XSYMBOL (variable
)->value
;
1594 if (BUFFER_LOCAL_VALUEP (valcontents
)
1595 || SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1597 Lisp_Object tail
, elt
;
1598 for (tail
= buf
->local_var_alist
; CONSP (tail
); tail
= XCDR (tail
))
1601 if (EQ (variable
, XCAR (elt
)))
1605 if (BUFFER_OBJFWDP (valcontents
))
1607 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1608 int idx
= PER_BUFFER_IDX (offset
);
1609 if (idx
== -1 || PER_BUFFER_VALUE_P (buf
, idx
))
1615 DEFUN ("local-variable-if-set-p", Flocal_variable_if_set_p
, Slocal_variable_if_set_p
,
1617 "Non-nil if VARIABLE will be local in buffer BUFFER if it is set there.\n\
1618 BUFFER defaults to the current buffer.")
1620 register Lisp_Object variable
, buffer
;
1622 Lisp_Object valcontents
;
1623 register struct buffer
*buf
;
1626 buf
= current_buffer
;
1629 CHECK_BUFFER (buffer
, 0);
1630 buf
= XBUFFER (buffer
);
1633 CHECK_SYMBOL (variable
, 0);
1635 valcontents
= XSYMBOL (variable
)->value
;
1637 /* This means that make-variable-buffer-local was done. */
1638 if (BUFFER_LOCAL_VALUEP (valcontents
))
1640 /* All these slots become local if they are set. */
1641 if (BUFFER_OBJFWDP (valcontents
))
1643 if (SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1645 Lisp_Object tail
, elt
;
1646 for (tail
= buf
->local_var_alist
; CONSP (tail
); tail
= XCDR (tail
))
1649 if (EQ (variable
, XCAR (elt
)))
1656 /* Find the function at the end of a chain of symbol function indirections. */
1658 /* If OBJECT is a symbol, find the end of its function chain and
1659 return the value found there. If OBJECT is not a symbol, just
1660 return it. If there is a cycle in the function chain, signal a
1661 cyclic-function-indirection error.
1663 This is like Findirect_function, except that it doesn't signal an
1664 error if the chain ends up unbound. */
1666 indirect_function (object
)
1667 register Lisp_Object object
;
1669 Lisp_Object tortoise
, hare
;
1671 hare
= tortoise
= object
;
1675 if (!SYMBOLP (hare
) || EQ (hare
, Qunbound
))
1677 hare
= XSYMBOL (hare
)->function
;
1678 if (!SYMBOLP (hare
) || EQ (hare
, Qunbound
))
1680 hare
= XSYMBOL (hare
)->function
;
1682 tortoise
= XSYMBOL (tortoise
)->function
;
1684 if (EQ (hare
, tortoise
))
1685 Fsignal (Qcyclic_function_indirection
, Fcons (object
, Qnil
));
1691 DEFUN ("indirect-function", Findirect_function
, Sindirect_function
, 1, 1, 0,
1692 "Return the function at the end of OBJECT's function chain.\n\
1693 If OBJECT is a symbol, follow all function indirections and return the final\n\
1694 function binding.\n\
1695 If OBJECT is not a symbol, just return it.\n\
1696 Signal a void-function error if the final symbol is unbound.\n\
1697 Signal a cyclic-function-indirection error if there is a loop in the\n\
1698 function chain of symbols.")
1700 register Lisp_Object object
;
1704 result
= indirect_function (object
);
1706 if (EQ (result
, Qunbound
))
1707 return Fsignal (Qvoid_function
, Fcons (object
, Qnil
));
1711 /* Extract and set vector and string elements */
1713 DEFUN ("aref", Faref
, Saref
, 2, 2, 0,
1714 "Return the element of ARRAY at index IDX.\n\
1715 ARRAY may be a vector, a string, a char-table, a bool-vector,\n\
1716 or a byte-code object. IDX starts at 0.")
1718 register Lisp_Object array
;
1721 register int idxval
;
1723 CHECK_NUMBER (idx
, 1);
1724 idxval
= XINT (idx
);
1725 if (STRINGP (array
))
1729 if (idxval
< 0 || idxval
>= XSTRING (array
)->size
)
1730 args_out_of_range (array
, idx
);
1731 if (! STRING_MULTIBYTE (array
))
1732 return make_number ((unsigned char) XSTRING (array
)->data
[idxval
]);
1733 idxval_byte
= string_char_to_byte (array
, idxval
);
1735 c
= STRING_CHAR (&XSTRING (array
)->data
[idxval_byte
],
1736 STRING_BYTES (XSTRING (array
)) - idxval_byte
);
1737 return make_number (c
);
1739 else if (BOOL_VECTOR_P (array
))
1743 if (idxval
< 0 || idxval
>= XBOOL_VECTOR (array
)->size
)
1744 args_out_of_range (array
, idx
);
1746 val
= (unsigned char) XBOOL_VECTOR (array
)->data
[idxval
/ BITS_PER_CHAR
];
1747 return (val
& (1 << (idxval
% BITS_PER_CHAR
)) ? Qt
: Qnil
);
1749 else if (CHAR_TABLE_P (array
))
1756 args_out_of_range (array
, idx
);
1757 if (idxval
< CHAR_TABLE_ORDINARY_SLOTS
)
1759 /* For ASCII and 8-bit European characters, the element is
1760 stored in the top table. */
1761 val
= XCHAR_TABLE (array
)->contents
[idxval
];
1763 val
= XCHAR_TABLE (array
)->defalt
;
1764 while (NILP (val
)) /* Follow parents until we find some value. */
1766 array
= XCHAR_TABLE (array
)->parent
;
1769 val
= XCHAR_TABLE (array
)->contents
[idxval
];
1771 val
= XCHAR_TABLE (array
)->defalt
;
1778 Lisp_Object sub_table
;
1780 SPLIT_CHAR (idxval
, code
[0], code
[1], code
[2]);
1781 if (code
[1] < 32) code
[1] = -1;
1782 else if (code
[2] < 32) code
[2] = -1;
1784 /* Here, the possible range of CODE[0] (== charset ID) is
1785 128..MAX_CHARSET. Since the top level char table contains
1786 data for multibyte characters after 256th element, we must
1787 increment CODE[0] by 128 to get a correct index. */
1789 code
[3] = -1; /* anchor */
1791 try_parent_char_table
:
1793 for (i
= 0; code
[i
] >= 0; i
++)
1795 val
= XCHAR_TABLE (sub_table
)->contents
[code
[i
]];
1796 if (SUB_CHAR_TABLE_P (val
))
1801 val
= XCHAR_TABLE (sub_table
)->defalt
;
1804 array
= XCHAR_TABLE (array
)->parent
;
1806 goto try_parent_char_table
;
1811 /* Here, VAL is a sub char table. We try the default value
1813 val
= XCHAR_TABLE (val
)->defalt
;
1816 array
= XCHAR_TABLE (array
)->parent
;
1818 goto try_parent_char_table
;
1826 if (VECTORP (array
))
1827 size
= XVECTOR (array
)->size
;
1828 else if (COMPILEDP (array
))
1829 size
= XVECTOR (array
)->size
& PSEUDOVECTOR_SIZE_MASK
;
1831 wrong_type_argument (Qarrayp
, array
);
1833 if (idxval
< 0 || idxval
>= size
)
1834 args_out_of_range (array
, idx
);
1835 return XVECTOR (array
)->contents
[idxval
];
1839 /* Don't use alloca for relocating string data larger than this, lest
1840 we overflow their stack. The value is the same as what used in
1841 fns.c for base64 handling. */
1842 #define MAX_ALLOCA 16*1024
1844 DEFUN ("aset", Faset
, Saset
, 3, 3, 0,
1845 "Store into the element of ARRAY at index IDX the value NEWELT.\n\
1846 ARRAY may be a vector, a string, a char-table or a bool-vector.\n\
1848 (array
, idx
, newelt
)
1849 register Lisp_Object array
;
1850 Lisp_Object idx
, newelt
;
1852 register int idxval
;
1854 CHECK_NUMBER (idx
, 1);
1855 idxval
= XINT (idx
);
1856 if (!VECTORP (array
) && !STRINGP (array
) && !BOOL_VECTOR_P (array
)
1857 && ! CHAR_TABLE_P (array
))
1858 array
= wrong_type_argument (Qarrayp
, array
);
1859 CHECK_IMPURE (array
);
1861 if (VECTORP (array
))
1863 if (idxval
< 0 || idxval
>= XVECTOR (array
)->size
)
1864 args_out_of_range (array
, idx
);
1865 XVECTOR (array
)->contents
[idxval
] = newelt
;
1867 else if (BOOL_VECTOR_P (array
))
1871 if (idxval
< 0 || idxval
>= XBOOL_VECTOR (array
)->size
)
1872 args_out_of_range (array
, idx
);
1874 val
= (unsigned char) XBOOL_VECTOR (array
)->data
[idxval
/ BITS_PER_CHAR
];
1876 if (! NILP (newelt
))
1877 val
|= 1 << (idxval
% BITS_PER_CHAR
);
1879 val
&= ~(1 << (idxval
% BITS_PER_CHAR
));
1880 XBOOL_VECTOR (array
)->data
[idxval
/ BITS_PER_CHAR
] = val
;
1882 else if (CHAR_TABLE_P (array
))
1885 args_out_of_range (array
, idx
);
1886 if (idxval
< CHAR_TABLE_ORDINARY_SLOTS
)
1887 XCHAR_TABLE (array
)->contents
[idxval
] = newelt
;
1893 SPLIT_CHAR (idxval
, code
[0], code
[1], code
[2]);
1894 if (code
[1] < 32) code
[1] = -1;
1895 else if (code
[2] < 32) code
[2] = -1;
1897 /* See the comment of the corresponding part in Faref. */
1899 code
[3] = -1; /* anchor */
1900 for (i
= 0; code
[i
+ 1] >= 0; i
++)
1902 val
= XCHAR_TABLE (array
)->contents
[code
[i
]];
1903 if (SUB_CHAR_TABLE_P (val
))
1909 /* VAL is a leaf. Create a sub char table with the
1910 default value VAL or XCHAR_TABLE (array)->defalt
1911 and look into it. */
1913 temp
= make_sub_char_table (NILP (val
)
1914 ? XCHAR_TABLE (array
)->defalt
1916 XCHAR_TABLE (array
)->contents
[code
[i
]] = temp
;
1920 XCHAR_TABLE (array
)->contents
[code
[i
]] = newelt
;
1923 else if (STRING_MULTIBYTE (array
))
1925 int idxval_byte
, prev_bytes
, new_bytes
;
1926 unsigned char workbuf
[MAX_MULTIBYTE_LENGTH
], *p0
= workbuf
, *p1
;
1928 if (idxval
< 0 || idxval
>= XSTRING (array
)->size
)
1929 args_out_of_range (array
, idx
);
1930 CHECK_NUMBER (newelt
, 2);
1932 idxval_byte
= string_char_to_byte (array
, idxval
);
1933 p1
= &XSTRING (array
)->data
[idxval_byte
];
1934 PARSE_MULTIBYTE_SEQ (p1
, nbytes
- idxval_byte
, prev_bytes
);
1935 new_bytes
= CHAR_STRING (XINT (newelt
), p0
);
1936 if (prev_bytes
!= new_bytes
)
1938 /* We must relocate the string data. */
1939 int nchars
= XSTRING (array
)->size
;
1940 int nbytes
= STRING_BYTES (XSTRING (array
));
1943 str
= (nbytes
<= MAX_ALLOCA
1944 ? (unsigned char *) alloca (nbytes
)
1945 : (unsigned char *) xmalloc (nbytes
));
1946 bcopy (XSTRING (array
)->data
, str
, nbytes
);
1947 allocate_string_data (XSTRING (array
), nchars
,
1948 nbytes
+ new_bytes
- prev_bytes
);
1949 bcopy (str
, XSTRING (array
)->data
, idxval_byte
);
1950 p1
= XSTRING (array
)->data
+ idxval_byte
;
1951 bcopy (str
+ idxval_byte
+ prev_bytes
, p1
+ new_bytes
,
1952 nbytes
- (idxval_byte
+ prev_bytes
));
1953 if (nbytes
> MAX_ALLOCA
)
1955 clear_string_char_byte_cache ();
1962 if (idxval
< 0 || idxval
>= XSTRING (array
)->size
)
1963 args_out_of_range (array
, idx
);
1964 CHECK_NUMBER (newelt
, 2);
1966 if (XINT (newelt
) < 0 || SINGLE_BYTE_CHAR_P (XINT (newelt
)))
1967 XSTRING (array
)->data
[idxval
] = XINT (newelt
);
1970 /* We must relocate the string data while converting it to
1972 int idxval_byte
, prev_bytes
, new_bytes
;
1973 unsigned char workbuf
[MAX_MULTIBYTE_LENGTH
], *p0
= workbuf
, *p1
;
1974 unsigned char *origstr
= XSTRING (array
)->data
, *str
;
1977 nchars
= XSTRING (array
)->size
;
1978 nbytes
= idxval_byte
= count_size_as_multibyte (origstr
, idxval
);
1979 nbytes
+= count_size_as_multibyte (origstr
+ idxval
,
1981 str
= (nbytes
<= MAX_ALLOCA
1982 ? (unsigned char *) alloca (nbytes
)
1983 : (unsigned char *) xmalloc (nbytes
));
1984 copy_text (XSTRING (array
)->data
, str
, nchars
, 0, 1);
1985 PARSE_MULTIBYTE_SEQ (str
+ idxval_byte
, nbytes
- idxval_byte
,
1987 new_bytes
= CHAR_STRING (XINT (newelt
), p0
);
1988 allocate_string_data (XSTRING (array
), nchars
,
1989 nbytes
+ new_bytes
- prev_bytes
);
1990 bcopy (str
, XSTRING (array
)->data
, idxval_byte
);
1991 p1
= XSTRING (array
)->data
+ idxval_byte
;
1994 bcopy (str
+ idxval_byte
+ prev_bytes
, p1
,
1995 nbytes
- (idxval_byte
+ prev_bytes
));
1996 if (nbytes
> MAX_ALLOCA
)
1998 clear_string_char_byte_cache ();
2005 /* Arithmetic functions */
2007 enum comparison
{ equal
, notequal
, less
, grtr
, less_or_equal
, grtr_or_equal
};
2010 arithcompare (num1
, num2
, comparison
)
2011 Lisp_Object num1
, num2
;
2012 enum comparison comparison
;
2014 double f1
= 0, f2
= 0;
2017 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num1
, 0);
2018 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num2
, 0);
2020 if (FLOATP (num1
) || FLOATP (num2
))
2023 f1
= (FLOATP (num1
)) ? XFLOAT_DATA (num1
) : XINT (num1
);
2024 f2
= (FLOATP (num2
)) ? XFLOAT_DATA (num2
) : XINT (num2
);
2030 if (floatp
? f1
== f2
: XINT (num1
) == XINT (num2
))
2035 if (floatp
? f1
!= f2
: XINT (num1
) != XINT (num2
))
2040 if (floatp
? f1
< f2
: XINT (num1
) < XINT (num2
))
2045 if (floatp
? f1
<= f2
: XINT (num1
) <= XINT (num2
))
2050 if (floatp
? f1
> f2
: XINT (num1
) > XINT (num2
))
2055 if (floatp
? f1
>= f2
: XINT (num1
) >= XINT (num2
))
2064 DEFUN ("=", Feqlsign
, Seqlsign
, 2, 2, 0,
2065 "Return t if two args, both numbers or markers, are equal.")
2067 register Lisp_Object num1
, num2
;
2069 return arithcompare (num1
, num2
, equal
);
2072 DEFUN ("<", Flss
, Slss
, 2, 2, 0,
2073 "Return t if first arg is less than second arg. Both must be numbers or markers.")
2075 register Lisp_Object num1
, num2
;
2077 return arithcompare (num1
, num2
, less
);
2080 DEFUN (">", Fgtr
, Sgtr
, 2, 2, 0,
2081 "Return t if first arg is greater than second arg. Both must be numbers or markers.")
2083 register Lisp_Object num1
, num2
;
2085 return arithcompare (num1
, num2
, grtr
);
2088 DEFUN ("<=", Fleq
, Sleq
, 2, 2, 0,
2089 "Return t if first arg is less than or equal to second arg.\n\
2090 Both must be numbers or markers.")
2092 register Lisp_Object num1
, num2
;
2094 return arithcompare (num1
, num2
, less_or_equal
);
2097 DEFUN (">=", Fgeq
, Sgeq
, 2, 2, 0,
2098 "Return t if first arg is greater than or equal to second arg.\n\
2099 Both must be numbers or markers.")
2101 register Lisp_Object num1
, num2
;
2103 return arithcompare (num1
, num2
, grtr_or_equal
);
2106 DEFUN ("/=", Fneq
, Sneq
, 2, 2, 0,
2107 "Return t if first arg is not equal to second arg. Both must be numbers or markers.")
2109 register Lisp_Object num1
, num2
;
2111 return arithcompare (num1
, num2
, notequal
);
2114 DEFUN ("zerop", Fzerop
, Szerop
, 1, 1, 0, "Return t if NUMBER is zero.")
2116 register Lisp_Object number
;
2118 CHECK_NUMBER_OR_FLOAT (number
, 0);
2120 if (FLOATP (number
))
2122 if (XFLOAT_DATA (number
) == 0.0)
2132 /* Convert between long values and pairs of Lisp integers. */
2138 unsigned int top
= i
>> 16;
2139 unsigned int bot
= i
& 0xFFFF;
2141 return make_number (bot
);
2142 if (top
== (unsigned long)-1 >> 16)
2143 return Fcons (make_number (-1), make_number (bot
));
2144 return Fcons (make_number (top
), make_number (bot
));
2151 Lisp_Object top
, bot
;
2158 return ((XINT (top
) << 16) | XINT (bot
));
2161 DEFUN ("number-to-string", Fnumber_to_string
, Snumber_to_string
, 1, 1, 0,
2162 "Convert NUMBER to a string by printing it in decimal.\n\
2163 Uses a minus sign if negative.\n\
2164 NUMBER may be an integer or a floating point number.")
2168 char buffer
[VALBITS
];
2170 CHECK_NUMBER_OR_FLOAT (number
, 0);
2172 if (FLOATP (number
))
2174 char pigbuf
[350]; /* see comments in float_to_string */
2176 float_to_string (pigbuf
, XFLOAT_DATA (number
));
2177 return build_string (pigbuf
);
2180 if (sizeof (int) == sizeof (EMACS_INT
))
2181 sprintf (buffer
, "%d", XINT (number
));
2182 else if (sizeof (long) == sizeof (EMACS_INT
))
2183 sprintf (buffer
, "%ld", (long) XINT (number
));
2186 return build_string (buffer
);
2190 digit_to_number (character
, base
)
2191 int character
, base
;
2195 if (character
>= '0' && character
<= '9')
2196 digit
= character
- '0';
2197 else if (character
>= 'a' && character
<= 'z')
2198 digit
= character
- 'a' + 10;
2199 else if (character
>= 'A' && character
<= 'Z')
2200 digit
= character
- 'A' + 10;
2210 DEFUN ("string-to-number", Fstring_to_number
, Sstring_to_number
, 1, 2, 0,
2211 "Convert STRING to a number by parsing it as a decimal number.\n\
2212 This parses both integers and floating point numbers.\n\
2213 It ignores leading spaces and tabs.\n\
2215 If BASE, interpret STRING as a number in that base. If BASE isn't\n\
2216 present, base 10 is used. BASE must be between 2 and 16 (inclusive).\n\
2217 If the base used is not 10, floating point is not recognized.")
2219 register Lisp_Object string
, base
;
2221 register unsigned char *p
;
2226 CHECK_STRING (string
, 0);
2232 CHECK_NUMBER (base
, 1);
2234 if (b
< 2 || b
> 16)
2235 Fsignal (Qargs_out_of_range
, Fcons (base
, Qnil
));
2238 /* Skip any whitespace at the front of the number. Some versions of
2239 atoi do this anyway, so we might as well make Emacs lisp consistent. */
2240 p
= XSTRING (string
)->data
;
2241 while (*p
== ' ' || *p
== '\t')
2252 if (isfloat_string (p
) && b
== 10)
2253 val
= make_float (sign
* atof (p
));
2260 int digit
= digit_to_number (*p
++, b
);
2266 if (v
> (EMACS_UINT
) (VALMASK
>> 1))
2267 val
= make_float (sign
* v
);
2269 val
= make_number (sign
* (int) v
);
2277 { Aadd
, Asub
, Amult
, Adiv
, Alogand
, Alogior
, Alogxor
, Amax
, Amin
};
2279 extern Lisp_Object
float_arith_driver ();
2280 extern Lisp_Object
fmod_float ();
2283 arith_driver (code
, nargs
, args
)
2286 register Lisp_Object
*args
;
2288 register Lisp_Object val
;
2289 register int argnum
;
2290 register EMACS_INT accum
;
2291 register EMACS_INT next
;
2293 switch (SWITCH_ENUM_CAST (code
))
2306 for (argnum
= 0; argnum
< nargs
; argnum
++)
2308 val
= args
[argnum
]; /* using args[argnum] as argument to CHECK_NUMBER_... */
2309 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val
, argnum
);
2311 if (FLOATP (val
)) /* time to do serious math */
2312 return (float_arith_driver ((double) accum
, argnum
, code
,
2314 args
[argnum
] = val
; /* runs into a compiler bug. */
2315 next
= XINT (args
[argnum
]);
2316 switch (SWITCH_ENUM_CAST (code
))
2318 case Aadd
: accum
+= next
; break;
2320 accum
= argnum
? accum
- next
: nargs
== 1 ? - next
: next
;
2322 case Amult
: accum
*= next
; break;
2324 if (!argnum
) accum
= next
;
2328 Fsignal (Qarith_error
, Qnil
);
2332 case Alogand
: accum
&= next
; break;
2333 case Alogior
: accum
|= next
; break;
2334 case Alogxor
: accum
^= next
; break;
2335 case Amax
: if (!argnum
|| next
> accum
) accum
= next
; break;
2336 case Amin
: if (!argnum
|| next
< accum
) accum
= next
; break;
2340 XSETINT (val
, accum
);
2345 #define isnan(x) ((x) != (x))
2348 float_arith_driver (accum
, argnum
, code
, nargs
, args
)
2350 register int argnum
;
2353 register Lisp_Object
*args
;
2355 register Lisp_Object val
;
2358 for (; argnum
< nargs
; argnum
++)
2360 val
= args
[argnum
]; /* using args[argnum] as argument to CHECK_NUMBER_... */
2361 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val
, argnum
);
2365 next
= XFLOAT_DATA (val
);
2369 args
[argnum
] = val
; /* runs into a compiler bug. */
2370 next
= XINT (args
[argnum
]);
2372 switch (SWITCH_ENUM_CAST (code
))
2378 accum
= argnum
? accum
- next
: nargs
== 1 ? - next
: next
;
2388 if (! IEEE_FLOATING_POINT
&& next
== 0)
2389 Fsignal (Qarith_error
, Qnil
);
2396 return wrong_type_argument (Qinteger_or_marker_p
, val
);
2398 if (!argnum
|| isnan (next
) || next
> accum
)
2402 if (!argnum
|| isnan (next
) || next
< accum
)
2408 return make_float (accum
);
2412 DEFUN ("+", Fplus
, Splus
, 0, MANY
, 0,
2413 "Return sum of any number of arguments, which are numbers or markers.")
2418 return arith_driver (Aadd
, nargs
, args
);
2421 DEFUN ("-", Fminus
, Sminus
, 0, MANY
, 0,
2422 "Negate number or subtract numbers or markers.\n\
2423 With one arg, negates it. With more than one arg,\n\
2424 subtracts all but the first from the first.")
2429 return arith_driver (Asub
, nargs
, args
);
2432 DEFUN ("*", Ftimes
, Stimes
, 0, MANY
, 0,
2433 "Returns product of any number of arguments, which are numbers or markers.")
2438 return arith_driver (Amult
, nargs
, args
);
2441 DEFUN ("/", Fquo
, Squo
, 2, MANY
, 0,
2442 "Returns first argument divided by all the remaining arguments.\n\
2443 The arguments must be numbers or markers.")
2448 return arith_driver (Adiv
, nargs
, args
);
2451 DEFUN ("%", Frem
, Srem
, 2, 2, 0,
2452 "Returns remainder of X divided by Y.\n\
2453 Both must be integers or markers.")
2455 register Lisp_Object x
, y
;
2459 CHECK_NUMBER_COERCE_MARKER (x
, 0);
2460 CHECK_NUMBER_COERCE_MARKER (y
, 1);
2462 if (XFASTINT (y
) == 0)
2463 Fsignal (Qarith_error
, Qnil
);
2465 XSETINT (val
, XINT (x
) % XINT (y
));
2479 /* If the magnitude of the result exceeds that of the divisor, or
2480 the sign of the result does not agree with that of the dividend,
2481 iterate with the reduced value. This does not yield a
2482 particularly accurate result, but at least it will be in the
2483 range promised by fmod. */
2485 r
-= f2
* floor (r
/ f2
);
2486 while (f2
<= (r
< 0 ? -r
: r
) || ((r
< 0) != (f1
< 0) && ! isnan (r
)));
2490 #endif /* ! HAVE_FMOD */
2492 DEFUN ("mod", Fmod
, Smod
, 2, 2, 0,
2493 "Returns X modulo Y.\n\
2494 The result falls between zero (inclusive) and Y (exclusive).\n\
2495 Both X and Y must be numbers or markers.")
2497 register Lisp_Object x
, y
;
2502 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (x
, 0);
2503 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (y
, 1);
2505 if (FLOATP (x
) || FLOATP (y
))
2506 return fmod_float (x
, y
);
2512 Fsignal (Qarith_error
, Qnil
);
2516 /* If the "remainder" comes out with the wrong sign, fix it. */
2517 if (i2
< 0 ? i1
> 0 : i1
< 0)
2524 DEFUN ("max", Fmax
, Smax
, 1, MANY
, 0,
2525 "Return largest of all the arguments (which must be numbers or markers).\n\
2526 The value is always a number; markers are converted to numbers.")
2531 return arith_driver (Amax
, nargs
, args
);
2534 DEFUN ("min", Fmin
, Smin
, 1, MANY
, 0,
2535 "Return smallest of all the arguments (which must be numbers or markers).\n\
2536 The value is always a number; markers are converted to numbers.")
2541 return arith_driver (Amin
, nargs
, args
);
2544 DEFUN ("logand", Flogand
, Slogand
, 0, MANY
, 0,
2545 "Return bitwise-and of all the arguments.\n\
2546 Arguments may be integers, or markers converted to integers.")
2551 return arith_driver (Alogand
, nargs
, args
);
2554 DEFUN ("logior", Flogior
, Slogior
, 0, MANY
, 0,
2555 "Return bitwise-or of all the arguments.\n\
2556 Arguments may be integers, or markers converted to integers.")
2561 return arith_driver (Alogior
, nargs
, args
);
2564 DEFUN ("logxor", Flogxor
, Slogxor
, 0, MANY
, 0,
2565 "Return bitwise-exclusive-or of all the arguments.\n\
2566 Arguments may be integers, or markers converted to integers.")
2571 return arith_driver (Alogxor
, nargs
, args
);
2574 DEFUN ("ash", Fash
, Sash
, 2, 2, 0,
2575 "Return VALUE with its bits shifted left by COUNT.\n\
2576 If COUNT is negative, shifting is actually to the right.\n\
2577 In this case, the sign bit is duplicated.")
2579 register Lisp_Object value
, count
;
2581 register Lisp_Object val
;
2583 CHECK_NUMBER (value
, 0);
2584 CHECK_NUMBER (count
, 1);
2586 if (XINT (count
) >= BITS_PER_EMACS_INT
)
2588 else if (XINT (count
) > 0)
2589 XSETINT (val
, XINT (value
) << XFASTINT (count
));
2590 else if (XINT (count
) <= -BITS_PER_EMACS_INT
)
2591 XSETINT (val
, XINT (value
) < 0 ? -1 : 0);
2593 XSETINT (val
, XINT (value
) >> -XINT (count
));
2597 DEFUN ("lsh", Flsh
, Slsh
, 2, 2, 0,
2598 "Return VALUE with its bits shifted left by COUNT.\n\
2599 If COUNT is negative, shifting is actually to the right.\n\
2600 In this case, zeros are shifted in on the left.")
2602 register Lisp_Object value
, count
;
2604 register Lisp_Object val
;
2606 CHECK_NUMBER (value
, 0);
2607 CHECK_NUMBER (count
, 1);
2609 if (XINT (count
) >= BITS_PER_EMACS_INT
)
2611 else if (XINT (count
) > 0)
2612 XSETINT (val
, (EMACS_UINT
) XUINT (value
) << XFASTINT (count
));
2613 else if (XINT (count
) <= -BITS_PER_EMACS_INT
)
2616 XSETINT (val
, (EMACS_UINT
) XUINT (value
) >> -XINT (count
));
2620 DEFUN ("1+", Fadd1
, Sadd1
, 1, 1, 0,
2621 "Return NUMBER plus one. NUMBER may be a number or a marker.\n\
2622 Markers are converted to integers.")
2624 register Lisp_Object number
;
2626 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number
, 0);
2628 if (FLOATP (number
))
2629 return (make_float (1.0 + XFLOAT_DATA (number
)));
2631 XSETINT (number
, XINT (number
) + 1);
2635 DEFUN ("1-", Fsub1
, Ssub1
, 1, 1, 0,
2636 "Return NUMBER minus one. NUMBER may be a number or a marker.\n\
2637 Markers are converted to integers.")
2639 register Lisp_Object number
;
2641 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number
, 0);
2643 if (FLOATP (number
))
2644 return (make_float (-1.0 + XFLOAT_DATA (number
)));
2646 XSETINT (number
, XINT (number
) - 1);
2650 DEFUN ("lognot", Flognot
, Slognot
, 1, 1, 0,
2651 "Return the bitwise complement of NUMBER. NUMBER must be an integer.")
2653 register Lisp_Object number
;
2655 CHECK_NUMBER (number
, 0);
2656 XSETINT (number
, ~XINT (number
));
2663 Lisp_Object error_tail
, arith_tail
;
2665 Qquote
= intern ("quote");
2666 Qlambda
= intern ("lambda");
2667 Qsubr
= intern ("subr");
2668 Qerror_conditions
= intern ("error-conditions");
2669 Qerror_message
= intern ("error-message");
2670 Qtop_level
= intern ("top-level");
2672 Qerror
= intern ("error");
2673 Qquit
= intern ("quit");
2674 Qwrong_type_argument
= intern ("wrong-type-argument");
2675 Qargs_out_of_range
= intern ("args-out-of-range");
2676 Qvoid_function
= intern ("void-function");
2677 Qcyclic_function_indirection
= intern ("cyclic-function-indirection");
2678 Qvoid_variable
= intern ("void-variable");
2679 Qsetting_constant
= intern ("setting-constant");
2680 Qinvalid_read_syntax
= intern ("invalid-read-syntax");
2682 Qinvalid_function
= intern ("invalid-function");
2683 Qwrong_number_of_arguments
= intern ("wrong-number-of-arguments");
2684 Qno_catch
= intern ("no-catch");
2685 Qend_of_file
= intern ("end-of-file");
2686 Qarith_error
= intern ("arith-error");
2687 Qbeginning_of_buffer
= intern ("beginning-of-buffer");
2688 Qend_of_buffer
= intern ("end-of-buffer");
2689 Qbuffer_read_only
= intern ("buffer-read-only");
2690 Qtext_read_only
= intern ("text-read-only");
2691 Qmark_inactive
= intern ("mark-inactive");
2693 Qlistp
= intern ("listp");
2694 Qconsp
= intern ("consp");
2695 Qsymbolp
= intern ("symbolp");
2696 Qkeywordp
= intern ("keywordp");
2697 Qintegerp
= intern ("integerp");
2698 Qnatnump
= intern ("natnump");
2699 Qwholenump
= intern ("wholenump");
2700 Qstringp
= intern ("stringp");
2701 Qarrayp
= intern ("arrayp");
2702 Qsequencep
= intern ("sequencep");
2703 Qbufferp
= intern ("bufferp");
2704 Qvectorp
= intern ("vectorp");
2705 Qchar_or_string_p
= intern ("char-or-string-p");
2706 Qmarkerp
= intern ("markerp");
2707 Qbuffer_or_string_p
= intern ("buffer-or-string-p");
2708 Qinteger_or_marker_p
= intern ("integer-or-marker-p");
2709 Qboundp
= intern ("boundp");
2710 Qfboundp
= intern ("fboundp");
2712 Qfloatp
= intern ("floatp");
2713 Qnumberp
= intern ("numberp");
2714 Qnumber_or_marker_p
= intern ("number-or-marker-p");
2716 Qchar_table_p
= intern ("char-table-p");
2717 Qvector_or_char_table_p
= intern ("vector-or-char-table-p");
2719 Qsubrp
= intern ("subrp");
2720 Qunevalled
= intern ("unevalled");
2721 Qmany
= intern ("many");
2723 Qcdr
= intern ("cdr");
2725 /* Handle automatic advice activation */
2726 Qad_advice_info
= intern ("ad-advice-info");
2727 Qad_activate_internal
= intern ("ad-activate-internal");
2729 error_tail
= Fcons (Qerror
, Qnil
);
2731 /* ERROR is used as a signaler for random errors for which nothing else is right */
2733 Fput (Qerror
, Qerror_conditions
,
2735 Fput (Qerror
, Qerror_message
,
2736 build_string ("error"));
2738 Fput (Qquit
, Qerror_conditions
,
2739 Fcons (Qquit
, Qnil
));
2740 Fput (Qquit
, Qerror_message
,
2741 build_string ("Quit"));
2743 Fput (Qwrong_type_argument
, Qerror_conditions
,
2744 Fcons (Qwrong_type_argument
, error_tail
));
2745 Fput (Qwrong_type_argument
, Qerror_message
,
2746 build_string ("Wrong type argument"));
2748 Fput (Qargs_out_of_range
, Qerror_conditions
,
2749 Fcons (Qargs_out_of_range
, error_tail
));
2750 Fput (Qargs_out_of_range
, Qerror_message
,
2751 build_string ("Args out of range"));
2753 Fput (Qvoid_function
, Qerror_conditions
,
2754 Fcons (Qvoid_function
, error_tail
));
2755 Fput (Qvoid_function
, Qerror_message
,
2756 build_string ("Symbol's function definition is void"));
2758 Fput (Qcyclic_function_indirection
, Qerror_conditions
,
2759 Fcons (Qcyclic_function_indirection
, error_tail
));
2760 Fput (Qcyclic_function_indirection
, Qerror_message
,
2761 build_string ("Symbol's chain of function indirections contains a loop"));
2763 Fput (Qvoid_variable
, Qerror_conditions
,
2764 Fcons (Qvoid_variable
, error_tail
));
2765 Fput (Qvoid_variable
, Qerror_message
,
2766 build_string ("Symbol's value as variable is void"));
2768 Fput (Qsetting_constant
, Qerror_conditions
,
2769 Fcons (Qsetting_constant
, error_tail
));
2770 Fput (Qsetting_constant
, Qerror_message
,
2771 build_string ("Attempt to set a constant symbol"));
2773 Fput (Qinvalid_read_syntax
, Qerror_conditions
,
2774 Fcons (Qinvalid_read_syntax
, error_tail
));
2775 Fput (Qinvalid_read_syntax
, Qerror_message
,
2776 build_string ("Invalid read syntax"));
2778 Fput (Qinvalid_function
, Qerror_conditions
,
2779 Fcons (Qinvalid_function
, error_tail
));
2780 Fput (Qinvalid_function
, Qerror_message
,
2781 build_string ("Invalid function"));
2783 Fput (Qwrong_number_of_arguments
, Qerror_conditions
,
2784 Fcons (Qwrong_number_of_arguments
, error_tail
));
2785 Fput (Qwrong_number_of_arguments
, Qerror_message
,
2786 build_string ("Wrong number of arguments"));
2788 Fput (Qno_catch
, Qerror_conditions
,
2789 Fcons (Qno_catch
, error_tail
));
2790 Fput (Qno_catch
, Qerror_message
,
2791 build_string ("No catch for tag"));
2793 Fput (Qend_of_file
, Qerror_conditions
,
2794 Fcons (Qend_of_file
, error_tail
));
2795 Fput (Qend_of_file
, Qerror_message
,
2796 build_string ("End of file during parsing"));
2798 arith_tail
= Fcons (Qarith_error
, error_tail
);
2799 Fput (Qarith_error
, Qerror_conditions
,
2801 Fput (Qarith_error
, Qerror_message
,
2802 build_string ("Arithmetic error"));
2804 Fput (Qbeginning_of_buffer
, Qerror_conditions
,
2805 Fcons (Qbeginning_of_buffer
, error_tail
));
2806 Fput (Qbeginning_of_buffer
, Qerror_message
,
2807 build_string ("Beginning of buffer"));
2809 Fput (Qend_of_buffer
, Qerror_conditions
,
2810 Fcons (Qend_of_buffer
, error_tail
));
2811 Fput (Qend_of_buffer
, Qerror_message
,
2812 build_string ("End of buffer"));
2814 Fput (Qbuffer_read_only
, Qerror_conditions
,
2815 Fcons (Qbuffer_read_only
, error_tail
));
2816 Fput (Qbuffer_read_only
, Qerror_message
,
2817 build_string ("Buffer is read-only"));
2819 Fput (Qtext_read_only
, Qerror_conditions
,
2820 Fcons (Qtext_read_only
, error_tail
));
2821 Fput (Qtext_read_only
, Qerror_message
,
2822 build_string ("Text is read-only"));
2824 Qrange_error
= intern ("range-error");
2825 Qdomain_error
= intern ("domain-error");
2826 Qsingularity_error
= intern ("singularity-error");
2827 Qoverflow_error
= intern ("overflow-error");
2828 Qunderflow_error
= intern ("underflow-error");
2830 Fput (Qdomain_error
, Qerror_conditions
,
2831 Fcons (Qdomain_error
, arith_tail
));
2832 Fput (Qdomain_error
, Qerror_message
,
2833 build_string ("Arithmetic domain error"));
2835 Fput (Qrange_error
, Qerror_conditions
,
2836 Fcons (Qrange_error
, arith_tail
));
2837 Fput (Qrange_error
, Qerror_message
,
2838 build_string ("Arithmetic range error"));
2840 Fput (Qsingularity_error
, Qerror_conditions
,
2841 Fcons (Qsingularity_error
, Fcons (Qdomain_error
, arith_tail
)));
2842 Fput (Qsingularity_error
, Qerror_message
,
2843 build_string ("Arithmetic singularity error"));
2845 Fput (Qoverflow_error
, Qerror_conditions
,
2846 Fcons (Qoverflow_error
, Fcons (Qdomain_error
, arith_tail
)));
2847 Fput (Qoverflow_error
, Qerror_message
,
2848 build_string ("Arithmetic overflow error"));
2850 Fput (Qunderflow_error
, Qerror_conditions
,
2851 Fcons (Qunderflow_error
, Fcons (Qdomain_error
, arith_tail
)));
2852 Fput (Qunderflow_error
, Qerror_message
,
2853 build_string ("Arithmetic underflow error"));
2855 staticpro (&Qrange_error
);
2856 staticpro (&Qdomain_error
);
2857 staticpro (&Qsingularity_error
);
2858 staticpro (&Qoverflow_error
);
2859 staticpro (&Qunderflow_error
);
2863 staticpro (&Qquote
);
2864 staticpro (&Qlambda
);
2866 staticpro (&Qunbound
);
2867 staticpro (&Qerror_conditions
);
2868 staticpro (&Qerror_message
);
2869 staticpro (&Qtop_level
);
2871 staticpro (&Qerror
);
2873 staticpro (&Qwrong_type_argument
);
2874 staticpro (&Qargs_out_of_range
);
2875 staticpro (&Qvoid_function
);
2876 staticpro (&Qcyclic_function_indirection
);
2877 staticpro (&Qvoid_variable
);
2878 staticpro (&Qsetting_constant
);
2879 staticpro (&Qinvalid_read_syntax
);
2880 staticpro (&Qwrong_number_of_arguments
);
2881 staticpro (&Qinvalid_function
);
2882 staticpro (&Qno_catch
);
2883 staticpro (&Qend_of_file
);
2884 staticpro (&Qarith_error
);
2885 staticpro (&Qbeginning_of_buffer
);
2886 staticpro (&Qend_of_buffer
);
2887 staticpro (&Qbuffer_read_only
);
2888 staticpro (&Qtext_read_only
);
2889 staticpro (&Qmark_inactive
);
2891 staticpro (&Qlistp
);
2892 staticpro (&Qconsp
);
2893 staticpro (&Qsymbolp
);
2894 staticpro (&Qkeywordp
);
2895 staticpro (&Qintegerp
);
2896 staticpro (&Qnatnump
);
2897 staticpro (&Qwholenump
);
2898 staticpro (&Qstringp
);
2899 staticpro (&Qarrayp
);
2900 staticpro (&Qsequencep
);
2901 staticpro (&Qbufferp
);
2902 staticpro (&Qvectorp
);
2903 staticpro (&Qchar_or_string_p
);
2904 staticpro (&Qmarkerp
);
2905 staticpro (&Qbuffer_or_string_p
);
2906 staticpro (&Qinteger_or_marker_p
);
2907 staticpro (&Qfloatp
);
2908 staticpro (&Qnumberp
);
2909 staticpro (&Qnumber_or_marker_p
);
2910 staticpro (&Qchar_table_p
);
2911 staticpro (&Qvector_or_char_table_p
);
2912 staticpro (&Qsubrp
);
2914 staticpro (&Qunevalled
);
2916 staticpro (&Qboundp
);
2917 staticpro (&Qfboundp
);
2919 staticpro (&Qad_advice_info
);
2920 staticpro (&Qad_activate_internal
);
2922 /* Types that type-of returns. */
2923 Qinteger
= intern ("integer");
2924 Qsymbol
= intern ("symbol");
2925 Qstring
= intern ("string");
2926 Qcons
= intern ("cons");
2927 Qmarker
= intern ("marker");
2928 Qoverlay
= intern ("overlay");
2929 Qfloat
= intern ("float");
2930 Qwindow_configuration
= intern ("window-configuration");
2931 Qprocess
= intern ("process");
2932 Qwindow
= intern ("window");
2933 /* Qsubr = intern ("subr"); */
2934 Qcompiled_function
= intern ("compiled-function");
2935 Qbuffer
= intern ("buffer");
2936 Qframe
= intern ("frame");
2937 Qvector
= intern ("vector");
2938 Qchar_table
= intern ("char-table");
2939 Qbool_vector
= intern ("bool-vector");
2940 Qhash_table
= intern ("hash-table");
2942 staticpro (&Qinteger
);
2943 staticpro (&Qsymbol
);
2944 staticpro (&Qstring
);
2946 staticpro (&Qmarker
);
2947 staticpro (&Qoverlay
);
2948 staticpro (&Qfloat
);
2949 staticpro (&Qwindow_configuration
);
2950 staticpro (&Qprocess
);
2951 staticpro (&Qwindow
);
2952 /* staticpro (&Qsubr); */
2953 staticpro (&Qcompiled_function
);
2954 staticpro (&Qbuffer
);
2955 staticpro (&Qframe
);
2956 staticpro (&Qvector
);
2957 staticpro (&Qchar_table
);
2958 staticpro (&Qbool_vector
);
2959 staticpro (&Qhash_table
);
2963 defsubr (&Stype_of
);
2968 defsubr (&Sintegerp
);
2969 defsubr (&Sinteger_or_marker_p
);
2970 defsubr (&Snumberp
);
2971 defsubr (&Snumber_or_marker_p
);
2973 defsubr (&Snatnump
);
2974 defsubr (&Ssymbolp
);
2975 defsubr (&Skeywordp
);
2976 defsubr (&Sstringp
);
2977 defsubr (&Smultibyte_string_p
);
2978 defsubr (&Svectorp
);
2979 defsubr (&Schar_table_p
);
2980 defsubr (&Svector_or_char_table_p
);
2981 defsubr (&Sbool_vector_p
);
2983 defsubr (&Ssequencep
);
2984 defsubr (&Sbufferp
);
2985 defsubr (&Smarkerp
);
2987 defsubr (&Sbyte_code_function_p
);
2988 defsubr (&Schar_or_string_p
);
2991 defsubr (&Scar_safe
);
2992 defsubr (&Scdr_safe
);
2995 defsubr (&Ssymbol_function
);
2996 defsubr (&Sindirect_function
);
2997 defsubr (&Ssymbol_plist
);
2998 defsubr (&Ssymbol_name
);
2999 defsubr (&Smakunbound
);
3000 defsubr (&Sfmakunbound
);
3002 defsubr (&Sfboundp
);
3004 defsubr (&Sdefalias
);
3005 defsubr (&Ssetplist
);
3006 defsubr (&Ssymbol_value
);
3008 defsubr (&Sdefault_boundp
);
3009 defsubr (&Sdefault_value
);
3010 defsubr (&Sset_default
);
3011 defsubr (&Ssetq_default
);
3012 defsubr (&Smake_variable_buffer_local
);
3013 defsubr (&Smake_local_variable
);
3014 defsubr (&Skill_local_variable
);
3015 defsubr (&Smake_variable_frame_local
);
3016 defsubr (&Slocal_variable_p
);
3017 defsubr (&Slocal_variable_if_set_p
);
3020 defsubr (&Snumber_to_string
);
3021 defsubr (&Sstring_to_number
);
3022 defsubr (&Seqlsign
);
3045 defsubr (&Ssubr_arity
);
3047 XSYMBOL (Qwholenump
)->function
= XSYMBOL (Qnatnump
)->function
;
3054 #if defined(USG) && !defined(POSIX_SIGNALS)
3055 /* USG systems forget handlers when they are used;
3056 must reestablish each time */
3057 signal (signo
, arith_error
);
3060 /* VMS systems are like USG. */
3061 signal (signo
, arith_error
);
3065 #else /* not BSD4_1 */
3066 sigsetmask (SIGEMPTYMASK
);
3067 #endif /* not BSD4_1 */
3069 Fsignal (Qarith_error
, Qnil
);
3075 /* Don't do this if just dumping out.
3076 We don't want to call `signal' in this case
3077 so that we don't have trouble with dumping
3078 signal-delivering routines in an inconsistent state. */
3082 #endif /* CANNOT_DUMP */
3083 signal (SIGFPE
, arith_error
);
3086 signal (SIGEMT
, arith_error
);