Merge from emacs--devo--0
[bpt/emacs.git] / src / data.c
1 /* Primitive operations on Lisp data types for GNU Emacs Lisp interpreter.
2 Copyright (C) 1985, 1986, 1988, 1993, 1994, 1995, 1997, 1998, 1999, 2000,
3 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
4
5 This file is part of GNU Emacs.
6
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 3, or (at your option)
10 any later version.
11
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.
16
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., 51 Franklin Street, Fifth Floor,
20 Boston, MA 02110-1301, USA. */
21
22
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"
33 #include "termhooks.h" /* For FRAME_KBOARD reference in y-or-n-p. */
34
35 #ifdef STDC_HEADERS
36 #include <float.h>
37 #endif
38
39 /* If IEEE_FLOATING_POINT isn't defined, default it from FLT_*. */
40 #ifndef IEEE_FLOATING_POINT
41 #if (FLT_RADIX == 2 && FLT_MANT_DIG == 24 \
42 && FLT_MIN_EXP == -125 && FLT_MAX_EXP == 128)
43 #define IEEE_FLOATING_POINT 1
44 #else
45 #define IEEE_FLOATING_POINT 0
46 #endif
47 #endif
48
49 /* Work around a problem that happens because math.h on hpux 7
50 defines two static variables--which, in Emacs, are not really static,
51 because `static' is defined as nothing. The problem is that they are
52 here, in floatfns.c, and in lread.c.
53 These macros prevent the name conflict. */
54 #if defined (HPUX) && !defined (HPUX8)
55 #define _MAXLDBL data_c_maxldbl
56 #define _NMAXLDBL data_c_nmaxldbl
57 #endif
58
59 #include <math.h>
60
61 #if !defined (atof)
62 extern double atof ();
63 #endif /* !atof */
64
65 Lisp_Object Qnil, Qt, Qquote, Qlambda, Qsubr, Qunbound;
66 Lisp_Object Qerror_conditions, Qerror_message, Qtop_level;
67 Lisp_Object Qerror, Qquit, Qwrong_type_argument, Qargs_out_of_range;
68 Lisp_Object Qvoid_variable, Qvoid_function, Qcyclic_function_indirection;
69 Lisp_Object Qcyclic_variable_indirection, Qcircular_list;
70 Lisp_Object Qsetting_constant, Qinvalid_read_syntax;
71 Lisp_Object Qinvalid_function, Qwrong_number_of_arguments, Qno_catch;
72 Lisp_Object Qend_of_file, Qarith_error, Qmark_inactive;
73 Lisp_Object Qbeginning_of_buffer, Qend_of_buffer, Qbuffer_read_only;
74 Lisp_Object Qtext_read_only;
75
76 Lisp_Object Qintegerp, Qnatnump, Qwholenump, Qsymbolp, Qlistp, Qconsp;
77 Lisp_Object Qstringp, Qarrayp, Qsequencep, Qbufferp;
78 Lisp_Object Qchar_or_string_p, Qmarkerp, Qinteger_or_marker_p, Qvectorp;
79 Lisp_Object Qbuffer_or_string_p, Qkeywordp;
80 Lisp_Object Qboundp, Qfboundp;
81 Lisp_Object Qchar_table_p, Qvector_or_char_table_p;
82
83 Lisp_Object Qcdr;
84 Lisp_Object Qad_advice_info, Qad_activate_internal;
85
86 Lisp_Object Qrange_error, Qdomain_error, Qsingularity_error;
87 Lisp_Object Qoverflow_error, Qunderflow_error;
88
89 Lisp_Object Qfloatp;
90 Lisp_Object Qnumberp, Qnumber_or_marker_p;
91
92 Lisp_Object Qinteger;
93 static Lisp_Object Qsymbol, Qstring, Qcons, Qmarker, Qoverlay;
94 static Lisp_Object Qfloat, Qwindow_configuration, Qwindow;
95 Lisp_Object Qprocess;
96 static Lisp_Object Qcompiled_function, Qbuffer, Qframe, Qvector;
97 static Lisp_Object Qchar_table, Qbool_vector, Qhash_table;
98 static Lisp_Object Qsubrp, Qmany, Qunevalled;
99
100 static Lisp_Object swap_in_symval_forwarding P_ ((Lisp_Object, Lisp_Object));
101
102 Lisp_Object Vmost_positive_fixnum, Vmost_negative_fixnum;
103
104
105 void
106 circular_list_error (list)
107 Lisp_Object list;
108 {
109 xsignal (Qcircular_list, list);
110 }
111
112
113 Lisp_Object
114 wrong_type_argument (predicate, value)
115 register Lisp_Object predicate, value;
116 {
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 ();
121
122 xsignal2 (Qwrong_type_argument, predicate, value);
123 }
124
125 void
126 pure_write_error ()
127 {
128 error ("Attempt to modify read-only object");
129 }
130
131 void
132 args_out_of_range (a1, a2)
133 Lisp_Object a1, a2;
134 {
135 xsignal2 (Qargs_out_of_range, a1, a2);
136 }
137
138 void
139 args_out_of_range_3 (a1, a2, a3)
140 Lisp_Object a1, a2, a3;
141 {
142 xsignal3 (Qargs_out_of_range, a1, a2, a3);
143 }
144
145 /* On some machines, XINT needs a temporary location.
146 Here it is, in case it is needed. */
147
148 int sign_extend_temp;
149
150 /* On a few machines, XINT can only be done by calling this. */
151
152 int
153 sign_extend_lisp_int (num)
154 EMACS_INT num;
155 {
156 if (num & (((EMACS_INT) 1) << (VALBITS - 1)))
157 return num | (((EMACS_INT) (-1)) << VALBITS);
158 else
159 return num & ((((EMACS_INT) 1) << VALBITS) - 1);
160 }
161 \f
162 /* Data type predicates */
163
164 DEFUN ("eq", Feq, Seq, 2, 2, 0,
165 doc: /* Return t if the two args are the same Lisp object. */)
166 (obj1, obj2)
167 Lisp_Object obj1, obj2;
168 {
169 if (EQ (obj1, obj2))
170 return Qt;
171 return Qnil;
172 }
173
174 DEFUN ("null", Fnull, Snull, 1, 1, 0,
175 doc: /* Return t if OBJECT is nil. */)
176 (object)
177 Lisp_Object object;
178 {
179 if (NILP (object))
180 return Qt;
181 return Qnil;
182 }
183
184 DEFUN ("type-of", Ftype_of, Stype_of, 1, 1, 0,
185 doc: /* Return a symbol representing the type of OBJECT.
186 The symbol returned names the object's basic type;
187 for example, (type-of 1) returns `integer'. */)
188 (object)
189 Lisp_Object object;
190 {
191 switch (XGCTYPE (object))
192 {
193 case Lisp_Int:
194 return Qinteger;
195
196 case Lisp_Symbol:
197 return Qsymbol;
198
199 case Lisp_String:
200 return Qstring;
201
202 case Lisp_Cons:
203 return Qcons;
204
205 case Lisp_Misc:
206 switch (XMISCTYPE (object))
207 {
208 case Lisp_Misc_Marker:
209 return Qmarker;
210 case Lisp_Misc_Overlay:
211 return Qoverlay;
212 case Lisp_Misc_Float:
213 return Qfloat;
214 }
215 abort ();
216
217 case Lisp_Vectorlike:
218 if (GC_WINDOW_CONFIGURATIONP (object))
219 return Qwindow_configuration;
220 if (GC_PROCESSP (object))
221 return Qprocess;
222 if (GC_WINDOWP (object))
223 return Qwindow;
224 if (GC_SUBRP (object))
225 return Qsubr;
226 if (GC_COMPILEDP (object))
227 return Qcompiled_function;
228 if (GC_BUFFERP (object))
229 return Qbuffer;
230 if (GC_CHAR_TABLE_P (object))
231 return Qchar_table;
232 if (GC_BOOL_VECTOR_P (object))
233 return Qbool_vector;
234 if (GC_FRAMEP (object))
235 return Qframe;
236 if (GC_HASH_TABLE_P (object))
237 return Qhash_table;
238 return Qvector;
239
240 case Lisp_Float:
241 return Qfloat;
242
243 default:
244 abort ();
245 }
246 }
247
248 DEFUN ("consp", Fconsp, Sconsp, 1, 1, 0,
249 doc: /* Return t if OBJECT is a cons cell. */)
250 (object)
251 Lisp_Object object;
252 {
253 if (CONSP (object))
254 return Qt;
255 return Qnil;
256 }
257
258 DEFUN ("atom", Fatom, Satom, 1, 1, 0,
259 doc: /* Return t if OBJECT is not a cons cell. This includes nil. */)
260 (object)
261 Lisp_Object object;
262 {
263 if (CONSP (object))
264 return Qnil;
265 return Qt;
266 }
267
268 DEFUN ("listp", Flistp, Slistp, 1, 1, 0,
269 doc: /* Return t if OBJECT is a list, that is, a cons cell or nil.
270 Otherwise, return nil. */)
271 (object)
272 Lisp_Object object;
273 {
274 if (CONSP (object) || NILP (object))
275 return Qt;
276 return Qnil;
277 }
278
279 DEFUN ("nlistp", Fnlistp, Snlistp, 1, 1, 0,
280 doc: /* Return t if OBJECT is not a list. Lists include nil. */)
281 (object)
282 Lisp_Object object;
283 {
284 if (CONSP (object) || NILP (object))
285 return Qnil;
286 return Qt;
287 }
288 \f
289 DEFUN ("symbolp", Fsymbolp, Ssymbolp, 1, 1, 0,
290 doc: /* Return t if OBJECT is a symbol. */)
291 (object)
292 Lisp_Object object;
293 {
294 if (SYMBOLP (object))
295 return Qt;
296 return Qnil;
297 }
298
299 /* Define this in C to avoid unnecessarily consing up the symbol
300 name. */
301 DEFUN ("keywordp", Fkeywordp, Skeywordp, 1, 1, 0,
302 doc: /* Return t if OBJECT is a keyword.
303 This means that it is a symbol with a print name beginning with `:'
304 interned in the initial obarray. */)
305 (object)
306 Lisp_Object object;
307 {
308 if (SYMBOLP (object)
309 && SREF (SYMBOL_NAME (object), 0) == ':'
310 && SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P (object))
311 return Qt;
312 return Qnil;
313 }
314
315 DEFUN ("vectorp", Fvectorp, Svectorp, 1, 1, 0,
316 doc: /* Return t if OBJECT is a vector. */)
317 (object)
318 Lisp_Object object;
319 {
320 if (VECTORP (object))
321 return Qt;
322 return Qnil;
323 }
324
325 DEFUN ("stringp", Fstringp, Sstringp, 1, 1, 0,
326 doc: /* Return t if OBJECT is a string. */)
327 (object)
328 Lisp_Object object;
329 {
330 if (STRINGP (object))
331 return Qt;
332 return Qnil;
333 }
334
335 DEFUN ("multibyte-string-p", Fmultibyte_string_p, Smultibyte_string_p,
336 1, 1, 0,
337 doc: /* Return t if OBJECT is a multibyte string. */)
338 (object)
339 Lisp_Object object;
340 {
341 if (STRINGP (object) && STRING_MULTIBYTE (object))
342 return Qt;
343 return Qnil;
344 }
345
346 DEFUN ("char-table-p", Fchar_table_p, Schar_table_p, 1, 1, 0,
347 doc: /* Return t if OBJECT is a char-table. */)
348 (object)
349 Lisp_Object object;
350 {
351 if (CHAR_TABLE_P (object))
352 return Qt;
353 return Qnil;
354 }
355
356 DEFUN ("vector-or-char-table-p", Fvector_or_char_table_p,
357 Svector_or_char_table_p, 1, 1, 0,
358 doc: /* Return t if OBJECT is a char-table or vector. */)
359 (object)
360 Lisp_Object object;
361 {
362 if (VECTORP (object) || CHAR_TABLE_P (object))
363 return Qt;
364 return Qnil;
365 }
366
367 DEFUN ("bool-vector-p", Fbool_vector_p, Sbool_vector_p, 1, 1, 0,
368 doc: /* Return t if OBJECT is a bool-vector. */)
369 (object)
370 Lisp_Object object;
371 {
372 if (BOOL_VECTOR_P (object))
373 return Qt;
374 return Qnil;
375 }
376
377 DEFUN ("arrayp", Farrayp, Sarrayp, 1, 1, 0,
378 doc: /* Return t if OBJECT is an array (string or vector). */)
379 (object)
380 Lisp_Object object;
381 {
382 if (ARRAYP (object))
383 return Qt;
384 return Qnil;
385 }
386
387 DEFUN ("sequencep", Fsequencep, Ssequencep, 1, 1, 0,
388 doc: /* Return t if OBJECT is a sequence (list or array). */)
389 (object)
390 register Lisp_Object object;
391 {
392 if (CONSP (object) || NILP (object) || ARRAYP (object))
393 return Qt;
394 return Qnil;
395 }
396
397 DEFUN ("bufferp", Fbufferp, Sbufferp, 1, 1, 0,
398 doc: /* Return t if OBJECT is an editor buffer. */)
399 (object)
400 Lisp_Object object;
401 {
402 if (BUFFERP (object))
403 return Qt;
404 return Qnil;
405 }
406
407 DEFUN ("markerp", Fmarkerp, Smarkerp, 1, 1, 0,
408 doc: /* Return t if OBJECT is a marker (editor pointer). */)
409 (object)
410 Lisp_Object object;
411 {
412 if (MARKERP (object))
413 return Qt;
414 return Qnil;
415 }
416
417 DEFUN ("subrp", Fsubrp, Ssubrp, 1, 1, 0,
418 doc: /* Return t if OBJECT is a built-in function. */)
419 (object)
420 Lisp_Object object;
421 {
422 if (SUBRP (object))
423 return Qt;
424 return Qnil;
425 }
426
427 DEFUN ("byte-code-function-p", Fbyte_code_function_p, Sbyte_code_function_p,
428 1, 1, 0,
429 doc: /* Return t if OBJECT is a byte-compiled function object. */)
430 (object)
431 Lisp_Object object;
432 {
433 if (COMPILEDP (object))
434 return Qt;
435 return Qnil;
436 }
437
438 DEFUN ("char-or-string-p", Fchar_or_string_p, Schar_or_string_p, 1, 1, 0,
439 doc: /* Return t if OBJECT is a character (an integer) or a string. */)
440 (object)
441 register Lisp_Object object;
442 {
443 if (INTEGERP (object) || STRINGP (object))
444 return Qt;
445 return Qnil;
446 }
447 \f
448 DEFUN ("integerp", Fintegerp, Sintegerp, 1, 1, 0,
449 doc: /* Return t if OBJECT is an integer. */)
450 (object)
451 Lisp_Object object;
452 {
453 if (INTEGERP (object))
454 return Qt;
455 return Qnil;
456 }
457
458 DEFUN ("integer-or-marker-p", Finteger_or_marker_p, Sinteger_or_marker_p, 1, 1, 0,
459 doc: /* Return t if OBJECT is an integer or a marker (editor pointer). */)
460 (object)
461 register Lisp_Object object;
462 {
463 if (MARKERP (object) || INTEGERP (object))
464 return Qt;
465 return Qnil;
466 }
467
468 DEFUN ("natnump", Fnatnump, Snatnump, 1, 1, 0,
469 doc: /* Return t if OBJECT is a nonnegative integer. */)
470 (object)
471 Lisp_Object object;
472 {
473 if (NATNUMP (object))
474 return Qt;
475 return Qnil;
476 }
477
478 DEFUN ("numberp", Fnumberp, Snumberp, 1, 1, 0,
479 doc: /* Return t if OBJECT is a number (floating point or integer). */)
480 (object)
481 Lisp_Object object;
482 {
483 if (NUMBERP (object))
484 return Qt;
485 else
486 return Qnil;
487 }
488
489 DEFUN ("number-or-marker-p", Fnumber_or_marker_p,
490 Snumber_or_marker_p, 1, 1, 0,
491 doc: /* Return t if OBJECT is a number or a marker. */)
492 (object)
493 Lisp_Object object;
494 {
495 if (NUMBERP (object) || MARKERP (object))
496 return Qt;
497 return Qnil;
498 }
499
500 DEFUN ("floatp", Ffloatp, Sfloatp, 1, 1, 0,
501 doc: /* Return t if OBJECT is a floating point number. */)
502 (object)
503 Lisp_Object object;
504 {
505 if (FLOATP (object))
506 return Qt;
507 return Qnil;
508 }
509
510 \f
511 /* Extract and set components of lists */
512
513 DEFUN ("car", Fcar, Scar, 1, 1, 0,
514 doc: /* Return the car of LIST. If arg is nil, return nil.
515 Error if arg is not nil and not a cons cell. See also `car-safe'.
516
517 See Info node `(elisp)Cons Cells' for a discussion of related basic
518 Lisp concepts such as car, cdr, cons cell and list. */)
519 (list)
520 register Lisp_Object list;
521 {
522 return CAR (list);
523 }
524
525 DEFUN ("car-safe", Fcar_safe, Scar_safe, 1, 1, 0,
526 doc: /* Return the car of OBJECT if it is a cons cell, or else nil. */)
527 (object)
528 Lisp_Object object;
529 {
530 return CAR_SAFE (object);
531 }
532
533 DEFUN ("cdr", Fcdr, Scdr, 1, 1, 0,
534 doc: /* Return the cdr of LIST. If arg is nil, return nil.
535 Error if arg is not nil and not a cons cell. See also `cdr-safe'.
536
537 See Info node `(elisp)Cons Cells' for a discussion of related basic
538 Lisp concepts such as cdr, car, cons cell and list. */)
539 (list)
540 register Lisp_Object list;
541 {
542 return CDR (list);
543 }
544
545 DEFUN ("cdr-safe", Fcdr_safe, Scdr_safe, 1, 1, 0,
546 doc: /* Return the cdr of OBJECT if it is a cons cell, or else nil. */)
547 (object)
548 Lisp_Object object;
549 {
550 return CDR_SAFE (object);
551 }
552
553 DEFUN ("setcar", Fsetcar, Ssetcar, 2, 2, 0,
554 doc: /* Set the car of CELL to be NEWCAR. Returns NEWCAR. */)
555 (cell, newcar)
556 register Lisp_Object cell, newcar;
557 {
558 CHECK_CONS (cell);
559 CHECK_IMPURE (cell);
560 XSETCAR (cell, newcar);
561 return newcar;
562 }
563
564 DEFUN ("setcdr", Fsetcdr, Ssetcdr, 2, 2, 0,
565 doc: /* Set the cdr of CELL to be NEWCDR. Returns NEWCDR. */)
566 (cell, newcdr)
567 register Lisp_Object cell, newcdr;
568 {
569 CHECK_CONS (cell);
570 CHECK_IMPURE (cell);
571 XSETCDR (cell, newcdr);
572 return newcdr;
573 }
574 \f
575 /* Extract and set components of symbols */
576
577 DEFUN ("boundp", Fboundp, Sboundp, 1, 1, 0,
578 doc: /* Return t if SYMBOL's value is not void. */)
579 (symbol)
580 register Lisp_Object symbol;
581 {
582 Lisp_Object valcontents;
583 CHECK_SYMBOL (symbol);
584
585 valcontents = SYMBOL_VALUE (symbol);
586
587 if (BUFFER_LOCAL_VALUEP (valcontents)
588 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
589 valcontents = swap_in_symval_forwarding (symbol, valcontents);
590
591 return (EQ (valcontents, Qunbound) ? Qnil : Qt);
592 }
593
594 DEFUN ("fboundp", Ffboundp, Sfboundp, 1, 1, 0,
595 doc: /* Return t if SYMBOL's function definition is not void. */)
596 (symbol)
597 register Lisp_Object symbol;
598 {
599 CHECK_SYMBOL (symbol);
600 return (EQ (XSYMBOL (symbol)->function, Qunbound) ? Qnil : Qt);
601 }
602
603 DEFUN ("makunbound", Fmakunbound, Smakunbound, 1, 1, 0,
604 doc: /* Make SYMBOL's value be void.
605 Return SYMBOL. */)
606 (symbol)
607 register Lisp_Object symbol;
608 {
609 CHECK_SYMBOL (symbol);
610 if (SYMBOL_CONSTANT_P (symbol))
611 xsignal1 (Qsetting_constant, symbol);
612 Fset (symbol, Qunbound);
613 return symbol;
614 }
615
616 DEFUN ("fmakunbound", Ffmakunbound, Sfmakunbound, 1, 1, 0,
617 doc: /* Make SYMBOL's function definition be void.
618 Return SYMBOL. */)
619 (symbol)
620 register Lisp_Object symbol;
621 {
622 CHECK_SYMBOL (symbol);
623 if (NILP (symbol) || EQ (symbol, Qt))
624 xsignal1 (Qsetting_constant, symbol);
625 XSYMBOL (symbol)->function = Qunbound;
626 return symbol;
627 }
628
629 DEFUN ("symbol-function", Fsymbol_function, Ssymbol_function, 1, 1, 0,
630 doc: /* Return SYMBOL's function definition. Error if that is void. */)
631 (symbol)
632 register Lisp_Object symbol;
633 {
634 CHECK_SYMBOL (symbol);
635 if (!EQ (XSYMBOL (symbol)->function, Qunbound))
636 return XSYMBOL (symbol)->function;
637 xsignal1 (Qvoid_function, symbol);
638 }
639
640 DEFUN ("symbol-plist", Fsymbol_plist, Ssymbol_plist, 1, 1, 0,
641 doc: /* Return SYMBOL's property list. */)
642 (symbol)
643 register Lisp_Object symbol;
644 {
645 CHECK_SYMBOL (symbol);
646 return XSYMBOL (symbol)->plist;
647 }
648
649 DEFUN ("symbol-name", Fsymbol_name, Ssymbol_name, 1, 1, 0,
650 doc: /* Return SYMBOL's name, a string. */)
651 (symbol)
652 register Lisp_Object symbol;
653 {
654 register Lisp_Object name;
655
656 CHECK_SYMBOL (symbol);
657 name = SYMBOL_NAME (symbol);
658 return name;
659 }
660
661 DEFUN ("fset", Ffset, Sfset, 2, 2, 0,
662 doc: /* Set SYMBOL's function definition to DEFINITION, and return DEFINITION. */)
663 (symbol, definition)
664 register Lisp_Object symbol, definition;
665 {
666 CHECK_SYMBOL (symbol);
667 if (NILP (symbol) || EQ (symbol, Qt))
668 xsignal1 (Qsetting_constant, symbol);
669 if (!NILP (Vautoload_queue) && !EQ (XSYMBOL (symbol)->function, Qunbound))
670 Vautoload_queue = Fcons (Fcons (symbol, XSYMBOL (symbol)->function),
671 Vautoload_queue);
672 XSYMBOL (symbol)->function = definition;
673 /* Handle automatic advice activation */
674 if (CONSP (XSYMBOL (symbol)->plist) && !NILP (Fget (symbol, Qad_advice_info)))
675 {
676 call2 (Qad_activate_internal, symbol, Qnil);
677 definition = XSYMBOL (symbol)->function;
678 }
679 return definition;
680 }
681
682 extern Lisp_Object Qfunction_documentation;
683
684 DEFUN ("defalias", Fdefalias, Sdefalias, 2, 3, 0,
685 doc: /* Set SYMBOL's function definition to DEFINITION, and return DEFINITION.
686 Associates the function with the current load file, if any.
687 The optional third argument DOCSTRING specifies the documentation string
688 for SYMBOL; if it is omitted or nil, SYMBOL uses the documentation string
689 determined by DEFINITION. */)
690 (symbol, definition, docstring)
691 register Lisp_Object symbol, definition, docstring;
692 {
693 CHECK_SYMBOL (symbol);
694 if (CONSP (XSYMBOL (symbol)->function)
695 && EQ (XCAR (XSYMBOL (symbol)->function), Qautoload))
696 LOADHIST_ATTACH (Fcons (Qt, symbol));
697 definition = Ffset (symbol, definition);
698 LOADHIST_ATTACH (Fcons (Qdefun, symbol));
699 if (!NILP (docstring))
700 Fput (symbol, Qfunction_documentation, docstring);
701 return definition;
702 }
703
704 DEFUN ("setplist", Fsetplist, Ssetplist, 2, 2, 0,
705 doc: /* Set SYMBOL's property list to NEWPLIST, and return NEWPLIST. */)
706 (symbol, newplist)
707 register Lisp_Object symbol, newplist;
708 {
709 CHECK_SYMBOL (symbol);
710 XSYMBOL (symbol)->plist = newplist;
711 return newplist;
712 }
713
714 DEFUN ("subr-arity", Fsubr_arity, Ssubr_arity, 1, 1, 0,
715 doc: /* Return minimum and maximum number of args allowed for SUBR.
716 SUBR must be a built-in function.
717 The returned value is a pair (MIN . MAX). MIN is the minimum number
718 of args. MAX is the maximum number or the symbol `many', for a
719 function with `&rest' args, or `unevalled' for a special form. */)
720 (subr)
721 Lisp_Object subr;
722 {
723 short minargs, maxargs;
724 CHECK_SUBR (subr);
725 minargs = XSUBR (subr)->min_args;
726 maxargs = XSUBR (subr)->max_args;
727 if (maxargs == MANY)
728 return Fcons (make_number (minargs), Qmany);
729 else if (maxargs == UNEVALLED)
730 return Fcons (make_number (minargs), Qunevalled);
731 else
732 return Fcons (make_number (minargs), make_number (maxargs));
733 }
734
735 DEFUN ("subr-name", Fsubr_name, Ssubr_name, 1, 1, 0,
736 doc: /* Return name of subroutine SUBR.
737 SUBR must be a built-in function. */)
738 (subr)
739 Lisp_Object subr;
740 {
741 const char *name;
742 CHECK_SUBR (subr);
743 name = XSUBR (subr)->symbol_name;
744 return make_string (name, strlen (name));
745 }
746
747 DEFUN ("interactive-form", Finteractive_form, Sinteractive_form, 1, 1, 0,
748 doc: /* Return the interactive form of CMD or nil if none.
749 If CMD is not a command, the return value is nil.
750 Value, if non-nil, is a list \(interactive SPEC). */)
751 (cmd)
752 Lisp_Object cmd;
753 {
754 Lisp_Object fun = indirect_function (cmd); /* Check cycles. */
755
756 if (NILP (fun) || EQ (fun, Qunbound))
757 return Qnil;
758
759 /* Use an `interactive-form' property if present, analogous to the
760 function-documentation property. */
761 fun = cmd;
762 while (SYMBOLP (fun))
763 {
764 Lisp_Object tmp = Fget (fun, intern ("interactive-form"));
765 if (!NILP (tmp))
766 return tmp;
767 else
768 fun = Fsymbol_function (fun);
769 }
770
771 if (SUBRP (fun))
772 {
773 if (XSUBR (fun)->prompt)
774 return list2 (Qinteractive, build_string (XSUBR (fun)->prompt));
775 }
776 else if (COMPILEDP (fun))
777 {
778 if ((ASIZE (fun) & PSEUDOVECTOR_SIZE_MASK) > COMPILED_INTERACTIVE)
779 return list2 (Qinteractive, AREF (fun, COMPILED_INTERACTIVE));
780 }
781 else if (CONSP (fun))
782 {
783 Lisp_Object funcar = XCAR (fun);
784 if (EQ (funcar, Qlambda))
785 return Fassq (Qinteractive, Fcdr (XCDR (fun)));
786 else if (EQ (funcar, Qautoload))
787 {
788 struct gcpro gcpro1;
789 GCPRO1 (cmd);
790 do_autoload (fun, cmd);
791 UNGCPRO;
792 return Finteractive_form (cmd);
793 }
794 }
795 return Qnil;
796 }
797
798 \f
799 /***********************************************************************
800 Getting and Setting Values of Symbols
801 ***********************************************************************/
802
803 /* Return the symbol holding SYMBOL's value. Signal
804 `cyclic-variable-indirection' if SYMBOL's chain of variable
805 indirections contains a loop. */
806
807 Lisp_Object
808 indirect_variable (symbol)
809 Lisp_Object symbol;
810 {
811 Lisp_Object tortoise, hare;
812
813 hare = tortoise = symbol;
814
815 while (XSYMBOL (hare)->indirect_variable)
816 {
817 hare = XSYMBOL (hare)->value;
818 if (!XSYMBOL (hare)->indirect_variable)
819 break;
820
821 hare = XSYMBOL (hare)->value;
822 tortoise = XSYMBOL (tortoise)->value;
823
824 if (EQ (hare, tortoise))
825 xsignal1 (Qcyclic_variable_indirection, symbol);
826 }
827
828 return hare;
829 }
830
831
832 DEFUN ("indirect-variable", Findirect_variable, Sindirect_variable, 1, 1, 0,
833 doc: /* Return the variable at the end of OBJECT's variable chain.
834 If OBJECT is a symbol, follow all variable indirections and return the final
835 variable. If OBJECT is not a symbol, just return it.
836 Signal a cyclic-variable-indirection error if there is a loop in the
837 variable chain of symbols. */)
838 (object)
839 Lisp_Object object;
840 {
841 if (SYMBOLP (object))
842 object = indirect_variable (object);
843 return object;
844 }
845
846
847 /* Given the raw contents of a symbol value cell,
848 return the Lisp value of the symbol.
849 This does not handle buffer-local variables; use
850 swap_in_symval_forwarding for that. */
851
852 Lisp_Object
853 do_symval_forwarding (valcontents)
854 register Lisp_Object valcontents;
855 {
856 register Lisp_Object val;
857 int offset;
858 if (MISCP (valcontents))
859 switch (XMISCTYPE (valcontents))
860 {
861 case Lisp_Misc_Intfwd:
862 XSETINT (val, *XINTFWD (valcontents)->intvar);
863 return val;
864
865 case Lisp_Misc_Boolfwd:
866 return (*XBOOLFWD (valcontents)->boolvar ? Qt : Qnil);
867
868 case Lisp_Misc_Objfwd:
869 return *XOBJFWD (valcontents)->objvar;
870
871 case Lisp_Misc_Buffer_Objfwd:
872 offset = XBUFFER_OBJFWD (valcontents)->offset;
873 return PER_BUFFER_VALUE (current_buffer, offset);
874
875 case Lisp_Misc_Kboard_Objfwd:
876 offset = XKBOARD_OBJFWD (valcontents)->offset;
877 /* We used to simply use current_kboard here, but from Lisp
878 code, it's value is often unexpected. It seems nicer to
879 allow constructions like this to work as intuitively expected:
880
881 (with-selected-frame frame
882 (define-key local-function-map "\eOP" [f1]))
883
884 On the other hand, this affects the semantics of
885 last-command and real-last-command, and people may rely on
886 that. I took a quick look at the Lisp codebase, and I
887 don't think anything will break. --lorentey */
888 return *(Lisp_Object *)(offset + (char *)FRAME_KBOARD (SELECTED_FRAME ()));
889 }
890 return valcontents;
891 }
892
893 /* Store NEWVAL into SYMBOL, where VALCONTENTS is found in the value cell
894 of SYMBOL. If SYMBOL is buffer-local, VALCONTENTS should be the
895 buffer-independent contents of the value cell: forwarded just one
896 step past the buffer-localness.
897
898 BUF non-zero means set the value in buffer BUF instead of the
899 current buffer. This only plays a role for per-buffer variables. */
900
901 void
902 store_symval_forwarding (symbol, valcontents, newval, buf)
903 Lisp_Object symbol;
904 register Lisp_Object valcontents, newval;
905 struct buffer *buf;
906 {
907 switch (SWITCH_ENUM_CAST (XTYPE (valcontents)))
908 {
909 case Lisp_Misc:
910 switch (XMISCTYPE (valcontents))
911 {
912 case Lisp_Misc_Intfwd:
913 CHECK_NUMBER (newval);
914 *XINTFWD (valcontents)->intvar = XINT (newval);
915 if (*XINTFWD (valcontents)->intvar != XINT (newval))
916 error ("Value out of range for variable `%s'",
917 SDATA (SYMBOL_NAME (symbol)));
918 break;
919
920 case Lisp_Misc_Boolfwd:
921 *XBOOLFWD (valcontents)->boolvar = NILP (newval) ? 0 : 1;
922 break;
923
924 case Lisp_Misc_Objfwd:
925 *XOBJFWD (valcontents)->objvar = newval;
926
927 /* If this variable is a default for something stored
928 in the buffer itself, such as default-fill-column,
929 find the buffers that don't have local values for it
930 and update them. */
931 if (XOBJFWD (valcontents)->objvar > (Lisp_Object *) &buffer_defaults
932 && XOBJFWD (valcontents)->objvar < (Lisp_Object *) (&buffer_defaults + 1))
933 {
934 int offset = ((char *) XOBJFWD (valcontents)->objvar
935 - (char *) &buffer_defaults);
936 int idx = PER_BUFFER_IDX (offset);
937
938 Lisp_Object tail;
939
940 if (idx <= 0)
941 break;
942
943 for (tail = Vbuffer_alist; CONSP (tail); tail = XCDR (tail))
944 {
945 Lisp_Object buf;
946 struct buffer *b;
947
948 buf = Fcdr (XCAR (tail));
949 if (!BUFFERP (buf)) continue;
950 b = XBUFFER (buf);
951
952 if (! PER_BUFFER_VALUE_P (b, idx))
953 PER_BUFFER_VALUE (b, offset) = newval;
954 }
955 }
956 break;
957
958 case Lisp_Misc_Buffer_Objfwd:
959 {
960 int offset = XBUFFER_OBJFWD (valcontents)->offset;
961 Lisp_Object type;
962
963 type = PER_BUFFER_TYPE (offset);
964 if (! NILP (type) && ! NILP (newval)
965 && XTYPE (newval) != XINT (type))
966 buffer_slot_type_mismatch (offset);
967
968 if (buf == NULL)
969 buf = current_buffer;
970 PER_BUFFER_VALUE (buf, offset) = newval;
971 }
972 break;
973
974 case Lisp_Misc_Kboard_Objfwd:
975 {
976 char *base = (char *) FRAME_KBOARD (SELECTED_FRAME ());
977 char *p = base + XKBOARD_OBJFWD (valcontents)->offset;
978 *(Lisp_Object *) p = newval;
979 }
980 break;
981
982 default:
983 goto def;
984 }
985 break;
986
987 default:
988 def:
989 valcontents = SYMBOL_VALUE (symbol);
990 if (BUFFER_LOCAL_VALUEP (valcontents)
991 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
992 XBUFFER_LOCAL_VALUE (valcontents)->realvalue = newval;
993 else
994 SET_SYMBOL_VALUE (symbol, newval);
995 }
996 }
997
998 /* Set up SYMBOL to refer to its global binding.
999 This makes it safe to alter the status of other bindings. */
1000
1001 void
1002 swap_in_global_binding (symbol)
1003 Lisp_Object symbol;
1004 {
1005 Lisp_Object valcontents, cdr;
1006
1007 valcontents = SYMBOL_VALUE (symbol);
1008 if (!BUFFER_LOCAL_VALUEP (valcontents)
1009 && !SOME_BUFFER_LOCAL_VALUEP (valcontents))
1010 abort ();
1011 cdr = XBUFFER_LOCAL_VALUE (valcontents)->cdr;
1012
1013 /* Unload the previously loaded binding. */
1014 Fsetcdr (XCAR (cdr),
1015 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue));
1016
1017 /* Select the global binding in the symbol. */
1018 XSETCAR (cdr, cdr);
1019 store_symval_forwarding (symbol, valcontents, XCDR (cdr), NULL);
1020
1021 /* Indicate that the global binding is set up now. */
1022 XBUFFER_LOCAL_VALUE (valcontents)->frame = Qnil;
1023 XBUFFER_LOCAL_VALUE (valcontents)->buffer = Qnil;
1024 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 0;
1025 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
1026 }
1027
1028 /* Set up the buffer-local symbol SYMBOL for validity in the current buffer.
1029 VALCONTENTS is the contents of its value cell,
1030 which points to a struct Lisp_Buffer_Local_Value.
1031
1032 Return the value forwarded one step past the buffer-local stage.
1033 This could be another forwarding pointer. */
1034
1035 static Lisp_Object
1036 swap_in_symval_forwarding (symbol, valcontents)
1037 Lisp_Object symbol, valcontents;
1038 {
1039 register Lisp_Object tem1;
1040
1041 tem1 = XBUFFER_LOCAL_VALUE (valcontents)->buffer;
1042
1043 if (NILP (tem1)
1044 || current_buffer != XBUFFER (tem1)
1045 || (XBUFFER_LOCAL_VALUE (valcontents)->check_frame
1046 && ! EQ (selected_frame, XBUFFER_LOCAL_VALUE (valcontents)->frame)))
1047 {
1048 if (XSYMBOL (symbol)->indirect_variable)
1049 symbol = indirect_variable (symbol);
1050
1051 /* Unload the previously loaded binding. */
1052 tem1 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1053 Fsetcdr (tem1,
1054 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue));
1055 /* Choose the new binding. */
1056 tem1 = assq_no_quit (symbol, current_buffer->local_var_alist);
1057 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 0;
1058 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
1059 if (NILP (tem1))
1060 {
1061 if (XBUFFER_LOCAL_VALUE (valcontents)->check_frame)
1062 tem1 = assq_no_quit (symbol, XFRAME (selected_frame)->param_alist);
1063 if (! NILP (tem1))
1064 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 1;
1065 else
1066 tem1 = XBUFFER_LOCAL_VALUE (valcontents)->cdr;
1067 }
1068 else
1069 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 1;
1070
1071 /* Load the new binding. */
1072 XSETCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr, tem1);
1073 XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer, current_buffer);
1074 XBUFFER_LOCAL_VALUE (valcontents)->frame = selected_frame;
1075 store_symval_forwarding (symbol,
1076 XBUFFER_LOCAL_VALUE (valcontents)->realvalue,
1077 Fcdr (tem1), NULL);
1078 }
1079 return XBUFFER_LOCAL_VALUE (valcontents)->realvalue;
1080 }
1081 \f
1082 /* Find the value of a symbol, returning Qunbound if it's not bound.
1083 This is helpful for code which just wants to get a variable's value
1084 if it has one, without signaling an error.
1085 Note that it must not be possible to quit
1086 within this function. Great care is required for this. */
1087
1088 Lisp_Object
1089 find_symbol_value (symbol)
1090 Lisp_Object symbol;
1091 {
1092 register Lisp_Object valcontents;
1093 register Lisp_Object val;
1094
1095 CHECK_SYMBOL (symbol);
1096 valcontents = SYMBOL_VALUE (symbol);
1097
1098 if (BUFFER_LOCAL_VALUEP (valcontents)
1099 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1100 valcontents = swap_in_symval_forwarding (symbol, valcontents);
1101
1102 if (MISCP (valcontents))
1103 {
1104 switch (XMISCTYPE (valcontents))
1105 {
1106 case Lisp_Misc_Intfwd:
1107 XSETINT (val, *XINTFWD (valcontents)->intvar);
1108 return val;
1109
1110 case Lisp_Misc_Boolfwd:
1111 return (*XBOOLFWD (valcontents)->boolvar ? Qt : Qnil);
1112
1113 case Lisp_Misc_Objfwd:
1114 return *XOBJFWD (valcontents)->objvar;
1115
1116 case Lisp_Misc_Buffer_Objfwd:
1117 return PER_BUFFER_VALUE (current_buffer,
1118 XBUFFER_OBJFWD (valcontents)->offset);
1119
1120 case Lisp_Misc_Kboard_Objfwd:
1121 return *(Lisp_Object *)(XKBOARD_OBJFWD (valcontents)->offset
1122 + (char *)FRAME_KBOARD (SELECTED_FRAME ()));
1123 }
1124 }
1125
1126 return valcontents;
1127 }
1128
1129 DEFUN ("symbol-value", Fsymbol_value, Ssymbol_value, 1, 1, 0,
1130 doc: /* Return SYMBOL's value. Error if that is void. */)
1131 (symbol)
1132 Lisp_Object symbol;
1133 {
1134 Lisp_Object val;
1135
1136 val = find_symbol_value (symbol);
1137 if (!EQ (val, Qunbound))
1138 return val;
1139
1140 xsignal1 (Qvoid_variable, symbol);
1141 }
1142
1143 DEFUN ("set", Fset, Sset, 2, 2, 0,
1144 doc: /* Set SYMBOL's value to NEWVAL, and return NEWVAL. */)
1145 (symbol, newval)
1146 register Lisp_Object symbol, newval;
1147 {
1148 return set_internal (symbol, newval, current_buffer, 0);
1149 }
1150
1151 /* Return 1 if SYMBOL currently has a let-binding
1152 which was made in the buffer that is now current. */
1153
1154 static int
1155 let_shadows_buffer_binding_p (symbol)
1156 Lisp_Object symbol;
1157 {
1158 volatile struct specbinding *p;
1159
1160 for (p = specpdl_ptr - 1; p >= specpdl; p--)
1161 if (p->func == NULL
1162 && CONSP (p->symbol))
1163 {
1164 Lisp_Object let_bound_symbol = XCAR (p->symbol);
1165 if ((EQ (symbol, let_bound_symbol)
1166 || (XSYMBOL (let_bound_symbol)->indirect_variable
1167 && EQ (symbol, indirect_variable (let_bound_symbol))))
1168 && XBUFFER (XCDR (XCDR (p->symbol))) == current_buffer)
1169 break;
1170 }
1171
1172 return p >= specpdl;
1173 }
1174
1175 /* Store the value NEWVAL into SYMBOL.
1176 If buffer-locality is an issue, BUF specifies which buffer to use.
1177 (0 stands for the current buffer.)
1178
1179 If BINDFLAG is zero, then if this symbol is supposed to become
1180 local in every buffer where it is set, then we make it local.
1181 If BINDFLAG is nonzero, we don't do that. */
1182
1183 Lisp_Object
1184 set_internal (symbol, newval, buf, bindflag)
1185 register Lisp_Object symbol, newval;
1186 struct buffer *buf;
1187 int bindflag;
1188 {
1189 int voide = EQ (newval, Qunbound);
1190
1191 register Lisp_Object valcontents, innercontents, tem1, current_alist_element;
1192
1193 if (buf == 0)
1194 buf = current_buffer;
1195
1196 /* If restoring in a dead buffer, do nothing. */
1197 if (NILP (buf->name))
1198 return newval;
1199
1200 CHECK_SYMBOL (symbol);
1201 if (SYMBOL_CONSTANT_P (symbol)
1202 && (NILP (Fkeywordp (symbol))
1203 || !EQ (newval, SYMBOL_VALUE (symbol))))
1204 xsignal1 (Qsetting_constant, symbol);
1205
1206 innercontents = valcontents = SYMBOL_VALUE (symbol);
1207
1208 if (BUFFER_OBJFWDP (valcontents))
1209 {
1210 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1211 int idx = PER_BUFFER_IDX (offset);
1212 if (idx > 0
1213 && !bindflag
1214 && !let_shadows_buffer_binding_p (symbol))
1215 SET_PER_BUFFER_VALUE_P (buf, idx, 1);
1216 }
1217 else if (BUFFER_LOCAL_VALUEP (valcontents)
1218 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1219 {
1220 /* valcontents is a struct Lisp_Buffer_Local_Value. */
1221 if (XSYMBOL (symbol)->indirect_variable)
1222 symbol = indirect_variable (symbol);
1223
1224 /* What binding is loaded right now? */
1225 current_alist_element
1226 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1227
1228 /* If the current buffer is not the buffer whose binding is
1229 loaded, or if there may be frame-local bindings and the frame
1230 isn't the right one, or if it's a Lisp_Buffer_Local_Value and
1231 the default binding is loaded, the loaded binding may be the
1232 wrong one. */
1233 if (!BUFFERP (XBUFFER_LOCAL_VALUE (valcontents)->buffer)
1234 || buf != XBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer)
1235 || (XBUFFER_LOCAL_VALUE (valcontents)->check_frame
1236 && !EQ (selected_frame, XBUFFER_LOCAL_VALUE (valcontents)->frame))
1237 || (BUFFER_LOCAL_VALUEP (valcontents)
1238 && EQ (XCAR (current_alist_element),
1239 current_alist_element)))
1240 {
1241 /* The currently loaded binding is not necessarily valid.
1242 We need to unload it, and choose a new binding. */
1243
1244 /* Write out `realvalue' to the old loaded binding. */
1245 Fsetcdr (current_alist_element,
1246 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue));
1247
1248 /* Find the new binding. */
1249 tem1 = Fassq (symbol, buf->local_var_alist);
1250 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 1;
1251 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 0;
1252
1253 if (NILP (tem1))
1254 {
1255 /* This buffer still sees the default value. */
1256
1257 /* If the variable is a Lisp_Some_Buffer_Local_Value,
1258 or if this is `let' rather than `set',
1259 make CURRENT-ALIST-ELEMENT point to itself,
1260 indicating that we're seeing the default value.
1261 Likewise if the variable has been let-bound
1262 in the current buffer. */
1263 if (bindflag || SOME_BUFFER_LOCAL_VALUEP (valcontents)
1264 || let_shadows_buffer_binding_p (symbol))
1265 {
1266 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
1267
1268 if (XBUFFER_LOCAL_VALUE (valcontents)->check_frame)
1269 tem1 = Fassq (symbol,
1270 XFRAME (selected_frame)->param_alist);
1271
1272 if (! NILP (tem1))
1273 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 1;
1274 else
1275 tem1 = XBUFFER_LOCAL_VALUE (valcontents)->cdr;
1276 }
1277 /* If it's a Lisp_Buffer_Local_Value, being set not bound,
1278 and we're not within a let that was made for this buffer,
1279 create a new buffer-local binding for the variable.
1280 That means, give this buffer a new assoc for a local value
1281 and load that binding. */
1282 else
1283 {
1284 tem1 = Fcons (symbol, XCDR (current_alist_element));
1285 buf->local_var_alist
1286 = Fcons (tem1, buf->local_var_alist);
1287 }
1288 }
1289
1290 /* Record which binding is now loaded. */
1291 XSETCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr,
1292 tem1);
1293
1294 /* Set `buffer' and `frame' slots for the binding now loaded. */
1295 XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer, buf);
1296 XBUFFER_LOCAL_VALUE (valcontents)->frame = selected_frame;
1297 }
1298 innercontents = XBUFFER_LOCAL_VALUE (valcontents)->realvalue;
1299 }
1300
1301 /* If storing void (making the symbol void), forward only through
1302 buffer-local indicator, not through Lisp_Objfwd, etc. */
1303 if (voide)
1304 store_symval_forwarding (symbol, Qnil, newval, buf);
1305 else
1306 store_symval_forwarding (symbol, innercontents, newval, buf);
1307
1308 /* If we just set a variable whose current binding is frame-local,
1309 store the new value in the frame parameter too. */
1310
1311 if (BUFFER_LOCAL_VALUEP (valcontents)
1312 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1313 {
1314 /* What binding is loaded right now? */
1315 current_alist_element
1316 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1317
1318 /* If the current buffer is not the buffer whose binding is
1319 loaded, or if there may be frame-local bindings and the frame
1320 isn't the right one, or if it's a Lisp_Buffer_Local_Value and
1321 the default binding is loaded, the loaded binding may be the
1322 wrong one. */
1323 if (XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame)
1324 XSETCDR (current_alist_element, newval);
1325 }
1326
1327 return newval;
1328 }
1329 \f
1330 /* Access or set a buffer-local symbol's default value. */
1331
1332 /* Return the default value of SYMBOL, but don't check for voidness.
1333 Return Qunbound if it is void. */
1334
1335 Lisp_Object
1336 default_value (symbol)
1337 Lisp_Object symbol;
1338 {
1339 register Lisp_Object valcontents;
1340
1341 CHECK_SYMBOL (symbol);
1342 valcontents = SYMBOL_VALUE (symbol);
1343
1344 /* For a built-in buffer-local variable, get the default value
1345 rather than letting do_symval_forwarding get the current value. */
1346 if (BUFFER_OBJFWDP (valcontents))
1347 {
1348 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1349 if (PER_BUFFER_IDX (offset) != 0)
1350 return PER_BUFFER_DEFAULT (offset);
1351 }
1352
1353 /* Handle user-created local variables. */
1354 if (BUFFER_LOCAL_VALUEP (valcontents)
1355 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1356 {
1357 /* If var is set up for a buffer that lacks a local value for it,
1358 the current value is nominally the default value.
1359 But the `realvalue' slot may be more up to date, since
1360 ordinary setq stores just that slot. So use that. */
1361 Lisp_Object current_alist_element, alist_element_car;
1362 current_alist_element
1363 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1364 alist_element_car = XCAR (current_alist_element);
1365 if (EQ (alist_element_car, current_alist_element))
1366 return do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue);
1367 else
1368 return XCDR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1369 }
1370 /* For other variables, get the current value. */
1371 return do_symval_forwarding (valcontents);
1372 }
1373
1374 DEFUN ("default-boundp", Fdefault_boundp, Sdefault_boundp, 1, 1, 0,
1375 doc: /* Return t if SYMBOL has a non-void default value.
1376 This is the value that is seen in buffers that do not have their own values
1377 for this variable. */)
1378 (symbol)
1379 Lisp_Object symbol;
1380 {
1381 register Lisp_Object value;
1382
1383 value = default_value (symbol);
1384 return (EQ (value, Qunbound) ? Qnil : Qt);
1385 }
1386
1387 DEFUN ("default-value", Fdefault_value, Sdefault_value, 1, 1, 0,
1388 doc: /* Return SYMBOL's default value.
1389 This is the value that is seen in buffers that do not have their own values
1390 for this variable. The default value is meaningful for variables with
1391 local bindings in certain buffers. */)
1392 (symbol)
1393 Lisp_Object symbol;
1394 {
1395 register Lisp_Object value;
1396
1397 value = default_value (symbol);
1398 if (!EQ (value, Qunbound))
1399 return value;
1400
1401 xsignal1 (Qvoid_variable, symbol);
1402 }
1403
1404 DEFUN ("set-default", Fset_default, Sset_default, 2, 2, 0,
1405 doc: /* Set SYMBOL's default value to VALUE. SYMBOL and VALUE are evaluated.
1406 The default value is seen in buffers that do not have their own values
1407 for this variable. */)
1408 (symbol, value)
1409 Lisp_Object symbol, value;
1410 {
1411 register Lisp_Object valcontents, current_alist_element, alist_element_buffer;
1412
1413 CHECK_SYMBOL (symbol);
1414 valcontents = SYMBOL_VALUE (symbol);
1415
1416 /* Handle variables like case-fold-search that have special slots
1417 in the buffer. Make them work apparently like Lisp_Buffer_Local_Value
1418 variables. */
1419 if (BUFFER_OBJFWDP (valcontents))
1420 {
1421 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1422 int idx = PER_BUFFER_IDX (offset);
1423
1424 PER_BUFFER_DEFAULT (offset) = value;
1425
1426 /* If this variable is not always local in all buffers,
1427 set it in the buffers that don't nominally have a local value. */
1428 if (idx > 0)
1429 {
1430 struct buffer *b;
1431
1432 for (b = all_buffers; b; b = b->next)
1433 if (!PER_BUFFER_VALUE_P (b, idx))
1434 PER_BUFFER_VALUE (b, offset) = value;
1435 }
1436 return value;
1437 }
1438
1439 if (!BUFFER_LOCAL_VALUEP (valcontents)
1440 && !SOME_BUFFER_LOCAL_VALUEP (valcontents))
1441 return Fset (symbol, value);
1442
1443 /* Store new value into the DEFAULT-VALUE slot. */
1444 XSETCDR (XBUFFER_LOCAL_VALUE (valcontents)->cdr, value);
1445
1446 /* If the default binding is now loaded, set the REALVALUE slot too. */
1447 current_alist_element
1448 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1449 alist_element_buffer = Fcar (current_alist_element);
1450 if (EQ (alist_element_buffer, current_alist_element))
1451 store_symval_forwarding (symbol,
1452 XBUFFER_LOCAL_VALUE (valcontents)->realvalue,
1453 value, NULL);
1454
1455 return value;
1456 }
1457
1458 DEFUN ("setq-default", Fsetq_default, Ssetq_default, 0, UNEVALLED, 0,
1459 doc: /* Set the default value of variable VAR to VALUE.
1460 VAR, the variable name, is literal (not evaluated);
1461 VALUE is an expression: it is evaluated and its value returned.
1462 The default value of a variable is seen in buffers
1463 that do not have their own values for the variable.
1464
1465 More generally, you can use multiple variables and values, as in
1466 (setq-default VAR VALUE VAR VALUE...)
1467 This sets each VAR's default value to the corresponding VALUE.
1468 The VALUE for the Nth VAR can refer to the new default values
1469 of previous VARs.
1470 usage: (setq-default [VAR VALUE]...) */)
1471 (args)
1472 Lisp_Object args;
1473 {
1474 register Lisp_Object args_left;
1475 register Lisp_Object val, symbol;
1476 struct gcpro gcpro1;
1477
1478 if (NILP (args))
1479 return Qnil;
1480
1481 args_left = args;
1482 GCPRO1 (args);
1483
1484 do
1485 {
1486 val = Feval (Fcar (Fcdr (args_left)));
1487 symbol = XCAR (args_left);
1488 Fset_default (symbol, val);
1489 args_left = Fcdr (XCDR (args_left));
1490 }
1491 while (!NILP (args_left));
1492
1493 UNGCPRO;
1494 return val;
1495 }
1496 \f
1497 /* Lisp functions for creating and removing buffer-local variables. */
1498
1499 DEFUN ("make-variable-buffer-local", Fmake_variable_buffer_local, Smake_variable_buffer_local,
1500 1, 1, "vMake Variable Buffer Local: ",
1501 doc: /* Make VARIABLE become buffer-local whenever it is set.
1502 At any time, the value for the current buffer is in effect,
1503 unless the variable has never been set in this buffer,
1504 in which case the default value is in effect.
1505 Note that binding the variable with `let', or setting it while
1506 a `let'-style binding made in this buffer is in effect,
1507 does not make the variable buffer-local. Return VARIABLE.
1508
1509 In most cases it is better to use `make-local-variable',
1510 which makes a variable local in just one buffer.
1511
1512 The function `default-value' gets the default value and `set-default' sets it. */)
1513 (variable)
1514 register Lisp_Object variable;
1515 {
1516 register Lisp_Object tem, valcontents, newval;
1517
1518 CHECK_SYMBOL (variable);
1519 variable = indirect_variable (variable);
1520
1521 valcontents = SYMBOL_VALUE (variable);
1522 if (EQ (variable, Qnil) || EQ (variable, Qt) || KBOARD_OBJFWDP (valcontents))
1523 error ("Symbol %s may not be buffer-local", SDATA (SYMBOL_NAME (variable)));
1524
1525 if (BUFFER_LOCAL_VALUEP (valcontents) || BUFFER_OBJFWDP (valcontents))
1526 return variable;
1527 if (SOME_BUFFER_LOCAL_VALUEP (valcontents))
1528 {
1529 XMISCTYPE (SYMBOL_VALUE (variable)) = Lisp_Misc_Buffer_Local_Value;
1530 return variable;
1531 }
1532 if (EQ (valcontents, Qunbound))
1533 SET_SYMBOL_VALUE (variable, Qnil);
1534 tem = Fcons (Qnil, Fsymbol_value (variable));
1535 XSETCAR (tem, tem);
1536 newval = allocate_misc ();
1537 XMISCTYPE (newval) = Lisp_Misc_Buffer_Local_Value;
1538 XBUFFER_LOCAL_VALUE (newval)->realvalue = SYMBOL_VALUE (variable);
1539 XBUFFER_LOCAL_VALUE (newval)->buffer = Fcurrent_buffer ();
1540 XBUFFER_LOCAL_VALUE (newval)->frame = Qnil;
1541 XBUFFER_LOCAL_VALUE (newval)->found_for_buffer = 0;
1542 XBUFFER_LOCAL_VALUE (newval)->found_for_frame = 0;
1543 XBUFFER_LOCAL_VALUE (newval)->check_frame = 0;
1544 XBUFFER_LOCAL_VALUE (newval)->cdr = tem;
1545 SET_SYMBOL_VALUE (variable, newval);
1546 return variable;
1547 }
1548
1549 DEFUN ("make-local-variable", Fmake_local_variable, Smake_local_variable,
1550 1, 1, "vMake Local Variable: ",
1551 doc: /* Make VARIABLE have a separate value in the current buffer.
1552 Other buffers will continue to share a common default value.
1553 \(The buffer-local value of VARIABLE starts out as the same value
1554 VARIABLE previously had. If VARIABLE was void, it remains void.\)
1555 Return VARIABLE.
1556
1557 If the variable is already arranged to become local when set,
1558 this function causes a local value to exist for this buffer,
1559 just as setting the variable would do.
1560
1561 This function returns VARIABLE, and therefore
1562 (set (make-local-variable 'VARIABLE) VALUE-EXP)
1563 works.
1564
1565 See also `make-variable-buffer-local'.
1566
1567 Do not use `make-local-variable' to make a hook variable buffer-local.
1568 Instead, use `add-hook' and specify t for the LOCAL argument. */)
1569 (variable)
1570 register Lisp_Object variable;
1571 {
1572 register Lisp_Object tem, valcontents;
1573
1574 CHECK_SYMBOL (variable);
1575 variable = indirect_variable (variable);
1576
1577 valcontents = SYMBOL_VALUE (variable);
1578 if (EQ (variable, Qnil) || EQ (variable, Qt) || KBOARD_OBJFWDP (valcontents))
1579 error ("Symbol %s may not be buffer-local", SDATA (SYMBOL_NAME (variable)));
1580
1581 if (BUFFER_LOCAL_VALUEP (valcontents) || BUFFER_OBJFWDP (valcontents))
1582 {
1583 tem = Fboundp (variable);
1584
1585 /* Make sure the symbol has a local value in this particular buffer,
1586 by setting it to the same value it already has. */
1587 Fset (variable, (EQ (tem, Qt) ? Fsymbol_value (variable) : Qunbound));
1588 return variable;
1589 }
1590 /* Make sure symbol is set up to hold per-buffer values. */
1591 if (!SOME_BUFFER_LOCAL_VALUEP (valcontents))
1592 {
1593 Lisp_Object newval;
1594 tem = Fcons (Qnil, do_symval_forwarding (valcontents));
1595 XSETCAR (tem, tem);
1596 newval = allocate_misc ();
1597 XMISCTYPE (newval) = Lisp_Misc_Some_Buffer_Local_Value;
1598 XBUFFER_LOCAL_VALUE (newval)->realvalue = SYMBOL_VALUE (variable);
1599 XBUFFER_LOCAL_VALUE (newval)->buffer = Qnil;
1600 XBUFFER_LOCAL_VALUE (newval)->frame = Qnil;
1601 XBUFFER_LOCAL_VALUE (newval)->found_for_buffer = 0;
1602 XBUFFER_LOCAL_VALUE (newval)->found_for_frame = 0;
1603 XBUFFER_LOCAL_VALUE (newval)->check_frame = 0;
1604 XBUFFER_LOCAL_VALUE (newval)->cdr = tem;
1605 SET_SYMBOL_VALUE (variable, newval);
1606 }
1607 /* Make sure this buffer has its own value of symbol. */
1608 tem = Fassq (variable, current_buffer->local_var_alist);
1609 if (NILP (tem))
1610 {
1611 /* Swap out any local binding for some other buffer, and make
1612 sure the current value is permanently recorded, if it's the
1613 default value. */
1614 find_symbol_value (variable);
1615
1616 current_buffer->local_var_alist
1617 = Fcons (Fcons (variable, XCDR (XBUFFER_LOCAL_VALUE (SYMBOL_VALUE (variable))->cdr)),
1618 current_buffer->local_var_alist);
1619
1620 /* Make sure symbol does not think it is set up for this buffer;
1621 force it to look once again for this buffer's value. */
1622 {
1623 Lisp_Object *pvalbuf;
1624
1625 valcontents = SYMBOL_VALUE (variable);
1626
1627 pvalbuf = &XBUFFER_LOCAL_VALUE (valcontents)->buffer;
1628 if (current_buffer == XBUFFER (*pvalbuf))
1629 *pvalbuf = Qnil;
1630 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
1631 }
1632 }
1633
1634 /* If the symbol forwards into a C variable, then load the binding
1635 for this buffer now. If C code modifies the variable before we
1636 load the binding in, then that new value will clobber the default
1637 binding the next time we unload it. */
1638 valcontents = XBUFFER_LOCAL_VALUE (SYMBOL_VALUE (variable))->realvalue;
1639 if (INTFWDP (valcontents) || BOOLFWDP (valcontents) || OBJFWDP (valcontents))
1640 swap_in_symval_forwarding (variable, SYMBOL_VALUE (variable));
1641
1642 return variable;
1643 }
1644
1645 DEFUN ("kill-local-variable", Fkill_local_variable, Skill_local_variable,
1646 1, 1, "vKill Local Variable: ",
1647 doc: /* Make VARIABLE no longer have a separate value in the current buffer.
1648 From now on the default value will apply in this buffer. Return VARIABLE. */)
1649 (variable)
1650 register Lisp_Object variable;
1651 {
1652 register Lisp_Object tem, valcontents;
1653
1654 CHECK_SYMBOL (variable);
1655 variable = indirect_variable (variable);
1656
1657 valcontents = SYMBOL_VALUE (variable);
1658
1659 if (BUFFER_OBJFWDP (valcontents))
1660 {
1661 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1662 int idx = PER_BUFFER_IDX (offset);
1663
1664 if (idx > 0)
1665 {
1666 SET_PER_BUFFER_VALUE_P (current_buffer, idx, 0);
1667 PER_BUFFER_VALUE (current_buffer, offset)
1668 = PER_BUFFER_DEFAULT (offset);
1669 }
1670 return variable;
1671 }
1672
1673 if (!BUFFER_LOCAL_VALUEP (valcontents)
1674 && !SOME_BUFFER_LOCAL_VALUEP (valcontents))
1675 return variable;
1676
1677 /* Get rid of this buffer's alist element, if any. */
1678
1679 tem = Fassq (variable, current_buffer->local_var_alist);
1680 if (!NILP (tem))
1681 current_buffer->local_var_alist
1682 = Fdelq (tem, current_buffer->local_var_alist);
1683
1684 /* If the symbol is set up with the current buffer's binding
1685 loaded, recompute its value. We have to do it now, or else
1686 forwarded objects won't work right. */
1687 {
1688 Lisp_Object *pvalbuf, buf;
1689 valcontents = SYMBOL_VALUE (variable);
1690 pvalbuf = &XBUFFER_LOCAL_VALUE (valcontents)->buffer;
1691 XSETBUFFER (buf, current_buffer);
1692 if (EQ (buf, *pvalbuf))
1693 {
1694 *pvalbuf = Qnil;
1695 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
1696 find_symbol_value (variable);
1697 }
1698 }
1699
1700 return variable;
1701 }
1702
1703 /* Lisp functions for creating and removing buffer-local variables. */
1704
1705 DEFUN ("make-variable-frame-local", Fmake_variable_frame_local, Smake_variable_frame_local,
1706 1, 1, "vMake Variable Frame Local: ",
1707 doc: /* Enable VARIABLE to have frame-local bindings.
1708 This does not create any frame-local bindings for VARIABLE,
1709 it just makes them possible.
1710
1711 A frame-local binding is actually a frame parameter value.
1712 If a frame F has a value for the frame parameter named VARIABLE,
1713 that also acts as a frame-local binding for VARIABLE in F--
1714 provided this function has been called to enable VARIABLE
1715 to have frame-local bindings at all.
1716
1717 The only way to create a frame-local binding for VARIABLE in a frame
1718 is to set the VARIABLE frame parameter of that frame. See
1719 `modify-frame-parameters' for how to set frame parameters.
1720
1721 Buffer-local bindings take precedence over frame-local bindings. */)
1722 (variable)
1723 register Lisp_Object variable;
1724 {
1725 register Lisp_Object tem, valcontents, newval;
1726
1727 CHECK_SYMBOL (variable);
1728 variable = indirect_variable (variable);
1729
1730 valcontents = SYMBOL_VALUE (variable);
1731 if (EQ (variable, Qnil) || EQ (variable, Qt) || KBOARD_OBJFWDP (valcontents)
1732 || BUFFER_OBJFWDP (valcontents))
1733 error ("Symbol %s may not be frame-local", SDATA (SYMBOL_NAME (variable)));
1734
1735 if (BUFFER_LOCAL_VALUEP (valcontents)
1736 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1737 {
1738 XBUFFER_LOCAL_VALUE (valcontents)->check_frame = 1;
1739 return variable;
1740 }
1741
1742 if (EQ (valcontents, Qunbound))
1743 SET_SYMBOL_VALUE (variable, Qnil);
1744 tem = Fcons (Qnil, Fsymbol_value (variable));
1745 XSETCAR (tem, tem);
1746 newval = allocate_misc ();
1747 XMISCTYPE (newval) = Lisp_Misc_Some_Buffer_Local_Value;
1748 XBUFFER_LOCAL_VALUE (newval)->realvalue = SYMBOL_VALUE (variable);
1749 XBUFFER_LOCAL_VALUE (newval)->buffer = Qnil;
1750 XBUFFER_LOCAL_VALUE (newval)->frame = Qnil;
1751 XBUFFER_LOCAL_VALUE (newval)->found_for_buffer = 0;
1752 XBUFFER_LOCAL_VALUE (newval)->found_for_frame = 0;
1753 XBUFFER_LOCAL_VALUE (newval)->check_frame = 1;
1754 XBUFFER_LOCAL_VALUE (newval)->cdr = tem;
1755 SET_SYMBOL_VALUE (variable, newval);
1756 return variable;
1757 }
1758
1759 DEFUN ("local-variable-p", Flocal_variable_p, Slocal_variable_p,
1760 1, 2, 0,
1761 doc: /* Non-nil if VARIABLE has a local binding in buffer BUFFER.
1762 BUFFER defaults to the current buffer. */)
1763 (variable, buffer)
1764 register Lisp_Object variable, buffer;
1765 {
1766 Lisp_Object valcontents;
1767 register struct buffer *buf;
1768
1769 if (NILP (buffer))
1770 buf = current_buffer;
1771 else
1772 {
1773 CHECK_BUFFER (buffer);
1774 buf = XBUFFER (buffer);
1775 }
1776
1777 CHECK_SYMBOL (variable);
1778 variable = indirect_variable (variable);
1779
1780 valcontents = SYMBOL_VALUE (variable);
1781 if (BUFFER_LOCAL_VALUEP (valcontents)
1782 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1783 {
1784 Lisp_Object tail, elt;
1785
1786 for (tail = buf->local_var_alist; CONSP (tail); tail = XCDR (tail))
1787 {
1788 elt = XCAR (tail);
1789 if (EQ (variable, XCAR (elt)))
1790 return Qt;
1791 }
1792 }
1793 if (BUFFER_OBJFWDP (valcontents))
1794 {
1795 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1796 int idx = PER_BUFFER_IDX (offset);
1797 if (idx == -1 || PER_BUFFER_VALUE_P (buf, idx))
1798 return Qt;
1799 }
1800 return Qnil;
1801 }
1802
1803 DEFUN ("local-variable-if-set-p", Flocal_variable_if_set_p, Slocal_variable_if_set_p,
1804 1, 2, 0,
1805 doc: /* Non-nil if VARIABLE will be local in buffer BUFFER when set there.
1806 More precisely, this means that setting the variable \(with `set' or`setq'),
1807 while it does not have a `let'-style binding that was made in BUFFER,
1808 will produce a buffer local binding. See Info node
1809 `(elisp)Creating Buffer-Local'.
1810 BUFFER defaults to the current buffer. */)
1811 (variable, buffer)
1812 register Lisp_Object variable, buffer;
1813 {
1814 Lisp_Object valcontents;
1815 register struct buffer *buf;
1816
1817 if (NILP (buffer))
1818 buf = current_buffer;
1819 else
1820 {
1821 CHECK_BUFFER (buffer);
1822 buf = XBUFFER (buffer);
1823 }
1824
1825 CHECK_SYMBOL (variable);
1826 variable = indirect_variable (variable);
1827
1828 valcontents = SYMBOL_VALUE (variable);
1829
1830 /* This means that make-variable-buffer-local was done. */
1831 if (BUFFER_LOCAL_VALUEP (valcontents))
1832 return Qt;
1833 /* All these slots become local if they are set. */
1834 if (BUFFER_OBJFWDP (valcontents))
1835 return Qt;
1836 if (SOME_BUFFER_LOCAL_VALUEP (valcontents))
1837 {
1838 Lisp_Object tail, elt;
1839 for (tail = buf->local_var_alist; CONSP (tail); tail = XCDR (tail))
1840 {
1841 elt = XCAR (tail);
1842 if (EQ (variable, XCAR (elt)))
1843 return Qt;
1844 }
1845 }
1846 return Qnil;
1847 }
1848
1849 DEFUN ("variable-binding-locus", Fvariable_binding_locus, Svariable_binding_locus,
1850 1, 1, 0,
1851 doc: /* Return a value indicating where VARIABLE's current binding comes from.
1852 If the current binding is buffer-local, the value is the current buffer.
1853 If the current binding is frame-local, the value is the selected frame.
1854 If the current binding is global (the default), the value is nil. */)
1855 (variable)
1856 register Lisp_Object variable;
1857 {
1858 Lisp_Object valcontents;
1859
1860 CHECK_SYMBOL (variable);
1861 variable = indirect_variable (variable);
1862
1863 /* Make sure the current binding is actually swapped in. */
1864 find_symbol_value (variable);
1865
1866 valcontents = XSYMBOL (variable)->value;
1867
1868 if (BUFFER_LOCAL_VALUEP (valcontents)
1869 || SOME_BUFFER_LOCAL_VALUEP (valcontents)
1870 || BUFFER_OBJFWDP (valcontents))
1871 {
1872 /* For a local variable, record both the symbol and which
1873 buffer's or frame's value we are saving. */
1874 if (!NILP (Flocal_variable_p (variable, Qnil)))
1875 return Fcurrent_buffer ();
1876 else if (!BUFFER_OBJFWDP (valcontents)
1877 && XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame)
1878 return XBUFFER_LOCAL_VALUE (valcontents)->frame;
1879 }
1880
1881 return Qnil;
1882 }
1883
1884 /* This code is disabled now that we use the selected frame to return
1885 keyboard-local-values. */
1886 #if 0
1887 extern struct terminal *get_terminal P_ ((Lisp_Object display, int));
1888
1889 DEFUN ("terminal-local-value", Fterminal_local_value, Sterminal_local_value, 2, 2, 0,
1890 doc: /* Return the terminal-local value of SYMBOL on TERMINAL.
1891 If SYMBOL is not a terminal-local variable, then return its normal
1892 value, like `symbol-value'.
1893
1894 TERMINAL may be a terminal id, a frame, or nil (meaning the
1895 selected frame's terminal device). */)
1896 (symbol, terminal)
1897 Lisp_Object symbol;
1898 Lisp_Object terminal;
1899 {
1900 Lisp_Object result;
1901 struct terminal *t = get_terminal (terminal, 1);
1902 push_kboard (t->kboard);
1903 result = Fsymbol_value (symbol);
1904 pop_kboard ();
1905 return result;
1906 }
1907
1908 DEFUN ("set-terminal-local-value", Fset_terminal_local_value, Sset_terminal_local_value, 3, 3, 0,
1909 doc: /* Set the terminal-local binding of SYMBOL on TERMINAL to VALUE.
1910 If VARIABLE is not a terminal-local variable, then set its normal
1911 binding, like `set'.
1912
1913 TERMINAL may be a terminal id, a frame, or nil (meaning the
1914 selected frame's terminal device). */)
1915 (symbol, terminal, value)
1916 Lisp_Object symbol;
1917 Lisp_Object terminal;
1918 Lisp_Object value;
1919 {
1920 Lisp_Object result;
1921 struct terminal *t = get_terminal (terminal, 1);
1922 push_kboard (d->kboard);
1923 result = Fset (symbol, value);
1924 pop_kboard ();
1925 return result;
1926 }
1927 #endif
1928 \f
1929 /* Find the function at the end of a chain of symbol function indirections. */
1930
1931 /* If OBJECT is a symbol, find the end of its function chain and
1932 return the value found there. If OBJECT is not a symbol, just
1933 return it. If there is a cycle in the function chain, signal a
1934 cyclic-function-indirection error.
1935
1936 This is like Findirect_function, except that it doesn't signal an
1937 error if the chain ends up unbound. */
1938 Lisp_Object
1939 indirect_function (object)
1940 register Lisp_Object object;
1941 {
1942 Lisp_Object tortoise, hare;
1943
1944 hare = tortoise = object;
1945
1946 for (;;)
1947 {
1948 if (!SYMBOLP (hare) || EQ (hare, Qunbound))
1949 break;
1950 hare = XSYMBOL (hare)->function;
1951 if (!SYMBOLP (hare) || EQ (hare, Qunbound))
1952 break;
1953 hare = XSYMBOL (hare)->function;
1954
1955 tortoise = XSYMBOL (tortoise)->function;
1956
1957 if (EQ (hare, tortoise))
1958 xsignal1 (Qcyclic_function_indirection, object);
1959 }
1960
1961 return hare;
1962 }
1963
1964 DEFUN ("indirect-function", Findirect_function, Sindirect_function, 1, 2, 0,
1965 doc: /* Return the function at the end of OBJECT's function chain.
1966 If OBJECT is not a symbol, just return it. Otherwise, follow all
1967 function indirections to find the final function binding and return it.
1968 If the final symbol in the chain is unbound, signal a void-function error.
1969 Optional arg NOERROR non-nil means to return nil instead of signalling.
1970 Signal a cyclic-function-indirection error if there is a loop in the
1971 function chain of symbols. */)
1972 (object, noerror)
1973 register Lisp_Object object;
1974 Lisp_Object noerror;
1975 {
1976 Lisp_Object result;
1977
1978 /* Optimize for no indirection. */
1979 result = object;
1980 if (SYMBOLP (result) && !EQ (result, Qunbound)
1981 && (result = XSYMBOL (result)->function, SYMBOLP (result)))
1982 result = indirect_function (result);
1983 if (!EQ (result, Qunbound))
1984 return result;
1985
1986 if (NILP (noerror))
1987 xsignal1 (Qvoid_function, object);
1988
1989 return Qnil;
1990 }
1991 \f
1992 /* Extract and set vector and string elements */
1993
1994 DEFUN ("aref", Faref, Saref, 2, 2, 0,
1995 doc: /* Return the element of ARRAY at index IDX.
1996 ARRAY may be a vector, a string, a char-table, a bool-vector,
1997 or a byte-code object. IDX starts at 0. */)
1998 (array, idx)
1999 register Lisp_Object array;
2000 Lisp_Object idx;
2001 {
2002 register int idxval;
2003
2004 CHECK_NUMBER (idx);
2005 idxval = XINT (idx);
2006 if (STRINGP (array))
2007 {
2008 int c, idxval_byte;
2009
2010 if (idxval < 0 || idxval >= SCHARS (array))
2011 args_out_of_range (array, idx);
2012 if (! STRING_MULTIBYTE (array))
2013 return make_number ((unsigned char) SREF (array, idxval));
2014 idxval_byte = string_char_to_byte (array, idxval);
2015
2016 c = STRING_CHAR (SDATA (array) + idxval_byte,
2017 SBYTES (array) - idxval_byte);
2018 return make_number (c);
2019 }
2020 else if (BOOL_VECTOR_P (array))
2021 {
2022 int val;
2023
2024 if (idxval < 0 || idxval >= XBOOL_VECTOR (array)->size)
2025 args_out_of_range (array, idx);
2026
2027 val = (unsigned char) XBOOL_VECTOR (array)->data[idxval / BOOL_VECTOR_BITS_PER_CHAR];
2028 return (val & (1 << (idxval % BOOL_VECTOR_BITS_PER_CHAR)) ? Qt : Qnil);
2029 }
2030 else if (CHAR_TABLE_P (array))
2031 {
2032 Lisp_Object val;
2033
2034 val = Qnil;
2035
2036 if (idxval < 0)
2037 args_out_of_range (array, idx);
2038 if (idxval < CHAR_TABLE_ORDINARY_SLOTS)
2039 {
2040 if (! SINGLE_BYTE_CHAR_P (idxval))
2041 args_out_of_range (array, idx);
2042 /* For ASCII and 8-bit European characters, the element is
2043 stored in the top table. */
2044 val = XCHAR_TABLE (array)->contents[idxval];
2045 if (NILP (val))
2046 {
2047 int default_slot
2048 = (idxval < 0x80 ? CHAR_TABLE_DEFAULT_SLOT_ASCII
2049 : idxval < 0xA0 ? CHAR_TABLE_DEFAULT_SLOT_8_BIT_CONTROL
2050 : CHAR_TABLE_DEFAULT_SLOT_8_BIT_GRAPHIC);
2051 val = XCHAR_TABLE (array)->contents[default_slot];
2052 }
2053 if (NILP (val))
2054 val = XCHAR_TABLE (array)->defalt;
2055 while (NILP (val)) /* Follow parents until we find some value. */
2056 {
2057 array = XCHAR_TABLE (array)->parent;
2058 if (NILP (array))
2059 return Qnil;
2060 val = XCHAR_TABLE (array)->contents[idxval];
2061 if (NILP (val))
2062 val = XCHAR_TABLE (array)->defalt;
2063 }
2064 return val;
2065 }
2066 else
2067 {
2068 int code[4], i;
2069 Lisp_Object sub_table;
2070 Lisp_Object current_default;
2071
2072 SPLIT_CHAR (idxval, code[0], code[1], code[2]);
2073 if (code[1] < 32) code[1] = -1;
2074 else if (code[2] < 32) code[2] = -1;
2075
2076 /* Here, the possible range of CODE[0] (== charset ID) is
2077 128..MAX_CHARSET. Since the top level char table contains
2078 data for multibyte characters after 256th element, we must
2079 increment CODE[0] by 128 to get a correct index. */
2080 code[0] += 128;
2081 code[3] = -1; /* anchor */
2082
2083 try_parent_char_table:
2084 current_default = XCHAR_TABLE (array)->defalt;
2085 sub_table = array;
2086 for (i = 0; code[i] >= 0; i++)
2087 {
2088 val = XCHAR_TABLE (sub_table)->contents[code[i]];
2089 if (SUB_CHAR_TABLE_P (val))
2090 {
2091 sub_table = val;
2092 if (! NILP (XCHAR_TABLE (sub_table)->defalt))
2093 current_default = XCHAR_TABLE (sub_table)->defalt;
2094 }
2095 else
2096 {
2097 if (NILP (val))
2098 val = current_default;
2099 if (NILP (val))
2100 {
2101 array = XCHAR_TABLE (array)->parent;
2102 if (!NILP (array))
2103 goto try_parent_char_table;
2104 }
2105 return val;
2106 }
2107 }
2108 /* Reaching here means IDXVAL is a generic character in
2109 which each character or a group has independent value.
2110 Essentially it's nonsense to get a value for such a
2111 generic character, but for backward compatibility, we try
2112 the default value and parent. */
2113 val = current_default;
2114 if (NILP (val))
2115 {
2116 array = XCHAR_TABLE (array)->parent;
2117 if (!NILP (array))
2118 goto try_parent_char_table;
2119 }
2120 return val;
2121 }
2122 }
2123 else
2124 {
2125 int size = 0;
2126 if (VECTORP (array))
2127 size = XVECTOR (array)->size;
2128 else if (COMPILEDP (array))
2129 size = XVECTOR (array)->size & PSEUDOVECTOR_SIZE_MASK;
2130 else
2131 wrong_type_argument (Qarrayp, array);
2132
2133 if (idxval < 0 || idxval >= size)
2134 args_out_of_range (array, idx);
2135 return XVECTOR (array)->contents[idxval];
2136 }
2137 }
2138
2139 DEFUN ("aset", Faset, Saset, 3, 3, 0,
2140 doc: /* Store into the element of ARRAY at index IDX the value NEWELT.
2141 Return NEWELT. ARRAY may be a vector, a string, a char-table or a
2142 bool-vector. IDX starts at 0. */)
2143 (array, idx, newelt)
2144 register Lisp_Object array;
2145 Lisp_Object idx, newelt;
2146 {
2147 register int idxval;
2148
2149 CHECK_NUMBER (idx);
2150 idxval = XINT (idx);
2151 CHECK_ARRAY (array, Qarrayp);
2152 CHECK_IMPURE (array);
2153
2154 if (VECTORP (array))
2155 {
2156 if (idxval < 0 || idxval >= XVECTOR (array)->size)
2157 args_out_of_range (array, idx);
2158 XVECTOR (array)->contents[idxval] = newelt;
2159 }
2160 else if (BOOL_VECTOR_P (array))
2161 {
2162 int val;
2163
2164 if (idxval < 0 || idxval >= XBOOL_VECTOR (array)->size)
2165 args_out_of_range (array, idx);
2166
2167 val = (unsigned char) XBOOL_VECTOR (array)->data[idxval / BOOL_VECTOR_BITS_PER_CHAR];
2168
2169 if (! NILP (newelt))
2170 val |= 1 << (idxval % BOOL_VECTOR_BITS_PER_CHAR);
2171 else
2172 val &= ~(1 << (idxval % BOOL_VECTOR_BITS_PER_CHAR));
2173 XBOOL_VECTOR (array)->data[idxval / BOOL_VECTOR_BITS_PER_CHAR] = val;
2174 }
2175 else if (CHAR_TABLE_P (array))
2176 {
2177 if (idxval < 0)
2178 args_out_of_range (array, idx);
2179 if (idxval < CHAR_TABLE_ORDINARY_SLOTS)
2180 {
2181 if (! SINGLE_BYTE_CHAR_P (idxval))
2182 args_out_of_range (array, idx);
2183 XCHAR_TABLE (array)->contents[idxval] = newelt;
2184 }
2185 else
2186 {
2187 int code[4], i;
2188 Lisp_Object val;
2189
2190 SPLIT_CHAR (idxval, code[0], code[1], code[2]);
2191 if (code[1] < 32) code[1] = -1;
2192 else if (code[2] < 32) code[2] = -1;
2193
2194 /* See the comment of the corresponding part in Faref. */
2195 code[0] += 128;
2196 code[3] = -1; /* anchor */
2197 for (i = 0; code[i + 1] >= 0; i++)
2198 {
2199 val = XCHAR_TABLE (array)->contents[code[i]];
2200 if (SUB_CHAR_TABLE_P (val))
2201 array = val;
2202 else
2203 {
2204 Lisp_Object temp;
2205
2206 /* VAL is a leaf. Create a sub char table with the
2207 initial value VAL and look into it. */
2208
2209 temp = make_sub_char_table (val);
2210 XCHAR_TABLE (array)->contents[code[i]] = temp;
2211 array = temp;
2212 }
2213 }
2214 XCHAR_TABLE (array)->contents[code[i]] = newelt;
2215 }
2216 }
2217 else if (STRING_MULTIBYTE (array))
2218 {
2219 int idxval_byte, prev_bytes, new_bytes, nbytes;
2220 unsigned char workbuf[MAX_MULTIBYTE_LENGTH], *p0 = workbuf, *p1;
2221
2222 if (idxval < 0 || idxval >= SCHARS (array))
2223 args_out_of_range (array, idx);
2224 CHECK_NUMBER (newelt);
2225
2226 nbytes = SBYTES (array);
2227
2228 idxval_byte = string_char_to_byte (array, idxval);
2229 p1 = SDATA (array) + idxval_byte;
2230 PARSE_MULTIBYTE_SEQ (p1, nbytes - idxval_byte, prev_bytes);
2231 new_bytes = CHAR_STRING (XINT (newelt), p0);
2232 if (prev_bytes != new_bytes)
2233 {
2234 /* We must relocate the string data. */
2235 int nchars = SCHARS (array);
2236 unsigned char *str;
2237 USE_SAFE_ALLOCA;
2238
2239 SAFE_ALLOCA (str, unsigned char *, nbytes);
2240 bcopy (SDATA (array), str, nbytes);
2241 allocate_string_data (XSTRING (array), nchars,
2242 nbytes + new_bytes - prev_bytes);
2243 bcopy (str, SDATA (array), idxval_byte);
2244 p1 = SDATA (array) + idxval_byte;
2245 bcopy (str + idxval_byte + prev_bytes, p1 + new_bytes,
2246 nbytes - (idxval_byte + prev_bytes));
2247 SAFE_FREE ();
2248 clear_string_char_byte_cache ();
2249 }
2250 while (new_bytes--)
2251 *p1++ = *p0++;
2252 }
2253 else
2254 {
2255 if (idxval < 0 || idxval >= SCHARS (array))
2256 args_out_of_range (array, idx);
2257 CHECK_NUMBER (newelt);
2258
2259 if (XINT (newelt) < 0 || SINGLE_BYTE_CHAR_P (XINT (newelt)))
2260 SSET (array, idxval, XINT (newelt));
2261 else
2262 {
2263 /* We must relocate the string data while converting it to
2264 multibyte. */
2265 int idxval_byte, prev_bytes, new_bytes;
2266 unsigned char workbuf[MAX_MULTIBYTE_LENGTH], *p0 = workbuf, *p1;
2267 unsigned char *origstr = SDATA (array), *str;
2268 int nchars, nbytes;
2269 USE_SAFE_ALLOCA;
2270
2271 nchars = SCHARS (array);
2272 nbytes = idxval_byte = count_size_as_multibyte (origstr, idxval);
2273 nbytes += count_size_as_multibyte (origstr + idxval,
2274 nchars - idxval);
2275 SAFE_ALLOCA (str, unsigned char *, nbytes);
2276 copy_text (SDATA (array), str, nchars, 0, 1);
2277 PARSE_MULTIBYTE_SEQ (str + idxval_byte, nbytes - idxval_byte,
2278 prev_bytes);
2279 new_bytes = CHAR_STRING (XINT (newelt), p0);
2280 allocate_string_data (XSTRING (array), nchars,
2281 nbytes + new_bytes - prev_bytes);
2282 bcopy (str, SDATA (array), idxval_byte);
2283 p1 = SDATA (array) + idxval_byte;
2284 while (new_bytes--)
2285 *p1++ = *p0++;
2286 bcopy (str + idxval_byte + prev_bytes, p1,
2287 nbytes - (idxval_byte + prev_bytes));
2288 SAFE_FREE ();
2289 clear_string_char_byte_cache ();
2290 }
2291 }
2292
2293 return newelt;
2294 }
2295 \f
2296 /* Arithmetic functions */
2297
2298 enum comparison { equal, notequal, less, grtr, less_or_equal, grtr_or_equal };
2299
2300 Lisp_Object
2301 arithcompare (num1, num2, comparison)
2302 Lisp_Object num1, num2;
2303 enum comparison comparison;
2304 {
2305 double f1 = 0, f2 = 0;
2306 int floatp = 0;
2307
2308 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num1);
2309 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num2);
2310
2311 if (FLOATP (num1) || FLOATP (num2))
2312 {
2313 floatp = 1;
2314 f1 = (FLOATP (num1)) ? XFLOAT_DATA (num1) : XINT (num1);
2315 f2 = (FLOATP (num2)) ? XFLOAT_DATA (num2) : XINT (num2);
2316 }
2317
2318 switch (comparison)
2319 {
2320 case equal:
2321 if (floatp ? f1 == f2 : XINT (num1) == XINT (num2))
2322 return Qt;
2323 return Qnil;
2324
2325 case notequal:
2326 if (floatp ? f1 != f2 : XINT (num1) != XINT (num2))
2327 return Qt;
2328 return Qnil;
2329
2330 case less:
2331 if (floatp ? f1 < f2 : XINT (num1) < XINT (num2))
2332 return Qt;
2333 return Qnil;
2334
2335 case less_or_equal:
2336 if (floatp ? f1 <= f2 : XINT (num1) <= XINT (num2))
2337 return Qt;
2338 return Qnil;
2339
2340 case grtr:
2341 if (floatp ? f1 > f2 : XINT (num1) > XINT (num2))
2342 return Qt;
2343 return Qnil;
2344
2345 case grtr_or_equal:
2346 if (floatp ? f1 >= f2 : XINT (num1) >= XINT (num2))
2347 return Qt;
2348 return Qnil;
2349
2350 default:
2351 abort ();
2352 }
2353 }
2354
2355 DEFUN ("=", Feqlsign, Seqlsign, 2, 2, 0,
2356 doc: /* Return t if two args, both numbers or markers, are equal. */)
2357 (num1, num2)
2358 register Lisp_Object num1, num2;
2359 {
2360 return arithcompare (num1, num2, equal);
2361 }
2362
2363 DEFUN ("<", Flss, Slss, 2, 2, 0,
2364 doc: /* Return t if first arg is less than second arg. Both must be numbers or markers. */)
2365 (num1, num2)
2366 register Lisp_Object num1, num2;
2367 {
2368 return arithcompare (num1, num2, less);
2369 }
2370
2371 DEFUN (">", Fgtr, Sgtr, 2, 2, 0,
2372 doc: /* Return t if first arg is greater than second arg. Both must be numbers or markers. */)
2373 (num1, num2)
2374 register Lisp_Object num1, num2;
2375 {
2376 return arithcompare (num1, num2, grtr);
2377 }
2378
2379 DEFUN ("<=", Fleq, Sleq, 2, 2, 0,
2380 doc: /* Return t if first arg is less than or equal to second arg.
2381 Both must be numbers or markers. */)
2382 (num1, num2)
2383 register Lisp_Object num1, num2;
2384 {
2385 return arithcompare (num1, num2, less_or_equal);
2386 }
2387
2388 DEFUN (">=", Fgeq, Sgeq, 2, 2, 0,
2389 doc: /* Return t if first arg is greater than or equal to second arg.
2390 Both must be numbers or markers. */)
2391 (num1, num2)
2392 register Lisp_Object num1, num2;
2393 {
2394 return arithcompare (num1, num2, grtr_or_equal);
2395 }
2396
2397 DEFUN ("/=", Fneq, Sneq, 2, 2, 0,
2398 doc: /* Return t if first arg is not equal to second arg. Both must be numbers or markers. */)
2399 (num1, num2)
2400 register Lisp_Object num1, num2;
2401 {
2402 return arithcompare (num1, num2, notequal);
2403 }
2404
2405 DEFUN ("zerop", Fzerop, Szerop, 1, 1, 0,
2406 doc: /* Return t if NUMBER is zero. */)
2407 (number)
2408 register Lisp_Object number;
2409 {
2410 CHECK_NUMBER_OR_FLOAT (number);
2411
2412 if (FLOATP (number))
2413 {
2414 if (XFLOAT_DATA (number) == 0.0)
2415 return Qt;
2416 return Qnil;
2417 }
2418
2419 if (!XINT (number))
2420 return Qt;
2421 return Qnil;
2422 }
2423 \f
2424 /* Convert between long values and pairs of Lisp integers.
2425 Note that long_to_cons returns a single Lisp integer
2426 when the value fits in one. */
2427
2428 Lisp_Object
2429 long_to_cons (i)
2430 unsigned long i;
2431 {
2432 unsigned long top = i >> 16;
2433 unsigned int bot = i & 0xFFFF;
2434 if (top == 0)
2435 return make_number (bot);
2436 if (top == (unsigned long)-1 >> 16)
2437 return Fcons (make_number (-1), make_number (bot));
2438 return Fcons (make_number (top), make_number (bot));
2439 }
2440
2441 unsigned long
2442 cons_to_long (c)
2443 Lisp_Object c;
2444 {
2445 Lisp_Object top, bot;
2446 if (INTEGERP (c))
2447 return XINT (c);
2448 top = XCAR (c);
2449 bot = XCDR (c);
2450 if (CONSP (bot))
2451 bot = XCAR (bot);
2452 return ((XINT (top) << 16) | XINT (bot));
2453 }
2454 \f
2455 DEFUN ("number-to-string", Fnumber_to_string, Snumber_to_string, 1, 1, 0,
2456 doc: /* Return the decimal representation of NUMBER as a string.
2457 Uses a minus sign if negative.
2458 NUMBER may be an integer or a floating point number. */)
2459 (number)
2460 Lisp_Object number;
2461 {
2462 char buffer[VALBITS];
2463
2464 CHECK_NUMBER_OR_FLOAT (number);
2465
2466 if (FLOATP (number))
2467 {
2468 char pigbuf[350]; /* see comments in float_to_string */
2469
2470 float_to_string (pigbuf, XFLOAT_DATA (number));
2471 return build_string (pigbuf);
2472 }
2473
2474 if (sizeof (int) == sizeof (EMACS_INT))
2475 sprintf (buffer, "%d", XINT (number));
2476 else if (sizeof (long) == sizeof (EMACS_INT))
2477 sprintf (buffer, "%ld", (long) XINT (number));
2478 else
2479 abort ();
2480 return build_string (buffer);
2481 }
2482
2483 INLINE static int
2484 digit_to_number (character, base)
2485 int character, base;
2486 {
2487 int digit;
2488
2489 if (character >= '0' && character <= '9')
2490 digit = character - '0';
2491 else if (character >= 'a' && character <= 'z')
2492 digit = character - 'a' + 10;
2493 else if (character >= 'A' && character <= 'Z')
2494 digit = character - 'A' + 10;
2495 else
2496 return -1;
2497
2498 if (digit >= base)
2499 return -1;
2500 else
2501 return digit;
2502 }
2503
2504 DEFUN ("string-to-number", Fstring_to_number, Sstring_to_number, 1, 2, 0,
2505 doc: /* Parse STRING as a decimal number and return the number.
2506 This parses both integers and floating point numbers.
2507 It ignores leading spaces and tabs.
2508
2509 If BASE, interpret STRING as a number in that base. If BASE isn't
2510 present, base 10 is used. BASE must be between 2 and 16 (inclusive).
2511 If the base used is not 10, floating point is not recognized. */)
2512 (string, base)
2513 register Lisp_Object string, base;
2514 {
2515 register unsigned char *p;
2516 register int b;
2517 int sign = 1;
2518 Lisp_Object val;
2519
2520 CHECK_STRING (string);
2521
2522 if (NILP (base))
2523 b = 10;
2524 else
2525 {
2526 CHECK_NUMBER (base);
2527 b = XINT (base);
2528 if (b < 2 || b > 16)
2529 xsignal1 (Qargs_out_of_range, base);
2530 }
2531
2532 /* Skip any whitespace at the front of the number. Some versions of
2533 atoi do this anyway, so we might as well make Emacs lisp consistent. */
2534 p = SDATA (string);
2535 while (*p == ' ' || *p == '\t')
2536 p++;
2537
2538 if (*p == '-')
2539 {
2540 sign = -1;
2541 p++;
2542 }
2543 else if (*p == '+')
2544 p++;
2545
2546 if (isfloat_string (p) && b == 10)
2547 val = make_float (sign * atof (p));
2548 else
2549 {
2550 double v = 0;
2551
2552 while (1)
2553 {
2554 int digit = digit_to_number (*p++, b);
2555 if (digit < 0)
2556 break;
2557 v = v * b + digit;
2558 }
2559
2560 val = make_fixnum_or_float (sign * v);
2561 }
2562
2563 return val;
2564 }
2565
2566 \f
2567 enum arithop
2568 {
2569 Aadd,
2570 Asub,
2571 Amult,
2572 Adiv,
2573 Alogand,
2574 Alogior,
2575 Alogxor,
2576 Amax,
2577 Amin
2578 };
2579
2580 static Lisp_Object float_arith_driver P_ ((double, int, enum arithop,
2581 int, Lisp_Object *));
2582 extern Lisp_Object fmod_float ();
2583
2584 Lisp_Object
2585 arith_driver (code, nargs, args)
2586 enum arithop code;
2587 int nargs;
2588 register Lisp_Object *args;
2589 {
2590 register Lisp_Object val;
2591 register int argnum;
2592 register EMACS_INT accum = 0;
2593 register EMACS_INT next;
2594
2595 switch (SWITCH_ENUM_CAST (code))
2596 {
2597 case Alogior:
2598 case Alogxor:
2599 case Aadd:
2600 case Asub:
2601 accum = 0;
2602 break;
2603 case Amult:
2604 accum = 1;
2605 break;
2606 case Alogand:
2607 accum = -1;
2608 break;
2609 default:
2610 break;
2611 }
2612
2613 for (argnum = 0; argnum < nargs; argnum++)
2614 {
2615 /* Using args[argnum] as argument to CHECK_NUMBER_... */
2616 val = args[argnum];
2617 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val);
2618
2619 if (FLOATP (val))
2620 return float_arith_driver ((double) accum, argnum, code,
2621 nargs, args);
2622 args[argnum] = val;
2623 next = XINT (args[argnum]);
2624 switch (SWITCH_ENUM_CAST (code))
2625 {
2626 case Aadd:
2627 accum += next;
2628 break;
2629 case Asub:
2630 accum = argnum ? accum - next : nargs == 1 ? - next : next;
2631 break;
2632 case Amult:
2633 accum *= next;
2634 break;
2635 case Adiv:
2636 if (!argnum)
2637 accum = next;
2638 else
2639 {
2640 if (next == 0)
2641 xsignal0 (Qarith_error);
2642 accum /= next;
2643 }
2644 break;
2645 case Alogand:
2646 accum &= next;
2647 break;
2648 case Alogior:
2649 accum |= next;
2650 break;
2651 case Alogxor:
2652 accum ^= next;
2653 break;
2654 case Amax:
2655 if (!argnum || next > accum)
2656 accum = next;
2657 break;
2658 case Amin:
2659 if (!argnum || next < accum)
2660 accum = next;
2661 break;
2662 }
2663 }
2664
2665 XSETINT (val, accum);
2666 return val;
2667 }
2668
2669 #undef isnan
2670 #define isnan(x) ((x) != (x))
2671
2672 static Lisp_Object
2673 float_arith_driver (accum, argnum, code, nargs, args)
2674 double accum;
2675 register int argnum;
2676 enum arithop code;
2677 int nargs;
2678 register Lisp_Object *args;
2679 {
2680 register Lisp_Object val;
2681 double next;
2682
2683 for (; argnum < nargs; argnum++)
2684 {
2685 val = args[argnum]; /* using args[argnum] as argument to CHECK_NUMBER_... */
2686 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val);
2687
2688 if (FLOATP (val))
2689 {
2690 next = XFLOAT_DATA (val);
2691 }
2692 else
2693 {
2694 args[argnum] = val; /* runs into a compiler bug. */
2695 next = XINT (args[argnum]);
2696 }
2697 switch (SWITCH_ENUM_CAST (code))
2698 {
2699 case Aadd:
2700 accum += next;
2701 break;
2702 case Asub:
2703 accum = argnum ? accum - next : nargs == 1 ? - next : next;
2704 break;
2705 case Amult:
2706 accum *= next;
2707 break;
2708 case Adiv:
2709 if (!argnum)
2710 accum = next;
2711 else
2712 {
2713 if (! IEEE_FLOATING_POINT && next == 0)
2714 xsignal0 (Qarith_error);
2715 accum /= next;
2716 }
2717 break;
2718 case Alogand:
2719 case Alogior:
2720 case Alogxor:
2721 return wrong_type_argument (Qinteger_or_marker_p, val);
2722 case Amax:
2723 if (!argnum || isnan (next) || next > accum)
2724 accum = next;
2725 break;
2726 case Amin:
2727 if (!argnum || isnan (next) || next < accum)
2728 accum = next;
2729 break;
2730 }
2731 }
2732
2733 return make_float (accum);
2734 }
2735
2736
2737 DEFUN ("+", Fplus, Splus, 0, MANY, 0,
2738 doc: /* Return sum of any number of arguments, which are numbers or markers.
2739 usage: (+ &rest NUMBERS-OR-MARKERS) */)
2740 (nargs, args)
2741 int nargs;
2742 Lisp_Object *args;
2743 {
2744 return arith_driver (Aadd, nargs, args);
2745 }
2746
2747 DEFUN ("-", Fminus, Sminus, 0, MANY, 0,
2748 doc: /* Negate number or subtract numbers or markers and return the result.
2749 With one arg, negates it. With more than one arg,
2750 subtracts all but the first from the first.
2751 usage: (- &optional NUMBER-OR-MARKER &rest MORE-NUMBERS-OR-MARKERS) */)
2752 (nargs, args)
2753 int nargs;
2754 Lisp_Object *args;
2755 {
2756 return arith_driver (Asub, nargs, args);
2757 }
2758
2759 DEFUN ("*", Ftimes, Stimes, 0, MANY, 0,
2760 doc: /* Return product of any number of arguments, which are numbers or markers.
2761 usage: (* &rest NUMBERS-OR-MARKERS) */)
2762 (nargs, args)
2763 int nargs;
2764 Lisp_Object *args;
2765 {
2766 return arith_driver (Amult, nargs, args);
2767 }
2768
2769 DEFUN ("/", Fquo, Squo, 2, MANY, 0,
2770 doc: /* Return first argument divided by all the remaining arguments.
2771 The arguments must be numbers or markers.
2772 usage: (/ DIVIDEND DIVISOR &rest DIVISORS) */)
2773 (nargs, args)
2774 int nargs;
2775 Lisp_Object *args;
2776 {
2777 int argnum;
2778 for (argnum = 2; argnum < nargs; argnum++)
2779 if (FLOATP (args[argnum]))
2780 return float_arith_driver (0, 0, Adiv, nargs, args);
2781 return arith_driver (Adiv, nargs, args);
2782 }
2783
2784 DEFUN ("%", Frem, Srem, 2, 2, 0,
2785 doc: /* Return remainder of X divided by Y.
2786 Both must be integers or markers. */)
2787 (x, y)
2788 register Lisp_Object x, y;
2789 {
2790 Lisp_Object val;
2791
2792 CHECK_NUMBER_COERCE_MARKER (x);
2793 CHECK_NUMBER_COERCE_MARKER (y);
2794
2795 if (XFASTINT (y) == 0)
2796 xsignal0 (Qarith_error);
2797
2798 XSETINT (val, XINT (x) % XINT (y));
2799 return val;
2800 }
2801
2802 #ifndef HAVE_FMOD
2803 double
2804 fmod (f1, f2)
2805 double f1, f2;
2806 {
2807 double r = f1;
2808
2809 if (f2 < 0.0)
2810 f2 = -f2;
2811
2812 /* If the magnitude of the result exceeds that of the divisor, or
2813 the sign of the result does not agree with that of the dividend,
2814 iterate with the reduced value. This does not yield a
2815 particularly accurate result, but at least it will be in the
2816 range promised by fmod. */
2817 do
2818 r -= f2 * floor (r / f2);
2819 while (f2 <= (r < 0 ? -r : r) || ((r < 0) != (f1 < 0) && ! isnan (r)));
2820
2821 return r;
2822 }
2823 #endif /* ! HAVE_FMOD */
2824
2825 DEFUN ("mod", Fmod, Smod, 2, 2, 0,
2826 doc: /* Return X modulo Y.
2827 The result falls between zero (inclusive) and Y (exclusive).
2828 Both X and Y must be numbers or markers. */)
2829 (x, y)
2830 register Lisp_Object x, y;
2831 {
2832 Lisp_Object val;
2833 EMACS_INT i1, i2;
2834
2835 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (x);
2836 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (y);
2837
2838 if (FLOATP (x) || FLOATP (y))
2839 return fmod_float (x, y);
2840
2841 i1 = XINT (x);
2842 i2 = XINT (y);
2843
2844 if (i2 == 0)
2845 xsignal0 (Qarith_error);
2846
2847 i1 %= i2;
2848
2849 /* If the "remainder" comes out with the wrong sign, fix it. */
2850 if (i2 < 0 ? i1 > 0 : i1 < 0)
2851 i1 += i2;
2852
2853 XSETINT (val, i1);
2854 return val;
2855 }
2856
2857 DEFUN ("max", Fmax, Smax, 1, MANY, 0,
2858 doc: /* Return largest of all the arguments (which must be numbers or markers).
2859 The value is always a number; markers are converted to numbers.
2860 usage: (max NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */)
2861 (nargs, args)
2862 int nargs;
2863 Lisp_Object *args;
2864 {
2865 return arith_driver (Amax, nargs, args);
2866 }
2867
2868 DEFUN ("min", Fmin, Smin, 1, MANY, 0,
2869 doc: /* Return smallest of all the arguments (which must be numbers or markers).
2870 The value is always a number; markers are converted to numbers.
2871 usage: (min NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */)
2872 (nargs, args)
2873 int nargs;
2874 Lisp_Object *args;
2875 {
2876 return arith_driver (Amin, nargs, args);
2877 }
2878
2879 DEFUN ("logand", Flogand, Slogand, 0, MANY, 0,
2880 doc: /* Return bitwise-and of all the arguments.
2881 Arguments may be integers, or markers converted to integers.
2882 usage: (logand &rest INTS-OR-MARKERS) */)
2883 (nargs, args)
2884 int nargs;
2885 Lisp_Object *args;
2886 {
2887 return arith_driver (Alogand, nargs, args);
2888 }
2889
2890 DEFUN ("logior", Flogior, Slogior, 0, MANY, 0,
2891 doc: /* Return bitwise-or of all the arguments.
2892 Arguments may be integers, or markers converted to integers.
2893 usage: (logior &rest INTS-OR-MARKERS) */)
2894 (nargs, args)
2895 int nargs;
2896 Lisp_Object *args;
2897 {
2898 return arith_driver (Alogior, nargs, args);
2899 }
2900
2901 DEFUN ("logxor", Flogxor, Slogxor, 0, MANY, 0,
2902 doc: /* Return bitwise-exclusive-or of all the arguments.
2903 Arguments may be integers, or markers converted to integers.
2904 usage: (logxor &rest INTS-OR-MARKERS) */)
2905 (nargs, args)
2906 int nargs;
2907 Lisp_Object *args;
2908 {
2909 return arith_driver (Alogxor, nargs, args);
2910 }
2911
2912 DEFUN ("ash", Fash, Sash, 2, 2, 0,
2913 doc: /* Return VALUE with its bits shifted left by COUNT.
2914 If COUNT is negative, shifting is actually to the right.
2915 In this case, the sign bit is duplicated. */)
2916 (value, count)
2917 register Lisp_Object value, count;
2918 {
2919 register Lisp_Object val;
2920
2921 CHECK_NUMBER (value);
2922 CHECK_NUMBER (count);
2923
2924 if (XINT (count) >= BITS_PER_EMACS_INT)
2925 XSETINT (val, 0);
2926 else if (XINT (count) > 0)
2927 XSETINT (val, XINT (value) << XFASTINT (count));
2928 else if (XINT (count) <= -BITS_PER_EMACS_INT)
2929 XSETINT (val, XINT (value) < 0 ? -1 : 0);
2930 else
2931 XSETINT (val, XINT (value) >> -XINT (count));
2932 return val;
2933 }
2934
2935 DEFUN ("lsh", Flsh, Slsh, 2, 2, 0,
2936 doc: /* Return VALUE with its bits shifted left by COUNT.
2937 If COUNT is negative, shifting is actually to the right.
2938 In this case, zeros are shifted in on the left. */)
2939 (value, count)
2940 register Lisp_Object value, count;
2941 {
2942 register Lisp_Object val;
2943
2944 CHECK_NUMBER (value);
2945 CHECK_NUMBER (count);
2946
2947 if (XINT (count) >= BITS_PER_EMACS_INT)
2948 XSETINT (val, 0);
2949 else if (XINT (count) > 0)
2950 XSETINT (val, (EMACS_UINT) XUINT (value) << XFASTINT (count));
2951 else if (XINT (count) <= -BITS_PER_EMACS_INT)
2952 XSETINT (val, 0);
2953 else
2954 XSETINT (val, (EMACS_UINT) XUINT (value) >> -XINT (count));
2955 return val;
2956 }
2957
2958 DEFUN ("1+", Fadd1, Sadd1, 1, 1, 0,
2959 doc: /* Return NUMBER plus one. NUMBER may be a number or a marker.
2960 Markers are converted to integers. */)
2961 (number)
2962 register Lisp_Object number;
2963 {
2964 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number);
2965
2966 if (FLOATP (number))
2967 return (make_float (1.0 + XFLOAT_DATA (number)));
2968
2969 XSETINT (number, XINT (number) + 1);
2970 return number;
2971 }
2972
2973 DEFUN ("1-", Fsub1, Ssub1, 1, 1, 0,
2974 doc: /* Return NUMBER minus one. NUMBER may be a number or a marker.
2975 Markers are converted to integers. */)
2976 (number)
2977 register Lisp_Object number;
2978 {
2979 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number);
2980
2981 if (FLOATP (number))
2982 return (make_float (-1.0 + XFLOAT_DATA (number)));
2983
2984 XSETINT (number, XINT (number) - 1);
2985 return number;
2986 }
2987
2988 DEFUN ("lognot", Flognot, Slognot, 1, 1, 0,
2989 doc: /* Return the bitwise complement of NUMBER. NUMBER must be an integer. */)
2990 (number)
2991 register Lisp_Object number;
2992 {
2993 CHECK_NUMBER (number);
2994 XSETINT (number, ~XINT (number));
2995 return number;
2996 }
2997
2998 DEFUN ("byteorder", Fbyteorder, Sbyteorder, 0, 0, 0,
2999 doc: /* Return the byteorder for the machine.
3000 Returns 66 (ASCII uppercase B) for big endian machines or 108 (ASCII
3001 lowercase l) for small endian machines. */)
3002 ()
3003 {
3004 unsigned i = 0x04030201;
3005 int order = *(char *)&i == 1 ? 108 : 66;
3006
3007 return make_number (order);
3008 }
3009
3010
3011 \f
3012 void
3013 syms_of_data ()
3014 {
3015 Lisp_Object error_tail, arith_tail;
3016
3017 Qquote = intern ("quote");
3018 Qlambda = intern ("lambda");
3019 Qsubr = intern ("subr");
3020 Qerror_conditions = intern ("error-conditions");
3021 Qerror_message = intern ("error-message");
3022 Qtop_level = intern ("top-level");
3023
3024 Qerror = intern ("error");
3025 Qquit = intern ("quit");
3026 Qwrong_type_argument = intern ("wrong-type-argument");
3027 Qargs_out_of_range = intern ("args-out-of-range");
3028 Qvoid_function = intern ("void-function");
3029 Qcyclic_function_indirection = intern ("cyclic-function-indirection");
3030 Qcyclic_variable_indirection = intern ("cyclic-variable-indirection");
3031 Qvoid_variable = intern ("void-variable");
3032 Qsetting_constant = intern ("setting-constant");
3033 Qinvalid_read_syntax = intern ("invalid-read-syntax");
3034
3035 Qinvalid_function = intern ("invalid-function");
3036 Qwrong_number_of_arguments = intern ("wrong-number-of-arguments");
3037 Qno_catch = intern ("no-catch");
3038 Qend_of_file = intern ("end-of-file");
3039 Qarith_error = intern ("arith-error");
3040 Qbeginning_of_buffer = intern ("beginning-of-buffer");
3041 Qend_of_buffer = intern ("end-of-buffer");
3042 Qbuffer_read_only = intern ("buffer-read-only");
3043 Qtext_read_only = intern ("text-read-only");
3044 Qmark_inactive = intern ("mark-inactive");
3045
3046 Qlistp = intern ("listp");
3047 Qconsp = intern ("consp");
3048 Qsymbolp = intern ("symbolp");
3049 Qkeywordp = intern ("keywordp");
3050 Qintegerp = intern ("integerp");
3051 Qnatnump = intern ("natnump");
3052 Qwholenump = intern ("wholenump");
3053 Qstringp = intern ("stringp");
3054 Qarrayp = intern ("arrayp");
3055 Qsequencep = intern ("sequencep");
3056 Qbufferp = intern ("bufferp");
3057 Qvectorp = intern ("vectorp");
3058 Qchar_or_string_p = intern ("char-or-string-p");
3059 Qmarkerp = intern ("markerp");
3060 Qbuffer_or_string_p = intern ("buffer-or-string-p");
3061 Qinteger_or_marker_p = intern ("integer-or-marker-p");
3062 Qboundp = intern ("boundp");
3063 Qfboundp = intern ("fboundp");
3064
3065 Qfloatp = intern ("floatp");
3066 Qnumberp = intern ("numberp");
3067 Qnumber_or_marker_p = intern ("number-or-marker-p");
3068
3069 Qchar_table_p = intern ("char-table-p");
3070 Qvector_or_char_table_p = intern ("vector-or-char-table-p");
3071
3072 Qsubrp = intern ("subrp");
3073 Qunevalled = intern ("unevalled");
3074 Qmany = intern ("many");
3075
3076 Qcdr = intern ("cdr");
3077
3078 /* Handle automatic advice activation */
3079 Qad_advice_info = intern ("ad-advice-info");
3080 Qad_activate_internal = intern ("ad-activate-internal");
3081
3082 error_tail = Fcons (Qerror, Qnil);
3083
3084 /* ERROR is used as a signaler for random errors for which nothing else is right */
3085
3086 Fput (Qerror, Qerror_conditions,
3087 error_tail);
3088 Fput (Qerror, Qerror_message,
3089 build_string ("error"));
3090
3091 Fput (Qquit, Qerror_conditions,
3092 Fcons (Qquit, Qnil));
3093 Fput (Qquit, Qerror_message,
3094 build_string ("Quit"));
3095
3096 Fput (Qwrong_type_argument, Qerror_conditions,
3097 Fcons (Qwrong_type_argument, error_tail));
3098 Fput (Qwrong_type_argument, Qerror_message,
3099 build_string ("Wrong type argument"));
3100
3101 Fput (Qargs_out_of_range, Qerror_conditions,
3102 Fcons (Qargs_out_of_range, error_tail));
3103 Fput (Qargs_out_of_range, Qerror_message,
3104 build_string ("Args out of range"));
3105
3106 Fput (Qvoid_function, Qerror_conditions,
3107 Fcons (Qvoid_function, error_tail));
3108 Fput (Qvoid_function, Qerror_message,
3109 build_string ("Symbol's function definition is void"));
3110
3111 Fput (Qcyclic_function_indirection, Qerror_conditions,
3112 Fcons (Qcyclic_function_indirection, error_tail));
3113 Fput (Qcyclic_function_indirection, Qerror_message,
3114 build_string ("Symbol's chain of function indirections contains a loop"));
3115
3116 Fput (Qcyclic_variable_indirection, Qerror_conditions,
3117 Fcons (Qcyclic_variable_indirection, error_tail));
3118 Fput (Qcyclic_variable_indirection, Qerror_message,
3119 build_string ("Symbol's chain of variable indirections contains a loop"));
3120
3121 Qcircular_list = intern ("circular-list");
3122 staticpro (&Qcircular_list);
3123 Fput (Qcircular_list, Qerror_conditions,
3124 Fcons (Qcircular_list, error_tail));
3125 Fput (Qcircular_list, Qerror_message,
3126 build_string ("List contains a loop"));
3127
3128 Fput (Qvoid_variable, Qerror_conditions,
3129 Fcons (Qvoid_variable, error_tail));
3130 Fput (Qvoid_variable, Qerror_message,
3131 build_string ("Symbol's value as variable is void"));
3132
3133 Fput (Qsetting_constant, Qerror_conditions,
3134 Fcons (Qsetting_constant, error_tail));
3135 Fput (Qsetting_constant, Qerror_message,
3136 build_string ("Attempt to set a constant symbol"));
3137
3138 Fput (Qinvalid_read_syntax, Qerror_conditions,
3139 Fcons (Qinvalid_read_syntax, error_tail));
3140 Fput (Qinvalid_read_syntax, Qerror_message,
3141 build_string ("Invalid read syntax"));
3142
3143 Fput (Qinvalid_function, Qerror_conditions,
3144 Fcons (Qinvalid_function, error_tail));
3145 Fput (Qinvalid_function, Qerror_message,
3146 build_string ("Invalid function"));
3147
3148 Fput (Qwrong_number_of_arguments, Qerror_conditions,
3149 Fcons (Qwrong_number_of_arguments, error_tail));
3150 Fput (Qwrong_number_of_arguments, Qerror_message,
3151 build_string ("Wrong number of arguments"));
3152
3153 Fput (Qno_catch, Qerror_conditions,
3154 Fcons (Qno_catch, error_tail));
3155 Fput (Qno_catch, Qerror_message,
3156 build_string ("No catch for tag"));
3157
3158 Fput (Qend_of_file, Qerror_conditions,
3159 Fcons (Qend_of_file, error_tail));
3160 Fput (Qend_of_file, Qerror_message,
3161 build_string ("End of file during parsing"));
3162
3163 arith_tail = Fcons (Qarith_error, error_tail);
3164 Fput (Qarith_error, Qerror_conditions,
3165 arith_tail);
3166 Fput (Qarith_error, Qerror_message,
3167 build_string ("Arithmetic error"));
3168
3169 Fput (Qbeginning_of_buffer, Qerror_conditions,
3170 Fcons (Qbeginning_of_buffer, error_tail));
3171 Fput (Qbeginning_of_buffer, Qerror_message,
3172 build_string ("Beginning of buffer"));
3173
3174 Fput (Qend_of_buffer, Qerror_conditions,
3175 Fcons (Qend_of_buffer, error_tail));
3176 Fput (Qend_of_buffer, Qerror_message,
3177 build_string ("End of buffer"));
3178
3179 Fput (Qbuffer_read_only, Qerror_conditions,
3180 Fcons (Qbuffer_read_only, error_tail));
3181 Fput (Qbuffer_read_only, Qerror_message,
3182 build_string ("Buffer is read-only"));
3183
3184 Fput (Qtext_read_only, Qerror_conditions,
3185 Fcons (Qtext_read_only, error_tail));
3186 Fput (Qtext_read_only, Qerror_message,
3187 build_string ("Text is read-only"));
3188
3189 Qrange_error = intern ("range-error");
3190 Qdomain_error = intern ("domain-error");
3191 Qsingularity_error = intern ("singularity-error");
3192 Qoverflow_error = intern ("overflow-error");
3193 Qunderflow_error = intern ("underflow-error");
3194
3195 Fput (Qdomain_error, Qerror_conditions,
3196 Fcons (Qdomain_error, arith_tail));
3197 Fput (Qdomain_error, Qerror_message,
3198 build_string ("Arithmetic domain error"));
3199
3200 Fput (Qrange_error, Qerror_conditions,
3201 Fcons (Qrange_error, arith_tail));
3202 Fput (Qrange_error, Qerror_message,
3203 build_string ("Arithmetic range error"));
3204
3205 Fput (Qsingularity_error, Qerror_conditions,
3206 Fcons (Qsingularity_error, Fcons (Qdomain_error, arith_tail)));
3207 Fput (Qsingularity_error, Qerror_message,
3208 build_string ("Arithmetic singularity error"));
3209
3210 Fput (Qoverflow_error, Qerror_conditions,
3211 Fcons (Qoverflow_error, Fcons (Qdomain_error, arith_tail)));
3212 Fput (Qoverflow_error, Qerror_message,
3213 build_string ("Arithmetic overflow error"));
3214
3215 Fput (Qunderflow_error, Qerror_conditions,
3216 Fcons (Qunderflow_error, Fcons (Qdomain_error, arith_tail)));
3217 Fput (Qunderflow_error, Qerror_message,
3218 build_string ("Arithmetic underflow error"));
3219
3220 staticpro (&Qrange_error);
3221 staticpro (&Qdomain_error);
3222 staticpro (&Qsingularity_error);
3223 staticpro (&Qoverflow_error);
3224 staticpro (&Qunderflow_error);
3225
3226 staticpro (&Qnil);
3227 staticpro (&Qt);
3228 staticpro (&Qquote);
3229 staticpro (&Qlambda);
3230 staticpro (&Qsubr);
3231 staticpro (&Qunbound);
3232 staticpro (&Qerror_conditions);
3233 staticpro (&Qerror_message);
3234 staticpro (&Qtop_level);
3235
3236 staticpro (&Qerror);
3237 staticpro (&Qquit);
3238 staticpro (&Qwrong_type_argument);
3239 staticpro (&Qargs_out_of_range);
3240 staticpro (&Qvoid_function);
3241 staticpro (&Qcyclic_function_indirection);
3242 staticpro (&Qcyclic_variable_indirection);
3243 staticpro (&Qvoid_variable);
3244 staticpro (&Qsetting_constant);
3245 staticpro (&Qinvalid_read_syntax);
3246 staticpro (&Qwrong_number_of_arguments);
3247 staticpro (&Qinvalid_function);
3248 staticpro (&Qno_catch);
3249 staticpro (&Qend_of_file);
3250 staticpro (&Qarith_error);
3251 staticpro (&Qbeginning_of_buffer);
3252 staticpro (&Qend_of_buffer);
3253 staticpro (&Qbuffer_read_only);
3254 staticpro (&Qtext_read_only);
3255 staticpro (&Qmark_inactive);
3256
3257 staticpro (&Qlistp);
3258 staticpro (&Qconsp);
3259 staticpro (&Qsymbolp);
3260 staticpro (&Qkeywordp);
3261 staticpro (&Qintegerp);
3262 staticpro (&Qnatnump);
3263 staticpro (&Qwholenump);
3264 staticpro (&Qstringp);
3265 staticpro (&Qarrayp);
3266 staticpro (&Qsequencep);
3267 staticpro (&Qbufferp);
3268 staticpro (&Qvectorp);
3269 staticpro (&Qchar_or_string_p);
3270 staticpro (&Qmarkerp);
3271 staticpro (&Qbuffer_or_string_p);
3272 staticpro (&Qinteger_or_marker_p);
3273 staticpro (&Qfloatp);
3274 staticpro (&Qnumberp);
3275 staticpro (&Qnumber_or_marker_p);
3276 staticpro (&Qchar_table_p);
3277 staticpro (&Qvector_or_char_table_p);
3278 staticpro (&Qsubrp);
3279 staticpro (&Qmany);
3280 staticpro (&Qunevalled);
3281
3282 staticpro (&Qboundp);
3283 staticpro (&Qfboundp);
3284 staticpro (&Qcdr);
3285 staticpro (&Qad_advice_info);
3286 staticpro (&Qad_activate_internal);
3287
3288 /* Types that type-of returns. */
3289 Qinteger = intern ("integer");
3290 Qsymbol = intern ("symbol");
3291 Qstring = intern ("string");
3292 Qcons = intern ("cons");
3293 Qmarker = intern ("marker");
3294 Qoverlay = intern ("overlay");
3295 Qfloat = intern ("float");
3296 Qwindow_configuration = intern ("window-configuration");
3297 Qprocess = intern ("process");
3298 Qwindow = intern ("window");
3299 /* Qsubr = intern ("subr"); */
3300 Qcompiled_function = intern ("compiled-function");
3301 Qbuffer = intern ("buffer");
3302 Qframe = intern ("frame");
3303 Qvector = intern ("vector");
3304 Qchar_table = intern ("char-table");
3305 Qbool_vector = intern ("bool-vector");
3306 Qhash_table = intern ("hash-table");
3307
3308 staticpro (&Qinteger);
3309 staticpro (&Qsymbol);
3310 staticpro (&Qstring);
3311 staticpro (&Qcons);
3312 staticpro (&Qmarker);
3313 staticpro (&Qoverlay);
3314 staticpro (&Qfloat);
3315 staticpro (&Qwindow_configuration);
3316 staticpro (&Qprocess);
3317 staticpro (&Qwindow);
3318 /* staticpro (&Qsubr); */
3319 staticpro (&Qcompiled_function);
3320 staticpro (&Qbuffer);
3321 staticpro (&Qframe);
3322 staticpro (&Qvector);
3323 staticpro (&Qchar_table);
3324 staticpro (&Qbool_vector);
3325 staticpro (&Qhash_table);
3326
3327 defsubr (&Sindirect_variable);
3328 defsubr (&Sinteractive_form);
3329 defsubr (&Seq);
3330 defsubr (&Snull);
3331 defsubr (&Stype_of);
3332 defsubr (&Slistp);
3333 defsubr (&Snlistp);
3334 defsubr (&Sconsp);
3335 defsubr (&Satom);
3336 defsubr (&Sintegerp);
3337 defsubr (&Sinteger_or_marker_p);
3338 defsubr (&Snumberp);
3339 defsubr (&Snumber_or_marker_p);
3340 defsubr (&Sfloatp);
3341 defsubr (&Snatnump);
3342 defsubr (&Ssymbolp);
3343 defsubr (&Skeywordp);
3344 defsubr (&Sstringp);
3345 defsubr (&Smultibyte_string_p);
3346 defsubr (&Svectorp);
3347 defsubr (&Schar_table_p);
3348 defsubr (&Svector_or_char_table_p);
3349 defsubr (&Sbool_vector_p);
3350 defsubr (&Sarrayp);
3351 defsubr (&Ssequencep);
3352 defsubr (&Sbufferp);
3353 defsubr (&Smarkerp);
3354 defsubr (&Ssubrp);
3355 defsubr (&Sbyte_code_function_p);
3356 defsubr (&Schar_or_string_p);
3357 defsubr (&Scar);
3358 defsubr (&Scdr);
3359 defsubr (&Scar_safe);
3360 defsubr (&Scdr_safe);
3361 defsubr (&Ssetcar);
3362 defsubr (&Ssetcdr);
3363 defsubr (&Ssymbol_function);
3364 defsubr (&Sindirect_function);
3365 defsubr (&Ssymbol_plist);
3366 defsubr (&Ssymbol_name);
3367 defsubr (&Smakunbound);
3368 defsubr (&Sfmakunbound);
3369 defsubr (&Sboundp);
3370 defsubr (&Sfboundp);
3371 defsubr (&Sfset);
3372 defsubr (&Sdefalias);
3373 defsubr (&Ssetplist);
3374 defsubr (&Ssymbol_value);
3375 defsubr (&Sset);
3376 defsubr (&Sdefault_boundp);
3377 defsubr (&Sdefault_value);
3378 defsubr (&Sset_default);
3379 defsubr (&Ssetq_default);
3380 defsubr (&Smake_variable_buffer_local);
3381 defsubr (&Smake_local_variable);
3382 defsubr (&Skill_local_variable);
3383 defsubr (&Smake_variable_frame_local);
3384 defsubr (&Slocal_variable_p);
3385 defsubr (&Slocal_variable_if_set_p);
3386 defsubr (&Svariable_binding_locus);
3387 #if 0 /* XXX Remove this. --lorentey */
3388 defsubr (&Sterminal_local_value);
3389 defsubr (&Sset_terminal_local_value);
3390 #endif
3391 defsubr (&Saref);
3392 defsubr (&Saset);
3393 defsubr (&Snumber_to_string);
3394 defsubr (&Sstring_to_number);
3395 defsubr (&Seqlsign);
3396 defsubr (&Slss);
3397 defsubr (&Sgtr);
3398 defsubr (&Sleq);
3399 defsubr (&Sgeq);
3400 defsubr (&Sneq);
3401 defsubr (&Szerop);
3402 defsubr (&Splus);
3403 defsubr (&Sminus);
3404 defsubr (&Stimes);
3405 defsubr (&Squo);
3406 defsubr (&Srem);
3407 defsubr (&Smod);
3408 defsubr (&Smax);
3409 defsubr (&Smin);
3410 defsubr (&Slogand);
3411 defsubr (&Slogior);
3412 defsubr (&Slogxor);
3413 defsubr (&Slsh);
3414 defsubr (&Sash);
3415 defsubr (&Sadd1);
3416 defsubr (&Ssub1);
3417 defsubr (&Slognot);
3418 defsubr (&Sbyteorder);
3419 defsubr (&Ssubr_arity);
3420 defsubr (&Ssubr_name);
3421
3422 XSYMBOL (Qwholenump)->function = XSYMBOL (Qnatnump)->function;
3423
3424 DEFVAR_LISP ("most-positive-fixnum", &Vmost_positive_fixnum,
3425 doc: /* The largest value that is representable in a Lisp integer. */);
3426 Vmost_positive_fixnum = make_number (MOST_POSITIVE_FIXNUM);
3427
3428 DEFVAR_LISP ("most-negative-fixnum", &Vmost_negative_fixnum,
3429 doc: /* The smallest value that is representable in a Lisp integer. */);
3430 Vmost_negative_fixnum = make_number (MOST_NEGATIVE_FIXNUM);
3431 }
3432
3433 SIGTYPE
3434 arith_error (signo)
3435 int signo;
3436 {
3437 #if defined(USG) && !defined(POSIX_SIGNALS)
3438 /* USG systems forget handlers when they are used;
3439 must reestablish each time */
3440 signal (signo, arith_error);
3441 #endif /* USG */
3442 #ifdef VMS
3443 /* VMS systems are like USG. */
3444 signal (signo, arith_error);
3445 #endif /* VMS */
3446 #ifdef BSD4_1
3447 sigrelse (SIGFPE);
3448 #else /* not BSD4_1 */
3449 sigsetmask (SIGEMPTYMASK);
3450 #endif /* not BSD4_1 */
3451
3452 SIGNAL_THREAD_CHECK (signo);
3453 xsignal0 (Qarith_error);
3454 }
3455
3456 void
3457 init_data ()
3458 {
3459 /* Don't do this if just dumping out.
3460 We don't want to call `signal' in this case
3461 so that we don't have trouble with dumping
3462 signal-delivering routines in an inconsistent state. */
3463 #ifndef CANNOT_DUMP
3464 if (!initialized)
3465 return;
3466 #endif /* CANNOT_DUMP */
3467 signal (SIGFPE, arith_error);
3468
3469 #ifdef uts
3470 signal (SIGEMT, arith_error);
3471 #endif /* uts */
3472 }
3473
3474 /* arch-tag: 25879798-b84d-479a-9c89-7d148e2109f7
3475 (do not change this comment) */