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, 2001
3 Free Software Foundation, Inc.
5 This file is part of GNU Emacs.
7 GNU Emacs is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs; see the file COPYING. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
32 #include "syssignal.h"
38 /* If IEEE_FLOATING_POINT isn't defined, default it from FLT_*. */
39 #ifndef IEEE_FLOATING_POINT
40 #if (FLT_RADIX == 2 && FLT_MANT_DIG == 24 \
41 && FLT_MIN_EXP == -125 && FLT_MAX_EXP == 128)
42 #define IEEE_FLOATING_POINT 1
44 #define IEEE_FLOATING_POINT 0
48 /* Work around a problem that happens because math.h on hpux 7
49 defines two static variables--which, in Emacs, are not really static,
50 because `static' is defined as nothing. The problem is that they are
51 here, in floatfns.c, and in lread.c.
52 These macros prevent the name conflict. */
53 #if defined (HPUX) && !defined (HPUX8)
54 #define _MAXLDBL data_c_maxldbl
55 #define _NMAXLDBL data_c_nmaxldbl
61 extern double atof ();
64 Lisp_Object Qnil
, Qt
, Qquote
, Qlambda
, Qsubr
, Qunbound
;
65 Lisp_Object Qerror_conditions
, Qerror_message
, Qtop_level
;
66 Lisp_Object Qerror
, Qquit
, Qwrong_type_argument
, Qargs_out_of_range
;
67 Lisp_Object Qvoid_variable
, Qvoid_function
, Qcyclic_function_indirection
;
68 Lisp_Object Qcyclic_variable_indirection
, Qcircular_list
;
69 Lisp_Object Qsetting_constant
, Qinvalid_read_syntax
;
70 Lisp_Object Qinvalid_function
, Qwrong_number_of_arguments
, Qno_catch
;
71 Lisp_Object Qend_of_file
, Qarith_error
, Qmark_inactive
;
72 Lisp_Object Qbeginning_of_buffer
, Qend_of_buffer
, Qbuffer_read_only
;
73 Lisp_Object Qtext_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
, Qkeywordp
;
78 Lisp_Object Qboundp
, Qfboundp
;
79 Lisp_Object Qchar_table_p
, Qvector_or_char_table_p
;
82 Lisp_Object Qad_advice_info
, Qad_activate_internal
;
84 Lisp_Object Qrange_error
, Qdomain_error
, Qsingularity_error
;
85 Lisp_Object Qoverflow_error
, Qunderflow_error
;
88 Lisp_Object Qnumberp
, Qnumber_or_marker_p
;
90 static Lisp_Object Qinteger
, Qsymbol
, Qstring
, Qcons
, Qmarker
, Qoverlay
;
91 static Lisp_Object Qfloat
, Qwindow_configuration
, Qwindow
;
93 static Lisp_Object Qcompiled_function
, Qbuffer
, Qframe
, Qvector
;
94 static Lisp_Object Qchar_table
, Qbool_vector
, Qhash_table
;
95 static Lisp_Object Qsubrp
, Qmany
, Qunevalled
;
97 static Lisp_Object swap_in_symval_forwarding
P_ ((Lisp_Object
, Lisp_Object
));
99 Lisp_Object Vmost_positive_fixnum
, Vmost_negative_fixnum
;
103 circular_list_error (list
)
106 Fsignal (Qcircular_list
, list
);
111 wrong_type_argument (predicate
, value
)
112 register Lisp_Object predicate
, value
;
114 register Lisp_Object tem
;
117 /* If VALUE is not even a valid Lisp object, abort here
118 where we can get a backtrace showing where it came from. */
119 if ((unsigned int) XGCTYPE (value
) >= Lisp_Type_Limit
)
122 value
= Fsignal (Qwrong_type_argument
, Fcons (predicate
, Fcons (value
, Qnil
)));
123 tem
= call1 (predicate
, value
);
132 error ("Attempt to modify read-only object");
136 args_out_of_range (a1
, a2
)
140 Fsignal (Qargs_out_of_range
, Fcons (a1
, Fcons (a2
, Qnil
)));
144 args_out_of_range_3 (a1
, a2
, a3
)
145 Lisp_Object a1
, a2
, a3
;
148 Fsignal (Qargs_out_of_range
, Fcons (a1
, Fcons (a2
, Fcons (a3
, Qnil
))));
151 /* On some machines, XINT needs a temporary location.
152 Here it is, in case it is needed. */
154 int sign_extend_temp
;
156 /* On a few machines, XINT can only be done by calling this. */
159 sign_extend_lisp_int (num
)
162 if (num
& (((EMACS_INT
) 1) << (VALBITS
- 1)))
163 return num
| (((EMACS_INT
) (-1)) << VALBITS
);
165 return num
& ((((EMACS_INT
) 1) << VALBITS
) - 1);
168 /* Data type predicates */
170 DEFUN ("eq", Feq
, Seq
, 2, 2, 0,
171 doc
: /* Return t if the two args are the same Lisp object. */)
173 Lisp_Object obj1
, obj2
;
180 DEFUN ("null", Fnull
, Snull
, 1, 1, 0,
181 doc
: /* Return t if OBJECT is nil. */)
190 DEFUN ("type-of", Ftype_of
, Stype_of
, 1, 1, 0,
191 doc
: /* Return a symbol representing the type of OBJECT.
192 The symbol returned names the object's basic type;
193 for example, (type-of 1) returns `integer'. */)
197 switch (XGCTYPE (object
))
212 switch (XMISCTYPE (object
))
214 case Lisp_Misc_Marker
:
216 case Lisp_Misc_Overlay
:
218 case Lisp_Misc_Float
:
223 case Lisp_Vectorlike
:
224 if (GC_WINDOW_CONFIGURATIONP (object
))
225 return Qwindow_configuration
;
226 if (GC_PROCESSP (object
))
228 if (GC_WINDOWP (object
))
230 if (GC_SUBRP (object
))
232 if (GC_COMPILEDP (object
))
233 return Qcompiled_function
;
234 if (GC_BUFFERP (object
))
236 if (GC_CHAR_TABLE_P (object
))
238 if (GC_BOOL_VECTOR_P (object
))
240 if (GC_FRAMEP (object
))
242 if (GC_HASH_TABLE_P (object
))
254 DEFUN ("consp", Fconsp
, Sconsp
, 1, 1, 0,
255 doc
: /* Return t if OBJECT is a cons cell. */)
264 DEFUN ("atom", Fatom
, Satom
, 1, 1, 0,
265 doc
: /* Return t if OBJECT is not a cons cell. This includes nil. */)
274 DEFUN ("listp", Flistp
, Slistp
, 1, 1, 0,
275 doc
: /* Return t if OBJECT is a list. This includes nil. */)
279 if (CONSP (object
) || NILP (object
))
284 DEFUN ("nlistp", Fnlistp
, Snlistp
, 1, 1, 0,
285 doc
: /* Return t if OBJECT is not a list. Lists include nil. */)
289 if (CONSP (object
) || NILP (object
))
294 DEFUN ("symbolp", Fsymbolp
, Ssymbolp
, 1, 1, 0,
295 doc
: /* Return t if OBJECT is a symbol. */)
299 if (SYMBOLP (object
))
304 /* Define this in C to avoid unnecessarily consing up the symbol
306 DEFUN ("keywordp", Fkeywordp
, Skeywordp
, 1, 1, 0,
307 doc
: /* Return t if OBJECT is a keyword.
308 This means that it is a symbol with a print name beginning with `:'
309 interned in the initial obarray. */)
314 && SREF (SYMBOL_NAME (object
), 0) == ':'
315 && SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P (object
))
320 DEFUN ("vectorp", Fvectorp
, Svectorp
, 1, 1, 0,
321 doc
: /* Return t if OBJECT is a vector. */)
325 if (VECTORP (object
))
330 DEFUN ("stringp", Fstringp
, Sstringp
, 1, 1, 0,
331 doc
: /* Return t if OBJECT is a string. */)
335 if (STRINGP (object
))
340 DEFUN ("multibyte-string-p", Fmultibyte_string_p
, Smultibyte_string_p
,
342 doc
: /* Return t if OBJECT is a multibyte string. */)
346 if (STRINGP (object
) && STRING_MULTIBYTE (object
))
351 DEFUN ("char-table-p", Fchar_table_p
, Schar_table_p
, 1, 1, 0,
352 doc
: /* Return t if OBJECT is a char-table. */)
356 if (CHAR_TABLE_P (object
))
361 DEFUN ("vector-or-char-table-p", Fvector_or_char_table_p
,
362 Svector_or_char_table_p
, 1, 1, 0,
363 doc
: /* Return t if OBJECT is a char-table or vector. */)
367 if (VECTORP (object
) || CHAR_TABLE_P (object
))
372 DEFUN ("bool-vector-p", Fbool_vector_p
, Sbool_vector_p
, 1, 1, 0,
373 doc
: /* Return t if OBJECT is a bool-vector. */)
377 if (BOOL_VECTOR_P (object
))
382 DEFUN ("arrayp", Farrayp
, Sarrayp
, 1, 1, 0,
383 doc
: /* Return t if OBJECT is an array (string or vector). */)
387 if (VECTORP (object
) || STRINGP (object
)
388 || CHAR_TABLE_P (object
) || BOOL_VECTOR_P (object
))
393 DEFUN ("sequencep", Fsequencep
, Ssequencep
, 1, 1, 0,
394 doc
: /* Return t if OBJECT is a sequence (list or array). */)
396 register Lisp_Object object
;
398 if (CONSP (object
) || NILP (object
) || VECTORP (object
) || STRINGP (object
)
399 || CHAR_TABLE_P (object
) || BOOL_VECTOR_P (object
))
404 DEFUN ("bufferp", Fbufferp
, Sbufferp
, 1, 1, 0,
405 doc
: /* Return t if OBJECT is an editor buffer. */)
409 if (BUFFERP (object
))
414 DEFUN ("markerp", Fmarkerp
, Smarkerp
, 1, 1, 0,
415 doc
: /* Return t if OBJECT is a marker (editor pointer). */)
419 if (MARKERP (object
))
424 DEFUN ("subrp", Fsubrp
, Ssubrp
, 1, 1, 0,
425 doc
: /* Return t if OBJECT is a built-in function. */)
434 DEFUN ("byte-code-function-p", Fbyte_code_function_p
, Sbyte_code_function_p
,
436 doc
: /* Return t if OBJECT is a byte-compiled function object. */)
440 if (COMPILEDP (object
))
445 DEFUN ("char-or-string-p", Fchar_or_string_p
, Schar_or_string_p
, 1, 1, 0,
446 doc
: /* Return t if OBJECT is a character (an integer) or a string. */)
448 register Lisp_Object object
;
450 if (INTEGERP (object
) || STRINGP (object
))
455 DEFUN ("integerp", Fintegerp
, Sintegerp
, 1, 1, 0,
456 doc
: /* Return t if OBJECT is an integer. */)
460 if (INTEGERP (object
))
465 DEFUN ("integer-or-marker-p", Finteger_or_marker_p
, Sinteger_or_marker_p
, 1, 1, 0,
466 doc
: /* Return t if OBJECT is an integer or a marker (editor pointer). */)
468 register Lisp_Object object
;
470 if (MARKERP (object
) || INTEGERP (object
))
475 DEFUN ("natnump", Fnatnump
, Snatnump
, 1, 1, 0,
476 doc
: /* Return t if OBJECT is a nonnegative integer. */)
480 if (NATNUMP (object
))
485 DEFUN ("numberp", Fnumberp
, Snumberp
, 1, 1, 0,
486 doc
: /* Return t if OBJECT is a number (floating point or integer). */)
490 if (NUMBERP (object
))
496 DEFUN ("number-or-marker-p", Fnumber_or_marker_p
,
497 Snumber_or_marker_p
, 1, 1, 0,
498 doc
: /* Return t if OBJECT is a number or a marker. */)
502 if (NUMBERP (object
) || MARKERP (object
))
507 DEFUN ("floatp", Ffloatp
, Sfloatp
, 1, 1, 0,
508 doc
: /* Return t if OBJECT is a floating point number. */)
518 /* Extract and set components of lists */
520 DEFUN ("car", Fcar
, Scar
, 1, 1, 0,
521 doc
: /* Return the car of LIST. If arg is nil, return nil.
522 Error if arg is not nil and not a cons cell. See also `car-safe'. */)
524 register Lisp_Object list
;
530 else if (EQ (list
, Qnil
))
533 list
= wrong_type_argument (Qlistp
, list
);
537 DEFUN ("car-safe", Fcar_safe
, Scar_safe
, 1, 1, 0,
538 doc
: /* Return the car of OBJECT if it is a cons cell, or else nil. */)
543 return XCAR (object
);
548 DEFUN ("cdr", Fcdr
, Scdr
, 1, 1, 0,
549 doc
: /* Return the cdr of LIST. If arg is nil, return nil.
550 Error if arg is not nil and not a cons cell. See also `cdr-safe'. */)
552 register Lisp_Object list
;
558 else if (EQ (list
, Qnil
))
561 list
= wrong_type_argument (Qlistp
, list
);
565 DEFUN ("cdr-safe", Fcdr_safe
, Scdr_safe
, 1, 1, 0,
566 doc
: /* Return the cdr of OBJECT if it is a cons cell, or else nil. */)
571 return XCDR (object
);
576 DEFUN ("setcar", Fsetcar
, Ssetcar
, 2, 2, 0,
577 doc
: /* Set the car of CELL to be NEWCAR. Returns NEWCAR. */)
579 register Lisp_Object cell
, newcar
;
582 cell
= wrong_type_argument (Qconsp
, cell
);
585 XSETCAR (cell
, newcar
);
589 DEFUN ("setcdr", Fsetcdr
, Ssetcdr
, 2, 2, 0,
590 doc
: /* Set the cdr of CELL to be NEWCDR. Returns NEWCDR. */)
592 register Lisp_Object cell
, newcdr
;
595 cell
= wrong_type_argument (Qconsp
, cell
);
598 XSETCDR (cell
, newcdr
);
602 /* Extract and set components of symbols */
604 DEFUN ("boundp", Fboundp
, Sboundp
, 1, 1, 0,
605 doc
: /* Return t if SYMBOL's value is not void. */)
607 register Lisp_Object symbol
;
609 Lisp_Object valcontents
;
610 CHECK_SYMBOL (symbol
);
612 valcontents
= SYMBOL_VALUE (symbol
);
614 if (BUFFER_LOCAL_VALUEP (valcontents
)
615 || SOME_BUFFER_LOCAL_VALUEP (valcontents
))
616 valcontents
= swap_in_symval_forwarding (symbol
, valcontents
);
618 return (EQ (valcontents
, Qunbound
) ? Qnil
: Qt
);
621 DEFUN ("fboundp", Ffboundp
, Sfboundp
, 1, 1, 0,
622 doc
: /* Return t if SYMBOL's function definition is not void. */)
624 register Lisp_Object symbol
;
626 CHECK_SYMBOL (symbol
);
627 return (EQ (XSYMBOL (symbol
)->function
, Qunbound
) ? Qnil
: Qt
);
630 DEFUN ("makunbound", Fmakunbound
, Smakunbound
, 1, 1, 0,
631 doc
: /* Make SYMBOL's value be void.
634 register Lisp_Object symbol
;
636 CHECK_SYMBOL (symbol
);
637 if (XSYMBOL (symbol
)->constant
)
638 return Fsignal (Qsetting_constant
, Fcons (symbol
, Qnil
));
639 Fset (symbol
, Qunbound
);
643 DEFUN ("fmakunbound", Ffmakunbound
, Sfmakunbound
, 1, 1, 0,
644 doc
: /* Make SYMBOL's function definition be void.
647 register Lisp_Object symbol
;
649 CHECK_SYMBOL (symbol
);
650 if (NILP (symbol
) || EQ (symbol
, Qt
))
651 return Fsignal (Qsetting_constant
, Fcons (symbol
, Qnil
));
652 XSYMBOL (symbol
)->function
= Qunbound
;
656 DEFUN ("symbol-function", Fsymbol_function
, Ssymbol_function
, 1, 1, 0,
657 doc
: /* Return SYMBOL's function definition. Error if that is void. */)
659 register Lisp_Object symbol
;
661 CHECK_SYMBOL (symbol
);
662 if (EQ (XSYMBOL (symbol
)->function
, Qunbound
))
663 return Fsignal (Qvoid_function
, Fcons (symbol
, Qnil
));
664 return XSYMBOL (symbol
)->function
;
667 DEFUN ("symbol-plist", Fsymbol_plist
, Ssymbol_plist
, 1, 1, 0,
668 doc
: /* Return SYMBOL's property list. */)
670 register Lisp_Object symbol
;
672 CHECK_SYMBOL (symbol
);
673 return XSYMBOL (symbol
)->plist
;
676 DEFUN ("symbol-name", Fsymbol_name
, Ssymbol_name
, 1, 1, 0,
677 doc
: /* Return SYMBOL's name, a string. */)
679 register Lisp_Object symbol
;
681 register Lisp_Object name
;
683 CHECK_SYMBOL (symbol
);
684 name
= SYMBOL_NAME (symbol
);
688 DEFUN ("fset", Ffset
, Sfset
, 2, 2, 0,
689 doc
: /* Set SYMBOL's function definition to DEFINITION, and return DEFINITION. */)
691 register Lisp_Object symbol
, definition
;
693 CHECK_SYMBOL (symbol
);
694 if (NILP (symbol
) || EQ (symbol
, Qt
))
695 return Fsignal (Qsetting_constant
, Fcons (symbol
, Qnil
));
696 if (!NILP (Vautoload_queue
) && !EQ (XSYMBOL (symbol
)->function
, Qunbound
))
697 Vautoload_queue
= Fcons (Fcons (symbol
, XSYMBOL (symbol
)->function
),
699 XSYMBOL (symbol
)->function
= definition
;
700 /* Handle automatic advice activation */
701 if (CONSP (XSYMBOL (symbol
)->plist
) && !NILP (Fget (symbol
, Qad_advice_info
)))
703 call2 (Qad_activate_internal
, symbol
, Qnil
);
704 definition
= XSYMBOL (symbol
)->function
;
709 extern Lisp_Object Qfunction_documentation
;
711 DEFUN ("defalias", Fdefalias
, Sdefalias
, 2, 3, 0,
712 doc
: /* Set SYMBOL's function definition to DEFINITION, and return DEFINITION.
713 Associates the function with the current load file, if any.
714 The optional third argument DOCSTRING specifies the documentation string
715 for SYMBOL; if it is omitted or nil, SYMBOL uses the documentation string
716 determined by DEFINITION. */)
717 (symbol
, definition
, docstring
)
718 register Lisp_Object symbol
, definition
, docstring
;
720 if (CONSP (XSYMBOL (symbol
)->function
)
721 && EQ (XCAR (XSYMBOL (symbol
)->function
), Qautoload
))
722 LOADHIST_ATTACH (Fcons (Qt
, symbol
));
723 definition
= Ffset (symbol
, definition
);
724 LOADHIST_ATTACH (symbol
);
725 if (!NILP (docstring
))
726 Fput (symbol
, Qfunction_documentation
, docstring
);
730 DEFUN ("setplist", Fsetplist
, Ssetplist
, 2, 2, 0,
731 doc
: /* Set SYMBOL's property list to NEWVAL, and return NEWVAL. */)
733 register Lisp_Object symbol
, newplist
;
735 CHECK_SYMBOL (symbol
);
736 XSYMBOL (symbol
)->plist
= newplist
;
740 DEFUN ("subr-arity", Fsubr_arity
, Ssubr_arity
, 1, 1, 0,
741 doc
: /* Return minimum and maximum number of args allowed for SUBR.
742 SUBR must be a built-in function.
743 The returned value is a pair (MIN . MAX). MIN is the minimum number
744 of args. MAX is the maximum number or the symbol `many', for a
745 function with `&rest' args, or `unevalled' for a special form. */)
749 short minargs
, maxargs
;
751 wrong_type_argument (Qsubrp
, subr
);
752 minargs
= XSUBR (subr
)->min_args
;
753 maxargs
= XSUBR (subr
)->max_args
;
755 return Fcons (make_number (minargs
), Qmany
);
756 else if (maxargs
== UNEVALLED
)
757 return Fcons (make_number (minargs
), Qunevalled
);
759 return Fcons (make_number (minargs
), make_number (maxargs
));
762 DEFUN ("subr-interactive-form", Fsubr_interactive_form
, Ssubr_interactive_form
, 1, 1, 0,
763 doc
: /* Return the interactive form of SUBR or nil if none.
764 SUBR must be a built-in function. Value, if non-nil, is a list
765 \(interactive SPEC). */)
770 wrong_type_argument (Qsubrp
, subr
);
771 if (XSUBR (subr
)->prompt
)
772 return list2 (Qinteractive
, build_string (XSUBR (subr
)->prompt
));
777 /***********************************************************************
778 Getting and Setting Values of Symbols
779 ***********************************************************************/
781 /* Return the symbol holding SYMBOL's value. Signal
782 `cyclic-variable-indirection' if SYMBOL's chain of variable
783 indirections contains a loop. */
786 indirect_variable (symbol
)
789 Lisp_Object tortoise
, hare
;
791 hare
= tortoise
= symbol
;
793 while (XSYMBOL (hare
)->indirect_variable
)
795 hare
= XSYMBOL (hare
)->value
;
796 if (!XSYMBOL (hare
)->indirect_variable
)
799 hare
= XSYMBOL (hare
)->value
;
800 tortoise
= XSYMBOL (tortoise
)->value
;
802 if (EQ (hare
, tortoise
))
803 Fsignal (Qcyclic_variable_indirection
, Fcons (symbol
, Qnil
));
810 DEFUN ("indirect-variable", Findirect_variable
, Sindirect_variable
, 1, 1, 0,
811 doc
: /* Return the variable at the end of OBJECT's variable chain.
812 If OBJECT is a symbol, follow all variable indirections and return the final
813 variable. If OBJECT is not a symbol, just return it.
814 Signal a cyclic-variable-indirection error if there is a loop in the
815 variable chain of symbols. */)
819 if (SYMBOLP (object
))
820 object
= indirect_variable (object
);
825 /* Given the raw contents of a symbol value cell,
826 return the Lisp value of the symbol.
827 This does not handle buffer-local variables; use
828 swap_in_symval_forwarding for that. */
831 do_symval_forwarding (valcontents
)
832 register Lisp_Object valcontents
;
834 register Lisp_Object val
;
836 if (MISCP (valcontents
))
837 switch (XMISCTYPE (valcontents
))
839 case Lisp_Misc_Intfwd
:
840 XSETINT (val
, *XINTFWD (valcontents
)->intvar
);
843 case Lisp_Misc_Boolfwd
:
844 return (*XBOOLFWD (valcontents
)->boolvar
? Qt
: Qnil
);
846 case Lisp_Misc_Objfwd
:
847 return *XOBJFWD (valcontents
)->objvar
;
849 case Lisp_Misc_Buffer_Objfwd
:
850 offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
851 return PER_BUFFER_VALUE (current_buffer
, offset
);
853 case Lisp_Misc_Kboard_Objfwd
:
854 offset
= XKBOARD_OBJFWD (valcontents
)->offset
;
855 return *(Lisp_Object
*)(offset
+ (char *)current_kboard
);
860 /* Store NEWVAL into SYMBOL, where VALCONTENTS is found in the value cell
861 of SYMBOL. If SYMBOL is buffer-local, VALCONTENTS should be the
862 buffer-independent contents of the value cell: forwarded just one
863 step past the buffer-localness.
865 BUF non-zero means set the value in buffer BUF instead of the
866 current buffer. This only plays a role for per-buffer variables. */
869 store_symval_forwarding (symbol
, valcontents
, newval
, buf
)
871 register Lisp_Object valcontents
, newval
;
874 switch (SWITCH_ENUM_CAST (XTYPE (valcontents
)))
877 switch (XMISCTYPE (valcontents
))
879 case Lisp_Misc_Intfwd
:
880 CHECK_NUMBER (newval
);
881 *XINTFWD (valcontents
)->intvar
= XINT (newval
);
882 if (*XINTFWD (valcontents
)->intvar
!= XINT (newval
))
883 error ("Value out of range for variable `%s'",
884 SDATA (SYMBOL_NAME (symbol
)));
887 case Lisp_Misc_Boolfwd
:
888 *XBOOLFWD (valcontents
)->boolvar
= NILP (newval
) ? 0 : 1;
891 case Lisp_Misc_Objfwd
:
892 *XOBJFWD (valcontents
)->objvar
= newval
;
895 case Lisp_Misc_Buffer_Objfwd
:
897 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
900 type
= PER_BUFFER_TYPE (offset
);
901 if (XINT (type
) == -1)
902 error ("Variable %s is read-only", SDATA (SYMBOL_NAME (symbol
)));
904 if (! NILP (type
) && ! NILP (newval
)
905 && XTYPE (newval
) != XINT (type
))
906 buffer_slot_type_mismatch (offset
);
909 buf
= current_buffer
;
910 PER_BUFFER_VALUE (buf
, offset
) = newval
;
914 case Lisp_Misc_Kboard_Objfwd
:
916 char *base
= (char *) current_kboard
;
917 char *p
= base
+ XKBOARD_OBJFWD (valcontents
)->offset
;
918 *(Lisp_Object
*) p
= newval
;
929 valcontents
= SYMBOL_VALUE (symbol
);
930 if (BUFFER_LOCAL_VALUEP (valcontents
)
931 || SOME_BUFFER_LOCAL_VALUEP (valcontents
))
932 XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
= newval
;
934 SET_SYMBOL_VALUE (symbol
, newval
);
938 /* Set up SYMBOL to refer to its global binding.
939 This makes it safe to alter the status of other bindings. */
942 swap_in_global_binding (symbol
)
945 Lisp_Object valcontents
, cdr
;
947 valcontents
= SYMBOL_VALUE (symbol
);
948 if (!BUFFER_LOCAL_VALUEP (valcontents
)
949 && !SOME_BUFFER_LOCAL_VALUEP (valcontents
))
951 cdr
= XBUFFER_LOCAL_VALUE (valcontents
)->cdr
;
953 /* Unload the previously loaded binding. */
955 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
));
957 /* Select the global binding in the symbol. */
959 store_symval_forwarding (symbol
, valcontents
, XCDR (cdr
), NULL
);
961 /* Indicate that the global binding is set up now. */
962 XBUFFER_LOCAL_VALUE (valcontents
)->frame
= Qnil
;
963 XBUFFER_LOCAL_VALUE (valcontents
)->buffer
= Qnil
;
964 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_frame
= 0;
965 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 0;
968 /* Set up the buffer-local symbol SYMBOL for validity in the current buffer.
969 VALCONTENTS is the contents of its value cell,
970 which points to a struct Lisp_Buffer_Local_Value.
972 Return the value forwarded one step past the buffer-local stage.
973 This could be another forwarding pointer. */
976 swap_in_symval_forwarding (symbol
, valcontents
)
977 Lisp_Object symbol
, valcontents
;
979 register Lisp_Object tem1
;
981 tem1
= XBUFFER_LOCAL_VALUE (valcontents
)->buffer
;
984 || current_buffer
!= XBUFFER (tem1
)
985 || (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
986 && ! EQ (selected_frame
, XBUFFER_LOCAL_VALUE (valcontents
)->frame
)))
988 if (XSYMBOL (symbol
)->indirect_variable
)
989 symbol
= indirect_variable (symbol
);
991 /* Unload the previously loaded binding. */
992 tem1
= XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
994 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
));
995 /* Choose the new binding. */
996 tem1
= assq_no_quit (symbol
, current_buffer
->local_var_alist
);
997 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_frame
= 0;
998 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 0;
1001 if (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
)
1002 tem1
= assq_no_quit (symbol
, XFRAME (selected_frame
)->param_alist
);
1004 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_frame
= 1;
1006 tem1
= XBUFFER_LOCAL_VALUE (valcontents
)->cdr
;
1009 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 1;
1011 /* Load the new binding. */
1012 XSETCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
, tem1
);
1013 XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents
)->buffer
, current_buffer
);
1014 XBUFFER_LOCAL_VALUE (valcontents
)->frame
= selected_frame
;
1015 store_symval_forwarding (symbol
,
1016 XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
,
1019 return XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
;
1022 /* Find the value of a symbol, returning Qunbound if it's not bound.
1023 This is helpful for code which just wants to get a variable's value
1024 if it has one, without signaling an error.
1025 Note that it must not be possible to quit
1026 within this function. Great care is required for this. */
1029 find_symbol_value (symbol
)
1032 register Lisp_Object valcontents
;
1033 register Lisp_Object val
;
1035 CHECK_SYMBOL (symbol
);
1036 valcontents
= SYMBOL_VALUE (symbol
);
1038 if (BUFFER_LOCAL_VALUEP (valcontents
)
1039 || SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1040 valcontents
= swap_in_symval_forwarding (symbol
, valcontents
);
1042 if (MISCP (valcontents
))
1044 switch (XMISCTYPE (valcontents
))
1046 case Lisp_Misc_Intfwd
:
1047 XSETINT (val
, *XINTFWD (valcontents
)->intvar
);
1050 case Lisp_Misc_Boolfwd
:
1051 return (*XBOOLFWD (valcontents
)->boolvar
? Qt
: Qnil
);
1053 case Lisp_Misc_Objfwd
:
1054 return *XOBJFWD (valcontents
)->objvar
;
1056 case Lisp_Misc_Buffer_Objfwd
:
1057 return PER_BUFFER_VALUE (current_buffer
,
1058 XBUFFER_OBJFWD (valcontents
)->offset
);
1060 case Lisp_Misc_Kboard_Objfwd
:
1061 return *(Lisp_Object
*)(XKBOARD_OBJFWD (valcontents
)->offset
1062 + (char *)current_kboard
);
1069 DEFUN ("symbol-value", Fsymbol_value
, Ssymbol_value
, 1, 1, 0,
1070 doc
: /* Return SYMBOL's value. Error if that is void. */)
1076 val
= find_symbol_value (symbol
);
1077 if (EQ (val
, Qunbound
))
1078 return Fsignal (Qvoid_variable
, Fcons (symbol
, Qnil
));
1083 DEFUN ("set", Fset
, Sset
, 2, 2, 0,
1084 doc
: /* Set SYMBOL's value to NEWVAL, and return NEWVAL. */)
1086 register Lisp_Object symbol
, newval
;
1088 return set_internal (symbol
, newval
, current_buffer
, 0);
1091 /* Return 1 if SYMBOL currently has a let-binding
1092 which was made in the buffer that is now current. */
1095 let_shadows_buffer_binding_p (symbol
)
1098 struct specbinding
*p
;
1100 for (p
= specpdl_ptr
- 1; p
>= specpdl
; p
--)
1102 && CONSP (p
->symbol
))
1104 Lisp_Object let_bound_symbol
= XCAR (p
->symbol
);
1105 if ((EQ (symbol
, let_bound_symbol
)
1106 || (XSYMBOL (let_bound_symbol
)->indirect_variable
1107 && EQ (symbol
, indirect_variable (let_bound_symbol
))))
1108 && XBUFFER (XCDR (XCDR (p
->symbol
))) == current_buffer
)
1112 return p
>= specpdl
;
1115 /* Store the value NEWVAL into SYMBOL.
1116 If buffer-locality is an issue, BUF specifies which buffer to use.
1117 (0 stands for the current buffer.)
1119 If BINDFLAG is zero, then if this symbol is supposed to become
1120 local in every buffer where it is set, then we make it local.
1121 If BINDFLAG is nonzero, we don't do that. */
1124 set_internal (symbol
, newval
, buf
, bindflag
)
1125 register Lisp_Object symbol
, newval
;
1129 int voide
= EQ (newval
, Qunbound
);
1131 register Lisp_Object valcontents
, innercontents
, tem1
, current_alist_element
;
1134 buf
= current_buffer
;
1136 /* If restoring in a dead buffer, do nothing. */
1137 if (NILP (buf
->name
))
1140 CHECK_SYMBOL (symbol
);
1141 if (SYMBOL_CONSTANT_P (symbol
)
1142 && (NILP (Fkeywordp (symbol
))
1143 || !EQ (newval
, SYMBOL_VALUE (symbol
))))
1144 return Fsignal (Qsetting_constant
, Fcons (symbol
, Qnil
));
1146 innercontents
= valcontents
= SYMBOL_VALUE (symbol
);
1148 if (BUFFER_OBJFWDP (valcontents
))
1150 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1151 int idx
= PER_BUFFER_IDX (offset
);
1154 && !let_shadows_buffer_binding_p (symbol
))
1155 SET_PER_BUFFER_VALUE_P (buf
, idx
, 1);
1157 else if (BUFFER_LOCAL_VALUEP (valcontents
)
1158 || SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1160 /* valcontents is a struct Lisp_Buffer_Local_Value. */
1161 if (XSYMBOL (symbol
)->indirect_variable
)
1162 symbol
= indirect_variable (symbol
);
1164 /* What binding is loaded right now? */
1165 current_alist_element
1166 = XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
1168 /* If the current buffer is not the buffer whose binding is
1169 loaded, or if there may be frame-local bindings and the frame
1170 isn't the right one, or if it's a Lisp_Buffer_Local_Value and
1171 the default binding is loaded, the loaded binding may be the
1173 if (!BUFFERP (XBUFFER_LOCAL_VALUE (valcontents
)->buffer
)
1174 || buf
!= XBUFFER (XBUFFER_LOCAL_VALUE (valcontents
)->buffer
)
1175 || (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
1176 && !EQ (selected_frame
, XBUFFER_LOCAL_VALUE (valcontents
)->frame
))
1177 || (BUFFER_LOCAL_VALUEP (valcontents
)
1178 && EQ (XCAR (current_alist_element
),
1179 current_alist_element
)))
1181 /* The currently loaded binding is not necessarily valid.
1182 We need to unload it, and choose a new binding. */
1184 /* Write out `realvalue' to the old loaded binding. */
1185 Fsetcdr (current_alist_element
,
1186 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
));
1188 /* Find the new binding. */
1189 tem1
= Fassq (symbol
, buf
->local_var_alist
);
1190 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 1;
1191 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_frame
= 0;
1195 /* This buffer still sees the default value. */
1197 /* If the variable is a Lisp_Some_Buffer_Local_Value,
1198 or if this is `let' rather than `set',
1199 make CURRENT-ALIST-ELEMENT point to itself,
1200 indicating that we're seeing the default value.
1201 Likewise if the variable has been let-bound
1202 in the current buffer. */
1203 if (bindflag
|| SOME_BUFFER_LOCAL_VALUEP (valcontents
)
1204 || let_shadows_buffer_binding_p (symbol
))
1206 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 0;
1208 if (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
)
1209 tem1
= Fassq (symbol
,
1210 XFRAME (selected_frame
)->param_alist
);
1213 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_frame
= 1;
1215 tem1
= XBUFFER_LOCAL_VALUE (valcontents
)->cdr
;
1217 /* If it's a Lisp_Buffer_Local_Value, being set not bound,
1218 and we're not within a let that was made for this buffer,
1219 create a new buffer-local binding for the variable.
1220 That means, give this buffer a new assoc for a local value
1221 and load that binding. */
1224 tem1
= Fcons (symbol
, XCDR (current_alist_element
));
1225 buf
->local_var_alist
1226 = Fcons (tem1
, buf
->local_var_alist
);
1230 /* Record which binding is now loaded. */
1231 XSETCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
,
1234 /* Set `buffer' and `frame' slots for thebinding now loaded. */
1235 XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents
)->buffer
, buf
);
1236 XBUFFER_LOCAL_VALUE (valcontents
)->frame
= selected_frame
;
1238 innercontents
= XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
;
1241 /* If storing void (making the symbol void), forward only through
1242 buffer-local indicator, not through Lisp_Objfwd, etc. */
1244 store_symval_forwarding (symbol
, Qnil
, newval
, buf
);
1246 store_symval_forwarding (symbol
, innercontents
, newval
, buf
);
1248 /* If we just set a variable whose current binding is frame-local,
1249 store the new value in the frame parameter too. */
1251 if (BUFFER_LOCAL_VALUEP (valcontents
)
1252 || SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1254 /* What binding is loaded right now? */
1255 current_alist_element
1256 = XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
1258 /* If the current buffer is not the buffer whose binding is
1259 loaded, or if there may be frame-local bindings and the frame
1260 isn't the right one, or if it's a Lisp_Buffer_Local_Value and
1261 the default binding is loaded, the loaded binding may be the
1263 if (XBUFFER_LOCAL_VALUE (valcontents
)->found_for_frame
)
1264 XSETCDR (current_alist_element
, newval
);
1270 /* Access or set a buffer-local symbol's default value. */
1272 /* Return the default value of SYMBOL, but don't check for voidness.
1273 Return Qunbound if it is void. */
1276 default_value (symbol
)
1279 register Lisp_Object valcontents
;
1281 CHECK_SYMBOL (symbol
);
1282 valcontents
= SYMBOL_VALUE (symbol
);
1284 /* For a built-in buffer-local variable, get the default value
1285 rather than letting do_symval_forwarding get the current value. */
1286 if (BUFFER_OBJFWDP (valcontents
))
1288 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1289 if (PER_BUFFER_IDX (offset
) != 0)
1290 return PER_BUFFER_DEFAULT (offset
);
1293 /* Handle user-created local variables. */
1294 if (BUFFER_LOCAL_VALUEP (valcontents
)
1295 || SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1297 /* If var is set up for a buffer that lacks a local value for it,
1298 the current value is nominally the default value.
1299 But the `realvalue' slot may be more up to date, since
1300 ordinary setq stores just that slot. So use that. */
1301 Lisp_Object current_alist_element
, alist_element_car
;
1302 current_alist_element
1303 = XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
1304 alist_element_car
= XCAR (current_alist_element
);
1305 if (EQ (alist_element_car
, current_alist_element
))
1306 return do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
);
1308 return XCDR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
1310 /* For other variables, get the current value. */
1311 return do_symval_forwarding (valcontents
);
1314 DEFUN ("default-boundp", Fdefault_boundp
, Sdefault_boundp
, 1, 1, 0,
1315 doc
: /* Return t if SYMBOL has a non-void default value.
1316 This is the value that is seen in buffers that do not have their own values
1317 for this variable. */)
1321 register Lisp_Object value
;
1323 value
= default_value (symbol
);
1324 return (EQ (value
, Qunbound
) ? Qnil
: Qt
);
1327 DEFUN ("default-value", Fdefault_value
, Sdefault_value
, 1, 1, 0,
1328 doc
: /* Return SYMBOL's default value.
1329 This is the value that is seen in buffers that do not have their own values
1330 for this variable. The default value is meaningful for variables with
1331 local bindings in certain buffers. */)
1335 register Lisp_Object value
;
1337 value
= default_value (symbol
);
1338 if (EQ (value
, Qunbound
))
1339 return Fsignal (Qvoid_variable
, Fcons (symbol
, Qnil
));
1343 DEFUN ("set-default", Fset_default
, Sset_default
, 2, 2, 0,
1344 doc
: /* Set SYMBOL's default value to VAL. SYMBOL and VAL are evaluated.
1345 The default value is seen in buffers that do not have their own values
1346 for this variable. */)
1348 Lisp_Object symbol
, value
;
1350 register Lisp_Object valcontents
, current_alist_element
, alist_element_buffer
;
1352 CHECK_SYMBOL (symbol
);
1353 valcontents
= SYMBOL_VALUE (symbol
);
1355 /* Handle variables like case-fold-search that have special slots
1356 in the buffer. Make them work apparently like Lisp_Buffer_Local_Value
1358 if (BUFFER_OBJFWDP (valcontents
))
1360 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1361 int idx
= PER_BUFFER_IDX (offset
);
1363 PER_BUFFER_DEFAULT (offset
) = value
;
1365 /* If this variable is not always local in all buffers,
1366 set it in the buffers that don't nominally have a local value. */
1371 for (b
= all_buffers
; b
; b
= b
->next
)
1372 if (!PER_BUFFER_VALUE_P (b
, idx
))
1373 PER_BUFFER_VALUE (b
, offset
) = value
;
1378 if (!BUFFER_LOCAL_VALUEP (valcontents
)
1379 && !SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1380 return Fset (symbol
, value
);
1382 /* Store new value into the DEFAULT-VALUE slot. */
1383 XSETCDR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
, value
);
1385 /* If the default binding is now loaded, set the REALVALUE slot too. */
1386 current_alist_element
1387 = XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
1388 alist_element_buffer
= Fcar (current_alist_element
);
1389 if (EQ (alist_element_buffer
, current_alist_element
))
1390 store_symval_forwarding (symbol
,
1391 XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
,
1397 DEFUN ("setq-default", Fsetq_default
, Ssetq_default
, 2, UNEVALLED
, 0,
1398 doc
: /* Set the default value of variable VAR to VALUE.
1399 VAR, the variable name, is literal (not evaluated);
1400 VALUE is an expression: it is evaluated and its value returned.
1401 The default value of a variable is seen in buffers
1402 that do not have their own values for the variable.
1404 More generally, you can use multiple variables and values, as in
1405 (setq-default SYMBOL VALUE SYMBOL VALUE...)
1406 This sets each SYMBOL's default value to the corresponding VALUE.
1407 The VALUE for the Nth SYMBOL can refer to the new default values
1409 usage: (setq-default SYMBOL VALUE [SYMBOL VALUE...]) */)
1413 register Lisp_Object args_left
;
1414 register Lisp_Object val
, symbol
;
1415 struct gcpro gcpro1
;
1425 val
= Feval (Fcar (Fcdr (args_left
)));
1426 symbol
= XCAR (args_left
);
1427 Fset_default (symbol
, val
);
1428 args_left
= Fcdr (XCDR (args_left
));
1430 while (!NILP (args_left
));
1436 /* Lisp functions for creating and removing buffer-local variables. */
1438 DEFUN ("make-variable-buffer-local", Fmake_variable_buffer_local
, Smake_variable_buffer_local
,
1439 1, 1, "vMake Variable Buffer Local: ",
1440 doc
: /* Make VARIABLE become buffer-local whenever it is set.
1441 At any time, the value for the current buffer is in effect,
1442 unless the variable has never been set in this buffer,
1443 in which case the default value is in effect.
1444 Note that binding the variable with `let', or setting it while
1445 a `let'-style binding made in this buffer is in effect,
1446 does not make the variable buffer-local. Return VARIABLE.
1448 The function `default-value' gets the default value and `set-default' sets it. */)
1450 register Lisp_Object variable
;
1452 register Lisp_Object tem
, valcontents
, newval
;
1454 CHECK_SYMBOL (variable
);
1456 valcontents
= SYMBOL_VALUE (variable
);
1457 if (EQ (variable
, Qnil
) || EQ (variable
, Qt
) || KBOARD_OBJFWDP (valcontents
))
1458 error ("Symbol %s may not be buffer-local", SDATA (SYMBOL_NAME (variable
)));
1460 if (BUFFER_LOCAL_VALUEP (valcontents
) || BUFFER_OBJFWDP (valcontents
))
1462 if (SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1464 XMISCTYPE (SYMBOL_VALUE (variable
)) = Lisp_Misc_Buffer_Local_Value
;
1467 if (EQ (valcontents
, Qunbound
))
1468 SET_SYMBOL_VALUE (variable
, Qnil
);
1469 tem
= Fcons (Qnil
, Fsymbol_value (variable
));
1471 newval
= allocate_misc ();
1472 XMISCTYPE (newval
) = Lisp_Misc_Buffer_Local_Value
;
1473 XBUFFER_LOCAL_VALUE (newval
)->realvalue
= SYMBOL_VALUE (variable
);
1474 XBUFFER_LOCAL_VALUE (newval
)->buffer
= Fcurrent_buffer ();
1475 XBUFFER_LOCAL_VALUE (newval
)->frame
= Qnil
;
1476 XBUFFER_LOCAL_VALUE (newval
)->found_for_buffer
= 0;
1477 XBUFFER_LOCAL_VALUE (newval
)->found_for_frame
= 0;
1478 XBUFFER_LOCAL_VALUE (newval
)->check_frame
= 0;
1479 XBUFFER_LOCAL_VALUE (newval
)->cdr
= tem
;
1480 SET_SYMBOL_VALUE (variable
, newval
);
1484 DEFUN ("make-local-variable", Fmake_local_variable
, Smake_local_variable
,
1485 1, 1, "vMake Local Variable: ",
1486 doc
: /* Make VARIABLE have a separate value in the current buffer.
1487 Other buffers will continue to share a common default value.
1488 \(The buffer-local value of VARIABLE starts out as the same value
1489 VARIABLE previously had. If VARIABLE was void, it remains void.\)
1490 See also `make-variable-buffer-local'. Return VARIABLE.
1492 If the variable is already arranged to become local when set,
1493 this function causes a local value to exist for this buffer,
1494 just as setting the variable would do.
1496 This function returns VARIABLE, and therefore
1497 (set (make-local-variable 'VARIABLE) VALUE-EXP)
1500 Do not use `make-local-variable' to make a hook variable buffer-local.
1501 Instead, use `add-hook' and specify t for the LOCAL argument. */)
1503 register Lisp_Object variable
;
1505 register Lisp_Object tem
, valcontents
;
1507 CHECK_SYMBOL (variable
);
1509 valcontents
= SYMBOL_VALUE (variable
);
1510 if (EQ (variable
, Qnil
) || EQ (variable
, Qt
) || KBOARD_OBJFWDP (valcontents
))
1511 error ("Symbol %s may not be buffer-local", SDATA (SYMBOL_NAME (variable
)));
1513 if (BUFFER_LOCAL_VALUEP (valcontents
) || BUFFER_OBJFWDP (valcontents
))
1515 tem
= Fboundp (variable
);
1517 /* Make sure the symbol has a local value in this particular buffer,
1518 by setting it to the same value it already has. */
1519 Fset (variable
, (EQ (tem
, Qt
) ? Fsymbol_value (variable
) : Qunbound
));
1522 /* Make sure symbol is set up to hold per-buffer values. */
1523 if (!SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1526 tem
= Fcons (Qnil
, do_symval_forwarding (valcontents
));
1528 newval
= allocate_misc ();
1529 XMISCTYPE (newval
) = Lisp_Misc_Some_Buffer_Local_Value
;
1530 XBUFFER_LOCAL_VALUE (newval
)->realvalue
= SYMBOL_VALUE (variable
);
1531 XBUFFER_LOCAL_VALUE (newval
)->buffer
= Qnil
;
1532 XBUFFER_LOCAL_VALUE (newval
)->frame
= Qnil
;
1533 XBUFFER_LOCAL_VALUE (newval
)->found_for_buffer
= 0;
1534 XBUFFER_LOCAL_VALUE (newval
)->found_for_frame
= 0;
1535 XBUFFER_LOCAL_VALUE (newval
)->check_frame
= 0;
1536 XBUFFER_LOCAL_VALUE (newval
)->cdr
= tem
;
1537 SET_SYMBOL_VALUE (variable
, newval
);;
1539 /* Make sure this buffer has its own value of symbol. */
1540 tem
= Fassq (variable
, current_buffer
->local_var_alist
);
1543 /* Swap out any local binding for some other buffer, and make
1544 sure the current value is permanently recorded, if it's the
1546 find_symbol_value (variable
);
1548 current_buffer
->local_var_alist
1549 = Fcons (Fcons (variable
, XCDR (XBUFFER_LOCAL_VALUE (SYMBOL_VALUE (variable
))->cdr
)),
1550 current_buffer
->local_var_alist
);
1552 /* Make sure symbol does not think it is set up for this buffer;
1553 force it to look once again for this buffer's value. */
1555 Lisp_Object
*pvalbuf
;
1557 valcontents
= SYMBOL_VALUE (variable
);
1559 pvalbuf
= &XBUFFER_LOCAL_VALUE (valcontents
)->buffer
;
1560 if (current_buffer
== XBUFFER (*pvalbuf
))
1562 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 0;
1566 /* If the symbol forwards into a C variable, then load the binding
1567 for this buffer now. If C code modifies the variable before we
1568 load the binding in, then that new value will clobber the default
1569 binding the next time we unload it. */
1570 valcontents
= XBUFFER_LOCAL_VALUE (SYMBOL_VALUE (variable
))->realvalue
;
1571 if (INTFWDP (valcontents
) || BOOLFWDP (valcontents
) || OBJFWDP (valcontents
))
1572 swap_in_symval_forwarding (variable
, SYMBOL_VALUE (variable
));
1577 DEFUN ("kill-local-variable", Fkill_local_variable
, Skill_local_variable
,
1578 1, 1, "vKill Local Variable: ",
1579 doc
: /* Make VARIABLE no longer have a separate value in the current buffer.
1580 From now on the default value will apply in this buffer. Return VARIABLE. */)
1582 register Lisp_Object variable
;
1584 register Lisp_Object tem
, valcontents
;
1586 CHECK_SYMBOL (variable
);
1588 valcontents
= SYMBOL_VALUE (variable
);
1590 if (BUFFER_OBJFWDP (valcontents
))
1592 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1593 int idx
= PER_BUFFER_IDX (offset
);
1597 SET_PER_BUFFER_VALUE_P (current_buffer
, idx
, 0);
1598 PER_BUFFER_VALUE (current_buffer
, offset
)
1599 = PER_BUFFER_DEFAULT (offset
);
1604 if (!BUFFER_LOCAL_VALUEP (valcontents
)
1605 && !SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1608 /* Get rid of this buffer's alist element, if any. */
1610 tem
= Fassq (variable
, current_buffer
->local_var_alist
);
1612 current_buffer
->local_var_alist
1613 = Fdelq (tem
, current_buffer
->local_var_alist
);
1615 /* If the symbol is set up with the current buffer's binding
1616 loaded, recompute its value. We have to do it now, or else
1617 forwarded objects won't work right. */
1619 Lisp_Object
*pvalbuf
;
1620 valcontents
= SYMBOL_VALUE (variable
);
1621 pvalbuf
= &XBUFFER_LOCAL_VALUE (valcontents
)->buffer
;
1622 if (current_buffer
== XBUFFER (*pvalbuf
))
1625 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 0;
1626 find_symbol_value (variable
);
1633 /* Lisp functions for creating and removing buffer-local variables. */
1635 DEFUN ("make-variable-frame-local", Fmake_variable_frame_local
, Smake_variable_frame_local
,
1636 1, 1, "vMake Variable Frame Local: ",
1637 doc
: /* Enable VARIABLE to have frame-local bindings.
1638 When a frame-local binding exists in the current frame,
1639 it is in effect whenever the current buffer has no buffer-local binding.
1640 A frame-local binding is actually a frame parameter value;
1641 thus, any given frame has a local binding for VARIABLE if it has
1642 a value for the frame parameter named VARIABLE. Return VARIABLE.
1643 See `modify-frame-parameters' for how to set frame parameters. */)
1645 register Lisp_Object variable
;
1647 register Lisp_Object tem
, valcontents
, newval
;
1649 CHECK_SYMBOL (variable
);
1651 valcontents
= SYMBOL_VALUE (variable
);
1652 if (EQ (variable
, Qnil
) || EQ (variable
, Qt
) || KBOARD_OBJFWDP (valcontents
)
1653 || BUFFER_OBJFWDP (valcontents
))
1654 error ("Symbol %s may not be frame-local", SDATA (SYMBOL_NAME (variable
)));
1656 if (BUFFER_LOCAL_VALUEP (valcontents
)
1657 || SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1659 XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
= 1;
1663 if (EQ (valcontents
, Qunbound
))
1664 SET_SYMBOL_VALUE (variable
, Qnil
);
1665 tem
= Fcons (Qnil
, Fsymbol_value (variable
));
1667 newval
= allocate_misc ();
1668 XMISCTYPE (newval
) = Lisp_Misc_Some_Buffer_Local_Value
;
1669 XBUFFER_LOCAL_VALUE (newval
)->realvalue
= SYMBOL_VALUE (variable
);
1670 XBUFFER_LOCAL_VALUE (newval
)->buffer
= Qnil
;
1671 XBUFFER_LOCAL_VALUE (newval
)->frame
= Qnil
;
1672 XBUFFER_LOCAL_VALUE (newval
)->found_for_buffer
= 0;
1673 XBUFFER_LOCAL_VALUE (newval
)->found_for_frame
= 0;
1674 XBUFFER_LOCAL_VALUE (newval
)->check_frame
= 1;
1675 XBUFFER_LOCAL_VALUE (newval
)->cdr
= tem
;
1676 SET_SYMBOL_VALUE (variable
, newval
);
1680 DEFUN ("local-variable-p", Flocal_variable_p
, Slocal_variable_p
,
1682 doc
: /* Non-nil if VARIABLE has a local binding in buffer BUFFER.
1683 BUFFER defaults to the current buffer. */)
1685 register Lisp_Object variable
, buffer
;
1687 Lisp_Object valcontents
;
1688 register struct buffer
*buf
;
1691 buf
= current_buffer
;
1694 CHECK_BUFFER (buffer
);
1695 buf
= XBUFFER (buffer
);
1698 CHECK_SYMBOL (variable
);
1700 valcontents
= SYMBOL_VALUE (variable
);
1701 if (BUFFER_LOCAL_VALUEP (valcontents
)
1702 || SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1704 Lisp_Object tail
, elt
;
1706 variable
= indirect_variable (variable
);
1707 for (tail
= buf
->local_var_alist
; CONSP (tail
); tail
= XCDR (tail
))
1710 if (EQ (variable
, XCAR (elt
)))
1714 if (BUFFER_OBJFWDP (valcontents
))
1716 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1717 int idx
= PER_BUFFER_IDX (offset
);
1718 if (idx
== -1 || PER_BUFFER_VALUE_P (buf
, idx
))
1724 DEFUN ("local-variable-if-set-p", Flocal_variable_if_set_p
, Slocal_variable_if_set_p
,
1726 doc
: /* Non-nil if VARIABLE will be local in buffer BUFFER if it is set there.
1727 BUFFER defaults to the current buffer. */)
1729 register Lisp_Object variable
, buffer
;
1731 Lisp_Object valcontents
;
1732 register struct buffer
*buf
;
1735 buf
= current_buffer
;
1738 CHECK_BUFFER (buffer
);
1739 buf
= XBUFFER (buffer
);
1742 CHECK_SYMBOL (variable
);
1744 valcontents
= SYMBOL_VALUE (variable
);
1746 /* This means that make-variable-buffer-local was done. */
1747 if (BUFFER_LOCAL_VALUEP (valcontents
))
1749 /* All these slots become local if they are set. */
1750 if (BUFFER_OBJFWDP (valcontents
))
1752 if (SOME_BUFFER_LOCAL_VALUEP (valcontents
))
1754 Lisp_Object tail
, elt
;
1755 for (tail
= buf
->local_var_alist
; CONSP (tail
); tail
= XCDR (tail
))
1758 if (EQ (variable
, XCAR (elt
)))
1765 /* Find the function at the end of a chain of symbol function indirections. */
1767 /* If OBJECT is a symbol, find the end of its function chain and
1768 return the value found there. If OBJECT is not a symbol, just
1769 return it. If there is a cycle in the function chain, signal a
1770 cyclic-function-indirection error.
1772 This is like Findirect_function, except that it doesn't signal an
1773 error if the chain ends up unbound. */
1775 indirect_function (object
)
1776 register Lisp_Object object
;
1778 Lisp_Object tortoise
, hare
;
1780 hare
= tortoise
= object
;
1784 if (!SYMBOLP (hare
) || EQ (hare
, Qunbound
))
1786 hare
= XSYMBOL (hare
)->function
;
1787 if (!SYMBOLP (hare
) || EQ (hare
, Qunbound
))
1789 hare
= XSYMBOL (hare
)->function
;
1791 tortoise
= XSYMBOL (tortoise
)->function
;
1793 if (EQ (hare
, tortoise
))
1794 Fsignal (Qcyclic_function_indirection
, Fcons (object
, Qnil
));
1800 DEFUN ("indirect-function", Findirect_function
, Sindirect_function
, 1, 1, 0,
1801 doc
: /* Return the function at the end of OBJECT's function chain.
1802 If OBJECT is a symbol, follow all function indirections and return the final
1804 If OBJECT is not a symbol, just return it.
1805 Signal a void-function error if the final symbol is unbound.
1806 Signal a cyclic-function-indirection error if there is a loop in the
1807 function chain of symbols. */)
1809 register Lisp_Object object
;
1813 result
= indirect_function (object
);
1815 if (EQ (result
, Qunbound
))
1816 return Fsignal (Qvoid_function
, Fcons (object
, Qnil
));
1820 /* Extract and set vector and string elements */
1822 DEFUN ("aref", Faref
, Saref
, 2, 2, 0,
1823 doc
: /* Return the element of ARRAY at index IDX.
1824 ARRAY may be a vector, a string, a char-table, a bool-vector,
1825 or a byte-code object. IDX starts at 0. */)
1827 register Lisp_Object array
;
1830 register int idxval
;
1833 idxval
= XINT (idx
);
1834 if (STRINGP (array
))
1838 if (idxval
< 0 || idxval
>= SCHARS (array
))
1839 args_out_of_range (array
, idx
);
1840 if (! STRING_MULTIBYTE (array
))
1841 return make_number ((unsigned char) SREF (array
, idxval
));
1842 idxval_byte
= string_char_to_byte (array
, idxval
);
1844 c
= STRING_CHAR (SDATA (array
) + idxval_byte
,
1845 SBYTES (array
) - idxval_byte
);
1846 return make_number (c
);
1848 else if (BOOL_VECTOR_P (array
))
1852 if (idxval
< 0 || idxval
>= XBOOL_VECTOR (array
)->size
)
1853 args_out_of_range (array
, idx
);
1855 val
= (unsigned char) XBOOL_VECTOR (array
)->data
[idxval
/ BITS_PER_CHAR
];
1856 return (val
& (1 << (idxval
% BITS_PER_CHAR
)) ? Qt
: Qnil
);
1858 else if (CHAR_TABLE_P (array
))
1865 args_out_of_range (array
, idx
);
1866 if (idxval
< CHAR_TABLE_ORDINARY_SLOTS
)
1868 /* For ASCII and 8-bit European characters, the element is
1869 stored in the top table. */
1870 val
= XCHAR_TABLE (array
)->contents
[idxval
];
1872 val
= XCHAR_TABLE (array
)->defalt
;
1873 while (NILP (val
)) /* Follow parents until we find some value. */
1875 array
= XCHAR_TABLE (array
)->parent
;
1878 val
= XCHAR_TABLE (array
)->contents
[idxval
];
1880 val
= XCHAR_TABLE (array
)->defalt
;
1887 Lisp_Object sub_table
;
1889 SPLIT_CHAR (idxval
, code
[0], code
[1], code
[2]);
1890 if (code
[1] < 32) code
[1] = -1;
1891 else if (code
[2] < 32) code
[2] = -1;
1893 /* Here, the possible range of CODE[0] (== charset ID) is
1894 128..MAX_CHARSET. Since the top level char table contains
1895 data for multibyte characters after 256th element, we must
1896 increment CODE[0] by 128 to get a correct index. */
1898 code
[3] = -1; /* anchor */
1900 try_parent_char_table
:
1902 for (i
= 0; code
[i
] >= 0; i
++)
1904 val
= XCHAR_TABLE (sub_table
)->contents
[code
[i
]];
1905 if (SUB_CHAR_TABLE_P (val
))
1910 val
= XCHAR_TABLE (sub_table
)->defalt
;
1913 array
= XCHAR_TABLE (array
)->parent
;
1915 goto try_parent_char_table
;
1920 /* Here, VAL is a sub char table. We try the default value
1922 val
= XCHAR_TABLE (val
)->defalt
;
1925 array
= XCHAR_TABLE (array
)->parent
;
1927 goto try_parent_char_table
;
1935 if (VECTORP (array
))
1936 size
= XVECTOR (array
)->size
;
1937 else if (COMPILEDP (array
))
1938 size
= XVECTOR (array
)->size
& PSEUDOVECTOR_SIZE_MASK
;
1940 wrong_type_argument (Qarrayp
, array
);
1942 if (idxval
< 0 || idxval
>= size
)
1943 args_out_of_range (array
, idx
);
1944 return XVECTOR (array
)->contents
[idxval
];
1948 /* Don't use alloca for relocating string data larger than this, lest
1949 we overflow their stack. The value is the same as what used in
1950 fns.c for base64 handling. */
1951 #define MAX_ALLOCA 16*1024
1953 DEFUN ("aset", Faset
, Saset
, 3, 3, 0,
1954 doc
: /* Store into the element of ARRAY at index IDX the value NEWELT.
1955 Return NEWELT. ARRAY may be a vector, a string, a char-table or a
1956 bool-vector. IDX starts at 0. */)
1957 (array
, idx
, newelt
)
1958 register Lisp_Object array
;
1959 Lisp_Object idx
, newelt
;
1961 register int idxval
;
1964 idxval
= XINT (idx
);
1965 if (!VECTORP (array
) && !STRINGP (array
) && !BOOL_VECTOR_P (array
)
1966 && ! CHAR_TABLE_P (array
))
1967 array
= wrong_type_argument (Qarrayp
, array
);
1968 CHECK_IMPURE (array
);
1970 if (VECTORP (array
))
1972 if (idxval
< 0 || idxval
>= XVECTOR (array
)->size
)
1973 args_out_of_range (array
, idx
);
1974 XVECTOR (array
)->contents
[idxval
] = newelt
;
1976 else if (BOOL_VECTOR_P (array
))
1980 if (idxval
< 0 || idxval
>= XBOOL_VECTOR (array
)->size
)
1981 args_out_of_range (array
, idx
);
1983 val
= (unsigned char) XBOOL_VECTOR (array
)->data
[idxval
/ BITS_PER_CHAR
];
1985 if (! NILP (newelt
))
1986 val
|= 1 << (idxval
% BITS_PER_CHAR
);
1988 val
&= ~(1 << (idxval
% BITS_PER_CHAR
));
1989 XBOOL_VECTOR (array
)->data
[idxval
/ BITS_PER_CHAR
] = val
;
1991 else if (CHAR_TABLE_P (array
))
1994 args_out_of_range (array
, idx
);
1995 if (idxval
< CHAR_TABLE_ORDINARY_SLOTS
)
1996 XCHAR_TABLE (array
)->contents
[idxval
] = newelt
;
2002 SPLIT_CHAR (idxval
, code
[0], code
[1], code
[2]);
2003 if (code
[1] < 32) code
[1] = -1;
2004 else if (code
[2] < 32) code
[2] = -1;
2006 /* See the comment of the corresponding part in Faref. */
2008 code
[3] = -1; /* anchor */
2009 for (i
= 0; code
[i
+ 1] >= 0; i
++)
2011 val
= XCHAR_TABLE (array
)->contents
[code
[i
]];
2012 if (SUB_CHAR_TABLE_P (val
))
2018 /* VAL is a leaf. Create a sub char table with the
2019 default value VAL or XCHAR_TABLE (array)->defalt
2020 and look into it. */
2022 temp
= make_sub_char_table (NILP (val
)
2023 ? XCHAR_TABLE (array
)->defalt
2025 XCHAR_TABLE (array
)->contents
[code
[i
]] = temp
;
2029 XCHAR_TABLE (array
)->contents
[code
[i
]] = newelt
;
2032 else if (STRING_MULTIBYTE (array
))
2034 int idxval_byte
, prev_bytes
, new_bytes
;
2035 unsigned char workbuf
[MAX_MULTIBYTE_LENGTH
], *p0
= workbuf
, *p1
;
2037 if (idxval
< 0 || idxval
>= SCHARS (array
))
2038 args_out_of_range (array
, idx
);
2039 CHECK_NUMBER (newelt
);
2041 idxval_byte
= string_char_to_byte (array
, idxval
);
2042 p1
= SDATA (array
) + idxval_byte
;
2043 PARSE_MULTIBYTE_SEQ (p1
, nbytes
- idxval_byte
, prev_bytes
);
2044 new_bytes
= CHAR_STRING (XINT (newelt
), p0
);
2045 if (prev_bytes
!= new_bytes
)
2047 /* We must relocate the string data. */
2048 int nchars
= SCHARS (array
);
2049 int nbytes
= SBYTES (array
);
2052 str
= (nbytes
<= MAX_ALLOCA
2053 ? (unsigned char *) alloca (nbytes
)
2054 : (unsigned char *) xmalloc (nbytes
));
2055 bcopy (SDATA (array
), str
, nbytes
);
2056 allocate_string_data (XSTRING (array
), nchars
,
2057 nbytes
+ new_bytes
- prev_bytes
);
2058 bcopy (str
, SDATA (array
), idxval_byte
);
2059 p1
= SDATA (array
) + idxval_byte
;
2060 bcopy (str
+ idxval_byte
+ prev_bytes
, p1
+ new_bytes
,
2061 nbytes
- (idxval_byte
+ prev_bytes
));
2062 if (nbytes
> MAX_ALLOCA
)
2064 clear_string_char_byte_cache ();
2071 if (idxval
< 0 || idxval
>= SCHARS (array
))
2072 args_out_of_range (array
, idx
);
2073 CHECK_NUMBER (newelt
);
2075 if (XINT (newelt
) < 0 || SINGLE_BYTE_CHAR_P (XINT (newelt
)))
2076 SSET (array
, idxval
, XINT (newelt
));
2079 /* We must relocate the string data while converting it to
2081 int idxval_byte
, prev_bytes
, new_bytes
;
2082 unsigned char workbuf
[MAX_MULTIBYTE_LENGTH
], *p0
= workbuf
, *p1
;
2083 unsigned char *origstr
= SDATA (array
), *str
;
2086 nchars
= SCHARS (array
);
2087 nbytes
= idxval_byte
= count_size_as_multibyte (origstr
, idxval
);
2088 nbytes
+= count_size_as_multibyte (origstr
+ idxval
,
2090 str
= (nbytes
<= MAX_ALLOCA
2091 ? (unsigned char *) alloca (nbytes
)
2092 : (unsigned char *) xmalloc (nbytes
));
2093 copy_text (SDATA (array
), str
, nchars
, 0, 1);
2094 PARSE_MULTIBYTE_SEQ (str
+ idxval_byte
, nbytes
- idxval_byte
,
2096 new_bytes
= CHAR_STRING (XINT (newelt
), p0
);
2097 allocate_string_data (XSTRING (array
), nchars
,
2098 nbytes
+ new_bytes
- prev_bytes
);
2099 bcopy (str
, SDATA (array
), idxval_byte
);
2100 p1
= SDATA (array
) + idxval_byte
;
2103 bcopy (str
+ idxval_byte
+ prev_bytes
, p1
,
2104 nbytes
- (idxval_byte
+ prev_bytes
));
2105 if (nbytes
> MAX_ALLOCA
)
2107 clear_string_char_byte_cache ();
2114 /* Arithmetic functions */
2116 enum comparison
{ equal
, notequal
, less
, grtr
, less_or_equal
, grtr_or_equal
};
2119 arithcompare (num1
, num2
, comparison
)
2120 Lisp_Object num1
, num2
;
2121 enum comparison comparison
;
2123 double f1
= 0, f2
= 0;
2126 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num1
);
2127 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num2
);
2129 if (FLOATP (num1
) || FLOATP (num2
))
2132 f1
= (FLOATP (num1
)) ? XFLOAT_DATA (num1
) : XINT (num1
);
2133 f2
= (FLOATP (num2
)) ? XFLOAT_DATA (num2
) : XINT (num2
);
2139 if (floatp
? f1
== f2
: XINT (num1
) == XINT (num2
))
2144 if (floatp
? f1
!= f2
: XINT (num1
) != XINT (num2
))
2149 if (floatp
? f1
< f2
: XINT (num1
) < XINT (num2
))
2154 if (floatp
? f1
<= f2
: XINT (num1
) <= XINT (num2
))
2159 if (floatp
? f1
> f2
: XINT (num1
) > XINT (num2
))
2164 if (floatp
? f1
>= f2
: XINT (num1
) >= XINT (num2
))
2173 DEFUN ("=", Feqlsign
, Seqlsign
, 2, 2, 0,
2174 doc
: /* Return t if two args, both numbers or markers, are equal. */)
2176 register Lisp_Object num1
, num2
;
2178 return arithcompare (num1
, num2
, equal
);
2181 DEFUN ("<", Flss
, Slss
, 2, 2, 0,
2182 doc
: /* Return t if first arg is less than second arg. Both must be numbers or markers. */)
2184 register Lisp_Object num1
, num2
;
2186 return arithcompare (num1
, num2
, less
);
2189 DEFUN (">", Fgtr
, Sgtr
, 2, 2, 0,
2190 doc
: /* Return t if first arg is greater than second arg. Both must be numbers or markers. */)
2192 register Lisp_Object num1
, num2
;
2194 return arithcompare (num1
, num2
, grtr
);
2197 DEFUN ("<=", Fleq
, Sleq
, 2, 2, 0,
2198 doc
: /* Return t if first arg is less than or equal to second arg.
2199 Both must be numbers or markers. */)
2201 register Lisp_Object num1
, num2
;
2203 return arithcompare (num1
, num2
, less_or_equal
);
2206 DEFUN (">=", Fgeq
, Sgeq
, 2, 2, 0,
2207 doc
: /* Return t if first arg is greater than or equal to second arg.
2208 Both must be numbers or markers. */)
2210 register Lisp_Object num1
, num2
;
2212 return arithcompare (num1
, num2
, grtr_or_equal
);
2215 DEFUN ("/=", Fneq
, Sneq
, 2, 2, 0,
2216 doc
: /* Return t if first arg is not equal to second arg. Both must be numbers or markers. */)
2218 register Lisp_Object num1
, num2
;
2220 return arithcompare (num1
, num2
, notequal
);
2223 DEFUN ("zerop", Fzerop
, Szerop
, 1, 1, 0,
2224 doc
: /* Return t if NUMBER is zero. */)
2226 register Lisp_Object number
;
2228 CHECK_NUMBER_OR_FLOAT (number
);
2230 if (FLOATP (number
))
2232 if (XFLOAT_DATA (number
) == 0.0)
2242 /* Convert between long values and pairs of Lisp integers. */
2248 unsigned int top
= i
>> 16;
2249 unsigned int bot
= i
& 0xFFFF;
2251 return make_number (bot
);
2252 if (top
== (unsigned long)-1 >> 16)
2253 return Fcons (make_number (-1), make_number (bot
));
2254 return Fcons (make_number (top
), make_number (bot
));
2261 Lisp_Object top
, bot
;
2268 return ((XINT (top
) << 16) | XINT (bot
));
2271 DEFUN ("number-to-string", Fnumber_to_string
, Snumber_to_string
, 1, 1, 0,
2272 doc
: /* Return the decimal representation of NUMBER as a string.
2273 Uses a minus sign if negative.
2274 NUMBER may be an integer or a floating point number. */)
2278 char buffer
[VALBITS
];
2280 CHECK_NUMBER_OR_FLOAT (number
);
2282 if (FLOATP (number
))
2284 char pigbuf
[350]; /* see comments in float_to_string */
2286 float_to_string (pigbuf
, XFLOAT_DATA (number
));
2287 return build_string (pigbuf
);
2290 if (sizeof (int) == sizeof (EMACS_INT
))
2291 sprintf (buffer
, "%d", XINT (number
));
2292 else if (sizeof (long) == sizeof (EMACS_INT
))
2293 sprintf (buffer
, "%ld", (long) XINT (number
));
2296 return build_string (buffer
);
2300 digit_to_number (character
, base
)
2301 int character
, base
;
2305 if (character
>= '0' && character
<= '9')
2306 digit
= character
- '0';
2307 else if (character
>= 'a' && character
<= 'z')
2308 digit
= character
- 'a' + 10;
2309 else if (character
>= 'A' && character
<= 'Z')
2310 digit
= character
- 'A' + 10;
2320 DEFUN ("string-to-number", Fstring_to_number
, Sstring_to_number
, 1, 2, 0,
2321 doc
: /* Parse STRING as a decimal number and return the number.
2322 This parses both integers and floating point numbers.
2323 It ignores leading spaces and tabs.
2325 If BASE, interpret STRING as a number in that base. If BASE isn't
2326 present, base 10 is used. BASE must be between 2 and 16 (inclusive).
2327 If the base used is not 10, floating point is not recognized. */)
2329 register Lisp_Object string
, base
;
2331 register unsigned char *p
;
2336 CHECK_STRING (string
);
2342 CHECK_NUMBER (base
);
2344 if (b
< 2 || b
> 16)
2345 Fsignal (Qargs_out_of_range
, Fcons (base
, Qnil
));
2348 /* Skip any whitespace at the front of the number. Some versions of
2349 atoi do this anyway, so we might as well make Emacs lisp consistent. */
2351 while (*p
== ' ' || *p
== '\t')
2362 if (isfloat_string (p
) && b
== 10)
2363 val
= make_float (sign
* atof (p
));
2370 int digit
= digit_to_number (*p
++, b
);
2376 val
= make_fixnum_or_float (sign
* v
);
2396 static Lisp_Object float_arith_driver
P_ ((double, int, enum arithop
,
2397 int, Lisp_Object
*));
2398 extern Lisp_Object
fmod_float ();
2401 arith_driver (code
, nargs
, args
)
2404 register Lisp_Object
*args
;
2406 register Lisp_Object val
;
2407 register int argnum
;
2408 register EMACS_INT accum
= 0;
2409 register EMACS_INT next
;
2411 switch (SWITCH_ENUM_CAST (code
))
2429 for (argnum
= 0; argnum
< nargs
; argnum
++)
2431 /* Using args[argnum] as argument to CHECK_NUMBER_... */
2433 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val
);
2436 return float_arith_driver ((double) accum
, argnum
, code
,
2439 next
= XINT (args
[argnum
]);
2440 switch (SWITCH_ENUM_CAST (code
))
2446 accum
= argnum
? accum
- next
: nargs
== 1 ? - next
: next
;
2457 Fsignal (Qarith_error
, Qnil
);
2471 if (!argnum
|| next
> accum
)
2475 if (!argnum
|| next
< accum
)
2481 XSETINT (val
, accum
);
2486 #define isnan(x) ((x) != (x))
2489 float_arith_driver (accum
, argnum
, code
, nargs
, args
)
2491 register int argnum
;
2494 register Lisp_Object
*args
;
2496 register Lisp_Object val
;
2499 for (; argnum
< nargs
; argnum
++)
2501 val
= args
[argnum
]; /* using args[argnum] as argument to CHECK_NUMBER_... */
2502 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val
);
2506 next
= XFLOAT_DATA (val
);
2510 args
[argnum
] = val
; /* runs into a compiler bug. */
2511 next
= XINT (args
[argnum
]);
2513 switch (SWITCH_ENUM_CAST (code
))
2519 accum
= argnum
? accum
- next
: nargs
== 1 ? - next
: next
;
2529 if (! IEEE_FLOATING_POINT
&& next
== 0)
2530 Fsignal (Qarith_error
, Qnil
);
2537 return wrong_type_argument (Qinteger_or_marker_p
, val
);
2539 if (!argnum
|| isnan (next
) || next
> accum
)
2543 if (!argnum
|| isnan (next
) || next
< accum
)
2549 return make_float (accum
);
2553 DEFUN ("+", Fplus
, Splus
, 0, MANY
, 0,
2554 doc
: /* Return sum of any number of arguments, which are numbers or markers.
2555 usage: (+ &rest NUMBERS-OR-MARKERS) */)
2560 return arith_driver (Aadd
, nargs
, args
);
2563 DEFUN ("-", Fminus
, Sminus
, 0, MANY
, 0,
2564 doc
: /* Negate number or subtract numbers or markers and return the result.
2565 With one arg, negates it. With more than one arg,
2566 subtracts all but the first from the first.
2567 usage: (- &optional NUMBER-OR-MARKER &rest MORE-NUMBERS-OR-MARKERS) */)
2572 return arith_driver (Asub
, nargs
, args
);
2575 DEFUN ("*", Ftimes
, Stimes
, 0, MANY
, 0,
2576 doc
: /* Return product of any number of arguments, which are numbers or markers.
2577 usage: (* &rest NUMBERS-OR-MARKERS) */)
2582 return arith_driver (Amult
, nargs
, args
);
2585 DEFUN ("/", Fquo
, Squo
, 2, MANY
, 0,
2586 doc
: /* Return first argument divided by all the remaining arguments.
2587 The arguments must be numbers or markers.
2588 usage: (/ DIVIDEND DIVISOR &rest DIVISORS) */)
2593 return arith_driver (Adiv
, nargs
, args
);
2596 DEFUN ("%", Frem
, Srem
, 2, 2, 0,
2597 doc
: /* Return remainder of X divided by Y.
2598 Both must be integers or markers. */)
2600 register Lisp_Object x
, y
;
2604 CHECK_NUMBER_COERCE_MARKER (x
);
2605 CHECK_NUMBER_COERCE_MARKER (y
);
2607 if (XFASTINT (y
) == 0)
2608 Fsignal (Qarith_error
, Qnil
);
2610 XSETINT (val
, XINT (x
) % XINT (y
));
2624 /* If the magnitude of the result exceeds that of the divisor, or
2625 the sign of the result does not agree with that of the dividend,
2626 iterate with the reduced value. This does not yield a
2627 particularly accurate result, but at least it will be in the
2628 range promised by fmod. */
2630 r
-= f2
* floor (r
/ f2
);
2631 while (f2
<= (r
< 0 ? -r
: r
) || ((r
< 0) != (f1
< 0) && ! isnan (r
)));
2635 #endif /* ! HAVE_FMOD */
2637 DEFUN ("mod", Fmod
, Smod
, 2, 2, 0,
2638 doc
: /* Return X modulo Y.
2639 The result falls between zero (inclusive) and Y (exclusive).
2640 Both X and Y must be numbers or markers. */)
2642 register Lisp_Object x
, y
;
2647 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (x
);
2648 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (y
);
2650 if (FLOATP (x
) || FLOATP (y
))
2651 return fmod_float (x
, y
);
2657 Fsignal (Qarith_error
, Qnil
);
2661 /* If the "remainder" comes out with the wrong sign, fix it. */
2662 if (i2
< 0 ? i1
> 0 : i1
< 0)
2669 DEFUN ("max", Fmax
, Smax
, 1, MANY
, 0,
2670 doc
: /* Return largest of all the arguments (which must be numbers or markers).
2671 The value is always a number; markers are converted to numbers.
2672 usage: (max NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */)
2677 return arith_driver (Amax
, nargs
, args
);
2680 DEFUN ("min", Fmin
, Smin
, 1, MANY
, 0,
2681 doc
: /* Return smallest of all the arguments (which must be numbers or markers).
2682 The value is always a number; markers are converted to numbers.
2683 usage: (min NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */)
2688 return arith_driver (Amin
, nargs
, args
);
2691 DEFUN ("logand", Flogand
, Slogand
, 0, MANY
, 0,
2692 doc
: /* Return bitwise-and of all the arguments.
2693 Arguments may be integers, or markers converted to integers.
2694 usage: (logand &rest INTS-OR-MARKERS) */)
2699 return arith_driver (Alogand
, nargs
, args
);
2702 DEFUN ("logior", Flogior
, Slogior
, 0, MANY
, 0,
2703 doc
: /* Return bitwise-or of all the arguments.
2704 Arguments may be integers, or markers converted to integers.
2705 usage: (logior &rest INTS-OR-MARKERS) */)
2710 return arith_driver (Alogior
, nargs
, args
);
2713 DEFUN ("logxor", Flogxor
, Slogxor
, 0, MANY
, 0,
2714 doc
: /* Return bitwise-exclusive-or of all the arguments.
2715 Arguments may be integers, or markers converted to integers.
2716 usage: (logxor &rest INTS-OR-MARKERS) */)
2721 return arith_driver (Alogxor
, nargs
, args
);
2724 DEFUN ("ash", Fash
, Sash
, 2, 2, 0,
2725 doc
: /* Return VALUE with its bits shifted left by COUNT.
2726 If COUNT is negative, shifting is actually to the right.
2727 In this case, the sign bit is duplicated. */)
2729 register Lisp_Object value
, count
;
2731 register Lisp_Object val
;
2733 CHECK_NUMBER (value
);
2734 CHECK_NUMBER (count
);
2736 if (XINT (count
) >= BITS_PER_EMACS_INT
)
2738 else if (XINT (count
) > 0)
2739 XSETINT (val
, XINT (value
) << XFASTINT (count
));
2740 else if (XINT (count
) <= -BITS_PER_EMACS_INT
)
2741 XSETINT (val
, XINT (value
) < 0 ? -1 : 0);
2743 XSETINT (val
, XINT (value
) >> -XINT (count
));
2747 DEFUN ("lsh", Flsh
, Slsh
, 2, 2, 0,
2748 doc
: /* Return VALUE with its bits shifted left by COUNT.
2749 If COUNT is negative, shifting is actually to the right.
2750 In this case, zeros are shifted in on the left. */)
2752 register Lisp_Object value
, count
;
2754 register Lisp_Object val
;
2756 CHECK_NUMBER (value
);
2757 CHECK_NUMBER (count
);
2759 if (XINT (count
) >= BITS_PER_EMACS_INT
)
2761 else if (XINT (count
) > 0)
2762 XSETINT (val
, (EMACS_UINT
) XUINT (value
) << XFASTINT (count
));
2763 else if (XINT (count
) <= -BITS_PER_EMACS_INT
)
2766 XSETINT (val
, (EMACS_UINT
) XUINT (value
) >> -XINT (count
));
2770 DEFUN ("1+", Fadd1
, Sadd1
, 1, 1, 0,
2771 doc
: /* Return NUMBER plus one. NUMBER may be a number or a marker.
2772 Markers are converted to integers. */)
2774 register Lisp_Object number
;
2776 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number
);
2778 if (FLOATP (number
))
2779 return (make_float (1.0 + XFLOAT_DATA (number
)));
2781 XSETINT (number
, XINT (number
) + 1);
2785 DEFUN ("1-", Fsub1
, Ssub1
, 1, 1, 0,
2786 doc
: /* Return NUMBER minus one. NUMBER may be a number or a marker.
2787 Markers are converted to integers. */)
2789 register Lisp_Object number
;
2791 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number
);
2793 if (FLOATP (number
))
2794 return (make_float (-1.0 + XFLOAT_DATA (number
)));
2796 XSETINT (number
, XINT (number
) - 1);
2800 DEFUN ("lognot", Flognot
, Slognot
, 1, 1, 0,
2801 doc
: /* Return the bitwise complement of NUMBER. NUMBER must be an integer. */)
2803 register Lisp_Object number
;
2805 CHECK_NUMBER (number
);
2806 XSETINT (number
, ~XINT (number
));
2813 Lisp_Object error_tail
, arith_tail
;
2815 Qquote
= intern ("quote");
2816 Qlambda
= intern ("lambda");
2817 Qsubr
= intern ("subr");
2818 Qerror_conditions
= intern ("error-conditions");
2819 Qerror_message
= intern ("error-message");
2820 Qtop_level
= intern ("top-level");
2822 Qerror
= intern ("error");
2823 Qquit
= intern ("quit");
2824 Qwrong_type_argument
= intern ("wrong-type-argument");
2825 Qargs_out_of_range
= intern ("args-out-of-range");
2826 Qvoid_function
= intern ("void-function");
2827 Qcyclic_function_indirection
= intern ("cyclic-function-indirection");
2828 Qcyclic_variable_indirection
= intern ("cyclic-variable-indirection");
2829 Qvoid_variable
= intern ("void-variable");
2830 Qsetting_constant
= intern ("setting-constant");
2831 Qinvalid_read_syntax
= intern ("invalid-read-syntax");
2833 Qinvalid_function
= intern ("invalid-function");
2834 Qwrong_number_of_arguments
= intern ("wrong-number-of-arguments");
2835 Qno_catch
= intern ("no-catch");
2836 Qend_of_file
= intern ("end-of-file");
2837 Qarith_error
= intern ("arith-error");
2838 Qbeginning_of_buffer
= intern ("beginning-of-buffer");
2839 Qend_of_buffer
= intern ("end-of-buffer");
2840 Qbuffer_read_only
= intern ("buffer-read-only");
2841 Qtext_read_only
= intern ("text-read-only");
2842 Qmark_inactive
= intern ("mark-inactive");
2844 Qlistp
= intern ("listp");
2845 Qconsp
= intern ("consp");
2846 Qsymbolp
= intern ("symbolp");
2847 Qkeywordp
= intern ("keywordp");
2848 Qintegerp
= intern ("integerp");
2849 Qnatnump
= intern ("natnump");
2850 Qwholenump
= intern ("wholenump");
2851 Qstringp
= intern ("stringp");
2852 Qarrayp
= intern ("arrayp");
2853 Qsequencep
= intern ("sequencep");
2854 Qbufferp
= intern ("bufferp");
2855 Qvectorp
= intern ("vectorp");
2856 Qchar_or_string_p
= intern ("char-or-string-p");
2857 Qmarkerp
= intern ("markerp");
2858 Qbuffer_or_string_p
= intern ("buffer-or-string-p");
2859 Qinteger_or_marker_p
= intern ("integer-or-marker-p");
2860 Qboundp
= intern ("boundp");
2861 Qfboundp
= intern ("fboundp");
2863 Qfloatp
= intern ("floatp");
2864 Qnumberp
= intern ("numberp");
2865 Qnumber_or_marker_p
= intern ("number-or-marker-p");
2867 Qchar_table_p
= intern ("char-table-p");
2868 Qvector_or_char_table_p
= intern ("vector-or-char-table-p");
2870 Qsubrp
= intern ("subrp");
2871 Qunevalled
= intern ("unevalled");
2872 Qmany
= intern ("many");
2874 Qcdr
= intern ("cdr");
2876 /* Handle automatic advice activation */
2877 Qad_advice_info
= intern ("ad-advice-info");
2878 Qad_activate_internal
= intern ("ad-activate-internal");
2880 error_tail
= Fcons (Qerror
, Qnil
);
2882 /* ERROR is used as a signaler for random errors for which nothing else is right */
2884 Fput (Qerror
, Qerror_conditions
,
2886 Fput (Qerror
, Qerror_message
,
2887 build_string ("error"));
2889 Fput (Qquit
, Qerror_conditions
,
2890 Fcons (Qquit
, Qnil
));
2891 Fput (Qquit
, Qerror_message
,
2892 build_string ("Quit"));
2894 Fput (Qwrong_type_argument
, Qerror_conditions
,
2895 Fcons (Qwrong_type_argument
, error_tail
));
2896 Fput (Qwrong_type_argument
, Qerror_message
,
2897 build_string ("Wrong type argument"));
2899 Fput (Qargs_out_of_range
, Qerror_conditions
,
2900 Fcons (Qargs_out_of_range
, error_tail
));
2901 Fput (Qargs_out_of_range
, Qerror_message
,
2902 build_string ("Args out of range"));
2904 Fput (Qvoid_function
, Qerror_conditions
,
2905 Fcons (Qvoid_function
, error_tail
));
2906 Fput (Qvoid_function
, Qerror_message
,
2907 build_string ("Symbol's function definition is void"));
2909 Fput (Qcyclic_function_indirection
, Qerror_conditions
,
2910 Fcons (Qcyclic_function_indirection
, error_tail
));
2911 Fput (Qcyclic_function_indirection
, Qerror_message
,
2912 build_string ("Symbol's chain of function indirections contains a loop"));
2914 Fput (Qcyclic_variable_indirection
, Qerror_conditions
,
2915 Fcons (Qcyclic_variable_indirection
, error_tail
));
2916 Fput (Qcyclic_variable_indirection
, Qerror_message
,
2917 build_string ("Symbol's chain of variable indirections contains a loop"));
2919 Qcircular_list
= intern ("circular-list");
2920 staticpro (&Qcircular_list
);
2921 Fput (Qcircular_list
, Qerror_conditions
,
2922 Fcons (Qcircular_list
, error_tail
));
2923 Fput (Qcircular_list
, Qerror_message
,
2924 build_string ("List contains a loop"));
2926 Fput (Qvoid_variable
, Qerror_conditions
,
2927 Fcons (Qvoid_variable
, error_tail
));
2928 Fput (Qvoid_variable
, Qerror_message
,
2929 build_string ("Symbol's value as variable is void"));
2931 Fput (Qsetting_constant
, Qerror_conditions
,
2932 Fcons (Qsetting_constant
, error_tail
));
2933 Fput (Qsetting_constant
, Qerror_message
,
2934 build_string ("Attempt to set a constant symbol"));
2936 Fput (Qinvalid_read_syntax
, Qerror_conditions
,
2937 Fcons (Qinvalid_read_syntax
, error_tail
));
2938 Fput (Qinvalid_read_syntax
, Qerror_message
,
2939 build_string ("Invalid read syntax"));
2941 Fput (Qinvalid_function
, Qerror_conditions
,
2942 Fcons (Qinvalid_function
, error_tail
));
2943 Fput (Qinvalid_function
, Qerror_message
,
2944 build_string ("Invalid function"));
2946 Fput (Qwrong_number_of_arguments
, Qerror_conditions
,
2947 Fcons (Qwrong_number_of_arguments
, error_tail
));
2948 Fput (Qwrong_number_of_arguments
, Qerror_message
,
2949 build_string ("Wrong number of arguments"));
2951 Fput (Qno_catch
, Qerror_conditions
,
2952 Fcons (Qno_catch
, error_tail
));
2953 Fput (Qno_catch
, Qerror_message
,
2954 build_string ("No catch for tag"));
2956 Fput (Qend_of_file
, Qerror_conditions
,
2957 Fcons (Qend_of_file
, error_tail
));
2958 Fput (Qend_of_file
, Qerror_message
,
2959 build_string ("End of file during parsing"));
2961 arith_tail
= Fcons (Qarith_error
, error_tail
);
2962 Fput (Qarith_error
, Qerror_conditions
,
2964 Fput (Qarith_error
, Qerror_message
,
2965 build_string ("Arithmetic error"));
2967 Fput (Qbeginning_of_buffer
, Qerror_conditions
,
2968 Fcons (Qbeginning_of_buffer
, error_tail
));
2969 Fput (Qbeginning_of_buffer
, Qerror_message
,
2970 build_string ("Beginning of buffer"));
2972 Fput (Qend_of_buffer
, Qerror_conditions
,
2973 Fcons (Qend_of_buffer
, error_tail
));
2974 Fput (Qend_of_buffer
, Qerror_message
,
2975 build_string ("End of buffer"));
2977 Fput (Qbuffer_read_only
, Qerror_conditions
,
2978 Fcons (Qbuffer_read_only
, error_tail
));
2979 Fput (Qbuffer_read_only
, Qerror_message
,
2980 build_string ("Buffer is read-only"));
2982 Fput (Qtext_read_only
, Qerror_conditions
,
2983 Fcons (Qtext_read_only
, error_tail
));
2984 Fput (Qtext_read_only
, Qerror_message
,
2985 build_string ("Text is read-only"));
2987 Qrange_error
= intern ("range-error");
2988 Qdomain_error
= intern ("domain-error");
2989 Qsingularity_error
= intern ("singularity-error");
2990 Qoverflow_error
= intern ("overflow-error");
2991 Qunderflow_error
= intern ("underflow-error");
2993 Fput (Qdomain_error
, Qerror_conditions
,
2994 Fcons (Qdomain_error
, arith_tail
));
2995 Fput (Qdomain_error
, Qerror_message
,
2996 build_string ("Arithmetic domain error"));
2998 Fput (Qrange_error
, Qerror_conditions
,
2999 Fcons (Qrange_error
, arith_tail
));
3000 Fput (Qrange_error
, Qerror_message
,
3001 build_string ("Arithmetic range error"));
3003 Fput (Qsingularity_error
, Qerror_conditions
,
3004 Fcons (Qsingularity_error
, Fcons (Qdomain_error
, arith_tail
)));
3005 Fput (Qsingularity_error
, Qerror_message
,
3006 build_string ("Arithmetic singularity error"));
3008 Fput (Qoverflow_error
, Qerror_conditions
,
3009 Fcons (Qoverflow_error
, Fcons (Qdomain_error
, arith_tail
)));
3010 Fput (Qoverflow_error
, Qerror_message
,
3011 build_string ("Arithmetic overflow error"));
3013 Fput (Qunderflow_error
, Qerror_conditions
,
3014 Fcons (Qunderflow_error
, Fcons (Qdomain_error
, arith_tail
)));
3015 Fput (Qunderflow_error
, Qerror_message
,
3016 build_string ("Arithmetic underflow error"));
3018 staticpro (&Qrange_error
);
3019 staticpro (&Qdomain_error
);
3020 staticpro (&Qsingularity_error
);
3021 staticpro (&Qoverflow_error
);
3022 staticpro (&Qunderflow_error
);
3026 staticpro (&Qquote
);
3027 staticpro (&Qlambda
);
3029 staticpro (&Qunbound
);
3030 staticpro (&Qerror_conditions
);
3031 staticpro (&Qerror_message
);
3032 staticpro (&Qtop_level
);
3034 staticpro (&Qerror
);
3036 staticpro (&Qwrong_type_argument
);
3037 staticpro (&Qargs_out_of_range
);
3038 staticpro (&Qvoid_function
);
3039 staticpro (&Qcyclic_function_indirection
);
3040 staticpro (&Qvoid_variable
);
3041 staticpro (&Qsetting_constant
);
3042 staticpro (&Qinvalid_read_syntax
);
3043 staticpro (&Qwrong_number_of_arguments
);
3044 staticpro (&Qinvalid_function
);
3045 staticpro (&Qno_catch
);
3046 staticpro (&Qend_of_file
);
3047 staticpro (&Qarith_error
);
3048 staticpro (&Qbeginning_of_buffer
);
3049 staticpro (&Qend_of_buffer
);
3050 staticpro (&Qbuffer_read_only
);
3051 staticpro (&Qtext_read_only
);
3052 staticpro (&Qmark_inactive
);
3054 staticpro (&Qlistp
);
3055 staticpro (&Qconsp
);
3056 staticpro (&Qsymbolp
);
3057 staticpro (&Qkeywordp
);
3058 staticpro (&Qintegerp
);
3059 staticpro (&Qnatnump
);
3060 staticpro (&Qwholenump
);
3061 staticpro (&Qstringp
);
3062 staticpro (&Qarrayp
);
3063 staticpro (&Qsequencep
);
3064 staticpro (&Qbufferp
);
3065 staticpro (&Qvectorp
);
3066 staticpro (&Qchar_or_string_p
);
3067 staticpro (&Qmarkerp
);
3068 staticpro (&Qbuffer_or_string_p
);
3069 staticpro (&Qinteger_or_marker_p
);
3070 staticpro (&Qfloatp
);
3071 staticpro (&Qnumberp
);
3072 staticpro (&Qnumber_or_marker_p
);
3073 staticpro (&Qchar_table_p
);
3074 staticpro (&Qvector_or_char_table_p
);
3075 staticpro (&Qsubrp
);
3077 staticpro (&Qunevalled
);
3079 staticpro (&Qboundp
);
3080 staticpro (&Qfboundp
);
3082 staticpro (&Qad_advice_info
);
3083 staticpro (&Qad_activate_internal
);
3085 /* Types that type-of returns. */
3086 Qinteger
= intern ("integer");
3087 Qsymbol
= intern ("symbol");
3088 Qstring
= intern ("string");
3089 Qcons
= intern ("cons");
3090 Qmarker
= intern ("marker");
3091 Qoverlay
= intern ("overlay");
3092 Qfloat
= intern ("float");
3093 Qwindow_configuration
= intern ("window-configuration");
3094 Qprocess
= intern ("process");
3095 Qwindow
= intern ("window");
3096 /* Qsubr = intern ("subr"); */
3097 Qcompiled_function
= intern ("compiled-function");
3098 Qbuffer
= intern ("buffer");
3099 Qframe
= intern ("frame");
3100 Qvector
= intern ("vector");
3101 Qchar_table
= intern ("char-table");
3102 Qbool_vector
= intern ("bool-vector");
3103 Qhash_table
= intern ("hash-table");
3105 staticpro (&Qinteger
);
3106 staticpro (&Qsymbol
);
3107 staticpro (&Qstring
);
3109 staticpro (&Qmarker
);
3110 staticpro (&Qoverlay
);
3111 staticpro (&Qfloat
);
3112 staticpro (&Qwindow_configuration
);
3113 staticpro (&Qprocess
);
3114 staticpro (&Qwindow
);
3115 /* staticpro (&Qsubr); */
3116 staticpro (&Qcompiled_function
);
3117 staticpro (&Qbuffer
);
3118 staticpro (&Qframe
);
3119 staticpro (&Qvector
);
3120 staticpro (&Qchar_table
);
3121 staticpro (&Qbool_vector
);
3122 staticpro (&Qhash_table
);
3124 defsubr (&Sindirect_variable
);
3125 defsubr (&Ssubr_interactive_form
);
3128 defsubr (&Stype_of
);
3133 defsubr (&Sintegerp
);
3134 defsubr (&Sinteger_or_marker_p
);
3135 defsubr (&Snumberp
);
3136 defsubr (&Snumber_or_marker_p
);
3138 defsubr (&Snatnump
);
3139 defsubr (&Ssymbolp
);
3140 defsubr (&Skeywordp
);
3141 defsubr (&Sstringp
);
3142 defsubr (&Smultibyte_string_p
);
3143 defsubr (&Svectorp
);
3144 defsubr (&Schar_table_p
);
3145 defsubr (&Svector_or_char_table_p
);
3146 defsubr (&Sbool_vector_p
);
3148 defsubr (&Ssequencep
);
3149 defsubr (&Sbufferp
);
3150 defsubr (&Smarkerp
);
3152 defsubr (&Sbyte_code_function_p
);
3153 defsubr (&Schar_or_string_p
);
3156 defsubr (&Scar_safe
);
3157 defsubr (&Scdr_safe
);
3160 defsubr (&Ssymbol_function
);
3161 defsubr (&Sindirect_function
);
3162 defsubr (&Ssymbol_plist
);
3163 defsubr (&Ssymbol_name
);
3164 defsubr (&Smakunbound
);
3165 defsubr (&Sfmakunbound
);
3167 defsubr (&Sfboundp
);
3169 defsubr (&Sdefalias
);
3170 defsubr (&Ssetplist
);
3171 defsubr (&Ssymbol_value
);
3173 defsubr (&Sdefault_boundp
);
3174 defsubr (&Sdefault_value
);
3175 defsubr (&Sset_default
);
3176 defsubr (&Ssetq_default
);
3177 defsubr (&Smake_variable_buffer_local
);
3178 defsubr (&Smake_local_variable
);
3179 defsubr (&Skill_local_variable
);
3180 defsubr (&Smake_variable_frame_local
);
3181 defsubr (&Slocal_variable_p
);
3182 defsubr (&Slocal_variable_if_set_p
);
3185 defsubr (&Snumber_to_string
);
3186 defsubr (&Sstring_to_number
);
3187 defsubr (&Seqlsign
);
3210 defsubr (&Ssubr_arity
);
3212 XSYMBOL (Qwholenump
)->function
= XSYMBOL (Qnatnump
)->function
;
3214 DEFVAR_LISP ("most-positive-fixnum", &Vmost_positive_fixnum
,
3215 doc
: /* The largest value that is representable in a Lisp integer. */);
3216 Vmost_positive_fixnum
= make_number (MOST_POSITIVE_FIXNUM
);
3218 DEFVAR_LISP ("most-negative-fixnum", &Vmost_negative_fixnum
,
3219 doc
: /* The smallest value that is representable in a Lisp integer. */);
3220 Vmost_negative_fixnum
= make_number (MOST_NEGATIVE_FIXNUM
);
3227 #if defined(USG) && !defined(POSIX_SIGNALS)
3228 /* USG systems forget handlers when they are used;
3229 must reestablish each time */
3230 signal (signo
, arith_error
);
3233 /* VMS systems are like USG. */
3234 signal (signo
, arith_error
);
3238 #else /* not BSD4_1 */
3239 sigsetmask (SIGEMPTYMASK
);
3240 #endif /* not BSD4_1 */
3242 Fsignal (Qarith_error
, Qnil
);
3248 /* Don't do this if just dumping out.
3249 We don't want to call `signal' in this case
3250 so that we don't have trouble with dumping
3251 signal-delivering routines in an inconsistent state. */
3255 #endif /* CANNOT_DUMP */
3256 signal (SIGFPE
, arith_error
);
3259 signal (SIGEMT
, arith_error
);