Comment change.
[emacs.git] / src / data.c
blobf3157b333645e104bf2044613a2efa8c72626415
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, 2001
3 Free Software Foundation, Inc.
5 This file is part of GNU Emacs.
7 GNU Emacs is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs; see the file COPYING. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
23 #include <config.h>
24 #include <signal.h>
25 #include <stdio.h>
26 #include "lisp.h"
27 #include "puresize.h"
28 #include "charset.h"
29 #include "buffer.h"
30 #include "keyboard.h"
31 #include "frame.h"
32 #include "syssignal.h"
34 #ifdef STDC_HEADERS
35 #include <float.h>
36 #endif
38 /* If IEEE_FLOATING_POINT isn't defined, default it from FLT_*. */
39 #ifndef IEEE_FLOATING_POINT
40 #if (FLT_RADIX == 2 && FLT_MANT_DIG == 24 \
41 && FLT_MIN_EXP == -125 && FLT_MAX_EXP == 128)
42 #define IEEE_FLOATING_POINT 1
43 #else
44 #define IEEE_FLOATING_POINT 0
45 #endif
46 #endif
48 /* Work around a problem that happens because math.h on hpux 7
49 defines two static variables--which, in Emacs, are not really static,
50 because `static' is defined as nothing. The problem is that they are
51 here, in floatfns.c, and in lread.c.
52 These macros prevent the name conflict. */
53 #if defined (HPUX) && !defined (HPUX8)
54 #define _MAXLDBL data_c_maxldbl
55 #define _NMAXLDBL data_c_nmaxldbl
56 #endif
58 #include <math.h>
60 #if !defined (atof)
61 extern double atof ();
62 #endif /* !atof */
64 Lisp_Object Qnil, Qt, Qquote, Qlambda, Qsubr, Qunbound;
65 Lisp_Object Qerror_conditions, Qerror_message, Qtop_level;
66 Lisp_Object Qerror, Qquit, Qwrong_type_argument, Qargs_out_of_range;
67 Lisp_Object Qvoid_variable, Qvoid_function, Qcyclic_function_indirection;
68 Lisp_Object Qcyclic_variable_indirection, Qcircular_list;
69 Lisp_Object Qsetting_constant, Qinvalid_read_syntax;
70 Lisp_Object Qinvalid_function, Qwrong_number_of_arguments, Qno_catch;
71 Lisp_Object Qend_of_file, Qarith_error, Qmark_inactive;
72 Lisp_Object Qbeginning_of_buffer, Qend_of_buffer, Qbuffer_read_only;
73 Lisp_Object Qtext_read_only;
74 Lisp_Object Qintegerp, Qnatnump, Qwholenump, Qsymbolp, Qlistp, Qconsp;
75 Lisp_Object Qstringp, Qarrayp, Qsequencep, Qbufferp;
76 Lisp_Object Qchar_or_string_p, Qmarkerp, Qinteger_or_marker_p, Qvectorp;
77 Lisp_Object Qbuffer_or_string_p, Qkeywordp;
78 Lisp_Object Qboundp, Qfboundp;
79 Lisp_Object Qchar_table_p, Qvector_or_char_table_p;
81 Lisp_Object Qcdr;
82 Lisp_Object Qad_advice_info, Qad_activate_internal;
84 Lisp_Object Qrange_error, Qdomain_error, Qsingularity_error;
85 Lisp_Object Qoverflow_error, Qunderflow_error;
87 Lisp_Object Qfloatp;
88 Lisp_Object Qnumberp, Qnumber_or_marker_p;
90 static Lisp_Object Qinteger, Qsymbol, Qstring, Qcons, Qmarker, Qoverlay;
91 static Lisp_Object Qfloat, Qwindow_configuration, Qwindow;
92 Lisp_Object Qprocess;
93 static Lisp_Object Qcompiled_function, Qbuffer, Qframe, Qvector;
94 static Lisp_Object Qchar_table, Qbool_vector, Qhash_table;
95 static Lisp_Object Qsubrp, Qmany, Qunevalled;
97 static Lisp_Object swap_in_symval_forwarding P_ ((Lisp_Object, Lisp_Object));
99 Lisp_Object Vmost_positive_fixnum, Vmost_negative_fixnum;
102 void
103 circular_list_error (list)
104 Lisp_Object list;
106 Fsignal (Qcircular_list, list);
110 Lisp_Object
111 wrong_type_argument (predicate, value)
112 register Lisp_Object predicate, value;
114 register Lisp_Object tem;
117 /* If VALUE is not even a valid Lisp object, abort here
118 where we can get a backtrace showing where it came from. */
119 if ((unsigned int) XGCTYPE (value) >= Lisp_Type_Limit)
120 abort ();
122 value = Fsignal (Qwrong_type_argument, Fcons (predicate, Fcons (value, Qnil)));
123 tem = call1 (predicate, value);
125 while (NILP (tem));
126 return value;
129 void
130 pure_write_error ()
132 error ("Attempt to modify read-only object");
135 void
136 args_out_of_range (a1, a2)
137 Lisp_Object a1, a2;
139 while (1)
140 Fsignal (Qargs_out_of_range, Fcons (a1, Fcons (a2, Qnil)));
143 void
144 args_out_of_range_3 (a1, a2, a3)
145 Lisp_Object a1, a2, a3;
147 while (1)
148 Fsignal (Qargs_out_of_range, Fcons (a1, Fcons (a2, Fcons (a3, Qnil))));
151 /* On some machines, XINT needs a temporary location.
152 Here it is, in case it is needed. */
154 int sign_extend_temp;
156 /* On a few machines, XINT can only be done by calling this. */
159 sign_extend_lisp_int (num)
160 EMACS_INT num;
162 if (num & (((EMACS_INT) 1) << (VALBITS - 1)))
163 return num | (((EMACS_INT) (-1)) << VALBITS);
164 else
165 return num & ((((EMACS_INT) 1) << VALBITS) - 1);
168 /* Data type predicates */
170 DEFUN ("eq", Feq, Seq, 2, 2, 0,
171 doc: /* Return t if the two args are the same Lisp object. */)
172 (obj1, obj2)
173 Lisp_Object obj1, obj2;
175 if (EQ (obj1, obj2))
176 return Qt;
177 return Qnil;
180 DEFUN ("null", Fnull, Snull, 1, 1, 0,
181 doc: /* Return t if OBJECT is nil. */)
182 (object)
183 Lisp_Object object;
185 if (NILP (object))
186 return Qt;
187 return Qnil;
190 DEFUN ("type-of", Ftype_of, Stype_of, 1, 1, 0,
191 doc: /* Return a symbol representing the type of OBJECT.
192 The symbol returned names the object's basic type;
193 for example, (type-of 1) returns `integer'. */)
194 (object)
195 Lisp_Object object;
197 switch (XGCTYPE (object))
199 case Lisp_Int:
200 return Qinteger;
202 case Lisp_Symbol:
203 return Qsymbol;
205 case Lisp_String:
206 return Qstring;
208 case Lisp_Cons:
209 return Qcons;
211 case Lisp_Misc:
212 switch (XMISCTYPE (object))
214 case Lisp_Misc_Marker:
215 return Qmarker;
216 case Lisp_Misc_Overlay:
217 return Qoverlay;
218 case Lisp_Misc_Float:
219 return Qfloat;
221 abort ();
223 case Lisp_Vectorlike:
224 if (GC_WINDOW_CONFIGURATIONP (object))
225 return Qwindow_configuration;
226 if (GC_PROCESSP (object))
227 return Qprocess;
228 if (GC_WINDOWP (object))
229 return Qwindow;
230 if (GC_SUBRP (object))
231 return Qsubr;
232 if (GC_COMPILEDP (object))
233 return Qcompiled_function;
234 if (GC_BUFFERP (object))
235 return Qbuffer;
236 if (GC_CHAR_TABLE_P (object))
237 return Qchar_table;
238 if (GC_BOOL_VECTOR_P (object))
239 return Qbool_vector;
240 if (GC_FRAMEP (object))
241 return Qframe;
242 if (GC_HASH_TABLE_P (object))
243 return Qhash_table;
244 return Qvector;
246 case Lisp_Float:
247 return Qfloat;
249 default:
250 abort ();
254 DEFUN ("consp", Fconsp, Sconsp, 1, 1, 0,
255 doc: /* Return t if OBJECT is a cons cell. */)
256 (object)
257 Lisp_Object object;
259 if (CONSP (object))
260 return Qt;
261 return Qnil;
264 DEFUN ("atom", Fatom, Satom, 1, 1, 0,
265 doc: /* Return t if OBJECT is not a cons cell. This includes nil. */)
266 (object)
267 Lisp_Object object;
269 if (CONSP (object))
270 return Qnil;
271 return Qt;
274 DEFUN ("listp", Flistp, Slistp, 1, 1, 0,
275 doc: /* Return t if OBJECT is a list. This includes nil. */)
276 (object)
277 Lisp_Object object;
279 if (CONSP (object) || NILP (object))
280 return Qt;
281 return Qnil;
284 DEFUN ("nlistp", Fnlistp, Snlistp, 1, 1, 0,
285 doc: /* Return t if OBJECT is not a list. Lists include nil. */)
286 (object)
287 Lisp_Object object;
289 if (CONSP (object) || NILP (object))
290 return Qnil;
291 return Qt;
294 DEFUN ("symbolp", Fsymbolp, Ssymbolp, 1, 1, 0,
295 doc: /* Return t if OBJECT is a symbol. */)
296 (object)
297 Lisp_Object object;
299 if (SYMBOLP (object))
300 return Qt;
301 return Qnil;
304 /* Define this in C to avoid unnecessarily consing up the symbol
305 name. */
306 DEFUN ("keywordp", Fkeywordp, Skeywordp, 1, 1, 0,
307 doc: /* Return t if OBJECT is a keyword.
308 This means that it is a symbol with a print name beginning with `:'
309 interned in the initial obarray. */)
310 (object)
311 Lisp_Object object;
313 if (SYMBOLP (object)
314 && SREF (SYMBOL_NAME (object), 0) == ':'
315 && SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P (object))
316 return Qt;
317 return Qnil;
320 DEFUN ("vectorp", Fvectorp, Svectorp, 1, 1, 0,
321 doc: /* Return t if OBJECT is a vector. */)
322 (object)
323 Lisp_Object object;
325 if (VECTORP (object))
326 return Qt;
327 return Qnil;
330 DEFUN ("stringp", Fstringp, Sstringp, 1, 1, 0,
331 doc: /* Return t if OBJECT is a string. */)
332 (object)
333 Lisp_Object object;
335 if (STRINGP (object))
336 return Qt;
337 return Qnil;
340 DEFUN ("multibyte-string-p", Fmultibyte_string_p, Smultibyte_string_p,
341 1, 1, 0,
342 doc: /* Return t if OBJECT is a multibyte string. */)
343 (object)
344 Lisp_Object object;
346 if (STRINGP (object) && STRING_MULTIBYTE (object))
347 return Qt;
348 return Qnil;
351 DEFUN ("char-table-p", Fchar_table_p, Schar_table_p, 1, 1, 0,
352 doc: /* Return t if OBJECT is a char-table. */)
353 (object)
354 Lisp_Object object;
356 if (CHAR_TABLE_P (object))
357 return Qt;
358 return Qnil;
361 DEFUN ("vector-or-char-table-p", Fvector_or_char_table_p,
362 Svector_or_char_table_p, 1, 1, 0,
363 doc: /* Return t if OBJECT is a char-table or vector. */)
364 (object)
365 Lisp_Object object;
367 if (VECTORP (object) || CHAR_TABLE_P (object))
368 return Qt;
369 return Qnil;
372 DEFUN ("bool-vector-p", Fbool_vector_p, Sbool_vector_p, 1, 1, 0,
373 doc: /* Return t if OBJECT is a bool-vector. */)
374 (object)
375 Lisp_Object object;
377 if (BOOL_VECTOR_P (object))
378 return Qt;
379 return Qnil;
382 DEFUN ("arrayp", Farrayp, Sarrayp, 1, 1, 0,
383 doc: /* Return t if OBJECT is an array (string or vector). */)
384 (object)
385 Lisp_Object object;
387 if (VECTORP (object) || STRINGP (object)
388 || CHAR_TABLE_P (object) || BOOL_VECTOR_P (object))
389 return Qt;
390 return Qnil;
393 DEFUN ("sequencep", Fsequencep, Ssequencep, 1, 1, 0,
394 doc: /* Return t if OBJECT is a sequence (list or array). */)
395 (object)
396 register Lisp_Object object;
398 if (CONSP (object) || NILP (object) || VECTORP (object) || STRINGP (object)
399 || CHAR_TABLE_P (object) || BOOL_VECTOR_P (object))
400 return Qt;
401 return Qnil;
404 DEFUN ("bufferp", Fbufferp, Sbufferp, 1, 1, 0,
405 doc: /* Return t if OBJECT is an editor buffer. */)
406 (object)
407 Lisp_Object object;
409 if (BUFFERP (object))
410 return Qt;
411 return Qnil;
414 DEFUN ("markerp", Fmarkerp, Smarkerp, 1, 1, 0,
415 doc: /* Return t if OBJECT is a marker (editor pointer). */)
416 (object)
417 Lisp_Object object;
419 if (MARKERP (object))
420 return Qt;
421 return Qnil;
424 DEFUN ("subrp", Fsubrp, Ssubrp, 1, 1, 0,
425 doc: /* Return t if OBJECT is a built-in function. */)
426 (object)
427 Lisp_Object object;
429 if (SUBRP (object))
430 return Qt;
431 return Qnil;
434 DEFUN ("byte-code-function-p", Fbyte_code_function_p, Sbyte_code_function_p,
435 1, 1, 0,
436 doc: /* Return t if OBJECT is a byte-compiled function object. */)
437 (object)
438 Lisp_Object object;
440 if (COMPILEDP (object))
441 return Qt;
442 return Qnil;
445 DEFUN ("char-or-string-p", Fchar_or_string_p, Schar_or_string_p, 1, 1, 0,
446 doc: /* Return t if OBJECT is a character (an integer) or a string. */)
447 (object)
448 register Lisp_Object object;
450 if (INTEGERP (object) || STRINGP (object))
451 return Qt;
452 return Qnil;
455 DEFUN ("integerp", Fintegerp, Sintegerp, 1, 1, 0,
456 doc: /* Return t if OBJECT is an integer. */)
457 (object)
458 Lisp_Object object;
460 if (INTEGERP (object))
461 return Qt;
462 return Qnil;
465 DEFUN ("integer-or-marker-p", Finteger_or_marker_p, Sinteger_or_marker_p, 1, 1, 0,
466 doc: /* Return t if OBJECT is an integer or a marker (editor pointer). */)
467 (object)
468 register Lisp_Object object;
470 if (MARKERP (object) || INTEGERP (object))
471 return Qt;
472 return Qnil;
475 DEFUN ("natnump", Fnatnump, Snatnump, 1, 1, 0,
476 doc: /* Return t if OBJECT is a nonnegative integer. */)
477 (object)
478 Lisp_Object object;
480 if (NATNUMP (object))
481 return Qt;
482 return Qnil;
485 DEFUN ("numberp", Fnumberp, Snumberp, 1, 1, 0,
486 doc: /* Return t if OBJECT is a number (floating point or integer). */)
487 (object)
488 Lisp_Object object;
490 if (NUMBERP (object))
491 return Qt;
492 else
493 return Qnil;
496 DEFUN ("number-or-marker-p", Fnumber_or_marker_p,
497 Snumber_or_marker_p, 1, 1, 0,
498 doc: /* Return t if OBJECT is a number or a marker. */)
499 (object)
500 Lisp_Object object;
502 if (NUMBERP (object) || MARKERP (object))
503 return Qt;
504 return Qnil;
507 DEFUN ("floatp", Ffloatp, Sfloatp, 1, 1, 0,
508 doc: /* Return t if OBJECT is a floating point number. */)
509 (object)
510 Lisp_Object object;
512 if (FLOATP (object))
513 return Qt;
514 return Qnil;
518 /* Extract and set components of lists */
520 DEFUN ("car", Fcar, Scar, 1, 1, 0,
521 doc: /* Return the car of LIST. If arg is nil, return nil.
522 Error if arg is not nil and not a cons cell. See also `car-safe'. */)
523 (list)
524 register Lisp_Object list;
526 while (1)
528 if (CONSP (list))
529 return XCAR (list);
530 else if (EQ (list, Qnil))
531 return Qnil;
532 else
533 list = wrong_type_argument (Qlistp, list);
537 DEFUN ("car-safe", Fcar_safe, Scar_safe, 1, 1, 0,
538 doc: /* Return the car of OBJECT if it is a cons cell, or else nil. */)
539 (object)
540 Lisp_Object object;
542 if (CONSP (object))
543 return XCAR (object);
544 else
545 return Qnil;
548 DEFUN ("cdr", Fcdr, Scdr, 1, 1, 0,
549 doc: /* Return the cdr of LIST. If arg is nil, return nil.
550 Error if arg is not nil and not a cons cell. See also `cdr-safe'. */)
551 (list)
552 register Lisp_Object list;
554 while (1)
556 if (CONSP (list))
557 return XCDR (list);
558 else if (EQ (list, Qnil))
559 return Qnil;
560 else
561 list = wrong_type_argument (Qlistp, list);
565 DEFUN ("cdr-safe", Fcdr_safe, Scdr_safe, 1, 1, 0,
566 doc: /* Return the cdr of OBJECT if it is a cons cell, or else nil. */)
567 (object)
568 Lisp_Object object;
570 if (CONSP (object))
571 return XCDR (object);
572 else
573 return Qnil;
576 DEFUN ("setcar", Fsetcar, Ssetcar, 2, 2, 0,
577 doc: /* Set the car of CELL to be NEWCAR. Returns NEWCAR. */)
578 (cell, newcar)
579 register Lisp_Object cell, newcar;
581 if (!CONSP (cell))
582 cell = wrong_type_argument (Qconsp, cell);
584 CHECK_IMPURE (cell);
585 XSETCAR (cell, newcar);
586 return newcar;
589 DEFUN ("setcdr", Fsetcdr, Ssetcdr, 2, 2, 0,
590 doc: /* Set the cdr of CELL to be NEWCDR. Returns NEWCDR. */)
591 (cell, newcdr)
592 register Lisp_Object cell, newcdr;
594 if (!CONSP (cell))
595 cell = wrong_type_argument (Qconsp, cell);
597 CHECK_IMPURE (cell);
598 XSETCDR (cell, newcdr);
599 return newcdr;
602 /* Extract and set components of symbols */
604 DEFUN ("boundp", Fboundp, Sboundp, 1, 1, 0,
605 doc: /* Return t if SYMBOL's value is not void. */)
606 (symbol)
607 register Lisp_Object symbol;
609 Lisp_Object valcontents;
610 CHECK_SYMBOL (symbol);
612 valcontents = SYMBOL_VALUE (symbol);
614 if (BUFFER_LOCAL_VALUEP (valcontents)
615 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
616 valcontents = swap_in_symval_forwarding (symbol, valcontents);
618 return (EQ (valcontents, Qunbound) ? Qnil : Qt);
621 DEFUN ("fboundp", Ffboundp, Sfboundp, 1, 1, 0,
622 doc: /* Return t if SYMBOL's function definition is not void. */)
623 (symbol)
624 register Lisp_Object symbol;
626 CHECK_SYMBOL (symbol);
627 return (EQ (XSYMBOL (symbol)->function, Qunbound) ? Qnil : Qt);
630 DEFUN ("makunbound", Fmakunbound, Smakunbound, 1, 1, 0,
631 doc: /* Make SYMBOL's value be void.
632 Return SYMBOL. */)
633 (symbol)
634 register Lisp_Object symbol;
636 CHECK_SYMBOL (symbol);
637 if (XSYMBOL (symbol)->constant)
638 return Fsignal (Qsetting_constant, Fcons (symbol, Qnil));
639 Fset (symbol, Qunbound);
640 return symbol;
643 DEFUN ("fmakunbound", Ffmakunbound, Sfmakunbound, 1, 1, 0,
644 doc: /* Make SYMBOL's function definition be void.
645 Return SYMBOL. */)
646 (symbol)
647 register Lisp_Object symbol;
649 CHECK_SYMBOL (symbol);
650 if (NILP (symbol) || EQ (symbol, Qt))
651 return Fsignal (Qsetting_constant, Fcons (symbol, Qnil));
652 XSYMBOL (symbol)->function = Qunbound;
653 return symbol;
656 DEFUN ("symbol-function", Fsymbol_function, Ssymbol_function, 1, 1, 0,
657 doc: /* Return SYMBOL's function definition. Error if that is void. */)
658 (symbol)
659 register Lisp_Object symbol;
661 CHECK_SYMBOL (symbol);
662 if (EQ (XSYMBOL (symbol)->function, Qunbound))
663 return Fsignal (Qvoid_function, Fcons (symbol, Qnil));
664 return XSYMBOL (symbol)->function;
667 DEFUN ("symbol-plist", Fsymbol_plist, Ssymbol_plist, 1, 1, 0,
668 doc: /* Return SYMBOL's property list. */)
669 (symbol)
670 register Lisp_Object symbol;
672 CHECK_SYMBOL (symbol);
673 return XSYMBOL (symbol)->plist;
676 DEFUN ("symbol-name", Fsymbol_name, Ssymbol_name, 1, 1, 0,
677 doc: /* Return SYMBOL's name, a string. */)
678 (symbol)
679 register Lisp_Object symbol;
681 register Lisp_Object name;
683 CHECK_SYMBOL (symbol);
684 name = SYMBOL_NAME (symbol);
685 return name;
688 DEFUN ("fset", Ffset, Sfset, 2, 2, 0,
689 doc: /* Set SYMBOL's function definition to DEFINITION, and return DEFINITION. */)
690 (symbol, definition)
691 register Lisp_Object symbol, definition;
693 CHECK_SYMBOL (symbol);
694 if (NILP (symbol) || EQ (symbol, Qt))
695 return Fsignal (Qsetting_constant, Fcons (symbol, Qnil));
696 if (!NILP (Vautoload_queue) && !EQ (XSYMBOL (symbol)->function, Qunbound))
697 Vautoload_queue = Fcons (Fcons (symbol, XSYMBOL (symbol)->function),
698 Vautoload_queue);
699 XSYMBOL (symbol)->function = definition;
700 /* Handle automatic advice activation */
701 if (CONSP (XSYMBOL (symbol)->plist) && !NILP (Fget (symbol, Qad_advice_info)))
703 call2 (Qad_activate_internal, symbol, Qnil);
704 definition = XSYMBOL (symbol)->function;
706 return definition;
709 extern Lisp_Object Qfunction_documentation;
711 DEFUN ("defalias", Fdefalias, Sdefalias, 2, 3, 0,
712 doc: /* Set SYMBOL's function definition to DEFINITION, and return DEFINITION.
713 Associates the function with the current load file, if any.
714 The optional third argument DOCSTRING specifies the documentation string
715 for SYMBOL; if it is omitted or nil, SYMBOL uses the documentation string
716 determined by DEFINITION. */)
717 (symbol, definition, docstring)
718 register Lisp_Object symbol, definition, docstring;
720 if (CONSP (XSYMBOL (symbol)->function)
721 && EQ (XCAR (XSYMBOL (symbol)->function), Qautoload))
722 LOADHIST_ATTACH (Fcons (Qt, symbol));
723 definition = Ffset (symbol, definition);
724 LOADHIST_ATTACH (symbol);
725 if (!NILP (docstring))
726 Fput (symbol, Qfunction_documentation, docstring);
727 return definition;
730 DEFUN ("setplist", Fsetplist, Ssetplist, 2, 2, 0,
731 doc: /* Set SYMBOL's property list to NEWVAL, and return NEWVAL. */)
732 (symbol, newplist)
733 register Lisp_Object symbol, newplist;
735 CHECK_SYMBOL (symbol);
736 XSYMBOL (symbol)->plist = newplist;
737 return newplist;
740 DEFUN ("subr-arity", Fsubr_arity, Ssubr_arity, 1, 1, 0,
741 doc: /* Return minimum and maximum number of args allowed for SUBR.
742 SUBR must be a built-in function.
743 The returned value is a pair (MIN . MAX). MIN is the minimum number
744 of args. MAX is the maximum number or the symbol `many', for a
745 function with `&rest' args, or `unevalled' for a special form. */)
746 (subr)
747 Lisp_Object subr;
749 short minargs, maxargs;
750 if (!SUBRP (subr))
751 wrong_type_argument (Qsubrp, subr);
752 minargs = XSUBR (subr)->min_args;
753 maxargs = XSUBR (subr)->max_args;
754 if (maxargs == MANY)
755 return Fcons (make_number (minargs), Qmany);
756 else if (maxargs == UNEVALLED)
757 return Fcons (make_number (minargs), Qunevalled);
758 else
759 return Fcons (make_number (minargs), make_number (maxargs));
762 DEFUN ("subr-interactive-form", Fsubr_interactive_form, Ssubr_interactive_form, 1, 1, 0,
763 doc: /* Return the interactive form of SUBR or nil if none.
764 SUBR must be a built-in function. Value, if non-nil, is a list
765 \(interactive SPEC). */)
766 (subr)
767 Lisp_Object subr;
769 if (!SUBRP (subr))
770 wrong_type_argument (Qsubrp, subr);
771 if (XSUBR (subr)->prompt)
772 return list2 (Qinteractive, build_string (XSUBR (subr)->prompt));
773 return Qnil;
777 /***********************************************************************
778 Getting and Setting Values of Symbols
779 ***********************************************************************/
781 /* Return the symbol holding SYMBOL's value. Signal
782 `cyclic-variable-indirection' if SYMBOL's chain of variable
783 indirections contains a loop. */
785 Lisp_Object
786 indirect_variable (symbol)
787 Lisp_Object symbol;
789 Lisp_Object tortoise, hare;
791 hare = tortoise = symbol;
793 while (XSYMBOL (hare)->indirect_variable)
795 hare = XSYMBOL (hare)->value;
796 if (!XSYMBOL (hare)->indirect_variable)
797 break;
799 hare = XSYMBOL (hare)->value;
800 tortoise = XSYMBOL (tortoise)->value;
802 if (EQ (hare, tortoise))
803 Fsignal (Qcyclic_variable_indirection, Fcons (symbol, Qnil));
806 return hare;
810 DEFUN ("indirect-variable", Findirect_variable, Sindirect_variable, 1, 1, 0,
811 doc: /* Return the variable at the end of OBJECT's variable chain.
812 If OBJECT is a symbol, follow all variable indirections and return the final
813 variable. If OBJECT is not a symbol, just return it.
814 Signal a cyclic-variable-indirection error if there is a loop in the
815 variable chain of symbols. */)
816 (object)
817 Lisp_Object object;
819 if (SYMBOLP (object))
820 object = indirect_variable (object);
821 return object;
825 /* Given the raw contents of a symbol value cell,
826 return the Lisp value of the symbol.
827 This does not handle buffer-local variables; use
828 swap_in_symval_forwarding for that. */
830 Lisp_Object
831 do_symval_forwarding (valcontents)
832 register Lisp_Object valcontents;
834 register Lisp_Object val;
835 int offset;
836 if (MISCP (valcontents))
837 switch (XMISCTYPE (valcontents))
839 case Lisp_Misc_Intfwd:
840 XSETINT (val, *XINTFWD (valcontents)->intvar);
841 return val;
843 case Lisp_Misc_Boolfwd:
844 return (*XBOOLFWD (valcontents)->boolvar ? Qt : Qnil);
846 case Lisp_Misc_Objfwd:
847 return *XOBJFWD (valcontents)->objvar;
849 case Lisp_Misc_Buffer_Objfwd:
850 offset = XBUFFER_OBJFWD (valcontents)->offset;
851 return PER_BUFFER_VALUE (current_buffer, offset);
853 case Lisp_Misc_Kboard_Objfwd:
854 offset = XKBOARD_OBJFWD (valcontents)->offset;
855 return *(Lisp_Object *)(offset + (char *)current_kboard);
857 return valcontents;
860 /* Store NEWVAL into SYMBOL, where VALCONTENTS is found in the value cell
861 of SYMBOL. If SYMBOL is buffer-local, VALCONTENTS should be the
862 buffer-independent contents of the value cell: forwarded just one
863 step past the buffer-localness.
865 BUF non-zero means set the value in buffer BUF instead of the
866 current buffer. This only plays a role for per-buffer variables. */
868 void
869 store_symval_forwarding (symbol, valcontents, newval, buf)
870 Lisp_Object symbol;
871 register Lisp_Object valcontents, newval;
872 struct buffer *buf;
874 switch (SWITCH_ENUM_CAST (XTYPE (valcontents)))
876 case Lisp_Misc:
877 switch (XMISCTYPE (valcontents))
879 case Lisp_Misc_Intfwd:
880 CHECK_NUMBER (newval);
881 *XINTFWD (valcontents)->intvar = XINT (newval);
882 if (*XINTFWD (valcontents)->intvar != XINT (newval))
883 error ("Value out of range for variable `%s'",
884 SDATA (SYMBOL_NAME (symbol)));
885 break;
887 case Lisp_Misc_Boolfwd:
888 *XBOOLFWD (valcontents)->boolvar = NILP (newval) ? 0 : 1;
889 break;
891 case Lisp_Misc_Objfwd:
892 *XOBJFWD (valcontents)->objvar = newval;
893 break;
895 case Lisp_Misc_Buffer_Objfwd:
897 int offset = XBUFFER_OBJFWD (valcontents)->offset;
898 Lisp_Object type;
900 type = PER_BUFFER_TYPE (offset);
901 if (XINT (type) == -1)
902 error ("Variable %s is read-only", SDATA (SYMBOL_NAME (symbol)));
904 if (! NILP (type) && ! NILP (newval)
905 && XTYPE (newval) != XINT (type))
906 buffer_slot_type_mismatch (offset);
908 if (buf == NULL)
909 buf = current_buffer;
910 PER_BUFFER_VALUE (buf, offset) = newval;
912 break;
914 case Lisp_Misc_Kboard_Objfwd:
916 char *base = (char *) current_kboard;
917 char *p = base + XKBOARD_OBJFWD (valcontents)->offset;
918 *(Lisp_Object *) p = newval;
920 break;
922 default:
923 goto def;
925 break;
927 default:
928 def:
929 valcontents = SYMBOL_VALUE (symbol);
930 if (BUFFER_LOCAL_VALUEP (valcontents)
931 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
932 XBUFFER_LOCAL_VALUE (valcontents)->realvalue = newval;
933 else
934 SET_SYMBOL_VALUE (symbol, newval);
938 /* Set up SYMBOL to refer to its global binding.
939 This makes it safe to alter the status of other bindings. */
941 void
942 swap_in_global_binding (symbol)
943 Lisp_Object symbol;
945 Lisp_Object valcontents, cdr;
947 valcontents = SYMBOL_VALUE (symbol);
948 if (!BUFFER_LOCAL_VALUEP (valcontents)
949 && !SOME_BUFFER_LOCAL_VALUEP (valcontents))
950 abort ();
951 cdr = XBUFFER_LOCAL_VALUE (valcontents)->cdr;
953 /* Unload the previously loaded binding. */
954 Fsetcdr (XCAR (cdr),
955 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue));
957 /* Select the global binding in the symbol. */
958 XSETCAR (cdr, cdr);
959 store_symval_forwarding (symbol, valcontents, XCDR (cdr), NULL);
961 /* Indicate that the global binding is set up now. */
962 XBUFFER_LOCAL_VALUE (valcontents)->frame = Qnil;
963 XBUFFER_LOCAL_VALUE (valcontents)->buffer = Qnil;
964 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 0;
965 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
968 /* Set up the buffer-local symbol SYMBOL for validity in the current buffer.
969 VALCONTENTS is the contents of its value cell,
970 which points to a struct Lisp_Buffer_Local_Value.
972 Return the value forwarded one step past the buffer-local stage.
973 This could be another forwarding pointer. */
975 static Lisp_Object
976 swap_in_symval_forwarding (symbol, valcontents)
977 Lisp_Object symbol, valcontents;
979 register Lisp_Object tem1;
981 tem1 = XBUFFER_LOCAL_VALUE (valcontents)->buffer;
983 if (NILP (tem1)
984 || current_buffer != XBUFFER (tem1)
985 || (XBUFFER_LOCAL_VALUE (valcontents)->check_frame
986 && ! EQ (selected_frame, XBUFFER_LOCAL_VALUE (valcontents)->frame)))
988 if (XSYMBOL (symbol)->indirect_variable)
989 symbol = indirect_variable (symbol);
991 /* Unload the previously loaded binding. */
992 tem1 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
993 Fsetcdr (tem1,
994 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue));
995 /* Choose the new binding. */
996 tem1 = assq_no_quit (symbol, current_buffer->local_var_alist);
997 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 0;
998 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
999 if (NILP (tem1))
1001 if (XBUFFER_LOCAL_VALUE (valcontents)->check_frame)
1002 tem1 = assq_no_quit (symbol, XFRAME (selected_frame)->param_alist);
1003 if (! NILP (tem1))
1004 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 1;
1005 else
1006 tem1 = XBUFFER_LOCAL_VALUE (valcontents)->cdr;
1008 else
1009 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 1;
1011 /* Load the new binding. */
1012 XSETCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr, tem1);
1013 XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer, current_buffer);
1014 XBUFFER_LOCAL_VALUE (valcontents)->frame = selected_frame;
1015 store_symval_forwarding (symbol,
1016 XBUFFER_LOCAL_VALUE (valcontents)->realvalue,
1017 Fcdr (tem1), NULL);
1019 return XBUFFER_LOCAL_VALUE (valcontents)->realvalue;
1022 /* Find the value of a symbol, returning Qunbound if it's not bound.
1023 This is helpful for code which just wants to get a variable's value
1024 if it has one, without signaling an error.
1025 Note that it must not be possible to quit
1026 within this function. Great care is required for this. */
1028 Lisp_Object
1029 find_symbol_value (symbol)
1030 Lisp_Object symbol;
1032 register Lisp_Object valcontents;
1033 register Lisp_Object val;
1035 CHECK_SYMBOL (symbol);
1036 valcontents = SYMBOL_VALUE (symbol);
1038 if (BUFFER_LOCAL_VALUEP (valcontents)
1039 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1040 valcontents = swap_in_symval_forwarding (symbol, valcontents);
1042 if (MISCP (valcontents))
1044 switch (XMISCTYPE (valcontents))
1046 case Lisp_Misc_Intfwd:
1047 XSETINT (val, *XINTFWD (valcontents)->intvar);
1048 return val;
1050 case Lisp_Misc_Boolfwd:
1051 return (*XBOOLFWD (valcontents)->boolvar ? Qt : Qnil);
1053 case Lisp_Misc_Objfwd:
1054 return *XOBJFWD (valcontents)->objvar;
1056 case Lisp_Misc_Buffer_Objfwd:
1057 return PER_BUFFER_VALUE (current_buffer,
1058 XBUFFER_OBJFWD (valcontents)->offset);
1060 case Lisp_Misc_Kboard_Objfwd:
1061 return *(Lisp_Object *)(XKBOARD_OBJFWD (valcontents)->offset
1062 + (char *)current_kboard);
1066 return valcontents;
1069 DEFUN ("symbol-value", Fsymbol_value, Ssymbol_value, 1, 1, 0,
1070 doc: /* Return SYMBOL's value. Error if that is void. */)
1071 (symbol)
1072 Lisp_Object symbol;
1074 Lisp_Object val;
1076 val = find_symbol_value (symbol);
1077 if (EQ (val, Qunbound))
1078 return Fsignal (Qvoid_variable, Fcons (symbol, Qnil));
1079 else
1080 return val;
1083 DEFUN ("set", Fset, Sset, 2, 2, 0,
1084 doc: /* Set SYMBOL's value to NEWVAL, and return NEWVAL. */)
1085 (symbol, newval)
1086 register Lisp_Object symbol, newval;
1088 return set_internal (symbol, newval, current_buffer, 0);
1091 /* Return 1 if SYMBOL currently has a let-binding
1092 which was made in the buffer that is now current. */
1094 static int
1095 let_shadows_buffer_binding_p (symbol)
1096 Lisp_Object symbol;
1098 struct specbinding *p;
1100 for (p = specpdl_ptr - 1; p >= specpdl; p--)
1101 if (p->func == NULL
1102 && CONSP (p->symbol))
1104 Lisp_Object let_bound_symbol = XCAR (p->symbol);
1105 if ((EQ (symbol, let_bound_symbol)
1106 || (XSYMBOL (let_bound_symbol)->indirect_variable
1107 && EQ (symbol, indirect_variable (let_bound_symbol))))
1108 && XBUFFER (XCDR (XCDR (p->symbol))) == current_buffer)
1109 break;
1112 return p >= specpdl;
1115 /* Store the value NEWVAL into SYMBOL.
1116 If buffer-locality is an issue, BUF specifies which buffer to use.
1117 (0 stands for the current buffer.)
1119 If BINDFLAG is zero, then if this symbol is supposed to become
1120 local in every buffer where it is set, then we make it local.
1121 If BINDFLAG is nonzero, we don't do that. */
1123 Lisp_Object
1124 set_internal (symbol, newval, buf, bindflag)
1125 register Lisp_Object symbol, newval;
1126 struct buffer *buf;
1127 int bindflag;
1129 int voide = EQ (newval, Qunbound);
1131 register Lisp_Object valcontents, innercontents, tem1, current_alist_element;
1133 if (buf == 0)
1134 buf = current_buffer;
1136 /* If restoring in a dead buffer, do nothing. */
1137 if (NILP (buf->name))
1138 return newval;
1140 CHECK_SYMBOL (symbol);
1141 if (SYMBOL_CONSTANT_P (symbol)
1142 && (NILP (Fkeywordp (symbol))
1143 || !EQ (newval, SYMBOL_VALUE (symbol))))
1144 return Fsignal (Qsetting_constant, Fcons (symbol, Qnil));
1146 innercontents = valcontents = SYMBOL_VALUE (symbol);
1148 if (BUFFER_OBJFWDP (valcontents))
1150 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1151 int idx = PER_BUFFER_IDX (offset);
1152 if (idx > 0
1153 && !bindflag
1154 && !let_shadows_buffer_binding_p (symbol))
1155 SET_PER_BUFFER_VALUE_P (buf, idx, 1);
1157 else if (BUFFER_LOCAL_VALUEP (valcontents)
1158 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1160 /* valcontents is a struct Lisp_Buffer_Local_Value. */
1161 if (XSYMBOL (symbol)->indirect_variable)
1162 symbol = indirect_variable (symbol);
1164 /* What binding is loaded right now? */
1165 current_alist_element
1166 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1168 /* If the current buffer is not the buffer whose binding is
1169 loaded, or if there may be frame-local bindings and the frame
1170 isn't the right one, or if it's a Lisp_Buffer_Local_Value and
1171 the default binding is loaded, the loaded binding may be the
1172 wrong one. */
1173 if (!BUFFERP (XBUFFER_LOCAL_VALUE (valcontents)->buffer)
1174 || buf != XBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer)
1175 || (XBUFFER_LOCAL_VALUE (valcontents)->check_frame
1176 && !EQ (selected_frame, XBUFFER_LOCAL_VALUE (valcontents)->frame))
1177 || (BUFFER_LOCAL_VALUEP (valcontents)
1178 && EQ (XCAR (current_alist_element),
1179 current_alist_element)))
1181 /* The currently loaded binding is not necessarily valid.
1182 We need to unload it, and choose a new binding. */
1184 /* Write out `realvalue' to the old loaded binding. */
1185 Fsetcdr (current_alist_element,
1186 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue));
1188 /* Find the new binding. */
1189 tem1 = Fassq (symbol, buf->local_var_alist);
1190 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 1;
1191 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 0;
1193 if (NILP (tem1))
1195 /* This buffer still sees the default value. */
1197 /* If the variable is a Lisp_Some_Buffer_Local_Value,
1198 or if this is `let' rather than `set',
1199 make CURRENT-ALIST-ELEMENT point to itself,
1200 indicating that we're seeing the default value.
1201 Likewise if the variable has been let-bound
1202 in the current buffer. */
1203 if (bindflag || SOME_BUFFER_LOCAL_VALUEP (valcontents)
1204 || let_shadows_buffer_binding_p (symbol))
1206 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
1208 if (XBUFFER_LOCAL_VALUE (valcontents)->check_frame)
1209 tem1 = Fassq (symbol,
1210 XFRAME (selected_frame)->param_alist);
1212 if (! NILP (tem1))
1213 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 1;
1214 else
1215 tem1 = XBUFFER_LOCAL_VALUE (valcontents)->cdr;
1217 /* If it's a Lisp_Buffer_Local_Value, being set not bound,
1218 and we're not within a let that was made for this buffer,
1219 create a new buffer-local binding for the variable.
1220 That means, give this buffer a new assoc for a local value
1221 and load that binding. */
1222 else
1224 tem1 = Fcons (symbol, XCDR (current_alist_element));
1225 buf->local_var_alist
1226 = Fcons (tem1, buf->local_var_alist);
1230 /* Record which binding is now loaded. */
1231 XSETCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr,
1232 tem1);
1234 /* Set `buffer' and `frame' slots for thebinding now loaded. */
1235 XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer, buf);
1236 XBUFFER_LOCAL_VALUE (valcontents)->frame = selected_frame;
1238 innercontents = XBUFFER_LOCAL_VALUE (valcontents)->realvalue;
1241 /* If storing void (making the symbol void), forward only through
1242 buffer-local indicator, not through Lisp_Objfwd, etc. */
1243 if (voide)
1244 store_symval_forwarding (symbol, Qnil, newval, buf);
1245 else
1246 store_symval_forwarding (symbol, innercontents, newval, buf);
1248 /* If we just set a variable whose current binding is frame-local,
1249 store the new value in the frame parameter too. */
1251 if (BUFFER_LOCAL_VALUEP (valcontents)
1252 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1254 /* What binding is loaded right now? */
1255 current_alist_element
1256 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1258 /* If the current buffer is not the buffer whose binding is
1259 loaded, or if there may be frame-local bindings and the frame
1260 isn't the right one, or if it's a Lisp_Buffer_Local_Value and
1261 the default binding is loaded, the loaded binding may be the
1262 wrong one. */
1263 if (XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame)
1264 XSETCDR (current_alist_element, newval);
1267 return newval;
1270 /* Access or set a buffer-local symbol's default value. */
1272 /* Return the default value of SYMBOL, but don't check for voidness.
1273 Return Qunbound if it is void. */
1275 Lisp_Object
1276 default_value (symbol)
1277 Lisp_Object symbol;
1279 register Lisp_Object valcontents;
1281 CHECK_SYMBOL (symbol);
1282 valcontents = SYMBOL_VALUE (symbol);
1284 /* For a built-in buffer-local variable, get the default value
1285 rather than letting do_symval_forwarding get the current value. */
1286 if (BUFFER_OBJFWDP (valcontents))
1288 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1289 if (PER_BUFFER_IDX (offset) != 0)
1290 return PER_BUFFER_DEFAULT (offset);
1293 /* Handle user-created local variables. */
1294 if (BUFFER_LOCAL_VALUEP (valcontents)
1295 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1297 /* If var is set up for a buffer that lacks a local value for it,
1298 the current value is nominally the default value.
1299 But the `realvalue' slot may be more up to date, since
1300 ordinary setq stores just that slot. So use that. */
1301 Lisp_Object current_alist_element, alist_element_car;
1302 current_alist_element
1303 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1304 alist_element_car = XCAR (current_alist_element);
1305 if (EQ (alist_element_car, current_alist_element))
1306 return do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue);
1307 else
1308 return XCDR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1310 /* For other variables, get the current value. */
1311 return do_symval_forwarding (valcontents);
1314 DEFUN ("default-boundp", Fdefault_boundp, Sdefault_boundp, 1, 1, 0,
1315 doc: /* Return t if SYMBOL has a non-void default value.
1316 This is the value that is seen in buffers that do not have their own values
1317 for this variable. */)
1318 (symbol)
1319 Lisp_Object symbol;
1321 register Lisp_Object value;
1323 value = default_value (symbol);
1324 return (EQ (value, Qunbound) ? Qnil : Qt);
1327 DEFUN ("default-value", Fdefault_value, Sdefault_value, 1, 1, 0,
1328 doc: /* Return SYMBOL's default value.
1329 This is the value that is seen in buffers that do not have their own values
1330 for this variable. The default value is meaningful for variables with
1331 local bindings in certain buffers. */)
1332 (symbol)
1333 Lisp_Object symbol;
1335 register Lisp_Object value;
1337 value = default_value (symbol);
1338 if (EQ (value, Qunbound))
1339 return Fsignal (Qvoid_variable, Fcons (symbol, Qnil));
1340 return value;
1343 DEFUN ("set-default", Fset_default, Sset_default, 2, 2, 0,
1344 doc: /* Set SYMBOL's default value to VAL. SYMBOL and VAL are evaluated.
1345 The default value is seen in buffers that do not have their own values
1346 for this variable. */)
1347 (symbol, value)
1348 Lisp_Object symbol, value;
1350 register Lisp_Object valcontents, current_alist_element, alist_element_buffer;
1352 CHECK_SYMBOL (symbol);
1353 valcontents = SYMBOL_VALUE (symbol);
1355 /* Handle variables like case-fold-search that have special slots
1356 in the buffer. Make them work apparently like Lisp_Buffer_Local_Value
1357 variables. */
1358 if (BUFFER_OBJFWDP (valcontents))
1360 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1361 int idx = PER_BUFFER_IDX (offset);
1363 PER_BUFFER_DEFAULT (offset) = value;
1365 /* If this variable is not always local in all buffers,
1366 set it in the buffers that don't nominally have a local value. */
1367 if (idx > 0)
1369 struct buffer *b;
1371 for (b = all_buffers; b; b = b->next)
1372 if (!PER_BUFFER_VALUE_P (b, idx))
1373 PER_BUFFER_VALUE (b, offset) = value;
1375 return value;
1378 if (!BUFFER_LOCAL_VALUEP (valcontents)
1379 && !SOME_BUFFER_LOCAL_VALUEP (valcontents))
1380 return Fset (symbol, value);
1382 /* Store new value into the DEFAULT-VALUE slot. */
1383 XSETCDR (XBUFFER_LOCAL_VALUE (valcontents)->cdr, value);
1385 /* If the default binding is now loaded, set the REALVALUE slot too. */
1386 current_alist_element
1387 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1388 alist_element_buffer = Fcar (current_alist_element);
1389 if (EQ (alist_element_buffer, current_alist_element))
1390 store_symval_forwarding (symbol,
1391 XBUFFER_LOCAL_VALUE (valcontents)->realvalue,
1392 value, NULL);
1394 return value;
1397 DEFUN ("setq-default", Fsetq_default, Ssetq_default, 2, UNEVALLED, 0,
1398 doc: /* Set the default value of variable VAR to VALUE.
1399 VAR, the variable name, is literal (not evaluated);
1400 VALUE is an expression: it is evaluated and its value returned.
1401 The default value of a variable is seen in buffers
1402 that do not have their own values for the variable.
1404 More generally, you can use multiple variables and values, as in
1405 (setq-default SYMBOL VALUE SYMBOL VALUE...)
1406 This sets each SYMBOL's default value to the corresponding VALUE.
1407 The VALUE for the Nth SYMBOL can refer to the new default values
1408 of previous SYMs.
1409 usage: (setq-default SYMBOL VALUE [SYMBOL VALUE...]) */)
1410 (args)
1411 Lisp_Object args;
1413 register Lisp_Object args_left;
1414 register Lisp_Object val, symbol;
1415 struct gcpro gcpro1;
1417 if (NILP (args))
1418 return Qnil;
1420 args_left = args;
1421 GCPRO1 (args);
1425 val = Feval (Fcar (Fcdr (args_left)));
1426 symbol = XCAR (args_left);
1427 Fset_default (symbol, val);
1428 args_left = Fcdr (XCDR (args_left));
1430 while (!NILP (args_left));
1432 UNGCPRO;
1433 return val;
1436 /* Lisp functions for creating and removing buffer-local variables. */
1438 DEFUN ("make-variable-buffer-local", Fmake_variable_buffer_local, Smake_variable_buffer_local,
1439 1, 1, "vMake Variable Buffer Local: ",
1440 doc: /* Make VARIABLE become buffer-local whenever it is set.
1441 At any time, the value for the current buffer is in effect,
1442 unless the variable has never been set in this buffer,
1443 in which case the default value is in effect.
1444 Note that binding the variable with `let', or setting it while
1445 a `let'-style binding made in this buffer is in effect,
1446 does not make the variable buffer-local. Return VARIABLE.
1448 The function `default-value' gets the default value and `set-default' sets it. */)
1449 (variable)
1450 register Lisp_Object variable;
1452 register Lisp_Object tem, valcontents, newval;
1454 CHECK_SYMBOL (variable);
1456 valcontents = SYMBOL_VALUE (variable);
1457 if (EQ (variable, Qnil) || EQ (variable, Qt) || KBOARD_OBJFWDP (valcontents))
1458 error ("Symbol %s may not be buffer-local", SDATA (SYMBOL_NAME (variable)));
1460 if (BUFFER_LOCAL_VALUEP (valcontents) || BUFFER_OBJFWDP (valcontents))
1461 return variable;
1462 if (SOME_BUFFER_LOCAL_VALUEP (valcontents))
1464 XMISCTYPE (SYMBOL_VALUE (variable)) = Lisp_Misc_Buffer_Local_Value;
1465 return variable;
1467 if (EQ (valcontents, Qunbound))
1468 SET_SYMBOL_VALUE (variable, Qnil);
1469 tem = Fcons (Qnil, Fsymbol_value (variable));
1470 XSETCAR (tem, tem);
1471 newval = allocate_misc ();
1472 XMISCTYPE (newval) = Lisp_Misc_Buffer_Local_Value;
1473 XBUFFER_LOCAL_VALUE (newval)->realvalue = SYMBOL_VALUE (variable);
1474 XBUFFER_LOCAL_VALUE (newval)->buffer = Fcurrent_buffer ();
1475 XBUFFER_LOCAL_VALUE (newval)->frame = Qnil;
1476 XBUFFER_LOCAL_VALUE (newval)->found_for_buffer = 0;
1477 XBUFFER_LOCAL_VALUE (newval)->found_for_frame = 0;
1478 XBUFFER_LOCAL_VALUE (newval)->check_frame = 0;
1479 XBUFFER_LOCAL_VALUE (newval)->cdr = tem;
1480 SET_SYMBOL_VALUE (variable, newval);
1481 return variable;
1484 DEFUN ("make-local-variable", Fmake_local_variable, Smake_local_variable,
1485 1, 1, "vMake Local Variable: ",
1486 doc: /* Make VARIABLE have a separate value in the current buffer.
1487 Other buffers will continue to share a common default value.
1488 \(The buffer-local value of VARIABLE starts out as the same value
1489 VARIABLE previously had. If VARIABLE was void, it remains void.\)
1490 See also `make-variable-buffer-local'. Return VARIABLE.
1492 If the variable is already arranged to become local when set,
1493 this function causes a local value to exist for this buffer,
1494 just as setting the variable would do.
1496 This function returns VARIABLE, and therefore
1497 (set (make-local-variable 'VARIABLE) VALUE-EXP)
1498 works.
1500 Do not use `make-local-variable' to make a hook variable buffer-local.
1501 Instead, use `add-hook' and specify t for the LOCAL argument. */)
1502 (variable)
1503 register Lisp_Object variable;
1505 register Lisp_Object tem, valcontents;
1507 CHECK_SYMBOL (variable);
1509 valcontents = SYMBOL_VALUE (variable);
1510 if (EQ (variable, Qnil) || EQ (variable, Qt) || KBOARD_OBJFWDP (valcontents))
1511 error ("Symbol %s may not be buffer-local", SDATA (SYMBOL_NAME (variable)));
1513 if (BUFFER_LOCAL_VALUEP (valcontents) || BUFFER_OBJFWDP (valcontents))
1515 tem = Fboundp (variable);
1517 /* Make sure the symbol has a local value in this particular buffer,
1518 by setting it to the same value it already has. */
1519 Fset (variable, (EQ (tem, Qt) ? Fsymbol_value (variable) : Qunbound));
1520 return variable;
1522 /* Make sure symbol is set up to hold per-buffer values. */
1523 if (!SOME_BUFFER_LOCAL_VALUEP (valcontents))
1525 Lisp_Object newval;
1526 tem = Fcons (Qnil, do_symval_forwarding (valcontents));
1527 XSETCAR (tem, tem);
1528 newval = allocate_misc ();
1529 XMISCTYPE (newval) = Lisp_Misc_Some_Buffer_Local_Value;
1530 XBUFFER_LOCAL_VALUE (newval)->realvalue = SYMBOL_VALUE (variable);
1531 XBUFFER_LOCAL_VALUE (newval)->buffer = Qnil;
1532 XBUFFER_LOCAL_VALUE (newval)->frame = Qnil;
1533 XBUFFER_LOCAL_VALUE (newval)->found_for_buffer = 0;
1534 XBUFFER_LOCAL_VALUE (newval)->found_for_frame = 0;
1535 XBUFFER_LOCAL_VALUE (newval)->check_frame = 0;
1536 XBUFFER_LOCAL_VALUE (newval)->cdr = tem;
1537 SET_SYMBOL_VALUE (variable, newval);;
1539 /* Make sure this buffer has its own value of symbol. */
1540 tem = Fassq (variable, current_buffer->local_var_alist);
1541 if (NILP (tem))
1543 /* Swap out any local binding for some other buffer, and make
1544 sure the current value is permanently recorded, if it's the
1545 default value. */
1546 find_symbol_value (variable);
1548 current_buffer->local_var_alist
1549 = Fcons (Fcons (variable, XCDR (XBUFFER_LOCAL_VALUE (SYMBOL_VALUE (variable))->cdr)),
1550 current_buffer->local_var_alist);
1552 /* Make sure symbol does not think it is set up for this buffer;
1553 force it to look once again for this buffer's value. */
1555 Lisp_Object *pvalbuf;
1557 valcontents = SYMBOL_VALUE (variable);
1559 pvalbuf = &XBUFFER_LOCAL_VALUE (valcontents)->buffer;
1560 if (current_buffer == XBUFFER (*pvalbuf))
1561 *pvalbuf = Qnil;
1562 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
1566 /* If the symbol forwards into a C variable, then load the binding
1567 for this buffer now. If C code modifies the variable before we
1568 load the binding in, then that new value will clobber the default
1569 binding the next time we unload it. */
1570 valcontents = XBUFFER_LOCAL_VALUE (SYMBOL_VALUE (variable))->realvalue;
1571 if (INTFWDP (valcontents) || BOOLFWDP (valcontents) || OBJFWDP (valcontents))
1572 swap_in_symval_forwarding (variable, SYMBOL_VALUE (variable));
1574 return variable;
1577 DEFUN ("kill-local-variable", Fkill_local_variable, Skill_local_variable,
1578 1, 1, "vKill Local Variable: ",
1579 doc: /* Make VARIABLE no longer have a separate value in the current buffer.
1580 From now on the default value will apply in this buffer. Return VARIABLE. */)
1581 (variable)
1582 register Lisp_Object variable;
1584 register Lisp_Object tem, valcontents;
1586 CHECK_SYMBOL (variable);
1588 valcontents = SYMBOL_VALUE (variable);
1590 if (BUFFER_OBJFWDP (valcontents))
1592 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1593 int idx = PER_BUFFER_IDX (offset);
1595 if (idx > 0)
1597 SET_PER_BUFFER_VALUE_P (current_buffer, idx, 0);
1598 PER_BUFFER_VALUE (current_buffer, offset)
1599 = PER_BUFFER_DEFAULT (offset);
1601 return variable;
1604 if (!BUFFER_LOCAL_VALUEP (valcontents)
1605 && !SOME_BUFFER_LOCAL_VALUEP (valcontents))
1606 return variable;
1608 /* Get rid of this buffer's alist element, if any. */
1610 tem = Fassq (variable, current_buffer->local_var_alist);
1611 if (!NILP (tem))
1612 current_buffer->local_var_alist
1613 = Fdelq (tem, current_buffer->local_var_alist);
1615 /* If the symbol is set up with the current buffer's binding
1616 loaded, recompute its value. We have to do it now, or else
1617 forwarded objects won't work right. */
1619 Lisp_Object *pvalbuf;
1620 valcontents = SYMBOL_VALUE (variable);
1621 pvalbuf = &XBUFFER_LOCAL_VALUE (valcontents)->buffer;
1622 if (current_buffer == XBUFFER (*pvalbuf))
1624 *pvalbuf = Qnil;
1625 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
1626 find_symbol_value (variable);
1630 return variable;
1633 /* Lisp functions for creating and removing buffer-local variables. */
1635 DEFUN ("make-variable-frame-local", Fmake_variable_frame_local, Smake_variable_frame_local,
1636 1, 1, "vMake Variable Frame Local: ",
1637 doc: /* Enable VARIABLE to have frame-local bindings.
1638 When a frame-local binding exists in the current frame,
1639 it is in effect whenever the current buffer has no buffer-local binding.
1640 A frame-local binding is actually a frame parameter value;
1641 thus, any given frame has a local binding for VARIABLE if it has
1642 a value for the frame parameter named VARIABLE. Return VARIABLE.
1643 See `modify-frame-parameters' for how to set frame parameters. */)
1644 (variable)
1645 register Lisp_Object variable;
1647 register Lisp_Object tem, valcontents, newval;
1649 CHECK_SYMBOL (variable);
1651 valcontents = SYMBOL_VALUE (variable);
1652 if (EQ (variable, Qnil) || EQ (variable, Qt) || KBOARD_OBJFWDP (valcontents)
1653 || BUFFER_OBJFWDP (valcontents))
1654 error ("Symbol %s may not be frame-local", SDATA (SYMBOL_NAME (variable)));
1656 if (BUFFER_LOCAL_VALUEP (valcontents)
1657 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1659 XBUFFER_LOCAL_VALUE (valcontents)->check_frame = 1;
1660 return variable;
1663 if (EQ (valcontents, Qunbound))
1664 SET_SYMBOL_VALUE (variable, Qnil);
1665 tem = Fcons (Qnil, Fsymbol_value (variable));
1666 XSETCAR (tem, tem);
1667 newval = allocate_misc ();
1668 XMISCTYPE (newval) = Lisp_Misc_Some_Buffer_Local_Value;
1669 XBUFFER_LOCAL_VALUE (newval)->realvalue = SYMBOL_VALUE (variable);
1670 XBUFFER_LOCAL_VALUE (newval)->buffer = Qnil;
1671 XBUFFER_LOCAL_VALUE (newval)->frame = Qnil;
1672 XBUFFER_LOCAL_VALUE (newval)->found_for_buffer = 0;
1673 XBUFFER_LOCAL_VALUE (newval)->found_for_frame = 0;
1674 XBUFFER_LOCAL_VALUE (newval)->check_frame = 1;
1675 XBUFFER_LOCAL_VALUE (newval)->cdr = tem;
1676 SET_SYMBOL_VALUE (variable, newval);
1677 return variable;
1680 DEFUN ("local-variable-p", Flocal_variable_p, Slocal_variable_p,
1681 1, 2, 0,
1682 doc: /* Non-nil if VARIABLE has a local binding in buffer BUFFER.
1683 BUFFER defaults to the current buffer. */)
1684 (variable, buffer)
1685 register Lisp_Object variable, buffer;
1687 Lisp_Object valcontents;
1688 register struct buffer *buf;
1690 if (NILP (buffer))
1691 buf = current_buffer;
1692 else
1694 CHECK_BUFFER (buffer);
1695 buf = XBUFFER (buffer);
1698 CHECK_SYMBOL (variable);
1700 valcontents = SYMBOL_VALUE (variable);
1701 if (BUFFER_LOCAL_VALUEP (valcontents)
1702 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1704 Lisp_Object tail, elt;
1706 variable = indirect_variable (variable);
1707 for (tail = buf->local_var_alist; CONSP (tail); tail = XCDR (tail))
1709 elt = XCAR (tail);
1710 if (EQ (variable, XCAR (elt)))
1711 return Qt;
1714 if (BUFFER_OBJFWDP (valcontents))
1716 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1717 int idx = PER_BUFFER_IDX (offset);
1718 if (idx == -1 || PER_BUFFER_VALUE_P (buf, idx))
1719 return Qt;
1721 return Qnil;
1724 DEFUN ("local-variable-if-set-p", Flocal_variable_if_set_p, Slocal_variable_if_set_p,
1725 1, 2, 0,
1726 doc: /* Non-nil if VARIABLE will be local in buffer BUFFER if it is set there.
1727 BUFFER defaults to the current buffer. */)
1728 (variable, buffer)
1729 register Lisp_Object variable, buffer;
1731 Lisp_Object valcontents;
1732 register struct buffer *buf;
1734 if (NILP (buffer))
1735 buf = current_buffer;
1736 else
1738 CHECK_BUFFER (buffer);
1739 buf = XBUFFER (buffer);
1742 CHECK_SYMBOL (variable);
1744 valcontents = SYMBOL_VALUE (variable);
1746 /* This means that make-variable-buffer-local was done. */
1747 if (BUFFER_LOCAL_VALUEP (valcontents))
1748 return Qt;
1749 /* All these slots become local if they are set. */
1750 if (BUFFER_OBJFWDP (valcontents))
1751 return Qt;
1752 if (SOME_BUFFER_LOCAL_VALUEP (valcontents))
1754 Lisp_Object tail, elt;
1755 for (tail = buf->local_var_alist; CONSP (tail); tail = XCDR (tail))
1757 elt = XCAR (tail);
1758 if (EQ (variable, XCAR (elt)))
1759 return Qt;
1762 return Qnil;
1765 /* Find the function at the end of a chain of symbol function indirections. */
1767 /* If OBJECT is a symbol, find the end of its function chain and
1768 return the value found there. If OBJECT is not a symbol, just
1769 return it. If there is a cycle in the function chain, signal a
1770 cyclic-function-indirection error.
1772 This is like Findirect_function, except that it doesn't signal an
1773 error if the chain ends up unbound. */
1774 Lisp_Object
1775 indirect_function (object)
1776 register Lisp_Object object;
1778 Lisp_Object tortoise, hare;
1780 hare = tortoise = object;
1782 for (;;)
1784 if (!SYMBOLP (hare) || EQ (hare, Qunbound))
1785 break;
1786 hare = XSYMBOL (hare)->function;
1787 if (!SYMBOLP (hare) || EQ (hare, Qunbound))
1788 break;
1789 hare = XSYMBOL (hare)->function;
1791 tortoise = XSYMBOL (tortoise)->function;
1793 if (EQ (hare, tortoise))
1794 Fsignal (Qcyclic_function_indirection, Fcons (object, Qnil));
1797 return hare;
1800 DEFUN ("indirect-function", Findirect_function, Sindirect_function, 1, 1, 0,
1801 doc: /* Return the function at the end of OBJECT's function chain.
1802 If OBJECT is a symbol, follow all function indirections and return the final
1803 function binding.
1804 If OBJECT is not a symbol, just return it.
1805 Signal a void-function error if the final symbol is unbound.
1806 Signal a cyclic-function-indirection error if there is a loop in the
1807 function chain of symbols. */)
1808 (object)
1809 register Lisp_Object object;
1811 Lisp_Object result;
1813 result = indirect_function (object);
1815 if (EQ (result, Qunbound))
1816 return Fsignal (Qvoid_function, Fcons (object, Qnil));
1817 return result;
1820 /* Extract and set vector and string elements */
1822 DEFUN ("aref", Faref, Saref, 2, 2, 0,
1823 doc: /* Return the element of ARRAY at index IDX.
1824 ARRAY may be a vector, a string, a char-table, a bool-vector,
1825 or a byte-code object. IDX starts at 0. */)
1826 (array, idx)
1827 register Lisp_Object array;
1828 Lisp_Object idx;
1830 register int idxval;
1832 CHECK_NUMBER (idx);
1833 idxval = XINT (idx);
1834 if (STRINGP (array))
1836 int c, idxval_byte;
1838 if (idxval < 0 || idxval >= SCHARS (array))
1839 args_out_of_range (array, idx);
1840 if (! STRING_MULTIBYTE (array))
1841 return make_number ((unsigned char) SREF (array, idxval));
1842 idxval_byte = string_char_to_byte (array, idxval);
1844 c = STRING_CHAR (SDATA (array) + idxval_byte,
1845 SBYTES (array) - idxval_byte);
1846 return make_number (c);
1848 else if (BOOL_VECTOR_P (array))
1850 int val;
1852 if (idxval < 0 || idxval >= XBOOL_VECTOR (array)->size)
1853 args_out_of_range (array, idx);
1855 val = (unsigned char) XBOOL_VECTOR (array)->data[idxval / BITS_PER_CHAR];
1856 return (val & (1 << (idxval % BITS_PER_CHAR)) ? Qt : Qnil);
1858 else if (CHAR_TABLE_P (array))
1860 Lisp_Object val;
1862 val = Qnil;
1864 if (idxval < 0)
1865 args_out_of_range (array, idx);
1866 if (idxval < CHAR_TABLE_ORDINARY_SLOTS)
1868 /* For ASCII and 8-bit European characters, the element is
1869 stored in the top table. */
1870 val = XCHAR_TABLE (array)->contents[idxval];
1871 if (NILP (val))
1872 val = XCHAR_TABLE (array)->defalt;
1873 while (NILP (val)) /* Follow parents until we find some value. */
1875 array = XCHAR_TABLE (array)->parent;
1876 if (NILP (array))
1877 return Qnil;
1878 val = XCHAR_TABLE (array)->contents[idxval];
1879 if (NILP (val))
1880 val = XCHAR_TABLE (array)->defalt;
1882 return val;
1884 else
1886 int code[4], i;
1887 Lisp_Object sub_table;
1889 SPLIT_CHAR (idxval, code[0], code[1], code[2]);
1890 if (code[1] < 32) code[1] = -1;
1891 else if (code[2] < 32) code[2] = -1;
1893 /* Here, the possible range of CODE[0] (== charset ID) is
1894 128..MAX_CHARSET. Since the top level char table contains
1895 data for multibyte characters after 256th element, we must
1896 increment CODE[0] by 128 to get a correct index. */
1897 code[0] += 128;
1898 code[3] = -1; /* anchor */
1900 try_parent_char_table:
1901 sub_table = array;
1902 for (i = 0; code[i] >= 0; i++)
1904 val = XCHAR_TABLE (sub_table)->contents[code[i]];
1905 if (SUB_CHAR_TABLE_P (val))
1906 sub_table = val;
1907 else
1909 if (NILP (val))
1910 val = XCHAR_TABLE (sub_table)->defalt;
1911 if (NILP (val))
1913 array = XCHAR_TABLE (array)->parent;
1914 if (!NILP (array))
1915 goto try_parent_char_table;
1917 return val;
1920 /* Here, VAL is a sub char table. We try the default value
1921 and parent. */
1922 val = XCHAR_TABLE (val)->defalt;
1923 if (NILP (val))
1925 array = XCHAR_TABLE (array)->parent;
1926 if (!NILP (array))
1927 goto try_parent_char_table;
1929 return val;
1932 else
1934 int size = 0;
1935 if (VECTORP (array))
1936 size = XVECTOR (array)->size;
1937 else if (COMPILEDP (array))
1938 size = XVECTOR (array)->size & PSEUDOVECTOR_SIZE_MASK;
1939 else
1940 wrong_type_argument (Qarrayp, array);
1942 if (idxval < 0 || idxval >= size)
1943 args_out_of_range (array, idx);
1944 return XVECTOR (array)->contents[idxval];
1948 /* Don't use alloca for relocating string data larger than this, lest
1949 we overflow their stack. The value is the same as what used in
1950 fns.c for base64 handling. */
1951 #define MAX_ALLOCA 16*1024
1953 DEFUN ("aset", Faset, Saset, 3, 3, 0,
1954 doc: /* Store into the element of ARRAY at index IDX the value NEWELT.
1955 Return NEWELT. ARRAY may be a vector, a string, a char-table or a
1956 bool-vector. IDX starts at 0. */)
1957 (array, idx, newelt)
1958 register Lisp_Object array;
1959 Lisp_Object idx, newelt;
1961 register int idxval;
1963 CHECK_NUMBER (idx);
1964 idxval = XINT (idx);
1965 if (!VECTORP (array) && !STRINGP (array) && !BOOL_VECTOR_P (array)
1966 && ! CHAR_TABLE_P (array))
1967 array = wrong_type_argument (Qarrayp, array);
1968 CHECK_IMPURE (array);
1970 if (VECTORP (array))
1972 if (idxval < 0 || idxval >= XVECTOR (array)->size)
1973 args_out_of_range (array, idx);
1974 XVECTOR (array)->contents[idxval] = newelt;
1976 else if (BOOL_VECTOR_P (array))
1978 int val;
1980 if (idxval < 0 || idxval >= XBOOL_VECTOR (array)->size)
1981 args_out_of_range (array, idx);
1983 val = (unsigned char) XBOOL_VECTOR (array)->data[idxval / BITS_PER_CHAR];
1985 if (! NILP (newelt))
1986 val |= 1 << (idxval % BITS_PER_CHAR);
1987 else
1988 val &= ~(1 << (idxval % BITS_PER_CHAR));
1989 XBOOL_VECTOR (array)->data[idxval / BITS_PER_CHAR] = val;
1991 else if (CHAR_TABLE_P (array))
1993 if (idxval < 0)
1994 args_out_of_range (array, idx);
1995 if (idxval < CHAR_TABLE_ORDINARY_SLOTS)
1996 XCHAR_TABLE (array)->contents[idxval] = newelt;
1997 else
1999 int code[4], i;
2000 Lisp_Object val;
2002 SPLIT_CHAR (idxval, code[0], code[1], code[2]);
2003 if (code[1] < 32) code[1] = -1;
2004 else if (code[2] < 32) code[2] = -1;
2006 /* See the comment of the corresponding part in Faref. */
2007 code[0] += 128;
2008 code[3] = -1; /* anchor */
2009 for (i = 0; code[i + 1] >= 0; i++)
2011 val = XCHAR_TABLE (array)->contents[code[i]];
2012 if (SUB_CHAR_TABLE_P (val))
2013 array = val;
2014 else
2016 Lisp_Object temp;
2018 /* VAL is a leaf. Create a sub char table with the
2019 default value VAL or XCHAR_TABLE (array)->defalt
2020 and look into it. */
2022 temp = make_sub_char_table (NILP (val)
2023 ? XCHAR_TABLE (array)->defalt
2024 : val);
2025 XCHAR_TABLE (array)->contents[code[i]] = temp;
2026 array = temp;
2029 XCHAR_TABLE (array)->contents[code[i]] = newelt;
2032 else if (STRING_MULTIBYTE (array))
2034 int idxval_byte, prev_bytes, new_bytes;
2035 unsigned char workbuf[MAX_MULTIBYTE_LENGTH], *p0 = workbuf, *p1;
2037 if (idxval < 0 || idxval >= SCHARS (array))
2038 args_out_of_range (array, idx);
2039 CHECK_NUMBER (newelt);
2041 idxval_byte = string_char_to_byte (array, idxval);
2042 p1 = SDATA (array) + idxval_byte;
2043 PARSE_MULTIBYTE_SEQ (p1, nbytes - idxval_byte, prev_bytes);
2044 new_bytes = CHAR_STRING (XINT (newelt), p0);
2045 if (prev_bytes != new_bytes)
2047 /* We must relocate the string data. */
2048 int nchars = SCHARS (array);
2049 int nbytes = SBYTES (array);
2050 unsigned char *str;
2052 str = (nbytes <= MAX_ALLOCA
2053 ? (unsigned char *) alloca (nbytes)
2054 : (unsigned char *) xmalloc (nbytes));
2055 bcopy (SDATA (array), str, nbytes);
2056 allocate_string_data (XSTRING (array), nchars,
2057 nbytes + new_bytes - prev_bytes);
2058 bcopy (str, SDATA (array), idxval_byte);
2059 p1 = SDATA (array) + idxval_byte;
2060 bcopy (str + idxval_byte + prev_bytes, p1 + new_bytes,
2061 nbytes - (idxval_byte + prev_bytes));
2062 if (nbytes > MAX_ALLOCA)
2063 xfree (str);
2064 clear_string_char_byte_cache ();
2066 while (new_bytes--)
2067 *p1++ = *p0++;
2069 else
2071 if (idxval < 0 || idxval >= SCHARS (array))
2072 args_out_of_range (array, idx);
2073 CHECK_NUMBER (newelt);
2075 if (XINT (newelt) < 0 || SINGLE_BYTE_CHAR_P (XINT (newelt)))
2076 SSET (array, idxval, XINT (newelt));
2077 else
2079 /* We must relocate the string data while converting it to
2080 multibyte. */
2081 int idxval_byte, prev_bytes, new_bytes;
2082 unsigned char workbuf[MAX_MULTIBYTE_LENGTH], *p0 = workbuf, *p1;
2083 unsigned char *origstr = SDATA (array), *str;
2084 int nchars, nbytes;
2086 nchars = SCHARS (array);
2087 nbytes = idxval_byte = count_size_as_multibyte (origstr, idxval);
2088 nbytes += count_size_as_multibyte (origstr + idxval,
2089 nchars - idxval);
2090 str = (nbytes <= MAX_ALLOCA
2091 ? (unsigned char *) alloca (nbytes)
2092 : (unsigned char *) xmalloc (nbytes));
2093 copy_text (SDATA (array), str, nchars, 0, 1);
2094 PARSE_MULTIBYTE_SEQ (str + idxval_byte, nbytes - idxval_byte,
2095 prev_bytes);
2096 new_bytes = CHAR_STRING (XINT (newelt), p0);
2097 allocate_string_data (XSTRING (array), nchars,
2098 nbytes + new_bytes - prev_bytes);
2099 bcopy (str, SDATA (array), idxval_byte);
2100 p1 = SDATA (array) + idxval_byte;
2101 while (new_bytes--)
2102 *p1++ = *p0++;
2103 bcopy (str + idxval_byte + prev_bytes, p1,
2104 nbytes - (idxval_byte + prev_bytes));
2105 if (nbytes > MAX_ALLOCA)
2106 xfree (str);
2107 clear_string_char_byte_cache ();
2111 return newelt;
2114 /* Arithmetic functions */
2116 enum comparison { equal, notequal, less, grtr, less_or_equal, grtr_or_equal };
2118 Lisp_Object
2119 arithcompare (num1, num2, comparison)
2120 Lisp_Object num1, num2;
2121 enum comparison comparison;
2123 double f1 = 0, f2 = 0;
2124 int floatp = 0;
2126 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num1);
2127 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num2);
2129 if (FLOATP (num1) || FLOATP (num2))
2131 floatp = 1;
2132 f1 = (FLOATP (num1)) ? XFLOAT_DATA (num1) : XINT (num1);
2133 f2 = (FLOATP (num2)) ? XFLOAT_DATA (num2) : XINT (num2);
2136 switch (comparison)
2138 case equal:
2139 if (floatp ? f1 == f2 : XINT (num1) == XINT (num2))
2140 return Qt;
2141 return Qnil;
2143 case notequal:
2144 if (floatp ? f1 != f2 : XINT (num1) != XINT (num2))
2145 return Qt;
2146 return Qnil;
2148 case less:
2149 if (floatp ? f1 < f2 : XINT (num1) < XINT (num2))
2150 return Qt;
2151 return Qnil;
2153 case less_or_equal:
2154 if (floatp ? f1 <= f2 : XINT (num1) <= XINT (num2))
2155 return Qt;
2156 return Qnil;
2158 case grtr:
2159 if (floatp ? f1 > f2 : XINT (num1) > XINT (num2))
2160 return Qt;
2161 return Qnil;
2163 case grtr_or_equal:
2164 if (floatp ? f1 >= f2 : XINT (num1) >= XINT (num2))
2165 return Qt;
2166 return Qnil;
2168 default:
2169 abort ();
2173 DEFUN ("=", Feqlsign, Seqlsign, 2, 2, 0,
2174 doc: /* Return t if two args, both numbers or markers, are equal. */)
2175 (num1, num2)
2176 register Lisp_Object num1, num2;
2178 return arithcompare (num1, num2, equal);
2181 DEFUN ("<", Flss, Slss, 2, 2, 0,
2182 doc: /* Return t if first arg is less than second arg. Both must be numbers or markers. */)
2183 (num1, num2)
2184 register Lisp_Object num1, num2;
2186 return arithcompare (num1, num2, less);
2189 DEFUN (">", Fgtr, Sgtr, 2, 2, 0,
2190 doc: /* Return t if first arg is greater than second arg. Both must be numbers or markers. */)
2191 (num1, num2)
2192 register Lisp_Object num1, num2;
2194 return arithcompare (num1, num2, grtr);
2197 DEFUN ("<=", Fleq, Sleq, 2, 2, 0,
2198 doc: /* Return t if first arg is less than or equal to second arg.
2199 Both must be numbers or markers. */)
2200 (num1, num2)
2201 register Lisp_Object num1, num2;
2203 return arithcompare (num1, num2, less_or_equal);
2206 DEFUN (">=", Fgeq, Sgeq, 2, 2, 0,
2207 doc: /* Return t if first arg is greater than or equal to second arg.
2208 Both must be numbers or markers. */)
2209 (num1, num2)
2210 register Lisp_Object num1, num2;
2212 return arithcompare (num1, num2, grtr_or_equal);
2215 DEFUN ("/=", Fneq, Sneq, 2, 2, 0,
2216 doc: /* Return t if first arg is not equal to second arg. Both must be numbers or markers. */)
2217 (num1, num2)
2218 register Lisp_Object num1, num2;
2220 return arithcompare (num1, num2, notequal);
2223 DEFUN ("zerop", Fzerop, Szerop, 1, 1, 0,
2224 doc: /* Return t if NUMBER is zero. */)
2225 (number)
2226 register Lisp_Object number;
2228 CHECK_NUMBER_OR_FLOAT (number);
2230 if (FLOATP (number))
2232 if (XFLOAT_DATA (number) == 0.0)
2233 return Qt;
2234 return Qnil;
2237 if (!XINT (number))
2238 return Qt;
2239 return Qnil;
2242 /* Convert between long values and pairs of Lisp integers. */
2244 Lisp_Object
2245 long_to_cons (i)
2246 unsigned long i;
2248 unsigned int top = i >> 16;
2249 unsigned int bot = i & 0xFFFF;
2250 if (top == 0)
2251 return make_number (bot);
2252 if (top == (unsigned long)-1 >> 16)
2253 return Fcons (make_number (-1), make_number (bot));
2254 return Fcons (make_number (top), make_number (bot));
2257 unsigned long
2258 cons_to_long (c)
2259 Lisp_Object c;
2261 Lisp_Object top, bot;
2262 if (INTEGERP (c))
2263 return XINT (c);
2264 top = XCAR (c);
2265 bot = XCDR (c);
2266 if (CONSP (bot))
2267 bot = XCAR (bot);
2268 return ((XINT (top) << 16) | XINT (bot));
2271 DEFUN ("number-to-string", Fnumber_to_string, Snumber_to_string, 1, 1, 0,
2272 doc: /* Return the decimal representation of NUMBER as a string.
2273 Uses a minus sign if negative.
2274 NUMBER may be an integer or a floating point number. */)
2275 (number)
2276 Lisp_Object number;
2278 char buffer[VALBITS];
2280 CHECK_NUMBER_OR_FLOAT (number);
2282 if (FLOATP (number))
2284 char pigbuf[350]; /* see comments in float_to_string */
2286 float_to_string (pigbuf, XFLOAT_DATA (number));
2287 return build_string (pigbuf);
2290 if (sizeof (int) == sizeof (EMACS_INT))
2291 sprintf (buffer, "%d", XINT (number));
2292 else if (sizeof (long) == sizeof (EMACS_INT))
2293 sprintf (buffer, "%ld", (long) XINT (number));
2294 else
2295 abort ();
2296 return build_string (buffer);
2299 INLINE static int
2300 digit_to_number (character, base)
2301 int character, base;
2303 int digit;
2305 if (character >= '0' && character <= '9')
2306 digit = character - '0';
2307 else if (character >= 'a' && character <= 'z')
2308 digit = character - 'a' + 10;
2309 else if (character >= 'A' && character <= 'Z')
2310 digit = character - 'A' + 10;
2311 else
2312 return -1;
2314 if (digit >= base)
2315 return -1;
2316 else
2317 return digit;
2320 DEFUN ("string-to-number", Fstring_to_number, Sstring_to_number, 1, 2, 0,
2321 doc: /* Parse STRING as a decimal number and return the number.
2322 This parses both integers and floating point numbers.
2323 It ignores leading spaces and tabs.
2325 If BASE, interpret STRING as a number in that base. If BASE isn't
2326 present, base 10 is used. BASE must be between 2 and 16 (inclusive).
2327 If the base used is not 10, floating point is not recognized. */)
2328 (string, base)
2329 register Lisp_Object string, base;
2331 register unsigned char *p;
2332 register int b;
2333 int sign = 1;
2334 Lisp_Object val;
2336 CHECK_STRING (string);
2338 if (NILP (base))
2339 b = 10;
2340 else
2342 CHECK_NUMBER (base);
2343 b = XINT (base);
2344 if (b < 2 || b > 16)
2345 Fsignal (Qargs_out_of_range, Fcons (base, Qnil));
2348 /* Skip any whitespace at the front of the number. Some versions of
2349 atoi do this anyway, so we might as well make Emacs lisp consistent. */
2350 p = SDATA (string);
2351 while (*p == ' ' || *p == '\t')
2352 p++;
2354 if (*p == '-')
2356 sign = -1;
2357 p++;
2359 else if (*p == '+')
2360 p++;
2362 if (isfloat_string (p) && b == 10)
2363 val = make_float (sign * atof (p));
2364 else
2366 double v = 0;
2368 while (1)
2370 int digit = digit_to_number (*p++, b);
2371 if (digit < 0)
2372 break;
2373 v = v * b + digit;
2376 val = make_fixnum_or_float (sign * v);
2379 return val;
2383 enum arithop
2385 Aadd,
2386 Asub,
2387 Amult,
2388 Adiv,
2389 Alogand,
2390 Alogior,
2391 Alogxor,
2392 Amax,
2393 Amin
2396 static Lisp_Object float_arith_driver P_ ((double, int, enum arithop,
2397 int, Lisp_Object *));
2398 extern Lisp_Object fmod_float ();
2400 Lisp_Object
2401 arith_driver (code, nargs, args)
2402 enum arithop code;
2403 int nargs;
2404 register Lisp_Object *args;
2406 register Lisp_Object val;
2407 register int argnum;
2408 register EMACS_INT accum = 0;
2409 register EMACS_INT next;
2411 switch (SWITCH_ENUM_CAST (code))
2413 case Alogior:
2414 case Alogxor:
2415 case Aadd:
2416 case Asub:
2417 accum = 0;
2418 break;
2419 case Amult:
2420 accum = 1;
2421 break;
2422 case Alogand:
2423 accum = -1;
2424 break;
2425 default:
2426 break;
2429 for (argnum = 0; argnum < nargs; argnum++)
2431 /* Using args[argnum] as argument to CHECK_NUMBER_... */
2432 val = args[argnum];
2433 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val);
2435 if (FLOATP (val))
2436 return float_arith_driver ((double) accum, argnum, code,
2437 nargs, args);
2438 args[argnum] = val;
2439 next = XINT (args[argnum]);
2440 switch (SWITCH_ENUM_CAST (code))
2442 case Aadd:
2443 accum += next;
2444 break;
2445 case Asub:
2446 accum = argnum ? accum - next : nargs == 1 ? - next : next;
2447 break;
2448 case Amult:
2449 accum *= next;
2450 break;
2451 case Adiv:
2452 if (!argnum)
2453 accum = next;
2454 else
2456 if (next == 0)
2457 Fsignal (Qarith_error, Qnil);
2458 accum /= next;
2460 break;
2461 case Alogand:
2462 accum &= next;
2463 break;
2464 case Alogior:
2465 accum |= next;
2466 break;
2467 case Alogxor:
2468 accum ^= next;
2469 break;
2470 case Amax:
2471 if (!argnum || next > accum)
2472 accum = next;
2473 break;
2474 case Amin:
2475 if (!argnum || next < accum)
2476 accum = next;
2477 break;
2481 XSETINT (val, accum);
2482 return val;
2485 #undef isnan
2486 #define isnan(x) ((x) != (x))
2488 static Lisp_Object
2489 float_arith_driver (accum, argnum, code, nargs, args)
2490 double accum;
2491 register int argnum;
2492 enum arithop code;
2493 int nargs;
2494 register Lisp_Object *args;
2496 register Lisp_Object val;
2497 double next;
2499 for (; argnum < nargs; argnum++)
2501 val = args[argnum]; /* using args[argnum] as argument to CHECK_NUMBER_... */
2502 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val);
2504 if (FLOATP (val))
2506 next = XFLOAT_DATA (val);
2508 else
2510 args[argnum] = val; /* runs into a compiler bug. */
2511 next = XINT (args[argnum]);
2513 switch (SWITCH_ENUM_CAST (code))
2515 case Aadd:
2516 accum += next;
2517 break;
2518 case Asub:
2519 accum = argnum ? accum - next : nargs == 1 ? - next : next;
2520 break;
2521 case Amult:
2522 accum *= next;
2523 break;
2524 case Adiv:
2525 if (!argnum)
2526 accum = next;
2527 else
2529 if (! IEEE_FLOATING_POINT && next == 0)
2530 Fsignal (Qarith_error, Qnil);
2531 accum /= next;
2533 break;
2534 case Alogand:
2535 case Alogior:
2536 case Alogxor:
2537 return wrong_type_argument (Qinteger_or_marker_p, val);
2538 case Amax:
2539 if (!argnum || isnan (next) || next > accum)
2540 accum = next;
2541 break;
2542 case Amin:
2543 if (!argnum || isnan (next) || next < accum)
2544 accum = next;
2545 break;
2549 return make_float (accum);
2553 DEFUN ("+", Fplus, Splus, 0, MANY, 0,
2554 doc: /* Return sum of any number of arguments, which are numbers or markers.
2555 usage: (+ &rest NUMBERS-OR-MARKERS) */)
2556 (nargs, args)
2557 int nargs;
2558 Lisp_Object *args;
2560 return arith_driver (Aadd, nargs, args);
2563 DEFUN ("-", Fminus, Sminus, 0, MANY, 0,
2564 doc: /* Negate number or subtract numbers or markers and return the result.
2565 With one arg, negates it. With more than one arg,
2566 subtracts all but the first from the first.
2567 usage: (- &optional NUMBER-OR-MARKER &rest MORE-NUMBERS-OR-MARKERS) */)
2568 (nargs, args)
2569 int nargs;
2570 Lisp_Object *args;
2572 return arith_driver (Asub, nargs, args);
2575 DEFUN ("*", Ftimes, Stimes, 0, MANY, 0,
2576 doc: /* Return product of any number of arguments, which are numbers or markers.
2577 usage: (* &rest NUMBERS-OR-MARKERS) */)
2578 (nargs, args)
2579 int nargs;
2580 Lisp_Object *args;
2582 return arith_driver (Amult, nargs, args);
2585 DEFUN ("/", Fquo, Squo, 2, MANY, 0,
2586 doc: /* Return first argument divided by all the remaining arguments.
2587 The arguments must be numbers or markers.
2588 usage: (/ DIVIDEND DIVISOR &rest DIVISORS) */)
2589 (nargs, args)
2590 int nargs;
2591 Lisp_Object *args;
2593 return arith_driver (Adiv, nargs, args);
2596 DEFUN ("%", Frem, Srem, 2, 2, 0,
2597 doc: /* Return remainder of X divided by Y.
2598 Both must be integers or markers. */)
2599 (x, y)
2600 register Lisp_Object x, y;
2602 Lisp_Object val;
2604 CHECK_NUMBER_COERCE_MARKER (x);
2605 CHECK_NUMBER_COERCE_MARKER (y);
2607 if (XFASTINT (y) == 0)
2608 Fsignal (Qarith_error, Qnil);
2610 XSETINT (val, XINT (x) % XINT (y));
2611 return val;
2614 #ifndef HAVE_FMOD
2615 double
2616 fmod (f1, f2)
2617 double f1, f2;
2619 double r = f1;
2621 if (f2 < 0.0)
2622 f2 = -f2;
2624 /* If the magnitude of the result exceeds that of the divisor, or
2625 the sign of the result does not agree with that of the dividend,
2626 iterate with the reduced value. This does not yield a
2627 particularly accurate result, but at least it will be in the
2628 range promised by fmod. */
2630 r -= f2 * floor (r / f2);
2631 while (f2 <= (r < 0 ? -r : r) || ((r < 0) != (f1 < 0) && ! isnan (r)));
2633 return r;
2635 #endif /* ! HAVE_FMOD */
2637 DEFUN ("mod", Fmod, Smod, 2, 2, 0,
2638 doc: /* Return X modulo Y.
2639 The result falls between zero (inclusive) and Y (exclusive).
2640 Both X and Y must be numbers or markers. */)
2641 (x, y)
2642 register Lisp_Object x, y;
2644 Lisp_Object val;
2645 EMACS_INT i1, i2;
2647 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (x);
2648 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (y);
2650 if (FLOATP (x) || FLOATP (y))
2651 return fmod_float (x, y);
2653 i1 = XINT (x);
2654 i2 = XINT (y);
2656 if (i2 == 0)
2657 Fsignal (Qarith_error, Qnil);
2659 i1 %= i2;
2661 /* If the "remainder" comes out with the wrong sign, fix it. */
2662 if (i2 < 0 ? i1 > 0 : i1 < 0)
2663 i1 += i2;
2665 XSETINT (val, i1);
2666 return val;
2669 DEFUN ("max", Fmax, Smax, 1, MANY, 0,
2670 doc: /* Return largest of all the arguments (which must be numbers or markers).
2671 The value is always a number; markers are converted to numbers.
2672 usage: (max NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */)
2673 (nargs, args)
2674 int nargs;
2675 Lisp_Object *args;
2677 return arith_driver (Amax, nargs, args);
2680 DEFUN ("min", Fmin, Smin, 1, MANY, 0,
2681 doc: /* Return smallest of all the arguments (which must be numbers or markers).
2682 The value is always a number; markers are converted to numbers.
2683 usage: (min NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */)
2684 (nargs, args)
2685 int nargs;
2686 Lisp_Object *args;
2688 return arith_driver (Amin, nargs, args);
2691 DEFUN ("logand", Flogand, Slogand, 0, MANY, 0,
2692 doc: /* Return bitwise-and of all the arguments.
2693 Arguments may be integers, or markers converted to integers.
2694 usage: (logand &rest INTS-OR-MARKERS) */)
2695 (nargs, args)
2696 int nargs;
2697 Lisp_Object *args;
2699 return arith_driver (Alogand, nargs, args);
2702 DEFUN ("logior", Flogior, Slogior, 0, MANY, 0,
2703 doc: /* Return bitwise-or of all the arguments.
2704 Arguments may be integers, or markers converted to integers.
2705 usage: (logior &rest INTS-OR-MARKERS) */)
2706 (nargs, args)
2707 int nargs;
2708 Lisp_Object *args;
2710 return arith_driver (Alogior, nargs, args);
2713 DEFUN ("logxor", Flogxor, Slogxor, 0, MANY, 0,
2714 doc: /* Return bitwise-exclusive-or of all the arguments.
2715 Arguments may be integers, or markers converted to integers.
2716 usage: (logxor &rest INTS-OR-MARKERS) */)
2717 (nargs, args)
2718 int nargs;
2719 Lisp_Object *args;
2721 return arith_driver (Alogxor, nargs, args);
2724 DEFUN ("ash", Fash, Sash, 2, 2, 0,
2725 doc: /* Return VALUE with its bits shifted left by COUNT.
2726 If COUNT is negative, shifting is actually to the right.
2727 In this case, the sign bit is duplicated. */)
2728 (value, count)
2729 register Lisp_Object value, count;
2731 register Lisp_Object val;
2733 CHECK_NUMBER (value);
2734 CHECK_NUMBER (count);
2736 if (XINT (count) >= BITS_PER_EMACS_INT)
2737 XSETINT (val, 0);
2738 else if (XINT (count) > 0)
2739 XSETINT (val, XINT (value) << XFASTINT (count));
2740 else if (XINT (count) <= -BITS_PER_EMACS_INT)
2741 XSETINT (val, XINT (value) < 0 ? -1 : 0);
2742 else
2743 XSETINT (val, XINT (value) >> -XINT (count));
2744 return val;
2747 DEFUN ("lsh", Flsh, Slsh, 2, 2, 0,
2748 doc: /* Return VALUE with its bits shifted left by COUNT.
2749 If COUNT is negative, shifting is actually to the right.
2750 In this case, zeros are shifted in on the left. */)
2751 (value, count)
2752 register Lisp_Object value, count;
2754 register Lisp_Object val;
2756 CHECK_NUMBER (value);
2757 CHECK_NUMBER (count);
2759 if (XINT (count) >= BITS_PER_EMACS_INT)
2760 XSETINT (val, 0);
2761 else if (XINT (count) > 0)
2762 XSETINT (val, (EMACS_UINT) XUINT (value) << XFASTINT (count));
2763 else if (XINT (count) <= -BITS_PER_EMACS_INT)
2764 XSETINT (val, 0);
2765 else
2766 XSETINT (val, (EMACS_UINT) XUINT (value) >> -XINT (count));
2767 return val;
2770 DEFUN ("1+", Fadd1, Sadd1, 1, 1, 0,
2771 doc: /* Return NUMBER plus one. NUMBER may be a number or a marker.
2772 Markers are converted to integers. */)
2773 (number)
2774 register Lisp_Object number;
2776 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number);
2778 if (FLOATP (number))
2779 return (make_float (1.0 + XFLOAT_DATA (number)));
2781 XSETINT (number, XINT (number) + 1);
2782 return number;
2785 DEFUN ("1-", Fsub1, Ssub1, 1, 1, 0,
2786 doc: /* Return NUMBER minus one. NUMBER may be a number or a marker.
2787 Markers are converted to integers. */)
2788 (number)
2789 register Lisp_Object number;
2791 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number);
2793 if (FLOATP (number))
2794 return (make_float (-1.0 + XFLOAT_DATA (number)));
2796 XSETINT (number, XINT (number) - 1);
2797 return number;
2800 DEFUN ("lognot", Flognot, Slognot, 1, 1, 0,
2801 doc: /* Return the bitwise complement of NUMBER. NUMBER must be an integer. */)
2802 (number)
2803 register Lisp_Object number;
2805 CHECK_NUMBER (number);
2806 XSETINT (number, ~XINT (number));
2807 return number;
2810 void
2811 syms_of_data ()
2813 Lisp_Object error_tail, arith_tail;
2815 Qquote = intern ("quote");
2816 Qlambda = intern ("lambda");
2817 Qsubr = intern ("subr");
2818 Qerror_conditions = intern ("error-conditions");
2819 Qerror_message = intern ("error-message");
2820 Qtop_level = intern ("top-level");
2822 Qerror = intern ("error");
2823 Qquit = intern ("quit");
2824 Qwrong_type_argument = intern ("wrong-type-argument");
2825 Qargs_out_of_range = intern ("args-out-of-range");
2826 Qvoid_function = intern ("void-function");
2827 Qcyclic_function_indirection = intern ("cyclic-function-indirection");
2828 Qcyclic_variable_indirection = intern ("cyclic-variable-indirection");
2829 Qvoid_variable = intern ("void-variable");
2830 Qsetting_constant = intern ("setting-constant");
2831 Qinvalid_read_syntax = intern ("invalid-read-syntax");
2833 Qinvalid_function = intern ("invalid-function");
2834 Qwrong_number_of_arguments = intern ("wrong-number-of-arguments");
2835 Qno_catch = intern ("no-catch");
2836 Qend_of_file = intern ("end-of-file");
2837 Qarith_error = intern ("arith-error");
2838 Qbeginning_of_buffer = intern ("beginning-of-buffer");
2839 Qend_of_buffer = intern ("end-of-buffer");
2840 Qbuffer_read_only = intern ("buffer-read-only");
2841 Qtext_read_only = intern ("text-read-only");
2842 Qmark_inactive = intern ("mark-inactive");
2844 Qlistp = intern ("listp");
2845 Qconsp = intern ("consp");
2846 Qsymbolp = intern ("symbolp");
2847 Qkeywordp = intern ("keywordp");
2848 Qintegerp = intern ("integerp");
2849 Qnatnump = intern ("natnump");
2850 Qwholenump = intern ("wholenump");
2851 Qstringp = intern ("stringp");
2852 Qarrayp = intern ("arrayp");
2853 Qsequencep = intern ("sequencep");
2854 Qbufferp = intern ("bufferp");
2855 Qvectorp = intern ("vectorp");
2856 Qchar_or_string_p = intern ("char-or-string-p");
2857 Qmarkerp = intern ("markerp");
2858 Qbuffer_or_string_p = intern ("buffer-or-string-p");
2859 Qinteger_or_marker_p = intern ("integer-or-marker-p");
2860 Qboundp = intern ("boundp");
2861 Qfboundp = intern ("fboundp");
2863 Qfloatp = intern ("floatp");
2864 Qnumberp = intern ("numberp");
2865 Qnumber_or_marker_p = intern ("number-or-marker-p");
2867 Qchar_table_p = intern ("char-table-p");
2868 Qvector_or_char_table_p = intern ("vector-or-char-table-p");
2870 Qsubrp = intern ("subrp");
2871 Qunevalled = intern ("unevalled");
2872 Qmany = intern ("many");
2874 Qcdr = intern ("cdr");
2876 /* Handle automatic advice activation */
2877 Qad_advice_info = intern ("ad-advice-info");
2878 Qad_activate_internal = intern ("ad-activate-internal");
2880 error_tail = Fcons (Qerror, Qnil);
2882 /* ERROR is used as a signaler for random errors for which nothing else is right */
2884 Fput (Qerror, Qerror_conditions,
2885 error_tail);
2886 Fput (Qerror, Qerror_message,
2887 build_string ("error"));
2889 Fput (Qquit, Qerror_conditions,
2890 Fcons (Qquit, Qnil));
2891 Fput (Qquit, Qerror_message,
2892 build_string ("Quit"));
2894 Fput (Qwrong_type_argument, Qerror_conditions,
2895 Fcons (Qwrong_type_argument, error_tail));
2896 Fput (Qwrong_type_argument, Qerror_message,
2897 build_string ("Wrong type argument"));
2899 Fput (Qargs_out_of_range, Qerror_conditions,
2900 Fcons (Qargs_out_of_range, error_tail));
2901 Fput (Qargs_out_of_range, Qerror_message,
2902 build_string ("Args out of range"));
2904 Fput (Qvoid_function, Qerror_conditions,
2905 Fcons (Qvoid_function, error_tail));
2906 Fput (Qvoid_function, Qerror_message,
2907 build_string ("Symbol's function definition is void"));
2909 Fput (Qcyclic_function_indirection, Qerror_conditions,
2910 Fcons (Qcyclic_function_indirection, error_tail));
2911 Fput (Qcyclic_function_indirection, Qerror_message,
2912 build_string ("Symbol's chain of function indirections contains a loop"));
2914 Fput (Qcyclic_variable_indirection, Qerror_conditions,
2915 Fcons (Qcyclic_variable_indirection, error_tail));
2916 Fput (Qcyclic_variable_indirection, Qerror_message,
2917 build_string ("Symbol's chain of variable indirections contains a loop"));
2919 Qcircular_list = intern ("circular-list");
2920 staticpro (&Qcircular_list);
2921 Fput (Qcircular_list, Qerror_conditions,
2922 Fcons (Qcircular_list, error_tail));
2923 Fput (Qcircular_list, Qerror_message,
2924 build_string ("List contains a loop"));
2926 Fput (Qvoid_variable, Qerror_conditions,
2927 Fcons (Qvoid_variable, error_tail));
2928 Fput (Qvoid_variable, Qerror_message,
2929 build_string ("Symbol's value as variable is void"));
2931 Fput (Qsetting_constant, Qerror_conditions,
2932 Fcons (Qsetting_constant, error_tail));
2933 Fput (Qsetting_constant, Qerror_message,
2934 build_string ("Attempt to set a constant symbol"));
2936 Fput (Qinvalid_read_syntax, Qerror_conditions,
2937 Fcons (Qinvalid_read_syntax, error_tail));
2938 Fput (Qinvalid_read_syntax, Qerror_message,
2939 build_string ("Invalid read syntax"));
2941 Fput (Qinvalid_function, Qerror_conditions,
2942 Fcons (Qinvalid_function, error_tail));
2943 Fput (Qinvalid_function, Qerror_message,
2944 build_string ("Invalid function"));
2946 Fput (Qwrong_number_of_arguments, Qerror_conditions,
2947 Fcons (Qwrong_number_of_arguments, error_tail));
2948 Fput (Qwrong_number_of_arguments, Qerror_message,
2949 build_string ("Wrong number of arguments"));
2951 Fput (Qno_catch, Qerror_conditions,
2952 Fcons (Qno_catch, error_tail));
2953 Fput (Qno_catch, Qerror_message,
2954 build_string ("No catch for tag"));
2956 Fput (Qend_of_file, Qerror_conditions,
2957 Fcons (Qend_of_file, error_tail));
2958 Fput (Qend_of_file, Qerror_message,
2959 build_string ("End of file during parsing"));
2961 arith_tail = Fcons (Qarith_error, error_tail);
2962 Fput (Qarith_error, Qerror_conditions,
2963 arith_tail);
2964 Fput (Qarith_error, Qerror_message,
2965 build_string ("Arithmetic error"));
2967 Fput (Qbeginning_of_buffer, Qerror_conditions,
2968 Fcons (Qbeginning_of_buffer, error_tail));
2969 Fput (Qbeginning_of_buffer, Qerror_message,
2970 build_string ("Beginning of buffer"));
2972 Fput (Qend_of_buffer, Qerror_conditions,
2973 Fcons (Qend_of_buffer, error_tail));
2974 Fput (Qend_of_buffer, Qerror_message,
2975 build_string ("End of buffer"));
2977 Fput (Qbuffer_read_only, Qerror_conditions,
2978 Fcons (Qbuffer_read_only, error_tail));
2979 Fput (Qbuffer_read_only, Qerror_message,
2980 build_string ("Buffer is read-only"));
2982 Fput (Qtext_read_only, Qerror_conditions,
2983 Fcons (Qtext_read_only, error_tail));
2984 Fput (Qtext_read_only, Qerror_message,
2985 build_string ("Text is read-only"));
2987 Qrange_error = intern ("range-error");
2988 Qdomain_error = intern ("domain-error");
2989 Qsingularity_error = intern ("singularity-error");
2990 Qoverflow_error = intern ("overflow-error");
2991 Qunderflow_error = intern ("underflow-error");
2993 Fput (Qdomain_error, Qerror_conditions,
2994 Fcons (Qdomain_error, arith_tail));
2995 Fput (Qdomain_error, Qerror_message,
2996 build_string ("Arithmetic domain error"));
2998 Fput (Qrange_error, Qerror_conditions,
2999 Fcons (Qrange_error, arith_tail));
3000 Fput (Qrange_error, Qerror_message,
3001 build_string ("Arithmetic range error"));
3003 Fput (Qsingularity_error, Qerror_conditions,
3004 Fcons (Qsingularity_error, Fcons (Qdomain_error, arith_tail)));
3005 Fput (Qsingularity_error, Qerror_message,
3006 build_string ("Arithmetic singularity error"));
3008 Fput (Qoverflow_error, Qerror_conditions,
3009 Fcons (Qoverflow_error, Fcons (Qdomain_error, arith_tail)));
3010 Fput (Qoverflow_error, Qerror_message,
3011 build_string ("Arithmetic overflow error"));
3013 Fput (Qunderflow_error, Qerror_conditions,
3014 Fcons (Qunderflow_error, Fcons (Qdomain_error, arith_tail)));
3015 Fput (Qunderflow_error, Qerror_message,
3016 build_string ("Arithmetic underflow error"));
3018 staticpro (&Qrange_error);
3019 staticpro (&Qdomain_error);
3020 staticpro (&Qsingularity_error);
3021 staticpro (&Qoverflow_error);
3022 staticpro (&Qunderflow_error);
3024 staticpro (&Qnil);
3025 staticpro (&Qt);
3026 staticpro (&Qquote);
3027 staticpro (&Qlambda);
3028 staticpro (&Qsubr);
3029 staticpro (&Qunbound);
3030 staticpro (&Qerror_conditions);
3031 staticpro (&Qerror_message);
3032 staticpro (&Qtop_level);
3034 staticpro (&Qerror);
3035 staticpro (&Qquit);
3036 staticpro (&Qwrong_type_argument);
3037 staticpro (&Qargs_out_of_range);
3038 staticpro (&Qvoid_function);
3039 staticpro (&Qcyclic_function_indirection);
3040 staticpro (&Qvoid_variable);
3041 staticpro (&Qsetting_constant);
3042 staticpro (&Qinvalid_read_syntax);
3043 staticpro (&Qwrong_number_of_arguments);
3044 staticpro (&Qinvalid_function);
3045 staticpro (&Qno_catch);
3046 staticpro (&Qend_of_file);
3047 staticpro (&Qarith_error);
3048 staticpro (&Qbeginning_of_buffer);
3049 staticpro (&Qend_of_buffer);
3050 staticpro (&Qbuffer_read_only);
3051 staticpro (&Qtext_read_only);
3052 staticpro (&Qmark_inactive);
3054 staticpro (&Qlistp);
3055 staticpro (&Qconsp);
3056 staticpro (&Qsymbolp);
3057 staticpro (&Qkeywordp);
3058 staticpro (&Qintegerp);
3059 staticpro (&Qnatnump);
3060 staticpro (&Qwholenump);
3061 staticpro (&Qstringp);
3062 staticpro (&Qarrayp);
3063 staticpro (&Qsequencep);
3064 staticpro (&Qbufferp);
3065 staticpro (&Qvectorp);
3066 staticpro (&Qchar_or_string_p);
3067 staticpro (&Qmarkerp);
3068 staticpro (&Qbuffer_or_string_p);
3069 staticpro (&Qinteger_or_marker_p);
3070 staticpro (&Qfloatp);
3071 staticpro (&Qnumberp);
3072 staticpro (&Qnumber_or_marker_p);
3073 staticpro (&Qchar_table_p);
3074 staticpro (&Qvector_or_char_table_p);
3075 staticpro (&Qsubrp);
3076 staticpro (&Qmany);
3077 staticpro (&Qunevalled);
3079 staticpro (&Qboundp);
3080 staticpro (&Qfboundp);
3081 staticpro (&Qcdr);
3082 staticpro (&Qad_advice_info);
3083 staticpro (&Qad_activate_internal);
3085 /* Types that type-of returns. */
3086 Qinteger = intern ("integer");
3087 Qsymbol = intern ("symbol");
3088 Qstring = intern ("string");
3089 Qcons = intern ("cons");
3090 Qmarker = intern ("marker");
3091 Qoverlay = intern ("overlay");
3092 Qfloat = intern ("float");
3093 Qwindow_configuration = intern ("window-configuration");
3094 Qprocess = intern ("process");
3095 Qwindow = intern ("window");
3096 /* Qsubr = intern ("subr"); */
3097 Qcompiled_function = intern ("compiled-function");
3098 Qbuffer = intern ("buffer");
3099 Qframe = intern ("frame");
3100 Qvector = intern ("vector");
3101 Qchar_table = intern ("char-table");
3102 Qbool_vector = intern ("bool-vector");
3103 Qhash_table = intern ("hash-table");
3105 staticpro (&Qinteger);
3106 staticpro (&Qsymbol);
3107 staticpro (&Qstring);
3108 staticpro (&Qcons);
3109 staticpro (&Qmarker);
3110 staticpro (&Qoverlay);
3111 staticpro (&Qfloat);
3112 staticpro (&Qwindow_configuration);
3113 staticpro (&Qprocess);
3114 staticpro (&Qwindow);
3115 /* staticpro (&Qsubr); */
3116 staticpro (&Qcompiled_function);
3117 staticpro (&Qbuffer);
3118 staticpro (&Qframe);
3119 staticpro (&Qvector);
3120 staticpro (&Qchar_table);
3121 staticpro (&Qbool_vector);
3122 staticpro (&Qhash_table);
3124 defsubr (&Sindirect_variable);
3125 defsubr (&Ssubr_interactive_form);
3126 defsubr (&Seq);
3127 defsubr (&Snull);
3128 defsubr (&Stype_of);
3129 defsubr (&Slistp);
3130 defsubr (&Snlistp);
3131 defsubr (&Sconsp);
3132 defsubr (&Satom);
3133 defsubr (&Sintegerp);
3134 defsubr (&Sinteger_or_marker_p);
3135 defsubr (&Snumberp);
3136 defsubr (&Snumber_or_marker_p);
3137 defsubr (&Sfloatp);
3138 defsubr (&Snatnump);
3139 defsubr (&Ssymbolp);
3140 defsubr (&Skeywordp);
3141 defsubr (&Sstringp);
3142 defsubr (&Smultibyte_string_p);
3143 defsubr (&Svectorp);
3144 defsubr (&Schar_table_p);
3145 defsubr (&Svector_or_char_table_p);
3146 defsubr (&Sbool_vector_p);
3147 defsubr (&Sarrayp);
3148 defsubr (&Ssequencep);
3149 defsubr (&Sbufferp);
3150 defsubr (&Smarkerp);
3151 defsubr (&Ssubrp);
3152 defsubr (&Sbyte_code_function_p);
3153 defsubr (&Schar_or_string_p);
3154 defsubr (&Scar);
3155 defsubr (&Scdr);
3156 defsubr (&Scar_safe);
3157 defsubr (&Scdr_safe);
3158 defsubr (&Ssetcar);
3159 defsubr (&Ssetcdr);
3160 defsubr (&Ssymbol_function);
3161 defsubr (&Sindirect_function);
3162 defsubr (&Ssymbol_plist);
3163 defsubr (&Ssymbol_name);
3164 defsubr (&Smakunbound);
3165 defsubr (&Sfmakunbound);
3166 defsubr (&Sboundp);
3167 defsubr (&Sfboundp);
3168 defsubr (&Sfset);
3169 defsubr (&Sdefalias);
3170 defsubr (&Ssetplist);
3171 defsubr (&Ssymbol_value);
3172 defsubr (&Sset);
3173 defsubr (&Sdefault_boundp);
3174 defsubr (&Sdefault_value);
3175 defsubr (&Sset_default);
3176 defsubr (&Ssetq_default);
3177 defsubr (&Smake_variable_buffer_local);
3178 defsubr (&Smake_local_variable);
3179 defsubr (&Skill_local_variable);
3180 defsubr (&Smake_variable_frame_local);
3181 defsubr (&Slocal_variable_p);
3182 defsubr (&Slocal_variable_if_set_p);
3183 defsubr (&Saref);
3184 defsubr (&Saset);
3185 defsubr (&Snumber_to_string);
3186 defsubr (&Sstring_to_number);
3187 defsubr (&Seqlsign);
3188 defsubr (&Slss);
3189 defsubr (&Sgtr);
3190 defsubr (&Sleq);
3191 defsubr (&Sgeq);
3192 defsubr (&Sneq);
3193 defsubr (&Szerop);
3194 defsubr (&Splus);
3195 defsubr (&Sminus);
3196 defsubr (&Stimes);
3197 defsubr (&Squo);
3198 defsubr (&Srem);
3199 defsubr (&Smod);
3200 defsubr (&Smax);
3201 defsubr (&Smin);
3202 defsubr (&Slogand);
3203 defsubr (&Slogior);
3204 defsubr (&Slogxor);
3205 defsubr (&Slsh);
3206 defsubr (&Sash);
3207 defsubr (&Sadd1);
3208 defsubr (&Ssub1);
3209 defsubr (&Slognot);
3210 defsubr (&Ssubr_arity);
3212 XSYMBOL (Qwholenump)->function = XSYMBOL (Qnatnump)->function;
3214 DEFVAR_LISP ("most-positive-fixnum", &Vmost_positive_fixnum,
3215 doc: /* The largest value that is representable in a Lisp integer. */);
3216 Vmost_positive_fixnum = make_number (MOST_POSITIVE_FIXNUM);
3218 DEFVAR_LISP ("most-negative-fixnum", &Vmost_negative_fixnum,
3219 doc: /* The smallest value that is representable in a Lisp integer. */);
3220 Vmost_negative_fixnum = make_number (MOST_NEGATIVE_FIXNUM);
3223 SIGTYPE
3224 arith_error (signo)
3225 int signo;
3227 #if defined(USG) && !defined(POSIX_SIGNALS)
3228 /* USG systems forget handlers when they are used;
3229 must reestablish each time */
3230 signal (signo, arith_error);
3231 #endif /* USG */
3232 #ifdef VMS
3233 /* VMS systems are like USG. */
3234 signal (signo, arith_error);
3235 #endif /* VMS */
3236 #ifdef BSD4_1
3237 sigrelse (SIGFPE);
3238 #else /* not BSD4_1 */
3239 sigsetmask (SIGEMPTYMASK);
3240 #endif /* not BSD4_1 */
3242 Fsignal (Qarith_error, Qnil);
3245 void
3246 init_data ()
3248 /* Don't do this if just dumping out.
3249 We don't want to call `signal' in this case
3250 so that we don't have trouble with dumping
3251 signal-delivering routines in an inconsistent state. */
3252 #ifndef CANNOT_DUMP
3253 if (!initialized)
3254 return;
3255 #endif /* CANNOT_DUMP */
3256 signal (SIGFPE, arith_error);
3258 #ifdef uts
3259 signal (SIGEMT, arith_error);
3260 #endif /* uts */