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