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, 2010
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/>. */
28 #include "character.h"
32 #include "syssignal.h"
33 #include "termhooks.h" /* For FRAME_KBOARD reference in y-or-n-p. */
40 /* If IEEE_FLOATING_POINT isn't defined, default it from FLT_*. */
41 #ifndef IEEE_FLOATING_POINT
42 #if (FLT_RADIX == 2 && FLT_MANT_DIG == 24 \
43 && FLT_MIN_EXP == -125 && FLT_MAX_EXP == 128)
44 #define IEEE_FLOATING_POINT 1
46 #define IEEE_FLOATING_POINT 0
53 extern double atof ();
56 Lisp_Object Qnil
, Qt
, Qquote
, Qlambda
, Qsubr
, Qunbound
, Qthread_local_mark
;
57 Lisp_Object Qerror_conditions
, Qerror_message
, Qtop_level
;
58 Lisp_Object Qerror
, Qquit
, Qwrong_type_argument
, Qargs_out_of_range
;
59 Lisp_Object Qvoid_variable
, Qvoid_function
, Qcyclic_function_indirection
;
60 Lisp_Object Qcyclic_variable_indirection
, Qcircular_list
;
61 Lisp_Object Qsetting_constant
, Qinvalid_read_syntax
;
62 Lisp_Object Qinvalid_function
, Qwrong_number_of_arguments
, Qno_catch
;
63 Lisp_Object Qend_of_file
, Qarith_error
, Qmark_inactive
;
64 Lisp_Object Qbeginning_of_buffer
, Qend_of_buffer
, Qbuffer_read_only
;
65 Lisp_Object Qtext_read_only
;
67 Lisp_Object Qintegerp
, Qnatnump
, Qwholenump
, Qsymbolp
, Qlistp
, Qconsp
;
68 Lisp_Object Qstringp
, Qarrayp
, Qsequencep
, Qbufferp
;
69 Lisp_Object Qchar_or_string_p
, Qmarkerp
, Qinteger_or_marker_p
, Qvectorp
;
70 Lisp_Object Qbuffer_or_string_p
, Qkeywordp
;
71 Lisp_Object Qboundp
, Qfboundp
;
72 Lisp_Object Qchar_table_p
, Qvector_or_char_table_p
;
75 Lisp_Object Qad_advice_info
, Qad_activate_internal
;
77 Lisp_Object Qrange_error
, Qdomain_error
, Qsingularity_error
;
78 Lisp_Object Qoverflow_error
, Qunderflow_error
;
81 Lisp_Object Qnumberp
, Qnumber_or_marker_p
;
84 static Lisp_Object Qsymbol
, Qstring
, Qcons
, Qmarker
, Qoverlay
;
85 static Lisp_Object Qfloat
, Qwindow_configuration
, Qwindow
;
87 static Lisp_Object Qcompiled_function
, Qbuffer
, Qframe
, Qvector
;
88 static Lisp_Object Qchar_table
, Qbool_vector
, Qhash_table
;
89 static Lisp_Object Qsubrp
, Qmany
, Qunevalled
;
90 Lisp_Object Qfont_spec
, Qfont_entity
, Qfont_object
;
92 Lisp_Object Qinteractive_form
;
94 static Lisp_Object swap_in_symval_forwarding
P_ ((Lisp_Object
, Lisp_Object
));
96 Lisp_Object impl_Vmost_positive_fixnum
, impl_Vmost_negative_fixnum
;
99 circular_list_error (list
)
102 xsignal (Qcircular_list
, list
);
107 wrong_type_argument (predicate
, value
)
108 register Lisp_Object predicate
, value
;
110 /* If VALUE is not even a valid Lisp object, we'd want to abort here
111 where we can get a backtrace showing where it came from. We used
112 to try and do that by checking the tagbits, but nowadays all
113 tagbits are potentially valid. */
114 /* if ((unsigned int) XTYPE (value) >= Lisp_Type_Limit)
117 xsignal2 (Qwrong_type_argument
, predicate
, value
);
123 error ("Attempt to modify read-only object");
127 args_out_of_range (a1
, a2
)
130 xsignal2 (Qargs_out_of_range
, a1
, a2
);
134 args_out_of_range_3 (a1
, a2
, a3
)
135 Lisp_Object a1
, a2
, a3
;
137 xsignal3 (Qargs_out_of_range
, a1
, a2
, a3
);
140 /* On some machines, XINT needs a temporary location.
141 Here it is, in case it is needed. */
143 int sign_extend_temp
;
145 /* On a few machines, XINT can only be done by calling this. */
148 sign_extend_lisp_int (num
)
151 if (num
& (((EMACS_INT
) 1) << (VALBITS
- 1)))
152 return num
| (((EMACS_INT
) (-1)) << VALBITS
);
154 return num
& ((((EMACS_INT
) 1) << VALBITS
) - 1);
157 /* Data type predicates */
159 DEFUN ("eq", Feq
, Seq
, 2, 2, 0,
160 doc
: /* Return t if the two args are the same Lisp object. */)
162 Lisp_Object obj1
, obj2
;
169 DEFUN ("null", Fnull
, Snull
, 1, 1, 0,
170 doc
: /* Return t if OBJECT is nil. */)
179 DEFUN ("type-of", Ftype_of
, Stype_of
, 1, 1, 0,
180 doc
: /* Return a symbol representing the type of OBJECT.
181 The symbol returned names the object's basic type;
182 for example, (type-of 1) returns `integer'. */)
186 switch (XTYPE (object
))
201 switch (XMISCTYPE (object
))
203 case Lisp_Misc_Marker
:
205 case Lisp_Misc_Overlay
:
207 case Lisp_Misc_Float
:
212 case Lisp_Vectorlike
:
213 if (WINDOW_CONFIGURATIONP (object
))
214 return Qwindow_configuration
;
215 if (PROCESSP (object
))
217 if (WINDOWP (object
))
221 if (COMPILEDP (object
))
222 return Qcompiled_function
;
223 if (BUFFERP (object
))
225 if (CHAR_TABLE_P (object
))
227 if (BOOL_VECTOR_P (object
))
231 if (HASH_TABLE_P (object
))
233 if (FONT_SPEC_P (object
))
235 if (FONT_ENTITY_P (object
))
237 if (FONT_OBJECT_P (object
))
249 DEFUN ("consp", Fconsp
, Sconsp
, 1, 1, 0,
250 doc
: /* Return t if OBJECT is a cons cell. */)
259 DEFUN ("atom", Fatom
, Satom
, 1, 1, 0,
260 doc
: /* Return t if OBJECT is not a cons cell. This includes nil. */)
269 DEFUN ("listp", Flistp
, Slistp
, 1, 1, 0,
270 doc
: /* Return t if OBJECT is a list, that is, a cons cell or nil.
271 Otherwise, return nil. */)
275 if (CONSP (object
) || NILP (object
))
280 DEFUN ("nlistp", Fnlistp
, Snlistp
, 1, 1, 0,
281 doc
: /* Return t if OBJECT is not a list. Lists include nil. */)
285 if (CONSP (object
) || NILP (object
))
290 DEFUN ("symbolp", Fsymbolp
, Ssymbolp
, 1, 1, 0,
291 doc
: /* Return t if OBJECT is a symbol. */)
295 if (SYMBOLP (object
))
300 /* Define this in C to avoid unnecessarily consing up the symbol
302 DEFUN ("keywordp", Fkeywordp
, Skeywordp
, 1, 1, 0,
303 doc
: /* Return t if OBJECT is a keyword.
304 This means that it is a symbol with a print name beginning with `:'
305 interned in the initial obarray. */)
310 && SREF (SYMBOL_NAME (object
), 0) == ':'
311 && SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P (object
))
316 DEFUN ("vectorp", Fvectorp
, Svectorp
, 1, 1, 0,
317 doc
: /* Return t if OBJECT is a vector. */)
321 if (VECTORP (object
))
326 DEFUN ("stringp", Fstringp
, Sstringp
, 1, 1, 0,
327 doc
: /* Return t if OBJECT is a string. */)
331 if (STRINGP (object
))
336 DEFUN ("multibyte-string-p", Fmultibyte_string_p
, Smultibyte_string_p
,
338 doc
: /* Return t if OBJECT is a multibyte string. */)
342 if (STRINGP (object
) && STRING_MULTIBYTE (object
))
347 DEFUN ("char-table-p", Fchar_table_p
, Schar_table_p
, 1, 1, 0,
348 doc
: /* Return t if OBJECT is a char-table. */)
352 if (CHAR_TABLE_P (object
))
357 DEFUN ("vector-or-char-table-p", Fvector_or_char_table_p
,
358 Svector_or_char_table_p
, 1, 1, 0,
359 doc
: /* Return t if OBJECT is a char-table or vector. */)
363 if (VECTORP (object
) || CHAR_TABLE_P (object
))
368 DEFUN ("bool-vector-p", Fbool_vector_p
, Sbool_vector_p
, 1, 1, 0,
369 doc
: /* Return t if OBJECT is a bool-vector. */)
373 if (BOOL_VECTOR_P (object
))
378 DEFUN ("arrayp", Farrayp
, Sarrayp
, 1, 1, 0,
379 doc
: /* Return t if OBJECT is an array (string or vector). */)
388 DEFUN ("sequencep", Fsequencep
, Ssequencep
, 1, 1, 0,
389 doc
: /* Return t if OBJECT is a sequence (list or array). */)
391 register Lisp_Object object
;
393 if (CONSP (object
) || NILP (object
) || ARRAYP (object
))
398 DEFUN ("bufferp", Fbufferp
, Sbufferp
, 1, 1, 0,
399 doc
: /* Return t if OBJECT is an editor buffer. */)
403 if (BUFFERP (object
))
408 DEFUN ("markerp", Fmarkerp
, Smarkerp
, 1, 1, 0,
409 doc
: /* Return t if OBJECT is a marker (editor pointer). */)
413 if (MARKERP (object
))
418 DEFUN ("subrp", Fsubrp
, Ssubrp
, 1, 1, 0,
419 doc
: /* Return t if OBJECT is a built-in function. */)
428 DEFUN ("byte-code-function-p", Fbyte_code_function_p
, Sbyte_code_function_p
,
430 doc
: /* Return t if OBJECT is a byte-compiled function object. */)
434 if (COMPILEDP (object
))
439 DEFUN ("char-or-string-p", Fchar_or_string_p
, Schar_or_string_p
, 1, 1, 0,
440 doc
: /* Return t if OBJECT is a character or a string. */)
442 register Lisp_Object object
;
444 if (CHARACTERP (object
) || STRINGP (object
))
449 DEFUN ("integerp", Fintegerp
, Sintegerp
, 1, 1, 0,
450 doc
: /* Return t if OBJECT is an integer. */)
454 if (INTEGERP (object
))
459 DEFUN ("integer-or-marker-p", Finteger_or_marker_p
, Sinteger_or_marker_p
, 1, 1, 0,
460 doc
: /* Return t if OBJECT is an integer or a marker (editor pointer). */)
462 register Lisp_Object object
;
464 if (MARKERP (object
) || INTEGERP (object
))
469 DEFUN ("natnump", Fnatnump
, Snatnump
, 1, 1, 0,
470 doc
: /* Return t if OBJECT is a nonnegative integer. */)
474 if (NATNUMP (object
))
479 DEFUN ("numberp", Fnumberp
, Snumberp
, 1, 1, 0,
480 doc
: /* Return t if OBJECT is a number (floating point or integer). */)
484 if (NUMBERP (object
))
490 DEFUN ("number-or-marker-p", Fnumber_or_marker_p
,
491 Snumber_or_marker_p
, 1, 1, 0,
492 doc
: /* Return t if OBJECT is a number or a marker. */)
496 if (NUMBERP (object
) || MARKERP (object
))
501 DEFUN ("floatp", Ffloatp
, Sfloatp
, 1, 1, 0,
502 doc
: /* Return t if OBJECT is a floating point number. */)
512 /* Extract and set components of lists */
514 DEFUN ("car", Fcar
, Scar
, 1, 1, 0,
515 doc
: /* Return the car of LIST. If arg is nil, return nil.
516 Error if arg is not nil and not a cons cell. See also `car-safe'.
518 See Info node `(elisp)Cons Cells' for a discussion of related basic
519 Lisp concepts such as car, cdr, cons cell and list. */)
521 register Lisp_Object list
;
526 DEFUN ("car-safe", Fcar_safe
, Scar_safe
, 1, 1, 0,
527 doc
: /* Return the car of OBJECT if it is a cons cell, or else nil. */)
531 return CAR_SAFE (object
);
534 DEFUN ("cdr", Fcdr
, Scdr
, 1, 1, 0,
535 doc
: /* Return the cdr of LIST. If arg is nil, return nil.
536 Error if arg is not nil and not a cons cell. See also `cdr-safe'.
538 See Info node `(elisp)Cons Cells' for a discussion of related basic
539 Lisp concepts such as cdr, car, cons cell and list. */)
541 register Lisp_Object list
;
546 DEFUN ("cdr-safe", Fcdr_safe
, Scdr_safe
, 1, 1, 0,
547 doc
: /* Return the cdr of OBJECT if it is a cons cell, or else nil. */)
551 return CDR_SAFE (object
);
554 DEFUN ("setcar", Fsetcar
, Ssetcar
, 2, 2, 0,
555 doc
: /* Set the car of CELL to be NEWCAR. Returns NEWCAR. */)
557 register Lisp_Object cell
, newcar
;
561 XSETCAR (cell
, newcar
);
565 DEFUN ("setcdr", Fsetcdr
, Ssetcdr
, 2, 2, 0,
566 doc
: /* Set the cdr of CELL to be NEWCDR. Returns NEWCDR. */)
568 register Lisp_Object cell
, newcdr
;
572 XSETCDR (cell
, newcdr
);
576 /* Extract and set components of symbols */
578 DEFUN ("boundp", Fboundp
, Sboundp
, 1, 1, 0,
579 doc
: /* Return t if SYMBOL's value is not void. */)
581 register Lisp_Object symbol
;
583 Lisp_Object valcontents
;
585 valcontents
= find_symbol_value (symbol
);
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
, Qinteractive_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 ***********************************************************************/
811 blocal_getrealvalue (struct Lisp_Buffer_Local_Value
*blv
)
813 return &XCDR_AS_LVALUE (ensure_thread_local (&(blv
->realvalue
)));
817 blocal_get_thread_data (struct Lisp_Buffer_Local_Value
*l
)
819 Lisp_Object ret
= assq_no_quit (get_current_thread (), l
->thread_data
);
822 Lisp_Object tem
, val
= Qnil
, len
, it
, parent
= Qnil
;
824 for (it
= l
->thread_data
; !NILP (it
); it
= XCDR (it
))
826 Lisp_Object head
= XCDR (XCAR (it
));
827 if ((EQ (Fcurrent_buffer (), BLOCAL_BUFFER_VEC (head
)))
829 || EQ (selected_frame
, BLOCAL_FRAME_VEC (head
))))
831 Lisp_Object v
= BLOCAL_CDR_VEC (head
);
834 if (!EQ (v
, XCAR (v
)))
835 val
= XCDR (assq_no_quit (XCAR (XCAR (it
)),
836 XTHREADLOCAL (l
->realvalue
)->thread_alist
));
838 val
= XCDR (BLOCAL_CDR_VEC (head
));
845 XSETFASTINT (len
, 4);
846 ret
= Fmake_vector (len
, Qnil
);
849 XSETFASTINT (AREF (ret
, 0), 0);
851 XSETFASTINT (AREF (ret
, 0), AREF (parent
, 0));
853 BLOCAL_BUFFER_VEC (ret
) = Fcurrent_buffer ();
854 BLOCAL_FRAME_VEC (ret
) = Qnil
;
856 tem
= Fcons (Qnil
, val
);
858 BLOCAL_CDR_VEC (ret
) = tem
;
860 ret
= Fcons (get_current_thread (), ret
);
861 l
->thread_data
= Fcons (ret
, l
->thread_data
);
862 XTHREADLOCAL (l
->realvalue
)->thread_alist
=
863 Fcons (Fcons (get_current_thread (), val
),
864 XTHREADLOCAL (l
->realvalue
)->thread_alist
);
867 return &XCDR_AS_LVALUE (ret
);
870 /* Remove any thread-local data. */
872 blocal_unbind_thread (Lisp_Object thread
)
876 struct Lisp_Vector
*obarray
= XVECTOR (Vobarray
);
877 for (i
= 0; i
< obarray
->size
; i
++)
879 struct Lisp_Symbol
*sym
;
881 if (!SYMBOLP (obarray
->contents
[i
]))
884 sym
= XSYMBOL (obarray
->contents
[i
]);
886 #define UNBIND_LOCAL_VALUE(X) do { \
887 Lisp_Object tem = assq_no_quit (thread, (X)); \
889 (X) = Fdelq (tem, (X)); \
892 if (BUFFER_LOCAL_VALUEP (SYMBOL_VALUE (obarray
->contents
[i
])))
894 struct Lisp_Buffer_Local_Value
*loc
895 = XBUFFER_LOCAL_VALUE (SYMBOL_VALUE (obarray
->contents
[i
]));
897 UNBIND_LOCAL_VALUE (loc
->realvalue
);
898 UNBIND_LOCAL_VALUE (loc
->thread_data
);
901 if (THREADLOCALP (SYMBOL_VALUE (obarray
->contents
[i
])))
903 struct Lisp_ThreadLocal
*val
904 = XTHREADLOCAL (SYMBOL_VALUE (obarray
->contents
[i
]));
905 UNBIND_LOCAL_VALUE (val
->thread_alist
);
908 #undef UNBIND_LOCAL_VALUE
912 blocal_set_thread_data (struct Lisp_Buffer_Local_Value
*l
, Lisp_Object obj
)
914 if (! NILP (l
->thread_data
))
917 l
->thread_data
= Fcons (Fcons (get_current_thread (), obj
), Qnil
);
921 find_variable_location (Lisp_Object
*root
)
923 if (THREADLOCALP (*root
))
925 struct Lisp_ThreadLocal
*thr
= XTHREADLOCAL (*root
);
926 Lisp_Object cons
= assq_no_quit (get_current_thread (),
928 if (!EQ (cons
, Qnil
))
929 return &XCDR_AS_LVALUE (cons
);
938 ensure_thread_local (Lisp_Object
*root
)
942 if (THREADLOCALP (*root
))
943 cons
= assq_no_quit (get_current_thread (),
944 XTHREADLOCAL (*root
)->thread_alist
);
948 newval
= allocate_misc ();
949 XMISCTYPE (newval
) = Lisp_Misc_ThreadLocal
;
950 XTHREADLOCAL (newval
)->global
= *root
;
951 XTHREADLOCAL (newval
)->thread_alist
= Qnil
;
958 struct Lisp_ThreadLocal
*local
= XTHREADLOCAL (*root
);
959 cons
= Fcons (get_current_thread (), XTHREADLOCAL (*root
)->global
);
960 local
->thread_alist
= Fcons (cons
, local
->thread_alist
);
967 remove_thread_local (Lisp_Object
*root
)
969 if (THREADLOCALP (*root
))
971 Lisp_Object iter
, thr
= get_current_thread (), prior
= Qnil
;
972 struct Lisp_ThreadLocal
*local
= XTHREADLOCAL (*root
);
973 for (iter
= local
->thread_alist
; !NILP (iter
); iter
= XCDR (iter
))
975 if (EQ (XCAR (XCAR (iter
)), thr
))
978 local
->thread_alist
= XCDR (iter
);
980 XSETCDR (prior
, XCDR (iter
));
988 /* Return the symbol holding SYMBOL's value. Signal
989 `cyclic-variable-indirection' if SYMBOL's chain of variable
990 indirections contains a loop. */
993 indirect_variable (symbol
)
994 struct Lisp_Symbol
*symbol
;
996 struct Lisp_Symbol
*tortoise
, *hare
;
998 hare
= tortoise
= symbol
;
1000 while (hare
->indirect_variable
)
1002 hare
= XSYMBOL (hare
->value
);
1003 if (!hare
->indirect_variable
)
1006 hare
= XSYMBOL (hare
->value
);
1007 tortoise
= XSYMBOL (tortoise
->value
);
1009 if (hare
== tortoise
)
1012 XSETSYMBOL (tem
, symbol
);
1013 xsignal1 (Qcyclic_variable_indirection
, tem
);
1021 DEFUN ("indirect-variable", Findirect_variable
, Sindirect_variable
, 1, 1, 0,
1022 doc
: /* Return the variable at the end of OBJECT's variable chain.
1023 If OBJECT is a symbol, follow all variable indirections and return the final
1024 variable. If OBJECT is not a symbol, just return it.
1025 Signal a cyclic-variable-indirection error if there is a loop in the
1026 variable chain of symbols. */)
1030 if (SYMBOLP (object
))
1031 XSETSYMBOL (object
, indirect_variable (XSYMBOL (object
)));
1036 /* Given the raw contents of a symbol value cell,
1037 return the Lisp value of the symbol.
1038 This does not handle buffer-local variables; use
1039 swap_in_symval_forwarding for that. */
1042 do_symval_forwarding (valcontents
)
1043 Lisp_Object valcontents
;
1045 register Lisp_Object val
;
1046 if (MISCP (valcontents
))
1047 switch (XMISCTYPE (valcontents
))
1049 case Lisp_Misc_Intfwd
:
1050 XSETINT (val
, *XINTFWD (valcontents
)->intvar
);
1053 case Lisp_Misc_Boolfwd
:
1054 return (*XBOOLFWD (valcontents
)->boolvar
? Qt
: Qnil
);
1056 case Lisp_Misc_Objfwd
:
1057 return *XOBJFWD (valcontents
)->objvar
;
1059 case Lisp_Misc_Buffer_Objfwd
:
1060 return PER_BUFFER_VALUE (current_buffer
,
1061 XBUFFER_OBJFWD (valcontents
)->offset
);
1063 case Lisp_Misc_Kboard_Objfwd
:
1064 /* We used to simply use current_kboard here, but from Lisp
1065 code, it's value is often unexpected. It seems nicer to
1066 allow constructions like this to work as intuitively expected:
1068 (with-selected-frame frame
1069 (define-key local-function-map "\eOP" [f1]))
1071 On the other hand, this affects the semantics of
1072 last-command and real-last-command, and people may rely on
1073 that. I took a quick look at the Lisp codebase, and I
1074 don't think anything will break. --lorentey */
1075 return *(Lisp_Object
*)(XKBOARD_OBJFWD (valcontents
)->offset
1076 + (char *)FRAME_KBOARD (SELECTED_FRAME ()));
1078 case Lisp_Misc_ThreadLocal
:
1079 return *find_variable_location (&valcontents
);
1084 /* Store NEWVAL into SYMBOL, where VALCONTENTS is found in the value cell
1085 of SYMBOL. If SYMBOL is buffer-local, VALCONTENTS should be the
1086 buffer-independent contents of the value cell: forwarded just one
1087 step past the buffer-localness.
1089 BUF non-zero means set the value in buffer BUF instead of the
1090 current buffer. This only plays a role for per-buffer variables. */
1093 store_symval_forwarding (symbol
, valcontents
, newval
, buf
)
1095 register Lisp_Object valcontents
, newval
;
1098 switch (SWITCH_ENUM_CAST (XTYPE (valcontents
)))
1101 switch (XMISCTYPE (valcontents
))
1103 case Lisp_Misc_Intfwd
:
1104 CHECK_NUMBER (newval
);
1105 *XINTFWD (valcontents
)->intvar
= XINT (newval
);
1106 /* This can never happen since intvar points to an EMACS_INT
1107 which is at least large enough to hold a Lisp_Object.
1108 if (*XINTFWD (valcontents)->intvar != XINT (newval))
1109 error ("Value out of range for variable `%s'",
1110 SDATA (SYMBOL_NAME (symbol))); */
1113 case Lisp_Misc_Boolfwd
:
1114 *XBOOLFWD (valcontents
)->boolvar
= !NILP (newval
);
1117 case Lisp_Misc_Objfwd
:
1118 *find_variable_location (XOBJFWD (valcontents
)->objvar
) = newval
;
1120 /* If this variable is a default for something stored
1121 in the buffer itself, such as default-fill-column,
1122 find the buffers that don't have local values for it
1124 if (XOBJFWD (valcontents
)->objvar
> (Lisp_Object
*) &buffer_defaults
1125 && XOBJFWD (valcontents
)->objvar
< (Lisp_Object
*) (&buffer_defaults
+ 1))
1127 int offset
= ((char *) XOBJFWD (valcontents
)->objvar
1128 - (char *) &buffer_defaults
);
1129 int idx
= PER_BUFFER_IDX (offset
);
1136 for (tail
= Vbuffer_alist
; CONSP (tail
); tail
= XCDR (tail
))
1141 buf
= Fcdr (XCAR (tail
));
1142 if (!BUFFERP (buf
)) continue;
1145 if (! PER_BUFFER_VALUE_P (b
, idx
))
1146 SET_PER_BUFFER_VALUE_RAW (b
, offset
, newval
);
1151 case Lisp_Misc_Buffer_Objfwd
:
1153 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1154 Lisp_Object type
= XBUFFER_OBJFWD (valcontents
)->slottype
;
1156 if (!(NILP (type
) || NILP (newval
)
1157 || (XINT (type
) == LISP_INT_TAG
1159 : XTYPE (newval
) == XINT (type
))))
1160 buffer_slot_type_mismatch (newval
, XINT (type
));
1163 buf
= current_buffer
;
1164 PER_BUFFER_VALUE (buf
, offset
) = newval
;
1168 case Lisp_Misc_Kboard_Objfwd
:
1170 char *base
= (char *) FRAME_KBOARD (SELECTED_FRAME ());
1171 char *p
= base
+ XKBOARD_OBJFWD (valcontents
)->offset
;
1172 *(Lisp_Object
*) p
= newval
;
1183 valcontents
= SYMBOL_VALUE (symbol
);
1184 if (BUFFER_LOCAL_VALUEP (valcontents
))
1186 Lisp_Object v
= BLOCAL_CDR (XBUFFER_LOCAL_VALUE (valcontents
));
1187 if (!EQ (v
, XCAR (v
)))
1190 for (it
= XBUFFER_LOCAL_VALUE (valcontents
)->thread_data
;
1191 !NILP (it
); it
= XCDR (it
))
1193 Lisp_Object head
= XCDR (XCAR (it
));
1194 if (EQ (BLOCAL_BUFFER (XBUFFER_LOCAL_VALUE (valcontents
)),
1195 BLOCAL_BUFFER_VEC (head
))
1196 && (! XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
1197 || EQ (selected_frame
, BLOCAL_FRAME_VEC (head
)))
1198 && !EQ (BLOCAL_CDR_VEC (head
),
1199 XCAR (BLOCAL_CDR_VEC (head
))))
1202 = XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
;
1203 Fsetcdr (assq_no_quit (XCAR (XCAR (it
)),
1204 XTHREADLOCAL (rv
)->thread_alist
),
1206 XSETCDR (XCAR (BLOCAL_CDR_VEC (head
)), newval
);
1210 BLOCAL_REALVALUE (XBUFFER_LOCAL_VALUE (valcontents
)) = newval
;
1212 else if (THREADLOCALP (valcontents
))
1214 Lisp_Object val
= indirect_variable (XSYMBOL (symbol
))->value
;
1215 val
= ensure_thread_local (&val
);
1216 XSETCDR (val
, newval
);
1219 SET_SYMBOL_VALUE (symbol
, newval
);
1223 /* Set up SYMBOL to refer to its global binding.
1224 This makes it safe to alter the status of other bindings. */
1227 swap_in_global_binding (symbol
)
1230 Lisp_Object valcontents
= SYMBOL_VALUE (symbol
);
1231 struct Lisp_Buffer_Local_Value
*blv
= XBUFFER_LOCAL_VALUE (valcontents
);
1232 Lisp_Object cdr
= BLOCAL_CDR (blv
);
1234 /* Unload the previously loaded binding. */
1235 Fsetcdr (XCAR (cdr
),
1236 do_symval_forwarding (BLOCAL_REALVALUE (blv
)));
1238 /* Select the global binding in the symbol. */
1240 store_symval_forwarding (symbol
, BLOCAL_REALVALUE (blv
), XCDR (cdr
), NULL
);
1242 /* Indicate that the global binding is set up now. */
1243 BLOCAL_FRAME (blv
) = Qnil
;
1244 BLOCAL_BUFFER (blv
) = Qnil
;
1245 BLOCAL_CLEAR_FLAGS (blv
);
1248 /* Set up the buffer-local symbol SYMBOL for validity in the current buffer.
1249 VALCONTENTS is the contents of its value cell,
1250 which points to a struct Lisp_Buffer_Local_Value.
1252 Return the value forwarded one step past the buffer-local stage.
1253 This could be another forwarding pointer. */
1256 swap_in_symval_forwarding (symbol
, valcontents
)
1257 Lisp_Object symbol
, valcontents
;
1259 register Lisp_Object tem1
;
1261 tem1
= BLOCAL_BUFFER (XBUFFER_LOCAL_VALUE (valcontents
));
1264 || current_buffer
!= XBUFFER (tem1
)
1265 || (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
1266 && ! EQ (selected_frame
, BLOCAL_FRAME (XBUFFER_LOCAL_VALUE (valcontents
)))))
1268 struct Lisp_Symbol
*sym
= XSYMBOL (symbol
);
1269 if (sym
->indirect_variable
)
1271 sym
= indirect_variable (sym
);
1272 XSETSYMBOL (symbol
, sym
);
1275 /* Unload the previously loaded binding. */
1276 tem1
= XCAR (BLOCAL_CDR (XBUFFER_LOCAL_VALUE (valcontents
)));
1278 do_symval_forwarding (BLOCAL_REALVALUE (XBUFFER_LOCAL_VALUE (valcontents
))));
1280 /* Choose the new binding. */
1281 tem1
= assq_no_quit (symbol
, BUF_LOCAL_VAR_ALIST (current_buffer
));
1282 BLOCAL_CLEAR_FLAGS (XBUFFER_LOCAL_VALUE (valcontents
));
1285 if (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
)
1286 tem1
= assq_no_quit (symbol
, XFRAME (selected_frame
)->param_alist
);
1288 BLOCAL_SET_FOUND_FOR_FRAME (XBUFFER_LOCAL_VALUE (valcontents
));
1290 tem1
= BLOCAL_CDR (XBUFFER_LOCAL_VALUE (valcontents
));
1293 BLOCAL_SET_FOUND_FOR_BUFFER (XBUFFER_LOCAL_VALUE (valcontents
));
1295 /* Load the new binding. */
1296 XSETCAR (BLOCAL_CDR (XBUFFER_LOCAL_VALUE (valcontents
)), tem1
);
1297 XSETBUFFER (BLOCAL_BUFFER (XBUFFER_LOCAL_VALUE (valcontents
)), current_buffer
);
1298 BLOCAL_FRAME (XBUFFER_LOCAL_VALUE (valcontents
)) = selected_frame
;
1299 store_symval_forwarding (symbol
,
1300 BLOCAL_REALVALUE (XBUFFER_LOCAL_VALUE (valcontents
)),
1304 return BLOCAL_REALVALUE (XBUFFER_LOCAL_VALUE (valcontents
));
1308 /* Find the value of a symbol, returning Qunbound if it's not bound.
1309 This is helpful for code which just wants to get a variable's value
1310 if it has one, without signaling an error.
1311 Note that it must not be possible to quit
1312 within this function. Great care is required for this. */
1315 find_symbol_value (symbol
)
1318 register Lisp_Object valcontents
;
1319 register Lisp_Object val
;
1321 CHECK_SYMBOL (symbol
);
1322 valcontents
= SYMBOL_VALUE (symbol
);
1324 if (BUFFER_LOCAL_VALUEP (valcontents
))
1325 valcontents
= swap_in_symval_forwarding (symbol
, valcontents
);
1327 return do_symval_forwarding (valcontents
);
1330 DEFUN ("symbol-value", Fsymbol_value
, Ssymbol_value
, 1, 1, 0,
1331 doc
: /* Return SYMBOL's value. Error if that is void. */)
1337 val
= find_symbol_value (symbol
);
1338 if (!EQ (val
, Qunbound
))
1341 xsignal1 (Qvoid_variable
, symbol
);
1344 DEFUN ("set", Fset
, Sset
, 2, 2, 0,
1345 doc
: /* Set SYMBOL's value to NEWVAL, and return NEWVAL. */)
1347 register Lisp_Object symbol
, newval
;
1349 return set_internal (symbol
, newval
, current_buffer
, 0);
1352 /* Return 1 if SYMBOL currently has a let-binding
1353 which was made in the buffer that is now current. */
1356 let_shadows_buffer_binding_p (symbol
)
1357 struct Lisp_Symbol
*symbol
;
1359 volatile struct specbinding
*p
;
1361 for (p
= specpdl_ptr
- 1; p
>= specpdl
; p
--)
1363 && CONSP (p
->symbol
))
1365 struct Lisp_Symbol
*let_bound_symbol
= XSYMBOL (XCAR (p
->symbol
));
1366 if ((symbol
== let_bound_symbol
1367 || (let_bound_symbol
->indirect_variable
1368 && symbol
== indirect_variable (let_bound_symbol
)))
1369 && XBUFFER (XCDR (XCDR (p
->symbol
))) == current_buffer
)
1373 return p
>= specpdl
;
1376 /* Store the value NEWVAL into SYMBOL.
1377 If buffer-locality is an issue, BUF specifies which buffer to use.
1378 (0 stands for the current buffer.)
1380 If BINDFLAG is zero, then if this symbol is supposed to become
1381 local in every buffer where it is set, then we make it local.
1382 If BINDFLAG is nonzero, we don't do that. */
1385 set_internal (symbol
, newval
, buf
, bindflag
)
1386 register Lisp_Object symbol
, newval
;
1390 int voide
= EQ (newval
, Qunbound
);
1392 register Lisp_Object valcontents
, innercontents
, tem1
, current_alist_element
;
1395 buf
= current_buffer
;
1397 /* If restoring in a dead buffer, do nothing. */
1398 if (NILP (BUF_NAME (buf
)))
1401 CHECK_SYMBOL (symbol
);
1402 if (SYMBOL_CONSTANT_P (symbol
)
1403 && (NILP (Fkeywordp (symbol
))
1404 || !EQ (newval
, SYMBOL_VALUE (symbol
))))
1405 xsignal1 (Qsetting_constant
, symbol
);
1407 innercontents
= valcontents
= SYMBOL_VALUE (symbol
);
1409 if (BUFFER_OBJFWDP (valcontents
))
1411 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1412 int idx
= PER_BUFFER_IDX (offset
);
1415 && !let_shadows_buffer_binding_p (XSYMBOL (symbol
)))
1416 SET_PER_BUFFER_VALUE_P (buf
, idx
, 1);
1418 else if (BUFFER_LOCAL_VALUEP (valcontents
))
1420 /* valcontents is a struct Lisp_Buffer_Local_Value. */
1421 if (XSYMBOL (symbol
)->indirect_variable
)
1422 XSETSYMBOL (symbol
, indirect_variable (XSYMBOL (symbol
)));
1424 /* What binding is loaded right now? */
1425 current_alist_element
1426 = XCAR (BLOCAL_CDR (XBUFFER_LOCAL_VALUE (valcontents
)));
1428 /* If the current buffer is not the buffer whose binding is
1429 loaded, or if there may be frame-local bindings and the frame
1430 isn't the right one, or if it's a Lisp_Buffer_Local_Value and
1431 the default binding is loaded, the loaded binding may be the
1433 if (!BUFFERP (BLOCAL_BUFFER (XBUFFER_LOCAL_VALUE (valcontents
)))
1434 || buf
!= XBUFFER (BLOCAL_BUFFER (XBUFFER_LOCAL_VALUE (valcontents
)))
1435 || (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
1436 && !EQ (selected_frame
, BLOCAL_FRAME (XBUFFER_LOCAL_VALUE (valcontents
))))
1437 /* Also unload a global binding (if the var is local_if_set). */
1438 || (EQ (XCAR (current_alist_element
),
1439 current_alist_element
)))
1441 /* The currently loaded binding is not necessarily valid.
1442 We need to unload it, and choose a new binding. */
1444 /* Write out `realvalue' to the old loaded binding. */
1445 Fsetcdr (current_alist_element
,
1446 do_symval_forwarding (BLOCAL_REALVALUE (XBUFFER_LOCAL_VALUE (valcontents
))));
1448 /* Find the new binding. */
1449 tem1
= Fassq (symbol
, BUF_LOCAL_VAR_ALIST (buf
));
1450 BLOCAL_SET_FOUND_FOR_BUFFER (XBUFFER_LOCAL_VALUE (valcontents
));
1454 /* This buffer still sees the default value. */
1456 /* If the variable is not local_if_set,
1457 or if this is `let' rather than `set',
1458 make CURRENT-ALIST-ELEMENT point to itself,
1459 indicating that we're seeing the default value.
1460 Likewise if the variable has been let-bound
1461 in the current buffer. */
1462 if (bindflag
|| !XBUFFER_LOCAL_VALUE (valcontents
)->local_if_set
1463 || let_shadows_buffer_binding_p (XSYMBOL (symbol
)))
1465 BLOCAL_CLEAR_FLAGS (XBUFFER_LOCAL_VALUE (valcontents
));
1467 if (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
)
1468 tem1
= Fassq (symbol
,
1469 XFRAME (selected_frame
)->param_alist
);
1472 BLOCAL_SET_FOUND_FOR_FRAME (XBUFFER_LOCAL_VALUE (valcontents
));
1474 tem1
= BLOCAL_CDR (XBUFFER_LOCAL_VALUE (valcontents
));
1476 /* If it's a Lisp_Buffer_Local_Value, being set not bound,
1477 and we're not within a let that was made for this buffer,
1478 create a new buffer-local binding for the variable.
1479 That means, give this buffer a new assoc for a local value
1480 and load that binding. */
1483 tem1
= Fcons (symbol
, XCDR (current_alist_element
));
1484 BUF_LOCAL_VAR_ALIST (buf
)
1485 = Fcons (tem1
, BUF_LOCAL_VAR_ALIST (buf
));
1489 /* Record which binding is now loaded. */
1490 XSETCAR (BLOCAL_CDR (XBUFFER_LOCAL_VALUE (valcontents
)), tem1
);
1492 /* Set `buffer' and `frame' slots for the binding now loaded. */
1493 XSETBUFFER (BLOCAL_BUFFER (XBUFFER_LOCAL_VALUE (valcontents
)), buf
);
1494 BLOCAL_FRAME (XBUFFER_LOCAL_VALUE (valcontents
)) = selected_frame
;
1496 innercontents
= BLOCAL_REALVALUE (XBUFFER_LOCAL_VALUE (valcontents
));
1498 /* Store the new value in the cons-cell. */
1499 XSETCDR (XCAR (BLOCAL_CDR (XBUFFER_LOCAL_VALUE (valcontents
))), newval
);
1502 /* If storing void (making the symbol void), forward only through
1503 buffer-local indicator, not through Lisp_Objfwd, etc. */
1505 store_symval_forwarding (symbol
, Qnil
, newval
, buf
);
1507 store_symval_forwarding (symbol
, innercontents
, newval
, buf
);
1512 /* Access or set a buffer-local symbol's default value. */
1514 /* Return the default value of SYMBOL, but don't check for voidness.
1515 Return Qunbound if it is void. */
1518 default_value (symbol
)
1521 register Lisp_Object valcontents
;
1523 CHECK_SYMBOL (symbol
);
1524 valcontents
= SYMBOL_VALUE (symbol
);
1526 /* For a built-in buffer-local variable, get the default value
1527 rather than letting do_symval_forwarding get the current value. */
1528 if (BUFFER_OBJFWDP (valcontents
))
1530 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1531 if (PER_BUFFER_IDX (offset
) != 0)
1532 return PER_BUFFER_DEFAULT (offset
);
1535 /* Handle user-created local variables. */
1536 if (BUFFER_LOCAL_VALUEP (valcontents
))
1538 /* If var is set up for a buffer that lacks a local value for it,
1539 the current value is nominally the default value.
1540 But the `realvalue' slot may be more up to date, since
1541 ordinary setq stores just that slot. So use that. */
1542 Lisp_Object current_alist_element
, alist_element_car
;
1543 current_alist_element
1544 = XCAR (BLOCAL_CDR (XBUFFER_LOCAL_VALUE (valcontents
)));
1545 alist_element_car
= XCAR (current_alist_element
);
1546 if (EQ (alist_element_car
, current_alist_element
))
1547 return do_symval_forwarding (BLOCAL_REALVALUE (XBUFFER_LOCAL_VALUE (valcontents
)));
1549 return XCDR (BLOCAL_CDR (XBUFFER_LOCAL_VALUE (valcontents
)));
1551 /* For other variables, get the current value. */
1552 return do_symval_forwarding (valcontents
);
1555 DEFUN ("default-boundp", Fdefault_boundp
, Sdefault_boundp
, 1, 1, 0,
1556 doc
: /* Return t if SYMBOL has a non-void default value.
1557 This is the value that is seen in buffers that do not have their own values
1558 for this variable. */)
1562 register Lisp_Object value
;
1564 value
= default_value (symbol
);
1565 return (EQ (value
, Qunbound
) ? Qnil
: Qt
);
1568 DEFUN ("default-value", Fdefault_value
, Sdefault_value
, 1, 1, 0,
1569 doc
: /* Return SYMBOL's default value.
1570 This is the value that is seen in buffers that do not have their own values
1571 for this variable. The default value is meaningful for variables with
1572 local bindings in certain buffers. */)
1576 register Lisp_Object value
;
1578 value
= default_value (symbol
);
1579 if (!EQ (value
, Qunbound
))
1582 xsignal1 (Qvoid_variable
, symbol
);
1585 DEFUN ("set-default", Fset_default
, Sset_default
, 2, 2, 0,
1586 doc
: /* Set SYMBOL's default value to VALUE. SYMBOL and VALUE are evaluated.
1587 The default value is seen in buffers that do not have their own values
1588 for this variable. */)
1590 Lisp_Object symbol
, value
;
1592 register Lisp_Object valcontents
, current_alist_element
, alist_element_buffer
;
1594 CHECK_SYMBOL (symbol
);
1595 valcontents
= SYMBOL_VALUE (symbol
);
1597 /* Handle variables like case-fold-search that have special slots
1598 in the buffer. Make them work apparently like Lisp_Buffer_Local_Value
1600 if (BUFFER_OBJFWDP (valcontents
))
1602 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1603 int idx
= PER_BUFFER_IDX (offset
);
1605 PER_BUFFER_DEFAULT (offset
) = value
;
1607 /* If this variable is not always local in all buffers,
1608 set it in the buffers that don't nominally have a local value. */
1613 for (b
= all_buffers
; b
; b
= b
->next
)
1614 if (!PER_BUFFER_VALUE_P (b
, idx
))
1615 PER_BUFFER_VALUE (b
, offset
) = value
;
1620 if (!BUFFER_LOCAL_VALUEP (valcontents
))
1621 return Fset (symbol
, value
);
1623 /* Store new value into the DEFAULT-VALUE slot. */
1624 XSETCDR (BLOCAL_CDR (XBUFFER_LOCAL_VALUE (valcontents
)), value
);
1626 /* If the default binding is now loaded, set the REALVALUE slot too. */
1627 current_alist_element
1628 = XCAR (BLOCAL_CDR (XBUFFER_LOCAL_VALUE (valcontents
)));
1629 alist_element_buffer
= Fcar (current_alist_element
);
1630 if (EQ (alist_element_buffer
, current_alist_element
))
1631 store_symval_forwarding (symbol
,
1632 BLOCAL_REALVALUE (XBUFFER_LOCAL_VALUE (valcontents
)),
1638 DEFUN ("setq-default", Fsetq_default
, Ssetq_default
, 0, UNEVALLED
, 0,
1639 doc
: /* Set the default value of variable VAR to VALUE.
1640 VAR, the variable name, is literal (not evaluated);
1641 VALUE is an expression: it is evaluated and its value returned.
1642 The default value of a variable is seen in buffers
1643 that do not have their own values for the variable.
1645 More generally, you can use multiple variables and values, as in
1646 (setq-default VAR VALUE VAR VALUE...)
1647 This sets each VAR's default value to the corresponding VALUE.
1648 The VALUE for the Nth VAR can refer to the new default values
1650 usage: (setq-default [VAR VALUE]...) */)
1654 register Lisp_Object args_left
;
1655 register Lisp_Object val
, symbol
;
1656 struct gcpro gcpro1
;
1666 val
= Feval (Fcar (Fcdr (args_left
)));
1667 symbol
= XCAR (args_left
);
1668 Fset_default (symbol
, val
);
1669 args_left
= Fcdr (XCDR (args_left
));
1671 while (!NILP (args_left
));
1677 /* Lisp functions for creating and removing buffer-local variables. */
1679 DEFUN ("make-variable-buffer-local", Fmake_variable_buffer_local
, Smake_variable_buffer_local
,
1680 1, 1, "vMake Variable Buffer Local: ",
1681 doc
: /* Make VARIABLE become buffer-local whenever it is set.
1682 At any time, the value for the current buffer is in effect,
1683 unless the variable has never been set in this buffer,
1684 in which case the default value is in effect.
1685 Note that binding the variable with `let', or setting it while
1686 a `let'-style binding made in this buffer is in effect,
1687 does not make the variable buffer-local. Return VARIABLE.
1689 In most cases it is better to use `make-local-variable',
1690 which makes a variable local in just one buffer.
1692 The function `default-value' gets the default value and `set-default' sets it. */)
1694 register Lisp_Object variable
;
1696 register Lisp_Object tem
, valcontents
, newval
;
1697 struct Lisp_Symbol
*sym
;
1699 CHECK_SYMBOL (variable
);
1700 sym
= indirect_variable (XSYMBOL (variable
));
1702 valcontents
= sym
->value
;
1703 if (sym
->constant
|| KBOARD_OBJFWDP (valcontents
))
1704 error ("Symbol %s may not be buffer-local", SDATA (sym
->xname
));
1706 if (BUFFER_OBJFWDP (valcontents
))
1708 else if (BUFFER_LOCAL_VALUEP (valcontents
))
1710 if (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
)
1711 error ("Symbol %s may not be buffer-local", SDATA (sym
->xname
));
1712 newval
= valcontents
;
1716 Lisp_Object len
, val_vec
;
1717 XSETFASTINT (len
, 4);
1718 val_vec
= Fmake_vector (len
, Qnil
);
1719 if (EQ (valcontents
, Qunbound
))
1721 tem
= Fcons (Qnil
, valcontents
);
1723 newval
= allocate_misc ();
1724 XMISCTYPE (newval
) = Lisp_Misc_Buffer_Local_Value
;
1725 XBUFFER_LOCAL_VALUE (newval
)->thread_data
= Qnil
;
1726 BLOCAL_CLEAR_FLAGS_VEC (val_vec
);
1727 BLOCAL_BUFFER_VEC (val_vec
) = Fcurrent_buffer ();
1728 BLOCAL_FRAME_VEC (val_vec
) = Qnil
;
1729 BLOCAL_CDR_VEC (val_vec
) = tem
;
1730 XBUFFER_LOCAL_VALUE (newval
)->check_frame
= 0;
1731 BLOCAL_SET_THREAD_DATA (XBUFFER_LOCAL_VALUE (newval
), val_vec
);
1732 XBUFFER_LOCAL_VALUE (newval
)->realvalue
= allocate_misc ();
1733 XMISCTYPE (XBUFFER_LOCAL_VALUE (newval
)->realvalue
)
1734 = Lisp_Misc_ThreadLocal
;
1735 XTHREADLOCAL (XBUFFER_LOCAL_VALUE (newval
)->realvalue
)->global
1737 XTHREADLOCAL (XBUFFER_LOCAL_VALUE (newval
)->realvalue
)->thread_alist
1738 = Fcons (Fcons (get_current_thread (), valcontents
), Qnil
);
1739 sym
->value
= newval
;
1741 XBUFFER_LOCAL_VALUE (newval
)->local_if_set
= 1;
1745 DEFUN ("make-local-variable", Fmake_local_variable
, Smake_local_variable
,
1746 1, 1, "vMake Local Variable: ",
1747 doc
: /* Make VARIABLE have a separate value in the current buffer.
1748 Other buffers will continue to share a common default value.
1749 \(The buffer-local value of VARIABLE starts out as the same value
1750 VARIABLE previously had. If VARIABLE was void, it remains void.\)
1753 If the variable is already arranged to become local when set,
1754 this function causes a local value to exist for this buffer,
1755 just as setting the variable would do.
1757 This function returns VARIABLE, and therefore
1758 (set (make-local-variable 'VARIABLE) VALUE-EXP)
1761 See also `make-variable-buffer-local'.
1763 Do not use `make-local-variable' to make a hook variable buffer-local.
1764 Instead, use `add-hook' and specify t for the LOCAL argument. */)
1766 register Lisp_Object variable
;
1768 register Lisp_Object tem
, valcontents
;
1769 struct Lisp_Symbol
*sym
;
1771 CHECK_SYMBOL (variable
);
1772 sym
= indirect_variable (XSYMBOL (variable
));
1774 valcontents
= sym
->value
;
1775 if (sym
->constant
|| KBOARD_OBJFWDP (valcontents
)
1776 || (BUFFER_LOCAL_VALUEP (valcontents
)
1777 && (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
)))
1778 error ("Symbol %s may not be buffer-local", SDATA (sym
->xname
));
1780 if ((BUFFER_LOCAL_VALUEP (valcontents
)
1781 && XBUFFER_LOCAL_VALUE (valcontents
)->local_if_set
)
1782 || BUFFER_OBJFWDP (valcontents
))
1784 tem
= Fboundp (variable
);
1786 /* Make sure the symbol has a local value in this particular buffer,
1787 by setting it to the same value it already has. */
1788 Fset (variable
, (EQ (tem
, Qt
) ? Fsymbol_value (variable
) : Qunbound
));
1791 /* Make sure symbol is set up to hold per-buffer values. */
1792 if (!BUFFER_LOCAL_VALUEP (valcontents
))
1794 Lisp_Object newval
, len
, val_vec
;
1795 XSETFASTINT (len
, 4);
1796 val_vec
= Fmake_vector (len
, Qnil
);
1797 tem
= Fcons (Qnil
, do_symval_forwarding (valcontents
));
1799 newval
= allocate_misc ();
1800 XMISCTYPE (newval
) = Lisp_Misc_Buffer_Local_Value
;
1801 XBUFFER_LOCAL_VALUE (newval
)->thread_data
= Qnil
;
1802 BLOCAL_BUFFER_VEC (val_vec
) = Qnil
;
1803 BLOCAL_FRAME_VEC (val_vec
) = Qnil
;
1804 BLOCAL_CDR_VEC (val_vec
) = tem
;
1805 XBUFFER_LOCAL_VALUE (newval
)->local_if_set
= 0;
1806 XBUFFER_LOCAL_VALUE (newval
)->check_frame
= 0;
1807 BLOCAL_SET_THREAD_DATA (XBUFFER_LOCAL_VALUE (newval
), val_vec
);
1808 XBUFFER_LOCAL_VALUE (newval
)->realvalue
= allocate_misc ();
1809 XMISCTYPE (XBUFFER_LOCAL_VALUE (newval
)->realvalue
)
1810 = Lisp_Misc_ThreadLocal
;
1811 XTHREADLOCAL (XBUFFER_LOCAL_VALUE (newval
)->realvalue
)->global
= Qnil
;
1812 XTHREADLOCAL (XBUFFER_LOCAL_VALUE (newval
)->realvalue
)->thread_alist
1813 = Fcons (Fcons (get_current_thread (), Qnil
), Qnil
);
1814 BLOCAL_REALVALUE (XBUFFER_LOCAL_VALUE (newval
)) = sym
->value
;
1815 sym
->value
= newval
;
1817 /* Make sure this buffer has its own value of symbol. */
1818 XSETSYMBOL (variable
, sym
); /* Propagate variable indirections. */
1819 tem
= Fassq (variable
, BUF_LOCAL_VAR_ALIST (current_buffer
));
1822 /* Swap out any local binding for some other buffer, and make
1823 sure the current value is permanently recorded, if it's the
1825 find_symbol_value (variable
);
1827 BUF_LOCAL_VAR_ALIST (current_buffer
)
1828 = Fcons (Fcons (variable
, XCDR (BLOCAL_CDR (XBUFFER_LOCAL_VALUE (sym
->value
)))),
1829 BUF_LOCAL_VAR_ALIST (current_buffer
));
1831 /* Make sure symbol does not think it is set up for this buffer;
1832 force it to look once again for this buffer's value. */
1834 Lisp_Object
*pvalbuf
;
1836 valcontents
= sym
->value
;
1838 pvalbuf
= &BLOCAL_BUFFER (XBUFFER_LOCAL_VALUE (valcontents
));
1839 if (current_buffer
== XBUFFER (*pvalbuf
))
1841 BLOCAL_CLEAR_FLAGS (XBUFFER_LOCAL_VALUE (valcontents
));
1845 /* If the symbol forwards into a C variable, then load the binding
1846 for this buffer now. If C code modifies the variable before we
1847 load the binding in, then that new value will clobber the default
1848 binding the next time we unload it. */
1849 valcontents
= BLOCAL_REALVALUE (XBUFFER_LOCAL_VALUE (sym
->value
));
1850 if (INTFWDP (valcontents
) || BOOLFWDP (valcontents
) || OBJFWDP (valcontents
))
1851 swap_in_symval_forwarding (variable
, sym
->value
);
1856 DEFUN ("kill-local-variable", Fkill_local_variable
, Skill_local_variable
,
1857 1, 1, "vKill Local Variable: ",
1858 doc
: /* Make VARIABLE no longer have a separate value in the current buffer.
1859 From now on the default value will apply in this buffer. Return VARIABLE. */)
1861 register Lisp_Object variable
;
1863 register Lisp_Object tem
, valcontents
;
1864 struct Lisp_Symbol
*sym
;
1866 CHECK_SYMBOL (variable
);
1867 sym
= indirect_variable (XSYMBOL (variable
));
1869 valcontents
= sym
->value
;
1871 if (BUFFER_OBJFWDP (valcontents
))
1873 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1874 int idx
= PER_BUFFER_IDX (offset
);
1878 SET_PER_BUFFER_VALUE_P (current_buffer
, idx
, 0);
1879 PER_BUFFER_VALUE (current_buffer
, offset
)
1880 = PER_BUFFER_DEFAULT (offset
);
1885 if (!BUFFER_LOCAL_VALUEP (valcontents
))
1888 /* Get rid of this buffer's alist element, if any. */
1889 XSETSYMBOL (variable
, sym
); /* Propagate variable indirection. */
1890 tem
= Fassq (variable
, BUF_LOCAL_VAR_ALIST (current_buffer
));
1892 BUF_LOCAL_VAR_ALIST (current_buffer
)
1893 = Fdelq (tem
, BUF_LOCAL_VAR_ALIST (current_buffer
));
1895 /* If the symbol is set up with the current buffer's binding
1896 loaded, recompute its value. We have to do it now, or else
1897 forwarded objects won't work right. */
1899 Lisp_Object
*pvalbuf
, buf
;
1900 valcontents
= sym
->value
;
1901 pvalbuf
= &BLOCAL_BUFFER (XBUFFER_LOCAL_VALUE (valcontents
));
1902 XSETBUFFER (buf
, current_buffer
);
1903 if (EQ (buf
, *pvalbuf
))
1906 BLOCAL_CLEAR_FLAGS (XBUFFER_LOCAL_VALUE (valcontents
));
1907 find_symbol_value (variable
);
1914 /* Lisp functions for creating and removing buffer-local variables. */
1916 /* Obsolete since 22.2. NB adjust doc of modify-frame-parameters
1917 when/if this is removed. */
1919 DEFUN ("make-variable-frame-local", Fmake_variable_frame_local
, Smake_variable_frame_local
,
1920 1, 1, "vMake Variable Frame Local: ",
1921 doc
: /* Enable VARIABLE to have frame-local bindings.
1922 This does not create any frame-local bindings for VARIABLE,
1923 it just makes them possible.
1925 A frame-local binding is actually a frame parameter value.
1926 If a frame F has a value for the frame parameter named VARIABLE,
1927 that also acts as a frame-local binding for VARIABLE in F--
1928 provided this function has been called to enable VARIABLE
1929 to have frame-local bindings at all.
1931 The only way to create a frame-local binding for VARIABLE in a frame
1932 is to set the VARIABLE frame parameter of that frame. See
1933 `modify-frame-parameters' for how to set frame parameters.
1935 Note that since Emacs 23.1, variables cannot be both buffer-local and
1936 frame-local any more (buffer-local bindings used to take precedence over
1937 frame-local bindings). */)
1939 register Lisp_Object variable
;
1941 register Lisp_Object tem
, valcontents
, newval
, val_vec
, len
;
1942 struct Lisp_Symbol
*sym
;
1944 CHECK_SYMBOL (variable
);
1945 sym
= indirect_variable (XSYMBOL (variable
));
1947 valcontents
= sym
->value
;
1948 if (sym
->constant
|| KBOARD_OBJFWDP (valcontents
)
1949 || BUFFER_OBJFWDP (valcontents
))
1950 error ("Symbol %s may not be frame-local", SDATA (sym
->xname
));
1952 if (BUFFER_LOCAL_VALUEP (valcontents
))
1954 if (!XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
)
1955 error ("Symbol %s may not be frame-local", SDATA (sym
->xname
));
1959 if (EQ (valcontents
, Qunbound
))
1961 tem
= Fcons (Qnil
, Fsymbol_value (variable
));
1963 newval
= allocate_misc ();
1964 XSETFASTINT (len
, 4);
1965 val_vec
= Fmake_vector (len
, Qnil
);
1966 XMISCTYPE (newval
) = Lisp_Misc_Buffer_Local_Value
;
1967 XBUFFER_LOCAL_VALUE (newval
)->thread_data
= Qnil
;
1968 BLOCAL_CLEAR_FLAGS_VEC (val_vec
);
1969 BLOCAL_BUFFER_VEC (val_vec
) = Qnil
;
1970 BLOCAL_FRAME_VEC (val_vec
) = Qnil
;
1971 BLOCAL_CDR_VEC (val_vec
) = tem
;
1972 XBUFFER_LOCAL_VALUE (newval
)->local_if_set
= 0;
1973 XBUFFER_LOCAL_VALUE (newval
)->check_frame
= 1;
1974 BLOCAL_SET_THREAD_DATA (XBUFFER_LOCAL_VALUE (newval
), val_vec
);
1975 XBUFFER_LOCAL_VALUE (newval
)->realvalue
= allocate_misc ();
1976 XMISCTYPE (XBUFFER_LOCAL_VALUE (newval
)->realvalue
)
1977 = Lisp_Misc_ThreadLocal
;
1978 XTHREADLOCAL (XBUFFER_LOCAL_VALUE (newval
)->realvalue
)->global
= Qnil
;
1979 XTHREADLOCAL (XBUFFER_LOCAL_VALUE (newval
)->realvalue
)->thread_alist
1980 = Fcons (Fcons (get_current_thread (), Qnil
), Qnil
);
1981 BLOCAL_REALVALUE (XBUFFER_LOCAL_VALUE (newval
)) = sym
->value
;
1982 sym
->value
= newval
;
1986 DEFUN ("local-variable-p", Flocal_variable_p
, Slocal_variable_p
,
1988 doc
: /* Non-nil if VARIABLE has a local binding in buffer BUFFER.
1989 BUFFER defaults to the current buffer. */)
1991 register Lisp_Object variable
, buffer
;
1993 Lisp_Object valcontents
;
1994 register struct buffer
*buf
;
1995 struct Lisp_Symbol
*sym
;
1998 buf
= current_buffer
;
2001 CHECK_BUFFER (buffer
);
2002 buf
= XBUFFER (buffer
);
2005 CHECK_SYMBOL (variable
);
2006 sym
= indirect_variable (XSYMBOL (variable
));
2007 XSETSYMBOL (variable
, sym
);
2009 valcontents
= sym
->value
;
2010 if (BUFFER_LOCAL_VALUEP (valcontents
))
2012 Lisp_Object tail
, elt
;
2014 for (tail
= BUF_LOCAL_VAR_ALIST (buf
); CONSP (tail
); tail
= XCDR (tail
))
2017 if (EQ (variable
, XCAR (elt
)))
2021 if (BUFFER_OBJFWDP (valcontents
))
2023 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
2024 int idx
= PER_BUFFER_IDX (offset
);
2025 if (idx
== -1 || PER_BUFFER_VALUE_P (buf
, idx
))
2031 DEFUN ("local-variable-if-set-p", Flocal_variable_if_set_p
, Slocal_variable_if_set_p
,
2033 doc
: /* Non-nil if VARIABLE will be local in buffer BUFFER when set there.
2034 More precisely, this means that setting the variable \(with `set' or`setq'),
2035 while it does not have a `let'-style binding that was made in BUFFER,
2036 will produce a buffer local binding. See Info node
2037 `(elisp)Creating Buffer-Local'.
2038 BUFFER defaults to the current buffer. */)
2040 register Lisp_Object variable
, buffer
;
2042 Lisp_Object valcontents
;
2043 register struct buffer
*buf
;
2044 struct Lisp_Symbol
*sym
;
2047 buf
= current_buffer
;
2050 CHECK_BUFFER (buffer
);
2051 buf
= XBUFFER (buffer
);
2054 CHECK_SYMBOL (variable
);
2055 sym
= indirect_variable (XSYMBOL (variable
));
2056 XSETSYMBOL (variable
, sym
);
2058 valcontents
= sym
->value
;
2060 if (BUFFER_OBJFWDP (valcontents
))
2061 /* All these slots become local if they are set. */
2063 else if (BUFFER_LOCAL_VALUEP (valcontents
))
2065 Lisp_Object tail
, elt
;
2066 if (XBUFFER_LOCAL_VALUE (valcontents
)->local_if_set
)
2068 for (tail
= BUF_LOCAL_VAR_ALIST (buf
); CONSP (tail
); tail
= XCDR (tail
))
2071 if (EQ (variable
, XCAR (elt
)))
2078 DEFUN ("variable-binding-locus", Fvariable_binding_locus
, Svariable_binding_locus
,
2080 doc
: /* Return a value indicating where VARIABLE's current binding comes from.
2081 If the current binding is buffer-local, the value is the current buffer.
2082 If the current binding is frame-local, the value is the selected frame.
2083 If the current binding is global (the default), the value is nil. */)
2085 register Lisp_Object variable
;
2087 Lisp_Object valcontents
;
2088 struct Lisp_Symbol
*sym
;
2090 CHECK_SYMBOL (variable
);
2091 sym
= indirect_variable (XSYMBOL (variable
));
2093 /* Make sure the current binding is actually swapped in. */
2094 find_symbol_value (variable
);
2096 valcontents
= sym
->value
;
2098 if (BUFFER_LOCAL_VALUEP (valcontents
)
2099 || BUFFER_OBJFWDP (valcontents
))
2101 /* For a local variable, record both the symbol and which
2102 buffer's or frame's value we are saving. */
2103 if (!NILP (Flocal_variable_p (variable
, Qnil
)))
2104 return Fcurrent_buffer ();
2105 else if (BUFFER_LOCAL_VALUEP (valcontents
)
2106 && BLOCAL_FOUND_FOR_FRAME (XBUFFER_LOCAL_VALUE (valcontents
)))
2107 return BLOCAL_FRAME (XBUFFER_LOCAL_VALUE (valcontents
));
2113 /* This code is disabled now that we use the selected frame to return
2114 keyboard-local-values. */
2116 extern struct terminal
*get_terminal
P_ ((Lisp_Object display
, int));
2118 DEFUN ("terminal-local-value", Fterminal_local_value
, Sterminal_local_value
, 2, 2, 0,
2119 doc
: /* Return the terminal-local value of SYMBOL on TERMINAL.
2120 If SYMBOL is not a terminal-local variable, then return its normal
2121 value, like `symbol-value'.
2123 TERMINAL may be a terminal object, a frame, or nil (meaning the
2124 selected frame's terminal device). */)
2127 Lisp_Object terminal
;
2130 struct terminal
*t
= get_terminal (terminal
, 1);
2131 push_kboard (t
->kboard
);
2132 result
= Fsymbol_value (symbol
);
2137 DEFUN ("set-terminal-local-value", Fset_terminal_local_value
, Sset_terminal_local_value
, 3, 3, 0,
2138 doc
: /* Set the terminal-local binding of SYMBOL on TERMINAL to VALUE.
2139 If VARIABLE is not a terminal-local variable, then set its normal
2140 binding, like `set'.
2142 TERMINAL may be a terminal object, a frame, or nil (meaning the
2143 selected frame's terminal device). */)
2144 (symbol
, terminal
, value
)
2146 Lisp_Object terminal
;
2150 struct terminal
*t
= get_terminal (terminal
, 1);
2151 push_kboard (d
->kboard
);
2152 result
= Fset (symbol
, value
);
2158 /* Find the function at the end of a chain of symbol function indirections. */
2160 /* If OBJECT is a symbol, find the end of its function chain and
2161 return the value found there. If OBJECT is not a symbol, just
2162 return it. If there is a cycle in the function chain, signal a
2163 cyclic-function-indirection error.
2165 This is like Findirect_function, except that it doesn't signal an
2166 error if the chain ends up unbound. */
2168 indirect_function (object
)
2169 register Lisp_Object object
;
2171 Lisp_Object tortoise
, hare
;
2173 hare
= tortoise
= object
;
2177 if (!SYMBOLP (hare
) || EQ (hare
, Qunbound
))
2179 hare
= XSYMBOL (hare
)->function
;
2180 if (!SYMBOLP (hare
) || EQ (hare
, Qunbound
))
2182 hare
= XSYMBOL (hare
)->function
;
2184 tortoise
= XSYMBOL (tortoise
)->function
;
2186 if (EQ (hare
, tortoise
))
2187 xsignal1 (Qcyclic_function_indirection
, object
);
2193 DEFUN ("indirect-function", Findirect_function
, Sindirect_function
, 1, 2, 0,
2194 doc
: /* Return the function at the end of OBJECT's function chain.
2195 If OBJECT is not a symbol, just return it. Otherwise, follow all
2196 function indirections to find the final function binding and return it.
2197 If the final symbol in the chain is unbound, signal a void-function error.
2198 Optional arg NOERROR non-nil means to return nil instead of signalling.
2199 Signal a cyclic-function-indirection error if there is a loop in the
2200 function chain of symbols. */)
2202 register Lisp_Object object
;
2203 Lisp_Object noerror
;
2207 /* Optimize for no indirection. */
2209 if (SYMBOLP (result
) && !EQ (result
, Qunbound
)
2210 && (result
= XSYMBOL (result
)->function
, SYMBOLP (result
)))
2211 result
= indirect_function (result
);
2212 if (!EQ (result
, Qunbound
))
2216 xsignal1 (Qvoid_function
, object
);
2221 /* Extract and set vector and string elements */
2223 DEFUN ("aref", Faref
, Saref
, 2, 2, 0,
2224 doc
: /* Return the element of ARRAY at index IDX.
2225 ARRAY may be a vector, a string, a char-table, a bool-vector,
2226 or a byte-code object. IDX starts at 0. */)
2228 register Lisp_Object array
;
2231 register int idxval
;
2234 idxval
= XINT (idx
);
2235 if (STRINGP (array
))
2239 if (idxval
< 0 || idxval
>= SCHARS (array
))
2240 args_out_of_range (array
, idx
);
2241 if (! STRING_MULTIBYTE (array
))
2242 return make_number ((unsigned char) SREF (array
, idxval
));
2243 idxval_byte
= string_char_to_byte (array
, idxval
);
2245 c
= STRING_CHAR (SDATA (array
) + idxval_byte
);
2246 return make_number (c
);
2248 else if (BOOL_VECTOR_P (array
))
2252 if (idxval
< 0 || idxval
>= XBOOL_VECTOR (array
)->size
)
2253 args_out_of_range (array
, idx
);
2255 val
= (unsigned char) XBOOL_VECTOR (array
)->data
[idxval
/ BOOL_VECTOR_BITS_PER_CHAR
];
2256 return (val
& (1 << (idxval
% BOOL_VECTOR_BITS_PER_CHAR
)) ? Qt
: Qnil
);
2258 else if (CHAR_TABLE_P (array
))
2260 CHECK_CHARACTER (idx
);
2261 return CHAR_TABLE_REF (array
, idxval
);
2266 if (VECTORP (array
))
2267 size
= XVECTOR (array
)->size
;
2268 else if (COMPILEDP (array
))
2269 size
= XVECTOR (array
)->size
& PSEUDOVECTOR_SIZE_MASK
;
2271 wrong_type_argument (Qarrayp
, array
);
2273 if (idxval
< 0 || idxval
>= size
)
2274 args_out_of_range (array
, idx
);
2275 return XVECTOR (array
)->contents
[idxval
];
2279 DEFUN ("aset", Faset
, Saset
, 3, 3, 0,
2280 doc
: /* Store into the element of ARRAY at index IDX the value NEWELT.
2281 Return NEWELT. ARRAY may be a vector, a string, a char-table or a
2282 bool-vector. IDX starts at 0. */)
2283 (array
, idx
, newelt
)
2284 register Lisp_Object array
;
2285 Lisp_Object idx
, newelt
;
2287 register int idxval
;
2290 idxval
= XINT (idx
);
2291 CHECK_ARRAY (array
, Qarrayp
);
2292 CHECK_IMPURE (array
);
2294 if (VECTORP (array
))
2296 if (idxval
< 0 || idxval
>= XVECTOR (array
)->size
)
2297 args_out_of_range (array
, idx
);
2298 XVECTOR (array
)->contents
[idxval
] = newelt
;
2300 else if (BOOL_VECTOR_P (array
))
2304 if (idxval
< 0 || idxval
>= XBOOL_VECTOR (array
)->size
)
2305 args_out_of_range (array
, idx
);
2307 val
= (unsigned char) XBOOL_VECTOR (array
)->data
[idxval
/ BOOL_VECTOR_BITS_PER_CHAR
];
2309 if (! NILP (newelt
))
2310 val
|= 1 << (idxval
% BOOL_VECTOR_BITS_PER_CHAR
);
2312 val
&= ~(1 << (idxval
% BOOL_VECTOR_BITS_PER_CHAR
));
2313 XBOOL_VECTOR (array
)->data
[idxval
/ BOOL_VECTOR_BITS_PER_CHAR
] = val
;
2315 else if (CHAR_TABLE_P (array
))
2317 CHECK_CHARACTER (idx
);
2318 CHAR_TABLE_SET (array
, idxval
, newelt
);
2320 else if (STRING_MULTIBYTE (array
))
2322 int idxval_byte
, prev_bytes
, new_bytes
, nbytes
;
2323 unsigned char workbuf
[MAX_MULTIBYTE_LENGTH
], *p0
= workbuf
, *p1
;
2325 if (idxval
< 0 || idxval
>= SCHARS (array
))
2326 args_out_of_range (array
, idx
);
2327 CHECK_CHARACTER (newelt
);
2329 nbytes
= SBYTES (array
);
2331 idxval_byte
= string_char_to_byte (array
, idxval
);
2332 p1
= SDATA (array
) + idxval_byte
;
2333 PARSE_MULTIBYTE_SEQ (p1
, nbytes
- idxval_byte
, prev_bytes
);
2334 new_bytes
= CHAR_STRING (XINT (newelt
), p0
);
2335 if (prev_bytes
!= new_bytes
)
2337 /* We must relocate the string data. */
2338 int nchars
= SCHARS (array
);
2342 SAFE_ALLOCA (str
, unsigned char *, nbytes
);
2343 bcopy (SDATA (array
), str
, nbytes
);
2344 allocate_string_data (XSTRING (array
), nchars
,
2345 nbytes
+ new_bytes
- prev_bytes
);
2346 bcopy (str
, SDATA (array
), idxval_byte
);
2347 p1
= SDATA (array
) + idxval_byte
;
2348 bcopy (str
+ idxval_byte
+ prev_bytes
, p1
+ new_bytes
,
2349 nbytes
- (idxval_byte
+ prev_bytes
));
2351 clear_string_char_byte_cache ();
2358 if (idxval
< 0 || idxval
>= SCHARS (array
))
2359 args_out_of_range (array
, idx
);
2360 CHECK_NUMBER (newelt
);
2362 if (XINT (newelt
) >= 0 && ! SINGLE_BYTE_CHAR_P (XINT (newelt
)))
2366 for (i
= SBYTES (array
) - 1; i
>= 0; i
--)
2367 if (SREF (array
, i
) >= 0x80)
2368 args_out_of_range (array
, newelt
);
2369 /* ARRAY is an ASCII string. Convert it to a multibyte
2370 string, and try `aset' again. */
2371 STRING_SET_MULTIBYTE (array
);
2372 return Faset (array
, idx
, newelt
);
2374 SSET (array
, idxval
, XINT (newelt
));
2380 /* Arithmetic functions */
2382 enum comparison
{ equal
, notequal
, less
, grtr
, less_or_equal
, grtr_or_equal
};
2385 arithcompare (num1
, num2
, comparison
)
2386 Lisp_Object num1
, num2
;
2387 enum comparison comparison
;
2389 double f1
= 0, f2
= 0;
2392 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num1
);
2393 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num2
);
2395 if (FLOATP (num1
) || FLOATP (num2
))
2398 f1
= (FLOATP (num1
)) ? XFLOAT_DATA (num1
) : XINT (num1
);
2399 f2
= (FLOATP (num2
)) ? XFLOAT_DATA (num2
) : XINT (num2
);
2405 if (floatp
? f1
== f2
: XINT (num1
) == XINT (num2
))
2410 if (floatp
? f1
!= f2
: XINT (num1
) != XINT (num2
))
2415 if (floatp
? f1
< f2
: XINT (num1
) < XINT (num2
))
2420 if (floatp
? f1
<= f2
: XINT (num1
) <= XINT (num2
))
2425 if (floatp
? f1
> f2
: XINT (num1
) > XINT (num2
))
2430 if (floatp
? f1
>= f2
: XINT (num1
) >= XINT (num2
))
2439 DEFUN ("=", Feqlsign
, Seqlsign
, 2, 2, 0,
2440 doc
: /* Return t if two args, both numbers or markers, are equal. */)
2442 register Lisp_Object num1
, num2
;
2444 return arithcompare (num1
, num2
, equal
);
2447 DEFUN ("<", Flss
, Slss
, 2, 2, 0,
2448 doc
: /* Return t if first arg is less than second arg. Both must be numbers or markers. */)
2450 register Lisp_Object num1
, num2
;
2452 return arithcompare (num1
, num2
, less
);
2455 DEFUN (">", Fgtr
, Sgtr
, 2, 2, 0,
2456 doc
: /* Return t if first arg is greater than second arg. Both must be numbers or markers. */)
2458 register Lisp_Object num1
, num2
;
2460 return arithcompare (num1
, num2
, grtr
);
2463 DEFUN ("<=", Fleq
, Sleq
, 2, 2, 0,
2464 doc
: /* Return t if first arg is less than or equal to second arg.
2465 Both must be numbers or markers. */)
2467 register Lisp_Object num1
, num2
;
2469 return arithcompare (num1
, num2
, less_or_equal
);
2472 DEFUN (">=", Fgeq
, Sgeq
, 2, 2, 0,
2473 doc
: /* Return t if first arg is greater than or equal to second arg.
2474 Both must be numbers or markers. */)
2476 register Lisp_Object num1
, num2
;
2478 return arithcompare (num1
, num2
, grtr_or_equal
);
2481 DEFUN ("/=", Fneq
, Sneq
, 2, 2, 0,
2482 doc
: /* Return t if first arg is not equal to second arg. Both must be numbers or markers. */)
2484 register Lisp_Object num1
, num2
;
2486 return arithcompare (num1
, num2
, notequal
);
2489 DEFUN ("zerop", Fzerop
, Szerop
, 1, 1, 0,
2490 doc
: /* Return t if NUMBER is zero. */)
2492 register Lisp_Object number
;
2494 CHECK_NUMBER_OR_FLOAT (number
);
2496 if (FLOATP (number
))
2498 if (XFLOAT_DATA (number
) == 0.0)
2508 /* Convert between long values and pairs of Lisp integers.
2509 Note that long_to_cons returns a single Lisp integer
2510 when the value fits in one. */
2516 unsigned long top
= i
>> 16;
2517 unsigned int bot
= i
& 0xFFFF;
2519 return make_number (bot
);
2520 if (top
== (unsigned long)-1 >> 16)
2521 return Fcons (make_number (-1), make_number (bot
));
2522 return Fcons (make_number (top
), make_number (bot
));
2529 Lisp_Object top
, bot
;
2536 return ((XINT (top
) << 16) | XINT (bot
));
2539 DEFUN ("number-to-string", Fnumber_to_string
, Snumber_to_string
, 1, 1, 0,
2540 doc
: /* Return the decimal representation of NUMBER as a string.
2541 Uses a minus sign if negative.
2542 NUMBER may be an integer or a floating point number. */)
2546 char buffer
[VALBITS
];
2548 CHECK_NUMBER_OR_FLOAT (number
);
2550 if (FLOATP (number
))
2552 char pigbuf
[350]; /* see comments in float_to_string */
2554 float_to_string (pigbuf
, XFLOAT_DATA (number
));
2555 return build_string (pigbuf
);
2558 if (sizeof (int) == sizeof (EMACS_INT
))
2559 sprintf (buffer
, "%d", (int) XINT (number
));
2560 else if (sizeof (long) == sizeof (EMACS_INT
))
2561 sprintf (buffer
, "%ld", (long) XINT (number
));
2564 return build_string (buffer
);
2568 digit_to_number (character
, base
)
2569 int character
, base
;
2573 if (character
>= '0' && character
<= '9')
2574 digit
= character
- '0';
2575 else if (character
>= 'a' && character
<= 'z')
2576 digit
= character
- 'a' + 10;
2577 else if (character
>= 'A' && character
<= 'Z')
2578 digit
= character
- 'A' + 10;
2588 DEFUN ("string-to-number", Fstring_to_number
, Sstring_to_number
, 1, 2, 0,
2589 doc
: /* Parse STRING as a decimal number and return the number.
2590 This parses both integers and floating point numbers.
2591 It ignores leading spaces and tabs, and all trailing chars.
2593 If BASE, interpret STRING as a number in that base. If BASE isn't
2594 present, base 10 is used. BASE must be between 2 and 16 (inclusive).
2595 If the base used is not 10, STRING is always parsed as integer. */)
2597 register Lisp_Object string
, base
;
2599 register unsigned char *p
;
2604 CHECK_STRING (string
);
2610 CHECK_NUMBER (base
);
2612 if (b
< 2 || b
> 16)
2613 xsignal1 (Qargs_out_of_range
, base
);
2616 /* Skip any whitespace at the front of the number. Some versions of
2617 atoi do this anyway, so we might as well make Emacs lisp consistent. */
2619 while (*p
== ' ' || *p
== '\t')
2630 if (isfloat_string (p
, 1) && b
== 10)
2631 val
= make_float (sign
* atof (p
));
2638 int digit
= digit_to_number (*p
++, b
);
2644 val
= make_fixnum_or_float (sign
* v
);
2664 static Lisp_Object float_arith_driver
P_ ((double, int, enum arithop
,
2665 int, Lisp_Object
*));
2666 extern Lisp_Object
fmod_float ();
2669 arith_driver (code
, nargs
, args
)
2672 register Lisp_Object
*args
;
2674 register Lisp_Object val
;
2675 register int argnum
;
2676 register EMACS_INT accum
= 0;
2677 register EMACS_INT next
;
2679 switch (SWITCH_ENUM_CAST (code
))
2697 for (argnum
= 0; argnum
< nargs
; argnum
++)
2699 /* Using args[argnum] as argument to CHECK_NUMBER_... */
2701 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val
);
2704 return float_arith_driver ((double) accum
, argnum
, code
,
2707 next
= XINT (args
[argnum
]);
2708 switch (SWITCH_ENUM_CAST (code
))
2714 accum
= argnum
? accum
- next
: nargs
== 1 ? - next
: next
;
2725 xsignal0 (Qarith_error
);
2739 if (!argnum
|| next
> accum
)
2743 if (!argnum
|| next
< accum
)
2749 XSETINT (val
, accum
);
2754 #define isnan(x) ((x) != (x))
2757 float_arith_driver (accum
, argnum
, code
, nargs
, args
)
2759 register int argnum
;
2762 register Lisp_Object
*args
;
2764 register Lisp_Object val
;
2767 for (; argnum
< nargs
; argnum
++)
2769 val
= args
[argnum
]; /* using args[argnum] as argument to CHECK_NUMBER_... */
2770 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val
);
2774 next
= XFLOAT_DATA (val
);
2778 args
[argnum
] = val
; /* runs into a compiler bug. */
2779 next
= XINT (args
[argnum
]);
2781 switch (SWITCH_ENUM_CAST (code
))
2787 accum
= argnum
? accum
- next
: nargs
== 1 ? - next
: next
;
2797 if (! IEEE_FLOATING_POINT
&& next
== 0)
2798 xsignal0 (Qarith_error
);
2805 return wrong_type_argument (Qinteger_or_marker_p
, val
);
2807 if (!argnum
|| isnan (next
) || next
> accum
)
2811 if (!argnum
|| isnan (next
) || next
< accum
)
2817 return make_float (accum
);
2821 DEFUN ("+", Fplus
, Splus
, 0, MANY
, 0,
2822 doc
: /* Return sum of any number of arguments, which are numbers or markers.
2823 usage: (+ &rest NUMBERS-OR-MARKERS) */)
2828 return arith_driver (Aadd
, nargs
, args
);
2831 DEFUN ("-", Fminus
, Sminus
, 0, MANY
, 0,
2832 doc
: /* Negate number or subtract numbers or markers and return the result.
2833 With one arg, negates it. With more than one arg,
2834 subtracts all but the first from the first.
2835 usage: (- &optional NUMBER-OR-MARKER &rest MORE-NUMBERS-OR-MARKERS) */)
2840 return arith_driver (Asub
, nargs
, args
);
2843 DEFUN ("*", Ftimes
, Stimes
, 0, MANY
, 0,
2844 doc
: /* Return product of any number of arguments, which are numbers or markers.
2845 usage: (* &rest NUMBERS-OR-MARKERS) */)
2850 return arith_driver (Amult
, nargs
, args
);
2853 DEFUN ("/", Fquo
, Squo
, 2, MANY
, 0,
2854 doc
: /* Return first argument divided by all the remaining arguments.
2855 The arguments must be numbers or markers.
2856 usage: (/ DIVIDEND DIVISOR &rest DIVISORS) */)
2862 for (argnum
= 2; argnum
< nargs
; argnum
++)
2863 if (FLOATP (args
[argnum
]))
2864 return float_arith_driver (0, 0, Adiv
, nargs
, args
);
2865 return arith_driver (Adiv
, nargs
, args
);
2868 DEFUN ("%", Frem
, Srem
, 2, 2, 0,
2869 doc
: /* Return remainder of X divided by Y.
2870 Both must be integers or markers. */)
2872 register Lisp_Object x
, y
;
2876 CHECK_NUMBER_COERCE_MARKER (x
);
2877 CHECK_NUMBER_COERCE_MARKER (y
);
2879 if (XFASTINT (y
) == 0)
2880 xsignal0 (Qarith_error
);
2882 XSETINT (val
, XINT (x
) % XINT (y
));
2896 /* If the magnitude of the result exceeds that of the divisor, or
2897 the sign of the result does not agree with that of the dividend,
2898 iterate with the reduced value. This does not yield a
2899 particularly accurate result, but at least it will be in the
2900 range promised by fmod. */
2902 r
-= f2
* floor (r
/ f2
);
2903 while (f2
<= (r
< 0 ? -r
: r
) || ((r
< 0) != (f1
< 0) && ! isnan (r
)));
2907 #endif /* ! HAVE_FMOD */
2909 DEFUN ("mod", Fmod
, Smod
, 2, 2, 0,
2910 doc
: /* Return X modulo Y.
2911 The result falls between zero (inclusive) and Y (exclusive).
2912 Both X and Y must be numbers or markers. */)
2914 register Lisp_Object x
, y
;
2919 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (x
);
2920 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (y
);
2922 if (FLOATP (x
) || FLOATP (y
))
2923 return fmod_float (x
, y
);
2929 xsignal0 (Qarith_error
);
2933 /* If the "remainder" comes out with the wrong sign, fix it. */
2934 if (i2
< 0 ? i1
> 0 : i1
< 0)
2941 DEFUN ("max", Fmax
, Smax
, 1, MANY
, 0,
2942 doc
: /* Return largest of all the arguments (which must be numbers or markers).
2943 The value is always a number; markers are converted to numbers.
2944 usage: (max NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */)
2949 return arith_driver (Amax
, nargs
, args
);
2952 DEFUN ("min", Fmin
, Smin
, 1, MANY
, 0,
2953 doc
: /* Return smallest of all the arguments (which must be numbers or markers).
2954 The value is always a number; markers are converted to numbers.
2955 usage: (min NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */)
2960 return arith_driver (Amin
, nargs
, args
);
2963 DEFUN ("logand", Flogand
, Slogand
, 0, MANY
, 0,
2964 doc
: /* Return bitwise-and of all the arguments.
2965 Arguments may be integers, or markers converted to integers.
2966 usage: (logand &rest INTS-OR-MARKERS) */)
2971 return arith_driver (Alogand
, nargs
, args
);
2974 DEFUN ("logior", Flogior
, Slogior
, 0, MANY
, 0,
2975 doc
: /* Return bitwise-or of all the arguments.
2976 Arguments may be integers, or markers converted to integers.
2977 usage: (logior &rest INTS-OR-MARKERS) */)
2982 return arith_driver (Alogior
, nargs
, args
);
2985 DEFUN ("logxor", Flogxor
, Slogxor
, 0, MANY
, 0,
2986 doc
: /* Return bitwise-exclusive-or of all the arguments.
2987 Arguments may be integers, or markers converted to integers.
2988 usage: (logxor &rest INTS-OR-MARKERS) */)
2993 return arith_driver (Alogxor
, nargs
, args
);
2996 DEFUN ("ash", Fash
, Sash
, 2, 2, 0,
2997 doc
: /* Return VALUE with its bits shifted left by COUNT.
2998 If COUNT is negative, shifting is actually to the right.
2999 In this case, the sign bit is duplicated. */)
3001 register Lisp_Object value
, count
;
3003 register Lisp_Object val
;
3005 CHECK_NUMBER (value
);
3006 CHECK_NUMBER (count
);
3008 if (XINT (count
) >= BITS_PER_EMACS_INT
)
3010 else if (XINT (count
) > 0)
3011 XSETINT (val
, XINT (value
) << XFASTINT (count
));
3012 else if (XINT (count
) <= -BITS_PER_EMACS_INT
)
3013 XSETINT (val
, XINT (value
) < 0 ? -1 : 0);
3015 XSETINT (val
, XINT (value
) >> -XINT (count
));
3019 DEFUN ("lsh", Flsh
, Slsh
, 2, 2, 0,
3020 doc
: /* Return VALUE with its bits shifted left by COUNT.
3021 If COUNT is negative, shifting is actually to the right.
3022 In this case, zeros are shifted in on the left. */)
3024 register Lisp_Object value
, count
;
3026 register Lisp_Object val
;
3028 CHECK_NUMBER (value
);
3029 CHECK_NUMBER (count
);
3031 if (XINT (count
) >= BITS_PER_EMACS_INT
)
3033 else if (XINT (count
) > 0)
3034 XSETINT (val
, (EMACS_UINT
) XUINT (value
) << XFASTINT (count
));
3035 else if (XINT (count
) <= -BITS_PER_EMACS_INT
)
3038 XSETINT (val
, (EMACS_UINT
) XUINT (value
) >> -XINT (count
));
3042 DEFUN ("1+", Fadd1
, Sadd1
, 1, 1, 0,
3043 doc
: /* Return NUMBER plus one. NUMBER may be a number or a marker.
3044 Markers are converted to integers. */)
3046 register Lisp_Object number
;
3048 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number
);
3050 if (FLOATP (number
))
3051 return (make_float (1.0 + XFLOAT_DATA (number
)));
3053 XSETINT (number
, XINT (number
) + 1);
3057 DEFUN ("1-", Fsub1
, Ssub1
, 1, 1, 0,
3058 doc
: /* Return NUMBER minus one. NUMBER may be a number or a marker.
3059 Markers are converted to integers. */)
3061 register Lisp_Object number
;
3063 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number
);
3065 if (FLOATP (number
))
3066 return (make_float (-1.0 + XFLOAT_DATA (number
)));
3068 XSETINT (number
, XINT (number
) - 1);
3072 DEFUN ("lognot", Flognot
, Slognot
, 1, 1, 0,
3073 doc
: /* Return the bitwise complement of NUMBER. NUMBER must be an integer. */)
3075 register Lisp_Object number
;
3077 CHECK_NUMBER (number
);
3078 XSETINT (number
, ~XINT (number
));
3082 DEFUN ("byteorder", Fbyteorder
, Sbyteorder
, 0, 0, 0,
3083 doc
: /* Return the byteorder for the machine.
3084 Returns 66 (ASCII uppercase B) for big endian machines or 108 (ASCII
3085 lowercase l) for small endian machines. */)
3088 unsigned i
= 0x04030201;
3089 int order
= *(char *)&i
== 1 ? 108 : 66;
3091 return make_number (order
);
3099 Lisp_Object error_tail
, arith_tail
;
3101 Qquote
= intern_c_string ("quote");
3102 Qlambda
= intern_c_string ("lambda");
3103 Qsubr
= intern_c_string ("subr");
3104 Qerror_conditions
= intern_c_string ("error-conditions");
3105 Qerror_message
= intern_c_string ("error-message");
3106 Qtop_level
= intern_c_string ("top-level");
3108 Qerror
= intern_c_string ("error");
3109 Qquit
= intern_c_string ("quit");
3110 Qwrong_type_argument
= intern_c_string ("wrong-type-argument");
3111 Qargs_out_of_range
= intern_c_string ("args-out-of-range");
3112 Qvoid_function
= intern_c_string ("void-function");
3113 Qcyclic_function_indirection
= intern_c_string ("cyclic-function-indirection");
3114 Qcyclic_variable_indirection
= intern_c_string ("cyclic-variable-indirection");
3115 Qvoid_variable
= intern_c_string ("void-variable");
3116 Qsetting_constant
= intern_c_string ("setting-constant");
3117 Qinvalid_read_syntax
= intern_c_string ("invalid-read-syntax");
3119 Qinvalid_function
= intern_c_string ("invalid-function");
3120 Qwrong_number_of_arguments
= intern_c_string ("wrong-number-of-arguments");
3121 Qno_catch
= intern_c_string ("no-catch");
3122 Qend_of_file
= intern_c_string ("end-of-file");
3123 Qarith_error
= intern_c_string ("arith-error");
3124 Qbeginning_of_buffer
= intern_c_string ("beginning-of-buffer");
3125 Qend_of_buffer
= intern_c_string ("end-of-buffer");
3126 Qbuffer_read_only
= intern_c_string ("buffer-read-only");
3127 Qtext_read_only
= intern_c_string ("text-read-only");
3128 Qmark_inactive
= intern_c_string ("mark-inactive");
3130 Qlistp
= intern_c_string ("listp");
3131 Qconsp
= intern_c_string ("consp");
3132 Qsymbolp
= intern_c_string ("symbolp");
3133 Qkeywordp
= intern_c_string ("keywordp");
3134 Qintegerp
= intern_c_string ("integerp");
3135 Qnatnump
= intern_c_string ("natnump");
3136 Qwholenump
= intern_c_string ("wholenump");
3137 Qstringp
= intern_c_string ("stringp");
3138 Qarrayp
= intern_c_string ("arrayp");
3139 Qsequencep
= intern_c_string ("sequencep");
3140 Qbufferp
= intern_c_string ("bufferp");
3141 Qvectorp
= intern_c_string ("vectorp");
3142 Qchar_or_string_p
= intern_c_string ("char-or-string-p");
3143 Qmarkerp
= intern_c_string ("markerp");
3144 Qbuffer_or_string_p
= intern_c_string ("buffer-or-string-p");
3145 Qinteger_or_marker_p
= intern_c_string ("integer-or-marker-p");
3146 Qboundp
= intern_c_string ("boundp");
3147 Qfboundp
= intern_c_string ("fboundp");
3149 Qfloatp
= intern_c_string ("floatp");
3150 Qnumberp
= intern_c_string ("numberp");
3151 Qnumber_or_marker_p
= intern_c_string ("number-or-marker-p");
3153 Qchar_table_p
= intern_c_string ("char-table-p");
3154 Qvector_or_char_table_p
= intern_c_string ("vector-or-char-table-p");
3156 Qsubrp
= intern_c_string ("subrp");
3157 Qunevalled
= intern_c_string ("unevalled");
3158 Qmany
= intern_c_string ("many");
3160 Qcdr
= intern_c_string ("cdr");
3162 /* Handle automatic advice activation */
3163 Qad_advice_info
= intern_c_string ("ad-advice-info");
3164 Qad_activate_internal
= intern_c_string ("ad-activate-internal");
3166 error_tail
= pure_cons (Qerror
, Qnil
);
3168 /* ERROR is used as a signaler for random errors for which nothing else is right */
3170 Fput (Qerror
, Qerror_conditions
,
3172 Fput (Qerror
, Qerror_message
,
3173 make_pure_c_string ("error"));
3175 Fput (Qquit
, Qerror_conditions
,
3176 pure_cons (Qquit
, Qnil
));
3177 Fput (Qquit
, Qerror_message
,
3178 make_pure_c_string ("Quit"));
3180 Fput (Qwrong_type_argument
, Qerror_conditions
,
3181 pure_cons (Qwrong_type_argument
, error_tail
));
3182 Fput (Qwrong_type_argument
, Qerror_message
,
3183 make_pure_c_string ("Wrong type argument"));
3185 Fput (Qargs_out_of_range
, Qerror_conditions
,
3186 pure_cons (Qargs_out_of_range
, error_tail
));
3187 Fput (Qargs_out_of_range
, Qerror_message
,
3188 make_pure_c_string ("Args out of range"));
3190 Fput (Qvoid_function
, Qerror_conditions
,
3191 pure_cons (Qvoid_function
, error_tail
));
3192 Fput (Qvoid_function
, Qerror_message
,
3193 make_pure_c_string ("Symbol's function definition is void"));
3195 Fput (Qcyclic_function_indirection
, Qerror_conditions
,
3196 pure_cons (Qcyclic_function_indirection
, error_tail
));
3197 Fput (Qcyclic_function_indirection
, Qerror_message
,
3198 make_pure_c_string ("Symbol's chain of function indirections contains a loop"));
3200 Fput (Qcyclic_variable_indirection
, Qerror_conditions
,
3201 pure_cons (Qcyclic_variable_indirection
, error_tail
));
3202 Fput (Qcyclic_variable_indirection
, Qerror_message
,
3203 make_pure_c_string ("Symbol's chain of variable indirections contains a loop"));
3205 Qcircular_list
= intern_c_string ("circular-list");
3206 staticpro (&Qcircular_list
);
3207 Fput (Qcircular_list
, Qerror_conditions
,
3208 pure_cons (Qcircular_list
, error_tail
));
3209 Fput (Qcircular_list
, Qerror_message
,
3210 make_pure_c_string ("List contains a loop"));
3212 Fput (Qvoid_variable
, Qerror_conditions
,
3213 pure_cons (Qvoid_variable
, error_tail
));
3214 Fput (Qvoid_variable
, Qerror_message
,
3215 make_pure_c_string ("Symbol's value as variable is void"));
3217 Fput (Qsetting_constant
, Qerror_conditions
,
3218 pure_cons (Qsetting_constant
, error_tail
));
3219 Fput (Qsetting_constant
, Qerror_message
,
3220 make_pure_c_string ("Attempt to set a constant symbol"));
3222 Fput (Qinvalid_read_syntax
, Qerror_conditions
,
3223 pure_cons (Qinvalid_read_syntax
, error_tail
));
3224 Fput (Qinvalid_read_syntax
, Qerror_message
,
3225 make_pure_c_string ("Invalid read syntax"));
3227 Fput (Qinvalid_function
, Qerror_conditions
,
3228 pure_cons (Qinvalid_function
, error_tail
));
3229 Fput (Qinvalid_function
, Qerror_message
,
3230 make_pure_c_string ("Invalid function"));
3232 Fput (Qwrong_number_of_arguments
, Qerror_conditions
,
3233 pure_cons (Qwrong_number_of_arguments
, error_tail
));
3234 Fput (Qwrong_number_of_arguments
, Qerror_message
,
3235 make_pure_c_string ("Wrong number of arguments"));
3237 Fput (Qno_catch
, Qerror_conditions
,
3238 pure_cons (Qno_catch
, error_tail
));
3239 Fput (Qno_catch
, Qerror_message
,
3240 make_pure_c_string ("No catch for tag"));
3242 Fput (Qend_of_file
, Qerror_conditions
,
3243 pure_cons (Qend_of_file
, error_tail
));
3244 Fput (Qend_of_file
, Qerror_message
,
3245 make_pure_c_string ("End of file during parsing"));
3247 arith_tail
= pure_cons (Qarith_error
, error_tail
);
3248 Fput (Qarith_error
, Qerror_conditions
,
3250 Fput (Qarith_error
, Qerror_message
,
3251 make_pure_c_string ("Arithmetic error"));
3253 Fput (Qbeginning_of_buffer
, Qerror_conditions
,
3254 pure_cons (Qbeginning_of_buffer
, error_tail
));
3255 Fput (Qbeginning_of_buffer
, Qerror_message
,
3256 make_pure_c_string ("Beginning of buffer"));
3258 Fput (Qend_of_buffer
, Qerror_conditions
,
3259 pure_cons (Qend_of_buffer
, error_tail
));
3260 Fput (Qend_of_buffer
, Qerror_message
,
3261 make_pure_c_string ("End of buffer"));
3263 Fput (Qbuffer_read_only
, Qerror_conditions
,
3264 pure_cons (Qbuffer_read_only
, error_tail
));
3265 Fput (Qbuffer_read_only
, Qerror_message
,
3266 make_pure_c_string ("Buffer is read-only"));
3268 Fput (Qtext_read_only
, Qerror_conditions
,
3269 pure_cons (Qtext_read_only
, error_tail
));
3270 Fput (Qtext_read_only
, Qerror_message
,
3271 make_pure_c_string ("Text is read-only"));
3273 Qrange_error
= intern_c_string ("range-error");
3274 Qdomain_error
= intern_c_string ("domain-error");
3275 Qsingularity_error
= intern_c_string ("singularity-error");
3276 Qoverflow_error
= intern_c_string ("overflow-error");
3277 Qunderflow_error
= intern_c_string ("underflow-error");
3279 Fput (Qdomain_error
, Qerror_conditions
,
3280 pure_cons (Qdomain_error
, arith_tail
));
3281 Fput (Qdomain_error
, Qerror_message
,
3282 make_pure_c_string ("Arithmetic domain error"));
3284 Fput (Qrange_error
, Qerror_conditions
,
3285 pure_cons (Qrange_error
, arith_tail
));
3286 Fput (Qrange_error
, Qerror_message
,
3287 make_pure_c_string ("Arithmetic range error"));
3289 Fput (Qsingularity_error
, Qerror_conditions
,
3290 pure_cons (Qsingularity_error
, Fcons (Qdomain_error
, arith_tail
)));
3291 Fput (Qsingularity_error
, Qerror_message
,
3292 make_pure_c_string ("Arithmetic singularity error"));
3294 Fput (Qoverflow_error
, Qerror_conditions
,
3295 pure_cons (Qoverflow_error
, Fcons (Qdomain_error
, arith_tail
)));
3296 Fput (Qoverflow_error
, Qerror_message
,
3297 make_pure_c_string ("Arithmetic overflow error"));
3299 Fput (Qunderflow_error
, Qerror_conditions
,
3300 pure_cons (Qunderflow_error
, Fcons (Qdomain_error
, arith_tail
)));
3301 Fput (Qunderflow_error
, Qerror_message
,
3302 make_pure_c_string ("Arithmetic underflow error"));
3304 staticpro (&Qrange_error
);
3305 staticpro (&Qdomain_error
);
3306 staticpro (&Qsingularity_error
);
3307 staticpro (&Qoverflow_error
);
3308 staticpro (&Qunderflow_error
);
3312 staticpro (&Qquote
);
3313 staticpro (&Qlambda
);
3315 staticpro (&Qunbound
);
3316 staticpro (&Qerror_conditions
);
3317 staticpro (&Qerror_message
);
3318 staticpro (&Qtop_level
);
3320 staticpro (&Qerror
);
3322 staticpro (&Qwrong_type_argument
);
3323 staticpro (&Qargs_out_of_range
);
3324 staticpro (&Qvoid_function
);
3325 staticpro (&Qcyclic_function_indirection
);
3326 staticpro (&Qcyclic_variable_indirection
);
3327 staticpro (&Qvoid_variable
);
3328 staticpro (&Qsetting_constant
);
3329 staticpro (&Qinvalid_read_syntax
);
3330 staticpro (&Qwrong_number_of_arguments
);
3331 staticpro (&Qinvalid_function
);
3332 staticpro (&Qno_catch
);
3333 staticpro (&Qend_of_file
);
3334 staticpro (&Qarith_error
);
3335 staticpro (&Qbeginning_of_buffer
);
3336 staticpro (&Qend_of_buffer
);
3337 staticpro (&Qbuffer_read_only
);
3338 staticpro (&Qtext_read_only
);
3339 staticpro (&Qmark_inactive
);
3341 staticpro (&Qlistp
);
3342 staticpro (&Qconsp
);
3343 staticpro (&Qsymbolp
);
3344 staticpro (&Qkeywordp
);
3345 staticpro (&Qintegerp
);
3346 staticpro (&Qnatnump
);
3347 staticpro (&Qwholenump
);
3348 staticpro (&Qstringp
);
3349 staticpro (&Qarrayp
);
3350 staticpro (&Qsequencep
);
3351 staticpro (&Qbufferp
);
3352 staticpro (&Qvectorp
);
3353 staticpro (&Qchar_or_string_p
);
3354 staticpro (&Qmarkerp
);
3355 staticpro (&Qbuffer_or_string_p
);
3356 staticpro (&Qinteger_or_marker_p
);
3357 staticpro (&Qfloatp
);
3358 staticpro (&Qnumberp
);
3359 staticpro (&Qnumber_or_marker_p
);
3360 staticpro (&Qchar_table_p
);
3361 staticpro (&Qvector_or_char_table_p
);
3362 staticpro (&Qsubrp
);
3364 staticpro (&Qunevalled
);
3366 staticpro (&Qboundp
);
3367 staticpro (&Qfboundp
);
3369 staticpro (&Qad_advice_info
);
3370 staticpro (&Qad_activate_internal
);
3372 /* Types that type-of returns. */
3373 Qinteger
= intern_c_string ("integer");
3374 Qsymbol
= intern_c_string ("symbol");
3375 Qstring
= intern_c_string ("string");
3376 Qcons
= intern_c_string ("cons");
3377 Qmarker
= intern_c_string ("marker");
3378 Qoverlay
= intern_c_string ("overlay");
3379 Qfloat
= intern_c_string ("float");
3380 Qwindow_configuration
= intern_c_string ("window-configuration");
3381 Qprocess
= intern_c_string ("process");
3382 Qwindow
= intern_c_string ("window");
3383 /* Qsubr = intern_c_string ("subr"); */
3384 Qcompiled_function
= intern_c_string ("compiled-function");
3385 Qbuffer
= intern_c_string ("buffer");
3386 Qframe
= intern_c_string ("frame");
3387 Qvector
= intern_c_string ("vector");
3388 Qchar_table
= intern_c_string ("char-table");
3389 Qbool_vector
= intern_c_string ("bool-vector");
3390 Qhash_table
= intern_c_string ("hash-table");
3392 Qthread_local_mark
= Fmake_symbol (make_pure_string ("thread-local-mark",
3395 DEFSYM (Qfont_spec
, "font-spec");
3396 DEFSYM (Qfont_entity
, "font-entity");
3397 DEFSYM (Qfont_object
, "font-object");
3399 DEFSYM (Qinteractive_form
, "interactive-form");
3401 staticpro (&Qinteger
);
3402 staticpro (&Qsymbol
);
3403 staticpro (&Qstring
);
3405 staticpro (&Qmarker
);
3406 staticpro (&Qoverlay
);
3407 staticpro (&Qfloat
);
3408 staticpro (&Qwindow_configuration
);
3409 staticpro (&Qprocess
);
3410 staticpro (&Qwindow
);
3411 /* staticpro (&Qsubr); */
3412 staticpro (&Qcompiled_function
);
3413 staticpro (&Qbuffer
);
3414 staticpro (&Qframe
);
3415 staticpro (&Qvector
);
3416 staticpro (&Qchar_table
);
3417 staticpro (&Qbool_vector
);
3418 staticpro (&Qhash_table
);
3419 staticpro (&Qthread_local_mark
);
3421 defsubr (&Sindirect_variable
);
3422 defsubr (&Sinteractive_form
);
3425 defsubr (&Stype_of
);
3430 defsubr (&Sintegerp
);
3431 defsubr (&Sinteger_or_marker_p
);
3432 defsubr (&Snumberp
);
3433 defsubr (&Snumber_or_marker_p
);
3435 defsubr (&Snatnump
);
3436 defsubr (&Ssymbolp
);
3437 defsubr (&Skeywordp
);
3438 defsubr (&Sstringp
);
3439 defsubr (&Smultibyte_string_p
);
3440 defsubr (&Svectorp
);
3441 defsubr (&Schar_table_p
);
3442 defsubr (&Svector_or_char_table_p
);
3443 defsubr (&Sbool_vector_p
);
3445 defsubr (&Ssequencep
);
3446 defsubr (&Sbufferp
);
3447 defsubr (&Smarkerp
);
3449 defsubr (&Sbyte_code_function_p
);
3450 defsubr (&Schar_or_string_p
);
3453 defsubr (&Scar_safe
);
3454 defsubr (&Scdr_safe
);
3457 defsubr (&Ssymbol_function
);
3458 defsubr (&Sindirect_function
);
3459 defsubr (&Ssymbol_plist
);
3460 defsubr (&Ssymbol_name
);
3461 defsubr (&Smakunbound
);
3462 defsubr (&Sfmakunbound
);
3464 defsubr (&Sfboundp
);
3466 defsubr (&Sdefalias
);
3467 defsubr (&Ssetplist
);
3468 defsubr (&Ssymbol_value
);
3470 defsubr (&Sdefault_boundp
);
3471 defsubr (&Sdefault_value
);
3472 defsubr (&Sset_default
);
3473 defsubr (&Ssetq_default
);
3474 defsubr (&Smake_variable_buffer_local
);
3475 defsubr (&Smake_local_variable
);
3476 defsubr (&Skill_local_variable
);
3477 defsubr (&Smake_variable_frame_local
);
3478 defsubr (&Slocal_variable_p
);
3479 defsubr (&Slocal_variable_if_set_p
);
3480 defsubr (&Svariable_binding_locus
);
3481 #if 0 /* XXX Remove this. --lorentey */
3482 defsubr (&Sterminal_local_value
);
3483 defsubr (&Sset_terminal_local_value
);
3487 defsubr (&Snumber_to_string
);
3488 defsubr (&Sstring_to_number
);
3489 defsubr (&Seqlsign
);
3512 defsubr (&Sbyteorder
);
3513 defsubr (&Ssubr_arity
);
3514 defsubr (&Ssubr_name
);
3516 XSYMBOL (Qwholenump
)->function
= XSYMBOL (Qnatnump
)->function
;
3518 DEFVAR_LISP ("most-positive-fixnum", &Vmost_positive_fixnum
,
3519 doc
: /* The largest value that is representable in a Lisp integer. */);
3520 Vmost_positive_fixnum
= make_number (MOST_POSITIVE_FIXNUM
);
3521 XSYMBOL (intern_c_string ("most-positive-fixnum"))->constant
= 1;
3523 DEFVAR_LISP ("most-negative-fixnum", &Vmost_negative_fixnum
,
3524 doc
: /* The smallest value that is representable in a Lisp integer. */);
3525 Vmost_negative_fixnum
= make_number (MOST_NEGATIVE_FIXNUM
);
3526 XSYMBOL (intern_c_string ("most-negative-fixnum"))->constant
= 1;
3533 sigsetmask (SIGEMPTYMASK
);
3535 SIGNAL_THREAD_CHECK (signo
);
3536 xsignal0 (Qarith_error
);
3542 /* Don't do this if just dumping out.
3543 We don't want to call `signal' in this case
3544 so that we don't have trouble with dumping
3545 signal-delivering routines in an inconsistent state. */
3549 #endif /* CANNOT_DUMP */
3550 signal (SIGFPE
, arith_error
);
3553 signal (SIGEMT
, arith_error
);
3557 /* arch-tag: 25879798-b84d-479a-9c89-7d148e2109f7
3558 (do not change this comment) */