* todo-mode.el: Offer to convert legacy file. Update commentary.
[emacs.git] / src / data.c
blob9f756de014a28394ccecc7d9bc8a958c8c01fb9f
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, Qmany, Qunevalled;
80 Lisp_Object Qfont_spec, Qfont_entity, Qfont_object;
81 static Lisp_Object Qdefun;
83 Lisp_Object Qinteractive_form;
84 static Lisp_Object Qdefalias_fset_function;
86 static void swap_in_symval_forwarding (struct Lisp_Symbol *, struct Lisp_Buffer_Local_Value *);
89 Lisp_Object
90 wrong_type_argument (register Lisp_Object predicate, register Lisp_Object value)
92 /* If VALUE is not even a valid Lisp object, we'd want to abort here
93 where we can get a backtrace showing where it came from. We used
94 to try and do that by checking the tagbits, but nowadays all
95 tagbits are potentially valid. */
96 /* if ((unsigned int) XTYPE (value) >= Lisp_Type_Limit)
97 * emacs_abort (); */
99 xsignal2 (Qwrong_type_argument, predicate, value);
102 void
103 pure_write_error (Lisp_Object obj)
105 xsignal2 (Qerror, build_string ("Attempt to modify read-only object"), obj);
108 void
109 args_out_of_range (Lisp_Object a1, Lisp_Object a2)
111 xsignal2 (Qargs_out_of_range, a1, a2);
114 void
115 args_out_of_range_3 (Lisp_Object a1, Lisp_Object a2, Lisp_Object a3)
117 xsignal3 (Qargs_out_of_range, a1, a2, a3);
121 /* Data type predicates. */
123 DEFUN ("eq", Feq, Seq, 2, 2, 0,
124 doc: /* Return t if the two args are the same Lisp object. */)
125 (Lisp_Object obj1, Lisp_Object obj2)
127 if (EQ (obj1, obj2))
128 return Qt;
129 return Qnil;
132 DEFUN ("null", Fnull, Snull, 1, 1, 0,
133 doc: /* Return t if OBJECT is nil. */)
134 (Lisp_Object object)
136 if (NILP (object))
137 return Qt;
138 return Qnil;
141 DEFUN ("type-of", Ftype_of, Stype_of, 1, 1, 0,
142 doc: /* Return a symbol representing the type of OBJECT.
143 The symbol returned names the object's basic type;
144 for example, (type-of 1) returns `integer'. */)
145 (Lisp_Object object)
147 switch (XTYPE (object))
149 case_Lisp_Int:
150 return Qinteger;
152 case Lisp_Symbol:
153 return Qsymbol;
155 case Lisp_String:
156 return Qstring;
158 case Lisp_Cons:
159 return Qcons;
161 case Lisp_Misc:
162 switch (XMISCTYPE (object))
164 case Lisp_Misc_Marker:
165 return Qmarker;
166 case Lisp_Misc_Overlay:
167 return Qoverlay;
168 case Lisp_Misc_Float:
169 return Qfloat;
171 emacs_abort ();
173 case Lisp_Vectorlike:
174 if (WINDOW_CONFIGURATIONP (object))
175 return Qwindow_configuration;
176 if (PROCESSP (object))
177 return Qprocess;
178 if (WINDOWP (object))
179 return Qwindow;
180 if (SUBRP (object))
181 return Qsubr;
182 if (COMPILEDP (object))
183 return Qcompiled_function;
184 if (BUFFERP (object))
185 return Qbuffer;
186 if (CHAR_TABLE_P (object))
187 return Qchar_table;
188 if (BOOL_VECTOR_P (object))
189 return Qbool_vector;
190 if (FRAMEP (object))
191 return Qframe;
192 if (HASH_TABLE_P (object))
193 return Qhash_table;
194 if (FONT_SPEC_P (object))
195 return Qfont_spec;
196 if (FONT_ENTITY_P (object))
197 return Qfont_entity;
198 if (FONT_OBJECT_P (object))
199 return Qfont_object;
200 return Qvector;
202 case Lisp_Float:
203 return Qfloat;
205 default:
206 emacs_abort ();
210 DEFUN ("consp", Fconsp, Sconsp, 1, 1, 0,
211 doc: /* Return t if OBJECT is a cons cell. */)
212 (Lisp_Object object)
214 if (CONSP (object))
215 return Qt;
216 return Qnil;
219 DEFUN ("atom", Fatom, Satom, 1, 1, 0,
220 doc: /* Return t if OBJECT is not a cons cell. This includes nil. */)
221 (Lisp_Object object)
223 if (CONSP (object))
224 return Qnil;
225 return Qt;
228 DEFUN ("listp", Flistp, Slistp, 1, 1, 0,
229 doc: /* Return t if OBJECT is a list, that is, a cons cell or nil.
230 Otherwise, return nil. */)
231 (Lisp_Object object)
233 if (CONSP (object) || NILP (object))
234 return Qt;
235 return Qnil;
238 DEFUN ("nlistp", Fnlistp, Snlistp, 1, 1, 0,
239 doc: /* Return t if OBJECT is not a list. Lists include nil. */)
240 (Lisp_Object object)
242 if (CONSP (object) || NILP (object))
243 return Qnil;
244 return Qt;
247 DEFUN ("symbolp", Fsymbolp, Ssymbolp, 1, 1, 0,
248 doc: /* Return t if OBJECT is a symbol. */)
249 (Lisp_Object object)
251 if (SYMBOLP (object))
252 return Qt;
253 return Qnil;
256 /* Define this in C to avoid unnecessarily consing up the symbol
257 name. */
258 DEFUN ("keywordp", Fkeywordp, Skeywordp, 1, 1, 0,
259 doc: /* Return t if OBJECT is a keyword.
260 This means that it is a symbol with a print name beginning with `:'
261 interned in the initial obarray. */)
262 (Lisp_Object object)
264 if (SYMBOLP (object)
265 && SREF (SYMBOL_NAME (object), 0) == ':'
266 && SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P (object))
267 return Qt;
268 return Qnil;
271 DEFUN ("vectorp", Fvectorp, Svectorp, 1, 1, 0,
272 doc: /* Return t if OBJECT is a vector. */)
273 (Lisp_Object object)
275 if (VECTORP (object))
276 return Qt;
277 return Qnil;
280 DEFUN ("stringp", Fstringp, Sstringp, 1, 1, 0,
281 doc: /* Return t if OBJECT is a string. */)
282 (Lisp_Object object)
284 if (STRINGP (object))
285 return Qt;
286 return Qnil;
289 DEFUN ("multibyte-string-p", Fmultibyte_string_p, Smultibyte_string_p,
290 1, 1, 0,
291 doc: /* Return t if OBJECT is a multibyte string. */)
292 (Lisp_Object object)
294 if (STRINGP (object) && STRING_MULTIBYTE (object))
295 return Qt;
296 return Qnil;
299 DEFUN ("char-table-p", Fchar_table_p, Schar_table_p, 1, 1, 0,
300 doc: /* Return t if OBJECT is a char-table. */)
301 (Lisp_Object object)
303 if (CHAR_TABLE_P (object))
304 return Qt;
305 return Qnil;
308 DEFUN ("vector-or-char-table-p", Fvector_or_char_table_p,
309 Svector_or_char_table_p, 1, 1, 0,
310 doc: /* Return t if OBJECT is a char-table or vector. */)
311 (Lisp_Object object)
313 if (VECTORP (object) || CHAR_TABLE_P (object))
314 return Qt;
315 return Qnil;
318 DEFUN ("bool-vector-p", Fbool_vector_p, Sbool_vector_p, 1, 1, 0,
319 doc: /* Return t if OBJECT is a bool-vector. */)
320 (Lisp_Object object)
322 if (BOOL_VECTOR_P (object))
323 return Qt;
324 return Qnil;
327 DEFUN ("arrayp", Farrayp, Sarrayp, 1, 1, 0,
328 doc: /* Return t if OBJECT is an array (string or vector). */)
329 (Lisp_Object object)
331 if (ARRAYP (object))
332 return Qt;
333 return Qnil;
336 DEFUN ("sequencep", Fsequencep, Ssequencep, 1, 1, 0,
337 doc: /* Return t if OBJECT is a sequence (list or array). */)
338 (register Lisp_Object object)
340 if (CONSP (object) || NILP (object) || ARRAYP (object))
341 return Qt;
342 return Qnil;
345 DEFUN ("bufferp", Fbufferp, Sbufferp, 1, 1, 0,
346 doc: /* Return t if OBJECT is an editor buffer. */)
347 (Lisp_Object object)
349 if (BUFFERP (object))
350 return Qt;
351 return Qnil;
354 DEFUN ("markerp", Fmarkerp, Smarkerp, 1, 1, 0,
355 doc: /* Return t if OBJECT is a marker (editor pointer). */)
356 (Lisp_Object object)
358 if (MARKERP (object))
359 return Qt;
360 return Qnil;
363 DEFUN ("subrp", Fsubrp, Ssubrp, 1, 1, 0,
364 doc: /* Return t if OBJECT is a built-in function. */)
365 (Lisp_Object object)
367 if (SUBRP (object))
368 return Qt;
369 return Qnil;
372 DEFUN ("byte-code-function-p", Fbyte_code_function_p, Sbyte_code_function_p,
373 1, 1, 0,
374 doc: /* Return t if OBJECT is a byte-compiled function object. */)
375 (Lisp_Object object)
377 if (COMPILEDP (object))
378 return Qt;
379 return Qnil;
382 DEFUN ("char-or-string-p", Fchar_or_string_p, Schar_or_string_p, 1, 1, 0,
383 doc: /* Return t if OBJECT is a character or a string. */)
384 (register Lisp_Object object)
386 if (CHARACTERP (object) || STRINGP (object))
387 return Qt;
388 return Qnil;
391 DEFUN ("integerp", Fintegerp, Sintegerp, 1, 1, 0,
392 doc: /* Return t if OBJECT is an integer. */)
393 (Lisp_Object object)
395 if (INTEGERP (object))
396 return Qt;
397 return Qnil;
400 DEFUN ("integer-or-marker-p", Finteger_or_marker_p, Sinteger_or_marker_p, 1, 1, 0,
401 doc: /* Return t if OBJECT is an integer or a marker (editor pointer). */)
402 (register Lisp_Object object)
404 if (MARKERP (object) || INTEGERP (object))
405 return Qt;
406 return Qnil;
409 DEFUN ("natnump", Fnatnump, Snatnump, 1, 1, 0,
410 doc: /* Return t if OBJECT is a nonnegative integer. */)
411 (Lisp_Object object)
413 if (NATNUMP (object))
414 return Qt;
415 return Qnil;
418 DEFUN ("numberp", Fnumberp, Snumberp, 1, 1, 0,
419 doc: /* Return t if OBJECT is a number (floating point or integer). */)
420 (Lisp_Object object)
422 if (NUMBERP (object))
423 return Qt;
424 else
425 return Qnil;
428 DEFUN ("number-or-marker-p", Fnumber_or_marker_p,
429 Snumber_or_marker_p, 1, 1, 0,
430 doc: /* Return t if OBJECT is a number or a marker. */)
431 (Lisp_Object object)
433 if (NUMBERP (object) || MARKERP (object))
434 return Qt;
435 return Qnil;
438 DEFUN ("floatp", Ffloatp, Sfloatp, 1, 1, 0,
439 doc: /* Return t if OBJECT is a floating point number. */)
440 (Lisp_Object object)
442 if (FLOATP (object))
443 return Qt;
444 return Qnil;
448 /* Extract and set components of lists. */
450 DEFUN ("car", Fcar, Scar, 1, 1, 0,
451 doc: /* Return the car of LIST. If arg is nil, return nil.
452 Error if arg is not nil and not a cons cell. See also `car-safe'.
454 See Info node `(elisp)Cons Cells' for a discussion of related basic
455 Lisp concepts such as car, cdr, cons cell and list. */)
456 (register Lisp_Object list)
458 return CAR (list);
461 DEFUN ("car-safe", Fcar_safe, Scar_safe, 1, 1, 0,
462 doc: /* Return the car of OBJECT if it is a cons cell, or else nil. */)
463 (Lisp_Object object)
465 return CAR_SAFE (object);
468 DEFUN ("cdr", Fcdr, Scdr, 1, 1, 0,
469 doc: /* Return the cdr of LIST. If arg is nil, return nil.
470 Error if arg is not nil and not a cons cell. See also `cdr-safe'.
472 See Info node `(elisp)Cons Cells' for a discussion of related basic
473 Lisp concepts such as cdr, car, cons cell and list. */)
474 (register Lisp_Object list)
476 return CDR (list);
479 DEFUN ("cdr-safe", Fcdr_safe, Scdr_safe, 1, 1, 0,
480 doc: /* Return the cdr of OBJECT if it is a cons cell, or else nil. */)
481 (Lisp_Object object)
483 return CDR_SAFE (object);
486 DEFUN ("setcar", Fsetcar, Ssetcar, 2, 2, 0,
487 doc: /* Set the car of CELL to be NEWCAR. Returns NEWCAR. */)
488 (register Lisp_Object cell, Lisp_Object newcar)
490 CHECK_CONS (cell);
491 CHECK_IMPURE (cell);
492 XSETCAR (cell, newcar);
493 return newcar;
496 DEFUN ("setcdr", Fsetcdr, Ssetcdr, 2, 2, 0,
497 doc: /* Set the cdr of CELL to be NEWCDR. Returns NEWCDR. */)
498 (register Lisp_Object cell, Lisp_Object newcdr)
500 CHECK_CONS (cell);
501 CHECK_IMPURE (cell);
502 XSETCDR (cell, newcdr);
503 return newcdr;
506 /* Extract and set components of symbols. */
508 DEFUN ("boundp", Fboundp, Sboundp, 1, 1, 0,
509 doc: /* Return t if SYMBOL's value is not void.
510 Note that if `lexical-binding' is in effect, this refers to the
511 global value outside of any lexical scope. */)
512 (register Lisp_Object symbol)
514 Lisp_Object valcontents;
515 struct Lisp_Symbol *sym;
516 CHECK_SYMBOL (symbol);
517 sym = XSYMBOL (symbol);
519 start:
520 switch (sym->redirect)
522 case SYMBOL_PLAINVAL: valcontents = SYMBOL_VAL (sym); break;
523 case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start;
524 case SYMBOL_LOCALIZED:
526 struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (sym);
527 if (blv->fwd)
528 /* In set_internal, we un-forward vars when their value is
529 set to Qunbound. */
530 return Qt;
531 else
533 swap_in_symval_forwarding (sym, blv);
534 valcontents = blv_value (blv);
536 break;
538 case SYMBOL_FORWARDED:
539 /* In set_internal, we un-forward vars when their value is
540 set to Qunbound. */
541 return Qt;
542 default: emacs_abort ();
545 return (EQ (valcontents, Qunbound) ? Qnil : Qt);
548 /* FIXME: Make it an alias for function-symbol! */
549 DEFUN ("fboundp", Ffboundp, Sfboundp, 1, 1, 0,
550 doc: /* Return t if SYMBOL's function definition is not void. */)
551 (register Lisp_Object symbol)
553 CHECK_SYMBOL (symbol);
554 return NILP (XSYMBOL (symbol)->function) ? Qnil : Qt;
557 DEFUN ("makunbound", Fmakunbound, Smakunbound, 1, 1, 0,
558 doc: /* Make SYMBOL's value be void.
559 Return SYMBOL. */)
560 (register Lisp_Object symbol)
562 CHECK_SYMBOL (symbol);
563 if (SYMBOL_CONSTANT_P (symbol))
564 xsignal1 (Qsetting_constant, symbol);
565 Fset (symbol, Qunbound);
566 return symbol;
569 DEFUN ("fmakunbound", Ffmakunbound, Sfmakunbound, 1, 1, 0,
570 doc: /* Make SYMBOL's function definition be nil.
571 Return SYMBOL. */)
572 (register Lisp_Object symbol)
574 CHECK_SYMBOL (symbol);
575 if (NILP (symbol) || EQ (symbol, Qt))
576 xsignal1 (Qsetting_constant, symbol);
577 set_symbol_function (symbol, Qnil);
578 return symbol;
581 DEFUN ("symbol-function", Fsymbol_function, Ssymbol_function, 1, 1, 0,
582 doc: /* Return SYMBOL's function definition. Error if that is void. */)
583 (register Lisp_Object symbol)
585 CHECK_SYMBOL (symbol);
586 return XSYMBOL (symbol)->function;
589 DEFUN ("symbol-plist", Fsymbol_plist, Ssymbol_plist, 1, 1, 0,
590 doc: /* Return SYMBOL's property list. */)
591 (register Lisp_Object symbol)
593 CHECK_SYMBOL (symbol);
594 return XSYMBOL (symbol)->plist;
597 DEFUN ("symbol-name", Fsymbol_name, Ssymbol_name, 1, 1, 0,
598 doc: /* Return SYMBOL's name, a string. */)
599 (register Lisp_Object symbol)
601 register Lisp_Object name;
603 CHECK_SYMBOL (symbol);
604 name = SYMBOL_NAME (symbol);
605 return name;
608 DEFUN ("fset", Ffset, Sfset, 2, 2, 0,
609 doc: /* Set SYMBOL's function definition to DEFINITION, and return DEFINITION. */)
610 (register Lisp_Object symbol, Lisp_Object definition)
612 register Lisp_Object function;
613 CHECK_SYMBOL (symbol);
615 function = XSYMBOL (symbol)->function;
617 if (!NILP (Vautoload_queue) && !NILP (function))
618 Vautoload_queue = Fcons (Fcons (symbol, function), Vautoload_queue);
620 if (AUTOLOADP (function))
621 Fput (symbol, Qautoload, XCDR (function));
623 set_symbol_function (symbol, definition);
625 return definition;
628 DEFUN ("defalias", Fdefalias, Sdefalias, 2, 3, 0,
629 doc: /* Set SYMBOL's function definition to DEFINITION.
630 Associates the function with the current load file, if any.
631 The optional third argument DOCSTRING specifies the documentation string
632 for SYMBOL; if it is omitted or nil, SYMBOL uses the documentation string
633 determined by DEFINITION.
634 The return value is undefined. */)
635 (register Lisp_Object symbol, Lisp_Object definition, Lisp_Object docstring)
637 CHECK_SYMBOL (symbol);
638 if (!NILP (Vpurify_flag)
639 /* If `definition' is a keymap, immutable (and copying) is wrong. */
640 && !KEYMAPP (definition))
641 definition = Fpurecopy (definition);
644 bool autoload = AUTOLOADP (definition);
645 if (NILP (Vpurify_flag) || !autoload)
646 { /* Only add autoload entries after dumping, because the ones before are
647 not useful and else we get loads of them from the loaddefs.el. */
649 if (AUTOLOADP (XSYMBOL (symbol)->function))
650 /* Remember that the function was already an autoload. */
651 LOADHIST_ATTACH (Fcons (Qt, symbol));
652 LOADHIST_ATTACH (Fcons (autoload ? Qautoload : Qdefun, symbol));
656 { /* Handle automatic advice activation. */
657 Lisp_Object hook = Fget (symbol, Qdefalias_fset_function);
658 if (!NILP (hook))
659 call2 (hook, symbol, definition);
660 else
661 Ffset (symbol, definition);
664 if (!NILP (docstring))
665 Fput (symbol, Qfunction_documentation, docstring);
666 /* We used to return `definition', but now that `defun' and `defmacro' expand
667 to a call to `defalias', we return `symbol' for backward compatibility
668 (bug#11686). */
669 return symbol;
672 DEFUN ("setplist", Fsetplist, Ssetplist, 2, 2, 0,
673 doc: /* Set SYMBOL's property list to NEWPLIST, and return NEWPLIST. */)
674 (register Lisp_Object symbol, Lisp_Object newplist)
676 CHECK_SYMBOL (symbol);
677 set_symbol_plist (symbol, newplist);
678 return newplist;
681 DEFUN ("subr-arity", Fsubr_arity, Ssubr_arity, 1, 1, 0,
682 doc: /* Return minimum and maximum number of args allowed for SUBR.
683 SUBR must be a built-in function.
684 The returned value is a pair (MIN . MAX). MIN is the minimum number
685 of args. MAX is the maximum number or the symbol `many', for a
686 function with `&rest' args, or `unevalled' for a special form. */)
687 (Lisp_Object subr)
689 short minargs, maxargs;
690 CHECK_SUBR (subr);
691 minargs = XSUBR (subr)->min_args;
692 maxargs = XSUBR (subr)->max_args;
693 return Fcons (make_number (minargs),
694 maxargs == MANY ? Qmany
695 : maxargs == UNEVALLED ? Qunevalled
696 : make_number (maxargs));
699 DEFUN ("subr-name", Fsubr_name, Ssubr_name, 1, 1, 0,
700 doc: /* Return name of subroutine SUBR.
701 SUBR must be a built-in function. */)
702 (Lisp_Object subr)
704 const char *name;
705 CHECK_SUBR (subr);
706 name = XSUBR (subr)->symbol_name;
707 return build_string (name);
710 DEFUN ("interactive-form", Finteractive_form, Sinteractive_form, 1, 1, 0,
711 doc: /* Return the interactive form of CMD or nil if none.
712 If CMD is not a command, the return value is nil.
713 Value, if non-nil, is a list \(interactive SPEC). */)
714 (Lisp_Object cmd)
716 Lisp_Object fun = indirect_function (cmd); /* Check cycles. */
718 if (NILP (fun))
719 return Qnil;
721 /* Use an `interactive-form' property if present, analogous to the
722 function-documentation property. */
723 fun = cmd;
724 while (SYMBOLP (fun))
726 Lisp_Object tmp = Fget (fun, Qinteractive_form);
727 if (!NILP (tmp))
728 return tmp;
729 else
730 fun = Fsymbol_function (fun);
733 if (SUBRP (fun))
735 const char *spec = XSUBR (fun)->intspec;
736 if (spec)
737 return list2 (Qinteractive,
738 (*spec != '(') ? build_string (spec) :
739 Fcar (Fread_from_string (build_string (spec), Qnil, Qnil)));
741 else if (COMPILEDP (fun))
743 if ((ASIZE (fun) & PSEUDOVECTOR_SIZE_MASK) > COMPILED_INTERACTIVE)
744 return list2 (Qinteractive, AREF (fun, COMPILED_INTERACTIVE));
746 else if (AUTOLOADP (fun))
747 return Finteractive_form (Fautoload_do_load (fun, cmd, Qnil));
748 else if (CONSP (fun))
750 Lisp_Object funcar = XCAR (fun);
751 if (EQ (funcar, Qclosure))
752 return Fassq (Qinteractive, Fcdr (Fcdr (XCDR (fun))));
753 else if (EQ (funcar, Qlambda))
754 return Fassq (Qinteractive, Fcdr (XCDR (fun)));
756 return Qnil;
760 /***********************************************************************
761 Getting and Setting Values of Symbols
762 ***********************************************************************/
764 /* Return the symbol holding SYMBOL's value. Signal
765 `cyclic-variable-indirection' if SYMBOL's chain of variable
766 indirections contains a loop. */
768 struct Lisp_Symbol *
769 indirect_variable (struct Lisp_Symbol *symbol)
771 struct Lisp_Symbol *tortoise, *hare;
773 hare = tortoise = symbol;
775 while (hare->redirect == SYMBOL_VARALIAS)
777 hare = SYMBOL_ALIAS (hare);
778 if (hare->redirect != SYMBOL_VARALIAS)
779 break;
781 hare = SYMBOL_ALIAS (hare);
782 tortoise = SYMBOL_ALIAS (tortoise);
784 if (hare == tortoise)
786 Lisp_Object tem;
787 XSETSYMBOL (tem, symbol);
788 xsignal1 (Qcyclic_variable_indirection, tem);
792 return hare;
796 DEFUN ("indirect-variable", Findirect_variable, Sindirect_variable, 1, 1, 0,
797 doc: /* Return the variable at the end of OBJECT's variable chain.
798 If OBJECT is a symbol, follow its variable indirections (if any), and
799 return the variable at the end of the chain of aliases. See Info node
800 `(elisp)Variable Aliases'.
802 If OBJECT is not a symbol, just return it. If there is a loop in the
803 chain of aliases, signal a `cyclic-variable-indirection' error. */)
804 (Lisp_Object object)
806 if (SYMBOLP (object))
808 struct Lisp_Symbol *sym = indirect_variable (XSYMBOL (object));
809 XSETSYMBOL (object, sym);
811 return object;
815 /* Given the raw contents of a symbol value cell,
816 return the Lisp value of the symbol.
817 This does not handle buffer-local variables; use
818 swap_in_symval_forwarding for that. */
820 Lisp_Object
821 do_symval_forwarding (register union Lisp_Fwd *valcontents)
823 register Lisp_Object val;
824 switch (XFWDTYPE (valcontents))
826 case Lisp_Fwd_Int:
827 XSETINT (val, *XINTFWD (valcontents)->intvar);
828 return val;
830 case Lisp_Fwd_Bool:
831 return (*XBOOLFWD (valcontents)->boolvar ? Qt : Qnil);
833 case Lisp_Fwd_Obj:
834 return *XOBJFWD (valcontents)->objvar;
836 case Lisp_Fwd_Buffer_Obj:
837 return per_buffer_value (current_buffer,
838 XBUFFER_OBJFWD (valcontents)->offset);
840 case Lisp_Fwd_Kboard_Obj:
841 /* We used to simply use current_kboard here, but from Lisp
842 code, its value is often unexpected. It seems nicer to
843 allow constructions like this to work as intuitively expected:
845 (with-selected-frame frame
846 (define-key local-function-map "\eOP" [f1]))
848 On the other hand, this affects the semantics of
849 last-command and real-last-command, and people may rely on
850 that. I took a quick look at the Lisp codebase, and I
851 don't think anything will break. --lorentey */
852 return *(Lisp_Object *)(XKBOARD_OBJFWD (valcontents)->offset
853 + (char *)FRAME_KBOARD (SELECTED_FRAME ()));
854 default: emacs_abort ();
858 /* Store NEWVAL into SYMBOL, where VALCONTENTS is found in the value cell
859 of SYMBOL. If SYMBOL is buffer-local, VALCONTENTS should be the
860 buffer-independent contents of the value cell: forwarded just one
861 step past the buffer-localness.
863 BUF non-zero means set the value in buffer BUF instead of the
864 current buffer. This only plays a role for per-buffer variables. */
866 static void
867 store_symval_forwarding (union Lisp_Fwd *valcontents, register Lisp_Object newval, struct buffer *buf)
869 switch (XFWDTYPE (valcontents))
871 case Lisp_Fwd_Int:
872 CHECK_NUMBER (newval);
873 *XINTFWD (valcontents)->intvar = XINT (newval);
874 break;
876 case Lisp_Fwd_Bool:
877 *XBOOLFWD (valcontents)->boolvar = !NILP (newval);
878 break;
880 case Lisp_Fwd_Obj:
881 *XOBJFWD (valcontents)->objvar = newval;
883 /* If this variable is a default for something stored
884 in the buffer itself, such as default-fill-column,
885 find the buffers that don't have local values for it
886 and update them. */
887 if (XOBJFWD (valcontents)->objvar > (Lisp_Object *) &buffer_defaults
888 && XOBJFWD (valcontents)->objvar < (Lisp_Object *) (&buffer_defaults + 1))
890 int offset = ((char *) XOBJFWD (valcontents)->objvar
891 - (char *) &buffer_defaults);
892 int idx = PER_BUFFER_IDX (offset);
894 Lisp_Object tail;
896 if (idx <= 0)
897 break;
899 for (tail = Vbuffer_alist; CONSP (tail); tail = XCDR (tail))
901 Lisp_Object lbuf;
902 struct buffer *b;
904 lbuf = Fcdr (XCAR (tail));
905 if (!BUFFERP (lbuf)) continue;
906 b = XBUFFER (lbuf);
908 if (! PER_BUFFER_VALUE_P (b, idx))
909 set_per_buffer_value (b, offset, newval);
912 break;
914 case Lisp_Fwd_Buffer_Obj:
916 int offset = XBUFFER_OBJFWD (valcontents)->offset;
917 Lisp_Object predicate = XBUFFER_OBJFWD (valcontents)->predicate;
919 if (!NILP (predicate) && !NILP (newval)
920 && NILP (call1 (predicate, newval)))
921 wrong_type_argument (predicate, newval);
923 if (buf == NULL)
924 buf = current_buffer;
925 set_per_buffer_value (buf, offset, newval);
927 break;
929 case Lisp_Fwd_Kboard_Obj:
931 char *base = (char *) FRAME_KBOARD (SELECTED_FRAME ());
932 char *p = base + XKBOARD_OBJFWD (valcontents)->offset;
933 *(Lisp_Object *) p = newval;
935 break;
937 default:
938 emacs_abort (); /* goto def; */
942 /* Set up SYMBOL to refer to its global binding. This makes it safe
943 to alter the status of other bindings. BEWARE: this may be called
944 during the mark phase of GC, where we assume that Lisp_Object slots
945 of BLV are marked after this function has changed them. */
947 void
948 swap_in_global_binding (struct Lisp_Symbol *symbol)
950 struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (symbol);
952 /* Unload the previously loaded binding. */
953 if (blv->fwd)
954 set_blv_value (blv, do_symval_forwarding (blv->fwd));
956 /* Select the global binding in the symbol. */
957 set_blv_valcell (blv, blv->defcell);
958 if (blv->fwd)
959 store_symval_forwarding (blv->fwd, XCDR (blv->defcell), NULL);
961 /* Indicate that the global binding is set up now. */
962 set_blv_where (blv, Qnil);
963 set_blv_found (blv, 0);
966 /* Set up the buffer-local symbol SYMBOL for validity in the current buffer.
967 VALCONTENTS is the contents of its value cell,
968 which points to a struct Lisp_Buffer_Local_Value.
970 Return the value forwarded one step past the buffer-local stage.
971 This could be another forwarding pointer. */
973 static void
974 swap_in_symval_forwarding (struct Lisp_Symbol *symbol, struct Lisp_Buffer_Local_Value *blv)
976 register Lisp_Object tem1;
978 eassert (blv == SYMBOL_BLV (symbol));
980 tem1 = blv->where;
982 if (NILP (tem1)
983 || (blv->frame_local
984 ? !EQ (selected_frame, tem1)
985 : current_buffer != XBUFFER (tem1)))
988 /* Unload the previously loaded binding. */
989 tem1 = blv->valcell;
990 if (blv->fwd)
991 set_blv_value (blv, do_symval_forwarding (blv->fwd));
992 /* Choose the new binding. */
994 Lisp_Object var;
995 XSETSYMBOL (var, symbol);
996 if (blv->frame_local)
998 tem1 = assq_no_quit (var, XFRAME (selected_frame)->param_alist);
999 set_blv_where (blv, selected_frame);
1001 else
1003 tem1 = assq_no_quit (var, BVAR (current_buffer, local_var_alist));
1004 set_blv_where (blv, Fcurrent_buffer ());
1007 if (!(blv->found = !NILP (tem1)))
1008 tem1 = blv->defcell;
1010 /* Load the new binding. */
1011 set_blv_valcell (blv, tem1);
1012 if (blv->fwd)
1013 store_symval_forwarding (blv->fwd, blv_value (blv), NULL);
1017 /* Find the value of a symbol, returning Qunbound if it's not bound.
1018 This is helpful for code which just wants to get a variable's value
1019 if it has one, without signaling an error.
1020 Note that it must not be possible to quit
1021 within this function. Great care is required for this. */
1023 Lisp_Object
1024 find_symbol_value (Lisp_Object symbol)
1026 struct Lisp_Symbol *sym;
1028 CHECK_SYMBOL (symbol);
1029 sym = XSYMBOL (symbol);
1031 start:
1032 switch (sym->redirect)
1034 case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start;
1035 case SYMBOL_PLAINVAL: return SYMBOL_VAL (sym);
1036 case SYMBOL_LOCALIZED:
1038 struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (sym);
1039 swap_in_symval_forwarding (sym, blv);
1040 return blv->fwd ? do_symval_forwarding (blv->fwd) : blv_value (blv);
1042 /* FALLTHROUGH */
1043 case SYMBOL_FORWARDED:
1044 return do_symval_forwarding (SYMBOL_FWD (sym));
1045 default: emacs_abort ();
1049 DEFUN ("symbol-value", Fsymbol_value, Ssymbol_value, 1, 1, 0,
1050 doc: /* Return SYMBOL's value. Error if that is void.
1051 Note that if `lexical-binding' is in effect, this returns the
1052 global value outside of any lexical scope. */)
1053 (Lisp_Object symbol)
1055 Lisp_Object val;
1057 val = find_symbol_value (symbol);
1058 if (!EQ (val, Qunbound))
1059 return val;
1061 xsignal1 (Qvoid_variable, symbol);
1064 DEFUN ("set", Fset, Sset, 2, 2, 0,
1065 doc: /* Set SYMBOL's value to NEWVAL, and return NEWVAL. */)
1066 (register Lisp_Object symbol, Lisp_Object newval)
1068 set_internal (symbol, newval, Qnil, 0);
1069 return newval;
1072 /* Store the value NEWVAL into SYMBOL.
1073 If buffer/frame-locality is an issue, WHERE specifies which context to use.
1074 (nil stands for the current buffer/frame).
1076 If BINDFLAG is false, then if this symbol is supposed to become
1077 local in every buffer where it is set, then we make it local.
1078 If BINDFLAG is true, we don't do that. */
1080 void
1081 set_internal (Lisp_Object symbol, Lisp_Object newval, Lisp_Object where,
1082 bool bindflag)
1084 bool voide = EQ (newval, Qunbound);
1085 struct Lisp_Symbol *sym;
1086 Lisp_Object tem1;
1088 /* If restoring in a dead buffer, do nothing. */
1089 /* if (BUFFERP (where) && NILP (XBUFFER (where)->name))
1090 return; */
1092 CHECK_SYMBOL (symbol);
1093 if (SYMBOL_CONSTANT_P (symbol))
1095 if (NILP (Fkeywordp (symbol))
1096 || !EQ (newval, Fsymbol_value (symbol)))
1097 xsignal1 (Qsetting_constant, symbol);
1098 else
1099 /* Allow setting keywords to their own value. */
1100 return;
1103 sym = XSYMBOL (symbol);
1105 start:
1106 switch (sym->redirect)
1108 case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start;
1109 case SYMBOL_PLAINVAL: SET_SYMBOL_VAL (sym , newval); return;
1110 case SYMBOL_LOCALIZED:
1112 struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (sym);
1113 if (NILP (where))
1115 if (blv->frame_local)
1116 where = selected_frame;
1117 else
1118 XSETBUFFER (where, current_buffer);
1120 /* If the current buffer is not the buffer whose binding is
1121 loaded, or if there may be frame-local bindings and the frame
1122 isn't the right one, or if it's a Lisp_Buffer_Local_Value and
1123 the default binding is loaded, the loaded binding may be the
1124 wrong one. */
1125 if (!EQ (blv->where, where)
1126 /* Also unload a global binding (if the var is local_if_set). */
1127 || (EQ (blv->valcell, blv->defcell)))
1129 /* The currently loaded binding is not necessarily valid.
1130 We need to unload it, and choose a new binding. */
1132 /* Write out `realvalue' to the old loaded binding. */
1133 if (blv->fwd)
1134 set_blv_value (blv, do_symval_forwarding (blv->fwd));
1136 /* Find the new binding. */
1137 XSETSYMBOL (symbol, sym); /* May have changed via aliasing. */
1138 tem1 = Fassq (symbol,
1139 (blv->frame_local
1140 ? XFRAME (where)->param_alist
1141 : BVAR (XBUFFER (where), local_var_alist)));
1142 set_blv_where (blv, where);
1143 blv->found = 1;
1145 if (NILP (tem1))
1147 /* This buffer still sees the default value. */
1149 /* If the variable is a Lisp_Some_Buffer_Local_Value,
1150 or if this is `let' rather than `set',
1151 make CURRENT-ALIST-ELEMENT point to itself,
1152 indicating that we're seeing the default value.
1153 Likewise if the variable has been let-bound
1154 in the current buffer. */
1155 if (bindflag || !blv->local_if_set
1156 || let_shadows_buffer_binding_p (sym))
1158 blv->found = 0;
1159 tem1 = blv->defcell;
1161 /* If it's a local_if_set, being set not bound,
1162 and we're not within a let that was made for this buffer,
1163 create a new buffer-local binding for the variable.
1164 That means, give this buffer a new assoc for a local value
1165 and load that binding. */
1166 else
1168 /* local_if_set is only supported for buffer-local
1169 bindings, not for frame-local bindings. */
1170 eassert (!blv->frame_local);
1171 tem1 = Fcons (symbol, XCDR (blv->defcell));
1172 bset_local_var_alist
1173 (XBUFFER (where),
1174 Fcons (tem1, BVAR (XBUFFER (where), local_var_alist)));
1178 /* Record which binding is now loaded. */
1179 set_blv_valcell (blv, tem1);
1182 /* Store the new value in the cons cell. */
1183 set_blv_value (blv, newval);
1185 if (blv->fwd)
1187 if (voide)
1188 /* If storing void (making the symbol void), forward only through
1189 buffer-local indicator, not through Lisp_Objfwd, etc. */
1190 blv->fwd = NULL;
1191 else
1192 store_symval_forwarding (blv->fwd, newval,
1193 BUFFERP (where)
1194 ? XBUFFER (where) : current_buffer);
1196 break;
1198 case SYMBOL_FORWARDED:
1200 struct buffer *buf
1201 = BUFFERP (where) ? XBUFFER (where) : current_buffer;
1202 union Lisp_Fwd *innercontents = SYMBOL_FWD (sym);
1203 if (BUFFER_OBJFWDP (innercontents))
1205 int offset = XBUFFER_OBJFWD (innercontents)->offset;
1206 int idx = PER_BUFFER_IDX (offset);
1207 if (idx > 0
1208 && !bindflag
1209 && !let_shadows_buffer_binding_p (sym))
1210 SET_PER_BUFFER_VALUE_P (buf, idx, 1);
1213 if (voide)
1214 { /* If storing void (making the symbol void), forward only through
1215 buffer-local indicator, not through Lisp_Objfwd, etc. */
1216 sym->redirect = SYMBOL_PLAINVAL;
1217 SET_SYMBOL_VAL (sym, newval);
1219 else
1220 store_symval_forwarding (/* sym, */ innercontents, newval, buf);
1221 break;
1223 default: emacs_abort ();
1225 return;
1228 /* Access or set a buffer-local symbol's default value. */
1230 /* Return the default value of SYMBOL, but don't check for voidness.
1231 Return Qunbound if it is void. */
1233 static Lisp_Object
1234 default_value (Lisp_Object symbol)
1236 struct Lisp_Symbol *sym;
1238 CHECK_SYMBOL (symbol);
1239 sym = XSYMBOL (symbol);
1241 start:
1242 switch (sym->redirect)
1244 case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start;
1245 case SYMBOL_PLAINVAL: return SYMBOL_VAL (sym);
1246 case SYMBOL_LOCALIZED:
1248 /* If var is set up for a buffer that lacks a local value for it,
1249 the current value is nominally the default value.
1250 But the `realvalue' slot may be more up to date, since
1251 ordinary setq stores just that slot. So use that. */
1252 struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (sym);
1253 if (blv->fwd && EQ (blv->valcell, blv->defcell))
1254 return do_symval_forwarding (blv->fwd);
1255 else
1256 return XCDR (blv->defcell);
1258 case SYMBOL_FORWARDED:
1260 union Lisp_Fwd *valcontents = SYMBOL_FWD (sym);
1262 /* For a built-in buffer-local variable, get the default value
1263 rather than letting do_symval_forwarding get the current value. */
1264 if (BUFFER_OBJFWDP (valcontents))
1266 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1267 if (PER_BUFFER_IDX (offset) != 0)
1268 return per_buffer_default (offset);
1271 /* For other variables, get the current value. */
1272 return do_symval_forwarding (valcontents);
1274 default: emacs_abort ();
1278 DEFUN ("default-boundp", Fdefault_boundp, Sdefault_boundp, 1, 1, 0,
1279 doc: /* Return t if SYMBOL has a non-void default value.
1280 This is the value that is seen in buffers that do not have their own values
1281 for this variable. */)
1282 (Lisp_Object symbol)
1284 register Lisp_Object value;
1286 value = default_value (symbol);
1287 return (EQ (value, Qunbound) ? Qnil : Qt);
1290 DEFUN ("default-value", Fdefault_value, Sdefault_value, 1, 1, 0,
1291 doc: /* Return SYMBOL's default value.
1292 This is the value that is seen in buffers that do not have their own values
1293 for this variable. The default value is meaningful for variables with
1294 local bindings in certain buffers. */)
1295 (Lisp_Object symbol)
1297 register Lisp_Object value;
1299 value = default_value (symbol);
1300 if (!EQ (value, Qunbound))
1301 return value;
1303 xsignal1 (Qvoid_variable, symbol);
1306 DEFUN ("set-default", Fset_default, Sset_default, 2, 2, 0,
1307 doc: /* Set SYMBOL's default value to VALUE. SYMBOL and VALUE are evaluated.
1308 The default value is seen in buffers that do not have their own values
1309 for this variable. */)
1310 (Lisp_Object symbol, Lisp_Object value)
1312 struct Lisp_Symbol *sym;
1314 CHECK_SYMBOL (symbol);
1315 if (SYMBOL_CONSTANT_P (symbol))
1317 if (NILP (Fkeywordp (symbol))
1318 || !EQ (value, Fdefault_value (symbol)))
1319 xsignal1 (Qsetting_constant, symbol);
1320 else
1321 /* Allow setting keywords to their own value. */
1322 return value;
1324 sym = XSYMBOL (symbol);
1326 start:
1327 switch (sym->redirect)
1329 case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start;
1330 case SYMBOL_PLAINVAL: return Fset (symbol, value);
1331 case SYMBOL_LOCALIZED:
1333 struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (sym);
1335 /* Store new value into the DEFAULT-VALUE slot. */
1336 XSETCDR (blv->defcell, value);
1338 /* If the default binding is now loaded, set the REALVALUE slot too. */
1339 if (blv->fwd && EQ (blv->defcell, blv->valcell))
1340 store_symval_forwarding (blv->fwd, value, NULL);
1341 return value;
1343 case SYMBOL_FORWARDED:
1345 union Lisp_Fwd *valcontents = SYMBOL_FWD (sym);
1347 /* Handle variables like case-fold-search that have special slots
1348 in the buffer.
1349 Make them work apparently like Lisp_Buffer_Local_Value variables. */
1350 if (BUFFER_OBJFWDP (valcontents))
1352 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1353 int idx = PER_BUFFER_IDX (offset);
1355 set_per_buffer_default (offset, value);
1357 /* If this variable is not always local in all buffers,
1358 set it in the buffers that don't nominally have a local value. */
1359 if (idx > 0)
1361 struct buffer *b;
1363 FOR_EACH_BUFFER (b)
1364 if (!PER_BUFFER_VALUE_P (b, idx))
1365 set_per_buffer_value (b, offset, value);
1367 return value;
1369 else
1370 return Fset (symbol, value);
1372 default: emacs_abort ();
1376 DEFUN ("setq-default", Fsetq_default, Ssetq_default, 0, UNEVALLED, 0,
1377 doc: /* Set the default value of variable VAR to VALUE.
1378 VAR, the variable name, is literal (not evaluated);
1379 VALUE is an expression: it is evaluated and its value returned.
1380 The default value of a variable is seen in buffers
1381 that do not have their own values for the variable.
1383 More generally, you can use multiple variables and values, as in
1384 (setq-default VAR VALUE VAR VALUE...)
1385 This sets each VAR's default value to the corresponding VALUE.
1386 The VALUE for the Nth VAR can refer to the new default values
1387 of previous VARs.
1388 usage: (setq-default [VAR VALUE]...) */)
1389 (Lisp_Object args)
1391 register Lisp_Object args_left;
1392 register Lisp_Object val, symbol;
1393 struct gcpro gcpro1;
1395 if (NILP (args))
1396 return Qnil;
1398 args_left = args;
1399 GCPRO1 (args);
1403 val = eval_sub (Fcar (Fcdr (args_left)));
1404 symbol = XCAR (args_left);
1405 Fset_default (symbol, val);
1406 args_left = Fcdr (XCDR (args_left));
1408 while (!NILP (args_left));
1410 UNGCPRO;
1411 return val;
1414 /* Lisp functions for creating and removing buffer-local variables. */
1416 union Lisp_Val_Fwd
1418 Lisp_Object value;
1419 union Lisp_Fwd *fwd;
1422 static struct Lisp_Buffer_Local_Value *
1423 make_blv (struct Lisp_Symbol *sym, bool forwarded,
1424 union Lisp_Val_Fwd valcontents)
1426 struct Lisp_Buffer_Local_Value *blv = xmalloc (sizeof *blv);
1427 Lisp_Object symbol;
1428 Lisp_Object tem;
1430 XSETSYMBOL (symbol, sym);
1431 tem = Fcons (symbol, (forwarded
1432 ? do_symval_forwarding (valcontents.fwd)
1433 : valcontents.value));
1435 /* Buffer_Local_Values cannot have as realval a buffer-local
1436 or keyboard-local forwarding. */
1437 eassert (!(forwarded && BUFFER_OBJFWDP (valcontents.fwd)));
1438 eassert (!(forwarded && KBOARD_OBJFWDP (valcontents.fwd)));
1439 blv->fwd = forwarded ? valcontents.fwd : NULL;
1440 set_blv_where (blv, Qnil);
1441 blv->frame_local = 0;
1442 blv->local_if_set = 0;
1443 set_blv_defcell (blv, tem);
1444 set_blv_valcell (blv, tem);
1445 set_blv_found (blv, 0);
1446 return blv;
1449 DEFUN ("make-variable-buffer-local", Fmake_variable_buffer_local,
1450 Smake_variable_buffer_local, 1, 1, "vMake Variable Buffer Local: ",
1451 doc: /* Make VARIABLE become buffer-local whenever it is set.
1452 At any time, the value for the current buffer is in effect,
1453 unless the variable has never been set in this buffer,
1454 in which case the default value is in effect.
1455 Note that binding the variable with `let', or setting it while
1456 a `let'-style binding made in this buffer is in effect,
1457 does not make the variable buffer-local. Return VARIABLE.
1459 In most cases it is better to use `make-local-variable',
1460 which makes a variable local in just one buffer.
1462 The function `default-value' gets the default value and `set-default' sets it. */)
1463 (register Lisp_Object variable)
1465 struct Lisp_Symbol *sym;
1466 struct Lisp_Buffer_Local_Value *blv = NULL;
1467 union Lisp_Val_Fwd valcontents IF_LINT (= {LISP_INITIALLY_ZERO});
1468 bool forwarded IF_LINT (= 0);
1470 CHECK_SYMBOL (variable);
1471 sym = XSYMBOL (variable);
1473 start:
1474 switch (sym->redirect)
1476 case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start;
1477 case SYMBOL_PLAINVAL:
1478 forwarded = 0; valcontents.value = SYMBOL_VAL (sym);
1479 if (EQ (valcontents.value, Qunbound))
1480 valcontents.value = Qnil;
1481 break;
1482 case SYMBOL_LOCALIZED:
1483 blv = SYMBOL_BLV (sym);
1484 if (blv->frame_local)
1485 error ("Symbol %s may not be buffer-local",
1486 SDATA (SYMBOL_NAME (variable)));
1487 break;
1488 case SYMBOL_FORWARDED:
1489 forwarded = 1; valcontents.fwd = SYMBOL_FWD (sym);
1490 if (KBOARD_OBJFWDP (valcontents.fwd))
1491 error ("Symbol %s may not be buffer-local",
1492 SDATA (SYMBOL_NAME (variable)));
1493 else if (BUFFER_OBJFWDP (valcontents.fwd))
1494 return variable;
1495 break;
1496 default: emacs_abort ();
1499 if (sym->constant)
1500 error ("Symbol %s may not be buffer-local", SDATA (SYMBOL_NAME (variable)));
1502 if (!blv)
1504 blv = make_blv (sym, forwarded, valcontents);
1505 sym->redirect = SYMBOL_LOCALIZED;
1506 SET_SYMBOL_BLV (sym, blv);
1508 Lisp_Object symbol;
1509 XSETSYMBOL (symbol, sym); /* In case `variable' is aliased. */
1510 if (let_shadows_global_binding_p (symbol))
1511 message ("Making %s buffer-local while let-bound!",
1512 SDATA (SYMBOL_NAME (variable)));
1516 blv->local_if_set = 1;
1517 return variable;
1520 DEFUN ("make-local-variable", Fmake_local_variable, Smake_local_variable,
1521 1, 1, "vMake Local Variable: ",
1522 doc: /* Make VARIABLE have a separate value in the current buffer.
1523 Other buffers will continue to share a common default value.
1524 \(The buffer-local value of VARIABLE starts out as the same value
1525 VARIABLE previously had. If VARIABLE was void, it remains void.\)
1526 Return VARIABLE.
1528 If the variable is already arranged to become local when set,
1529 this function causes a local value to exist for this buffer,
1530 just as setting the variable would do.
1532 This function returns VARIABLE, and therefore
1533 (set (make-local-variable 'VARIABLE) VALUE-EXP)
1534 works.
1536 See also `make-variable-buffer-local'.
1538 Do not use `make-local-variable' to make a hook variable buffer-local.
1539 Instead, use `add-hook' and specify t for the LOCAL argument. */)
1540 (Lisp_Object variable)
1542 Lisp_Object tem;
1543 bool forwarded IF_LINT (= 0);
1544 union Lisp_Val_Fwd valcontents IF_LINT (= {LISP_INITIALLY_ZERO});
1545 struct Lisp_Symbol *sym;
1546 struct Lisp_Buffer_Local_Value *blv = NULL;
1548 CHECK_SYMBOL (variable);
1549 sym = XSYMBOL (variable);
1551 start:
1552 switch (sym->redirect)
1554 case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start;
1555 case SYMBOL_PLAINVAL:
1556 forwarded = 0; valcontents.value = SYMBOL_VAL (sym); break;
1557 case SYMBOL_LOCALIZED:
1558 blv = SYMBOL_BLV (sym);
1559 if (blv->frame_local)
1560 error ("Symbol %s may not be buffer-local",
1561 SDATA (SYMBOL_NAME (variable)));
1562 break;
1563 case SYMBOL_FORWARDED:
1564 forwarded = 1; valcontents.fwd = SYMBOL_FWD (sym);
1565 if (KBOARD_OBJFWDP (valcontents.fwd))
1566 error ("Symbol %s may not be buffer-local",
1567 SDATA (SYMBOL_NAME (variable)));
1568 break;
1569 default: emacs_abort ();
1572 if (sym->constant)
1573 error ("Symbol %s may not be buffer-local",
1574 SDATA (SYMBOL_NAME (variable)));
1576 if (blv ? blv->local_if_set
1577 : (forwarded && BUFFER_OBJFWDP (valcontents.fwd)))
1579 tem = Fboundp (variable);
1580 /* Make sure the symbol has a local value in this particular buffer,
1581 by setting it to the same value it already has. */
1582 Fset (variable, (EQ (tem, Qt) ? Fsymbol_value (variable) : Qunbound));
1583 return variable;
1585 if (!blv)
1587 blv = make_blv (sym, forwarded, valcontents);
1588 sym->redirect = SYMBOL_LOCALIZED;
1589 SET_SYMBOL_BLV (sym, blv);
1591 Lisp_Object symbol;
1592 XSETSYMBOL (symbol, sym); /* In case `variable' is aliased. */
1593 if (let_shadows_global_binding_p (symbol))
1594 message ("Making %s local to %s while let-bound!",
1595 SDATA (SYMBOL_NAME (variable)),
1596 SDATA (BVAR (current_buffer, name)));
1600 /* Make sure this buffer has its own value of symbol. */
1601 XSETSYMBOL (variable, sym); /* Update in case of aliasing. */
1602 tem = Fassq (variable, BVAR (current_buffer, local_var_alist));
1603 if (NILP (tem))
1605 if (let_shadows_buffer_binding_p (sym))
1606 message ("Making %s buffer-local while locally let-bound!",
1607 SDATA (SYMBOL_NAME (variable)));
1609 /* Swap out any local binding for some other buffer, and make
1610 sure the current value is permanently recorded, if it's the
1611 default value. */
1612 find_symbol_value (variable);
1614 bset_local_var_alist
1615 (current_buffer,
1616 Fcons (Fcons (variable, XCDR (blv->defcell)),
1617 BVAR (current_buffer, local_var_alist)));
1619 /* Make sure symbol does not think it is set up for this buffer;
1620 force it to look once again for this buffer's value. */
1621 if (current_buffer == XBUFFER (blv->where))
1622 set_blv_where (blv, Qnil);
1623 set_blv_found (blv, 0);
1626 /* If the symbol forwards into a C variable, then load the binding
1627 for this buffer now. If C code modifies the variable before we
1628 load the binding in, then that new value will clobber the default
1629 binding the next time we unload it. */
1630 if (blv->fwd)
1631 swap_in_symval_forwarding (sym, blv);
1633 return variable;
1636 DEFUN ("kill-local-variable", Fkill_local_variable, Skill_local_variable,
1637 1, 1, "vKill Local Variable: ",
1638 doc: /* Make VARIABLE no longer have a separate value in the current buffer.
1639 From now on the default value will apply in this buffer. Return VARIABLE. */)
1640 (register Lisp_Object variable)
1642 register Lisp_Object tem;
1643 struct Lisp_Buffer_Local_Value *blv;
1644 struct Lisp_Symbol *sym;
1646 CHECK_SYMBOL (variable);
1647 sym = XSYMBOL (variable);
1649 start:
1650 switch (sym->redirect)
1652 case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start;
1653 case SYMBOL_PLAINVAL: return variable;
1654 case SYMBOL_FORWARDED:
1656 union Lisp_Fwd *valcontents = SYMBOL_FWD (sym);
1657 if (BUFFER_OBJFWDP (valcontents))
1659 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1660 int idx = PER_BUFFER_IDX (offset);
1662 if (idx > 0)
1664 SET_PER_BUFFER_VALUE_P (current_buffer, idx, 0);
1665 set_per_buffer_value (current_buffer, offset,
1666 per_buffer_default (offset));
1669 return variable;
1671 case SYMBOL_LOCALIZED:
1672 blv = SYMBOL_BLV (sym);
1673 if (blv->frame_local)
1674 return variable;
1675 break;
1676 default: emacs_abort ();
1679 /* Get rid of this buffer's alist element, if any. */
1680 XSETSYMBOL (variable, sym); /* Propagate variable indirection. */
1681 tem = Fassq (variable, BVAR (current_buffer, local_var_alist));
1682 if (!NILP (tem))
1683 bset_local_var_alist
1684 (current_buffer,
1685 Fdelq (tem, BVAR (current_buffer, local_var_alist)));
1687 /* If the symbol is set up with the current buffer's binding
1688 loaded, recompute its value. We have to do it now, or else
1689 forwarded objects won't work right. */
1691 Lisp_Object buf; XSETBUFFER (buf, current_buffer);
1692 if (EQ (buf, blv->where))
1694 set_blv_where (blv, Qnil);
1695 blv->found = 0;
1696 find_symbol_value (variable);
1700 return variable;
1703 /* Lisp functions for creating and removing buffer-local variables. */
1705 /* Obsolete since 22.2. NB adjust doc of modify-frame-parameters
1706 when/if this is removed. */
1708 DEFUN ("make-variable-frame-local", Fmake_variable_frame_local, Smake_variable_frame_local,
1709 1, 1, "vMake Variable Frame Local: ",
1710 doc: /* Enable VARIABLE to have frame-local bindings.
1711 This does not create any frame-local bindings for VARIABLE,
1712 it just makes them possible.
1714 A frame-local binding is actually a frame parameter value.
1715 If a frame F has a value for the frame parameter named VARIABLE,
1716 that also acts as a frame-local binding for VARIABLE in F--
1717 provided this function has been called to enable VARIABLE
1718 to have frame-local bindings at all.
1720 The only way to create a frame-local binding for VARIABLE in a frame
1721 is to set the VARIABLE frame parameter of that frame. See
1722 `modify-frame-parameters' for how to set frame parameters.
1724 Note that since Emacs 23.1, variables cannot be both buffer-local and
1725 frame-local any more (buffer-local bindings used to take precedence over
1726 frame-local bindings). */)
1727 (Lisp_Object variable)
1729 bool forwarded;
1730 union Lisp_Val_Fwd valcontents;
1731 struct Lisp_Symbol *sym;
1732 struct Lisp_Buffer_Local_Value *blv = NULL;
1734 CHECK_SYMBOL (variable);
1735 sym = XSYMBOL (variable);
1737 start:
1738 switch (sym->redirect)
1740 case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start;
1741 case SYMBOL_PLAINVAL:
1742 forwarded = 0; valcontents.value = SYMBOL_VAL (sym);
1743 if (EQ (valcontents.value, Qunbound))
1744 valcontents.value = Qnil;
1745 break;
1746 case SYMBOL_LOCALIZED:
1747 if (SYMBOL_BLV (sym)->frame_local)
1748 return variable;
1749 else
1750 error ("Symbol %s may not be frame-local",
1751 SDATA (SYMBOL_NAME (variable)));
1752 case SYMBOL_FORWARDED:
1753 forwarded = 1; valcontents.fwd = SYMBOL_FWD (sym);
1754 if (KBOARD_OBJFWDP (valcontents.fwd) || BUFFER_OBJFWDP (valcontents.fwd))
1755 error ("Symbol %s may not be frame-local",
1756 SDATA (SYMBOL_NAME (variable)));
1757 break;
1758 default: emacs_abort ();
1761 if (sym->constant)
1762 error ("Symbol %s may not be frame-local", SDATA (SYMBOL_NAME (variable)));
1764 blv = make_blv (sym, forwarded, valcontents);
1765 blv->frame_local = 1;
1766 sym->redirect = SYMBOL_LOCALIZED;
1767 SET_SYMBOL_BLV (sym, blv);
1769 Lisp_Object symbol;
1770 XSETSYMBOL (symbol, sym); /* In case `variable' is aliased. */
1771 if (let_shadows_global_binding_p (symbol))
1772 message ("Making %s frame-local while let-bound!",
1773 SDATA (SYMBOL_NAME (variable)));
1775 return variable;
1778 DEFUN ("local-variable-p", Flocal_variable_p, Slocal_variable_p,
1779 1, 2, 0,
1780 doc: /* Non-nil if VARIABLE has a local binding in buffer BUFFER.
1781 BUFFER defaults to the current buffer. */)
1782 (register Lisp_Object variable, Lisp_Object buffer)
1784 register struct buffer *buf;
1785 struct Lisp_Symbol *sym;
1787 if (NILP (buffer))
1788 buf = current_buffer;
1789 else
1791 CHECK_BUFFER (buffer);
1792 buf = XBUFFER (buffer);
1795 CHECK_SYMBOL (variable);
1796 sym = XSYMBOL (variable);
1798 start:
1799 switch (sym->redirect)
1801 case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start;
1802 case SYMBOL_PLAINVAL: return Qnil;
1803 case SYMBOL_LOCALIZED:
1805 Lisp_Object tail, elt, tmp;
1806 struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (sym);
1807 XSETBUFFER (tmp, buf);
1808 XSETSYMBOL (variable, sym); /* Update in case of aliasing. */
1810 if (EQ (blv->where, tmp)) /* The binding is already loaded. */
1811 return blv_found (blv) ? Qt : Qnil;
1812 else
1813 for (tail = BVAR (buf, local_var_alist); CONSP (tail); tail = XCDR (tail))
1815 elt = XCAR (tail);
1816 if (EQ (variable, XCAR (elt)))
1818 eassert (!blv->frame_local);
1819 return Qt;
1822 return Qnil;
1824 case SYMBOL_FORWARDED:
1826 union Lisp_Fwd *valcontents = SYMBOL_FWD (sym);
1827 if (BUFFER_OBJFWDP (valcontents))
1829 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1830 int idx = PER_BUFFER_IDX (offset);
1831 if (idx == -1 || PER_BUFFER_VALUE_P (buf, idx))
1832 return Qt;
1834 return Qnil;
1836 default: emacs_abort ();
1840 DEFUN ("local-variable-if-set-p", Flocal_variable_if_set_p, Slocal_variable_if_set_p,
1841 1, 2, 0,
1842 doc: /* Non-nil if VARIABLE is local in buffer BUFFER when set there.
1843 BUFFER defaults to the current buffer.
1845 More precisely, return non-nil if either VARIABLE already has a local
1846 value in BUFFER, or if VARIABLE is automatically buffer-local (see
1847 `make-variable-buffer-local'). */)
1848 (register Lisp_Object variable, Lisp_Object buffer)
1850 struct Lisp_Symbol *sym;
1852 CHECK_SYMBOL (variable);
1853 sym = XSYMBOL (variable);
1855 start:
1856 switch (sym->redirect)
1858 case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start;
1859 case SYMBOL_PLAINVAL: return Qnil;
1860 case SYMBOL_LOCALIZED:
1862 struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (sym);
1863 if (blv->local_if_set)
1864 return Qt;
1865 XSETSYMBOL (variable, sym); /* Update in case of aliasing. */
1866 return Flocal_variable_p (variable, buffer);
1868 case SYMBOL_FORWARDED:
1869 /* All BUFFER_OBJFWD slots become local if they are set. */
1870 return (BUFFER_OBJFWDP (SYMBOL_FWD (sym)) ? Qt : Qnil);
1871 default: emacs_abort ();
1875 DEFUN ("variable-binding-locus", Fvariable_binding_locus, Svariable_binding_locus,
1876 1, 1, 0,
1877 doc: /* Return a value indicating where VARIABLE's current binding comes from.
1878 If the current binding is buffer-local, the value is the current buffer.
1879 If the current binding is frame-local, the value is the selected frame.
1880 If the current binding is global (the default), the value is nil. */)
1881 (register Lisp_Object variable)
1883 struct Lisp_Symbol *sym;
1885 CHECK_SYMBOL (variable);
1886 sym = XSYMBOL (variable);
1888 /* Make sure the current binding is actually swapped in. */
1889 find_symbol_value (variable);
1891 start:
1892 switch (sym->redirect)
1894 case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start;
1895 case SYMBOL_PLAINVAL: return Qnil;
1896 case SYMBOL_FORWARDED:
1898 union Lisp_Fwd *valcontents = SYMBOL_FWD (sym);
1899 if (KBOARD_OBJFWDP (valcontents))
1900 return Fframe_terminal (Fselected_frame ());
1901 else if (!BUFFER_OBJFWDP (valcontents))
1902 return Qnil;
1904 /* FALLTHROUGH */
1905 case SYMBOL_LOCALIZED:
1906 /* For a local variable, record both the symbol and which
1907 buffer's or frame's value we are saving. */
1908 if (!NILP (Flocal_variable_p (variable, Qnil)))
1909 return Fcurrent_buffer ();
1910 else if (sym->redirect == SYMBOL_LOCALIZED
1911 && blv_found (SYMBOL_BLV (sym)))
1912 return SYMBOL_BLV (sym)->where;
1913 else
1914 return Qnil;
1915 default: emacs_abort ();
1919 /* This code is disabled now that we use the selected frame to return
1920 keyboard-local-values. */
1921 #if 0
1922 extern struct terminal *get_terminal (Lisp_Object display, int);
1924 DEFUN ("terminal-local-value", Fterminal_local_value,
1925 Sterminal_local_value, 2, 2, 0,
1926 doc: /* Return the terminal-local value of SYMBOL on TERMINAL.
1927 If SYMBOL is not a terminal-local variable, then return its normal
1928 value, like `symbol-value'.
1930 TERMINAL may be a terminal object, a frame, or nil (meaning the
1931 selected frame's terminal device). */)
1932 (Lisp_Object symbol, Lisp_Object terminal)
1934 Lisp_Object result;
1935 struct terminal *t = get_terminal (terminal, 1);
1936 push_kboard (t->kboard);
1937 result = Fsymbol_value (symbol);
1938 pop_kboard ();
1939 return result;
1942 DEFUN ("set-terminal-local-value", Fset_terminal_local_value,
1943 Sset_terminal_local_value, 3, 3, 0,
1944 doc: /* Set the terminal-local binding of SYMBOL on TERMINAL to VALUE.
1945 If VARIABLE is not a terminal-local variable, then set its normal
1946 binding, like `set'.
1948 TERMINAL may be a terminal object, a frame, or nil (meaning the
1949 selected frame's terminal device). */)
1950 (Lisp_Object symbol, Lisp_Object terminal, Lisp_Object value)
1952 Lisp_Object result;
1953 struct terminal *t = get_terminal (terminal, 1);
1954 push_kboard (d->kboard);
1955 result = Fset (symbol, value);
1956 pop_kboard ();
1957 return result;
1959 #endif
1961 /* Find the function at the end of a chain of symbol function indirections. */
1963 /* If OBJECT is a symbol, find the end of its function chain and
1964 return the value found there. If OBJECT is not a symbol, just
1965 return it. If there is a cycle in the function chain, signal a
1966 cyclic-function-indirection error.
1968 This is like Findirect_function, except that it doesn't signal an
1969 error if the chain ends up unbound. */
1970 Lisp_Object
1971 indirect_function (register Lisp_Object object)
1973 Lisp_Object tortoise, hare;
1975 hare = tortoise = object;
1977 for (;;)
1979 if (!SYMBOLP (hare) || NILP (hare))
1980 break;
1981 hare = XSYMBOL (hare)->function;
1982 if (!SYMBOLP (hare) || NILP (hare))
1983 break;
1984 hare = XSYMBOL (hare)->function;
1986 tortoise = XSYMBOL (tortoise)->function;
1988 if (EQ (hare, tortoise))
1989 xsignal1 (Qcyclic_function_indirection, object);
1992 return hare;
1995 DEFUN ("indirect-function", Findirect_function, Sindirect_function, 1, 2, 0,
1996 doc: /* Return the function at the end of OBJECT's function chain.
1997 If OBJECT is not a symbol, just return it. Otherwise, follow all
1998 function indirections to find the final function binding and return it.
1999 If the final symbol in the chain is unbound, signal a void-function error.
2000 Optional arg NOERROR non-nil means to return nil instead of signaling.
2001 Signal a cyclic-function-indirection error if there is a loop in the
2002 function chain of symbols. */)
2003 (register Lisp_Object object, Lisp_Object noerror)
2005 Lisp_Object result;
2007 /* Optimize for no indirection. */
2008 result = object;
2009 if (SYMBOLP (result) && !NILP (result)
2010 && (result = XSYMBOL (result)->function, SYMBOLP (result)))
2011 result = indirect_function (result);
2012 if (!NILP (result))
2013 return result;
2015 if (NILP (noerror))
2016 xsignal1 (Qvoid_function, object);
2018 return Qnil;
2021 /* Extract and set vector and string elements. */
2023 DEFUN ("aref", Faref, Saref, 2, 2, 0,
2024 doc: /* Return the element of ARRAY at index IDX.
2025 ARRAY may be a vector, a string, a char-table, a bool-vector,
2026 or a byte-code object. IDX starts at 0. */)
2027 (register Lisp_Object array, Lisp_Object idx)
2029 register EMACS_INT idxval;
2031 CHECK_NUMBER (idx);
2032 idxval = XINT (idx);
2033 if (STRINGP (array))
2035 int c;
2036 ptrdiff_t idxval_byte;
2038 if (idxval < 0 || idxval >= SCHARS (array))
2039 args_out_of_range (array, idx);
2040 if (! STRING_MULTIBYTE (array))
2041 return make_number ((unsigned char) SREF (array, idxval));
2042 idxval_byte = string_char_to_byte (array, idxval);
2044 c = STRING_CHAR (SDATA (array) + idxval_byte);
2045 return make_number (c);
2047 else if (BOOL_VECTOR_P (array))
2049 int val;
2051 if (idxval < 0 || idxval >= XBOOL_VECTOR (array)->size)
2052 args_out_of_range (array, idx);
2054 val = (unsigned char) XBOOL_VECTOR (array)->data[idxval / BOOL_VECTOR_BITS_PER_CHAR];
2055 return (val & (1 << (idxval % BOOL_VECTOR_BITS_PER_CHAR)) ? Qt : Qnil);
2057 else if (CHAR_TABLE_P (array))
2059 CHECK_CHARACTER (idx);
2060 return CHAR_TABLE_REF (array, idxval);
2062 else
2064 ptrdiff_t size = 0;
2065 if (VECTORP (array))
2066 size = ASIZE (array);
2067 else if (COMPILEDP (array))
2068 size = ASIZE (array) & PSEUDOVECTOR_SIZE_MASK;
2069 else
2070 wrong_type_argument (Qarrayp, array);
2072 if (idxval < 0 || idxval >= size)
2073 args_out_of_range (array, idx);
2074 return AREF (array, idxval);
2078 DEFUN ("aset", Faset, Saset, 3, 3, 0,
2079 doc: /* Store into the element of ARRAY at index IDX the value NEWELT.
2080 Return NEWELT. ARRAY may be a vector, a string, a char-table or a
2081 bool-vector. IDX starts at 0. */)
2082 (register Lisp_Object array, Lisp_Object idx, Lisp_Object newelt)
2084 register EMACS_INT idxval;
2086 CHECK_NUMBER (idx);
2087 idxval = XINT (idx);
2088 CHECK_ARRAY (array, Qarrayp);
2089 CHECK_IMPURE (array);
2091 if (VECTORP (array))
2093 if (idxval < 0 || idxval >= ASIZE (array))
2094 args_out_of_range (array, idx);
2095 ASET (array, idxval, newelt);
2097 else if (BOOL_VECTOR_P (array))
2099 int val;
2101 if (idxval < 0 || idxval >= XBOOL_VECTOR (array)->size)
2102 args_out_of_range (array, idx);
2104 val = (unsigned char) XBOOL_VECTOR (array)->data[idxval / BOOL_VECTOR_BITS_PER_CHAR];
2106 if (! NILP (newelt))
2107 val |= 1 << (idxval % BOOL_VECTOR_BITS_PER_CHAR);
2108 else
2109 val &= ~(1 << (idxval % BOOL_VECTOR_BITS_PER_CHAR));
2110 XBOOL_VECTOR (array)->data[idxval / BOOL_VECTOR_BITS_PER_CHAR] = val;
2112 else if (CHAR_TABLE_P (array))
2114 CHECK_CHARACTER (idx);
2115 CHAR_TABLE_SET (array, idxval, newelt);
2117 else
2119 int c;
2121 if (idxval < 0 || idxval >= SCHARS (array))
2122 args_out_of_range (array, idx);
2123 CHECK_CHARACTER (newelt);
2124 c = XFASTINT (newelt);
2126 if (STRING_MULTIBYTE (array))
2128 ptrdiff_t idxval_byte, nbytes;
2129 int prev_bytes, new_bytes;
2130 unsigned char workbuf[MAX_MULTIBYTE_LENGTH], *p0 = workbuf, *p1;
2132 nbytes = SBYTES (array);
2133 idxval_byte = string_char_to_byte (array, idxval);
2134 p1 = SDATA (array) + idxval_byte;
2135 prev_bytes = BYTES_BY_CHAR_HEAD (*p1);
2136 new_bytes = CHAR_STRING (c, p0);
2137 if (prev_bytes != new_bytes)
2139 /* We must relocate the string data. */
2140 ptrdiff_t nchars = SCHARS (array);
2141 USE_SAFE_ALLOCA;
2142 unsigned char *str = SAFE_ALLOCA (nbytes);
2144 memcpy (str, SDATA (array), nbytes);
2145 allocate_string_data (XSTRING (array), nchars,
2146 nbytes + new_bytes - prev_bytes);
2147 memcpy (SDATA (array), str, idxval_byte);
2148 p1 = SDATA (array) + idxval_byte;
2149 memcpy (p1 + new_bytes, str + idxval_byte + prev_bytes,
2150 nbytes - (idxval_byte + prev_bytes));
2151 SAFE_FREE ();
2152 clear_string_char_byte_cache ();
2154 while (new_bytes--)
2155 *p1++ = *p0++;
2157 else
2159 if (! SINGLE_BYTE_CHAR_P (c))
2161 int i;
2163 for (i = SBYTES (array) - 1; i >= 0; i--)
2164 if (SREF (array, i) >= 0x80)
2165 args_out_of_range (array, newelt);
2166 /* ARRAY is an ASCII string. Convert it to a multibyte
2167 string, and try `aset' again. */
2168 STRING_SET_MULTIBYTE (array);
2169 return Faset (array, idx, newelt);
2171 SSET (array, idxval, c);
2175 return newelt;
2178 /* Arithmetic functions */
2180 enum comparison { equal, notequal, less, grtr, less_or_equal, grtr_or_equal };
2182 static Lisp_Object
2183 arithcompare (Lisp_Object num1, Lisp_Object num2, enum comparison comparison)
2185 double f1 = 0, f2 = 0;
2186 bool floatp = 0;
2188 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num1);
2189 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num2);
2191 if (FLOATP (num1) || FLOATP (num2))
2193 floatp = 1;
2194 f1 = (FLOATP (num1)) ? XFLOAT_DATA (num1) : XINT (num1);
2195 f2 = (FLOATP (num2)) ? XFLOAT_DATA (num2) : XINT (num2);
2198 switch (comparison)
2200 case equal:
2201 if (floatp ? f1 == f2 : XINT (num1) == XINT (num2))
2202 return Qt;
2203 return Qnil;
2205 case notequal:
2206 if (floatp ? f1 != f2 : XINT (num1) != XINT (num2))
2207 return Qt;
2208 return Qnil;
2210 case less:
2211 if (floatp ? f1 < f2 : XINT (num1) < XINT (num2))
2212 return Qt;
2213 return Qnil;
2215 case less_or_equal:
2216 if (floatp ? f1 <= f2 : XINT (num1) <= XINT (num2))
2217 return Qt;
2218 return Qnil;
2220 case grtr:
2221 if (floatp ? f1 > f2 : XINT (num1) > XINT (num2))
2222 return Qt;
2223 return Qnil;
2225 case grtr_or_equal:
2226 if (floatp ? f1 >= f2 : XINT (num1) >= XINT (num2))
2227 return Qt;
2228 return Qnil;
2230 default:
2231 emacs_abort ();
2235 DEFUN ("=", Feqlsign, Seqlsign, 2, 2, 0,
2236 doc: /* Return t if two args, both numbers or markers, are equal. */)
2237 (register Lisp_Object num1, Lisp_Object num2)
2239 return arithcompare (num1, num2, equal);
2242 DEFUN ("<", Flss, Slss, 2, 2, 0,
2243 doc: /* Return t if first arg is less than second arg. Both must be numbers or markers. */)
2244 (register Lisp_Object num1, Lisp_Object num2)
2246 return arithcompare (num1, num2, less);
2249 DEFUN (">", Fgtr, Sgtr, 2, 2, 0,
2250 doc: /* Return t if first arg is greater than second arg. Both must be numbers or markers. */)
2251 (register Lisp_Object num1, Lisp_Object num2)
2253 return arithcompare (num1, num2, grtr);
2256 DEFUN ("<=", Fleq, Sleq, 2, 2, 0,
2257 doc: /* Return t if first arg is less than or equal to second arg.
2258 Both must be numbers or markers. */)
2259 (register Lisp_Object num1, Lisp_Object num2)
2261 return arithcompare (num1, num2, less_or_equal);
2264 DEFUN (">=", Fgeq, Sgeq, 2, 2, 0,
2265 doc: /* Return t if first arg is greater than or equal to second arg.
2266 Both must be numbers or markers. */)
2267 (register Lisp_Object num1, Lisp_Object num2)
2269 return arithcompare (num1, num2, grtr_or_equal);
2272 DEFUN ("/=", Fneq, Sneq, 2, 2, 0,
2273 doc: /* Return t if first arg is not equal to second arg. Both must be numbers or markers. */)
2274 (register Lisp_Object num1, Lisp_Object num2)
2276 return arithcompare (num1, num2, notequal);
2279 DEFUN ("zerop", Fzerop, Szerop, 1, 1, 0,
2280 doc: /* Return t if NUMBER is zero. */)
2281 (register Lisp_Object number)
2283 CHECK_NUMBER_OR_FLOAT (number);
2285 if (FLOATP (number))
2287 if (XFLOAT_DATA (number) == 0.0)
2288 return Qt;
2289 return Qnil;
2292 if (!XINT (number))
2293 return Qt;
2294 return Qnil;
2297 /* Convert the cons-of-integers, integer, or float value C to an
2298 unsigned value with maximum value MAX. Signal an error if C does not
2299 have a valid format or is out of range. */
2300 uintmax_t
2301 cons_to_unsigned (Lisp_Object c, uintmax_t max)
2303 bool valid = 0;
2304 uintmax_t val IF_LINT (= 0);
2305 if (INTEGERP (c))
2307 valid = 0 <= XINT (c);
2308 val = XINT (c);
2310 else if (FLOATP (c))
2312 double d = XFLOAT_DATA (c);
2313 if (0 <= d
2314 && d < (max == UINTMAX_MAX ? (double) UINTMAX_MAX + 1 : max + 1))
2316 val = d;
2317 valid = 1;
2320 else if (CONSP (c) && NATNUMP (XCAR (c)))
2322 uintmax_t top = XFASTINT (XCAR (c));
2323 Lisp_Object rest = XCDR (c);
2324 if (top <= UINTMAX_MAX >> 24 >> 16
2325 && CONSP (rest)
2326 && NATNUMP (XCAR (rest)) && XFASTINT (XCAR (rest)) < 1 << 24
2327 && NATNUMP (XCDR (rest)) && XFASTINT (XCDR (rest)) < 1 << 16)
2329 uintmax_t mid = XFASTINT (XCAR (rest));
2330 val = top << 24 << 16 | mid << 16 | XFASTINT (XCDR (rest));
2331 valid = 1;
2333 else if (top <= UINTMAX_MAX >> 16)
2335 if (CONSP (rest))
2336 rest = XCAR (rest);
2337 if (NATNUMP (rest) && XFASTINT (rest) < 1 << 16)
2339 val = top << 16 | XFASTINT (rest);
2340 valid = 1;
2345 if (! (valid && val <= max))
2346 error ("Not an in-range integer, float, or cons of integers");
2347 return val;
2350 /* Convert the cons-of-integers, integer, or float value C to a signed
2351 value with extrema MIN and MAX. Signal an error if C does not have
2352 a valid format or is out of range. */
2353 intmax_t
2354 cons_to_signed (Lisp_Object c, intmax_t min, intmax_t max)
2356 bool valid = 0;
2357 intmax_t val IF_LINT (= 0);
2358 if (INTEGERP (c))
2360 val = XINT (c);
2361 valid = 1;
2363 else if (FLOATP (c))
2365 double d = XFLOAT_DATA (c);
2366 if (min <= d
2367 && d < (max == INTMAX_MAX ? (double) INTMAX_MAX + 1 : max + 1))
2369 val = d;
2370 valid = 1;
2373 else if (CONSP (c) && INTEGERP (XCAR (c)))
2375 intmax_t top = XINT (XCAR (c));
2376 Lisp_Object rest = XCDR (c);
2377 if (INTMAX_MIN >> 24 >> 16 <= top && top <= INTMAX_MAX >> 24 >> 16
2378 && CONSP (rest)
2379 && NATNUMP (XCAR (rest)) && XFASTINT (XCAR (rest)) < 1 << 24
2380 && NATNUMP (XCDR (rest)) && XFASTINT (XCDR (rest)) < 1 << 16)
2382 intmax_t mid = XFASTINT (XCAR (rest));
2383 val = top << 24 << 16 | mid << 16 | XFASTINT (XCDR (rest));
2384 valid = 1;
2386 else if (INTMAX_MIN >> 16 <= top && top <= INTMAX_MAX >> 16)
2388 if (CONSP (rest))
2389 rest = XCAR (rest);
2390 if (NATNUMP (rest) && XFASTINT (rest) < 1 << 16)
2392 val = top << 16 | XFASTINT (rest);
2393 valid = 1;
2398 if (! (valid && min <= val && val <= max))
2399 error ("Not an in-range integer, float, or cons of integers");
2400 return val;
2403 DEFUN ("number-to-string", Fnumber_to_string, Snumber_to_string, 1, 1, 0,
2404 doc: /* Return the decimal representation of NUMBER as a string.
2405 Uses a minus sign if negative.
2406 NUMBER may be an integer or a floating point number. */)
2407 (Lisp_Object number)
2409 char buffer[max (FLOAT_TO_STRING_BUFSIZE, INT_BUFSIZE_BOUND (EMACS_INT))];
2410 int len;
2412 CHECK_NUMBER_OR_FLOAT (number);
2414 if (FLOATP (number))
2415 len = float_to_string (buffer, XFLOAT_DATA (number));
2416 else
2417 len = sprintf (buffer, "%"pI"d", XINT (number));
2419 return make_unibyte_string (buffer, len);
2422 DEFUN ("string-to-number", Fstring_to_number, Sstring_to_number, 1, 2, 0,
2423 doc: /* Parse STRING as a decimal number and return the number.
2424 This parses both integers and floating point numbers.
2425 It ignores leading spaces and tabs, and all trailing chars.
2427 If BASE, interpret STRING as a number in that base. If BASE isn't
2428 present, base 10 is used. BASE must be between 2 and 16 (inclusive).
2429 If the base used is not 10, STRING is always parsed as integer. */)
2430 (register Lisp_Object string, Lisp_Object base)
2432 register char *p;
2433 register int b;
2434 Lisp_Object val;
2436 CHECK_STRING (string);
2438 if (NILP (base))
2439 b = 10;
2440 else
2442 CHECK_NUMBER (base);
2443 if (! (2 <= XINT (base) && XINT (base) <= 16))
2444 xsignal1 (Qargs_out_of_range, base);
2445 b = XINT (base);
2448 p = SSDATA (string);
2449 while (*p == ' ' || *p == '\t')
2450 p++;
2452 val = string_to_number (p, b, 1);
2453 return NILP (val) ? make_number (0) : val;
2456 enum arithop
2458 Aadd,
2459 Asub,
2460 Amult,
2461 Adiv,
2462 Alogand,
2463 Alogior,
2464 Alogxor,
2465 Amax,
2466 Amin
2469 static Lisp_Object float_arith_driver (double, ptrdiff_t, enum arithop,
2470 ptrdiff_t, Lisp_Object *);
2471 static Lisp_Object
2472 arith_driver (enum arithop code, ptrdiff_t nargs, Lisp_Object *args)
2474 Lisp_Object val;
2475 ptrdiff_t argnum, ok_args;
2476 EMACS_INT accum = 0;
2477 EMACS_INT next, ok_accum;
2478 bool overflow = 0;
2480 switch (code)
2482 case Alogior:
2483 case Alogxor:
2484 case Aadd:
2485 case Asub:
2486 accum = 0;
2487 break;
2488 case Amult:
2489 accum = 1;
2490 break;
2491 case Alogand:
2492 accum = -1;
2493 break;
2494 default:
2495 break;
2498 for (argnum = 0; argnum < nargs; argnum++)
2500 if (! overflow)
2502 ok_args = argnum;
2503 ok_accum = accum;
2506 /* Using args[argnum] as argument to CHECK_NUMBER_... */
2507 val = args[argnum];
2508 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val);
2510 if (FLOATP (val))
2511 return float_arith_driver (ok_accum, ok_args, code,
2512 nargs, args);
2513 args[argnum] = val;
2514 next = XINT (args[argnum]);
2515 switch (code)
2517 case Aadd:
2518 if (INT_ADD_OVERFLOW (accum, next))
2520 overflow = 1;
2521 accum &= INTMASK;
2523 accum += next;
2524 break;
2525 case Asub:
2526 if (INT_SUBTRACT_OVERFLOW (accum, next))
2528 overflow = 1;
2529 accum &= INTMASK;
2531 accum = argnum ? accum - next : nargs == 1 ? - next : next;
2532 break;
2533 case Amult:
2534 if (INT_MULTIPLY_OVERFLOW (accum, next))
2536 EMACS_UINT a = accum, b = next, ab = a * b;
2537 overflow = 1;
2538 accum = ab & INTMASK;
2540 else
2541 accum *= next;
2542 break;
2543 case Adiv:
2544 if (!argnum)
2545 accum = next;
2546 else
2548 if (next == 0)
2549 xsignal0 (Qarith_error);
2550 accum /= next;
2552 break;
2553 case Alogand:
2554 accum &= next;
2555 break;
2556 case Alogior:
2557 accum |= next;
2558 break;
2559 case Alogxor:
2560 accum ^= next;
2561 break;
2562 case Amax:
2563 if (!argnum || next > accum)
2564 accum = next;
2565 break;
2566 case Amin:
2567 if (!argnum || next < accum)
2568 accum = next;
2569 break;
2573 XSETINT (val, accum);
2574 return val;
2577 #undef isnan
2578 #define isnan(x) ((x) != (x))
2580 static Lisp_Object
2581 float_arith_driver (double accum, ptrdiff_t argnum, enum arithop code,
2582 ptrdiff_t nargs, Lisp_Object *args)
2584 register Lisp_Object val;
2585 double next;
2587 for (; argnum < nargs; argnum++)
2589 val = args[argnum]; /* using args[argnum] as argument to CHECK_NUMBER_... */
2590 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val);
2592 if (FLOATP (val))
2594 next = XFLOAT_DATA (val);
2596 else
2598 args[argnum] = val; /* runs into a compiler bug. */
2599 next = XINT (args[argnum]);
2601 switch (code)
2603 case Aadd:
2604 accum += next;
2605 break;
2606 case Asub:
2607 accum = argnum ? accum - next : nargs == 1 ? - next : next;
2608 break;
2609 case Amult:
2610 accum *= next;
2611 break;
2612 case Adiv:
2613 if (!argnum)
2614 accum = next;
2615 else
2617 if (! IEEE_FLOATING_POINT && next == 0)
2618 xsignal0 (Qarith_error);
2619 accum /= next;
2621 break;
2622 case Alogand:
2623 case Alogior:
2624 case Alogxor:
2625 return wrong_type_argument (Qinteger_or_marker_p, val);
2626 case Amax:
2627 if (!argnum || isnan (next) || next > accum)
2628 accum = next;
2629 break;
2630 case Amin:
2631 if (!argnum || isnan (next) || next < accum)
2632 accum = next;
2633 break;
2637 return make_float (accum);
2641 DEFUN ("+", Fplus, Splus, 0, MANY, 0,
2642 doc: /* Return sum of any number of arguments, which are numbers or markers.
2643 usage: (+ &rest NUMBERS-OR-MARKERS) */)
2644 (ptrdiff_t nargs, Lisp_Object *args)
2646 return arith_driver (Aadd, nargs, args);
2649 DEFUN ("-", Fminus, Sminus, 0, MANY, 0,
2650 doc: /* Negate number or subtract numbers or markers and return the result.
2651 With one arg, negates it. With more than one arg,
2652 subtracts all but the first from the first.
2653 usage: (- &optional NUMBER-OR-MARKER &rest MORE-NUMBERS-OR-MARKERS) */)
2654 (ptrdiff_t nargs, Lisp_Object *args)
2656 return arith_driver (Asub, nargs, args);
2659 DEFUN ("*", Ftimes, Stimes, 0, MANY, 0,
2660 doc: /* Return product of any number of arguments, which are numbers or markers.
2661 usage: (* &rest NUMBERS-OR-MARKERS) */)
2662 (ptrdiff_t nargs, Lisp_Object *args)
2664 return arith_driver (Amult, nargs, args);
2667 DEFUN ("/", Fquo, Squo, 1, MANY, 0,
2668 doc: /* Return first argument divided by all the remaining arguments.
2669 The arguments must be numbers or markers.
2670 usage: (/ DIVIDEND &rest DIVISORS) */)
2671 (ptrdiff_t nargs, Lisp_Object *args)
2673 ptrdiff_t argnum;
2674 for (argnum = 2; argnum < nargs; argnum++)
2675 if (FLOATP (args[argnum]))
2676 return float_arith_driver (0, 0, Adiv, nargs, args);
2677 return arith_driver (Adiv, nargs, args);
2680 DEFUN ("%", Frem, Srem, 2, 2, 0,
2681 doc: /* Return remainder of X divided by Y.
2682 Both must be integers or markers. */)
2683 (register Lisp_Object x, Lisp_Object y)
2685 Lisp_Object val;
2687 CHECK_NUMBER_COERCE_MARKER (x);
2688 CHECK_NUMBER_COERCE_MARKER (y);
2690 if (XINT (y) == 0)
2691 xsignal0 (Qarith_error);
2693 XSETINT (val, XINT (x) % XINT (y));
2694 return val;
2697 DEFUN ("mod", Fmod, Smod, 2, 2, 0,
2698 doc: /* Return X modulo Y.
2699 The result falls between zero (inclusive) and Y (exclusive).
2700 Both X and Y must be numbers or markers. */)
2701 (register Lisp_Object x, Lisp_Object y)
2703 Lisp_Object val;
2704 EMACS_INT i1, i2;
2706 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (x);
2707 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (y);
2709 if (FLOATP (x) || FLOATP (y))
2710 return fmod_float (x, y);
2712 i1 = XINT (x);
2713 i2 = XINT (y);
2715 if (i2 == 0)
2716 xsignal0 (Qarith_error);
2718 i1 %= i2;
2720 /* If the "remainder" comes out with the wrong sign, fix it. */
2721 if (i2 < 0 ? i1 > 0 : i1 < 0)
2722 i1 += i2;
2724 XSETINT (val, i1);
2725 return val;
2728 DEFUN ("max", Fmax, Smax, 1, MANY, 0,
2729 doc: /* Return largest of all the arguments (which must be numbers or markers).
2730 The value is always a number; markers are converted to numbers.
2731 usage: (max NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */)
2732 (ptrdiff_t nargs, Lisp_Object *args)
2734 return arith_driver (Amax, nargs, args);
2737 DEFUN ("min", Fmin, Smin, 1, MANY, 0,
2738 doc: /* Return smallest of all the arguments (which must be numbers or markers).
2739 The value is always a number; markers are converted to numbers.
2740 usage: (min NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */)
2741 (ptrdiff_t nargs, Lisp_Object *args)
2743 return arith_driver (Amin, nargs, args);
2746 DEFUN ("logand", Flogand, Slogand, 0, MANY, 0,
2747 doc: /* Return bitwise-and of all the arguments.
2748 Arguments may be integers, or markers converted to integers.
2749 usage: (logand &rest INTS-OR-MARKERS) */)
2750 (ptrdiff_t nargs, Lisp_Object *args)
2752 return arith_driver (Alogand, nargs, args);
2755 DEFUN ("logior", Flogior, Slogior, 0, MANY, 0,
2756 doc: /* Return bitwise-or of all the arguments.
2757 Arguments may be integers, or markers converted to integers.
2758 usage: (logior &rest INTS-OR-MARKERS) */)
2759 (ptrdiff_t nargs, Lisp_Object *args)
2761 return arith_driver (Alogior, nargs, args);
2764 DEFUN ("logxor", Flogxor, Slogxor, 0, MANY, 0,
2765 doc: /* Return bitwise-exclusive-or of all the arguments.
2766 Arguments may be integers, or markers converted to integers.
2767 usage: (logxor &rest INTS-OR-MARKERS) */)
2768 (ptrdiff_t nargs, Lisp_Object *args)
2770 return arith_driver (Alogxor, nargs, args);
2773 DEFUN ("ash", Fash, Sash, 2, 2, 0,
2774 doc: /* Return VALUE with its bits shifted left by COUNT.
2775 If COUNT is negative, shifting is actually to the right.
2776 In this case, the sign bit is duplicated. */)
2777 (register Lisp_Object value, Lisp_Object count)
2779 register Lisp_Object val;
2781 CHECK_NUMBER (value);
2782 CHECK_NUMBER (count);
2784 if (XINT (count) >= BITS_PER_EMACS_INT)
2785 XSETINT (val, 0);
2786 else if (XINT (count) > 0)
2787 XSETINT (val, XINT (value) << XFASTINT (count));
2788 else if (XINT (count) <= -BITS_PER_EMACS_INT)
2789 XSETINT (val, XINT (value) < 0 ? -1 : 0);
2790 else
2791 XSETINT (val, XINT (value) >> -XINT (count));
2792 return val;
2795 DEFUN ("lsh", Flsh, Slsh, 2, 2, 0,
2796 doc: /* Return VALUE with its bits shifted left by COUNT.
2797 If COUNT is negative, shifting is actually to the right.
2798 In this case, zeros are shifted in on the left. */)
2799 (register Lisp_Object value, Lisp_Object count)
2801 register Lisp_Object val;
2803 CHECK_NUMBER (value);
2804 CHECK_NUMBER (count);
2806 if (XINT (count) >= BITS_PER_EMACS_INT)
2807 XSETINT (val, 0);
2808 else if (XINT (count) > 0)
2809 XSETINT (val, XUINT (value) << XFASTINT (count));
2810 else if (XINT (count) <= -BITS_PER_EMACS_INT)
2811 XSETINT (val, 0);
2812 else
2813 XSETINT (val, XUINT (value) >> -XINT (count));
2814 return val;
2817 DEFUN ("1+", Fadd1, Sadd1, 1, 1, 0,
2818 doc: /* Return NUMBER plus one. NUMBER may be a number or a marker.
2819 Markers are converted to integers. */)
2820 (register Lisp_Object number)
2822 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number);
2824 if (FLOATP (number))
2825 return (make_float (1.0 + XFLOAT_DATA (number)));
2827 XSETINT (number, XINT (number) + 1);
2828 return number;
2831 DEFUN ("1-", Fsub1, Ssub1, 1, 1, 0,
2832 doc: /* Return NUMBER minus one. NUMBER may be a number or a marker.
2833 Markers are converted to integers. */)
2834 (register Lisp_Object number)
2836 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number);
2838 if (FLOATP (number))
2839 return (make_float (-1.0 + XFLOAT_DATA (number)));
2841 XSETINT (number, XINT (number) - 1);
2842 return number;
2845 DEFUN ("lognot", Flognot, Slognot, 1, 1, 0,
2846 doc: /* Return the bitwise complement of NUMBER. NUMBER must be an integer. */)
2847 (register Lisp_Object number)
2849 CHECK_NUMBER (number);
2850 XSETINT (number, ~XINT (number));
2851 return number;
2854 DEFUN ("byteorder", Fbyteorder, Sbyteorder, 0, 0, 0,
2855 doc: /* Return the byteorder for the machine.
2856 Returns 66 (ASCII uppercase B) for big endian machines or 108 (ASCII
2857 lowercase l) for small endian machines. */)
2858 (void)
2860 unsigned i = 0x04030201;
2861 int order = *(char *)&i == 1 ? 108 : 66;
2863 return make_number (order);
2868 void
2869 syms_of_data (void)
2871 Lisp_Object error_tail, arith_tail;
2873 DEFSYM (Qquote, "quote");
2874 DEFSYM (Qlambda, "lambda");
2875 DEFSYM (Qsubr, "subr");
2876 DEFSYM (Qerror_conditions, "error-conditions");
2877 DEFSYM (Qerror_message, "error-message");
2878 DEFSYM (Qtop_level, "top-level");
2880 DEFSYM (Qerror, "error");
2881 DEFSYM (Quser_error, "user-error");
2882 DEFSYM (Qquit, "quit");
2883 DEFSYM (Qwrong_type_argument, "wrong-type-argument");
2884 DEFSYM (Qargs_out_of_range, "args-out-of-range");
2885 DEFSYM (Qvoid_function, "void-function");
2886 DEFSYM (Qcyclic_function_indirection, "cyclic-function-indirection");
2887 DEFSYM (Qcyclic_variable_indirection, "cyclic-variable-indirection");
2888 DEFSYM (Qvoid_variable, "void-variable");
2889 DEFSYM (Qsetting_constant, "setting-constant");
2890 DEFSYM (Qinvalid_read_syntax, "invalid-read-syntax");
2892 DEFSYM (Qinvalid_function, "invalid-function");
2893 DEFSYM (Qwrong_number_of_arguments, "wrong-number-of-arguments");
2894 DEFSYM (Qno_catch, "no-catch");
2895 DEFSYM (Qend_of_file, "end-of-file");
2896 DEFSYM (Qarith_error, "arith-error");
2897 DEFSYM (Qbeginning_of_buffer, "beginning-of-buffer");
2898 DEFSYM (Qend_of_buffer, "end-of-buffer");
2899 DEFSYM (Qbuffer_read_only, "buffer-read-only");
2900 DEFSYM (Qtext_read_only, "text-read-only");
2901 DEFSYM (Qmark_inactive, "mark-inactive");
2903 DEFSYM (Qlistp, "listp");
2904 DEFSYM (Qconsp, "consp");
2905 DEFSYM (Qsymbolp, "symbolp");
2906 DEFSYM (Qkeywordp, "keywordp");
2907 DEFSYM (Qintegerp, "integerp");
2908 DEFSYM (Qnatnump, "natnump");
2909 DEFSYM (Qwholenump, "wholenump");
2910 DEFSYM (Qstringp, "stringp");
2911 DEFSYM (Qarrayp, "arrayp");
2912 DEFSYM (Qsequencep, "sequencep");
2913 DEFSYM (Qbufferp, "bufferp");
2914 DEFSYM (Qvectorp, "vectorp");
2915 DEFSYM (Qchar_or_string_p, "char-or-string-p");
2916 DEFSYM (Qmarkerp, "markerp");
2917 DEFSYM (Qbuffer_or_string_p, "buffer-or-string-p");
2918 DEFSYM (Qinteger_or_marker_p, "integer-or-marker-p");
2919 DEFSYM (Qboundp, "boundp");
2920 DEFSYM (Qfboundp, "fboundp");
2922 DEFSYM (Qfloatp, "floatp");
2923 DEFSYM (Qnumberp, "numberp");
2924 DEFSYM (Qnumber_or_marker_p, "number-or-marker-p");
2926 DEFSYM (Qchar_table_p, "char-table-p");
2927 DEFSYM (Qvector_or_char_table_p, "vector-or-char-table-p");
2929 DEFSYM (Qsubrp, "subrp");
2930 DEFSYM (Qunevalled, "unevalled");
2931 DEFSYM (Qmany, "many");
2933 DEFSYM (Qcdr, "cdr");
2935 /* Handle automatic advice activation. */
2936 DEFSYM (Qad_advice_info, "ad-advice-info");
2937 DEFSYM (Qad_activate_internal, "ad-activate-internal");
2939 error_tail = pure_cons (Qerror, Qnil);
2941 /* ERROR is used as a signaler for random errors for which nothing else is
2942 right. */
2944 Fput (Qerror, Qerror_conditions,
2945 error_tail);
2946 Fput (Qerror, Qerror_message,
2947 build_pure_c_string ("error"));
2949 #define PUT_ERROR(sym, tail, msg) \
2950 Fput (sym, Qerror_conditions, pure_cons (sym, tail)); \
2951 Fput (sym, Qerror_message, build_pure_c_string (msg))
2953 PUT_ERROR (Qquit, Qnil, "Quit");
2955 PUT_ERROR (Quser_error, error_tail, "");
2956 PUT_ERROR (Qwrong_type_argument, error_tail, "Wrong type argument");
2957 PUT_ERROR (Qargs_out_of_range, error_tail, "Args out of range");
2958 PUT_ERROR (Qvoid_function, error_tail,
2959 "Symbol's function definition is void");
2960 PUT_ERROR (Qcyclic_function_indirection, error_tail,
2961 "Symbol's chain of function indirections contains a loop");
2962 PUT_ERROR (Qcyclic_variable_indirection, error_tail,
2963 "Symbol's chain of variable indirections contains a loop");
2964 DEFSYM (Qcircular_list, "circular-list");
2965 PUT_ERROR (Qcircular_list, error_tail, "List contains a loop");
2966 PUT_ERROR (Qvoid_variable, error_tail, "Symbol's value as variable is void");
2967 PUT_ERROR (Qsetting_constant, error_tail,
2968 "Attempt to set a constant symbol");
2969 PUT_ERROR (Qinvalid_read_syntax, error_tail, "Invalid read syntax");
2970 PUT_ERROR (Qinvalid_function, error_tail, "Invalid function");
2971 PUT_ERROR (Qwrong_number_of_arguments, error_tail,
2972 "Wrong number of arguments");
2973 PUT_ERROR (Qno_catch, error_tail, "No catch for tag");
2974 PUT_ERROR (Qend_of_file, error_tail, "End of file during parsing");
2976 arith_tail = pure_cons (Qarith_error, error_tail);
2977 Fput (Qarith_error, Qerror_conditions, arith_tail);
2978 Fput (Qarith_error, Qerror_message, build_pure_c_string ("Arithmetic error"));
2980 PUT_ERROR (Qbeginning_of_buffer, error_tail, "Beginning of buffer");
2981 PUT_ERROR (Qend_of_buffer, error_tail, "End of buffer");
2982 PUT_ERROR (Qbuffer_read_only, error_tail, "Buffer is read-only");
2983 PUT_ERROR (Qtext_read_only, pure_cons (Qbuffer_read_only, error_tail),
2984 "Text is read-only");
2986 DEFSYM (Qrange_error, "range-error");
2987 DEFSYM (Qdomain_error, "domain-error");
2988 DEFSYM (Qsingularity_error, "singularity-error");
2989 DEFSYM (Qoverflow_error, "overflow-error");
2990 DEFSYM (Qunderflow_error, "underflow-error");
2992 PUT_ERROR (Qdomain_error, arith_tail, "Arithmetic domain error");
2994 PUT_ERROR (Qrange_error, arith_tail, "Arithmetic range error");
2996 PUT_ERROR (Qsingularity_error, Fcons (Qdomain_error, arith_tail),
2997 "Arithmetic singularity error");
2999 PUT_ERROR (Qoverflow_error, Fcons (Qdomain_error, arith_tail),
3000 "Arithmetic overflow error");
3001 PUT_ERROR (Qunderflow_error, Fcons (Qdomain_error, arith_tail),
3002 "Arithmetic underflow error");
3004 staticpro (&Qnil);
3005 staticpro (&Qt);
3006 staticpro (&Qunbound);
3008 /* Types that type-of returns. */
3009 DEFSYM (Qinteger, "integer");
3010 DEFSYM (Qsymbol, "symbol");
3011 DEFSYM (Qstring, "string");
3012 DEFSYM (Qcons, "cons");
3013 DEFSYM (Qmarker, "marker");
3014 DEFSYM (Qoverlay, "overlay");
3015 DEFSYM (Qfloat, "float");
3016 DEFSYM (Qwindow_configuration, "window-configuration");
3017 DEFSYM (Qprocess, "process");
3018 DEFSYM (Qwindow, "window");
3019 DEFSYM (Qcompiled_function, "compiled-function");
3020 DEFSYM (Qbuffer, "buffer");
3021 DEFSYM (Qframe, "frame");
3022 DEFSYM (Qvector, "vector");
3023 DEFSYM (Qchar_table, "char-table");
3024 DEFSYM (Qbool_vector, "bool-vector");
3025 DEFSYM (Qhash_table, "hash-table");
3026 DEFSYM (Qmisc, "misc");
3028 DEFSYM (Qdefun, "defun");
3030 DEFSYM (Qfont_spec, "font-spec");
3031 DEFSYM (Qfont_entity, "font-entity");
3032 DEFSYM (Qfont_object, "font-object");
3034 DEFSYM (Qinteractive_form, "interactive-form");
3035 DEFSYM (Qdefalias_fset_function, "defalias-fset-function");
3037 defsubr (&Sindirect_variable);
3038 defsubr (&Sinteractive_form);
3039 defsubr (&Seq);
3040 defsubr (&Snull);
3041 defsubr (&Stype_of);
3042 defsubr (&Slistp);
3043 defsubr (&Snlistp);
3044 defsubr (&Sconsp);
3045 defsubr (&Satom);
3046 defsubr (&Sintegerp);
3047 defsubr (&Sinteger_or_marker_p);
3048 defsubr (&Snumberp);
3049 defsubr (&Snumber_or_marker_p);
3050 defsubr (&Sfloatp);
3051 defsubr (&Snatnump);
3052 defsubr (&Ssymbolp);
3053 defsubr (&Skeywordp);
3054 defsubr (&Sstringp);
3055 defsubr (&Smultibyte_string_p);
3056 defsubr (&Svectorp);
3057 defsubr (&Schar_table_p);
3058 defsubr (&Svector_or_char_table_p);
3059 defsubr (&Sbool_vector_p);
3060 defsubr (&Sarrayp);
3061 defsubr (&Ssequencep);
3062 defsubr (&Sbufferp);
3063 defsubr (&Smarkerp);
3064 defsubr (&Ssubrp);
3065 defsubr (&Sbyte_code_function_p);
3066 defsubr (&Schar_or_string_p);
3067 defsubr (&Scar);
3068 defsubr (&Scdr);
3069 defsubr (&Scar_safe);
3070 defsubr (&Scdr_safe);
3071 defsubr (&Ssetcar);
3072 defsubr (&Ssetcdr);
3073 defsubr (&Ssymbol_function);
3074 defsubr (&Sindirect_function);
3075 defsubr (&Ssymbol_plist);
3076 defsubr (&Ssymbol_name);
3077 defsubr (&Smakunbound);
3078 defsubr (&Sfmakunbound);
3079 defsubr (&Sboundp);
3080 defsubr (&Sfboundp);
3081 defsubr (&Sfset);
3082 defsubr (&Sdefalias);
3083 defsubr (&Ssetplist);
3084 defsubr (&Ssymbol_value);
3085 defsubr (&Sset);
3086 defsubr (&Sdefault_boundp);
3087 defsubr (&Sdefault_value);
3088 defsubr (&Sset_default);
3089 defsubr (&Ssetq_default);
3090 defsubr (&Smake_variable_buffer_local);
3091 defsubr (&Smake_local_variable);
3092 defsubr (&Skill_local_variable);
3093 defsubr (&Smake_variable_frame_local);
3094 defsubr (&Slocal_variable_p);
3095 defsubr (&Slocal_variable_if_set_p);
3096 defsubr (&Svariable_binding_locus);
3097 #if 0 /* XXX Remove this. --lorentey */
3098 defsubr (&Sterminal_local_value);
3099 defsubr (&Sset_terminal_local_value);
3100 #endif
3101 defsubr (&Saref);
3102 defsubr (&Saset);
3103 defsubr (&Snumber_to_string);
3104 defsubr (&Sstring_to_number);
3105 defsubr (&Seqlsign);
3106 defsubr (&Slss);
3107 defsubr (&Sgtr);
3108 defsubr (&Sleq);
3109 defsubr (&Sgeq);
3110 defsubr (&Sneq);
3111 defsubr (&Szerop);
3112 defsubr (&Splus);
3113 defsubr (&Sminus);
3114 defsubr (&Stimes);
3115 defsubr (&Squo);
3116 defsubr (&Srem);
3117 defsubr (&Smod);
3118 defsubr (&Smax);
3119 defsubr (&Smin);
3120 defsubr (&Slogand);
3121 defsubr (&Slogior);
3122 defsubr (&Slogxor);
3123 defsubr (&Slsh);
3124 defsubr (&Sash);
3125 defsubr (&Sadd1);
3126 defsubr (&Ssub1);
3127 defsubr (&Slognot);
3128 defsubr (&Sbyteorder);
3129 defsubr (&Ssubr_arity);
3130 defsubr (&Ssubr_name);
3132 set_symbol_function (Qwholenump, XSYMBOL (Qnatnump)->function);
3134 DEFVAR_LISP ("most-positive-fixnum", Vmost_positive_fixnum,
3135 doc: /* The largest value that is representable in a Lisp integer. */);
3136 Vmost_positive_fixnum = make_number (MOST_POSITIVE_FIXNUM);
3137 XSYMBOL (intern_c_string ("most-positive-fixnum"))->constant = 1;
3139 DEFVAR_LISP ("most-negative-fixnum", Vmost_negative_fixnum,
3140 doc: /* The smallest value that is representable in a Lisp integer. */);
3141 Vmost_negative_fixnum = make_number (MOST_NEGATIVE_FIXNUM);
3142 XSYMBOL (intern_c_string ("most-negative-fixnum"))->constant = 1;