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
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. */
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
;
75 Lisp_Object Qintegerp
, Qnatnump
, Qwholenump
, Qsymbolp
, Qlistp
, Qconsp
;
76 Lisp_Object Qstringp
, Qarrayp
, Qsequencep
, Qbufferp
;
77 Lisp_Object Qchar_or_string_p
, Qmarkerp
, Qinteger_or_marker_p
, Qvectorp
;
78 Lisp_Object Qbuffer_or_string_p
, Qkeywordp
;
79 Lisp_Object Qboundp
, Qfboundp
;
80 Lisp_Object Qchar_table_p
, Qvector_or_char_table_p
;
83 Lisp_Object Qad_advice_info
, Qad_activate_internal
;
85 Lisp_Object Qrange_error
, Qdomain_error
, Qsingularity_error
;
86 Lisp_Object Qoverflow_error
, Qunderflow_error
;
89 Lisp_Object Qnumberp
, Qnumber_or_marker_p
;
92 static Lisp_Object Qsymbol
, Qstring
, Qcons
, Qmarker
, Qoverlay
;
93 static Lisp_Object Qfloat
, Qwindow_configuration
, Qwindow
;
95 static Lisp_Object Qcompiled_function
, Qbuffer
, Qframe
, Qvector
;
96 static Lisp_Object Qchar_table
, Qbool_vector
, Qhash_table
;
97 static Lisp_Object Qsubrp
, Qmany
, Qunevalled
;
99 static Lisp_Object swap_in_symval_forwarding
P_ ((Lisp_Object
, Lisp_Object
));
101 Lisp_Object Vmost_positive_fixnum
, Vmost_negative_fixnum
;
105 circular_list_error (list
)
108 xsignal (Qcircular_list
, list
);
113 wrong_type_argument (predicate
, value
)
114 register Lisp_Object predicate
, value
;
116 /* If VALUE is not even a valid Lisp object, abort here
117 where we can get a backtrace showing where it came from. */
118 if ((unsigned int) XTYPE (value
) >= Lisp_Type_Limit
)
121 xsignal2 (Qwrong_type_argument
, predicate
, value
);
127 error ("Attempt to modify read-only object");
131 args_out_of_range (a1
, a2
)
134 xsignal2 (Qargs_out_of_range
, a1
, a2
);
138 args_out_of_range_3 (a1
, a2
, a3
)
139 Lisp_Object a1
, a2
, a3
;
141 xsignal3 (Qargs_out_of_range
, a1
, a2
, a3
);
144 /* On some machines, XINT needs a temporary location.
145 Here it is, in case it is needed. */
147 int sign_extend_temp
;
149 /* On a few machines, XINT can only be done by calling this. */
152 sign_extend_lisp_int (num
)
155 if (num
& (((EMACS_INT
) 1) << (VALBITS
- 1)))
156 return num
| (((EMACS_INT
) (-1)) << VALBITS
);
158 return num
& ((((EMACS_INT
) 1) << VALBITS
) - 1);
161 /* Data type predicates */
163 DEFUN ("eq", Feq
, Seq
, 2, 2, 0,
164 doc
: /* Return t if the two args are the same Lisp object. */)
166 Lisp_Object obj1
, obj2
;
173 DEFUN ("null", Fnull
, Snull
, 1, 1, 0,
174 doc
: /* Return t if OBJECT is nil. */)
183 DEFUN ("type-of", Ftype_of
, Stype_of
, 1, 1, 0,
184 doc
: /* Return a symbol representing the type of OBJECT.
185 The symbol returned names the object's basic type;
186 for example, (type-of 1) returns `integer'. */)
190 switch (XTYPE (object
))
205 switch (XMISCTYPE (object
))
207 case Lisp_Misc_Marker
:
209 case Lisp_Misc_Overlay
:
211 case Lisp_Misc_Float
:
216 case Lisp_Vectorlike
:
217 if (WINDOW_CONFIGURATIONP (object
))
218 return Qwindow_configuration
;
219 if (PROCESSP (object
))
221 if (WINDOWP (object
))
225 if (COMPILEDP (object
))
226 return Qcompiled_function
;
227 if (BUFFERP (object
))
229 if (CHAR_TABLE_P (object
))
231 if (BOOL_VECTOR_P (object
))
235 if (HASH_TABLE_P (object
))
247 DEFUN ("consp", Fconsp
, Sconsp
, 1, 1, 0,
248 doc
: /* Return t if OBJECT is a cons cell. */)
257 DEFUN ("atom", Fatom
, Satom
, 1, 1, 0,
258 doc
: /* Return t if OBJECT is not a cons cell. This includes nil. */)
267 DEFUN ("listp", Flistp
, Slistp
, 1, 1, 0,
268 doc
: /* Return t if OBJECT is a list, that is, a cons cell or nil.
269 Otherwise, return nil. */)
273 if (CONSP (object
) || NILP (object
))
278 DEFUN ("nlistp", Fnlistp
, Snlistp
, 1, 1, 0,
279 doc
: /* Return t if OBJECT is not a list. Lists include nil. */)
283 if (CONSP (object
) || NILP (object
))
288 DEFUN ("symbolp", Fsymbolp
, Ssymbolp
, 1, 1, 0,
289 doc
: /* Return t if OBJECT is a symbol. */)
293 if (SYMBOLP (object
))
298 /* Define this in C to avoid unnecessarily consing up the symbol
300 DEFUN ("keywordp", Fkeywordp
, Skeywordp
, 1, 1, 0,
301 doc
: /* Return t if OBJECT is a keyword.
302 This means that it is a symbol with a print name beginning with `:'
303 interned in the initial obarray. */)
308 && SREF (SYMBOL_NAME (object
), 0) == ':'
309 && SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P (object
))
314 DEFUN ("vectorp", Fvectorp
, Svectorp
, 1, 1, 0,
315 doc
: /* Return t if OBJECT is a vector. */)
319 if (VECTORP (object
))
324 DEFUN ("stringp", Fstringp
, Sstringp
, 1, 1, 0,
325 doc
: /* Return t if OBJECT is a string. */)
329 if (STRINGP (object
))
334 DEFUN ("multibyte-string-p", Fmultibyte_string_p
, Smultibyte_string_p
,
336 doc
: /* Return t if OBJECT is a multibyte string. */)
340 if (STRINGP (object
) && STRING_MULTIBYTE (object
))
345 DEFUN ("char-table-p", Fchar_table_p
, Schar_table_p
, 1, 1, 0,
346 doc
: /* Return t if OBJECT is a char-table. */)
350 if (CHAR_TABLE_P (object
))
355 DEFUN ("vector-or-char-table-p", Fvector_or_char_table_p
,
356 Svector_or_char_table_p
, 1, 1, 0,
357 doc
: /* Return t if OBJECT is a char-table or vector. */)
361 if (VECTORP (object
) || CHAR_TABLE_P (object
))
366 DEFUN ("bool-vector-p", Fbool_vector_p
, Sbool_vector_p
, 1, 1, 0,
367 doc
: /* Return t if OBJECT is a bool-vector. */)
371 if (BOOL_VECTOR_P (object
))
376 DEFUN ("arrayp", Farrayp
, Sarrayp
, 1, 1, 0,
377 doc
: /* Return t if OBJECT is an array (string or vector). */)
386 DEFUN ("sequencep", Fsequencep
, Ssequencep
, 1, 1, 0,
387 doc
: /* Return t if OBJECT is a sequence (list or array). */)
389 register Lisp_Object object
;
391 if (CONSP (object
) || NILP (object
) || ARRAYP (object
))
396 DEFUN ("bufferp", Fbufferp
, Sbufferp
, 1, 1, 0,
397 doc
: /* Return t if OBJECT is an editor buffer. */)
401 if (BUFFERP (object
))
406 DEFUN ("markerp", Fmarkerp
, Smarkerp
, 1, 1, 0,
407 doc
: /* Return t if OBJECT is a marker (editor pointer). */)
411 if (MARKERP (object
))
416 DEFUN ("subrp", Fsubrp
, Ssubrp
, 1, 1, 0,
417 doc
: /* Return t if OBJECT is a built-in function. */)
426 DEFUN ("byte-code-function-p", Fbyte_code_function_p
, Sbyte_code_function_p
,
428 doc
: /* Return t if OBJECT is a byte-compiled function object. */)
432 if (COMPILEDP (object
))
437 DEFUN ("char-or-string-p", Fchar_or_string_p
, Schar_or_string_p
, 1, 1, 0,
438 doc
: /* Return t if OBJECT is a character or a string. */)
440 register Lisp_Object object
;
442 if (CHARACTERP (object
) || STRINGP (object
))
447 DEFUN ("integerp", Fintegerp
, Sintegerp
, 1, 1, 0,
448 doc
: /* Return t if OBJECT is an integer. */)
452 if (INTEGERP (object
))
457 DEFUN ("integer-or-marker-p", Finteger_or_marker_p
, Sinteger_or_marker_p
, 1, 1, 0,
458 doc
: /* Return t if OBJECT is an integer or a marker (editor pointer). */)
460 register Lisp_Object object
;
462 if (MARKERP (object
) || INTEGERP (object
))
467 DEFUN ("natnump", Fnatnump
, Snatnump
, 1, 1, 0,
468 doc
: /* Return t if OBJECT is a nonnegative integer. */)
472 if (NATNUMP (object
))
477 DEFUN ("numberp", Fnumberp
, Snumberp
, 1, 1, 0,
478 doc
: /* Return t if OBJECT is a number (floating point or integer). */)
482 if (NUMBERP (object
))
488 DEFUN ("number-or-marker-p", Fnumber_or_marker_p
,
489 Snumber_or_marker_p
, 1, 1, 0,
490 doc
: /* Return t if OBJECT is a number or a marker. */)
494 if (NUMBERP (object
) || MARKERP (object
))
499 DEFUN ("floatp", Ffloatp
, Sfloatp
, 1, 1, 0,
500 doc
: /* Return t if OBJECT is a floating point number. */)
510 /* Extract and set components of lists */
512 DEFUN ("car", Fcar
, Scar
, 1, 1, 0,
513 doc
: /* Return the car of LIST. If arg is nil, return nil.
514 Error if arg is not nil and not a cons cell. See also `car-safe'.
516 See Info node `(elisp)Cons Cells' for a discussion of related basic
517 Lisp concepts such as car, cdr, cons cell and list. */)
519 register Lisp_Object list
;
524 DEFUN ("car-safe", Fcar_safe
, Scar_safe
, 1, 1, 0,
525 doc
: /* Return the car of OBJECT if it is a cons cell, or else nil. */)
529 return CAR_SAFE (object
);
532 DEFUN ("cdr", Fcdr
, Scdr
, 1, 1, 0,
533 doc
: /* Return the cdr of LIST. If arg is nil, return nil.
534 Error if arg is not nil and not a cons cell. See also `cdr-safe'.
536 See Info node `(elisp)Cons Cells' for a discussion of related basic
537 Lisp concepts such as cdr, car, cons cell and list. */)
539 register Lisp_Object list
;
544 DEFUN ("cdr-safe", Fcdr_safe
, Scdr_safe
, 1, 1, 0,
545 doc
: /* Return the cdr of OBJECT if it is a cons cell, or else nil. */)
549 return CDR_SAFE (object
);
552 DEFUN ("setcar", Fsetcar
, Ssetcar
, 2, 2, 0,
553 doc
: /* Set the car of CELL to be NEWCAR. Returns NEWCAR. */)
555 register Lisp_Object cell
, newcar
;
559 XSETCAR (cell
, newcar
);
563 DEFUN ("setcdr", Fsetcdr
, Ssetcdr
, 2, 2, 0,
564 doc
: /* Set the cdr of CELL to be NEWCDR. Returns NEWCDR. */)
566 register Lisp_Object cell
, newcdr
;
570 XSETCDR (cell
, newcdr
);
574 /* Extract and set components of symbols */
576 DEFUN ("boundp", Fboundp
, Sboundp
, 1, 1, 0,
577 doc
: /* Return t if SYMBOL's value is not void. */)
579 register Lisp_Object symbol
;
581 Lisp_Object valcontents
;
582 CHECK_SYMBOL (symbol
);
584 valcontents
= SYMBOL_VALUE (symbol
);
586 if (BUFFER_LOCAL_VALUEP (valcontents
))
587 valcontents
= swap_in_symval_forwarding (symbol
, valcontents
);
589 return (EQ (valcontents
, Qunbound
) ? Qnil
: Qt
);
592 DEFUN ("fboundp", Ffboundp
, Sfboundp
, 1, 1, 0,
593 doc
: /* Return t if SYMBOL's function definition is not void. */)
595 register Lisp_Object symbol
;
597 CHECK_SYMBOL (symbol
);
598 return (EQ (XSYMBOL (symbol
)->function
, Qunbound
) ? Qnil
: Qt
);
601 DEFUN ("makunbound", Fmakunbound
, Smakunbound
, 1, 1, 0,
602 doc
: /* Make SYMBOL's value be void.
605 register Lisp_Object symbol
;
607 CHECK_SYMBOL (symbol
);
608 if (SYMBOL_CONSTANT_P (symbol
))
609 xsignal1 (Qsetting_constant
, symbol
);
610 Fset (symbol
, Qunbound
);
614 DEFUN ("fmakunbound", Ffmakunbound
, Sfmakunbound
, 1, 1, 0,
615 doc
: /* Make SYMBOL's function definition be void.
618 register Lisp_Object symbol
;
620 CHECK_SYMBOL (symbol
);
621 if (NILP (symbol
) || EQ (symbol
, Qt
))
622 xsignal1 (Qsetting_constant
, symbol
);
623 XSYMBOL (symbol
)->function
= Qunbound
;
627 DEFUN ("symbol-function", Fsymbol_function
, Ssymbol_function
, 1, 1, 0,
628 doc
: /* Return SYMBOL's function definition. Error if that is void. */)
630 register Lisp_Object symbol
;
632 CHECK_SYMBOL (symbol
);
633 if (!EQ (XSYMBOL (symbol
)->function
, Qunbound
))
634 return XSYMBOL (symbol
)->function
;
635 xsignal1 (Qvoid_function
, symbol
);
638 DEFUN ("symbol-plist", Fsymbol_plist
, Ssymbol_plist
, 1, 1, 0,
639 doc
: /* Return SYMBOL's property list. */)
641 register Lisp_Object symbol
;
643 CHECK_SYMBOL (symbol
);
644 return XSYMBOL (symbol
)->plist
;
647 DEFUN ("symbol-name", Fsymbol_name
, Ssymbol_name
, 1, 1, 0,
648 doc
: /* Return SYMBOL's name, a string. */)
650 register Lisp_Object symbol
;
652 register Lisp_Object name
;
654 CHECK_SYMBOL (symbol
);
655 name
= SYMBOL_NAME (symbol
);
659 DEFUN ("fset", Ffset
, Sfset
, 2, 2, 0,
660 doc
: /* Set SYMBOL's function definition to DEFINITION, and return DEFINITION. */)
662 register Lisp_Object symbol
, definition
;
664 register Lisp_Object function
;
666 CHECK_SYMBOL (symbol
);
667 if (NILP (symbol
) || EQ (symbol
, Qt
))
668 xsignal1 (Qsetting_constant
, symbol
);
670 function
= XSYMBOL (symbol
)->function
;
672 if (!NILP (Vautoload_queue
) && !EQ (function
, Qunbound
))
673 Vautoload_queue
= Fcons (Fcons (symbol
, function
), Vautoload_queue
);
675 if (CONSP (function
) && EQ (XCAR (function
), Qautoload
))
676 Fput (symbol
, Qautoload
, XCDR (function
));
678 XSYMBOL (symbol
)->function
= definition
;
679 /* Handle automatic advice activation */
680 if (CONSP (XSYMBOL (symbol
)->plist
) && !NILP (Fget (symbol
, Qad_advice_info
)))
682 call2 (Qad_activate_internal
, symbol
, Qnil
);
683 definition
= XSYMBOL (symbol
)->function
;
688 extern Lisp_Object Qfunction_documentation
;
690 DEFUN ("defalias", Fdefalias
, Sdefalias
, 2, 3, 0,
691 doc
: /* Set SYMBOL's function definition to DEFINITION, and return DEFINITION.
692 Associates the function with the current load file, if any.
693 The optional third argument DOCSTRING specifies the documentation string
694 for SYMBOL; if it is omitted or nil, SYMBOL uses the documentation string
695 determined by DEFINITION. */)
696 (symbol
, definition
, docstring
)
697 register Lisp_Object symbol
, definition
, docstring
;
699 CHECK_SYMBOL (symbol
);
700 if (CONSP (XSYMBOL (symbol
)->function
)
701 && EQ (XCAR (XSYMBOL (symbol
)->function
), Qautoload
))
702 LOADHIST_ATTACH (Fcons (Qt
, symbol
));
703 definition
= Ffset (symbol
, definition
);
704 LOADHIST_ATTACH (Fcons (Qdefun
, symbol
));
705 if (!NILP (docstring
))
706 Fput (symbol
, Qfunction_documentation
, docstring
);
710 DEFUN ("setplist", Fsetplist
, Ssetplist
, 2, 2, 0,
711 doc
: /* Set SYMBOL's property list to NEWPLIST, and return NEWPLIST. */)
713 register Lisp_Object symbol
, newplist
;
715 CHECK_SYMBOL (symbol
);
716 XSYMBOL (symbol
)->plist
= newplist
;
720 DEFUN ("subr-arity", Fsubr_arity
, Ssubr_arity
, 1, 1, 0,
721 doc
: /* Return minimum and maximum number of args allowed for SUBR.
722 SUBR must be a built-in function.
723 The returned value is a pair (MIN . MAX). MIN is the minimum number
724 of args. MAX is the maximum number or the symbol `many', for a
725 function with `&rest' args, or `unevalled' for a special form. */)
729 short minargs
, maxargs
;
731 minargs
= XSUBR (subr
)->min_args
;
732 maxargs
= XSUBR (subr
)->max_args
;
734 return Fcons (make_number (minargs
), Qmany
);
735 else if (maxargs
== UNEVALLED
)
736 return Fcons (make_number (minargs
), Qunevalled
);
738 return Fcons (make_number (minargs
), make_number (maxargs
));
741 DEFUN ("subr-name", Fsubr_name
, Ssubr_name
, 1, 1, 0,
742 doc
: /* Return name of subroutine SUBR.
743 SUBR must be a built-in function. */)
749 name
= XSUBR (subr
)->symbol_name
;
750 return make_string (name
, strlen (name
));
753 DEFUN ("interactive-form", Finteractive_form
, Sinteractive_form
, 1, 1, 0,
754 doc
: /* Return the interactive form of CMD or nil if none.
755 If CMD is not a command, the return value is nil.
756 Value, if non-nil, is a list \(interactive SPEC). */)
760 Lisp_Object fun
= indirect_function (cmd
); /* Check cycles. */
762 if (NILP (fun
) || EQ (fun
, Qunbound
))
765 /* Use an `interactive-form' property if present, analogous to the
766 function-documentation property. */
768 while (SYMBOLP (fun
))
770 Lisp_Object tmp
= Fget (fun
, intern ("interactive-form"));
774 fun
= Fsymbol_function (fun
);
779 char *spec
= XSUBR (fun
)->intspec
;
781 return list2 (Qinteractive
,
782 (*spec
!= '(') ? build_string (spec
) :
783 Fcar (Fread_from_string (build_string (spec
), Qnil
, Qnil
)));
785 else if (COMPILEDP (fun
))
787 if ((ASIZE (fun
) & PSEUDOVECTOR_SIZE_MASK
) > COMPILED_INTERACTIVE
)
788 return list2 (Qinteractive
, AREF (fun
, COMPILED_INTERACTIVE
));
790 else if (CONSP (fun
))
792 Lisp_Object funcar
= XCAR (fun
);
793 if (EQ (funcar
, Qlambda
))
794 return Fassq (Qinteractive
, Fcdr (XCDR (fun
)));
795 else if (EQ (funcar
, Qautoload
))
799 do_autoload (fun
, cmd
);
801 return Finteractive_form (cmd
);
808 /***********************************************************************
809 Getting and Setting Values of Symbols
810 ***********************************************************************/
812 /* Return the symbol holding SYMBOL's value. Signal
813 `cyclic-variable-indirection' if SYMBOL's chain of variable
814 indirections contains a loop. */
817 indirect_variable (symbol
)
820 Lisp_Object tortoise
, hare
;
822 hare
= tortoise
= symbol
;
824 while (XSYMBOL (hare
)->indirect_variable
)
826 hare
= XSYMBOL (hare
)->value
;
827 if (!XSYMBOL (hare
)->indirect_variable
)
830 hare
= XSYMBOL (hare
)->value
;
831 tortoise
= XSYMBOL (tortoise
)->value
;
833 if (EQ (hare
, tortoise
))
834 xsignal1 (Qcyclic_variable_indirection
, symbol
);
841 DEFUN ("indirect-variable", Findirect_variable
, Sindirect_variable
, 1, 1, 0,
842 doc
: /* Return the variable at the end of OBJECT's variable chain.
843 If OBJECT is a symbol, follow all variable indirections and return the final
844 variable. If OBJECT is not a symbol, just return it.
845 Signal a cyclic-variable-indirection error if there is a loop in the
846 variable chain of symbols. */)
850 if (SYMBOLP (object
))
851 object
= indirect_variable (object
);
856 /* Given the raw contents of a symbol value cell,
857 return the Lisp value of the symbol.
858 This does not handle buffer-local variables; use
859 swap_in_symval_forwarding for that. */
862 do_symval_forwarding (valcontents
)
863 register Lisp_Object valcontents
;
865 register Lisp_Object val
;
866 if (MISCP (valcontents
))
867 switch (XMISCTYPE (valcontents
))
869 case Lisp_Misc_Intfwd
:
870 XSETINT (val
, *XINTFWD (valcontents
)->intvar
);
873 case Lisp_Misc_Boolfwd
:
874 return (*XBOOLFWD (valcontents
)->boolvar
? Qt
: Qnil
);
876 case Lisp_Misc_Objfwd
:
877 return *XOBJFWD (valcontents
)->objvar
;
879 case Lisp_Misc_Buffer_Objfwd
:
880 return PER_BUFFER_VALUE (current_buffer
,
881 XBUFFER_OBJFWD (valcontents
)->offset
);
883 case Lisp_Misc_Kboard_Objfwd
:
884 /* We used to simply use current_kboard here, but from Lisp
885 code, it's value is often unexpected. It seems nicer to
886 allow constructions like this to work as intuitively expected:
888 (with-selected-frame frame
889 (define-key local-function-map "\eOP" [f1]))
891 On the other hand, this affects the semantics of
892 last-command and real-last-command, and people may rely on
893 that. I took a quick look at the Lisp codebase, and I
894 don't think anything will break. --lorentey */
895 return *(Lisp_Object
*)(XKBOARD_OBJFWD (valcontents
)->offset
896 + (char *)FRAME_KBOARD (SELECTED_FRAME ()));
901 /* Store NEWVAL into SYMBOL, where VALCONTENTS is found in the value cell
902 of SYMBOL. If SYMBOL is buffer-local, VALCONTENTS should be the
903 buffer-independent contents of the value cell: forwarded just one
904 step past the buffer-localness.
906 BUF non-zero means set the value in buffer BUF instead of the
907 current buffer. This only plays a role for per-buffer variables. */
910 store_symval_forwarding (symbol
, valcontents
, newval
, buf
)
912 register Lisp_Object valcontents
, newval
;
915 switch (SWITCH_ENUM_CAST (XTYPE (valcontents
)))
918 switch (XMISCTYPE (valcontents
))
920 case Lisp_Misc_Intfwd
:
921 CHECK_NUMBER (newval
);
922 *XINTFWD (valcontents
)->intvar
= XINT (newval
);
923 /* This can never happen since intvar points to an EMACS_INT
924 which is at least large enough to hold a Lisp_Object.
925 if (*XINTFWD (valcontents)->intvar != XINT (newval))
926 error ("Value out of range for variable `%s'",
927 SDATA (SYMBOL_NAME (symbol))); */
930 case Lisp_Misc_Boolfwd
:
931 *XBOOLFWD (valcontents
)->boolvar
= !NILP (newval
);
934 case Lisp_Misc_Objfwd
:
935 *XOBJFWD (valcontents
)->objvar
= newval
;
937 /* If this variable is a default for something stored
938 in the buffer itself, such as default-fill-column,
939 find the buffers that don't have local values for it
941 if (XOBJFWD (valcontents
)->objvar
> (Lisp_Object
*) &buffer_defaults
942 && XOBJFWD (valcontents
)->objvar
< (Lisp_Object
*) (&buffer_defaults
+ 1))
944 int offset
= ((char *) XOBJFWD (valcontents
)->objvar
945 - (char *) &buffer_defaults
);
946 int idx
= PER_BUFFER_IDX (offset
);
953 for (tail
= Vbuffer_alist
; CONSP (tail
); tail
= XCDR (tail
))
958 buf
= Fcdr (XCAR (tail
));
959 if (!BUFFERP (buf
)) continue;
962 if (! PER_BUFFER_VALUE_P (b
, idx
))
963 PER_BUFFER_VALUE (b
, offset
) = newval
;
968 case Lisp_Misc_Buffer_Objfwd
:
970 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
971 Lisp_Object type
= XBUFFER_OBJFWD (valcontents
)->slottype
;
973 if (! NILP (type
) && ! NILP (newval
)
974 && XTYPE (newval
) != XINT (type
))
975 buffer_slot_type_mismatch (symbol
, XINT (type
));
978 buf
= current_buffer
;
979 PER_BUFFER_VALUE (buf
, offset
) = newval
;
983 case Lisp_Misc_Kboard_Objfwd
:
985 char *base
= (char *) FRAME_KBOARD (SELECTED_FRAME ());
986 char *p
= base
+ XKBOARD_OBJFWD (valcontents
)->offset
;
987 *(Lisp_Object
*) p
= newval
;
998 valcontents
= SYMBOL_VALUE (symbol
);
999 if (BUFFER_LOCAL_VALUEP (valcontents
))
1000 XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
= newval
;
1002 SET_SYMBOL_VALUE (symbol
, newval
);
1006 /* Set up SYMBOL to refer to its global binding.
1007 This makes it safe to alter the status of other bindings. */
1010 swap_in_global_binding (symbol
)
1013 Lisp_Object valcontents
= SYMBOL_VALUE (symbol
);
1014 struct Lisp_Buffer_Local_Value
*blv
= XBUFFER_LOCAL_VALUE (valcontents
);
1015 Lisp_Object cdr
= blv
->cdr
;
1017 /* Unload the previously loaded binding. */
1018 Fsetcdr (XCAR (cdr
),
1019 do_symval_forwarding (blv
->realvalue
));
1021 /* Select the global binding in the symbol. */
1023 store_symval_forwarding (symbol
, blv
->realvalue
, XCDR (cdr
), NULL
);
1025 /* Indicate that the global binding is set up now. */
1028 blv
->found_for_frame
= 0;
1029 blv
->found_for_buffer
= 0;
1032 /* Set up the buffer-local symbol SYMBOL for validity in the current buffer.
1033 VALCONTENTS is the contents of its value cell,
1034 which points to a struct Lisp_Buffer_Local_Value.
1036 Return the value forwarded one step past the buffer-local stage.
1037 This could be another forwarding pointer. */
1040 swap_in_symval_forwarding (symbol
, valcontents
)
1041 Lisp_Object symbol
, valcontents
;
1043 register Lisp_Object tem1
;
1045 tem1
= XBUFFER_LOCAL_VALUE (valcontents
)->buffer
;
1048 || current_buffer
!= XBUFFER (tem1
)
1049 || (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
1050 && ! EQ (selected_frame
, XBUFFER_LOCAL_VALUE (valcontents
)->frame
)))
1052 if (XSYMBOL (symbol
)->indirect_variable
)
1053 symbol
= indirect_variable (symbol
);
1055 /* Unload the previously loaded binding. */
1056 tem1
= XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
1058 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
));
1059 /* Choose the new binding. */
1060 tem1
= assq_no_quit (symbol
, current_buffer
->local_var_alist
);
1061 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_frame
= 0;
1062 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 0;
1065 if (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
)
1066 tem1
= assq_no_quit (symbol
, XFRAME (selected_frame
)->param_alist
);
1068 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_frame
= 1;
1070 tem1
= XBUFFER_LOCAL_VALUE (valcontents
)->cdr
;
1073 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 1;
1075 /* Load the new binding. */
1076 XSETCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
, tem1
);
1077 XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents
)->buffer
, current_buffer
);
1078 XBUFFER_LOCAL_VALUE (valcontents
)->frame
= selected_frame
;
1079 store_symval_forwarding (symbol
,
1080 XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
,
1083 return XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
;
1086 /* Find the value of a symbol, returning Qunbound if it's not bound.
1087 This is helpful for code which just wants to get a variable's value
1088 if it has one, without signaling an error.
1089 Note that it must not be possible to quit
1090 within this function. Great care is required for this. */
1093 find_symbol_value (symbol
)
1096 register Lisp_Object valcontents
;
1097 register Lisp_Object val
;
1099 CHECK_SYMBOL (symbol
);
1100 valcontents
= SYMBOL_VALUE (symbol
);
1102 if (BUFFER_LOCAL_VALUEP (valcontents
))
1103 valcontents
= swap_in_symval_forwarding (symbol
, valcontents
);
1105 return do_symval_forwarding (valcontents
);
1108 DEFUN ("symbol-value", Fsymbol_value
, Ssymbol_value
, 1, 1, 0,
1109 doc
: /* Return SYMBOL's value. Error if that is void. */)
1115 val
= find_symbol_value (symbol
);
1116 if (!EQ (val
, Qunbound
))
1119 xsignal1 (Qvoid_variable
, symbol
);
1122 DEFUN ("set", Fset
, Sset
, 2, 2, 0,
1123 doc
: /* Set SYMBOL's value to NEWVAL, and return NEWVAL. */)
1125 register Lisp_Object symbol
, newval
;
1127 return set_internal (symbol
, newval
, current_buffer
, 0);
1130 /* Return 1 if SYMBOL currently has a let-binding
1131 which was made in the buffer that is now current. */
1134 let_shadows_buffer_binding_p (symbol
)
1137 volatile struct specbinding
*p
;
1139 for (p
= specpdl_ptr
- 1; p
>= specpdl
; p
--)
1141 && CONSP (p
->symbol
))
1143 Lisp_Object let_bound_symbol
= XCAR (p
->symbol
);
1144 if ((EQ (symbol
, let_bound_symbol
)
1145 || (XSYMBOL (let_bound_symbol
)->indirect_variable
1146 && EQ (symbol
, indirect_variable (let_bound_symbol
))))
1147 && XBUFFER (XCDR (XCDR (p
->symbol
))) == current_buffer
)
1151 return p
>= specpdl
;
1154 /* Store the value NEWVAL into SYMBOL.
1155 If buffer-locality is an issue, BUF specifies which buffer to use.
1156 (0 stands for the current buffer.)
1158 If BINDFLAG is zero, then if this symbol is supposed to become
1159 local in every buffer where it is set, then we make it local.
1160 If BINDFLAG is nonzero, we don't do that. */
1163 set_internal (symbol
, newval
, buf
, bindflag
)
1164 register Lisp_Object symbol
, newval
;
1168 int voide
= EQ (newval
, Qunbound
);
1170 register Lisp_Object valcontents
, innercontents
, tem1
, current_alist_element
;
1173 buf
= current_buffer
;
1175 /* If restoring in a dead buffer, do nothing. */
1176 if (NILP (buf
->name
))
1179 CHECK_SYMBOL (symbol
);
1180 if (SYMBOL_CONSTANT_P (symbol
)
1181 && (NILP (Fkeywordp (symbol
))
1182 || !EQ (newval
, SYMBOL_VALUE (symbol
))))
1183 xsignal1 (Qsetting_constant
, symbol
);
1185 innercontents
= valcontents
= SYMBOL_VALUE (symbol
);
1187 if (BUFFER_OBJFWDP (valcontents
))
1189 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1190 int idx
= PER_BUFFER_IDX (offset
);
1193 && !let_shadows_buffer_binding_p (symbol
))
1194 SET_PER_BUFFER_VALUE_P (buf
, idx
, 1);
1196 else if (BUFFER_LOCAL_VALUEP (valcontents
))
1198 /* valcontents is a struct Lisp_Buffer_Local_Value. */
1199 if (XSYMBOL (symbol
)->indirect_variable
)
1200 symbol
= indirect_variable (symbol
);
1202 /* What binding is loaded right now? */
1203 current_alist_element
1204 = XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
1206 /* If the current buffer is not the buffer whose binding is
1207 loaded, or if there may be frame-local bindings and the frame
1208 isn't the right one, or if it's a Lisp_Buffer_Local_Value and
1209 the default binding is loaded, the loaded binding may be the
1211 if (!BUFFERP (XBUFFER_LOCAL_VALUE (valcontents
)->buffer
)
1212 || buf
!= XBUFFER (XBUFFER_LOCAL_VALUE (valcontents
)->buffer
)
1213 || (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
1214 && !EQ (selected_frame
, XBUFFER_LOCAL_VALUE (valcontents
)->frame
))
1215 /* Also unload a global binding (if the var is local_if_set). */
1216 || (EQ (XCAR (current_alist_element
),
1217 current_alist_element
)))
1219 /* The currently loaded binding is not necessarily valid.
1220 We need to unload it, and choose a new binding. */
1222 /* Write out `realvalue' to the old loaded binding. */
1223 Fsetcdr (current_alist_element
,
1224 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
));
1226 /* Find the new binding. */
1227 tem1
= Fassq (symbol
, buf
->local_var_alist
);
1228 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 1;
1229 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_frame
= 0;
1233 /* This buffer still sees the default value. */
1235 /* If the variable is not local_if_set,
1236 or if this is `let' rather than `set',
1237 make CURRENT-ALIST-ELEMENT point to itself,
1238 indicating that we're seeing the default value.
1239 Likewise if the variable has been let-bound
1240 in the current buffer. */
1241 if (bindflag
|| !XBUFFER_LOCAL_VALUE (valcontents
)->local_if_set
1242 || let_shadows_buffer_binding_p (symbol
))
1244 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 0;
1246 if (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
)
1247 tem1
= Fassq (symbol
,
1248 XFRAME (selected_frame
)->param_alist
);
1251 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_frame
= 1;
1253 tem1
= XBUFFER_LOCAL_VALUE (valcontents
)->cdr
;
1255 /* If it's a Lisp_Buffer_Local_Value, being set not bound,
1256 and we're not within a let that was made for this buffer,
1257 create a new buffer-local binding for the variable.
1258 That means, give this buffer a new assoc for a local value
1259 and load that binding. */
1262 tem1
= Fcons (symbol
, XCDR (current_alist_element
));
1263 buf
->local_var_alist
1264 = Fcons (tem1
, buf
->local_var_alist
);
1268 /* Record which binding is now loaded. */
1269 XSETCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
, tem1
);
1271 /* Set `buffer' and `frame' slots for the binding now loaded. */
1272 XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents
)->buffer
, buf
);
1273 XBUFFER_LOCAL_VALUE (valcontents
)->frame
= selected_frame
;
1275 innercontents
= XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
;
1277 /* Store the new value in the cons-cell. */
1278 XSETCDR (XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
), newval
);
1281 /* If storing void (making the symbol void), forward only through
1282 buffer-local indicator, not through Lisp_Objfwd, etc. */
1284 store_symval_forwarding (symbol
, Qnil
, newval
, buf
);
1286 store_symval_forwarding (symbol
, innercontents
, newval
, buf
);
1291 /* Access or set a buffer-local symbol's default value. */
1293 /* Return the default value of SYMBOL, but don't check for voidness.
1294 Return Qunbound if it is void. */
1297 default_value (symbol
)
1300 register Lisp_Object valcontents
;
1302 CHECK_SYMBOL (symbol
);
1303 valcontents
= SYMBOL_VALUE (symbol
);
1305 /* For a built-in buffer-local variable, get the default value
1306 rather than letting do_symval_forwarding get the current value. */
1307 if (BUFFER_OBJFWDP (valcontents
))
1309 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1310 if (PER_BUFFER_IDX (offset
) != 0)
1311 return PER_BUFFER_DEFAULT (offset
);
1314 /* Handle user-created local variables. */
1315 if (BUFFER_LOCAL_VALUEP (valcontents
))
1317 /* If var is set up for a buffer that lacks a local value for it,
1318 the current value is nominally the default value.
1319 But the `realvalue' slot may be more up to date, since
1320 ordinary setq stores just that slot. So use that. */
1321 Lisp_Object current_alist_element
, alist_element_car
;
1322 current_alist_element
1323 = XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
1324 alist_element_car
= XCAR (current_alist_element
);
1325 if (EQ (alist_element_car
, current_alist_element
))
1326 return do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
);
1328 return XCDR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
1330 /* For other variables, get the current value. */
1331 return do_symval_forwarding (valcontents
);
1334 DEFUN ("default-boundp", Fdefault_boundp
, Sdefault_boundp
, 1, 1, 0,
1335 doc
: /* Return t if SYMBOL has a non-void default value.
1336 This is the value that is seen in buffers that do not have their own values
1337 for this variable. */)
1341 register Lisp_Object value
;
1343 value
= default_value (symbol
);
1344 return (EQ (value
, Qunbound
) ? Qnil
: Qt
);
1347 DEFUN ("default-value", Fdefault_value
, Sdefault_value
, 1, 1, 0,
1348 doc
: /* Return SYMBOL's default value.
1349 This is the value that is seen in buffers that do not have their own values
1350 for this variable. The default value is meaningful for variables with
1351 local bindings in certain buffers. */)
1355 register Lisp_Object value
;
1357 value
= default_value (symbol
);
1358 if (!EQ (value
, Qunbound
))
1361 xsignal1 (Qvoid_variable
, symbol
);
1364 DEFUN ("set-default", Fset_default
, Sset_default
, 2, 2, 0,
1365 doc
: /* Set SYMBOL's default value to VALUE. SYMBOL and VALUE are evaluated.
1366 The default value is seen in buffers that do not have their own values
1367 for this variable. */)
1369 Lisp_Object symbol
, value
;
1371 register Lisp_Object valcontents
, current_alist_element
, alist_element_buffer
;
1373 CHECK_SYMBOL (symbol
);
1374 valcontents
= SYMBOL_VALUE (symbol
);
1376 /* Handle variables like case-fold-search that have special slots
1377 in the buffer. Make them work apparently like Lisp_Buffer_Local_Value
1379 if (BUFFER_OBJFWDP (valcontents
))
1381 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1382 int idx
= PER_BUFFER_IDX (offset
);
1384 PER_BUFFER_DEFAULT (offset
) = value
;
1386 /* If this variable is not always local in all buffers,
1387 set it in the buffers that don't nominally have a local value. */
1392 for (b
= all_buffers
; b
; b
= b
->next
)
1393 if (!PER_BUFFER_VALUE_P (b
, idx
))
1394 PER_BUFFER_VALUE (b
, offset
) = value
;
1399 if (!BUFFER_LOCAL_VALUEP (valcontents
))
1400 return Fset (symbol
, value
);
1402 /* Store new value into the DEFAULT-VALUE slot. */
1403 XSETCDR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
, value
);
1405 /* If the default binding is now loaded, set the REALVALUE slot too. */
1406 current_alist_element
1407 = XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
1408 alist_element_buffer
= Fcar (current_alist_element
);
1409 if (EQ (alist_element_buffer
, current_alist_element
))
1410 store_symval_forwarding (symbol
,
1411 XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
,
1417 DEFUN ("setq-default", Fsetq_default
, Ssetq_default
, 0, UNEVALLED
, 0,
1418 doc
: /* Set the default value of variable VAR to VALUE.
1419 VAR, the variable name, is literal (not evaluated);
1420 VALUE is an expression: it is evaluated and its value returned.
1421 The default value of a variable is seen in buffers
1422 that do not have their own values for the variable.
1424 More generally, you can use multiple variables and values, as in
1425 (setq-default VAR VALUE VAR VALUE...)
1426 This sets each VAR's default value to the corresponding VALUE.
1427 The VALUE for the Nth VAR can refer to the new default values
1429 usage: (setq-default [VAR VALUE]...) */)
1433 register Lisp_Object args_left
;
1434 register Lisp_Object val
, symbol
;
1435 struct gcpro gcpro1
;
1445 val
= Feval (Fcar (Fcdr (args_left
)));
1446 symbol
= XCAR (args_left
);
1447 Fset_default (symbol
, val
);
1448 args_left
= Fcdr (XCDR (args_left
));
1450 while (!NILP (args_left
));
1456 /* Lisp functions for creating and removing buffer-local variables. */
1458 DEFUN ("make-variable-buffer-local", Fmake_variable_buffer_local
, Smake_variable_buffer_local
,
1459 1, 1, "vMake Variable Buffer Local: ",
1460 doc
: /* Make VARIABLE become buffer-local whenever it is set.
1461 At any time, the value for the current buffer is in effect,
1462 unless the variable has never been set in this buffer,
1463 in which case the default value is in effect.
1464 Note that binding the variable with `let', or setting it while
1465 a `let'-style binding made in this buffer is in effect,
1466 does not make the variable buffer-local. Return VARIABLE.
1468 In most cases it is better to use `make-local-variable',
1469 which makes a variable local in just one buffer.
1471 The function `default-value' gets the default value and `set-default' sets it. */)
1473 register Lisp_Object variable
;
1475 register Lisp_Object tem
, valcontents
, newval
;
1477 CHECK_SYMBOL (variable
);
1478 variable
= indirect_variable (variable
);
1480 valcontents
= SYMBOL_VALUE (variable
);
1481 if (XSYMBOL (variable
)->constant
|| KBOARD_OBJFWDP (valcontents
))
1482 error ("Symbol %s may not be buffer-local", SDATA (SYMBOL_NAME (variable
)));
1484 if (BUFFER_OBJFWDP (valcontents
))
1486 else if (BUFFER_LOCAL_VALUEP (valcontents
))
1487 newval
= valcontents
;
1490 if (EQ (valcontents
, Qunbound
))
1491 SET_SYMBOL_VALUE (variable
, Qnil
);
1492 tem
= Fcons (Qnil
, Fsymbol_value (variable
));
1494 newval
= allocate_misc ();
1495 XMISCTYPE (newval
) = Lisp_Misc_Buffer_Local_Value
;
1496 XBUFFER_LOCAL_VALUE (newval
)->realvalue
= SYMBOL_VALUE (variable
);
1497 XBUFFER_LOCAL_VALUE (newval
)->buffer
= Fcurrent_buffer ();
1498 XBUFFER_LOCAL_VALUE (newval
)->frame
= Qnil
;
1499 XBUFFER_LOCAL_VALUE (newval
)->found_for_buffer
= 0;
1500 XBUFFER_LOCAL_VALUE (newval
)->found_for_frame
= 0;
1501 XBUFFER_LOCAL_VALUE (newval
)->check_frame
= 0;
1502 XBUFFER_LOCAL_VALUE (newval
)->cdr
= tem
;
1503 SET_SYMBOL_VALUE (variable
, newval
);
1505 XBUFFER_LOCAL_VALUE (newval
)->local_if_set
= 1;
1509 DEFUN ("make-local-variable", Fmake_local_variable
, Smake_local_variable
,
1510 1, 1, "vMake Local Variable: ",
1511 doc
: /* Make VARIABLE have a separate value in the current buffer.
1512 Other buffers will continue to share a common default value.
1513 \(The buffer-local value of VARIABLE starts out as the same value
1514 VARIABLE previously had. If VARIABLE was void, it remains void.\)
1517 If the variable is already arranged to become local when set,
1518 this function causes a local value to exist for this buffer,
1519 just as setting the variable would do.
1521 This function returns VARIABLE, and therefore
1522 (set (make-local-variable 'VARIABLE) VALUE-EXP)
1525 See also `make-variable-buffer-local'.
1527 Do not use `make-local-variable' to make a hook variable buffer-local.
1528 Instead, use `add-hook' and specify t for the LOCAL argument. */)
1530 register Lisp_Object variable
;
1532 register Lisp_Object tem
, valcontents
;
1534 CHECK_SYMBOL (variable
);
1535 variable
= indirect_variable (variable
);
1537 valcontents
= SYMBOL_VALUE (variable
);
1538 if (XSYMBOL (variable
)->constant
|| KBOARD_OBJFWDP (valcontents
))
1539 error ("Symbol %s may not be buffer-local", SDATA (SYMBOL_NAME (variable
)));
1541 if ((BUFFER_LOCAL_VALUEP (valcontents
)
1542 && XBUFFER_LOCAL_VALUE (valcontents
)->local_if_set
)
1543 || BUFFER_OBJFWDP (valcontents
))
1545 tem
= Fboundp (variable
);
1547 /* Make sure the symbol has a local value in this particular buffer,
1548 by setting it to the same value it already has. */
1549 Fset (variable
, (EQ (tem
, Qt
) ? Fsymbol_value (variable
) : Qunbound
));
1552 /* Make sure symbol is set up to hold per-buffer values. */
1553 if (!BUFFER_LOCAL_VALUEP (valcontents
))
1556 tem
= Fcons (Qnil
, do_symval_forwarding (valcontents
));
1558 newval
= allocate_misc ();
1559 XMISCTYPE (newval
) = Lisp_Misc_Buffer_Local_Value
;
1560 XBUFFER_LOCAL_VALUE (newval
)->realvalue
= SYMBOL_VALUE (variable
);
1561 XBUFFER_LOCAL_VALUE (newval
)->buffer
= Qnil
;
1562 XBUFFER_LOCAL_VALUE (newval
)->frame
= Qnil
;
1563 XBUFFER_LOCAL_VALUE (newval
)->local_if_set
= 0;
1564 XBUFFER_LOCAL_VALUE (newval
)->found_for_buffer
= 0;
1565 XBUFFER_LOCAL_VALUE (newval
)->found_for_frame
= 0;
1566 XBUFFER_LOCAL_VALUE (newval
)->check_frame
= 0;
1567 XBUFFER_LOCAL_VALUE (newval
)->cdr
= tem
;
1568 SET_SYMBOL_VALUE (variable
, newval
);
1570 /* Make sure this buffer has its own value of symbol. */
1571 tem
= Fassq (variable
, current_buffer
->local_var_alist
);
1574 /* Swap out any local binding for some other buffer, and make
1575 sure the current value is permanently recorded, if it's the
1577 find_symbol_value (variable
);
1579 current_buffer
->local_var_alist
1580 = Fcons (Fcons (variable
, XCDR (XBUFFER_LOCAL_VALUE (SYMBOL_VALUE (variable
))->cdr
)),
1581 current_buffer
->local_var_alist
);
1583 /* Make sure symbol does not think it is set up for this buffer;
1584 force it to look once again for this buffer's value. */
1586 Lisp_Object
*pvalbuf
;
1588 valcontents
= SYMBOL_VALUE (variable
);
1590 pvalbuf
= &XBUFFER_LOCAL_VALUE (valcontents
)->buffer
;
1591 if (current_buffer
== XBUFFER (*pvalbuf
))
1593 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 0;
1597 /* If the symbol forwards into a C variable, then load the binding
1598 for this buffer now. If C code modifies the variable before we
1599 load the binding in, then that new value will clobber the default
1600 binding the next time we unload it. */
1601 valcontents
= XBUFFER_LOCAL_VALUE (SYMBOL_VALUE (variable
))->realvalue
;
1602 if (INTFWDP (valcontents
) || BOOLFWDP (valcontents
) || OBJFWDP (valcontents
))
1603 swap_in_symval_forwarding (variable
, SYMBOL_VALUE (variable
));
1608 DEFUN ("kill-local-variable", Fkill_local_variable
, Skill_local_variable
,
1609 1, 1, "vKill Local Variable: ",
1610 doc
: /* Make VARIABLE no longer have a separate value in the current buffer.
1611 From now on the default value will apply in this buffer. Return VARIABLE. */)
1613 register Lisp_Object variable
;
1615 register Lisp_Object tem
, valcontents
;
1617 CHECK_SYMBOL (variable
);
1618 variable
= indirect_variable (variable
);
1620 valcontents
= SYMBOL_VALUE (variable
);
1622 if (BUFFER_OBJFWDP (valcontents
))
1624 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1625 int idx
= PER_BUFFER_IDX (offset
);
1629 SET_PER_BUFFER_VALUE_P (current_buffer
, idx
, 0);
1630 PER_BUFFER_VALUE (current_buffer
, offset
)
1631 = PER_BUFFER_DEFAULT (offset
);
1636 if (!BUFFER_LOCAL_VALUEP (valcontents
))
1639 /* Get rid of this buffer's alist element, if any. */
1641 tem
= Fassq (variable
, current_buffer
->local_var_alist
);
1643 current_buffer
->local_var_alist
1644 = Fdelq (tem
, current_buffer
->local_var_alist
);
1646 /* If the symbol is set up with the current buffer's binding
1647 loaded, recompute its value. We have to do it now, or else
1648 forwarded objects won't work right. */
1650 Lisp_Object
*pvalbuf
, buf
;
1651 valcontents
= SYMBOL_VALUE (variable
);
1652 pvalbuf
= &XBUFFER_LOCAL_VALUE (valcontents
)->buffer
;
1653 XSETBUFFER (buf
, current_buffer
);
1654 if (EQ (buf
, *pvalbuf
))
1657 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 0;
1658 find_symbol_value (variable
);
1665 /* Lisp functions for creating and removing buffer-local variables. */
1667 DEFUN ("make-variable-frame-local", Fmake_variable_frame_local
, Smake_variable_frame_local
,
1668 1, 1, "vMake Variable Frame Local: ",
1669 doc
: /* Enable VARIABLE to have frame-local bindings.
1670 This does not create any frame-local bindings for VARIABLE,
1671 it just makes them possible.
1673 A frame-local binding is actually a frame parameter value.
1674 If a frame F has a value for the frame parameter named VARIABLE,
1675 that also acts as a frame-local binding for VARIABLE in F--
1676 provided this function has been called to enable VARIABLE
1677 to have frame-local bindings at all.
1679 The only way to create a frame-local binding for VARIABLE in a frame
1680 is to set the VARIABLE frame parameter of that frame. See
1681 `modify-frame-parameters' for how to set frame parameters.
1683 Buffer-local bindings take precedence over frame-local bindings. */)
1685 register Lisp_Object variable
;
1687 register Lisp_Object tem
, valcontents
, newval
;
1689 CHECK_SYMBOL (variable
);
1690 variable
= indirect_variable (variable
);
1692 valcontents
= SYMBOL_VALUE (variable
);
1693 if (XSYMBOL (variable
)->constant
|| KBOARD_OBJFWDP (valcontents
)
1694 || BUFFER_OBJFWDP (valcontents
))
1695 error ("Symbol %s may not be frame-local", SDATA (SYMBOL_NAME (variable
)));
1697 if (BUFFER_LOCAL_VALUEP (valcontents
))
1699 XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
= 1;
1703 if (EQ (valcontents
, Qunbound
))
1704 SET_SYMBOL_VALUE (variable
, Qnil
);
1705 tem
= Fcons (Qnil
, Fsymbol_value (variable
));
1707 newval
= allocate_misc ();
1708 XMISCTYPE (newval
) = Lisp_Misc_Buffer_Local_Value
;
1709 XBUFFER_LOCAL_VALUE (newval
)->realvalue
= SYMBOL_VALUE (variable
);
1710 XBUFFER_LOCAL_VALUE (newval
)->buffer
= Qnil
;
1711 XBUFFER_LOCAL_VALUE (newval
)->frame
= Qnil
;
1712 XBUFFER_LOCAL_VALUE (newval
)->local_if_set
= 0;
1713 XBUFFER_LOCAL_VALUE (newval
)->found_for_buffer
= 0;
1714 XBUFFER_LOCAL_VALUE (newval
)->found_for_frame
= 0;
1715 XBUFFER_LOCAL_VALUE (newval
)->check_frame
= 1;
1716 XBUFFER_LOCAL_VALUE (newval
)->cdr
= tem
;
1717 SET_SYMBOL_VALUE (variable
, newval
);
1721 DEFUN ("local-variable-p", Flocal_variable_p
, Slocal_variable_p
,
1723 doc
: /* Non-nil if VARIABLE has a local binding in buffer BUFFER.
1724 BUFFER defaults to the current buffer. */)
1726 register Lisp_Object variable
, buffer
;
1728 Lisp_Object valcontents
;
1729 register struct buffer
*buf
;
1732 buf
= current_buffer
;
1735 CHECK_BUFFER (buffer
);
1736 buf
= XBUFFER (buffer
);
1739 CHECK_SYMBOL (variable
);
1740 variable
= indirect_variable (variable
);
1742 valcontents
= SYMBOL_VALUE (variable
);
1743 if (BUFFER_LOCAL_VALUEP (valcontents
))
1745 Lisp_Object tail
, elt
;
1747 for (tail
= buf
->local_var_alist
; CONSP (tail
); tail
= XCDR (tail
))
1750 if (EQ (variable
, XCAR (elt
)))
1754 if (BUFFER_OBJFWDP (valcontents
))
1756 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1757 int idx
= PER_BUFFER_IDX (offset
);
1758 if (idx
== -1 || PER_BUFFER_VALUE_P (buf
, idx
))
1764 DEFUN ("local-variable-if-set-p", Flocal_variable_if_set_p
, Slocal_variable_if_set_p
,
1766 doc
: /* Non-nil if VARIABLE will be local in buffer BUFFER when set there.
1767 More precisely, this means that setting the variable \(with `set' or`setq'),
1768 while it does not have a `let'-style binding that was made in BUFFER,
1769 will produce a buffer local binding. See Info node
1770 `(elisp)Creating Buffer-Local'.
1771 BUFFER defaults to the current buffer. */)
1773 register Lisp_Object variable
, buffer
;
1775 Lisp_Object valcontents
;
1776 register struct buffer
*buf
;
1779 buf
= current_buffer
;
1782 CHECK_BUFFER (buffer
);
1783 buf
= XBUFFER (buffer
);
1786 CHECK_SYMBOL (variable
);
1787 variable
= indirect_variable (variable
);
1789 valcontents
= SYMBOL_VALUE (variable
);
1791 if (BUFFER_OBJFWDP (valcontents
))
1792 /* All these slots become local if they are set. */
1794 else if (BUFFER_LOCAL_VALUEP (valcontents
))
1796 Lisp_Object tail
, elt
;
1797 if (XBUFFER_LOCAL_VALUE (valcontents
)->local_if_set
)
1799 for (tail
= buf
->local_var_alist
; CONSP (tail
); tail
= XCDR (tail
))
1802 if (EQ (variable
, XCAR (elt
)))
1809 DEFUN ("variable-binding-locus", Fvariable_binding_locus
, Svariable_binding_locus
,
1811 doc
: /* Return a value indicating where VARIABLE's current binding comes from.
1812 If the current binding is buffer-local, the value is the current buffer.
1813 If the current binding is frame-local, the value is the selected frame.
1814 If the current binding is global (the default), the value is nil. */)
1816 register Lisp_Object variable
;
1818 Lisp_Object valcontents
;
1820 CHECK_SYMBOL (variable
);
1821 variable
= indirect_variable (variable
);
1823 /* Make sure the current binding is actually swapped in. */
1824 find_symbol_value (variable
);
1826 valcontents
= XSYMBOL (variable
)->value
;
1828 if (BUFFER_LOCAL_VALUEP (valcontents
)
1829 || BUFFER_OBJFWDP (valcontents
))
1831 /* For a local variable, record both the symbol and which
1832 buffer's or frame's value we are saving. */
1833 if (!NILP (Flocal_variable_p (variable
, Qnil
)))
1834 return Fcurrent_buffer ();
1835 else if (BUFFER_LOCAL_VALUEP (valcontents
)
1836 && XBUFFER_LOCAL_VALUE (valcontents
)->found_for_frame
)
1837 return XBUFFER_LOCAL_VALUE (valcontents
)->frame
;
1843 /* This code is disabled now that we use the selected frame to return
1844 keyboard-local-values. */
1846 extern struct terminal
*get_terminal
P_ ((Lisp_Object display
, int));
1848 DEFUN ("terminal-local-value", Fterminal_local_value
, Sterminal_local_value
, 2, 2, 0,
1849 doc
: /* Return the terminal-local value of SYMBOL on TERMINAL.
1850 If SYMBOL is not a terminal-local variable, then return its normal
1851 value, like `symbol-value'.
1853 TERMINAL may be a terminal id, a frame, or nil (meaning the
1854 selected frame's terminal device). */)
1857 Lisp_Object terminal
;
1860 struct terminal
*t
= get_terminal (terminal
, 1);
1861 push_kboard (t
->kboard
);
1862 result
= Fsymbol_value (symbol
);
1867 DEFUN ("set-terminal-local-value", Fset_terminal_local_value
, Sset_terminal_local_value
, 3, 3, 0,
1868 doc
: /* Set the terminal-local binding of SYMBOL on TERMINAL to VALUE.
1869 If VARIABLE is not a terminal-local variable, then set its normal
1870 binding, like `set'.
1872 TERMINAL may be a terminal id, a frame, or nil (meaning the
1873 selected frame's terminal device). */)
1874 (symbol
, terminal
, value
)
1876 Lisp_Object terminal
;
1880 struct terminal
*t
= get_terminal (terminal
, 1);
1881 push_kboard (d
->kboard
);
1882 result
= Fset (symbol
, value
);
1888 /* Find the function at the end of a chain of symbol function indirections. */
1890 /* If OBJECT is a symbol, find the end of its function chain and
1891 return the value found there. If OBJECT is not a symbol, just
1892 return it. If there is a cycle in the function chain, signal a
1893 cyclic-function-indirection error.
1895 This is like Findirect_function, except that it doesn't signal an
1896 error if the chain ends up unbound. */
1898 indirect_function (object
)
1899 register Lisp_Object object
;
1901 Lisp_Object tortoise
, hare
;
1903 hare
= tortoise
= object
;
1907 if (!SYMBOLP (hare
) || EQ (hare
, Qunbound
))
1909 hare
= XSYMBOL (hare
)->function
;
1910 if (!SYMBOLP (hare
) || EQ (hare
, Qunbound
))
1912 hare
= XSYMBOL (hare
)->function
;
1914 tortoise
= XSYMBOL (tortoise
)->function
;
1916 if (EQ (hare
, tortoise
))
1917 xsignal1 (Qcyclic_function_indirection
, object
);
1923 DEFUN ("indirect-function", Findirect_function
, Sindirect_function
, 1, 2, 0,
1924 doc
: /* Return the function at the end of OBJECT's function chain.
1925 If OBJECT is not a symbol, just return it. Otherwise, follow all
1926 function indirections to find the final function binding and return it.
1927 If the final symbol in the chain is unbound, signal a void-function error.
1928 Optional arg NOERROR non-nil means to return nil instead of signalling.
1929 Signal a cyclic-function-indirection error if there is a loop in the
1930 function chain of symbols. */)
1932 register Lisp_Object object
;
1933 Lisp_Object noerror
;
1937 /* Optimize for no indirection. */
1939 if (SYMBOLP (result
) && !EQ (result
, Qunbound
)
1940 && (result
= XSYMBOL (result
)->function
, SYMBOLP (result
)))
1941 result
= indirect_function (result
);
1942 if (!EQ (result
, Qunbound
))
1946 xsignal1 (Qvoid_function
, object
);
1951 /* Extract and set vector and string elements */
1953 DEFUN ("aref", Faref
, Saref
, 2, 2, 0,
1954 doc
: /* Return the element of ARRAY at index IDX.
1955 ARRAY may be a vector, a string, a char-table, a bool-vector,
1956 or a byte-code object. IDX starts at 0. */)
1958 register Lisp_Object array
;
1961 register int idxval
;
1964 idxval
= XINT (idx
);
1965 if (STRINGP (array
))
1969 if (idxval
< 0 || idxval
>= SCHARS (array
))
1970 args_out_of_range (array
, idx
);
1971 if (! STRING_MULTIBYTE (array
))
1972 return make_number ((unsigned char) SREF (array
, idxval
));
1973 idxval_byte
= string_char_to_byte (array
, idxval
);
1975 c
= STRING_CHAR (SDATA (array
) + idxval_byte
,
1976 SBYTES (array
) - idxval_byte
);
1977 return make_number (c
);
1979 else if (BOOL_VECTOR_P (array
))
1983 if (idxval
< 0 || idxval
>= XBOOL_VECTOR (array
)->size
)
1984 args_out_of_range (array
, idx
);
1986 val
= (unsigned char) XBOOL_VECTOR (array
)->data
[idxval
/ BOOL_VECTOR_BITS_PER_CHAR
];
1987 return (val
& (1 << (idxval
% BOOL_VECTOR_BITS_PER_CHAR
)) ? Qt
: Qnil
);
1989 else if (CHAR_TABLE_P (array
))
1991 CHECK_CHARACTER (idx
);
1992 return CHAR_TABLE_REF (array
, idxval
);
1997 if (VECTORP (array
))
1998 size
= XVECTOR (array
)->size
;
1999 else if (COMPILEDP (array
))
2000 size
= XVECTOR (array
)->size
& PSEUDOVECTOR_SIZE_MASK
;
2002 wrong_type_argument (Qarrayp
, array
);
2004 if (idxval
< 0 || idxval
>= size
)
2005 args_out_of_range (array
, idx
);
2006 return XVECTOR (array
)->contents
[idxval
];
2010 DEFUN ("aset", Faset
, Saset
, 3, 3, 0,
2011 doc
: /* Store into the element of ARRAY at index IDX the value NEWELT.
2012 Return NEWELT. ARRAY may be a vector, a string, a char-table or a
2013 bool-vector. IDX starts at 0. */)
2014 (array
, idx
, newelt
)
2015 register Lisp_Object array
;
2016 Lisp_Object idx
, newelt
;
2018 register int idxval
;
2021 idxval
= XINT (idx
);
2022 CHECK_ARRAY (array
, Qarrayp
);
2023 CHECK_IMPURE (array
);
2025 if (VECTORP (array
))
2027 if (idxval
< 0 || idxval
>= XVECTOR (array
)->size
)
2028 args_out_of_range (array
, idx
);
2029 XVECTOR (array
)->contents
[idxval
] = newelt
;
2031 else if (BOOL_VECTOR_P (array
))
2035 if (idxval
< 0 || idxval
>= XBOOL_VECTOR (array
)->size
)
2036 args_out_of_range (array
, idx
);
2038 val
= (unsigned char) XBOOL_VECTOR (array
)->data
[idxval
/ BOOL_VECTOR_BITS_PER_CHAR
];
2040 if (! NILP (newelt
))
2041 val
|= 1 << (idxval
% BOOL_VECTOR_BITS_PER_CHAR
);
2043 val
&= ~(1 << (idxval
% BOOL_VECTOR_BITS_PER_CHAR
));
2044 XBOOL_VECTOR (array
)->data
[idxval
/ BOOL_VECTOR_BITS_PER_CHAR
] = val
;
2046 else if (CHAR_TABLE_P (array
))
2048 CHECK_CHARACTER (idx
);
2049 CHAR_TABLE_SET (array
, idxval
, newelt
);
2051 else if (STRING_MULTIBYTE (array
))
2053 int idxval_byte
, prev_bytes
, new_bytes
, nbytes
;
2054 unsigned char workbuf
[MAX_MULTIBYTE_LENGTH
], *p0
= workbuf
, *p1
;
2056 if (idxval
< 0 || idxval
>= SCHARS (array
))
2057 args_out_of_range (array
, idx
);
2058 CHECK_CHARACTER (newelt
);
2060 nbytes
= SBYTES (array
);
2062 idxval_byte
= string_char_to_byte (array
, idxval
);
2063 p1
= SDATA (array
) + idxval_byte
;
2064 PARSE_MULTIBYTE_SEQ (p1
, nbytes
- idxval_byte
, prev_bytes
);
2065 new_bytes
= CHAR_STRING (XINT (newelt
), p0
);
2066 if (prev_bytes
!= new_bytes
)
2068 /* We must relocate the string data. */
2069 int nchars
= SCHARS (array
);
2073 SAFE_ALLOCA (str
, unsigned char *, nbytes
);
2074 bcopy (SDATA (array
), str
, nbytes
);
2075 allocate_string_data (XSTRING (array
), nchars
,
2076 nbytes
+ new_bytes
- prev_bytes
);
2077 bcopy (str
, SDATA (array
), idxval_byte
);
2078 p1
= SDATA (array
) + idxval_byte
;
2079 bcopy (str
+ idxval_byte
+ prev_bytes
, p1
+ new_bytes
,
2080 nbytes
- (idxval_byte
+ prev_bytes
));
2082 clear_string_char_byte_cache ();
2089 if (idxval
< 0 || idxval
>= SCHARS (array
))
2090 args_out_of_range (array
, idx
);
2091 CHECK_NUMBER (newelt
);
2093 if (XINT (newelt
) >= 0 && ! SINGLE_BYTE_CHAR_P (XINT (newelt
)))
2097 for (i
= SBYTES (array
) - 1; i
>= 0; i
--)
2098 if (SREF (array
, i
) >= 0x80)
2099 args_out_of_range (array
, newelt
);
2100 /* ARRAY is an ASCII string. Convert it to a multibyte
2101 string, and try `aset' again. */
2102 STRING_SET_MULTIBYTE (array
);
2103 return Faset (array
, idx
, newelt
);
2105 SSET (array
, idxval
, XINT (newelt
));
2111 /* Arithmetic functions */
2113 enum comparison
{ equal
, notequal
, less
, grtr
, less_or_equal
, grtr_or_equal
};
2116 arithcompare (num1
, num2
, comparison
)
2117 Lisp_Object num1
, num2
;
2118 enum comparison comparison
;
2120 double f1
= 0, f2
= 0;
2123 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num1
);
2124 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num2
);
2126 if (FLOATP (num1
) || FLOATP (num2
))
2129 f1
= (FLOATP (num1
)) ? XFLOAT_DATA (num1
) : XINT (num1
);
2130 f2
= (FLOATP (num2
)) ? XFLOAT_DATA (num2
) : XINT (num2
);
2136 if (floatp
? f1
== f2
: XINT (num1
) == XINT (num2
))
2141 if (floatp
? f1
!= f2
: XINT (num1
) != XINT (num2
))
2146 if (floatp
? f1
< f2
: XINT (num1
) < XINT (num2
))
2151 if (floatp
? f1
<= f2
: XINT (num1
) <= XINT (num2
))
2156 if (floatp
? f1
> f2
: XINT (num1
) > XINT (num2
))
2161 if (floatp
? f1
>= f2
: XINT (num1
) >= XINT (num2
))
2170 DEFUN ("=", Feqlsign
, Seqlsign
, 2, 2, 0,
2171 doc
: /* Return t if two args, both numbers or markers, are equal. */)
2173 register Lisp_Object num1
, num2
;
2175 return arithcompare (num1
, num2
, equal
);
2178 DEFUN ("<", Flss
, Slss
, 2, 2, 0,
2179 doc
: /* Return t if first arg is less than second arg. Both must be numbers or markers. */)
2181 register Lisp_Object num1
, num2
;
2183 return arithcompare (num1
, num2
, less
);
2186 DEFUN (">", Fgtr
, Sgtr
, 2, 2, 0,
2187 doc
: /* Return t if first arg is greater than second arg. Both must be numbers or markers. */)
2189 register Lisp_Object num1
, num2
;
2191 return arithcompare (num1
, num2
, grtr
);
2194 DEFUN ("<=", Fleq
, Sleq
, 2, 2, 0,
2195 doc
: /* Return t if first arg is less than or equal to second arg.
2196 Both must be numbers or markers. */)
2198 register Lisp_Object num1
, num2
;
2200 return arithcompare (num1
, num2
, less_or_equal
);
2203 DEFUN (">=", Fgeq
, Sgeq
, 2, 2, 0,
2204 doc
: /* Return t if first arg is greater than or equal to second arg.
2205 Both must be numbers or markers. */)
2207 register Lisp_Object num1
, num2
;
2209 return arithcompare (num1
, num2
, grtr_or_equal
);
2212 DEFUN ("/=", Fneq
, Sneq
, 2, 2, 0,
2213 doc
: /* Return t if first arg is not equal to second arg. Both must be numbers or markers. */)
2215 register Lisp_Object num1
, num2
;
2217 return arithcompare (num1
, num2
, notequal
);
2220 DEFUN ("zerop", Fzerop
, Szerop
, 1, 1, 0,
2221 doc
: /* Return t if NUMBER is zero. */)
2223 register Lisp_Object number
;
2225 CHECK_NUMBER_OR_FLOAT (number
);
2227 if (FLOATP (number
))
2229 if (XFLOAT_DATA (number
) == 0.0)
2239 /* Convert between long values and pairs of Lisp integers.
2240 Note that long_to_cons returns a single Lisp integer
2241 when the value fits in one. */
2247 unsigned long top
= i
>> 16;
2248 unsigned int bot
= i
& 0xFFFF;
2250 return make_number (bot
);
2251 if (top
== (unsigned long)-1 >> 16)
2252 return Fcons (make_number (-1), make_number (bot
));
2253 return Fcons (make_number (top
), make_number (bot
));
2260 Lisp_Object top
, bot
;
2267 return ((XINT (top
) << 16) | XINT (bot
));
2270 DEFUN ("number-to-string", Fnumber_to_string
, Snumber_to_string
, 1, 1, 0,
2271 doc
: /* Return the decimal representation of NUMBER as a string.
2272 Uses a minus sign if negative.
2273 NUMBER may be an integer or a floating point number. */)
2277 char buffer
[VALBITS
];
2279 CHECK_NUMBER_OR_FLOAT (number
);
2281 if (FLOATP (number
))
2283 char pigbuf
[350]; /* see comments in float_to_string */
2285 float_to_string (pigbuf
, XFLOAT_DATA (number
));
2286 return build_string (pigbuf
);
2289 if (sizeof (int) == sizeof (EMACS_INT
))
2290 sprintf (buffer
, "%d", (int) XINT (number
));
2291 else if (sizeof (long) == sizeof (EMACS_INT
))
2292 sprintf (buffer
, "%ld", (long) XINT (number
));
2295 return build_string (buffer
);
2299 digit_to_number (character
, base
)
2300 int character
, base
;
2304 if (character
>= '0' && character
<= '9')
2305 digit
= character
- '0';
2306 else if (character
>= 'a' && character
<= 'z')
2307 digit
= character
- 'a' + 10;
2308 else if (character
>= 'A' && character
<= 'Z')
2309 digit
= character
- 'A' + 10;
2319 DEFUN ("string-to-number", Fstring_to_number
, Sstring_to_number
, 1, 2, 0,
2320 doc
: /* Parse STRING as a decimal number and return the number.
2321 This parses both integers and floating point numbers.
2322 It ignores leading spaces and tabs.
2324 If BASE, interpret STRING as a number in that base. If BASE isn't
2325 present, base 10 is used. BASE must be between 2 and 16 (inclusive).
2326 If the base used is not 10, floating point is not recognized. */)
2328 register Lisp_Object string
, base
;
2330 register unsigned char *p
;
2335 CHECK_STRING (string
);
2341 CHECK_NUMBER (base
);
2343 if (b
< 2 || b
> 16)
2344 xsignal1 (Qargs_out_of_range
, base
);
2347 /* Skip any whitespace at the front of the number. Some versions of
2348 atoi do this anyway, so we might as well make Emacs lisp consistent. */
2350 while (*p
== ' ' || *p
== '\t')
2361 if (isfloat_string (p
) && b
== 10)
2362 val
= make_float (sign
* atof (p
));
2369 int digit
= digit_to_number (*p
++, b
);
2375 val
= make_fixnum_or_float (sign
* v
);
2395 static Lisp_Object float_arith_driver
P_ ((double, int, enum arithop
,
2396 int, Lisp_Object
*));
2397 extern Lisp_Object
fmod_float ();
2400 arith_driver (code
, nargs
, args
)
2403 register Lisp_Object
*args
;
2405 register Lisp_Object val
;
2406 register int argnum
;
2407 register EMACS_INT accum
= 0;
2408 register EMACS_INT next
;
2410 switch (SWITCH_ENUM_CAST (code
))
2428 for (argnum
= 0; argnum
< nargs
; argnum
++)
2430 /* Using args[argnum] as argument to CHECK_NUMBER_... */
2432 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val
);
2435 return float_arith_driver ((double) accum
, argnum
, code
,
2438 next
= XINT (args
[argnum
]);
2439 switch (SWITCH_ENUM_CAST (code
))
2445 accum
= argnum
? accum
- next
: nargs
== 1 ? - next
: next
;
2456 xsignal0 (Qarith_error
);
2470 if (!argnum
|| next
> accum
)
2474 if (!argnum
|| next
< accum
)
2480 XSETINT (val
, accum
);
2485 #define isnan(x) ((x) != (x))
2488 float_arith_driver (accum
, argnum
, code
, nargs
, args
)
2490 register int argnum
;
2493 register Lisp_Object
*args
;
2495 register Lisp_Object val
;
2498 for (; argnum
< nargs
; argnum
++)
2500 val
= args
[argnum
]; /* using args[argnum] as argument to CHECK_NUMBER_... */
2501 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val
);
2505 next
= XFLOAT_DATA (val
);
2509 args
[argnum
] = val
; /* runs into a compiler bug. */
2510 next
= XINT (args
[argnum
]);
2512 switch (SWITCH_ENUM_CAST (code
))
2518 accum
= argnum
? accum
- next
: nargs
== 1 ? - next
: next
;
2528 if (! IEEE_FLOATING_POINT
&& next
== 0)
2529 xsignal0 (Qarith_error
);
2536 return wrong_type_argument (Qinteger_or_marker_p
, val
);
2538 if (!argnum
|| isnan (next
) || next
> accum
)
2542 if (!argnum
|| isnan (next
) || next
< accum
)
2548 return make_float (accum
);
2552 DEFUN ("+", Fplus
, Splus
, 0, MANY
, 0,
2553 doc
: /* Return sum of any number of arguments, which are numbers or markers.
2554 usage: (+ &rest NUMBERS-OR-MARKERS) */)
2559 return arith_driver (Aadd
, nargs
, args
);
2562 DEFUN ("-", Fminus
, Sminus
, 0, MANY
, 0,
2563 doc
: /* Negate number or subtract numbers or markers and return the result.
2564 With one arg, negates it. With more than one arg,
2565 subtracts all but the first from the first.
2566 usage: (- &optional NUMBER-OR-MARKER &rest MORE-NUMBERS-OR-MARKERS) */)
2571 return arith_driver (Asub
, nargs
, args
);
2574 DEFUN ("*", Ftimes
, Stimes
, 0, MANY
, 0,
2575 doc
: /* Return product of any number of arguments, which are numbers or markers.
2576 usage: (* &rest NUMBERS-OR-MARKERS) */)
2581 return arith_driver (Amult
, nargs
, args
);
2584 DEFUN ("/", Fquo
, Squo
, 2, MANY
, 0,
2585 doc
: /* Return first argument divided by all the remaining arguments.
2586 The arguments must be numbers or markers.
2587 usage: (/ DIVIDEND DIVISOR &rest DIVISORS) */)
2593 for (argnum
= 2; argnum
< nargs
; argnum
++)
2594 if (FLOATP (args
[argnum
]))
2595 return float_arith_driver (0, 0, Adiv
, nargs
, args
);
2596 return arith_driver (Adiv
, nargs
, args
);
2599 DEFUN ("%", Frem
, Srem
, 2, 2, 0,
2600 doc
: /* Return remainder of X divided by Y.
2601 Both must be integers or markers. */)
2603 register Lisp_Object x
, y
;
2607 CHECK_NUMBER_COERCE_MARKER (x
);
2608 CHECK_NUMBER_COERCE_MARKER (y
);
2610 if (XFASTINT (y
) == 0)
2611 xsignal0 (Qarith_error
);
2613 XSETINT (val
, XINT (x
) % XINT (y
));
2627 /* If the magnitude of the result exceeds that of the divisor, or
2628 the sign of the result does not agree with that of the dividend,
2629 iterate with the reduced value. This does not yield a
2630 particularly accurate result, but at least it will be in the
2631 range promised by fmod. */
2633 r
-= f2
* floor (r
/ f2
);
2634 while (f2
<= (r
< 0 ? -r
: r
) || ((r
< 0) != (f1
< 0) && ! isnan (r
)));
2638 #endif /* ! HAVE_FMOD */
2640 DEFUN ("mod", Fmod
, Smod
, 2, 2, 0,
2641 doc
: /* Return X modulo Y.
2642 The result falls between zero (inclusive) and Y (exclusive).
2643 Both X and Y must be numbers or markers. */)
2645 register Lisp_Object x
, y
;
2650 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (x
);
2651 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (y
);
2653 if (FLOATP (x
) || FLOATP (y
))
2654 return fmod_float (x
, y
);
2660 xsignal0 (Qarith_error
);
2664 /* If the "remainder" comes out with the wrong sign, fix it. */
2665 if (i2
< 0 ? i1
> 0 : i1
< 0)
2672 DEFUN ("max", Fmax
, Smax
, 1, MANY
, 0,
2673 doc
: /* Return largest of all the arguments (which must be numbers or markers).
2674 The value is always a number; markers are converted to numbers.
2675 usage: (max NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */)
2680 return arith_driver (Amax
, nargs
, args
);
2683 DEFUN ("min", Fmin
, Smin
, 1, MANY
, 0,
2684 doc
: /* Return smallest of all the arguments (which must be numbers or markers).
2685 The value is always a number; markers are converted to numbers.
2686 usage: (min NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */)
2691 return arith_driver (Amin
, nargs
, args
);
2694 DEFUN ("logand", Flogand
, Slogand
, 0, MANY
, 0,
2695 doc
: /* Return bitwise-and of all the arguments.
2696 Arguments may be integers, or markers converted to integers.
2697 usage: (logand &rest INTS-OR-MARKERS) */)
2702 return arith_driver (Alogand
, nargs
, args
);
2705 DEFUN ("logior", Flogior
, Slogior
, 0, MANY
, 0,
2706 doc
: /* Return bitwise-or of all the arguments.
2707 Arguments may be integers, or markers converted to integers.
2708 usage: (logior &rest INTS-OR-MARKERS) */)
2713 return arith_driver (Alogior
, nargs
, args
);
2716 DEFUN ("logxor", Flogxor
, Slogxor
, 0, MANY
, 0,
2717 doc
: /* Return bitwise-exclusive-or of all the arguments.
2718 Arguments may be integers, or markers converted to integers.
2719 usage: (logxor &rest INTS-OR-MARKERS) */)
2724 return arith_driver (Alogxor
, nargs
, args
);
2727 DEFUN ("ash", Fash
, Sash
, 2, 2, 0,
2728 doc
: /* Return VALUE with its bits shifted left by COUNT.
2729 If COUNT is negative, shifting is actually to the right.
2730 In this case, the sign bit is duplicated. */)
2732 register Lisp_Object value
, count
;
2734 register Lisp_Object val
;
2736 CHECK_NUMBER (value
);
2737 CHECK_NUMBER (count
);
2739 if (XINT (count
) >= BITS_PER_EMACS_INT
)
2741 else if (XINT (count
) > 0)
2742 XSETINT (val
, XINT (value
) << XFASTINT (count
));
2743 else if (XINT (count
) <= -BITS_PER_EMACS_INT
)
2744 XSETINT (val
, XINT (value
) < 0 ? -1 : 0);
2746 XSETINT (val
, XINT (value
) >> -XINT (count
));
2750 DEFUN ("lsh", Flsh
, Slsh
, 2, 2, 0,
2751 doc
: /* Return VALUE with its bits shifted left by COUNT.
2752 If COUNT is negative, shifting is actually to the right.
2753 In this case, zeros are shifted in on the left. */)
2755 register Lisp_Object value
, count
;
2757 register Lisp_Object val
;
2759 CHECK_NUMBER (value
);
2760 CHECK_NUMBER (count
);
2762 if (XINT (count
) >= BITS_PER_EMACS_INT
)
2764 else if (XINT (count
) > 0)
2765 XSETINT (val
, (EMACS_UINT
) XUINT (value
) << XFASTINT (count
));
2766 else if (XINT (count
) <= -BITS_PER_EMACS_INT
)
2769 XSETINT (val
, (EMACS_UINT
) XUINT (value
) >> -XINT (count
));
2773 DEFUN ("1+", Fadd1
, Sadd1
, 1, 1, 0,
2774 doc
: /* Return NUMBER plus one. NUMBER may be a number or a marker.
2775 Markers are converted to integers. */)
2777 register Lisp_Object number
;
2779 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number
);
2781 if (FLOATP (number
))
2782 return (make_float (1.0 + XFLOAT_DATA (number
)));
2784 XSETINT (number
, XINT (number
) + 1);
2788 DEFUN ("1-", Fsub1
, Ssub1
, 1, 1, 0,
2789 doc
: /* Return NUMBER minus one. NUMBER may be a number or a marker.
2790 Markers are converted to integers. */)
2792 register Lisp_Object number
;
2794 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number
);
2796 if (FLOATP (number
))
2797 return (make_float (-1.0 + XFLOAT_DATA (number
)));
2799 XSETINT (number
, XINT (number
) - 1);
2803 DEFUN ("lognot", Flognot
, Slognot
, 1, 1, 0,
2804 doc
: /* Return the bitwise complement of NUMBER. NUMBER must be an integer. */)
2806 register Lisp_Object number
;
2808 CHECK_NUMBER (number
);
2809 XSETINT (number
, ~XINT (number
));
2813 DEFUN ("byteorder", Fbyteorder
, Sbyteorder
, 0, 0, 0,
2814 doc
: /* Return the byteorder for the machine.
2815 Returns 66 (ASCII uppercase B) for big endian machines or 108 (ASCII
2816 lowercase l) for small endian machines. */)
2819 unsigned i
= 0x04030201;
2820 int order
= *(char *)&i
== 1 ? 108 : 66;
2822 return make_number (order
);
2830 Lisp_Object error_tail
, arith_tail
;
2832 Qquote
= intern ("quote");
2833 Qlambda
= intern ("lambda");
2834 Qsubr
= intern ("subr");
2835 Qerror_conditions
= intern ("error-conditions");
2836 Qerror_message
= intern ("error-message");
2837 Qtop_level
= intern ("top-level");
2839 Qerror
= intern ("error");
2840 Qquit
= intern ("quit");
2841 Qwrong_type_argument
= intern ("wrong-type-argument");
2842 Qargs_out_of_range
= intern ("args-out-of-range");
2843 Qvoid_function
= intern ("void-function");
2844 Qcyclic_function_indirection
= intern ("cyclic-function-indirection");
2845 Qcyclic_variable_indirection
= intern ("cyclic-variable-indirection");
2846 Qvoid_variable
= intern ("void-variable");
2847 Qsetting_constant
= intern ("setting-constant");
2848 Qinvalid_read_syntax
= intern ("invalid-read-syntax");
2850 Qinvalid_function
= intern ("invalid-function");
2851 Qwrong_number_of_arguments
= intern ("wrong-number-of-arguments");
2852 Qno_catch
= intern ("no-catch");
2853 Qend_of_file
= intern ("end-of-file");
2854 Qarith_error
= intern ("arith-error");
2855 Qbeginning_of_buffer
= intern ("beginning-of-buffer");
2856 Qend_of_buffer
= intern ("end-of-buffer");
2857 Qbuffer_read_only
= intern ("buffer-read-only");
2858 Qtext_read_only
= intern ("text-read-only");
2859 Qmark_inactive
= intern ("mark-inactive");
2861 Qlistp
= intern ("listp");
2862 Qconsp
= intern ("consp");
2863 Qsymbolp
= intern ("symbolp");
2864 Qkeywordp
= intern ("keywordp");
2865 Qintegerp
= intern ("integerp");
2866 Qnatnump
= intern ("natnump");
2867 Qwholenump
= intern ("wholenump");
2868 Qstringp
= intern ("stringp");
2869 Qarrayp
= intern ("arrayp");
2870 Qsequencep
= intern ("sequencep");
2871 Qbufferp
= intern ("bufferp");
2872 Qvectorp
= intern ("vectorp");
2873 Qchar_or_string_p
= intern ("char-or-string-p");
2874 Qmarkerp
= intern ("markerp");
2875 Qbuffer_or_string_p
= intern ("buffer-or-string-p");
2876 Qinteger_or_marker_p
= intern ("integer-or-marker-p");
2877 Qboundp
= intern ("boundp");
2878 Qfboundp
= intern ("fboundp");
2880 Qfloatp
= intern ("floatp");
2881 Qnumberp
= intern ("numberp");
2882 Qnumber_or_marker_p
= intern ("number-or-marker-p");
2884 Qchar_table_p
= intern ("char-table-p");
2885 Qvector_or_char_table_p
= intern ("vector-or-char-table-p");
2887 Qsubrp
= intern ("subrp");
2888 Qunevalled
= intern ("unevalled");
2889 Qmany
= intern ("many");
2891 Qcdr
= intern ("cdr");
2893 /* Handle automatic advice activation */
2894 Qad_advice_info
= intern ("ad-advice-info");
2895 Qad_activate_internal
= intern ("ad-activate-internal");
2897 error_tail
= Fcons (Qerror
, Qnil
);
2899 /* ERROR is used as a signaler for random errors for which nothing else is right */
2901 Fput (Qerror
, Qerror_conditions
,
2903 Fput (Qerror
, Qerror_message
,
2904 build_string ("error"));
2906 Fput (Qquit
, Qerror_conditions
,
2907 Fcons (Qquit
, Qnil
));
2908 Fput (Qquit
, Qerror_message
,
2909 build_string ("Quit"));
2911 Fput (Qwrong_type_argument
, Qerror_conditions
,
2912 Fcons (Qwrong_type_argument
, error_tail
));
2913 Fput (Qwrong_type_argument
, Qerror_message
,
2914 build_string ("Wrong type argument"));
2916 Fput (Qargs_out_of_range
, Qerror_conditions
,
2917 Fcons (Qargs_out_of_range
, error_tail
));
2918 Fput (Qargs_out_of_range
, Qerror_message
,
2919 build_string ("Args out of range"));
2921 Fput (Qvoid_function
, Qerror_conditions
,
2922 Fcons (Qvoid_function
, error_tail
));
2923 Fput (Qvoid_function
, Qerror_message
,
2924 build_string ("Symbol's function definition is void"));
2926 Fput (Qcyclic_function_indirection
, Qerror_conditions
,
2927 Fcons (Qcyclic_function_indirection
, error_tail
));
2928 Fput (Qcyclic_function_indirection
, Qerror_message
,
2929 build_string ("Symbol's chain of function indirections contains a loop"));
2931 Fput (Qcyclic_variable_indirection
, Qerror_conditions
,
2932 Fcons (Qcyclic_variable_indirection
, error_tail
));
2933 Fput (Qcyclic_variable_indirection
, Qerror_message
,
2934 build_string ("Symbol's chain of variable indirections contains a loop"));
2936 Qcircular_list
= intern ("circular-list");
2937 staticpro (&Qcircular_list
);
2938 Fput (Qcircular_list
, Qerror_conditions
,
2939 Fcons (Qcircular_list
, error_tail
));
2940 Fput (Qcircular_list
, Qerror_message
,
2941 build_string ("List contains a loop"));
2943 Fput (Qvoid_variable
, Qerror_conditions
,
2944 Fcons (Qvoid_variable
, error_tail
));
2945 Fput (Qvoid_variable
, Qerror_message
,
2946 build_string ("Symbol's value as variable is void"));
2948 Fput (Qsetting_constant
, Qerror_conditions
,
2949 Fcons (Qsetting_constant
, error_tail
));
2950 Fput (Qsetting_constant
, Qerror_message
,
2951 build_string ("Attempt to set a constant symbol"));
2953 Fput (Qinvalid_read_syntax
, Qerror_conditions
,
2954 Fcons (Qinvalid_read_syntax
, error_tail
));
2955 Fput (Qinvalid_read_syntax
, Qerror_message
,
2956 build_string ("Invalid read syntax"));
2958 Fput (Qinvalid_function
, Qerror_conditions
,
2959 Fcons (Qinvalid_function
, error_tail
));
2960 Fput (Qinvalid_function
, Qerror_message
,
2961 build_string ("Invalid function"));
2963 Fput (Qwrong_number_of_arguments
, Qerror_conditions
,
2964 Fcons (Qwrong_number_of_arguments
, error_tail
));
2965 Fput (Qwrong_number_of_arguments
, Qerror_message
,
2966 build_string ("Wrong number of arguments"));
2968 Fput (Qno_catch
, Qerror_conditions
,
2969 Fcons (Qno_catch
, error_tail
));
2970 Fput (Qno_catch
, Qerror_message
,
2971 build_string ("No catch for tag"));
2973 Fput (Qend_of_file
, Qerror_conditions
,
2974 Fcons (Qend_of_file
, error_tail
));
2975 Fput (Qend_of_file
, Qerror_message
,
2976 build_string ("End of file during parsing"));
2978 arith_tail
= Fcons (Qarith_error
, error_tail
);
2979 Fput (Qarith_error
, Qerror_conditions
,
2981 Fput (Qarith_error
, Qerror_message
,
2982 build_string ("Arithmetic error"));
2984 Fput (Qbeginning_of_buffer
, Qerror_conditions
,
2985 Fcons (Qbeginning_of_buffer
, error_tail
));
2986 Fput (Qbeginning_of_buffer
, Qerror_message
,
2987 build_string ("Beginning of buffer"));
2989 Fput (Qend_of_buffer
, Qerror_conditions
,
2990 Fcons (Qend_of_buffer
, error_tail
));
2991 Fput (Qend_of_buffer
, Qerror_message
,
2992 build_string ("End of buffer"));
2994 Fput (Qbuffer_read_only
, Qerror_conditions
,
2995 Fcons (Qbuffer_read_only
, error_tail
));
2996 Fput (Qbuffer_read_only
, Qerror_message
,
2997 build_string ("Buffer is read-only"));
2999 Fput (Qtext_read_only
, Qerror_conditions
,
3000 Fcons (Qtext_read_only
, error_tail
));
3001 Fput (Qtext_read_only
, Qerror_message
,
3002 build_string ("Text is read-only"));
3004 Qrange_error
= intern ("range-error");
3005 Qdomain_error
= intern ("domain-error");
3006 Qsingularity_error
= intern ("singularity-error");
3007 Qoverflow_error
= intern ("overflow-error");
3008 Qunderflow_error
= intern ("underflow-error");
3010 Fput (Qdomain_error
, Qerror_conditions
,
3011 Fcons (Qdomain_error
, arith_tail
));
3012 Fput (Qdomain_error
, Qerror_message
,
3013 build_string ("Arithmetic domain error"));
3015 Fput (Qrange_error
, Qerror_conditions
,
3016 Fcons (Qrange_error
, arith_tail
));
3017 Fput (Qrange_error
, Qerror_message
,
3018 build_string ("Arithmetic range error"));
3020 Fput (Qsingularity_error
, Qerror_conditions
,
3021 Fcons (Qsingularity_error
, Fcons (Qdomain_error
, arith_tail
)));
3022 Fput (Qsingularity_error
, Qerror_message
,
3023 build_string ("Arithmetic singularity error"));
3025 Fput (Qoverflow_error
, Qerror_conditions
,
3026 Fcons (Qoverflow_error
, Fcons (Qdomain_error
, arith_tail
)));
3027 Fput (Qoverflow_error
, Qerror_message
,
3028 build_string ("Arithmetic overflow error"));
3030 Fput (Qunderflow_error
, Qerror_conditions
,
3031 Fcons (Qunderflow_error
, Fcons (Qdomain_error
, arith_tail
)));
3032 Fput (Qunderflow_error
, Qerror_message
,
3033 build_string ("Arithmetic underflow error"));
3035 staticpro (&Qrange_error
);
3036 staticpro (&Qdomain_error
);
3037 staticpro (&Qsingularity_error
);
3038 staticpro (&Qoverflow_error
);
3039 staticpro (&Qunderflow_error
);
3043 staticpro (&Qquote
);
3044 staticpro (&Qlambda
);
3046 staticpro (&Qunbound
);
3047 staticpro (&Qerror_conditions
);
3048 staticpro (&Qerror_message
);
3049 staticpro (&Qtop_level
);
3051 staticpro (&Qerror
);
3053 staticpro (&Qwrong_type_argument
);
3054 staticpro (&Qargs_out_of_range
);
3055 staticpro (&Qvoid_function
);
3056 staticpro (&Qcyclic_function_indirection
);
3057 staticpro (&Qcyclic_variable_indirection
);
3058 staticpro (&Qvoid_variable
);
3059 staticpro (&Qsetting_constant
);
3060 staticpro (&Qinvalid_read_syntax
);
3061 staticpro (&Qwrong_number_of_arguments
);
3062 staticpro (&Qinvalid_function
);
3063 staticpro (&Qno_catch
);
3064 staticpro (&Qend_of_file
);
3065 staticpro (&Qarith_error
);
3066 staticpro (&Qbeginning_of_buffer
);
3067 staticpro (&Qend_of_buffer
);
3068 staticpro (&Qbuffer_read_only
);
3069 staticpro (&Qtext_read_only
);
3070 staticpro (&Qmark_inactive
);
3072 staticpro (&Qlistp
);
3073 staticpro (&Qconsp
);
3074 staticpro (&Qsymbolp
);
3075 staticpro (&Qkeywordp
);
3076 staticpro (&Qintegerp
);
3077 staticpro (&Qnatnump
);
3078 staticpro (&Qwholenump
);
3079 staticpro (&Qstringp
);
3080 staticpro (&Qarrayp
);
3081 staticpro (&Qsequencep
);
3082 staticpro (&Qbufferp
);
3083 staticpro (&Qvectorp
);
3084 staticpro (&Qchar_or_string_p
);
3085 staticpro (&Qmarkerp
);
3086 staticpro (&Qbuffer_or_string_p
);
3087 staticpro (&Qinteger_or_marker_p
);
3088 staticpro (&Qfloatp
);
3089 staticpro (&Qnumberp
);
3090 staticpro (&Qnumber_or_marker_p
);
3091 staticpro (&Qchar_table_p
);
3092 staticpro (&Qvector_or_char_table_p
);
3093 staticpro (&Qsubrp
);
3095 staticpro (&Qunevalled
);
3097 staticpro (&Qboundp
);
3098 staticpro (&Qfboundp
);
3100 staticpro (&Qad_advice_info
);
3101 staticpro (&Qad_activate_internal
);
3103 /* Types that type-of returns. */
3104 Qinteger
= intern ("integer");
3105 Qsymbol
= intern ("symbol");
3106 Qstring
= intern ("string");
3107 Qcons
= intern ("cons");
3108 Qmarker
= intern ("marker");
3109 Qoverlay
= intern ("overlay");
3110 Qfloat
= intern ("float");
3111 Qwindow_configuration
= intern ("window-configuration");
3112 Qprocess
= intern ("process");
3113 Qwindow
= intern ("window");
3114 /* Qsubr = intern ("subr"); */
3115 Qcompiled_function
= intern ("compiled-function");
3116 Qbuffer
= intern ("buffer");
3117 Qframe
= intern ("frame");
3118 Qvector
= intern ("vector");
3119 Qchar_table
= intern ("char-table");
3120 Qbool_vector
= intern ("bool-vector");
3121 Qhash_table
= intern ("hash-table");
3123 staticpro (&Qinteger
);
3124 staticpro (&Qsymbol
);
3125 staticpro (&Qstring
);
3127 staticpro (&Qmarker
);
3128 staticpro (&Qoverlay
);
3129 staticpro (&Qfloat
);
3130 staticpro (&Qwindow_configuration
);
3131 staticpro (&Qprocess
);
3132 staticpro (&Qwindow
);
3133 /* staticpro (&Qsubr); */
3134 staticpro (&Qcompiled_function
);
3135 staticpro (&Qbuffer
);
3136 staticpro (&Qframe
);
3137 staticpro (&Qvector
);
3138 staticpro (&Qchar_table
);
3139 staticpro (&Qbool_vector
);
3140 staticpro (&Qhash_table
);
3142 defsubr (&Sindirect_variable
);
3143 defsubr (&Sinteractive_form
);
3146 defsubr (&Stype_of
);
3151 defsubr (&Sintegerp
);
3152 defsubr (&Sinteger_or_marker_p
);
3153 defsubr (&Snumberp
);
3154 defsubr (&Snumber_or_marker_p
);
3156 defsubr (&Snatnump
);
3157 defsubr (&Ssymbolp
);
3158 defsubr (&Skeywordp
);
3159 defsubr (&Sstringp
);
3160 defsubr (&Smultibyte_string_p
);
3161 defsubr (&Svectorp
);
3162 defsubr (&Schar_table_p
);
3163 defsubr (&Svector_or_char_table_p
);
3164 defsubr (&Sbool_vector_p
);
3166 defsubr (&Ssequencep
);
3167 defsubr (&Sbufferp
);
3168 defsubr (&Smarkerp
);
3170 defsubr (&Sbyte_code_function_p
);
3171 defsubr (&Schar_or_string_p
);
3174 defsubr (&Scar_safe
);
3175 defsubr (&Scdr_safe
);
3178 defsubr (&Ssymbol_function
);
3179 defsubr (&Sindirect_function
);
3180 defsubr (&Ssymbol_plist
);
3181 defsubr (&Ssymbol_name
);
3182 defsubr (&Smakunbound
);
3183 defsubr (&Sfmakunbound
);
3185 defsubr (&Sfboundp
);
3187 defsubr (&Sdefalias
);
3188 defsubr (&Ssetplist
);
3189 defsubr (&Ssymbol_value
);
3191 defsubr (&Sdefault_boundp
);
3192 defsubr (&Sdefault_value
);
3193 defsubr (&Sset_default
);
3194 defsubr (&Ssetq_default
);
3195 defsubr (&Smake_variable_buffer_local
);
3196 defsubr (&Smake_local_variable
);
3197 defsubr (&Skill_local_variable
);
3198 defsubr (&Smake_variable_frame_local
);
3199 defsubr (&Slocal_variable_p
);
3200 defsubr (&Slocal_variable_if_set_p
);
3201 defsubr (&Svariable_binding_locus
);
3202 #if 0 /* XXX Remove this. --lorentey */
3203 defsubr (&Sterminal_local_value
);
3204 defsubr (&Sset_terminal_local_value
);
3208 defsubr (&Snumber_to_string
);
3209 defsubr (&Sstring_to_number
);
3210 defsubr (&Seqlsign
);
3233 defsubr (&Sbyteorder
);
3234 defsubr (&Ssubr_arity
);
3235 defsubr (&Ssubr_name
);
3237 XSYMBOL (Qwholenump
)->function
= XSYMBOL (Qnatnump
)->function
;
3239 DEFVAR_LISP ("most-positive-fixnum", &Vmost_positive_fixnum
,
3240 doc
: /* The largest value that is representable in a Lisp integer. */);
3241 Vmost_positive_fixnum
= make_number (MOST_POSITIVE_FIXNUM
);
3242 XSYMBOL (intern ("most-positive-fixnum"))->constant
= 1;
3244 DEFVAR_LISP ("most-negative-fixnum", &Vmost_negative_fixnum
,
3245 doc
: /* The smallest value that is representable in a Lisp integer. */);
3246 Vmost_negative_fixnum
= make_number (MOST_NEGATIVE_FIXNUM
);
3247 XSYMBOL (intern ("most-negative-fixnum"))->constant
= 1;
3254 #if defined(USG) && !defined(POSIX_SIGNALS)
3255 /* USG systems forget handlers when they are used;
3256 must reestablish each time */
3257 signal (signo
, arith_error
);
3260 /* VMS systems are like USG. */
3261 signal (signo
, arith_error
);
3265 #else /* not BSD4_1 */
3266 sigsetmask (SIGEMPTYMASK
);
3267 #endif /* not BSD4_1 */
3269 SIGNAL_THREAD_CHECK (signo
);
3270 xsignal0 (Qarith_error
);
3276 /* Don't do this if just dumping out.
3277 We don't want to call `signal' in this case
3278 so that we don't have trouble with dumping
3279 signal-delivering routines in an inconsistent state. */
3283 #endif /* CANNOT_DUMP */
3284 signal (SIGFPE
, arith_error
);
3287 signal (SIGEMT
, arith_error
);
3291 /* arch-tag: 25879798-b84d-479a-9c89-7d148e2109f7
3292 (do not change this comment) */