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