(init_fns): Don't initialize weak_hash_tables here.
[emacs.git] / src / data.c
blob0bca9da07d94bce29f009cbac47e3d8d6cc71d5e
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
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 "lisp.h"
26 #include "puresize.h"
27 #include "character.h"
28 #include "buffer.h"
29 #include "keyboard.h"
30 #include "frame.h"
31 #include "syssignal.h"
32 #include "termhooks.h" /* For FRAME_KBOARD reference in y-or-n-p. */
34 #ifdef STDC_HEADERS
35 #include <float.h>
36 #endif
38 /* If IEEE_FLOATING_POINT isn't defined, default it from FLT_*. */
39 #ifndef IEEE_FLOATING_POINT
40 #if (FLT_RADIX == 2 && FLT_MANT_DIG == 24 \
41 && FLT_MIN_EXP == -125 && FLT_MAX_EXP == 128)
42 #define IEEE_FLOATING_POINT 1
43 #else
44 #define IEEE_FLOATING_POINT 0
45 #endif
46 #endif
48 /* Work around a problem that happens because math.h on hpux 7
49 defines two static variables--which, in Emacs, are not really static,
50 because `static' is defined as nothing. The problem is that they are
51 here, in floatfns.c, and in lread.c.
52 These macros prevent the name conflict. */
53 #if defined (HPUX) && !defined (HPUX8)
54 #define _MAXLDBL data_c_maxldbl
55 #define _NMAXLDBL data_c_nmaxldbl
56 #endif
58 #include <math.h>
60 #if !defined (atof)
61 extern double atof ();
62 #endif /* !atof */
64 Lisp_Object Qnil, Qt, Qquote, Qlambda, Qsubr, Qunbound;
65 Lisp_Object Qerror_conditions, Qerror_message, Qtop_level;
66 Lisp_Object Qerror, Qquit, Qwrong_type_argument, Qargs_out_of_range;
67 Lisp_Object Qvoid_variable, Qvoid_function, Qcyclic_function_indirection;
68 Lisp_Object Qcyclic_variable_indirection, Qcircular_list;
69 Lisp_Object Qsetting_constant, Qinvalid_read_syntax;
70 Lisp_Object Qinvalid_function, Qwrong_number_of_arguments, Qno_catch;
71 Lisp_Object Qend_of_file, Qarith_error, Qmark_inactive;
72 Lisp_Object Qbeginning_of_buffer, Qend_of_buffer, Qbuffer_read_only;
73 Lisp_Object Qtext_read_only;
75 Lisp_Object Qintegerp, Qnatnump, Qwholenump, Qsymbolp, Qlistp, Qconsp;
76 Lisp_Object Qstringp, Qarrayp, Qsequencep, Qbufferp;
77 Lisp_Object Qchar_or_string_p, Qmarkerp, Qinteger_or_marker_p, Qvectorp;
78 Lisp_Object Qbuffer_or_string_p, Qkeywordp;
79 Lisp_Object Qboundp, Qfboundp;
80 Lisp_Object Qchar_table_p, Qvector_or_char_table_p;
82 Lisp_Object Qcdr;
83 Lisp_Object Qad_advice_info, Qad_activate_internal;
85 Lisp_Object Qrange_error, Qdomain_error, Qsingularity_error;
86 Lisp_Object Qoverflow_error, Qunderflow_error;
88 Lisp_Object Qfloatp;
89 Lisp_Object Qnumberp, Qnumber_or_marker_p;
91 Lisp_Object Qinteger;
92 static Lisp_Object Qsymbol, Qstring, Qcons, Qmarker, Qoverlay;
93 static Lisp_Object Qfloat, Qwindow_configuration, Qwindow;
94 Lisp_Object Qprocess;
95 static Lisp_Object Qcompiled_function, Qbuffer, Qframe, Qvector;
96 static Lisp_Object Qchar_table, Qbool_vector, Qhash_table;
97 static Lisp_Object Qsubrp, Qmany, Qunevalled;
99 static Lisp_Object swap_in_symval_forwarding P_ ((Lisp_Object, Lisp_Object));
101 Lisp_Object Vmost_positive_fixnum, Vmost_negative_fixnum;
104 void
105 circular_list_error (list)
106 Lisp_Object list;
108 xsignal (Qcircular_list, list);
112 Lisp_Object
113 wrong_type_argument (predicate, value)
114 register Lisp_Object predicate, value;
116 /* If VALUE is not even a valid Lisp object, abort here
117 where we can get a backtrace showing where it came from. */
118 if ((unsigned int) XTYPE (value) >= Lisp_Type_Limit)
119 abort ();
121 xsignal2 (Qwrong_type_argument, predicate, value);
124 void
125 pure_write_error ()
127 error ("Attempt to modify read-only object");
130 void
131 args_out_of_range (a1, a2)
132 Lisp_Object a1, a2;
134 xsignal2 (Qargs_out_of_range, a1, a2);
137 void
138 args_out_of_range_3 (a1, a2, a3)
139 Lisp_Object a1, a2, a3;
141 xsignal3 (Qargs_out_of_range, a1, a2, a3);
144 /* On some machines, XINT needs a temporary location.
145 Here it is, in case it is needed. */
147 int sign_extend_temp;
149 /* On a few machines, XINT can only be done by calling this. */
152 sign_extend_lisp_int (num)
153 EMACS_INT num;
155 if (num & (((EMACS_INT) 1) << (VALBITS - 1)))
156 return num | (((EMACS_INT) (-1)) << VALBITS);
157 else
158 return num & ((((EMACS_INT) 1) << VALBITS) - 1);
161 /* Data type predicates */
163 DEFUN ("eq", Feq, Seq, 2, 2, 0,
164 doc: /* Return t if the two args are the same Lisp object. */)
165 (obj1, obj2)
166 Lisp_Object obj1, obj2;
168 if (EQ (obj1, obj2))
169 return Qt;
170 return Qnil;
173 DEFUN ("null", Fnull, Snull, 1, 1, 0,
174 doc: /* Return t if OBJECT is nil. */)
175 (object)
176 Lisp_Object object;
178 if (NILP (object))
179 return Qt;
180 return Qnil;
183 DEFUN ("type-of", Ftype_of, Stype_of, 1, 1, 0,
184 doc: /* Return a symbol representing the type of OBJECT.
185 The symbol returned names the object's basic type;
186 for example, (type-of 1) returns `integer'. */)
187 (object)
188 Lisp_Object object;
190 switch (XTYPE (object))
192 case Lisp_Int:
193 return Qinteger;
195 case Lisp_Symbol:
196 return Qsymbol;
198 case Lisp_String:
199 return Qstring;
201 case Lisp_Cons:
202 return Qcons;
204 case Lisp_Misc:
205 switch (XMISCTYPE (object))
207 case Lisp_Misc_Marker:
208 return Qmarker;
209 case Lisp_Misc_Overlay:
210 return Qoverlay;
211 case Lisp_Misc_Float:
212 return Qfloat;
214 abort ();
216 case Lisp_Vectorlike:
217 if (WINDOW_CONFIGURATIONP (object))
218 return Qwindow_configuration;
219 if (PROCESSP (object))
220 return Qprocess;
221 if (WINDOWP (object))
222 return Qwindow;
223 if (SUBRP (object))
224 return Qsubr;
225 if (COMPILEDP (object))
226 return Qcompiled_function;
227 if (BUFFERP (object))
228 return Qbuffer;
229 if (CHAR_TABLE_P (object))
230 return Qchar_table;
231 if (BOOL_VECTOR_P (object))
232 return Qbool_vector;
233 if (FRAMEP (object))
234 return Qframe;
235 if (HASH_TABLE_P (object))
236 return Qhash_table;
237 return Qvector;
239 case Lisp_Float:
240 return Qfloat;
242 default:
243 abort ();
247 DEFUN ("consp", Fconsp, Sconsp, 1, 1, 0,
248 doc: /* Return t if OBJECT is a cons cell. */)
249 (object)
250 Lisp_Object object;
252 if (CONSP (object))
253 return Qt;
254 return Qnil;
257 DEFUN ("atom", Fatom, Satom, 1, 1, 0,
258 doc: /* Return t if OBJECT is not a cons cell. This includes nil. */)
259 (object)
260 Lisp_Object object;
262 if (CONSP (object))
263 return Qnil;
264 return Qt;
267 DEFUN ("listp", Flistp, Slistp, 1, 1, 0,
268 doc: /* Return t if OBJECT is a list, that is, a cons cell or nil.
269 Otherwise, return nil. */)
270 (object)
271 Lisp_Object object;
273 if (CONSP (object) || NILP (object))
274 return Qt;
275 return Qnil;
278 DEFUN ("nlistp", Fnlistp, Snlistp, 1, 1, 0,
279 doc: /* Return t if OBJECT is not a list. Lists include nil. */)
280 (object)
281 Lisp_Object object;
283 if (CONSP (object) || NILP (object))
284 return Qnil;
285 return Qt;
288 DEFUN ("symbolp", Fsymbolp, Ssymbolp, 1, 1, 0,
289 doc: /* Return t if OBJECT is a symbol. */)
290 (object)
291 Lisp_Object object;
293 if (SYMBOLP (object))
294 return Qt;
295 return Qnil;
298 /* Define this in C to avoid unnecessarily consing up the symbol
299 name. */
300 DEFUN ("keywordp", Fkeywordp, Skeywordp, 1, 1, 0,
301 doc: /* Return t if OBJECT is a keyword.
302 This means that it is a symbol with a print name beginning with `:'
303 interned in the initial obarray. */)
304 (object)
305 Lisp_Object object;
307 if (SYMBOLP (object)
308 && SREF (SYMBOL_NAME (object), 0) == ':'
309 && SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P (object))
310 return Qt;
311 return Qnil;
314 DEFUN ("vectorp", Fvectorp, Svectorp, 1, 1, 0,
315 doc: /* Return t if OBJECT is a vector. */)
316 (object)
317 Lisp_Object object;
319 if (VECTORP (object))
320 return Qt;
321 return Qnil;
324 DEFUN ("stringp", Fstringp, Sstringp, 1, 1, 0,
325 doc: /* Return t if OBJECT is a string. */)
326 (object)
327 Lisp_Object object;
329 if (STRINGP (object))
330 return Qt;
331 return Qnil;
334 DEFUN ("multibyte-string-p", Fmultibyte_string_p, Smultibyte_string_p,
335 1, 1, 0,
336 doc: /* Return t if OBJECT is a multibyte string. */)
337 (object)
338 Lisp_Object object;
340 if (STRINGP (object) && STRING_MULTIBYTE (object))
341 return Qt;
342 return Qnil;
345 DEFUN ("char-table-p", Fchar_table_p, Schar_table_p, 1, 1, 0,
346 doc: /* Return t if OBJECT is a char-table. */)
347 (object)
348 Lisp_Object object;
350 if (CHAR_TABLE_P (object))
351 return Qt;
352 return Qnil;
355 DEFUN ("vector-or-char-table-p", Fvector_or_char_table_p,
356 Svector_or_char_table_p, 1, 1, 0,
357 doc: /* Return t if OBJECT is a char-table or vector. */)
358 (object)
359 Lisp_Object object;
361 if (VECTORP (object) || CHAR_TABLE_P (object))
362 return Qt;
363 return Qnil;
366 DEFUN ("bool-vector-p", Fbool_vector_p, Sbool_vector_p, 1, 1, 0,
367 doc: /* Return t if OBJECT is a bool-vector. */)
368 (object)
369 Lisp_Object object;
371 if (BOOL_VECTOR_P (object))
372 return Qt;
373 return Qnil;
376 DEFUN ("arrayp", Farrayp, Sarrayp, 1, 1, 0,
377 doc: /* Return t if OBJECT is an array (string or vector). */)
378 (object)
379 Lisp_Object object;
381 if (ARRAYP (object))
382 return Qt;
383 return Qnil;
386 DEFUN ("sequencep", Fsequencep, Ssequencep, 1, 1, 0,
387 doc: /* Return t if OBJECT is a sequence (list or array). */)
388 (object)
389 register Lisp_Object object;
391 if (CONSP (object) || NILP (object) || ARRAYP (object))
392 return Qt;
393 return Qnil;
396 DEFUN ("bufferp", Fbufferp, Sbufferp, 1, 1, 0,
397 doc: /* Return t if OBJECT is an editor buffer. */)
398 (object)
399 Lisp_Object object;
401 if (BUFFERP (object))
402 return Qt;
403 return Qnil;
406 DEFUN ("markerp", Fmarkerp, Smarkerp, 1, 1, 0,
407 doc: /* Return t if OBJECT is a marker (editor pointer). */)
408 (object)
409 Lisp_Object object;
411 if (MARKERP (object))
412 return Qt;
413 return Qnil;
416 DEFUN ("subrp", Fsubrp, Ssubrp, 1, 1, 0,
417 doc: /* Return t if OBJECT is a built-in function. */)
418 (object)
419 Lisp_Object object;
421 if (SUBRP (object))
422 return Qt;
423 return Qnil;
426 DEFUN ("byte-code-function-p", Fbyte_code_function_p, Sbyte_code_function_p,
427 1, 1, 0,
428 doc: /* Return t if OBJECT is a byte-compiled function object. */)
429 (object)
430 Lisp_Object object;
432 if (COMPILEDP (object))
433 return Qt;
434 return Qnil;
437 DEFUN ("char-or-string-p", Fchar_or_string_p, Schar_or_string_p, 1, 1, 0,
438 doc: /* Return t if OBJECT is a character or a string. */)
439 (object)
440 register Lisp_Object object;
442 if (CHARACTERP (object) || STRINGP (object))
443 return Qt;
444 return Qnil;
447 DEFUN ("integerp", Fintegerp, Sintegerp, 1, 1, 0,
448 doc: /* Return t if OBJECT is an integer. */)
449 (object)
450 Lisp_Object object;
452 if (INTEGERP (object))
453 return Qt;
454 return Qnil;
457 DEFUN ("integer-or-marker-p", Finteger_or_marker_p, Sinteger_or_marker_p, 1, 1, 0,
458 doc: /* Return t if OBJECT is an integer or a marker (editor pointer). */)
459 (object)
460 register Lisp_Object object;
462 if (MARKERP (object) || INTEGERP (object))
463 return Qt;
464 return Qnil;
467 DEFUN ("natnump", Fnatnump, Snatnump, 1, 1, 0,
468 doc: /* Return t if OBJECT is a nonnegative integer. */)
469 (object)
470 Lisp_Object object;
472 if (NATNUMP (object))
473 return Qt;
474 return Qnil;
477 DEFUN ("numberp", Fnumberp, Snumberp, 1, 1, 0,
478 doc: /* Return t if OBJECT is a number (floating point or integer). */)
479 (object)
480 Lisp_Object object;
482 if (NUMBERP (object))
483 return Qt;
484 else
485 return Qnil;
488 DEFUN ("number-or-marker-p", Fnumber_or_marker_p,
489 Snumber_or_marker_p, 1, 1, 0,
490 doc: /* Return t if OBJECT is a number or a marker. */)
491 (object)
492 Lisp_Object object;
494 if (NUMBERP (object) || MARKERP (object))
495 return Qt;
496 return Qnil;
499 DEFUN ("floatp", Ffloatp, Sfloatp, 1, 1, 0,
500 doc: /* Return t if OBJECT is a floating point number. */)
501 (object)
502 Lisp_Object object;
504 if (FLOATP (object))
505 return Qt;
506 return Qnil;
510 /* Extract and set components of lists */
512 DEFUN ("car", Fcar, Scar, 1, 1, 0,
513 doc: /* Return the car of LIST. If arg is nil, return nil.
514 Error if arg is not nil and not a cons cell. See also `car-safe'.
516 See Info node `(elisp)Cons Cells' for a discussion of related basic
517 Lisp concepts such as car, cdr, cons cell and list. */)
518 (list)
519 register Lisp_Object list;
521 return CAR (list);
524 DEFUN ("car-safe", Fcar_safe, Scar_safe, 1, 1, 0,
525 doc: /* Return the car of OBJECT if it is a cons cell, or else nil. */)
526 (object)
527 Lisp_Object object;
529 return CAR_SAFE (object);
532 DEFUN ("cdr", Fcdr, Scdr, 1, 1, 0,
533 doc: /* Return the cdr of LIST. If arg is nil, return nil.
534 Error if arg is not nil and not a cons cell. See also `cdr-safe'.
536 See Info node `(elisp)Cons Cells' for a discussion of related basic
537 Lisp concepts such as cdr, car, cons cell and list. */)
538 (list)
539 register Lisp_Object list;
541 return CDR (list);
544 DEFUN ("cdr-safe", Fcdr_safe, Scdr_safe, 1, 1, 0,
545 doc: /* Return the cdr of OBJECT if it is a cons cell, or else nil. */)
546 (object)
547 Lisp_Object object;
549 return CDR_SAFE (object);
552 DEFUN ("setcar", Fsetcar, Ssetcar, 2, 2, 0,
553 doc: /* Set the car of CELL to be NEWCAR. Returns NEWCAR. */)
554 (cell, newcar)
555 register Lisp_Object cell, newcar;
557 CHECK_CONS (cell);
558 CHECK_IMPURE (cell);
559 XSETCAR (cell, newcar);
560 return newcar;
563 DEFUN ("setcdr", Fsetcdr, Ssetcdr, 2, 2, 0,
564 doc: /* Set the cdr of CELL to be NEWCDR. Returns NEWCDR. */)
565 (cell, newcdr)
566 register Lisp_Object cell, newcdr;
568 CHECK_CONS (cell);
569 CHECK_IMPURE (cell);
570 XSETCDR (cell, newcdr);
571 return newcdr;
574 /* Extract and set components of symbols */
576 DEFUN ("boundp", Fboundp, Sboundp, 1, 1, 0,
577 doc: /* Return t if SYMBOL's value is not void. */)
578 (symbol)
579 register Lisp_Object symbol;
581 Lisp_Object valcontents;
582 CHECK_SYMBOL (symbol);
584 valcontents = SYMBOL_VALUE (symbol);
586 if (BUFFER_LOCAL_VALUEP (valcontents))
587 valcontents = swap_in_symval_forwarding (symbol, valcontents);
589 return (EQ (valcontents, Qunbound) ? Qnil : Qt);
592 DEFUN ("fboundp", Ffboundp, Sfboundp, 1, 1, 0,
593 doc: /* Return t if SYMBOL's function definition is not void. */)
594 (symbol)
595 register Lisp_Object symbol;
597 CHECK_SYMBOL (symbol);
598 return (EQ (XSYMBOL (symbol)->function, Qunbound) ? Qnil : Qt);
601 DEFUN ("makunbound", Fmakunbound, Smakunbound, 1, 1, 0,
602 doc: /* Make SYMBOL's value be void.
603 Return SYMBOL. */)
604 (symbol)
605 register Lisp_Object symbol;
607 CHECK_SYMBOL (symbol);
608 if (SYMBOL_CONSTANT_P (symbol))
609 xsignal1 (Qsetting_constant, symbol);
610 Fset (symbol, Qunbound);
611 return symbol;
614 DEFUN ("fmakunbound", Ffmakunbound, Sfmakunbound, 1, 1, 0,
615 doc: /* Make SYMBOL's function definition be void.
616 Return SYMBOL. */)
617 (symbol)
618 register Lisp_Object symbol;
620 CHECK_SYMBOL (symbol);
621 if (NILP (symbol) || EQ (symbol, Qt))
622 xsignal1 (Qsetting_constant, symbol);
623 XSYMBOL (symbol)->function = Qunbound;
624 return symbol;
627 DEFUN ("symbol-function", Fsymbol_function, Ssymbol_function, 1, 1, 0,
628 doc: /* Return SYMBOL's function definition. Error if that is void. */)
629 (symbol)
630 register Lisp_Object symbol;
632 CHECK_SYMBOL (symbol);
633 if (!EQ (XSYMBOL (symbol)->function, Qunbound))
634 return XSYMBOL (symbol)->function;
635 xsignal1 (Qvoid_function, symbol);
638 DEFUN ("symbol-plist", Fsymbol_plist, Ssymbol_plist, 1, 1, 0,
639 doc: /* Return SYMBOL's property list. */)
640 (symbol)
641 register Lisp_Object symbol;
643 CHECK_SYMBOL (symbol);
644 return XSYMBOL (symbol)->plist;
647 DEFUN ("symbol-name", Fsymbol_name, Ssymbol_name, 1, 1, 0,
648 doc: /* Return SYMBOL's name, a string. */)
649 (symbol)
650 register Lisp_Object symbol;
652 register Lisp_Object name;
654 CHECK_SYMBOL (symbol);
655 name = SYMBOL_NAME (symbol);
656 return name;
659 DEFUN ("fset", Ffset, Sfset, 2, 2, 0,
660 doc: /* Set SYMBOL's function definition to DEFINITION, and return DEFINITION. */)
661 (symbol, definition)
662 register Lisp_Object symbol, definition;
664 register Lisp_Object function;
666 CHECK_SYMBOL (symbol);
667 if (NILP (symbol) || EQ (symbol, Qt))
668 xsignal1 (Qsetting_constant, symbol);
670 function = XSYMBOL (symbol)->function;
672 if (!NILP (Vautoload_queue) && !EQ (function, Qunbound))
673 Vautoload_queue = Fcons (Fcons (symbol, function), Vautoload_queue);
675 if (CONSP (function) && EQ (XCAR (function), Qautoload))
676 Fput (symbol, Qautoload, XCDR (function));
678 XSYMBOL (symbol)->function = definition;
679 /* Handle automatic advice activation */
680 if (CONSP (XSYMBOL (symbol)->plist) && !NILP (Fget (symbol, Qad_advice_info)))
682 call2 (Qad_activate_internal, symbol, Qnil);
683 definition = XSYMBOL (symbol)->function;
685 return definition;
688 extern Lisp_Object Qfunction_documentation;
690 DEFUN ("defalias", Fdefalias, Sdefalias, 2, 3, 0,
691 doc: /* Set SYMBOL's function definition to DEFINITION, and return DEFINITION.
692 Associates the function with the current load file, if any.
693 The optional third argument DOCSTRING specifies the documentation string
694 for SYMBOL; if it is omitted or nil, SYMBOL uses the documentation string
695 determined by DEFINITION. */)
696 (symbol, definition, docstring)
697 register Lisp_Object symbol, definition, docstring;
699 CHECK_SYMBOL (symbol);
700 if (CONSP (XSYMBOL (symbol)->function)
701 && EQ (XCAR (XSYMBOL (symbol)->function), Qautoload))
702 LOADHIST_ATTACH (Fcons (Qt, symbol));
703 definition = Ffset (symbol, definition);
704 LOADHIST_ATTACH (Fcons (Qdefun, symbol));
705 if (!NILP (docstring))
706 Fput (symbol, Qfunction_documentation, docstring);
707 return definition;
710 DEFUN ("setplist", Fsetplist, Ssetplist, 2, 2, 0,
711 doc: /* Set SYMBOL's property list to NEWPLIST, and return NEWPLIST. */)
712 (symbol, newplist)
713 register Lisp_Object symbol, newplist;
715 CHECK_SYMBOL (symbol);
716 XSYMBOL (symbol)->plist = newplist;
717 return newplist;
720 DEFUN ("subr-arity", Fsubr_arity, Ssubr_arity, 1, 1, 0,
721 doc: /* Return minimum and maximum number of args allowed for SUBR.
722 SUBR must be a built-in function.
723 The returned value is a pair (MIN . MAX). MIN is the minimum number
724 of args. MAX is the maximum number or the symbol `many', for a
725 function with `&rest' args, or `unevalled' for a special form. */)
726 (subr)
727 Lisp_Object subr;
729 short minargs, maxargs;
730 CHECK_SUBR (subr);
731 minargs = XSUBR (subr)->min_args;
732 maxargs = XSUBR (subr)->max_args;
733 if (maxargs == MANY)
734 return Fcons (make_number (minargs), Qmany);
735 else if (maxargs == UNEVALLED)
736 return Fcons (make_number (minargs), Qunevalled);
737 else
738 return Fcons (make_number (minargs), make_number (maxargs));
741 DEFUN ("subr-name", Fsubr_name, Ssubr_name, 1, 1, 0,
742 doc: /* Return name of subroutine SUBR.
743 SUBR must be a built-in function. */)
744 (subr)
745 Lisp_Object subr;
747 const char *name;
748 CHECK_SUBR (subr);
749 name = XSUBR (subr)->symbol_name;
750 return make_string (name, strlen (name));
753 DEFUN ("interactive-form", Finteractive_form, Sinteractive_form, 1, 1, 0,
754 doc: /* Return the interactive form of CMD or nil if none.
755 If CMD is not a command, the return value is nil.
756 Value, if non-nil, is a list \(interactive SPEC). */)
757 (cmd)
758 Lisp_Object cmd;
760 Lisp_Object fun = indirect_function (cmd); /* Check cycles. */
762 if (NILP (fun) || EQ (fun, Qunbound))
763 return Qnil;
765 /* Use an `interactive-form' property if present, analogous to the
766 function-documentation property. */
767 fun = cmd;
768 while (SYMBOLP (fun))
770 Lisp_Object tmp = Fget (fun, intern ("interactive-form"));
771 if (!NILP (tmp))
772 return tmp;
773 else
774 fun = Fsymbol_function (fun);
777 if (SUBRP (fun))
779 char *spec = XSUBR (fun)->intspec;
780 if (spec)
781 return list2 (Qinteractive,
782 (*spec != '(') ? build_string (spec) :
783 Fcar (Fread_from_string (build_string (spec), Qnil, Qnil)));
785 else if (COMPILEDP (fun))
787 if ((ASIZE (fun) & PSEUDOVECTOR_SIZE_MASK) > COMPILED_INTERACTIVE)
788 return list2 (Qinteractive, AREF (fun, COMPILED_INTERACTIVE));
790 else if (CONSP (fun))
792 Lisp_Object funcar = XCAR (fun);
793 if (EQ (funcar, Qlambda))
794 return Fassq (Qinteractive, Fcdr (XCDR (fun)));
795 else if (EQ (funcar, Qautoload))
797 struct gcpro gcpro1;
798 GCPRO1 (cmd);
799 do_autoload (fun, cmd);
800 UNGCPRO;
801 return Finteractive_form (cmd);
804 return Qnil;
808 /***********************************************************************
809 Getting and Setting Values of Symbols
810 ***********************************************************************/
812 /* Return the symbol holding SYMBOL's value. Signal
813 `cyclic-variable-indirection' if SYMBOL's chain of variable
814 indirections contains a loop. */
816 Lisp_Object
817 indirect_variable (symbol)
818 Lisp_Object symbol;
820 Lisp_Object tortoise, hare;
822 hare = tortoise = symbol;
824 while (XSYMBOL (hare)->indirect_variable)
826 hare = XSYMBOL (hare)->value;
827 if (!XSYMBOL (hare)->indirect_variable)
828 break;
830 hare = XSYMBOL (hare)->value;
831 tortoise = XSYMBOL (tortoise)->value;
833 if (EQ (hare, tortoise))
834 xsignal1 (Qcyclic_variable_indirection, symbol);
837 return hare;
841 DEFUN ("indirect-variable", Findirect_variable, Sindirect_variable, 1, 1, 0,
842 doc: /* Return the variable at the end of OBJECT's variable chain.
843 If OBJECT is a symbol, follow all variable indirections and return the final
844 variable. If OBJECT is not a symbol, just return it.
845 Signal a cyclic-variable-indirection error if there is a loop in the
846 variable chain of symbols. */)
847 (object)
848 Lisp_Object object;
850 if (SYMBOLP (object))
851 object = indirect_variable (object);
852 return object;
856 /* Given the raw contents of a symbol value cell,
857 return the Lisp value of the symbol.
858 This does not handle buffer-local variables; use
859 swap_in_symval_forwarding for that. */
861 Lisp_Object
862 do_symval_forwarding (valcontents)
863 register Lisp_Object valcontents;
865 register Lisp_Object val;
866 if (MISCP (valcontents))
867 switch (XMISCTYPE (valcontents))
869 case Lisp_Misc_Intfwd:
870 XSETINT (val, *XINTFWD (valcontents)->intvar);
871 return val;
873 case Lisp_Misc_Boolfwd:
874 return (*XBOOLFWD (valcontents)->boolvar ? Qt : Qnil);
876 case Lisp_Misc_Objfwd:
877 return *XOBJFWD (valcontents)->objvar;
879 case Lisp_Misc_Buffer_Objfwd:
880 return PER_BUFFER_VALUE (current_buffer,
881 XBUFFER_OBJFWD (valcontents)->offset);
883 case Lisp_Misc_Kboard_Objfwd:
884 /* We used to simply use current_kboard here, but from Lisp
885 code, it's value is often unexpected. It seems nicer to
886 allow constructions like this to work as intuitively expected:
888 (with-selected-frame frame
889 (define-key local-function-map "\eOP" [f1]))
891 On the other hand, this affects the semantics of
892 last-command and real-last-command, and people may rely on
893 that. I took a quick look at the Lisp codebase, and I
894 don't think anything will break. --lorentey */
895 return *(Lisp_Object *)(XKBOARD_OBJFWD (valcontents)->offset
896 + (char *)FRAME_KBOARD (SELECTED_FRAME ()));
898 return valcontents;
901 /* Store NEWVAL into SYMBOL, where VALCONTENTS is found in the value cell
902 of SYMBOL. If SYMBOL is buffer-local, VALCONTENTS should be the
903 buffer-independent contents of the value cell: forwarded just one
904 step past the buffer-localness.
906 BUF non-zero means set the value in buffer BUF instead of the
907 current buffer. This only plays a role for per-buffer variables. */
909 void
910 store_symval_forwarding (symbol, valcontents, newval, buf)
911 Lisp_Object symbol;
912 register Lisp_Object valcontents, newval;
913 struct buffer *buf;
915 switch (SWITCH_ENUM_CAST (XTYPE (valcontents)))
917 case Lisp_Misc:
918 switch (XMISCTYPE (valcontents))
920 case Lisp_Misc_Intfwd:
921 CHECK_NUMBER (newval);
922 *XINTFWD (valcontents)->intvar = XINT (newval);
923 /* This can never happen since intvar points to an EMACS_INT
924 which is at least large enough to hold a Lisp_Object.
925 if (*XINTFWD (valcontents)->intvar != XINT (newval))
926 error ("Value out of range for variable `%s'",
927 SDATA (SYMBOL_NAME (symbol))); */
928 break;
930 case Lisp_Misc_Boolfwd:
931 *XBOOLFWD (valcontents)->boolvar = !NILP (newval);
932 break;
934 case Lisp_Misc_Objfwd:
935 *XOBJFWD (valcontents)->objvar = newval;
937 /* If this variable is a default for something stored
938 in the buffer itself, such as default-fill-column,
939 find the buffers that don't have local values for it
940 and update them. */
941 if (XOBJFWD (valcontents)->objvar > (Lisp_Object *) &buffer_defaults
942 && XOBJFWD (valcontents)->objvar < (Lisp_Object *) (&buffer_defaults + 1))
944 int offset = ((char *) XOBJFWD (valcontents)->objvar
945 - (char *) &buffer_defaults);
946 int idx = PER_BUFFER_IDX (offset);
948 Lisp_Object tail;
950 if (idx <= 0)
951 break;
953 for (tail = Vbuffer_alist; CONSP (tail); tail = XCDR (tail))
955 Lisp_Object buf;
956 struct buffer *b;
958 buf = Fcdr (XCAR (tail));
959 if (!BUFFERP (buf)) continue;
960 b = XBUFFER (buf);
962 if (! PER_BUFFER_VALUE_P (b, idx))
963 PER_BUFFER_VALUE (b, offset) = newval;
966 break;
968 case Lisp_Misc_Buffer_Objfwd:
970 int offset = XBUFFER_OBJFWD (valcontents)->offset;
971 Lisp_Object type = XBUFFER_OBJFWD (valcontents)->slottype;
973 if (! NILP (type) && ! NILP (newval)
974 && XTYPE (newval) != XINT (type))
975 buffer_slot_type_mismatch (symbol, XINT (type));
977 if (buf == NULL)
978 buf = current_buffer;
979 PER_BUFFER_VALUE (buf, offset) = newval;
981 break;
983 case Lisp_Misc_Kboard_Objfwd:
985 char *base = (char *) FRAME_KBOARD (SELECTED_FRAME ());
986 char *p = base + XKBOARD_OBJFWD (valcontents)->offset;
987 *(Lisp_Object *) p = newval;
989 break;
991 default:
992 goto def;
994 break;
996 default:
997 def:
998 valcontents = SYMBOL_VALUE (symbol);
999 if (BUFFER_LOCAL_VALUEP (valcontents))
1000 XBUFFER_LOCAL_VALUE (valcontents)->realvalue = newval;
1001 else
1002 SET_SYMBOL_VALUE (symbol, newval);
1006 /* Set up SYMBOL to refer to its global binding.
1007 This makes it safe to alter the status of other bindings. */
1009 void
1010 swap_in_global_binding (symbol)
1011 Lisp_Object symbol;
1013 Lisp_Object valcontents = SYMBOL_VALUE (symbol);
1014 struct Lisp_Buffer_Local_Value *blv = XBUFFER_LOCAL_VALUE (valcontents);
1015 Lisp_Object cdr = blv->cdr;
1017 /* Unload the previously loaded binding. */
1018 Fsetcdr (XCAR (cdr),
1019 do_symval_forwarding (blv->realvalue));
1021 /* Select the global binding in the symbol. */
1022 XSETCAR (cdr, cdr);
1023 store_symval_forwarding (symbol, blv->realvalue, XCDR (cdr), NULL);
1025 /* Indicate that the global binding is set up now. */
1026 blv->frame = Qnil;
1027 blv->buffer = Qnil;
1028 blv->found_for_frame = 0;
1029 blv->found_for_buffer = 0;
1032 /* Set up the buffer-local symbol SYMBOL for validity in the current buffer.
1033 VALCONTENTS is the contents of its value cell,
1034 which points to a struct Lisp_Buffer_Local_Value.
1036 Return the value forwarded one step past the buffer-local stage.
1037 This could be another forwarding pointer. */
1039 static Lisp_Object
1040 swap_in_symval_forwarding (symbol, valcontents)
1041 Lisp_Object symbol, valcontents;
1043 register Lisp_Object tem1;
1045 tem1 = XBUFFER_LOCAL_VALUE (valcontents)->buffer;
1047 if (NILP (tem1)
1048 || current_buffer != XBUFFER (tem1)
1049 || (XBUFFER_LOCAL_VALUE (valcontents)->check_frame
1050 && ! EQ (selected_frame, XBUFFER_LOCAL_VALUE (valcontents)->frame)))
1052 if (XSYMBOL (symbol)->indirect_variable)
1053 symbol = indirect_variable (symbol);
1055 /* Unload the previously loaded binding. */
1056 tem1 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1057 Fsetcdr (tem1,
1058 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue));
1059 /* Choose the new binding. */
1060 tem1 = assq_no_quit (symbol, current_buffer->local_var_alist);
1061 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 0;
1062 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
1063 if (NILP (tem1))
1065 if (XBUFFER_LOCAL_VALUE (valcontents)->check_frame)
1066 tem1 = assq_no_quit (symbol, XFRAME (selected_frame)->param_alist);
1067 if (! NILP (tem1))
1068 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 1;
1069 else
1070 tem1 = XBUFFER_LOCAL_VALUE (valcontents)->cdr;
1072 else
1073 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 1;
1075 /* Load the new binding. */
1076 XSETCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr, tem1);
1077 XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer, current_buffer);
1078 XBUFFER_LOCAL_VALUE (valcontents)->frame = selected_frame;
1079 store_symval_forwarding (symbol,
1080 XBUFFER_LOCAL_VALUE (valcontents)->realvalue,
1081 Fcdr (tem1), NULL);
1083 return XBUFFER_LOCAL_VALUE (valcontents)->realvalue;
1086 /* Find the value of a symbol, returning Qunbound if it's not bound.
1087 This is helpful for code which just wants to get a variable's value
1088 if it has one, without signaling an error.
1089 Note that it must not be possible to quit
1090 within this function. Great care is required for this. */
1092 Lisp_Object
1093 find_symbol_value (symbol)
1094 Lisp_Object symbol;
1096 register Lisp_Object valcontents;
1097 register Lisp_Object val;
1099 CHECK_SYMBOL (symbol);
1100 valcontents = SYMBOL_VALUE (symbol);
1102 if (BUFFER_LOCAL_VALUEP (valcontents))
1103 valcontents = swap_in_symval_forwarding (symbol, valcontents);
1105 return do_symval_forwarding (valcontents);
1108 DEFUN ("symbol-value", Fsymbol_value, Ssymbol_value, 1, 1, 0,
1109 doc: /* Return SYMBOL's value. Error if that is void. */)
1110 (symbol)
1111 Lisp_Object symbol;
1113 Lisp_Object val;
1115 val = find_symbol_value (symbol);
1116 if (!EQ (val, Qunbound))
1117 return val;
1119 xsignal1 (Qvoid_variable, symbol);
1122 DEFUN ("set", Fset, Sset, 2, 2, 0,
1123 doc: /* Set SYMBOL's value to NEWVAL, and return NEWVAL. */)
1124 (symbol, newval)
1125 register Lisp_Object symbol, newval;
1127 return set_internal (symbol, newval, current_buffer, 0);
1130 /* Return 1 if SYMBOL currently has a let-binding
1131 which was made in the buffer that is now current. */
1133 static int
1134 let_shadows_buffer_binding_p (symbol)
1135 Lisp_Object symbol;
1137 volatile struct specbinding *p;
1139 for (p = specpdl_ptr - 1; p >= specpdl; p--)
1140 if (p->func == NULL
1141 && CONSP (p->symbol))
1143 Lisp_Object let_bound_symbol = XCAR (p->symbol);
1144 if ((EQ (symbol, let_bound_symbol)
1145 || (XSYMBOL (let_bound_symbol)->indirect_variable
1146 && EQ (symbol, indirect_variable (let_bound_symbol))))
1147 && XBUFFER (XCDR (XCDR (p->symbol))) == current_buffer)
1148 break;
1151 return p >= specpdl;
1154 /* Store the value NEWVAL into SYMBOL.
1155 If buffer-locality is an issue, BUF specifies which buffer to use.
1156 (0 stands for the current buffer.)
1158 If BINDFLAG is zero, then if this symbol is supposed to become
1159 local in every buffer where it is set, then we make it local.
1160 If BINDFLAG is nonzero, we don't do that. */
1162 Lisp_Object
1163 set_internal (symbol, newval, buf, bindflag)
1164 register Lisp_Object symbol, newval;
1165 struct buffer *buf;
1166 int bindflag;
1168 int voide = EQ (newval, Qunbound);
1170 register Lisp_Object valcontents, innercontents, tem1, current_alist_element;
1172 if (buf == 0)
1173 buf = current_buffer;
1175 /* If restoring in a dead buffer, do nothing. */
1176 if (NILP (buf->name))
1177 return newval;
1179 CHECK_SYMBOL (symbol);
1180 if (SYMBOL_CONSTANT_P (symbol)
1181 && (NILP (Fkeywordp (symbol))
1182 || !EQ (newval, SYMBOL_VALUE (symbol))))
1183 xsignal1 (Qsetting_constant, symbol);
1185 innercontents = valcontents = SYMBOL_VALUE (symbol);
1187 if (BUFFER_OBJFWDP (valcontents))
1189 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1190 int idx = PER_BUFFER_IDX (offset);
1191 if (idx > 0
1192 && !bindflag
1193 && !let_shadows_buffer_binding_p (symbol))
1194 SET_PER_BUFFER_VALUE_P (buf, idx, 1);
1196 else if (BUFFER_LOCAL_VALUEP (valcontents))
1198 /* valcontents is a struct Lisp_Buffer_Local_Value. */
1199 if (XSYMBOL (symbol)->indirect_variable)
1200 symbol = indirect_variable (symbol);
1202 /* What binding is loaded right now? */
1203 current_alist_element
1204 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1206 /* If the current buffer is not the buffer whose binding is
1207 loaded, or if there may be frame-local bindings and the frame
1208 isn't the right one, or if it's a Lisp_Buffer_Local_Value and
1209 the default binding is loaded, the loaded binding may be the
1210 wrong one. */
1211 if (!BUFFERP (XBUFFER_LOCAL_VALUE (valcontents)->buffer)
1212 || buf != XBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer)
1213 || (XBUFFER_LOCAL_VALUE (valcontents)->check_frame
1214 && !EQ (selected_frame, XBUFFER_LOCAL_VALUE (valcontents)->frame))
1215 /* Also unload a global binding (if the var is local_if_set). */
1216 || (EQ (XCAR (current_alist_element),
1217 current_alist_element)))
1219 /* The currently loaded binding is not necessarily valid.
1220 We need to unload it, and choose a new binding. */
1222 /* Write out `realvalue' to the old loaded binding. */
1223 Fsetcdr (current_alist_element,
1224 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue));
1226 /* Find the new binding. */
1227 tem1 = Fassq (symbol, buf->local_var_alist);
1228 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 1;
1229 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 0;
1231 if (NILP (tem1))
1233 /* This buffer still sees the default value. */
1235 /* If the variable is not local_if_set,
1236 or if this is `let' rather than `set',
1237 make CURRENT-ALIST-ELEMENT point to itself,
1238 indicating that we're seeing the default value.
1239 Likewise if the variable has been let-bound
1240 in the current buffer. */
1241 if (bindflag || !XBUFFER_LOCAL_VALUE (valcontents)->local_if_set
1242 || let_shadows_buffer_binding_p (symbol))
1244 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
1246 if (XBUFFER_LOCAL_VALUE (valcontents)->check_frame)
1247 tem1 = Fassq (symbol,
1248 XFRAME (selected_frame)->param_alist);
1250 if (! NILP (tem1))
1251 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 1;
1252 else
1253 tem1 = XBUFFER_LOCAL_VALUE (valcontents)->cdr;
1255 /* If it's a Lisp_Buffer_Local_Value, being set not bound,
1256 and we're not within a let that was made for this buffer,
1257 create a new buffer-local binding for the variable.
1258 That means, give this buffer a new assoc for a local value
1259 and load that binding. */
1260 else
1262 tem1 = Fcons (symbol, XCDR (current_alist_element));
1263 buf->local_var_alist
1264 = Fcons (tem1, buf->local_var_alist);
1268 /* Record which binding is now loaded. */
1269 XSETCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr, tem1);
1271 /* Set `buffer' and `frame' slots for the binding now loaded. */
1272 XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer, buf);
1273 XBUFFER_LOCAL_VALUE (valcontents)->frame = selected_frame;
1275 innercontents = XBUFFER_LOCAL_VALUE (valcontents)->realvalue;
1277 /* Store the new value in the cons-cell. */
1278 XSETCDR (XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr), newval);
1281 /* If storing void (making the symbol void), forward only through
1282 buffer-local indicator, not through Lisp_Objfwd, etc. */
1283 if (voide)
1284 store_symval_forwarding (symbol, Qnil, newval, buf);
1285 else
1286 store_symval_forwarding (symbol, innercontents, newval, buf);
1288 return newval;
1291 /* Access or set a buffer-local symbol's default value. */
1293 /* Return the default value of SYMBOL, but don't check for voidness.
1294 Return Qunbound if it is void. */
1296 Lisp_Object
1297 default_value (symbol)
1298 Lisp_Object symbol;
1300 register Lisp_Object valcontents;
1302 CHECK_SYMBOL (symbol);
1303 valcontents = SYMBOL_VALUE (symbol);
1305 /* For a built-in buffer-local variable, get the default value
1306 rather than letting do_symval_forwarding get the current value. */
1307 if (BUFFER_OBJFWDP (valcontents))
1309 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1310 if (PER_BUFFER_IDX (offset) != 0)
1311 return PER_BUFFER_DEFAULT (offset);
1314 /* Handle user-created local variables. */
1315 if (BUFFER_LOCAL_VALUEP (valcontents))
1317 /* If var is set up for a buffer that lacks a local value for it,
1318 the current value is nominally the default value.
1319 But the `realvalue' slot may be more up to date, since
1320 ordinary setq stores just that slot. So use that. */
1321 Lisp_Object current_alist_element, alist_element_car;
1322 current_alist_element
1323 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1324 alist_element_car = XCAR (current_alist_element);
1325 if (EQ (alist_element_car, current_alist_element))
1326 return do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue);
1327 else
1328 return XCDR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1330 /* For other variables, get the current value. */
1331 return do_symval_forwarding (valcontents);
1334 DEFUN ("default-boundp", Fdefault_boundp, Sdefault_boundp, 1, 1, 0,
1335 doc: /* Return t if SYMBOL has a non-void default value.
1336 This is the value that is seen in buffers that do not have their own values
1337 for this variable. */)
1338 (symbol)
1339 Lisp_Object symbol;
1341 register Lisp_Object value;
1343 value = default_value (symbol);
1344 return (EQ (value, Qunbound) ? Qnil : Qt);
1347 DEFUN ("default-value", Fdefault_value, Sdefault_value, 1, 1, 0,
1348 doc: /* Return SYMBOL's default value.
1349 This is the value that is seen in buffers that do not have their own values
1350 for this variable. The default value is meaningful for variables with
1351 local bindings in certain buffers. */)
1352 (symbol)
1353 Lisp_Object symbol;
1355 register Lisp_Object value;
1357 value = default_value (symbol);
1358 if (!EQ (value, Qunbound))
1359 return value;
1361 xsignal1 (Qvoid_variable, symbol);
1364 DEFUN ("set-default", Fset_default, Sset_default, 2, 2, 0,
1365 doc: /* Set SYMBOL's default value to VALUE. SYMBOL and VALUE are evaluated.
1366 The default value is seen in buffers that do not have their own values
1367 for this variable. */)
1368 (symbol, value)
1369 Lisp_Object symbol, value;
1371 register Lisp_Object valcontents, current_alist_element, alist_element_buffer;
1373 CHECK_SYMBOL (symbol);
1374 valcontents = SYMBOL_VALUE (symbol);
1376 /* Handle variables like case-fold-search that have special slots
1377 in the buffer. Make them work apparently like Lisp_Buffer_Local_Value
1378 variables. */
1379 if (BUFFER_OBJFWDP (valcontents))
1381 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1382 int idx = PER_BUFFER_IDX (offset);
1384 PER_BUFFER_DEFAULT (offset) = value;
1386 /* If this variable is not always local in all buffers,
1387 set it in the buffers that don't nominally have a local value. */
1388 if (idx > 0)
1390 struct buffer *b;
1392 for (b = all_buffers; b; b = b->next)
1393 if (!PER_BUFFER_VALUE_P (b, idx))
1394 PER_BUFFER_VALUE (b, offset) = value;
1396 return value;
1399 if (!BUFFER_LOCAL_VALUEP (valcontents))
1400 return Fset (symbol, value);
1402 /* Store new value into the DEFAULT-VALUE slot. */
1403 XSETCDR (XBUFFER_LOCAL_VALUE (valcontents)->cdr, value);
1405 /* If the default binding is now loaded, set the REALVALUE slot too. */
1406 current_alist_element
1407 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1408 alist_element_buffer = Fcar (current_alist_element);
1409 if (EQ (alist_element_buffer, current_alist_element))
1410 store_symval_forwarding (symbol,
1411 XBUFFER_LOCAL_VALUE (valcontents)->realvalue,
1412 value, NULL);
1414 return value;
1417 DEFUN ("setq-default", Fsetq_default, Ssetq_default, 0, UNEVALLED, 0,
1418 doc: /* Set the default value of variable VAR to VALUE.
1419 VAR, the variable name, is literal (not evaluated);
1420 VALUE is an expression: it is evaluated and its value returned.
1421 The default value of a variable is seen in buffers
1422 that do not have their own values for the variable.
1424 More generally, you can use multiple variables and values, as in
1425 (setq-default VAR VALUE VAR VALUE...)
1426 This sets each VAR's default value to the corresponding VALUE.
1427 The VALUE for the Nth VAR can refer to the new default values
1428 of previous VARs.
1429 usage: (setq-default [VAR VALUE]...) */)
1430 (args)
1431 Lisp_Object args;
1433 register Lisp_Object args_left;
1434 register Lisp_Object val, symbol;
1435 struct gcpro gcpro1;
1437 if (NILP (args))
1438 return Qnil;
1440 args_left = args;
1441 GCPRO1 (args);
1445 val = Feval (Fcar (Fcdr (args_left)));
1446 symbol = XCAR (args_left);
1447 Fset_default (symbol, val);
1448 args_left = Fcdr (XCDR (args_left));
1450 while (!NILP (args_left));
1452 UNGCPRO;
1453 return val;
1456 /* Lisp functions for creating and removing buffer-local variables. */
1458 DEFUN ("make-variable-buffer-local", Fmake_variable_buffer_local, Smake_variable_buffer_local,
1459 1, 1, "vMake Variable Buffer Local: ",
1460 doc: /* Make VARIABLE become buffer-local whenever it is set.
1461 At any time, the value for the current buffer is in effect,
1462 unless the variable has never been set in this buffer,
1463 in which case the default value is in effect.
1464 Note that binding the variable with `let', or setting it while
1465 a `let'-style binding made in this buffer is in effect,
1466 does not make the variable buffer-local. Return VARIABLE.
1468 In most cases it is better to use `make-local-variable',
1469 which makes a variable local in just one buffer.
1471 The function `default-value' gets the default value and `set-default' sets it. */)
1472 (variable)
1473 register Lisp_Object variable;
1475 register Lisp_Object tem, valcontents, newval;
1477 CHECK_SYMBOL (variable);
1478 variable = indirect_variable (variable);
1480 valcontents = SYMBOL_VALUE (variable);
1481 if (XSYMBOL (variable)->constant || KBOARD_OBJFWDP (valcontents))
1482 error ("Symbol %s may not be buffer-local", SDATA (SYMBOL_NAME (variable)));
1484 if (BUFFER_OBJFWDP (valcontents))
1485 return variable;
1486 else if (BUFFER_LOCAL_VALUEP (valcontents))
1487 newval = valcontents;
1488 else
1490 if (EQ (valcontents, Qunbound))
1491 SET_SYMBOL_VALUE (variable, Qnil);
1492 tem = Fcons (Qnil, Fsymbol_value (variable));
1493 XSETCAR (tem, tem);
1494 newval = allocate_misc ();
1495 XMISCTYPE (newval) = Lisp_Misc_Buffer_Local_Value;
1496 XBUFFER_LOCAL_VALUE (newval)->realvalue = SYMBOL_VALUE (variable);
1497 XBUFFER_LOCAL_VALUE (newval)->buffer = Fcurrent_buffer ();
1498 XBUFFER_LOCAL_VALUE (newval)->frame = Qnil;
1499 XBUFFER_LOCAL_VALUE (newval)->found_for_buffer = 0;
1500 XBUFFER_LOCAL_VALUE (newval)->found_for_frame = 0;
1501 XBUFFER_LOCAL_VALUE (newval)->check_frame = 0;
1502 XBUFFER_LOCAL_VALUE (newval)->cdr = tem;
1503 SET_SYMBOL_VALUE (variable, newval);
1505 XBUFFER_LOCAL_VALUE (newval)->local_if_set = 1;
1506 return variable;
1509 DEFUN ("make-local-variable", Fmake_local_variable, Smake_local_variable,
1510 1, 1, "vMake Local Variable: ",
1511 doc: /* Make VARIABLE have a separate value in the current buffer.
1512 Other buffers will continue to share a common default value.
1513 \(The buffer-local value of VARIABLE starts out as the same value
1514 VARIABLE previously had. If VARIABLE was void, it remains void.\)
1515 Return VARIABLE.
1517 If the variable is already arranged to become local when set,
1518 this function causes a local value to exist for this buffer,
1519 just as setting the variable would do.
1521 This function returns VARIABLE, and therefore
1522 (set (make-local-variable 'VARIABLE) VALUE-EXP)
1523 works.
1525 See also `make-variable-buffer-local'.
1527 Do not use `make-local-variable' to make a hook variable buffer-local.
1528 Instead, use `add-hook' and specify t for the LOCAL argument. */)
1529 (variable)
1530 register Lisp_Object variable;
1532 register Lisp_Object tem, valcontents;
1534 CHECK_SYMBOL (variable);
1535 variable = indirect_variable (variable);
1537 valcontents = SYMBOL_VALUE (variable);
1538 if (XSYMBOL (variable)->constant || KBOARD_OBJFWDP (valcontents))
1539 error ("Symbol %s may not be buffer-local", SDATA (SYMBOL_NAME (variable)));
1541 if ((BUFFER_LOCAL_VALUEP (valcontents)
1542 && XBUFFER_LOCAL_VALUE (valcontents)->local_if_set)
1543 || BUFFER_OBJFWDP (valcontents))
1545 tem = Fboundp (variable);
1547 /* Make sure the symbol has a local value in this particular buffer,
1548 by setting it to the same value it already has. */
1549 Fset (variable, (EQ (tem, Qt) ? Fsymbol_value (variable) : Qunbound));
1550 return variable;
1552 /* Make sure symbol is set up to hold per-buffer values. */
1553 if (!BUFFER_LOCAL_VALUEP (valcontents))
1555 Lisp_Object newval;
1556 tem = Fcons (Qnil, do_symval_forwarding (valcontents));
1557 XSETCAR (tem, tem);
1558 newval = allocate_misc ();
1559 XMISCTYPE (newval) = Lisp_Misc_Buffer_Local_Value;
1560 XBUFFER_LOCAL_VALUE (newval)->realvalue = SYMBOL_VALUE (variable);
1561 XBUFFER_LOCAL_VALUE (newval)->buffer = Qnil;
1562 XBUFFER_LOCAL_VALUE (newval)->frame = Qnil;
1563 XBUFFER_LOCAL_VALUE (newval)->local_if_set = 0;
1564 XBUFFER_LOCAL_VALUE (newval)->found_for_buffer = 0;
1565 XBUFFER_LOCAL_VALUE (newval)->found_for_frame = 0;
1566 XBUFFER_LOCAL_VALUE (newval)->check_frame = 0;
1567 XBUFFER_LOCAL_VALUE (newval)->cdr = tem;
1568 SET_SYMBOL_VALUE (variable, newval);
1570 /* Make sure this buffer has its own value of symbol. */
1571 tem = Fassq (variable, current_buffer->local_var_alist);
1572 if (NILP (tem))
1574 /* Swap out any local binding for some other buffer, and make
1575 sure the current value is permanently recorded, if it's the
1576 default value. */
1577 find_symbol_value (variable);
1579 current_buffer->local_var_alist
1580 = Fcons (Fcons (variable, XCDR (XBUFFER_LOCAL_VALUE (SYMBOL_VALUE (variable))->cdr)),
1581 current_buffer->local_var_alist);
1583 /* Make sure symbol does not think it is set up for this buffer;
1584 force it to look once again for this buffer's value. */
1586 Lisp_Object *pvalbuf;
1588 valcontents = SYMBOL_VALUE (variable);
1590 pvalbuf = &XBUFFER_LOCAL_VALUE (valcontents)->buffer;
1591 if (current_buffer == XBUFFER (*pvalbuf))
1592 *pvalbuf = Qnil;
1593 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
1597 /* If the symbol forwards into a C variable, then load the binding
1598 for this buffer now. If C code modifies the variable before we
1599 load the binding in, then that new value will clobber the default
1600 binding the next time we unload it. */
1601 valcontents = XBUFFER_LOCAL_VALUE (SYMBOL_VALUE (variable))->realvalue;
1602 if (INTFWDP (valcontents) || BOOLFWDP (valcontents) || OBJFWDP (valcontents))
1603 swap_in_symval_forwarding (variable, SYMBOL_VALUE (variable));
1605 return variable;
1608 DEFUN ("kill-local-variable", Fkill_local_variable, Skill_local_variable,
1609 1, 1, "vKill Local Variable: ",
1610 doc: /* Make VARIABLE no longer have a separate value in the current buffer.
1611 From now on the default value will apply in this buffer. Return VARIABLE. */)
1612 (variable)
1613 register Lisp_Object variable;
1615 register Lisp_Object tem, valcontents;
1617 CHECK_SYMBOL (variable);
1618 variable = indirect_variable (variable);
1620 valcontents = SYMBOL_VALUE (variable);
1622 if (BUFFER_OBJFWDP (valcontents))
1624 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1625 int idx = PER_BUFFER_IDX (offset);
1627 if (idx > 0)
1629 SET_PER_BUFFER_VALUE_P (current_buffer, idx, 0);
1630 PER_BUFFER_VALUE (current_buffer, offset)
1631 = PER_BUFFER_DEFAULT (offset);
1633 return variable;
1636 if (!BUFFER_LOCAL_VALUEP (valcontents))
1637 return variable;
1639 /* Get rid of this buffer's alist element, if any. */
1641 tem = Fassq (variable, current_buffer->local_var_alist);
1642 if (!NILP (tem))
1643 current_buffer->local_var_alist
1644 = Fdelq (tem, current_buffer->local_var_alist);
1646 /* If the symbol is set up with the current buffer's binding
1647 loaded, recompute its value. We have to do it now, or else
1648 forwarded objects won't work right. */
1650 Lisp_Object *pvalbuf, buf;
1651 valcontents = SYMBOL_VALUE (variable);
1652 pvalbuf = &XBUFFER_LOCAL_VALUE (valcontents)->buffer;
1653 XSETBUFFER (buf, current_buffer);
1654 if (EQ (buf, *pvalbuf))
1656 *pvalbuf = Qnil;
1657 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
1658 find_symbol_value (variable);
1662 return variable;
1665 /* Lisp functions for creating and removing buffer-local variables. */
1667 DEFUN ("make-variable-frame-local", Fmake_variable_frame_local, Smake_variable_frame_local,
1668 1, 1, "vMake Variable Frame Local: ",
1669 doc: /* Enable VARIABLE to have frame-local bindings.
1670 This does not create any frame-local bindings for VARIABLE,
1671 it just makes them possible.
1673 A frame-local binding is actually a frame parameter value.
1674 If a frame F has a value for the frame parameter named VARIABLE,
1675 that also acts as a frame-local binding for VARIABLE in F--
1676 provided this function has been called to enable VARIABLE
1677 to have frame-local bindings at all.
1679 The only way to create a frame-local binding for VARIABLE in a frame
1680 is to set the VARIABLE frame parameter of that frame. See
1681 `modify-frame-parameters' for how to set frame parameters.
1683 Buffer-local bindings take precedence over frame-local bindings. */)
1684 (variable)
1685 register Lisp_Object variable;
1687 register Lisp_Object tem, valcontents, newval;
1689 CHECK_SYMBOL (variable);
1690 variable = indirect_variable (variable);
1692 valcontents = SYMBOL_VALUE (variable);
1693 if (XSYMBOL (variable)->constant || KBOARD_OBJFWDP (valcontents)
1694 || BUFFER_OBJFWDP (valcontents))
1695 error ("Symbol %s may not be frame-local", SDATA (SYMBOL_NAME (variable)));
1697 if (BUFFER_LOCAL_VALUEP (valcontents))
1699 XBUFFER_LOCAL_VALUE (valcontents)->check_frame = 1;
1700 return variable;
1703 if (EQ (valcontents, Qunbound))
1704 SET_SYMBOL_VALUE (variable, Qnil);
1705 tem = Fcons (Qnil, Fsymbol_value (variable));
1706 XSETCAR (tem, tem);
1707 newval = allocate_misc ();
1708 XMISCTYPE (newval) = Lisp_Misc_Buffer_Local_Value;
1709 XBUFFER_LOCAL_VALUE (newval)->realvalue = SYMBOL_VALUE (variable);
1710 XBUFFER_LOCAL_VALUE (newval)->buffer = Qnil;
1711 XBUFFER_LOCAL_VALUE (newval)->frame = Qnil;
1712 XBUFFER_LOCAL_VALUE (newval)->local_if_set = 0;
1713 XBUFFER_LOCAL_VALUE (newval)->found_for_buffer = 0;
1714 XBUFFER_LOCAL_VALUE (newval)->found_for_frame = 0;
1715 XBUFFER_LOCAL_VALUE (newval)->check_frame = 1;
1716 XBUFFER_LOCAL_VALUE (newval)->cdr = tem;
1717 SET_SYMBOL_VALUE (variable, newval);
1718 return variable;
1721 DEFUN ("local-variable-p", Flocal_variable_p, Slocal_variable_p,
1722 1, 2, 0,
1723 doc: /* Non-nil if VARIABLE has a local binding in buffer BUFFER.
1724 BUFFER defaults to the current buffer. */)
1725 (variable, buffer)
1726 register Lisp_Object variable, buffer;
1728 Lisp_Object valcontents;
1729 register struct buffer *buf;
1731 if (NILP (buffer))
1732 buf = current_buffer;
1733 else
1735 CHECK_BUFFER (buffer);
1736 buf = XBUFFER (buffer);
1739 CHECK_SYMBOL (variable);
1740 variable = indirect_variable (variable);
1742 valcontents = SYMBOL_VALUE (variable);
1743 if (BUFFER_LOCAL_VALUEP (valcontents))
1745 Lisp_Object tail, elt;
1747 for (tail = buf->local_var_alist; CONSP (tail); tail = XCDR (tail))
1749 elt = XCAR (tail);
1750 if (EQ (variable, XCAR (elt)))
1751 return Qt;
1754 if (BUFFER_OBJFWDP (valcontents))
1756 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1757 int idx = PER_BUFFER_IDX (offset);
1758 if (idx == -1 || PER_BUFFER_VALUE_P (buf, idx))
1759 return Qt;
1761 return Qnil;
1764 DEFUN ("local-variable-if-set-p", Flocal_variable_if_set_p, Slocal_variable_if_set_p,
1765 1, 2, 0,
1766 doc: /* Non-nil if VARIABLE will be local in buffer BUFFER when set there.
1767 More precisely, this means that setting the variable \(with `set' or`setq'),
1768 while it does not have a `let'-style binding that was made in BUFFER,
1769 will produce a buffer local binding. See Info node
1770 `(elisp)Creating Buffer-Local'.
1771 BUFFER defaults to the current buffer. */)
1772 (variable, buffer)
1773 register Lisp_Object variable, buffer;
1775 Lisp_Object valcontents;
1776 register struct buffer *buf;
1778 if (NILP (buffer))
1779 buf = current_buffer;
1780 else
1782 CHECK_BUFFER (buffer);
1783 buf = XBUFFER (buffer);
1786 CHECK_SYMBOL (variable);
1787 variable = indirect_variable (variable);
1789 valcontents = SYMBOL_VALUE (variable);
1791 if (BUFFER_OBJFWDP (valcontents))
1792 /* All these slots become local if they are set. */
1793 return Qt;
1794 else if (BUFFER_LOCAL_VALUEP (valcontents))
1796 Lisp_Object tail, elt;
1797 if (XBUFFER_LOCAL_VALUE (valcontents)->local_if_set)
1798 return Qt;
1799 for (tail = buf->local_var_alist; CONSP (tail); tail = XCDR (tail))
1801 elt = XCAR (tail);
1802 if (EQ (variable, XCAR (elt)))
1803 return Qt;
1806 return Qnil;
1809 DEFUN ("variable-binding-locus", Fvariable_binding_locus, Svariable_binding_locus,
1810 1, 1, 0,
1811 doc: /* Return a value indicating where VARIABLE's current binding comes from.
1812 If the current binding is buffer-local, the value is the current buffer.
1813 If the current binding is frame-local, the value is the selected frame.
1814 If the current binding is global (the default), the value is nil. */)
1815 (variable)
1816 register Lisp_Object variable;
1818 Lisp_Object valcontents;
1820 CHECK_SYMBOL (variable);
1821 variable = indirect_variable (variable);
1823 /* Make sure the current binding is actually swapped in. */
1824 find_symbol_value (variable);
1826 valcontents = XSYMBOL (variable)->value;
1828 if (BUFFER_LOCAL_VALUEP (valcontents)
1829 || BUFFER_OBJFWDP (valcontents))
1831 /* For a local variable, record both the symbol and which
1832 buffer's or frame's value we are saving. */
1833 if (!NILP (Flocal_variable_p (variable, Qnil)))
1834 return Fcurrent_buffer ();
1835 else if (BUFFER_LOCAL_VALUEP (valcontents)
1836 && XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame)
1837 return XBUFFER_LOCAL_VALUE (valcontents)->frame;
1840 return Qnil;
1843 /* This code is disabled now that we use the selected frame to return
1844 keyboard-local-values. */
1845 #if 0
1846 extern struct terminal *get_terminal P_ ((Lisp_Object display, int));
1848 DEFUN ("terminal-local-value", Fterminal_local_value, Sterminal_local_value, 2, 2, 0,
1849 doc: /* Return the terminal-local value of SYMBOL on TERMINAL.
1850 If SYMBOL is not a terminal-local variable, then return its normal
1851 value, like `symbol-value'.
1853 TERMINAL may be a terminal id, a frame, or nil (meaning the
1854 selected frame's terminal device). */)
1855 (symbol, terminal)
1856 Lisp_Object symbol;
1857 Lisp_Object terminal;
1859 Lisp_Object result;
1860 struct terminal *t = get_terminal (terminal, 1);
1861 push_kboard (t->kboard);
1862 result = Fsymbol_value (symbol);
1863 pop_kboard ();
1864 return result;
1867 DEFUN ("set-terminal-local-value", Fset_terminal_local_value, Sset_terminal_local_value, 3, 3, 0,
1868 doc: /* Set the terminal-local binding of SYMBOL on TERMINAL to VALUE.
1869 If VARIABLE is not a terminal-local variable, then set its normal
1870 binding, like `set'.
1872 TERMINAL may be a terminal id, a frame, or nil (meaning the
1873 selected frame's terminal device). */)
1874 (symbol, terminal, value)
1875 Lisp_Object symbol;
1876 Lisp_Object terminal;
1877 Lisp_Object value;
1879 Lisp_Object result;
1880 struct terminal *t = get_terminal (terminal, 1);
1881 push_kboard (d->kboard);
1882 result = Fset (symbol, value);
1883 pop_kboard ();
1884 return result;
1886 #endif
1888 /* Find the function at the end of a chain of symbol function indirections. */
1890 /* If OBJECT is a symbol, find the end of its function chain and
1891 return the value found there. If OBJECT is not a symbol, just
1892 return it. If there is a cycle in the function chain, signal a
1893 cyclic-function-indirection error.
1895 This is like Findirect_function, except that it doesn't signal an
1896 error if the chain ends up unbound. */
1897 Lisp_Object
1898 indirect_function (object)
1899 register Lisp_Object object;
1901 Lisp_Object tortoise, hare;
1903 hare = tortoise = object;
1905 for (;;)
1907 if (!SYMBOLP (hare) || EQ (hare, Qunbound))
1908 break;
1909 hare = XSYMBOL (hare)->function;
1910 if (!SYMBOLP (hare) || EQ (hare, Qunbound))
1911 break;
1912 hare = XSYMBOL (hare)->function;
1914 tortoise = XSYMBOL (tortoise)->function;
1916 if (EQ (hare, tortoise))
1917 xsignal1 (Qcyclic_function_indirection, object);
1920 return hare;
1923 DEFUN ("indirect-function", Findirect_function, Sindirect_function, 1, 2, 0,
1924 doc: /* Return the function at the end of OBJECT's function chain.
1925 If OBJECT is not a symbol, just return it. Otherwise, follow all
1926 function indirections to find the final function binding and return it.
1927 If the final symbol in the chain is unbound, signal a void-function error.
1928 Optional arg NOERROR non-nil means to return nil instead of signalling.
1929 Signal a cyclic-function-indirection error if there is a loop in the
1930 function chain of symbols. */)
1931 (object, noerror)
1932 register Lisp_Object object;
1933 Lisp_Object noerror;
1935 Lisp_Object result;
1937 /* Optimize for no indirection. */
1938 result = object;
1939 if (SYMBOLP (result) && !EQ (result, Qunbound)
1940 && (result = XSYMBOL (result)->function, SYMBOLP (result)))
1941 result = indirect_function (result);
1942 if (!EQ (result, Qunbound))
1943 return result;
1945 if (NILP (noerror))
1946 xsignal1 (Qvoid_function, object);
1948 return Qnil;
1951 /* Extract and set vector and string elements */
1953 DEFUN ("aref", Faref, Saref, 2, 2, 0,
1954 doc: /* Return the element of ARRAY at index IDX.
1955 ARRAY may be a vector, a string, a char-table, a bool-vector,
1956 or a byte-code object. IDX starts at 0. */)
1957 (array, idx)
1958 register Lisp_Object array;
1959 Lisp_Object idx;
1961 register int idxval;
1963 CHECK_NUMBER (idx);
1964 idxval = XINT (idx);
1965 if (STRINGP (array))
1967 int c, idxval_byte;
1969 if (idxval < 0 || idxval >= SCHARS (array))
1970 args_out_of_range (array, idx);
1971 if (! STRING_MULTIBYTE (array))
1972 return make_number ((unsigned char) SREF (array, idxval));
1973 idxval_byte = string_char_to_byte (array, idxval);
1975 c = STRING_CHAR (SDATA (array) + idxval_byte,
1976 SBYTES (array) - idxval_byte);
1977 return make_number (c);
1979 else if (BOOL_VECTOR_P (array))
1981 int val;
1983 if (idxval < 0 || idxval >= XBOOL_VECTOR (array)->size)
1984 args_out_of_range (array, idx);
1986 val = (unsigned char) XBOOL_VECTOR (array)->data[idxval / BOOL_VECTOR_BITS_PER_CHAR];
1987 return (val & (1 << (idxval % BOOL_VECTOR_BITS_PER_CHAR)) ? Qt : Qnil);
1989 else if (CHAR_TABLE_P (array))
1991 CHECK_CHARACTER (idx);
1992 return CHAR_TABLE_REF (array, idxval);
1994 else
1996 int size = 0;
1997 if (VECTORP (array))
1998 size = XVECTOR (array)->size;
1999 else if (COMPILEDP (array))
2000 size = XVECTOR (array)->size & PSEUDOVECTOR_SIZE_MASK;
2001 else
2002 wrong_type_argument (Qarrayp, array);
2004 if (idxval < 0 || idxval >= size)
2005 args_out_of_range (array, idx);
2006 return XVECTOR (array)->contents[idxval];
2010 DEFUN ("aset", Faset, Saset, 3, 3, 0,
2011 doc: /* Store into the element of ARRAY at index IDX the value NEWELT.
2012 Return NEWELT. ARRAY may be a vector, a string, a char-table or a
2013 bool-vector. IDX starts at 0. */)
2014 (array, idx, newelt)
2015 register Lisp_Object array;
2016 Lisp_Object idx, newelt;
2018 register int idxval;
2020 CHECK_NUMBER (idx);
2021 idxval = XINT (idx);
2022 CHECK_ARRAY (array, Qarrayp);
2023 CHECK_IMPURE (array);
2025 if (VECTORP (array))
2027 if (idxval < 0 || idxval >= XVECTOR (array)->size)
2028 args_out_of_range (array, idx);
2029 XVECTOR (array)->contents[idxval] = newelt;
2031 else if (BOOL_VECTOR_P (array))
2033 int val;
2035 if (idxval < 0 || idxval >= XBOOL_VECTOR (array)->size)
2036 args_out_of_range (array, idx);
2038 val = (unsigned char) XBOOL_VECTOR (array)->data[idxval / BOOL_VECTOR_BITS_PER_CHAR];
2040 if (! NILP (newelt))
2041 val |= 1 << (idxval % BOOL_VECTOR_BITS_PER_CHAR);
2042 else
2043 val &= ~(1 << (idxval % BOOL_VECTOR_BITS_PER_CHAR));
2044 XBOOL_VECTOR (array)->data[idxval / BOOL_VECTOR_BITS_PER_CHAR] = val;
2046 else if (CHAR_TABLE_P (array))
2048 CHECK_CHARACTER (idx);
2049 CHAR_TABLE_SET (array, idxval, newelt);
2051 else if (STRING_MULTIBYTE (array))
2053 int idxval_byte, prev_bytes, new_bytes, nbytes;
2054 unsigned char workbuf[MAX_MULTIBYTE_LENGTH], *p0 = workbuf, *p1;
2056 if (idxval < 0 || idxval >= SCHARS (array))
2057 args_out_of_range (array, idx);
2058 CHECK_CHARACTER (newelt);
2060 nbytes = SBYTES (array);
2062 idxval_byte = string_char_to_byte (array, idxval);
2063 p1 = SDATA (array) + idxval_byte;
2064 PARSE_MULTIBYTE_SEQ (p1, nbytes - idxval_byte, prev_bytes);
2065 new_bytes = CHAR_STRING (XINT (newelt), p0);
2066 if (prev_bytes != new_bytes)
2068 /* We must relocate the string data. */
2069 int nchars = SCHARS (array);
2070 unsigned char *str;
2071 USE_SAFE_ALLOCA;
2073 SAFE_ALLOCA (str, unsigned char *, nbytes);
2074 bcopy (SDATA (array), str, nbytes);
2075 allocate_string_data (XSTRING (array), nchars,
2076 nbytes + new_bytes - prev_bytes);
2077 bcopy (str, SDATA (array), idxval_byte);
2078 p1 = SDATA (array) + idxval_byte;
2079 bcopy (str + idxval_byte + prev_bytes, p1 + new_bytes,
2080 nbytes - (idxval_byte + prev_bytes));
2081 SAFE_FREE ();
2082 clear_string_char_byte_cache ();
2084 while (new_bytes--)
2085 *p1++ = *p0++;
2087 else
2089 if (idxval < 0 || idxval >= SCHARS (array))
2090 args_out_of_range (array, idx);
2091 CHECK_NUMBER (newelt);
2093 if (XINT (newelt) >= 0 && ! SINGLE_BYTE_CHAR_P (XINT (newelt)))
2095 int i;
2097 for (i = SBYTES (array) - 1; i >= 0; i--)
2098 if (SREF (array, i) >= 0x80)
2099 args_out_of_range (array, newelt);
2100 /* ARRAY is an ASCII string. Convert it to a multibyte
2101 string, and try `aset' again. */
2102 STRING_SET_MULTIBYTE (array);
2103 return Faset (array, idx, newelt);
2105 SSET (array, idxval, XINT (newelt));
2108 return newelt;
2111 /* Arithmetic functions */
2113 enum comparison { equal, notequal, less, grtr, less_or_equal, grtr_or_equal };
2115 Lisp_Object
2116 arithcompare (num1, num2, comparison)
2117 Lisp_Object num1, num2;
2118 enum comparison comparison;
2120 double f1 = 0, f2 = 0;
2121 int floatp = 0;
2123 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num1);
2124 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num2);
2126 if (FLOATP (num1) || FLOATP (num2))
2128 floatp = 1;
2129 f1 = (FLOATP (num1)) ? XFLOAT_DATA (num1) : XINT (num1);
2130 f2 = (FLOATP (num2)) ? XFLOAT_DATA (num2) : XINT (num2);
2133 switch (comparison)
2135 case equal:
2136 if (floatp ? f1 == f2 : XINT (num1) == XINT (num2))
2137 return Qt;
2138 return Qnil;
2140 case notequal:
2141 if (floatp ? f1 != f2 : XINT (num1) != XINT (num2))
2142 return Qt;
2143 return Qnil;
2145 case less:
2146 if (floatp ? f1 < f2 : XINT (num1) < XINT (num2))
2147 return Qt;
2148 return Qnil;
2150 case less_or_equal:
2151 if (floatp ? f1 <= f2 : XINT (num1) <= XINT (num2))
2152 return Qt;
2153 return Qnil;
2155 case grtr:
2156 if (floatp ? f1 > f2 : XINT (num1) > XINT (num2))
2157 return Qt;
2158 return Qnil;
2160 case grtr_or_equal:
2161 if (floatp ? f1 >= f2 : XINT (num1) >= XINT (num2))
2162 return Qt;
2163 return Qnil;
2165 default:
2166 abort ();
2170 DEFUN ("=", Feqlsign, Seqlsign, 2, 2, 0,
2171 doc: /* Return t if two args, both numbers or markers, are equal. */)
2172 (num1, num2)
2173 register Lisp_Object num1, num2;
2175 return arithcompare (num1, num2, equal);
2178 DEFUN ("<", Flss, Slss, 2, 2, 0,
2179 doc: /* Return t if first arg is less than second arg. Both must be numbers or markers. */)
2180 (num1, num2)
2181 register Lisp_Object num1, num2;
2183 return arithcompare (num1, num2, less);
2186 DEFUN (">", Fgtr, Sgtr, 2, 2, 0,
2187 doc: /* Return t if first arg is greater than second arg. Both must be numbers or markers. */)
2188 (num1, num2)
2189 register Lisp_Object num1, num2;
2191 return arithcompare (num1, num2, grtr);
2194 DEFUN ("<=", Fleq, Sleq, 2, 2, 0,
2195 doc: /* Return t if first arg is less than or equal to second arg.
2196 Both must be numbers or markers. */)
2197 (num1, num2)
2198 register Lisp_Object num1, num2;
2200 return arithcompare (num1, num2, less_or_equal);
2203 DEFUN (">=", Fgeq, Sgeq, 2, 2, 0,
2204 doc: /* Return t if first arg is greater than or equal to second arg.
2205 Both must be numbers or markers. */)
2206 (num1, num2)
2207 register Lisp_Object num1, num2;
2209 return arithcompare (num1, num2, grtr_or_equal);
2212 DEFUN ("/=", Fneq, Sneq, 2, 2, 0,
2213 doc: /* Return t if first arg is not equal to second arg. Both must be numbers or markers. */)
2214 (num1, num2)
2215 register Lisp_Object num1, num2;
2217 return arithcompare (num1, num2, notequal);
2220 DEFUN ("zerop", Fzerop, Szerop, 1, 1, 0,
2221 doc: /* Return t if NUMBER is zero. */)
2222 (number)
2223 register Lisp_Object number;
2225 CHECK_NUMBER_OR_FLOAT (number);
2227 if (FLOATP (number))
2229 if (XFLOAT_DATA (number) == 0.0)
2230 return Qt;
2231 return Qnil;
2234 if (!XINT (number))
2235 return Qt;
2236 return Qnil;
2239 /* Convert between long values and pairs of Lisp integers.
2240 Note that long_to_cons returns a single Lisp integer
2241 when the value fits in one. */
2243 Lisp_Object
2244 long_to_cons (i)
2245 unsigned long i;
2247 unsigned long top = i >> 16;
2248 unsigned int bot = i & 0xFFFF;
2249 if (top == 0)
2250 return make_number (bot);
2251 if (top == (unsigned long)-1 >> 16)
2252 return Fcons (make_number (-1), make_number (bot));
2253 return Fcons (make_number (top), make_number (bot));
2256 unsigned long
2257 cons_to_long (c)
2258 Lisp_Object c;
2260 Lisp_Object top, bot;
2261 if (INTEGERP (c))
2262 return XINT (c);
2263 top = XCAR (c);
2264 bot = XCDR (c);
2265 if (CONSP (bot))
2266 bot = XCAR (bot);
2267 return ((XINT (top) << 16) | XINT (bot));
2270 DEFUN ("number-to-string", Fnumber_to_string, Snumber_to_string, 1, 1, 0,
2271 doc: /* Return the decimal representation of NUMBER as a string.
2272 Uses a minus sign if negative.
2273 NUMBER may be an integer or a floating point number. */)
2274 (number)
2275 Lisp_Object number;
2277 char buffer[VALBITS];
2279 CHECK_NUMBER_OR_FLOAT (number);
2281 if (FLOATP (number))
2283 char pigbuf[350]; /* see comments in float_to_string */
2285 float_to_string (pigbuf, XFLOAT_DATA (number));
2286 return build_string (pigbuf);
2289 if (sizeof (int) == sizeof (EMACS_INT))
2290 sprintf (buffer, "%d", (int) XINT (number));
2291 else if (sizeof (long) == sizeof (EMACS_INT))
2292 sprintf (buffer, "%ld", (long) XINT (number));
2293 else
2294 abort ();
2295 return build_string (buffer);
2298 INLINE static int
2299 digit_to_number (character, base)
2300 int character, base;
2302 int digit;
2304 if (character >= '0' && character <= '9')
2305 digit = character - '0';
2306 else if (character >= 'a' && character <= 'z')
2307 digit = character - 'a' + 10;
2308 else if (character >= 'A' && character <= 'Z')
2309 digit = character - 'A' + 10;
2310 else
2311 return -1;
2313 if (digit >= base)
2314 return -1;
2315 else
2316 return digit;
2319 DEFUN ("string-to-number", Fstring_to_number, Sstring_to_number, 1, 2, 0,
2320 doc: /* Parse STRING as a decimal number and return the number.
2321 This parses both integers and floating point numbers.
2322 It ignores leading spaces and tabs.
2324 If BASE, interpret STRING as a number in that base. If BASE isn't
2325 present, base 10 is used. BASE must be between 2 and 16 (inclusive).
2326 If the base used is not 10, floating point is not recognized. */)
2327 (string, base)
2328 register Lisp_Object string, base;
2330 register unsigned char *p;
2331 register int b;
2332 int sign = 1;
2333 Lisp_Object val;
2335 CHECK_STRING (string);
2337 if (NILP (base))
2338 b = 10;
2339 else
2341 CHECK_NUMBER (base);
2342 b = XINT (base);
2343 if (b < 2 || b > 16)
2344 xsignal1 (Qargs_out_of_range, base);
2347 /* Skip any whitespace at the front of the number. Some versions of
2348 atoi do this anyway, so we might as well make Emacs lisp consistent. */
2349 p = SDATA (string);
2350 while (*p == ' ' || *p == '\t')
2351 p++;
2353 if (*p == '-')
2355 sign = -1;
2356 p++;
2358 else if (*p == '+')
2359 p++;
2361 if (isfloat_string (p) && b == 10)
2362 val = make_float (sign * atof (p));
2363 else
2365 double v = 0;
2367 while (1)
2369 int digit = digit_to_number (*p++, b);
2370 if (digit < 0)
2371 break;
2372 v = v * b + digit;
2375 val = make_fixnum_or_float (sign * v);
2378 return val;
2382 enum arithop
2384 Aadd,
2385 Asub,
2386 Amult,
2387 Adiv,
2388 Alogand,
2389 Alogior,
2390 Alogxor,
2391 Amax,
2392 Amin
2395 static Lisp_Object float_arith_driver P_ ((double, int, enum arithop,
2396 int, Lisp_Object *));
2397 extern Lisp_Object fmod_float ();
2399 Lisp_Object
2400 arith_driver (code, nargs, args)
2401 enum arithop code;
2402 int nargs;
2403 register Lisp_Object *args;
2405 register Lisp_Object val;
2406 register int argnum;
2407 register EMACS_INT accum = 0;
2408 register EMACS_INT next;
2410 switch (SWITCH_ENUM_CAST (code))
2412 case Alogior:
2413 case Alogxor:
2414 case Aadd:
2415 case Asub:
2416 accum = 0;
2417 break;
2418 case Amult:
2419 accum = 1;
2420 break;
2421 case Alogand:
2422 accum = -1;
2423 break;
2424 default:
2425 break;
2428 for (argnum = 0; argnum < nargs; argnum++)
2430 /* Using args[argnum] as argument to CHECK_NUMBER_... */
2431 val = args[argnum];
2432 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val);
2434 if (FLOATP (val))
2435 return float_arith_driver ((double) accum, argnum, code,
2436 nargs, args);
2437 args[argnum] = val;
2438 next = XINT (args[argnum]);
2439 switch (SWITCH_ENUM_CAST (code))
2441 case Aadd:
2442 accum += next;
2443 break;
2444 case Asub:
2445 accum = argnum ? accum - next : nargs == 1 ? - next : next;
2446 break;
2447 case Amult:
2448 accum *= next;
2449 break;
2450 case Adiv:
2451 if (!argnum)
2452 accum = next;
2453 else
2455 if (next == 0)
2456 xsignal0 (Qarith_error);
2457 accum /= next;
2459 break;
2460 case Alogand:
2461 accum &= next;
2462 break;
2463 case Alogior:
2464 accum |= next;
2465 break;
2466 case Alogxor:
2467 accum ^= next;
2468 break;
2469 case Amax:
2470 if (!argnum || next > accum)
2471 accum = next;
2472 break;
2473 case Amin:
2474 if (!argnum || next < accum)
2475 accum = next;
2476 break;
2480 XSETINT (val, accum);
2481 return val;
2484 #undef isnan
2485 #define isnan(x) ((x) != (x))
2487 static Lisp_Object
2488 float_arith_driver (accum, argnum, code, nargs, args)
2489 double accum;
2490 register int argnum;
2491 enum arithop code;
2492 int nargs;
2493 register Lisp_Object *args;
2495 register Lisp_Object val;
2496 double next;
2498 for (; argnum < nargs; argnum++)
2500 val = args[argnum]; /* using args[argnum] as argument to CHECK_NUMBER_... */
2501 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val);
2503 if (FLOATP (val))
2505 next = XFLOAT_DATA (val);
2507 else
2509 args[argnum] = val; /* runs into a compiler bug. */
2510 next = XINT (args[argnum]);
2512 switch (SWITCH_ENUM_CAST (code))
2514 case Aadd:
2515 accum += next;
2516 break;
2517 case Asub:
2518 accum = argnum ? accum - next : nargs == 1 ? - next : next;
2519 break;
2520 case Amult:
2521 accum *= next;
2522 break;
2523 case Adiv:
2524 if (!argnum)
2525 accum = next;
2526 else
2528 if (! IEEE_FLOATING_POINT && next == 0)
2529 xsignal0 (Qarith_error);
2530 accum /= next;
2532 break;
2533 case Alogand:
2534 case Alogior:
2535 case Alogxor:
2536 return wrong_type_argument (Qinteger_or_marker_p, val);
2537 case Amax:
2538 if (!argnum || isnan (next) || next > accum)
2539 accum = next;
2540 break;
2541 case Amin:
2542 if (!argnum || isnan (next) || next < accum)
2543 accum = next;
2544 break;
2548 return make_float (accum);
2552 DEFUN ("+", Fplus, Splus, 0, MANY, 0,
2553 doc: /* Return sum of any number of arguments, which are numbers or markers.
2554 usage: (+ &rest NUMBERS-OR-MARKERS) */)
2555 (nargs, args)
2556 int nargs;
2557 Lisp_Object *args;
2559 return arith_driver (Aadd, nargs, args);
2562 DEFUN ("-", Fminus, Sminus, 0, MANY, 0,
2563 doc: /* Negate number or subtract numbers or markers and return the result.
2564 With one arg, negates it. With more than one arg,
2565 subtracts all but the first from the first.
2566 usage: (- &optional NUMBER-OR-MARKER &rest MORE-NUMBERS-OR-MARKERS) */)
2567 (nargs, args)
2568 int nargs;
2569 Lisp_Object *args;
2571 return arith_driver (Asub, nargs, args);
2574 DEFUN ("*", Ftimes, Stimes, 0, MANY, 0,
2575 doc: /* Return product of any number of arguments, which are numbers or markers.
2576 usage: (* &rest NUMBERS-OR-MARKERS) */)
2577 (nargs, args)
2578 int nargs;
2579 Lisp_Object *args;
2581 return arith_driver (Amult, nargs, args);
2584 DEFUN ("/", Fquo, Squo, 2, MANY, 0,
2585 doc: /* Return first argument divided by all the remaining arguments.
2586 The arguments must be numbers or markers.
2587 usage: (/ DIVIDEND DIVISOR &rest DIVISORS) */)
2588 (nargs, args)
2589 int nargs;
2590 Lisp_Object *args;
2592 int argnum;
2593 for (argnum = 2; argnum < nargs; argnum++)
2594 if (FLOATP (args[argnum]))
2595 return float_arith_driver (0, 0, Adiv, nargs, args);
2596 return arith_driver (Adiv, nargs, args);
2599 DEFUN ("%", Frem, Srem, 2, 2, 0,
2600 doc: /* Return remainder of X divided by Y.
2601 Both must be integers or markers. */)
2602 (x, y)
2603 register Lisp_Object x, y;
2605 Lisp_Object val;
2607 CHECK_NUMBER_COERCE_MARKER (x);
2608 CHECK_NUMBER_COERCE_MARKER (y);
2610 if (XFASTINT (y) == 0)
2611 xsignal0 (Qarith_error);
2613 XSETINT (val, XINT (x) % XINT (y));
2614 return val;
2617 #ifndef HAVE_FMOD
2618 double
2619 fmod (f1, f2)
2620 double f1, f2;
2622 double r = f1;
2624 if (f2 < 0.0)
2625 f2 = -f2;
2627 /* If the magnitude of the result exceeds that of the divisor, or
2628 the sign of the result does not agree with that of the dividend,
2629 iterate with the reduced value. This does not yield a
2630 particularly accurate result, but at least it will be in the
2631 range promised by fmod. */
2633 r -= f2 * floor (r / f2);
2634 while (f2 <= (r < 0 ? -r : r) || ((r < 0) != (f1 < 0) && ! isnan (r)));
2636 return r;
2638 #endif /* ! HAVE_FMOD */
2640 DEFUN ("mod", Fmod, Smod, 2, 2, 0,
2641 doc: /* Return X modulo Y.
2642 The result falls between zero (inclusive) and Y (exclusive).
2643 Both X and Y must be numbers or markers. */)
2644 (x, y)
2645 register Lisp_Object x, y;
2647 Lisp_Object val;
2648 EMACS_INT i1, i2;
2650 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (x);
2651 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (y);
2653 if (FLOATP (x) || FLOATP (y))
2654 return fmod_float (x, y);
2656 i1 = XINT (x);
2657 i2 = XINT (y);
2659 if (i2 == 0)
2660 xsignal0 (Qarith_error);
2662 i1 %= i2;
2664 /* If the "remainder" comes out with the wrong sign, fix it. */
2665 if (i2 < 0 ? i1 > 0 : i1 < 0)
2666 i1 += i2;
2668 XSETINT (val, i1);
2669 return val;
2672 DEFUN ("max", Fmax, Smax, 1, MANY, 0,
2673 doc: /* Return largest of all the arguments (which must be numbers or markers).
2674 The value is always a number; markers are converted to numbers.
2675 usage: (max NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */)
2676 (nargs, args)
2677 int nargs;
2678 Lisp_Object *args;
2680 return arith_driver (Amax, nargs, args);
2683 DEFUN ("min", Fmin, Smin, 1, MANY, 0,
2684 doc: /* Return smallest of all the arguments (which must be numbers or markers).
2685 The value is always a number; markers are converted to numbers.
2686 usage: (min NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */)
2687 (nargs, args)
2688 int nargs;
2689 Lisp_Object *args;
2691 return arith_driver (Amin, nargs, args);
2694 DEFUN ("logand", Flogand, Slogand, 0, MANY, 0,
2695 doc: /* Return bitwise-and of all the arguments.
2696 Arguments may be integers, or markers converted to integers.
2697 usage: (logand &rest INTS-OR-MARKERS) */)
2698 (nargs, args)
2699 int nargs;
2700 Lisp_Object *args;
2702 return arith_driver (Alogand, nargs, args);
2705 DEFUN ("logior", Flogior, Slogior, 0, MANY, 0,
2706 doc: /* Return bitwise-or of all the arguments.
2707 Arguments may be integers, or markers converted to integers.
2708 usage: (logior &rest INTS-OR-MARKERS) */)
2709 (nargs, args)
2710 int nargs;
2711 Lisp_Object *args;
2713 return arith_driver (Alogior, nargs, args);
2716 DEFUN ("logxor", Flogxor, Slogxor, 0, MANY, 0,
2717 doc: /* Return bitwise-exclusive-or of all the arguments.
2718 Arguments may be integers, or markers converted to integers.
2719 usage: (logxor &rest INTS-OR-MARKERS) */)
2720 (nargs, args)
2721 int nargs;
2722 Lisp_Object *args;
2724 return arith_driver (Alogxor, nargs, args);
2727 DEFUN ("ash", Fash, Sash, 2, 2, 0,
2728 doc: /* Return VALUE with its bits shifted left by COUNT.
2729 If COUNT is negative, shifting is actually to the right.
2730 In this case, the sign bit is duplicated. */)
2731 (value, count)
2732 register Lisp_Object value, count;
2734 register Lisp_Object val;
2736 CHECK_NUMBER (value);
2737 CHECK_NUMBER (count);
2739 if (XINT (count) >= BITS_PER_EMACS_INT)
2740 XSETINT (val, 0);
2741 else if (XINT (count) > 0)
2742 XSETINT (val, XINT (value) << XFASTINT (count));
2743 else if (XINT (count) <= -BITS_PER_EMACS_INT)
2744 XSETINT (val, XINT (value) < 0 ? -1 : 0);
2745 else
2746 XSETINT (val, XINT (value) >> -XINT (count));
2747 return val;
2750 DEFUN ("lsh", Flsh, Slsh, 2, 2, 0,
2751 doc: /* Return VALUE with its bits shifted left by COUNT.
2752 If COUNT is negative, shifting is actually to the right.
2753 In this case, zeros are shifted in on the left. */)
2754 (value, count)
2755 register Lisp_Object value, count;
2757 register Lisp_Object val;
2759 CHECK_NUMBER (value);
2760 CHECK_NUMBER (count);
2762 if (XINT (count) >= BITS_PER_EMACS_INT)
2763 XSETINT (val, 0);
2764 else if (XINT (count) > 0)
2765 XSETINT (val, (EMACS_UINT) XUINT (value) << XFASTINT (count));
2766 else if (XINT (count) <= -BITS_PER_EMACS_INT)
2767 XSETINT (val, 0);
2768 else
2769 XSETINT (val, (EMACS_UINT) XUINT (value) >> -XINT (count));
2770 return val;
2773 DEFUN ("1+", Fadd1, Sadd1, 1, 1, 0,
2774 doc: /* Return NUMBER plus one. NUMBER may be a number or a marker.
2775 Markers are converted to integers. */)
2776 (number)
2777 register Lisp_Object number;
2779 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number);
2781 if (FLOATP (number))
2782 return (make_float (1.0 + XFLOAT_DATA (number)));
2784 XSETINT (number, XINT (number) + 1);
2785 return number;
2788 DEFUN ("1-", Fsub1, Ssub1, 1, 1, 0,
2789 doc: /* Return NUMBER minus one. NUMBER may be a number or a marker.
2790 Markers are converted to integers. */)
2791 (number)
2792 register Lisp_Object number;
2794 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number);
2796 if (FLOATP (number))
2797 return (make_float (-1.0 + XFLOAT_DATA (number)));
2799 XSETINT (number, XINT (number) - 1);
2800 return number;
2803 DEFUN ("lognot", Flognot, Slognot, 1, 1, 0,
2804 doc: /* Return the bitwise complement of NUMBER. NUMBER must be an integer. */)
2805 (number)
2806 register Lisp_Object number;
2808 CHECK_NUMBER (number);
2809 XSETINT (number, ~XINT (number));
2810 return number;
2813 DEFUN ("byteorder", Fbyteorder, Sbyteorder, 0, 0, 0,
2814 doc: /* Return the byteorder for the machine.
2815 Returns 66 (ASCII uppercase B) for big endian machines or 108 (ASCII
2816 lowercase l) for small endian machines. */)
2819 unsigned i = 0x04030201;
2820 int order = *(char *)&i == 1 ? 108 : 66;
2822 return make_number (order);
2827 void
2828 syms_of_data ()
2830 Lisp_Object error_tail, arith_tail;
2832 Qquote = intern ("quote");
2833 Qlambda = intern ("lambda");
2834 Qsubr = intern ("subr");
2835 Qerror_conditions = intern ("error-conditions");
2836 Qerror_message = intern ("error-message");
2837 Qtop_level = intern ("top-level");
2839 Qerror = intern ("error");
2840 Qquit = intern ("quit");
2841 Qwrong_type_argument = intern ("wrong-type-argument");
2842 Qargs_out_of_range = intern ("args-out-of-range");
2843 Qvoid_function = intern ("void-function");
2844 Qcyclic_function_indirection = intern ("cyclic-function-indirection");
2845 Qcyclic_variable_indirection = intern ("cyclic-variable-indirection");
2846 Qvoid_variable = intern ("void-variable");
2847 Qsetting_constant = intern ("setting-constant");
2848 Qinvalid_read_syntax = intern ("invalid-read-syntax");
2850 Qinvalid_function = intern ("invalid-function");
2851 Qwrong_number_of_arguments = intern ("wrong-number-of-arguments");
2852 Qno_catch = intern ("no-catch");
2853 Qend_of_file = intern ("end-of-file");
2854 Qarith_error = intern ("arith-error");
2855 Qbeginning_of_buffer = intern ("beginning-of-buffer");
2856 Qend_of_buffer = intern ("end-of-buffer");
2857 Qbuffer_read_only = intern ("buffer-read-only");
2858 Qtext_read_only = intern ("text-read-only");
2859 Qmark_inactive = intern ("mark-inactive");
2861 Qlistp = intern ("listp");
2862 Qconsp = intern ("consp");
2863 Qsymbolp = intern ("symbolp");
2864 Qkeywordp = intern ("keywordp");
2865 Qintegerp = intern ("integerp");
2866 Qnatnump = intern ("natnump");
2867 Qwholenump = intern ("wholenump");
2868 Qstringp = intern ("stringp");
2869 Qarrayp = intern ("arrayp");
2870 Qsequencep = intern ("sequencep");
2871 Qbufferp = intern ("bufferp");
2872 Qvectorp = intern ("vectorp");
2873 Qchar_or_string_p = intern ("char-or-string-p");
2874 Qmarkerp = intern ("markerp");
2875 Qbuffer_or_string_p = intern ("buffer-or-string-p");
2876 Qinteger_or_marker_p = intern ("integer-or-marker-p");
2877 Qboundp = intern ("boundp");
2878 Qfboundp = intern ("fboundp");
2880 Qfloatp = intern ("floatp");
2881 Qnumberp = intern ("numberp");
2882 Qnumber_or_marker_p = intern ("number-or-marker-p");
2884 Qchar_table_p = intern ("char-table-p");
2885 Qvector_or_char_table_p = intern ("vector-or-char-table-p");
2887 Qsubrp = intern ("subrp");
2888 Qunevalled = intern ("unevalled");
2889 Qmany = intern ("many");
2891 Qcdr = intern ("cdr");
2893 /* Handle automatic advice activation */
2894 Qad_advice_info = intern ("ad-advice-info");
2895 Qad_activate_internal = intern ("ad-activate-internal");
2897 error_tail = Fcons (Qerror, Qnil);
2899 /* ERROR is used as a signaler for random errors for which nothing else is right */
2901 Fput (Qerror, Qerror_conditions,
2902 error_tail);
2903 Fput (Qerror, Qerror_message,
2904 build_string ("error"));
2906 Fput (Qquit, Qerror_conditions,
2907 Fcons (Qquit, Qnil));
2908 Fput (Qquit, Qerror_message,
2909 build_string ("Quit"));
2911 Fput (Qwrong_type_argument, Qerror_conditions,
2912 Fcons (Qwrong_type_argument, error_tail));
2913 Fput (Qwrong_type_argument, Qerror_message,
2914 build_string ("Wrong type argument"));
2916 Fput (Qargs_out_of_range, Qerror_conditions,
2917 Fcons (Qargs_out_of_range, error_tail));
2918 Fput (Qargs_out_of_range, Qerror_message,
2919 build_string ("Args out of range"));
2921 Fput (Qvoid_function, Qerror_conditions,
2922 Fcons (Qvoid_function, error_tail));
2923 Fput (Qvoid_function, Qerror_message,
2924 build_string ("Symbol's function definition is void"));
2926 Fput (Qcyclic_function_indirection, Qerror_conditions,
2927 Fcons (Qcyclic_function_indirection, error_tail));
2928 Fput (Qcyclic_function_indirection, Qerror_message,
2929 build_string ("Symbol's chain of function indirections contains a loop"));
2931 Fput (Qcyclic_variable_indirection, Qerror_conditions,
2932 Fcons (Qcyclic_variable_indirection, error_tail));
2933 Fput (Qcyclic_variable_indirection, Qerror_message,
2934 build_string ("Symbol's chain of variable indirections contains a loop"));
2936 Qcircular_list = intern ("circular-list");
2937 staticpro (&Qcircular_list);
2938 Fput (Qcircular_list, Qerror_conditions,
2939 Fcons (Qcircular_list, error_tail));
2940 Fput (Qcircular_list, Qerror_message,
2941 build_string ("List contains a loop"));
2943 Fput (Qvoid_variable, Qerror_conditions,
2944 Fcons (Qvoid_variable, error_tail));
2945 Fput (Qvoid_variable, Qerror_message,
2946 build_string ("Symbol's value as variable is void"));
2948 Fput (Qsetting_constant, Qerror_conditions,
2949 Fcons (Qsetting_constant, error_tail));
2950 Fput (Qsetting_constant, Qerror_message,
2951 build_string ("Attempt to set a constant symbol"));
2953 Fput (Qinvalid_read_syntax, Qerror_conditions,
2954 Fcons (Qinvalid_read_syntax, error_tail));
2955 Fput (Qinvalid_read_syntax, Qerror_message,
2956 build_string ("Invalid read syntax"));
2958 Fput (Qinvalid_function, Qerror_conditions,
2959 Fcons (Qinvalid_function, error_tail));
2960 Fput (Qinvalid_function, Qerror_message,
2961 build_string ("Invalid function"));
2963 Fput (Qwrong_number_of_arguments, Qerror_conditions,
2964 Fcons (Qwrong_number_of_arguments, error_tail));
2965 Fput (Qwrong_number_of_arguments, Qerror_message,
2966 build_string ("Wrong number of arguments"));
2968 Fput (Qno_catch, Qerror_conditions,
2969 Fcons (Qno_catch, error_tail));
2970 Fput (Qno_catch, Qerror_message,
2971 build_string ("No catch for tag"));
2973 Fput (Qend_of_file, Qerror_conditions,
2974 Fcons (Qend_of_file, error_tail));
2975 Fput (Qend_of_file, Qerror_message,
2976 build_string ("End of file during parsing"));
2978 arith_tail = Fcons (Qarith_error, error_tail);
2979 Fput (Qarith_error, Qerror_conditions,
2980 arith_tail);
2981 Fput (Qarith_error, Qerror_message,
2982 build_string ("Arithmetic error"));
2984 Fput (Qbeginning_of_buffer, Qerror_conditions,
2985 Fcons (Qbeginning_of_buffer, error_tail));
2986 Fput (Qbeginning_of_buffer, Qerror_message,
2987 build_string ("Beginning of buffer"));
2989 Fput (Qend_of_buffer, Qerror_conditions,
2990 Fcons (Qend_of_buffer, error_tail));
2991 Fput (Qend_of_buffer, Qerror_message,
2992 build_string ("End of buffer"));
2994 Fput (Qbuffer_read_only, Qerror_conditions,
2995 Fcons (Qbuffer_read_only, error_tail));
2996 Fput (Qbuffer_read_only, Qerror_message,
2997 build_string ("Buffer is read-only"));
2999 Fput (Qtext_read_only, Qerror_conditions,
3000 Fcons (Qtext_read_only, error_tail));
3001 Fput (Qtext_read_only, Qerror_message,
3002 build_string ("Text is read-only"));
3004 Qrange_error = intern ("range-error");
3005 Qdomain_error = intern ("domain-error");
3006 Qsingularity_error = intern ("singularity-error");
3007 Qoverflow_error = intern ("overflow-error");
3008 Qunderflow_error = intern ("underflow-error");
3010 Fput (Qdomain_error, Qerror_conditions,
3011 Fcons (Qdomain_error, arith_tail));
3012 Fput (Qdomain_error, Qerror_message,
3013 build_string ("Arithmetic domain error"));
3015 Fput (Qrange_error, Qerror_conditions,
3016 Fcons (Qrange_error, arith_tail));
3017 Fput (Qrange_error, Qerror_message,
3018 build_string ("Arithmetic range error"));
3020 Fput (Qsingularity_error, Qerror_conditions,
3021 Fcons (Qsingularity_error, Fcons (Qdomain_error, arith_tail)));
3022 Fput (Qsingularity_error, Qerror_message,
3023 build_string ("Arithmetic singularity error"));
3025 Fput (Qoverflow_error, Qerror_conditions,
3026 Fcons (Qoverflow_error, Fcons (Qdomain_error, arith_tail)));
3027 Fput (Qoverflow_error, Qerror_message,
3028 build_string ("Arithmetic overflow error"));
3030 Fput (Qunderflow_error, Qerror_conditions,
3031 Fcons (Qunderflow_error, Fcons (Qdomain_error, arith_tail)));
3032 Fput (Qunderflow_error, Qerror_message,
3033 build_string ("Arithmetic underflow error"));
3035 staticpro (&Qrange_error);
3036 staticpro (&Qdomain_error);
3037 staticpro (&Qsingularity_error);
3038 staticpro (&Qoverflow_error);
3039 staticpro (&Qunderflow_error);
3041 staticpro (&Qnil);
3042 staticpro (&Qt);
3043 staticpro (&Qquote);
3044 staticpro (&Qlambda);
3045 staticpro (&Qsubr);
3046 staticpro (&Qunbound);
3047 staticpro (&Qerror_conditions);
3048 staticpro (&Qerror_message);
3049 staticpro (&Qtop_level);
3051 staticpro (&Qerror);
3052 staticpro (&Qquit);
3053 staticpro (&Qwrong_type_argument);
3054 staticpro (&Qargs_out_of_range);
3055 staticpro (&Qvoid_function);
3056 staticpro (&Qcyclic_function_indirection);
3057 staticpro (&Qcyclic_variable_indirection);
3058 staticpro (&Qvoid_variable);
3059 staticpro (&Qsetting_constant);
3060 staticpro (&Qinvalid_read_syntax);
3061 staticpro (&Qwrong_number_of_arguments);
3062 staticpro (&Qinvalid_function);
3063 staticpro (&Qno_catch);
3064 staticpro (&Qend_of_file);
3065 staticpro (&Qarith_error);
3066 staticpro (&Qbeginning_of_buffer);
3067 staticpro (&Qend_of_buffer);
3068 staticpro (&Qbuffer_read_only);
3069 staticpro (&Qtext_read_only);
3070 staticpro (&Qmark_inactive);
3072 staticpro (&Qlistp);
3073 staticpro (&Qconsp);
3074 staticpro (&Qsymbolp);
3075 staticpro (&Qkeywordp);
3076 staticpro (&Qintegerp);
3077 staticpro (&Qnatnump);
3078 staticpro (&Qwholenump);
3079 staticpro (&Qstringp);
3080 staticpro (&Qarrayp);
3081 staticpro (&Qsequencep);
3082 staticpro (&Qbufferp);
3083 staticpro (&Qvectorp);
3084 staticpro (&Qchar_or_string_p);
3085 staticpro (&Qmarkerp);
3086 staticpro (&Qbuffer_or_string_p);
3087 staticpro (&Qinteger_or_marker_p);
3088 staticpro (&Qfloatp);
3089 staticpro (&Qnumberp);
3090 staticpro (&Qnumber_or_marker_p);
3091 staticpro (&Qchar_table_p);
3092 staticpro (&Qvector_or_char_table_p);
3093 staticpro (&Qsubrp);
3094 staticpro (&Qmany);
3095 staticpro (&Qunevalled);
3097 staticpro (&Qboundp);
3098 staticpro (&Qfboundp);
3099 staticpro (&Qcdr);
3100 staticpro (&Qad_advice_info);
3101 staticpro (&Qad_activate_internal);
3103 /* Types that type-of returns. */
3104 Qinteger = intern ("integer");
3105 Qsymbol = intern ("symbol");
3106 Qstring = intern ("string");
3107 Qcons = intern ("cons");
3108 Qmarker = intern ("marker");
3109 Qoverlay = intern ("overlay");
3110 Qfloat = intern ("float");
3111 Qwindow_configuration = intern ("window-configuration");
3112 Qprocess = intern ("process");
3113 Qwindow = intern ("window");
3114 /* Qsubr = intern ("subr"); */
3115 Qcompiled_function = intern ("compiled-function");
3116 Qbuffer = intern ("buffer");
3117 Qframe = intern ("frame");
3118 Qvector = intern ("vector");
3119 Qchar_table = intern ("char-table");
3120 Qbool_vector = intern ("bool-vector");
3121 Qhash_table = intern ("hash-table");
3123 staticpro (&Qinteger);
3124 staticpro (&Qsymbol);
3125 staticpro (&Qstring);
3126 staticpro (&Qcons);
3127 staticpro (&Qmarker);
3128 staticpro (&Qoverlay);
3129 staticpro (&Qfloat);
3130 staticpro (&Qwindow_configuration);
3131 staticpro (&Qprocess);
3132 staticpro (&Qwindow);
3133 /* staticpro (&Qsubr); */
3134 staticpro (&Qcompiled_function);
3135 staticpro (&Qbuffer);
3136 staticpro (&Qframe);
3137 staticpro (&Qvector);
3138 staticpro (&Qchar_table);
3139 staticpro (&Qbool_vector);
3140 staticpro (&Qhash_table);
3142 defsubr (&Sindirect_variable);
3143 defsubr (&Sinteractive_form);
3144 defsubr (&Seq);
3145 defsubr (&Snull);
3146 defsubr (&Stype_of);
3147 defsubr (&Slistp);
3148 defsubr (&Snlistp);
3149 defsubr (&Sconsp);
3150 defsubr (&Satom);
3151 defsubr (&Sintegerp);
3152 defsubr (&Sinteger_or_marker_p);
3153 defsubr (&Snumberp);
3154 defsubr (&Snumber_or_marker_p);
3155 defsubr (&Sfloatp);
3156 defsubr (&Snatnump);
3157 defsubr (&Ssymbolp);
3158 defsubr (&Skeywordp);
3159 defsubr (&Sstringp);
3160 defsubr (&Smultibyte_string_p);
3161 defsubr (&Svectorp);
3162 defsubr (&Schar_table_p);
3163 defsubr (&Svector_or_char_table_p);
3164 defsubr (&Sbool_vector_p);
3165 defsubr (&Sarrayp);
3166 defsubr (&Ssequencep);
3167 defsubr (&Sbufferp);
3168 defsubr (&Smarkerp);
3169 defsubr (&Ssubrp);
3170 defsubr (&Sbyte_code_function_p);
3171 defsubr (&Schar_or_string_p);
3172 defsubr (&Scar);
3173 defsubr (&Scdr);
3174 defsubr (&Scar_safe);
3175 defsubr (&Scdr_safe);
3176 defsubr (&Ssetcar);
3177 defsubr (&Ssetcdr);
3178 defsubr (&Ssymbol_function);
3179 defsubr (&Sindirect_function);
3180 defsubr (&Ssymbol_plist);
3181 defsubr (&Ssymbol_name);
3182 defsubr (&Smakunbound);
3183 defsubr (&Sfmakunbound);
3184 defsubr (&Sboundp);
3185 defsubr (&Sfboundp);
3186 defsubr (&Sfset);
3187 defsubr (&Sdefalias);
3188 defsubr (&Ssetplist);
3189 defsubr (&Ssymbol_value);
3190 defsubr (&Sset);
3191 defsubr (&Sdefault_boundp);
3192 defsubr (&Sdefault_value);
3193 defsubr (&Sset_default);
3194 defsubr (&Ssetq_default);
3195 defsubr (&Smake_variable_buffer_local);
3196 defsubr (&Smake_local_variable);
3197 defsubr (&Skill_local_variable);
3198 defsubr (&Smake_variable_frame_local);
3199 defsubr (&Slocal_variable_p);
3200 defsubr (&Slocal_variable_if_set_p);
3201 defsubr (&Svariable_binding_locus);
3202 #if 0 /* XXX Remove this. --lorentey */
3203 defsubr (&Sterminal_local_value);
3204 defsubr (&Sset_terminal_local_value);
3205 #endif
3206 defsubr (&Saref);
3207 defsubr (&Saset);
3208 defsubr (&Snumber_to_string);
3209 defsubr (&Sstring_to_number);
3210 defsubr (&Seqlsign);
3211 defsubr (&Slss);
3212 defsubr (&Sgtr);
3213 defsubr (&Sleq);
3214 defsubr (&Sgeq);
3215 defsubr (&Sneq);
3216 defsubr (&Szerop);
3217 defsubr (&Splus);
3218 defsubr (&Sminus);
3219 defsubr (&Stimes);
3220 defsubr (&Squo);
3221 defsubr (&Srem);
3222 defsubr (&Smod);
3223 defsubr (&Smax);
3224 defsubr (&Smin);
3225 defsubr (&Slogand);
3226 defsubr (&Slogior);
3227 defsubr (&Slogxor);
3228 defsubr (&Slsh);
3229 defsubr (&Sash);
3230 defsubr (&Sadd1);
3231 defsubr (&Ssub1);
3232 defsubr (&Slognot);
3233 defsubr (&Sbyteorder);
3234 defsubr (&Ssubr_arity);
3235 defsubr (&Ssubr_name);
3237 XSYMBOL (Qwholenump)->function = XSYMBOL (Qnatnump)->function;
3239 DEFVAR_LISP ("most-positive-fixnum", &Vmost_positive_fixnum,
3240 doc: /* The largest value that is representable in a Lisp integer. */);
3241 Vmost_positive_fixnum = make_number (MOST_POSITIVE_FIXNUM);
3242 XSYMBOL (intern ("most-positive-fixnum"))->constant = 1;
3244 DEFVAR_LISP ("most-negative-fixnum", &Vmost_negative_fixnum,
3245 doc: /* The smallest value that is representable in a Lisp integer. */);
3246 Vmost_negative_fixnum = make_number (MOST_NEGATIVE_FIXNUM);
3247 XSYMBOL (intern ("most-negative-fixnum"))->constant = 1;
3250 SIGTYPE
3251 arith_error (signo)
3252 int signo;
3254 #if defined(USG) && !defined(POSIX_SIGNALS)
3255 /* USG systems forget handlers when they are used;
3256 must reestablish each time */
3257 signal (signo, arith_error);
3258 #endif /* USG */
3259 #ifdef VMS
3260 /* VMS systems are like USG. */
3261 signal (signo, arith_error);
3262 #endif /* VMS */
3263 #ifdef BSD4_1
3264 sigrelse (SIGFPE);
3265 #else /* not BSD4_1 */
3266 sigsetmask (SIGEMPTYMASK);
3267 #endif /* not BSD4_1 */
3269 SIGNAL_THREAD_CHECK (signo);
3270 xsignal0 (Qarith_error);
3273 void
3274 init_data ()
3276 /* Don't do this if just dumping out.
3277 We don't want to call `signal' in this case
3278 so that we don't have trouble with dumping
3279 signal-delivering routines in an inconsistent state. */
3280 #ifndef CANNOT_DUMP
3281 if (!initialized)
3282 return;
3283 #endif /* CANNOT_DUMP */
3284 signal (SIGFPE, arith_error);
3286 #ifdef uts
3287 signal (SIGEMT, arith_error);
3288 #endif /* uts */
3291 /* arch-tag: 25879798-b84d-479a-9c89-7d148e2109f7
3292 (do not change this comment) */