Use ALLOCATE_PSEUDOVECTOR.
[emacs.git] / src / data.c
blob9eabf68ca6b0b91bf3380e891475bc3c139ec032
1 /* Primitive operations on Lisp data types for GNU Emacs Lisp interpreter.
2 Copyright (C) 1985, 1986, 1988, 1993, 1994, 1995, 1997, 1998, 1999, 2000,
3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4 Free Software Foundation, Inc.
6 This file is part of GNU Emacs.
8 GNU Emacs is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
13 GNU Emacs is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
22 #include <config.h>
23 #include <signal.h>
24 #include <stdio.h>
25 #include <setjmp.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"
36 #ifdef STDC_HEADERS
37 #include <float.h>
38 #endif
40 /* If IEEE_FLOATING_POINT isn't defined, default it from FLT_*. */
41 #ifndef IEEE_FLOATING_POINT
42 #if (FLT_RADIX == 2 && FLT_MANT_DIG == 24 \
43 && FLT_MIN_EXP == -125 && FLT_MAX_EXP == 128)
44 #define IEEE_FLOATING_POINT 1
45 #else
46 #define IEEE_FLOATING_POINT 0
47 #endif
48 #endif
50 #include <math.h>
52 #if !defined (atof)
53 extern double atof ();
54 #endif /* !atof */
56 Lisp_Object Qnil, Qt, Qquote, Qlambda, Qsubr, Qunbound, Qthread_local_mark;
57 Lisp_Object Qerror_conditions, Qerror_message, Qtop_level;
58 Lisp_Object Qerror, Qquit, Qwrong_type_argument, Qargs_out_of_range;
59 Lisp_Object Qvoid_variable, Qvoid_function, Qcyclic_function_indirection;
60 Lisp_Object Qcyclic_variable_indirection, Qcircular_list;
61 Lisp_Object Qsetting_constant, Qinvalid_read_syntax;
62 Lisp_Object Qinvalid_function, Qwrong_number_of_arguments, Qno_catch;
63 Lisp_Object Qend_of_file, Qarith_error, Qmark_inactive;
64 Lisp_Object Qbeginning_of_buffer, Qend_of_buffer, Qbuffer_read_only;
65 Lisp_Object Qtext_read_only;
67 Lisp_Object Qintegerp, Qnatnump, Qwholenump, Qsymbolp, Qlistp, Qconsp;
68 Lisp_Object Qstringp, Qarrayp, Qsequencep, Qbufferp;
69 Lisp_Object Qchar_or_string_p, Qmarkerp, Qinteger_or_marker_p, Qvectorp;
70 Lisp_Object Qbuffer_or_string_p, Qkeywordp;
71 Lisp_Object Qboundp, Qfboundp;
72 Lisp_Object Qchar_table_p, Qvector_or_char_table_p;
74 Lisp_Object Qcdr;
75 Lisp_Object Qad_advice_info, Qad_activate_internal;
77 Lisp_Object Qrange_error, Qdomain_error, Qsingularity_error;
78 Lisp_Object Qoverflow_error, Qunderflow_error;
80 Lisp_Object Qfloatp;
81 Lisp_Object Qnumberp, Qnumber_or_marker_p;
83 Lisp_Object Qinteger;
84 static Lisp_Object Qsymbol, Qstring, Qcons, Qmarker, Qoverlay;
85 static Lisp_Object Qfloat, Qwindow_configuration, Qwindow;
86 Lisp_Object Qprocess;
87 static Lisp_Object Qcompiled_function, Qbuffer, Qframe, Qvector;
88 static Lisp_Object Qchar_table, Qbool_vector, Qhash_table;
89 static Lisp_Object Qsubrp, Qmany, Qunevalled;
90 Lisp_Object Qfont_spec, Qfont_entity, Qfont_object;
92 Lisp_Object Qinteractive_form;
94 static Lisp_Object swap_in_symval_forwarding P_ ((Lisp_Object, Lisp_Object));
96 Lisp_Object impl_Vmost_positive_fixnum, impl_Vmost_negative_fixnum;
99 void
100 circular_list_error (list)
101 Lisp_Object list;
103 xsignal (Qcircular_list, list);
107 Lisp_Object
108 wrong_type_argument (predicate, value)
109 register Lisp_Object predicate, value;
111 /* If VALUE is not even a valid Lisp object, we'd want to abort here
112 where we can get a backtrace showing where it came from. We used
113 to try and do that by checking the tagbits, but nowadays all
114 tagbits are potentially valid. */
115 /* if ((unsigned int) XTYPE (value) >= Lisp_Type_Limit)
116 * abort (); */
118 xsignal2 (Qwrong_type_argument, predicate, value);
121 void
122 pure_write_error ()
124 error ("Attempt to modify read-only object");
127 void
128 args_out_of_range (a1, a2)
129 Lisp_Object a1, a2;
131 xsignal2 (Qargs_out_of_range, a1, a2);
134 void
135 args_out_of_range_3 (a1, a2, a3)
136 Lisp_Object a1, a2, a3;
138 xsignal3 (Qargs_out_of_range, a1, a2, a3);
141 /* On some machines, XINT needs a temporary location.
142 Here it is, in case it is needed. */
144 int sign_extend_temp;
146 /* On a few machines, XINT can only be done by calling this. */
149 sign_extend_lisp_int (num)
150 EMACS_INT num;
152 if (num & (((EMACS_INT) 1) << (VALBITS - 1)))
153 return num | (((EMACS_INT) (-1)) << VALBITS);
154 else
155 return num & ((((EMACS_INT) 1) << VALBITS) - 1);
158 /* Data type predicates */
160 DEFUN ("eq", Feq, Seq, 2, 2, 0,
161 doc: /* Return t if the two args are the same Lisp object. */)
162 (obj1, obj2)
163 Lisp_Object obj1, obj2;
165 if (EQ (obj1, obj2))
166 return Qt;
167 return Qnil;
170 DEFUN ("null", Fnull, Snull, 1, 1, 0,
171 doc: /* Return t if OBJECT is nil. */)
172 (object)
173 Lisp_Object object;
175 if (NILP (object))
176 return Qt;
177 return Qnil;
180 DEFUN ("type-of", Ftype_of, Stype_of, 1, 1, 0,
181 doc: /* Return a symbol representing the type of OBJECT.
182 The symbol returned names the object's basic type;
183 for example, (type-of 1) returns `integer'. */)
184 (object)
185 Lisp_Object object;
187 switch (XTYPE (object))
189 case_Lisp_Int:
190 return Qinteger;
192 case Lisp_Symbol:
193 return Qsymbol;
195 case Lisp_String:
196 return Qstring;
198 case Lisp_Cons:
199 return Qcons;
201 case Lisp_Misc:
202 switch (XMISCTYPE (object))
204 case Lisp_Misc_Marker:
205 return Qmarker;
206 case Lisp_Misc_Overlay:
207 return Qoverlay;
208 case Lisp_Misc_Float:
209 return Qfloat;
211 abort ();
213 case Lisp_Vectorlike:
214 if (WINDOW_CONFIGURATIONP (object))
215 return Qwindow_configuration;
216 if (PROCESSP (object))
217 return Qprocess;
218 if (WINDOWP (object))
219 return Qwindow;
220 if (SUBRP (object))
221 return Qsubr;
222 if (COMPILEDP (object))
223 return Qcompiled_function;
224 if (BUFFERP (object))
225 return Qbuffer;
226 if (CHAR_TABLE_P (object))
227 return Qchar_table;
228 if (BOOL_VECTOR_P (object))
229 return Qbool_vector;
230 if (FRAMEP (object))
231 return Qframe;
232 if (HASH_TABLE_P (object))
233 return Qhash_table;
234 if (FONT_SPEC_P (object))
235 return Qfont_spec;
236 if (FONT_ENTITY_P (object))
237 return Qfont_entity;
238 if (FONT_OBJECT_P (object))
239 return Qfont_object;
240 return Qvector;
242 case Lisp_Float:
243 return Qfloat;
245 default:
246 abort ();
250 DEFUN ("consp", Fconsp, Sconsp, 1, 1, 0,
251 doc: /* Return t if OBJECT is a cons cell. */)
252 (object)
253 Lisp_Object object;
255 if (CONSP (object))
256 return Qt;
257 return Qnil;
260 DEFUN ("atom", Fatom, Satom, 1, 1, 0,
261 doc: /* Return t if OBJECT is not a cons cell. This includes nil. */)
262 (object)
263 Lisp_Object object;
265 if (CONSP (object))
266 return Qnil;
267 return Qt;
270 DEFUN ("listp", Flistp, Slistp, 1, 1, 0,
271 doc: /* Return t if OBJECT is a list, that is, a cons cell or nil.
272 Otherwise, return nil. */)
273 (object)
274 Lisp_Object object;
276 if (CONSP (object) || NILP (object))
277 return Qt;
278 return Qnil;
281 DEFUN ("nlistp", Fnlistp, Snlistp, 1, 1, 0,
282 doc: /* Return t if OBJECT is not a list. Lists include nil. */)
283 (object)
284 Lisp_Object object;
286 if (CONSP (object) || NILP (object))
287 return Qnil;
288 return Qt;
291 DEFUN ("symbolp", Fsymbolp, Ssymbolp, 1, 1, 0,
292 doc: /* Return t if OBJECT is a symbol. */)
293 (object)
294 Lisp_Object object;
296 if (SYMBOLP (object))
297 return Qt;
298 return Qnil;
301 /* Define this in C to avoid unnecessarily consing up the symbol
302 name. */
303 DEFUN ("keywordp", Fkeywordp, Skeywordp, 1, 1, 0,
304 doc: /* Return t if OBJECT is a keyword.
305 This means that it is a symbol with a print name beginning with `:'
306 interned in the initial obarray. */)
307 (object)
308 Lisp_Object object;
310 if (SYMBOLP (object)
311 && SREF (SYMBOL_NAME (object), 0) == ':'
312 && SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P (object))
313 return Qt;
314 return Qnil;
317 DEFUN ("vectorp", Fvectorp, Svectorp, 1, 1, 0,
318 doc: /* Return t if OBJECT is a vector. */)
319 (object)
320 Lisp_Object object;
322 if (VECTORP (object))
323 return Qt;
324 return Qnil;
327 DEFUN ("stringp", Fstringp, Sstringp, 1, 1, 0,
328 doc: /* Return t if OBJECT is a string. */)
329 (object)
330 Lisp_Object object;
332 if (STRINGP (object))
333 return Qt;
334 return Qnil;
337 DEFUN ("multibyte-string-p", Fmultibyte_string_p, Smultibyte_string_p,
338 1, 1, 0,
339 doc: /* Return t if OBJECT is a multibyte string. */)
340 (object)
341 Lisp_Object object;
343 if (STRINGP (object) && STRING_MULTIBYTE (object))
344 return Qt;
345 return Qnil;
348 DEFUN ("char-table-p", Fchar_table_p, Schar_table_p, 1, 1, 0,
349 doc: /* Return t if OBJECT is a char-table. */)
350 (object)
351 Lisp_Object object;
353 if (CHAR_TABLE_P (object))
354 return Qt;
355 return Qnil;
358 DEFUN ("vector-or-char-table-p", Fvector_or_char_table_p,
359 Svector_or_char_table_p, 1, 1, 0,
360 doc: /* Return t if OBJECT is a char-table or vector. */)
361 (object)
362 Lisp_Object object;
364 if (VECTORP (object) || CHAR_TABLE_P (object))
365 return Qt;
366 return Qnil;
369 DEFUN ("bool-vector-p", Fbool_vector_p, Sbool_vector_p, 1, 1, 0,
370 doc: /* Return t if OBJECT is a bool-vector. */)
371 (object)
372 Lisp_Object object;
374 if (BOOL_VECTOR_P (object))
375 return Qt;
376 return Qnil;
379 DEFUN ("arrayp", Farrayp, Sarrayp, 1, 1, 0,
380 doc: /* Return t if OBJECT is an array (string or vector). */)
381 (object)
382 Lisp_Object object;
384 if (ARRAYP (object))
385 return Qt;
386 return Qnil;
389 DEFUN ("sequencep", Fsequencep, Ssequencep, 1, 1, 0,
390 doc: /* Return t if OBJECT is a sequence (list or array). */)
391 (object)
392 register Lisp_Object object;
394 if (CONSP (object) || NILP (object) || ARRAYP (object))
395 return Qt;
396 return Qnil;
399 DEFUN ("bufferp", Fbufferp, Sbufferp, 1, 1, 0,
400 doc: /* Return t if OBJECT is an editor buffer. */)
401 (object)
402 Lisp_Object object;
404 if (BUFFERP (object))
405 return Qt;
406 return Qnil;
409 DEFUN ("markerp", Fmarkerp, Smarkerp, 1, 1, 0,
410 doc: /* Return t if OBJECT is a marker (editor pointer). */)
411 (object)
412 Lisp_Object object;
414 if (MARKERP (object))
415 return Qt;
416 return Qnil;
419 DEFUN ("subrp", Fsubrp, Ssubrp, 1, 1, 0,
420 doc: /* Return t if OBJECT is a built-in function. */)
421 (object)
422 Lisp_Object object;
424 if (SUBRP (object))
425 return Qt;
426 return Qnil;
429 DEFUN ("byte-code-function-p", Fbyte_code_function_p, Sbyte_code_function_p,
430 1, 1, 0,
431 doc: /* Return t if OBJECT is a byte-compiled function object. */)
432 (object)
433 Lisp_Object object;
435 if (COMPILEDP (object))
436 return Qt;
437 return Qnil;
440 DEFUN ("char-or-string-p", Fchar_or_string_p, Schar_or_string_p, 1, 1, 0,
441 doc: /* Return t if OBJECT is a character or a string. */)
442 (object)
443 register Lisp_Object object;
445 if (CHARACTERP (object) || STRINGP (object))
446 return Qt;
447 return Qnil;
450 DEFUN ("integerp", Fintegerp, Sintegerp, 1, 1, 0,
451 doc: /* Return t if OBJECT is an integer. */)
452 (object)
453 Lisp_Object object;
455 if (INTEGERP (object))
456 return Qt;
457 return Qnil;
460 DEFUN ("integer-or-marker-p", Finteger_or_marker_p, Sinteger_or_marker_p, 1, 1, 0,
461 doc: /* Return t if OBJECT is an integer or a marker (editor pointer). */)
462 (object)
463 register Lisp_Object object;
465 if (MARKERP (object) || INTEGERP (object))
466 return Qt;
467 return Qnil;
470 DEFUN ("natnump", Fnatnump, Snatnump, 1, 1, 0,
471 doc: /* Return t if OBJECT is a nonnegative integer. */)
472 (object)
473 Lisp_Object object;
475 if (NATNUMP (object))
476 return Qt;
477 return Qnil;
480 DEFUN ("numberp", Fnumberp, Snumberp, 1, 1, 0,
481 doc: /* Return t if OBJECT is a number (floating point or integer). */)
482 (object)
483 Lisp_Object object;
485 if (NUMBERP (object))
486 return Qt;
487 else
488 return Qnil;
491 DEFUN ("number-or-marker-p", Fnumber_or_marker_p,
492 Snumber_or_marker_p, 1, 1, 0,
493 doc: /* Return t if OBJECT is a number or a marker. */)
494 (object)
495 Lisp_Object object;
497 if (NUMBERP (object) || MARKERP (object))
498 return Qt;
499 return Qnil;
502 DEFUN ("floatp", Ffloatp, Sfloatp, 1, 1, 0,
503 doc: /* Return t if OBJECT is a floating point number. */)
504 (object)
505 Lisp_Object object;
507 if (FLOATP (object))
508 return Qt;
509 return Qnil;
513 /* Extract and set components of lists */
515 DEFUN ("car", Fcar, Scar, 1, 1, 0,
516 doc: /* Return the car of LIST. If arg is nil, return nil.
517 Error if arg is not nil and not a cons cell. See also `car-safe'.
519 See Info node `(elisp)Cons Cells' for a discussion of related basic
520 Lisp concepts such as car, cdr, cons cell and list. */)
521 (list)
522 register Lisp_Object list;
524 return CAR (list);
527 DEFUN ("car-safe", Fcar_safe, Scar_safe, 1, 1, 0,
528 doc: /* Return the car of OBJECT if it is a cons cell, or else nil. */)
529 (object)
530 Lisp_Object object;
532 return CAR_SAFE (object);
535 DEFUN ("cdr", Fcdr, Scdr, 1, 1, 0,
536 doc: /* Return the cdr of LIST. If arg is nil, return nil.
537 Error if arg is not nil and not a cons cell. See also `cdr-safe'.
539 See Info node `(elisp)Cons Cells' for a discussion of related basic
540 Lisp concepts such as cdr, car, cons cell and list. */)
541 (list)
542 register Lisp_Object list;
544 return CDR (list);
547 DEFUN ("cdr-safe", Fcdr_safe, Scdr_safe, 1, 1, 0,
548 doc: /* Return the cdr of OBJECT if it is a cons cell, or else nil. */)
549 (object)
550 Lisp_Object object;
552 return CDR_SAFE (object);
555 DEFUN ("setcar", Fsetcar, Ssetcar, 2, 2, 0,
556 doc: /* Set the car of CELL to be NEWCAR. Returns NEWCAR. */)
557 (cell, newcar)
558 register Lisp_Object cell, newcar;
560 CHECK_CONS (cell);
561 CHECK_IMPURE (cell);
562 XSETCAR (cell, newcar);
563 return newcar;
566 DEFUN ("setcdr", Fsetcdr, Ssetcdr, 2, 2, 0,
567 doc: /* Set the cdr of CELL to be NEWCDR. Returns NEWCDR. */)
568 (cell, newcdr)
569 register Lisp_Object cell, newcdr;
571 CHECK_CONS (cell);
572 CHECK_IMPURE (cell);
573 XSETCDR (cell, newcdr);
574 return newcdr;
577 /* Extract and set components of symbols */
579 DEFUN ("boundp", Fboundp, Sboundp, 1, 1, 0,
580 doc: /* Return t if SYMBOL's value is not void. */)
581 (symbol)
582 register Lisp_Object symbol;
584 Lisp_Object valcontents;
586 valcontents = find_symbol_value (symbol);
588 return (EQ (valcontents, Qunbound) ? Qnil : Qt);
591 DEFUN ("fboundp", Ffboundp, Sfboundp, 1, 1, 0,
592 doc: /* Return t if SYMBOL's function definition is not void. */)
593 (symbol)
594 register Lisp_Object symbol;
596 CHECK_SYMBOL (symbol);
597 return (EQ (XSYMBOL (symbol)->function, Qunbound) ? Qnil : Qt);
600 DEFUN ("makunbound", Fmakunbound, Smakunbound, 1, 1, 0,
601 doc: /* Make SYMBOL's value be void.
602 Return SYMBOL. */)
603 (symbol)
604 register Lisp_Object symbol;
606 CHECK_SYMBOL (symbol);
607 if (SYMBOL_CONSTANT_P (symbol))
608 xsignal1 (Qsetting_constant, symbol);
609 Fset (symbol, Qunbound);
610 return symbol;
613 DEFUN ("fmakunbound", Ffmakunbound, Sfmakunbound, 1, 1, 0,
614 doc: /* Make SYMBOL's function definition be void.
615 Return SYMBOL. */)
616 (symbol)
617 register Lisp_Object symbol;
619 CHECK_SYMBOL (symbol);
620 if (NILP (symbol) || EQ (symbol, Qt))
621 xsignal1 (Qsetting_constant, symbol);
622 XSYMBOL (symbol)->function = Qunbound;
623 return symbol;
626 DEFUN ("symbol-function", Fsymbol_function, Ssymbol_function, 1, 1, 0,
627 doc: /* Return SYMBOL's function definition. Error if that is void. */)
628 (symbol)
629 register Lisp_Object symbol;
631 CHECK_SYMBOL (symbol);
632 if (!EQ (XSYMBOL (symbol)->function, Qunbound))
633 return XSYMBOL (symbol)->function;
634 xsignal1 (Qvoid_function, symbol);
637 DEFUN ("symbol-plist", Fsymbol_plist, Ssymbol_plist, 1, 1, 0,
638 doc: /* Return SYMBOL's property list. */)
639 (symbol)
640 register Lisp_Object symbol;
642 CHECK_SYMBOL (symbol);
643 return XSYMBOL (symbol)->plist;
646 DEFUN ("symbol-name", Fsymbol_name, Ssymbol_name, 1, 1, 0,
647 doc: /* Return SYMBOL's name, a string. */)
648 (symbol)
649 register Lisp_Object symbol;
651 register Lisp_Object name;
653 CHECK_SYMBOL (symbol);
654 name = SYMBOL_NAME (symbol);
655 return name;
658 DEFUN ("fset", Ffset, Sfset, 2, 2, 0,
659 doc: /* Set SYMBOL's function definition to DEFINITION, and return DEFINITION. */)
660 (symbol, definition)
661 register Lisp_Object symbol, definition;
663 register Lisp_Object function;
665 CHECK_SYMBOL (symbol);
666 if (NILP (symbol) || EQ (symbol, Qt))
667 xsignal1 (Qsetting_constant, symbol);
669 function = XSYMBOL (symbol)->function;
671 if (!NILP (Vautoload_queue) && !EQ (function, Qunbound))
672 Vautoload_queue = Fcons (Fcons (symbol, function), Vautoload_queue);
674 if (CONSP (function) && EQ (XCAR (function), Qautoload))
675 Fput (symbol, Qautoload, XCDR (function));
677 XSYMBOL (symbol)->function = definition;
678 /* Handle automatic advice activation */
679 if (CONSP (XSYMBOL (symbol)->plist) && !NILP (Fget (symbol, Qad_advice_info)))
681 call2 (Qad_activate_internal, symbol, Qnil);
682 definition = XSYMBOL (symbol)->function;
684 return definition;
687 extern Lisp_Object Qfunction_documentation;
689 DEFUN ("defalias", Fdefalias, Sdefalias, 2, 3, 0,
690 doc: /* Set SYMBOL's function definition to DEFINITION, and return DEFINITION.
691 Associates the function with the current load file, if any.
692 The optional third argument DOCSTRING specifies the documentation string
693 for SYMBOL; if it is omitted or nil, SYMBOL uses the documentation string
694 determined by DEFINITION. */)
695 (symbol, definition, docstring)
696 register Lisp_Object symbol, definition, docstring;
698 CHECK_SYMBOL (symbol);
699 if (CONSP (XSYMBOL (symbol)->function)
700 && EQ (XCAR (XSYMBOL (symbol)->function), Qautoload))
701 LOADHIST_ATTACH (Fcons (Qt, symbol));
702 definition = Ffset (symbol, definition);
703 LOADHIST_ATTACH (Fcons (Qdefun, symbol));
704 if (!NILP (docstring))
705 Fput (symbol, Qfunction_documentation, docstring);
706 return definition;
709 DEFUN ("setplist", Fsetplist, Ssetplist, 2, 2, 0,
710 doc: /* Set SYMBOL's property list to NEWPLIST, and return NEWPLIST. */)
711 (symbol, newplist)
712 register Lisp_Object symbol, newplist;
714 CHECK_SYMBOL (symbol);
715 XSYMBOL (symbol)->plist = newplist;
716 return newplist;
719 DEFUN ("subr-arity", Fsubr_arity, Ssubr_arity, 1, 1, 0,
720 doc: /* Return minimum and maximum number of args allowed for SUBR.
721 SUBR must be a built-in function.
722 The returned value is a pair (MIN . MAX). MIN is the minimum number
723 of args. MAX is the maximum number or the symbol `many', for a
724 function with `&rest' args, or `unevalled' for a special form. */)
725 (subr)
726 Lisp_Object subr;
728 short minargs, maxargs;
729 CHECK_SUBR (subr);
730 minargs = XSUBR (subr)->min_args;
731 maxargs = XSUBR (subr)->max_args;
732 if (maxargs == MANY)
733 return Fcons (make_number (minargs), Qmany);
734 else if (maxargs == UNEVALLED)
735 return Fcons (make_number (minargs), Qunevalled);
736 else
737 return Fcons (make_number (minargs), make_number (maxargs));
740 DEFUN ("subr-name", Fsubr_name, Ssubr_name, 1, 1, 0,
741 doc: /* Return name of subroutine SUBR.
742 SUBR must be a built-in function. */)
743 (subr)
744 Lisp_Object subr;
746 const char *name;
747 CHECK_SUBR (subr);
748 name = XSUBR (subr)->symbol_name;
749 return make_string (name, strlen (name));
752 DEFUN ("interactive-form", Finteractive_form, Sinteractive_form, 1, 1, 0,
753 doc: /* Return the interactive form of CMD or nil if none.
754 If CMD is not a command, the return value is nil.
755 Value, if non-nil, is a list \(interactive SPEC). */)
756 (cmd)
757 Lisp_Object cmd;
759 Lisp_Object fun = indirect_function (cmd); /* Check cycles. */
761 if (NILP (fun) || EQ (fun, Qunbound))
762 return Qnil;
764 /* Use an `interactive-form' property if present, analogous to the
765 function-documentation property. */
766 fun = cmd;
767 while (SYMBOLP (fun))
769 Lisp_Object tmp = Fget (fun, Qinteractive_form);
770 if (!NILP (tmp))
771 return tmp;
772 else
773 fun = Fsymbol_function (fun);
776 if (SUBRP (fun))
778 char *spec = XSUBR (fun)->intspec;
779 if (spec)
780 return list2 (Qinteractive,
781 (*spec != '(') ? build_string (spec) :
782 Fcar (Fread_from_string (build_string (spec), Qnil, Qnil)));
784 else if (COMPILEDP (fun))
786 if ((ASIZE (fun) & PSEUDOVECTOR_SIZE_MASK) > COMPILED_INTERACTIVE)
787 return list2 (Qinteractive, AREF (fun, COMPILED_INTERACTIVE));
789 else if (CONSP (fun))
791 Lisp_Object funcar = XCAR (fun);
792 if (EQ (funcar, Qlambda))
793 return Fassq (Qinteractive, Fcdr (XCDR (fun)));
794 else if (EQ (funcar, Qautoload))
796 struct gcpro gcpro1;
797 GCPRO1 (cmd);
798 do_autoload (fun, cmd);
799 UNGCPRO;
800 return Finteractive_form (cmd);
803 return Qnil;
807 /***********************************************************************
808 Getting and Setting Values of Symbols
809 ***********************************************************************/
811 Lisp_Object *
812 find_variable_location (Lisp_Object *root)
814 if (THREADLOCALP (*root))
816 struct Lisp_ThreadLocal *thr = XTHREADLOCAL (*root);
817 Lisp_Object cons = assq_no_quit (get_current_thread (),
818 thr->thread_alist);
819 if (!EQ (cons, Qnil))
820 return &XCDR_AS_LVALUE (cons);
821 return &thr->global;
824 return root;
827 Lisp_Object
828 ensure_thread_local (Lisp_Object *root)
830 Lisp_Object cons;
832 if (THREADLOCALP (*root))
833 cons = assq_no_quit (get_current_thread (),
834 XTHREADLOCAL (*root)->thread_alist);
835 else
837 Lisp_Object newval;
838 newval = allocate_misc ();
839 XMISCTYPE (newval) = Lisp_Misc_ThreadLocal;
840 XTHREADLOCAL (newval)->global = *root;
841 XTHREADLOCAL (newval)->thread_alist = Qnil;
842 *root = newval;
843 cons = Qnil;
846 if (NILP (cons))
848 struct Lisp_ThreadLocal *local = XTHREADLOCAL (*root);
849 cons = Fcons (get_current_thread (), Qthread_local_mark);
850 local->thread_alist = Fcons (cons, local->thread_alist);
853 return cons;
856 void
857 remove_thread_local (Lisp_Object *root)
859 if (THREADLOCALP (*root))
861 Lisp_Object iter, thr = get_current_thread (), prior = Qnil;
862 struct Lisp_ThreadLocal *local = XTHREADLOCAL (*root);
863 for (iter = local->thread_alist; !NILP (iter); iter = XCDR (iter))
865 if (EQ (XCAR (XCAR (iter)), thr))
867 if (NILP (prior))
868 local->thread_alist = XCDR (iter);
869 else
870 XSETCDR (prior, XCDR (iter));
871 break;
873 prior = iter;
878 /* Return the symbol holding SYMBOL's value. Signal
879 `cyclic-variable-indirection' if SYMBOL's chain of variable
880 indirections contains a loop. */
882 struct Lisp_Symbol *
883 indirect_variable (symbol)
884 struct Lisp_Symbol *symbol;
886 struct Lisp_Symbol *tortoise, *hare;
888 hare = tortoise = symbol;
890 while (hare->indirect_variable)
892 hare = XSYMBOL (hare->value);
893 if (!hare->indirect_variable)
894 break;
896 hare = XSYMBOL (hare->value);
897 tortoise = XSYMBOL (tortoise->value);
899 if (hare == tortoise)
901 Lisp_Object tem;
902 XSETSYMBOL (tem, symbol);
903 xsignal1 (Qcyclic_variable_indirection, tem);
907 return hare;
911 DEFUN ("indirect-variable", Findirect_variable, Sindirect_variable, 1, 1, 0,
912 doc: /* Return the variable at the end of OBJECT's variable chain.
913 If OBJECT is a symbol, follow all variable indirections and return the final
914 variable. If OBJECT is not a symbol, just return it.
915 Signal a cyclic-variable-indirection error if there is a loop in the
916 variable chain of symbols. */)
917 (object)
918 Lisp_Object object;
920 if (SYMBOLP (object))
921 XSETSYMBOL (object, indirect_variable (XSYMBOL (object)));
922 return object;
926 /* Given the raw contents of a symbol value cell,
927 return the Lisp value of the symbol.
928 This does not handle buffer-local variables; use
929 swap_in_symval_forwarding for that. */
931 Lisp_Object
932 do_symval_forwarding (valcontents)
933 Lisp_Object valcontents;
935 register Lisp_Object val;
936 if (MISCP (valcontents))
937 switch (XMISCTYPE (valcontents))
939 case Lisp_Misc_Intfwd:
940 XSETINT (val, *XINTFWD (valcontents)->intvar);
941 return val;
943 case Lisp_Misc_Boolfwd:
944 return (*XBOOLFWD (valcontents)->boolvar ? Qt : Qnil);
946 case Lisp_Misc_Objfwd:
947 return *XOBJFWD (valcontents)->objvar;
949 case Lisp_Misc_Buffer_Objfwd:
950 return PER_BUFFER_VALUE (current_buffer,
951 XBUFFER_OBJFWD (valcontents)->offset);
953 case Lisp_Misc_Kboard_Objfwd:
954 /* We used to simply use current_kboard here, but from Lisp
955 code, it's value is often unexpected. It seems nicer to
956 allow constructions like this to work as intuitively expected:
958 (with-selected-frame frame
959 (define-key local-function-map "\eOP" [f1]))
961 On the other hand, this affects the semantics of
962 last-command and real-last-command, and people may rely on
963 that. I took a quick look at the Lisp codebase, and I
964 don't think anything will break. --lorentey */
965 return *(Lisp_Object *)(XKBOARD_OBJFWD (valcontents)->offset
966 + (char *)FRAME_KBOARD (SELECTED_FRAME ()));
968 case Lisp_Misc_ThreadLocal:
969 return *find_variable_location (&valcontents);
971 return valcontents;
974 /* Store NEWVAL into SYMBOL, where VALCONTENTS is found in the value cell
975 of SYMBOL. If SYMBOL is buffer-local, VALCONTENTS should be the
976 buffer-independent contents of the value cell: forwarded just one
977 step past the buffer-localness.
979 BUF non-zero means set the value in buffer BUF instead of the
980 current buffer. This only plays a role for per-buffer variables. */
982 void
983 store_symval_forwarding (symbol, valcontents, newval, buf)
984 Lisp_Object symbol;
985 register Lisp_Object valcontents, newval;
986 struct buffer *buf;
988 switch (SWITCH_ENUM_CAST (XTYPE (valcontents)))
990 case Lisp_Misc:
991 switch (XMISCTYPE (valcontents))
993 case Lisp_Misc_Intfwd:
994 CHECK_NUMBER (newval);
995 *XINTFWD (valcontents)->intvar = XINT (newval);
996 /* This can never happen since intvar points to an EMACS_INT
997 which is at least large enough to hold a Lisp_Object.
998 if (*XINTFWD (valcontents)->intvar != XINT (newval))
999 error ("Value out of range for variable `%s'",
1000 SDATA (SYMBOL_NAME (symbol))); */
1001 break;
1003 case Lisp_Misc_Boolfwd:
1004 *XBOOLFWD (valcontents)->boolvar = !NILP (newval);
1005 break;
1007 case Lisp_Misc_Objfwd:
1008 *find_variable_location (XOBJFWD (valcontents)->objvar) = newval;
1010 /* If this variable is a default for something stored
1011 in the buffer itself, such as default-fill-column,
1012 find the buffers that don't have local values for it
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 buf;
1029 struct buffer *b;
1031 buf = Fcdr (XCAR (tail));
1032 if (!BUFFERP (buf)) continue;
1033 b = XBUFFER (buf);
1035 if (! PER_BUFFER_VALUE_P (b, idx))
1036 PER_BUFFER_VALUE (b, offset) = newval;
1039 break;
1041 case Lisp_Misc_Buffer_Objfwd:
1043 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1044 Lisp_Object type = XBUFFER_OBJFWD (valcontents)->slottype;
1046 if (!(NILP (type) || NILP (newval)
1047 || (XINT (type) == LISP_INT_TAG
1048 ? INTEGERP (newval)
1049 : XTYPE (newval) == XINT (type))))
1050 buffer_slot_type_mismatch (newval, XINT (type));
1052 if (buf == NULL)
1053 buf = current_buffer;
1054 PER_BUFFER_VALUE (buf, offset) = newval;
1056 break;
1058 case Lisp_Misc_Kboard_Objfwd:
1060 char *base = (char *) FRAME_KBOARD (SELECTED_FRAME ());
1061 char *p = base + XKBOARD_OBJFWD (valcontents)->offset;
1062 *(Lisp_Object *) p = newval;
1064 break;
1066 default:
1067 goto def;
1069 break;
1071 default:
1072 def:
1073 valcontents = SYMBOL_VALUE (symbol);
1074 if (BUFFER_LOCAL_VALUEP (valcontents))
1075 XBUFFER_LOCAL_VALUE (valcontents)->realvalue = newval;
1076 else if (THREADLOCALP (valcontents))
1077 *find_variable_location (&indirect_variable (XSYMBOL (symbol))->value) = newval;
1078 else
1079 SET_SYMBOL_VALUE (symbol, newval);
1083 /* Set up SYMBOL to refer to its global binding.
1084 This makes it safe to alter the status of other bindings. */
1086 void
1087 swap_in_global_binding (symbol)
1088 Lisp_Object symbol;
1090 Lisp_Object valcontents = SYMBOL_VALUE (symbol);
1091 struct Lisp_Buffer_Local_Value *blv = XBUFFER_LOCAL_VALUE (valcontents);
1092 Lisp_Object cdr = blv->cdr;
1094 /* Unload the previously loaded binding. */
1095 Fsetcdr (XCAR (cdr),
1096 do_symval_forwarding (blv->realvalue));
1098 /* Select the global binding in the symbol. */
1099 XSETCAR (cdr, cdr);
1100 store_symval_forwarding (symbol, blv->realvalue, XCDR (cdr), NULL);
1102 /* Indicate that the global binding is set up now. */
1103 blv->frame = Qnil;
1104 blv->buffer = Qnil;
1105 blv->found_for_frame = 0;
1106 blv->found_for_buffer = 0;
1109 /* Set up the buffer-local symbol SYMBOL for validity in the current buffer.
1110 VALCONTENTS is the contents of its value cell,
1111 which points to a struct Lisp_Buffer_Local_Value.
1113 Return the value forwarded one step past the buffer-local stage.
1114 This could be another forwarding pointer. */
1116 static Lisp_Object
1117 swap_in_symval_forwarding (symbol, valcontents)
1118 Lisp_Object symbol, valcontents;
1120 register Lisp_Object tem1;
1122 tem1 = XBUFFER_LOCAL_VALUE (valcontents)->buffer;
1124 if (NILP (tem1)
1125 || current_buffer != XBUFFER (tem1)
1126 || (XBUFFER_LOCAL_VALUE (valcontents)->check_frame
1127 && ! EQ (selected_frame, XBUFFER_LOCAL_VALUE (valcontents)->frame)))
1129 struct Lisp_Symbol *sym = XSYMBOL (symbol);
1130 if (sym->indirect_variable)
1132 sym = indirect_variable (sym);
1133 XSETSYMBOL (symbol, sym);
1136 /* Unload the previously loaded binding. */
1137 tem1 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1138 Fsetcdr (tem1,
1139 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue));
1140 /* Choose the new binding. */
1141 tem1 = assq_no_quit (symbol, BUF_LOCAL_VAR_ALIST (current_buffer));
1142 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 0;
1143 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
1144 if (NILP (tem1))
1146 if (XBUFFER_LOCAL_VALUE (valcontents)->check_frame)
1147 tem1 = assq_no_quit (symbol, XFRAME (selected_frame)->param_alist);
1148 if (! NILP (tem1))
1149 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 1;
1150 else
1151 tem1 = XBUFFER_LOCAL_VALUE (valcontents)->cdr;
1153 else
1154 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 1;
1156 /* Load the new binding. */
1157 XSETCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr, tem1);
1158 XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer, current_buffer);
1159 XBUFFER_LOCAL_VALUE (valcontents)->frame = selected_frame;
1160 store_symval_forwarding (symbol,
1161 XBUFFER_LOCAL_VALUE (valcontents)->realvalue,
1162 Fcdr (tem1), NULL);
1164 return XBUFFER_LOCAL_VALUE (valcontents)->realvalue;
1167 /* Find the value of a symbol, returning Qunbound if it's not bound.
1168 This is helpful for code which just wants to get a variable's value
1169 if it has one, without signaling an error.
1170 Note that it must not be possible to quit
1171 within this function. Great care is required for this. */
1173 Lisp_Object
1174 find_symbol_value (symbol)
1175 Lisp_Object symbol;
1177 register Lisp_Object valcontents;
1178 register Lisp_Object val;
1180 CHECK_SYMBOL (symbol);
1181 valcontents = SYMBOL_VALUE (symbol);
1183 if (BUFFER_LOCAL_VALUEP (valcontents))
1184 valcontents = swap_in_symval_forwarding (symbol, valcontents);
1186 return do_symval_forwarding (valcontents);
1189 DEFUN ("symbol-value", Fsymbol_value, Ssymbol_value, 1, 1, 0,
1190 doc: /* Return SYMBOL's value. Error if that is void. */)
1191 (symbol)
1192 Lisp_Object symbol;
1194 Lisp_Object val;
1196 val = find_symbol_value (symbol);
1197 if (!EQ (val, Qunbound))
1198 return val;
1200 xsignal1 (Qvoid_variable, symbol);
1203 DEFUN ("set", Fset, Sset, 2, 2, 0,
1204 doc: /* Set SYMBOL's value to NEWVAL, and return NEWVAL. */)
1205 (symbol, newval)
1206 register Lisp_Object symbol, newval;
1208 return set_internal (symbol, newval, current_buffer, 0);
1211 /* Return 1 if SYMBOL currently has a let-binding
1212 which was made in the buffer that is now current. */
1214 static int
1215 let_shadows_buffer_binding_p (symbol)
1216 struct Lisp_Symbol *symbol;
1218 volatile struct specbinding *p;
1220 for (p = specpdl_ptr - 1; p >= specpdl; p--)
1221 if (p->func == NULL
1222 && CONSP (p->symbol))
1224 struct Lisp_Symbol *let_bound_symbol = XSYMBOL (XCAR (p->symbol));
1225 if ((symbol == let_bound_symbol
1226 || (let_bound_symbol->indirect_variable
1227 && symbol == indirect_variable (let_bound_symbol)))
1228 && XBUFFER (XCDR (XCDR (p->symbol))) == current_buffer)
1229 break;
1232 return p >= specpdl;
1235 /* Store the value NEWVAL into SYMBOL.
1236 If buffer-locality is an issue, BUF specifies which buffer to use.
1237 (0 stands for the current buffer.)
1239 If BINDFLAG is zero, then if this symbol is supposed to become
1240 local in every buffer where it is set, then we make it local.
1241 If BINDFLAG is nonzero, we don't do that. */
1243 Lisp_Object
1244 set_internal (symbol, newval, buf, bindflag)
1245 register Lisp_Object symbol, newval;
1246 struct buffer *buf;
1247 int bindflag;
1249 int voide = EQ (newval, Qunbound);
1251 register Lisp_Object valcontents, innercontents, tem1, current_alist_element;
1253 if (buf == 0)
1254 buf = current_buffer;
1256 /* If restoring in a dead buffer, do nothing. */
1257 if (NILP (BUF_NAME (buf)))
1258 return newval;
1260 CHECK_SYMBOL (symbol);
1261 if (SYMBOL_CONSTANT_P (symbol)
1262 && (NILP (Fkeywordp (symbol))
1263 || !EQ (newval, SYMBOL_VALUE (symbol))))
1264 xsignal1 (Qsetting_constant, symbol);
1266 innercontents = valcontents = SYMBOL_VALUE (symbol);
1268 if (BUFFER_OBJFWDP (valcontents))
1270 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1271 int idx = PER_BUFFER_IDX (offset);
1272 if (idx > 0
1273 && !bindflag
1274 && !let_shadows_buffer_binding_p (XSYMBOL (symbol)))
1275 SET_PER_BUFFER_VALUE_P (buf, idx, 1);
1277 else if (BUFFER_LOCAL_VALUEP (valcontents))
1279 /* valcontents is a struct Lisp_Buffer_Local_Value. */
1280 if (XSYMBOL (symbol)->indirect_variable)
1281 XSETSYMBOL (symbol, indirect_variable (XSYMBOL (symbol)));
1283 /* What binding is loaded right now? */
1284 current_alist_element
1285 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1287 /* If the current buffer is not the buffer whose binding is
1288 loaded, or if there may be frame-local bindings and the frame
1289 isn't the right one, or if it's a Lisp_Buffer_Local_Value and
1290 the default binding is loaded, the loaded binding may be the
1291 wrong one. */
1292 if (!BUFFERP (XBUFFER_LOCAL_VALUE (valcontents)->buffer)
1293 || buf != XBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer)
1294 || (XBUFFER_LOCAL_VALUE (valcontents)->check_frame
1295 && !EQ (selected_frame, XBUFFER_LOCAL_VALUE (valcontents)->frame))
1296 /* Also unload a global binding (if the var is local_if_set). */
1297 || (EQ (XCAR (current_alist_element),
1298 current_alist_element)))
1300 /* The currently loaded binding is not necessarily valid.
1301 We need to unload it, and choose a new binding. */
1303 /* Write out `realvalue' to the old loaded binding. */
1304 Fsetcdr (current_alist_element,
1305 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue));
1307 /* Find the new binding. */
1308 tem1 = Fassq (symbol, BUF_LOCAL_VAR_ALIST (buf));
1309 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 1;
1310 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 0;
1312 if (NILP (tem1))
1314 /* This buffer still sees the default value. */
1316 /* If the variable is not local_if_set,
1317 or if this is `let' rather than `set',
1318 make CURRENT-ALIST-ELEMENT point to itself,
1319 indicating that we're seeing the default value.
1320 Likewise if the variable has been let-bound
1321 in the current buffer. */
1322 if (bindflag || !XBUFFER_LOCAL_VALUE (valcontents)->local_if_set
1323 || let_shadows_buffer_binding_p (XSYMBOL (symbol)))
1325 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
1327 if (XBUFFER_LOCAL_VALUE (valcontents)->check_frame)
1328 tem1 = Fassq (symbol,
1329 XFRAME (selected_frame)->param_alist);
1331 if (! NILP (tem1))
1332 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 1;
1333 else
1334 tem1 = XBUFFER_LOCAL_VALUE (valcontents)->cdr;
1336 /* If it's a Lisp_Buffer_Local_Value, being set not bound,
1337 and we're not within a let that was made for this buffer,
1338 create a new buffer-local binding for the variable.
1339 That means, give this buffer a new assoc for a local value
1340 and load that binding. */
1341 else
1343 tem1 = Fcons (symbol, XCDR (current_alist_element));
1344 BUF_LOCAL_VAR_ALIST (buf)
1345 = Fcons (tem1, BUF_LOCAL_VAR_ALIST (buf));
1349 /* Record which binding is now loaded. */
1350 XSETCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr, tem1);
1352 /* Set `buffer' and `frame' slots for the binding now loaded. */
1353 XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer, buf);
1354 XBUFFER_LOCAL_VALUE (valcontents)->frame = selected_frame;
1356 innercontents = XBUFFER_LOCAL_VALUE (valcontents)->realvalue;
1358 /* Store the new value in the cons-cell. */
1359 XSETCDR (XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr), newval);
1362 /* If storing void (making the symbol void), forward only through
1363 buffer-local indicator, not through Lisp_Objfwd, etc. */
1364 if (voide)
1365 store_symval_forwarding (symbol, Qnil, newval, buf);
1366 else
1367 store_symval_forwarding (symbol, innercontents, newval, buf);
1369 return newval;
1372 /* Access or set a buffer-local symbol's default value. */
1374 /* Return the default value of SYMBOL, but don't check for voidness.
1375 Return Qunbound if it is void. */
1377 Lisp_Object
1378 default_value (symbol)
1379 Lisp_Object symbol;
1381 register Lisp_Object valcontents;
1383 CHECK_SYMBOL (symbol);
1384 valcontents = SYMBOL_VALUE (symbol);
1386 /* For a built-in buffer-local variable, get the default value
1387 rather than letting do_symval_forwarding get the current value. */
1388 if (BUFFER_OBJFWDP (valcontents))
1390 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1391 if (PER_BUFFER_IDX (offset) != 0)
1392 return PER_BUFFER_DEFAULT (offset);
1395 /* Handle user-created local variables. */
1396 if (BUFFER_LOCAL_VALUEP (valcontents))
1398 /* If var is set up for a buffer that lacks a local value for it,
1399 the current value is nominally the default value.
1400 But the `realvalue' slot may be more up to date, since
1401 ordinary setq stores just that slot. So use that. */
1402 Lisp_Object current_alist_element, alist_element_car;
1403 current_alist_element
1404 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1405 alist_element_car = XCAR (current_alist_element);
1406 if (EQ (alist_element_car, current_alist_element))
1407 return do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue);
1408 else
1409 return XCDR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1411 /* For other variables, get the current value. */
1412 return do_symval_forwarding (valcontents);
1415 DEFUN ("default-boundp", Fdefault_boundp, Sdefault_boundp, 1, 1, 0,
1416 doc: /* Return t if SYMBOL has a non-void default value.
1417 This is the value that is seen in buffers that do not have their own values
1418 for this variable. */)
1419 (symbol)
1420 Lisp_Object symbol;
1422 register Lisp_Object value;
1424 value = default_value (symbol);
1425 return (EQ (value, Qunbound) ? Qnil : Qt);
1428 DEFUN ("default-value", Fdefault_value, Sdefault_value, 1, 1, 0,
1429 doc: /* Return SYMBOL's default value.
1430 This is the value that is seen in buffers that do not have their own values
1431 for this variable. The default value is meaningful for variables with
1432 local bindings in certain buffers. */)
1433 (symbol)
1434 Lisp_Object symbol;
1436 register Lisp_Object value;
1438 value = default_value (symbol);
1439 if (!EQ (value, Qunbound))
1440 return value;
1442 xsignal1 (Qvoid_variable, symbol);
1445 DEFUN ("set-default", Fset_default, Sset_default, 2, 2, 0,
1446 doc: /* Set SYMBOL's default value to VALUE. SYMBOL and VALUE are evaluated.
1447 The default value is seen in buffers that do not have their own values
1448 for this variable. */)
1449 (symbol, value)
1450 Lisp_Object symbol, value;
1452 register Lisp_Object valcontents, current_alist_element, alist_element_buffer;
1454 CHECK_SYMBOL (symbol);
1455 valcontents = SYMBOL_VALUE (symbol);
1457 /* Handle variables like case-fold-search that have special slots
1458 in the buffer. Make them work apparently like Lisp_Buffer_Local_Value
1459 variables. */
1460 if (BUFFER_OBJFWDP (valcontents))
1462 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1463 int idx = PER_BUFFER_IDX (offset);
1465 PER_BUFFER_DEFAULT (offset) = value;
1467 /* If this variable is not always local in all buffers,
1468 set it in the buffers that don't nominally have a local value. */
1469 if (idx > 0)
1471 struct buffer *b;
1473 for (b = all_buffers; b; b = b->next)
1474 if (!PER_BUFFER_VALUE_P (b, idx))
1475 PER_BUFFER_VALUE (b, offset) = value;
1477 return value;
1480 if (!BUFFER_LOCAL_VALUEP (valcontents))
1481 return Fset (symbol, value);
1483 /* Store new value into the DEFAULT-VALUE slot. */
1484 XSETCDR (XBUFFER_LOCAL_VALUE (valcontents)->cdr, value);
1486 /* If the default binding is now loaded, set the REALVALUE slot too. */
1487 current_alist_element
1488 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1489 alist_element_buffer = Fcar (current_alist_element);
1490 if (EQ (alist_element_buffer, current_alist_element))
1491 store_symval_forwarding (symbol,
1492 XBUFFER_LOCAL_VALUE (valcontents)->realvalue,
1493 value, NULL);
1495 return value;
1498 DEFUN ("setq-default", Fsetq_default, Ssetq_default, 0, UNEVALLED, 0,
1499 doc: /* Set the default value of variable VAR to VALUE.
1500 VAR, the variable name, is literal (not evaluated);
1501 VALUE is an expression: it is evaluated and its value returned.
1502 The default value of a variable is seen in buffers
1503 that do not have their own values for the variable.
1505 More generally, you can use multiple variables and values, as in
1506 (setq-default VAR VALUE VAR VALUE...)
1507 This sets each VAR's default value to the corresponding VALUE.
1508 The VALUE for the Nth VAR can refer to the new default values
1509 of previous VARs.
1510 usage: (setq-default [VAR VALUE]...) */)
1511 (args)
1512 Lisp_Object args;
1514 register Lisp_Object args_left;
1515 register Lisp_Object val, symbol;
1516 struct gcpro gcpro1;
1518 if (NILP (args))
1519 return Qnil;
1521 args_left = args;
1522 GCPRO1 (args);
1526 val = Feval (Fcar (Fcdr (args_left)));
1527 symbol = XCAR (args_left);
1528 Fset_default (symbol, val);
1529 args_left = Fcdr (XCDR (args_left));
1531 while (!NILP (args_left));
1533 UNGCPRO;
1534 return val;
1537 /* Lisp functions for creating and removing buffer-local variables. */
1539 DEFUN ("make-variable-buffer-local", Fmake_variable_buffer_local, Smake_variable_buffer_local,
1540 1, 1, "vMake Variable Buffer Local: ",
1541 doc: /* Make VARIABLE become buffer-local whenever it is set.
1542 At any time, the value for the current buffer is in effect,
1543 unless the variable has never been set in this buffer,
1544 in which case the default value is in effect.
1545 Note that binding the variable with `let', or setting it while
1546 a `let'-style binding made in this buffer is in effect,
1547 does not make the variable buffer-local. Return VARIABLE.
1549 In most cases it is better to use `make-local-variable',
1550 which makes a variable local in just one buffer.
1552 The function `default-value' gets the default value and `set-default' sets it. */)
1553 (variable)
1554 register Lisp_Object variable;
1556 register Lisp_Object tem, valcontents, newval;
1557 struct Lisp_Symbol *sym;
1559 CHECK_SYMBOL (variable);
1560 sym = indirect_variable (XSYMBOL (variable));
1562 valcontents = sym->value;
1563 if (sym->constant || KBOARD_OBJFWDP (valcontents))
1564 error ("Symbol %s may not be buffer-local", SDATA (sym->xname));
1566 if (BUFFER_OBJFWDP (valcontents))
1567 return variable;
1568 else if (BUFFER_LOCAL_VALUEP (valcontents))
1570 if (XBUFFER_LOCAL_VALUE (valcontents)->check_frame)
1571 error ("Symbol %s may not be buffer-local", SDATA (sym->xname));
1572 newval = valcontents;
1574 else
1576 if (EQ (valcontents, Qunbound))
1577 sym->value = Qnil;
1578 tem = Fcons (Qnil, Fsymbol_value (variable));
1579 XSETCAR (tem, tem);
1580 newval = allocate_misc ();
1581 XMISCTYPE (newval) = Lisp_Misc_Buffer_Local_Value;
1582 XBUFFER_LOCAL_VALUE (newval)->realvalue = sym->value;
1583 XBUFFER_LOCAL_VALUE (newval)->buffer = Fcurrent_buffer ();
1584 XBUFFER_LOCAL_VALUE (newval)->frame = Qnil;
1585 XBUFFER_LOCAL_VALUE (newval)->found_for_buffer = 0;
1586 XBUFFER_LOCAL_VALUE (newval)->found_for_frame = 0;
1587 XBUFFER_LOCAL_VALUE (newval)->check_frame = 0;
1588 XBUFFER_LOCAL_VALUE (newval)->cdr = tem;
1589 sym->value = newval;
1591 XBUFFER_LOCAL_VALUE (newval)->local_if_set = 1;
1592 return variable;
1595 DEFUN ("make-local-variable", Fmake_local_variable, Smake_local_variable,
1596 1, 1, "vMake Local Variable: ",
1597 doc: /* Make VARIABLE have a separate value in the current buffer.
1598 Other buffers will continue to share a common default value.
1599 \(The buffer-local value of VARIABLE starts out as the same value
1600 VARIABLE previously had. If VARIABLE was void, it remains void.\)
1601 Return VARIABLE.
1603 If the variable is already arranged to become local when set,
1604 this function causes a local value to exist for this buffer,
1605 just as setting the variable would do.
1607 This function returns VARIABLE, and therefore
1608 (set (make-local-variable 'VARIABLE) VALUE-EXP)
1609 works.
1611 See also `make-variable-buffer-local'.
1613 Do not use `make-local-variable' to make a hook variable buffer-local.
1614 Instead, use `add-hook' and specify t for the LOCAL argument. */)
1615 (variable)
1616 register Lisp_Object variable;
1618 register Lisp_Object tem, valcontents;
1619 struct Lisp_Symbol *sym;
1621 CHECK_SYMBOL (variable);
1622 sym = indirect_variable (XSYMBOL (variable));
1624 valcontents = sym->value;
1625 if (sym->constant || KBOARD_OBJFWDP (valcontents)
1626 || (BUFFER_LOCAL_VALUEP (valcontents)
1627 && (XBUFFER_LOCAL_VALUE (valcontents)->check_frame)))
1628 error ("Symbol %s may not be buffer-local", SDATA (sym->xname));
1630 if ((BUFFER_LOCAL_VALUEP (valcontents)
1631 && XBUFFER_LOCAL_VALUE (valcontents)->local_if_set)
1632 || BUFFER_OBJFWDP (valcontents))
1634 tem = Fboundp (variable);
1636 /* Make sure the symbol has a local value in this particular buffer,
1637 by setting it to the same value it already has. */
1638 Fset (variable, (EQ (tem, Qt) ? Fsymbol_value (variable) : Qunbound));
1639 return variable;
1641 /* Make sure symbol is set up to hold per-buffer values. */
1642 if (!BUFFER_LOCAL_VALUEP (valcontents))
1644 Lisp_Object newval;
1645 tem = Fcons (Qnil, do_symval_forwarding (valcontents));
1646 XSETCAR (tem, tem);
1647 newval = allocate_misc ();
1648 XMISCTYPE (newval) = Lisp_Misc_Buffer_Local_Value;
1649 XBUFFER_LOCAL_VALUE (newval)->realvalue = sym->value;
1650 XBUFFER_LOCAL_VALUE (newval)->buffer = Qnil;
1651 XBUFFER_LOCAL_VALUE (newval)->frame = Qnil;
1652 XBUFFER_LOCAL_VALUE (newval)->local_if_set = 0;
1653 XBUFFER_LOCAL_VALUE (newval)->found_for_buffer = 0;
1654 XBUFFER_LOCAL_VALUE (newval)->found_for_frame = 0;
1655 XBUFFER_LOCAL_VALUE (newval)->check_frame = 0;
1656 XBUFFER_LOCAL_VALUE (newval)->cdr = tem;
1657 sym->value = newval;
1659 /* Make sure this buffer has its own value of symbol. */
1660 XSETSYMBOL (variable, sym); /* Propagate variable indirections. */
1661 tem = Fassq (variable, BUF_LOCAL_VAR_ALIST (current_buffer));
1662 if (NILP (tem))
1664 /* Swap out any local binding for some other buffer, and make
1665 sure the current value is permanently recorded, if it's the
1666 default value. */
1667 find_symbol_value (variable);
1669 BUF_LOCAL_VAR_ALIST (current_buffer)
1670 = Fcons (Fcons (variable, XCDR (XBUFFER_LOCAL_VALUE (sym->value)->cdr)),
1671 BUF_LOCAL_VAR_ALIST (current_buffer));
1673 /* Make sure symbol does not think it is set up for this buffer;
1674 force it to look once again for this buffer's value. */
1676 Lisp_Object *pvalbuf;
1678 valcontents = sym->value;
1680 pvalbuf = &XBUFFER_LOCAL_VALUE (valcontents)->buffer;
1681 if (current_buffer == XBUFFER (*pvalbuf))
1682 *pvalbuf = Qnil;
1683 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
1687 /* If the symbol forwards into a C variable, then load the binding
1688 for this buffer now. If C code modifies the variable before we
1689 load the binding in, then that new value will clobber the default
1690 binding the next time we unload it. */
1691 valcontents = XBUFFER_LOCAL_VALUE (sym->value)->realvalue;
1692 if (INTFWDP (valcontents) || BOOLFWDP (valcontents) || OBJFWDP (valcontents))
1693 swap_in_symval_forwarding (variable, sym->value);
1695 return variable;
1698 DEFUN ("kill-local-variable", Fkill_local_variable, Skill_local_variable,
1699 1, 1, "vKill Local Variable: ",
1700 doc: /* Make VARIABLE no longer have a separate value in the current buffer.
1701 From now on the default value will apply in this buffer. Return VARIABLE. */)
1702 (variable)
1703 register Lisp_Object variable;
1705 register Lisp_Object tem, valcontents;
1706 struct Lisp_Symbol *sym;
1708 CHECK_SYMBOL (variable);
1709 sym = indirect_variable (XSYMBOL (variable));
1711 valcontents = sym->value;
1713 if (BUFFER_OBJFWDP (valcontents))
1715 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1716 int idx = PER_BUFFER_IDX (offset);
1718 if (idx > 0)
1720 SET_PER_BUFFER_VALUE_P (current_buffer, idx, 0);
1721 PER_BUFFER_VALUE (current_buffer, offset)
1722 = PER_BUFFER_DEFAULT (offset);
1724 return variable;
1727 if (!BUFFER_LOCAL_VALUEP (valcontents))
1728 return variable;
1730 /* Get rid of this buffer's alist element, if any. */
1731 XSETSYMBOL (variable, sym); /* Propagate variable indirection. */
1732 tem = Fassq (variable, BUF_LOCAL_VAR_ALIST (current_buffer));
1733 if (!NILP (tem))
1734 BUF_LOCAL_VAR_ALIST (current_buffer)
1735 = Fdelq (tem, BUF_LOCAL_VAR_ALIST (current_buffer));
1737 /* If the symbol is set up with the current buffer's binding
1738 loaded, recompute its value. We have to do it now, or else
1739 forwarded objects won't work right. */
1741 Lisp_Object *pvalbuf, buf;
1742 valcontents = sym->value;
1743 pvalbuf = &XBUFFER_LOCAL_VALUE (valcontents)->buffer;
1744 XSETBUFFER (buf, current_buffer);
1745 if (EQ (buf, *pvalbuf))
1747 *pvalbuf = Qnil;
1748 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
1749 find_symbol_value (variable);
1753 return variable;
1756 /* Lisp functions for creating and removing buffer-local variables. */
1758 /* Obsolete since 22.2. NB adjust doc of modify-frame-parameters
1759 when/if this is removed. */
1761 DEFUN ("make-variable-frame-local", Fmake_variable_frame_local, Smake_variable_frame_local,
1762 1, 1, "vMake Variable Frame Local: ",
1763 doc: /* Enable VARIABLE to have frame-local bindings.
1764 This does not create any frame-local bindings for VARIABLE,
1765 it just makes them possible.
1767 A frame-local binding is actually a frame parameter value.
1768 If a frame F has a value for the frame parameter named VARIABLE,
1769 that also acts as a frame-local binding for VARIABLE in F--
1770 provided this function has been called to enable VARIABLE
1771 to have frame-local bindings at all.
1773 The only way to create a frame-local binding for VARIABLE in a frame
1774 is to set the VARIABLE frame parameter of that frame. See
1775 `modify-frame-parameters' for how to set frame parameters.
1777 Note that since Emacs 23.1, variables cannot be both buffer-local and
1778 frame-local any more (buffer-local bindings used to take precedence over
1779 frame-local bindings). */)
1780 (variable)
1781 register Lisp_Object variable;
1783 register Lisp_Object tem, valcontents, newval;
1784 struct Lisp_Symbol *sym;
1786 CHECK_SYMBOL (variable);
1787 sym = indirect_variable (XSYMBOL (variable));
1789 valcontents = sym->value;
1790 if (sym->constant || KBOARD_OBJFWDP (valcontents)
1791 || BUFFER_OBJFWDP (valcontents))
1792 error ("Symbol %s may not be frame-local", SDATA (sym->xname));
1794 if (BUFFER_LOCAL_VALUEP (valcontents))
1796 if (!XBUFFER_LOCAL_VALUE (valcontents)->check_frame)
1797 error ("Symbol %s may not be frame-local", SDATA (sym->xname));
1798 return variable;
1801 if (EQ (valcontents, Qunbound))
1802 sym->value = Qnil;
1803 tem = Fcons (Qnil, Fsymbol_value (variable));
1804 XSETCAR (tem, tem);
1805 newval = allocate_misc ();
1806 XMISCTYPE (newval) = Lisp_Misc_Buffer_Local_Value;
1807 XBUFFER_LOCAL_VALUE (newval)->realvalue = sym->value;
1808 XBUFFER_LOCAL_VALUE (newval)->buffer = Qnil;
1809 XBUFFER_LOCAL_VALUE (newval)->frame = Qnil;
1810 XBUFFER_LOCAL_VALUE (newval)->local_if_set = 0;
1811 XBUFFER_LOCAL_VALUE (newval)->found_for_buffer = 0;
1812 XBUFFER_LOCAL_VALUE (newval)->found_for_frame = 0;
1813 XBUFFER_LOCAL_VALUE (newval)->check_frame = 1;
1814 XBUFFER_LOCAL_VALUE (newval)->cdr = tem;
1815 sym->value = newval;
1816 return variable;
1819 DEFUN ("local-variable-p", Flocal_variable_p, Slocal_variable_p,
1820 1, 2, 0,
1821 doc: /* Non-nil if VARIABLE has a local binding in buffer BUFFER.
1822 BUFFER defaults to the current buffer. */)
1823 (variable, buffer)
1824 register Lisp_Object variable, buffer;
1826 Lisp_Object valcontents;
1827 register struct buffer *buf;
1828 struct Lisp_Symbol *sym;
1830 if (NILP (buffer))
1831 buf = current_buffer;
1832 else
1834 CHECK_BUFFER (buffer);
1835 buf = XBUFFER (buffer);
1838 CHECK_SYMBOL (variable);
1839 sym = indirect_variable (XSYMBOL (variable));
1840 XSETSYMBOL (variable, sym);
1842 valcontents = sym->value;
1843 if (BUFFER_LOCAL_VALUEP (valcontents))
1845 Lisp_Object tail, elt;
1847 for (tail = BUF_LOCAL_VAR_ALIST (buf); CONSP (tail); tail = XCDR (tail))
1849 elt = XCAR (tail);
1850 if (EQ (variable, XCAR (elt)))
1851 return Qt;
1854 if (BUFFER_OBJFWDP (valcontents))
1856 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1857 int idx = PER_BUFFER_IDX (offset);
1858 if (idx == -1 || PER_BUFFER_VALUE_P (buf, idx))
1859 return Qt;
1861 return Qnil;
1864 DEFUN ("local-variable-if-set-p", Flocal_variable_if_set_p, Slocal_variable_if_set_p,
1865 1, 2, 0,
1866 doc: /* Non-nil if VARIABLE will be local in buffer BUFFER when set there.
1867 More precisely, this means that setting the variable \(with `set' or`setq'),
1868 while it does not have a `let'-style binding that was made in BUFFER,
1869 will produce a buffer local binding. See Info node
1870 `(elisp)Creating Buffer-Local'.
1871 BUFFER defaults to the current buffer. */)
1872 (variable, buffer)
1873 register Lisp_Object variable, buffer;
1875 Lisp_Object valcontents;
1876 register struct buffer *buf;
1877 struct Lisp_Symbol *sym;
1879 if (NILP (buffer))
1880 buf = current_buffer;
1881 else
1883 CHECK_BUFFER (buffer);
1884 buf = XBUFFER (buffer);
1887 CHECK_SYMBOL (variable);
1888 sym = indirect_variable (XSYMBOL (variable));
1889 XSETSYMBOL (variable, sym);
1891 valcontents = sym->value;
1893 if (BUFFER_OBJFWDP (valcontents))
1894 /* All these slots become local if they are set. */
1895 return Qt;
1896 else if (BUFFER_LOCAL_VALUEP (valcontents))
1898 Lisp_Object tail, elt;
1899 if (XBUFFER_LOCAL_VALUE (valcontents)->local_if_set)
1900 return Qt;
1901 for (tail = BUF_LOCAL_VAR_ALIST (buf); CONSP (tail); tail = XCDR (tail))
1903 elt = XCAR (tail);
1904 if (EQ (variable, XCAR (elt)))
1905 return Qt;
1908 return Qnil;
1911 DEFUN ("variable-binding-locus", Fvariable_binding_locus, Svariable_binding_locus,
1912 1, 1, 0,
1913 doc: /* Return a value indicating where VARIABLE's current binding comes from.
1914 If the current binding is buffer-local, the value is the current buffer.
1915 If the current binding is frame-local, the value is the selected frame.
1916 If the current binding is global (the default), the value is nil. */)
1917 (variable)
1918 register Lisp_Object variable;
1920 Lisp_Object valcontents;
1921 struct Lisp_Symbol *sym;
1923 CHECK_SYMBOL (variable);
1924 sym = indirect_variable (XSYMBOL (variable));
1926 /* Make sure the current binding is actually swapped in. */
1927 find_symbol_value (variable);
1929 valcontents = sym->value;
1931 if (BUFFER_LOCAL_VALUEP (valcontents)
1932 || BUFFER_OBJFWDP (valcontents))
1934 /* For a local variable, record both the symbol and which
1935 buffer's or frame's value we are saving. */
1936 if (!NILP (Flocal_variable_p (variable, Qnil)))
1937 return Fcurrent_buffer ();
1938 else if (BUFFER_LOCAL_VALUEP (valcontents)
1939 && XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame)
1940 return XBUFFER_LOCAL_VALUE (valcontents)->frame;
1943 return Qnil;
1946 /* This code is disabled now that we use the selected frame to return
1947 keyboard-local-values. */
1948 #if 0
1949 extern struct terminal *get_terminal P_ ((Lisp_Object display, int));
1951 DEFUN ("terminal-local-value", Fterminal_local_value, Sterminal_local_value, 2, 2, 0,
1952 doc: /* Return the terminal-local value of SYMBOL on TERMINAL.
1953 If SYMBOL is not a terminal-local variable, then return its normal
1954 value, like `symbol-value'.
1956 TERMINAL may be a terminal object, a frame, or nil (meaning the
1957 selected frame's terminal device). */)
1958 (symbol, terminal)
1959 Lisp_Object symbol;
1960 Lisp_Object terminal;
1962 Lisp_Object result;
1963 struct terminal *t = get_terminal (terminal, 1);
1964 push_kboard (t->kboard);
1965 result = Fsymbol_value (symbol);
1966 pop_kboard ();
1967 return result;
1970 DEFUN ("set-terminal-local-value", Fset_terminal_local_value, Sset_terminal_local_value, 3, 3, 0,
1971 doc: /* Set the terminal-local binding of SYMBOL on TERMINAL to VALUE.
1972 If VARIABLE is not a terminal-local variable, then set its normal
1973 binding, like `set'.
1975 TERMINAL may be a terminal object, a frame, or nil (meaning the
1976 selected frame's terminal device). */)
1977 (symbol, terminal, value)
1978 Lisp_Object symbol;
1979 Lisp_Object terminal;
1980 Lisp_Object value;
1982 Lisp_Object result;
1983 struct terminal *t = get_terminal (terminal, 1);
1984 push_kboard (d->kboard);
1985 result = Fset (symbol, value);
1986 pop_kboard ();
1987 return result;
1989 #endif
1991 /* Find the function at the end of a chain of symbol function indirections. */
1993 /* If OBJECT is a symbol, find the end of its function chain and
1994 return the value found there. If OBJECT is not a symbol, just
1995 return it. If there is a cycle in the function chain, signal a
1996 cyclic-function-indirection error.
1998 This is like Findirect_function, except that it doesn't signal an
1999 error if the chain ends up unbound. */
2000 Lisp_Object
2001 indirect_function (object)
2002 register Lisp_Object object;
2004 Lisp_Object tortoise, hare;
2006 hare = tortoise = object;
2008 for (;;)
2010 if (!SYMBOLP (hare) || EQ (hare, Qunbound))
2011 break;
2012 hare = XSYMBOL (hare)->function;
2013 if (!SYMBOLP (hare) || EQ (hare, Qunbound))
2014 break;
2015 hare = XSYMBOL (hare)->function;
2017 tortoise = XSYMBOL (tortoise)->function;
2019 if (EQ (hare, tortoise))
2020 xsignal1 (Qcyclic_function_indirection, object);
2023 return hare;
2026 DEFUN ("indirect-function", Findirect_function, Sindirect_function, 1, 2, 0,
2027 doc: /* Return the function at the end of OBJECT's function chain.
2028 If OBJECT is not a symbol, just return it. Otherwise, follow all
2029 function indirections to find the final function binding and return it.
2030 If the final symbol in the chain is unbound, signal a void-function error.
2031 Optional arg NOERROR non-nil means to return nil instead of signalling.
2032 Signal a cyclic-function-indirection error if there is a loop in the
2033 function chain of symbols. */)
2034 (object, noerror)
2035 register Lisp_Object object;
2036 Lisp_Object noerror;
2038 Lisp_Object result;
2040 /* Optimize for no indirection. */
2041 result = object;
2042 if (SYMBOLP (result) && !EQ (result, Qunbound)
2043 && (result = XSYMBOL (result)->function, SYMBOLP (result)))
2044 result = indirect_function (result);
2045 if (!EQ (result, Qunbound))
2046 return result;
2048 if (NILP (noerror))
2049 xsignal1 (Qvoid_function, object);
2051 return Qnil;
2054 /* Extract and set vector and string elements */
2056 DEFUN ("aref", Faref, Saref, 2, 2, 0,
2057 doc: /* Return the element of ARRAY at index IDX.
2058 ARRAY may be a vector, a string, a char-table, a bool-vector,
2059 or a byte-code object. IDX starts at 0. */)
2060 (array, idx)
2061 register Lisp_Object array;
2062 Lisp_Object idx;
2064 register int idxval;
2066 CHECK_NUMBER (idx);
2067 idxval = XINT (idx);
2068 if (STRINGP (array))
2070 int c, idxval_byte;
2072 if (idxval < 0 || idxval >= SCHARS (array))
2073 args_out_of_range (array, idx);
2074 if (! STRING_MULTIBYTE (array))
2075 return make_number ((unsigned char) SREF (array, idxval));
2076 idxval_byte = string_char_to_byte (array, idxval);
2078 c = STRING_CHAR (SDATA (array) + idxval_byte);
2079 return make_number (c);
2081 else if (BOOL_VECTOR_P (array))
2083 int val;
2085 if (idxval < 0 || idxval >= XBOOL_VECTOR (array)->size)
2086 args_out_of_range (array, idx);
2088 val = (unsigned char) XBOOL_VECTOR (array)->data[idxval / BOOL_VECTOR_BITS_PER_CHAR];
2089 return (val & (1 << (idxval % BOOL_VECTOR_BITS_PER_CHAR)) ? Qt : Qnil);
2091 else if (CHAR_TABLE_P (array))
2093 CHECK_CHARACTER (idx);
2094 return CHAR_TABLE_REF (array, idxval);
2096 else
2098 int size = 0;
2099 if (VECTORP (array))
2100 size = XVECTOR (array)->size;
2101 else if (COMPILEDP (array))
2102 size = XVECTOR (array)->size & PSEUDOVECTOR_SIZE_MASK;
2103 else
2104 wrong_type_argument (Qarrayp, array);
2106 if (idxval < 0 || idxval >= size)
2107 args_out_of_range (array, idx);
2108 return XVECTOR (array)->contents[idxval];
2112 DEFUN ("aset", Faset, Saset, 3, 3, 0,
2113 doc: /* Store into the element of ARRAY at index IDX the value NEWELT.
2114 Return NEWELT. ARRAY may be a vector, a string, a char-table or a
2115 bool-vector. IDX starts at 0. */)
2116 (array, idx, newelt)
2117 register Lisp_Object array;
2118 Lisp_Object idx, newelt;
2120 register int idxval;
2122 CHECK_NUMBER (idx);
2123 idxval = XINT (idx);
2124 CHECK_ARRAY (array, Qarrayp);
2125 CHECK_IMPURE (array);
2127 if (VECTORP (array))
2129 if (idxval < 0 || idxval >= XVECTOR (array)->size)
2130 args_out_of_range (array, idx);
2131 XVECTOR (array)->contents[idxval] = newelt;
2133 else if (BOOL_VECTOR_P (array))
2135 int val;
2137 if (idxval < 0 || idxval >= XBOOL_VECTOR (array)->size)
2138 args_out_of_range (array, idx);
2140 val = (unsigned char) XBOOL_VECTOR (array)->data[idxval / BOOL_VECTOR_BITS_PER_CHAR];
2142 if (! NILP (newelt))
2143 val |= 1 << (idxval % BOOL_VECTOR_BITS_PER_CHAR);
2144 else
2145 val &= ~(1 << (idxval % BOOL_VECTOR_BITS_PER_CHAR));
2146 XBOOL_VECTOR (array)->data[idxval / BOOL_VECTOR_BITS_PER_CHAR] = val;
2148 else if (CHAR_TABLE_P (array))
2150 CHECK_CHARACTER (idx);
2151 CHAR_TABLE_SET (array, idxval, newelt);
2153 else if (STRING_MULTIBYTE (array))
2155 int idxval_byte, prev_bytes, new_bytes, nbytes;
2156 unsigned char workbuf[MAX_MULTIBYTE_LENGTH], *p0 = workbuf, *p1;
2158 if (idxval < 0 || idxval >= SCHARS (array))
2159 args_out_of_range (array, idx);
2160 CHECK_CHARACTER (newelt);
2162 nbytes = SBYTES (array);
2164 idxval_byte = string_char_to_byte (array, idxval);
2165 p1 = SDATA (array) + idxval_byte;
2166 PARSE_MULTIBYTE_SEQ (p1, nbytes - idxval_byte, prev_bytes);
2167 new_bytes = CHAR_STRING (XINT (newelt), p0);
2168 if (prev_bytes != new_bytes)
2170 /* We must relocate the string data. */
2171 int nchars = SCHARS (array);
2172 unsigned char *str;
2173 USE_SAFE_ALLOCA;
2175 SAFE_ALLOCA (str, unsigned char *, nbytes);
2176 bcopy (SDATA (array), str, nbytes);
2177 allocate_string_data (XSTRING (array), nchars,
2178 nbytes + new_bytes - prev_bytes);
2179 bcopy (str, SDATA (array), idxval_byte);
2180 p1 = SDATA (array) + idxval_byte;
2181 bcopy (str + idxval_byte + prev_bytes, p1 + new_bytes,
2182 nbytes - (idxval_byte + prev_bytes));
2183 SAFE_FREE ();
2184 clear_string_char_byte_cache ();
2186 while (new_bytes--)
2187 *p1++ = *p0++;
2189 else
2191 if (idxval < 0 || idxval >= SCHARS (array))
2192 args_out_of_range (array, idx);
2193 CHECK_NUMBER (newelt);
2195 if (XINT (newelt) >= 0 && ! SINGLE_BYTE_CHAR_P (XINT (newelt)))
2197 int i;
2199 for (i = SBYTES (array) - 1; i >= 0; i--)
2200 if (SREF (array, i) >= 0x80)
2201 args_out_of_range (array, newelt);
2202 /* ARRAY is an ASCII string. Convert it to a multibyte
2203 string, and try `aset' again. */
2204 STRING_SET_MULTIBYTE (array);
2205 return Faset (array, idx, newelt);
2207 SSET (array, idxval, XINT (newelt));
2210 return newelt;
2213 /* Arithmetic functions */
2215 enum comparison { equal, notequal, less, grtr, less_or_equal, grtr_or_equal };
2217 Lisp_Object
2218 arithcompare (num1, num2, comparison)
2219 Lisp_Object num1, num2;
2220 enum comparison comparison;
2222 double f1 = 0, f2 = 0;
2223 int floatp = 0;
2225 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num1);
2226 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num2);
2228 if (FLOATP (num1) || FLOATP (num2))
2230 floatp = 1;
2231 f1 = (FLOATP (num1)) ? XFLOAT_DATA (num1) : XINT (num1);
2232 f2 = (FLOATP (num2)) ? XFLOAT_DATA (num2) : XINT (num2);
2235 switch (comparison)
2237 case equal:
2238 if (floatp ? f1 == f2 : XINT (num1) == XINT (num2))
2239 return Qt;
2240 return Qnil;
2242 case notequal:
2243 if (floatp ? f1 != f2 : XINT (num1) != XINT (num2))
2244 return Qt;
2245 return Qnil;
2247 case less:
2248 if (floatp ? f1 < f2 : XINT (num1) < XINT (num2))
2249 return Qt;
2250 return Qnil;
2252 case less_or_equal:
2253 if (floatp ? f1 <= f2 : XINT (num1) <= XINT (num2))
2254 return Qt;
2255 return Qnil;
2257 case grtr:
2258 if (floatp ? f1 > f2 : XINT (num1) > XINT (num2))
2259 return Qt;
2260 return Qnil;
2262 case grtr_or_equal:
2263 if (floatp ? f1 >= f2 : XINT (num1) >= XINT (num2))
2264 return Qt;
2265 return Qnil;
2267 default:
2268 abort ();
2272 DEFUN ("=", Feqlsign, Seqlsign, 2, 2, 0,
2273 doc: /* Return t if two args, both numbers or markers, are equal. */)
2274 (num1, num2)
2275 register Lisp_Object num1, num2;
2277 return arithcompare (num1, num2, equal);
2280 DEFUN ("<", Flss, Slss, 2, 2, 0,
2281 doc: /* Return t if first arg is less than second arg. Both must be numbers or markers. */)
2282 (num1, num2)
2283 register Lisp_Object num1, num2;
2285 return arithcompare (num1, num2, less);
2288 DEFUN (">", Fgtr, Sgtr, 2, 2, 0,
2289 doc: /* Return t if first arg is greater than second arg. Both must be numbers or markers. */)
2290 (num1, num2)
2291 register Lisp_Object num1, num2;
2293 return arithcompare (num1, num2, grtr);
2296 DEFUN ("<=", Fleq, Sleq, 2, 2, 0,
2297 doc: /* Return t if first arg is less than or equal to second arg.
2298 Both must be numbers or markers. */)
2299 (num1, num2)
2300 register Lisp_Object num1, num2;
2302 return arithcompare (num1, num2, less_or_equal);
2305 DEFUN (">=", Fgeq, Sgeq, 2, 2, 0,
2306 doc: /* Return t if first arg is greater than or equal to second arg.
2307 Both must be numbers or markers. */)
2308 (num1, num2)
2309 register Lisp_Object num1, num2;
2311 return arithcompare (num1, num2, grtr_or_equal);
2314 DEFUN ("/=", Fneq, Sneq, 2, 2, 0,
2315 doc: /* Return t if first arg is not equal to second arg. Both must be numbers or markers. */)
2316 (num1, num2)
2317 register Lisp_Object num1, num2;
2319 return arithcompare (num1, num2, notequal);
2322 DEFUN ("zerop", Fzerop, Szerop, 1, 1, 0,
2323 doc: /* Return t if NUMBER is zero. */)
2324 (number)
2325 register Lisp_Object number;
2327 CHECK_NUMBER_OR_FLOAT (number);
2329 if (FLOATP (number))
2331 if (XFLOAT_DATA (number) == 0.0)
2332 return Qt;
2333 return Qnil;
2336 if (!XINT (number))
2337 return Qt;
2338 return Qnil;
2341 /* Convert between long values and pairs of Lisp integers.
2342 Note that long_to_cons returns a single Lisp integer
2343 when the value fits in one. */
2345 Lisp_Object
2346 long_to_cons (i)
2347 unsigned long i;
2349 unsigned long top = i >> 16;
2350 unsigned int bot = i & 0xFFFF;
2351 if (top == 0)
2352 return make_number (bot);
2353 if (top == (unsigned long)-1 >> 16)
2354 return Fcons (make_number (-1), make_number (bot));
2355 return Fcons (make_number (top), make_number (bot));
2358 unsigned long
2359 cons_to_long (c)
2360 Lisp_Object c;
2362 Lisp_Object top, bot;
2363 if (INTEGERP (c))
2364 return XINT (c);
2365 top = XCAR (c);
2366 bot = XCDR (c);
2367 if (CONSP (bot))
2368 bot = XCAR (bot);
2369 return ((XINT (top) << 16) | XINT (bot));
2372 DEFUN ("number-to-string", Fnumber_to_string, Snumber_to_string, 1, 1, 0,
2373 doc: /* Return the decimal representation of NUMBER as a string.
2374 Uses a minus sign if negative.
2375 NUMBER may be an integer or a floating point number. */)
2376 (number)
2377 Lisp_Object number;
2379 char buffer[VALBITS];
2381 CHECK_NUMBER_OR_FLOAT (number);
2383 if (FLOATP (number))
2385 char pigbuf[350]; /* see comments in float_to_string */
2387 float_to_string (pigbuf, XFLOAT_DATA (number));
2388 return build_string (pigbuf);
2391 if (sizeof (int) == sizeof (EMACS_INT))
2392 sprintf (buffer, "%d", (int) XINT (number));
2393 else if (sizeof (long) == sizeof (EMACS_INT))
2394 sprintf (buffer, "%ld", (long) XINT (number));
2395 else
2396 abort ();
2397 return build_string (buffer);
2400 INLINE static int
2401 digit_to_number (character, base)
2402 int character, base;
2404 int digit;
2406 if (character >= '0' && character <= '9')
2407 digit = character - '0';
2408 else if (character >= 'a' && character <= 'z')
2409 digit = character - 'a' + 10;
2410 else if (character >= 'A' && character <= 'Z')
2411 digit = character - 'A' + 10;
2412 else
2413 return -1;
2415 if (digit >= base)
2416 return -1;
2417 else
2418 return digit;
2421 DEFUN ("string-to-number", Fstring_to_number, Sstring_to_number, 1, 2, 0,
2422 doc: /* Parse STRING as a decimal number and return the number.
2423 This parses both integers and floating point numbers.
2424 It ignores leading spaces and tabs, and all trailing chars.
2426 If BASE, interpret STRING as a number in that base. If BASE isn't
2427 present, base 10 is used. BASE must be between 2 and 16 (inclusive).
2428 If the base used is not 10, STRING is always parsed as integer. */)
2429 (string, base)
2430 register Lisp_Object string, base;
2432 register unsigned char *p;
2433 register int b;
2434 int sign = 1;
2435 Lisp_Object val;
2437 CHECK_STRING (string);
2439 if (NILP (base))
2440 b = 10;
2441 else
2443 CHECK_NUMBER (base);
2444 b = XINT (base);
2445 if (b < 2 || b > 16)
2446 xsignal1 (Qargs_out_of_range, base);
2449 /* Skip any whitespace at the front of the number. Some versions of
2450 atoi do this anyway, so we might as well make Emacs lisp consistent. */
2451 p = SDATA (string);
2452 while (*p == ' ' || *p == '\t')
2453 p++;
2455 if (*p == '-')
2457 sign = -1;
2458 p++;
2460 else if (*p == '+')
2461 p++;
2463 if (isfloat_string (p, 1) && b == 10)
2464 val = make_float (sign * atof (p));
2465 else
2467 double v = 0;
2469 while (1)
2471 int digit = digit_to_number (*p++, b);
2472 if (digit < 0)
2473 break;
2474 v = v * b + digit;
2477 val = make_fixnum_or_float (sign * v);
2480 return val;
2484 enum arithop
2486 Aadd,
2487 Asub,
2488 Amult,
2489 Adiv,
2490 Alogand,
2491 Alogior,
2492 Alogxor,
2493 Amax,
2494 Amin
2497 static Lisp_Object float_arith_driver P_ ((double, int, enum arithop,
2498 int, Lisp_Object *));
2499 extern Lisp_Object fmod_float ();
2501 Lisp_Object
2502 arith_driver (code, nargs, args)
2503 enum arithop code;
2504 int nargs;
2505 register Lisp_Object *args;
2507 register Lisp_Object val;
2508 register int argnum;
2509 register EMACS_INT accum = 0;
2510 register EMACS_INT next;
2512 switch (SWITCH_ENUM_CAST (code))
2514 case Alogior:
2515 case Alogxor:
2516 case Aadd:
2517 case Asub:
2518 accum = 0;
2519 break;
2520 case Amult:
2521 accum = 1;
2522 break;
2523 case Alogand:
2524 accum = -1;
2525 break;
2526 default:
2527 break;
2530 for (argnum = 0; argnum < nargs; argnum++)
2532 /* Using args[argnum] as argument to CHECK_NUMBER_... */
2533 val = args[argnum];
2534 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val);
2536 if (FLOATP (val))
2537 return float_arith_driver ((double) accum, argnum, code,
2538 nargs, args);
2539 args[argnum] = val;
2540 next = XINT (args[argnum]);
2541 switch (SWITCH_ENUM_CAST (code))
2543 case Aadd:
2544 accum += next;
2545 break;
2546 case Asub:
2547 accum = argnum ? accum - next : nargs == 1 ? - next : next;
2548 break;
2549 case Amult:
2550 accum *= next;
2551 break;
2552 case Adiv:
2553 if (!argnum)
2554 accum = next;
2555 else
2557 if (next == 0)
2558 xsignal0 (Qarith_error);
2559 accum /= next;
2561 break;
2562 case Alogand:
2563 accum &= next;
2564 break;
2565 case Alogior:
2566 accum |= next;
2567 break;
2568 case Alogxor:
2569 accum ^= next;
2570 break;
2571 case Amax:
2572 if (!argnum || next > accum)
2573 accum = next;
2574 break;
2575 case Amin:
2576 if (!argnum || next < accum)
2577 accum = next;
2578 break;
2582 XSETINT (val, accum);
2583 return val;
2586 #undef isnan
2587 #define isnan(x) ((x) != (x))
2589 static Lisp_Object
2590 float_arith_driver (accum, argnum, code, nargs, args)
2591 double accum;
2592 register int argnum;
2593 enum arithop code;
2594 int nargs;
2595 register Lisp_Object *args;
2597 register Lisp_Object val;
2598 double next;
2600 for (; argnum < nargs; argnum++)
2602 val = args[argnum]; /* using args[argnum] as argument to CHECK_NUMBER_... */
2603 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val);
2605 if (FLOATP (val))
2607 next = XFLOAT_DATA (val);
2609 else
2611 args[argnum] = val; /* runs into a compiler bug. */
2612 next = XINT (args[argnum]);
2614 switch (SWITCH_ENUM_CAST (code))
2616 case Aadd:
2617 accum += next;
2618 break;
2619 case Asub:
2620 accum = argnum ? accum - next : nargs == 1 ? - next : next;
2621 break;
2622 case Amult:
2623 accum *= next;
2624 break;
2625 case Adiv:
2626 if (!argnum)
2627 accum = next;
2628 else
2630 if (! IEEE_FLOATING_POINT && next == 0)
2631 xsignal0 (Qarith_error);
2632 accum /= next;
2634 break;
2635 case Alogand:
2636 case Alogior:
2637 case Alogxor:
2638 return wrong_type_argument (Qinteger_or_marker_p, val);
2639 case Amax:
2640 if (!argnum || isnan (next) || next > accum)
2641 accum = next;
2642 break;
2643 case Amin:
2644 if (!argnum || isnan (next) || next < accum)
2645 accum = next;
2646 break;
2650 return make_float (accum);
2654 DEFUN ("+", Fplus, Splus, 0, MANY, 0,
2655 doc: /* Return sum of any number of arguments, which are numbers or markers.
2656 usage: (+ &rest NUMBERS-OR-MARKERS) */)
2657 (nargs, args)
2658 int nargs;
2659 Lisp_Object *args;
2661 return arith_driver (Aadd, nargs, args);
2664 DEFUN ("-", Fminus, Sminus, 0, MANY, 0,
2665 doc: /* Negate number or subtract numbers or markers and return the result.
2666 With one arg, negates it. With more than one arg,
2667 subtracts all but the first from the first.
2668 usage: (- &optional NUMBER-OR-MARKER &rest MORE-NUMBERS-OR-MARKERS) */)
2669 (nargs, args)
2670 int nargs;
2671 Lisp_Object *args;
2673 return arith_driver (Asub, nargs, args);
2676 DEFUN ("*", Ftimes, Stimes, 0, MANY, 0,
2677 doc: /* Return product of any number of arguments, which are numbers or markers.
2678 usage: (* &rest NUMBERS-OR-MARKERS) */)
2679 (nargs, args)
2680 int nargs;
2681 Lisp_Object *args;
2683 return arith_driver (Amult, nargs, args);
2686 DEFUN ("/", Fquo, Squo, 2, MANY, 0,
2687 doc: /* Return first argument divided by all the remaining arguments.
2688 The arguments must be numbers or markers.
2689 usage: (/ DIVIDEND DIVISOR &rest DIVISORS) */)
2690 (nargs, args)
2691 int nargs;
2692 Lisp_Object *args;
2694 int argnum;
2695 for (argnum = 2; argnum < nargs; argnum++)
2696 if (FLOATP (args[argnum]))
2697 return float_arith_driver (0, 0, Adiv, nargs, args);
2698 return arith_driver (Adiv, nargs, args);
2701 DEFUN ("%", Frem, Srem, 2, 2, 0,
2702 doc: /* Return remainder of X divided by Y.
2703 Both must be integers or markers. */)
2704 (x, y)
2705 register Lisp_Object x, y;
2707 Lisp_Object val;
2709 CHECK_NUMBER_COERCE_MARKER (x);
2710 CHECK_NUMBER_COERCE_MARKER (y);
2712 if (XFASTINT (y) == 0)
2713 xsignal0 (Qarith_error);
2715 XSETINT (val, XINT (x) % XINT (y));
2716 return val;
2719 #ifndef HAVE_FMOD
2720 double
2721 fmod (f1, f2)
2722 double f1, f2;
2724 double r = f1;
2726 if (f2 < 0.0)
2727 f2 = -f2;
2729 /* If the magnitude of the result exceeds that of the divisor, or
2730 the sign of the result does not agree with that of the dividend,
2731 iterate with the reduced value. This does not yield a
2732 particularly accurate result, but at least it will be in the
2733 range promised by fmod. */
2735 r -= f2 * floor (r / f2);
2736 while (f2 <= (r < 0 ? -r : r) || ((r < 0) != (f1 < 0) && ! isnan (r)));
2738 return r;
2740 #endif /* ! HAVE_FMOD */
2742 DEFUN ("mod", Fmod, Smod, 2, 2, 0,
2743 doc: /* Return X modulo Y.
2744 The result falls between zero (inclusive) and Y (exclusive).
2745 Both X and Y must be numbers or markers. */)
2746 (x, y)
2747 register Lisp_Object x, y;
2749 Lisp_Object val;
2750 EMACS_INT i1, i2;
2752 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (x);
2753 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (y);
2755 if (FLOATP (x) || FLOATP (y))
2756 return fmod_float (x, y);
2758 i1 = XINT (x);
2759 i2 = XINT (y);
2761 if (i2 == 0)
2762 xsignal0 (Qarith_error);
2764 i1 %= i2;
2766 /* If the "remainder" comes out with the wrong sign, fix it. */
2767 if (i2 < 0 ? i1 > 0 : i1 < 0)
2768 i1 += i2;
2770 XSETINT (val, i1);
2771 return val;
2774 DEFUN ("max", Fmax, Smax, 1, MANY, 0,
2775 doc: /* Return largest of all the arguments (which must be numbers or markers).
2776 The value is always a number; markers are converted to numbers.
2777 usage: (max NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */)
2778 (nargs, args)
2779 int nargs;
2780 Lisp_Object *args;
2782 return arith_driver (Amax, nargs, args);
2785 DEFUN ("min", Fmin, Smin, 1, MANY, 0,
2786 doc: /* Return smallest of all the arguments (which must be numbers or markers).
2787 The value is always a number; markers are converted to numbers.
2788 usage: (min NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */)
2789 (nargs, args)
2790 int nargs;
2791 Lisp_Object *args;
2793 return arith_driver (Amin, nargs, args);
2796 DEFUN ("logand", Flogand, Slogand, 0, MANY, 0,
2797 doc: /* Return bitwise-and of all the arguments.
2798 Arguments may be integers, or markers converted to integers.
2799 usage: (logand &rest INTS-OR-MARKERS) */)
2800 (nargs, args)
2801 int nargs;
2802 Lisp_Object *args;
2804 return arith_driver (Alogand, nargs, args);
2807 DEFUN ("logior", Flogior, Slogior, 0, MANY, 0,
2808 doc: /* Return bitwise-or of all the arguments.
2809 Arguments may be integers, or markers converted to integers.
2810 usage: (logior &rest INTS-OR-MARKERS) */)
2811 (nargs, args)
2812 int nargs;
2813 Lisp_Object *args;
2815 return arith_driver (Alogior, nargs, args);
2818 DEFUN ("logxor", Flogxor, Slogxor, 0, MANY, 0,
2819 doc: /* Return bitwise-exclusive-or of all the arguments.
2820 Arguments may be integers, or markers converted to integers.
2821 usage: (logxor &rest INTS-OR-MARKERS) */)
2822 (nargs, args)
2823 int nargs;
2824 Lisp_Object *args;
2826 return arith_driver (Alogxor, nargs, args);
2829 DEFUN ("ash", Fash, Sash, 2, 2, 0,
2830 doc: /* Return VALUE with its bits shifted left by COUNT.
2831 If COUNT is negative, shifting is actually to the right.
2832 In this case, the sign bit is duplicated. */)
2833 (value, count)
2834 register Lisp_Object value, count;
2836 register Lisp_Object val;
2838 CHECK_NUMBER (value);
2839 CHECK_NUMBER (count);
2841 if (XINT (count) >= BITS_PER_EMACS_INT)
2842 XSETINT (val, 0);
2843 else if (XINT (count) > 0)
2844 XSETINT (val, XINT (value) << XFASTINT (count));
2845 else if (XINT (count) <= -BITS_PER_EMACS_INT)
2846 XSETINT (val, XINT (value) < 0 ? -1 : 0);
2847 else
2848 XSETINT (val, XINT (value) >> -XINT (count));
2849 return val;
2852 DEFUN ("lsh", Flsh, Slsh, 2, 2, 0,
2853 doc: /* Return VALUE with its bits shifted left by COUNT.
2854 If COUNT is negative, shifting is actually to the right.
2855 In this case, zeros are shifted in on the left. */)
2856 (value, count)
2857 register Lisp_Object value, count;
2859 register Lisp_Object val;
2861 CHECK_NUMBER (value);
2862 CHECK_NUMBER (count);
2864 if (XINT (count) >= BITS_PER_EMACS_INT)
2865 XSETINT (val, 0);
2866 else if (XINT (count) > 0)
2867 XSETINT (val, (EMACS_UINT) XUINT (value) << XFASTINT (count));
2868 else if (XINT (count) <= -BITS_PER_EMACS_INT)
2869 XSETINT (val, 0);
2870 else
2871 XSETINT (val, (EMACS_UINT) XUINT (value) >> -XINT (count));
2872 return val;
2875 DEFUN ("1+", Fadd1, Sadd1, 1, 1, 0,
2876 doc: /* Return NUMBER plus one. NUMBER may be a number or a marker.
2877 Markers are converted to integers. */)
2878 (number)
2879 register Lisp_Object number;
2881 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number);
2883 if (FLOATP (number))
2884 return (make_float (1.0 + XFLOAT_DATA (number)));
2886 XSETINT (number, XINT (number) + 1);
2887 return number;
2890 DEFUN ("1-", Fsub1, Ssub1, 1, 1, 0,
2891 doc: /* Return NUMBER minus one. NUMBER may be a number or a marker.
2892 Markers are converted to integers. */)
2893 (number)
2894 register Lisp_Object number;
2896 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number);
2898 if (FLOATP (number))
2899 return (make_float (-1.0 + XFLOAT_DATA (number)));
2901 XSETINT (number, XINT (number) - 1);
2902 return number;
2905 DEFUN ("lognot", Flognot, Slognot, 1, 1, 0,
2906 doc: /* Return the bitwise complement of NUMBER. NUMBER must be an integer. */)
2907 (number)
2908 register Lisp_Object number;
2910 CHECK_NUMBER (number);
2911 XSETINT (number, ~XINT (number));
2912 return number;
2915 DEFUN ("byteorder", Fbyteorder, Sbyteorder, 0, 0, 0,
2916 doc: /* Return the byteorder for the machine.
2917 Returns 66 (ASCII uppercase B) for big endian machines or 108 (ASCII
2918 lowercase l) for small endian machines. */)
2921 unsigned i = 0x04030201;
2922 int order = *(char *)&i == 1 ? 108 : 66;
2924 return make_number (order);
2929 void
2930 syms_of_data ()
2932 Lisp_Object error_tail, arith_tail;
2934 Qquote = intern_c_string ("quote");
2935 Qlambda = intern_c_string ("lambda");
2936 Qsubr = intern_c_string ("subr");
2937 Qerror_conditions = intern_c_string ("error-conditions");
2938 Qerror_message = intern_c_string ("error-message");
2939 Qtop_level = intern_c_string ("top-level");
2941 Qerror = intern_c_string ("error");
2942 Qquit = intern_c_string ("quit");
2943 Qwrong_type_argument = intern_c_string ("wrong-type-argument");
2944 Qargs_out_of_range = intern_c_string ("args-out-of-range");
2945 Qvoid_function = intern_c_string ("void-function");
2946 Qcyclic_function_indirection = intern_c_string ("cyclic-function-indirection");
2947 Qcyclic_variable_indirection = intern_c_string ("cyclic-variable-indirection");
2948 Qvoid_variable = intern_c_string ("void-variable");
2949 Qsetting_constant = intern_c_string ("setting-constant");
2950 Qinvalid_read_syntax = intern_c_string ("invalid-read-syntax");
2952 Qinvalid_function = intern_c_string ("invalid-function");
2953 Qwrong_number_of_arguments = intern_c_string ("wrong-number-of-arguments");
2954 Qno_catch = intern_c_string ("no-catch");
2955 Qend_of_file = intern_c_string ("end-of-file");
2956 Qarith_error = intern_c_string ("arith-error");
2957 Qbeginning_of_buffer = intern_c_string ("beginning-of-buffer");
2958 Qend_of_buffer = intern_c_string ("end-of-buffer");
2959 Qbuffer_read_only = intern_c_string ("buffer-read-only");
2960 Qtext_read_only = intern_c_string ("text-read-only");
2961 Qmark_inactive = intern_c_string ("mark-inactive");
2963 Qlistp = intern_c_string ("listp");
2964 Qconsp = intern_c_string ("consp");
2965 Qsymbolp = intern_c_string ("symbolp");
2966 Qkeywordp = intern_c_string ("keywordp");
2967 Qintegerp = intern_c_string ("integerp");
2968 Qnatnump = intern_c_string ("natnump");
2969 Qwholenump = intern_c_string ("wholenump");
2970 Qstringp = intern_c_string ("stringp");
2971 Qarrayp = intern_c_string ("arrayp");
2972 Qsequencep = intern_c_string ("sequencep");
2973 Qbufferp = intern_c_string ("bufferp");
2974 Qvectorp = intern_c_string ("vectorp");
2975 Qchar_or_string_p = intern_c_string ("char-or-string-p");
2976 Qmarkerp = intern_c_string ("markerp");
2977 Qbuffer_or_string_p = intern_c_string ("buffer-or-string-p");
2978 Qinteger_or_marker_p = intern_c_string ("integer-or-marker-p");
2979 Qboundp = intern_c_string ("boundp");
2980 Qfboundp = intern_c_string ("fboundp");
2982 Qfloatp = intern_c_string ("floatp");
2983 Qnumberp = intern_c_string ("numberp");
2984 Qnumber_or_marker_p = intern_c_string ("number-or-marker-p");
2986 Qchar_table_p = intern_c_string ("char-table-p");
2987 Qvector_or_char_table_p = intern_c_string ("vector-or-char-table-p");
2989 Qsubrp = intern_c_string ("subrp");
2990 Qunevalled = intern_c_string ("unevalled");
2991 Qmany = intern_c_string ("many");
2993 Qcdr = intern_c_string ("cdr");
2995 /* Handle automatic advice activation */
2996 Qad_advice_info = intern_c_string ("ad-advice-info");
2997 Qad_activate_internal = intern_c_string ("ad-activate-internal");
2999 error_tail = pure_cons (Qerror, Qnil);
3001 /* ERROR is used as a signaler for random errors for which nothing else is right */
3003 Fput (Qerror, Qerror_conditions,
3004 error_tail);
3005 Fput (Qerror, Qerror_message,
3006 make_pure_c_string ("error"));
3008 Fput (Qquit, Qerror_conditions,
3009 pure_cons (Qquit, Qnil));
3010 Fput (Qquit, Qerror_message,
3011 make_pure_c_string ("Quit"));
3013 Fput (Qwrong_type_argument, Qerror_conditions,
3014 pure_cons (Qwrong_type_argument, error_tail));
3015 Fput (Qwrong_type_argument, Qerror_message,
3016 make_pure_c_string ("Wrong type argument"));
3018 Fput (Qargs_out_of_range, Qerror_conditions,
3019 pure_cons (Qargs_out_of_range, error_tail));
3020 Fput (Qargs_out_of_range, Qerror_message,
3021 make_pure_c_string ("Args out of range"));
3023 Fput (Qvoid_function, Qerror_conditions,
3024 pure_cons (Qvoid_function, error_tail));
3025 Fput (Qvoid_function, Qerror_message,
3026 make_pure_c_string ("Symbol's function definition is void"));
3028 Fput (Qcyclic_function_indirection, Qerror_conditions,
3029 pure_cons (Qcyclic_function_indirection, error_tail));
3030 Fput (Qcyclic_function_indirection, Qerror_message,
3031 make_pure_c_string ("Symbol's chain of function indirections contains a loop"));
3033 Fput (Qcyclic_variable_indirection, Qerror_conditions,
3034 pure_cons (Qcyclic_variable_indirection, error_tail));
3035 Fput (Qcyclic_variable_indirection, Qerror_message,
3036 make_pure_c_string ("Symbol's chain of variable indirections contains a loop"));
3038 Qcircular_list = intern_c_string ("circular-list");
3039 staticpro (&Qcircular_list);
3040 Fput (Qcircular_list, Qerror_conditions,
3041 pure_cons (Qcircular_list, error_tail));
3042 Fput (Qcircular_list, Qerror_message,
3043 make_pure_c_string ("List contains a loop"));
3045 Fput (Qvoid_variable, Qerror_conditions,
3046 pure_cons (Qvoid_variable, error_tail));
3047 Fput (Qvoid_variable, Qerror_message,
3048 make_pure_c_string ("Symbol's value as variable is void"));
3050 Fput (Qsetting_constant, Qerror_conditions,
3051 pure_cons (Qsetting_constant, error_tail));
3052 Fput (Qsetting_constant, Qerror_message,
3053 make_pure_c_string ("Attempt to set a constant symbol"));
3055 Fput (Qinvalid_read_syntax, Qerror_conditions,
3056 pure_cons (Qinvalid_read_syntax, error_tail));
3057 Fput (Qinvalid_read_syntax, Qerror_message,
3058 make_pure_c_string ("Invalid read syntax"));
3060 Fput (Qinvalid_function, Qerror_conditions,
3061 pure_cons (Qinvalid_function, error_tail));
3062 Fput (Qinvalid_function, Qerror_message,
3063 make_pure_c_string ("Invalid function"));
3065 Fput (Qwrong_number_of_arguments, Qerror_conditions,
3066 pure_cons (Qwrong_number_of_arguments, error_tail));
3067 Fput (Qwrong_number_of_arguments, Qerror_message,
3068 make_pure_c_string ("Wrong number of arguments"));
3070 Fput (Qno_catch, Qerror_conditions,
3071 pure_cons (Qno_catch, error_tail));
3072 Fput (Qno_catch, Qerror_message,
3073 make_pure_c_string ("No catch for tag"));
3075 Fput (Qend_of_file, Qerror_conditions,
3076 pure_cons (Qend_of_file, error_tail));
3077 Fput (Qend_of_file, Qerror_message,
3078 make_pure_c_string ("End of file during parsing"));
3080 arith_tail = pure_cons (Qarith_error, error_tail);
3081 Fput (Qarith_error, Qerror_conditions,
3082 arith_tail);
3083 Fput (Qarith_error, Qerror_message,
3084 make_pure_c_string ("Arithmetic error"));
3086 Fput (Qbeginning_of_buffer, Qerror_conditions,
3087 pure_cons (Qbeginning_of_buffer, error_tail));
3088 Fput (Qbeginning_of_buffer, Qerror_message,
3089 make_pure_c_string ("Beginning of buffer"));
3091 Fput (Qend_of_buffer, Qerror_conditions,
3092 pure_cons (Qend_of_buffer, error_tail));
3093 Fput (Qend_of_buffer, Qerror_message,
3094 make_pure_c_string ("End of buffer"));
3096 Fput (Qbuffer_read_only, Qerror_conditions,
3097 pure_cons (Qbuffer_read_only, error_tail));
3098 Fput (Qbuffer_read_only, Qerror_message,
3099 make_pure_c_string ("Buffer is read-only"));
3101 Fput (Qtext_read_only, Qerror_conditions,
3102 pure_cons (Qtext_read_only, error_tail));
3103 Fput (Qtext_read_only, Qerror_message,
3104 make_pure_c_string ("Text is read-only"));
3106 Qrange_error = intern_c_string ("range-error");
3107 Qdomain_error = intern_c_string ("domain-error");
3108 Qsingularity_error = intern_c_string ("singularity-error");
3109 Qoverflow_error = intern_c_string ("overflow-error");
3110 Qunderflow_error = intern_c_string ("underflow-error");
3112 Fput (Qdomain_error, Qerror_conditions,
3113 pure_cons (Qdomain_error, arith_tail));
3114 Fput (Qdomain_error, Qerror_message,
3115 make_pure_c_string ("Arithmetic domain error"));
3117 Fput (Qrange_error, Qerror_conditions,
3118 pure_cons (Qrange_error, arith_tail));
3119 Fput (Qrange_error, Qerror_message,
3120 make_pure_c_string ("Arithmetic range error"));
3122 Fput (Qsingularity_error, Qerror_conditions,
3123 pure_cons (Qsingularity_error, Fcons (Qdomain_error, arith_tail)));
3124 Fput (Qsingularity_error, Qerror_message,
3125 make_pure_c_string ("Arithmetic singularity error"));
3127 Fput (Qoverflow_error, Qerror_conditions,
3128 pure_cons (Qoverflow_error, Fcons (Qdomain_error, arith_tail)));
3129 Fput (Qoverflow_error, Qerror_message,
3130 make_pure_c_string ("Arithmetic overflow error"));
3132 Fput (Qunderflow_error, Qerror_conditions,
3133 pure_cons (Qunderflow_error, Fcons (Qdomain_error, arith_tail)));
3134 Fput (Qunderflow_error, Qerror_message,
3135 make_pure_c_string ("Arithmetic underflow error"));
3137 staticpro (&Qrange_error);
3138 staticpro (&Qdomain_error);
3139 staticpro (&Qsingularity_error);
3140 staticpro (&Qoverflow_error);
3141 staticpro (&Qunderflow_error);
3143 staticpro (&Qnil);
3144 staticpro (&Qt);
3145 staticpro (&Qquote);
3146 staticpro (&Qlambda);
3147 staticpro (&Qsubr);
3148 staticpro (&Qunbound);
3149 staticpro (&Qerror_conditions);
3150 staticpro (&Qerror_message);
3151 staticpro (&Qtop_level);
3153 staticpro (&Qerror);
3154 staticpro (&Qquit);
3155 staticpro (&Qwrong_type_argument);
3156 staticpro (&Qargs_out_of_range);
3157 staticpro (&Qvoid_function);
3158 staticpro (&Qcyclic_function_indirection);
3159 staticpro (&Qcyclic_variable_indirection);
3160 staticpro (&Qvoid_variable);
3161 staticpro (&Qsetting_constant);
3162 staticpro (&Qinvalid_read_syntax);
3163 staticpro (&Qwrong_number_of_arguments);
3164 staticpro (&Qinvalid_function);
3165 staticpro (&Qno_catch);
3166 staticpro (&Qend_of_file);
3167 staticpro (&Qarith_error);
3168 staticpro (&Qbeginning_of_buffer);
3169 staticpro (&Qend_of_buffer);
3170 staticpro (&Qbuffer_read_only);
3171 staticpro (&Qtext_read_only);
3172 staticpro (&Qmark_inactive);
3174 staticpro (&Qlistp);
3175 staticpro (&Qconsp);
3176 staticpro (&Qsymbolp);
3177 staticpro (&Qkeywordp);
3178 staticpro (&Qintegerp);
3179 staticpro (&Qnatnump);
3180 staticpro (&Qwholenump);
3181 staticpro (&Qstringp);
3182 staticpro (&Qarrayp);
3183 staticpro (&Qsequencep);
3184 staticpro (&Qbufferp);
3185 staticpro (&Qvectorp);
3186 staticpro (&Qchar_or_string_p);
3187 staticpro (&Qmarkerp);
3188 staticpro (&Qbuffer_or_string_p);
3189 staticpro (&Qinteger_or_marker_p);
3190 staticpro (&Qfloatp);
3191 staticpro (&Qnumberp);
3192 staticpro (&Qnumber_or_marker_p);
3193 staticpro (&Qchar_table_p);
3194 staticpro (&Qvector_or_char_table_p);
3195 staticpro (&Qsubrp);
3196 staticpro (&Qmany);
3197 staticpro (&Qunevalled);
3199 staticpro (&Qboundp);
3200 staticpro (&Qfboundp);
3201 staticpro (&Qcdr);
3202 staticpro (&Qad_advice_info);
3203 staticpro (&Qad_activate_internal);
3205 /* Types that type-of returns. */
3206 Qinteger = intern_c_string ("integer");
3207 Qsymbol = intern_c_string ("symbol");
3208 Qstring = intern_c_string ("string");
3209 Qcons = intern_c_string ("cons");
3210 Qmarker = intern_c_string ("marker");
3211 Qoverlay = intern_c_string ("overlay");
3212 Qfloat = intern_c_string ("float");
3213 Qwindow_configuration = intern_c_string ("window-configuration");
3214 Qprocess = intern_c_string ("process");
3215 Qwindow = intern_c_string ("window");
3216 /* Qsubr = intern_c_string ("subr"); */
3217 Qcompiled_function = intern_c_string ("compiled-function");
3218 Qbuffer = intern_c_string ("buffer");
3219 Qframe = intern_c_string ("frame");
3220 Qvector = intern_c_string ("vector");
3221 Qchar_table = intern_c_string ("char-table");
3222 Qbool_vector = intern_c_string ("bool-vector");
3223 Qhash_table = intern_c_string ("hash-table");
3225 Qthread_local_mark = Fmake_symbol (make_pure_string ("thread-local-mark",
3226 17, 17, 0));
3228 DEFSYM (Qfont_spec, "font-spec");
3229 DEFSYM (Qfont_entity, "font-entity");
3230 DEFSYM (Qfont_object, "font-object");
3232 DEFSYM (Qinteractive_form, "interactive-form");
3234 staticpro (&Qinteger);
3235 staticpro (&Qsymbol);
3236 staticpro (&Qstring);
3237 staticpro (&Qcons);
3238 staticpro (&Qmarker);
3239 staticpro (&Qoverlay);
3240 staticpro (&Qfloat);
3241 staticpro (&Qwindow_configuration);
3242 staticpro (&Qprocess);
3243 staticpro (&Qwindow);
3244 /* staticpro (&Qsubr); */
3245 staticpro (&Qcompiled_function);
3246 staticpro (&Qbuffer);
3247 staticpro (&Qframe);
3248 staticpro (&Qvector);
3249 staticpro (&Qchar_table);
3250 staticpro (&Qbool_vector);
3251 staticpro (&Qhash_table);
3252 staticpro (&Qthread_local_mark);
3254 defsubr (&Sindirect_variable);
3255 defsubr (&Sinteractive_form);
3256 defsubr (&Seq);
3257 defsubr (&Snull);
3258 defsubr (&Stype_of);
3259 defsubr (&Slistp);
3260 defsubr (&Snlistp);
3261 defsubr (&Sconsp);
3262 defsubr (&Satom);
3263 defsubr (&Sintegerp);
3264 defsubr (&Sinteger_or_marker_p);
3265 defsubr (&Snumberp);
3266 defsubr (&Snumber_or_marker_p);
3267 defsubr (&Sfloatp);
3268 defsubr (&Snatnump);
3269 defsubr (&Ssymbolp);
3270 defsubr (&Skeywordp);
3271 defsubr (&Sstringp);
3272 defsubr (&Smultibyte_string_p);
3273 defsubr (&Svectorp);
3274 defsubr (&Schar_table_p);
3275 defsubr (&Svector_or_char_table_p);
3276 defsubr (&Sbool_vector_p);
3277 defsubr (&Sarrayp);
3278 defsubr (&Ssequencep);
3279 defsubr (&Sbufferp);
3280 defsubr (&Smarkerp);
3281 defsubr (&Ssubrp);
3282 defsubr (&Sbyte_code_function_p);
3283 defsubr (&Schar_or_string_p);
3284 defsubr (&Scar);
3285 defsubr (&Scdr);
3286 defsubr (&Scar_safe);
3287 defsubr (&Scdr_safe);
3288 defsubr (&Ssetcar);
3289 defsubr (&Ssetcdr);
3290 defsubr (&Ssymbol_function);
3291 defsubr (&Sindirect_function);
3292 defsubr (&Ssymbol_plist);
3293 defsubr (&Ssymbol_name);
3294 defsubr (&Smakunbound);
3295 defsubr (&Sfmakunbound);
3296 defsubr (&Sboundp);
3297 defsubr (&Sfboundp);
3298 defsubr (&Sfset);
3299 defsubr (&Sdefalias);
3300 defsubr (&Ssetplist);
3301 defsubr (&Ssymbol_value);
3302 defsubr (&Sset);
3303 defsubr (&Sdefault_boundp);
3304 defsubr (&Sdefault_value);
3305 defsubr (&Sset_default);
3306 defsubr (&Ssetq_default);
3307 defsubr (&Smake_variable_buffer_local);
3308 defsubr (&Smake_local_variable);
3309 defsubr (&Skill_local_variable);
3310 defsubr (&Smake_variable_frame_local);
3311 defsubr (&Slocal_variable_p);
3312 defsubr (&Slocal_variable_if_set_p);
3313 defsubr (&Svariable_binding_locus);
3314 #if 0 /* XXX Remove this. --lorentey */
3315 defsubr (&Sterminal_local_value);
3316 defsubr (&Sset_terminal_local_value);
3317 #endif
3318 defsubr (&Saref);
3319 defsubr (&Saset);
3320 defsubr (&Snumber_to_string);
3321 defsubr (&Sstring_to_number);
3322 defsubr (&Seqlsign);
3323 defsubr (&Slss);
3324 defsubr (&Sgtr);
3325 defsubr (&Sleq);
3326 defsubr (&Sgeq);
3327 defsubr (&Sneq);
3328 defsubr (&Szerop);
3329 defsubr (&Splus);
3330 defsubr (&Sminus);
3331 defsubr (&Stimes);
3332 defsubr (&Squo);
3333 defsubr (&Srem);
3334 defsubr (&Smod);
3335 defsubr (&Smax);
3336 defsubr (&Smin);
3337 defsubr (&Slogand);
3338 defsubr (&Slogior);
3339 defsubr (&Slogxor);
3340 defsubr (&Slsh);
3341 defsubr (&Sash);
3342 defsubr (&Sadd1);
3343 defsubr (&Ssub1);
3344 defsubr (&Slognot);
3345 defsubr (&Sbyteorder);
3346 defsubr (&Ssubr_arity);
3347 defsubr (&Ssubr_name);
3349 XSYMBOL (Qwholenump)->function = XSYMBOL (Qnatnump)->function;
3351 DEFVAR_LISP ("most-positive-fixnum", &Vmost_positive_fixnum,
3352 doc: /* The largest value that is representable in a Lisp integer. */);
3353 Vmost_positive_fixnum = make_number (MOST_POSITIVE_FIXNUM);
3354 XSYMBOL (intern_c_string ("most-positive-fixnum"))->constant = 1;
3356 DEFVAR_LISP ("most-negative-fixnum", &Vmost_negative_fixnum,
3357 doc: /* The smallest value that is representable in a Lisp integer. */);
3358 Vmost_negative_fixnum = make_number (MOST_NEGATIVE_FIXNUM);
3359 XSYMBOL (intern_c_string ("most-negative-fixnum"))->constant = 1;
3362 SIGTYPE
3363 arith_error (signo)
3364 int signo;
3366 sigsetmask (SIGEMPTYMASK);
3368 SIGNAL_THREAD_CHECK (signo);
3369 xsignal0 (Qarith_error);
3372 void
3373 init_data ()
3375 /* Don't do this if just dumping out.
3376 We don't want to call `signal' in this case
3377 so that we don't have trouble with dumping
3378 signal-delivering routines in an inconsistent state. */
3379 #ifndef CANNOT_DUMP
3380 if (!initialized)
3381 return;
3382 #endif /* CANNOT_DUMP */
3383 signal (SIGFPE, arith_error);
3385 #ifdef uts
3386 signal (SIGEMT, arith_error);
3387 #endif /* uts */
3390 /* arch-tag: 25879798-b84d-479a-9c89-7d148e2109f7
3391 (do not change this comment) */