1 /* Primitive operations on Lisp data types for GNU Emacs Lisp interpreter.
2 Copyright (C) 1985, 1986, 1988, 1993, 1994, 1995, 1997, 1998, 1999, 2000,
3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
4 Free Software Foundation, Inc.
6 This file is part of GNU Emacs.
8 GNU Emacs is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
13 GNU Emacs is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
27 #include "character.h"
31 #include "syssignal.h"
32 #include "termhooks.h" /* For FRAME_KBOARD reference in y-or-n-p. */
39 /* If IEEE_FLOATING_POINT isn't defined, default it from FLT_*. */
40 #ifndef IEEE_FLOATING_POINT
41 #if (FLT_RADIX == 2 && FLT_MANT_DIG == 24 \
42 && FLT_MIN_EXP == -125 && FLT_MAX_EXP == 128)
43 #define IEEE_FLOATING_POINT 1
45 #define IEEE_FLOATING_POINT 0
52 extern double atof ();
55 Lisp_Object Qnil
, Qt
, Qquote
, Qlambda
, Qsubr
, Qunbound
;
56 Lisp_Object Qerror_conditions
, Qerror_message
, Qtop_level
;
57 Lisp_Object Qerror
, Qquit
, Qwrong_type_argument
, Qargs_out_of_range
;
58 Lisp_Object Qvoid_variable
, Qvoid_function
, Qcyclic_function_indirection
;
59 Lisp_Object Qcyclic_variable_indirection
, Qcircular_list
;
60 Lisp_Object Qsetting_constant
, Qinvalid_read_syntax
;
61 Lisp_Object Qinvalid_function
, Qwrong_number_of_arguments
, Qno_catch
;
62 Lisp_Object Qend_of_file
, Qarith_error
, Qmark_inactive
;
63 Lisp_Object Qbeginning_of_buffer
, Qend_of_buffer
, Qbuffer_read_only
;
64 Lisp_Object Qtext_read_only
;
66 Lisp_Object Qintegerp
, Qnatnump
, Qwholenump
, Qsymbolp
, Qlistp
, Qconsp
;
67 Lisp_Object Qstringp
, Qarrayp
, Qsequencep
, Qbufferp
;
68 Lisp_Object Qchar_or_string_p
, Qmarkerp
, Qinteger_or_marker_p
, Qvectorp
;
69 Lisp_Object Qbuffer_or_string_p
, Qkeywordp
;
70 Lisp_Object Qboundp
, Qfboundp
;
71 Lisp_Object Qchar_table_p
, Qvector_or_char_table_p
;
74 Lisp_Object Qad_advice_info
, Qad_activate_internal
;
76 Lisp_Object Qrange_error
, Qdomain_error
, Qsingularity_error
;
77 Lisp_Object Qoverflow_error
, Qunderflow_error
;
80 Lisp_Object Qnumberp
, Qnumber_or_marker_p
;
83 static Lisp_Object Qsymbol
, Qstring
, Qcons
, Qmarker
, Qoverlay
;
84 static Lisp_Object Qfloat
, Qwindow_configuration
, Qwindow
;
86 static Lisp_Object Qcompiled_function
, Qbuffer
, Qframe
, Qvector
;
87 static Lisp_Object Qchar_table
, Qbool_vector
, Qhash_table
;
88 static Lisp_Object Qsubrp
, Qmany
, Qunevalled
;
89 Lisp_Object Qfont_spec
, Qfont_entity
, Qfont_object
;
91 static Lisp_Object swap_in_symval_forwarding
P_ ((Lisp_Object
, Lisp_Object
));
93 Lisp_Object Vmost_positive_fixnum
, Vmost_negative_fixnum
;
97 circular_list_error (list
)
100 xsignal (Qcircular_list
, list
);
105 wrong_type_argument (predicate
, value
)
106 register Lisp_Object predicate
, value
;
108 /* If VALUE is not even a valid Lisp object, abort here
109 where we can get a backtrace showing where it came from. */
110 if ((unsigned int) XTYPE (value
) >= Lisp_Type_Limit
)
113 xsignal2 (Qwrong_type_argument
, predicate
, value
);
119 error ("Attempt to modify read-only object");
123 args_out_of_range (a1
, a2
)
126 xsignal2 (Qargs_out_of_range
, a1
, a2
);
130 args_out_of_range_3 (a1
, a2
, a3
)
131 Lisp_Object a1
, a2
, a3
;
133 xsignal3 (Qargs_out_of_range
, a1
, a2
, a3
);
136 /* On some machines, XINT needs a temporary location.
137 Here it is, in case it is needed. */
139 int sign_extend_temp
;
141 /* On a few machines, XINT can only be done by calling this. */
144 sign_extend_lisp_int (num
)
147 if (num
& (((EMACS_INT
) 1) << (VALBITS
- 1)))
148 return num
| (((EMACS_INT
) (-1)) << VALBITS
);
150 return num
& ((((EMACS_INT
) 1) << VALBITS
) - 1);
153 /* Data type predicates */
155 DEFUN ("eq", Feq
, Seq
, 2, 2, 0,
156 doc
: /* Return t if the two args are the same Lisp object. */)
158 Lisp_Object obj1
, obj2
;
165 DEFUN ("null", Fnull
, Snull
, 1, 1, 0,
166 doc
: /* Return t if OBJECT is nil. */)
175 DEFUN ("type-of", Ftype_of
, Stype_of
, 1, 1, 0,
176 doc
: /* Return a symbol representing the type of OBJECT.
177 The symbol returned names the object's basic type;
178 for example, (type-of 1) returns `integer'. */)
182 switch (XTYPE (object
))
197 switch (XMISCTYPE (object
))
199 case Lisp_Misc_Marker
:
201 case Lisp_Misc_Overlay
:
203 case Lisp_Misc_Float
:
208 case Lisp_Vectorlike
:
209 if (WINDOW_CONFIGURATIONP (object
))
210 return Qwindow_configuration
;
211 if (PROCESSP (object
))
213 if (WINDOWP (object
))
217 if (COMPILEDP (object
))
218 return Qcompiled_function
;
219 if (BUFFERP (object
))
221 if (CHAR_TABLE_P (object
))
223 if (BOOL_VECTOR_P (object
))
227 if (HASH_TABLE_P (object
))
229 if (FONT_SPEC_P (object
))
231 if (FONT_ENTITY_P (object
))
233 if (FONT_OBJECT_P (object
))
245 DEFUN ("consp", Fconsp
, Sconsp
, 1, 1, 0,
246 doc
: /* Return t if OBJECT is a cons cell. */)
255 DEFUN ("atom", Fatom
, Satom
, 1, 1, 0,
256 doc
: /* Return t if OBJECT is not a cons cell. This includes nil. */)
265 DEFUN ("listp", Flistp
, Slistp
, 1, 1, 0,
266 doc
: /* Return t if OBJECT is a list, that is, a cons cell or nil.
267 Otherwise, return nil. */)
271 if (CONSP (object
) || NILP (object
))
276 DEFUN ("nlistp", Fnlistp
, Snlistp
, 1, 1, 0,
277 doc
: /* Return t if OBJECT is not a list. Lists include nil. */)
281 if (CONSP (object
) || NILP (object
))
286 DEFUN ("symbolp", Fsymbolp
, Ssymbolp
, 1, 1, 0,
287 doc
: /* Return t if OBJECT is a symbol. */)
291 if (SYMBOLP (object
))
296 /* Define this in C to avoid unnecessarily consing up the symbol
298 DEFUN ("keywordp", Fkeywordp
, Skeywordp
, 1, 1, 0,
299 doc
: /* Return t if OBJECT is a keyword.
300 This means that it is a symbol with a print name beginning with `:'
301 interned in the initial obarray. */)
306 && SREF (SYMBOL_NAME (object
), 0) == ':'
307 && SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P (object
))
312 DEFUN ("vectorp", Fvectorp
, Svectorp
, 1, 1, 0,
313 doc
: /* Return t if OBJECT is a vector. */)
317 if (VECTORP (object
))
322 DEFUN ("stringp", Fstringp
, Sstringp
, 1, 1, 0,
323 doc
: /* Return t if OBJECT is a string. */)
327 if (STRINGP (object
))
332 DEFUN ("multibyte-string-p", Fmultibyte_string_p
, Smultibyte_string_p
,
334 doc
: /* Return t if OBJECT is a multibyte string. */)
338 if (STRINGP (object
) && STRING_MULTIBYTE (object
))
343 DEFUN ("char-table-p", Fchar_table_p
, Schar_table_p
, 1, 1, 0,
344 doc
: /* Return t if OBJECT is a char-table. */)
348 if (CHAR_TABLE_P (object
))
353 DEFUN ("vector-or-char-table-p", Fvector_or_char_table_p
,
354 Svector_or_char_table_p
, 1, 1, 0,
355 doc
: /* Return t if OBJECT is a char-table or vector. */)
359 if (VECTORP (object
) || CHAR_TABLE_P (object
))
364 DEFUN ("bool-vector-p", Fbool_vector_p
, Sbool_vector_p
, 1, 1, 0,
365 doc
: /* Return t if OBJECT is a bool-vector. */)
369 if (BOOL_VECTOR_P (object
))
374 DEFUN ("arrayp", Farrayp
, Sarrayp
, 1, 1, 0,
375 doc
: /* Return t if OBJECT is an array (string or vector). */)
384 DEFUN ("sequencep", Fsequencep
, Ssequencep
, 1, 1, 0,
385 doc
: /* Return t if OBJECT is a sequence (list or array). */)
387 register Lisp_Object object
;
389 if (CONSP (object
) || NILP (object
) || ARRAYP (object
))
394 DEFUN ("bufferp", Fbufferp
, Sbufferp
, 1, 1, 0,
395 doc
: /* Return t if OBJECT is an editor buffer. */)
399 if (BUFFERP (object
))
404 DEFUN ("markerp", Fmarkerp
, Smarkerp
, 1, 1, 0,
405 doc
: /* Return t if OBJECT is a marker (editor pointer). */)
409 if (MARKERP (object
))
414 DEFUN ("subrp", Fsubrp
, Ssubrp
, 1, 1, 0,
415 doc
: /* Return t if OBJECT is a built-in function. */)
424 DEFUN ("byte-code-function-p", Fbyte_code_function_p
, Sbyte_code_function_p
,
426 doc
: /* Return t if OBJECT is a byte-compiled function object. */)
430 if (COMPILEDP (object
))
435 DEFUN ("char-or-string-p", Fchar_or_string_p
, Schar_or_string_p
, 1, 1, 0,
436 doc
: /* Return t if OBJECT is a character or a string. */)
438 register Lisp_Object object
;
440 if (CHARACTERP (object
) || STRINGP (object
))
445 DEFUN ("integerp", Fintegerp
, Sintegerp
, 1, 1, 0,
446 doc
: /* Return t if OBJECT is an integer. */)
450 if (INTEGERP (object
))
455 DEFUN ("integer-or-marker-p", Finteger_or_marker_p
, Sinteger_or_marker_p
, 1, 1, 0,
456 doc
: /* Return t if OBJECT is an integer or a marker (editor pointer). */)
458 register Lisp_Object object
;
460 if (MARKERP (object
) || INTEGERP (object
))
465 DEFUN ("natnump", Fnatnump
, Snatnump
, 1, 1, 0,
466 doc
: /* Return t if OBJECT is a nonnegative integer. */)
470 if (NATNUMP (object
))
475 DEFUN ("numberp", Fnumberp
, Snumberp
, 1, 1, 0,
476 doc
: /* Return t if OBJECT is a number (floating point or integer). */)
480 if (NUMBERP (object
))
486 DEFUN ("number-or-marker-p", Fnumber_or_marker_p
,
487 Snumber_or_marker_p
, 1, 1, 0,
488 doc
: /* Return t if OBJECT is a number or a marker. */)
492 if (NUMBERP (object
) || MARKERP (object
))
497 DEFUN ("floatp", Ffloatp
, Sfloatp
, 1, 1, 0,
498 doc
: /* Return t if OBJECT is a floating point number. */)
508 /* Extract and set components of lists */
510 DEFUN ("car", Fcar
, Scar
, 1, 1, 0,
511 doc
: /* Return the car of LIST. If arg is nil, return nil.
512 Error if arg is not nil and not a cons cell. See also `car-safe'.
514 See Info node `(elisp)Cons Cells' for a discussion of related basic
515 Lisp concepts such as car, cdr, cons cell and list. */)
517 register Lisp_Object list
;
522 DEFUN ("car-safe", Fcar_safe
, Scar_safe
, 1, 1, 0,
523 doc
: /* Return the car of OBJECT if it is a cons cell, or else nil. */)
527 return CAR_SAFE (object
);
530 DEFUN ("cdr", Fcdr
, Scdr
, 1, 1, 0,
531 doc
: /* Return the cdr of LIST. If arg is nil, return nil.
532 Error if arg is not nil and not a cons cell. See also `cdr-safe'.
534 See Info node `(elisp)Cons Cells' for a discussion of related basic
535 Lisp concepts such as cdr, car, cons cell and list. */)
537 register Lisp_Object list
;
542 DEFUN ("cdr-safe", Fcdr_safe
, Scdr_safe
, 1, 1, 0,
543 doc
: /* Return the cdr of OBJECT if it is a cons cell, or else nil. */)
547 return CDR_SAFE (object
);
550 DEFUN ("setcar", Fsetcar
, Ssetcar
, 2, 2, 0,
551 doc
: /* Set the car of CELL to be NEWCAR. Returns NEWCAR. */)
553 register Lisp_Object cell
, newcar
;
557 XSETCAR (cell
, newcar
);
561 DEFUN ("setcdr", Fsetcdr
, Ssetcdr
, 2, 2, 0,
562 doc
: /* Set the cdr of CELL to be NEWCDR. Returns NEWCDR. */)
564 register Lisp_Object cell
, newcdr
;
568 XSETCDR (cell
, newcdr
);
572 /* Extract and set components of symbols */
574 DEFUN ("boundp", Fboundp
, Sboundp
, 1, 1, 0,
575 doc
: /* Return t if SYMBOL's value is not void. */)
577 register Lisp_Object symbol
;
579 Lisp_Object valcontents
;
580 CHECK_SYMBOL (symbol
);
582 valcontents
= SYMBOL_VALUE (symbol
);
584 if (BUFFER_LOCAL_VALUEP (valcontents
))
585 valcontents
= swap_in_symval_forwarding (symbol
, valcontents
);
587 return (EQ (valcontents
, Qunbound
) ? Qnil
: Qt
);
590 DEFUN ("fboundp", Ffboundp
, Sfboundp
, 1, 1, 0,
591 doc
: /* Return t if SYMBOL's function definition is not void. */)
593 register Lisp_Object symbol
;
595 CHECK_SYMBOL (symbol
);
596 return (EQ (XSYMBOL (symbol
)->function
, Qunbound
) ? Qnil
: Qt
);
599 DEFUN ("makunbound", Fmakunbound
, Smakunbound
, 1, 1, 0,
600 doc
: /* Make SYMBOL's value be void.
603 register Lisp_Object symbol
;
605 CHECK_SYMBOL (symbol
);
606 if (SYMBOL_CONSTANT_P (symbol
))
607 xsignal1 (Qsetting_constant
, symbol
);
608 Fset (symbol
, Qunbound
);
612 DEFUN ("fmakunbound", Ffmakunbound
, Sfmakunbound
, 1, 1, 0,
613 doc
: /* Make SYMBOL's function definition be void.
616 register Lisp_Object symbol
;
618 CHECK_SYMBOL (symbol
);
619 if (NILP (symbol
) || EQ (symbol
, Qt
))
620 xsignal1 (Qsetting_constant
, symbol
);
621 XSYMBOL (symbol
)->function
= Qunbound
;
625 DEFUN ("symbol-function", Fsymbol_function
, Ssymbol_function
, 1, 1, 0,
626 doc
: /* Return SYMBOL's function definition. Error if that is void. */)
628 register Lisp_Object symbol
;
630 CHECK_SYMBOL (symbol
);
631 if (!EQ (XSYMBOL (symbol
)->function
, Qunbound
))
632 return XSYMBOL (symbol
)->function
;
633 xsignal1 (Qvoid_function
, symbol
);
636 DEFUN ("symbol-plist", Fsymbol_plist
, Ssymbol_plist
, 1, 1, 0,
637 doc
: /* Return SYMBOL's property list. */)
639 register Lisp_Object symbol
;
641 CHECK_SYMBOL (symbol
);
642 return XSYMBOL (symbol
)->plist
;
645 DEFUN ("symbol-name", Fsymbol_name
, Ssymbol_name
, 1, 1, 0,
646 doc
: /* Return SYMBOL's name, a string. */)
648 register Lisp_Object symbol
;
650 register Lisp_Object name
;
652 CHECK_SYMBOL (symbol
);
653 name
= SYMBOL_NAME (symbol
);
657 DEFUN ("fset", Ffset
, Sfset
, 2, 2, 0,
658 doc
: /* Set SYMBOL's function definition to DEFINITION, and return DEFINITION. */)
660 register Lisp_Object symbol
, definition
;
662 register Lisp_Object function
;
664 CHECK_SYMBOL (symbol
);
665 if (NILP (symbol
) || EQ (symbol
, Qt
))
666 xsignal1 (Qsetting_constant
, symbol
);
668 function
= XSYMBOL (symbol
)->function
;
670 if (!NILP (Vautoload_queue
) && !EQ (function
, Qunbound
))
671 Vautoload_queue
= Fcons (Fcons (symbol
, function
), Vautoload_queue
);
673 if (CONSP (function
) && EQ (XCAR (function
), Qautoload
))
674 Fput (symbol
, Qautoload
, XCDR (function
));
676 XSYMBOL (symbol
)->function
= definition
;
677 /* Handle automatic advice activation */
678 if (CONSP (XSYMBOL (symbol
)->plist
) && !NILP (Fget (symbol
, Qad_advice_info
)))
680 call2 (Qad_activate_internal
, symbol
, Qnil
);
681 definition
= XSYMBOL (symbol
)->function
;
686 extern Lisp_Object Qfunction_documentation
;
688 DEFUN ("defalias", Fdefalias
, Sdefalias
, 2, 3, 0,
689 doc
: /* Set SYMBOL's function definition to DEFINITION, and return DEFINITION.
690 Associates the function with the current load file, if any.
691 The optional third argument DOCSTRING specifies the documentation string
692 for SYMBOL; if it is omitted or nil, SYMBOL uses the documentation string
693 determined by DEFINITION. */)
694 (symbol
, definition
, docstring
)
695 register Lisp_Object symbol
, definition
, docstring
;
697 CHECK_SYMBOL (symbol
);
698 if (CONSP (XSYMBOL (symbol
)->function
)
699 && EQ (XCAR (XSYMBOL (symbol
)->function
), Qautoload
))
700 LOADHIST_ATTACH (Fcons (Qt
, symbol
));
701 definition
= Ffset (symbol
, definition
);
702 LOADHIST_ATTACH (Fcons (Qdefun
, symbol
));
703 if (!NILP (docstring
))
704 Fput (symbol
, Qfunction_documentation
, docstring
);
708 DEFUN ("setplist", Fsetplist
, Ssetplist
, 2, 2, 0,
709 doc
: /* Set SYMBOL's property list to NEWPLIST, and return NEWPLIST. */)
711 register Lisp_Object symbol
, newplist
;
713 CHECK_SYMBOL (symbol
);
714 XSYMBOL (symbol
)->plist
= newplist
;
718 DEFUN ("subr-arity", Fsubr_arity
, Ssubr_arity
, 1, 1, 0,
719 doc
: /* Return minimum and maximum number of args allowed for SUBR.
720 SUBR must be a built-in function.
721 The returned value is a pair (MIN . MAX). MIN is the minimum number
722 of args. MAX is the maximum number or the symbol `many', for a
723 function with `&rest' args, or `unevalled' for a special form. */)
727 short minargs
, maxargs
;
729 minargs
= XSUBR (subr
)->min_args
;
730 maxargs
= XSUBR (subr
)->max_args
;
732 return Fcons (make_number (minargs
), Qmany
);
733 else if (maxargs
== UNEVALLED
)
734 return Fcons (make_number (minargs
), Qunevalled
);
736 return Fcons (make_number (minargs
), make_number (maxargs
));
739 DEFUN ("subr-name", Fsubr_name
, Ssubr_name
, 1, 1, 0,
740 doc
: /* Return name of subroutine SUBR.
741 SUBR must be a built-in function. */)
747 name
= XSUBR (subr
)->symbol_name
;
748 return make_string (name
, strlen (name
));
751 DEFUN ("interactive-form", Finteractive_form
, Sinteractive_form
, 1, 1, 0,
752 doc
: /* Return the interactive form of CMD or nil if none.
753 If CMD is not a command, the return value is nil.
754 Value, if non-nil, is a list \(interactive SPEC). */)
758 Lisp_Object fun
= indirect_function (cmd
); /* Check cycles. */
760 if (NILP (fun
) || EQ (fun
, Qunbound
))
763 /* Use an `interactive-form' property if present, analogous to the
764 function-documentation property. */
766 while (SYMBOLP (fun
))
768 Lisp_Object tmp
= Fget (fun
, intern ("interactive-form"));
772 fun
= Fsymbol_function (fun
);
777 char *spec
= XSUBR (fun
)->intspec
;
779 return list2 (Qinteractive
,
780 (*spec
!= '(') ? build_string (spec
) :
781 Fcar (Fread_from_string (build_string (spec
), Qnil
, Qnil
)));
783 else if (COMPILEDP (fun
))
785 if ((ASIZE (fun
) & PSEUDOVECTOR_SIZE_MASK
) > COMPILED_INTERACTIVE
)
786 return list2 (Qinteractive
, AREF (fun
, COMPILED_INTERACTIVE
));
788 else if (CONSP (fun
))
790 Lisp_Object funcar
= XCAR (fun
);
791 if (EQ (funcar
, Qlambda
))
792 return Fassq (Qinteractive
, Fcdr (XCDR (fun
)));
793 else if (EQ (funcar
, Qautoload
))
797 do_autoload (fun
, cmd
);
799 return Finteractive_form (cmd
);
806 /***********************************************************************
807 Getting and Setting Values of Symbols
808 ***********************************************************************/
810 /* Return the symbol holding SYMBOL's value. Signal
811 `cyclic-variable-indirection' if SYMBOL's chain of variable
812 indirections contains a loop. */
815 indirect_variable (symbol
)
816 struct Lisp_Symbol
*symbol
;
818 struct Lisp_Symbol
*tortoise
, *hare
;
820 hare
= tortoise
= symbol
;
822 while (hare
->indirect_variable
)
824 hare
= XSYMBOL (hare
->value
);
825 if (!hare
->indirect_variable
)
828 hare
= XSYMBOL (hare
->value
);
829 tortoise
= XSYMBOL (tortoise
->value
);
831 if (hare
== tortoise
)
834 XSETSYMBOL (tem
, symbol
);
835 xsignal1 (Qcyclic_variable_indirection
, tem
);
843 DEFUN ("indirect-variable", Findirect_variable
, Sindirect_variable
, 1, 1, 0,
844 doc
: /* Return the variable at the end of OBJECT's variable chain.
845 If OBJECT is a symbol, follow all variable indirections and return the final
846 variable. If OBJECT is not a symbol, just return it.
847 Signal a cyclic-variable-indirection error if there is a loop in the
848 variable chain of symbols. */)
852 if (SYMBOLP (object
))
853 XSETSYMBOL (object
, indirect_variable (XSYMBOL (object
)));
858 /* Given the raw contents of a symbol value cell,
859 return the Lisp value of the symbol.
860 This does not handle buffer-local variables; use
861 swap_in_symval_forwarding for that. */
864 do_symval_forwarding (valcontents
)
865 register Lisp_Object valcontents
;
867 register Lisp_Object val
;
868 if (MISCP (valcontents
))
869 switch (XMISCTYPE (valcontents
))
871 case Lisp_Misc_Intfwd
:
872 XSETINT (val
, *XINTFWD (valcontents
)->intvar
);
875 case Lisp_Misc_Boolfwd
:
876 return (*XBOOLFWD (valcontents
)->boolvar
? Qt
: Qnil
);
878 case Lisp_Misc_Objfwd
:
879 return *XOBJFWD (valcontents
)->objvar
;
881 case Lisp_Misc_Buffer_Objfwd
:
882 return PER_BUFFER_VALUE (current_buffer
,
883 XBUFFER_OBJFWD (valcontents
)->offset
);
885 case Lisp_Misc_Kboard_Objfwd
:
886 /* We used to simply use current_kboard here, but from Lisp
887 code, it's value is often unexpected. It seems nicer to
888 allow constructions like this to work as intuitively expected:
890 (with-selected-frame frame
891 (define-key local-function-map "\eOP" [f1]))
893 On the other hand, this affects the semantics of
894 last-command and real-last-command, and people may rely on
895 that. I took a quick look at the Lisp codebase, and I
896 don't think anything will break. --lorentey */
897 return *(Lisp_Object
*)(XKBOARD_OBJFWD (valcontents
)->offset
898 + (char *)FRAME_KBOARD (SELECTED_FRAME ()));
903 /* Store NEWVAL into SYMBOL, where VALCONTENTS is found in the value cell
904 of SYMBOL. If SYMBOL is buffer-local, VALCONTENTS should be the
905 buffer-independent contents of the value cell: forwarded just one
906 step past the buffer-localness.
908 BUF non-zero means set the value in buffer BUF instead of the
909 current buffer. This only plays a role for per-buffer variables. */
912 store_symval_forwarding (symbol
, valcontents
, newval
, buf
)
914 register Lisp_Object valcontents
, newval
;
917 switch (SWITCH_ENUM_CAST (XTYPE (valcontents
)))
920 switch (XMISCTYPE (valcontents
))
922 case Lisp_Misc_Intfwd
:
923 CHECK_NUMBER (newval
);
924 *XINTFWD (valcontents
)->intvar
= XINT (newval
);
925 /* This can never happen since intvar points to an EMACS_INT
926 which is at least large enough to hold a Lisp_Object.
927 if (*XINTFWD (valcontents)->intvar != XINT (newval))
928 error ("Value out of range for variable `%s'",
929 SDATA (SYMBOL_NAME (symbol))); */
932 case Lisp_Misc_Boolfwd
:
933 *XBOOLFWD (valcontents
)->boolvar
= !NILP (newval
);
936 case Lisp_Misc_Objfwd
:
937 *XOBJFWD (valcontents
)->objvar
= newval
;
939 /* If this variable is a default for something stored
940 in the buffer itself, such as default-fill-column,
941 find the buffers that don't have local values for it
943 if (XOBJFWD (valcontents
)->objvar
> (Lisp_Object
*) &buffer_defaults
944 && XOBJFWD (valcontents
)->objvar
< (Lisp_Object
*) (&buffer_defaults
+ 1))
946 int offset
= ((char *) XOBJFWD (valcontents
)->objvar
947 - (char *) &buffer_defaults
);
948 int idx
= PER_BUFFER_IDX (offset
);
955 for (tail
= Vbuffer_alist
; CONSP (tail
); tail
= XCDR (tail
))
960 buf
= Fcdr (XCAR (tail
));
961 if (!BUFFERP (buf
)) continue;
964 if (! PER_BUFFER_VALUE_P (b
, idx
))
965 PER_BUFFER_VALUE (b
, offset
) = newval
;
970 case Lisp_Misc_Buffer_Objfwd
:
972 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
973 Lisp_Object type
= XBUFFER_OBJFWD (valcontents
)->slottype
;
975 if (! NILP (type
) && ! NILP (newval
)
976 && XTYPE (newval
) != XINT (type
))
977 buffer_slot_type_mismatch (newval
, XINT (type
));
980 buf
= current_buffer
;
981 PER_BUFFER_VALUE (buf
, offset
) = newval
;
985 case Lisp_Misc_Kboard_Objfwd
:
987 char *base
= (char *) FRAME_KBOARD (SELECTED_FRAME ());
988 char *p
= base
+ XKBOARD_OBJFWD (valcontents
)->offset
;
989 *(Lisp_Object
*) p
= newval
;
1000 valcontents
= SYMBOL_VALUE (symbol
);
1001 if (BUFFER_LOCAL_VALUEP (valcontents
))
1002 XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
= newval
;
1004 SET_SYMBOL_VALUE (symbol
, newval
);
1008 /* Set up SYMBOL to refer to its global binding.
1009 This makes it safe to alter the status of other bindings. */
1012 swap_in_global_binding (symbol
)
1015 Lisp_Object valcontents
= SYMBOL_VALUE (symbol
);
1016 struct Lisp_Buffer_Local_Value
*blv
= XBUFFER_LOCAL_VALUE (valcontents
);
1017 Lisp_Object cdr
= blv
->cdr
;
1019 /* Unload the previously loaded binding. */
1020 Fsetcdr (XCAR (cdr
),
1021 do_symval_forwarding (blv
->realvalue
));
1023 /* Select the global binding in the symbol. */
1025 store_symval_forwarding (symbol
, blv
->realvalue
, XCDR (cdr
), NULL
);
1027 /* Indicate that the global binding is set up now. */
1030 blv
->found_for_frame
= 0;
1031 blv
->found_for_buffer
= 0;
1034 /* Set up the buffer-local symbol SYMBOL for validity in the current buffer.
1035 VALCONTENTS is the contents of its value cell,
1036 which points to a struct Lisp_Buffer_Local_Value.
1038 Return the value forwarded one step past the buffer-local stage.
1039 This could be another forwarding pointer. */
1042 swap_in_symval_forwarding (symbol
, valcontents
)
1043 Lisp_Object symbol
, valcontents
;
1045 register Lisp_Object tem1
;
1047 tem1
= XBUFFER_LOCAL_VALUE (valcontents
)->buffer
;
1050 || current_buffer
!= XBUFFER (tem1
)
1051 || (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
1052 && ! EQ (selected_frame
, XBUFFER_LOCAL_VALUE (valcontents
)->frame
)))
1054 struct Lisp_Symbol
*sym
= XSYMBOL (symbol
);
1055 if (sym
->indirect_variable
)
1057 sym
= indirect_variable (sym
);
1058 XSETSYMBOL (symbol
, sym
);
1061 /* Unload the previously loaded binding. */
1062 tem1
= XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
1064 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
));
1065 /* Choose the new binding. */
1066 tem1
= assq_no_quit (symbol
, current_buffer
->local_var_alist
);
1067 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_frame
= 0;
1068 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 0;
1071 if (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
)
1072 tem1
= assq_no_quit (symbol
, XFRAME (selected_frame
)->param_alist
);
1074 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_frame
= 1;
1076 tem1
= XBUFFER_LOCAL_VALUE (valcontents
)->cdr
;
1079 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 1;
1081 /* Load the new binding. */
1082 XSETCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
, tem1
);
1083 XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents
)->buffer
, current_buffer
);
1084 XBUFFER_LOCAL_VALUE (valcontents
)->frame
= selected_frame
;
1085 store_symval_forwarding (symbol
,
1086 XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
,
1089 return XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
;
1092 /* Find the value of a symbol, returning Qunbound if it's not bound.
1093 This is helpful for code which just wants to get a variable's value
1094 if it has one, without signaling an error.
1095 Note that it must not be possible to quit
1096 within this function. Great care is required for this. */
1099 find_symbol_value (symbol
)
1102 register Lisp_Object valcontents
;
1103 register Lisp_Object val
;
1105 CHECK_SYMBOL (symbol
);
1106 valcontents
= SYMBOL_VALUE (symbol
);
1108 if (BUFFER_LOCAL_VALUEP (valcontents
))
1109 valcontents
= swap_in_symval_forwarding (symbol
, valcontents
);
1111 return do_symval_forwarding (valcontents
);
1114 DEFUN ("symbol-value", Fsymbol_value
, Ssymbol_value
, 1, 1, 0,
1115 doc
: /* Return SYMBOL's value. Error if that is void. */)
1121 val
= find_symbol_value (symbol
);
1122 if (!EQ (val
, Qunbound
))
1125 xsignal1 (Qvoid_variable
, symbol
);
1128 DEFUN ("set", Fset
, Sset
, 2, 2, 0,
1129 doc
: /* Set SYMBOL's value to NEWVAL, and return NEWVAL. */)
1131 register Lisp_Object symbol
, newval
;
1133 return set_internal (symbol
, newval
, current_buffer
, 0);
1136 /* Return 1 if SYMBOL currently has a let-binding
1137 which was made in the buffer that is now current. */
1140 let_shadows_buffer_binding_p (symbol
)
1141 struct Lisp_Symbol
*symbol
;
1143 volatile struct specbinding
*p
;
1145 for (p
= specpdl_ptr
- 1; p
>= specpdl
; p
--)
1147 && CONSP (p
->symbol
))
1149 struct Lisp_Symbol
*let_bound_symbol
= XSYMBOL (XCAR (p
->symbol
));
1150 if ((symbol
== let_bound_symbol
1151 || (let_bound_symbol
->indirect_variable
1152 && symbol
== indirect_variable (let_bound_symbol
)))
1153 && XBUFFER (XCDR (XCDR (p
->symbol
))) == current_buffer
)
1157 return p
>= specpdl
;
1160 /* Store the value NEWVAL into SYMBOL.
1161 If buffer-locality is an issue, BUF specifies which buffer to use.
1162 (0 stands for the current buffer.)
1164 If BINDFLAG is zero, then if this symbol is supposed to become
1165 local in every buffer where it is set, then we make it local.
1166 If BINDFLAG is nonzero, we don't do that. */
1169 set_internal (symbol
, newval
, buf
, bindflag
)
1170 register Lisp_Object symbol
, newval
;
1174 int voide
= EQ (newval
, Qunbound
);
1176 register Lisp_Object valcontents
, innercontents
, tem1
, current_alist_element
;
1179 buf
= current_buffer
;
1181 /* If restoring in a dead buffer, do nothing. */
1182 if (NILP (buf
->name
))
1185 CHECK_SYMBOL (symbol
);
1186 if (SYMBOL_CONSTANT_P (symbol
)
1187 && (NILP (Fkeywordp (symbol
))
1188 || !EQ (newval
, SYMBOL_VALUE (symbol
))))
1189 xsignal1 (Qsetting_constant
, symbol
);
1191 innercontents
= valcontents
= SYMBOL_VALUE (symbol
);
1193 if (BUFFER_OBJFWDP (valcontents
))
1195 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1196 int idx
= PER_BUFFER_IDX (offset
);
1199 && !let_shadows_buffer_binding_p (XSYMBOL (symbol
)))
1200 SET_PER_BUFFER_VALUE_P (buf
, idx
, 1);
1202 else if (BUFFER_LOCAL_VALUEP (valcontents
))
1204 /* valcontents is a struct Lisp_Buffer_Local_Value. */
1205 if (XSYMBOL (symbol
)->indirect_variable
)
1206 XSETSYMBOL (symbol
, indirect_variable (XSYMBOL (symbol
)));
1208 /* What binding is loaded right now? */
1209 current_alist_element
1210 = XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
1212 /* If the current buffer is not the buffer whose binding is
1213 loaded, or if there may be frame-local bindings and the frame
1214 isn't the right one, or if it's a Lisp_Buffer_Local_Value and
1215 the default binding is loaded, the loaded binding may be the
1217 if (!BUFFERP (XBUFFER_LOCAL_VALUE (valcontents
)->buffer
)
1218 || buf
!= XBUFFER (XBUFFER_LOCAL_VALUE (valcontents
)->buffer
)
1219 || (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
1220 && !EQ (selected_frame
, XBUFFER_LOCAL_VALUE (valcontents
)->frame
))
1221 /* Also unload a global binding (if the var is local_if_set). */
1222 || (EQ (XCAR (current_alist_element
),
1223 current_alist_element
)))
1225 /* The currently loaded binding is not necessarily valid.
1226 We need to unload it, and choose a new binding. */
1228 /* Write out `realvalue' to the old loaded binding. */
1229 Fsetcdr (current_alist_element
,
1230 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
));
1232 /* Find the new binding. */
1233 tem1
= Fassq (symbol
, buf
->local_var_alist
);
1234 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 1;
1235 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_frame
= 0;
1239 /* This buffer still sees the default value. */
1241 /* If the variable is not local_if_set,
1242 or if this is `let' rather than `set',
1243 make CURRENT-ALIST-ELEMENT point to itself,
1244 indicating that we're seeing the default value.
1245 Likewise if the variable has been let-bound
1246 in the current buffer. */
1247 if (bindflag
|| !XBUFFER_LOCAL_VALUE (valcontents
)->local_if_set
1248 || let_shadows_buffer_binding_p (XSYMBOL (symbol
)))
1250 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 0;
1252 if (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
)
1253 tem1
= Fassq (symbol
,
1254 XFRAME (selected_frame
)->param_alist
);
1257 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_frame
= 1;
1259 tem1
= XBUFFER_LOCAL_VALUE (valcontents
)->cdr
;
1261 /* If it's a Lisp_Buffer_Local_Value, being set not bound,
1262 and we're not within a let that was made for this buffer,
1263 create a new buffer-local binding for the variable.
1264 That means, give this buffer a new assoc for a local value
1265 and load that binding. */
1268 tem1
= Fcons (symbol
, XCDR (current_alist_element
));
1269 buf
->local_var_alist
1270 = Fcons (tem1
, buf
->local_var_alist
);
1274 /* Record which binding is now loaded. */
1275 XSETCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
, tem1
);
1277 /* Set `buffer' and `frame' slots for the binding now loaded. */
1278 XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents
)->buffer
, buf
);
1279 XBUFFER_LOCAL_VALUE (valcontents
)->frame
= selected_frame
;
1281 innercontents
= XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
;
1283 /* Store the new value in the cons-cell. */
1284 XSETCDR (XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
), newval
);
1287 /* If storing void (making the symbol void), forward only through
1288 buffer-local indicator, not through Lisp_Objfwd, etc. */
1290 store_symval_forwarding (symbol
, Qnil
, newval
, buf
);
1292 store_symval_forwarding (symbol
, innercontents
, newval
, buf
);
1297 /* Access or set a buffer-local symbol's default value. */
1299 /* Return the default value of SYMBOL, but don't check for voidness.
1300 Return Qunbound if it is void. */
1303 default_value (symbol
)
1306 register Lisp_Object valcontents
;
1308 CHECK_SYMBOL (symbol
);
1309 valcontents
= SYMBOL_VALUE (symbol
);
1311 /* For a built-in buffer-local variable, get the default value
1312 rather than letting do_symval_forwarding get the current value. */
1313 if (BUFFER_OBJFWDP (valcontents
))
1315 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1316 if (PER_BUFFER_IDX (offset
) != 0)
1317 return PER_BUFFER_DEFAULT (offset
);
1320 /* Handle user-created local variables. */
1321 if (BUFFER_LOCAL_VALUEP (valcontents
))
1323 /* If var is set up for a buffer that lacks a local value for it,
1324 the current value is nominally the default value.
1325 But the `realvalue' slot may be more up to date, since
1326 ordinary setq stores just that slot. So use that. */
1327 Lisp_Object current_alist_element
, alist_element_car
;
1328 current_alist_element
1329 = XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
1330 alist_element_car
= XCAR (current_alist_element
);
1331 if (EQ (alist_element_car
, current_alist_element
))
1332 return do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
);
1334 return XCDR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
1336 /* For other variables, get the current value. */
1337 return do_symval_forwarding (valcontents
);
1340 DEFUN ("default-boundp", Fdefault_boundp
, Sdefault_boundp
, 1, 1, 0,
1341 doc
: /* Return t if SYMBOL has a non-void default value.
1342 This is the value that is seen in buffers that do not have their own values
1343 for this variable. */)
1347 register Lisp_Object value
;
1349 value
= default_value (symbol
);
1350 return (EQ (value
, Qunbound
) ? Qnil
: Qt
);
1353 DEFUN ("default-value", Fdefault_value
, Sdefault_value
, 1, 1, 0,
1354 doc
: /* Return SYMBOL's default value.
1355 This is the value that is seen in buffers that do not have their own values
1356 for this variable. The default value is meaningful for variables with
1357 local bindings in certain buffers. */)
1361 register Lisp_Object value
;
1363 value
= default_value (symbol
);
1364 if (!EQ (value
, Qunbound
))
1367 xsignal1 (Qvoid_variable
, symbol
);
1370 DEFUN ("set-default", Fset_default
, Sset_default
, 2, 2, 0,
1371 doc
: /* Set SYMBOL's default value to VALUE. SYMBOL and VALUE are evaluated.
1372 The default value is seen in buffers that do not have their own values
1373 for this variable. */)
1375 Lisp_Object symbol
, value
;
1377 register Lisp_Object valcontents
, current_alist_element
, alist_element_buffer
;
1379 CHECK_SYMBOL (symbol
);
1380 valcontents
= SYMBOL_VALUE (symbol
);
1382 /* Handle variables like case-fold-search that have special slots
1383 in the buffer. Make them work apparently like Lisp_Buffer_Local_Value
1385 if (BUFFER_OBJFWDP (valcontents
))
1387 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1388 int idx
= PER_BUFFER_IDX (offset
);
1390 PER_BUFFER_DEFAULT (offset
) = value
;
1392 /* If this variable is not always local in all buffers,
1393 set it in the buffers that don't nominally have a local value. */
1398 for (b
= all_buffers
; b
; b
= b
->next
)
1399 if (!PER_BUFFER_VALUE_P (b
, idx
))
1400 PER_BUFFER_VALUE (b
, offset
) = value
;
1405 if (!BUFFER_LOCAL_VALUEP (valcontents
))
1406 return Fset (symbol
, value
);
1408 /* Store new value into the DEFAULT-VALUE slot. */
1409 XSETCDR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
, value
);
1411 /* If the default binding is now loaded, set the REALVALUE slot too. */
1412 current_alist_element
1413 = XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
1414 alist_element_buffer
= Fcar (current_alist_element
);
1415 if (EQ (alist_element_buffer
, current_alist_element
))
1416 store_symval_forwarding (symbol
,
1417 XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
,
1423 DEFUN ("setq-default", Fsetq_default
, Ssetq_default
, 0, UNEVALLED
, 0,
1424 doc
: /* Set the default value of variable VAR to VALUE.
1425 VAR, the variable name, is literal (not evaluated);
1426 VALUE is an expression: it is evaluated and its value returned.
1427 The default value of a variable is seen in buffers
1428 that do not have their own values for the variable.
1430 More generally, you can use multiple variables and values, as in
1431 (setq-default VAR VALUE VAR VALUE...)
1432 This sets each VAR's default value to the corresponding VALUE.
1433 The VALUE for the Nth VAR can refer to the new default values
1435 usage: (setq-default [VAR VALUE]...) */)
1439 register Lisp_Object args_left
;
1440 register Lisp_Object val
, symbol
;
1441 struct gcpro gcpro1
;
1451 val
= Feval (Fcar (Fcdr (args_left
)));
1452 symbol
= XCAR (args_left
);
1453 Fset_default (symbol
, val
);
1454 args_left
= Fcdr (XCDR (args_left
));
1456 while (!NILP (args_left
));
1462 /* Lisp functions for creating and removing buffer-local variables. */
1464 DEFUN ("make-variable-buffer-local", Fmake_variable_buffer_local
, Smake_variable_buffer_local
,
1465 1, 1, "vMake Variable Buffer Local: ",
1466 doc
: /* Make VARIABLE become buffer-local whenever it is set.
1467 At any time, the value for the current buffer is in effect,
1468 unless the variable has never been set in this buffer,
1469 in which case the default value is in effect.
1470 Note that binding the variable with `let', or setting it while
1471 a `let'-style binding made in this buffer is in effect,
1472 does not make the variable buffer-local. Return VARIABLE.
1474 In most cases it is better to use `make-local-variable',
1475 which makes a variable local in just one buffer.
1477 The function `default-value' gets the default value and `set-default' sets it. */)
1479 register Lisp_Object variable
;
1481 register Lisp_Object tem
, valcontents
, newval
;
1482 struct Lisp_Symbol
*sym
;
1484 CHECK_SYMBOL (variable
);
1485 sym
= indirect_variable (XSYMBOL (variable
));
1487 valcontents
= sym
->value
;
1488 if (sym
->constant
|| KBOARD_OBJFWDP (valcontents
))
1489 error ("Symbol %s may not be buffer-local", SDATA (sym
->xname
));
1491 if (BUFFER_OBJFWDP (valcontents
))
1493 else if (BUFFER_LOCAL_VALUEP (valcontents
))
1495 if (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
)
1496 error ("Symbol %s may not be buffer-local", SDATA (sym
->xname
));
1497 newval
= valcontents
;
1501 if (EQ (valcontents
, Qunbound
))
1503 tem
= Fcons (Qnil
, Fsymbol_value (variable
));
1505 newval
= allocate_misc ();
1506 XMISCTYPE (newval
) = Lisp_Misc_Buffer_Local_Value
;
1507 XBUFFER_LOCAL_VALUE (newval
)->realvalue
= sym
->value
;
1508 XBUFFER_LOCAL_VALUE (newval
)->buffer
= Fcurrent_buffer ();
1509 XBUFFER_LOCAL_VALUE (newval
)->frame
= Qnil
;
1510 XBUFFER_LOCAL_VALUE (newval
)->found_for_buffer
= 0;
1511 XBUFFER_LOCAL_VALUE (newval
)->found_for_frame
= 0;
1512 XBUFFER_LOCAL_VALUE (newval
)->check_frame
= 0;
1513 XBUFFER_LOCAL_VALUE (newval
)->cdr
= tem
;
1514 sym
->value
= newval
;
1516 XBUFFER_LOCAL_VALUE (newval
)->local_if_set
= 1;
1520 DEFUN ("make-local-variable", Fmake_local_variable
, Smake_local_variable
,
1521 1, 1, "vMake Local Variable: ",
1522 doc
: /* Make VARIABLE have a separate value in the current buffer.
1523 Other buffers will continue to share a common default value.
1524 \(The buffer-local value of VARIABLE starts out as the same value
1525 VARIABLE previously had. If VARIABLE was void, it remains void.\)
1528 If the variable is already arranged to become local when set,
1529 this function causes a local value to exist for this buffer,
1530 just as setting the variable would do.
1532 This function returns VARIABLE, and therefore
1533 (set (make-local-variable 'VARIABLE) VALUE-EXP)
1536 See also `make-variable-buffer-local'.
1538 Do not use `make-local-variable' to make a hook variable buffer-local.
1539 Instead, use `add-hook' and specify t for the LOCAL argument. */)
1541 register Lisp_Object variable
;
1543 register Lisp_Object tem
, valcontents
;
1544 struct Lisp_Symbol
*sym
;
1546 CHECK_SYMBOL (variable
);
1547 sym
= indirect_variable (XSYMBOL (variable
));
1549 valcontents
= sym
->value
;
1550 if (sym
->constant
|| KBOARD_OBJFWDP (valcontents
)
1551 || (BUFFER_LOCAL_VALUEP (valcontents
)
1552 && (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
)))
1553 error ("Symbol %s may not be buffer-local", SDATA (sym
->xname
));
1555 if ((BUFFER_LOCAL_VALUEP (valcontents
)
1556 && XBUFFER_LOCAL_VALUE (valcontents
)->local_if_set
)
1557 || BUFFER_OBJFWDP (valcontents
))
1559 tem
= Fboundp (variable
);
1561 /* Make sure the symbol has a local value in this particular buffer,
1562 by setting it to the same value it already has. */
1563 Fset (variable
, (EQ (tem
, Qt
) ? Fsymbol_value (variable
) : Qunbound
));
1566 /* Make sure symbol is set up to hold per-buffer values. */
1567 if (!BUFFER_LOCAL_VALUEP (valcontents
))
1570 tem
= Fcons (Qnil
, do_symval_forwarding (valcontents
));
1572 newval
= allocate_misc ();
1573 XMISCTYPE (newval
) = Lisp_Misc_Buffer_Local_Value
;
1574 XBUFFER_LOCAL_VALUE (newval
)->realvalue
= sym
->value
;
1575 XBUFFER_LOCAL_VALUE (newval
)->buffer
= Qnil
;
1576 XBUFFER_LOCAL_VALUE (newval
)->frame
= Qnil
;
1577 XBUFFER_LOCAL_VALUE (newval
)->local_if_set
= 0;
1578 XBUFFER_LOCAL_VALUE (newval
)->found_for_buffer
= 0;
1579 XBUFFER_LOCAL_VALUE (newval
)->found_for_frame
= 0;
1580 XBUFFER_LOCAL_VALUE (newval
)->check_frame
= 0;
1581 XBUFFER_LOCAL_VALUE (newval
)->cdr
= tem
;
1582 sym
->value
= newval
;
1584 /* Make sure this buffer has its own value of symbol. */
1585 XSETSYMBOL (variable
, sym
); /* Propagate variable indirections. */
1586 tem
= Fassq (variable
, current_buffer
->local_var_alist
);
1589 /* Swap out any local binding for some other buffer, and make
1590 sure the current value is permanently recorded, if it's the
1592 find_symbol_value (variable
);
1594 current_buffer
->local_var_alist
1595 = Fcons (Fcons (variable
, XCDR (XBUFFER_LOCAL_VALUE (sym
->value
)->cdr
)),
1596 current_buffer
->local_var_alist
);
1598 /* Make sure symbol does not think it is set up for this buffer;
1599 force it to look once again for this buffer's value. */
1601 Lisp_Object
*pvalbuf
;
1603 valcontents
= sym
->value
;
1605 pvalbuf
= &XBUFFER_LOCAL_VALUE (valcontents
)->buffer
;
1606 if (current_buffer
== XBUFFER (*pvalbuf
))
1608 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 0;
1612 /* If the symbol forwards into a C variable, then load the binding
1613 for this buffer now. If C code modifies the variable before we
1614 load the binding in, then that new value will clobber the default
1615 binding the next time we unload it. */
1616 valcontents
= XBUFFER_LOCAL_VALUE (sym
->value
)->realvalue
;
1617 if (INTFWDP (valcontents
) || BOOLFWDP (valcontents
) || OBJFWDP (valcontents
))
1618 swap_in_symval_forwarding (variable
, sym
->value
);
1623 DEFUN ("kill-local-variable", Fkill_local_variable
, Skill_local_variable
,
1624 1, 1, "vKill Local Variable: ",
1625 doc
: /* Make VARIABLE no longer have a separate value in the current buffer.
1626 From now on the default value will apply in this buffer. Return VARIABLE. */)
1628 register Lisp_Object variable
;
1630 register Lisp_Object tem
, valcontents
;
1631 struct Lisp_Symbol
*sym
;
1633 CHECK_SYMBOL (variable
);
1634 sym
= indirect_variable (XSYMBOL (variable
));
1636 valcontents
= sym
->value
;
1638 if (BUFFER_OBJFWDP (valcontents
))
1640 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1641 int idx
= PER_BUFFER_IDX (offset
);
1645 SET_PER_BUFFER_VALUE_P (current_buffer
, idx
, 0);
1646 PER_BUFFER_VALUE (current_buffer
, offset
)
1647 = PER_BUFFER_DEFAULT (offset
);
1652 if (!BUFFER_LOCAL_VALUEP (valcontents
))
1655 /* Get rid of this buffer's alist element, if any. */
1656 XSETSYMBOL (variable
, sym
); /* Propagate variable indirection. */
1657 tem
= Fassq (variable
, current_buffer
->local_var_alist
);
1659 current_buffer
->local_var_alist
1660 = Fdelq (tem
, current_buffer
->local_var_alist
);
1662 /* If the symbol is set up with the current buffer's binding
1663 loaded, recompute its value. We have to do it now, or else
1664 forwarded objects won't work right. */
1666 Lisp_Object
*pvalbuf
, buf
;
1667 valcontents
= sym
->value
;
1668 pvalbuf
= &XBUFFER_LOCAL_VALUE (valcontents
)->buffer
;
1669 XSETBUFFER (buf
, current_buffer
);
1670 if (EQ (buf
, *pvalbuf
))
1673 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 0;
1674 find_symbol_value (variable
);
1681 /* Lisp functions for creating and removing buffer-local variables. */
1683 /* Obsolete since 22.2. NB adjust doc of modify-frame-parameters
1684 when/if this is removed. */
1686 DEFUN ("make-variable-frame-local", Fmake_variable_frame_local
, Smake_variable_frame_local
,
1687 1, 1, "vMake Variable Frame Local: ",
1688 doc
: /* Enable VARIABLE to have frame-local bindings.
1689 This does not create any frame-local bindings for VARIABLE,
1690 it just makes them possible.
1692 A frame-local binding is actually a frame parameter value.
1693 If a frame F has a value for the frame parameter named VARIABLE,
1694 that also acts as a frame-local binding for VARIABLE in F--
1695 provided this function has been called to enable VARIABLE
1696 to have frame-local bindings at all.
1698 The only way to create a frame-local binding for VARIABLE in a frame
1699 is to set the VARIABLE frame parameter of that frame. See
1700 `modify-frame-parameters' for how to set frame parameters.
1702 Note that since Emacs 23.1, variables cannot be both buffer-local and
1703 frame-local any more (buffer-local bindings used to take precedence over
1704 frame-local bindings). */)
1706 register Lisp_Object variable
;
1708 register Lisp_Object tem
, valcontents
, newval
;
1709 struct Lisp_Symbol
*sym
;
1711 CHECK_SYMBOL (variable
);
1712 sym
= indirect_variable (XSYMBOL (variable
));
1714 valcontents
= sym
->value
;
1715 if (sym
->constant
|| KBOARD_OBJFWDP (valcontents
)
1716 || BUFFER_OBJFWDP (valcontents
))
1717 error ("Symbol %s may not be frame-local", SDATA (sym
->xname
));
1719 if (BUFFER_LOCAL_VALUEP (valcontents
))
1721 if (!XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
)
1722 error ("Symbol %s may not be frame-local", SDATA (sym
->xname
));
1726 if (EQ (valcontents
, Qunbound
))
1728 tem
= Fcons (Qnil
, Fsymbol_value (variable
));
1730 newval
= allocate_misc ();
1731 XMISCTYPE (newval
) = Lisp_Misc_Buffer_Local_Value
;
1732 XBUFFER_LOCAL_VALUE (newval
)->realvalue
= sym
->value
;
1733 XBUFFER_LOCAL_VALUE (newval
)->buffer
= Qnil
;
1734 XBUFFER_LOCAL_VALUE (newval
)->frame
= Qnil
;
1735 XBUFFER_LOCAL_VALUE (newval
)->local_if_set
= 0;
1736 XBUFFER_LOCAL_VALUE (newval
)->found_for_buffer
= 0;
1737 XBUFFER_LOCAL_VALUE (newval
)->found_for_frame
= 0;
1738 XBUFFER_LOCAL_VALUE (newval
)->check_frame
= 1;
1739 XBUFFER_LOCAL_VALUE (newval
)->cdr
= tem
;
1740 sym
->value
= newval
;
1744 DEFUN ("local-variable-p", Flocal_variable_p
, Slocal_variable_p
,
1746 doc
: /* Non-nil if VARIABLE has a local binding in buffer BUFFER.
1747 BUFFER defaults to the current buffer. */)
1749 register Lisp_Object variable
, buffer
;
1751 Lisp_Object valcontents
;
1752 register struct buffer
*buf
;
1753 struct Lisp_Symbol
*sym
;
1756 buf
= current_buffer
;
1759 CHECK_BUFFER (buffer
);
1760 buf
= XBUFFER (buffer
);
1763 CHECK_SYMBOL (variable
);
1764 sym
= indirect_variable (XSYMBOL (variable
));
1765 XSETSYMBOL (variable
, sym
);
1767 valcontents
= sym
->value
;
1768 if (BUFFER_LOCAL_VALUEP (valcontents
))
1770 Lisp_Object tail
, elt
;
1772 for (tail
= buf
->local_var_alist
; CONSP (tail
); tail
= XCDR (tail
))
1775 if (EQ (variable
, XCAR (elt
)))
1779 if (BUFFER_OBJFWDP (valcontents
))
1781 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1782 int idx
= PER_BUFFER_IDX (offset
);
1783 if (idx
== -1 || PER_BUFFER_VALUE_P (buf
, idx
))
1789 DEFUN ("local-variable-if-set-p", Flocal_variable_if_set_p
, Slocal_variable_if_set_p
,
1791 doc
: /* Non-nil if VARIABLE will be local in buffer BUFFER when set there.
1792 More precisely, this means that setting the variable \(with `set' or`setq'),
1793 while it does not have a `let'-style binding that was made in BUFFER,
1794 will produce a buffer local binding. See Info node
1795 `(elisp)Creating Buffer-Local'.
1796 BUFFER defaults to the current buffer. */)
1798 register Lisp_Object variable
, buffer
;
1800 Lisp_Object valcontents
;
1801 register struct buffer
*buf
;
1802 struct Lisp_Symbol
*sym
;
1805 buf
= current_buffer
;
1808 CHECK_BUFFER (buffer
);
1809 buf
= XBUFFER (buffer
);
1812 CHECK_SYMBOL (variable
);
1813 sym
= indirect_variable (XSYMBOL (variable
));
1814 XSETSYMBOL (variable
, sym
);
1816 valcontents
= sym
->value
;
1818 if (BUFFER_OBJFWDP (valcontents
))
1819 /* All these slots become local if they are set. */
1821 else if (BUFFER_LOCAL_VALUEP (valcontents
))
1823 Lisp_Object tail
, elt
;
1824 if (XBUFFER_LOCAL_VALUE (valcontents
)->local_if_set
)
1826 for (tail
= buf
->local_var_alist
; CONSP (tail
); tail
= XCDR (tail
))
1829 if (EQ (variable
, XCAR (elt
)))
1836 DEFUN ("variable-binding-locus", Fvariable_binding_locus
, Svariable_binding_locus
,
1838 doc
: /* Return a value indicating where VARIABLE's current binding comes from.
1839 If the current binding is buffer-local, the value is the current buffer.
1840 If the current binding is frame-local, the value is the selected frame.
1841 If the current binding is global (the default), the value is nil. */)
1843 register Lisp_Object variable
;
1845 Lisp_Object valcontents
;
1846 struct Lisp_Symbol
*sym
;
1848 CHECK_SYMBOL (variable
);
1849 sym
= indirect_variable (XSYMBOL (variable
));
1851 /* Make sure the current binding is actually swapped in. */
1852 find_symbol_value (variable
);
1854 valcontents
= sym
->value
;
1856 if (BUFFER_LOCAL_VALUEP (valcontents
)
1857 || BUFFER_OBJFWDP (valcontents
))
1859 /* For a local variable, record both the symbol and which
1860 buffer's or frame's value we are saving. */
1861 if (!NILP (Flocal_variable_p (variable
, Qnil
)))
1862 return Fcurrent_buffer ();
1863 else if (BUFFER_LOCAL_VALUEP (valcontents
)
1864 && XBUFFER_LOCAL_VALUE (valcontents
)->found_for_frame
)
1865 return XBUFFER_LOCAL_VALUE (valcontents
)->frame
;
1871 /* This code is disabled now that we use the selected frame to return
1872 keyboard-local-values. */
1874 extern struct terminal
*get_terminal
P_ ((Lisp_Object display
, int));
1876 DEFUN ("terminal-local-value", Fterminal_local_value
, Sterminal_local_value
, 2, 2, 0,
1877 doc
: /* Return the terminal-local value of SYMBOL on TERMINAL.
1878 If SYMBOL is not a terminal-local variable, then return its normal
1879 value, like `symbol-value'.
1881 TERMINAL may be a terminal id, a frame, or nil (meaning the
1882 selected frame's terminal device). */)
1885 Lisp_Object terminal
;
1888 struct terminal
*t
= get_terminal (terminal
, 1);
1889 push_kboard (t
->kboard
);
1890 result
= Fsymbol_value (symbol
);
1895 DEFUN ("set-terminal-local-value", Fset_terminal_local_value
, Sset_terminal_local_value
, 3, 3, 0,
1896 doc
: /* Set the terminal-local binding of SYMBOL on TERMINAL to VALUE.
1897 If VARIABLE is not a terminal-local variable, then set its normal
1898 binding, like `set'.
1900 TERMINAL may be a terminal id, a frame, or nil (meaning the
1901 selected frame's terminal device). */)
1902 (symbol
, terminal
, value
)
1904 Lisp_Object terminal
;
1908 struct terminal
*t
= get_terminal (terminal
, 1);
1909 push_kboard (d
->kboard
);
1910 result
= Fset (symbol
, value
);
1916 /* Find the function at the end of a chain of symbol function indirections. */
1918 /* If OBJECT is a symbol, find the end of its function chain and
1919 return the value found there. If OBJECT is not a symbol, just
1920 return it. If there is a cycle in the function chain, signal a
1921 cyclic-function-indirection error.
1923 This is like Findirect_function, except that it doesn't signal an
1924 error if the chain ends up unbound. */
1926 indirect_function (object
)
1927 register Lisp_Object object
;
1929 Lisp_Object tortoise
, hare
;
1931 hare
= tortoise
= object
;
1935 if (!SYMBOLP (hare
) || EQ (hare
, Qunbound
))
1937 hare
= XSYMBOL (hare
)->function
;
1938 if (!SYMBOLP (hare
) || EQ (hare
, Qunbound
))
1940 hare
= XSYMBOL (hare
)->function
;
1942 tortoise
= XSYMBOL (tortoise
)->function
;
1944 if (EQ (hare
, tortoise
))
1945 xsignal1 (Qcyclic_function_indirection
, object
);
1951 DEFUN ("indirect-function", Findirect_function
, Sindirect_function
, 1, 2, 0,
1952 doc
: /* Return the function at the end of OBJECT's function chain.
1953 If OBJECT is not a symbol, just return it. Otherwise, follow all
1954 function indirections to find the final function binding and return it.
1955 If the final symbol in the chain is unbound, signal a void-function error.
1956 Optional arg NOERROR non-nil means to return nil instead of signalling.
1957 Signal a cyclic-function-indirection error if there is a loop in the
1958 function chain of symbols. */)
1960 register Lisp_Object object
;
1961 Lisp_Object noerror
;
1965 /* Optimize for no indirection. */
1967 if (SYMBOLP (result
) && !EQ (result
, Qunbound
)
1968 && (result
= XSYMBOL (result
)->function
, SYMBOLP (result
)))
1969 result
= indirect_function (result
);
1970 if (!EQ (result
, Qunbound
))
1974 xsignal1 (Qvoid_function
, object
);
1979 /* Extract and set vector and string elements */
1981 DEFUN ("aref", Faref
, Saref
, 2, 2, 0,
1982 doc
: /* Return the element of ARRAY at index IDX.
1983 ARRAY may be a vector, a string, a char-table, a bool-vector,
1984 or a byte-code object. IDX starts at 0. */)
1986 register Lisp_Object array
;
1989 register int idxval
;
1992 idxval
= XINT (idx
);
1993 if (STRINGP (array
))
1997 if (idxval
< 0 || idxval
>= SCHARS (array
))
1998 args_out_of_range (array
, idx
);
1999 if (! STRING_MULTIBYTE (array
))
2000 return make_number ((unsigned char) SREF (array
, idxval
));
2001 idxval_byte
= string_char_to_byte (array
, idxval
);
2003 c
= STRING_CHAR (SDATA (array
) + idxval_byte
,
2004 SBYTES (array
) - idxval_byte
);
2005 return make_number (c
);
2007 else if (BOOL_VECTOR_P (array
))
2011 if (idxval
< 0 || idxval
>= XBOOL_VECTOR (array
)->size
)
2012 args_out_of_range (array
, idx
);
2014 val
= (unsigned char) XBOOL_VECTOR (array
)->data
[idxval
/ BOOL_VECTOR_BITS_PER_CHAR
];
2015 return (val
& (1 << (idxval
% BOOL_VECTOR_BITS_PER_CHAR
)) ? Qt
: Qnil
);
2017 else if (CHAR_TABLE_P (array
))
2019 CHECK_CHARACTER (idx
);
2020 return CHAR_TABLE_REF (array
, idxval
);
2025 if (VECTORP (array
))
2026 size
= XVECTOR (array
)->size
;
2027 else if (COMPILEDP (array
))
2028 size
= XVECTOR (array
)->size
& PSEUDOVECTOR_SIZE_MASK
;
2030 wrong_type_argument (Qarrayp
, array
);
2032 if (idxval
< 0 || idxval
>= size
)
2033 args_out_of_range (array
, idx
);
2034 return XVECTOR (array
)->contents
[idxval
];
2038 DEFUN ("aset", Faset
, Saset
, 3, 3, 0,
2039 doc
: /* Store into the element of ARRAY at index IDX the value NEWELT.
2040 Return NEWELT. ARRAY may be a vector, a string, a char-table or a
2041 bool-vector. IDX starts at 0. */)
2042 (array
, idx
, newelt
)
2043 register Lisp_Object array
;
2044 Lisp_Object idx
, newelt
;
2046 register int idxval
;
2049 idxval
= XINT (idx
);
2050 CHECK_ARRAY (array
, Qarrayp
);
2051 CHECK_IMPURE (array
);
2053 if (VECTORP (array
))
2055 if (idxval
< 0 || idxval
>= XVECTOR (array
)->size
)
2056 args_out_of_range (array
, idx
);
2057 XVECTOR (array
)->contents
[idxval
] = newelt
;
2059 else if (BOOL_VECTOR_P (array
))
2063 if (idxval
< 0 || idxval
>= XBOOL_VECTOR (array
)->size
)
2064 args_out_of_range (array
, idx
);
2066 val
= (unsigned char) XBOOL_VECTOR (array
)->data
[idxval
/ BOOL_VECTOR_BITS_PER_CHAR
];
2068 if (! NILP (newelt
))
2069 val
|= 1 << (idxval
% BOOL_VECTOR_BITS_PER_CHAR
);
2071 val
&= ~(1 << (idxval
% BOOL_VECTOR_BITS_PER_CHAR
));
2072 XBOOL_VECTOR (array
)->data
[idxval
/ BOOL_VECTOR_BITS_PER_CHAR
] = val
;
2074 else if (CHAR_TABLE_P (array
))
2076 CHECK_CHARACTER (idx
);
2077 CHAR_TABLE_SET (array
, idxval
, newelt
);
2079 else if (STRING_MULTIBYTE (array
))
2081 int idxval_byte
, prev_bytes
, new_bytes
, nbytes
;
2082 unsigned char workbuf
[MAX_MULTIBYTE_LENGTH
], *p0
= workbuf
, *p1
;
2084 if (idxval
< 0 || idxval
>= SCHARS (array
))
2085 args_out_of_range (array
, idx
);
2086 CHECK_CHARACTER (newelt
);
2088 nbytes
= SBYTES (array
);
2090 idxval_byte
= string_char_to_byte (array
, idxval
);
2091 p1
= SDATA (array
) + idxval_byte
;
2092 PARSE_MULTIBYTE_SEQ (p1
, nbytes
- idxval_byte
, prev_bytes
);
2093 new_bytes
= CHAR_STRING (XINT (newelt
), p0
);
2094 if (prev_bytes
!= new_bytes
)
2096 /* We must relocate the string data. */
2097 int nchars
= SCHARS (array
);
2101 SAFE_ALLOCA (str
, unsigned char *, nbytes
);
2102 bcopy (SDATA (array
), str
, nbytes
);
2103 allocate_string_data (XSTRING (array
), nchars
,
2104 nbytes
+ new_bytes
- prev_bytes
);
2105 bcopy (str
, SDATA (array
), idxval_byte
);
2106 p1
= SDATA (array
) + idxval_byte
;
2107 bcopy (str
+ idxval_byte
+ prev_bytes
, p1
+ new_bytes
,
2108 nbytes
- (idxval_byte
+ prev_bytes
));
2110 clear_string_char_byte_cache ();
2117 if (idxval
< 0 || idxval
>= SCHARS (array
))
2118 args_out_of_range (array
, idx
);
2119 CHECK_NUMBER (newelt
);
2121 if (XINT (newelt
) >= 0 && ! SINGLE_BYTE_CHAR_P (XINT (newelt
)))
2125 for (i
= SBYTES (array
) - 1; i
>= 0; i
--)
2126 if (SREF (array
, i
) >= 0x80)
2127 args_out_of_range (array
, newelt
);
2128 /* ARRAY is an ASCII string. Convert it to a multibyte
2129 string, and try `aset' again. */
2130 STRING_SET_MULTIBYTE (array
);
2131 return Faset (array
, idx
, newelt
);
2133 SSET (array
, idxval
, XINT (newelt
));
2139 /* Arithmetic functions */
2141 enum comparison
{ equal
, notequal
, less
, grtr
, less_or_equal
, grtr_or_equal
};
2144 arithcompare (num1
, num2
, comparison
)
2145 Lisp_Object num1
, num2
;
2146 enum comparison comparison
;
2148 double f1
= 0, f2
= 0;
2151 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num1
);
2152 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num2
);
2154 if (FLOATP (num1
) || FLOATP (num2
))
2157 f1
= (FLOATP (num1
)) ? XFLOAT_DATA (num1
) : XINT (num1
);
2158 f2
= (FLOATP (num2
)) ? XFLOAT_DATA (num2
) : XINT (num2
);
2164 if (floatp
? f1
== f2
: XINT (num1
) == XINT (num2
))
2169 if (floatp
? f1
!= f2
: XINT (num1
) != XINT (num2
))
2174 if (floatp
? f1
< f2
: XINT (num1
) < XINT (num2
))
2179 if (floatp
? f1
<= f2
: XINT (num1
) <= XINT (num2
))
2184 if (floatp
? f1
> f2
: XINT (num1
) > XINT (num2
))
2189 if (floatp
? f1
>= f2
: XINT (num1
) >= XINT (num2
))
2198 DEFUN ("=", Feqlsign
, Seqlsign
, 2, 2, 0,
2199 doc
: /* Return t if two args, both numbers or markers, are equal. */)
2201 register Lisp_Object num1
, num2
;
2203 return arithcompare (num1
, num2
, equal
);
2206 DEFUN ("<", Flss
, Slss
, 2, 2, 0,
2207 doc
: /* Return t if first arg is less than second arg. Both must be numbers or markers. */)
2209 register Lisp_Object num1
, num2
;
2211 return arithcompare (num1
, num2
, less
);
2214 DEFUN (">", Fgtr
, Sgtr
, 2, 2, 0,
2215 doc
: /* Return t if first arg is greater than second arg. Both must be numbers or markers. */)
2217 register Lisp_Object num1
, num2
;
2219 return arithcompare (num1
, num2
, grtr
);
2222 DEFUN ("<=", Fleq
, Sleq
, 2, 2, 0,
2223 doc
: /* Return t if first arg is less than or equal to second arg.
2224 Both must be numbers or markers. */)
2226 register Lisp_Object num1
, num2
;
2228 return arithcompare (num1
, num2
, less_or_equal
);
2231 DEFUN (">=", Fgeq
, Sgeq
, 2, 2, 0,
2232 doc
: /* Return t if first arg is greater than or equal to second arg.
2233 Both must be numbers or markers. */)
2235 register Lisp_Object num1
, num2
;
2237 return arithcompare (num1
, num2
, grtr_or_equal
);
2240 DEFUN ("/=", Fneq
, Sneq
, 2, 2, 0,
2241 doc
: /* Return t if first arg is not equal to second arg. Both must be numbers or markers. */)
2243 register Lisp_Object num1
, num2
;
2245 return arithcompare (num1
, num2
, notequal
);
2248 DEFUN ("zerop", Fzerop
, Szerop
, 1, 1, 0,
2249 doc
: /* Return t if NUMBER is zero. */)
2251 register Lisp_Object number
;
2253 CHECK_NUMBER_OR_FLOAT (number
);
2255 if (FLOATP (number
))
2257 if (XFLOAT_DATA (number
) == 0.0)
2267 /* Convert between long values and pairs of Lisp integers.
2268 Note that long_to_cons returns a single Lisp integer
2269 when the value fits in one. */
2275 unsigned long top
= i
>> 16;
2276 unsigned int bot
= i
& 0xFFFF;
2278 return make_number (bot
);
2279 if (top
== (unsigned long)-1 >> 16)
2280 return Fcons (make_number (-1), make_number (bot
));
2281 return Fcons (make_number (top
), make_number (bot
));
2288 Lisp_Object top
, bot
;
2295 return ((XINT (top
) << 16) | XINT (bot
));
2298 DEFUN ("number-to-string", Fnumber_to_string
, Snumber_to_string
, 1, 1, 0,
2299 doc
: /* Return the decimal representation of NUMBER as a string.
2300 Uses a minus sign if negative.
2301 NUMBER may be an integer or a floating point number. */)
2305 char buffer
[VALBITS
];
2307 CHECK_NUMBER_OR_FLOAT (number
);
2309 if (FLOATP (number
))
2311 char pigbuf
[350]; /* see comments in float_to_string */
2313 float_to_string (pigbuf
, XFLOAT_DATA (number
));
2314 return build_string (pigbuf
);
2317 if (sizeof (int) == sizeof (EMACS_INT
))
2318 sprintf (buffer
, "%d", (int) XINT (number
));
2319 else if (sizeof (long) == sizeof (EMACS_INT
))
2320 sprintf (buffer
, "%ld", (long) XINT (number
));
2323 return build_string (buffer
);
2327 digit_to_number (character
, base
)
2328 int character
, base
;
2332 if (character
>= '0' && character
<= '9')
2333 digit
= character
- '0';
2334 else if (character
>= 'a' && character
<= 'z')
2335 digit
= character
- 'a' + 10;
2336 else if (character
>= 'A' && character
<= 'Z')
2337 digit
= character
- 'A' + 10;
2347 DEFUN ("string-to-number", Fstring_to_number
, Sstring_to_number
, 1, 2, 0,
2348 doc
: /* Parse STRING as a decimal number and return the number.
2349 This parses both integers and floating point numbers.
2350 It ignores leading spaces and tabs.
2352 If BASE, interpret STRING as a number in that base. If BASE isn't
2353 present, base 10 is used. BASE must be between 2 and 16 (inclusive).
2354 If the base used is not 10, floating point is not recognized. */)
2356 register Lisp_Object string
, base
;
2358 register unsigned char *p
;
2363 CHECK_STRING (string
);
2369 CHECK_NUMBER (base
);
2371 if (b
< 2 || b
> 16)
2372 xsignal1 (Qargs_out_of_range
, base
);
2375 /* Skip any whitespace at the front of the number. Some versions of
2376 atoi do this anyway, so we might as well make Emacs lisp consistent. */
2378 while (*p
== ' ' || *p
== '\t')
2389 if (isfloat_string (p
) && b
== 10)
2390 val
= make_float (sign
* atof (p
));
2397 int digit
= digit_to_number (*p
++, b
);
2403 val
= make_fixnum_or_float (sign
* v
);
2423 static Lisp_Object float_arith_driver
P_ ((double, int, enum arithop
,
2424 int, Lisp_Object
*));
2425 extern Lisp_Object
fmod_float ();
2428 arith_driver (code
, nargs
, args
)
2431 register Lisp_Object
*args
;
2433 register Lisp_Object val
;
2434 register int argnum
;
2435 register EMACS_INT accum
= 0;
2436 register EMACS_INT next
;
2438 switch (SWITCH_ENUM_CAST (code
))
2456 for (argnum
= 0; argnum
< nargs
; argnum
++)
2458 /* Using args[argnum] as argument to CHECK_NUMBER_... */
2460 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val
);
2463 return float_arith_driver ((double) accum
, argnum
, code
,
2466 next
= XINT (args
[argnum
]);
2467 switch (SWITCH_ENUM_CAST (code
))
2473 accum
= argnum
? accum
- next
: nargs
== 1 ? - next
: next
;
2484 xsignal0 (Qarith_error
);
2498 if (!argnum
|| next
> accum
)
2502 if (!argnum
|| next
< accum
)
2508 XSETINT (val
, accum
);
2513 #define isnan(x) ((x) != (x))
2516 float_arith_driver (accum
, argnum
, code
, nargs
, args
)
2518 register int argnum
;
2521 register Lisp_Object
*args
;
2523 register Lisp_Object val
;
2526 for (; argnum
< nargs
; argnum
++)
2528 val
= args
[argnum
]; /* using args[argnum] as argument to CHECK_NUMBER_... */
2529 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val
);
2533 next
= XFLOAT_DATA (val
);
2537 args
[argnum
] = val
; /* runs into a compiler bug. */
2538 next
= XINT (args
[argnum
]);
2540 switch (SWITCH_ENUM_CAST (code
))
2546 accum
= argnum
? accum
- next
: nargs
== 1 ? - next
: next
;
2556 if (! IEEE_FLOATING_POINT
&& next
== 0)
2557 xsignal0 (Qarith_error
);
2564 return wrong_type_argument (Qinteger_or_marker_p
, val
);
2566 if (!argnum
|| isnan (next
) || next
> accum
)
2570 if (!argnum
|| isnan (next
) || next
< accum
)
2576 return make_float (accum
);
2580 DEFUN ("+", Fplus
, Splus
, 0, MANY
, 0,
2581 doc
: /* Return sum of any number of arguments, which are numbers or markers.
2582 usage: (+ &rest NUMBERS-OR-MARKERS) */)
2587 return arith_driver (Aadd
, nargs
, args
);
2590 DEFUN ("-", Fminus
, Sminus
, 0, MANY
, 0,
2591 doc
: /* Negate number or subtract numbers or markers and return the result.
2592 With one arg, negates it. With more than one arg,
2593 subtracts all but the first from the first.
2594 usage: (- &optional NUMBER-OR-MARKER &rest MORE-NUMBERS-OR-MARKERS) */)
2599 return arith_driver (Asub
, nargs
, args
);
2602 DEFUN ("*", Ftimes
, Stimes
, 0, MANY
, 0,
2603 doc
: /* Return product of any number of arguments, which are numbers or markers.
2604 usage: (* &rest NUMBERS-OR-MARKERS) */)
2609 return arith_driver (Amult
, nargs
, args
);
2612 DEFUN ("/", Fquo
, Squo
, 2, MANY
, 0,
2613 doc
: /* Return first argument divided by all the remaining arguments.
2614 The arguments must be numbers or markers.
2615 usage: (/ DIVIDEND DIVISOR &rest DIVISORS) */)
2621 for (argnum
= 2; argnum
< nargs
; argnum
++)
2622 if (FLOATP (args
[argnum
]))
2623 return float_arith_driver (0, 0, Adiv
, nargs
, args
);
2624 return arith_driver (Adiv
, nargs
, args
);
2627 DEFUN ("%", Frem
, Srem
, 2, 2, 0,
2628 doc
: /* Return remainder of X divided by Y.
2629 Both must be integers or markers. */)
2631 register Lisp_Object x
, y
;
2635 CHECK_NUMBER_COERCE_MARKER (x
);
2636 CHECK_NUMBER_COERCE_MARKER (y
);
2638 if (XFASTINT (y
) == 0)
2639 xsignal0 (Qarith_error
);
2641 XSETINT (val
, XINT (x
) % XINT (y
));
2655 /* If the magnitude of the result exceeds that of the divisor, or
2656 the sign of the result does not agree with that of the dividend,
2657 iterate with the reduced value. This does not yield a
2658 particularly accurate result, but at least it will be in the
2659 range promised by fmod. */
2661 r
-= f2
* floor (r
/ f2
);
2662 while (f2
<= (r
< 0 ? -r
: r
) || ((r
< 0) != (f1
< 0) && ! isnan (r
)));
2666 #endif /* ! HAVE_FMOD */
2668 DEFUN ("mod", Fmod
, Smod
, 2, 2, 0,
2669 doc
: /* Return X modulo Y.
2670 The result falls between zero (inclusive) and Y (exclusive).
2671 Both X and Y must be numbers or markers. */)
2673 register Lisp_Object x
, y
;
2678 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (x
);
2679 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (y
);
2681 if (FLOATP (x
) || FLOATP (y
))
2682 return fmod_float (x
, y
);
2688 xsignal0 (Qarith_error
);
2692 /* If the "remainder" comes out with the wrong sign, fix it. */
2693 if (i2
< 0 ? i1
> 0 : i1
< 0)
2700 DEFUN ("max", Fmax
, Smax
, 1, MANY
, 0,
2701 doc
: /* Return largest of all the arguments (which must be numbers or markers).
2702 The value is always a number; markers are converted to numbers.
2703 usage: (max NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */)
2708 return arith_driver (Amax
, nargs
, args
);
2711 DEFUN ("min", Fmin
, Smin
, 1, MANY
, 0,
2712 doc
: /* Return smallest of all the arguments (which must be numbers or markers).
2713 The value is always a number; markers are converted to numbers.
2714 usage: (min NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */)
2719 return arith_driver (Amin
, nargs
, args
);
2722 DEFUN ("logand", Flogand
, Slogand
, 0, MANY
, 0,
2723 doc
: /* Return bitwise-and of all the arguments.
2724 Arguments may be integers, or markers converted to integers.
2725 usage: (logand &rest INTS-OR-MARKERS) */)
2730 return arith_driver (Alogand
, nargs
, args
);
2733 DEFUN ("logior", Flogior
, Slogior
, 0, MANY
, 0,
2734 doc
: /* Return bitwise-or of all the arguments.
2735 Arguments may be integers, or markers converted to integers.
2736 usage: (logior &rest INTS-OR-MARKERS) */)
2741 return arith_driver (Alogior
, nargs
, args
);
2744 DEFUN ("logxor", Flogxor
, Slogxor
, 0, MANY
, 0,
2745 doc
: /* Return bitwise-exclusive-or of all the arguments.
2746 Arguments may be integers, or markers converted to integers.
2747 usage: (logxor &rest INTS-OR-MARKERS) */)
2752 return arith_driver (Alogxor
, nargs
, args
);
2755 DEFUN ("ash", Fash
, Sash
, 2, 2, 0,
2756 doc
: /* Return VALUE with its bits shifted left by COUNT.
2757 If COUNT is negative, shifting is actually to the right.
2758 In this case, the sign bit is duplicated. */)
2760 register Lisp_Object value
, count
;
2762 register Lisp_Object val
;
2764 CHECK_NUMBER (value
);
2765 CHECK_NUMBER (count
);
2767 if (XINT (count
) >= BITS_PER_EMACS_INT
)
2769 else if (XINT (count
) > 0)
2770 XSETINT (val
, XINT (value
) << XFASTINT (count
));
2771 else if (XINT (count
) <= -BITS_PER_EMACS_INT
)
2772 XSETINT (val
, XINT (value
) < 0 ? -1 : 0);
2774 XSETINT (val
, XINT (value
) >> -XINT (count
));
2778 DEFUN ("lsh", Flsh
, Slsh
, 2, 2, 0,
2779 doc
: /* Return VALUE with its bits shifted left by COUNT.
2780 If COUNT is negative, shifting is actually to the right.
2781 In this case, zeros are shifted in on the left. */)
2783 register Lisp_Object value
, count
;
2785 register Lisp_Object val
;
2787 CHECK_NUMBER (value
);
2788 CHECK_NUMBER (count
);
2790 if (XINT (count
) >= BITS_PER_EMACS_INT
)
2792 else if (XINT (count
) > 0)
2793 XSETINT (val
, (EMACS_UINT
) XUINT (value
) << XFASTINT (count
));
2794 else if (XINT (count
) <= -BITS_PER_EMACS_INT
)
2797 XSETINT (val
, (EMACS_UINT
) XUINT (value
) >> -XINT (count
));
2801 DEFUN ("1+", Fadd1
, Sadd1
, 1, 1, 0,
2802 doc
: /* Return NUMBER plus one. NUMBER may be a number or a marker.
2803 Markers are converted to integers. */)
2805 register Lisp_Object number
;
2807 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number
);
2809 if (FLOATP (number
))
2810 return (make_float (1.0 + XFLOAT_DATA (number
)));
2812 XSETINT (number
, XINT (number
) + 1);
2816 DEFUN ("1-", Fsub1
, Ssub1
, 1, 1, 0,
2817 doc
: /* Return NUMBER minus one. NUMBER may be a number or a marker.
2818 Markers are converted to integers. */)
2820 register Lisp_Object number
;
2822 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number
);
2824 if (FLOATP (number
))
2825 return (make_float (-1.0 + XFLOAT_DATA (number
)));
2827 XSETINT (number
, XINT (number
) - 1);
2831 DEFUN ("lognot", Flognot
, Slognot
, 1, 1, 0,
2832 doc
: /* Return the bitwise complement of NUMBER. NUMBER must be an integer. */)
2834 register Lisp_Object number
;
2836 CHECK_NUMBER (number
);
2837 XSETINT (number
, ~XINT (number
));
2841 DEFUN ("byteorder", Fbyteorder
, Sbyteorder
, 0, 0, 0,
2842 doc
: /* Return the byteorder for the machine.
2843 Returns 66 (ASCII uppercase B) for big endian machines or 108 (ASCII
2844 lowercase l) for small endian machines. */)
2847 unsigned i
= 0x04030201;
2848 int order
= *(char *)&i
== 1 ? 108 : 66;
2850 return make_number (order
);
2858 Lisp_Object error_tail
, arith_tail
;
2860 Qquote
= intern ("quote");
2861 Qlambda
= intern ("lambda");
2862 Qsubr
= intern ("subr");
2863 Qerror_conditions
= intern ("error-conditions");
2864 Qerror_message
= intern ("error-message");
2865 Qtop_level
= intern ("top-level");
2867 Qerror
= intern ("error");
2868 Qquit
= intern ("quit");
2869 Qwrong_type_argument
= intern ("wrong-type-argument");
2870 Qargs_out_of_range
= intern ("args-out-of-range");
2871 Qvoid_function
= intern ("void-function");
2872 Qcyclic_function_indirection
= intern ("cyclic-function-indirection");
2873 Qcyclic_variable_indirection
= intern ("cyclic-variable-indirection");
2874 Qvoid_variable
= intern ("void-variable");
2875 Qsetting_constant
= intern ("setting-constant");
2876 Qinvalid_read_syntax
= intern ("invalid-read-syntax");
2878 Qinvalid_function
= intern ("invalid-function");
2879 Qwrong_number_of_arguments
= intern ("wrong-number-of-arguments");
2880 Qno_catch
= intern ("no-catch");
2881 Qend_of_file
= intern ("end-of-file");
2882 Qarith_error
= intern ("arith-error");
2883 Qbeginning_of_buffer
= intern ("beginning-of-buffer");
2884 Qend_of_buffer
= intern ("end-of-buffer");
2885 Qbuffer_read_only
= intern ("buffer-read-only");
2886 Qtext_read_only
= intern ("text-read-only");
2887 Qmark_inactive
= intern ("mark-inactive");
2889 Qlistp
= intern ("listp");
2890 Qconsp
= intern ("consp");
2891 Qsymbolp
= intern ("symbolp");
2892 Qkeywordp
= intern ("keywordp");
2893 Qintegerp
= intern ("integerp");
2894 Qnatnump
= intern ("natnump");
2895 Qwholenump
= intern ("wholenump");
2896 Qstringp
= intern ("stringp");
2897 Qarrayp
= intern ("arrayp");
2898 Qsequencep
= intern ("sequencep");
2899 Qbufferp
= intern ("bufferp");
2900 Qvectorp
= intern ("vectorp");
2901 Qchar_or_string_p
= intern ("char-or-string-p");
2902 Qmarkerp
= intern ("markerp");
2903 Qbuffer_or_string_p
= intern ("buffer-or-string-p");
2904 Qinteger_or_marker_p
= intern ("integer-or-marker-p");
2905 Qboundp
= intern ("boundp");
2906 Qfboundp
= intern ("fboundp");
2908 Qfloatp
= intern ("floatp");
2909 Qnumberp
= intern ("numberp");
2910 Qnumber_or_marker_p
= intern ("number-or-marker-p");
2912 Qchar_table_p
= intern ("char-table-p");
2913 Qvector_or_char_table_p
= intern ("vector-or-char-table-p");
2915 Qsubrp
= intern ("subrp");
2916 Qunevalled
= intern ("unevalled");
2917 Qmany
= intern ("many");
2919 Qcdr
= intern ("cdr");
2921 /* Handle automatic advice activation */
2922 Qad_advice_info
= intern ("ad-advice-info");
2923 Qad_activate_internal
= intern ("ad-activate-internal");
2925 error_tail
= Fcons (Qerror
, Qnil
);
2927 /* ERROR is used as a signaler for random errors for which nothing else is right */
2929 Fput (Qerror
, Qerror_conditions
,
2931 Fput (Qerror
, Qerror_message
,
2932 build_string ("error"));
2934 Fput (Qquit
, Qerror_conditions
,
2935 Fcons (Qquit
, Qnil
));
2936 Fput (Qquit
, Qerror_message
,
2937 build_string ("Quit"));
2939 Fput (Qwrong_type_argument
, Qerror_conditions
,
2940 Fcons (Qwrong_type_argument
, error_tail
));
2941 Fput (Qwrong_type_argument
, Qerror_message
,
2942 build_string ("Wrong type argument"));
2944 Fput (Qargs_out_of_range
, Qerror_conditions
,
2945 Fcons (Qargs_out_of_range
, error_tail
));
2946 Fput (Qargs_out_of_range
, Qerror_message
,
2947 build_string ("Args out of range"));
2949 Fput (Qvoid_function
, Qerror_conditions
,
2950 Fcons (Qvoid_function
, error_tail
));
2951 Fput (Qvoid_function
, Qerror_message
,
2952 build_string ("Symbol's function definition is void"));
2954 Fput (Qcyclic_function_indirection
, Qerror_conditions
,
2955 Fcons (Qcyclic_function_indirection
, error_tail
));
2956 Fput (Qcyclic_function_indirection
, Qerror_message
,
2957 build_string ("Symbol's chain of function indirections contains a loop"));
2959 Fput (Qcyclic_variable_indirection
, Qerror_conditions
,
2960 Fcons (Qcyclic_variable_indirection
, error_tail
));
2961 Fput (Qcyclic_variable_indirection
, Qerror_message
,
2962 build_string ("Symbol's chain of variable indirections contains a loop"));
2964 Qcircular_list
= intern ("circular-list");
2965 staticpro (&Qcircular_list
);
2966 Fput (Qcircular_list
, Qerror_conditions
,
2967 Fcons (Qcircular_list
, error_tail
));
2968 Fput (Qcircular_list
, Qerror_message
,
2969 build_string ("List contains a loop"));
2971 Fput (Qvoid_variable
, Qerror_conditions
,
2972 Fcons (Qvoid_variable
, error_tail
));
2973 Fput (Qvoid_variable
, Qerror_message
,
2974 build_string ("Symbol's value as variable is void"));
2976 Fput (Qsetting_constant
, Qerror_conditions
,
2977 Fcons (Qsetting_constant
, error_tail
));
2978 Fput (Qsetting_constant
, Qerror_message
,
2979 build_string ("Attempt to set a constant symbol"));
2981 Fput (Qinvalid_read_syntax
, Qerror_conditions
,
2982 Fcons (Qinvalid_read_syntax
, error_tail
));
2983 Fput (Qinvalid_read_syntax
, Qerror_message
,
2984 build_string ("Invalid read syntax"));
2986 Fput (Qinvalid_function
, Qerror_conditions
,
2987 Fcons (Qinvalid_function
, error_tail
));
2988 Fput (Qinvalid_function
, Qerror_message
,
2989 build_string ("Invalid function"));
2991 Fput (Qwrong_number_of_arguments
, Qerror_conditions
,
2992 Fcons (Qwrong_number_of_arguments
, error_tail
));
2993 Fput (Qwrong_number_of_arguments
, Qerror_message
,
2994 build_string ("Wrong number of arguments"));
2996 Fput (Qno_catch
, Qerror_conditions
,
2997 Fcons (Qno_catch
, error_tail
));
2998 Fput (Qno_catch
, Qerror_message
,
2999 build_string ("No catch for tag"));
3001 Fput (Qend_of_file
, Qerror_conditions
,
3002 Fcons (Qend_of_file
, error_tail
));
3003 Fput (Qend_of_file
, Qerror_message
,
3004 build_string ("End of file during parsing"));
3006 arith_tail
= Fcons (Qarith_error
, error_tail
);
3007 Fput (Qarith_error
, Qerror_conditions
,
3009 Fput (Qarith_error
, Qerror_message
,
3010 build_string ("Arithmetic error"));
3012 Fput (Qbeginning_of_buffer
, Qerror_conditions
,
3013 Fcons (Qbeginning_of_buffer
, error_tail
));
3014 Fput (Qbeginning_of_buffer
, Qerror_message
,
3015 build_string ("Beginning of buffer"));
3017 Fput (Qend_of_buffer
, Qerror_conditions
,
3018 Fcons (Qend_of_buffer
, error_tail
));
3019 Fput (Qend_of_buffer
, Qerror_message
,
3020 build_string ("End of buffer"));
3022 Fput (Qbuffer_read_only
, Qerror_conditions
,
3023 Fcons (Qbuffer_read_only
, error_tail
));
3024 Fput (Qbuffer_read_only
, Qerror_message
,
3025 build_string ("Buffer is read-only"));
3027 Fput (Qtext_read_only
, Qerror_conditions
,
3028 Fcons (Qtext_read_only
, error_tail
));
3029 Fput (Qtext_read_only
, Qerror_message
,
3030 build_string ("Text is read-only"));
3032 Qrange_error
= intern ("range-error");
3033 Qdomain_error
= intern ("domain-error");
3034 Qsingularity_error
= intern ("singularity-error");
3035 Qoverflow_error
= intern ("overflow-error");
3036 Qunderflow_error
= intern ("underflow-error");
3038 Fput (Qdomain_error
, Qerror_conditions
,
3039 Fcons (Qdomain_error
, arith_tail
));
3040 Fput (Qdomain_error
, Qerror_message
,
3041 build_string ("Arithmetic domain error"));
3043 Fput (Qrange_error
, Qerror_conditions
,
3044 Fcons (Qrange_error
, arith_tail
));
3045 Fput (Qrange_error
, Qerror_message
,
3046 build_string ("Arithmetic range error"));
3048 Fput (Qsingularity_error
, Qerror_conditions
,
3049 Fcons (Qsingularity_error
, Fcons (Qdomain_error
, arith_tail
)));
3050 Fput (Qsingularity_error
, Qerror_message
,
3051 build_string ("Arithmetic singularity error"));
3053 Fput (Qoverflow_error
, Qerror_conditions
,
3054 Fcons (Qoverflow_error
, Fcons (Qdomain_error
, arith_tail
)));
3055 Fput (Qoverflow_error
, Qerror_message
,
3056 build_string ("Arithmetic overflow error"));
3058 Fput (Qunderflow_error
, Qerror_conditions
,
3059 Fcons (Qunderflow_error
, Fcons (Qdomain_error
, arith_tail
)));
3060 Fput (Qunderflow_error
, Qerror_message
,
3061 build_string ("Arithmetic underflow error"));
3063 staticpro (&Qrange_error
);
3064 staticpro (&Qdomain_error
);
3065 staticpro (&Qsingularity_error
);
3066 staticpro (&Qoverflow_error
);
3067 staticpro (&Qunderflow_error
);
3071 staticpro (&Qquote
);
3072 staticpro (&Qlambda
);
3074 staticpro (&Qunbound
);
3075 staticpro (&Qerror_conditions
);
3076 staticpro (&Qerror_message
);
3077 staticpro (&Qtop_level
);
3079 staticpro (&Qerror
);
3081 staticpro (&Qwrong_type_argument
);
3082 staticpro (&Qargs_out_of_range
);
3083 staticpro (&Qvoid_function
);
3084 staticpro (&Qcyclic_function_indirection
);
3085 staticpro (&Qcyclic_variable_indirection
);
3086 staticpro (&Qvoid_variable
);
3087 staticpro (&Qsetting_constant
);
3088 staticpro (&Qinvalid_read_syntax
);
3089 staticpro (&Qwrong_number_of_arguments
);
3090 staticpro (&Qinvalid_function
);
3091 staticpro (&Qno_catch
);
3092 staticpro (&Qend_of_file
);
3093 staticpro (&Qarith_error
);
3094 staticpro (&Qbeginning_of_buffer
);
3095 staticpro (&Qend_of_buffer
);
3096 staticpro (&Qbuffer_read_only
);
3097 staticpro (&Qtext_read_only
);
3098 staticpro (&Qmark_inactive
);
3100 staticpro (&Qlistp
);
3101 staticpro (&Qconsp
);
3102 staticpro (&Qsymbolp
);
3103 staticpro (&Qkeywordp
);
3104 staticpro (&Qintegerp
);
3105 staticpro (&Qnatnump
);
3106 staticpro (&Qwholenump
);
3107 staticpro (&Qstringp
);
3108 staticpro (&Qarrayp
);
3109 staticpro (&Qsequencep
);
3110 staticpro (&Qbufferp
);
3111 staticpro (&Qvectorp
);
3112 staticpro (&Qchar_or_string_p
);
3113 staticpro (&Qmarkerp
);
3114 staticpro (&Qbuffer_or_string_p
);
3115 staticpro (&Qinteger_or_marker_p
);
3116 staticpro (&Qfloatp
);
3117 staticpro (&Qnumberp
);
3118 staticpro (&Qnumber_or_marker_p
);
3119 staticpro (&Qchar_table_p
);
3120 staticpro (&Qvector_or_char_table_p
);
3121 staticpro (&Qsubrp
);
3123 staticpro (&Qunevalled
);
3125 staticpro (&Qboundp
);
3126 staticpro (&Qfboundp
);
3128 staticpro (&Qad_advice_info
);
3129 staticpro (&Qad_activate_internal
);
3131 /* Types that type-of returns. */
3132 Qinteger
= intern ("integer");
3133 Qsymbol
= intern ("symbol");
3134 Qstring
= intern ("string");
3135 Qcons
= intern ("cons");
3136 Qmarker
= intern ("marker");
3137 Qoverlay
= intern ("overlay");
3138 Qfloat
= intern ("float");
3139 Qwindow_configuration
= intern ("window-configuration");
3140 Qprocess
= intern ("process");
3141 Qwindow
= intern ("window");
3142 /* Qsubr = intern ("subr"); */
3143 Qcompiled_function
= intern ("compiled-function");
3144 Qbuffer
= intern ("buffer");
3145 Qframe
= intern ("frame");
3146 Qvector
= intern ("vector");
3147 Qchar_table
= intern ("char-table");
3148 Qbool_vector
= intern ("bool-vector");
3149 Qhash_table
= intern ("hash-table");
3151 DEFSYM (Qfont_spec
, "font-spec");
3152 DEFSYM (Qfont_entity
, "font-entity");
3153 DEFSYM (Qfont_object
, "font-object");
3155 staticpro (&Qinteger
);
3156 staticpro (&Qsymbol
);
3157 staticpro (&Qstring
);
3159 staticpro (&Qmarker
);
3160 staticpro (&Qoverlay
);
3161 staticpro (&Qfloat
);
3162 staticpro (&Qwindow_configuration
);
3163 staticpro (&Qprocess
);
3164 staticpro (&Qwindow
);
3165 /* staticpro (&Qsubr); */
3166 staticpro (&Qcompiled_function
);
3167 staticpro (&Qbuffer
);
3168 staticpro (&Qframe
);
3169 staticpro (&Qvector
);
3170 staticpro (&Qchar_table
);
3171 staticpro (&Qbool_vector
);
3172 staticpro (&Qhash_table
);
3174 defsubr (&Sindirect_variable
);
3175 defsubr (&Sinteractive_form
);
3178 defsubr (&Stype_of
);
3183 defsubr (&Sintegerp
);
3184 defsubr (&Sinteger_or_marker_p
);
3185 defsubr (&Snumberp
);
3186 defsubr (&Snumber_or_marker_p
);
3188 defsubr (&Snatnump
);
3189 defsubr (&Ssymbolp
);
3190 defsubr (&Skeywordp
);
3191 defsubr (&Sstringp
);
3192 defsubr (&Smultibyte_string_p
);
3193 defsubr (&Svectorp
);
3194 defsubr (&Schar_table_p
);
3195 defsubr (&Svector_or_char_table_p
);
3196 defsubr (&Sbool_vector_p
);
3198 defsubr (&Ssequencep
);
3199 defsubr (&Sbufferp
);
3200 defsubr (&Smarkerp
);
3202 defsubr (&Sbyte_code_function_p
);
3203 defsubr (&Schar_or_string_p
);
3206 defsubr (&Scar_safe
);
3207 defsubr (&Scdr_safe
);
3210 defsubr (&Ssymbol_function
);
3211 defsubr (&Sindirect_function
);
3212 defsubr (&Ssymbol_plist
);
3213 defsubr (&Ssymbol_name
);
3214 defsubr (&Smakunbound
);
3215 defsubr (&Sfmakunbound
);
3217 defsubr (&Sfboundp
);
3219 defsubr (&Sdefalias
);
3220 defsubr (&Ssetplist
);
3221 defsubr (&Ssymbol_value
);
3223 defsubr (&Sdefault_boundp
);
3224 defsubr (&Sdefault_value
);
3225 defsubr (&Sset_default
);
3226 defsubr (&Ssetq_default
);
3227 defsubr (&Smake_variable_buffer_local
);
3228 defsubr (&Smake_local_variable
);
3229 defsubr (&Skill_local_variable
);
3230 defsubr (&Smake_variable_frame_local
);
3231 defsubr (&Slocal_variable_p
);
3232 defsubr (&Slocal_variable_if_set_p
);
3233 defsubr (&Svariable_binding_locus
);
3234 #if 0 /* XXX Remove this. --lorentey */
3235 defsubr (&Sterminal_local_value
);
3236 defsubr (&Sset_terminal_local_value
);
3240 defsubr (&Snumber_to_string
);
3241 defsubr (&Sstring_to_number
);
3242 defsubr (&Seqlsign
);
3265 defsubr (&Sbyteorder
);
3266 defsubr (&Ssubr_arity
);
3267 defsubr (&Ssubr_name
);
3269 XSYMBOL (Qwholenump
)->function
= XSYMBOL (Qnatnump
)->function
;
3271 DEFVAR_LISP ("most-positive-fixnum", &Vmost_positive_fixnum
,
3272 doc
: /* The largest value that is representable in a Lisp integer. */);
3273 Vmost_positive_fixnum
= make_number (MOST_POSITIVE_FIXNUM
);
3274 XSYMBOL (intern ("most-positive-fixnum"))->constant
= 1;
3276 DEFVAR_LISP ("most-negative-fixnum", &Vmost_negative_fixnum
,
3277 doc
: /* The smallest value that is representable in a Lisp integer. */);
3278 Vmost_negative_fixnum
= make_number (MOST_NEGATIVE_FIXNUM
);
3279 XSYMBOL (intern ("most-negative-fixnum"))->constant
= 1;
3286 #if defined(USG) && !defined(POSIX_SIGNALS)
3287 /* USG systems forget handlers when they are used;
3288 must reestablish each time */
3289 signal (signo
, arith_error
);
3291 sigsetmask (SIGEMPTYMASK
);
3293 SIGNAL_THREAD_CHECK (signo
);
3294 xsignal0 (Qarith_error
);
3300 /* Don't do this if just dumping out.
3301 We don't want to call `signal' in this case
3302 so that we don't have trouble with dumping
3303 signal-delivering routines in an inconsistent state. */
3307 #endif /* CANNOT_DUMP */
3308 signal (SIGFPE
, arith_error
);
3311 signal (SIGEMT
, arith_error
);
3315 /* arch-tag: 25879798-b84d-479a-9c89-7d148e2109f7
3316 (do not change this comment) */