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