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