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