(Mode Line): Document the 3D appearence of the mode line on
[emacs.git] / src / data.c
bloba85c3c0179acfd92b94000a67a426c8389a21825
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 SYMBOL to refer to its global binding.
844 This makes it safe to alter the status of other bindings. */
846 void
847 swap_in_global_binding (symbol)
848 Lisp_Object symbol;
850 Lisp_Object valcontents, cdr;
852 valcontents = XSYMBOL (symbol)->value;
853 if (!BUFFER_LOCAL_VALUEP (valcontents)
854 && !SOME_BUFFER_LOCAL_VALUEP (valcontents))
855 abort ();
856 cdr = XBUFFER_LOCAL_VALUE (valcontents)->cdr;
858 /* Unload the previously loaded binding. */
859 Fsetcdr (XCAR (cdr),
860 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue));
862 /* Select the global binding in the symbol. */
863 XCAR (cdr) = cdr;
864 store_symval_forwarding (symbol, valcontents, XCDR (cdr));
866 /* Indicate that the global binding is set up now. */
867 XBUFFER_LOCAL_VALUE (valcontents)->frame = Qnil;
868 XBUFFER_LOCAL_VALUE (valcontents)->buffer = Qnil;
869 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 0;
870 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
873 /* Set up the buffer-local symbol SYMBOL for validity in the current buffer.
874 VALCONTENTS is the contents of its value cell,
875 which points to a struct Lisp_Buffer_Local_Value.
877 Return the value forwarded one step past the buffer-local stage.
878 This could be another forwarding pointer. */
880 static Lisp_Object
881 swap_in_symval_forwarding (symbol, valcontents)
882 Lisp_Object symbol, valcontents;
884 register Lisp_Object tem1;
885 tem1 = XBUFFER_LOCAL_VALUE (valcontents)->buffer;
887 if (NILP (tem1)
888 || current_buffer != XBUFFER (tem1)
889 || (XBUFFER_LOCAL_VALUE (valcontents)->check_frame
890 && ! EQ (selected_frame, XBUFFER_LOCAL_VALUE (valcontents)->frame)))
892 /* Unload the previously loaded binding. */
893 tem1 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
894 Fsetcdr (tem1,
895 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue));
896 /* Choose the new binding. */
897 tem1 = assq_no_quit (symbol, current_buffer->local_var_alist);
898 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 0;
899 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
900 if (NILP (tem1))
902 if (XBUFFER_LOCAL_VALUE (valcontents)->check_frame)
903 tem1 = assq_no_quit (symbol, XFRAME (selected_frame)->param_alist);
904 if (! NILP (tem1))
905 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 1;
906 else
907 tem1 = XBUFFER_LOCAL_VALUE (valcontents)->cdr;
909 else
910 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 1;
912 /* Load the new binding. */
913 XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr) = tem1;
914 XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer, current_buffer);
915 XBUFFER_LOCAL_VALUE (valcontents)->frame = selected_frame;
916 store_symval_forwarding (symbol,
917 XBUFFER_LOCAL_VALUE (valcontents)->realvalue,
918 Fcdr (tem1));
920 return XBUFFER_LOCAL_VALUE (valcontents)->realvalue;
923 /* Find the value of a symbol, returning Qunbound if it's not bound.
924 This is helpful for code which just wants to get a variable's value
925 if it has one, without signaling an error.
926 Note that it must not be possible to quit
927 within this function. Great care is required for this. */
929 Lisp_Object
930 find_symbol_value (symbol)
931 Lisp_Object symbol;
933 register Lisp_Object valcontents;
934 register Lisp_Object val;
935 CHECK_SYMBOL (symbol, 0);
936 valcontents = XSYMBOL (symbol)->value;
938 if (BUFFER_LOCAL_VALUEP (valcontents)
939 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
940 valcontents = swap_in_symval_forwarding (symbol, valcontents);
942 if (MISCP (valcontents))
944 switch (XMISCTYPE (valcontents))
946 case Lisp_Misc_Intfwd:
947 XSETINT (val, *XINTFWD (valcontents)->intvar);
948 return val;
950 case Lisp_Misc_Boolfwd:
951 return (*XBOOLFWD (valcontents)->boolvar ? Qt : Qnil);
953 case Lisp_Misc_Objfwd:
954 return *XOBJFWD (valcontents)->objvar;
956 case Lisp_Misc_Buffer_Objfwd:
957 return PER_BUFFER_VALUE (current_buffer,
958 XBUFFER_OBJFWD (valcontents)->offset);
960 case Lisp_Misc_Kboard_Objfwd:
961 return *(Lisp_Object *)(XKBOARD_OBJFWD (valcontents)->offset
962 + (char *)current_kboard);
966 return valcontents;
969 DEFUN ("symbol-value", Fsymbol_value, Ssymbol_value, 1, 1, 0,
970 "Return SYMBOL's value. Error if that is void.")
971 (symbol)
972 Lisp_Object symbol;
974 Lisp_Object val;
976 val = find_symbol_value (symbol);
977 if (EQ (val, Qunbound))
978 return Fsignal (Qvoid_variable, Fcons (symbol, Qnil));
979 else
980 return val;
983 DEFUN ("set", Fset, Sset, 2, 2, 0,
984 "Set SYMBOL's value to NEWVAL, and return NEWVAL.")
985 (symbol, newval)
986 register Lisp_Object symbol, newval;
988 return set_internal (symbol, newval, current_buffer, 0);
991 /* Return 1 if SYMBOL currently has a let-binding
992 which was made in the buffer that is now current. */
994 static int
995 let_shadows_buffer_binding_p (symbol)
996 Lisp_Object symbol;
998 struct specbinding *p;
1000 for (p = specpdl_ptr - 1; p >= specpdl; p--)
1001 if (p->func == 0
1002 && CONSP (p->symbol)
1003 && EQ (symbol, XCAR (p->symbol))
1004 && XBUFFER (XCDR (XCDR (p->symbol))) == current_buffer)
1005 return 1;
1007 return 0;
1010 /* Store the value NEWVAL into SYMBOL.
1011 If buffer-locality is an issue, BUF specifies which buffer to use.
1012 (0 stands for the current buffer.)
1014 If BINDFLAG is zero, then if this symbol is supposed to become
1015 local in every buffer where it is set, then we make it local.
1016 If BINDFLAG is nonzero, we don't do that. */
1018 Lisp_Object
1019 set_internal (symbol, newval, buf, bindflag)
1020 register Lisp_Object symbol, newval;
1021 struct buffer *buf;
1022 int bindflag;
1024 int voide = EQ (newval, Qunbound);
1026 register Lisp_Object valcontents, innercontents, tem1, current_alist_element;
1028 if (buf == 0)
1029 buf = current_buffer;
1031 /* If restoring in a dead buffer, do nothing. */
1032 if (NILP (buf->name))
1033 return newval;
1035 CHECK_SYMBOL (symbol, 0);
1036 if (NILP (symbol) || EQ (symbol, Qt)
1037 || (XSYMBOL (symbol)->name->data[0] == ':'
1038 && EQ (XSYMBOL (symbol)->obarray, initial_obarray)
1039 && !EQ (newval, symbol)))
1040 return Fsignal (Qsetting_constant, Fcons (symbol, Qnil));
1042 innercontents = valcontents = XSYMBOL (symbol)->value;
1044 if (BUFFER_OBJFWDP (valcontents))
1046 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1047 int idx = PER_BUFFER_IDX (offset);
1048 if (idx > 0
1049 && !bindflag
1050 && !let_shadows_buffer_binding_p (symbol))
1051 SET_PER_BUFFER_VALUE_P (buf, idx, 1);
1054 else if (BUFFER_LOCAL_VALUEP (valcontents)
1055 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1057 /* valcontents is a struct Lisp_Buffer_Local_Value. */
1059 /* What binding is loaded right now? */
1060 current_alist_element
1061 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1063 /* If the current buffer is not the buffer whose binding is
1064 loaded, or if there may be frame-local bindings and the frame
1065 isn't the right one, or if it's a Lisp_Buffer_Local_Value and
1066 the default binding is loaded, the loaded binding may be the
1067 wrong one. */
1068 if (!BUFFERP (XBUFFER_LOCAL_VALUE (valcontents)->buffer)
1069 || buf != XBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer)
1070 || (XBUFFER_LOCAL_VALUE (valcontents)->check_frame
1071 && !EQ (selected_frame, XBUFFER_LOCAL_VALUE (valcontents)->frame))
1072 || (BUFFER_LOCAL_VALUEP (valcontents)
1073 && EQ (XCAR (current_alist_element),
1074 current_alist_element)))
1076 /* The currently loaded binding is not necessarily valid.
1077 We need to unload it, and choose a new binding. */
1079 /* Write out `realvalue' to the old loaded binding. */
1080 Fsetcdr (current_alist_element,
1081 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue));
1083 /* Find the new binding. */
1084 tem1 = Fassq (symbol, buf->local_var_alist);
1085 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 1;
1086 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 0;
1088 if (NILP (tem1))
1090 /* This buffer still sees the default value. */
1092 /* If the variable is a Lisp_Some_Buffer_Local_Value,
1093 or if this is `let' rather than `set',
1094 make CURRENT-ALIST-ELEMENT point to itself,
1095 indicating that we're seeing the default value.
1096 Likewise if the variable has been let-bound
1097 in the current buffer. */
1098 if (bindflag || SOME_BUFFER_LOCAL_VALUEP (valcontents)
1099 || let_shadows_buffer_binding_p (symbol))
1101 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
1103 if (XBUFFER_LOCAL_VALUE (valcontents)->check_frame)
1104 tem1 = Fassq (symbol,
1105 XFRAME (selected_frame)->param_alist);
1107 if (! NILP (tem1))
1108 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 1;
1109 else
1110 tem1 = XBUFFER_LOCAL_VALUE (valcontents)->cdr;
1112 /* If it's a Lisp_Buffer_Local_Value, being set not bound,
1113 and we're not within a let that was made for this buffer,
1114 create a new buffer-local binding for the variable.
1115 That means, give this buffer a new assoc for a local value
1116 and load that binding. */
1117 else
1119 tem1 = Fcons (symbol, Fcdr (current_alist_element));
1120 buf->local_var_alist
1121 = Fcons (tem1, buf->local_var_alist);
1125 /* Record which binding is now loaded. */
1126 XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr)
1127 = tem1;
1129 /* Set `buffer' and `frame' slots for thebinding now loaded. */
1130 XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer, buf);
1131 XBUFFER_LOCAL_VALUE (valcontents)->frame = selected_frame;
1133 innercontents = XBUFFER_LOCAL_VALUE (valcontents)->realvalue;
1136 /* If storing void (making the symbol void), forward only through
1137 buffer-local indicator, not through Lisp_Objfwd, etc. */
1138 if (voide)
1139 store_symval_forwarding (symbol, Qnil, newval);
1140 else
1141 store_symval_forwarding (symbol, innercontents, newval);
1143 /* If we just set a variable whose current binding is frame-local,
1144 store the new value in the frame parameter too. */
1146 if (BUFFER_LOCAL_VALUEP (valcontents)
1147 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1149 /* What binding is loaded right now? */
1150 current_alist_element
1151 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1153 /* If the current buffer is not the buffer whose binding is
1154 loaded, or if there may be frame-local bindings and the frame
1155 isn't the right one, or if it's a Lisp_Buffer_Local_Value and
1156 the default binding is loaded, the loaded binding may be the
1157 wrong one. */
1158 if (XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame)
1159 XCDR (current_alist_element) = newval;
1162 return newval;
1165 /* Access or set a buffer-local symbol's default value. */
1167 /* Return the default value of SYMBOL, but don't check for voidness.
1168 Return Qunbound if it is void. */
1170 Lisp_Object
1171 default_value (symbol)
1172 Lisp_Object symbol;
1174 register Lisp_Object valcontents;
1176 CHECK_SYMBOL (symbol, 0);
1177 valcontents = XSYMBOL (symbol)->value;
1179 /* For a built-in buffer-local variable, get the default value
1180 rather than letting do_symval_forwarding get the current value. */
1181 if (BUFFER_OBJFWDP (valcontents))
1183 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1184 if (PER_BUFFER_IDX (offset) != 0)
1185 return PER_BUFFER_DEFAULT (offset);
1188 /* Handle user-created local variables. */
1189 if (BUFFER_LOCAL_VALUEP (valcontents)
1190 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1192 /* If var is set up for a buffer that lacks a local value for it,
1193 the current value is nominally the default value.
1194 But the `realvalue' slot may be more up to date, since
1195 ordinary setq stores just that slot. So use that. */
1196 Lisp_Object current_alist_element, alist_element_car;
1197 current_alist_element
1198 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1199 alist_element_car = XCAR (current_alist_element);
1200 if (EQ (alist_element_car, current_alist_element))
1201 return do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue);
1202 else
1203 return XCDR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1205 /* For other variables, get the current value. */
1206 return do_symval_forwarding (valcontents);
1209 DEFUN ("default-boundp", Fdefault_boundp, Sdefault_boundp, 1, 1, 0,
1210 "Return t if SYMBOL has a non-void default value.\n\
1211 This is the value that is seen in buffers that do not have their own values\n\
1212 for this variable.")
1213 (symbol)
1214 Lisp_Object symbol;
1216 register Lisp_Object value;
1218 value = default_value (symbol);
1219 return (EQ (value, Qunbound) ? Qnil : Qt);
1222 DEFUN ("default-value", Fdefault_value, Sdefault_value, 1, 1, 0,
1223 "Return SYMBOL's default value.\n\
1224 This is the value that is seen in buffers that do not have their own values\n\
1225 for this variable. The default value is meaningful for variables with\n\
1226 local bindings in certain buffers.")
1227 (symbol)
1228 Lisp_Object symbol;
1230 register Lisp_Object value;
1232 value = default_value (symbol);
1233 if (EQ (value, Qunbound))
1234 return Fsignal (Qvoid_variable, Fcons (symbol, Qnil));
1235 return value;
1238 DEFUN ("set-default", Fset_default, Sset_default, 2, 2, 0,
1239 "Set SYMBOL's default value to VAL. SYMBOL and VAL are evaluated.\n\
1240 The default value is seen in buffers that do not have their own values\n\
1241 for this variable.")
1242 (symbol, value)
1243 Lisp_Object symbol, value;
1245 register Lisp_Object valcontents, current_alist_element, alist_element_buffer;
1247 CHECK_SYMBOL (symbol, 0);
1248 valcontents = XSYMBOL (symbol)->value;
1250 /* Handle variables like case-fold-search that have special slots
1251 in the buffer. Make them work apparently like Lisp_Buffer_Local_Value
1252 variables. */
1253 if (BUFFER_OBJFWDP (valcontents))
1255 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1256 int idx = PER_BUFFER_IDX (offset);
1258 PER_BUFFER_DEFAULT (offset) = value;
1260 /* If this variable is not always local in all buffers,
1261 set it in the buffers that don't nominally have a local value. */
1262 if (idx > 0)
1264 struct buffer *b;
1266 for (b = all_buffers; b; b = b->next)
1267 if (!PER_BUFFER_VALUE_P (b, idx))
1268 PER_BUFFER_VALUE (b, offset) = value;
1270 return value;
1273 if (!BUFFER_LOCAL_VALUEP (valcontents)
1274 && !SOME_BUFFER_LOCAL_VALUEP (valcontents))
1275 return Fset (symbol, value);
1277 /* Store new value into the DEFAULT-VALUE slot. */
1278 XCDR (XBUFFER_LOCAL_VALUE (valcontents)->cdr) = value;
1280 /* If the default binding is now loaded, set the REALVALUE slot too. */
1281 current_alist_element
1282 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1283 alist_element_buffer = Fcar (current_alist_element);
1284 if (EQ (alist_element_buffer, current_alist_element))
1285 store_symval_forwarding (symbol, XBUFFER_LOCAL_VALUE (valcontents)->realvalue,
1286 value);
1288 return value;
1291 DEFUN ("setq-default", Fsetq_default, Ssetq_default, 2, UNEVALLED, 0,
1292 "Set the default value of variable VAR to VALUE.\n\
1293 VAR, the variable name, is literal (not evaluated);\n\
1294 VALUE is an expression and it is evaluated.\n\
1295 The default value of a variable is seen in buffers\n\
1296 that do not have their own values for the variable.\n\
1298 More generally, you can use multiple variables and values, as in\n\
1299 (setq-default SYMBOL VALUE SYMBOL VALUE...)\n\
1300 This sets each SYMBOL's default value to the corresponding VALUE.\n\
1301 The VALUE for the Nth SYMBOL can refer to the new default values\n\
1302 of previous SYMs.")
1303 (args)
1304 Lisp_Object args;
1306 register Lisp_Object args_left;
1307 register Lisp_Object val, symbol;
1308 struct gcpro gcpro1;
1310 if (NILP (args))
1311 return Qnil;
1313 args_left = args;
1314 GCPRO1 (args);
1318 val = Feval (Fcar (Fcdr (args_left)));
1319 symbol = Fcar (args_left);
1320 Fset_default (symbol, val);
1321 args_left = Fcdr (Fcdr (args_left));
1323 while (!NILP (args_left));
1325 UNGCPRO;
1326 return val;
1329 /* Lisp functions for creating and removing buffer-local variables. */
1331 DEFUN ("make-variable-buffer-local", Fmake_variable_buffer_local, Smake_variable_buffer_local,
1332 1, 1, "vMake Variable Buffer Local: ",
1333 "Make VARIABLE become buffer-local whenever it is set.\n\
1334 At any time, the value for the current buffer is in effect,\n\
1335 unless the variable has never been set in this buffer,\n\
1336 in which case the default value is in effect.\n\
1337 Note that binding the variable with `let', or setting it while\n\
1338 a `let'-style binding made in this buffer is in effect,\n\
1339 does not make the variable buffer-local.\n\
1341 The function `default-value' gets the default value and `set-default' sets it.")
1342 (variable)
1343 register Lisp_Object variable;
1345 register Lisp_Object tem, valcontents, newval;
1347 CHECK_SYMBOL (variable, 0);
1349 valcontents = XSYMBOL (variable)->value;
1350 if (EQ (variable, Qnil) || EQ (variable, Qt) || KBOARD_OBJFWDP (valcontents))
1351 error ("Symbol %s may not be buffer-local", XSYMBOL (variable)->name->data);
1353 if (BUFFER_LOCAL_VALUEP (valcontents) || BUFFER_OBJFWDP (valcontents))
1354 return variable;
1355 if (SOME_BUFFER_LOCAL_VALUEP (valcontents))
1357 XMISCTYPE (XSYMBOL (variable)->value) = Lisp_Misc_Buffer_Local_Value;
1358 return variable;
1360 if (EQ (valcontents, Qunbound))
1361 XSYMBOL (variable)->value = Qnil;
1362 tem = Fcons (Qnil, Fsymbol_value (variable));
1363 XCAR (tem) = tem;
1364 newval = allocate_misc ();
1365 XMISCTYPE (newval) = Lisp_Misc_Buffer_Local_Value;
1366 XBUFFER_LOCAL_VALUE (newval)->realvalue = XSYMBOL (variable)->value;
1367 XBUFFER_LOCAL_VALUE (newval)->buffer = Fcurrent_buffer ();
1368 XBUFFER_LOCAL_VALUE (newval)->frame = Qnil;
1369 XBUFFER_LOCAL_VALUE (newval)->found_for_buffer = 0;
1370 XBUFFER_LOCAL_VALUE (newval)->found_for_frame = 0;
1371 XBUFFER_LOCAL_VALUE (newval)->check_frame = 0;
1372 XBUFFER_LOCAL_VALUE (newval)->cdr = tem;
1373 XSYMBOL (variable)->value = newval;
1374 return variable;
1377 DEFUN ("make-local-variable", Fmake_local_variable, Smake_local_variable,
1378 1, 1, "vMake Local Variable: ",
1379 "Make VARIABLE have a separate value in the current buffer.\n\
1380 Other buffers will continue to share a common default value.\n\
1381 \(The buffer-local value of VARIABLE starts out as the same value\n\
1382 VARIABLE previously had. If VARIABLE was void, it remains void.\)\n\
1383 See also `make-variable-buffer-local'.\n\
1385 If the variable is already arranged to become local when set,\n\
1386 this function causes a local value to exist for this buffer,\n\
1387 just as setting the variable would do.\n\
1389 This function returns VARIABLE, and therefore\n\
1390 (set (make-local-variable 'VARIABLE) VALUE-EXP)\n\
1391 works.\n\
1393 Do not use `make-local-variable' to make a hook variable buffer-local.\n\
1394 Use `make-local-hook' instead.")
1395 (variable)
1396 register Lisp_Object variable;
1398 register Lisp_Object tem, valcontents;
1400 CHECK_SYMBOL (variable, 0);
1402 valcontents = XSYMBOL (variable)->value;
1403 if (EQ (variable, Qnil) || EQ (variable, Qt) || KBOARD_OBJFWDP (valcontents))
1404 error ("Symbol %s may not be buffer-local", XSYMBOL (variable)->name->data);
1406 if (BUFFER_LOCAL_VALUEP (valcontents) || BUFFER_OBJFWDP (valcontents))
1408 tem = Fboundp (variable);
1410 /* Make sure the symbol has a local value in this particular buffer,
1411 by setting it to the same value it already has. */
1412 Fset (variable, (EQ (tem, Qt) ? Fsymbol_value (variable) : Qunbound));
1413 return variable;
1415 /* Make sure symbol is set up to hold per-buffer values. */
1416 if (!SOME_BUFFER_LOCAL_VALUEP (valcontents))
1418 Lisp_Object newval;
1419 tem = Fcons (Qnil, do_symval_forwarding (valcontents));
1420 XCAR (tem) = tem;
1421 newval = allocate_misc ();
1422 XMISCTYPE (newval) = Lisp_Misc_Some_Buffer_Local_Value;
1423 XBUFFER_LOCAL_VALUE (newval)->realvalue = XSYMBOL (variable)->value;
1424 XBUFFER_LOCAL_VALUE (newval)->buffer = Qnil;
1425 XBUFFER_LOCAL_VALUE (newval)->frame = Qnil;
1426 XBUFFER_LOCAL_VALUE (newval)->found_for_buffer = 0;
1427 XBUFFER_LOCAL_VALUE (newval)->found_for_frame = 0;
1428 XBUFFER_LOCAL_VALUE (newval)->check_frame = 0;
1429 XBUFFER_LOCAL_VALUE (newval)->cdr = tem;
1430 XSYMBOL (variable)->value = newval;
1432 /* Make sure this buffer has its own value of symbol. */
1433 tem = Fassq (variable, current_buffer->local_var_alist);
1434 if (NILP (tem))
1436 /* Swap out any local binding for some other buffer, and make
1437 sure the current value is permanently recorded, if it's the
1438 default value. */
1439 find_symbol_value (variable);
1441 current_buffer->local_var_alist
1442 = Fcons (Fcons (variable, XCDR (XBUFFER_LOCAL_VALUE (XSYMBOL (variable)->value)->cdr)),
1443 current_buffer->local_var_alist);
1445 /* Make sure symbol does not think it is set up for this buffer;
1446 force it to look once again for this buffer's value. */
1448 Lisp_Object *pvalbuf;
1450 valcontents = XSYMBOL (variable)->value;
1452 pvalbuf = &XBUFFER_LOCAL_VALUE (valcontents)->buffer;
1453 if (current_buffer == XBUFFER (*pvalbuf))
1454 *pvalbuf = Qnil;
1455 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
1459 /* If the symbol forwards into a C variable, then load the binding
1460 for this buffer now. If C code modifies the variable before we
1461 load the binding in, then that new value will clobber the default
1462 binding the next time we unload it. */
1463 valcontents = XBUFFER_LOCAL_VALUE (XSYMBOL (variable)->value)->realvalue;
1464 if (INTFWDP (valcontents) || BOOLFWDP (valcontents) || OBJFWDP (valcontents))
1465 swap_in_symval_forwarding (variable, XSYMBOL (variable)->value);
1467 return variable;
1470 DEFUN ("kill-local-variable", Fkill_local_variable, Skill_local_variable,
1471 1, 1, "vKill Local Variable: ",
1472 "Make VARIABLE no longer have a separate value in the current buffer.\n\
1473 From now on the default value will apply in this buffer.")
1474 (variable)
1475 register Lisp_Object variable;
1477 register Lisp_Object tem, valcontents;
1479 CHECK_SYMBOL (variable, 0);
1481 valcontents = XSYMBOL (variable)->value;
1483 if (BUFFER_OBJFWDP (valcontents))
1485 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1486 int idx = PER_BUFFER_IDX (offset);
1488 if (idx > 0)
1490 SET_PER_BUFFER_VALUE_P (current_buffer, idx, 0);
1491 PER_BUFFER_VALUE (current_buffer, offset)
1492 = PER_BUFFER_DEFAULT (offset);
1494 return variable;
1497 if (!BUFFER_LOCAL_VALUEP (valcontents)
1498 && !SOME_BUFFER_LOCAL_VALUEP (valcontents))
1499 return variable;
1501 /* Get rid of this buffer's alist element, if any. */
1503 tem = Fassq (variable, current_buffer->local_var_alist);
1504 if (!NILP (tem))
1505 current_buffer->local_var_alist
1506 = Fdelq (tem, current_buffer->local_var_alist);
1508 /* If the symbol is set up with the current buffer's binding
1509 loaded, recompute its value. We have to do it now, or else
1510 forwarded objects won't work right. */
1512 Lisp_Object *pvalbuf;
1513 valcontents = XSYMBOL (variable)->value;
1514 pvalbuf = &XBUFFER_LOCAL_VALUE (valcontents)->buffer;
1515 if (current_buffer == XBUFFER (*pvalbuf))
1517 *pvalbuf = Qnil;
1518 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
1519 find_symbol_value (variable);
1523 return variable;
1526 /* Lisp functions for creating and removing buffer-local variables. */
1528 DEFUN ("make-variable-frame-local", Fmake_variable_frame_local, Smake_variable_frame_local,
1529 1, 1, "vMake Variable Frame Local: ",
1530 "Enable VARIABLE to have frame-local bindings.\n\
1531 When a frame-local binding exists in the current frame,\n\
1532 it is in effect whenever the current buffer has no buffer-local binding.\n\
1533 A frame-local binding is actual a frame parameter value;\n\
1534 thus, any given frame has a local binding for VARIABLE\n\
1535 if it has a value for the frame parameter named VARIABLE.\n\
1536 See `modify-frame-parameters'.")
1537 (variable)
1538 register Lisp_Object variable;
1540 register Lisp_Object tem, valcontents, newval;
1542 CHECK_SYMBOL (variable, 0);
1544 valcontents = XSYMBOL (variable)->value;
1545 if (EQ (variable, Qnil) || EQ (variable, Qt) || KBOARD_OBJFWDP (valcontents)
1546 || BUFFER_OBJFWDP (valcontents))
1547 error ("Symbol %s may not be frame-local", XSYMBOL (variable)->name->data);
1549 if (BUFFER_LOCAL_VALUEP (valcontents)
1550 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1552 XBUFFER_LOCAL_VALUE (valcontents)->check_frame = 1;
1553 return variable;
1556 if (EQ (valcontents, Qunbound))
1557 XSYMBOL (variable)->value = Qnil;
1558 tem = Fcons (Qnil, Fsymbol_value (variable));
1559 XCAR (tem) = tem;
1560 newval = allocate_misc ();
1561 XMISCTYPE (newval) = Lisp_Misc_Some_Buffer_Local_Value;
1562 XBUFFER_LOCAL_VALUE (newval)->realvalue = XSYMBOL (variable)->value;
1563 XBUFFER_LOCAL_VALUE (newval)->buffer = Qnil;
1564 XBUFFER_LOCAL_VALUE (newval)->frame = Qnil;
1565 XBUFFER_LOCAL_VALUE (newval)->found_for_buffer = 0;
1566 XBUFFER_LOCAL_VALUE (newval)->found_for_frame = 0;
1567 XBUFFER_LOCAL_VALUE (newval)->check_frame = 1;
1568 XBUFFER_LOCAL_VALUE (newval)->cdr = tem;
1569 XSYMBOL (variable)->value = newval;
1570 return variable;
1573 DEFUN ("local-variable-p", Flocal_variable_p, Slocal_variable_p,
1574 1, 2, 0,
1575 "Non-nil if VARIABLE has a local binding in buffer BUFFER.\n\
1576 BUFFER defaults to the current buffer.")
1577 (variable, buffer)
1578 register Lisp_Object variable, buffer;
1580 Lisp_Object valcontents;
1581 register struct buffer *buf;
1583 if (NILP (buffer))
1584 buf = current_buffer;
1585 else
1587 CHECK_BUFFER (buffer, 0);
1588 buf = XBUFFER (buffer);
1591 CHECK_SYMBOL (variable, 0);
1593 valcontents = XSYMBOL (variable)->value;
1594 if (BUFFER_LOCAL_VALUEP (valcontents)
1595 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1597 Lisp_Object tail, elt;
1598 for (tail = buf->local_var_alist; CONSP (tail); tail = XCDR (tail))
1600 elt = XCAR (tail);
1601 if (EQ (variable, XCAR (elt)))
1602 return Qt;
1605 if (BUFFER_OBJFWDP (valcontents))
1607 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1608 int idx = PER_BUFFER_IDX (offset);
1609 if (idx == -1 || PER_BUFFER_VALUE_P (buf, idx))
1610 return Qt;
1612 return Qnil;
1615 DEFUN ("local-variable-if-set-p", Flocal_variable_if_set_p, Slocal_variable_if_set_p,
1616 1, 2, 0,
1617 "Non-nil if VARIABLE will be local in buffer BUFFER if it is set there.\n\
1618 BUFFER defaults to the current buffer.")
1619 (variable, buffer)
1620 register Lisp_Object variable, buffer;
1622 Lisp_Object valcontents;
1623 register struct buffer *buf;
1625 if (NILP (buffer))
1626 buf = current_buffer;
1627 else
1629 CHECK_BUFFER (buffer, 0);
1630 buf = XBUFFER (buffer);
1633 CHECK_SYMBOL (variable, 0);
1635 valcontents = XSYMBOL (variable)->value;
1637 /* This means that make-variable-buffer-local was done. */
1638 if (BUFFER_LOCAL_VALUEP (valcontents))
1639 return Qt;
1640 /* All these slots become local if they are set. */
1641 if (BUFFER_OBJFWDP (valcontents))
1642 return Qt;
1643 if (SOME_BUFFER_LOCAL_VALUEP (valcontents))
1645 Lisp_Object tail, elt;
1646 for (tail = buf->local_var_alist; CONSP (tail); tail = XCDR (tail))
1648 elt = XCAR (tail);
1649 if (EQ (variable, XCAR (elt)))
1650 return Qt;
1653 return Qnil;
1656 /* Find the function at the end of a chain of symbol function indirections. */
1658 /* If OBJECT is a symbol, find the end of its function chain and
1659 return the value found there. If OBJECT is not a symbol, just
1660 return it. If there is a cycle in the function chain, signal a
1661 cyclic-function-indirection error.
1663 This is like Findirect_function, except that it doesn't signal an
1664 error if the chain ends up unbound. */
1665 Lisp_Object
1666 indirect_function (object)
1667 register Lisp_Object object;
1669 Lisp_Object tortoise, hare;
1671 hare = tortoise = object;
1673 for (;;)
1675 if (!SYMBOLP (hare) || EQ (hare, Qunbound))
1676 break;
1677 hare = XSYMBOL (hare)->function;
1678 if (!SYMBOLP (hare) || EQ (hare, Qunbound))
1679 break;
1680 hare = XSYMBOL (hare)->function;
1682 tortoise = XSYMBOL (tortoise)->function;
1684 if (EQ (hare, tortoise))
1685 Fsignal (Qcyclic_function_indirection, Fcons (object, Qnil));
1688 return hare;
1691 DEFUN ("indirect-function", Findirect_function, Sindirect_function, 1, 1, 0,
1692 "Return the function at the end of OBJECT's function chain.\n\
1693 If OBJECT is a symbol, follow all function indirections and return the final\n\
1694 function binding.\n\
1695 If OBJECT is not a symbol, just return it.\n\
1696 Signal a void-function error if the final symbol is unbound.\n\
1697 Signal a cyclic-function-indirection error if there is a loop in the\n\
1698 function chain of symbols.")
1699 (object)
1700 register Lisp_Object object;
1702 Lisp_Object result;
1704 result = indirect_function (object);
1706 if (EQ (result, Qunbound))
1707 return Fsignal (Qvoid_function, Fcons (object, Qnil));
1708 return result;
1711 /* Extract and set vector and string elements */
1713 DEFUN ("aref", Faref, Saref, 2, 2, 0,
1714 "Return the element of ARRAY at index IDX.\n\
1715 ARRAY may be a vector, a string, a char-table, a bool-vector,\n\
1716 or a byte-code object. IDX starts at 0.")
1717 (array, idx)
1718 register Lisp_Object array;
1719 Lisp_Object idx;
1721 register int idxval;
1723 CHECK_NUMBER (idx, 1);
1724 idxval = XINT (idx);
1725 if (STRINGP (array))
1727 int c, idxval_byte;
1729 if (idxval < 0 || idxval >= XSTRING (array)->size)
1730 args_out_of_range (array, idx);
1731 if (! STRING_MULTIBYTE (array))
1732 return make_number ((unsigned char) XSTRING (array)->data[idxval]);
1733 idxval_byte = string_char_to_byte (array, idxval);
1735 c = STRING_CHAR (&XSTRING (array)->data[idxval_byte],
1736 STRING_BYTES (XSTRING (array)) - idxval_byte);
1737 return make_number (c);
1739 else if (BOOL_VECTOR_P (array))
1741 int val;
1743 if (idxval < 0 || idxval >= XBOOL_VECTOR (array)->size)
1744 args_out_of_range (array, idx);
1746 val = (unsigned char) XBOOL_VECTOR (array)->data[idxval / BITS_PER_CHAR];
1747 return (val & (1 << (idxval % BITS_PER_CHAR)) ? Qt : Qnil);
1749 else if (CHAR_TABLE_P (array))
1751 Lisp_Object val;
1753 val = Qnil;
1755 if (idxval < 0)
1756 args_out_of_range (array, idx);
1757 if (idxval < CHAR_TABLE_ORDINARY_SLOTS)
1759 /* For ASCII and 8-bit European characters, the element is
1760 stored in the top table. */
1761 val = XCHAR_TABLE (array)->contents[idxval];
1762 if (NILP (val))
1763 val = XCHAR_TABLE (array)->defalt;
1764 while (NILP (val)) /* Follow parents until we find some value. */
1766 array = XCHAR_TABLE (array)->parent;
1767 if (NILP (array))
1768 return Qnil;
1769 val = XCHAR_TABLE (array)->contents[idxval];
1770 if (NILP (val))
1771 val = XCHAR_TABLE (array)->defalt;
1773 return val;
1775 else
1777 int code[4], i;
1778 Lisp_Object sub_table;
1780 SPLIT_CHAR (idxval, code[0], code[1], code[2]);
1781 if (code[1] < 32) code[1] = -1;
1782 else if (code[2] < 32) code[2] = -1;
1784 /* Here, the possible range of CODE[0] (== charset ID) is
1785 128..MAX_CHARSET. Since the top level char table contains
1786 data for multibyte characters after 256th element, we must
1787 increment CODE[0] by 128 to get a correct index. */
1788 code[0] += 128;
1789 code[3] = -1; /* anchor */
1791 try_parent_char_table:
1792 sub_table = array;
1793 for (i = 0; code[i] >= 0; i++)
1795 val = XCHAR_TABLE (sub_table)->contents[code[i]];
1796 if (SUB_CHAR_TABLE_P (val))
1797 sub_table = val;
1798 else
1800 if (NILP (val))
1801 val = XCHAR_TABLE (sub_table)->defalt;
1802 if (NILP (val))
1804 array = XCHAR_TABLE (array)->parent;
1805 if (!NILP (array))
1806 goto try_parent_char_table;
1808 return val;
1811 /* Here, VAL is a sub char table. We try the default value
1812 and parent. */
1813 val = XCHAR_TABLE (val)->defalt;
1814 if (NILP (val))
1816 array = XCHAR_TABLE (array)->parent;
1817 if (!NILP (array))
1818 goto try_parent_char_table;
1820 return val;
1823 else
1825 int size = 0;
1826 if (VECTORP (array))
1827 size = XVECTOR (array)->size;
1828 else if (COMPILEDP (array))
1829 size = XVECTOR (array)->size & PSEUDOVECTOR_SIZE_MASK;
1830 else
1831 wrong_type_argument (Qarrayp, array);
1833 if (idxval < 0 || idxval >= size)
1834 args_out_of_range (array, idx);
1835 return XVECTOR (array)->contents[idxval];
1839 /* Don't use alloca for relocating string data larger than this, lest
1840 we overflow their stack. The value is the same as what used in
1841 fns.c for base64 handling. */
1842 #define MAX_ALLOCA 16*1024
1844 DEFUN ("aset", Faset, Saset, 3, 3, 0,
1845 "Store into the element of ARRAY at index IDX the value NEWELT.\n\
1846 ARRAY may be a vector, a string, a char-table or a bool-vector.\n\
1847 IDX starts at 0.")
1848 (array, idx, newelt)
1849 register Lisp_Object array;
1850 Lisp_Object idx, newelt;
1852 register int idxval;
1854 CHECK_NUMBER (idx, 1);
1855 idxval = XINT (idx);
1856 if (!VECTORP (array) && !STRINGP (array) && !BOOL_VECTOR_P (array)
1857 && ! CHAR_TABLE_P (array))
1858 array = wrong_type_argument (Qarrayp, array);
1859 CHECK_IMPURE (array);
1861 if (VECTORP (array))
1863 if (idxval < 0 || idxval >= XVECTOR (array)->size)
1864 args_out_of_range (array, idx);
1865 XVECTOR (array)->contents[idxval] = newelt;
1867 else if (BOOL_VECTOR_P (array))
1869 int val;
1871 if (idxval < 0 || idxval >= XBOOL_VECTOR (array)->size)
1872 args_out_of_range (array, idx);
1874 val = (unsigned char) XBOOL_VECTOR (array)->data[idxval / BITS_PER_CHAR];
1876 if (! NILP (newelt))
1877 val |= 1 << (idxval % BITS_PER_CHAR);
1878 else
1879 val &= ~(1 << (idxval % BITS_PER_CHAR));
1880 XBOOL_VECTOR (array)->data[idxval / BITS_PER_CHAR] = val;
1882 else if (CHAR_TABLE_P (array))
1884 if (idxval < 0)
1885 args_out_of_range (array, idx);
1886 if (idxval < CHAR_TABLE_ORDINARY_SLOTS)
1887 XCHAR_TABLE (array)->contents[idxval] = newelt;
1888 else
1890 int code[4], i;
1891 Lisp_Object val;
1893 SPLIT_CHAR (idxval, code[0], code[1], code[2]);
1894 if (code[1] < 32) code[1] = -1;
1895 else if (code[2] < 32) code[2] = -1;
1897 /* See the comment of the corresponding part in Faref. */
1898 code[0] += 128;
1899 code[3] = -1; /* anchor */
1900 for (i = 0; code[i + 1] >= 0; i++)
1902 val = XCHAR_TABLE (array)->contents[code[i]];
1903 if (SUB_CHAR_TABLE_P (val))
1904 array = val;
1905 else
1907 Lisp_Object temp;
1909 /* VAL is a leaf. Create a sub char table with the
1910 default value VAL or XCHAR_TABLE (array)->defalt
1911 and look into it. */
1913 temp = make_sub_char_table (NILP (val)
1914 ? XCHAR_TABLE (array)->defalt
1915 : val);
1916 XCHAR_TABLE (array)->contents[code[i]] = temp;
1917 array = temp;
1920 XCHAR_TABLE (array)->contents[code[i]] = newelt;
1923 else if (STRING_MULTIBYTE (array))
1925 int idxval_byte, prev_bytes, new_bytes;
1926 unsigned char workbuf[MAX_MULTIBYTE_LENGTH], *p0 = workbuf, *p1;
1928 if (idxval < 0 || idxval >= XSTRING (array)->size)
1929 args_out_of_range (array, idx);
1930 CHECK_NUMBER (newelt, 2);
1932 idxval_byte = string_char_to_byte (array, idxval);
1933 p1 = &XSTRING (array)->data[idxval_byte];
1934 PARSE_MULTIBYTE_SEQ (p1, nbytes - idxval_byte, prev_bytes);
1935 new_bytes = CHAR_STRING (XINT (newelt), p0);
1936 if (prev_bytes != new_bytes)
1938 /* We must relocate the string data. */
1939 int nchars = XSTRING (array)->size;
1940 int nbytes = STRING_BYTES (XSTRING (array));
1941 unsigned char *str;
1943 str = (nbytes <= MAX_ALLOCA
1944 ? (unsigned char *) alloca (nbytes)
1945 : (unsigned char *) xmalloc (nbytes));
1946 bcopy (XSTRING (array)->data, str, nbytes);
1947 allocate_string_data (XSTRING (array), nchars,
1948 nbytes + new_bytes - prev_bytes);
1949 bcopy (str, XSTRING (array)->data, idxval_byte);
1950 p1 = XSTRING (array)->data + idxval_byte;
1951 bcopy (str + idxval_byte + prev_bytes, p1 + new_bytes,
1952 nbytes - (idxval_byte + prev_bytes));
1953 if (nbytes > MAX_ALLOCA)
1954 xfree (str);
1955 clear_string_char_byte_cache ();
1957 while (new_bytes--)
1958 *p1++ = *p0++;
1960 else
1962 if (idxval < 0 || idxval >= XSTRING (array)->size)
1963 args_out_of_range (array, idx);
1964 CHECK_NUMBER (newelt, 2);
1966 if (XINT (newelt) < 0 || SINGLE_BYTE_CHAR_P (XINT (newelt)))
1967 XSTRING (array)->data[idxval] = XINT (newelt);
1968 else
1970 /* We must relocate the string data while converting it to
1971 multibyte. */
1972 int idxval_byte, prev_bytes, new_bytes;
1973 unsigned char workbuf[MAX_MULTIBYTE_LENGTH], *p0 = workbuf, *p1;
1974 unsigned char *origstr = XSTRING (array)->data, *str;
1975 int nchars, nbytes;
1977 nchars = XSTRING (array)->size;
1978 nbytes = idxval_byte = count_size_as_multibyte (origstr, idxval);
1979 nbytes += count_size_as_multibyte (origstr + idxval,
1980 nchars - idxval);
1981 str = (nbytes <= MAX_ALLOCA
1982 ? (unsigned char *) alloca (nbytes)
1983 : (unsigned char *) xmalloc (nbytes));
1984 copy_text (XSTRING (array)->data, str, nchars, 0, 1);
1985 PARSE_MULTIBYTE_SEQ (str + idxval_byte, nbytes - idxval_byte,
1986 prev_bytes);
1987 new_bytes = CHAR_STRING (XINT (newelt), p0);
1988 allocate_string_data (XSTRING (array), nchars,
1989 nbytes + new_bytes - prev_bytes);
1990 bcopy (str, XSTRING (array)->data, idxval_byte);
1991 p1 = XSTRING (array)->data + idxval_byte;
1992 while (new_bytes--)
1993 *p1++ = *p0++;
1994 bcopy (str + idxval_byte + prev_bytes, p1,
1995 nbytes - (idxval_byte + prev_bytes));
1996 if (nbytes > MAX_ALLOCA)
1997 xfree (str);
1998 clear_string_char_byte_cache ();
2002 return newelt;
2005 /* Arithmetic functions */
2007 enum comparison { equal, notequal, less, grtr, less_or_equal, grtr_or_equal };
2009 Lisp_Object
2010 arithcompare (num1, num2, comparison)
2011 Lisp_Object num1, num2;
2012 enum comparison comparison;
2014 double f1 = 0, f2 = 0;
2015 int floatp = 0;
2017 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num1, 0);
2018 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num2, 0);
2020 if (FLOATP (num1) || FLOATP (num2))
2022 floatp = 1;
2023 f1 = (FLOATP (num1)) ? XFLOAT_DATA (num1) : XINT (num1);
2024 f2 = (FLOATP (num2)) ? XFLOAT_DATA (num2) : XINT (num2);
2027 switch (comparison)
2029 case equal:
2030 if (floatp ? f1 == f2 : XINT (num1) == XINT (num2))
2031 return Qt;
2032 return Qnil;
2034 case notequal:
2035 if (floatp ? f1 != f2 : XINT (num1) != XINT (num2))
2036 return Qt;
2037 return Qnil;
2039 case less:
2040 if (floatp ? f1 < f2 : XINT (num1) < XINT (num2))
2041 return Qt;
2042 return Qnil;
2044 case less_or_equal:
2045 if (floatp ? f1 <= f2 : XINT (num1) <= XINT (num2))
2046 return Qt;
2047 return Qnil;
2049 case grtr:
2050 if (floatp ? f1 > f2 : XINT (num1) > XINT (num2))
2051 return Qt;
2052 return Qnil;
2054 case grtr_or_equal:
2055 if (floatp ? f1 >= f2 : XINT (num1) >= XINT (num2))
2056 return Qt;
2057 return Qnil;
2059 default:
2060 abort ();
2064 DEFUN ("=", Feqlsign, Seqlsign, 2, 2, 0,
2065 "Return t if two args, both numbers or markers, are equal.")
2066 (num1, num2)
2067 register Lisp_Object num1, num2;
2069 return arithcompare (num1, num2, equal);
2072 DEFUN ("<", Flss, Slss, 2, 2, 0,
2073 "Return t if first arg is less than second arg. Both must be numbers or markers.")
2074 (num1, num2)
2075 register Lisp_Object num1, num2;
2077 return arithcompare (num1, num2, less);
2080 DEFUN (">", Fgtr, Sgtr, 2, 2, 0,
2081 "Return t if first arg is greater than second arg. Both must be numbers or markers.")
2082 (num1, num2)
2083 register Lisp_Object num1, num2;
2085 return arithcompare (num1, num2, grtr);
2088 DEFUN ("<=", Fleq, Sleq, 2, 2, 0,
2089 "Return t if first arg is less than or equal to second arg.\n\
2090 Both must be numbers or markers.")
2091 (num1, num2)
2092 register Lisp_Object num1, num2;
2094 return arithcompare (num1, num2, less_or_equal);
2097 DEFUN (">=", Fgeq, Sgeq, 2, 2, 0,
2098 "Return t if first arg is greater than or equal to second arg.\n\
2099 Both must be numbers or markers.")
2100 (num1, num2)
2101 register Lisp_Object num1, num2;
2103 return arithcompare (num1, num2, grtr_or_equal);
2106 DEFUN ("/=", Fneq, Sneq, 2, 2, 0,
2107 "Return t if first arg is not equal to second arg. Both must be numbers or markers.")
2108 (num1, num2)
2109 register Lisp_Object num1, num2;
2111 return arithcompare (num1, num2, notequal);
2114 DEFUN ("zerop", Fzerop, Szerop, 1, 1, 0, "Return t if NUMBER is zero.")
2115 (number)
2116 register Lisp_Object number;
2118 CHECK_NUMBER_OR_FLOAT (number, 0);
2120 if (FLOATP (number))
2122 if (XFLOAT_DATA (number) == 0.0)
2123 return Qt;
2124 return Qnil;
2127 if (!XINT (number))
2128 return Qt;
2129 return Qnil;
2132 /* Convert between long values and pairs of Lisp integers. */
2134 Lisp_Object
2135 long_to_cons (i)
2136 unsigned long i;
2138 unsigned int top = i >> 16;
2139 unsigned int bot = i & 0xFFFF;
2140 if (top == 0)
2141 return make_number (bot);
2142 if (top == (unsigned long)-1 >> 16)
2143 return Fcons (make_number (-1), make_number (bot));
2144 return Fcons (make_number (top), make_number (bot));
2147 unsigned long
2148 cons_to_long (c)
2149 Lisp_Object c;
2151 Lisp_Object top, bot;
2152 if (INTEGERP (c))
2153 return XINT (c);
2154 top = XCAR (c);
2155 bot = XCDR (c);
2156 if (CONSP (bot))
2157 bot = XCAR (bot);
2158 return ((XINT (top) << 16) | XINT (bot));
2161 DEFUN ("number-to-string", Fnumber_to_string, Snumber_to_string, 1, 1, 0,
2162 "Convert NUMBER to a string by printing it in decimal.\n\
2163 Uses a minus sign if negative.\n\
2164 NUMBER may be an integer or a floating point number.")
2165 (number)
2166 Lisp_Object number;
2168 char buffer[VALBITS];
2170 CHECK_NUMBER_OR_FLOAT (number, 0);
2172 if (FLOATP (number))
2174 char pigbuf[350]; /* see comments in float_to_string */
2176 float_to_string (pigbuf, XFLOAT_DATA (number));
2177 return build_string (pigbuf);
2180 if (sizeof (int) == sizeof (EMACS_INT))
2181 sprintf (buffer, "%d", XINT (number));
2182 else if (sizeof (long) == sizeof (EMACS_INT))
2183 sprintf (buffer, "%ld", (long) XINT (number));
2184 else
2185 abort ();
2186 return build_string (buffer);
2189 INLINE static int
2190 digit_to_number (character, base)
2191 int character, base;
2193 int digit;
2195 if (character >= '0' && character <= '9')
2196 digit = character - '0';
2197 else if (character >= 'a' && character <= 'z')
2198 digit = character - 'a' + 10;
2199 else if (character >= 'A' && character <= 'Z')
2200 digit = character - 'A' + 10;
2201 else
2202 return -1;
2204 if (digit >= base)
2205 return -1;
2206 else
2207 return digit;
2210 DEFUN ("string-to-number", Fstring_to_number, Sstring_to_number, 1, 2, 0,
2211 "Convert STRING to a number by parsing it as a decimal number.\n\
2212 This parses both integers and floating point numbers.\n\
2213 It ignores leading spaces and tabs.\n\
2215 If BASE, interpret STRING as a number in that base. If BASE isn't\n\
2216 present, base 10 is used. BASE must be between 2 and 16 (inclusive).\n\
2217 If the base used is not 10, floating point is not recognized.")
2218 (string, base)
2219 register Lisp_Object string, base;
2221 register unsigned char *p;
2222 register int b;
2223 int sign = 1;
2224 Lisp_Object val;
2226 CHECK_STRING (string, 0);
2228 if (NILP (base))
2229 b = 10;
2230 else
2232 CHECK_NUMBER (base, 1);
2233 b = XINT (base);
2234 if (b < 2 || b > 16)
2235 Fsignal (Qargs_out_of_range, Fcons (base, Qnil));
2238 /* Skip any whitespace at the front of the number. Some versions of
2239 atoi do this anyway, so we might as well make Emacs lisp consistent. */
2240 p = XSTRING (string)->data;
2241 while (*p == ' ' || *p == '\t')
2242 p++;
2244 if (*p == '-')
2246 sign = -1;
2247 p++;
2249 else if (*p == '+')
2250 p++;
2252 if (isfloat_string (p) && b == 10)
2253 val = make_float (sign * atof (p));
2254 else
2256 double v = 0;
2258 while (1)
2260 int digit = digit_to_number (*p++, b);
2261 if (digit < 0)
2262 break;
2263 v = v * b + digit;
2266 if (v > (EMACS_UINT) (VALMASK >> 1))
2267 val = make_float (sign * v);
2268 else
2269 val = make_number (sign * (int) v);
2272 return val;
2276 enum arithop
2277 { Aadd, Asub, Amult, Adiv, Alogand, Alogior, Alogxor, Amax, Amin };
2279 extern Lisp_Object float_arith_driver ();
2280 extern Lisp_Object fmod_float ();
2282 Lisp_Object
2283 arith_driver (code, nargs, args)
2284 enum arithop code;
2285 int nargs;
2286 register Lisp_Object *args;
2288 register Lisp_Object val;
2289 register int argnum;
2290 register EMACS_INT accum;
2291 register EMACS_INT next;
2293 switch (SWITCH_ENUM_CAST (code))
2295 case Alogior:
2296 case Alogxor:
2297 case Aadd:
2298 case Asub:
2299 accum = 0; break;
2300 case Amult:
2301 accum = 1; break;
2302 case Alogand:
2303 accum = -1; break;
2306 for (argnum = 0; argnum < nargs; argnum++)
2308 val = args[argnum]; /* using args[argnum] as argument to CHECK_NUMBER_... */
2309 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val, argnum);
2311 if (FLOATP (val)) /* time to do serious math */
2312 return (float_arith_driver ((double) accum, argnum, code,
2313 nargs, args));
2314 args[argnum] = val; /* runs into a compiler bug. */
2315 next = XINT (args[argnum]);
2316 switch (SWITCH_ENUM_CAST (code))
2318 case Aadd: accum += next; break;
2319 case Asub:
2320 accum = argnum ? accum - next : nargs == 1 ? - next : next;
2321 break;
2322 case Amult: accum *= next; break;
2323 case Adiv:
2324 if (!argnum) accum = next;
2325 else
2327 if (next == 0)
2328 Fsignal (Qarith_error, Qnil);
2329 accum /= next;
2331 break;
2332 case Alogand: accum &= next; break;
2333 case Alogior: accum |= next; break;
2334 case Alogxor: accum ^= next; break;
2335 case Amax: if (!argnum || next > accum) accum = next; break;
2336 case Amin: if (!argnum || next < accum) accum = next; break;
2340 XSETINT (val, accum);
2341 return val;
2344 #undef isnan
2345 #define isnan(x) ((x) != (x))
2347 Lisp_Object
2348 float_arith_driver (accum, argnum, code, nargs, args)
2349 double accum;
2350 register int argnum;
2351 enum arithop code;
2352 int nargs;
2353 register Lisp_Object *args;
2355 register Lisp_Object val;
2356 double next;
2358 for (; argnum < nargs; argnum++)
2360 val = args[argnum]; /* using args[argnum] as argument to CHECK_NUMBER_... */
2361 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val, argnum);
2363 if (FLOATP (val))
2365 next = XFLOAT_DATA (val);
2367 else
2369 args[argnum] = val; /* runs into a compiler bug. */
2370 next = XINT (args[argnum]);
2372 switch (SWITCH_ENUM_CAST (code))
2374 case Aadd:
2375 accum += next;
2376 break;
2377 case Asub:
2378 accum = argnum ? accum - next : nargs == 1 ? - next : next;
2379 break;
2380 case Amult:
2381 accum *= next;
2382 break;
2383 case Adiv:
2384 if (!argnum)
2385 accum = next;
2386 else
2388 if (! IEEE_FLOATING_POINT && next == 0)
2389 Fsignal (Qarith_error, Qnil);
2390 accum /= next;
2392 break;
2393 case Alogand:
2394 case Alogior:
2395 case Alogxor:
2396 return wrong_type_argument (Qinteger_or_marker_p, val);
2397 case Amax:
2398 if (!argnum || isnan (next) || next > accum)
2399 accum = next;
2400 break;
2401 case Amin:
2402 if (!argnum || isnan (next) || next < accum)
2403 accum = next;
2404 break;
2408 return make_float (accum);
2412 DEFUN ("+", Fplus, Splus, 0, MANY, 0,
2413 "Return sum of any number of arguments, which are numbers or markers.")
2414 (nargs, args)
2415 int nargs;
2416 Lisp_Object *args;
2418 return arith_driver (Aadd, nargs, args);
2421 DEFUN ("-", Fminus, Sminus, 0, MANY, 0,
2422 "Negate number or subtract numbers or markers.\n\
2423 With one arg, negates it. With more than one arg,\n\
2424 subtracts all but the first from the first.")
2425 (nargs, args)
2426 int nargs;
2427 Lisp_Object *args;
2429 return arith_driver (Asub, nargs, args);
2432 DEFUN ("*", Ftimes, Stimes, 0, MANY, 0,
2433 "Returns product of any number of arguments, which are numbers or markers.")
2434 (nargs, args)
2435 int nargs;
2436 Lisp_Object *args;
2438 return arith_driver (Amult, nargs, args);
2441 DEFUN ("/", Fquo, Squo, 2, MANY, 0,
2442 "Returns first argument divided by all the remaining arguments.\n\
2443 The arguments must be numbers or markers.")
2444 (nargs, args)
2445 int nargs;
2446 Lisp_Object *args;
2448 return arith_driver (Adiv, nargs, args);
2451 DEFUN ("%", Frem, Srem, 2, 2, 0,
2452 "Returns remainder of X divided by Y.\n\
2453 Both must be integers or markers.")
2454 (x, y)
2455 register Lisp_Object x, y;
2457 Lisp_Object val;
2459 CHECK_NUMBER_COERCE_MARKER (x, 0);
2460 CHECK_NUMBER_COERCE_MARKER (y, 1);
2462 if (XFASTINT (y) == 0)
2463 Fsignal (Qarith_error, Qnil);
2465 XSETINT (val, XINT (x) % XINT (y));
2466 return val;
2469 #ifndef HAVE_FMOD
2470 double
2471 fmod (f1, f2)
2472 double f1, f2;
2474 double r = f1;
2476 if (f2 < 0.0)
2477 f2 = -f2;
2479 /* If the magnitude of the result exceeds that of the divisor, or
2480 the sign of the result does not agree with that of the dividend,
2481 iterate with the reduced value. This does not yield a
2482 particularly accurate result, but at least it will be in the
2483 range promised by fmod. */
2485 r -= f2 * floor (r / f2);
2486 while (f2 <= (r < 0 ? -r : r) || ((r < 0) != (f1 < 0) && ! isnan (r)));
2488 return r;
2490 #endif /* ! HAVE_FMOD */
2492 DEFUN ("mod", Fmod, Smod, 2, 2, 0,
2493 "Returns X modulo Y.\n\
2494 The result falls between zero (inclusive) and Y (exclusive).\n\
2495 Both X and Y must be numbers or markers.")
2496 (x, y)
2497 register Lisp_Object x, y;
2499 Lisp_Object val;
2500 EMACS_INT i1, i2;
2502 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (x, 0);
2503 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (y, 1);
2505 if (FLOATP (x) || FLOATP (y))
2506 return fmod_float (x, y);
2508 i1 = XINT (x);
2509 i2 = XINT (y);
2511 if (i2 == 0)
2512 Fsignal (Qarith_error, Qnil);
2514 i1 %= i2;
2516 /* If the "remainder" comes out with the wrong sign, fix it. */
2517 if (i2 < 0 ? i1 > 0 : i1 < 0)
2518 i1 += i2;
2520 XSETINT (val, i1);
2521 return val;
2524 DEFUN ("max", Fmax, Smax, 1, MANY, 0,
2525 "Return largest of all the arguments (which must be numbers or markers).\n\
2526 The value is always a number; markers are converted to numbers.")
2527 (nargs, args)
2528 int nargs;
2529 Lisp_Object *args;
2531 return arith_driver (Amax, nargs, args);
2534 DEFUN ("min", Fmin, Smin, 1, MANY, 0,
2535 "Return smallest of all the arguments (which must be numbers or markers).\n\
2536 The value is always a number; markers are converted to numbers.")
2537 (nargs, args)
2538 int nargs;
2539 Lisp_Object *args;
2541 return arith_driver (Amin, nargs, args);
2544 DEFUN ("logand", Flogand, Slogand, 0, MANY, 0,
2545 "Return bitwise-and of all the arguments.\n\
2546 Arguments may be integers, or markers converted to integers.")
2547 (nargs, args)
2548 int nargs;
2549 Lisp_Object *args;
2551 return arith_driver (Alogand, nargs, args);
2554 DEFUN ("logior", Flogior, Slogior, 0, MANY, 0,
2555 "Return bitwise-or of all the arguments.\n\
2556 Arguments may be integers, or markers converted to integers.")
2557 (nargs, args)
2558 int nargs;
2559 Lisp_Object *args;
2561 return arith_driver (Alogior, nargs, args);
2564 DEFUN ("logxor", Flogxor, Slogxor, 0, MANY, 0,
2565 "Return bitwise-exclusive-or of all the arguments.\n\
2566 Arguments may be integers, or markers converted to integers.")
2567 (nargs, args)
2568 int nargs;
2569 Lisp_Object *args;
2571 return arith_driver (Alogxor, nargs, args);
2574 DEFUN ("ash", Fash, Sash, 2, 2, 0,
2575 "Return VALUE with its bits shifted left by COUNT.\n\
2576 If COUNT is negative, shifting is actually to the right.\n\
2577 In this case, the sign bit is duplicated.")
2578 (value, count)
2579 register Lisp_Object value, count;
2581 register Lisp_Object val;
2583 CHECK_NUMBER (value, 0);
2584 CHECK_NUMBER (count, 1);
2586 if (XINT (count) >= BITS_PER_EMACS_INT)
2587 XSETINT (val, 0);
2588 else if (XINT (count) > 0)
2589 XSETINT (val, XINT (value) << XFASTINT (count));
2590 else if (XINT (count) <= -BITS_PER_EMACS_INT)
2591 XSETINT (val, XINT (value) < 0 ? -1 : 0);
2592 else
2593 XSETINT (val, XINT (value) >> -XINT (count));
2594 return val;
2597 DEFUN ("lsh", Flsh, Slsh, 2, 2, 0,
2598 "Return VALUE with its bits shifted left by COUNT.\n\
2599 If COUNT is negative, shifting is actually to the right.\n\
2600 In this case, zeros are shifted in on the left.")
2601 (value, count)
2602 register Lisp_Object value, count;
2604 register Lisp_Object val;
2606 CHECK_NUMBER (value, 0);
2607 CHECK_NUMBER (count, 1);
2609 if (XINT (count) >= BITS_PER_EMACS_INT)
2610 XSETINT (val, 0);
2611 else if (XINT (count) > 0)
2612 XSETINT (val, (EMACS_UINT) XUINT (value) << XFASTINT (count));
2613 else if (XINT (count) <= -BITS_PER_EMACS_INT)
2614 XSETINT (val, 0);
2615 else
2616 XSETINT (val, (EMACS_UINT) XUINT (value) >> -XINT (count));
2617 return val;
2620 DEFUN ("1+", Fadd1, Sadd1, 1, 1, 0,
2621 "Return NUMBER plus one. NUMBER may be a number or a marker.\n\
2622 Markers are converted to integers.")
2623 (number)
2624 register Lisp_Object number;
2626 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number, 0);
2628 if (FLOATP (number))
2629 return (make_float (1.0 + XFLOAT_DATA (number)));
2631 XSETINT (number, XINT (number) + 1);
2632 return number;
2635 DEFUN ("1-", Fsub1, Ssub1, 1, 1, 0,
2636 "Return NUMBER minus one. NUMBER may be a number or a marker.\n\
2637 Markers are converted to integers.")
2638 (number)
2639 register Lisp_Object number;
2641 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number, 0);
2643 if (FLOATP (number))
2644 return (make_float (-1.0 + XFLOAT_DATA (number)));
2646 XSETINT (number, XINT (number) - 1);
2647 return number;
2650 DEFUN ("lognot", Flognot, Slognot, 1, 1, 0,
2651 "Return the bitwise complement of NUMBER. NUMBER must be an integer.")
2652 (number)
2653 register Lisp_Object number;
2655 CHECK_NUMBER (number, 0);
2656 XSETINT (number, ~XINT (number));
2657 return number;
2660 void
2661 syms_of_data ()
2663 Lisp_Object error_tail, arith_tail;
2665 Qquote = intern ("quote");
2666 Qlambda = intern ("lambda");
2667 Qsubr = intern ("subr");
2668 Qerror_conditions = intern ("error-conditions");
2669 Qerror_message = intern ("error-message");
2670 Qtop_level = intern ("top-level");
2672 Qerror = intern ("error");
2673 Qquit = intern ("quit");
2674 Qwrong_type_argument = intern ("wrong-type-argument");
2675 Qargs_out_of_range = intern ("args-out-of-range");
2676 Qvoid_function = intern ("void-function");
2677 Qcyclic_function_indirection = intern ("cyclic-function-indirection");
2678 Qvoid_variable = intern ("void-variable");
2679 Qsetting_constant = intern ("setting-constant");
2680 Qinvalid_read_syntax = intern ("invalid-read-syntax");
2682 Qinvalid_function = intern ("invalid-function");
2683 Qwrong_number_of_arguments = intern ("wrong-number-of-arguments");
2684 Qno_catch = intern ("no-catch");
2685 Qend_of_file = intern ("end-of-file");
2686 Qarith_error = intern ("arith-error");
2687 Qbeginning_of_buffer = intern ("beginning-of-buffer");
2688 Qend_of_buffer = intern ("end-of-buffer");
2689 Qbuffer_read_only = intern ("buffer-read-only");
2690 Qtext_read_only = intern ("text-read-only");
2691 Qmark_inactive = intern ("mark-inactive");
2693 Qlistp = intern ("listp");
2694 Qconsp = intern ("consp");
2695 Qsymbolp = intern ("symbolp");
2696 Qkeywordp = intern ("keywordp");
2697 Qintegerp = intern ("integerp");
2698 Qnatnump = intern ("natnump");
2699 Qwholenump = intern ("wholenump");
2700 Qstringp = intern ("stringp");
2701 Qarrayp = intern ("arrayp");
2702 Qsequencep = intern ("sequencep");
2703 Qbufferp = intern ("bufferp");
2704 Qvectorp = intern ("vectorp");
2705 Qchar_or_string_p = intern ("char-or-string-p");
2706 Qmarkerp = intern ("markerp");
2707 Qbuffer_or_string_p = intern ("buffer-or-string-p");
2708 Qinteger_or_marker_p = intern ("integer-or-marker-p");
2709 Qboundp = intern ("boundp");
2710 Qfboundp = intern ("fboundp");
2712 Qfloatp = intern ("floatp");
2713 Qnumberp = intern ("numberp");
2714 Qnumber_or_marker_p = intern ("number-or-marker-p");
2716 Qchar_table_p = intern ("char-table-p");
2717 Qvector_or_char_table_p = intern ("vector-or-char-table-p");
2719 Qsubrp = intern ("subrp");
2720 Qunevalled = intern ("unevalled");
2721 Qmany = intern ("many");
2723 Qcdr = intern ("cdr");
2725 /* Handle automatic advice activation */
2726 Qad_advice_info = intern ("ad-advice-info");
2727 Qad_activate_internal = intern ("ad-activate-internal");
2729 error_tail = Fcons (Qerror, Qnil);
2731 /* ERROR is used as a signaler for random errors for which nothing else is right */
2733 Fput (Qerror, Qerror_conditions,
2734 error_tail);
2735 Fput (Qerror, Qerror_message,
2736 build_string ("error"));
2738 Fput (Qquit, Qerror_conditions,
2739 Fcons (Qquit, Qnil));
2740 Fput (Qquit, Qerror_message,
2741 build_string ("Quit"));
2743 Fput (Qwrong_type_argument, Qerror_conditions,
2744 Fcons (Qwrong_type_argument, error_tail));
2745 Fput (Qwrong_type_argument, Qerror_message,
2746 build_string ("Wrong type argument"));
2748 Fput (Qargs_out_of_range, Qerror_conditions,
2749 Fcons (Qargs_out_of_range, error_tail));
2750 Fput (Qargs_out_of_range, Qerror_message,
2751 build_string ("Args out of range"));
2753 Fput (Qvoid_function, Qerror_conditions,
2754 Fcons (Qvoid_function, error_tail));
2755 Fput (Qvoid_function, Qerror_message,
2756 build_string ("Symbol's function definition is void"));
2758 Fput (Qcyclic_function_indirection, Qerror_conditions,
2759 Fcons (Qcyclic_function_indirection, error_tail));
2760 Fput (Qcyclic_function_indirection, Qerror_message,
2761 build_string ("Symbol's chain of function indirections contains a loop"));
2763 Fput (Qvoid_variable, Qerror_conditions,
2764 Fcons (Qvoid_variable, error_tail));
2765 Fput (Qvoid_variable, Qerror_message,
2766 build_string ("Symbol's value as variable is void"));
2768 Fput (Qsetting_constant, Qerror_conditions,
2769 Fcons (Qsetting_constant, error_tail));
2770 Fput (Qsetting_constant, Qerror_message,
2771 build_string ("Attempt to set a constant symbol"));
2773 Fput (Qinvalid_read_syntax, Qerror_conditions,
2774 Fcons (Qinvalid_read_syntax, error_tail));
2775 Fput (Qinvalid_read_syntax, Qerror_message,
2776 build_string ("Invalid read syntax"));
2778 Fput (Qinvalid_function, Qerror_conditions,
2779 Fcons (Qinvalid_function, error_tail));
2780 Fput (Qinvalid_function, Qerror_message,
2781 build_string ("Invalid function"));
2783 Fput (Qwrong_number_of_arguments, Qerror_conditions,
2784 Fcons (Qwrong_number_of_arguments, error_tail));
2785 Fput (Qwrong_number_of_arguments, Qerror_message,
2786 build_string ("Wrong number of arguments"));
2788 Fput (Qno_catch, Qerror_conditions,
2789 Fcons (Qno_catch, error_tail));
2790 Fput (Qno_catch, Qerror_message,
2791 build_string ("No catch for tag"));
2793 Fput (Qend_of_file, Qerror_conditions,
2794 Fcons (Qend_of_file, error_tail));
2795 Fput (Qend_of_file, Qerror_message,
2796 build_string ("End of file during parsing"));
2798 arith_tail = Fcons (Qarith_error, error_tail);
2799 Fput (Qarith_error, Qerror_conditions,
2800 arith_tail);
2801 Fput (Qarith_error, Qerror_message,
2802 build_string ("Arithmetic error"));
2804 Fput (Qbeginning_of_buffer, Qerror_conditions,
2805 Fcons (Qbeginning_of_buffer, error_tail));
2806 Fput (Qbeginning_of_buffer, Qerror_message,
2807 build_string ("Beginning of buffer"));
2809 Fput (Qend_of_buffer, Qerror_conditions,
2810 Fcons (Qend_of_buffer, error_tail));
2811 Fput (Qend_of_buffer, Qerror_message,
2812 build_string ("End of buffer"));
2814 Fput (Qbuffer_read_only, Qerror_conditions,
2815 Fcons (Qbuffer_read_only, error_tail));
2816 Fput (Qbuffer_read_only, Qerror_message,
2817 build_string ("Buffer is read-only"));
2819 Fput (Qtext_read_only, Qerror_conditions,
2820 Fcons (Qtext_read_only, error_tail));
2821 Fput (Qtext_read_only, Qerror_message,
2822 build_string ("Text is read-only"));
2824 Qrange_error = intern ("range-error");
2825 Qdomain_error = intern ("domain-error");
2826 Qsingularity_error = intern ("singularity-error");
2827 Qoverflow_error = intern ("overflow-error");
2828 Qunderflow_error = intern ("underflow-error");
2830 Fput (Qdomain_error, Qerror_conditions,
2831 Fcons (Qdomain_error, arith_tail));
2832 Fput (Qdomain_error, Qerror_message,
2833 build_string ("Arithmetic domain error"));
2835 Fput (Qrange_error, Qerror_conditions,
2836 Fcons (Qrange_error, arith_tail));
2837 Fput (Qrange_error, Qerror_message,
2838 build_string ("Arithmetic range error"));
2840 Fput (Qsingularity_error, Qerror_conditions,
2841 Fcons (Qsingularity_error, Fcons (Qdomain_error, arith_tail)));
2842 Fput (Qsingularity_error, Qerror_message,
2843 build_string ("Arithmetic singularity error"));
2845 Fput (Qoverflow_error, Qerror_conditions,
2846 Fcons (Qoverflow_error, Fcons (Qdomain_error, arith_tail)));
2847 Fput (Qoverflow_error, Qerror_message,
2848 build_string ("Arithmetic overflow error"));
2850 Fput (Qunderflow_error, Qerror_conditions,
2851 Fcons (Qunderflow_error, Fcons (Qdomain_error, arith_tail)));
2852 Fput (Qunderflow_error, Qerror_message,
2853 build_string ("Arithmetic underflow error"));
2855 staticpro (&Qrange_error);
2856 staticpro (&Qdomain_error);
2857 staticpro (&Qsingularity_error);
2858 staticpro (&Qoverflow_error);
2859 staticpro (&Qunderflow_error);
2861 staticpro (&Qnil);
2862 staticpro (&Qt);
2863 staticpro (&Qquote);
2864 staticpro (&Qlambda);
2865 staticpro (&Qsubr);
2866 staticpro (&Qunbound);
2867 staticpro (&Qerror_conditions);
2868 staticpro (&Qerror_message);
2869 staticpro (&Qtop_level);
2871 staticpro (&Qerror);
2872 staticpro (&Qquit);
2873 staticpro (&Qwrong_type_argument);
2874 staticpro (&Qargs_out_of_range);
2875 staticpro (&Qvoid_function);
2876 staticpro (&Qcyclic_function_indirection);
2877 staticpro (&Qvoid_variable);
2878 staticpro (&Qsetting_constant);
2879 staticpro (&Qinvalid_read_syntax);
2880 staticpro (&Qwrong_number_of_arguments);
2881 staticpro (&Qinvalid_function);
2882 staticpro (&Qno_catch);
2883 staticpro (&Qend_of_file);
2884 staticpro (&Qarith_error);
2885 staticpro (&Qbeginning_of_buffer);
2886 staticpro (&Qend_of_buffer);
2887 staticpro (&Qbuffer_read_only);
2888 staticpro (&Qtext_read_only);
2889 staticpro (&Qmark_inactive);
2891 staticpro (&Qlistp);
2892 staticpro (&Qconsp);
2893 staticpro (&Qsymbolp);
2894 staticpro (&Qkeywordp);
2895 staticpro (&Qintegerp);
2896 staticpro (&Qnatnump);
2897 staticpro (&Qwholenump);
2898 staticpro (&Qstringp);
2899 staticpro (&Qarrayp);
2900 staticpro (&Qsequencep);
2901 staticpro (&Qbufferp);
2902 staticpro (&Qvectorp);
2903 staticpro (&Qchar_or_string_p);
2904 staticpro (&Qmarkerp);
2905 staticpro (&Qbuffer_or_string_p);
2906 staticpro (&Qinteger_or_marker_p);
2907 staticpro (&Qfloatp);
2908 staticpro (&Qnumberp);
2909 staticpro (&Qnumber_or_marker_p);
2910 staticpro (&Qchar_table_p);
2911 staticpro (&Qvector_or_char_table_p);
2912 staticpro (&Qsubrp);
2913 staticpro (&Qmany);
2914 staticpro (&Qunevalled);
2916 staticpro (&Qboundp);
2917 staticpro (&Qfboundp);
2918 staticpro (&Qcdr);
2919 staticpro (&Qad_advice_info);
2920 staticpro (&Qad_activate_internal);
2922 /* Types that type-of returns. */
2923 Qinteger = intern ("integer");
2924 Qsymbol = intern ("symbol");
2925 Qstring = intern ("string");
2926 Qcons = intern ("cons");
2927 Qmarker = intern ("marker");
2928 Qoverlay = intern ("overlay");
2929 Qfloat = intern ("float");
2930 Qwindow_configuration = intern ("window-configuration");
2931 Qprocess = intern ("process");
2932 Qwindow = intern ("window");
2933 /* Qsubr = intern ("subr"); */
2934 Qcompiled_function = intern ("compiled-function");
2935 Qbuffer = intern ("buffer");
2936 Qframe = intern ("frame");
2937 Qvector = intern ("vector");
2938 Qchar_table = intern ("char-table");
2939 Qbool_vector = intern ("bool-vector");
2940 Qhash_table = intern ("hash-table");
2942 staticpro (&Qinteger);
2943 staticpro (&Qsymbol);
2944 staticpro (&Qstring);
2945 staticpro (&Qcons);
2946 staticpro (&Qmarker);
2947 staticpro (&Qoverlay);
2948 staticpro (&Qfloat);
2949 staticpro (&Qwindow_configuration);
2950 staticpro (&Qprocess);
2951 staticpro (&Qwindow);
2952 /* staticpro (&Qsubr); */
2953 staticpro (&Qcompiled_function);
2954 staticpro (&Qbuffer);
2955 staticpro (&Qframe);
2956 staticpro (&Qvector);
2957 staticpro (&Qchar_table);
2958 staticpro (&Qbool_vector);
2959 staticpro (&Qhash_table);
2961 defsubr (&Seq);
2962 defsubr (&Snull);
2963 defsubr (&Stype_of);
2964 defsubr (&Slistp);
2965 defsubr (&Snlistp);
2966 defsubr (&Sconsp);
2967 defsubr (&Satom);
2968 defsubr (&Sintegerp);
2969 defsubr (&Sinteger_or_marker_p);
2970 defsubr (&Snumberp);
2971 defsubr (&Snumber_or_marker_p);
2972 defsubr (&Sfloatp);
2973 defsubr (&Snatnump);
2974 defsubr (&Ssymbolp);
2975 defsubr (&Skeywordp);
2976 defsubr (&Sstringp);
2977 defsubr (&Smultibyte_string_p);
2978 defsubr (&Svectorp);
2979 defsubr (&Schar_table_p);
2980 defsubr (&Svector_or_char_table_p);
2981 defsubr (&Sbool_vector_p);
2982 defsubr (&Sarrayp);
2983 defsubr (&Ssequencep);
2984 defsubr (&Sbufferp);
2985 defsubr (&Smarkerp);
2986 defsubr (&Ssubrp);
2987 defsubr (&Sbyte_code_function_p);
2988 defsubr (&Schar_or_string_p);
2989 defsubr (&Scar);
2990 defsubr (&Scdr);
2991 defsubr (&Scar_safe);
2992 defsubr (&Scdr_safe);
2993 defsubr (&Ssetcar);
2994 defsubr (&Ssetcdr);
2995 defsubr (&Ssymbol_function);
2996 defsubr (&Sindirect_function);
2997 defsubr (&Ssymbol_plist);
2998 defsubr (&Ssymbol_name);
2999 defsubr (&Smakunbound);
3000 defsubr (&Sfmakunbound);
3001 defsubr (&Sboundp);
3002 defsubr (&Sfboundp);
3003 defsubr (&Sfset);
3004 defsubr (&Sdefalias);
3005 defsubr (&Ssetplist);
3006 defsubr (&Ssymbol_value);
3007 defsubr (&Sset);
3008 defsubr (&Sdefault_boundp);
3009 defsubr (&Sdefault_value);
3010 defsubr (&Sset_default);
3011 defsubr (&Ssetq_default);
3012 defsubr (&Smake_variable_buffer_local);
3013 defsubr (&Smake_local_variable);
3014 defsubr (&Skill_local_variable);
3015 defsubr (&Smake_variable_frame_local);
3016 defsubr (&Slocal_variable_p);
3017 defsubr (&Slocal_variable_if_set_p);
3018 defsubr (&Saref);
3019 defsubr (&Saset);
3020 defsubr (&Snumber_to_string);
3021 defsubr (&Sstring_to_number);
3022 defsubr (&Seqlsign);
3023 defsubr (&Slss);
3024 defsubr (&Sgtr);
3025 defsubr (&Sleq);
3026 defsubr (&Sgeq);
3027 defsubr (&Sneq);
3028 defsubr (&Szerop);
3029 defsubr (&Splus);
3030 defsubr (&Sminus);
3031 defsubr (&Stimes);
3032 defsubr (&Squo);
3033 defsubr (&Srem);
3034 defsubr (&Smod);
3035 defsubr (&Smax);
3036 defsubr (&Smin);
3037 defsubr (&Slogand);
3038 defsubr (&Slogior);
3039 defsubr (&Slogxor);
3040 defsubr (&Slsh);
3041 defsubr (&Sash);
3042 defsubr (&Sadd1);
3043 defsubr (&Ssub1);
3044 defsubr (&Slognot);
3045 defsubr (&Ssubr_arity);
3047 XSYMBOL (Qwholenump)->function = XSYMBOL (Qnatnump)->function;
3050 SIGTYPE
3051 arith_error (signo)
3052 int signo;
3054 #if defined(USG) && !defined(POSIX_SIGNALS)
3055 /* USG systems forget handlers when they are used;
3056 must reestablish each time */
3057 signal (signo, arith_error);
3058 #endif /* USG */
3059 #ifdef VMS
3060 /* VMS systems are like USG. */
3061 signal (signo, arith_error);
3062 #endif /* VMS */
3063 #ifdef BSD4_1
3064 sigrelse (SIGFPE);
3065 #else /* not BSD4_1 */
3066 sigsetmask (SIGEMPTYMASK);
3067 #endif /* not BSD4_1 */
3069 Fsignal (Qarith_error, Qnil);
3072 void
3073 init_data ()
3075 /* Don't do this if just dumping out.
3076 We don't want to call `signal' in this case
3077 so that we don't have trouble with dumping
3078 signal-delivering routines in an inconsistent state. */
3079 #ifndef CANNOT_DUMP
3080 if (!initialized)
3081 return;
3082 #endif /* CANNOT_DUMP */
3083 signal (SIGFPE, arith_error);
3085 #ifdef uts
3086 signal (SIGEMT, arith_error);
3087 #endif /* uts */