merge from trunk
[emacs.git] / src / data.c
blobea72a3fc1819b6d9290585eeaa4ad6488c9ea2bf
1 /* Primitive operations on Lisp data types for GNU Emacs Lisp interpreter.
2 Copyright (C) 1985-1986, 1988, 1993-1995, 1997-2013 Free Software
3 Foundation, Inc.
5 This file is part of GNU Emacs.
7 GNU Emacs is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
21 #include <config.h>
22 #include <stdio.h>
24 #include <intprops.h>
26 #include "lisp.h"
27 #include "puresize.h"
28 #include "character.h"
29 #include "buffer.h"
30 #include "keyboard.h"
31 #include "frame.h"
32 #include "syssignal.h"
33 #include "termhooks.h" /* For FRAME_KBOARD reference in y-or-n-p. */
34 #include "font.h"
35 #include "keymap.h"
37 Lisp_Object Qnil, Qt, Qquote, Qlambda, Qunbound;
38 static Lisp_Object Qsubr;
39 Lisp_Object Qerror_conditions, Qerror_message, Qtop_level;
40 Lisp_Object Qerror, Quser_error, Qquit, Qargs_out_of_range;
41 static Lisp_Object Qwrong_type_argument;
42 Lisp_Object Qvoid_variable, Qvoid_function;
43 static Lisp_Object Qcyclic_function_indirection;
44 static Lisp_Object Qcyclic_variable_indirection;
45 Lisp_Object Qcircular_list;
46 static Lisp_Object Qsetting_constant;
47 Lisp_Object Qinvalid_read_syntax;
48 Lisp_Object Qinvalid_function, Qwrong_number_of_arguments, Qno_catch;
49 Lisp_Object Qend_of_file, Qarith_error, Qmark_inactive;
50 Lisp_Object Qbeginning_of_buffer, Qend_of_buffer, Qbuffer_read_only;
51 Lisp_Object Qtext_read_only;
53 Lisp_Object Qintegerp, Qwholenump, Qsymbolp, Qlistp, Qconsp;
54 static Lisp_Object Qnatnump;
55 Lisp_Object Qstringp, Qarrayp, Qsequencep, Qbufferp;
56 Lisp_Object Qchar_or_string_p, Qmarkerp, Qinteger_or_marker_p, Qvectorp;
57 Lisp_Object Qbuffer_or_string_p;
58 static Lisp_Object Qkeywordp, Qboundp;
59 Lisp_Object Qfboundp;
60 Lisp_Object Qchar_table_p, Qvector_or_char_table_p;
62 Lisp_Object Qcdr;
63 static Lisp_Object Qad_advice_info, Qad_activate_internal;
65 static Lisp_Object Qdomain_error, Qsingularity_error, Qunderflow_error;
66 Lisp_Object Qrange_error, Qoverflow_error;
68 Lisp_Object Qfloatp;
69 Lisp_Object Qnumberp, Qnumber_or_marker_p;
71 Lisp_Object Qinteger, Qsymbol;
72 static Lisp_Object Qcons, Qfloat, Qmisc, Qstring, Qvector;
73 Lisp_Object Qwindow;
74 static Lisp_Object Qoverlay, Qwindow_configuration;
75 static Lisp_Object Qprocess, Qmarker;
76 static Lisp_Object Qcompiled_function, Qframe;
77 Lisp_Object Qbuffer;
78 static Lisp_Object Qchar_table, Qbool_vector, Qhash_table;
79 static Lisp_Object Qsubrp;
80 static Lisp_Object Qmany, Qunevalled;
81 Lisp_Object Qfont_spec, Qfont_entity, Qfont_object;
82 static Lisp_Object Qdefun;
83 Lisp_Object Qthread, Qmutex, Qcondition_variable;
85 Lisp_Object Qinteractive_form;
86 static Lisp_Object Qdefalias_fset_function;
88 static void swap_in_symval_forwarding (struct Lisp_Symbol *, struct Lisp_Buffer_Local_Value *);
90 static bool
91 BOOLFWDP (union Lisp_Fwd *a)
93 return XFWDTYPE (a) == Lisp_Fwd_Bool;
95 static bool
96 INTFWDP (union Lisp_Fwd *a)
98 return XFWDTYPE (a) == Lisp_Fwd_Int;
100 static bool
101 KBOARD_OBJFWDP (union Lisp_Fwd *a)
103 return XFWDTYPE (a) == Lisp_Fwd_Kboard_Obj;
105 static bool
106 OBJFWDP (union Lisp_Fwd *a)
108 return XFWDTYPE (a) == Lisp_Fwd_Obj;
111 static struct Lisp_Boolfwd *
112 XBOOLFWD (union Lisp_Fwd *a)
114 eassert (BOOLFWDP (a));
115 return &a->u_boolfwd;
117 static struct Lisp_Kboard_Objfwd *
118 XKBOARD_OBJFWD (union Lisp_Fwd *a)
120 eassert (KBOARD_OBJFWDP (a));
121 return &a->u_kboard_objfwd;
123 static struct Lisp_Intfwd *
124 XINTFWD (union Lisp_Fwd *a)
126 eassert (INTFWDP (a));
127 return &a->u_intfwd;
129 static struct Lisp_Objfwd *
130 XOBJFWD (union Lisp_Fwd *a)
132 eassert (OBJFWDP (a));
133 return &a->u_objfwd;
136 static void
137 CHECK_SUBR (Lisp_Object x)
139 CHECK_TYPE (SUBRP (x), Qsubrp, x);
142 static void
143 set_blv_found (struct Lisp_Buffer_Local_Value *blv, int found)
145 eassert (found == !EQ (blv->defcell, blv->valcell));
146 blv->found = found;
149 static Lisp_Object
150 blv_value (struct Lisp_Buffer_Local_Value *blv)
152 return XCDR (blv->valcell);
155 static void
156 set_blv_value (struct Lisp_Buffer_Local_Value *blv, Lisp_Object val)
158 XSETCDR (blv->valcell, val);
161 static void
162 set_blv_where (struct Lisp_Buffer_Local_Value *blv, Lisp_Object val)
164 blv->where = val;
167 static void
168 set_blv_defcell (struct Lisp_Buffer_Local_Value *blv, Lisp_Object val)
170 blv->defcell = val;
173 static void
174 set_blv_valcell (struct Lisp_Buffer_Local_Value *blv, Lisp_Object val)
176 blv->valcell = val;
179 Lisp_Object
180 wrong_type_argument (register Lisp_Object predicate, register Lisp_Object value)
182 /* If VALUE is not even a valid Lisp object, we'd want to abort here
183 where we can get a backtrace showing where it came from. We used
184 to try and do that by checking the tagbits, but nowadays all
185 tagbits are potentially valid. */
186 /* if ((unsigned int) XTYPE (value) >= Lisp_Type_Limit)
187 * emacs_abort (); */
189 xsignal2 (Qwrong_type_argument, predicate, value);
192 void
193 pure_write_error (Lisp_Object obj)
195 xsignal2 (Qerror, build_string ("Attempt to modify read-only object"), obj);
198 void
199 args_out_of_range (Lisp_Object a1, Lisp_Object a2)
201 xsignal2 (Qargs_out_of_range, a1, a2);
204 void
205 args_out_of_range_3 (Lisp_Object a1, Lisp_Object a2, Lisp_Object a3)
207 xsignal3 (Qargs_out_of_range, a1, a2, a3);
211 /* Data type predicates. */
213 DEFUN ("eq", Feq, Seq, 2, 2, 0,
214 doc: /* Return t if the two args are the same Lisp object. */)
215 (Lisp_Object obj1, Lisp_Object obj2)
217 if (EQ (obj1, obj2))
218 return Qt;
219 return Qnil;
222 DEFUN ("null", Fnull, Snull, 1, 1, 0,
223 doc: /* Return t if OBJECT is nil. */)
224 (Lisp_Object object)
226 if (NILP (object))
227 return Qt;
228 return Qnil;
231 DEFUN ("type-of", Ftype_of, Stype_of, 1, 1, 0,
232 doc: /* Return a symbol representing the type of OBJECT.
233 The symbol returned names the object's basic type;
234 for example, (type-of 1) returns `integer'. */)
235 (Lisp_Object object)
237 switch (XTYPE (object))
239 case_Lisp_Int:
240 return Qinteger;
242 case Lisp_Symbol:
243 return Qsymbol;
245 case Lisp_String:
246 return Qstring;
248 case Lisp_Cons:
249 return Qcons;
251 case Lisp_Misc:
252 switch (XMISCTYPE (object))
254 case Lisp_Misc_Marker:
255 return Qmarker;
256 case Lisp_Misc_Overlay:
257 return Qoverlay;
258 case Lisp_Misc_Float:
259 return Qfloat;
261 emacs_abort ();
263 case Lisp_Vectorlike:
264 if (WINDOW_CONFIGURATIONP (object))
265 return Qwindow_configuration;
266 if (PROCESSP (object))
267 return Qprocess;
268 if (WINDOWP (object))
269 return Qwindow;
270 if (SUBRP (object))
271 return Qsubr;
272 if (COMPILEDP (object))
273 return Qcompiled_function;
274 if (BUFFERP (object))
275 return Qbuffer;
276 if (CHAR_TABLE_P (object))
277 return Qchar_table;
278 if (BOOL_VECTOR_P (object))
279 return Qbool_vector;
280 if (FRAMEP (object))
281 return Qframe;
282 if (HASH_TABLE_P (object))
283 return Qhash_table;
284 if (FONT_SPEC_P (object))
285 return Qfont_spec;
286 if (FONT_ENTITY_P (object))
287 return Qfont_entity;
288 if (FONT_OBJECT_P (object))
289 return Qfont_object;
290 if (THREADP (object))
291 return Qthread;
292 if (MUTEXP (object))
293 return Qmutex;
294 if (CONDVARP (object))
295 return Qcondition_variable;
296 return Qvector;
298 case Lisp_Float:
299 return Qfloat;
301 default:
302 emacs_abort ();
306 DEFUN ("consp", Fconsp, Sconsp, 1, 1, 0,
307 doc: /* Return t if OBJECT is a cons cell. */)
308 (Lisp_Object object)
310 if (CONSP (object))
311 return Qt;
312 return Qnil;
315 DEFUN ("atom", Fatom, Satom, 1, 1, 0,
316 doc: /* Return t if OBJECT is not a cons cell. This includes nil. */)
317 (Lisp_Object object)
319 if (CONSP (object))
320 return Qnil;
321 return Qt;
324 DEFUN ("listp", Flistp, Slistp, 1, 1, 0,
325 doc: /* Return t if OBJECT is a list, that is, a cons cell or nil.
326 Otherwise, return nil. */)
327 (Lisp_Object object)
329 if (CONSP (object) || NILP (object))
330 return Qt;
331 return Qnil;
334 DEFUN ("nlistp", Fnlistp, Snlistp, 1, 1, 0,
335 doc: /* Return t if OBJECT is not a list. Lists include nil. */)
336 (Lisp_Object object)
338 if (CONSP (object) || NILP (object))
339 return Qnil;
340 return Qt;
343 DEFUN ("symbolp", Fsymbolp, Ssymbolp, 1, 1, 0,
344 doc: /* Return t if OBJECT is a symbol. */)
345 (Lisp_Object object)
347 if (SYMBOLP (object))
348 return Qt;
349 return Qnil;
352 /* Define this in C to avoid unnecessarily consing up the symbol
353 name. */
354 DEFUN ("keywordp", Fkeywordp, Skeywordp, 1, 1, 0,
355 doc: /* Return t if OBJECT is a keyword.
356 This means that it is a symbol with a print name beginning with `:'
357 interned in the initial obarray. */)
358 (Lisp_Object object)
360 if (SYMBOLP (object)
361 && SREF (SYMBOL_NAME (object), 0) == ':'
362 && SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P (object))
363 return Qt;
364 return Qnil;
367 DEFUN ("vectorp", Fvectorp, Svectorp, 1, 1, 0,
368 doc: /* Return t if OBJECT is a vector. */)
369 (Lisp_Object object)
371 if (VECTORP (object))
372 return Qt;
373 return Qnil;
376 DEFUN ("stringp", Fstringp, Sstringp, 1, 1, 0,
377 doc: /* Return t if OBJECT is a string. */)
378 (Lisp_Object object)
380 if (STRINGP (object))
381 return Qt;
382 return Qnil;
385 DEFUN ("multibyte-string-p", Fmultibyte_string_p, Smultibyte_string_p,
386 1, 1, 0,
387 doc: /* Return t if OBJECT is a multibyte string.
388 Return nil if OBJECT is either a unibyte string, or not a string. */)
389 (Lisp_Object object)
391 if (STRINGP (object) && STRING_MULTIBYTE (object))
392 return Qt;
393 return Qnil;
396 DEFUN ("char-table-p", Fchar_table_p, Schar_table_p, 1, 1, 0,
397 doc: /* Return t if OBJECT is a char-table. */)
398 (Lisp_Object object)
400 if (CHAR_TABLE_P (object))
401 return Qt;
402 return Qnil;
405 DEFUN ("vector-or-char-table-p", Fvector_or_char_table_p,
406 Svector_or_char_table_p, 1, 1, 0,
407 doc: /* Return t if OBJECT is a char-table or vector. */)
408 (Lisp_Object object)
410 if (VECTORP (object) || CHAR_TABLE_P (object))
411 return Qt;
412 return Qnil;
415 DEFUN ("bool-vector-p", Fbool_vector_p, Sbool_vector_p, 1, 1, 0,
416 doc: /* Return t if OBJECT is a bool-vector. */)
417 (Lisp_Object object)
419 if (BOOL_VECTOR_P (object))
420 return Qt;
421 return Qnil;
424 DEFUN ("arrayp", Farrayp, Sarrayp, 1, 1, 0,
425 doc: /* Return t if OBJECT is an array (string or vector). */)
426 (Lisp_Object object)
428 if (ARRAYP (object))
429 return Qt;
430 return Qnil;
433 DEFUN ("sequencep", Fsequencep, Ssequencep, 1, 1, 0,
434 doc: /* Return t if OBJECT is a sequence (list or array). */)
435 (register Lisp_Object object)
437 if (CONSP (object) || NILP (object) || ARRAYP (object))
438 return Qt;
439 return Qnil;
442 DEFUN ("bufferp", Fbufferp, Sbufferp, 1, 1, 0,
443 doc: /* Return t if OBJECT is an editor buffer. */)
444 (Lisp_Object object)
446 if (BUFFERP (object))
447 return Qt;
448 return Qnil;
451 DEFUN ("markerp", Fmarkerp, Smarkerp, 1, 1, 0,
452 doc: /* Return t if OBJECT is a marker (editor pointer). */)
453 (Lisp_Object object)
455 if (MARKERP (object))
456 return Qt;
457 return Qnil;
460 DEFUN ("subrp", Fsubrp, Ssubrp, 1, 1, 0,
461 doc: /* Return t if OBJECT is a built-in function. */)
462 (Lisp_Object object)
464 if (SUBRP (object))
465 return Qt;
466 return Qnil;
469 DEFUN ("byte-code-function-p", Fbyte_code_function_p, Sbyte_code_function_p,
470 1, 1, 0,
471 doc: /* Return t if OBJECT is a byte-compiled function object. */)
472 (Lisp_Object object)
474 if (COMPILEDP (object))
475 return Qt;
476 return Qnil;
479 DEFUN ("char-or-string-p", Fchar_or_string_p, Schar_or_string_p, 1, 1, 0,
480 doc: /* Return t if OBJECT is a character or a string. */)
481 (register Lisp_Object object)
483 if (CHARACTERP (object) || STRINGP (object))
484 return Qt;
485 return Qnil;
488 DEFUN ("integerp", Fintegerp, Sintegerp, 1, 1, 0,
489 doc: /* Return t if OBJECT is an integer. */)
490 (Lisp_Object object)
492 if (INTEGERP (object))
493 return Qt;
494 return Qnil;
497 DEFUN ("integer-or-marker-p", Finteger_or_marker_p, Sinteger_or_marker_p, 1, 1, 0,
498 doc: /* Return t if OBJECT is an integer or a marker (editor pointer). */)
499 (register Lisp_Object object)
501 if (MARKERP (object) || INTEGERP (object))
502 return Qt;
503 return Qnil;
506 DEFUN ("natnump", Fnatnump, Snatnump, 1, 1, 0,
507 doc: /* Return t if OBJECT is a nonnegative integer. */)
508 (Lisp_Object object)
510 if (NATNUMP (object))
511 return Qt;
512 return Qnil;
515 DEFUN ("numberp", Fnumberp, Snumberp, 1, 1, 0,
516 doc: /* Return t if OBJECT is a number (floating point or integer). */)
517 (Lisp_Object object)
519 if (NUMBERP (object))
520 return Qt;
521 else
522 return Qnil;
525 DEFUN ("number-or-marker-p", Fnumber_or_marker_p,
526 Snumber_or_marker_p, 1, 1, 0,
527 doc: /* Return t if OBJECT is a number or a marker. */)
528 (Lisp_Object object)
530 if (NUMBERP (object) || MARKERP (object))
531 return Qt;
532 return Qnil;
535 DEFUN ("floatp", Ffloatp, Sfloatp, 1, 1, 0,
536 doc: /* Return t if OBJECT is a floating point number. */)
537 (Lisp_Object object)
539 if (FLOATP (object))
540 return Qt;
541 return Qnil;
544 DEFUN ("threadp", Fthreadp, Sthreadp, 1, 1, 0,
545 doc: /* Return t if OBJECT is a thread. */)
546 (Lisp_Object object)
548 if (THREADP (object))
549 return Qt;
550 else
551 return Qnil;
554 DEFUN ("mutexp", Fmutexp, Smutexp, 1, 1, 0,
555 doc: /* Return t if OBJECT is a mutex. */)
556 (Lisp_Object object)
558 if (MUTEXP (object))
559 return Qt;
560 else
561 return Qnil;
564 DEFUN ("condition-variable-p", Fcondition_variable_p, Scondition_variable_p,
565 1, 1, 0,
566 doc: /* Return t if OBJECT is a condition variable. */)
567 (Lisp_Object object)
569 if (CONDVARP (object))
570 return Qt;
571 else
572 return Qnil;
575 /* Extract and set components of lists. */
577 DEFUN ("car", Fcar, Scar, 1, 1, 0,
578 doc: /* Return the car of LIST. If arg is nil, return nil.
579 Error if arg is not nil and not a cons cell. See also `car-safe'.
581 See Info node `(elisp)Cons Cells' for a discussion of related basic
582 Lisp concepts such as car, cdr, cons cell and list. */)
583 (register Lisp_Object list)
585 return CAR (list);
588 DEFUN ("car-safe", Fcar_safe, Scar_safe, 1, 1, 0,
589 doc: /* Return the car of OBJECT if it is a cons cell, or else nil. */)
590 (Lisp_Object object)
592 return CAR_SAFE (object);
595 DEFUN ("cdr", Fcdr, Scdr, 1, 1, 0,
596 doc: /* Return the cdr of LIST. If arg is nil, return nil.
597 Error if arg is not nil and not a cons cell. See also `cdr-safe'.
599 See Info node `(elisp)Cons Cells' for a discussion of related basic
600 Lisp concepts such as cdr, car, cons cell and list. */)
601 (register Lisp_Object list)
603 return CDR (list);
606 DEFUN ("cdr-safe", Fcdr_safe, Scdr_safe, 1, 1, 0,
607 doc: /* Return the cdr of OBJECT if it is a cons cell, or else nil. */)
608 (Lisp_Object object)
610 return CDR_SAFE (object);
613 DEFUN ("setcar", Fsetcar, Ssetcar, 2, 2, 0,
614 doc: /* Set the car of CELL to be NEWCAR. Returns NEWCAR. */)
615 (register Lisp_Object cell, Lisp_Object newcar)
617 CHECK_CONS (cell);
618 CHECK_IMPURE (cell);
619 XSETCAR (cell, newcar);
620 return newcar;
623 DEFUN ("setcdr", Fsetcdr, Ssetcdr, 2, 2, 0,
624 doc: /* Set the cdr of CELL to be NEWCDR. Returns NEWCDR. */)
625 (register Lisp_Object cell, Lisp_Object newcdr)
627 CHECK_CONS (cell);
628 CHECK_IMPURE (cell);
629 XSETCDR (cell, newcdr);
630 return newcdr;
633 /* Extract and set components of symbols. */
635 DEFUN ("boundp", Fboundp, Sboundp, 1, 1, 0,
636 doc: /* Return t if SYMBOL's value is not void.
637 Note that if `lexical-binding' is in effect, this refers to the
638 global value outside of any lexical scope. */)
639 (register Lisp_Object symbol)
641 Lisp_Object valcontents;
642 struct Lisp_Symbol *sym;
643 CHECK_SYMBOL (symbol);
644 sym = XSYMBOL (symbol);
646 start:
647 switch (sym->redirect)
649 case SYMBOL_PLAINVAL: valcontents = SYMBOL_VAL (sym); break;
650 case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start;
651 case SYMBOL_LOCALIZED:
653 struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (sym);
654 if (blv->fwd)
655 /* In set_internal, we un-forward vars when their value is
656 set to Qunbound. */
657 return Qt;
658 else
660 swap_in_symval_forwarding (sym, blv);
661 valcontents = blv_value (blv);
663 break;
665 case SYMBOL_FORWARDED:
666 /* In set_internal, we un-forward vars when their value is
667 set to Qunbound. */
668 return Qt;
669 default: emacs_abort ();
672 return (EQ (valcontents, Qunbound) ? Qnil : Qt);
675 /* FIXME: Make it an alias for function-symbol! */
676 DEFUN ("fboundp", Ffboundp, Sfboundp, 1, 1, 0,
677 doc: /* Return t if SYMBOL's function definition is not void. */)
678 (register Lisp_Object symbol)
680 CHECK_SYMBOL (symbol);
681 return NILP (XSYMBOL (symbol)->function) ? Qnil : Qt;
684 DEFUN ("makunbound", Fmakunbound, Smakunbound, 1, 1, 0,
685 doc: /* Make SYMBOL's value be void.
686 Return SYMBOL. */)
687 (register Lisp_Object symbol)
689 CHECK_SYMBOL (symbol);
690 if (SYMBOL_CONSTANT_P (symbol))
691 xsignal1 (Qsetting_constant, symbol);
692 Fset (symbol, Qunbound);
693 return symbol;
696 DEFUN ("fmakunbound", Ffmakunbound, Sfmakunbound, 1, 1, 0,
697 doc: /* Make SYMBOL's function definition be nil.
698 Return SYMBOL. */)
699 (register Lisp_Object symbol)
701 CHECK_SYMBOL (symbol);
702 if (NILP (symbol) || EQ (symbol, Qt))
703 xsignal1 (Qsetting_constant, symbol);
704 set_symbol_function (symbol, Qnil);
705 return symbol;
708 DEFUN ("symbol-function", Fsymbol_function, Ssymbol_function, 1, 1, 0,
709 doc: /* Return SYMBOL's function definition. Error if that is void. */)
710 (register Lisp_Object symbol)
712 CHECK_SYMBOL (symbol);
713 return XSYMBOL (symbol)->function;
716 DEFUN ("symbol-plist", Fsymbol_plist, Ssymbol_plist, 1, 1, 0,
717 doc: /* Return SYMBOL's property list. */)
718 (register Lisp_Object symbol)
720 CHECK_SYMBOL (symbol);
721 return XSYMBOL (symbol)->plist;
724 DEFUN ("symbol-name", Fsymbol_name, Ssymbol_name, 1, 1, 0,
725 doc: /* Return SYMBOL's name, a string. */)
726 (register Lisp_Object symbol)
728 register Lisp_Object name;
730 CHECK_SYMBOL (symbol);
731 name = SYMBOL_NAME (symbol);
732 return name;
735 DEFUN ("fset", Ffset, Sfset, 2, 2, 0,
736 doc: /* Set SYMBOL's function definition to DEFINITION, and return DEFINITION. */)
737 (register Lisp_Object symbol, Lisp_Object definition)
739 register Lisp_Object function;
740 CHECK_SYMBOL (symbol);
742 function = XSYMBOL (symbol)->function;
744 if (!NILP (Vautoload_queue) && !NILP (function))
745 Vautoload_queue = Fcons (Fcons (symbol, function), Vautoload_queue);
747 if (AUTOLOADP (function))
748 Fput (symbol, Qautoload, XCDR (function));
750 set_symbol_function (symbol, definition);
752 return definition;
755 DEFUN ("defalias", Fdefalias, Sdefalias, 2, 3, 0,
756 doc: /* Set SYMBOL's function definition to DEFINITION.
757 Associates the function with the current load file, if any.
758 The optional third argument DOCSTRING specifies the documentation string
759 for SYMBOL; if it is omitted or nil, SYMBOL uses the documentation string
760 determined by DEFINITION.
761 The return value is undefined. */)
762 (register Lisp_Object symbol, Lisp_Object definition, Lisp_Object docstring)
764 CHECK_SYMBOL (symbol);
765 if (!NILP (Vpurify_flag)
766 /* If `definition' is a keymap, immutable (and copying) is wrong. */
767 && !KEYMAPP (definition))
768 definition = Fpurecopy (definition);
771 bool autoload = AUTOLOADP (definition);
772 if (NILP (Vpurify_flag) || !autoload)
773 { /* Only add autoload entries after dumping, because the ones before are
774 not useful and else we get loads of them from the loaddefs.el. */
776 if (AUTOLOADP (XSYMBOL (symbol)->function))
777 /* Remember that the function was already an autoload. */
778 LOADHIST_ATTACH (Fcons (Qt, symbol));
779 LOADHIST_ATTACH (Fcons (autoload ? Qautoload : Qdefun, symbol));
783 { /* Handle automatic advice activation. */
784 Lisp_Object hook = Fget (symbol, Qdefalias_fset_function);
785 if (!NILP (hook))
786 call2 (hook, symbol, definition);
787 else
788 Ffset (symbol, definition);
791 if (!NILP (docstring))
792 Fput (symbol, Qfunction_documentation, docstring);
793 /* We used to return `definition', but now that `defun' and `defmacro' expand
794 to a call to `defalias', we return `symbol' for backward compatibility
795 (bug#11686). */
796 return symbol;
799 DEFUN ("setplist", Fsetplist, Ssetplist, 2, 2, 0,
800 doc: /* Set SYMBOL's property list to NEWPLIST, and return NEWPLIST. */)
801 (register Lisp_Object symbol, Lisp_Object newplist)
803 CHECK_SYMBOL (symbol);
804 set_symbol_plist (symbol, newplist);
805 return newplist;
808 DEFUN ("subr-arity", Fsubr_arity, Ssubr_arity, 1, 1, 0,
809 doc: /* Return minimum and maximum number of args allowed for SUBR.
810 SUBR must be a built-in function.
811 The returned value is a pair (MIN . MAX). MIN is the minimum number
812 of args. MAX is the maximum number or the symbol `many', for a
813 function with `&rest' args, or `unevalled' for a special form. */)
814 (Lisp_Object subr)
816 short minargs, maxargs;
817 CHECK_SUBR (subr);
818 minargs = XSUBR (subr)->min_args;
819 maxargs = XSUBR (subr)->max_args;
820 return Fcons (make_number (minargs),
821 maxargs == MANY ? Qmany
822 : maxargs == UNEVALLED ? Qunevalled
823 : make_number (maxargs));
826 DEFUN ("subr-name", Fsubr_name, Ssubr_name, 1, 1, 0,
827 doc: /* Return name of subroutine SUBR.
828 SUBR must be a built-in function. */)
829 (Lisp_Object subr)
831 const char *name;
832 CHECK_SUBR (subr);
833 name = XSUBR (subr)->symbol_name;
834 return build_string (name);
837 DEFUN ("interactive-form", Finteractive_form, Sinteractive_form, 1, 1, 0,
838 doc: /* Return the interactive form of CMD or nil if none.
839 If CMD is not a command, the return value is nil.
840 Value, if non-nil, is a list \(interactive SPEC). */)
841 (Lisp_Object cmd)
843 Lisp_Object fun = indirect_function (cmd); /* Check cycles. */
845 if (NILP (fun))
846 return Qnil;
848 /* Use an `interactive-form' property if present, analogous to the
849 function-documentation property. */
850 fun = cmd;
851 while (SYMBOLP (fun))
853 Lisp_Object tmp = Fget (fun, Qinteractive_form);
854 if (!NILP (tmp))
855 return tmp;
856 else
857 fun = Fsymbol_function (fun);
860 if (SUBRP (fun))
862 const char *spec = XSUBR (fun)->intspec;
863 if (spec)
864 return list2 (Qinteractive,
865 (*spec != '(') ? build_string (spec) :
866 Fcar (Fread_from_string (build_string (spec), Qnil, Qnil)));
868 else if (COMPILEDP (fun))
870 if ((ASIZE (fun) & PSEUDOVECTOR_SIZE_MASK) > COMPILED_INTERACTIVE)
871 return list2 (Qinteractive, AREF (fun, COMPILED_INTERACTIVE));
873 else if (AUTOLOADP (fun))
874 return Finteractive_form (Fautoload_do_load (fun, cmd, Qnil));
875 else if (CONSP (fun))
877 Lisp_Object funcar = XCAR (fun);
878 if (EQ (funcar, Qclosure))
879 return Fassq (Qinteractive, Fcdr (Fcdr (XCDR (fun))));
880 else if (EQ (funcar, Qlambda))
881 return Fassq (Qinteractive, Fcdr (XCDR (fun)));
883 return Qnil;
887 /***********************************************************************
888 Getting and Setting Values of Symbols
889 ***********************************************************************/
891 /* Return the symbol holding SYMBOL's value. Signal
892 `cyclic-variable-indirection' if SYMBOL's chain of variable
893 indirections contains a loop. */
895 struct Lisp_Symbol *
896 indirect_variable (struct Lisp_Symbol *symbol)
898 struct Lisp_Symbol *tortoise, *hare;
900 hare = tortoise = symbol;
902 while (hare->redirect == SYMBOL_VARALIAS)
904 hare = SYMBOL_ALIAS (hare);
905 if (hare->redirect != SYMBOL_VARALIAS)
906 break;
908 hare = SYMBOL_ALIAS (hare);
909 tortoise = SYMBOL_ALIAS (tortoise);
911 if (hare == tortoise)
913 Lisp_Object tem;
914 XSETSYMBOL (tem, symbol);
915 xsignal1 (Qcyclic_variable_indirection, tem);
919 return hare;
923 DEFUN ("indirect-variable", Findirect_variable, Sindirect_variable, 1, 1, 0,
924 doc: /* Return the variable at the end of OBJECT's variable chain.
925 If OBJECT is a symbol, follow its variable indirections (if any), and
926 return the variable at the end of the chain of aliases. See Info node
927 `(elisp)Variable Aliases'.
929 If OBJECT is not a symbol, just return it. If there is a loop in the
930 chain of aliases, signal a `cyclic-variable-indirection' error. */)
931 (Lisp_Object object)
933 if (SYMBOLP (object))
935 struct Lisp_Symbol *sym = indirect_variable (XSYMBOL (object));
936 XSETSYMBOL (object, sym);
938 return object;
942 /* Given the raw contents of a symbol value cell,
943 return the Lisp value of the symbol.
944 This does not handle buffer-local variables; use
945 swap_in_symval_forwarding for that. */
947 Lisp_Object
948 do_symval_forwarding (register union Lisp_Fwd *valcontents)
950 register Lisp_Object val;
951 switch (XFWDTYPE (valcontents))
953 case Lisp_Fwd_Int:
954 XSETINT (val, *XINTFWD (valcontents)->intvar);
955 return val;
957 case Lisp_Fwd_Bool:
958 return (*XBOOLFWD (valcontents)->boolvar ? Qt : Qnil);
960 case Lisp_Fwd_Obj:
961 return *XOBJFWD (valcontents)->objvar;
963 case Lisp_Fwd_Buffer_Obj:
964 return per_buffer_value (current_buffer,
965 XBUFFER_OBJFWD (valcontents)->offset);
967 case Lisp_Fwd_Kboard_Obj:
968 /* We used to simply use current_kboard here, but from Lisp
969 code, its value is often unexpected. It seems nicer to
970 allow constructions like this to work as intuitively expected:
972 (with-selected-frame frame
973 (define-key local-function-map "\eOP" [f1]))
975 On the other hand, this affects the semantics of
976 last-command and real-last-command, and people may rely on
977 that. I took a quick look at the Lisp codebase, and I
978 don't think anything will break. --lorentey */
979 return *(Lisp_Object *)(XKBOARD_OBJFWD (valcontents)->offset
980 + (char *)FRAME_KBOARD (SELECTED_FRAME ()));
981 default: emacs_abort ();
985 /* Store NEWVAL into SYMBOL, where VALCONTENTS is found in the value cell
986 of SYMBOL. If SYMBOL is buffer-local, VALCONTENTS should be the
987 buffer-independent contents of the value cell: forwarded just one
988 step past the buffer-localness.
990 BUF non-zero means set the value in buffer BUF instead of the
991 current buffer. This only plays a role for per-buffer variables. */
993 static void
994 store_symval_forwarding (union Lisp_Fwd *valcontents, register Lisp_Object newval, struct buffer *buf)
996 switch (XFWDTYPE (valcontents))
998 case Lisp_Fwd_Int:
999 CHECK_NUMBER (newval);
1000 *XINTFWD (valcontents)->intvar = XINT (newval);
1001 break;
1003 case Lisp_Fwd_Bool:
1004 *XBOOLFWD (valcontents)->boolvar = !NILP (newval);
1005 break;
1007 case Lisp_Fwd_Obj:
1008 *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
1013 and update them. */
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);
1021 Lisp_Object tail;
1023 if (idx <= 0)
1024 break;
1026 for (tail = Vbuffer_alist; CONSP (tail); tail = XCDR (tail))
1028 Lisp_Object lbuf;
1029 struct buffer *b;
1031 lbuf = Fcdr (XCAR (tail));
1032 if (!BUFFERP (lbuf)) continue;
1033 b = XBUFFER (lbuf);
1035 if (! PER_BUFFER_VALUE_P (b, idx))
1036 set_per_buffer_value (b, offset, newval);
1039 break;
1041 case Lisp_Fwd_Buffer_Obj:
1043 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1044 Lisp_Object predicate = XBUFFER_OBJFWD (valcontents)->predicate;
1046 if (!NILP (predicate) && !NILP (newval)
1047 && NILP (call1 (predicate, newval)))
1048 wrong_type_argument (predicate, newval);
1050 if (buf == NULL)
1051 buf = current_buffer;
1052 set_per_buffer_value (buf, offset, newval);
1054 break;
1056 case Lisp_Fwd_Kboard_Obj:
1058 char *base = (char *) FRAME_KBOARD (SELECTED_FRAME ());
1059 char *p = base + XKBOARD_OBJFWD (valcontents)->offset;
1060 *(Lisp_Object *) p = newval;
1062 break;
1064 default:
1065 emacs_abort (); /* goto def; */
1069 /* Set up SYMBOL to refer to its global binding. This makes it safe
1070 to alter the status of other bindings. BEWARE: this may be called
1071 during the mark phase of GC, where we assume that Lisp_Object slots
1072 of BLV are marked after this function has changed them. */
1074 void
1075 swap_in_global_binding (struct Lisp_Symbol *symbol)
1077 struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (symbol);
1079 /* Unload the previously loaded binding. */
1080 if (blv->fwd)
1081 set_blv_value (blv, do_symval_forwarding (blv->fwd));
1083 /* Select the global binding in the symbol. */
1084 set_blv_valcell (blv, blv->defcell);
1085 if (blv->fwd)
1086 store_symval_forwarding (blv->fwd, XCDR (blv->defcell), NULL);
1088 /* Indicate that the global binding is set up now. */
1089 set_blv_where (blv, Qnil);
1090 set_blv_found (blv, 0);
1093 /* Set up the buffer-local symbol SYMBOL for validity in the current buffer.
1094 VALCONTENTS is the contents of its value cell,
1095 which points to a struct Lisp_Buffer_Local_Value.
1097 Return the value forwarded one step past the buffer-local stage.
1098 This could be another forwarding pointer. */
1100 static void
1101 swap_in_symval_forwarding (struct Lisp_Symbol *symbol, struct Lisp_Buffer_Local_Value *blv)
1103 register Lisp_Object tem1;
1105 eassert (blv == SYMBOL_BLV (symbol));
1107 tem1 = blv->where;
1109 if (NILP (tem1)
1110 || (blv->frame_local
1111 ? !EQ (selected_frame, tem1)
1112 : current_buffer != XBUFFER (tem1)))
1115 /* Unload the previously loaded binding. */
1116 tem1 = blv->valcell;
1117 if (blv->fwd)
1118 set_blv_value (blv, do_symval_forwarding (blv->fwd));
1119 /* Choose the new binding. */
1121 Lisp_Object var;
1122 XSETSYMBOL (var, symbol);
1123 if (blv->frame_local)
1125 tem1 = assq_no_quit (var, XFRAME (selected_frame)->param_alist);
1126 set_blv_where (blv, selected_frame);
1128 else
1130 tem1 = assq_no_quit (var, BVAR (current_buffer, local_var_alist));
1131 set_blv_where (blv, Fcurrent_buffer ());
1134 if (!(blv->found = !NILP (tem1)))
1135 tem1 = blv->defcell;
1137 /* Load the new binding. */
1138 set_blv_valcell (blv, tem1);
1139 if (blv->fwd)
1140 store_symval_forwarding (blv->fwd, blv_value (blv), NULL);
1144 /* Find the value of a symbol, returning Qunbound if it's not bound.
1145 This is helpful for code which just wants to get a variable's value
1146 if it has one, without signaling an error.
1147 Note that it must not be possible to quit
1148 within this function. Great care is required for this. */
1150 Lisp_Object
1151 find_symbol_value (Lisp_Object symbol)
1153 struct Lisp_Symbol *sym;
1155 CHECK_SYMBOL (symbol);
1156 sym = XSYMBOL (symbol);
1158 start:
1159 switch (sym->redirect)
1161 case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start;
1162 case SYMBOL_PLAINVAL: return SYMBOL_VAL (sym);
1163 case SYMBOL_LOCALIZED:
1165 struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (sym);
1166 swap_in_symval_forwarding (sym, blv);
1167 return blv->fwd ? do_symval_forwarding (blv->fwd) : blv_value (blv);
1169 /* FALLTHROUGH */
1170 case SYMBOL_FORWARDED:
1171 return do_symval_forwarding (SYMBOL_FWD (sym));
1172 default: emacs_abort ();
1176 DEFUN ("symbol-value", Fsymbol_value, Ssymbol_value, 1, 1, 0,
1177 doc: /* Return SYMBOL's value. Error if that is void.
1178 Note that if `lexical-binding' is in effect, this returns the
1179 global value outside of any lexical scope. */)
1180 (Lisp_Object symbol)
1182 Lisp_Object val;
1184 val = find_symbol_value (symbol);
1185 if (!EQ (val, Qunbound))
1186 return val;
1188 xsignal1 (Qvoid_variable, symbol);
1191 DEFUN ("set", Fset, Sset, 2, 2, 0,
1192 doc: /* Set SYMBOL's value to NEWVAL, and return NEWVAL. */)
1193 (register Lisp_Object symbol, Lisp_Object newval)
1195 set_internal (symbol, newval, Qnil, 0);
1196 return newval;
1199 /* Store the value NEWVAL into SYMBOL.
1200 If buffer/frame-locality is an issue, WHERE specifies which context to use.
1201 (nil stands for the current buffer/frame).
1203 If BINDFLAG is false, then if this symbol is supposed to become
1204 local in every buffer where it is set, then we make it local.
1205 If BINDFLAG is true, we don't do that. */
1207 void
1208 set_internal (Lisp_Object symbol, Lisp_Object newval, Lisp_Object where,
1209 bool bindflag)
1211 bool voide = EQ (newval, Qunbound);
1212 struct Lisp_Symbol *sym;
1213 Lisp_Object tem1;
1215 /* If restoring in a dead buffer, do nothing. */
1216 /* if (BUFFERP (where) && NILP (XBUFFER (where)->name))
1217 return; */
1219 CHECK_SYMBOL (symbol);
1220 if (SYMBOL_CONSTANT_P (symbol))
1222 if (NILP (Fkeywordp (symbol))
1223 || !EQ (newval, Fsymbol_value (symbol)))
1224 xsignal1 (Qsetting_constant, symbol);
1225 else
1226 /* Allow setting keywords to their own value. */
1227 return;
1230 sym = XSYMBOL (symbol);
1232 start:
1233 switch (sym->redirect)
1235 case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start;
1236 case SYMBOL_PLAINVAL: SET_SYMBOL_VAL (sym , newval); return;
1237 case SYMBOL_LOCALIZED:
1239 struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (sym);
1240 if (NILP (where))
1242 if (blv->frame_local)
1243 where = selected_frame;
1244 else
1245 XSETBUFFER (where, current_buffer);
1247 /* If the current buffer is not the buffer whose binding is
1248 loaded, or if there may be frame-local bindings and the frame
1249 isn't the right one, or if it's a Lisp_Buffer_Local_Value and
1250 the default binding is loaded, the loaded binding may be the
1251 wrong one. */
1252 if (!EQ (blv->where, where)
1253 /* Also unload a global binding (if the var is local_if_set). */
1254 || (EQ (blv->valcell, blv->defcell)))
1256 /* The currently loaded binding is not necessarily valid.
1257 We need to unload it, and choose a new binding. */
1259 /* Write out `realvalue' to the old loaded binding. */
1260 if (blv->fwd)
1261 set_blv_value (blv, do_symval_forwarding (blv->fwd));
1263 /* Find the new binding. */
1264 XSETSYMBOL (symbol, sym); /* May have changed via aliasing. */
1265 tem1 = Fassq (symbol,
1266 (blv->frame_local
1267 ? XFRAME (where)->param_alist
1268 : BVAR (XBUFFER (where), local_var_alist)));
1269 set_blv_where (blv, where);
1270 blv->found = 1;
1272 if (NILP (tem1))
1274 /* This buffer still sees the default value. */
1276 /* If the variable is a Lisp_Some_Buffer_Local_Value,
1277 or if this is `let' rather than `set',
1278 make CURRENT-ALIST-ELEMENT point to itself,
1279 indicating that we're seeing the default value.
1280 Likewise if the variable has been let-bound
1281 in the current buffer. */
1282 if (bindflag || !blv->local_if_set
1283 || let_shadows_buffer_binding_p (sym))
1285 blv->found = 0;
1286 tem1 = blv->defcell;
1288 /* If it's a local_if_set, being set not bound,
1289 and we're not within a let that was made for this buffer,
1290 create a new buffer-local binding for the variable.
1291 That means, give this buffer a new assoc for a local value
1292 and load that binding. */
1293 else
1295 /* local_if_set is only supported for buffer-local
1296 bindings, not for frame-local bindings. */
1297 eassert (!blv->frame_local);
1298 tem1 = Fcons (symbol, XCDR (blv->defcell));
1299 bset_local_var_alist
1300 (XBUFFER (where),
1301 Fcons (tem1, BVAR (XBUFFER (where), local_var_alist)));
1305 /* Record which binding is now loaded. */
1306 set_blv_valcell (blv, tem1);
1309 /* Store the new value in the cons cell. */
1310 set_blv_value (blv, newval);
1312 if (blv->fwd)
1314 if (voide)
1315 /* If storing void (making the symbol void), forward only through
1316 buffer-local indicator, not through Lisp_Objfwd, etc. */
1317 blv->fwd = NULL;
1318 else
1319 store_symval_forwarding (blv->fwd, newval,
1320 BUFFERP (where)
1321 ? XBUFFER (where) : current_buffer);
1323 break;
1325 case SYMBOL_FORWARDED:
1327 struct buffer *buf
1328 = BUFFERP (where) ? XBUFFER (where) : current_buffer;
1329 union Lisp_Fwd *innercontents = SYMBOL_FWD (sym);
1330 if (BUFFER_OBJFWDP (innercontents))
1332 int offset = XBUFFER_OBJFWD (innercontents)->offset;
1333 int idx = PER_BUFFER_IDX (offset);
1334 if (idx > 0
1335 && !bindflag
1336 && !let_shadows_buffer_binding_p (sym))
1337 SET_PER_BUFFER_VALUE_P (buf, idx, 1);
1340 if (voide)
1341 { /* If storing void (making the symbol void), forward only through
1342 buffer-local indicator, not through Lisp_Objfwd, etc. */
1343 sym->redirect = SYMBOL_PLAINVAL;
1344 SET_SYMBOL_VAL (sym, newval);
1346 else
1347 store_symval_forwarding (/* sym, */ innercontents, newval, buf);
1348 break;
1350 default: emacs_abort ();
1352 return;
1355 /* Access or set a buffer-local symbol's default value. */
1357 /* Return the default value of SYMBOL, but don't check for voidness.
1358 Return Qunbound if it is void. */
1360 static Lisp_Object
1361 default_value (Lisp_Object symbol)
1363 struct Lisp_Symbol *sym;
1365 CHECK_SYMBOL (symbol);
1366 sym = XSYMBOL (symbol);
1368 start:
1369 switch (sym->redirect)
1371 case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start;
1372 case SYMBOL_PLAINVAL: return SYMBOL_VAL (sym);
1373 case SYMBOL_LOCALIZED:
1375 /* If var is set up for a buffer that lacks a local value for it,
1376 the current value is nominally the default value.
1377 But the `realvalue' slot may be more up to date, since
1378 ordinary setq stores just that slot. So use that. */
1379 struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (sym);
1380 if (blv->fwd && EQ (blv->valcell, blv->defcell))
1381 return do_symval_forwarding (blv->fwd);
1382 else
1383 return XCDR (blv->defcell);
1385 case SYMBOL_FORWARDED:
1387 union Lisp_Fwd *valcontents = SYMBOL_FWD (sym);
1389 /* For a built-in buffer-local variable, get the default value
1390 rather than letting do_symval_forwarding get the current value. */
1391 if (BUFFER_OBJFWDP (valcontents))
1393 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1394 if (PER_BUFFER_IDX (offset) != 0)
1395 return per_buffer_default (offset);
1398 /* For other variables, get the current value. */
1399 return do_symval_forwarding (valcontents);
1401 default: emacs_abort ();
1405 DEFUN ("default-boundp", Fdefault_boundp, Sdefault_boundp, 1, 1, 0,
1406 doc: /* Return t if SYMBOL has a non-void default value.
1407 This is the value that is seen in buffers that do not have their own values
1408 for this variable. */)
1409 (Lisp_Object symbol)
1411 register Lisp_Object value;
1413 value = default_value (symbol);
1414 return (EQ (value, Qunbound) ? Qnil : Qt);
1417 DEFUN ("default-value", Fdefault_value, Sdefault_value, 1, 1, 0,
1418 doc: /* Return SYMBOL's default value.
1419 This is the value that is seen in buffers that do not have their own values
1420 for this variable. The default value is meaningful for variables with
1421 local bindings in certain buffers. */)
1422 (Lisp_Object symbol)
1424 register Lisp_Object value;
1426 value = default_value (symbol);
1427 if (!EQ (value, Qunbound))
1428 return value;
1430 xsignal1 (Qvoid_variable, symbol);
1433 DEFUN ("set-default", Fset_default, Sset_default, 2, 2, 0,
1434 doc: /* Set SYMBOL's default value to VALUE. SYMBOL and VALUE are evaluated.
1435 The default value is seen in buffers that do not have their own values
1436 for this variable. */)
1437 (Lisp_Object symbol, Lisp_Object value)
1439 struct Lisp_Symbol *sym;
1441 CHECK_SYMBOL (symbol);
1442 if (SYMBOL_CONSTANT_P (symbol))
1444 if (NILP (Fkeywordp (symbol))
1445 || !EQ (value, Fdefault_value (symbol)))
1446 xsignal1 (Qsetting_constant, symbol);
1447 else
1448 /* Allow setting keywords to their own value. */
1449 return value;
1451 sym = XSYMBOL (symbol);
1453 start:
1454 switch (sym->redirect)
1456 case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start;
1457 case SYMBOL_PLAINVAL: return Fset (symbol, value);
1458 case SYMBOL_LOCALIZED:
1460 struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (sym);
1462 /* Store new value into the DEFAULT-VALUE slot. */
1463 XSETCDR (blv->defcell, value);
1465 /* If the default binding is now loaded, set the REALVALUE slot too. */
1466 if (blv->fwd && EQ (blv->defcell, blv->valcell))
1467 store_symval_forwarding (blv->fwd, value, NULL);
1468 return value;
1470 case SYMBOL_FORWARDED:
1472 union Lisp_Fwd *valcontents = SYMBOL_FWD (sym);
1474 /* Handle variables like case-fold-search that have special slots
1475 in the buffer.
1476 Make them work apparently like Lisp_Buffer_Local_Value variables. */
1477 if (BUFFER_OBJFWDP (valcontents))
1479 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1480 int idx = PER_BUFFER_IDX (offset);
1482 set_per_buffer_default (offset, value);
1484 /* If this variable is not always local in all buffers,
1485 set it in the buffers that don't nominally have a local value. */
1486 if (idx > 0)
1488 struct buffer *b;
1490 FOR_EACH_BUFFER (b)
1491 if (!PER_BUFFER_VALUE_P (b, idx))
1492 set_per_buffer_value (b, offset, value);
1494 return value;
1496 else
1497 return Fset (symbol, value);
1499 default: emacs_abort ();
1503 DEFUN ("setq-default", Fsetq_default, Ssetq_default, 0, UNEVALLED, 0,
1504 doc: /* Set the default value of variable VAR to VALUE.
1505 VAR, the variable name, is literal (not evaluated);
1506 VALUE is an expression: it is evaluated and its value returned.
1507 The default value of a variable is seen in buffers
1508 that do not have their own values for the variable.
1510 More generally, you can use multiple variables and values, as in
1511 (setq-default VAR VALUE VAR VALUE...)
1512 This sets each VAR's default value to the corresponding VALUE.
1513 The VALUE for the Nth VAR can refer to the new default values
1514 of previous VARs.
1515 usage: (setq-default [VAR VALUE]...) */)
1516 (Lisp_Object args)
1518 register Lisp_Object args_left;
1519 register Lisp_Object val, symbol;
1520 struct gcpro gcpro1;
1522 if (NILP (args))
1523 return Qnil;
1525 args_left = args;
1526 GCPRO1 (args);
1530 val = eval_sub (Fcar (Fcdr (args_left)));
1531 symbol = XCAR (args_left);
1532 Fset_default (symbol, val);
1533 args_left = Fcdr (XCDR (args_left));
1535 while (!NILP (args_left));
1537 UNGCPRO;
1538 return val;
1541 /* Lisp functions for creating and removing buffer-local variables. */
1543 union Lisp_Val_Fwd
1545 Lisp_Object value;
1546 union Lisp_Fwd *fwd;
1549 static struct Lisp_Buffer_Local_Value *
1550 make_blv (struct Lisp_Symbol *sym, bool forwarded,
1551 union Lisp_Val_Fwd valcontents)
1553 struct Lisp_Buffer_Local_Value *blv = xmalloc (sizeof *blv);
1554 Lisp_Object symbol;
1555 Lisp_Object tem;
1557 XSETSYMBOL (symbol, sym);
1558 tem = Fcons (symbol, (forwarded
1559 ? do_symval_forwarding (valcontents.fwd)
1560 : valcontents.value));
1562 /* Buffer_Local_Values cannot have as realval a buffer-local
1563 or keyboard-local forwarding. */
1564 eassert (!(forwarded && BUFFER_OBJFWDP (valcontents.fwd)));
1565 eassert (!(forwarded && KBOARD_OBJFWDP (valcontents.fwd)));
1566 blv->fwd = forwarded ? valcontents.fwd : NULL;
1567 set_blv_where (blv, Qnil);
1568 blv->frame_local = 0;
1569 blv->local_if_set = 0;
1570 set_blv_defcell (blv, tem);
1571 set_blv_valcell (blv, tem);
1572 set_blv_found (blv, 0);
1573 return blv;
1576 DEFUN ("make-variable-buffer-local", Fmake_variable_buffer_local,
1577 Smake_variable_buffer_local, 1, 1, "vMake Variable Buffer Local: ",
1578 doc: /* Make VARIABLE become buffer-local whenever it is set.
1579 At any time, the value for the current buffer is in effect,
1580 unless the variable has never been set in this buffer,
1581 in which case the default value is in effect.
1582 Note that binding the variable with `let', or setting it while
1583 a `let'-style binding made in this buffer is in effect,
1584 does not make the variable buffer-local. Return VARIABLE.
1586 In most cases it is better to use `make-local-variable',
1587 which makes a variable local in just one buffer.
1589 The function `default-value' gets the default value and `set-default' sets it. */)
1590 (register Lisp_Object variable)
1592 struct Lisp_Symbol *sym;
1593 struct Lisp_Buffer_Local_Value *blv = NULL;
1594 union Lisp_Val_Fwd valcontents IF_LINT (= {LISP_INITIALLY_ZERO});
1595 bool forwarded IF_LINT (= 0);
1597 CHECK_SYMBOL (variable);
1598 sym = XSYMBOL (variable);
1600 start:
1601 switch (sym->redirect)
1603 case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start;
1604 case SYMBOL_PLAINVAL:
1605 forwarded = 0; valcontents.value = SYMBOL_VAL (sym);
1606 if (EQ (valcontents.value, Qunbound))
1607 valcontents.value = Qnil;
1608 break;
1609 case SYMBOL_LOCALIZED:
1610 blv = SYMBOL_BLV (sym);
1611 if (blv->frame_local)
1612 error ("Symbol %s may not be buffer-local",
1613 SDATA (SYMBOL_NAME (variable)));
1614 break;
1615 case SYMBOL_FORWARDED:
1616 forwarded = 1; valcontents.fwd = SYMBOL_FWD (sym);
1617 if (KBOARD_OBJFWDP (valcontents.fwd))
1618 error ("Symbol %s may not be buffer-local",
1619 SDATA (SYMBOL_NAME (variable)));
1620 else if (BUFFER_OBJFWDP (valcontents.fwd))
1621 return variable;
1622 break;
1623 default: emacs_abort ();
1626 if (sym->constant)
1627 error ("Symbol %s may not be buffer-local", SDATA (SYMBOL_NAME (variable)));
1629 if (!blv)
1631 blv = make_blv (sym, forwarded, valcontents);
1632 sym->redirect = SYMBOL_LOCALIZED;
1633 SET_SYMBOL_BLV (sym, blv);
1635 Lisp_Object symbol;
1636 XSETSYMBOL (symbol, sym); /* In case `variable' is aliased. */
1637 if (let_shadows_global_binding_p (symbol))
1638 message ("Making %s buffer-local while let-bound!",
1639 SDATA (SYMBOL_NAME (variable)));
1643 blv->local_if_set = 1;
1644 return variable;
1647 DEFUN ("make-local-variable", Fmake_local_variable, Smake_local_variable,
1648 1, 1, "vMake Local Variable: ",
1649 doc: /* Make VARIABLE have a separate value in the current buffer.
1650 Other buffers will continue to share a common default value.
1651 \(The buffer-local value of VARIABLE starts out as the same value
1652 VARIABLE previously had. If VARIABLE was void, it remains void.\)
1653 Return VARIABLE.
1655 If the variable is already arranged to become local when set,
1656 this function causes a local value to exist for this buffer,
1657 just as setting the variable would do.
1659 This function returns VARIABLE, and therefore
1660 (set (make-local-variable 'VARIABLE) VALUE-EXP)
1661 works.
1663 See also `make-variable-buffer-local'.
1665 Do not use `make-local-variable' to make a hook variable buffer-local.
1666 Instead, use `add-hook' and specify t for the LOCAL argument. */)
1667 (Lisp_Object variable)
1669 Lisp_Object tem;
1670 bool forwarded IF_LINT (= 0);
1671 union Lisp_Val_Fwd valcontents IF_LINT (= {LISP_INITIALLY_ZERO});
1672 struct Lisp_Symbol *sym;
1673 struct Lisp_Buffer_Local_Value *blv = NULL;
1675 CHECK_SYMBOL (variable);
1676 sym = XSYMBOL (variable);
1678 start:
1679 switch (sym->redirect)
1681 case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start;
1682 case SYMBOL_PLAINVAL:
1683 forwarded = 0; valcontents.value = SYMBOL_VAL (sym); break;
1684 case SYMBOL_LOCALIZED:
1685 blv = SYMBOL_BLV (sym);
1686 if (blv->frame_local)
1687 error ("Symbol %s may not be buffer-local",
1688 SDATA (SYMBOL_NAME (variable)));
1689 break;
1690 case SYMBOL_FORWARDED:
1691 forwarded = 1; valcontents.fwd = SYMBOL_FWD (sym);
1692 if (KBOARD_OBJFWDP (valcontents.fwd))
1693 error ("Symbol %s may not be buffer-local",
1694 SDATA (SYMBOL_NAME (variable)));
1695 break;
1696 default: emacs_abort ();
1699 if (sym->constant)
1700 error ("Symbol %s may not be buffer-local",
1701 SDATA (SYMBOL_NAME (variable)));
1703 if (blv ? blv->local_if_set
1704 : (forwarded && BUFFER_OBJFWDP (valcontents.fwd)))
1706 tem = Fboundp (variable);
1707 /* Make sure the symbol has a local value in this particular buffer,
1708 by setting it to the same value it already has. */
1709 Fset (variable, (EQ (tem, Qt) ? Fsymbol_value (variable) : Qunbound));
1710 return variable;
1712 if (!blv)
1714 blv = make_blv (sym, forwarded, valcontents);
1715 sym->redirect = SYMBOL_LOCALIZED;
1716 SET_SYMBOL_BLV (sym, blv);
1718 Lisp_Object symbol;
1719 XSETSYMBOL (symbol, sym); /* In case `variable' is aliased. */
1720 if (let_shadows_global_binding_p (symbol))
1721 message ("Making %s local to %s while let-bound!",
1722 SDATA (SYMBOL_NAME (variable)),
1723 SDATA (BVAR (current_buffer, name)));
1727 /* Make sure this buffer has its own value of symbol. */
1728 XSETSYMBOL (variable, sym); /* Update in case of aliasing. */
1729 tem = Fassq (variable, BVAR (current_buffer, local_var_alist));
1730 if (NILP (tem))
1732 if (let_shadows_buffer_binding_p (sym))
1733 message ("Making %s buffer-local while locally let-bound!",
1734 SDATA (SYMBOL_NAME (variable)));
1736 /* Swap out any local binding for some other buffer, and make
1737 sure the current value is permanently recorded, if it's the
1738 default value. */
1739 find_symbol_value (variable);
1741 bset_local_var_alist
1742 (current_buffer,
1743 Fcons (Fcons (variable, XCDR (blv->defcell)),
1744 BVAR (current_buffer, local_var_alist)));
1746 /* Make sure symbol does not think it is set up for this buffer;
1747 force it to look once again for this buffer's value. */
1748 if (current_buffer == XBUFFER (blv->where))
1749 set_blv_where (blv, Qnil);
1750 set_blv_found (blv, 0);
1753 /* If the symbol forwards into a C variable, then load the binding
1754 for this buffer now. If C code modifies the variable before we
1755 load the binding in, then that new value will clobber the default
1756 binding the next time we unload it. */
1757 if (blv->fwd)
1758 swap_in_symval_forwarding (sym, blv);
1760 return variable;
1763 DEFUN ("kill-local-variable", Fkill_local_variable, Skill_local_variable,
1764 1, 1, "vKill Local Variable: ",
1765 doc: /* Make VARIABLE no longer have a separate value in the current buffer.
1766 From now on the default value will apply in this buffer. Return VARIABLE. */)
1767 (register Lisp_Object variable)
1769 register Lisp_Object tem;
1770 struct Lisp_Buffer_Local_Value *blv;
1771 struct Lisp_Symbol *sym;
1773 CHECK_SYMBOL (variable);
1774 sym = XSYMBOL (variable);
1776 start:
1777 switch (sym->redirect)
1779 case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start;
1780 case SYMBOL_PLAINVAL: return variable;
1781 case SYMBOL_FORWARDED:
1783 union Lisp_Fwd *valcontents = SYMBOL_FWD (sym);
1784 if (BUFFER_OBJFWDP (valcontents))
1786 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1787 int idx = PER_BUFFER_IDX (offset);
1789 if (idx > 0)
1791 SET_PER_BUFFER_VALUE_P (current_buffer, idx, 0);
1792 set_per_buffer_value (current_buffer, offset,
1793 per_buffer_default (offset));
1796 return variable;
1798 case SYMBOL_LOCALIZED:
1799 blv = SYMBOL_BLV (sym);
1800 if (blv->frame_local)
1801 return variable;
1802 break;
1803 default: emacs_abort ();
1806 /* Get rid of this buffer's alist element, if any. */
1807 XSETSYMBOL (variable, sym); /* Propagate variable indirection. */
1808 tem = Fassq (variable, BVAR (current_buffer, local_var_alist));
1809 if (!NILP (tem))
1810 bset_local_var_alist
1811 (current_buffer,
1812 Fdelq (tem, BVAR (current_buffer, local_var_alist)));
1814 /* If the symbol is set up with the current buffer's binding
1815 loaded, recompute its value. We have to do it now, or else
1816 forwarded objects won't work right. */
1818 Lisp_Object buf; XSETBUFFER (buf, current_buffer);
1819 if (EQ (buf, blv->where))
1821 set_blv_where (blv, Qnil);
1822 blv->found = 0;
1823 find_symbol_value (variable);
1827 return variable;
1830 /* Lisp functions for creating and removing buffer-local variables. */
1832 /* Obsolete since 22.2. NB adjust doc of modify-frame-parameters
1833 when/if this is removed. */
1835 DEFUN ("make-variable-frame-local", Fmake_variable_frame_local, Smake_variable_frame_local,
1836 1, 1, "vMake Variable Frame Local: ",
1837 doc: /* Enable VARIABLE to have frame-local bindings.
1838 This does not create any frame-local bindings for VARIABLE,
1839 it just makes them possible.
1841 A frame-local binding is actually a frame parameter value.
1842 If a frame F has a value for the frame parameter named VARIABLE,
1843 that also acts as a frame-local binding for VARIABLE in F--
1844 provided this function has been called to enable VARIABLE
1845 to have frame-local bindings at all.
1847 The only way to create a frame-local binding for VARIABLE in a frame
1848 is to set the VARIABLE frame parameter of that frame. See
1849 `modify-frame-parameters' for how to set frame parameters.
1851 Note that since Emacs 23.1, variables cannot be both buffer-local and
1852 frame-local any more (buffer-local bindings used to take precedence over
1853 frame-local bindings). */)
1854 (Lisp_Object variable)
1856 bool forwarded;
1857 union Lisp_Val_Fwd valcontents;
1858 struct Lisp_Symbol *sym;
1859 struct Lisp_Buffer_Local_Value *blv = NULL;
1861 CHECK_SYMBOL (variable);
1862 sym = XSYMBOL (variable);
1864 start:
1865 switch (sym->redirect)
1867 case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start;
1868 case SYMBOL_PLAINVAL:
1869 forwarded = 0; valcontents.value = SYMBOL_VAL (sym);
1870 if (EQ (valcontents.value, Qunbound))
1871 valcontents.value = Qnil;
1872 break;
1873 case SYMBOL_LOCALIZED:
1874 if (SYMBOL_BLV (sym)->frame_local)
1875 return variable;
1876 else
1877 error ("Symbol %s may not be frame-local",
1878 SDATA (SYMBOL_NAME (variable)));
1879 case SYMBOL_FORWARDED:
1880 forwarded = 1; valcontents.fwd = SYMBOL_FWD (sym);
1881 if (KBOARD_OBJFWDP (valcontents.fwd) || BUFFER_OBJFWDP (valcontents.fwd))
1882 error ("Symbol %s may not be frame-local",
1883 SDATA (SYMBOL_NAME (variable)));
1884 break;
1885 default: emacs_abort ();
1888 if (sym->constant)
1889 error ("Symbol %s may not be frame-local", SDATA (SYMBOL_NAME (variable)));
1891 blv = make_blv (sym, forwarded, valcontents);
1892 blv->frame_local = 1;
1893 sym->redirect = SYMBOL_LOCALIZED;
1894 SET_SYMBOL_BLV (sym, blv);
1896 Lisp_Object symbol;
1897 XSETSYMBOL (symbol, sym); /* In case `variable' is aliased. */
1898 if (let_shadows_global_binding_p (symbol))
1899 message ("Making %s frame-local while let-bound!",
1900 SDATA (SYMBOL_NAME (variable)));
1902 return variable;
1905 DEFUN ("local-variable-p", Flocal_variable_p, Slocal_variable_p,
1906 1, 2, 0,
1907 doc: /* Non-nil if VARIABLE has a local binding in buffer BUFFER.
1908 BUFFER defaults to the current buffer. */)
1909 (register Lisp_Object variable, Lisp_Object buffer)
1911 register struct buffer *buf;
1912 struct Lisp_Symbol *sym;
1914 if (NILP (buffer))
1915 buf = current_buffer;
1916 else
1918 CHECK_BUFFER (buffer);
1919 buf = XBUFFER (buffer);
1922 CHECK_SYMBOL (variable);
1923 sym = XSYMBOL (variable);
1925 start:
1926 switch (sym->redirect)
1928 case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start;
1929 case SYMBOL_PLAINVAL: return Qnil;
1930 case SYMBOL_LOCALIZED:
1932 Lisp_Object tail, elt, tmp;
1933 struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (sym);
1934 XSETBUFFER (tmp, buf);
1935 XSETSYMBOL (variable, sym); /* Update in case of aliasing. */
1937 if (EQ (blv->where, tmp)) /* The binding is already loaded. */
1938 return blv_found (blv) ? Qt : Qnil;
1939 else
1940 for (tail = BVAR (buf, local_var_alist); CONSP (tail); tail = XCDR (tail))
1942 elt = XCAR (tail);
1943 if (EQ (variable, XCAR (elt)))
1945 eassert (!blv->frame_local);
1946 return Qt;
1949 return Qnil;
1951 case SYMBOL_FORWARDED:
1953 union Lisp_Fwd *valcontents = SYMBOL_FWD (sym);
1954 if (BUFFER_OBJFWDP (valcontents))
1956 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1957 int idx = PER_BUFFER_IDX (offset);
1958 if (idx == -1 || PER_BUFFER_VALUE_P (buf, idx))
1959 return Qt;
1961 return Qnil;
1963 default: emacs_abort ();
1967 DEFUN ("local-variable-if-set-p", Flocal_variable_if_set_p, Slocal_variable_if_set_p,
1968 1, 2, 0,
1969 doc: /* Non-nil if VARIABLE is local in buffer BUFFER when set there.
1970 BUFFER defaults to the current buffer.
1972 More precisely, return non-nil if either VARIABLE already has a local
1973 value in BUFFER, or if VARIABLE is automatically buffer-local (see
1974 `make-variable-buffer-local'). */)
1975 (register Lisp_Object variable, Lisp_Object buffer)
1977 struct Lisp_Symbol *sym;
1979 CHECK_SYMBOL (variable);
1980 sym = XSYMBOL (variable);
1982 start:
1983 switch (sym->redirect)
1985 case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start;
1986 case SYMBOL_PLAINVAL: return Qnil;
1987 case SYMBOL_LOCALIZED:
1989 struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (sym);
1990 if (blv->local_if_set)
1991 return Qt;
1992 XSETSYMBOL (variable, sym); /* Update in case of aliasing. */
1993 return Flocal_variable_p (variable, buffer);
1995 case SYMBOL_FORWARDED:
1996 /* All BUFFER_OBJFWD slots become local if they are set. */
1997 return (BUFFER_OBJFWDP (SYMBOL_FWD (sym)) ? Qt : Qnil);
1998 default: emacs_abort ();
2002 DEFUN ("variable-binding-locus", Fvariable_binding_locus, Svariable_binding_locus,
2003 1, 1, 0,
2004 doc: /* Return a value indicating where VARIABLE's current binding comes from.
2005 If the current binding is buffer-local, the value is the current buffer.
2006 If the current binding is frame-local, the value is the selected frame.
2007 If the current binding is global (the default), the value is nil. */)
2008 (register Lisp_Object variable)
2010 struct Lisp_Symbol *sym;
2012 CHECK_SYMBOL (variable);
2013 sym = XSYMBOL (variable);
2015 /* Make sure the current binding is actually swapped in. */
2016 find_symbol_value (variable);
2018 start:
2019 switch (sym->redirect)
2021 case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start;
2022 case SYMBOL_PLAINVAL: return Qnil;
2023 case SYMBOL_FORWARDED:
2025 union Lisp_Fwd *valcontents = SYMBOL_FWD (sym);
2026 if (KBOARD_OBJFWDP (valcontents))
2027 return Fframe_terminal (Fselected_frame ());
2028 else if (!BUFFER_OBJFWDP (valcontents))
2029 return Qnil;
2031 /* FALLTHROUGH */
2032 case SYMBOL_LOCALIZED:
2033 /* For a local variable, record both the symbol and which
2034 buffer's or frame's value we are saving. */
2035 if (!NILP (Flocal_variable_p (variable, Qnil)))
2036 return Fcurrent_buffer ();
2037 else if (sym->redirect == SYMBOL_LOCALIZED
2038 && blv_found (SYMBOL_BLV (sym)))
2039 return SYMBOL_BLV (sym)->where;
2040 else
2041 return Qnil;
2042 default: emacs_abort ();
2046 /* This code is disabled now that we use the selected frame to return
2047 keyboard-local-values. */
2048 #if 0
2049 extern struct terminal *get_terminal (Lisp_Object display, int);
2051 DEFUN ("terminal-local-value", Fterminal_local_value,
2052 Sterminal_local_value, 2, 2, 0,
2053 doc: /* Return the terminal-local value of SYMBOL on TERMINAL.
2054 If SYMBOL is not a terminal-local variable, then return its normal
2055 value, like `symbol-value'.
2057 TERMINAL may be a terminal object, a frame, or nil (meaning the
2058 selected frame's terminal device). */)
2059 (Lisp_Object symbol, Lisp_Object terminal)
2061 Lisp_Object result;
2062 struct terminal *t = get_terminal (terminal, 1);
2063 push_kboard (t->kboard);
2064 result = Fsymbol_value (symbol);
2065 pop_kboard ();
2066 return result;
2069 DEFUN ("set-terminal-local-value", Fset_terminal_local_value,
2070 Sset_terminal_local_value, 3, 3, 0,
2071 doc: /* Set the terminal-local binding of SYMBOL on TERMINAL to VALUE.
2072 If VARIABLE is not a terminal-local variable, then set its normal
2073 binding, like `set'.
2075 TERMINAL may be a terminal object, a frame, or nil (meaning the
2076 selected frame's terminal device). */)
2077 (Lisp_Object symbol, Lisp_Object terminal, Lisp_Object value)
2079 Lisp_Object result;
2080 struct terminal *t = get_terminal (terminal, 1);
2081 push_kboard (d->kboard);
2082 result = Fset (symbol, value);
2083 pop_kboard ();
2084 return result;
2086 #endif
2088 /* Find the function at the end of a chain of symbol function indirections. */
2090 /* If OBJECT is a symbol, find the end of its function chain and
2091 return the value found there. If OBJECT is not a symbol, just
2092 return it. If there is a cycle in the function chain, signal a
2093 cyclic-function-indirection error.
2095 This is like Findirect_function, except that it doesn't signal an
2096 error if the chain ends up unbound. */
2097 Lisp_Object
2098 indirect_function (register Lisp_Object object)
2100 Lisp_Object tortoise, hare;
2102 hare = tortoise = object;
2104 for (;;)
2106 if (!SYMBOLP (hare) || NILP (hare))
2107 break;
2108 hare = XSYMBOL (hare)->function;
2109 if (!SYMBOLP (hare) || NILP (hare))
2110 break;
2111 hare = XSYMBOL (hare)->function;
2113 tortoise = XSYMBOL (tortoise)->function;
2115 if (EQ (hare, tortoise))
2116 xsignal1 (Qcyclic_function_indirection, object);
2119 return hare;
2122 DEFUN ("indirect-function", Findirect_function, Sindirect_function, 1, 2, 0,
2123 doc: /* Return the function at the end of OBJECT's function chain.
2124 If OBJECT is not a symbol, just return it. Otherwise, follow all
2125 function indirections to find the final function binding and return it.
2126 If the final symbol in the chain is unbound, signal a void-function error.
2127 Optional arg NOERROR non-nil means to return nil instead of signaling.
2128 Signal a cyclic-function-indirection error if there is a loop in the
2129 function chain of symbols. */)
2130 (register Lisp_Object object, Lisp_Object noerror)
2132 Lisp_Object result;
2134 /* Optimize for no indirection. */
2135 result = object;
2136 if (SYMBOLP (result) && !NILP (result)
2137 && (result = XSYMBOL (result)->function, SYMBOLP (result)))
2138 result = indirect_function (result);
2139 if (!NILP (result))
2140 return result;
2142 if (NILP (noerror))
2143 xsignal1 (Qvoid_function, object);
2145 return Qnil;
2148 /* Extract and set vector and string elements. */
2150 DEFUN ("aref", Faref, Saref, 2, 2, 0,
2151 doc: /* Return the element of ARRAY at index IDX.
2152 ARRAY may be a vector, a string, a char-table, a bool-vector,
2153 or a byte-code object. IDX starts at 0. */)
2154 (register Lisp_Object array, Lisp_Object idx)
2156 register EMACS_INT idxval;
2158 CHECK_NUMBER (idx);
2159 idxval = XINT (idx);
2160 if (STRINGP (array))
2162 int c;
2163 ptrdiff_t idxval_byte;
2165 if (idxval < 0 || idxval >= SCHARS (array))
2166 args_out_of_range (array, idx);
2167 if (! STRING_MULTIBYTE (array))
2168 return make_number ((unsigned char) SREF (array, idxval));
2169 idxval_byte = string_char_to_byte (array, idxval);
2171 c = STRING_CHAR (SDATA (array) + idxval_byte);
2172 return make_number (c);
2174 else if (BOOL_VECTOR_P (array))
2176 int val;
2178 if (idxval < 0 || idxval >= XBOOL_VECTOR (array)->size)
2179 args_out_of_range (array, idx);
2181 val = (unsigned char) XBOOL_VECTOR (array)->data[idxval / BOOL_VECTOR_BITS_PER_CHAR];
2182 return (val & (1 << (idxval % BOOL_VECTOR_BITS_PER_CHAR)) ? Qt : Qnil);
2184 else if (CHAR_TABLE_P (array))
2186 CHECK_CHARACTER (idx);
2187 return CHAR_TABLE_REF (array, idxval);
2189 else
2191 ptrdiff_t size = 0;
2192 if (VECTORP (array))
2193 size = ASIZE (array);
2194 else if (COMPILEDP (array))
2195 size = ASIZE (array) & PSEUDOVECTOR_SIZE_MASK;
2196 else
2197 wrong_type_argument (Qarrayp, array);
2199 if (idxval < 0 || idxval >= size)
2200 args_out_of_range (array, idx);
2201 return AREF (array, idxval);
2205 DEFUN ("aset", Faset, Saset, 3, 3, 0,
2206 doc: /* Store into the element of ARRAY at index IDX the value NEWELT.
2207 Return NEWELT. ARRAY may be a vector, a string, a char-table or a
2208 bool-vector. IDX starts at 0. */)
2209 (register Lisp_Object array, Lisp_Object idx, Lisp_Object newelt)
2211 register EMACS_INT idxval;
2213 CHECK_NUMBER (idx);
2214 idxval = XINT (idx);
2215 CHECK_ARRAY (array, Qarrayp);
2216 CHECK_IMPURE (array);
2218 if (VECTORP (array))
2220 if (idxval < 0 || idxval >= ASIZE (array))
2221 args_out_of_range (array, idx);
2222 ASET (array, idxval, newelt);
2224 else if (BOOL_VECTOR_P (array))
2226 int val;
2228 if (idxval < 0 || idxval >= XBOOL_VECTOR (array)->size)
2229 args_out_of_range (array, idx);
2231 val = (unsigned char) XBOOL_VECTOR (array)->data[idxval / BOOL_VECTOR_BITS_PER_CHAR];
2233 if (! NILP (newelt))
2234 val |= 1 << (idxval % BOOL_VECTOR_BITS_PER_CHAR);
2235 else
2236 val &= ~(1 << (idxval % BOOL_VECTOR_BITS_PER_CHAR));
2237 XBOOL_VECTOR (array)->data[idxval / BOOL_VECTOR_BITS_PER_CHAR] = val;
2239 else if (CHAR_TABLE_P (array))
2241 CHECK_CHARACTER (idx);
2242 CHAR_TABLE_SET (array, idxval, newelt);
2244 else
2246 int c;
2248 if (idxval < 0 || idxval >= SCHARS (array))
2249 args_out_of_range (array, idx);
2250 CHECK_CHARACTER (newelt);
2251 c = XFASTINT (newelt);
2253 if (STRING_MULTIBYTE (array))
2255 ptrdiff_t idxval_byte, nbytes;
2256 int prev_bytes, new_bytes;
2257 unsigned char workbuf[MAX_MULTIBYTE_LENGTH], *p0 = workbuf, *p1;
2259 nbytes = SBYTES (array);
2260 idxval_byte = string_char_to_byte (array, idxval);
2261 p1 = SDATA (array) + idxval_byte;
2262 prev_bytes = BYTES_BY_CHAR_HEAD (*p1);
2263 new_bytes = CHAR_STRING (c, p0);
2264 if (prev_bytes != new_bytes)
2266 /* We must relocate the string data. */
2267 ptrdiff_t nchars = SCHARS (array);
2268 USE_SAFE_ALLOCA;
2269 unsigned char *str = SAFE_ALLOCA (nbytes);
2271 memcpy (str, SDATA (array), nbytes);
2272 allocate_string_data (XSTRING (array), nchars,
2273 nbytes + new_bytes - prev_bytes);
2274 memcpy (SDATA (array), str, idxval_byte);
2275 p1 = SDATA (array) + idxval_byte;
2276 memcpy (p1 + new_bytes, str + idxval_byte + prev_bytes,
2277 nbytes - (idxval_byte + prev_bytes));
2278 SAFE_FREE ();
2279 clear_string_char_byte_cache ();
2281 while (new_bytes--)
2282 *p1++ = *p0++;
2284 else
2286 if (! SINGLE_BYTE_CHAR_P (c))
2288 int i;
2290 for (i = SBYTES (array) - 1; i >= 0; i--)
2291 if (SREF (array, i) >= 0x80)
2292 args_out_of_range (array, newelt);
2293 /* ARRAY is an ASCII string. Convert it to a multibyte
2294 string, and try `aset' again. */
2295 STRING_SET_MULTIBYTE (array);
2296 return Faset (array, idx, newelt);
2298 SSET (array, idxval, c);
2302 return newelt;
2305 /* Arithmetic functions */
2307 enum comparison { equal, notequal, less, grtr, less_or_equal, grtr_or_equal };
2309 static Lisp_Object
2310 arithcompare (Lisp_Object num1, Lisp_Object num2, enum comparison comparison)
2312 double f1 = 0, f2 = 0;
2313 bool floatp = 0;
2315 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num1);
2316 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num2);
2318 if (FLOATP (num1) || FLOATP (num2))
2320 floatp = 1;
2321 f1 = (FLOATP (num1)) ? XFLOAT_DATA (num1) : XINT (num1);
2322 f2 = (FLOATP (num2)) ? XFLOAT_DATA (num2) : XINT (num2);
2325 switch (comparison)
2327 case equal:
2328 if (floatp ? f1 == f2 : XINT (num1) == XINT (num2))
2329 return Qt;
2330 return Qnil;
2332 case notequal:
2333 if (floatp ? f1 != f2 : XINT (num1) != XINT (num2))
2334 return Qt;
2335 return Qnil;
2337 case less:
2338 if (floatp ? f1 < f2 : XINT (num1) < XINT (num2))
2339 return Qt;
2340 return Qnil;
2342 case less_or_equal:
2343 if (floatp ? f1 <= f2 : XINT (num1) <= XINT (num2))
2344 return Qt;
2345 return Qnil;
2347 case grtr:
2348 if (floatp ? f1 > f2 : XINT (num1) > XINT (num2))
2349 return Qt;
2350 return Qnil;
2352 case grtr_or_equal:
2353 if (floatp ? f1 >= f2 : XINT (num1) >= XINT (num2))
2354 return Qt;
2355 return Qnil;
2357 default:
2358 emacs_abort ();
2362 DEFUN ("=", Feqlsign, Seqlsign, 2, 2, 0,
2363 doc: /* Return t if two args, both numbers or markers, are equal. */)
2364 (register Lisp_Object num1, Lisp_Object num2)
2366 return arithcompare (num1, num2, equal);
2369 DEFUN ("<", Flss, Slss, 2, 2, 0,
2370 doc: /* Return t if first arg is less than second arg. Both must be numbers or markers. */)
2371 (register Lisp_Object num1, Lisp_Object num2)
2373 return arithcompare (num1, num2, less);
2376 DEFUN (">", Fgtr, Sgtr, 2, 2, 0,
2377 doc: /* Return t if first arg is greater than second arg. Both must be numbers or markers. */)
2378 (register Lisp_Object num1, Lisp_Object num2)
2380 return arithcompare (num1, num2, grtr);
2383 DEFUN ("<=", Fleq, Sleq, 2, 2, 0,
2384 doc: /* Return t if first arg is less than or equal to second arg.
2385 Both must be numbers or markers. */)
2386 (register Lisp_Object num1, Lisp_Object num2)
2388 return arithcompare (num1, num2, less_or_equal);
2391 DEFUN (">=", Fgeq, Sgeq, 2, 2, 0,
2392 doc: /* Return t if first arg is greater than or equal to second arg.
2393 Both must be numbers or markers. */)
2394 (register Lisp_Object num1, Lisp_Object num2)
2396 return arithcompare (num1, num2, grtr_or_equal);
2399 DEFUN ("/=", Fneq, Sneq, 2, 2, 0,
2400 doc: /* Return t if first arg is not equal to second arg. Both must be numbers or markers. */)
2401 (register Lisp_Object num1, Lisp_Object num2)
2403 return arithcompare (num1, num2, notequal);
2406 DEFUN ("zerop", Fzerop, Szerop, 1, 1, 0,
2407 doc: /* Return t if NUMBER is zero. */)
2408 (register Lisp_Object number)
2410 CHECK_NUMBER_OR_FLOAT (number);
2412 if (FLOATP (number))
2414 if (XFLOAT_DATA (number) == 0.0)
2415 return Qt;
2416 return Qnil;
2419 if (!XINT (number))
2420 return Qt;
2421 return Qnil;
2424 /* Convert the cons-of-integers, integer, or float value C to an
2425 unsigned value with maximum value MAX. Signal an error if C does not
2426 have a valid format or is out of range. */
2427 uintmax_t
2428 cons_to_unsigned (Lisp_Object c, uintmax_t max)
2430 bool valid = 0;
2431 uintmax_t val IF_LINT (= 0);
2432 if (INTEGERP (c))
2434 valid = 0 <= XINT (c);
2435 val = XINT (c);
2437 else if (FLOATP (c))
2439 double d = XFLOAT_DATA (c);
2440 if (0 <= d
2441 && d < (max == UINTMAX_MAX ? (double) UINTMAX_MAX + 1 : max + 1))
2443 val = d;
2444 valid = 1;
2447 else if (CONSP (c) && NATNUMP (XCAR (c)))
2449 uintmax_t top = XFASTINT (XCAR (c));
2450 Lisp_Object rest = XCDR (c);
2451 if (top <= UINTMAX_MAX >> 24 >> 16
2452 && CONSP (rest)
2453 && NATNUMP (XCAR (rest)) && XFASTINT (XCAR (rest)) < 1 << 24
2454 && NATNUMP (XCDR (rest)) && XFASTINT (XCDR (rest)) < 1 << 16)
2456 uintmax_t mid = XFASTINT (XCAR (rest));
2457 val = top << 24 << 16 | mid << 16 | XFASTINT (XCDR (rest));
2458 valid = 1;
2460 else if (top <= UINTMAX_MAX >> 16)
2462 if (CONSP (rest))
2463 rest = XCAR (rest);
2464 if (NATNUMP (rest) && XFASTINT (rest) < 1 << 16)
2466 val = top << 16 | XFASTINT (rest);
2467 valid = 1;
2472 if (! (valid && val <= max))
2473 error ("Not an in-range integer, float, or cons of integers");
2474 return val;
2477 /* Convert the cons-of-integers, integer, or float value C to a signed
2478 value with extrema MIN and MAX. Signal an error if C does not have
2479 a valid format or is out of range. */
2480 intmax_t
2481 cons_to_signed (Lisp_Object c, intmax_t min, intmax_t max)
2483 bool valid = 0;
2484 intmax_t val IF_LINT (= 0);
2485 if (INTEGERP (c))
2487 val = XINT (c);
2488 valid = 1;
2490 else if (FLOATP (c))
2492 double d = XFLOAT_DATA (c);
2493 if (min <= d
2494 && d < (max == INTMAX_MAX ? (double) INTMAX_MAX + 1 : max + 1))
2496 val = d;
2497 valid = 1;
2500 else if (CONSP (c) && INTEGERP (XCAR (c)))
2502 intmax_t top = XINT (XCAR (c));
2503 Lisp_Object rest = XCDR (c);
2504 if (INTMAX_MIN >> 24 >> 16 <= top && top <= INTMAX_MAX >> 24 >> 16
2505 && CONSP (rest)
2506 && NATNUMP (XCAR (rest)) && XFASTINT (XCAR (rest)) < 1 << 24
2507 && NATNUMP (XCDR (rest)) && XFASTINT (XCDR (rest)) < 1 << 16)
2509 intmax_t mid = XFASTINT (XCAR (rest));
2510 val = top << 24 << 16 | mid << 16 | XFASTINT (XCDR (rest));
2511 valid = 1;
2513 else if (INTMAX_MIN >> 16 <= top && top <= INTMAX_MAX >> 16)
2515 if (CONSP (rest))
2516 rest = XCAR (rest);
2517 if (NATNUMP (rest) && XFASTINT (rest) < 1 << 16)
2519 val = top << 16 | XFASTINT (rest);
2520 valid = 1;
2525 if (! (valid && min <= val && val <= max))
2526 error ("Not an in-range integer, float, or cons of integers");
2527 return val;
2530 DEFUN ("number-to-string", Fnumber_to_string, Snumber_to_string, 1, 1, 0,
2531 doc: /* Return the decimal representation of NUMBER as a string.
2532 Uses a minus sign if negative.
2533 NUMBER may be an integer or a floating point number. */)
2534 (Lisp_Object number)
2536 char buffer[max (FLOAT_TO_STRING_BUFSIZE, INT_BUFSIZE_BOUND (EMACS_INT))];
2537 int len;
2539 CHECK_NUMBER_OR_FLOAT (number);
2541 if (FLOATP (number))
2542 len = float_to_string (buffer, XFLOAT_DATA (number));
2543 else
2544 len = sprintf (buffer, "%"pI"d", XINT (number));
2546 return make_unibyte_string (buffer, len);
2549 DEFUN ("string-to-number", Fstring_to_number, Sstring_to_number, 1, 2, 0,
2550 doc: /* Parse STRING as a decimal number and return the number.
2551 This parses both integers and floating point numbers.
2552 It ignores leading spaces and tabs, and all trailing chars.
2554 If BASE, interpret STRING as a number in that base. If BASE isn't
2555 present, base 10 is used. BASE must be between 2 and 16 (inclusive).
2556 If the base used is not 10, STRING is always parsed as integer. */)
2557 (register Lisp_Object string, Lisp_Object base)
2559 register char *p;
2560 register int b;
2561 Lisp_Object val;
2563 CHECK_STRING (string);
2565 if (NILP (base))
2566 b = 10;
2567 else
2569 CHECK_NUMBER (base);
2570 if (! (2 <= XINT (base) && XINT (base) <= 16))
2571 xsignal1 (Qargs_out_of_range, base);
2572 b = XINT (base);
2575 p = SSDATA (string);
2576 while (*p == ' ' || *p == '\t')
2577 p++;
2579 val = string_to_number (p, b, 1);
2580 return NILP (val) ? make_number (0) : val;
2583 enum arithop
2585 Aadd,
2586 Asub,
2587 Amult,
2588 Adiv,
2589 Alogand,
2590 Alogior,
2591 Alogxor,
2592 Amax,
2593 Amin
2596 static Lisp_Object float_arith_driver (double, ptrdiff_t, enum arithop,
2597 ptrdiff_t, Lisp_Object *);
2598 static Lisp_Object
2599 arith_driver (enum arithop code, ptrdiff_t nargs, Lisp_Object *args)
2601 Lisp_Object val;
2602 ptrdiff_t argnum, ok_args;
2603 EMACS_INT accum = 0;
2604 EMACS_INT next, ok_accum;
2605 bool overflow = 0;
2607 switch (code)
2609 case Alogior:
2610 case Alogxor:
2611 case Aadd:
2612 case Asub:
2613 accum = 0;
2614 break;
2615 case Amult:
2616 accum = 1;
2617 break;
2618 case Alogand:
2619 accum = -1;
2620 break;
2621 default:
2622 break;
2625 for (argnum = 0; argnum < nargs; argnum++)
2627 if (! overflow)
2629 ok_args = argnum;
2630 ok_accum = accum;
2633 /* Using args[argnum] as argument to CHECK_NUMBER_... */
2634 val = args[argnum];
2635 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val);
2637 if (FLOATP (val))
2638 return float_arith_driver (ok_accum, ok_args, code,
2639 nargs, args);
2640 args[argnum] = val;
2641 next = XINT (args[argnum]);
2642 switch (code)
2644 case Aadd:
2645 if (INT_ADD_OVERFLOW (accum, next))
2647 overflow = 1;
2648 accum &= INTMASK;
2650 accum += next;
2651 break;
2652 case Asub:
2653 if (INT_SUBTRACT_OVERFLOW (accum, next))
2655 overflow = 1;
2656 accum &= INTMASK;
2658 accum = argnum ? accum - next : nargs == 1 ? - next : next;
2659 break;
2660 case Amult:
2661 if (INT_MULTIPLY_OVERFLOW (accum, next))
2663 EMACS_UINT a = accum, b = next, ab = a * b;
2664 overflow = 1;
2665 accum = ab & INTMASK;
2667 else
2668 accum *= next;
2669 break;
2670 case Adiv:
2671 if (!argnum)
2672 accum = next;
2673 else
2675 if (next == 0)
2676 xsignal0 (Qarith_error);
2677 accum /= next;
2679 break;
2680 case Alogand:
2681 accum &= next;
2682 break;
2683 case Alogior:
2684 accum |= next;
2685 break;
2686 case Alogxor:
2687 accum ^= next;
2688 break;
2689 case Amax:
2690 if (!argnum || next > accum)
2691 accum = next;
2692 break;
2693 case Amin:
2694 if (!argnum || next < accum)
2695 accum = next;
2696 break;
2700 XSETINT (val, accum);
2701 return val;
2704 #undef isnan
2705 #define isnan(x) ((x) != (x))
2707 static Lisp_Object
2708 float_arith_driver (double accum, ptrdiff_t argnum, enum arithop code,
2709 ptrdiff_t nargs, Lisp_Object *args)
2711 register Lisp_Object val;
2712 double next;
2714 for (; argnum < nargs; argnum++)
2716 val = args[argnum]; /* using args[argnum] as argument to CHECK_NUMBER_... */
2717 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val);
2719 if (FLOATP (val))
2721 next = XFLOAT_DATA (val);
2723 else
2725 args[argnum] = val; /* runs into a compiler bug. */
2726 next = XINT (args[argnum]);
2728 switch (code)
2730 case Aadd:
2731 accum += next;
2732 break;
2733 case Asub:
2734 accum = argnum ? accum - next : nargs == 1 ? - next : next;
2735 break;
2736 case Amult:
2737 accum *= next;
2738 break;
2739 case Adiv:
2740 if (!argnum)
2741 accum = next;
2742 else
2744 if (! IEEE_FLOATING_POINT && next == 0)
2745 xsignal0 (Qarith_error);
2746 accum /= next;
2748 break;
2749 case Alogand:
2750 case Alogior:
2751 case Alogxor:
2752 return wrong_type_argument (Qinteger_or_marker_p, val);
2753 case Amax:
2754 if (!argnum || isnan (next) || next > accum)
2755 accum = next;
2756 break;
2757 case Amin:
2758 if (!argnum || isnan (next) || next < accum)
2759 accum = next;
2760 break;
2764 return make_float (accum);
2768 DEFUN ("+", Fplus, Splus, 0, MANY, 0,
2769 doc: /* Return sum of any number of arguments, which are numbers or markers.
2770 usage: (+ &rest NUMBERS-OR-MARKERS) */)
2771 (ptrdiff_t nargs, Lisp_Object *args)
2773 return arith_driver (Aadd, nargs, args);
2776 DEFUN ("-", Fminus, Sminus, 0, MANY, 0,
2777 doc: /* Negate number or subtract numbers or markers and return the result.
2778 With one arg, negates it. With more than one arg,
2779 subtracts all but the first from the first.
2780 usage: (- &optional NUMBER-OR-MARKER &rest MORE-NUMBERS-OR-MARKERS) */)
2781 (ptrdiff_t nargs, Lisp_Object *args)
2783 return arith_driver (Asub, nargs, args);
2786 DEFUN ("*", Ftimes, Stimes, 0, MANY, 0,
2787 doc: /* Return product of any number of arguments, which are numbers or markers.
2788 usage: (* &rest NUMBERS-OR-MARKERS) */)
2789 (ptrdiff_t nargs, Lisp_Object *args)
2791 return arith_driver (Amult, nargs, args);
2794 DEFUN ("/", Fquo, Squo, 1, MANY, 0,
2795 doc: /* Return first argument divided by all the remaining arguments.
2796 The arguments must be numbers or markers.
2797 usage: (/ DIVIDEND &rest DIVISORS) */)
2798 (ptrdiff_t nargs, Lisp_Object *args)
2800 ptrdiff_t argnum;
2801 for (argnum = 2; argnum < nargs; argnum++)
2802 if (FLOATP (args[argnum]))
2803 return float_arith_driver (0, 0, Adiv, nargs, args);
2804 return arith_driver (Adiv, nargs, args);
2807 DEFUN ("%", Frem, Srem, 2, 2, 0,
2808 doc: /* Return remainder of X divided by Y.
2809 Both must be integers or markers. */)
2810 (register Lisp_Object x, Lisp_Object y)
2812 Lisp_Object val;
2814 CHECK_NUMBER_COERCE_MARKER (x);
2815 CHECK_NUMBER_COERCE_MARKER (y);
2817 if (XINT (y) == 0)
2818 xsignal0 (Qarith_error);
2820 XSETINT (val, XINT (x) % XINT (y));
2821 return val;
2824 DEFUN ("mod", Fmod, Smod, 2, 2, 0,
2825 doc: /* Return X modulo Y.
2826 The result falls between zero (inclusive) and Y (exclusive).
2827 Both X and Y must be numbers or markers. */)
2828 (register Lisp_Object x, Lisp_Object y)
2830 Lisp_Object val;
2831 EMACS_INT i1, i2;
2833 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (x);
2834 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (y);
2836 if (FLOATP (x) || FLOATP (y))
2837 return fmod_float (x, y);
2839 i1 = XINT (x);
2840 i2 = XINT (y);
2842 if (i2 == 0)
2843 xsignal0 (Qarith_error);
2845 i1 %= i2;
2847 /* If the "remainder" comes out with the wrong sign, fix it. */
2848 if (i2 < 0 ? i1 > 0 : i1 < 0)
2849 i1 += i2;
2851 XSETINT (val, i1);
2852 return val;
2855 DEFUN ("max", Fmax, Smax, 1, MANY, 0,
2856 doc: /* Return largest of all the arguments (which must be numbers or markers).
2857 The value is always a number; markers are converted to numbers.
2858 usage: (max NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */)
2859 (ptrdiff_t nargs, Lisp_Object *args)
2861 return arith_driver (Amax, nargs, args);
2864 DEFUN ("min", Fmin, Smin, 1, MANY, 0,
2865 doc: /* Return smallest of all the arguments (which must be numbers or markers).
2866 The value is always a number; markers are converted to numbers.
2867 usage: (min NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */)
2868 (ptrdiff_t nargs, Lisp_Object *args)
2870 return arith_driver (Amin, nargs, args);
2873 DEFUN ("logand", Flogand, Slogand, 0, MANY, 0,
2874 doc: /* Return bitwise-and of all the arguments.
2875 Arguments may be integers, or markers converted to integers.
2876 usage: (logand &rest INTS-OR-MARKERS) */)
2877 (ptrdiff_t nargs, Lisp_Object *args)
2879 return arith_driver (Alogand, nargs, args);
2882 DEFUN ("logior", Flogior, Slogior, 0, MANY, 0,
2883 doc: /* Return bitwise-or of all the arguments.
2884 Arguments may be integers, or markers converted to integers.
2885 usage: (logior &rest INTS-OR-MARKERS) */)
2886 (ptrdiff_t nargs, Lisp_Object *args)
2888 return arith_driver (Alogior, nargs, args);
2891 DEFUN ("logxor", Flogxor, Slogxor, 0, MANY, 0,
2892 doc: /* Return bitwise-exclusive-or of all the arguments.
2893 Arguments may be integers, or markers converted to integers.
2894 usage: (logxor &rest INTS-OR-MARKERS) */)
2895 (ptrdiff_t nargs, Lisp_Object *args)
2897 return arith_driver (Alogxor, nargs, args);
2900 DEFUN ("ash", Fash, Sash, 2, 2, 0,
2901 doc: /* Return VALUE with its bits shifted left by COUNT.
2902 If COUNT is negative, shifting is actually to the right.
2903 In this case, the sign bit is duplicated. */)
2904 (register Lisp_Object value, Lisp_Object count)
2906 register Lisp_Object val;
2908 CHECK_NUMBER (value);
2909 CHECK_NUMBER (count);
2911 if (XINT (count) >= BITS_PER_EMACS_INT)
2912 XSETINT (val, 0);
2913 else if (XINT (count) > 0)
2914 XSETINT (val, XINT (value) << XFASTINT (count));
2915 else if (XINT (count) <= -BITS_PER_EMACS_INT)
2916 XSETINT (val, XINT (value) < 0 ? -1 : 0);
2917 else
2918 XSETINT (val, XINT (value) >> -XINT (count));
2919 return val;
2922 DEFUN ("lsh", Flsh, Slsh, 2, 2, 0,
2923 doc: /* Return VALUE with its bits shifted left by COUNT.
2924 If COUNT is negative, shifting is actually to the right.
2925 In this case, zeros are shifted in on the left. */)
2926 (register Lisp_Object value, Lisp_Object count)
2928 register Lisp_Object val;
2930 CHECK_NUMBER (value);
2931 CHECK_NUMBER (count);
2933 if (XINT (count) >= BITS_PER_EMACS_INT)
2934 XSETINT (val, 0);
2935 else if (XINT (count) > 0)
2936 XSETINT (val, XUINT (value) << XFASTINT (count));
2937 else if (XINT (count) <= -BITS_PER_EMACS_INT)
2938 XSETINT (val, 0);
2939 else
2940 XSETINT (val, XUINT (value) >> -XINT (count));
2941 return val;
2944 DEFUN ("1+", Fadd1, Sadd1, 1, 1, 0,
2945 doc: /* Return NUMBER plus one. NUMBER may be a number or a marker.
2946 Markers are converted to integers. */)
2947 (register Lisp_Object number)
2949 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number);
2951 if (FLOATP (number))
2952 return (make_float (1.0 + XFLOAT_DATA (number)));
2954 XSETINT (number, XINT (number) + 1);
2955 return number;
2958 DEFUN ("1-", Fsub1, Ssub1, 1, 1, 0,
2959 doc: /* Return NUMBER minus one. NUMBER may be a number or a marker.
2960 Markers are converted to integers. */)
2961 (register Lisp_Object number)
2963 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number);
2965 if (FLOATP (number))
2966 return (make_float (-1.0 + XFLOAT_DATA (number)));
2968 XSETINT (number, XINT (number) - 1);
2969 return number;
2972 DEFUN ("lognot", Flognot, Slognot, 1, 1, 0,
2973 doc: /* Return the bitwise complement of NUMBER. NUMBER must be an integer. */)
2974 (register Lisp_Object number)
2976 CHECK_NUMBER (number);
2977 XSETINT (number, ~XINT (number));
2978 return number;
2981 DEFUN ("byteorder", Fbyteorder, Sbyteorder, 0, 0, 0,
2982 doc: /* Return the byteorder for the machine.
2983 Returns 66 (ASCII uppercase B) for big endian machines or 108 (ASCII
2984 lowercase l) for small endian machines. */)
2985 (void)
2987 unsigned i = 0x04030201;
2988 int order = *(char *)&i == 1 ? 108 : 66;
2990 return make_number (order);
2995 void
2996 syms_of_data (void)
2998 Lisp_Object error_tail, arith_tail;
3000 DEFSYM (Qquote, "quote");
3001 DEFSYM (Qlambda, "lambda");
3002 DEFSYM (Qsubr, "subr");
3003 DEFSYM (Qerror_conditions, "error-conditions");
3004 DEFSYM (Qerror_message, "error-message");
3005 DEFSYM (Qtop_level, "top-level");
3007 DEFSYM (Qerror, "error");
3008 DEFSYM (Quser_error, "user-error");
3009 DEFSYM (Qquit, "quit");
3010 DEFSYM (Qwrong_type_argument, "wrong-type-argument");
3011 DEFSYM (Qargs_out_of_range, "args-out-of-range");
3012 DEFSYM (Qvoid_function, "void-function");
3013 DEFSYM (Qcyclic_function_indirection, "cyclic-function-indirection");
3014 DEFSYM (Qcyclic_variable_indirection, "cyclic-variable-indirection");
3015 DEFSYM (Qvoid_variable, "void-variable");
3016 DEFSYM (Qsetting_constant, "setting-constant");
3017 DEFSYM (Qinvalid_read_syntax, "invalid-read-syntax");
3019 DEFSYM (Qinvalid_function, "invalid-function");
3020 DEFSYM (Qwrong_number_of_arguments, "wrong-number-of-arguments");
3021 DEFSYM (Qno_catch, "no-catch");
3022 DEFSYM (Qend_of_file, "end-of-file");
3023 DEFSYM (Qarith_error, "arith-error");
3024 DEFSYM (Qbeginning_of_buffer, "beginning-of-buffer");
3025 DEFSYM (Qend_of_buffer, "end-of-buffer");
3026 DEFSYM (Qbuffer_read_only, "buffer-read-only");
3027 DEFSYM (Qtext_read_only, "text-read-only");
3028 DEFSYM (Qmark_inactive, "mark-inactive");
3030 DEFSYM (Qlistp, "listp");
3031 DEFSYM (Qconsp, "consp");
3032 DEFSYM (Qsymbolp, "symbolp");
3033 DEFSYM (Qkeywordp, "keywordp");
3034 DEFSYM (Qintegerp, "integerp");
3035 DEFSYM (Qnatnump, "natnump");
3036 DEFSYM (Qwholenump, "wholenump");
3037 DEFSYM (Qstringp, "stringp");
3038 DEFSYM (Qarrayp, "arrayp");
3039 DEFSYM (Qsequencep, "sequencep");
3040 DEFSYM (Qbufferp, "bufferp");
3041 DEFSYM (Qvectorp, "vectorp");
3042 DEFSYM (Qchar_or_string_p, "char-or-string-p");
3043 DEFSYM (Qmarkerp, "markerp");
3044 DEFSYM (Qbuffer_or_string_p, "buffer-or-string-p");
3045 DEFSYM (Qinteger_or_marker_p, "integer-or-marker-p");
3046 DEFSYM (Qboundp, "boundp");
3047 DEFSYM (Qfboundp, "fboundp");
3049 DEFSYM (Qfloatp, "floatp");
3050 DEFSYM (Qnumberp, "numberp");
3051 DEFSYM (Qnumber_or_marker_p, "number-or-marker-p");
3053 DEFSYM (Qchar_table_p, "char-table-p");
3054 DEFSYM (Qvector_or_char_table_p, "vector-or-char-table-p");
3056 DEFSYM (Qsubrp, "subrp");
3057 DEFSYM (Qunevalled, "unevalled");
3058 DEFSYM (Qmany, "many");
3060 DEFSYM (Qcdr, "cdr");
3062 /* Handle automatic advice activation. */
3063 DEFSYM (Qad_advice_info, "ad-advice-info");
3064 DEFSYM (Qad_activate_internal, "ad-activate-internal");
3066 error_tail = pure_cons (Qerror, Qnil);
3068 /* ERROR is used as a signaler for random errors for which nothing else is
3069 right. */
3071 Fput (Qerror, Qerror_conditions,
3072 error_tail);
3073 Fput (Qerror, Qerror_message,
3074 build_pure_c_string ("error"));
3076 #define PUT_ERROR(sym, tail, msg) \
3077 Fput (sym, Qerror_conditions, pure_cons (sym, tail)); \
3078 Fput (sym, Qerror_message, build_pure_c_string (msg))
3080 PUT_ERROR (Qquit, Qnil, "Quit");
3082 PUT_ERROR (Quser_error, error_tail, "");
3083 PUT_ERROR (Qwrong_type_argument, error_tail, "Wrong type argument");
3084 PUT_ERROR (Qargs_out_of_range, error_tail, "Args out of range");
3085 PUT_ERROR (Qvoid_function, error_tail,
3086 "Symbol's function definition is void");
3087 PUT_ERROR (Qcyclic_function_indirection, error_tail,
3088 "Symbol's chain of function indirections contains a loop");
3089 PUT_ERROR (Qcyclic_variable_indirection, error_tail,
3090 "Symbol's chain of variable indirections contains a loop");
3091 DEFSYM (Qcircular_list, "circular-list");
3092 PUT_ERROR (Qcircular_list, error_tail, "List contains a loop");
3093 PUT_ERROR (Qvoid_variable, error_tail, "Symbol's value as variable is void");
3094 PUT_ERROR (Qsetting_constant, error_tail,
3095 "Attempt to set a constant symbol");
3096 PUT_ERROR (Qinvalid_read_syntax, error_tail, "Invalid read syntax");
3097 PUT_ERROR (Qinvalid_function, error_tail, "Invalid function");
3098 PUT_ERROR (Qwrong_number_of_arguments, error_tail,
3099 "Wrong number of arguments");
3100 PUT_ERROR (Qno_catch, error_tail, "No catch for tag");
3101 PUT_ERROR (Qend_of_file, error_tail, "End of file during parsing");
3103 arith_tail = pure_cons (Qarith_error, error_tail);
3104 Fput (Qarith_error, Qerror_conditions, arith_tail);
3105 Fput (Qarith_error, Qerror_message, build_pure_c_string ("Arithmetic error"));
3107 PUT_ERROR (Qbeginning_of_buffer, error_tail, "Beginning of buffer");
3108 PUT_ERROR (Qend_of_buffer, error_tail, "End of buffer");
3109 PUT_ERROR (Qbuffer_read_only, error_tail, "Buffer is read-only");
3110 PUT_ERROR (Qtext_read_only, pure_cons (Qbuffer_read_only, error_tail),
3111 "Text is read-only");
3113 DEFSYM (Qrange_error, "range-error");
3114 DEFSYM (Qdomain_error, "domain-error");
3115 DEFSYM (Qsingularity_error, "singularity-error");
3116 DEFSYM (Qoverflow_error, "overflow-error");
3117 DEFSYM (Qunderflow_error, "underflow-error");
3119 PUT_ERROR (Qdomain_error, arith_tail, "Arithmetic domain error");
3121 PUT_ERROR (Qrange_error, arith_tail, "Arithmetic range error");
3123 PUT_ERROR (Qsingularity_error, Fcons (Qdomain_error, arith_tail),
3124 "Arithmetic singularity error");
3126 PUT_ERROR (Qoverflow_error, Fcons (Qdomain_error, arith_tail),
3127 "Arithmetic overflow error");
3128 PUT_ERROR (Qunderflow_error, Fcons (Qdomain_error, arith_tail),
3129 "Arithmetic underflow error");
3131 staticpro (&Qnil);
3132 staticpro (&Qt);
3133 staticpro (&Qunbound);
3135 /* Types that type-of returns. */
3136 DEFSYM (Qinteger, "integer");
3137 DEFSYM (Qsymbol, "symbol");
3138 DEFSYM (Qstring, "string");
3139 DEFSYM (Qcons, "cons");
3140 DEFSYM (Qmarker, "marker");
3141 DEFSYM (Qoverlay, "overlay");
3142 DEFSYM (Qfloat, "float");
3143 DEFSYM (Qwindow_configuration, "window-configuration");
3144 DEFSYM (Qprocess, "process");
3145 DEFSYM (Qwindow, "window");
3146 DEFSYM (Qcompiled_function, "compiled-function");
3147 DEFSYM (Qbuffer, "buffer");
3148 DEFSYM (Qframe, "frame");
3149 DEFSYM (Qvector, "vector");
3150 DEFSYM (Qchar_table, "char-table");
3151 DEFSYM (Qbool_vector, "bool-vector");
3152 DEFSYM (Qhash_table, "hash-table");
3153 DEFSYM (Qthread, "thread");
3154 DEFSYM (Qmutex, "mutex");
3155 DEFSYM (Qcondition_variable, "condition-variable");
3156 DEFSYM (Qmisc, "misc");
3158 DEFSYM (Qdefun, "defun");
3160 DEFSYM (Qfont_spec, "font-spec");
3161 DEFSYM (Qfont_entity, "font-entity");
3162 DEFSYM (Qfont_object, "font-object");
3164 DEFSYM (Qinteractive_form, "interactive-form");
3165 DEFSYM (Qdefalias_fset_function, "defalias-fset-function");
3167 defsubr (&Sindirect_variable);
3168 defsubr (&Sinteractive_form);
3169 defsubr (&Seq);
3170 defsubr (&Snull);
3171 defsubr (&Stype_of);
3172 defsubr (&Slistp);
3173 defsubr (&Snlistp);
3174 defsubr (&Sconsp);
3175 defsubr (&Satom);
3176 defsubr (&Sintegerp);
3177 defsubr (&Sinteger_or_marker_p);
3178 defsubr (&Snumberp);
3179 defsubr (&Snumber_or_marker_p);
3180 defsubr (&Sfloatp);
3181 defsubr (&Snatnump);
3182 defsubr (&Ssymbolp);
3183 defsubr (&Skeywordp);
3184 defsubr (&Sstringp);
3185 defsubr (&Smultibyte_string_p);
3186 defsubr (&Svectorp);
3187 defsubr (&Schar_table_p);
3188 defsubr (&Svector_or_char_table_p);
3189 defsubr (&Sbool_vector_p);
3190 defsubr (&Sarrayp);
3191 defsubr (&Ssequencep);
3192 defsubr (&Sbufferp);
3193 defsubr (&Smarkerp);
3194 defsubr (&Ssubrp);
3195 defsubr (&Sbyte_code_function_p);
3196 defsubr (&Schar_or_string_p);
3197 defsubr (&Sthreadp);
3198 defsubr (&Smutexp);
3199 defsubr (&Scondition_variable_p);
3200 defsubr (&Scar);
3201 defsubr (&Scdr);
3202 defsubr (&Scar_safe);
3203 defsubr (&Scdr_safe);
3204 defsubr (&Ssetcar);
3205 defsubr (&Ssetcdr);
3206 defsubr (&Ssymbol_function);
3207 defsubr (&Sindirect_function);
3208 defsubr (&Ssymbol_plist);
3209 defsubr (&Ssymbol_name);
3210 defsubr (&Smakunbound);
3211 defsubr (&Sfmakunbound);
3212 defsubr (&Sboundp);
3213 defsubr (&Sfboundp);
3214 defsubr (&Sfset);
3215 defsubr (&Sdefalias);
3216 defsubr (&Ssetplist);
3217 defsubr (&Ssymbol_value);
3218 defsubr (&Sset);
3219 defsubr (&Sdefault_boundp);
3220 defsubr (&Sdefault_value);
3221 defsubr (&Sset_default);
3222 defsubr (&Ssetq_default);
3223 defsubr (&Smake_variable_buffer_local);
3224 defsubr (&Smake_local_variable);
3225 defsubr (&Skill_local_variable);
3226 defsubr (&Smake_variable_frame_local);
3227 defsubr (&Slocal_variable_p);
3228 defsubr (&Slocal_variable_if_set_p);
3229 defsubr (&Svariable_binding_locus);
3230 #if 0 /* XXX Remove this. --lorentey */
3231 defsubr (&Sterminal_local_value);
3232 defsubr (&Sset_terminal_local_value);
3233 #endif
3234 defsubr (&Saref);
3235 defsubr (&Saset);
3236 defsubr (&Snumber_to_string);
3237 defsubr (&Sstring_to_number);
3238 defsubr (&Seqlsign);
3239 defsubr (&Slss);
3240 defsubr (&Sgtr);
3241 defsubr (&Sleq);
3242 defsubr (&Sgeq);
3243 defsubr (&Sneq);
3244 defsubr (&Szerop);
3245 defsubr (&Splus);
3246 defsubr (&Sminus);
3247 defsubr (&Stimes);
3248 defsubr (&Squo);
3249 defsubr (&Srem);
3250 defsubr (&Smod);
3251 defsubr (&Smax);
3252 defsubr (&Smin);
3253 defsubr (&Slogand);
3254 defsubr (&Slogior);
3255 defsubr (&Slogxor);
3256 defsubr (&Slsh);
3257 defsubr (&Sash);
3258 defsubr (&Sadd1);
3259 defsubr (&Ssub1);
3260 defsubr (&Slognot);
3261 defsubr (&Sbyteorder);
3262 defsubr (&Ssubr_arity);
3263 defsubr (&Ssubr_name);
3265 set_symbol_function (Qwholenump, XSYMBOL (Qnatnump)->function);
3267 DEFVAR_LISP ("most-positive-fixnum", Vmost_positive_fixnum,
3268 doc: /* The largest value that is representable in a Lisp integer. */);
3269 Vmost_positive_fixnum = make_number (MOST_POSITIVE_FIXNUM);
3270 XSYMBOL (intern_c_string ("most-positive-fixnum"))->constant = 1;
3272 DEFVAR_LISP ("most-negative-fixnum", Vmost_negative_fixnum,
3273 doc: /* The smallest value that is representable in a Lisp integer. */);
3274 Vmost_negative_fixnum = make_number (MOST_NEGATIVE_FIXNUM);
3275 XSYMBOL (intern_c_string ("most-negative-fixnum"))->constant = 1;