]> code.delx.au - gnu-emacs/blob - src/data.c
(korean-hanja): Add an entry for "wod".
[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_frame
1047 ? !EQ (selected_frame, XBUFFER_LOCAL_VALUE (valcontents)->frame)
1048 : (buf != XBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer)
1049 || (BUFFER_LOCAL_VALUEP (valcontents)
1050 && EQ (XCAR (current_alist_element),
1051 current_alist_element))))
1052 {
1053 /* Write out the cached value for the old buffer; copy it
1054 back to its alist element. This works if the current
1055 buffer only sees the default value, too. */
1056 Fsetcdr (current_alist_element,
1057 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue));
1058
1059 /* Find the new value for CURRENT-ALIST-ELEMENT. */
1060 tem1 = Fassq (symbol, buf->local_var_alist);
1061 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 1;
1062 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 0;
1063
1064 if (NILP (tem1))
1065 {
1066 /* This buffer still sees the default value. */
1067
1068 /* If the variable is a Lisp_Some_Buffer_Local_Value,
1069 or if this is `let' rather than `set',
1070 make CURRENT-ALIST-ELEMENT point to itself,
1071 indicating that we're seeing the default value. */
1072 if (bindflag || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1073 {
1074 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
1075
1076 if (XBUFFER_LOCAL_VALUE (valcontents)->check_frame)
1077 tem1 = Fassq (symbol,
1078 XFRAME (selected_frame)->param_alist);
1079
1080 if (! NILP (tem1))
1081 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 1;
1082 else
1083 tem1 = XBUFFER_LOCAL_VALUE (valcontents)->cdr;
1084 }
1085 /* If it's a Lisp_Buffer_Local_Value, being set not bound,
1086 give this buffer a new assoc for a local value and set
1087 CURRENT-ALIST-ELEMENT to point to that. */
1088 else
1089 {
1090 tem1 = Fcons (symbol, Fcdr (current_alist_element));
1091 buf->local_var_alist
1092 = Fcons (tem1, buf->local_var_alist);
1093 }
1094 }
1095
1096 /* Cache the new buffer's assoc in CURRENT-ALIST-ELEMENT. */
1097 XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr)
1098 = tem1;
1099
1100 /* Set BUFFER and FRAME for binding now loaded. */
1101 XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer, buf);
1102 XBUFFER_LOCAL_VALUE (valcontents)->frame = selected_frame;
1103 }
1104 valcontents = XBUFFER_LOCAL_VALUE (valcontents)->realvalue;
1105 }
1106
1107 /* If storing void (making the symbol void), forward only through
1108 buffer-local indicator, not through Lisp_Objfwd, etc. */
1109 if (voide)
1110 store_symval_forwarding (symbol, Qnil, newval);
1111 else
1112 store_symval_forwarding (symbol, valcontents, newval);
1113
1114 return newval;
1115 }
1116 \f
1117 /* Access or set a buffer-local symbol's default value. */
1118
1119 /* Return the default value of SYMBOL, but don't check for voidness.
1120 Return Qunbound if it is void. */
1121
1122 Lisp_Object
1123 default_value (symbol)
1124 Lisp_Object symbol;
1125 {
1126 register Lisp_Object valcontents;
1127
1128 CHECK_SYMBOL (symbol, 0);
1129 valcontents = XSYMBOL (symbol)->value;
1130
1131 /* For a built-in buffer-local variable, get the default value
1132 rather than letting do_symval_forwarding get the current value. */
1133 if (BUFFER_OBJFWDP (valcontents))
1134 {
1135 register int idx = XBUFFER_OBJFWD (valcontents)->offset;
1136
1137 if (XINT (*(Lisp_Object *) (idx + (char *) &buffer_local_flags)) != 0)
1138 return *(Lisp_Object *)(idx + (char *) &buffer_defaults);
1139 }
1140
1141 /* Handle user-created local variables. */
1142 if (BUFFER_LOCAL_VALUEP (valcontents)
1143 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1144 {
1145 /* If var is set up for a buffer that lacks a local value for it,
1146 the current value is nominally the default value.
1147 But the current value slot may be more up to date, since
1148 ordinary setq stores just that slot. So use that. */
1149 Lisp_Object current_alist_element, alist_element_car;
1150 current_alist_element
1151 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1152 alist_element_car = XCAR (current_alist_element);
1153 if (EQ (alist_element_car, current_alist_element))
1154 return do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue);
1155 else
1156 return XCDR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1157 }
1158 /* For other variables, get the current value. */
1159 return do_symval_forwarding (valcontents);
1160 }
1161
1162 DEFUN ("default-boundp", Fdefault_boundp, Sdefault_boundp, 1, 1, 0,
1163 "Return t if SYMBOL has a non-void default value.\n\
1164 This is the value that is seen in buffers that do not have their own values\n\
1165 for this variable.")
1166 (symbol)
1167 Lisp_Object symbol;
1168 {
1169 register Lisp_Object value;
1170
1171 value = default_value (symbol);
1172 return (EQ (value, Qunbound) ? Qnil : Qt);
1173 }
1174
1175 DEFUN ("default-value", Fdefault_value, Sdefault_value, 1, 1, 0,
1176 "Return SYMBOL's default value.\n\
1177 This is the value that is seen in buffers that do not have their own values\n\
1178 for this variable. The default value is meaningful for variables with\n\
1179 local bindings in certain buffers.")
1180 (symbol)
1181 Lisp_Object symbol;
1182 {
1183 register Lisp_Object value;
1184
1185 value = default_value (symbol);
1186 if (EQ (value, Qunbound))
1187 return Fsignal (Qvoid_variable, Fcons (symbol, Qnil));
1188 return value;
1189 }
1190
1191 DEFUN ("set-default", Fset_default, Sset_default, 2, 2, 0,
1192 "Set SYMBOL's default value to VAL. SYMBOL and VAL are evaluated.\n\
1193 The default value is seen in buffers that do not have their own values\n\
1194 for this variable.")
1195 (symbol, value)
1196 Lisp_Object symbol, value;
1197 {
1198 register Lisp_Object valcontents, current_alist_element, alist_element_buffer;
1199
1200 CHECK_SYMBOL (symbol, 0);
1201 valcontents = XSYMBOL (symbol)->value;
1202
1203 /* Handle variables like case-fold-search that have special slots
1204 in the buffer. Make them work apparently like Lisp_Buffer_Local_Value
1205 variables. */
1206 if (BUFFER_OBJFWDP (valcontents))
1207 {
1208 register int idx = XBUFFER_OBJFWD (valcontents)->offset;
1209 register struct buffer *b;
1210 register int mask = XINT (*((Lisp_Object *)
1211 (idx + (char *)&buffer_local_flags)));
1212
1213 *(Lisp_Object *)(idx + (char *) &buffer_defaults) = value;
1214
1215 /* If this variable is not always local in all buffers,
1216 set it in the buffers that don't nominally have a local value. */
1217 if (mask > 0)
1218 {
1219 for (b = all_buffers; b; b = b->next)
1220 if (!(b->local_var_flags & mask))
1221 *(Lisp_Object *)(idx + (char *) b) = value;
1222 }
1223 return value;
1224 }
1225
1226 if (!BUFFER_LOCAL_VALUEP (valcontents)
1227 && !SOME_BUFFER_LOCAL_VALUEP (valcontents))
1228 return Fset (symbol, value);
1229
1230 /* Store new value into the DEFAULT-VALUE slot */
1231 XCDR (XBUFFER_LOCAL_VALUE (valcontents)->cdr) = value;
1232
1233 /* If that slot is current, we must set the REALVALUE slot too */
1234 current_alist_element
1235 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1236 alist_element_buffer = Fcar (current_alist_element);
1237 if (EQ (alist_element_buffer, current_alist_element))
1238 store_symval_forwarding (symbol, XBUFFER_LOCAL_VALUE (valcontents)->realvalue,
1239 value);
1240
1241 return value;
1242 }
1243
1244 DEFUN ("setq-default", Fsetq_default, Ssetq_default, 2, UNEVALLED, 0,
1245 "Set the default value of variable VAR to VALUE.\n\
1246 VAR, the variable name, is literal (not evaluated);\n\
1247 VALUE is an expression and it is evaluated.\n\
1248 The default value of a variable is seen in buffers\n\
1249 that do not have their own values for the variable.\n\
1250 \n\
1251 More generally, you can use multiple variables and values, as in\n\
1252 (setq-default SYMBOL VALUE SYMBOL VALUE...)\n\
1253 This sets each SYMBOL's default value to the corresponding VALUE.\n\
1254 The VALUE for the Nth SYMBOL can refer to the new default values\n\
1255 of previous SYMs.")
1256 (args)
1257 Lisp_Object args;
1258 {
1259 register Lisp_Object args_left;
1260 register Lisp_Object val, symbol;
1261 struct gcpro gcpro1;
1262
1263 if (NILP (args))
1264 return Qnil;
1265
1266 args_left = args;
1267 GCPRO1 (args);
1268
1269 do
1270 {
1271 val = Feval (Fcar (Fcdr (args_left)));
1272 symbol = Fcar (args_left);
1273 Fset_default (symbol, val);
1274 args_left = Fcdr (Fcdr (args_left));
1275 }
1276 while (!NILP (args_left));
1277
1278 UNGCPRO;
1279 return val;
1280 }
1281 \f
1282 /* Lisp functions for creating and removing buffer-local variables. */
1283
1284 DEFUN ("make-variable-buffer-local", Fmake_variable_buffer_local, Smake_variable_buffer_local,
1285 1, 1, "vMake Variable Buffer Local: ",
1286 "Make VARIABLE have a separate value for each buffer.\n\
1287 At any time, the value for the current buffer is in effect.\n\
1288 There is also a default value which is seen in any buffer which has not yet\n\
1289 set its own value.\n\
1290 Using `set' or `setq' to set the variable causes it to have a separate value\n\
1291 for the current buffer if it was previously using the default value.\n\
1292 The function `default-value' gets the default value and `set-default' sets it.")
1293 (variable)
1294 register Lisp_Object variable;
1295 {
1296 register Lisp_Object tem, valcontents, newval;
1297
1298 CHECK_SYMBOL (variable, 0);
1299
1300 valcontents = XSYMBOL (variable)->value;
1301 if (EQ (variable, Qnil) || EQ (variable, Qt) || KBOARD_OBJFWDP (valcontents))
1302 error ("Symbol %s may not be buffer-local", XSYMBOL (variable)->name->data);
1303
1304 if (BUFFER_LOCAL_VALUEP (valcontents) || BUFFER_OBJFWDP (valcontents))
1305 return variable;
1306 if (SOME_BUFFER_LOCAL_VALUEP (valcontents))
1307 {
1308 XMISCTYPE (XSYMBOL (variable)->value) = Lisp_Misc_Buffer_Local_Value;
1309 return variable;
1310 }
1311 if (EQ (valcontents, Qunbound))
1312 XSYMBOL (variable)->value = Qnil;
1313 tem = Fcons (Qnil, Fsymbol_value (variable));
1314 XCAR (tem) = tem;
1315 newval = allocate_misc ();
1316 XMISCTYPE (newval) = Lisp_Misc_Buffer_Local_Value;
1317 XBUFFER_LOCAL_VALUE (newval)->realvalue = XSYMBOL (variable)->value;
1318 XBUFFER_LOCAL_VALUE (newval)->buffer = Fcurrent_buffer ();
1319 XBUFFER_LOCAL_VALUE (newval)->frame = Qnil;
1320 XBUFFER_LOCAL_VALUE (newval)->found_for_buffer = 1;
1321 XBUFFER_LOCAL_VALUE (newval)->found_for_frame = 0;
1322 XBUFFER_LOCAL_VALUE (newval)->check_frame = 0;
1323 XBUFFER_LOCAL_VALUE (newval)->cdr = tem;
1324 XSYMBOL (variable)->value = newval;
1325 return variable;
1326 }
1327
1328 DEFUN ("make-local-variable", Fmake_local_variable, Smake_local_variable,
1329 1, 1, "vMake Local Variable: ",
1330 "Make VARIABLE have a separate value in the current buffer.\n\
1331 Other buffers will continue to share a common default value.\n\
1332 \(The buffer-local value of VARIABLE starts out as the same value\n\
1333 VARIABLE previously had. If VARIABLE was void, it remains void.\)\n\
1334 See also `make-variable-buffer-local'.\n\
1335 \n\
1336 If the variable is already arranged to become local when set,\n\
1337 this function causes a local value to exist for this buffer,\n\
1338 just as setting the variable would do.\n\
1339 \n\
1340 This function returns VARIABLE, and therefore\n\
1341 (set (make-local-variable 'VARIABLE) VALUE-EXP)\n\
1342 works.\n\
1343 \n\
1344 Do not use `make-local-variable' to make a hook variable buffer-local.\n\
1345 Use `make-local-hook' instead.")
1346 (variable)
1347 register Lisp_Object variable;
1348 {
1349 register Lisp_Object tem, valcontents;
1350
1351 CHECK_SYMBOL (variable, 0);
1352
1353 valcontents = XSYMBOL (variable)->value;
1354 if (EQ (variable, Qnil) || EQ (variable, Qt) || KBOARD_OBJFWDP (valcontents))
1355 error ("Symbol %s may not be buffer-local", XSYMBOL (variable)->name->data);
1356
1357 if (BUFFER_LOCAL_VALUEP (valcontents) || BUFFER_OBJFWDP (valcontents))
1358 {
1359 tem = Fboundp (variable);
1360
1361 /* Make sure the symbol has a local value in this particular buffer,
1362 by setting it to the same value it already has. */
1363 Fset (variable, (EQ (tem, Qt) ? Fsymbol_value (variable) : Qunbound));
1364 return variable;
1365 }
1366 /* Make sure symbol is set up to hold per-buffer values */
1367 if (!SOME_BUFFER_LOCAL_VALUEP (valcontents))
1368 {
1369 Lisp_Object newval;
1370 tem = Fcons (Qnil, do_symval_forwarding (valcontents));
1371 XCAR (tem) = tem;
1372 newval = allocate_misc ();
1373 XMISCTYPE (newval) = Lisp_Misc_Some_Buffer_Local_Value;
1374 XBUFFER_LOCAL_VALUE (newval)->realvalue = XSYMBOL (variable)->value;
1375 XBUFFER_LOCAL_VALUE (newval)->buffer = Qnil;
1376 XBUFFER_LOCAL_VALUE (newval)->frame = Qnil;
1377 XBUFFER_LOCAL_VALUE (newval)->found_for_buffer = 0;
1378 XBUFFER_LOCAL_VALUE (newval)->found_for_frame = 0;
1379 XBUFFER_LOCAL_VALUE (newval)->check_frame = 0;
1380 XBUFFER_LOCAL_VALUE (newval)->cdr = tem;
1381 XSYMBOL (variable)->value = newval;
1382 }
1383 /* Make sure this buffer has its own value of symbol */
1384 tem = Fassq (variable, current_buffer->local_var_alist);
1385 if (NILP (tem))
1386 {
1387 /* Swap out any local binding for some other buffer, and make
1388 sure the current value is permanently recorded, if it's the
1389 default value. */
1390 find_symbol_value (variable);
1391
1392 current_buffer->local_var_alist
1393 = Fcons (Fcons (variable, XCDR (XBUFFER_LOCAL_VALUE (XSYMBOL (variable)->value)->cdr)),
1394 current_buffer->local_var_alist);
1395
1396 /* Make sure symbol does not think it is set up for this buffer;
1397 force it to look once again for this buffer's value */
1398 {
1399 Lisp_Object *pvalbuf;
1400
1401 valcontents = XSYMBOL (variable)->value;
1402
1403 pvalbuf = &XBUFFER_LOCAL_VALUE (valcontents)->buffer;
1404 if (current_buffer == XBUFFER (*pvalbuf))
1405 *pvalbuf = Qnil;
1406 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
1407 }
1408 }
1409
1410 /* If the symbol forwards into a C variable, then swap in the
1411 variable for this buffer immediately. If C code modifies the
1412 variable before we swap in, then that new value will clobber the
1413 default value the next time we swap. */
1414 valcontents = XBUFFER_LOCAL_VALUE (XSYMBOL (variable)->value)->realvalue;
1415 if (INTFWDP (valcontents) || BOOLFWDP (valcontents) || OBJFWDP (valcontents))
1416 swap_in_symval_forwarding (variable, XSYMBOL (variable)->value);
1417
1418 return variable;
1419 }
1420
1421 DEFUN ("kill-local-variable", Fkill_local_variable, Skill_local_variable,
1422 1, 1, "vKill Local Variable: ",
1423 "Make VARIABLE no longer have a separate value in the current buffer.\n\
1424 From now on the default value will apply in this buffer.")
1425 (variable)
1426 register Lisp_Object variable;
1427 {
1428 register Lisp_Object tem, valcontents;
1429
1430 CHECK_SYMBOL (variable, 0);
1431
1432 valcontents = XSYMBOL (variable)->value;
1433
1434 if (BUFFER_OBJFWDP (valcontents))
1435 {
1436 register int idx = XBUFFER_OBJFWD (valcontents)->offset;
1437 register int mask = XINT (*((Lisp_Object*)
1438 (idx + (char *)&buffer_local_flags)));
1439
1440 if (mask > 0)
1441 {
1442 *(Lisp_Object *)(idx + (char *) current_buffer)
1443 = *(Lisp_Object *)(idx + (char *) &buffer_defaults);
1444 current_buffer->local_var_flags &= ~mask;
1445 }
1446 return variable;
1447 }
1448
1449 if (!BUFFER_LOCAL_VALUEP (valcontents)
1450 && !SOME_BUFFER_LOCAL_VALUEP (valcontents))
1451 return variable;
1452
1453 /* Get rid of this buffer's alist element, if any */
1454
1455 tem = Fassq (variable, current_buffer->local_var_alist);
1456 if (!NILP (tem))
1457 current_buffer->local_var_alist
1458 = Fdelq (tem, current_buffer->local_var_alist);
1459
1460 /* If the symbol is set up for the current buffer, recompute its
1461 value. We have to do it now, or else forwarded objects won't
1462 work right. */
1463 {
1464 Lisp_Object *pvalbuf;
1465 valcontents = XSYMBOL (variable)->value;
1466 pvalbuf = &XBUFFER_LOCAL_VALUE (valcontents)->buffer;
1467 if (current_buffer == XBUFFER (*pvalbuf))
1468 {
1469 *pvalbuf = Qnil;
1470 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
1471 find_symbol_value (variable);
1472 }
1473 }
1474
1475 return variable;
1476 }
1477
1478 /* Lisp functions for creating and removing buffer-local variables. */
1479
1480 DEFUN ("make-variable-frame-local", Fmake_variable_frame_local, Smake_variable_frame_local,
1481 1, 1, "vMake Variable Frame Local: ",
1482 "Enable VARIABLE to have frame-local bindings.\n\
1483 When a frame-local binding exists in the current frame,\n\
1484 it is in effect whenever the current buffer has no buffer-local binding.\n\
1485 A frame-local binding is actual a frame parameter value;\n\
1486 thus, any given frame has a local binding for VARIABLE\n\
1487 if it has a value for the frame parameter named VARIABLE.\n\
1488 See `modify-frame-parameters'.")
1489 (variable)
1490 register Lisp_Object variable;
1491 {
1492 register Lisp_Object tem, valcontents, newval;
1493
1494 CHECK_SYMBOL (variable, 0);
1495
1496 valcontents = XSYMBOL (variable)->value;
1497 if (EQ (variable, Qnil) || EQ (variable, Qt) || KBOARD_OBJFWDP (valcontents)
1498 || BUFFER_OBJFWDP (valcontents))
1499 error ("Symbol %s may not be frame-local", XSYMBOL (variable)->name->data);
1500
1501 if (BUFFER_LOCAL_VALUEP (valcontents)
1502 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1503 return variable;
1504
1505 if (EQ (valcontents, Qunbound))
1506 XSYMBOL (variable)->value = Qnil;
1507 tem = Fcons (Qnil, Fsymbol_value (variable));
1508 XCAR (tem) = tem;
1509 newval = allocate_misc ();
1510 XMISCTYPE (newval) = Lisp_Misc_Some_Buffer_Local_Value;
1511 XBUFFER_LOCAL_VALUE (newval)->realvalue = XSYMBOL (variable)->value;
1512 XBUFFER_LOCAL_VALUE (newval)->buffer = Qnil;
1513 XBUFFER_LOCAL_VALUE (newval)->frame = Qnil;
1514 XBUFFER_LOCAL_VALUE (newval)->found_for_buffer = 0;
1515 XBUFFER_LOCAL_VALUE (newval)->found_for_frame = 0;
1516 XBUFFER_LOCAL_VALUE (newval)->check_frame = 1;
1517 XBUFFER_LOCAL_VALUE (newval)->cdr = tem;
1518 XSYMBOL (variable)->value = newval;
1519 return variable;
1520 }
1521
1522 DEFUN ("local-variable-p", Flocal_variable_p, Slocal_variable_p,
1523 1, 2, 0,
1524 "Non-nil if VARIABLE has a local binding in buffer BUFFER.\n\
1525 BUFFER defaults to the current buffer.")
1526 (variable, buffer)
1527 register Lisp_Object variable, buffer;
1528 {
1529 Lisp_Object valcontents;
1530 register struct buffer *buf;
1531
1532 if (NILP (buffer))
1533 buf = current_buffer;
1534 else
1535 {
1536 CHECK_BUFFER (buffer, 0);
1537 buf = XBUFFER (buffer);
1538 }
1539
1540 CHECK_SYMBOL (variable, 0);
1541
1542 valcontents = XSYMBOL (variable)->value;
1543 if (BUFFER_LOCAL_VALUEP (valcontents)
1544 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1545 {
1546 Lisp_Object tail, elt;
1547 for (tail = buf->local_var_alist; CONSP (tail); tail = XCDR (tail))
1548 {
1549 elt = XCAR (tail);
1550 if (EQ (variable, XCAR (elt)))
1551 return Qt;
1552 }
1553 }
1554 if (BUFFER_OBJFWDP (valcontents))
1555 {
1556 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1557 int mask = XINT (*(Lisp_Object *)(offset + (char *)&buffer_local_flags));
1558 if (mask == -1 || (buf->local_var_flags & mask))
1559 return Qt;
1560 }
1561 return Qnil;
1562 }
1563
1564 DEFUN ("local-variable-if-set-p", Flocal_variable_if_set_p, Slocal_variable_if_set_p,
1565 1, 2, 0,
1566 "Non-nil if VARIABLE will be local in buffer BUFFER if it is set there.\n\
1567 BUFFER defaults to the current buffer.")
1568 (variable, buffer)
1569 register Lisp_Object variable, buffer;
1570 {
1571 Lisp_Object valcontents;
1572 register struct buffer *buf;
1573
1574 if (NILP (buffer))
1575 buf = current_buffer;
1576 else
1577 {
1578 CHECK_BUFFER (buffer, 0);
1579 buf = XBUFFER (buffer);
1580 }
1581
1582 CHECK_SYMBOL (variable, 0);
1583
1584 valcontents = XSYMBOL (variable)->value;
1585
1586 /* This means that make-variable-buffer-local was done. */
1587 if (BUFFER_LOCAL_VALUEP (valcontents))
1588 return Qt;
1589 /* All these slots become local if they are set. */
1590 if (BUFFER_OBJFWDP (valcontents))
1591 return Qt;
1592 if (SOME_BUFFER_LOCAL_VALUEP (valcontents))
1593 {
1594 Lisp_Object tail, elt;
1595 for (tail = buf->local_var_alist; CONSP (tail); tail = XCDR (tail))
1596 {
1597 elt = XCAR (tail);
1598 if (EQ (variable, XCAR (elt)))
1599 return Qt;
1600 }
1601 }
1602 return Qnil;
1603 }
1604 \f
1605 /* Find the function at the end of a chain of symbol function indirections. */
1606
1607 /* If OBJECT is a symbol, find the end of its function chain and
1608 return the value found there. If OBJECT is not a symbol, just
1609 return it. If there is a cycle in the function chain, signal a
1610 cyclic-function-indirection error.
1611
1612 This is like Findirect_function, except that it doesn't signal an
1613 error if the chain ends up unbound. */
1614 Lisp_Object
1615 indirect_function (object)
1616 register Lisp_Object object;
1617 {
1618 Lisp_Object tortoise, hare;
1619
1620 hare = tortoise = object;
1621
1622 for (;;)
1623 {
1624 if (!SYMBOLP (hare) || EQ (hare, Qunbound))
1625 break;
1626 hare = XSYMBOL (hare)->function;
1627 if (!SYMBOLP (hare) || EQ (hare, Qunbound))
1628 break;
1629 hare = XSYMBOL (hare)->function;
1630
1631 tortoise = XSYMBOL (tortoise)->function;
1632
1633 if (EQ (hare, tortoise))
1634 Fsignal (Qcyclic_function_indirection, Fcons (object, Qnil));
1635 }
1636
1637 return hare;
1638 }
1639
1640 DEFUN ("indirect-function", Findirect_function, Sindirect_function, 1, 1, 0,
1641 "Return the function at the end of OBJECT's function chain.\n\
1642 If OBJECT is a symbol, follow all function indirections and return the final\n\
1643 function binding.\n\
1644 If OBJECT is not a symbol, just return it.\n\
1645 Signal a void-function error if the final symbol is unbound.\n\
1646 Signal a cyclic-function-indirection error if there is a loop in the\n\
1647 function chain of symbols.")
1648 (object)
1649 register Lisp_Object object;
1650 {
1651 Lisp_Object result;
1652
1653 result = indirect_function (object);
1654
1655 if (EQ (result, Qunbound))
1656 return Fsignal (Qvoid_function, Fcons (object, Qnil));
1657 return result;
1658 }
1659 \f
1660 /* Extract and set vector and string elements */
1661
1662 DEFUN ("aref", Faref, Saref, 2, 2, 0,
1663 "Return the element of ARRAY at index IDX.\n\
1664 ARRAY may be a vector, a string, a char-table, a bool-vector,\n\
1665 or a byte-code object. IDX starts at 0.")
1666 (array, idx)
1667 register Lisp_Object array;
1668 Lisp_Object idx;
1669 {
1670 register int idxval;
1671
1672 CHECK_NUMBER (idx, 1);
1673 idxval = XINT (idx);
1674 if (STRINGP (array))
1675 {
1676 int c, idxval_byte;
1677
1678 if (idxval < 0 || idxval >= XSTRING (array)->size)
1679 args_out_of_range (array, idx);
1680 if (! STRING_MULTIBYTE (array))
1681 return make_number ((unsigned char) XSTRING (array)->data[idxval]);
1682 idxval_byte = string_char_to_byte (array, idxval);
1683
1684 c = STRING_CHAR (&XSTRING (array)->data[idxval_byte],
1685 STRING_BYTES (XSTRING (array)) - idxval_byte);
1686 return make_number (c);
1687 }
1688 else if (BOOL_VECTOR_P (array))
1689 {
1690 int val;
1691
1692 if (idxval < 0 || idxval >= XBOOL_VECTOR (array)->size)
1693 args_out_of_range (array, idx);
1694
1695 val = (unsigned char) XBOOL_VECTOR (array)->data[idxval / BITS_PER_CHAR];
1696 return (val & (1 << (idxval % BITS_PER_CHAR)) ? Qt : Qnil);
1697 }
1698 else if (CHAR_TABLE_P (array))
1699 {
1700 Lisp_Object val;
1701
1702 if (idxval < 0)
1703 args_out_of_range (array, idx);
1704 if (idxval < CHAR_TABLE_ORDINARY_SLOTS)
1705 {
1706 /* For ASCII and 8-bit European characters, the element is
1707 stored in the top table. */
1708 val = XCHAR_TABLE (array)->contents[idxval];
1709 if (NILP (val))
1710 val = XCHAR_TABLE (array)->defalt;
1711 while (NILP (val)) /* Follow parents until we find some value. */
1712 {
1713 array = XCHAR_TABLE (array)->parent;
1714 if (NILP (array))
1715 return Qnil;
1716 val = XCHAR_TABLE (array)->contents[idxval];
1717 if (NILP (val))
1718 val = XCHAR_TABLE (array)->defalt;
1719 }
1720 return val;
1721 }
1722 else
1723 {
1724 int code[4], i;
1725 Lisp_Object sub_table;
1726
1727 SPLIT_NON_ASCII_CHAR (idxval, code[0], code[1], code[2]);
1728 if (code[1] < 32) code[1] = -1;
1729 else if (code[2] < 32) code[2] = -1;
1730
1731 /* Here, the possible range of CODE[0] (== charset ID) is
1732 128..MAX_CHARSET. Since the top level char table contains
1733 data for multibyte characters after 256th element, we must
1734 increment CODE[0] by 128 to get a correct index. */
1735 code[0] += 128;
1736 code[3] = -1; /* anchor */
1737
1738 try_parent_char_table:
1739 sub_table = array;
1740 for (i = 0; code[i] >= 0; i++)
1741 {
1742 val = XCHAR_TABLE (sub_table)->contents[code[i]];
1743 if (SUB_CHAR_TABLE_P (val))
1744 sub_table = val;
1745 else
1746 {
1747 if (NILP (val))
1748 val = XCHAR_TABLE (sub_table)->defalt;
1749 if (NILP (val))
1750 {
1751 array = XCHAR_TABLE (array)->parent;
1752 if (!NILP (array))
1753 goto try_parent_char_table;
1754 }
1755 return val;
1756 }
1757 }
1758 /* Here, VAL is a sub char table. We try the default value
1759 and parent. */
1760 val = XCHAR_TABLE (val)->defalt;
1761 if (NILP (val))
1762 {
1763 array = XCHAR_TABLE (array)->parent;
1764 if (!NILP (array))
1765 goto try_parent_char_table;
1766 }
1767 return val;
1768 }
1769 }
1770 else
1771 {
1772 int size;
1773 if (VECTORP (array))
1774 size = XVECTOR (array)->size;
1775 else if (COMPILEDP (array))
1776 size = XVECTOR (array)->size & PSEUDOVECTOR_SIZE_MASK;
1777 else
1778 wrong_type_argument (Qarrayp, array);
1779
1780 if (idxval < 0 || idxval >= size)
1781 args_out_of_range (array, idx);
1782 return XVECTOR (array)->contents[idxval];
1783 }
1784 }
1785
1786 DEFUN ("aset", Faset, Saset, 3, 3, 0,
1787 "Store into the element of ARRAY at index IDX the value NEWELT.\n\
1788 ARRAY may be a vector, a string, a char-table or a bool-vector.\n\
1789 IDX starts at 0.")
1790 (array, idx, newelt)
1791 register Lisp_Object array;
1792 Lisp_Object idx, newelt;
1793 {
1794 register int idxval;
1795
1796 CHECK_NUMBER (idx, 1);
1797 idxval = XINT (idx);
1798 if (!VECTORP (array) && !STRINGP (array) && !BOOL_VECTOR_P (array)
1799 && ! CHAR_TABLE_P (array))
1800 array = wrong_type_argument (Qarrayp, array);
1801 CHECK_IMPURE (array);
1802
1803 if (VECTORP (array))
1804 {
1805 if (idxval < 0 || idxval >= XVECTOR (array)->size)
1806 args_out_of_range (array, idx);
1807 XVECTOR (array)->contents[idxval] = newelt;
1808 }
1809 else if (BOOL_VECTOR_P (array))
1810 {
1811 int val;
1812
1813 if (idxval < 0 || idxval >= XBOOL_VECTOR (array)->size)
1814 args_out_of_range (array, idx);
1815
1816 val = (unsigned char) XBOOL_VECTOR (array)->data[idxval / BITS_PER_CHAR];
1817
1818 if (! NILP (newelt))
1819 val |= 1 << (idxval % BITS_PER_CHAR);
1820 else
1821 val &= ~(1 << (idxval % BITS_PER_CHAR));
1822 XBOOL_VECTOR (array)->data[idxval / BITS_PER_CHAR] = val;
1823 }
1824 else if (CHAR_TABLE_P (array))
1825 {
1826 if (idxval < 0)
1827 args_out_of_range (array, idx);
1828 if (idxval < CHAR_TABLE_ORDINARY_SLOTS)
1829 XCHAR_TABLE (array)->contents[idxval] = newelt;
1830 else
1831 {
1832 int code[4], i;
1833 Lisp_Object val;
1834
1835 SPLIT_NON_ASCII_CHAR (idxval, code[0], code[1], code[2]);
1836 if (code[1] < 32) code[1] = -1;
1837 else if (code[2] < 32) code[2] = -1;
1838
1839 /* See the comment of the corresponding part in Faref. */
1840 code[0] += 128;
1841 code[3] = -1; /* anchor */
1842 for (i = 0; code[i + 1] >= 0; i++)
1843 {
1844 val = XCHAR_TABLE (array)->contents[code[i]];
1845 if (SUB_CHAR_TABLE_P (val))
1846 array = val;
1847 else
1848 {
1849 Lisp_Object temp;
1850
1851 /* VAL is a leaf. Create a sub char table with the
1852 default value VAL or XCHAR_TABLE (array)->defalt
1853 and look into it. */
1854
1855 temp = make_sub_char_table (NILP (val)
1856 ? XCHAR_TABLE (array)->defalt
1857 : val);
1858 XCHAR_TABLE (array)->contents[code[i]] = temp;
1859 array = temp;
1860 }
1861 }
1862 XCHAR_TABLE (array)->contents[code[i]] = newelt;
1863 }
1864 }
1865 else if (STRING_MULTIBYTE (array))
1866 {
1867 int idxval_byte, new_len, actual_len;
1868 int prev_byte;
1869 unsigned char *p, workbuf[MAX_MULTIBYTE_LENGTH], *str = workbuf;
1870
1871 if (idxval < 0 || idxval >= XSTRING (array)->size)
1872 args_out_of_range (array, idx);
1873
1874 idxval_byte = string_char_to_byte (array, idxval);
1875 p = &XSTRING (array)->data[idxval_byte];
1876
1877 actual_len = MULTIBYTE_FORM_LENGTH (p, STRING_BYTES (XSTRING (array)));
1878 CHECK_NUMBER (newelt, 2);
1879 new_len = CHAR_STRING (XINT (newelt), str);
1880 if (actual_len != new_len)
1881 error ("Attempt to change byte length of a string");
1882
1883 /* We can't accept a change causing byte combining. */
1884 if (!ASCII_BYTE_P (*str)
1885 && ((idxval > 0 && !CHAR_HEAD_P (*str)
1886 && (prev_byte = string_char_to_byte (array, idxval - 1),
1887 BYTES_BY_CHAR_HEAD (XSTRING (array)->data[prev_byte])
1888 > idxval_byte - prev_byte))
1889 || (idxval < XSTRING (array)->size - 1
1890 && !CHAR_HEAD_P (p[actual_len])
1891 && new_len < BYTES_BY_CHAR_HEAD (*str))))
1892 error ("Attempt to change char length of a string");
1893 while (new_len--)
1894 *p++ = *str++;
1895 }
1896 else
1897 {
1898 if (idxval < 0 || idxval >= XSTRING (array)->size)
1899 args_out_of_range (array, idx);
1900 CHECK_NUMBER (newelt, 2);
1901 XSTRING (array)->data[idxval] = XINT (newelt);
1902 }
1903
1904 return newelt;
1905 }
1906 \f
1907 /* Arithmetic functions */
1908
1909 enum comparison { equal, notequal, less, grtr, less_or_equal, grtr_or_equal };
1910
1911 Lisp_Object
1912 arithcompare (num1, num2, comparison)
1913 Lisp_Object num1, num2;
1914 enum comparison comparison;
1915 {
1916 double f1, f2;
1917 int floatp = 0;
1918
1919 #ifdef LISP_FLOAT_TYPE
1920 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num1, 0);
1921 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num2, 0);
1922
1923 if (FLOATP (num1) || FLOATP (num2))
1924 {
1925 floatp = 1;
1926 f1 = (FLOATP (num1)) ? XFLOAT_DATA (num1) : XINT (num1);
1927 f2 = (FLOATP (num2)) ? XFLOAT_DATA (num2) : XINT (num2);
1928 }
1929 #else
1930 CHECK_NUMBER_COERCE_MARKER (num1, 0);
1931 CHECK_NUMBER_COERCE_MARKER (num2, 0);
1932 #endif /* LISP_FLOAT_TYPE */
1933
1934 switch (comparison)
1935 {
1936 case equal:
1937 if (floatp ? f1 == f2 : XINT (num1) == XINT (num2))
1938 return Qt;
1939 return Qnil;
1940
1941 case notequal:
1942 if (floatp ? f1 != f2 : XINT (num1) != XINT (num2))
1943 return Qt;
1944 return Qnil;
1945
1946 case less:
1947 if (floatp ? f1 < f2 : XINT (num1) < XINT (num2))
1948 return Qt;
1949 return Qnil;
1950
1951 case less_or_equal:
1952 if (floatp ? f1 <= f2 : XINT (num1) <= XINT (num2))
1953 return Qt;
1954 return Qnil;
1955
1956 case grtr:
1957 if (floatp ? f1 > f2 : XINT (num1) > XINT (num2))
1958 return Qt;
1959 return Qnil;
1960
1961 case grtr_or_equal:
1962 if (floatp ? f1 >= f2 : XINT (num1) >= XINT (num2))
1963 return Qt;
1964 return Qnil;
1965
1966 default:
1967 abort ();
1968 }
1969 }
1970
1971 DEFUN ("=", Feqlsign, Seqlsign, 2, 2, 0,
1972 "Return t if two args, both numbers or markers, are equal.")
1973 (num1, num2)
1974 register Lisp_Object num1, num2;
1975 {
1976 return arithcompare (num1, num2, equal);
1977 }
1978
1979 DEFUN ("<", Flss, Slss, 2, 2, 0,
1980 "Return t if first arg is less than second arg. Both must be numbers or markers.")
1981 (num1, num2)
1982 register Lisp_Object num1, num2;
1983 {
1984 return arithcompare (num1, num2, less);
1985 }
1986
1987 DEFUN (">", Fgtr, Sgtr, 2, 2, 0,
1988 "Return t if first arg is greater than second arg. Both must be numbers or markers.")
1989 (num1, num2)
1990 register Lisp_Object num1, num2;
1991 {
1992 return arithcompare (num1, num2, grtr);
1993 }
1994
1995 DEFUN ("<=", Fleq, Sleq, 2, 2, 0,
1996 "Return t if first arg is less than or equal to second arg.\n\
1997 Both must be numbers or markers.")
1998 (num1, num2)
1999 register Lisp_Object num1, num2;
2000 {
2001 return arithcompare (num1, num2, less_or_equal);
2002 }
2003
2004 DEFUN (">=", Fgeq, Sgeq, 2, 2, 0,
2005 "Return t if first arg is greater than or equal to second arg.\n\
2006 Both must be numbers or markers.")
2007 (num1, num2)
2008 register Lisp_Object num1, num2;
2009 {
2010 return arithcompare (num1, num2, grtr_or_equal);
2011 }
2012
2013 DEFUN ("/=", Fneq, Sneq, 2, 2, 0,
2014 "Return t if first arg is not equal to second arg. Both must be numbers or markers.")
2015 (num1, num2)
2016 register Lisp_Object num1, num2;
2017 {
2018 return arithcompare (num1, num2, notequal);
2019 }
2020
2021 DEFUN ("zerop", Fzerop, Szerop, 1, 1, 0, "Return t if NUMBER is zero.")
2022 (number)
2023 register Lisp_Object number;
2024 {
2025 #ifdef LISP_FLOAT_TYPE
2026 CHECK_NUMBER_OR_FLOAT (number, 0);
2027
2028 if (FLOATP (number))
2029 {
2030 if (XFLOAT_DATA (number) == 0.0)
2031 return Qt;
2032 return Qnil;
2033 }
2034 #else
2035 CHECK_NUMBER (number, 0);
2036 #endif /* LISP_FLOAT_TYPE */
2037
2038 if (!XINT (number))
2039 return Qt;
2040 return Qnil;
2041 }
2042 \f
2043 /* Convert between long values and pairs of Lisp integers. */
2044
2045 Lisp_Object
2046 long_to_cons (i)
2047 unsigned long i;
2048 {
2049 unsigned int top = i >> 16;
2050 unsigned int bot = i & 0xFFFF;
2051 if (top == 0)
2052 return make_number (bot);
2053 if (top == (unsigned long)-1 >> 16)
2054 return Fcons (make_number (-1), make_number (bot));
2055 return Fcons (make_number (top), make_number (bot));
2056 }
2057
2058 unsigned long
2059 cons_to_long (c)
2060 Lisp_Object c;
2061 {
2062 Lisp_Object top, bot;
2063 if (INTEGERP (c))
2064 return XINT (c);
2065 top = XCAR (c);
2066 bot = XCDR (c);
2067 if (CONSP (bot))
2068 bot = XCAR (bot);
2069 return ((XINT (top) << 16) | XINT (bot));
2070 }
2071 \f
2072 DEFUN ("number-to-string", Fnumber_to_string, Snumber_to_string, 1, 1, 0,
2073 "Convert NUMBER to a string by printing it in decimal.\n\
2074 Uses a minus sign if negative.\n\
2075 NUMBER may be an integer or a floating point number.")
2076 (number)
2077 Lisp_Object number;
2078 {
2079 char buffer[VALBITS];
2080
2081 #ifndef LISP_FLOAT_TYPE
2082 CHECK_NUMBER (number, 0);
2083 #else
2084 CHECK_NUMBER_OR_FLOAT (number, 0);
2085
2086 if (FLOATP (number))
2087 {
2088 char pigbuf[350]; /* see comments in float_to_string */
2089
2090 float_to_string (pigbuf, XFLOAT_DATA (number));
2091 return build_string (pigbuf);
2092 }
2093 #endif /* LISP_FLOAT_TYPE */
2094
2095 if (sizeof (int) == sizeof (EMACS_INT))
2096 sprintf (buffer, "%d", XINT (number));
2097 else if (sizeof (long) == sizeof (EMACS_INT))
2098 sprintf (buffer, "%ld", (long) XINT (number));
2099 else
2100 abort ();
2101 return build_string (buffer);
2102 }
2103
2104 INLINE static int
2105 digit_to_number (character, base)
2106 int character, base;
2107 {
2108 int digit;
2109
2110 if (character >= '0' && character <= '9')
2111 digit = character - '0';
2112 else if (character >= 'a' && character <= 'z')
2113 digit = character - 'a' + 10;
2114 else if (character >= 'A' && character <= 'Z')
2115 digit = character - 'A' + 10;
2116 else
2117 return -1;
2118
2119 if (digit >= base)
2120 return -1;
2121 else
2122 return digit;
2123 }
2124
2125 DEFUN ("string-to-number", Fstring_to_number, Sstring_to_number, 1, 2, 0,
2126 "Convert STRING to a number by parsing it as a decimal number.\n\
2127 This parses both integers and floating point numbers.\n\
2128 It ignores leading spaces and tabs.\n\
2129 \n\
2130 If BASE, interpret STRING as a number in that base. If BASE isn't\n\
2131 present, base 10 is used. BASE must be between 2 and 16 (inclusive).\n\
2132 If the base used is not 10, floating point is not recognized.")
2133 (string, base)
2134 register Lisp_Object string, base;
2135 {
2136 register unsigned char *p;
2137 register int b, v = 0;
2138 int negative = 1;
2139
2140 CHECK_STRING (string, 0);
2141
2142 if (NILP (base))
2143 b = 10;
2144 else
2145 {
2146 CHECK_NUMBER (base, 1);
2147 b = XINT (base);
2148 if (b < 2 || b > 16)
2149 Fsignal (Qargs_out_of_range, Fcons (base, Qnil));
2150 }
2151
2152 p = XSTRING (string)->data;
2153
2154 /* Skip any whitespace at the front of the number. Some versions of
2155 atoi do this anyway, so we might as well make Emacs lisp consistent. */
2156 while (*p == ' ' || *p == '\t')
2157 p++;
2158
2159 if (*p == '-')
2160 {
2161 negative = -1;
2162 p++;
2163 }
2164 else if (*p == '+')
2165 p++;
2166
2167 #ifdef LISP_FLOAT_TYPE
2168 if (isfloat_string (p) && b == 10)
2169 return make_float (negative * atof (p));
2170 #endif /* LISP_FLOAT_TYPE */
2171
2172 while (1)
2173 {
2174 int digit = digit_to_number (*p++, b);
2175 if (digit < 0)
2176 break;
2177 v = v * b + digit;
2178 }
2179
2180 return make_number (negative * v);
2181 }
2182
2183 \f
2184 enum arithop
2185 { Aadd, Asub, Amult, Adiv, Alogand, Alogior, Alogxor, Amax, Amin };
2186
2187 extern Lisp_Object float_arith_driver ();
2188 extern Lisp_Object fmod_float ();
2189
2190 Lisp_Object
2191 arith_driver (code, nargs, args)
2192 enum arithop code;
2193 int nargs;
2194 register Lisp_Object *args;
2195 {
2196 register Lisp_Object val;
2197 register int argnum;
2198 register EMACS_INT accum;
2199 register EMACS_INT next;
2200
2201 switch (SWITCH_ENUM_CAST (code))
2202 {
2203 case Alogior:
2204 case Alogxor:
2205 case Aadd:
2206 case Asub:
2207 accum = 0; break;
2208 case Amult:
2209 accum = 1; break;
2210 case Alogand:
2211 accum = -1; break;
2212 }
2213
2214 for (argnum = 0; argnum < nargs; argnum++)
2215 {
2216 val = args[argnum]; /* using args[argnum] as argument to CHECK_NUMBER_... */
2217 #ifdef LISP_FLOAT_TYPE
2218 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val, argnum);
2219
2220 if (FLOATP (val)) /* time to do serious math */
2221 return (float_arith_driver ((double) accum, argnum, code,
2222 nargs, args));
2223 #else
2224 CHECK_NUMBER_COERCE_MARKER (val, argnum);
2225 #endif /* LISP_FLOAT_TYPE */
2226 args[argnum] = val; /* runs into a compiler bug. */
2227 next = XINT (args[argnum]);
2228 switch (SWITCH_ENUM_CAST (code))
2229 {
2230 case Aadd: accum += next; break;
2231 case Asub:
2232 accum = argnum ? accum - next : nargs == 1 ? - next : next;
2233 break;
2234 case Amult: accum *= next; break;
2235 case Adiv:
2236 if (!argnum) accum = next;
2237 else
2238 {
2239 if (next == 0)
2240 Fsignal (Qarith_error, Qnil);
2241 accum /= next;
2242 }
2243 break;
2244 case Alogand: accum &= next; break;
2245 case Alogior: accum |= next; break;
2246 case Alogxor: accum ^= next; break;
2247 case Amax: if (!argnum || next > accum) accum = next; break;
2248 case Amin: if (!argnum || next < accum) accum = next; break;
2249 }
2250 }
2251
2252 XSETINT (val, accum);
2253 return val;
2254 }
2255
2256 #undef isnan
2257 #define isnan(x) ((x) != (x))
2258
2259 #ifdef LISP_FLOAT_TYPE
2260
2261 Lisp_Object
2262 float_arith_driver (accum, argnum, code, nargs, args)
2263 double accum;
2264 register int argnum;
2265 enum arithop code;
2266 int nargs;
2267 register Lisp_Object *args;
2268 {
2269 register Lisp_Object val;
2270 double next;
2271
2272 for (; argnum < nargs; argnum++)
2273 {
2274 val = args[argnum]; /* using args[argnum] as argument to CHECK_NUMBER_... */
2275 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val, argnum);
2276
2277 if (FLOATP (val))
2278 {
2279 next = XFLOAT_DATA (val);
2280 }
2281 else
2282 {
2283 args[argnum] = val; /* runs into a compiler bug. */
2284 next = XINT (args[argnum]);
2285 }
2286 switch (SWITCH_ENUM_CAST (code))
2287 {
2288 case Aadd:
2289 accum += next;
2290 break;
2291 case Asub:
2292 accum = argnum ? accum - next : nargs == 1 ? - next : next;
2293 break;
2294 case Amult:
2295 accum *= next;
2296 break;
2297 case Adiv:
2298 if (!argnum)
2299 accum = next;
2300 else
2301 {
2302 if (! IEEE_FLOATING_POINT && next == 0)
2303 Fsignal (Qarith_error, Qnil);
2304 accum /= next;
2305 }
2306 break;
2307 case Alogand:
2308 case Alogior:
2309 case Alogxor:
2310 return wrong_type_argument (Qinteger_or_marker_p, val);
2311 case Amax:
2312 if (!argnum || isnan (next) || next > accum)
2313 accum = next;
2314 break;
2315 case Amin:
2316 if (!argnum || isnan (next) || next < accum)
2317 accum = next;
2318 break;
2319 }
2320 }
2321
2322 return make_float (accum);
2323 }
2324 #endif /* LISP_FLOAT_TYPE */
2325
2326 DEFUN ("+", Fplus, Splus, 0, MANY, 0,
2327 "Return sum of any number of arguments, which are numbers or markers.")
2328 (nargs, args)
2329 int nargs;
2330 Lisp_Object *args;
2331 {
2332 return arith_driver (Aadd, nargs, args);
2333 }
2334
2335 DEFUN ("-", Fminus, Sminus, 0, MANY, 0,
2336 "Negate number or subtract numbers or markers.\n\
2337 With one arg, negates it. With more than one arg,\n\
2338 subtracts all but the first from the first.")
2339 (nargs, args)
2340 int nargs;
2341 Lisp_Object *args;
2342 {
2343 return arith_driver (Asub, nargs, args);
2344 }
2345
2346 DEFUN ("*", Ftimes, Stimes, 0, MANY, 0,
2347 "Returns product of any number of arguments, which are numbers or markers.")
2348 (nargs, args)
2349 int nargs;
2350 Lisp_Object *args;
2351 {
2352 return arith_driver (Amult, nargs, args);
2353 }
2354
2355 DEFUN ("/", Fquo, Squo, 2, MANY, 0,
2356 "Returns first argument divided by all the remaining arguments.\n\
2357 The arguments must be numbers or markers.")
2358 (nargs, args)
2359 int nargs;
2360 Lisp_Object *args;
2361 {
2362 return arith_driver (Adiv, nargs, args);
2363 }
2364
2365 DEFUN ("%", Frem, Srem, 2, 2, 0,
2366 "Returns remainder of X divided by Y.\n\
2367 Both must be integers or markers.")
2368 (x, y)
2369 register Lisp_Object x, y;
2370 {
2371 Lisp_Object val;
2372
2373 CHECK_NUMBER_COERCE_MARKER (x, 0);
2374 CHECK_NUMBER_COERCE_MARKER (y, 1);
2375
2376 if (XFASTINT (y) == 0)
2377 Fsignal (Qarith_error, Qnil);
2378
2379 XSETINT (val, XINT (x) % XINT (y));
2380 return val;
2381 }
2382
2383 #ifndef HAVE_FMOD
2384 double
2385 fmod (f1, f2)
2386 double f1, f2;
2387 {
2388 double r = f1;
2389
2390 if (f2 < 0.0)
2391 f2 = -f2;
2392
2393 /* If the magnitude of the result exceeds that of the divisor, or
2394 the sign of the result does not agree with that of the dividend,
2395 iterate with the reduced value. This does not yield a
2396 particularly accurate result, but at least it will be in the
2397 range promised by fmod. */
2398 do
2399 r -= f2 * floor (r / f2);
2400 while (f2 <= (r < 0 ? -r : r) || ((r < 0) != (f1 < 0) && ! isnan (r)));
2401
2402 return r;
2403 }
2404 #endif /* ! HAVE_FMOD */
2405
2406 DEFUN ("mod", Fmod, Smod, 2, 2, 0,
2407 "Returns X modulo Y.\n\
2408 The result falls between zero (inclusive) and Y (exclusive).\n\
2409 Both X and Y must be numbers or markers.")
2410 (x, y)
2411 register Lisp_Object x, y;
2412 {
2413 Lisp_Object val;
2414 EMACS_INT i1, i2;
2415
2416 #ifdef LISP_FLOAT_TYPE
2417 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (x, 0);
2418 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (y, 1);
2419
2420 if (FLOATP (x) || FLOATP (y))
2421 return fmod_float (x, y);
2422
2423 #else /* not LISP_FLOAT_TYPE */
2424 CHECK_NUMBER_COERCE_MARKER (x, 0);
2425 CHECK_NUMBER_COERCE_MARKER (y, 1);
2426 #endif /* not LISP_FLOAT_TYPE */
2427
2428 i1 = XINT (x);
2429 i2 = XINT (y);
2430
2431 if (i2 == 0)
2432 Fsignal (Qarith_error, Qnil);
2433
2434 i1 %= i2;
2435
2436 /* If the "remainder" comes out with the wrong sign, fix it. */
2437 if (i2 < 0 ? i1 > 0 : i1 < 0)
2438 i1 += i2;
2439
2440 XSETINT (val, i1);
2441 return val;
2442 }
2443
2444 DEFUN ("max", Fmax, Smax, 1, MANY, 0,
2445 "Return largest of all the arguments (which must be numbers or markers).\n\
2446 The value is always a number; markers are converted to numbers.")
2447 (nargs, args)
2448 int nargs;
2449 Lisp_Object *args;
2450 {
2451 return arith_driver (Amax, nargs, args);
2452 }
2453
2454 DEFUN ("min", Fmin, Smin, 1, MANY, 0,
2455 "Return smallest of all the arguments (which must be numbers or markers).\n\
2456 The value is always a number; markers are converted to numbers.")
2457 (nargs, args)
2458 int nargs;
2459 Lisp_Object *args;
2460 {
2461 return arith_driver (Amin, nargs, args);
2462 }
2463
2464 DEFUN ("logand", Flogand, Slogand, 0, MANY, 0,
2465 "Return bitwise-and of all the arguments.\n\
2466 Arguments may be integers, or markers converted to integers.")
2467 (nargs, args)
2468 int nargs;
2469 Lisp_Object *args;
2470 {
2471 return arith_driver (Alogand, nargs, args);
2472 }
2473
2474 DEFUN ("logior", Flogior, Slogior, 0, MANY, 0,
2475 "Return bitwise-or of all the arguments.\n\
2476 Arguments may be integers, or markers converted to integers.")
2477 (nargs, args)
2478 int nargs;
2479 Lisp_Object *args;
2480 {
2481 return arith_driver (Alogior, nargs, args);
2482 }
2483
2484 DEFUN ("logxor", Flogxor, Slogxor, 0, MANY, 0,
2485 "Return bitwise-exclusive-or of all the arguments.\n\
2486 Arguments may be integers, or markers converted to integers.")
2487 (nargs, args)
2488 int nargs;
2489 Lisp_Object *args;
2490 {
2491 return arith_driver (Alogxor, nargs, args);
2492 }
2493
2494 DEFUN ("ash", Fash, Sash, 2, 2, 0,
2495 "Return VALUE with its bits shifted left by COUNT.\n\
2496 If COUNT is negative, shifting is actually to the right.\n\
2497 In this case, the sign bit is duplicated.")
2498 (value, count)
2499 register Lisp_Object value, count;
2500 {
2501 register Lisp_Object val;
2502
2503 CHECK_NUMBER (value, 0);
2504 CHECK_NUMBER (count, 1);
2505
2506 if (XINT (count) >= BITS_PER_EMACS_INT)
2507 XSETINT (val, 0);
2508 else if (XINT (count) > 0)
2509 XSETINT (val, XINT (value) << XFASTINT (count));
2510 else if (XINT (count) <= -BITS_PER_EMACS_INT)
2511 XSETINT (val, XINT (value) < 0 ? -1 : 0);
2512 else
2513 XSETINT (val, XINT (value) >> -XINT (count));
2514 return val;
2515 }
2516
2517 DEFUN ("lsh", Flsh, Slsh, 2, 2, 0,
2518 "Return VALUE with its bits shifted left by COUNT.\n\
2519 If COUNT is negative, shifting is actually to the right.\n\
2520 In this case, zeros are shifted in on the left.")
2521 (value, count)
2522 register Lisp_Object value, count;
2523 {
2524 register Lisp_Object val;
2525
2526 CHECK_NUMBER (value, 0);
2527 CHECK_NUMBER (count, 1);
2528
2529 if (XINT (count) >= BITS_PER_EMACS_INT)
2530 XSETINT (val, 0);
2531 else if (XINT (count) > 0)
2532 XSETINT (val, (EMACS_UINT) XUINT (value) << XFASTINT (count));
2533 else if (XINT (count) <= -BITS_PER_EMACS_INT)
2534 XSETINT (val, 0);
2535 else
2536 XSETINT (val, (EMACS_UINT) XUINT (value) >> -XINT (count));
2537 return val;
2538 }
2539
2540 DEFUN ("1+", Fadd1, Sadd1, 1, 1, 0,
2541 "Return NUMBER plus one. NUMBER may be a number or a marker.\n\
2542 Markers are converted to integers.")
2543 (number)
2544 register Lisp_Object number;
2545 {
2546 #ifdef LISP_FLOAT_TYPE
2547 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number, 0);
2548
2549 if (FLOATP (number))
2550 return (make_float (1.0 + XFLOAT_DATA (number)));
2551 #else
2552 CHECK_NUMBER_COERCE_MARKER (number, 0);
2553 #endif /* LISP_FLOAT_TYPE */
2554
2555 XSETINT (number, XINT (number) + 1);
2556 return number;
2557 }
2558
2559 DEFUN ("1-", Fsub1, Ssub1, 1, 1, 0,
2560 "Return NUMBER minus one. NUMBER may be a number or a marker.\n\
2561 Markers are converted to integers.")
2562 (number)
2563 register Lisp_Object number;
2564 {
2565 #ifdef LISP_FLOAT_TYPE
2566 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number, 0);
2567
2568 if (FLOATP (number))
2569 return (make_float (-1.0 + XFLOAT_DATA (number)));
2570 #else
2571 CHECK_NUMBER_COERCE_MARKER (number, 0);
2572 #endif /* LISP_FLOAT_TYPE */
2573
2574 XSETINT (number, XINT (number) - 1);
2575 return number;
2576 }
2577
2578 DEFUN ("lognot", Flognot, Slognot, 1, 1, 0,
2579 "Return the bitwise complement of NUMBER. NUMBER must be an integer.")
2580 (number)
2581 register Lisp_Object number;
2582 {
2583 CHECK_NUMBER (number, 0);
2584 XSETINT (number, ~XINT (number));
2585 return number;
2586 }
2587 \f
2588 void
2589 syms_of_data ()
2590 {
2591 Lisp_Object error_tail, arith_tail;
2592
2593 Qquote = intern ("quote");
2594 Qlambda = intern ("lambda");
2595 Qsubr = intern ("subr");
2596 Qerror_conditions = intern ("error-conditions");
2597 Qerror_message = intern ("error-message");
2598 Qtop_level = intern ("top-level");
2599
2600 Qerror = intern ("error");
2601 Qquit = intern ("quit");
2602 Qwrong_type_argument = intern ("wrong-type-argument");
2603 Qargs_out_of_range = intern ("args-out-of-range");
2604 Qvoid_function = intern ("void-function");
2605 Qcyclic_function_indirection = intern ("cyclic-function-indirection");
2606 Qvoid_variable = intern ("void-variable");
2607 Qsetting_constant = intern ("setting-constant");
2608 Qinvalid_read_syntax = intern ("invalid-read-syntax");
2609
2610 Qinvalid_function = intern ("invalid-function");
2611 Qwrong_number_of_arguments = intern ("wrong-number-of-arguments");
2612 Qno_catch = intern ("no-catch");
2613 Qend_of_file = intern ("end-of-file");
2614 Qarith_error = intern ("arith-error");
2615 Qbeginning_of_buffer = intern ("beginning-of-buffer");
2616 Qend_of_buffer = intern ("end-of-buffer");
2617 Qbuffer_read_only = intern ("buffer-read-only");
2618 Qtext_read_only = intern ("text-read-only");
2619 Qmark_inactive = intern ("mark-inactive");
2620
2621 Qlistp = intern ("listp");
2622 Qconsp = intern ("consp");
2623 Qsymbolp = intern ("symbolp");
2624 Qkeywordp = intern ("keywordp");
2625 Qintegerp = intern ("integerp");
2626 Qnatnump = intern ("natnump");
2627 Qwholenump = intern ("wholenump");
2628 Qstringp = intern ("stringp");
2629 Qarrayp = intern ("arrayp");
2630 Qsequencep = intern ("sequencep");
2631 Qbufferp = intern ("bufferp");
2632 Qvectorp = intern ("vectorp");
2633 Qchar_or_string_p = intern ("char-or-string-p");
2634 Qmarkerp = intern ("markerp");
2635 Qbuffer_or_string_p = intern ("buffer-or-string-p");
2636 Qinteger_or_marker_p = intern ("integer-or-marker-p");
2637 Qboundp = intern ("boundp");
2638 Qfboundp = intern ("fboundp");
2639
2640 #ifdef LISP_FLOAT_TYPE
2641 Qfloatp = intern ("floatp");
2642 Qnumberp = intern ("numberp");
2643 Qnumber_or_marker_p = intern ("number-or-marker-p");
2644 #endif /* LISP_FLOAT_TYPE */
2645
2646 Qchar_table_p = intern ("char-table-p");
2647 Qvector_or_char_table_p = intern ("vector-or-char-table-p");
2648
2649 Qcdr = intern ("cdr");
2650
2651 /* Handle automatic advice activation */
2652 Qad_advice_info = intern ("ad-advice-info");
2653 Qad_activate_internal = intern ("ad-activate-internal");
2654
2655 error_tail = Fcons (Qerror, Qnil);
2656
2657 /* ERROR is used as a signaler for random errors for which nothing else is right */
2658
2659 Fput (Qerror, Qerror_conditions,
2660 error_tail);
2661 Fput (Qerror, Qerror_message,
2662 build_string ("error"));
2663
2664 Fput (Qquit, Qerror_conditions,
2665 Fcons (Qquit, Qnil));
2666 Fput (Qquit, Qerror_message,
2667 build_string ("Quit"));
2668
2669 Fput (Qwrong_type_argument, Qerror_conditions,
2670 Fcons (Qwrong_type_argument, error_tail));
2671 Fput (Qwrong_type_argument, Qerror_message,
2672 build_string ("Wrong type argument"));
2673
2674 Fput (Qargs_out_of_range, Qerror_conditions,
2675 Fcons (Qargs_out_of_range, error_tail));
2676 Fput (Qargs_out_of_range, Qerror_message,
2677 build_string ("Args out of range"));
2678
2679 Fput (Qvoid_function, Qerror_conditions,
2680 Fcons (Qvoid_function, error_tail));
2681 Fput (Qvoid_function, Qerror_message,
2682 build_string ("Symbol's function definition is void"));
2683
2684 Fput (Qcyclic_function_indirection, Qerror_conditions,
2685 Fcons (Qcyclic_function_indirection, error_tail));
2686 Fput (Qcyclic_function_indirection, Qerror_message,
2687 build_string ("Symbol's chain of function indirections contains a loop"));
2688
2689 Fput (Qvoid_variable, Qerror_conditions,
2690 Fcons (Qvoid_variable, error_tail));
2691 Fput (Qvoid_variable, Qerror_message,
2692 build_string ("Symbol's value as variable is void"));
2693
2694 Fput (Qsetting_constant, Qerror_conditions,
2695 Fcons (Qsetting_constant, error_tail));
2696 Fput (Qsetting_constant, Qerror_message,
2697 build_string ("Attempt to set a constant symbol"));
2698
2699 Fput (Qinvalid_read_syntax, Qerror_conditions,
2700 Fcons (Qinvalid_read_syntax, error_tail));
2701 Fput (Qinvalid_read_syntax, Qerror_message,
2702 build_string ("Invalid read syntax"));
2703
2704 Fput (Qinvalid_function, Qerror_conditions,
2705 Fcons (Qinvalid_function, error_tail));
2706 Fput (Qinvalid_function, Qerror_message,
2707 build_string ("Invalid function"));
2708
2709 Fput (Qwrong_number_of_arguments, Qerror_conditions,
2710 Fcons (Qwrong_number_of_arguments, error_tail));
2711 Fput (Qwrong_number_of_arguments, Qerror_message,
2712 build_string ("Wrong number of arguments"));
2713
2714 Fput (Qno_catch, Qerror_conditions,
2715 Fcons (Qno_catch, error_tail));
2716 Fput (Qno_catch, Qerror_message,
2717 build_string ("No catch for tag"));
2718
2719 Fput (Qend_of_file, Qerror_conditions,
2720 Fcons (Qend_of_file, error_tail));
2721 Fput (Qend_of_file, Qerror_message,
2722 build_string ("End of file during parsing"));
2723
2724 arith_tail = Fcons (Qarith_error, error_tail);
2725 Fput (Qarith_error, Qerror_conditions,
2726 arith_tail);
2727 Fput (Qarith_error, Qerror_message,
2728 build_string ("Arithmetic error"));
2729
2730 Fput (Qbeginning_of_buffer, Qerror_conditions,
2731 Fcons (Qbeginning_of_buffer, error_tail));
2732 Fput (Qbeginning_of_buffer, Qerror_message,
2733 build_string ("Beginning of buffer"));
2734
2735 Fput (Qend_of_buffer, Qerror_conditions,
2736 Fcons (Qend_of_buffer, error_tail));
2737 Fput (Qend_of_buffer, Qerror_message,
2738 build_string ("End of buffer"));
2739
2740 Fput (Qbuffer_read_only, Qerror_conditions,
2741 Fcons (Qbuffer_read_only, error_tail));
2742 Fput (Qbuffer_read_only, Qerror_message,
2743 build_string ("Buffer is read-only"));
2744
2745 Fput (Qtext_read_only, Qerror_conditions,
2746 Fcons (Qtext_read_only, error_tail));
2747 Fput (Qtext_read_only, Qerror_message,
2748 build_string ("Text is read-only"));
2749
2750 #ifdef LISP_FLOAT_TYPE
2751 Qrange_error = intern ("range-error");
2752 Qdomain_error = intern ("domain-error");
2753 Qsingularity_error = intern ("singularity-error");
2754 Qoverflow_error = intern ("overflow-error");
2755 Qunderflow_error = intern ("underflow-error");
2756
2757 Fput (Qdomain_error, Qerror_conditions,
2758 Fcons (Qdomain_error, arith_tail));
2759 Fput (Qdomain_error, Qerror_message,
2760 build_string ("Arithmetic domain error"));
2761
2762 Fput (Qrange_error, Qerror_conditions,
2763 Fcons (Qrange_error, arith_tail));
2764 Fput (Qrange_error, Qerror_message,
2765 build_string ("Arithmetic range error"));
2766
2767 Fput (Qsingularity_error, Qerror_conditions,
2768 Fcons (Qsingularity_error, Fcons (Qdomain_error, arith_tail)));
2769 Fput (Qsingularity_error, Qerror_message,
2770 build_string ("Arithmetic singularity error"));
2771
2772 Fput (Qoverflow_error, Qerror_conditions,
2773 Fcons (Qoverflow_error, Fcons (Qdomain_error, arith_tail)));
2774 Fput (Qoverflow_error, Qerror_message,
2775 build_string ("Arithmetic overflow error"));
2776
2777 Fput (Qunderflow_error, Qerror_conditions,
2778 Fcons (Qunderflow_error, Fcons (Qdomain_error, arith_tail)));
2779 Fput (Qunderflow_error, Qerror_message,
2780 build_string ("Arithmetic underflow error"));
2781
2782 staticpro (&Qrange_error);
2783 staticpro (&Qdomain_error);
2784 staticpro (&Qsingularity_error);
2785 staticpro (&Qoverflow_error);
2786 staticpro (&Qunderflow_error);
2787 #endif /* LISP_FLOAT_TYPE */
2788
2789 staticpro (&Qnil);
2790 staticpro (&Qt);
2791 staticpro (&Qquote);
2792 staticpro (&Qlambda);
2793 staticpro (&Qsubr);
2794 staticpro (&Qunbound);
2795 staticpro (&Qerror_conditions);
2796 staticpro (&Qerror_message);
2797 staticpro (&Qtop_level);
2798
2799 staticpro (&Qerror);
2800 staticpro (&Qquit);
2801 staticpro (&Qwrong_type_argument);
2802 staticpro (&Qargs_out_of_range);
2803 staticpro (&Qvoid_function);
2804 staticpro (&Qcyclic_function_indirection);
2805 staticpro (&Qvoid_variable);
2806 staticpro (&Qsetting_constant);
2807 staticpro (&Qinvalid_read_syntax);
2808 staticpro (&Qwrong_number_of_arguments);
2809 staticpro (&Qinvalid_function);
2810 staticpro (&Qno_catch);
2811 staticpro (&Qend_of_file);
2812 staticpro (&Qarith_error);
2813 staticpro (&Qbeginning_of_buffer);
2814 staticpro (&Qend_of_buffer);
2815 staticpro (&Qbuffer_read_only);
2816 staticpro (&Qtext_read_only);
2817 staticpro (&Qmark_inactive);
2818
2819 staticpro (&Qlistp);
2820 staticpro (&Qconsp);
2821 staticpro (&Qsymbolp);
2822 staticpro (&Qkeywordp);
2823 staticpro (&Qintegerp);
2824 staticpro (&Qnatnump);
2825 staticpro (&Qwholenump);
2826 staticpro (&Qstringp);
2827 staticpro (&Qarrayp);
2828 staticpro (&Qsequencep);
2829 staticpro (&Qbufferp);
2830 staticpro (&Qvectorp);
2831 staticpro (&Qchar_or_string_p);
2832 staticpro (&Qmarkerp);
2833 staticpro (&Qbuffer_or_string_p);
2834 staticpro (&Qinteger_or_marker_p);
2835 #ifdef LISP_FLOAT_TYPE
2836 staticpro (&Qfloatp);
2837 staticpro (&Qnumberp);
2838 staticpro (&Qnumber_or_marker_p);
2839 #endif /* LISP_FLOAT_TYPE */
2840 staticpro (&Qchar_table_p);
2841 staticpro (&Qvector_or_char_table_p);
2842
2843 staticpro (&Qboundp);
2844 staticpro (&Qfboundp);
2845 staticpro (&Qcdr);
2846 staticpro (&Qad_advice_info);
2847 staticpro (&Qad_activate_internal);
2848
2849 /* Types that type-of returns. */
2850 Qinteger = intern ("integer");
2851 Qsymbol = intern ("symbol");
2852 Qstring = intern ("string");
2853 Qcons = intern ("cons");
2854 Qmarker = intern ("marker");
2855 Qoverlay = intern ("overlay");
2856 Qfloat = intern ("float");
2857 Qwindow_configuration = intern ("window-configuration");
2858 Qprocess = intern ("process");
2859 Qwindow = intern ("window");
2860 /* Qsubr = intern ("subr"); */
2861 Qcompiled_function = intern ("compiled-function");
2862 Qbuffer = intern ("buffer");
2863 Qframe = intern ("frame");
2864 Qvector = intern ("vector");
2865 Qchar_table = intern ("char-table");
2866 Qbool_vector = intern ("bool-vector");
2867 Qhash_table = intern ("hash-table");
2868
2869 staticpro (&Qinteger);
2870 staticpro (&Qsymbol);
2871 staticpro (&Qstring);
2872 staticpro (&Qcons);
2873 staticpro (&Qmarker);
2874 staticpro (&Qoverlay);
2875 staticpro (&Qfloat);
2876 staticpro (&Qwindow_configuration);
2877 staticpro (&Qprocess);
2878 staticpro (&Qwindow);
2879 /* staticpro (&Qsubr); */
2880 staticpro (&Qcompiled_function);
2881 staticpro (&Qbuffer);
2882 staticpro (&Qframe);
2883 staticpro (&Qvector);
2884 staticpro (&Qchar_table);
2885 staticpro (&Qbool_vector);
2886 staticpro (&Qhash_table);
2887
2888 DEFVAR_BOOL ("keyword-symbols-constant-flag", &keyword_symbols_constant_flag,
2889 "Non-nil means it is an error to set a keyword symbol.\n\
2890 A keyword symbol is a symbol whose name starts with a colon (`:').");
2891 keyword_symbols_constant_flag = 1;
2892
2893 defsubr (&Seq);
2894 defsubr (&Snull);
2895 defsubr (&Stype_of);
2896 defsubr (&Slistp);
2897 defsubr (&Snlistp);
2898 defsubr (&Sconsp);
2899 defsubr (&Satom);
2900 defsubr (&Sintegerp);
2901 defsubr (&Sinteger_or_marker_p);
2902 defsubr (&Snumberp);
2903 defsubr (&Snumber_or_marker_p);
2904 #ifdef LISP_FLOAT_TYPE
2905 defsubr (&Sfloatp);
2906 #endif /* LISP_FLOAT_TYPE */
2907 defsubr (&Snatnump);
2908 defsubr (&Ssymbolp);
2909 defsubr (&Skeywordp);
2910 defsubr (&Sstringp);
2911 defsubr (&Smultibyte_string_p);
2912 defsubr (&Svectorp);
2913 defsubr (&Schar_table_p);
2914 defsubr (&Svector_or_char_table_p);
2915 defsubr (&Sbool_vector_p);
2916 defsubr (&Sarrayp);
2917 defsubr (&Ssequencep);
2918 defsubr (&Sbufferp);
2919 defsubr (&Smarkerp);
2920 defsubr (&Ssubrp);
2921 defsubr (&Sbyte_code_function_p);
2922 defsubr (&Schar_or_string_p);
2923 defsubr (&Scar);
2924 defsubr (&Scdr);
2925 defsubr (&Scar_safe);
2926 defsubr (&Scdr_safe);
2927 defsubr (&Ssetcar);
2928 defsubr (&Ssetcdr);
2929 defsubr (&Ssymbol_function);
2930 defsubr (&Sindirect_function);
2931 defsubr (&Ssymbol_plist);
2932 defsubr (&Ssymbol_name);
2933 defsubr (&Smakunbound);
2934 defsubr (&Sfmakunbound);
2935 defsubr (&Sboundp);
2936 defsubr (&Sfboundp);
2937 defsubr (&Sfset);
2938 defsubr (&Sdefalias);
2939 defsubr (&Ssetplist);
2940 defsubr (&Ssymbol_value);
2941 defsubr (&Sset);
2942 defsubr (&Sdefault_boundp);
2943 defsubr (&Sdefault_value);
2944 defsubr (&Sset_default);
2945 defsubr (&Ssetq_default);
2946 defsubr (&Smake_variable_buffer_local);
2947 defsubr (&Smake_local_variable);
2948 defsubr (&Skill_local_variable);
2949 defsubr (&Smake_variable_frame_local);
2950 defsubr (&Slocal_variable_p);
2951 defsubr (&Slocal_variable_if_set_p);
2952 defsubr (&Saref);
2953 defsubr (&Saset);
2954 defsubr (&Snumber_to_string);
2955 defsubr (&Sstring_to_number);
2956 defsubr (&Seqlsign);
2957 defsubr (&Slss);
2958 defsubr (&Sgtr);
2959 defsubr (&Sleq);
2960 defsubr (&Sgeq);
2961 defsubr (&Sneq);
2962 defsubr (&Szerop);
2963 defsubr (&Splus);
2964 defsubr (&Sminus);
2965 defsubr (&Stimes);
2966 defsubr (&Squo);
2967 defsubr (&Srem);
2968 defsubr (&Smod);
2969 defsubr (&Smax);
2970 defsubr (&Smin);
2971 defsubr (&Slogand);
2972 defsubr (&Slogior);
2973 defsubr (&Slogxor);
2974 defsubr (&Slsh);
2975 defsubr (&Sash);
2976 defsubr (&Sadd1);
2977 defsubr (&Ssub1);
2978 defsubr (&Slognot);
2979
2980 XSYMBOL (Qwholenump)->function = XSYMBOL (Qnatnump)->function;
2981 }
2982
2983 SIGTYPE
2984 arith_error (signo)
2985 int signo;
2986 {
2987 #if defined(USG) && !defined(POSIX_SIGNALS)
2988 /* USG systems forget handlers when they are used;
2989 must reestablish each time */
2990 signal (signo, arith_error);
2991 #endif /* USG */
2992 #ifdef VMS
2993 /* VMS systems are like USG. */
2994 signal (signo, arith_error);
2995 #endif /* VMS */
2996 #ifdef BSD4_1
2997 sigrelse (SIGFPE);
2998 #else /* not BSD4_1 */
2999 sigsetmask (SIGEMPTYMASK);
3000 #endif /* not BSD4_1 */
3001
3002 Fsignal (Qarith_error, Qnil);
3003 }
3004
3005 void
3006 init_data ()
3007 {
3008 /* Don't do this if just dumping out.
3009 We don't want to call `signal' in this case
3010 so that we don't have trouble with dumping
3011 signal-delivering routines in an inconsistent state. */
3012 #ifndef CANNOT_DUMP
3013 if (!initialized)
3014 return;
3015 #endif /* CANNOT_DUMP */
3016 signal (SIGFPE, arith_error);
3017
3018 #ifdef uts
3019 signal (SIGEMT, arith_error);
3020 #endif /* uts */
3021 }