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