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
;
100 circular_list_error (list
)
103 xsignal (Qcircular_list
, list
);
108 wrong_type_argument (predicate
, value
)
109 register Lisp_Object predicate
, value
;
111 /* If VALUE is not even a valid Lisp object, we'd want to abort here
112 where we can get a backtrace showing where it came from. We used
113 to try and do that by checking the tagbits, but nowadays all
114 tagbits are potentially valid. */
115 /* if ((unsigned int) XTYPE (value) >= Lisp_Type_Limit)
118 xsignal2 (Qwrong_type_argument
, predicate
, value
);
124 error ("Attempt to modify read-only object");
128 args_out_of_range (a1
, a2
)
131 xsignal2 (Qargs_out_of_range
, a1
, a2
);
135 args_out_of_range_3 (a1
, a2
, a3
)
136 Lisp_Object a1
, a2
, a3
;
138 xsignal3 (Qargs_out_of_range
, a1
, a2
, a3
);
141 /* On some machines, XINT needs a temporary location.
142 Here it is, in case it is needed. */
144 int sign_extend_temp
;
146 /* On a few machines, XINT can only be done by calling this. */
149 sign_extend_lisp_int (num
)
152 if (num
& (((EMACS_INT
) 1) << (VALBITS
- 1)))
153 return num
| (((EMACS_INT
) (-1)) << VALBITS
);
155 return num
& ((((EMACS_INT
) 1) << VALBITS
) - 1);
158 /* Data type predicates */
160 DEFUN ("eq", Feq
, Seq
, 2, 2, 0,
161 doc
: /* Return t if the two args are the same Lisp object. */)
163 Lisp_Object obj1
, obj2
;
170 DEFUN ("null", Fnull
, Snull
, 1, 1, 0,
171 doc
: /* Return t if OBJECT is nil. */)
180 DEFUN ("type-of", Ftype_of
, Stype_of
, 1, 1, 0,
181 doc
: /* Return a symbol representing the type of OBJECT.
182 The symbol returned names the object's basic type;
183 for example, (type-of 1) returns `integer'. */)
187 switch (XTYPE (object
))
202 switch (XMISCTYPE (object
))
204 case Lisp_Misc_Marker
:
206 case Lisp_Misc_Overlay
:
208 case Lisp_Misc_Float
:
213 case Lisp_Vectorlike
:
214 if (WINDOW_CONFIGURATIONP (object
))
215 return Qwindow_configuration
;
216 if (PROCESSP (object
))
218 if (WINDOWP (object
))
222 if (COMPILEDP (object
))
223 return Qcompiled_function
;
224 if (BUFFERP (object
))
226 if (CHAR_TABLE_P (object
))
228 if (BOOL_VECTOR_P (object
))
232 if (HASH_TABLE_P (object
))
234 if (FONT_SPEC_P (object
))
236 if (FONT_ENTITY_P (object
))
238 if (FONT_OBJECT_P (object
))
250 DEFUN ("consp", Fconsp
, Sconsp
, 1, 1, 0,
251 doc
: /* Return t if OBJECT is a cons cell. */)
260 DEFUN ("atom", Fatom
, Satom
, 1, 1, 0,
261 doc
: /* Return t if OBJECT is not a cons cell. This includes nil. */)
270 DEFUN ("listp", Flistp
, Slistp
, 1, 1, 0,
271 doc
: /* Return t if OBJECT is a list, that is, a cons cell or nil.
272 Otherwise, return nil. */)
276 if (CONSP (object
) || NILP (object
))
281 DEFUN ("nlistp", Fnlistp
, Snlistp
, 1, 1, 0,
282 doc
: /* Return t if OBJECT is not a list. Lists include nil. */)
286 if (CONSP (object
) || NILP (object
))
291 DEFUN ("symbolp", Fsymbolp
, Ssymbolp
, 1, 1, 0,
292 doc
: /* Return t if OBJECT is a symbol. */)
296 if (SYMBOLP (object
))
301 /* Define this in C to avoid unnecessarily consing up the symbol
303 DEFUN ("keywordp", Fkeywordp
, Skeywordp
, 1, 1, 0,
304 doc
: /* Return t if OBJECT is a keyword.
305 This means that it is a symbol with a print name beginning with `:'
306 interned in the initial obarray. */)
311 && SREF (SYMBOL_NAME (object
), 0) == ':'
312 && SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P (object
))
317 DEFUN ("vectorp", Fvectorp
, Svectorp
, 1, 1, 0,
318 doc
: /* Return t if OBJECT is a vector. */)
322 if (VECTORP (object
))
327 DEFUN ("stringp", Fstringp
, Sstringp
, 1, 1, 0,
328 doc
: /* Return t if OBJECT is a string. */)
332 if (STRINGP (object
))
337 DEFUN ("multibyte-string-p", Fmultibyte_string_p
, Smultibyte_string_p
,
339 doc
: /* Return t if OBJECT is a multibyte string. */)
343 if (STRINGP (object
) && STRING_MULTIBYTE (object
))
348 DEFUN ("char-table-p", Fchar_table_p
, Schar_table_p
, 1, 1, 0,
349 doc
: /* Return t if OBJECT is a char-table. */)
353 if (CHAR_TABLE_P (object
))
358 DEFUN ("vector-or-char-table-p", Fvector_or_char_table_p
,
359 Svector_or_char_table_p
, 1, 1, 0,
360 doc
: /* Return t if OBJECT is a char-table or vector. */)
364 if (VECTORP (object
) || CHAR_TABLE_P (object
))
369 DEFUN ("bool-vector-p", Fbool_vector_p
, Sbool_vector_p
, 1, 1, 0,
370 doc
: /* Return t if OBJECT is a bool-vector. */)
374 if (BOOL_VECTOR_P (object
))
379 DEFUN ("arrayp", Farrayp
, Sarrayp
, 1, 1, 0,
380 doc
: /* Return t if OBJECT is an array (string or vector). */)
389 DEFUN ("sequencep", Fsequencep
, Ssequencep
, 1, 1, 0,
390 doc
: /* Return t if OBJECT is a sequence (list or array). */)
392 register Lisp_Object object
;
394 if (CONSP (object
) || NILP (object
) || ARRAYP (object
))
399 DEFUN ("bufferp", Fbufferp
, Sbufferp
, 1, 1, 0,
400 doc
: /* Return t if OBJECT is an editor buffer. */)
404 if (BUFFERP (object
))
409 DEFUN ("markerp", Fmarkerp
, Smarkerp
, 1, 1, 0,
410 doc
: /* Return t if OBJECT is a marker (editor pointer). */)
414 if (MARKERP (object
))
419 DEFUN ("subrp", Fsubrp
, Ssubrp
, 1, 1, 0,
420 doc
: /* Return t if OBJECT is a built-in function. */)
429 DEFUN ("byte-code-function-p", Fbyte_code_function_p
, Sbyte_code_function_p
,
431 doc
: /* Return t if OBJECT is a byte-compiled function object. */)
435 if (COMPILEDP (object
))
440 DEFUN ("char-or-string-p", Fchar_or_string_p
, Schar_or_string_p
, 1, 1, 0,
441 doc
: /* Return t if OBJECT is a character or a string. */)
443 register Lisp_Object object
;
445 if (CHARACTERP (object
) || STRINGP (object
))
450 DEFUN ("integerp", Fintegerp
, Sintegerp
, 1, 1, 0,
451 doc
: /* Return t if OBJECT is an integer. */)
455 if (INTEGERP (object
))
460 DEFUN ("integer-or-marker-p", Finteger_or_marker_p
, Sinteger_or_marker_p
, 1, 1, 0,
461 doc
: /* Return t if OBJECT is an integer or a marker (editor pointer). */)
463 register Lisp_Object object
;
465 if (MARKERP (object
) || INTEGERP (object
))
470 DEFUN ("natnump", Fnatnump
, Snatnump
, 1, 1, 0,
471 doc
: /* Return t if OBJECT is a nonnegative integer. */)
475 if (NATNUMP (object
))
480 DEFUN ("numberp", Fnumberp
, Snumberp
, 1, 1, 0,
481 doc
: /* Return t if OBJECT is a number (floating point or integer). */)
485 if (NUMBERP (object
))
491 DEFUN ("number-or-marker-p", Fnumber_or_marker_p
,
492 Snumber_or_marker_p
, 1, 1, 0,
493 doc
: /* Return t if OBJECT is a number or a marker. */)
497 if (NUMBERP (object
) || MARKERP (object
))
502 DEFUN ("floatp", Ffloatp
, Sfloatp
, 1, 1, 0,
503 doc
: /* Return t if OBJECT is a floating point number. */)
513 /* Extract and set components of lists */
515 DEFUN ("car", Fcar
, Scar
, 1, 1, 0,
516 doc
: /* Return the car of LIST. If arg is nil, return nil.
517 Error if arg is not nil and not a cons cell. See also `car-safe'.
519 See Info node `(elisp)Cons Cells' for a discussion of related basic
520 Lisp concepts such as car, cdr, cons cell and list. */)
522 register Lisp_Object list
;
527 DEFUN ("car-safe", Fcar_safe
, Scar_safe
, 1, 1, 0,
528 doc
: /* Return the car of OBJECT if it is a cons cell, or else nil. */)
532 return CAR_SAFE (object
);
535 DEFUN ("cdr", Fcdr
, Scdr
, 1, 1, 0,
536 doc
: /* Return the cdr of LIST. If arg is nil, return nil.
537 Error if arg is not nil and not a cons cell. See also `cdr-safe'.
539 See Info node `(elisp)Cons Cells' for a discussion of related basic
540 Lisp concepts such as cdr, car, cons cell and list. */)
542 register Lisp_Object list
;
547 DEFUN ("cdr-safe", Fcdr_safe
, Scdr_safe
, 1, 1, 0,
548 doc
: /* Return the cdr of OBJECT if it is a cons cell, or else nil. */)
552 return CDR_SAFE (object
);
555 DEFUN ("setcar", Fsetcar
, Ssetcar
, 2, 2, 0,
556 doc
: /* Set the car of CELL to be NEWCAR. Returns NEWCAR. */)
558 register Lisp_Object cell
, newcar
;
562 XSETCAR (cell
, newcar
);
566 DEFUN ("setcdr", Fsetcdr
, Ssetcdr
, 2, 2, 0,
567 doc
: /* Set the cdr of CELL to be NEWCDR. Returns NEWCDR. */)
569 register Lisp_Object cell
, newcdr
;
573 XSETCDR (cell
, newcdr
);
577 /* Extract and set components of symbols */
579 DEFUN ("boundp", Fboundp
, Sboundp
, 1, 1, 0,
580 doc
: /* Return t if SYMBOL's value is not void. */)
582 register Lisp_Object symbol
;
584 Lisp_Object valcontents
;
586 valcontents
= find_symbol_value (symbol
);
588 return (EQ (valcontents
, Qunbound
) ? Qnil
: Qt
);
591 DEFUN ("fboundp", Ffboundp
, Sfboundp
, 1, 1, 0,
592 doc
: /* Return t if SYMBOL's function definition is not void. */)
594 register Lisp_Object symbol
;
596 CHECK_SYMBOL (symbol
);
597 return (EQ (XSYMBOL (symbol
)->function
, Qunbound
) ? Qnil
: Qt
);
600 DEFUN ("makunbound", Fmakunbound
, Smakunbound
, 1, 1, 0,
601 doc
: /* Make SYMBOL's value be void.
604 register Lisp_Object symbol
;
606 CHECK_SYMBOL (symbol
);
607 if (SYMBOL_CONSTANT_P (symbol
))
608 xsignal1 (Qsetting_constant
, symbol
);
609 Fset (symbol
, Qunbound
);
613 DEFUN ("fmakunbound", Ffmakunbound
, Sfmakunbound
, 1, 1, 0,
614 doc
: /* Make SYMBOL's function definition be void.
617 register Lisp_Object symbol
;
619 CHECK_SYMBOL (symbol
);
620 if (NILP (symbol
) || EQ (symbol
, Qt
))
621 xsignal1 (Qsetting_constant
, symbol
);
622 XSYMBOL (symbol
)->function
= Qunbound
;
626 DEFUN ("symbol-function", Fsymbol_function
, Ssymbol_function
, 1, 1, 0,
627 doc
: /* Return SYMBOL's function definition. Error if that is void. */)
629 register Lisp_Object symbol
;
631 CHECK_SYMBOL (symbol
);
632 if (!EQ (XSYMBOL (symbol
)->function
, Qunbound
))
633 return XSYMBOL (symbol
)->function
;
634 xsignal1 (Qvoid_function
, symbol
);
637 DEFUN ("symbol-plist", Fsymbol_plist
, Ssymbol_plist
, 1, 1, 0,
638 doc
: /* Return SYMBOL's property list. */)
640 register Lisp_Object symbol
;
642 CHECK_SYMBOL (symbol
);
643 return XSYMBOL (symbol
)->plist
;
646 DEFUN ("symbol-name", Fsymbol_name
, Ssymbol_name
, 1, 1, 0,
647 doc
: /* Return SYMBOL's name, a string. */)
649 register Lisp_Object symbol
;
651 register Lisp_Object name
;
653 CHECK_SYMBOL (symbol
);
654 name
= SYMBOL_NAME (symbol
);
658 DEFUN ("fset", Ffset
, Sfset
, 2, 2, 0,
659 doc
: /* Set SYMBOL's function definition to DEFINITION, and return DEFINITION. */)
661 register Lisp_Object symbol
, definition
;
663 register Lisp_Object function
;
665 CHECK_SYMBOL (symbol
);
666 if (NILP (symbol
) || EQ (symbol
, Qt
))
667 xsignal1 (Qsetting_constant
, symbol
);
669 function
= XSYMBOL (symbol
)->function
;
671 if (!NILP (Vautoload_queue
) && !EQ (function
, Qunbound
))
672 Vautoload_queue
= Fcons (Fcons (symbol
, function
), Vautoload_queue
);
674 if (CONSP (function
) && EQ (XCAR (function
), Qautoload
))
675 Fput (symbol
, Qautoload
, XCDR (function
));
677 XSYMBOL (symbol
)->function
= definition
;
678 /* Handle automatic advice activation */
679 if (CONSP (XSYMBOL (symbol
)->plist
) && !NILP (Fget (symbol
, Qad_advice_info
)))
681 call2 (Qad_activate_internal
, symbol
, Qnil
);
682 definition
= XSYMBOL (symbol
)->function
;
687 extern Lisp_Object Qfunction_documentation
;
689 DEFUN ("defalias", Fdefalias
, Sdefalias
, 2, 3, 0,
690 doc
: /* Set SYMBOL's function definition to DEFINITION, and return DEFINITION.
691 Associates the function with the current load file, if any.
692 The optional third argument DOCSTRING specifies the documentation string
693 for SYMBOL; if it is omitted or nil, SYMBOL uses the documentation string
694 determined by DEFINITION. */)
695 (symbol
, definition
, docstring
)
696 register Lisp_Object symbol
, definition
, docstring
;
698 CHECK_SYMBOL (symbol
);
699 if (CONSP (XSYMBOL (symbol
)->function
)
700 && EQ (XCAR (XSYMBOL (symbol
)->function
), Qautoload
))
701 LOADHIST_ATTACH (Fcons (Qt
, symbol
));
702 definition
= Ffset (symbol
, definition
);
703 LOADHIST_ATTACH (Fcons (Qdefun
, symbol
));
704 if (!NILP (docstring
))
705 Fput (symbol
, Qfunction_documentation
, docstring
);
709 DEFUN ("setplist", Fsetplist
, Ssetplist
, 2, 2, 0,
710 doc
: /* Set SYMBOL's property list to NEWPLIST, and return NEWPLIST. */)
712 register Lisp_Object symbol
, newplist
;
714 CHECK_SYMBOL (symbol
);
715 XSYMBOL (symbol
)->plist
= newplist
;
719 DEFUN ("subr-arity", Fsubr_arity
, Ssubr_arity
, 1, 1, 0,
720 doc
: /* Return minimum and maximum number of args allowed for SUBR.
721 SUBR must be a built-in function.
722 The returned value is a pair (MIN . MAX). MIN is the minimum number
723 of args. MAX is the maximum number or the symbol `many', for a
724 function with `&rest' args, or `unevalled' for a special form. */)
728 short minargs
, maxargs
;
730 minargs
= XSUBR (subr
)->min_args
;
731 maxargs
= XSUBR (subr
)->max_args
;
733 return Fcons (make_number (minargs
), Qmany
);
734 else if (maxargs
== UNEVALLED
)
735 return Fcons (make_number (minargs
), Qunevalled
);
737 return Fcons (make_number (minargs
), make_number (maxargs
));
740 DEFUN ("subr-name", Fsubr_name
, Ssubr_name
, 1, 1, 0,
741 doc
: /* Return name of subroutine SUBR.
742 SUBR must be a built-in function. */)
748 name
= XSUBR (subr
)->symbol_name
;
749 return make_string (name
, strlen (name
));
752 DEFUN ("interactive-form", Finteractive_form
, Sinteractive_form
, 1, 1, 0,
753 doc
: /* Return the interactive form of CMD or nil if none.
754 If CMD is not a command, the return value is nil.
755 Value, if non-nil, is a list \(interactive SPEC). */)
759 Lisp_Object fun
= indirect_function (cmd
); /* Check cycles. */
761 if (NILP (fun
) || EQ (fun
, Qunbound
))
764 /* Use an `interactive-form' property if present, analogous to the
765 function-documentation property. */
767 while (SYMBOLP (fun
))
769 Lisp_Object tmp
= Fget (fun
, Qinteractive_form
);
773 fun
= Fsymbol_function (fun
);
778 char *spec
= XSUBR (fun
)->intspec
;
780 return list2 (Qinteractive
,
781 (*spec
!= '(') ? build_string (spec
) :
782 Fcar (Fread_from_string (build_string (spec
), Qnil
, Qnil
)));
784 else if (COMPILEDP (fun
))
786 if ((ASIZE (fun
) & PSEUDOVECTOR_SIZE_MASK
) > COMPILED_INTERACTIVE
)
787 return list2 (Qinteractive
, AREF (fun
, COMPILED_INTERACTIVE
));
789 else if (CONSP (fun
))
791 Lisp_Object funcar
= XCAR (fun
);
792 if (EQ (funcar
, Qlambda
))
793 return Fassq (Qinteractive
, Fcdr (XCDR (fun
)));
794 else if (EQ (funcar
, Qautoload
))
798 do_autoload (fun
, cmd
);
800 return Finteractive_form (cmd
);
807 /***********************************************************************
808 Getting and Setting Values of Symbols
809 ***********************************************************************/
812 find_variable_location (Lisp_Object
*root
)
814 if (THREADLOCALP (*root
))
816 struct Lisp_ThreadLocal
*thr
= XTHREADLOCAL (*root
);
817 Lisp_Object cons
= assq_no_quit (get_current_thread (),
819 if (!EQ (cons
, Qnil
))
820 return &XCDR_AS_LVALUE (cons
);
828 ensure_thread_local (Lisp_Object
*root
)
832 if (THREADLOCALP (*root
))
833 cons
= assq_no_quit (get_current_thread (),
834 XTHREADLOCAL (*root
)->thread_alist
);
838 newval
= allocate_misc ();
839 XMISCTYPE (newval
) = Lisp_Misc_ThreadLocal
;
840 XTHREADLOCAL (newval
)->global
= *root
;
841 XTHREADLOCAL (newval
)->thread_alist
= Qnil
;
848 struct Lisp_ThreadLocal
*local
= XTHREADLOCAL (*root
);
849 cons
= Fcons (get_current_thread (), Qthread_local_mark
);
850 local
->thread_alist
= Fcons (cons
, local
->thread_alist
);
857 remove_thread_local (Lisp_Object
*root
)
859 if (THREADLOCALP (*root
))
861 Lisp_Object iter
, thr
= get_current_thread (), prior
= Qnil
;
862 struct Lisp_ThreadLocal
*local
= XTHREADLOCAL (*root
);
863 for (iter
= local
->thread_alist
; !NILP (iter
); iter
= XCDR (iter
))
865 if (EQ (XCAR (XCAR (iter
)), thr
))
868 local
->thread_alist
= XCDR (iter
);
870 XSETCDR (prior
, XCDR (iter
));
878 /* Return the symbol holding SYMBOL's value. Signal
879 `cyclic-variable-indirection' if SYMBOL's chain of variable
880 indirections contains a loop. */
883 indirect_variable (symbol
)
884 struct Lisp_Symbol
*symbol
;
886 struct Lisp_Symbol
*tortoise
, *hare
;
888 hare
= tortoise
= symbol
;
890 while (hare
->indirect_variable
)
892 hare
= XSYMBOL (hare
->value
);
893 if (!hare
->indirect_variable
)
896 hare
= XSYMBOL (hare
->value
);
897 tortoise
= XSYMBOL (tortoise
->value
);
899 if (hare
== tortoise
)
902 XSETSYMBOL (tem
, symbol
);
903 xsignal1 (Qcyclic_variable_indirection
, tem
);
911 DEFUN ("indirect-variable", Findirect_variable
, Sindirect_variable
, 1, 1, 0,
912 doc
: /* Return the variable at the end of OBJECT's variable chain.
913 If OBJECT is a symbol, follow all variable indirections and return the final
914 variable. If OBJECT is not a symbol, just return it.
915 Signal a cyclic-variable-indirection error if there is a loop in the
916 variable chain of symbols. */)
920 if (SYMBOLP (object
))
921 XSETSYMBOL (object
, indirect_variable (XSYMBOL (object
)));
926 /* Given the raw contents of a symbol value cell,
927 return the Lisp value of the symbol.
928 This does not handle buffer-local variables; use
929 swap_in_symval_forwarding for that. */
932 do_symval_forwarding (valcontents
)
933 Lisp_Object valcontents
;
935 register Lisp_Object val
;
936 if (MISCP (valcontents
))
937 switch (XMISCTYPE (valcontents
))
939 case Lisp_Misc_Intfwd
:
940 XSETINT (val
, *XINTFWD (valcontents
)->intvar
);
943 case Lisp_Misc_Boolfwd
:
944 return (*XBOOLFWD (valcontents
)->boolvar
? Qt
: Qnil
);
946 case Lisp_Misc_Objfwd
:
947 return *XOBJFWD (valcontents
)->objvar
;
949 case Lisp_Misc_Buffer_Objfwd
:
950 return PER_BUFFER_VALUE (current_buffer
,
951 XBUFFER_OBJFWD (valcontents
)->offset
);
953 case Lisp_Misc_Kboard_Objfwd
:
954 /* We used to simply use current_kboard here, but from Lisp
955 code, it's value is often unexpected. It seems nicer to
956 allow constructions like this to work as intuitively expected:
958 (with-selected-frame frame
959 (define-key local-function-map "\eOP" [f1]))
961 On the other hand, this affects the semantics of
962 last-command and real-last-command, and people may rely on
963 that. I took a quick look at the Lisp codebase, and I
964 don't think anything will break. --lorentey */
965 return *(Lisp_Object
*)(XKBOARD_OBJFWD (valcontents
)->offset
966 + (char *)FRAME_KBOARD (SELECTED_FRAME ()));
968 case Lisp_Misc_ThreadLocal
:
969 return *find_variable_location (&valcontents
);
974 /* Store NEWVAL into SYMBOL, where VALCONTENTS is found in the value cell
975 of SYMBOL. If SYMBOL is buffer-local, VALCONTENTS should be the
976 buffer-independent contents of the value cell: forwarded just one
977 step past the buffer-localness.
979 BUF non-zero means set the value in buffer BUF instead of the
980 current buffer. This only plays a role for per-buffer variables. */
983 store_symval_forwarding (symbol
, valcontents
, newval
, buf
)
985 register Lisp_Object valcontents
, newval
;
988 switch (SWITCH_ENUM_CAST (XTYPE (valcontents
)))
991 switch (XMISCTYPE (valcontents
))
993 case Lisp_Misc_Intfwd
:
994 CHECK_NUMBER (newval
);
995 *XINTFWD (valcontents
)->intvar
= XINT (newval
);
996 /* This can never happen since intvar points to an EMACS_INT
997 which is at least large enough to hold a Lisp_Object.
998 if (*XINTFWD (valcontents)->intvar != XINT (newval))
999 error ("Value out of range for variable `%s'",
1000 SDATA (SYMBOL_NAME (symbol))); */
1003 case Lisp_Misc_Boolfwd
:
1004 *XBOOLFWD (valcontents
)->boolvar
= !NILP (newval
);
1007 case Lisp_Misc_Objfwd
:
1008 *find_variable_location (XOBJFWD (valcontents
)->objvar
) = newval
;
1010 /* If this variable is a default for something stored
1011 in the buffer itself, such as default-fill-column,
1012 find the buffers that don't have local values for it
1014 if (XOBJFWD (valcontents
)->objvar
> (Lisp_Object
*) &buffer_defaults
1015 && XOBJFWD (valcontents
)->objvar
< (Lisp_Object
*) (&buffer_defaults
+ 1))
1017 int offset
= ((char *) XOBJFWD (valcontents
)->objvar
1018 - (char *) &buffer_defaults
);
1019 int idx
= PER_BUFFER_IDX (offset
);
1026 for (tail
= Vbuffer_alist
; CONSP (tail
); tail
= XCDR (tail
))
1031 buf
= Fcdr (XCAR (tail
));
1032 if (!BUFFERP (buf
)) continue;
1035 if (! PER_BUFFER_VALUE_P (b
, idx
))
1036 PER_BUFFER_VALUE (b
, offset
) = newval
;
1041 case Lisp_Misc_Buffer_Objfwd
:
1043 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1044 Lisp_Object type
= XBUFFER_OBJFWD (valcontents
)->slottype
;
1046 if (!(NILP (type
) || NILP (newval
)
1047 || (XINT (type
) == LISP_INT_TAG
1049 : XTYPE (newval
) == XINT (type
))))
1050 buffer_slot_type_mismatch (newval
, XINT (type
));
1053 buf
= current_buffer
;
1054 PER_BUFFER_VALUE (buf
, offset
) = newval
;
1058 case Lisp_Misc_Kboard_Objfwd
:
1060 char *base
= (char *) FRAME_KBOARD (SELECTED_FRAME ());
1061 char *p
= base
+ XKBOARD_OBJFWD (valcontents
)->offset
;
1062 *(Lisp_Object
*) p
= newval
;
1073 valcontents
= SYMBOL_VALUE (symbol
);
1074 if (BUFFER_LOCAL_VALUEP (valcontents
))
1075 XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
= newval
;
1076 else if (THREADLOCALP (valcontents
))
1077 *find_variable_location (&indirect_variable (XSYMBOL (symbol
))->value
) = newval
;
1079 SET_SYMBOL_VALUE (symbol
, newval
);
1083 /* Set up SYMBOL to refer to its global binding.
1084 This makes it safe to alter the status of other bindings. */
1087 swap_in_global_binding (symbol
)
1090 Lisp_Object valcontents
= SYMBOL_VALUE (symbol
);
1091 struct Lisp_Buffer_Local_Value
*blv
= XBUFFER_LOCAL_VALUE (valcontents
);
1092 Lisp_Object cdr
= blv
->cdr
;
1094 /* Unload the previously loaded binding. */
1095 Fsetcdr (XCAR (cdr
),
1096 do_symval_forwarding (blv
->realvalue
));
1098 /* Select the global binding in the symbol. */
1100 store_symval_forwarding (symbol
, blv
->realvalue
, XCDR (cdr
), NULL
);
1102 /* Indicate that the global binding is set up now. */
1105 blv
->found_for_frame
= 0;
1106 blv
->found_for_buffer
= 0;
1109 /* Set up the buffer-local symbol SYMBOL for validity in the current buffer.
1110 VALCONTENTS is the contents of its value cell,
1111 which points to a struct Lisp_Buffer_Local_Value.
1113 Return the value forwarded one step past the buffer-local stage.
1114 This could be another forwarding pointer. */
1117 swap_in_symval_forwarding (symbol
, valcontents
)
1118 Lisp_Object symbol
, valcontents
;
1120 register Lisp_Object tem1
;
1122 tem1
= XBUFFER_LOCAL_VALUE (valcontents
)->buffer
;
1125 || current_buffer
!= XBUFFER (tem1
)
1126 || (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
1127 && ! EQ (selected_frame
, XBUFFER_LOCAL_VALUE (valcontents
)->frame
)))
1129 struct Lisp_Symbol
*sym
= XSYMBOL (symbol
);
1130 if (sym
->indirect_variable
)
1132 sym
= indirect_variable (sym
);
1133 XSETSYMBOL (symbol
, sym
);
1136 /* Unload the previously loaded binding. */
1137 tem1
= XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
1139 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
));
1140 /* Choose the new binding. */
1141 tem1
= assq_no_quit (symbol
, BUF_LOCAL_VAR_ALIST (current_buffer
));
1142 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_frame
= 0;
1143 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 0;
1146 if (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
)
1147 tem1
= assq_no_quit (symbol
, XFRAME (selected_frame
)->param_alist
);
1149 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_frame
= 1;
1151 tem1
= XBUFFER_LOCAL_VALUE (valcontents
)->cdr
;
1154 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 1;
1156 /* Load the new binding. */
1157 XSETCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
, tem1
);
1158 XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents
)->buffer
, current_buffer
);
1159 XBUFFER_LOCAL_VALUE (valcontents
)->frame
= selected_frame
;
1160 store_symval_forwarding (symbol
,
1161 XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
,
1164 return XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
;
1167 /* Find the value of a symbol, returning Qunbound if it's not bound.
1168 This is helpful for code which just wants to get a variable's value
1169 if it has one, without signaling an error.
1170 Note that it must not be possible to quit
1171 within this function. Great care is required for this. */
1174 find_symbol_value (symbol
)
1177 register Lisp_Object valcontents
;
1178 register Lisp_Object val
;
1180 CHECK_SYMBOL (symbol
);
1181 valcontents
= SYMBOL_VALUE (symbol
);
1183 if (BUFFER_LOCAL_VALUEP (valcontents
))
1184 valcontents
= swap_in_symval_forwarding (symbol
, valcontents
);
1186 return do_symval_forwarding (valcontents
);
1189 DEFUN ("symbol-value", Fsymbol_value
, Ssymbol_value
, 1, 1, 0,
1190 doc
: /* Return SYMBOL's value. Error if that is void. */)
1196 val
= find_symbol_value (symbol
);
1197 if (!EQ (val
, Qunbound
))
1200 xsignal1 (Qvoid_variable
, symbol
);
1203 DEFUN ("set", Fset
, Sset
, 2, 2, 0,
1204 doc
: /* Set SYMBOL's value to NEWVAL, and return NEWVAL. */)
1206 register Lisp_Object symbol
, newval
;
1208 return set_internal (symbol
, newval
, current_buffer
, 0);
1211 /* Return 1 if SYMBOL currently has a let-binding
1212 which was made in the buffer that is now current. */
1215 let_shadows_buffer_binding_p (symbol
)
1216 struct Lisp_Symbol
*symbol
;
1218 volatile struct specbinding
*p
;
1220 for (p
= specpdl_ptr
- 1; p
>= specpdl
; p
--)
1222 && CONSP (p
->symbol
))
1224 struct Lisp_Symbol
*let_bound_symbol
= XSYMBOL (XCAR (p
->symbol
));
1225 if ((symbol
== let_bound_symbol
1226 || (let_bound_symbol
->indirect_variable
1227 && symbol
== indirect_variable (let_bound_symbol
)))
1228 && XBUFFER (XCDR (XCDR (p
->symbol
))) == current_buffer
)
1232 return p
>= specpdl
;
1235 /* Store the value NEWVAL into SYMBOL.
1236 If buffer-locality is an issue, BUF specifies which buffer to use.
1237 (0 stands for the current buffer.)
1239 If BINDFLAG is zero, then if this symbol is supposed to become
1240 local in every buffer where it is set, then we make it local.
1241 If BINDFLAG is nonzero, we don't do that. */
1244 set_internal (symbol
, newval
, buf
, bindflag
)
1245 register Lisp_Object symbol
, newval
;
1249 int voide
= EQ (newval
, Qunbound
);
1251 register Lisp_Object valcontents
, innercontents
, tem1
, current_alist_element
;
1254 buf
= current_buffer
;
1256 /* If restoring in a dead buffer, do nothing. */
1257 if (NILP (BUF_NAME (buf
)))
1260 CHECK_SYMBOL (symbol
);
1261 if (SYMBOL_CONSTANT_P (symbol
)
1262 && (NILP (Fkeywordp (symbol
))
1263 || !EQ (newval
, SYMBOL_VALUE (symbol
))))
1264 xsignal1 (Qsetting_constant
, symbol
);
1266 innercontents
= valcontents
= SYMBOL_VALUE (symbol
);
1268 if (BUFFER_OBJFWDP (valcontents
))
1270 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1271 int idx
= PER_BUFFER_IDX (offset
);
1274 && !let_shadows_buffer_binding_p (XSYMBOL (symbol
)))
1275 SET_PER_BUFFER_VALUE_P (buf
, idx
, 1);
1277 else if (BUFFER_LOCAL_VALUEP (valcontents
))
1279 /* valcontents is a struct Lisp_Buffer_Local_Value. */
1280 if (XSYMBOL (symbol
)->indirect_variable
)
1281 XSETSYMBOL (symbol
, indirect_variable (XSYMBOL (symbol
)));
1283 /* What binding is loaded right now? */
1284 current_alist_element
1285 = XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
1287 /* If the current buffer is not the buffer whose binding is
1288 loaded, or if there may be frame-local bindings and the frame
1289 isn't the right one, or if it's a Lisp_Buffer_Local_Value and
1290 the default binding is loaded, the loaded binding may be the
1292 if (!BUFFERP (XBUFFER_LOCAL_VALUE (valcontents
)->buffer
)
1293 || buf
!= XBUFFER (XBUFFER_LOCAL_VALUE (valcontents
)->buffer
)
1294 || (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
1295 && !EQ (selected_frame
, XBUFFER_LOCAL_VALUE (valcontents
)->frame
))
1296 /* Also unload a global binding (if the var is local_if_set). */
1297 || (EQ (XCAR (current_alist_element
),
1298 current_alist_element
)))
1300 /* The currently loaded binding is not necessarily valid.
1301 We need to unload it, and choose a new binding. */
1303 /* Write out `realvalue' to the old loaded binding. */
1304 Fsetcdr (current_alist_element
,
1305 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
));
1307 /* Find the new binding. */
1308 tem1
= Fassq (symbol
, BUF_LOCAL_VAR_ALIST (buf
));
1309 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 1;
1310 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_frame
= 0;
1314 /* This buffer still sees the default value. */
1316 /* If the variable is not local_if_set,
1317 or if this is `let' rather than `set',
1318 make CURRENT-ALIST-ELEMENT point to itself,
1319 indicating that we're seeing the default value.
1320 Likewise if the variable has been let-bound
1321 in the current buffer. */
1322 if (bindflag
|| !XBUFFER_LOCAL_VALUE (valcontents
)->local_if_set
1323 || let_shadows_buffer_binding_p (XSYMBOL (symbol
)))
1325 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 0;
1327 if (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
)
1328 tem1
= Fassq (symbol
,
1329 XFRAME (selected_frame
)->param_alist
);
1332 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_frame
= 1;
1334 tem1
= XBUFFER_LOCAL_VALUE (valcontents
)->cdr
;
1336 /* If it's a Lisp_Buffer_Local_Value, being set not bound,
1337 and we're not within a let that was made for this buffer,
1338 create a new buffer-local binding for the variable.
1339 That means, give this buffer a new assoc for a local value
1340 and load that binding. */
1343 tem1
= Fcons (symbol
, XCDR (current_alist_element
));
1344 BUF_LOCAL_VAR_ALIST (buf
)
1345 = Fcons (tem1
, BUF_LOCAL_VAR_ALIST (buf
));
1349 /* Record which binding is now loaded. */
1350 XSETCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
, tem1
);
1352 /* Set `buffer' and `frame' slots for the binding now loaded. */
1353 XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents
)->buffer
, buf
);
1354 XBUFFER_LOCAL_VALUE (valcontents
)->frame
= selected_frame
;
1356 innercontents
= XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
;
1358 /* Store the new value in the cons-cell. */
1359 XSETCDR (XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
), newval
);
1362 /* If storing void (making the symbol void), forward only through
1363 buffer-local indicator, not through Lisp_Objfwd, etc. */
1365 store_symval_forwarding (symbol
, Qnil
, newval
, buf
);
1367 store_symval_forwarding (symbol
, innercontents
, newval
, buf
);
1372 /* Access or set a buffer-local symbol's default value. */
1374 /* Return the default value of SYMBOL, but don't check for voidness.
1375 Return Qunbound if it is void. */
1378 default_value (symbol
)
1381 register Lisp_Object valcontents
;
1383 CHECK_SYMBOL (symbol
);
1384 valcontents
= SYMBOL_VALUE (symbol
);
1386 /* For a built-in buffer-local variable, get the default value
1387 rather than letting do_symval_forwarding get the current value. */
1388 if (BUFFER_OBJFWDP (valcontents
))
1390 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1391 if (PER_BUFFER_IDX (offset
) != 0)
1392 return PER_BUFFER_DEFAULT (offset
);
1395 /* Handle user-created local variables. */
1396 if (BUFFER_LOCAL_VALUEP (valcontents
))
1398 /* If var is set up for a buffer that lacks a local value for it,
1399 the current value is nominally the default value.
1400 But the `realvalue' slot may be more up to date, since
1401 ordinary setq stores just that slot. So use that. */
1402 Lisp_Object current_alist_element
, alist_element_car
;
1403 current_alist_element
1404 = XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
1405 alist_element_car
= XCAR (current_alist_element
);
1406 if (EQ (alist_element_car
, current_alist_element
))
1407 return do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
);
1409 return XCDR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
1411 /* For other variables, get the current value. */
1412 return do_symval_forwarding (valcontents
);
1415 DEFUN ("default-boundp", Fdefault_boundp
, Sdefault_boundp
, 1, 1, 0,
1416 doc
: /* Return t if SYMBOL has a non-void default value.
1417 This is the value that is seen in buffers that do not have their own values
1418 for this variable. */)
1422 register Lisp_Object value
;
1424 value
= default_value (symbol
);
1425 return (EQ (value
, Qunbound
) ? Qnil
: Qt
);
1428 DEFUN ("default-value", Fdefault_value
, Sdefault_value
, 1, 1, 0,
1429 doc
: /* Return SYMBOL's default value.
1430 This is the value that is seen in buffers that do not have their own values
1431 for this variable. The default value is meaningful for variables with
1432 local bindings in certain buffers. */)
1436 register Lisp_Object value
;
1438 value
= default_value (symbol
);
1439 if (!EQ (value
, Qunbound
))
1442 xsignal1 (Qvoid_variable
, symbol
);
1445 DEFUN ("set-default", Fset_default
, Sset_default
, 2, 2, 0,
1446 doc
: /* Set SYMBOL's default value to VALUE. SYMBOL and VALUE are evaluated.
1447 The default value is seen in buffers that do not have their own values
1448 for this variable. */)
1450 Lisp_Object symbol
, value
;
1452 register Lisp_Object valcontents
, current_alist_element
, alist_element_buffer
;
1454 CHECK_SYMBOL (symbol
);
1455 valcontents
= SYMBOL_VALUE (symbol
);
1457 /* Handle variables like case-fold-search that have special slots
1458 in the buffer. Make them work apparently like Lisp_Buffer_Local_Value
1460 if (BUFFER_OBJFWDP (valcontents
))
1462 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1463 int idx
= PER_BUFFER_IDX (offset
);
1465 PER_BUFFER_DEFAULT (offset
) = value
;
1467 /* If this variable is not always local in all buffers,
1468 set it in the buffers that don't nominally have a local value. */
1473 for (b
= all_buffers
; b
; b
= b
->next
)
1474 if (!PER_BUFFER_VALUE_P (b
, idx
))
1475 PER_BUFFER_VALUE (b
, offset
) = value
;
1480 if (!BUFFER_LOCAL_VALUEP (valcontents
))
1481 return Fset (symbol
, value
);
1483 /* Store new value into the DEFAULT-VALUE slot. */
1484 XSETCDR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
, value
);
1486 /* If the default binding is now loaded, set the REALVALUE slot too. */
1487 current_alist_element
1488 = XCAR (XBUFFER_LOCAL_VALUE (valcontents
)->cdr
);
1489 alist_element_buffer
= Fcar (current_alist_element
);
1490 if (EQ (alist_element_buffer
, current_alist_element
))
1491 store_symval_forwarding (symbol
,
1492 XBUFFER_LOCAL_VALUE (valcontents
)->realvalue
,
1498 DEFUN ("setq-default", Fsetq_default
, Ssetq_default
, 0, UNEVALLED
, 0,
1499 doc
: /* Set the default value of variable VAR to VALUE.
1500 VAR, the variable name, is literal (not evaluated);
1501 VALUE is an expression: it is evaluated and its value returned.
1502 The default value of a variable is seen in buffers
1503 that do not have their own values for the variable.
1505 More generally, you can use multiple variables and values, as in
1506 (setq-default VAR VALUE VAR VALUE...)
1507 This sets each VAR's default value to the corresponding VALUE.
1508 The VALUE for the Nth VAR can refer to the new default values
1510 usage: (setq-default [VAR VALUE]...) */)
1514 register Lisp_Object args_left
;
1515 register Lisp_Object val
, symbol
;
1516 struct gcpro gcpro1
;
1526 val
= Feval (Fcar (Fcdr (args_left
)));
1527 symbol
= XCAR (args_left
);
1528 Fset_default (symbol
, val
);
1529 args_left
= Fcdr (XCDR (args_left
));
1531 while (!NILP (args_left
));
1537 /* Lisp functions for creating and removing buffer-local variables. */
1539 DEFUN ("make-variable-buffer-local", Fmake_variable_buffer_local
, Smake_variable_buffer_local
,
1540 1, 1, "vMake Variable Buffer Local: ",
1541 doc
: /* Make VARIABLE become buffer-local whenever it is set.
1542 At any time, the value for the current buffer is in effect,
1543 unless the variable has never been set in this buffer,
1544 in which case the default value is in effect.
1545 Note that binding the variable with `let', or setting it while
1546 a `let'-style binding made in this buffer is in effect,
1547 does not make the variable buffer-local. Return VARIABLE.
1549 In most cases it is better to use `make-local-variable',
1550 which makes a variable local in just one buffer.
1552 The function `default-value' gets the default value and `set-default' sets it. */)
1554 register Lisp_Object variable
;
1556 register Lisp_Object tem
, valcontents
, newval
;
1557 struct Lisp_Symbol
*sym
;
1559 CHECK_SYMBOL (variable
);
1560 sym
= indirect_variable (XSYMBOL (variable
));
1562 valcontents
= sym
->value
;
1563 if (sym
->constant
|| KBOARD_OBJFWDP (valcontents
))
1564 error ("Symbol %s may not be buffer-local", SDATA (sym
->xname
));
1566 if (BUFFER_OBJFWDP (valcontents
))
1568 else if (BUFFER_LOCAL_VALUEP (valcontents
))
1570 if (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
)
1571 error ("Symbol %s may not be buffer-local", SDATA (sym
->xname
));
1572 newval
= valcontents
;
1576 if (EQ (valcontents
, Qunbound
))
1578 tem
= Fcons (Qnil
, Fsymbol_value (variable
));
1580 newval
= allocate_misc ();
1581 XMISCTYPE (newval
) = Lisp_Misc_Buffer_Local_Value
;
1582 XBUFFER_LOCAL_VALUE (newval
)->realvalue
= sym
->value
;
1583 XBUFFER_LOCAL_VALUE (newval
)->buffer
= Fcurrent_buffer ();
1584 XBUFFER_LOCAL_VALUE (newval
)->frame
= Qnil
;
1585 XBUFFER_LOCAL_VALUE (newval
)->found_for_buffer
= 0;
1586 XBUFFER_LOCAL_VALUE (newval
)->found_for_frame
= 0;
1587 XBUFFER_LOCAL_VALUE (newval
)->check_frame
= 0;
1588 XBUFFER_LOCAL_VALUE (newval
)->cdr
= tem
;
1589 sym
->value
= newval
;
1591 XBUFFER_LOCAL_VALUE (newval
)->local_if_set
= 1;
1595 DEFUN ("make-local-variable", Fmake_local_variable
, Smake_local_variable
,
1596 1, 1, "vMake Local Variable: ",
1597 doc
: /* Make VARIABLE have a separate value in the current buffer.
1598 Other buffers will continue to share a common default value.
1599 \(The buffer-local value of VARIABLE starts out as the same value
1600 VARIABLE previously had. If VARIABLE was void, it remains void.\)
1603 If the variable is already arranged to become local when set,
1604 this function causes a local value to exist for this buffer,
1605 just as setting the variable would do.
1607 This function returns VARIABLE, and therefore
1608 (set (make-local-variable 'VARIABLE) VALUE-EXP)
1611 See also `make-variable-buffer-local'.
1613 Do not use `make-local-variable' to make a hook variable buffer-local.
1614 Instead, use `add-hook' and specify t for the LOCAL argument. */)
1616 register Lisp_Object variable
;
1618 register Lisp_Object tem
, valcontents
;
1619 struct Lisp_Symbol
*sym
;
1621 CHECK_SYMBOL (variable
);
1622 sym
= indirect_variable (XSYMBOL (variable
));
1624 valcontents
= sym
->value
;
1625 if (sym
->constant
|| KBOARD_OBJFWDP (valcontents
)
1626 || (BUFFER_LOCAL_VALUEP (valcontents
)
1627 && (XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
)))
1628 error ("Symbol %s may not be buffer-local", SDATA (sym
->xname
));
1630 if ((BUFFER_LOCAL_VALUEP (valcontents
)
1631 && XBUFFER_LOCAL_VALUE (valcontents
)->local_if_set
)
1632 || BUFFER_OBJFWDP (valcontents
))
1634 tem
= Fboundp (variable
);
1636 /* Make sure the symbol has a local value in this particular buffer,
1637 by setting it to the same value it already has. */
1638 Fset (variable
, (EQ (tem
, Qt
) ? Fsymbol_value (variable
) : Qunbound
));
1641 /* Make sure symbol is set up to hold per-buffer values. */
1642 if (!BUFFER_LOCAL_VALUEP (valcontents
))
1645 tem
= Fcons (Qnil
, do_symval_forwarding (valcontents
));
1647 newval
= allocate_misc ();
1648 XMISCTYPE (newval
) = Lisp_Misc_Buffer_Local_Value
;
1649 XBUFFER_LOCAL_VALUE (newval
)->realvalue
= sym
->value
;
1650 XBUFFER_LOCAL_VALUE (newval
)->buffer
= Qnil
;
1651 XBUFFER_LOCAL_VALUE (newval
)->frame
= Qnil
;
1652 XBUFFER_LOCAL_VALUE (newval
)->local_if_set
= 0;
1653 XBUFFER_LOCAL_VALUE (newval
)->found_for_buffer
= 0;
1654 XBUFFER_LOCAL_VALUE (newval
)->found_for_frame
= 0;
1655 XBUFFER_LOCAL_VALUE (newval
)->check_frame
= 0;
1656 XBUFFER_LOCAL_VALUE (newval
)->cdr
= tem
;
1657 sym
->value
= newval
;
1659 /* Make sure this buffer has its own value of symbol. */
1660 XSETSYMBOL (variable
, sym
); /* Propagate variable indirections. */
1661 tem
= Fassq (variable
, BUF_LOCAL_VAR_ALIST (current_buffer
));
1664 /* Swap out any local binding for some other buffer, and make
1665 sure the current value is permanently recorded, if it's the
1667 find_symbol_value (variable
);
1669 BUF_LOCAL_VAR_ALIST (current_buffer
)
1670 = Fcons (Fcons (variable
, XCDR (XBUFFER_LOCAL_VALUE (sym
->value
)->cdr
)),
1671 BUF_LOCAL_VAR_ALIST (current_buffer
));
1673 /* Make sure symbol does not think it is set up for this buffer;
1674 force it to look once again for this buffer's value. */
1676 Lisp_Object
*pvalbuf
;
1678 valcontents
= sym
->value
;
1680 pvalbuf
= &XBUFFER_LOCAL_VALUE (valcontents
)->buffer
;
1681 if (current_buffer
== XBUFFER (*pvalbuf
))
1683 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 0;
1687 /* If the symbol forwards into a C variable, then load the binding
1688 for this buffer now. If C code modifies the variable before we
1689 load the binding in, then that new value will clobber the default
1690 binding the next time we unload it. */
1691 valcontents
= XBUFFER_LOCAL_VALUE (sym
->value
)->realvalue
;
1692 if (INTFWDP (valcontents
) || BOOLFWDP (valcontents
) || OBJFWDP (valcontents
))
1693 swap_in_symval_forwarding (variable
, sym
->value
);
1698 DEFUN ("kill-local-variable", Fkill_local_variable
, Skill_local_variable
,
1699 1, 1, "vKill Local Variable: ",
1700 doc
: /* Make VARIABLE no longer have a separate value in the current buffer.
1701 From now on the default value will apply in this buffer. Return VARIABLE. */)
1703 register Lisp_Object variable
;
1705 register Lisp_Object tem
, valcontents
;
1706 struct Lisp_Symbol
*sym
;
1708 CHECK_SYMBOL (variable
);
1709 sym
= indirect_variable (XSYMBOL (variable
));
1711 valcontents
= sym
->value
;
1713 if (BUFFER_OBJFWDP (valcontents
))
1715 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1716 int idx
= PER_BUFFER_IDX (offset
);
1720 SET_PER_BUFFER_VALUE_P (current_buffer
, idx
, 0);
1721 PER_BUFFER_VALUE (current_buffer
, offset
)
1722 = PER_BUFFER_DEFAULT (offset
);
1727 if (!BUFFER_LOCAL_VALUEP (valcontents
))
1730 /* Get rid of this buffer's alist element, if any. */
1731 XSETSYMBOL (variable
, sym
); /* Propagate variable indirection. */
1732 tem
= Fassq (variable
, BUF_LOCAL_VAR_ALIST (current_buffer
));
1734 BUF_LOCAL_VAR_ALIST (current_buffer
)
1735 = Fdelq (tem
, BUF_LOCAL_VAR_ALIST (current_buffer
));
1737 /* If the symbol is set up with the current buffer's binding
1738 loaded, recompute its value. We have to do it now, or else
1739 forwarded objects won't work right. */
1741 Lisp_Object
*pvalbuf
, buf
;
1742 valcontents
= sym
->value
;
1743 pvalbuf
= &XBUFFER_LOCAL_VALUE (valcontents
)->buffer
;
1744 XSETBUFFER (buf
, current_buffer
);
1745 if (EQ (buf
, *pvalbuf
))
1748 XBUFFER_LOCAL_VALUE (valcontents
)->found_for_buffer
= 0;
1749 find_symbol_value (variable
);
1756 /* Lisp functions for creating and removing buffer-local variables. */
1758 /* Obsolete since 22.2. NB adjust doc of modify-frame-parameters
1759 when/if this is removed. */
1761 DEFUN ("make-variable-frame-local", Fmake_variable_frame_local
, Smake_variable_frame_local
,
1762 1, 1, "vMake Variable Frame Local: ",
1763 doc
: /* Enable VARIABLE to have frame-local bindings.
1764 This does not create any frame-local bindings for VARIABLE,
1765 it just makes them possible.
1767 A frame-local binding is actually a frame parameter value.
1768 If a frame F has a value for the frame parameter named VARIABLE,
1769 that also acts as a frame-local binding for VARIABLE in F--
1770 provided this function has been called to enable VARIABLE
1771 to have frame-local bindings at all.
1773 The only way to create a frame-local binding for VARIABLE in a frame
1774 is to set the VARIABLE frame parameter of that frame. See
1775 `modify-frame-parameters' for how to set frame parameters.
1777 Note that since Emacs 23.1, variables cannot be both buffer-local and
1778 frame-local any more (buffer-local bindings used to take precedence over
1779 frame-local bindings). */)
1781 register Lisp_Object variable
;
1783 register Lisp_Object tem
, valcontents
, newval
;
1784 struct Lisp_Symbol
*sym
;
1786 CHECK_SYMBOL (variable
);
1787 sym
= indirect_variable (XSYMBOL (variable
));
1789 valcontents
= sym
->value
;
1790 if (sym
->constant
|| KBOARD_OBJFWDP (valcontents
)
1791 || BUFFER_OBJFWDP (valcontents
))
1792 error ("Symbol %s may not be frame-local", SDATA (sym
->xname
));
1794 if (BUFFER_LOCAL_VALUEP (valcontents
))
1796 if (!XBUFFER_LOCAL_VALUE (valcontents
)->check_frame
)
1797 error ("Symbol %s may not be frame-local", SDATA (sym
->xname
));
1801 if (EQ (valcontents
, Qunbound
))
1803 tem
= Fcons (Qnil
, Fsymbol_value (variable
));
1805 newval
= allocate_misc ();
1806 XMISCTYPE (newval
) = Lisp_Misc_Buffer_Local_Value
;
1807 XBUFFER_LOCAL_VALUE (newval
)->realvalue
= sym
->value
;
1808 XBUFFER_LOCAL_VALUE (newval
)->buffer
= Qnil
;
1809 XBUFFER_LOCAL_VALUE (newval
)->frame
= Qnil
;
1810 XBUFFER_LOCAL_VALUE (newval
)->local_if_set
= 0;
1811 XBUFFER_LOCAL_VALUE (newval
)->found_for_buffer
= 0;
1812 XBUFFER_LOCAL_VALUE (newval
)->found_for_frame
= 0;
1813 XBUFFER_LOCAL_VALUE (newval
)->check_frame
= 1;
1814 XBUFFER_LOCAL_VALUE (newval
)->cdr
= tem
;
1815 sym
->value
= newval
;
1819 DEFUN ("local-variable-p", Flocal_variable_p
, Slocal_variable_p
,
1821 doc
: /* Non-nil if VARIABLE has a local binding in buffer BUFFER.
1822 BUFFER defaults to the current buffer. */)
1824 register Lisp_Object variable
, buffer
;
1826 Lisp_Object valcontents
;
1827 register struct buffer
*buf
;
1828 struct Lisp_Symbol
*sym
;
1831 buf
= current_buffer
;
1834 CHECK_BUFFER (buffer
);
1835 buf
= XBUFFER (buffer
);
1838 CHECK_SYMBOL (variable
);
1839 sym
= indirect_variable (XSYMBOL (variable
));
1840 XSETSYMBOL (variable
, sym
);
1842 valcontents
= sym
->value
;
1843 if (BUFFER_LOCAL_VALUEP (valcontents
))
1845 Lisp_Object tail
, elt
;
1847 for (tail
= BUF_LOCAL_VAR_ALIST (buf
); CONSP (tail
); tail
= XCDR (tail
))
1850 if (EQ (variable
, XCAR (elt
)))
1854 if (BUFFER_OBJFWDP (valcontents
))
1856 int offset
= XBUFFER_OBJFWD (valcontents
)->offset
;
1857 int idx
= PER_BUFFER_IDX (offset
);
1858 if (idx
== -1 || PER_BUFFER_VALUE_P (buf
, idx
))
1864 DEFUN ("local-variable-if-set-p", Flocal_variable_if_set_p
, Slocal_variable_if_set_p
,
1866 doc
: /* Non-nil if VARIABLE will be local in buffer BUFFER when set there.
1867 More precisely, this means that setting the variable \(with `set' or`setq'),
1868 while it does not have a `let'-style binding that was made in BUFFER,
1869 will produce a buffer local binding. See Info node
1870 `(elisp)Creating Buffer-Local'.
1871 BUFFER defaults to the current buffer. */)
1873 register Lisp_Object variable
, buffer
;
1875 Lisp_Object valcontents
;
1876 register struct buffer
*buf
;
1877 struct Lisp_Symbol
*sym
;
1880 buf
= current_buffer
;
1883 CHECK_BUFFER (buffer
);
1884 buf
= XBUFFER (buffer
);
1887 CHECK_SYMBOL (variable
);
1888 sym
= indirect_variable (XSYMBOL (variable
));
1889 XSETSYMBOL (variable
, sym
);
1891 valcontents
= sym
->value
;
1893 if (BUFFER_OBJFWDP (valcontents
))
1894 /* All these slots become local if they are set. */
1896 else if (BUFFER_LOCAL_VALUEP (valcontents
))
1898 Lisp_Object tail
, elt
;
1899 if (XBUFFER_LOCAL_VALUE (valcontents
)->local_if_set
)
1901 for (tail
= BUF_LOCAL_VAR_ALIST (buf
); CONSP (tail
); tail
= XCDR (tail
))
1904 if (EQ (variable
, XCAR (elt
)))
1911 DEFUN ("variable-binding-locus", Fvariable_binding_locus
, Svariable_binding_locus
,
1913 doc
: /* Return a value indicating where VARIABLE's current binding comes from.
1914 If the current binding is buffer-local, the value is the current buffer.
1915 If the current binding is frame-local, the value is the selected frame.
1916 If the current binding is global (the default), the value is nil. */)
1918 register Lisp_Object variable
;
1920 Lisp_Object valcontents
;
1921 struct Lisp_Symbol
*sym
;
1923 CHECK_SYMBOL (variable
);
1924 sym
= indirect_variable (XSYMBOL (variable
));
1926 /* Make sure the current binding is actually swapped in. */
1927 find_symbol_value (variable
);
1929 valcontents
= sym
->value
;
1931 if (BUFFER_LOCAL_VALUEP (valcontents
)
1932 || BUFFER_OBJFWDP (valcontents
))
1934 /* For a local variable, record both the symbol and which
1935 buffer's or frame's value we are saving. */
1936 if (!NILP (Flocal_variable_p (variable
, Qnil
)))
1937 return Fcurrent_buffer ();
1938 else if (BUFFER_LOCAL_VALUEP (valcontents
)
1939 && XBUFFER_LOCAL_VALUE (valcontents
)->found_for_frame
)
1940 return XBUFFER_LOCAL_VALUE (valcontents
)->frame
;
1946 /* This code is disabled now that we use the selected frame to return
1947 keyboard-local-values. */
1949 extern struct terminal
*get_terminal
P_ ((Lisp_Object display
, int));
1951 DEFUN ("terminal-local-value", Fterminal_local_value
, Sterminal_local_value
, 2, 2, 0,
1952 doc
: /* Return the terminal-local value of SYMBOL on TERMINAL.
1953 If SYMBOL is not a terminal-local variable, then return its normal
1954 value, like `symbol-value'.
1956 TERMINAL may be a terminal object, a frame, or nil (meaning the
1957 selected frame's terminal device). */)
1960 Lisp_Object terminal
;
1963 struct terminal
*t
= get_terminal (terminal
, 1);
1964 push_kboard (t
->kboard
);
1965 result
= Fsymbol_value (symbol
);
1970 DEFUN ("set-terminal-local-value", Fset_terminal_local_value
, Sset_terminal_local_value
, 3, 3, 0,
1971 doc
: /* Set the terminal-local binding of SYMBOL on TERMINAL to VALUE.
1972 If VARIABLE is not a terminal-local variable, then set its normal
1973 binding, like `set'.
1975 TERMINAL may be a terminal object, a frame, or nil (meaning the
1976 selected frame's terminal device). */)
1977 (symbol
, terminal
, value
)
1979 Lisp_Object terminal
;
1983 struct terminal
*t
= get_terminal (terminal
, 1);
1984 push_kboard (d
->kboard
);
1985 result
= Fset (symbol
, value
);
1991 /* Find the function at the end of a chain of symbol function indirections. */
1993 /* If OBJECT is a symbol, find the end of its function chain and
1994 return the value found there. If OBJECT is not a symbol, just
1995 return it. If there is a cycle in the function chain, signal a
1996 cyclic-function-indirection error.
1998 This is like Findirect_function, except that it doesn't signal an
1999 error if the chain ends up unbound. */
2001 indirect_function (object
)
2002 register Lisp_Object object
;
2004 Lisp_Object tortoise
, hare
;
2006 hare
= tortoise
= object
;
2010 if (!SYMBOLP (hare
) || EQ (hare
, Qunbound
))
2012 hare
= XSYMBOL (hare
)->function
;
2013 if (!SYMBOLP (hare
) || EQ (hare
, Qunbound
))
2015 hare
= XSYMBOL (hare
)->function
;
2017 tortoise
= XSYMBOL (tortoise
)->function
;
2019 if (EQ (hare
, tortoise
))
2020 xsignal1 (Qcyclic_function_indirection
, object
);
2026 DEFUN ("indirect-function", Findirect_function
, Sindirect_function
, 1, 2, 0,
2027 doc
: /* Return the function at the end of OBJECT's function chain.
2028 If OBJECT is not a symbol, just return it. Otherwise, follow all
2029 function indirections to find the final function binding and return it.
2030 If the final symbol in the chain is unbound, signal a void-function error.
2031 Optional arg NOERROR non-nil means to return nil instead of signalling.
2032 Signal a cyclic-function-indirection error if there is a loop in the
2033 function chain of symbols. */)
2035 register Lisp_Object object
;
2036 Lisp_Object noerror
;
2040 /* Optimize for no indirection. */
2042 if (SYMBOLP (result
) && !EQ (result
, Qunbound
)
2043 && (result
= XSYMBOL (result
)->function
, SYMBOLP (result
)))
2044 result
= indirect_function (result
);
2045 if (!EQ (result
, Qunbound
))
2049 xsignal1 (Qvoid_function
, object
);
2054 /* Extract and set vector and string elements */
2056 DEFUN ("aref", Faref
, Saref
, 2, 2, 0,
2057 doc
: /* Return the element of ARRAY at index IDX.
2058 ARRAY may be a vector, a string, a char-table, a bool-vector,
2059 or a byte-code object. IDX starts at 0. */)
2061 register Lisp_Object array
;
2064 register int idxval
;
2067 idxval
= XINT (idx
);
2068 if (STRINGP (array
))
2072 if (idxval
< 0 || idxval
>= SCHARS (array
))
2073 args_out_of_range (array
, idx
);
2074 if (! STRING_MULTIBYTE (array
))
2075 return make_number ((unsigned char) SREF (array
, idxval
));
2076 idxval_byte
= string_char_to_byte (array
, idxval
);
2078 c
= STRING_CHAR (SDATA (array
) + idxval_byte
);
2079 return make_number (c
);
2081 else if (BOOL_VECTOR_P (array
))
2085 if (idxval
< 0 || idxval
>= XBOOL_VECTOR (array
)->size
)
2086 args_out_of_range (array
, idx
);
2088 val
= (unsigned char) XBOOL_VECTOR (array
)->data
[idxval
/ BOOL_VECTOR_BITS_PER_CHAR
];
2089 return (val
& (1 << (idxval
% BOOL_VECTOR_BITS_PER_CHAR
)) ? Qt
: Qnil
);
2091 else if (CHAR_TABLE_P (array
))
2093 CHECK_CHARACTER (idx
);
2094 return CHAR_TABLE_REF (array
, idxval
);
2099 if (VECTORP (array
))
2100 size
= XVECTOR (array
)->size
;
2101 else if (COMPILEDP (array
))
2102 size
= XVECTOR (array
)->size
& PSEUDOVECTOR_SIZE_MASK
;
2104 wrong_type_argument (Qarrayp
, array
);
2106 if (idxval
< 0 || idxval
>= size
)
2107 args_out_of_range (array
, idx
);
2108 return XVECTOR (array
)->contents
[idxval
];
2112 DEFUN ("aset", Faset
, Saset
, 3, 3, 0,
2113 doc
: /* Store into the element of ARRAY at index IDX the value NEWELT.
2114 Return NEWELT. ARRAY may be a vector, a string, a char-table or a
2115 bool-vector. IDX starts at 0. */)
2116 (array
, idx
, newelt
)
2117 register Lisp_Object array
;
2118 Lisp_Object idx
, newelt
;
2120 register int idxval
;
2123 idxval
= XINT (idx
);
2124 CHECK_ARRAY (array
, Qarrayp
);
2125 CHECK_IMPURE (array
);
2127 if (VECTORP (array
))
2129 if (idxval
< 0 || idxval
>= XVECTOR (array
)->size
)
2130 args_out_of_range (array
, idx
);
2131 XVECTOR (array
)->contents
[idxval
] = newelt
;
2133 else if (BOOL_VECTOR_P (array
))
2137 if (idxval
< 0 || idxval
>= XBOOL_VECTOR (array
)->size
)
2138 args_out_of_range (array
, idx
);
2140 val
= (unsigned char) XBOOL_VECTOR (array
)->data
[idxval
/ BOOL_VECTOR_BITS_PER_CHAR
];
2142 if (! NILP (newelt
))
2143 val
|= 1 << (idxval
% BOOL_VECTOR_BITS_PER_CHAR
);
2145 val
&= ~(1 << (idxval
% BOOL_VECTOR_BITS_PER_CHAR
));
2146 XBOOL_VECTOR (array
)->data
[idxval
/ BOOL_VECTOR_BITS_PER_CHAR
] = val
;
2148 else if (CHAR_TABLE_P (array
))
2150 CHECK_CHARACTER (idx
);
2151 CHAR_TABLE_SET (array
, idxval
, newelt
);
2153 else if (STRING_MULTIBYTE (array
))
2155 int idxval_byte
, prev_bytes
, new_bytes
, nbytes
;
2156 unsigned char workbuf
[MAX_MULTIBYTE_LENGTH
], *p0
= workbuf
, *p1
;
2158 if (idxval
< 0 || idxval
>= SCHARS (array
))
2159 args_out_of_range (array
, idx
);
2160 CHECK_CHARACTER (newelt
);
2162 nbytes
= SBYTES (array
);
2164 idxval_byte
= string_char_to_byte (array
, idxval
);
2165 p1
= SDATA (array
) + idxval_byte
;
2166 PARSE_MULTIBYTE_SEQ (p1
, nbytes
- idxval_byte
, prev_bytes
);
2167 new_bytes
= CHAR_STRING (XINT (newelt
), p0
);
2168 if (prev_bytes
!= new_bytes
)
2170 /* We must relocate the string data. */
2171 int nchars
= SCHARS (array
);
2175 SAFE_ALLOCA (str
, unsigned char *, nbytes
);
2176 bcopy (SDATA (array
), str
, nbytes
);
2177 allocate_string_data (XSTRING (array
), nchars
,
2178 nbytes
+ new_bytes
- prev_bytes
);
2179 bcopy (str
, SDATA (array
), idxval_byte
);
2180 p1
= SDATA (array
) + idxval_byte
;
2181 bcopy (str
+ idxval_byte
+ prev_bytes
, p1
+ new_bytes
,
2182 nbytes
- (idxval_byte
+ prev_bytes
));
2184 clear_string_char_byte_cache ();
2191 if (idxval
< 0 || idxval
>= SCHARS (array
))
2192 args_out_of_range (array
, idx
);
2193 CHECK_NUMBER (newelt
);
2195 if (XINT (newelt
) >= 0 && ! SINGLE_BYTE_CHAR_P (XINT (newelt
)))
2199 for (i
= SBYTES (array
) - 1; i
>= 0; i
--)
2200 if (SREF (array
, i
) >= 0x80)
2201 args_out_of_range (array
, newelt
);
2202 /* ARRAY is an ASCII string. Convert it to a multibyte
2203 string, and try `aset' again. */
2204 STRING_SET_MULTIBYTE (array
);
2205 return Faset (array
, idx
, newelt
);
2207 SSET (array
, idxval
, XINT (newelt
));
2213 /* Arithmetic functions */
2215 enum comparison
{ equal
, notequal
, less
, grtr
, less_or_equal
, grtr_or_equal
};
2218 arithcompare (num1
, num2
, comparison
)
2219 Lisp_Object num1
, num2
;
2220 enum comparison comparison
;
2222 double f1
= 0, f2
= 0;
2225 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num1
);
2226 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num2
);
2228 if (FLOATP (num1
) || FLOATP (num2
))
2231 f1
= (FLOATP (num1
)) ? XFLOAT_DATA (num1
) : XINT (num1
);
2232 f2
= (FLOATP (num2
)) ? XFLOAT_DATA (num2
) : XINT (num2
);
2238 if (floatp
? f1
== f2
: XINT (num1
) == XINT (num2
))
2243 if (floatp
? f1
!= f2
: XINT (num1
) != XINT (num2
))
2248 if (floatp
? f1
< f2
: XINT (num1
) < XINT (num2
))
2253 if (floatp
? f1
<= f2
: XINT (num1
) <= XINT (num2
))
2258 if (floatp
? f1
> f2
: XINT (num1
) > XINT (num2
))
2263 if (floatp
? f1
>= f2
: XINT (num1
) >= XINT (num2
))
2272 DEFUN ("=", Feqlsign
, Seqlsign
, 2, 2, 0,
2273 doc
: /* Return t if two args, both numbers or markers, are equal. */)
2275 register Lisp_Object num1
, num2
;
2277 return arithcompare (num1
, num2
, equal
);
2280 DEFUN ("<", Flss
, Slss
, 2, 2, 0,
2281 doc
: /* Return t if first arg is less than second arg. Both must be numbers or markers. */)
2283 register Lisp_Object num1
, num2
;
2285 return arithcompare (num1
, num2
, less
);
2288 DEFUN (">", Fgtr
, Sgtr
, 2, 2, 0,
2289 doc
: /* Return t if first arg is greater than second arg. Both must be numbers or markers. */)
2291 register Lisp_Object num1
, num2
;
2293 return arithcompare (num1
, num2
, grtr
);
2296 DEFUN ("<=", Fleq
, Sleq
, 2, 2, 0,
2297 doc
: /* Return t if first arg is less than or equal to second arg.
2298 Both must be numbers or markers. */)
2300 register Lisp_Object num1
, num2
;
2302 return arithcompare (num1
, num2
, less_or_equal
);
2305 DEFUN (">=", Fgeq
, Sgeq
, 2, 2, 0,
2306 doc
: /* Return t if first arg is greater than or equal to second arg.
2307 Both must be numbers or markers. */)
2309 register Lisp_Object num1
, num2
;
2311 return arithcompare (num1
, num2
, grtr_or_equal
);
2314 DEFUN ("/=", Fneq
, Sneq
, 2, 2, 0,
2315 doc
: /* Return t if first arg is not equal to second arg. Both must be numbers or markers. */)
2317 register Lisp_Object num1
, num2
;
2319 return arithcompare (num1
, num2
, notequal
);
2322 DEFUN ("zerop", Fzerop
, Szerop
, 1, 1, 0,
2323 doc
: /* Return t if NUMBER is zero. */)
2325 register Lisp_Object number
;
2327 CHECK_NUMBER_OR_FLOAT (number
);
2329 if (FLOATP (number
))
2331 if (XFLOAT_DATA (number
) == 0.0)
2341 /* Convert between long values and pairs of Lisp integers.
2342 Note that long_to_cons returns a single Lisp integer
2343 when the value fits in one. */
2349 unsigned long top
= i
>> 16;
2350 unsigned int bot
= i
& 0xFFFF;
2352 return make_number (bot
);
2353 if (top
== (unsigned long)-1 >> 16)
2354 return Fcons (make_number (-1), make_number (bot
));
2355 return Fcons (make_number (top
), make_number (bot
));
2362 Lisp_Object top
, bot
;
2369 return ((XINT (top
) << 16) | XINT (bot
));
2372 DEFUN ("number-to-string", Fnumber_to_string
, Snumber_to_string
, 1, 1, 0,
2373 doc
: /* Return the decimal representation of NUMBER as a string.
2374 Uses a minus sign if negative.
2375 NUMBER may be an integer or a floating point number. */)
2379 char buffer
[VALBITS
];
2381 CHECK_NUMBER_OR_FLOAT (number
);
2383 if (FLOATP (number
))
2385 char pigbuf
[350]; /* see comments in float_to_string */
2387 float_to_string (pigbuf
, XFLOAT_DATA (number
));
2388 return build_string (pigbuf
);
2391 if (sizeof (int) == sizeof (EMACS_INT
))
2392 sprintf (buffer
, "%d", (int) XINT (number
));
2393 else if (sizeof (long) == sizeof (EMACS_INT
))
2394 sprintf (buffer
, "%ld", (long) XINT (number
));
2397 return build_string (buffer
);
2401 digit_to_number (character
, base
)
2402 int character
, base
;
2406 if (character
>= '0' && character
<= '9')
2407 digit
= character
- '0';
2408 else if (character
>= 'a' && character
<= 'z')
2409 digit
= character
- 'a' + 10;
2410 else if (character
>= 'A' && character
<= 'Z')
2411 digit
= character
- 'A' + 10;
2421 DEFUN ("string-to-number", Fstring_to_number
, Sstring_to_number
, 1, 2, 0,
2422 doc
: /* Parse STRING as a decimal number and return the number.
2423 This parses both integers and floating point numbers.
2424 It ignores leading spaces and tabs, and all trailing chars.
2426 If BASE, interpret STRING as a number in that base. If BASE isn't
2427 present, base 10 is used. BASE must be between 2 and 16 (inclusive).
2428 If the base used is not 10, STRING is always parsed as integer. */)
2430 register Lisp_Object string
, base
;
2432 register unsigned char *p
;
2437 CHECK_STRING (string
);
2443 CHECK_NUMBER (base
);
2445 if (b
< 2 || b
> 16)
2446 xsignal1 (Qargs_out_of_range
, base
);
2449 /* Skip any whitespace at the front of the number. Some versions of
2450 atoi do this anyway, so we might as well make Emacs lisp consistent. */
2452 while (*p
== ' ' || *p
== '\t')
2463 if (isfloat_string (p
, 1) && b
== 10)
2464 val
= make_float (sign
* atof (p
));
2471 int digit
= digit_to_number (*p
++, b
);
2477 val
= make_fixnum_or_float (sign
* v
);
2497 static Lisp_Object float_arith_driver
P_ ((double, int, enum arithop
,
2498 int, Lisp_Object
*));
2499 extern Lisp_Object
fmod_float ();
2502 arith_driver (code
, nargs
, args
)
2505 register Lisp_Object
*args
;
2507 register Lisp_Object val
;
2508 register int argnum
;
2509 register EMACS_INT accum
= 0;
2510 register EMACS_INT next
;
2512 switch (SWITCH_ENUM_CAST (code
))
2530 for (argnum
= 0; argnum
< nargs
; argnum
++)
2532 /* Using args[argnum] as argument to CHECK_NUMBER_... */
2534 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val
);
2537 return float_arith_driver ((double) accum
, argnum
, code
,
2540 next
= XINT (args
[argnum
]);
2541 switch (SWITCH_ENUM_CAST (code
))
2547 accum
= argnum
? accum
- next
: nargs
== 1 ? - next
: next
;
2558 xsignal0 (Qarith_error
);
2572 if (!argnum
|| next
> accum
)
2576 if (!argnum
|| next
< accum
)
2582 XSETINT (val
, accum
);
2587 #define isnan(x) ((x) != (x))
2590 float_arith_driver (accum
, argnum
, code
, nargs
, args
)
2592 register int argnum
;
2595 register Lisp_Object
*args
;
2597 register Lisp_Object val
;
2600 for (; argnum
< nargs
; argnum
++)
2602 val
= args
[argnum
]; /* using args[argnum] as argument to CHECK_NUMBER_... */
2603 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val
);
2607 next
= XFLOAT_DATA (val
);
2611 args
[argnum
] = val
; /* runs into a compiler bug. */
2612 next
= XINT (args
[argnum
]);
2614 switch (SWITCH_ENUM_CAST (code
))
2620 accum
= argnum
? accum
- next
: nargs
== 1 ? - next
: next
;
2630 if (! IEEE_FLOATING_POINT
&& next
== 0)
2631 xsignal0 (Qarith_error
);
2638 return wrong_type_argument (Qinteger_or_marker_p
, val
);
2640 if (!argnum
|| isnan (next
) || next
> accum
)
2644 if (!argnum
|| isnan (next
) || next
< accum
)
2650 return make_float (accum
);
2654 DEFUN ("+", Fplus
, Splus
, 0, MANY
, 0,
2655 doc
: /* Return sum of any number of arguments, which are numbers or markers.
2656 usage: (+ &rest NUMBERS-OR-MARKERS) */)
2661 return arith_driver (Aadd
, nargs
, args
);
2664 DEFUN ("-", Fminus
, Sminus
, 0, MANY
, 0,
2665 doc
: /* Negate number or subtract numbers or markers and return the result.
2666 With one arg, negates it. With more than one arg,
2667 subtracts all but the first from the first.
2668 usage: (- &optional NUMBER-OR-MARKER &rest MORE-NUMBERS-OR-MARKERS) */)
2673 return arith_driver (Asub
, nargs
, args
);
2676 DEFUN ("*", Ftimes
, Stimes
, 0, MANY
, 0,
2677 doc
: /* Return product of any number of arguments, which are numbers or markers.
2678 usage: (* &rest NUMBERS-OR-MARKERS) */)
2683 return arith_driver (Amult
, nargs
, args
);
2686 DEFUN ("/", Fquo
, Squo
, 2, MANY
, 0,
2687 doc
: /* Return first argument divided by all the remaining arguments.
2688 The arguments must be numbers or markers.
2689 usage: (/ DIVIDEND DIVISOR &rest DIVISORS) */)
2695 for (argnum
= 2; argnum
< nargs
; argnum
++)
2696 if (FLOATP (args
[argnum
]))
2697 return float_arith_driver (0, 0, Adiv
, nargs
, args
);
2698 return arith_driver (Adiv
, nargs
, args
);
2701 DEFUN ("%", Frem
, Srem
, 2, 2, 0,
2702 doc
: /* Return remainder of X divided by Y.
2703 Both must be integers or markers. */)
2705 register Lisp_Object x
, y
;
2709 CHECK_NUMBER_COERCE_MARKER (x
);
2710 CHECK_NUMBER_COERCE_MARKER (y
);
2712 if (XFASTINT (y
) == 0)
2713 xsignal0 (Qarith_error
);
2715 XSETINT (val
, XINT (x
) % XINT (y
));
2729 /* If the magnitude of the result exceeds that of the divisor, or
2730 the sign of the result does not agree with that of the dividend,
2731 iterate with the reduced value. This does not yield a
2732 particularly accurate result, but at least it will be in the
2733 range promised by fmod. */
2735 r
-= f2
* floor (r
/ f2
);
2736 while (f2
<= (r
< 0 ? -r
: r
) || ((r
< 0) != (f1
< 0) && ! isnan (r
)));
2740 #endif /* ! HAVE_FMOD */
2742 DEFUN ("mod", Fmod
, Smod
, 2, 2, 0,
2743 doc
: /* Return X modulo Y.
2744 The result falls between zero (inclusive) and Y (exclusive).
2745 Both X and Y must be numbers or markers. */)
2747 register Lisp_Object x
, y
;
2752 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (x
);
2753 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (y
);
2755 if (FLOATP (x
) || FLOATP (y
))
2756 return fmod_float (x
, y
);
2762 xsignal0 (Qarith_error
);
2766 /* If the "remainder" comes out with the wrong sign, fix it. */
2767 if (i2
< 0 ? i1
> 0 : i1
< 0)
2774 DEFUN ("max", Fmax
, Smax
, 1, MANY
, 0,
2775 doc
: /* Return largest of all the arguments (which must be numbers or markers).
2776 The value is always a number; markers are converted to numbers.
2777 usage: (max NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */)
2782 return arith_driver (Amax
, nargs
, args
);
2785 DEFUN ("min", Fmin
, Smin
, 1, MANY
, 0,
2786 doc
: /* Return smallest of all the arguments (which must be numbers or markers).
2787 The value is always a number; markers are converted to numbers.
2788 usage: (min NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */)
2793 return arith_driver (Amin
, nargs
, args
);
2796 DEFUN ("logand", Flogand
, Slogand
, 0, MANY
, 0,
2797 doc
: /* Return bitwise-and of all the arguments.
2798 Arguments may be integers, or markers converted to integers.
2799 usage: (logand &rest INTS-OR-MARKERS) */)
2804 return arith_driver (Alogand
, nargs
, args
);
2807 DEFUN ("logior", Flogior
, Slogior
, 0, MANY
, 0,
2808 doc
: /* Return bitwise-or of all the arguments.
2809 Arguments may be integers, or markers converted to integers.
2810 usage: (logior &rest INTS-OR-MARKERS) */)
2815 return arith_driver (Alogior
, nargs
, args
);
2818 DEFUN ("logxor", Flogxor
, Slogxor
, 0, MANY
, 0,
2819 doc
: /* Return bitwise-exclusive-or of all the arguments.
2820 Arguments may be integers, or markers converted to integers.
2821 usage: (logxor &rest INTS-OR-MARKERS) */)
2826 return arith_driver (Alogxor
, nargs
, args
);
2829 DEFUN ("ash", Fash
, Sash
, 2, 2, 0,
2830 doc
: /* Return VALUE with its bits shifted left by COUNT.
2831 If COUNT is negative, shifting is actually to the right.
2832 In this case, the sign bit is duplicated. */)
2834 register Lisp_Object value
, count
;
2836 register Lisp_Object val
;
2838 CHECK_NUMBER (value
);
2839 CHECK_NUMBER (count
);
2841 if (XINT (count
) >= BITS_PER_EMACS_INT
)
2843 else if (XINT (count
) > 0)
2844 XSETINT (val
, XINT (value
) << XFASTINT (count
));
2845 else if (XINT (count
) <= -BITS_PER_EMACS_INT
)
2846 XSETINT (val
, XINT (value
) < 0 ? -1 : 0);
2848 XSETINT (val
, XINT (value
) >> -XINT (count
));
2852 DEFUN ("lsh", Flsh
, Slsh
, 2, 2, 0,
2853 doc
: /* Return VALUE with its bits shifted left by COUNT.
2854 If COUNT is negative, shifting is actually to the right.
2855 In this case, zeros are shifted in on the left. */)
2857 register Lisp_Object value
, count
;
2859 register Lisp_Object val
;
2861 CHECK_NUMBER (value
);
2862 CHECK_NUMBER (count
);
2864 if (XINT (count
) >= BITS_PER_EMACS_INT
)
2866 else if (XINT (count
) > 0)
2867 XSETINT (val
, (EMACS_UINT
) XUINT (value
) << XFASTINT (count
));
2868 else if (XINT (count
) <= -BITS_PER_EMACS_INT
)
2871 XSETINT (val
, (EMACS_UINT
) XUINT (value
) >> -XINT (count
));
2875 DEFUN ("1+", Fadd1
, Sadd1
, 1, 1, 0,
2876 doc
: /* Return NUMBER plus one. NUMBER may be a number or a marker.
2877 Markers are converted to integers. */)
2879 register Lisp_Object number
;
2881 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number
);
2883 if (FLOATP (number
))
2884 return (make_float (1.0 + XFLOAT_DATA (number
)));
2886 XSETINT (number
, XINT (number
) + 1);
2890 DEFUN ("1-", Fsub1
, Ssub1
, 1, 1, 0,
2891 doc
: /* Return NUMBER minus one. NUMBER may be a number or a marker.
2892 Markers are converted to integers. */)
2894 register Lisp_Object number
;
2896 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number
);
2898 if (FLOATP (number
))
2899 return (make_float (-1.0 + XFLOAT_DATA (number
)));
2901 XSETINT (number
, XINT (number
) - 1);
2905 DEFUN ("lognot", Flognot
, Slognot
, 1, 1, 0,
2906 doc
: /* Return the bitwise complement of NUMBER. NUMBER must be an integer. */)
2908 register Lisp_Object number
;
2910 CHECK_NUMBER (number
);
2911 XSETINT (number
, ~XINT (number
));
2915 DEFUN ("byteorder", Fbyteorder
, Sbyteorder
, 0, 0, 0,
2916 doc
: /* Return the byteorder for the machine.
2917 Returns 66 (ASCII uppercase B) for big endian machines or 108 (ASCII
2918 lowercase l) for small endian machines. */)
2921 unsigned i
= 0x04030201;
2922 int order
= *(char *)&i
== 1 ? 108 : 66;
2924 return make_number (order
);
2932 Lisp_Object error_tail
, arith_tail
;
2934 Qquote
= intern_c_string ("quote");
2935 Qlambda
= intern_c_string ("lambda");
2936 Qsubr
= intern_c_string ("subr");
2937 Qerror_conditions
= intern_c_string ("error-conditions");
2938 Qerror_message
= intern_c_string ("error-message");
2939 Qtop_level
= intern_c_string ("top-level");
2941 Qerror
= intern_c_string ("error");
2942 Qquit
= intern_c_string ("quit");
2943 Qwrong_type_argument
= intern_c_string ("wrong-type-argument");
2944 Qargs_out_of_range
= intern_c_string ("args-out-of-range");
2945 Qvoid_function
= intern_c_string ("void-function");
2946 Qcyclic_function_indirection
= intern_c_string ("cyclic-function-indirection");
2947 Qcyclic_variable_indirection
= intern_c_string ("cyclic-variable-indirection");
2948 Qvoid_variable
= intern_c_string ("void-variable");
2949 Qsetting_constant
= intern_c_string ("setting-constant");
2950 Qinvalid_read_syntax
= intern_c_string ("invalid-read-syntax");
2952 Qinvalid_function
= intern_c_string ("invalid-function");
2953 Qwrong_number_of_arguments
= intern_c_string ("wrong-number-of-arguments");
2954 Qno_catch
= intern_c_string ("no-catch");
2955 Qend_of_file
= intern_c_string ("end-of-file");
2956 Qarith_error
= intern_c_string ("arith-error");
2957 Qbeginning_of_buffer
= intern_c_string ("beginning-of-buffer");
2958 Qend_of_buffer
= intern_c_string ("end-of-buffer");
2959 Qbuffer_read_only
= intern_c_string ("buffer-read-only");
2960 Qtext_read_only
= intern_c_string ("text-read-only");
2961 Qmark_inactive
= intern_c_string ("mark-inactive");
2963 Qlistp
= intern_c_string ("listp");
2964 Qconsp
= intern_c_string ("consp");
2965 Qsymbolp
= intern_c_string ("symbolp");
2966 Qkeywordp
= intern_c_string ("keywordp");
2967 Qintegerp
= intern_c_string ("integerp");
2968 Qnatnump
= intern_c_string ("natnump");
2969 Qwholenump
= intern_c_string ("wholenump");
2970 Qstringp
= intern_c_string ("stringp");
2971 Qarrayp
= intern_c_string ("arrayp");
2972 Qsequencep
= intern_c_string ("sequencep");
2973 Qbufferp
= intern_c_string ("bufferp");
2974 Qvectorp
= intern_c_string ("vectorp");
2975 Qchar_or_string_p
= intern_c_string ("char-or-string-p");
2976 Qmarkerp
= intern_c_string ("markerp");
2977 Qbuffer_or_string_p
= intern_c_string ("buffer-or-string-p");
2978 Qinteger_or_marker_p
= intern_c_string ("integer-or-marker-p");
2979 Qboundp
= intern_c_string ("boundp");
2980 Qfboundp
= intern_c_string ("fboundp");
2982 Qfloatp
= intern_c_string ("floatp");
2983 Qnumberp
= intern_c_string ("numberp");
2984 Qnumber_or_marker_p
= intern_c_string ("number-or-marker-p");
2986 Qchar_table_p
= intern_c_string ("char-table-p");
2987 Qvector_or_char_table_p
= intern_c_string ("vector-or-char-table-p");
2989 Qsubrp
= intern_c_string ("subrp");
2990 Qunevalled
= intern_c_string ("unevalled");
2991 Qmany
= intern_c_string ("many");
2993 Qcdr
= intern_c_string ("cdr");
2995 /* Handle automatic advice activation */
2996 Qad_advice_info
= intern_c_string ("ad-advice-info");
2997 Qad_activate_internal
= intern_c_string ("ad-activate-internal");
2999 error_tail
= pure_cons (Qerror
, Qnil
);
3001 /* ERROR is used as a signaler for random errors for which nothing else is right */
3003 Fput (Qerror
, Qerror_conditions
,
3005 Fput (Qerror
, Qerror_message
,
3006 make_pure_c_string ("error"));
3008 Fput (Qquit
, Qerror_conditions
,
3009 pure_cons (Qquit
, Qnil
));
3010 Fput (Qquit
, Qerror_message
,
3011 make_pure_c_string ("Quit"));
3013 Fput (Qwrong_type_argument
, Qerror_conditions
,
3014 pure_cons (Qwrong_type_argument
, error_tail
));
3015 Fput (Qwrong_type_argument
, Qerror_message
,
3016 make_pure_c_string ("Wrong type argument"));
3018 Fput (Qargs_out_of_range
, Qerror_conditions
,
3019 pure_cons (Qargs_out_of_range
, error_tail
));
3020 Fput (Qargs_out_of_range
, Qerror_message
,
3021 make_pure_c_string ("Args out of range"));
3023 Fput (Qvoid_function
, Qerror_conditions
,
3024 pure_cons (Qvoid_function
, error_tail
));
3025 Fput (Qvoid_function
, Qerror_message
,
3026 make_pure_c_string ("Symbol's function definition is void"));
3028 Fput (Qcyclic_function_indirection
, Qerror_conditions
,
3029 pure_cons (Qcyclic_function_indirection
, error_tail
));
3030 Fput (Qcyclic_function_indirection
, Qerror_message
,
3031 make_pure_c_string ("Symbol's chain of function indirections contains a loop"));
3033 Fput (Qcyclic_variable_indirection
, Qerror_conditions
,
3034 pure_cons (Qcyclic_variable_indirection
, error_tail
));
3035 Fput (Qcyclic_variable_indirection
, Qerror_message
,
3036 make_pure_c_string ("Symbol's chain of variable indirections contains a loop"));
3038 Qcircular_list
= intern_c_string ("circular-list");
3039 staticpro (&Qcircular_list
);
3040 Fput (Qcircular_list
, Qerror_conditions
,
3041 pure_cons (Qcircular_list
, error_tail
));
3042 Fput (Qcircular_list
, Qerror_message
,
3043 make_pure_c_string ("List contains a loop"));
3045 Fput (Qvoid_variable
, Qerror_conditions
,
3046 pure_cons (Qvoid_variable
, error_tail
));
3047 Fput (Qvoid_variable
, Qerror_message
,
3048 make_pure_c_string ("Symbol's value as variable is void"));
3050 Fput (Qsetting_constant
, Qerror_conditions
,
3051 pure_cons (Qsetting_constant
, error_tail
));
3052 Fput (Qsetting_constant
, Qerror_message
,
3053 make_pure_c_string ("Attempt to set a constant symbol"));
3055 Fput (Qinvalid_read_syntax
, Qerror_conditions
,
3056 pure_cons (Qinvalid_read_syntax
, error_tail
));
3057 Fput (Qinvalid_read_syntax
, Qerror_message
,
3058 make_pure_c_string ("Invalid read syntax"));
3060 Fput (Qinvalid_function
, Qerror_conditions
,
3061 pure_cons (Qinvalid_function
, error_tail
));
3062 Fput (Qinvalid_function
, Qerror_message
,
3063 make_pure_c_string ("Invalid function"));
3065 Fput (Qwrong_number_of_arguments
, Qerror_conditions
,
3066 pure_cons (Qwrong_number_of_arguments
, error_tail
));
3067 Fput (Qwrong_number_of_arguments
, Qerror_message
,
3068 make_pure_c_string ("Wrong number of arguments"));
3070 Fput (Qno_catch
, Qerror_conditions
,
3071 pure_cons (Qno_catch
, error_tail
));
3072 Fput (Qno_catch
, Qerror_message
,
3073 make_pure_c_string ("No catch for tag"));
3075 Fput (Qend_of_file
, Qerror_conditions
,
3076 pure_cons (Qend_of_file
, error_tail
));
3077 Fput (Qend_of_file
, Qerror_message
,
3078 make_pure_c_string ("End of file during parsing"));
3080 arith_tail
= pure_cons (Qarith_error
, error_tail
);
3081 Fput (Qarith_error
, Qerror_conditions
,
3083 Fput (Qarith_error
, Qerror_message
,
3084 make_pure_c_string ("Arithmetic error"));
3086 Fput (Qbeginning_of_buffer
, Qerror_conditions
,
3087 pure_cons (Qbeginning_of_buffer
, error_tail
));
3088 Fput (Qbeginning_of_buffer
, Qerror_message
,
3089 make_pure_c_string ("Beginning of buffer"));
3091 Fput (Qend_of_buffer
, Qerror_conditions
,
3092 pure_cons (Qend_of_buffer
, error_tail
));
3093 Fput (Qend_of_buffer
, Qerror_message
,
3094 make_pure_c_string ("End of buffer"));
3096 Fput (Qbuffer_read_only
, Qerror_conditions
,
3097 pure_cons (Qbuffer_read_only
, error_tail
));
3098 Fput (Qbuffer_read_only
, Qerror_message
,
3099 make_pure_c_string ("Buffer is read-only"));
3101 Fput (Qtext_read_only
, Qerror_conditions
,
3102 pure_cons (Qtext_read_only
, error_tail
));
3103 Fput (Qtext_read_only
, Qerror_message
,
3104 make_pure_c_string ("Text is read-only"));
3106 Qrange_error
= intern_c_string ("range-error");
3107 Qdomain_error
= intern_c_string ("domain-error");
3108 Qsingularity_error
= intern_c_string ("singularity-error");
3109 Qoverflow_error
= intern_c_string ("overflow-error");
3110 Qunderflow_error
= intern_c_string ("underflow-error");
3112 Fput (Qdomain_error
, Qerror_conditions
,
3113 pure_cons (Qdomain_error
, arith_tail
));
3114 Fput (Qdomain_error
, Qerror_message
,
3115 make_pure_c_string ("Arithmetic domain error"));
3117 Fput (Qrange_error
, Qerror_conditions
,
3118 pure_cons (Qrange_error
, arith_tail
));
3119 Fput (Qrange_error
, Qerror_message
,
3120 make_pure_c_string ("Arithmetic range error"));
3122 Fput (Qsingularity_error
, Qerror_conditions
,
3123 pure_cons (Qsingularity_error
, Fcons (Qdomain_error
, arith_tail
)));
3124 Fput (Qsingularity_error
, Qerror_message
,
3125 make_pure_c_string ("Arithmetic singularity error"));
3127 Fput (Qoverflow_error
, Qerror_conditions
,
3128 pure_cons (Qoverflow_error
, Fcons (Qdomain_error
, arith_tail
)));
3129 Fput (Qoverflow_error
, Qerror_message
,
3130 make_pure_c_string ("Arithmetic overflow error"));
3132 Fput (Qunderflow_error
, Qerror_conditions
,
3133 pure_cons (Qunderflow_error
, Fcons (Qdomain_error
, arith_tail
)));
3134 Fput (Qunderflow_error
, Qerror_message
,
3135 make_pure_c_string ("Arithmetic underflow error"));
3137 staticpro (&Qrange_error
);
3138 staticpro (&Qdomain_error
);
3139 staticpro (&Qsingularity_error
);
3140 staticpro (&Qoverflow_error
);
3141 staticpro (&Qunderflow_error
);
3145 staticpro (&Qquote
);
3146 staticpro (&Qlambda
);
3148 staticpro (&Qunbound
);
3149 staticpro (&Qerror_conditions
);
3150 staticpro (&Qerror_message
);
3151 staticpro (&Qtop_level
);
3153 staticpro (&Qerror
);
3155 staticpro (&Qwrong_type_argument
);
3156 staticpro (&Qargs_out_of_range
);
3157 staticpro (&Qvoid_function
);
3158 staticpro (&Qcyclic_function_indirection
);
3159 staticpro (&Qcyclic_variable_indirection
);
3160 staticpro (&Qvoid_variable
);
3161 staticpro (&Qsetting_constant
);
3162 staticpro (&Qinvalid_read_syntax
);
3163 staticpro (&Qwrong_number_of_arguments
);
3164 staticpro (&Qinvalid_function
);
3165 staticpro (&Qno_catch
);
3166 staticpro (&Qend_of_file
);
3167 staticpro (&Qarith_error
);
3168 staticpro (&Qbeginning_of_buffer
);
3169 staticpro (&Qend_of_buffer
);
3170 staticpro (&Qbuffer_read_only
);
3171 staticpro (&Qtext_read_only
);
3172 staticpro (&Qmark_inactive
);
3174 staticpro (&Qlistp
);
3175 staticpro (&Qconsp
);
3176 staticpro (&Qsymbolp
);
3177 staticpro (&Qkeywordp
);
3178 staticpro (&Qintegerp
);
3179 staticpro (&Qnatnump
);
3180 staticpro (&Qwholenump
);
3181 staticpro (&Qstringp
);
3182 staticpro (&Qarrayp
);
3183 staticpro (&Qsequencep
);
3184 staticpro (&Qbufferp
);
3185 staticpro (&Qvectorp
);
3186 staticpro (&Qchar_or_string_p
);
3187 staticpro (&Qmarkerp
);
3188 staticpro (&Qbuffer_or_string_p
);
3189 staticpro (&Qinteger_or_marker_p
);
3190 staticpro (&Qfloatp
);
3191 staticpro (&Qnumberp
);
3192 staticpro (&Qnumber_or_marker_p
);
3193 staticpro (&Qchar_table_p
);
3194 staticpro (&Qvector_or_char_table_p
);
3195 staticpro (&Qsubrp
);
3197 staticpro (&Qunevalled
);
3199 staticpro (&Qboundp
);
3200 staticpro (&Qfboundp
);
3202 staticpro (&Qad_advice_info
);
3203 staticpro (&Qad_activate_internal
);
3205 /* Types that type-of returns. */
3206 Qinteger
= intern_c_string ("integer");
3207 Qsymbol
= intern_c_string ("symbol");
3208 Qstring
= intern_c_string ("string");
3209 Qcons
= intern_c_string ("cons");
3210 Qmarker
= intern_c_string ("marker");
3211 Qoverlay
= intern_c_string ("overlay");
3212 Qfloat
= intern_c_string ("float");
3213 Qwindow_configuration
= intern_c_string ("window-configuration");
3214 Qprocess
= intern_c_string ("process");
3215 Qwindow
= intern_c_string ("window");
3216 /* Qsubr = intern_c_string ("subr"); */
3217 Qcompiled_function
= intern_c_string ("compiled-function");
3218 Qbuffer
= intern_c_string ("buffer");
3219 Qframe
= intern_c_string ("frame");
3220 Qvector
= intern_c_string ("vector");
3221 Qchar_table
= intern_c_string ("char-table");
3222 Qbool_vector
= intern_c_string ("bool-vector");
3223 Qhash_table
= intern_c_string ("hash-table");
3225 Qthread_local_mark
= Fmake_symbol (make_pure_string ("thread-local-mark",
3228 DEFSYM (Qfont_spec
, "font-spec");
3229 DEFSYM (Qfont_entity
, "font-entity");
3230 DEFSYM (Qfont_object
, "font-object");
3232 DEFSYM (Qinteractive_form
, "interactive-form");
3234 staticpro (&Qinteger
);
3235 staticpro (&Qsymbol
);
3236 staticpro (&Qstring
);
3238 staticpro (&Qmarker
);
3239 staticpro (&Qoverlay
);
3240 staticpro (&Qfloat
);
3241 staticpro (&Qwindow_configuration
);
3242 staticpro (&Qprocess
);
3243 staticpro (&Qwindow
);
3244 /* staticpro (&Qsubr); */
3245 staticpro (&Qcompiled_function
);
3246 staticpro (&Qbuffer
);
3247 staticpro (&Qframe
);
3248 staticpro (&Qvector
);
3249 staticpro (&Qchar_table
);
3250 staticpro (&Qbool_vector
);
3251 staticpro (&Qhash_table
);
3252 staticpro (&Qthread_local_mark
);
3254 defsubr (&Sindirect_variable
);
3255 defsubr (&Sinteractive_form
);
3258 defsubr (&Stype_of
);
3263 defsubr (&Sintegerp
);
3264 defsubr (&Sinteger_or_marker_p
);
3265 defsubr (&Snumberp
);
3266 defsubr (&Snumber_or_marker_p
);
3268 defsubr (&Snatnump
);
3269 defsubr (&Ssymbolp
);
3270 defsubr (&Skeywordp
);
3271 defsubr (&Sstringp
);
3272 defsubr (&Smultibyte_string_p
);
3273 defsubr (&Svectorp
);
3274 defsubr (&Schar_table_p
);
3275 defsubr (&Svector_or_char_table_p
);
3276 defsubr (&Sbool_vector_p
);
3278 defsubr (&Ssequencep
);
3279 defsubr (&Sbufferp
);
3280 defsubr (&Smarkerp
);
3282 defsubr (&Sbyte_code_function_p
);
3283 defsubr (&Schar_or_string_p
);
3286 defsubr (&Scar_safe
);
3287 defsubr (&Scdr_safe
);
3290 defsubr (&Ssymbol_function
);
3291 defsubr (&Sindirect_function
);
3292 defsubr (&Ssymbol_plist
);
3293 defsubr (&Ssymbol_name
);
3294 defsubr (&Smakunbound
);
3295 defsubr (&Sfmakunbound
);
3297 defsubr (&Sfboundp
);
3299 defsubr (&Sdefalias
);
3300 defsubr (&Ssetplist
);
3301 defsubr (&Ssymbol_value
);
3303 defsubr (&Sdefault_boundp
);
3304 defsubr (&Sdefault_value
);
3305 defsubr (&Sset_default
);
3306 defsubr (&Ssetq_default
);
3307 defsubr (&Smake_variable_buffer_local
);
3308 defsubr (&Smake_local_variable
);
3309 defsubr (&Skill_local_variable
);
3310 defsubr (&Smake_variable_frame_local
);
3311 defsubr (&Slocal_variable_p
);
3312 defsubr (&Slocal_variable_if_set_p
);
3313 defsubr (&Svariable_binding_locus
);
3314 #if 0 /* XXX Remove this. --lorentey */
3315 defsubr (&Sterminal_local_value
);
3316 defsubr (&Sset_terminal_local_value
);
3320 defsubr (&Snumber_to_string
);
3321 defsubr (&Sstring_to_number
);
3322 defsubr (&Seqlsign
);
3345 defsubr (&Sbyteorder
);
3346 defsubr (&Ssubr_arity
);
3347 defsubr (&Ssubr_name
);
3349 XSYMBOL (Qwholenump
)->function
= XSYMBOL (Qnatnump
)->function
;
3351 DEFVAR_LISP ("most-positive-fixnum", &Vmost_positive_fixnum
,
3352 doc
: /* The largest value that is representable in a Lisp integer. */);
3353 Vmost_positive_fixnum
= make_number (MOST_POSITIVE_FIXNUM
);
3354 XSYMBOL (intern_c_string ("most-positive-fixnum"))->constant
= 1;
3356 DEFVAR_LISP ("most-negative-fixnum", &Vmost_negative_fixnum
,
3357 doc
: /* The smallest value that is representable in a Lisp integer. */);
3358 Vmost_negative_fixnum
= make_number (MOST_NEGATIVE_FIXNUM
);
3359 XSYMBOL (intern_c_string ("most-negative-fixnum"))->constant
= 1;
3366 sigsetmask (SIGEMPTYMASK
);
3368 SIGNAL_THREAD_CHECK (signo
);
3369 xsignal0 (Qarith_error
);
3375 /* Don't do this if just dumping out.
3376 We don't want to call `signal' in this case
3377 so that we don't have trouble with dumping
3378 signal-delivering routines in an inconsistent state. */
3382 #endif /* CANNOT_DUMP */
3383 signal (SIGFPE
, arith_error
);
3386 signal (SIGEMT
, arith_error
);
3390 /* arch-tag: 25879798-b84d-479a-9c89-7d148e2109f7
3391 (do not change this comment) */