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