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