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