(menu-bar-update-buffers, menu-bar-update-buffers): Don't quote lambda.
[emacs.git] / src / data.c
blobf43d15f8e960bebfeee0c7481ac42054cd382605
1 /* Primitive operations on Lisp data types for GNU Emacs Lisp interpreter.
2 Copyright (C) 1985,86,88,93,94,95,97,98,99,2000 Free Software Foundation, Inc.
4 This file is part of GNU Emacs.
6 GNU Emacs is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
11 GNU Emacs is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs; see the file COPYING. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
22 #include <config.h>
23 #include <signal.h>
24 #include <stdio.h>
25 #include "lisp.h"
26 #include "puresize.h"
27 #include "charset.h"
28 #include "buffer.h"
29 #include "keyboard.h"
30 #include "frame.h"
31 #include "syssignal.h"
33 #ifdef STDC_HEADERS
34 #include <float.h>
35 #endif
37 /* If IEEE_FLOATING_POINT isn't defined, default it from FLT_*. */
38 #ifndef IEEE_FLOATING_POINT
39 #if (FLT_RADIX == 2 && FLT_MANT_DIG == 24 \
40 && FLT_MIN_EXP == -125 && FLT_MAX_EXP == 128)
41 #define IEEE_FLOATING_POINT 1
42 #else
43 #define IEEE_FLOATING_POINT 0
44 #endif
45 #endif
47 /* Work around a problem that happens because math.h on hpux 7
48 defines two static variables--which, in Emacs, are not really static,
49 because `static' is defined as nothing. The problem is that they are
50 here, in floatfns.c, and in lread.c.
51 These macros prevent the name conflict. */
52 #if defined (HPUX) && !defined (HPUX8)
53 #define _MAXLDBL data_c_maxldbl
54 #define _NMAXLDBL data_c_nmaxldbl
55 #endif
57 #include <math.h>
59 #if !defined (atof)
60 extern double atof ();
61 #endif /* !atof */
63 Lisp_Object Qnil, Qt, Qquote, Qlambda, Qsubr, Qunbound;
64 Lisp_Object Qerror_conditions, Qerror_message, Qtop_level;
65 Lisp_Object Qerror, Qquit, Qwrong_type_argument, Qargs_out_of_range;
66 Lisp_Object Qvoid_variable, Qvoid_function, Qcyclic_function_indirection;
67 Lisp_Object Qsetting_constant, Qinvalid_read_syntax;
68 Lisp_Object Qinvalid_function, Qwrong_number_of_arguments, Qno_catch;
69 Lisp_Object Qend_of_file, Qarith_error, Qmark_inactive;
70 Lisp_Object Qbeginning_of_buffer, Qend_of_buffer, Qbuffer_read_only;
71 Lisp_Object Qtext_read_only;
72 Lisp_Object Qintegerp, Qnatnump, Qwholenump, Qsymbolp, Qlistp, Qconsp;
73 Lisp_Object Qstringp, Qarrayp, Qsequencep, Qbufferp;
74 Lisp_Object Qchar_or_string_p, Qmarkerp, Qinteger_or_marker_p, Qvectorp;
75 Lisp_Object Qbuffer_or_string_p, Qkeywordp;
76 Lisp_Object Qboundp, Qfboundp;
77 Lisp_Object Qchar_table_p, Qvector_or_char_table_p;
79 Lisp_Object Qcdr;
80 Lisp_Object Qad_advice_info, Qad_activate_internal;
82 Lisp_Object Qrange_error, Qdomain_error, Qsingularity_error;
83 Lisp_Object Qoverflow_error, Qunderflow_error;
85 Lisp_Object Qfloatp;
86 Lisp_Object Qnumberp, Qnumber_or_marker_p;
88 static Lisp_Object Qinteger, Qsymbol, Qstring, Qcons, Qmarker, Qoverlay;
89 static Lisp_Object Qfloat, Qwindow_configuration, Qwindow;
90 Lisp_Object Qprocess;
91 static Lisp_Object Qcompiled_function, Qbuffer, Qframe, Qvector;
92 static Lisp_Object Qchar_table, Qbool_vector, Qhash_table;
93 static Lisp_Object Qsubrp, Qmany, Qunevalled;
95 static Lisp_Object swap_in_symval_forwarding ();
97 Lisp_Object set_internal ();
99 Lisp_Object
100 wrong_type_argument (predicate, value)
101 register Lisp_Object predicate, value;
103 register Lisp_Object tem;
106 if (!EQ (Vmocklisp_arguments, Qt))
108 if (STRINGP (value) &&
109 (EQ (predicate, Qintegerp) || EQ (predicate, Qinteger_or_marker_p)))
110 return Fstring_to_number (value, Qnil);
111 if (INTEGERP (value) && EQ (predicate, Qstringp))
112 return Fnumber_to_string (value);
115 /* If VALUE is not even a valid Lisp object, abort here
116 where we can get a backtrace showing where it came from. */
117 if ((unsigned int) XGCTYPE (value) >= Lisp_Type_Limit)
118 abort ();
120 value = Fsignal (Qwrong_type_argument, Fcons (predicate, Fcons (value, Qnil)));
121 tem = call1 (predicate, value);
123 while (NILP (tem));
124 return value;
127 void
128 pure_write_error ()
130 error ("Attempt to modify read-only object");
133 void
134 args_out_of_range (a1, a2)
135 Lisp_Object a1, a2;
137 while (1)
138 Fsignal (Qargs_out_of_range, Fcons (a1, Fcons (a2, Qnil)));
141 void
142 args_out_of_range_3 (a1, a2, a3)
143 Lisp_Object a1, a2, a3;
145 while (1)
146 Fsignal (Qargs_out_of_range, Fcons (a1, Fcons (a2, Fcons (a3, Qnil))));
149 /* On some machines, XINT needs a temporary location.
150 Here it is, in case it is needed. */
152 int sign_extend_temp;
154 /* On a few machines, XINT can only be done by calling this. */
157 sign_extend_lisp_int (num)
158 EMACS_INT num;
160 if (num & (((EMACS_INT) 1) << (VALBITS - 1)))
161 return num | (((EMACS_INT) (-1)) << VALBITS);
162 else
163 return num & ((((EMACS_INT) 1) << VALBITS) - 1);
166 /* Data type predicates */
168 DEFUN ("eq", Feq, Seq, 2, 2, 0,
169 "Return t if the two args are the same Lisp object.")
170 (obj1, obj2)
171 Lisp_Object obj1, obj2;
173 if (EQ (obj1, obj2))
174 return Qt;
175 return Qnil;
178 DEFUN ("null", Fnull, Snull, 1, 1, 0, "Return t if OBJECT is nil.")
179 (object)
180 Lisp_Object object;
182 if (NILP (object))
183 return Qt;
184 return Qnil;
187 DEFUN ("type-of", Ftype_of, Stype_of, 1, 1, 0,
188 "Return a symbol representing the type of OBJECT.\n\
189 The symbol returned names the object's basic type;\n\
190 for example, (type-of 1) returns `integer'.")
191 (object)
192 Lisp_Object object;
194 switch (XGCTYPE (object))
196 case Lisp_Int:
197 return Qinteger;
199 case Lisp_Symbol:
200 return Qsymbol;
202 case Lisp_String:
203 return Qstring;
205 case Lisp_Cons:
206 return Qcons;
208 case Lisp_Misc:
209 switch (XMISCTYPE (object))
211 case Lisp_Misc_Marker:
212 return Qmarker;
213 case Lisp_Misc_Overlay:
214 return Qoverlay;
215 case Lisp_Misc_Float:
216 return Qfloat;
218 abort ();
220 case Lisp_Vectorlike:
221 if (GC_WINDOW_CONFIGURATIONP (object))
222 return Qwindow_configuration;
223 if (GC_PROCESSP (object))
224 return Qprocess;
225 if (GC_WINDOWP (object))
226 return Qwindow;
227 if (GC_SUBRP (object))
228 return Qsubr;
229 if (GC_COMPILEDP (object))
230 return Qcompiled_function;
231 if (GC_BUFFERP (object))
232 return Qbuffer;
233 if (GC_CHAR_TABLE_P (object))
234 return Qchar_table;
235 if (GC_BOOL_VECTOR_P (object))
236 return Qbool_vector;
237 if (GC_FRAMEP (object))
238 return Qframe;
239 if (GC_HASH_TABLE_P (object))
240 return Qhash_table;
241 return Qvector;
243 case Lisp_Float:
244 return Qfloat;
246 default:
247 abort ();
251 DEFUN ("consp", Fconsp, Sconsp, 1, 1, 0, "Return t if OBJECT is a cons cell.")
252 (object)
253 Lisp_Object object;
255 if (CONSP (object))
256 return Qt;
257 return Qnil;
260 DEFUN ("atom", Fatom, Satom, 1, 1, 0,
261 "Return t if OBJECT is not a cons cell. This includes nil.")
262 (object)
263 Lisp_Object object;
265 if (CONSP (object))
266 return Qnil;
267 return Qt;
270 DEFUN ("listp", Flistp, Slistp, 1, 1, 0,
271 "Return t if OBJECT is a list. This includes nil.")
272 (object)
273 Lisp_Object object;
275 if (CONSP (object) || NILP (object))
276 return Qt;
277 return Qnil;
280 DEFUN ("nlistp", Fnlistp, Snlistp, 1, 1, 0,
281 "Return t if OBJECT is not a list. Lists include nil.")
282 (object)
283 Lisp_Object object;
285 if (CONSP (object) || NILP (object))
286 return Qnil;
287 return Qt;
290 DEFUN ("symbolp", Fsymbolp, Ssymbolp, 1, 1, 0,
291 "Return t if OBJECT is a symbol.")
292 (object)
293 Lisp_Object object;
295 if (SYMBOLP (object))
296 return Qt;
297 return Qnil;
300 /* Define this in C to avoid unnecessarily consing up the symbol
301 name. */
302 DEFUN ("keywordp", Fkeywordp, Skeywordp, 1, 1, 0,
303 "Return t if OBJECT is a keyword.\n\
304 This means that it is a symbol with a print name beginning with `:'\n\
305 interned in the initial obarray.")
306 (object)
307 Lisp_Object object;
309 if (SYMBOLP (object)
310 && XSYMBOL (object)->name->data[0] == ':'
311 && EQ (XSYMBOL (object)->obarray, initial_obarray))
312 return Qt;
313 return Qnil;
316 DEFUN ("vectorp", Fvectorp, Svectorp, 1, 1, 0,
317 "Return t if OBJECT is a vector.")
318 (object)
319 Lisp_Object object;
321 if (VECTORP (object))
322 return Qt;
323 return Qnil;
326 DEFUN ("stringp", Fstringp, Sstringp, 1, 1, 0,
327 "Return t if OBJECT is a string.")
328 (object)
329 Lisp_Object object;
331 if (STRINGP (object))
332 return Qt;
333 return Qnil;
336 DEFUN ("multibyte-string-p", Fmultibyte_string_p, Smultibyte_string_p,
337 1, 1, 0, "Return t if OBJECT is a multibyte string.")
338 (object)
339 Lisp_Object object;
341 if (STRINGP (object) && STRING_MULTIBYTE (object))
342 return Qt;
343 return Qnil;
346 DEFUN ("char-table-p", Fchar_table_p, Schar_table_p, 1, 1, 0,
347 "Return t if OBJECT is a char-table.")
348 (object)
349 Lisp_Object object;
351 if (CHAR_TABLE_P (object))
352 return Qt;
353 return Qnil;
356 DEFUN ("vector-or-char-table-p", Fvector_or_char_table_p,
357 Svector_or_char_table_p, 1, 1, 0,
358 "Return t if OBJECT is a char-table or vector.")
359 (object)
360 Lisp_Object object;
362 if (VECTORP (object) || CHAR_TABLE_P (object))
363 return Qt;
364 return Qnil;
367 DEFUN ("bool-vector-p", Fbool_vector_p, Sbool_vector_p, 1, 1, 0, "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, "Return t if OBJECT is an array (string or vector).")
377 (object)
378 Lisp_Object object;
380 if (VECTORP (object) || STRINGP (object)
381 || CHAR_TABLE_P (object) || BOOL_VECTOR_P (object))
382 return Qt;
383 return Qnil;
386 DEFUN ("sequencep", Fsequencep, Ssequencep, 1, 1, 0,
387 "Return t if OBJECT is a sequence (list or array).")
388 (object)
389 register Lisp_Object object;
391 if (CONSP (object) || NILP (object) || VECTORP (object) || STRINGP (object)
392 || CHAR_TABLE_P (object) || BOOL_VECTOR_P (object))
393 return Qt;
394 return Qnil;
397 DEFUN ("bufferp", Fbufferp, Sbufferp, 1, 1, 0, "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, "Return t if OBJECT is a marker (editor pointer).")
407 (object)
408 Lisp_Object object;
410 if (MARKERP (object))
411 return Qt;
412 return Qnil;
415 DEFUN ("subrp", Fsubrp, Ssubrp, 1, 1, 0, "Return t if OBJECT is a built-in function.")
416 (object)
417 Lisp_Object object;
419 if (SUBRP (object))
420 return Qt;
421 return Qnil;
424 DEFUN ("byte-code-function-p", Fbyte_code_function_p, Sbyte_code_function_p,
425 1, 1, 0, "Return t if OBJECT is a byte-compiled function object.")
426 (object)
427 Lisp_Object object;
429 if (COMPILEDP (object))
430 return Qt;
431 return Qnil;
434 DEFUN ("char-or-string-p", Fchar_or_string_p, Schar_or_string_p, 1, 1, 0,
435 "Return t if OBJECT is a character (an integer) or a string.")
436 (object)
437 register Lisp_Object object;
439 if (INTEGERP (object) || STRINGP (object))
440 return Qt;
441 return Qnil;
444 DEFUN ("integerp", Fintegerp, Sintegerp, 1, 1, 0, "Return t if OBJECT is an integer.")
445 (object)
446 Lisp_Object object;
448 if (INTEGERP (object))
449 return Qt;
450 return Qnil;
453 DEFUN ("integer-or-marker-p", Finteger_or_marker_p, Sinteger_or_marker_p, 1, 1, 0,
454 "Return t if OBJECT is an integer or a marker (editor pointer).")
455 (object)
456 register Lisp_Object object;
458 if (MARKERP (object) || INTEGERP (object))
459 return Qt;
460 return Qnil;
463 DEFUN ("natnump", Fnatnump, Snatnump, 1, 1, 0,
464 "Return t if OBJECT is a nonnegative integer.")
465 (object)
466 Lisp_Object object;
468 if (NATNUMP (object))
469 return Qt;
470 return Qnil;
473 DEFUN ("numberp", Fnumberp, Snumberp, 1, 1, 0,
474 "Return t if OBJECT is a number (floating point or integer).")
475 (object)
476 Lisp_Object object;
478 if (NUMBERP (object))
479 return Qt;
480 else
481 return Qnil;
484 DEFUN ("number-or-marker-p", Fnumber_or_marker_p,
485 Snumber_or_marker_p, 1, 1, 0,
486 "Return t if OBJECT is a number or a marker.")
487 (object)
488 Lisp_Object object;
490 if (NUMBERP (object) || MARKERP (object))
491 return Qt;
492 return Qnil;
495 DEFUN ("floatp", Ffloatp, Sfloatp, 1, 1, 0,
496 "Return t if OBJECT is a floating point number.")
497 (object)
498 Lisp_Object object;
500 if (FLOATP (object))
501 return Qt;
502 return Qnil;
506 /* Extract and set components of lists */
508 DEFUN ("car", Fcar, Scar, 1, 1, 0,
509 "Return the car of LIST. If arg is nil, return nil.\n\
510 Error if arg is not nil and not a cons cell. See also `car-safe'.")
511 (list)
512 register Lisp_Object list;
514 while (1)
516 if (CONSP (list))
517 return XCAR (list);
518 else if (EQ (list, Qnil))
519 return Qnil;
520 else
521 list = wrong_type_argument (Qlistp, list);
525 DEFUN ("car-safe", Fcar_safe, Scar_safe, 1, 1, 0,
526 "Return the car of OBJECT if it is a cons cell, or else nil.")
527 (object)
528 Lisp_Object object;
530 if (CONSP (object))
531 return XCAR (object);
532 else
533 return Qnil;
536 DEFUN ("cdr", Fcdr, Scdr, 1, 1, 0,
537 "Return the cdr of LIST. If arg is nil, return nil.\n\
538 Error if arg is not nil and not a cons cell. See also `cdr-safe'.")
540 (list)
541 register Lisp_Object list;
543 while (1)
545 if (CONSP (list))
546 return XCDR (list);
547 else if (EQ (list, Qnil))
548 return Qnil;
549 else
550 list = wrong_type_argument (Qlistp, list);
554 DEFUN ("cdr-safe", Fcdr_safe, Scdr_safe, 1, 1, 0,
555 "Return the cdr of OBJECT if it is a cons cell, or else nil.")
556 (object)
557 Lisp_Object object;
559 if (CONSP (object))
560 return XCDR (object);
561 else
562 return Qnil;
565 DEFUN ("setcar", Fsetcar, Ssetcar, 2, 2, 0,
566 "Set the car of CELL to be NEWCAR. Returns NEWCAR.")
567 (cell, newcar)
568 register Lisp_Object cell, newcar;
570 if (!CONSP (cell))
571 cell = wrong_type_argument (Qconsp, cell);
573 CHECK_IMPURE (cell);
574 XCAR (cell) = newcar;
575 return newcar;
578 DEFUN ("setcdr", Fsetcdr, Ssetcdr, 2, 2, 0,
579 "Set the cdr of CELL to be NEWCDR. Returns NEWCDR.")
580 (cell, newcdr)
581 register Lisp_Object cell, newcdr;
583 if (!CONSP (cell))
584 cell = wrong_type_argument (Qconsp, cell);
586 CHECK_IMPURE (cell);
587 XCDR (cell) = newcdr;
588 return newcdr;
591 /* Extract and set components of symbols */
593 DEFUN ("boundp", Fboundp, Sboundp, 1, 1, 0, "Return t if SYMBOL's value is not void.")
594 (symbol)
595 register Lisp_Object symbol;
597 Lisp_Object valcontents;
598 CHECK_SYMBOL (symbol, 0);
600 valcontents = XSYMBOL (symbol)->value;
602 if (BUFFER_LOCAL_VALUEP (valcontents)
603 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
604 valcontents = swap_in_symval_forwarding (symbol, valcontents);
606 return (EQ (valcontents, Qunbound) ? Qnil : Qt);
609 DEFUN ("fboundp", Ffboundp, Sfboundp, 1, 1, 0, "Return t if SYMBOL's function definition is not void.")
610 (symbol)
611 register Lisp_Object symbol;
613 CHECK_SYMBOL (symbol, 0);
614 return (EQ (XSYMBOL (symbol)->function, Qunbound) ? Qnil : Qt);
617 DEFUN ("makunbound", Fmakunbound, Smakunbound, 1, 1, 0, "Make SYMBOL's value be void.")
618 (symbol)
619 register Lisp_Object symbol;
621 CHECK_SYMBOL (symbol, 0);
622 if (NILP (symbol) || EQ (symbol, Qt)
623 || (XSYMBOL (symbol)->name->data[0] == ':'
624 && EQ (XSYMBOL (symbol)->obarray, initial_obarray)))
625 return Fsignal (Qsetting_constant, Fcons (symbol, Qnil));
626 Fset (symbol, Qunbound);
627 return symbol;
630 DEFUN ("fmakunbound", Ffmakunbound, Sfmakunbound, 1, 1, 0, "Make SYMBOL's function definition be void.")
631 (symbol)
632 register Lisp_Object symbol;
634 CHECK_SYMBOL (symbol, 0);
635 if (NILP (symbol) || EQ (symbol, Qt))
636 return Fsignal (Qsetting_constant, Fcons (symbol, Qnil));
637 XSYMBOL (symbol)->function = Qunbound;
638 return symbol;
641 DEFUN ("symbol-function", Fsymbol_function, Ssymbol_function, 1, 1, 0,
642 "Return SYMBOL's function definition. Error if that is void.")
643 (symbol)
644 register Lisp_Object symbol;
646 CHECK_SYMBOL (symbol, 0);
647 if (EQ (XSYMBOL (symbol)->function, Qunbound))
648 return Fsignal (Qvoid_function, Fcons (symbol, Qnil));
649 return XSYMBOL (symbol)->function;
652 DEFUN ("symbol-plist", Fsymbol_plist, Ssymbol_plist, 1, 1, 0, "Return SYMBOL's property list.")
653 (symbol)
654 register Lisp_Object symbol;
656 CHECK_SYMBOL (symbol, 0);
657 return XSYMBOL (symbol)->plist;
660 DEFUN ("symbol-name", Fsymbol_name, Ssymbol_name, 1, 1, 0, "Return SYMBOL's name, a string.")
661 (symbol)
662 register Lisp_Object symbol;
664 register Lisp_Object name;
666 CHECK_SYMBOL (symbol, 0);
667 XSETSTRING (name, XSYMBOL (symbol)->name);
668 return name;
671 DEFUN ("fset", Ffset, Sfset, 2, 2, 0,
672 "Set SYMBOL's function definition to DEFINITION, and return DEFINITION.")
673 (symbol, definition)
674 register Lisp_Object symbol, definition;
676 CHECK_SYMBOL (symbol, 0);
677 if (NILP (symbol) || EQ (symbol, Qt))
678 return Fsignal (Qsetting_constant, Fcons (symbol, Qnil));
679 if (!NILP (Vautoload_queue) && !EQ (XSYMBOL (symbol)->function, Qunbound))
680 Vautoload_queue = Fcons (Fcons (symbol, XSYMBOL (symbol)->function),
681 Vautoload_queue);
682 XSYMBOL (symbol)->function = definition;
683 /* Handle automatic advice activation */
684 if (CONSP (XSYMBOL (symbol)->plist) && !NILP (Fget (symbol, Qad_advice_info)))
686 call2 (Qad_activate_internal, symbol, Qnil);
687 definition = XSYMBOL (symbol)->function;
689 return definition;
692 DEFUN ("defalias", Fdefalias, Sdefalias, 2, 2, 0,
693 "Set SYMBOL's function definition to DEFINITION, and return DEFINITION.\n\
694 Associates the function with the current load file, if any.")
695 (symbol, definition)
696 register Lisp_Object symbol, definition;
698 definition = Ffset (symbol, definition);
699 LOADHIST_ATTACH (symbol);
700 return definition;
703 DEFUN ("setplist", Fsetplist, Ssetplist, 2, 2, 0,
704 "Set SYMBOL's property list to NEWVAL, and return NEWVAL.")
705 (symbol, newplist)
706 register Lisp_Object symbol, newplist;
708 CHECK_SYMBOL (symbol, 0);
709 XSYMBOL (symbol)->plist = newplist;
710 return newplist;
713 DEFUN ("subr-arity", Fsubr_arity, Ssubr_arity, 1, 1, 0,
714 "Return minimum and maximum number of args allowed for SUBR.\n\
715 SUBR must be a built-in function.\n\
716 The returned value is a pair (MIN . MAX). MIN is the minimum number\n\
717 of args. MAX is the maximum number or the symbol `many', for a\n\
718 function with `&rest' args, or `unevalled' for a special form.")
719 (subr)
720 Lisp_Object subr;
722 short minargs, maxargs;
723 if (!SUBRP (subr))
724 wrong_type_argument (Qsubrp, subr);
725 minargs = XSUBR (subr)->min_args;
726 maxargs = XSUBR (subr)->max_args;
727 if (maxargs == MANY)
728 return Fcons (make_number (minargs), Qmany);
729 else if (maxargs == UNEVALLED)
730 return Fcons (make_number (minargs), Qunevalled);
731 else
732 return Fcons (make_number (minargs), make_number (maxargs));
736 /* Getting and setting values of symbols */
738 /* Given the raw contents of a symbol value cell,
739 return the Lisp value of the symbol.
740 This does not handle buffer-local variables; use
741 swap_in_symval_forwarding for that. */
743 Lisp_Object
744 do_symval_forwarding (valcontents)
745 register Lisp_Object valcontents;
747 register Lisp_Object val;
748 int offset;
749 if (MISCP (valcontents))
750 switch (XMISCTYPE (valcontents))
752 case Lisp_Misc_Intfwd:
753 XSETINT (val, *XINTFWD (valcontents)->intvar);
754 return val;
756 case Lisp_Misc_Boolfwd:
757 return (*XBOOLFWD (valcontents)->boolvar ? Qt : Qnil);
759 case Lisp_Misc_Objfwd:
760 return *XOBJFWD (valcontents)->objvar;
762 case Lisp_Misc_Buffer_Objfwd:
763 offset = XBUFFER_OBJFWD (valcontents)->offset;
764 return PER_BUFFER_VALUE (current_buffer, offset);
766 case Lisp_Misc_Kboard_Objfwd:
767 offset = XKBOARD_OBJFWD (valcontents)->offset;
768 return *(Lisp_Object *)(offset + (char *)current_kboard);
770 return valcontents;
773 /* Store NEWVAL into SYMBOL, where VALCONTENTS is found in the value cell
774 of SYMBOL. If SYMBOL is buffer-local, VALCONTENTS should be the
775 buffer-independent contents of the value cell: forwarded just one
776 step past the buffer-localness. */
778 void
779 store_symval_forwarding (symbol, valcontents, newval)
780 Lisp_Object symbol;
781 register Lisp_Object valcontents, newval;
783 switch (SWITCH_ENUM_CAST (XTYPE (valcontents)))
785 case Lisp_Misc:
786 switch (XMISCTYPE (valcontents))
788 case Lisp_Misc_Intfwd:
789 CHECK_NUMBER (newval, 1);
790 *XINTFWD (valcontents)->intvar = XINT (newval);
791 if (*XINTFWD (valcontents)->intvar != XINT (newval))
792 error ("Value out of range for variable `%s'",
793 XSYMBOL (symbol)->name->data);
794 break;
796 case Lisp_Misc_Boolfwd:
797 *XBOOLFWD (valcontents)->boolvar = NILP (newval) ? 0 : 1;
798 break;
800 case Lisp_Misc_Objfwd:
801 *XOBJFWD (valcontents)->objvar = newval;
802 break;
804 case Lisp_Misc_Buffer_Objfwd:
806 int offset = XBUFFER_OBJFWD (valcontents)->offset;
807 Lisp_Object type;
809 type = PER_BUFFER_TYPE (offset);
810 if (XINT (type) == -1)
811 error ("Variable %s is read-only", XSYMBOL (symbol)->name->data);
813 if (! NILP (type) && ! NILP (newval)
814 && XTYPE (newval) != XINT (type))
815 buffer_slot_type_mismatch (offset);
817 PER_BUFFER_VALUE (current_buffer, offset) = newval;
819 break;
821 case Lisp_Misc_Kboard_Objfwd:
822 (*(Lisp_Object *)((char *)current_kboard
823 + XKBOARD_OBJFWD (valcontents)->offset))
824 = newval;
825 break;
827 default:
828 goto def;
830 break;
832 default:
833 def:
834 valcontents = XSYMBOL (symbol)->value;
835 if (BUFFER_LOCAL_VALUEP (valcontents)
836 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
837 XBUFFER_LOCAL_VALUE (valcontents)->realvalue = newval;
838 else
839 XSYMBOL (symbol)->value = newval;
843 /* Set up the buffer-local symbol SYMBOL for validity in the current buffer.
844 VALCONTENTS is the contents of its value cell,
845 which points to a struct Lisp_Buffer_Local_Value.
847 Return the value forwarded one step past the buffer-local stage.
848 This could be another forwarding pointer. */
850 static Lisp_Object
851 swap_in_symval_forwarding (symbol, valcontents)
852 Lisp_Object symbol, valcontents;
854 register Lisp_Object tem1;
855 tem1 = XBUFFER_LOCAL_VALUE (valcontents)->buffer;
857 if (NILP (tem1)
858 || current_buffer != XBUFFER (tem1)
859 || (XBUFFER_LOCAL_VALUE (valcontents)->check_frame
860 && ! EQ (selected_frame, XBUFFER_LOCAL_VALUE (valcontents)->frame)))
862 /* Unload the previously loaded binding. */
863 tem1 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
864 Fsetcdr (tem1,
865 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue));
866 /* Choose the new binding. */
867 tem1 = assq_no_quit (symbol, current_buffer->local_var_alist);
868 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 0;
869 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
870 if (NILP (tem1))
872 if (XBUFFER_LOCAL_VALUE (valcontents)->check_frame)
873 tem1 = assq_no_quit (symbol, XFRAME (selected_frame)->param_alist);
874 if (! NILP (tem1))
875 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 1;
876 else
877 tem1 = XBUFFER_LOCAL_VALUE (valcontents)->cdr;
879 else
880 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 1;
882 /* Load the new binding. */
883 XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr) = tem1;
884 XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer, current_buffer);
885 XBUFFER_LOCAL_VALUE (valcontents)->frame = selected_frame;
886 store_symval_forwarding (symbol,
887 XBUFFER_LOCAL_VALUE (valcontents)->realvalue,
888 Fcdr (tem1));
890 return XBUFFER_LOCAL_VALUE (valcontents)->realvalue;
893 /* Find the value of a symbol, returning Qunbound if it's not bound.
894 This is helpful for code which just wants to get a variable's value
895 if it has one, without signaling an error.
896 Note that it must not be possible to quit
897 within this function. Great care is required for this. */
899 Lisp_Object
900 find_symbol_value (symbol)
901 Lisp_Object symbol;
903 register Lisp_Object valcontents;
904 register Lisp_Object val;
905 CHECK_SYMBOL (symbol, 0);
906 valcontents = XSYMBOL (symbol)->value;
908 if (BUFFER_LOCAL_VALUEP (valcontents)
909 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
910 valcontents = swap_in_symval_forwarding (symbol, valcontents,
911 current_buffer);
913 if (MISCP (valcontents))
915 switch (XMISCTYPE (valcontents))
917 case Lisp_Misc_Intfwd:
918 XSETINT (val, *XINTFWD (valcontents)->intvar);
919 return val;
921 case Lisp_Misc_Boolfwd:
922 return (*XBOOLFWD (valcontents)->boolvar ? Qt : Qnil);
924 case Lisp_Misc_Objfwd:
925 return *XOBJFWD (valcontents)->objvar;
927 case Lisp_Misc_Buffer_Objfwd:
928 return PER_BUFFER_VALUE (current_buffer,
929 XBUFFER_OBJFWD (valcontents)->offset);
931 case Lisp_Misc_Kboard_Objfwd:
932 return *(Lisp_Object *)(XKBOARD_OBJFWD (valcontents)->offset
933 + (char *)current_kboard);
937 return valcontents;
940 DEFUN ("symbol-value", Fsymbol_value, Ssymbol_value, 1, 1, 0,
941 "Return SYMBOL's value. Error if that is void.")
942 (symbol)
943 Lisp_Object symbol;
945 Lisp_Object val;
947 val = find_symbol_value (symbol);
948 if (EQ (val, Qunbound))
949 return Fsignal (Qvoid_variable, Fcons (symbol, Qnil));
950 else
951 return val;
954 DEFUN ("set", Fset, Sset, 2, 2, 0,
955 "Set SYMBOL's value to NEWVAL, and return NEWVAL.")
956 (symbol, newval)
957 register Lisp_Object symbol, newval;
959 return set_internal (symbol, newval, current_buffer, 0);
962 /* Return 1 if SYMBOL currently has a let-binding
963 which was made in the buffer that is now current. */
965 static int
966 let_shadows_buffer_binding_p (symbol)
967 Lisp_Object symbol;
969 struct specbinding *p;
971 for (p = specpdl_ptr - 1; p >= specpdl; p--)
972 if (p->func == 0
973 && CONSP (p->symbol)
974 && EQ (symbol, XCAR (p->symbol))
975 && XBUFFER (XCDR (XCDR (p->symbol))) == current_buffer)
976 return 1;
978 return 0;
981 /* Store the value NEWVAL into SYMBOL.
982 If buffer-locality is an issue, BUF specifies which buffer to use.
983 (0 stands for the current buffer.)
985 If BINDFLAG is zero, then if this symbol is supposed to become
986 local in every buffer where it is set, then we make it local.
987 If BINDFLAG is nonzero, we don't do that. */
989 Lisp_Object
990 set_internal (symbol, newval, buf, bindflag)
991 register Lisp_Object symbol, newval;
992 struct buffer *buf;
993 int bindflag;
995 int voide = EQ (newval, Qunbound);
997 register Lisp_Object valcontents, tem1, current_alist_element;
999 if (buf == 0)
1000 buf = current_buffer;
1002 /* If restoring in a dead buffer, do nothing. */
1003 if (NILP (buf->name))
1004 return newval;
1006 CHECK_SYMBOL (symbol, 0);
1007 if (NILP (symbol) || EQ (symbol, Qt)
1008 || (XSYMBOL (symbol)->name->data[0] == ':'
1009 && EQ (XSYMBOL (symbol)->obarray, initial_obarray)
1010 && !EQ (newval, symbol)))
1011 return Fsignal (Qsetting_constant, Fcons (symbol, Qnil));
1012 valcontents = XSYMBOL (symbol)->value;
1014 if (BUFFER_OBJFWDP (valcontents))
1016 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1017 int idx = PER_BUFFER_IDX (offset);
1018 if (idx > 0
1019 && !bindflag
1020 && !let_shadows_buffer_binding_p (symbol))
1021 SET_PER_BUFFER_VALUE_P (buf, idx, 1);
1024 else if (BUFFER_LOCAL_VALUEP (valcontents)
1025 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1027 /* valcontents is a struct Lisp_Buffer_Local_Value. */
1029 /* What binding is loaded right now? */
1030 current_alist_element
1031 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1033 /* If the current buffer is not the buffer whose binding is
1034 loaded, or if there may be frame-local bindings and the frame
1035 isn't the right one, or if it's a Lisp_Buffer_Local_Value and
1036 the default binding is loaded, the loaded binding may be the
1037 wrong one. */
1038 if (!BUFFERP (XBUFFER_LOCAL_VALUE (valcontents)->buffer)
1039 || buf != XBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer)
1040 || (XBUFFER_LOCAL_VALUE (valcontents)->check_frame
1041 && !EQ (selected_frame, XBUFFER_LOCAL_VALUE (valcontents)->frame))
1042 || (BUFFER_LOCAL_VALUEP (valcontents)
1043 && EQ (XCAR (current_alist_element),
1044 current_alist_element)))
1046 /* The currently loaded binding is not necessarily valid.
1047 We need to unload it, and choose a new binding. */
1049 /* Write out `realvalue' to the old loaded binding. */
1050 Fsetcdr (current_alist_element,
1051 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue));
1053 /* Find the new binding. */
1054 tem1 = Fassq (symbol, buf->local_var_alist);
1055 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 1;
1056 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 0;
1058 if (NILP (tem1))
1060 /* This buffer still sees the default value. */
1062 /* If the variable is a Lisp_Some_Buffer_Local_Value,
1063 or if this is `let' rather than `set',
1064 make CURRENT-ALIST-ELEMENT point to itself,
1065 indicating that we're seeing the default value.
1066 Likewise if the variable has been let-bound
1067 in the current buffer. */
1068 if (bindflag || SOME_BUFFER_LOCAL_VALUEP (valcontents)
1069 || let_shadows_buffer_binding_p (symbol))
1071 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
1073 if (XBUFFER_LOCAL_VALUE (valcontents)->check_frame)
1074 tem1 = Fassq (symbol,
1075 XFRAME (selected_frame)->param_alist);
1077 if (! NILP (tem1))
1078 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 1;
1079 else
1080 tem1 = XBUFFER_LOCAL_VALUE (valcontents)->cdr;
1082 /* If it's a Lisp_Buffer_Local_Value, being set not bound,
1083 and we're not within a let that was made for this buffer,
1084 create a new buffer-local binding for the variable.
1085 That means, give this buffer a new assoc for a local value
1086 and load that binding. */
1087 else
1089 tem1 = Fcons (symbol, Fcdr (current_alist_element));
1090 buf->local_var_alist
1091 = Fcons (tem1, buf->local_var_alist);
1095 /* Record which binding is now loaded. */
1096 XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr)
1097 = tem1;
1099 /* Set `buffer' and `frame' slots for thebinding now loaded. */
1100 XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer, buf);
1101 XBUFFER_LOCAL_VALUE (valcontents)->frame = selected_frame;
1103 valcontents = XBUFFER_LOCAL_VALUE (valcontents)->realvalue;
1106 /* If storing void (making the symbol void), forward only through
1107 buffer-local indicator, not through Lisp_Objfwd, etc. */
1108 if (voide)
1109 store_symval_forwarding (symbol, Qnil, newval);
1110 else
1111 store_symval_forwarding (symbol, valcontents, newval);
1113 return newval;
1116 /* Access or set a buffer-local symbol's default value. */
1118 /* Return the default value of SYMBOL, but don't check for voidness.
1119 Return Qunbound if it is void. */
1121 Lisp_Object
1122 default_value (symbol)
1123 Lisp_Object symbol;
1125 register Lisp_Object valcontents;
1127 CHECK_SYMBOL (symbol, 0);
1128 valcontents = XSYMBOL (symbol)->value;
1130 /* For a built-in buffer-local variable, get the default value
1131 rather than letting do_symval_forwarding get the current value. */
1132 if (BUFFER_OBJFWDP (valcontents))
1134 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1135 if (PER_BUFFER_IDX (offset) != 0)
1136 return PER_BUFFER_DEFAULT (offset);
1139 /* Handle user-created local variables. */
1140 if (BUFFER_LOCAL_VALUEP (valcontents)
1141 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1143 /* If var is set up for a buffer that lacks a local value for it,
1144 the current value is nominally the default value.
1145 But the `realvalue' slot may be more up to date, since
1146 ordinary setq stores just that slot. So use that. */
1147 Lisp_Object current_alist_element, alist_element_car;
1148 current_alist_element
1149 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1150 alist_element_car = XCAR (current_alist_element);
1151 if (EQ (alist_element_car, current_alist_element))
1152 return do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue);
1153 else
1154 return XCDR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1156 /* For other variables, get the current value. */
1157 return do_symval_forwarding (valcontents);
1160 DEFUN ("default-boundp", Fdefault_boundp, Sdefault_boundp, 1, 1, 0,
1161 "Return t if SYMBOL has a non-void default value.\n\
1162 This is the value that is seen in buffers that do not have their own values\n\
1163 for this variable.")
1164 (symbol)
1165 Lisp_Object symbol;
1167 register Lisp_Object value;
1169 value = default_value (symbol);
1170 return (EQ (value, Qunbound) ? Qnil : Qt);
1173 DEFUN ("default-value", Fdefault_value, Sdefault_value, 1, 1, 0,
1174 "Return SYMBOL's default value.\n\
1175 This is the value that is seen in buffers that do not have their own values\n\
1176 for this variable. The default value is meaningful for variables with\n\
1177 local bindings in certain buffers.")
1178 (symbol)
1179 Lisp_Object symbol;
1181 register Lisp_Object value;
1183 value = default_value (symbol);
1184 if (EQ (value, Qunbound))
1185 return Fsignal (Qvoid_variable, Fcons (symbol, Qnil));
1186 return value;
1189 DEFUN ("set-default", Fset_default, Sset_default, 2, 2, 0,
1190 "Set SYMBOL's default value to VAL. SYMBOL and VAL are evaluated.\n\
1191 The default value is seen in buffers that do not have their own values\n\
1192 for this variable.")
1193 (symbol, value)
1194 Lisp_Object symbol, value;
1196 register Lisp_Object valcontents, current_alist_element, alist_element_buffer;
1198 CHECK_SYMBOL (symbol, 0);
1199 valcontents = XSYMBOL (symbol)->value;
1201 /* Handle variables like case-fold-search that have special slots
1202 in the buffer. Make them work apparently like Lisp_Buffer_Local_Value
1203 variables. */
1204 if (BUFFER_OBJFWDP (valcontents))
1206 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1207 int idx = PER_BUFFER_IDX (offset);
1209 PER_BUFFER_DEFAULT (offset) = value;
1211 /* If this variable is not always local in all buffers,
1212 set it in the buffers that don't nominally have a local value. */
1213 if (idx > 0)
1215 struct buffer *b;
1217 for (b = all_buffers; b; b = b->next)
1218 if (!PER_BUFFER_VALUE_P (b, idx))
1219 PER_BUFFER_VALUE (b, offset) = value;
1221 return value;
1224 if (!BUFFER_LOCAL_VALUEP (valcontents)
1225 && !SOME_BUFFER_LOCAL_VALUEP (valcontents))
1226 return Fset (symbol, value);
1228 /* Store new value into the DEFAULT-VALUE slot. */
1229 XCDR (XBUFFER_LOCAL_VALUE (valcontents)->cdr) = value;
1231 /* If the default binding is now loaded, set the REALVALUE slot too. */
1232 current_alist_element
1233 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1234 alist_element_buffer = Fcar (current_alist_element);
1235 if (EQ (alist_element_buffer, current_alist_element))
1236 store_symval_forwarding (symbol, XBUFFER_LOCAL_VALUE (valcontents)->realvalue,
1237 value);
1239 return value;
1242 DEFUN ("setq-default", Fsetq_default, Ssetq_default, 2, UNEVALLED, 0,
1243 "Set the default value of variable VAR to VALUE.\n\
1244 VAR, the variable name, is literal (not evaluated);\n\
1245 VALUE is an expression and it is evaluated.\n\
1246 The default value of a variable is seen in buffers\n\
1247 that do not have their own values for the variable.\n\
1249 More generally, you can use multiple variables and values, as in\n\
1250 (setq-default SYMBOL VALUE SYMBOL VALUE...)\n\
1251 This sets each SYMBOL's default value to the corresponding VALUE.\n\
1252 The VALUE for the Nth SYMBOL can refer to the new default values\n\
1253 of previous SYMs.")
1254 (args)
1255 Lisp_Object args;
1257 register Lisp_Object args_left;
1258 register Lisp_Object val, symbol;
1259 struct gcpro gcpro1;
1261 if (NILP (args))
1262 return Qnil;
1264 args_left = args;
1265 GCPRO1 (args);
1269 val = Feval (Fcar (Fcdr (args_left)));
1270 symbol = Fcar (args_left);
1271 Fset_default (symbol, val);
1272 args_left = Fcdr (Fcdr (args_left));
1274 while (!NILP (args_left));
1276 UNGCPRO;
1277 return val;
1280 /* Lisp functions for creating and removing buffer-local variables. */
1282 DEFUN ("make-variable-buffer-local", Fmake_variable_buffer_local, Smake_variable_buffer_local,
1283 1, 1, "vMake Variable Buffer Local: ",
1284 "Make VARIABLE become buffer-local whenever it is set.\n\
1285 At any time, the value for the current buffer is in effect,\n\
1286 unless the variable has never been set in this buffer,\n\
1287 in which case the default value is in effect.\n\
1288 Note that binding the variable with `let', or setting it while\n\
1289 a `let'-style binding made in this buffer is in effect,\n\
1290 does not make the variable buffer-local.\n\
1292 The function `default-value' gets the default value and `set-default' sets it.")
1293 (variable)
1294 register Lisp_Object variable;
1296 register Lisp_Object tem, valcontents, newval;
1298 CHECK_SYMBOL (variable, 0);
1300 valcontents = XSYMBOL (variable)->value;
1301 if (EQ (variable, Qnil) || EQ (variable, Qt) || KBOARD_OBJFWDP (valcontents))
1302 error ("Symbol %s may not be buffer-local", XSYMBOL (variable)->name->data);
1304 if (BUFFER_LOCAL_VALUEP (valcontents) || BUFFER_OBJFWDP (valcontents))
1305 return variable;
1306 if (SOME_BUFFER_LOCAL_VALUEP (valcontents))
1308 XMISCTYPE (XSYMBOL (variable)->value) = Lisp_Misc_Buffer_Local_Value;
1309 return variable;
1311 if (EQ (valcontents, Qunbound))
1312 XSYMBOL (variable)->value = Qnil;
1313 tem = Fcons (Qnil, Fsymbol_value (variable));
1314 XCAR (tem) = tem;
1315 newval = allocate_misc ();
1316 XMISCTYPE (newval) = Lisp_Misc_Buffer_Local_Value;
1317 XBUFFER_LOCAL_VALUE (newval)->realvalue = XSYMBOL (variable)->value;
1318 XBUFFER_LOCAL_VALUE (newval)->buffer = Fcurrent_buffer ();
1319 XBUFFER_LOCAL_VALUE (newval)->frame = Qnil;
1320 XBUFFER_LOCAL_VALUE (newval)->found_for_buffer = 0;
1321 XBUFFER_LOCAL_VALUE (newval)->found_for_frame = 0;
1322 XBUFFER_LOCAL_VALUE (newval)->check_frame = 0;
1323 XBUFFER_LOCAL_VALUE (newval)->cdr = tem;
1324 XSYMBOL (variable)->value = newval;
1325 return variable;
1328 DEFUN ("make-local-variable", Fmake_local_variable, Smake_local_variable,
1329 1, 1, "vMake Local Variable: ",
1330 "Make VARIABLE have a separate value in the current buffer.\n\
1331 Other buffers will continue to share a common default value.\n\
1332 \(The buffer-local value of VARIABLE starts out as the same value\n\
1333 VARIABLE previously had. If VARIABLE was void, it remains void.\)\n\
1334 See also `make-variable-buffer-local'.\n\
1336 If the variable is already arranged to become local when set,\n\
1337 this function causes a local value to exist for this buffer,\n\
1338 just as setting the variable would do.\n\
1340 This function returns VARIABLE, and therefore\n\
1341 (set (make-local-variable 'VARIABLE) VALUE-EXP)\n\
1342 works.\n\
1344 Do not use `make-local-variable' to make a hook variable buffer-local.\n\
1345 Use `make-local-hook' instead.")
1346 (variable)
1347 register Lisp_Object variable;
1349 register Lisp_Object tem, valcontents;
1351 CHECK_SYMBOL (variable, 0);
1353 valcontents = XSYMBOL (variable)->value;
1354 if (EQ (variable, Qnil) || EQ (variable, Qt) || KBOARD_OBJFWDP (valcontents))
1355 error ("Symbol %s may not be buffer-local", XSYMBOL (variable)->name->data);
1357 if (BUFFER_LOCAL_VALUEP (valcontents) || BUFFER_OBJFWDP (valcontents))
1359 tem = Fboundp (variable);
1361 /* Make sure the symbol has a local value in this particular buffer,
1362 by setting it to the same value it already has. */
1363 Fset (variable, (EQ (tem, Qt) ? Fsymbol_value (variable) : Qunbound));
1364 return variable;
1366 /* Make sure symbol is set up to hold per-buffer values. */
1367 if (!SOME_BUFFER_LOCAL_VALUEP (valcontents))
1369 Lisp_Object newval;
1370 tem = Fcons (Qnil, do_symval_forwarding (valcontents));
1371 XCAR (tem) = tem;
1372 newval = allocate_misc ();
1373 XMISCTYPE (newval) = Lisp_Misc_Some_Buffer_Local_Value;
1374 XBUFFER_LOCAL_VALUE (newval)->realvalue = XSYMBOL (variable)->value;
1375 XBUFFER_LOCAL_VALUE (newval)->buffer = Qnil;
1376 XBUFFER_LOCAL_VALUE (newval)->frame = Qnil;
1377 XBUFFER_LOCAL_VALUE (newval)->found_for_buffer = 0;
1378 XBUFFER_LOCAL_VALUE (newval)->found_for_frame = 0;
1379 XBUFFER_LOCAL_VALUE (newval)->check_frame = 0;
1380 XBUFFER_LOCAL_VALUE (newval)->cdr = tem;
1381 XSYMBOL (variable)->value = newval;
1383 /* Make sure this buffer has its own value of symbol. */
1384 tem = Fassq (variable, current_buffer->local_var_alist);
1385 if (NILP (tem))
1387 /* Swap out any local binding for some other buffer, and make
1388 sure the current value is permanently recorded, if it's the
1389 default value. */
1390 find_symbol_value (variable);
1392 current_buffer->local_var_alist
1393 = Fcons (Fcons (variable, XCDR (XBUFFER_LOCAL_VALUE (XSYMBOL (variable)->value)->cdr)),
1394 current_buffer->local_var_alist);
1396 /* Make sure symbol does not think it is set up for this buffer;
1397 force it to look once again for this buffer's value. */
1399 Lisp_Object *pvalbuf;
1401 valcontents = XSYMBOL (variable)->value;
1403 pvalbuf = &XBUFFER_LOCAL_VALUE (valcontents)->buffer;
1404 if (current_buffer == XBUFFER (*pvalbuf))
1405 *pvalbuf = Qnil;
1406 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
1410 /* If the symbol forwards into a C variable, then load the binding
1411 for this buffer now. If C code modifies the variable before we
1412 load the binding in, then that new value will clobber the default
1413 binding the next time we unload it. */
1414 valcontents = XBUFFER_LOCAL_VALUE (XSYMBOL (variable)->value)->realvalue;
1415 if (INTFWDP (valcontents) || BOOLFWDP (valcontents) || OBJFWDP (valcontents))
1416 swap_in_symval_forwarding (variable, XSYMBOL (variable)->value);
1418 return variable;
1421 DEFUN ("kill-local-variable", Fkill_local_variable, Skill_local_variable,
1422 1, 1, "vKill Local Variable: ",
1423 "Make VARIABLE no longer have a separate value in the current buffer.\n\
1424 From now on the default value will apply in this buffer.")
1425 (variable)
1426 register Lisp_Object variable;
1428 register Lisp_Object tem, valcontents;
1430 CHECK_SYMBOL (variable, 0);
1432 valcontents = XSYMBOL (variable)->value;
1434 if (BUFFER_OBJFWDP (valcontents))
1436 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1437 int idx = PER_BUFFER_IDX (offset);
1439 if (idx > 0)
1441 SET_PER_BUFFER_VALUE_P (current_buffer, idx, 0);
1442 PER_BUFFER_VALUE (current_buffer, offset)
1443 = PER_BUFFER_DEFAULT (offset);
1445 return variable;
1448 if (!BUFFER_LOCAL_VALUEP (valcontents)
1449 && !SOME_BUFFER_LOCAL_VALUEP (valcontents))
1450 return variable;
1452 /* Get rid of this buffer's alist element, if any. */
1454 tem = Fassq (variable, current_buffer->local_var_alist);
1455 if (!NILP (tem))
1456 current_buffer->local_var_alist
1457 = Fdelq (tem, current_buffer->local_var_alist);
1459 /* If the symbol is set up with the current buffer's binding
1460 loaded, recompute its value. We have to do it now, or else
1461 forwarded objects won't work right. */
1463 Lisp_Object *pvalbuf;
1464 valcontents = XSYMBOL (variable)->value;
1465 pvalbuf = &XBUFFER_LOCAL_VALUE (valcontents)->buffer;
1466 if (current_buffer == XBUFFER (*pvalbuf))
1468 *pvalbuf = Qnil;
1469 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
1470 find_symbol_value (variable);
1474 return variable;
1477 /* Lisp functions for creating and removing buffer-local variables. */
1479 DEFUN ("make-variable-frame-local", Fmake_variable_frame_local, Smake_variable_frame_local,
1480 1, 1, "vMake Variable Frame Local: ",
1481 "Enable VARIABLE to have frame-local bindings.\n\
1482 When a frame-local binding exists in the current frame,\n\
1483 it is in effect whenever the current buffer has no buffer-local binding.\n\
1484 A frame-local binding is actual a frame parameter value;\n\
1485 thus, any given frame has a local binding for VARIABLE\n\
1486 if it has a value for the frame parameter named VARIABLE.\n\
1487 See `modify-frame-parameters'.")
1488 (variable)
1489 register Lisp_Object variable;
1491 register Lisp_Object tem, valcontents, newval;
1493 CHECK_SYMBOL (variable, 0);
1495 valcontents = XSYMBOL (variable)->value;
1496 if (EQ (variable, Qnil) || EQ (variable, Qt) || KBOARD_OBJFWDP (valcontents)
1497 || BUFFER_OBJFWDP (valcontents))
1498 error ("Symbol %s may not be frame-local", XSYMBOL (variable)->name->data);
1500 if (BUFFER_LOCAL_VALUEP (valcontents)
1501 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1503 XBUFFER_LOCAL_VALUE (valcontents)->check_frame = 1;
1504 return variable;
1507 if (EQ (valcontents, Qunbound))
1508 XSYMBOL (variable)->value = Qnil;
1509 tem = Fcons (Qnil, Fsymbol_value (variable));
1510 XCAR (tem) = tem;
1511 newval = allocate_misc ();
1512 XMISCTYPE (newval) = Lisp_Misc_Some_Buffer_Local_Value;
1513 XBUFFER_LOCAL_VALUE (newval)->realvalue = XSYMBOL (variable)->value;
1514 XBUFFER_LOCAL_VALUE (newval)->buffer = Qnil;
1515 XBUFFER_LOCAL_VALUE (newval)->frame = Qnil;
1516 XBUFFER_LOCAL_VALUE (newval)->found_for_buffer = 0;
1517 XBUFFER_LOCAL_VALUE (newval)->found_for_frame = 0;
1518 XBUFFER_LOCAL_VALUE (newval)->check_frame = 1;
1519 XBUFFER_LOCAL_VALUE (newval)->cdr = tem;
1520 XSYMBOL (variable)->value = newval;
1521 return variable;
1524 DEFUN ("local-variable-p", Flocal_variable_p, Slocal_variable_p,
1525 1, 2, 0,
1526 "Non-nil if VARIABLE has a local binding in buffer BUFFER.\n\
1527 BUFFER defaults to the current buffer.")
1528 (variable, buffer)
1529 register Lisp_Object variable, buffer;
1531 Lisp_Object valcontents;
1532 register struct buffer *buf;
1534 if (NILP (buffer))
1535 buf = current_buffer;
1536 else
1538 CHECK_BUFFER (buffer, 0);
1539 buf = XBUFFER (buffer);
1542 CHECK_SYMBOL (variable, 0);
1544 valcontents = XSYMBOL (variable)->value;
1545 if (BUFFER_LOCAL_VALUEP (valcontents)
1546 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1548 Lisp_Object tail, elt;
1549 for (tail = buf->local_var_alist; CONSP (tail); tail = XCDR (tail))
1551 elt = XCAR (tail);
1552 if (EQ (variable, XCAR (elt)))
1553 return Qt;
1556 if (BUFFER_OBJFWDP (valcontents))
1558 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1559 int idx = PER_BUFFER_IDX (offset);
1560 if (idx == -1 || PER_BUFFER_VALUE_P (buf, idx))
1561 return Qt;
1563 return Qnil;
1566 DEFUN ("local-variable-if-set-p", Flocal_variable_if_set_p, Slocal_variable_if_set_p,
1567 1, 2, 0,
1568 "Non-nil if VARIABLE will be local in buffer BUFFER if it is set there.\n\
1569 BUFFER defaults to the current buffer.")
1570 (variable, buffer)
1571 register Lisp_Object variable, buffer;
1573 Lisp_Object valcontents;
1574 register struct buffer *buf;
1576 if (NILP (buffer))
1577 buf = current_buffer;
1578 else
1580 CHECK_BUFFER (buffer, 0);
1581 buf = XBUFFER (buffer);
1584 CHECK_SYMBOL (variable, 0);
1586 valcontents = XSYMBOL (variable)->value;
1588 /* This means that make-variable-buffer-local was done. */
1589 if (BUFFER_LOCAL_VALUEP (valcontents))
1590 return Qt;
1591 /* All these slots become local if they are set. */
1592 if (BUFFER_OBJFWDP (valcontents))
1593 return Qt;
1594 if (SOME_BUFFER_LOCAL_VALUEP (valcontents))
1596 Lisp_Object tail, elt;
1597 for (tail = buf->local_var_alist; CONSP (tail); tail = XCDR (tail))
1599 elt = XCAR (tail);
1600 if (EQ (variable, XCAR (elt)))
1601 return Qt;
1604 return Qnil;
1607 /* Find the function at the end of a chain of symbol function indirections. */
1609 /* If OBJECT is a symbol, find the end of its function chain and
1610 return the value found there. If OBJECT is not a symbol, just
1611 return it. If there is a cycle in the function chain, signal a
1612 cyclic-function-indirection error.
1614 This is like Findirect_function, except that it doesn't signal an
1615 error if the chain ends up unbound. */
1616 Lisp_Object
1617 indirect_function (object)
1618 register Lisp_Object object;
1620 Lisp_Object tortoise, hare;
1622 hare = tortoise = object;
1624 for (;;)
1626 if (!SYMBOLP (hare) || EQ (hare, Qunbound))
1627 break;
1628 hare = XSYMBOL (hare)->function;
1629 if (!SYMBOLP (hare) || EQ (hare, Qunbound))
1630 break;
1631 hare = XSYMBOL (hare)->function;
1633 tortoise = XSYMBOL (tortoise)->function;
1635 if (EQ (hare, tortoise))
1636 Fsignal (Qcyclic_function_indirection, Fcons (object, Qnil));
1639 return hare;
1642 DEFUN ("indirect-function", Findirect_function, Sindirect_function, 1, 1, 0,
1643 "Return the function at the end of OBJECT's function chain.\n\
1644 If OBJECT is a symbol, follow all function indirections and return the final\n\
1645 function binding.\n\
1646 If OBJECT is not a symbol, just return it.\n\
1647 Signal a void-function error if the final symbol is unbound.\n\
1648 Signal a cyclic-function-indirection error if there is a loop in the\n\
1649 function chain of symbols.")
1650 (object)
1651 register Lisp_Object object;
1653 Lisp_Object result;
1655 result = indirect_function (object);
1657 if (EQ (result, Qunbound))
1658 return Fsignal (Qvoid_function, Fcons (object, Qnil));
1659 return result;
1662 /* Extract and set vector and string elements */
1664 DEFUN ("aref", Faref, Saref, 2, 2, 0,
1665 "Return the element of ARRAY at index IDX.\n\
1666 ARRAY may be a vector, a string, a char-table, a bool-vector,\n\
1667 or a byte-code object. IDX starts at 0.")
1668 (array, idx)
1669 register Lisp_Object array;
1670 Lisp_Object idx;
1672 register int idxval;
1674 CHECK_NUMBER (idx, 1);
1675 idxval = XINT (idx);
1676 if (STRINGP (array))
1678 int c, idxval_byte;
1680 if (idxval < 0 || idxval >= XSTRING (array)->size)
1681 args_out_of_range (array, idx);
1682 if (! STRING_MULTIBYTE (array))
1683 return make_number ((unsigned char) XSTRING (array)->data[idxval]);
1684 idxval_byte = string_char_to_byte (array, idxval);
1686 c = STRING_CHAR (&XSTRING (array)->data[idxval_byte],
1687 STRING_BYTES (XSTRING (array)) - idxval_byte);
1688 return make_number (c);
1690 else if (BOOL_VECTOR_P (array))
1692 int val;
1694 if (idxval < 0 || idxval >= XBOOL_VECTOR (array)->size)
1695 args_out_of_range (array, idx);
1697 val = (unsigned char) XBOOL_VECTOR (array)->data[idxval / BITS_PER_CHAR];
1698 return (val & (1 << (idxval % BITS_PER_CHAR)) ? Qt : Qnil);
1700 else if (CHAR_TABLE_P (array))
1702 Lisp_Object val;
1704 if (idxval < 0)
1705 args_out_of_range (array, idx);
1706 if (idxval < CHAR_TABLE_ORDINARY_SLOTS)
1708 /* For ASCII and 8-bit European characters, the element is
1709 stored in the top table. */
1710 val = XCHAR_TABLE (array)->contents[idxval];
1711 if (NILP (val))
1712 val = XCHAR_TABLE (array)->defalt;
1713 while (NILP (val)) /* Follow parents until we find some value. */
1715 array = XCHAR_TABLE (array)->parent;
1716 if (NILP (array))
1717 return Qnil;
1718 val = XCHAR_TABLE (array)->contents[idxval];
1719 if (NILP (val))
1720 val = XCHAR_TABLE (array)->defalt;
1722 return val;
1724 else
1726 int code[4], i;
1727 Lisp_Object sub_table;
1729 SPLIT_CHAR (idxval, code[0], code[1], code[2]);
1730 if (code[1] < 32) code[1] = -1;
1731 else if (code[2] < 32) code[2] = -1;
1733 /* Here, the possible range of CODE[0] (== charset ID) is
1734 128..MAX_CHARSET. Since the top level char table contains
1735 data for multibyte characters after 256th element, we must
1736 increment CODE[0] by 128 to get a correct index. */
1737 code[0] += 128;
1738 code[3] = -1; /* anchor */
1740 try_parent_char_table:
1741 sub_table = array;
1742 for (i = 0; code[i] >= 0; i++)
1744 val = XCHAR_TABLE (sub_table)->contents[code[i]];
1745 if (SUB_CHAR_TABLE_P (val))
1746 sub_table = val;
1747 else
1749 if (NILP (val))
1750 val = XCHAR_TABLE (sub_table)->defalt;
1751 if (NILP (val))
1753 array = XCHAR_TABLE (array)->parent;
1754 if (!NILP (array))
1755 goto try_parent_char_table;
1757 return val;
1760 /* Here, VAL is a sub char table. We try the default value
1761 and parent. */
1762 val = XCHAR_TABLE (val)->defalt;
1763 if (NILP (val))
1765 array = XCHAR_TABLE (array)->parent;
1766 if (!NILP (array))
1767 goto try_parent_char_table;
1769 return val;
1772 else
1774 int size;
1775 if (VECTORP (array))
1776 size = XVECTOR (array)->size;
1777 else if (COMPILEDP (array))
1778 size = XVECTOR (array)->size & PSEUDOVECTOR_SIZE_MASK;
1779 else
1780 wrong_type_argument (Qarrayp, array);
1782 if (idxval < 0 || idxval >= size)
1783 args_out_of_range (array, idx);
1784 return XVECTOR (array)->contents[idxval];
1788 DEFUN ("aset", Faset, Saset, 3, 3, 0,
1789 "Store into the element of ARRAY at index IDX the value NEWELT.\n\
1790 ARRAY may be a vector, a string, a char-table or a bool-vector.\n\
1791 IDX starts at 0.")
1792 (array, idx, newelt)
1793 register Lisp_Object array;
1794 Lisp_Object idx, newelt;
1796 register int idxval;
1798 CHECK_NUMBER (idx, 1);
1799 idxval = XINT (idx);
1800 if (!VECTORP (array) && !STRINGP (array) && !BOOL_VECTOR_P (array)
1801 && ! CHAR_TABLE_P (array))
1802 array = wrong_type_argument (Qarrayp, array);
1803 CHECK_IMPURE (array);
1805 if (VECTORP (array))
1807 if (idxval < 0 || idxval >= XVECTOR (array)->size)
1808 args_out_of_range (array, idx);
1809 XVECTOR (array)->contents[idxval] = newelt;
1811 else if (BOOL_VECTOR_P (array))
1813 int val;
1815 if (idxval < 0 || idxval >= XBOOL_VECTOR (array)->size)
1816 args_out_of_range (array, idx);
1818 val = (unsigned char) XBOOL_VECTOR (array)->data[idxval / BITS_PER_CHAR];
1820 if (! NILP (newelt))
1821 val |= 1 << (idxval % BITS_PER_CHAR);
1822 else
1823 val &= ~(1 << (idxval % BITS_PER_CHAR));
1824 XBOOL_VECTOR (array)->data[idxval / BITS_PER_CHAR] = val;
1826 else if (CHAR_TABLE_P (array))
1828 if (idxval < 0)
1829 args_out_of_range (array, idx);
1830 if (idxval < CHAR_TABLE_ORDINARY_SLOTS)
1831 XCHAR_TABLE (array)->contents[idxval] = newelt;
1832 else
1834 int code[4], i;
1835 Lisp_Object val;
1837 SPLIT_CHAR (idxval, code[0], code[1], code[2]);
1838 if (code[1] < 32) code[1] = -1;
1839 else if (code[2] < 32) code[2] = -1;
1841 /* See the comment of the corresponding part in Faref. */
1842 code[0] += 128;
1843 code[3] = -1; /* anchor */
1844 for (i = 0; code[i + 1] >= 0; i++)
1846 val = XCHAR_TABLE (array)->contents[code[i]];
1847 if (SUB_CHAR_TABLE_P (val))
1848 array = val;
1849 else
1851 Lisp_Object temp;
1853 /* VAL is a leaf. Create a sub char table with the
1854 default value VAL or XCHAR_TABLE (array)->defalt
1855 and look into it. */
1857 temp = make_sub_char_table (NILP (val)
1858 ? XCHAR_TABLE (array)->defalt
1859 : val);
1860 XCHAR_TABLE (array)->contents[code[i]] = temp;
1861 array = temp;
1864 XCHAR_TABLE (array)->contents[code[i]] = newelt;
1867 else if (STRING_MULTIBYTE (array))
1869 int idxval_byte, new_len, actual_len;
1870 int prev_byte;
1871 unsigned char *p, workbuf[MAX_MULTIBYTE_LENGTH], *str = workbuf;
1873 if (idxval < 0 || idxval >= XSTRING (array)->size)
1874 args_out_of_range (array, idx);
1876 idxval_byte = string_char_to_byte (array, idxval);
1877 p = &XSTRING (array)->data[idxval_byte];
1879 actual_len = MULTIBYTE_FORM_LENGTH (p, STRING_BYTES (XSTRING (array)));
1880 CHECK_NUMBER (newelt, 2);
1881 new_len = CHAR_STRING (XINT (newelt), str);
1882 if (actual_len != new_len)
1883 error ("Attempt to change byte length of a string");
1885 /* We can't accept a change causing byte combining. */
1886 if (!ASCII_BYTE_P (*str)
1887 && ((idxval > 0 && !CHAR_HEAD_P (*str)
1888 && (prev_byte = string_char_to_byte (array, idxval - 1),
1889 BYTES_BY_CHAR_HEAD (XSTRING (array)->data[prev_byte])
1890 > idxval_byte - prev_byte))
1891 || (idxval < XSTRING (array)->size - 1
1892 && !CHAR_HEAD_P (p[actual_len])
1893 && new_len < BYTES_BY_CHAR_HEAD (*str))))
1894 error ("Attempt to change char length of a string");
1895 while (new_len--)
1896 *p++ = *str++;
1898 else
1900 if (idxval < 0 || idxval >= XSTRING (array)->size)
1901 args_out_of_range (array, idx);
1902 CHECK_NUMBER (newelt, 2);
1903 XSTRING (array)->data[idxval] = XINT (newelt);
1906 return newelt;
1909 /* Arithmetic functions */
1911 enum comparison { equal, notequal, less, grtr, less_or_equal, grtr_or_equal };
1913 Lisp_Object
1914 arithcompare (num1, num2, comparison)
1915 Lisp_Object num1, num2;
1916 enum comparison comparison;
1918 double f1, f2;
1919 int floatp = 0;
1921 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num1, 0);
1922 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num2, 0);
1924 if (FLOATP (num1) || FLOATP (num2))
1926 floatp = 1;
1927 f1 = (FLOATP (num1)) ? XFLOAT_DATA (num1) : XINT (num1);
1928 f2 = (FLOATP (num2)) ? XFLOAT_DATA (num2) : XINT (num2);
1931 switch (comparison)
1933 case equal:
1934 if (floatp ? f1 == f2 : XINT (num1) == XINT (num2))
1935 return Qt;
1936 return Qnil;
1938 case notequal:
1939 if (floatp ? f1 != f2 : XINT (num1) != XINT (num2))
1940 return Qt;
1941 return Qnil;
1943 case less:
1944 if (floatp ? f1 < f2 : XINT (num1) < XINT (num2))
1945 return Qt;
1946 return Qnil;
1948 case less_or_equal:
1949 if (floatp ? f1 <= f2 : XINT (num1) <= XINT (num2))
1950 return Qt;
1951 return Qnil;
1953 case grtr:
1954 if (floatp ? f1 > f2 : XINT (num1) > XINT (num2))
1955 return Qt;
1956 return Qnil;
1958 case grtr_or_equal:
1959 if (floatp ? f1 >= f2 : XINT (num1) >= XINT (num2))
1960 return Qt;
1961 return Qnil;
1963 default:
1964 abort ();
1968 DEFUN ("=", Feqlsign, Seqlsign, 2, 2, 0,
1969 "Return t if two args, both numbers or markers, are equal.")
1970 (num1, num2)
1971 register Lisp_Object num1, num2;
1973 return arithcompare (num1, num2, equal);
1976 DEFUN ("<", Flss, Slss, 2, 2, 0,
1977 "Return t if first arg is less than second arg. Both must be numbers or markers.")
1978 (num1, num2)
1979 register Lisp_Object num1, num2;
1981 return arithcompare (num1, num2, less);
1984 DEFUN (">", Fgtr, Sgtr, 2, 2, 0,
1985 "Return t if first arg is greater than second arg. Both must be numbers or markers.")
1986 (num1, num2)
1987 register Lisp_Object num1, num2;
1989 return arithcompare (num1, num2, grtr);
1992 DEFUN ("<=", Fleq, Sleq, 2, 2, 0,
1993 "Return t if first arg is less than or equal to second arg.\n\
1994 Both must be numbers or markers.")
1995 (num1, num2)
1996 register Lisp_Object num1, num2;
1998 return arithcompare (num1, num2, less_or_equal);
2001 DEFUN (">=", Fgeq, Sgeq, 2, 2, 0,
2002 "Return t if first arg is greater than or equal to second arg.\n\
2003 Both must be numbers or markers.")
2004 (num1, num2)
2005 register Lisp_Object num1, num2;
2007 return arithcompare (num1, num2, grtr_or_equal);
2010 DEFUN ("/=", Fneq, Sneq, 2, 2, 0,
2011 "Return t if first arg is not equal to second arg. Both must be numbers or markers.")
2012 (num1, num2)
2013 register Lisp_Object num1, num2;
2015 return arithcompare (num1, num2, notequal);
2018 DEFUN ("zerop", Fzerop, Szerop, 1, 1, 0, "Return t if NUMBER is zero.")
2019 (number)
2020 register Lisp_Object number;
2022 CHECK_NUMBER_OR_FLOAT (number, 0);
2024 if (FLOATP (number))
2026 if (XFLOAT_DATA (number) == 0.0)
2027 return Qt;
2028 return Qnil;
2031 if (!XINT (number))
2032 return Qt;
2033 return Qnil;
2036 /* Convert between long values and pairs of Lisp integers. */
2038 Lisp_Object
2039 long_to_cons (i)
2040 unsigned long i;
2042 unsigned int top = i >> 16;
2043 unsigned int bot = i & 0xFFFF;
2044 if (top == 0)
2045 return make_number (bot);
2046 if (top == (unsigned long)-1 >> 16)
2047 return Fcons (make_number (-1), make_number (bot));
2048 return Fcons (make_number (top), make_number (bot));
2051 unsigned long
2052 cons_to_long (c)
2053 Lisp_Object c;
2055 Lisp_Object top, bot;
2056 if (INTEGERP (c))
2057 return XINT (c);
2058 top = XCAR (c);
2059 bot = XCDR (c);
2060 if (CONSP (bot))
2061 bot = XCAR (bot);
2062 return ((XINT (top) << 16) | XINT (bot));
2065 DEFUN ("number-to-string", Fnumber_to_string, Snumber_to_string, 1, 1, 0,
2066 "Convert NUMBER to a string by printing it in decimal.\n\
2067 Uses a minus sign if negative.\n\
2068 NUMBER may be an integer or a floating point number.")
2069 (number)
2070 Lisp_Object number;
2072 char buffer[VALBITS];
2074 CHECK_NUMBER_OR_FLOAT (number, 0);
2076 if (FLOATP (number))
2078 char pigbuf[350]; /* see comments in float_to_string */
2080 float_to_string (pigbuf, XFLOAT_DATA (number));
2081 return build_string (pigbuf);
2084 if (sizeof (int) == sizeof (EMACS_INT))
2085 sprintf (buffer, "%d", XINT (number));
2086 else if (sizeof (long) == sizeof (EMACS_INT))
2087 sprintf (buffer, "%ld", (long) XINT (number));
2088 else
2089 abort ();
2090 return build_string (buffer);
2093 INLINE static int
2094 digit_to_number (character, base)
2095 int character, base;
2097 int digit;
2099 if (character >= '0' && character <= '9')
2100 digit = character - '0';
2101 else if (character >= 'a' && character <= 'z')
2102 digit = character - 'a' + 10;
2103 else if (character >= 'A' && character <= 'Z')
2104 digit = character - 'A' + 10;
2105 else
2106 return -1;
2108 if (digit >= base)
2109 return -1;
2110 else
2111 return digit;
2114 DEFUN ("string-to-number", Fstring_to_number, Sstring_to_number, 1, 2, 0,
2115 "Convert STRING to a number by parsing it as a decimal number.\n\
2116 This parses both integers and floating point numbers.\n\
2117 It ignores leading spaces and tabs.\n\
2119 If BASE, interpret STRING as a number in that base. If BASE isn't\n\
2120 present, base 10 is used. BASE must be between 2 and 16 (inclusive).\n\
2121 If the base used is not 10, floating point is not recognized.")
2122 (string, base)
2123 register Lisp_Object string, base;
2125 register unsigned char *p;
2126 register int b;
2127 int sign = 1;
2128 Lisp_Object val;
2130 CHECK_STRING (string, 0);
2132 if (NILP (base))
2133 b = 10;
2134 else
2136 CHECK_NUMBER (base, 1);
2137 b = XINT (base);
2138 if (b < 2 || b > 16)
2139 Fsignal (Qargs_out_of_range, Fcons (base, Qnil));
2142 /* Skip any whitespace at the front of the number. Some versions of
2143 atoi do this anyway, so we might as well make Emacs lisp consistent. */
2144 p = XSTRING (string)->data;
2145 while (*p == ' ' || *p == '\t')
2146 p++;
2148 if (*p == '-')
2150 sign = -1;
2151 p++;
2153 else if (*p == '+')
2154 p++;
2156 if (isfloat_string (p) && b == 10)
2157 val = make_float (sign * atof (p));
2158 else
2160 double v = 0;
2162 while (1)
2164 int digit = digit_to_number (*p++, b);
2165 if (digit < 0)
2166 break;
2167 v = v * b + digit;
2170 if (v > (EMACS_UINT) (VALMASK >> 1))
2171 val = make_float (sign * v);
2172 else
2173 val = make_number (sign * (int) v);
2176 return val;
2180 enum arithop
2181 { Aadd, Asub, Amult, Adiv, Alogand, Alogior, Alogxor, Amax, Amin };
2183 extern Lisp_Object float_arith_driver ();
2184 extern Lisp_Object fmod_float ();
2186 Lisp_Object
2187 arith_driver (code, nargs, args)
2188 enum arithop code;
2189 int nargs;
2190 register Lisp_Object *args;
2192 register Lisp_Object val;
2193 register int argnum;
2194 register EMACS_INT accum;
2195 register EMACS_INT next;
2197 switch (SWITCH_ENUM_CAST (code))
2199 case Alogior:
2200 case Alogxor:
2201 case Aadd:
2202 case Asub:
2203 accum = 0; break;
2204 case Amult:
2205 accum = 1; break;
2206 case Alogand:
2207 accum = -1; break;
2210 for (argnum = 0; argnum < nargs; argnum++)
2212 val = args[argnum]; /* using args[argnum] as argument to CHECK_NUMBER_... */
2213 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val, argnum);
2215 if (FLOATP (val)) /* time to do serious math */
2216 return (float_arith_driver ((double) accum, argnum, code,
2217 nargs, args));
2218 args[argnum] = val; /* runs into a compiler bug. */
2219 next = XINT (args[argnum]);
2220 switch (SWITCH_ENUM_CAST (code))
2222 case Aadd: accum += next; break;
2223 case Asub:
2224 accum = argnum ? accum - next : nargs == 1 ? - next : next;
2225 break;
2226 case Amult: accum *= next; break;
2227 case Adiv:
2228 if (!argnum) accum = next;
2229 else
2231 if (next == 0)
2232 Fsignal (Qarith_error, Qnil);
2233 accum /= next;
2235 break;
2236 case Alogand: accum &= next; break;
2237 case Alogior: accum |= next; break;
2238 case Alogxor: accum ^= next; break;
2239 case Amax: if (!argnum || next > accum) accum = next; break;
2240 case Amin: if (!argnum || next < accum) accum = next; break;
2244 XSETINT (val, accum);
2245 return val;
2248 #undef isnan
2249 #define isnan(x) ((x) != (x))
2251 Lisp_Object
2252 float_arith_driver (accum, argnum, code, nargs, args)
2253 double accum;
2254 register int argnum;
2255 enum arithop code;
2256 int nargs;
2257 register Lisp_Object *args;
2259 register Lisp_Object val;
2260 double next;
2262 for (; argnum < nargs; argnum++)
2264 val = args[argnum]; /* using args[argnum] as argument to CHECK_NUMBER_... */
2265 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val, argnum);
2267 if (FLOATP (val))
2269 next = XFLOAT_DATA (val);
2271 else
2273 args[argnum] = val; /* runs into a compiler bug. */
2274 next = XINT (args[argnum]);
2276 switch (SWITCH_ENUM_CAST (code))
2278 case Aadd:
2279 accum += next;
2280 break;
2281 case Asub:
2282 accum = argnum ? accum - next : nargs == 1 ? - next : next;
2283 break;
2284 case Amult:
2285 accum *= next;
2286 break;
2287 case Adiv:
2288 if (!argnum)
2289 accum = next;
2290 else
2292 if (! IEEE_FLOATING_POINT && next == 0)
2293 Fsignal (Qarith_error, Qnil);
2294 accum /= next;
2296 break;
2297 case Alogand:
2298 case Alogior:
2299 case Alogxor:
2300 return wrong_type_argument (Qinteger_or_marker_p, val);
2301 case Amax:
2302 if (!argnum || isnan (next) || next > accum)
2303 accum = next;
2304 break;
2305 case Amin:
2306 if (!argnum || isnan (next) || next < accum)
2307 accum = next;
2308 break;
2312 return make_float (accum);
2316 DEFUN ("+", Fplus, Splus, 0, MANY, 0,
2317 "Return sum of any number of arguments, which are numbers or markers.")
2318 (nargs, args)
2319 int nargs;
2320 Lisp_Object *args;
2322 return arith_driver (Aadd, nargs, args);
2325 DEFUN ("-", Fminus, Sminus, 0, MANY, 0,
2326 "Negate number or subtract numbers or markers.\n\
2327 With one arg, negates it. With more than one arg,\n\
2328 subtracts all but the first from the first.")
2329 (nargs, args)
2330 int nargs;
2331 Lisp_Object *args;
2333 return arith_driver (Asub, nargs, args);
2336 DEFUN ("*", Ftimes, Stimes, 0, MANY, 0,
2337 "Returns product of any number of arguments, which are numbers or markers.")
2338 (nargs, args)
2339 int nargs;
2340 Lisp_Object *args;
2342 return arith_driver (Amult, nargs, args);
2345 DEFUN ("/", Fquo, Squo, 2, MANY, 0,
2346 "Returns first argument divided by all the remaining arguments.\n\
2347 The arguments must be numbers or markers.")
2348 (nargs, args)
2349 int nargs;
2350 Lisp_Object *args;
2352 return arith_driver (Adiv, nargs, args);
2355 DEFUN ("%", Frem, Srem, 2, 2, 0,
2356 "Returns remainder of X divided by Y.\n\
2357 Both must be integers or markers.")
2358 (x, y)
2359 register Lisp_Object x, y;
2361 Lisp_Object val;
2363 CHECK_NUMBER_COERCE_MARKER (x, 0);
2364 CHECK_NUMBER_COERCE_MARKER (y, 1);
2366 if (XFASTINT (y) == 0)
2367 Fsignal (Qarith_error, Qnil);
2369 XSETINT (val, XINT (x) % XINT (y));
2370 return val;
2373 #ifndef HAVE_FMOD
2374 double
2375 fmod (f1, f2)
2376 double f1, f2;
2378 double r = f1;
2380 if (f2 < 0.0)
2381 f2 = -f2;
2383 /* If the magnitude of the result exceeds that of the divisor, or
2384 the sign of the result does not agree with that of the dividend,
2385 iterate with the reduced value. This does not yield a
2386 particularly accurate result, but at least it will be in the
2387 range promised by fmod. */
2389 r -= f2 * floor (r / f2);
2390 while (f2 <= (r < 0 ? -r : r) || ((r < 0) != (f1 < 0) && ! isnan (r)));
2392 return r;
2394 #endif /* ! HAVE_FMOD */
2396 DEFUN ("mod", Fmod, Smod, 2, 2, 0,
2397 "Returns X modulo Y.\n\
2398 The result falls between zero (inclusive) and Y (exclusive).\n\
2399 Both X and Y must be numbers or markers.")
2400 (x, y)
2401 register Lisp_Object x, y;
2403 Lisp_Object val;
2404 EMACS_INT i1, i2;
2406 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (x, 0);
2407 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (y, 1);
2409 if (FLOATP (x) || FLOATP (y))
2410 return fmod_float (x, y);
2412 i1 = XINT (x);
2413 i2 = XINT (y);
2415 if (i2 == 0)
2416 Fsignal (Qarith_error, Qnil);
2418 i1 %= i2;
2420 /* If the "remainder" comes out with the wrong sign, fix it. */
2421 if (i2 < 0 ? i1 > 0 : i1 < 0)
2422 i1 += i2;
2424 XSETINT (val, i1);
2425 return val;
2428 DEFUN ("max", Fmax, Smax, 1, MANY, 0,
2429 "Return largest of all the arguments (which must be numbers or markers).\n\
2430 The value is always a number; markers are converted to numbers.")
2431 (nargs, args)
2432 int nargs;
2433 Lisp_Object *args;
2435 return arith_driver (Amax, nargs, args);
2438 DEFUN ("min", Fmin, Smin, 1, MANY, 0,
2439 "Return smallest of all the arguments (which must be numbers or markers).\n\
2440 The value is always a number; markers are converted to numbers.")
2441 (nargs, args)
2442 int nargs;
2443 Lisp_Object *args;
2445 return arith_driver (Amin, nargs, args);
2448 DEFUN ("logand", Flogand, Slogand, 0, MANY, 0,
2449 "Return bitwise-and of all the arguments.\n\
2450 Arguments may be integers, or markers converted to integers.")
2451 (nargs, args)
2452 int nargs;
2453 Lisp_Object *args;
2455 return arith_driver (Alogand, nargs, args);
2458 DEFUN ("logior", Flogior, Slogior, 0, MANY, 0,
2459 "Return bitwise-or of all the arguments.\n\
2460 Arguments may be integers, or markers converted to integers.")
2461 (nargs, args)
2462 int nargs;
2463 Lisp_Object *args;
2465 return arith_driver (Alogior, nargs, args);
2468 DEFUN ("logxor", Flogxor, Slogxor, 0, MANY, 0,
2469 "Return bitwise-exclusive-or of all the arguments.\n\
2470 Arguments may be integers, or markers converted to integers.")
2471 (nargs, args)
2472 int nargs;
2473 Lisp_Object *args;
2475 return arith_driver (Alogxor, nargs, args);
2478 DEFUN ("ash", Fash, Sash, 2, 2, 0,
2479 "Return VALUE with its bits shifted left by COUNT.\n\
2480 If COUNT is negative, shifting is actually to the right.\n\
2481 In this case, the sign bit is duplicated.")
2482 (value, count)
2483 register Lisp_Object value, count;
2485 register Lisp_Object val;
2487 CHECK_NUMBER (value, 0);
2488 CHECK_NUMBER (count, 1);
2490 if (XINT (count) >= BITS_PER_EMACS_INT)
2491 XSETINT (val, 0);
2492 else if (XINT (count) > 0)
2493 XSETINT (val, XINT (value) << XFASTINT (count));
2494 else if (XINT (count) <= -BITS_PER_EMACS_INT)
2495 XSETINT (val, XINT (value) < 0 ? -1 : 0);
2496 else
2497 XSETINT (val, XINT (value) >> -XINT (count));
2498 return val;
2501 DEFUN ("lsh", Flsh, Slsh, 2, 2, 0,
2502 "Return VALUE with its bits shifted left by COUNT.\n\
2503 If COUNT is negative, shifting is actually to the right.\n\
2504 In this case, zeros are shifted in on the left.")
2505 (value, count)
2506 register Lisp_Object value, count;
2508 register Lisp_Object val;
2510 CHECK_NUMBER (value, 0);
2511 CHECK_NUMBER (count, 1);
2513 if (XINT (count) >= BITS_PER_EMACS_INT)
2514 XSETINT (val, 0);
2515 else if (XINT (count) > 0)
2516 XSETINT (val, (EMACS_UINT) XUINT (value) << XFASTINT (count));
2517 else if (XINT (count) <= -BITS_PER_EMACS_INT)
2518 XSETINT (val, 0);
2519 else
2520 XSETINT (val, (EMACS_UINT) XUINT (value) >> -XINT (count));
2521 return val;
2524 DEFUN ("1+", Fadd1, Sadd1, 1, 1, 0,
2525 "Return NUMBER plus one. NUMBER may be a number or a marker.\n\
2526 Markers are converted to integers.")
2527 (number)
2528 register Lisp_Object number;
2530 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number, 0);
2532 if (FLOATP (number))
2533 return (make_float (1.0 + XFLOAT_DATA (number)));
2535 XSETINT (number, XINT (number) + 1);
2536 return number;
2539 DEFUN ("1-", Fsub1, Ssub1, 1, 1, 0,
2540 "Return NUMBER minus one. NUMBER may be a number or a marker.\n\
2541 Markers are converted to integers.")
2542 (number)
2543 register Lisp_Object number;
2545 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number, 0);
2547 if (FLOATP (number))
2548 return (make_float (-1.0 + XFLOAT_DATA (number)));
2550 XSETINT (number, XINT (number) - 1);
2551 return number;
2554 DEFUN ("lognot", Flognot, Slognot, 1, 1, 0,
2555 "Return the bitwise complement of NUMBER. NUMBER must be an integer.")
2556 (number)
2557 register Lisp_Object number;
2559 CHECK_NUMBER (number, 0);
2560 XSETINT (number, ~XINT (number));
2561 return number;
2564 void
2565 syms_of_data ()
2567 Lisp_Object error_tail, arith_tail;
2569 Qquote = intern ("quote");
2570 Qlambda = intern ("lambda");
2571 Qsubr = intern ("subr");
2572 Qerror_conditions = intern ("error-conditions");
2573 Qerror_message = intern ("error-message");
2574 Qtop_level = intern ("top-level");
2576 Qerror = intern ("error");
2577 Qquit = intern ("quit");
2578 Qwrong_type_argument = intern ("wrong-type-argument");
2579 Qargs_out_of_range = intern ("args-out-of-range");
2580 Qvoid_function = intern ("void-function");
2581 Qcyclic_function_indirection = intern ("cyclic-function-indirection");
2582 Qvoid_variable = intern ("void-variable");
2583 Qsetting_constant = intern ("setting-constant");
2584 Qinvalid_read_syntax = intern ("invalid-read-syntax");
2586 Qinvalid_function = intern ("invalid-function");
2587 Qwrong_number_of_arguments = intern ("wrong-number-of-arguments");
2588 Qno_catch = intern ("no-catch");
2589 Qend_of_file = intern ("end-of-file");
2590 Qarith_error = intern ("arith-error");
2591 Qbeginning_of_buffer = intern ("beginning-of-buffer");
2592 Qend_of_buffer = intern ("end-of-buffer");
2593 Qbuffer_read_only = intern ("buffer-read-only");
2594 Qtext_read_only = intern ("text-read-only");
2595 Qmark_inactive = intern ("mark-inactive");
2597 Qlistp = intern ("listp");
2598 Qconsp = intern ("consp");
2599 Qsymbolp = intern ("symbolp");
2600 Qkeywordp = intern ("keywordp");
2601 Qintegerp = intern ("integerp");
2602 Qnatnump = intern ("natnump");
2603 Qwholenump = intern ("wholenump");
2604 Qstringp = intern ("stringp");
2605 Qarrayp = intern ("arrayp");
2606 Qsequencep = intern ("sequencep");
2607 Qbufferp = intern ("bufferp");
2608 Qvectorp = intern ("vectorp");
2609 Qchar_or_string_p = intern ("char-or-string-p");
2610 Qmarkerp = intern ("markerp");
2611 Qbuffer_or_string_p = intern ("buffer-or-string-p");
2612 Qinteger_or_marker_p = intern ("integer-or-marker-p");
2613 Qboundp = intern ("boundp");
2614 Qfboundp = intern ("fboundp");
2616 Qfloatp = intern ("floatp");
2617 Qnumberp = intern ("numberp");
2618 Qnumber_or_marker_p = intern ("number-or-marker-p");
2620 Qchar_table_p = intern ("char-table-p");
2621 Qvector_or_char_table_p = intern ("vector-or-char-table-p");
2623 Qsubrp = intern ("subrp");
2624 Qunevalled = intern ("unevalled");
2625 Qmany = intern ("many");
2627 Qcdr = intern ("cdr");
2629 /* Handle automatic advice activation */
2630 Qad_advice_info = intern ("ad-advice-info");
2631 Qad_activate_internal = intern ("ad-activate-internal");
2633 error_tail = Fcons (Qerror, Qnil);
2635 /* ERROR is used as a signaler for random errors for which nothing else is right */
2637 Fput (Qerror, Qerror_conditions,
2638 error_tail);
2639 Fput (Qerror, Qerror_message,
2640 build_string ("error"));
2642 Fput (Qquit, Qerror_conditions,
2643 Fcons (Qquit, Qnil));
2644 Fput (Qquit, Qerror_message,
2645 build_string ("Quit"));
2647 Fput (Qwrong_type_argument, Qerror_conditions,
2648 Fcons (Qwrong_type_argument, error_tail));
2649 Fput (Qwrong_type_argument, Qerror_message,
2650 build_string ("Wrong type argument"));
2652 Fput (Qargs_out_of_range, Qerror_conditions,
2653 Fcons (Qargs_out_of_range, error_tail));
2654 Fput (Qargs_out_of_range, Qerror_message,
2655 build_string ("Args out of range"));
2657 Fput (Qvoid_function, Qerror_conditions,
2658 Fcons (Qvoid_function, error_tail));
2659 Fput (Qvoid_function, Qerror_message,
2660 build_string ("Symbol's function definition is void"));
2662 Fput (Qcyclic_function_indirection, Qerror_conditions,
2663 Fcons (Qcyclic_function_indirection, error_tail));
2664 Fput (Qcyclic_function_indirection, Qerror_message,
2665 build_string ("Symbol's chain of function indirections contains a loop"));
2667 Fput (Qvoid_variable, Qerror_conditions,
2668 Fcons (Qvoid_variable, error_tail));
2669 Fput (Qvoid_variable, Qerror_message,
2670 build_string ("Symbol's value as variable is void"));
2672 Fput (Qsetting_constant, Qerror_conditions,
2673 Fcons (Qsetting_constant, error_tail));
2674 Fput (Qsetting_constant, Qerror_message,
2675 build_string ("Attempt to set a constant symbol"));
2677 Fput (Qinvalid_read_syntax, Qerror_conditions,
2678 Fcons (Qinvalid_read_syntax, error_tail));
2679 Fput (Qinvalid_read_syntax, Qerror_message,
2680 build_string ("Invalid read syntax"));
2682 Fput (Qinvalid_function, Qerror_conditions,
2683 Fcons (Qinvalid_function, error_tail));
2684 Fput (Qinvalid_function, Qerror_message,
2685 build_string ("Invalid function"));
2687 Fput (Qwrong_number_of_arguments, Qerror_conditions,
2688 Fcons (Qwrong_number_of_arguments, error_tail));
2689 Fput (Qwrong_number_of_arguments, Qerror_message,
2690 build_string ("Wrong number of arguments"));
2692 Fput (Qno_catch, Qerror_conditions,
2693 Fcons (Qno_catch, error_tail));
2694 Fput (Qno_catch, Qerror_message,
2695 build_string ("No catch for tag"));
2697 Fput (Qend_of_file, Qerror_conditions,
2698 Fcons (Qend_of_file, error_tail));
2699 Fput (Qend_of_file, Qerror_message,
2700 build_string ("End of file during parsing"));
2702 arith_tail = Fcons (Qarith_error, error_tail);
2703 Fput (Qarith_error, Qerror_conditions,
2704 arith_tail);
2705 Fput (Qarith_error, Qerror_message,
2706 build_string ("Arithmetic error"));
2708 Fput (Qbeginning_of_buffer, Qerror_conditions,
2709 Fcons (Qbeginning_of_buffer, error_tail));
2710 Fput (Qbeginning_of_buffer, Qerror_message,
2711 build_string ("Beginning of buffer"));
2713 Fput (Qend_of_buffer, Qerror_conditions,
2714 Fcons (Qend_of_buffer, error_tail));
2715 Fput (Qend_of_buffer, Qerror_message,
2716 build_string ("End of buffer"));
2718 Fput (Qbuffer_read_only, Qerror_conditions,
2719 Fcons (Qbuffer_read_only, error_tail));
2720 Fput (Qbuffer_read_only, Qerror_message,
2721 build_string ("Buffer is read-only"));
2723 Fput (Qtext_read_only, Qerror_conditions,
2724 Fcons (Qtext_read_only, error_tail));
2725 Fput (Qtext_read_only, Qerror_message,
2726 build_string ("Text is read-only"));
2728 Qrange_error = intern ("range-error");
2729 Qdomain_error = intern ("domain-error");
2730 Qsingularity_error = intern ("singularity-error");
2731 Qoverflow_error = intern ("overflow-error");
2732 Qunderflow_error = intern ("underflow-error");
2734 Fput (Qdomain_error, Qerror_conditions,
2735 Fcons (Qdomain_error, arith_tail));
2736 Fput (Qdomain_error, Qerror_message,
2737 build_string ("Arithmetic domain error"));
2739 Fput (Qrange_error, Qerror_conditions,
2740 Fcons (Qrange_error, arith_tail));
2741 Fput (Qrange_error, Qerror_message,
2742 build_string ("Arithmetic range error"));
2744 Fput (Qsingularity_error, Qerror_conditions,
2745 Fcons (Qsingularity_error, Fcons (Qdomain_error, arith_tail)));
2746 Fput (Qsingularity_error, Qerror_message,
2747 build_string ("Arithmetic singularity error"));
2749 Fput (Qoverflow_error, Qerror_conditions,
2750 Fcons (Qoverflow_error, Fcons (Qdomain_error, arith_tail)));
2751 Fput (Qoverflow_error, Qerror_message,
2752 build_string ("Arithmetic overflow error"));
2754 Fput (Qunderflow_error, Qerror_conditions,
2755 Fcons (Qunderflow_error, Fcons (Qdomain_error, arith_tail)));
2756 Fput (Qunderflow_error, Qerror_message,
2757 build_string ("Arithmetic underflow error"));
2759 staticpro (&Qrange_error);
2760 staticpro (&Qdomain_error);
2761 staticpro (&Qsingularity_error);
2762 staticpro (&Qoverflow_error);
2763 staticpro (&Qunderflow_error);
2765 staticpro (&Qnil);
2766 staticpro (&Qt);
2767 staticpro (&Qquote);
2768 staticpro (&Qlambda);
2769 staticpro (&Qsubr);
2770 staticpro (&Qunbound);
2771 staticpro (&Qerror_conditions);
2772 staticpro (&Qerror_message);
2773 staticpro (&Qtop_level);
2775 staticpro (&Qerror);
2776 staticpro (&Qquit);
2777 staticpro (&Qwrong_type_argument);
2778 staticpro (&Qargs_out_of_range);
2779 staticpro (&Qvoid_function);
2780 staticpro (&Qcyclic_function_indirection);
2781 staticpro (&Qvoid_variable);
2782 staticpro (&Qsetting_constant);
2783 staticpro (&Qinvalid_read_syntax);
2784 staticpro (&Qwrong_number_of_arguments);
2785 staticpro (&Qinvalid_function);
2786 staticpro (&Qno_catch);
2787 staticpro (&Qend_of_file);
2788 staticpro (&Qarith_error);
2789 staticpro (&Qbeginning_of_buffer);
2790 staticpro (&Qend_of_buffer);
2791 staticpro (&Qbuffer_read_only);
2792 staticpro (&Qtext_read_only);
2793 staticpro (&Qmark_inactive);
2795 staticpro (&Qlistp);
2796 staticpro (&Qconsp);
2797 staticpro (&Qsymbolp);
2798 staticpro (&Qkeywordp);
2799 staticpro (&Qintegerp);
2800 staticpro (&Qnatnump);
2801 staticpro (&Qwholenump);
2802 staticpro (&Qstringp);
2803 staticpro (&Qarrayp);
2804 staticpro (&Qsequencep);
2805 staticpro (&Qbufferp);
2806 staticpro (&Qvectorp);
2807 staticpro (&Qchar_or_string_p);
2808 staticpro (&Qmarkerp);
2809 staticpro (&Qbuffer_or_string_p);
2810 staticpro (&Qinteger_or_marker_p);
2811 staticpro (&Qfloatp);
2812 staticpro (&Qnumberp);
2813 staticpro (&Qnumber_or_marker_p);
2814 staticpro (&Qchar_table_p);
2815 staticpro (&Qvector_or_char_table_p);
2816 staticpro (&Qsubrp);
2817 staticpro (&Qmany);
2818 staticpro (&Qunevalled);
2820 staticpro (&Qboundp);
2821 staticpro (&Qfboundp);
2822 staticpro (&Qcdr);
2823 staticpro (&Qad_advice_info);
2824 staticpro (&Qad_activate_internal);
2826 /* Types that type-of returns. */
2827 Qinteger = intern ("integer");
2828 Qsymbol = intern ("symbol");
2829 Qstring = intern ("string");
2830 Qcons = intern ("cons");
2831 Qmarker = intern ("marker");
2832 Qoverlay = intern ("overlay");
2833 Qfloat = intern ("float");
2834 Qwindow_configuration = intern ("window-configuration");
2835 Qprocess = intern ("process");
2836 Qwindow = intern ("window");
2837 /* Qsubr = intern ("subr"); */
2838 Qcompiled_function = intern ("compiled-function");
2839 Qbuffer = intern ("buffer");
2840 Qframe = intern ("frame");
2841 Qvector = intern ("vector");
2842 Qchar_table = intern ("char-table");
2843 Qbool_vector = intern ("bool-vector");
2844 Qhash_table = intern ("hash-table");
2846 staticpro (&Qinteger);
2847 staticpro (&Qsymbol);
2848 staticpro (&Qstring);
2849 staticpro (&Qcons);
2850 staticpro (&Qmarker);
2851 staticpro (&Qoverlay);
2852 staticpro (&Qfloat);
2853 staticpro (&Qwindow_configuration);
2854 staticpro (&Qprocess);
2855 staticpro (&Qwindow);
2856 /* staticpro (&Qsubr); */
2857 staticpro (&Qcompiled_function);
2858 staticpro (&Qbuffer);
2859 staticpro (&Qframe);
2860 staticpro (&Qvector);
2861 staticpro (&Qchar_table);
2862 staticpro (&Qbool_vector);
2863 staticpro (&Qhash_table);
2865 defsubr (&Seq);
2866 defsubr (&Snull);
2867 defsubr (&Stype_of);
2868 defsubr (&Slistp);
2869 defsubr (&Snlistp);
2870 defsubr (&Sconsp);
2871 defsubr (&Satom);
2872 defsubr (&Sintegerp);
2873 defsubr (&Sinteger_or_marker_p);
2874 defsubr (&Snumberp);
2875 defsubr (&Snumber_or_marker_p);
2876 defsubr (&Sfloatp);
2877 defsubr (&Snatnump);
2878 defsubr (&Ssymbolp);
2879 defsubr (&Skeywordp);
2880 defsubr (&Sstringp);
2881 defsubr (&Smultibyte_string_p);
2882 defsubr (&Svectorp);
2883 defsubr (&Schar_table_p);
2884 defsubr (&Svector_or_char_table_p);
2885 defsubr (&Sbool_vector_p);
2886 defsubr (&Sarrayp);
2887 defsubr (&Ssequencep);
2888 defsubr (&Sbufferp);
2889 defsubr (&Smarkerp);
2890 defsubr (&Ssubrp);
2891 defsubr (&Sbyte_code_function_p);
2892 defsubr (&Schar_or_string_p);
2893 defsubr (&Scar);
2894 defsubr (&Scdr);
2895 defsubr (&Scar_safe);
2896 defsubr (&Scdr_safe);
2897 defsubr (&Ssetcar);
2898 defsubr (&Ssetcdr);
2899 defsubr (&Ssymbol_function);
2900 defsubr (&Sindirect_function);
2901 defsubr (&Ssymbol_plist);
2902 defsubr (&Ssymbol_name);
2903 defsubr (&Smakunbound);
2904 defsubr (&Sfmakunbound);
2905 defsubr (&Sboundp);
2906 defsubr (&Sfboundp);
2907 defsubr (&Sfset);
2908 defsubr (&Sdefalias);
2909 defsubr (&Ssetplist);
2910 defsubr (&Ssymbol_value);
2911 defsubr (&Sset);
2912 defsubr (&Sdefault_boundp);
2913 defsubr (&Sdefault_value);
2914 defsubr (&Sset_default);
2915 defsubr (&Ssetq_default);
2916 defsubr (&Smake_variable_buffer_local);
2917 defsubr (&Smake_local_variable);
2918 defsubr (&Skill_local_variable);
2919 defsubr (&Smake_variable_frame_local);
2920 defsubr (&Slocal_variable_p);
2921 defsubr (&Slocal_variable_if_set_p);
2922 defsubr (&Saref);
2923 defsubr (&Saset);
2924 defsubr (&Snumber_to_string);
2925 defsubr (&Sstring_to_number);
2926 defsubr (&Seqlsign);
2927 defsubr (&Slss);
2928 defsubr (&Sgtr);
2929 defsubr (&Sleq);
2930 defsubr (&Sgeq);
2931 defsubr (&Sneq);
2932 defsubr (&Szerop);
2933 defsubr (&Splus);
2934 defsubr (&Sminus);
2935 defsubr (&Stimes);
2936 defsubr (&Squo);
2937 defsubr (&Srem);
2938 defsubr (&Smod);
2939 defsubr (&Smax);
2940 defsubr (&Smin);
2941 defsubr (&Slogand);
2942 defsubr (&Slogior);
2943 defsubr (&Slogxor);
2944 defsubr (&Slsh);
2945 defsubr (&Sash);
2946 defsubr (&Sadd1);
2947 defsubr (&Ssub1);
2948 defsubr (&Slognot);
2949 defsubr (&Ssubr_arity);
2951 XSYMBOL (Qwholenump)->function = XSYMBOL (Qnatnump)->function;
2954 SIGTYPE
2955 arith_error (signo)
2956 int signo;
2958 #if defined(USG) && !defined(POSIX_SIGNALS)
2959 /* USG systems forget handlers when they are used;
2960 must reestablish each time */
2961 signal (signo, arith_error);
2962 #endif /* USG */
2963 #ifdef VMS
2964 /* VMS systems are like USG. */
2965 signal (signo, arith_error);
2966 #endif /* VMS */
2967 #ifdef BSD4_1
2968 sigrelse (SIGFPE);
2969 #else /* not BSD4_1 */
2970 sigsetmask (SIGEMPTYMASK);
2971 #endif /* not BSD4_1 */
2973 Fsignal (Qarith_error, Qnil);
2976 void
2977 init_data ()
2979 /* Don't do this if just dumping out.
2980 We don't want to call `signal' in this case
2981 so that we don't have trouble with dumping
2982 signal-delivering routines in an inconsistent state. */
2983 #ifndef CANNOT_DUMP
2984 if (!initialized)
2985 return;
2986 #endif /* CANNOT_DUMP */
2987 signal (SIGFPE, arith_error);
2989 #ifdef uts
2990 signal (SIGEMT, arith_error);
2991 #endif /* uts */