(Farray_length): Delete this obsolete function.
[bpt/emacs.git] / src / data.c
1 /* Primitive operations on Lisp data types for GNU Emacs Lisp interpreter.
2 Copyright (C) 1985, 1986, 1988, 1993, 1994 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 1, 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, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20
21 #include <signal.h>
22
23 #include <config.h>
24 #include "lisp.h"
25 #include "puresize.h"
26
27 #ifndef standalone
28 #include "buffer.h"
29 #endif
30
31 #include "syssignal.h"
32
33 #ifdef MSDOS
34 /* These are redefined (correctly, but differently) in values.h. */
35 #undef INTBITS
36 #undef LONGBITS
37 #undef SHORTBITS
38 #endif
39
40 #ifdef LISP_FLOAT_TYPE
41
42 #ifdef STDC_HEADERS
43 #include <stdlib.h>
44 #endif
45
46 /* Work around a problem that happens because math.h on hpux 7
47 defines two static variables--which, in Emacs, are not really static,
48 because `static' is defined as nothing. The problem is that they are
49 here, in floatfns.c, and in lread.c.
50 These macros prevent the name conflict. */
51 #if defined (HPUX) && !defined (HPUX8)
52 #define _MAXLDBL data_c_maxldbl
53 #define _NMAXLDBL data_c_nmaxldbl
54 #endif
55
56 #include <math.h>
57 #endif /* LISP_FLOAT_TYPE */
58
59 #if !defined (atof)
60 extern double atof ();
61 #endif /* !atof */
62
63 Lisp_Object Qnil, Qt, Qquote, Qlambda, Qsubr, Qunbound;
64 Lisp_Object Qerror_conditions, Qerror_message, Qtop_level;
65 Lisp_Object Qerror, Qquit, Qwrong_type_argument, Qargs_out_of_range;
66 Lisp_Object Qvoid_variable, Qvoid_function, Qcyclic_function_indirection;
67 Lisp_Object Qsetting_constant, Qinvalid_read_syntax;
68 Lisp_Object Qinvalid_function, Qwrong_number_of_arguments, Qno_catch;
69 Lisp_Object Qend_of_file, Qarith_error, Qmark_inactive;
70 Lisp_Object Qbeginning_of_buffer, Qend_of_buffer, Qbuffer_read_only;
71 Lisp_Object Qintegerp, Qnatnump, Qwholenump, Qsymbolp, Qlistp, Qconsp;
72 Lisp_Object Qstringp, Qarrayp, Qsequencep, Qbufferp;
73 Lisp_Object Qchar_or_string_p, Qmarkerp, Qinteger_or_marker_p, Qvectorp;
74 Lisp_Object Qbuffer_or_string_p;
75 Lisp_Object Qboundp, Qfboundp;
76 Lisp_Object Qcdr;
77 Lisp_Object Qad_advice_info, Qad_activate;
78
79 Lisp_Object Qrange_error, Qdomain_error, Qsingularity_error;
80 Lisp_Object Qoverflow_error, Qunderflow_error;
81
82 #ifdef LISP_FLOAT_TYPE
83 Lisp_Object Qfloatp;
84 Lisp_Object Qnumberp, Qnumber_or_marker_p;
85 #endif
86
87 static Lisp_Object swap_in_symval_forwarding ();
88
89 Lisp_Object
90 wrong_type_argument (predicate, value)
91 register Lisp_Object predicate, value;
92 {
93 register Lisp_Object tem;
94 do
95 {
96 if (!EQ (Vmocklisp_arguments, Qt))
97 {
98 if (STRINGP (value) &&
99 (EQ (predicate, Qintegerp) || EQ (predicate, Qinteger_or_marker_p)))
100 return Fstring_to_number (value);
101 if (INTEGERP (value) && EQ (predicate, Qstringp))
102 return Fnumber_to_string (value);
103 }
104 value = Fsignal (Qwrong_type_argument, Fcons (predicate, Fcons (value, Qnil)));
105 tem = call1 (predicate, value);
106 }
107 while (NILP (tem));
108 return value;
109 }
110
111 pure_write_error ()
112 {
113 error ("Attempt to modify read-only object");
114 }
115
116 void
117 args_out_of_range (a1, a2)
118 Lisp_Object a1, a2;
119 {
120 while (1)
121 Fsignal (Qargs_out_of_range, Fcons (a1, Fcons (a2, Qnil)));
122 }
123
124 void
125 args_out_of_range_3 (a1, a2, a3)
126 Lisp_Object a1, a2, a3;
127 {
128 while (1)
129 Fsignal (Qargs_out_of_range, Fcons (a1, Fcons (a2, Fcons (a3, Qnil))));
130 }
131
132 Lisp_Object
133 make_number (num)
134 int num;
135 {
136 register Lisp_Object val;
137 XSETINT (val, num);
138 return val;
139 }
140
141 /* On some machines, XINT needs a temporary location.
142 Here it is, in case it is needed. */
143
144 int sign_extend_temp;
145
146 /* On a few machines, XINT can only be done by calling this. */
147
148 int
149 sign_extend_lisp_int (num)
150 EMACS_INT num;
151 {
152 if (num & (((EMACS_INT) 1) << (VALBITS - 1)))
153 return num | (((EMACS_INT) (-1)) << VALBITS);
154 else
155 return num & ((((EMACS_INT) 1) << VALBITS) - 1);
156 }
157 \f
158 /* Data type predicates */
159
160 DEFUN ("eq", Feq, Seq, 2, 2, 0,
161 "T if the two args are the same Lisp object.")
162 (obj1, obj2)
163 Lisp_Object obj1, obj2;
164 {
165 if (EQ (obj1, obj2))
166 return Qt;
167 return Qnil;
168 }
169
170 DEFUN ("null", Fnull, Snull, 1, 1, 0, "T if OBJECT is nil.")
171 (obj)
172 Lisp_Object obj;
173 {
174 if (NILP (obj))
175 return Qt;
176 return Qnil;
177 }
178
179 DEFUN ("consp", Fconsp, Sconsp, 1, 1, 0, "T if OBJECT is a cons cell.")
180 (obj)
181 Lisp_Object obj;
182 {
183 if (CONSP (obj))
184 return Qt;
185 return Qnil;
186 }
187
188 DEFUN ("atom", Fatom, Satom, 1, 1, 0, "T if OBJECT is not a cons cell. This includes nil.")
189 (obj)
190 Lisp_Object obj;
191 {
192 if (CONSP (obj))
193 return Qnil;
194 return Qt;
195 }
196
197 DEFUN ("listp", Flistp, Slistp, 1, 1, 0, "T if OBJECT is a list. This includes nil.")
198 (obj)
199 Lisp_Object obj;
200 {
201 if (CONSP (obj) || NILP (obj))
202 return Qt;
203 return Qnil;
204 }
205
206 DEFUN ("nlistp", Fnlistp, Snlistp, 1, 1, 0, "T if OBJECT is not a list. Lists include nil.")
207 (obj)
208 Lisp_Object obj;
209 {
210 if (CONSP (obj) || NILP (obj))
211 return Qnil;
212 return Qt;
213 }
214 \f
215 DEFUN ("symbolp", Fsymbolp, Ssymbolp, 1, 1, 0, "T if OBJECT is a symbol.")
216 (obj)
217 Lisp_Object obj;
218 {
219 if (SYMBOLP (obj))
220 return Qt;
221 return Qnil;
222 }
223
224 DEFUN ("vectorp", Fvectorp, Svectorp, 1, 1, 0, "T if OBJECT is a vector.")
225 (obj)
226 Lisp_Object obj;
227 {
228 if (VECTORP (obj))
229 return Qt;
230 return Qnil;
231 }
232
233 DEFUN ("stringp", Fstringp, Sstringp, 1, 1, 0, "T if OBJECT is a string.")
234 (obj)
235 Lisp_Object obj;
236 {
237 if (STRINGP (obj))
238 return Qt;
239 return Qnil;
240 }
241
242 DEFUN ("arrayp", Farrayp, Sarrayp, 1, 1, 0, "T if OBJECT is an array (string or vector).")
243 (obj)
244 Lisp_Object obj;
245 {
246 if (VECTORP (obj) || STRINGP (obj))
247 return Qt;
248 return Qnil;
249 }
250
251 DEFUN ("sequencep", Fsequencep, Ssequencep, 1, 1, 0,
252 "T if OBJECT is a sequence (list or array).")
253 (obj)
254 register Lisp_Object obj;
255 {
256 if (CONSP (obj) || NILP (obj) || VECTORP (obj) || STRINGP (obj))
257 return Qt;
258 return Qnil;
259 }
260
261 DEFUN ("bufferp", Fbufferp, Sbufferp, 1, 1, 0, "T if OBJECT is an editor buffer.")
262 (obj)
263 Lisp_Object obj;
264 {
265 if (BUFFERP (obj))
266 return Qt;
267 return Qnil;
268 }
269
270 DEFUN ("markerp", Fmarkerp, Smarkerp, 1, 1, 0, "T if OBJECT is a marker (editor pointer).")
271 (obj)
272 Lisp_Object obj;
273 {
274 if (MARKERP (obj))
275 return Qt;
276 return Qnil;
277 }
278
279 DEFUN ("subrp", Fsubrp, Ssubrp, 1, 1, 0, "T if OBJECT is a built-in function.")
280 (obj)
281 Lisp_Object obj;
282 {
283 if (SUBRP (obj))
284 return Qt;
285 return Qnil;
286 }
287
288 DEFUN ("byte-code-function-p", Fbyte_code_function_p, Sbyte_code_function_p,
289 1, 1, 0, "T if OBJECT is a byte-compiled function object.")
290 (obj)
291 Lisp_Object obj;
292 {
293 if (COMPILEDP (obj))
294 return Qt;
295 return Qnil;
296 }
297
298 DEFUN ("char-or-string-p", Fchar_or_string_p, Schar_or_string_p, 1, 1, 0,
299 "T if OBJECT is a character (an integer) or a string.")
300 (obj)
301 register Lisp_Object obj;
302 {
303 if (INTEGERP (obj) || STRINGP (obj))
304 return Qt;
305 return Qnil;
306 }
307 \f
308 DEFUN ("integerp", Fintegerp, Sintegerp, 1, 1, 0, "T if OBJECT is an integer.")
309 (obj)
310 Lisp_Object obj;
311 {
312 if (INTEGERP (obj))
313 return Qt;
314 return Qnil;
315 }
316
317 DEFUN ("integer-or-marker-p", Finteger_or_marker_p, Sinteger_or_marker_p, 1, 1, 0,
318 "T if OBJECT is an integer or a marker (editor pointer).")
319 (obj)
320 register Lisp_Object obj;
321 {
322 if (MARKERP (obj) || INTEGERP (obj))
323 return Qt;
324 return Qnil;
325 }
326
327 DEFUN ("natnump", Fnatnump, Snatnump, 1, 1, 0,
328 "T if OBJECT is a nonnegative integer.")
329 (obj)
330 Lisp_Object obj;
331 {
332 if (NATNUMP (obj))
333 return Qt;
334 return Qnil;
335 }
336
337 DEFUN ("numberp", Fnumberp, Snumberp, 1, 1, 0,
338 "T if OBJECT is a number (floating point or integer).")
339 (obj)
340 Lisp_Object obj;
341 {
342 if (NUMBERP (obj))
343 return Qt;
344 else
345 return Qnil;
346 }
347
348 DEFUN ("number-or-marker-p", Fnumber_or_marker_p,
349 Snumber_or_marker_p, 1, 1, 0,
350 "T if OBJECT is a number or a marker.")
351 (obj)
352 Lisp_Object obj;
353 {
354 if (NUMBERP (obj) || MARKERP (obj))
355 return Qt;
356 return Qnil;
357 }
358
359 #ifdef LISP_FLOAT_TYPE
360 DEFUN ("floatp", Ffloatp, Sfloatp, 1, 1, 0,
361 "T if OBJECT is a floating point number.")
362 (obj)
363 Lisp_Object obj;
364 {
365 if (FLOATP (obj))
366 return Qt;
367 return Qnil;
368 }
369 #endif /* LISP_FLOAT_TYPE */
370 \f
371 /* Extract and set components of lists */
372
373 DEFUN ("car", Fcar, Scar, 1, 1, 0,
374 "Return the car of CONSCELL. If arg is nil, return nil.\n\
375 Error if arg is not nil and not a cons cell. See also `car-safe'.")
376 (list)
377 register Lisp_Object list;
378 {
379 while (1)
380 {
381 if (CONSP (list))
382 return XCONS (list)->car;
383 else if (EQ (list, Qnil))
384 return Qnil;
385 else
386 list = wrong_type_argument (Qlistp, list);
387 }
388 }
389
390 DEFUN ("car-safe", Fcar_safe, Scar_safe, 1, 1, 0,
391 "Return the car of OBJECT if it is a cons cell, or else nil.")
392 (object)
393 Lisp_Object object;
394 {
395 if (CONSP (object))
396 return XCONS (object)->car;
397 else
398 return Qnil;
399 }
400
401 DEFUN ("cdr", Fcdr, Scdr, 1, 1, 0,
402 "Return the cdr of CONSCELL. If arg is nil, return nil.\n\
403 Error if arg is not nil and not a cons cell. See also `cdr-safe'.")
404
405 (list)
406 register Lisp_Object list;
407 {
408 while (1)
409 {
410 if (CONSP (list))
411 return XCONS (list)->cdr;
412 else if (EQ (list, Qnil))
413 return Qnil;
414 else
415 list = wrong_type_argument (Qlistp, list);
416 }
417 }
418
419 DEFUN ("cdr-safe", Fcdr_safe, Scdr_safe, 1, 1, 0,
420 "Return the cdr of OBJECT if it is a cons cell, or else nil.")
421 (object)
422 Lisp_Object object;
423 {
424 if (CONSP (object))
425 return XCONS (object)->cdr;
426 else
427 return Qnil;
428 }
429
430 DEFUN ("setcar", Fsetcar, Ssetcar, 2, 2, 0,
431 "Set the car of CONSCELL to be NEWCAR. Returns NEWCAR.")
432 (cell, newcar)
433 register Lisp_Object cell, newcar;
434 {
435 if (!CONSP (cell))
436 cell = wrong_type_argument (Qconsp, cell);
437
438 CHECK_IMPURE (cell);
439 XCONS (cell)->car = newcar;
440 return newcar;
441 }
442
443 DEFUN ("setcdr", Fsetcdr, Ssetcdr, 2, 2, 0,
444 "Set the cdr of CONSCELL to be NEWCDR. Returns NEWCDR.")
445 (cell, newcdr)
446 register Lisp_Object cell, newcdr;
447 {
448 if (!CONSP (cell))
449 cell = wrong_type_argument (Qconsp, cell);
450
451 CHECK_IMPURE (cell);
452 XCONS (cell)->cdr = newcdr;
453 return newcdr;
454 }
455 \f
456 /* Extract and set components of symbols */
457
458 DEFUN ("boundp", Fboundp, Sboundp, 1, 1, 0, "T if SYMBOL's value is not void.")
459 (sym)
460 register Lisp_Object sym;
461 {
462 Lisp_Object valcontents;
463 CHECK_SYMBOL (sym, 0);
464
465 valcontents = XSYMBOL (sym)->value;
466
467 if (BUFFER_LOCAL_VALUEP (valcontents)
468 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
469 valcontents = swap_in_symval_forwarding (sym, valcontents);
470
471 return (EQ (valcontents, Qunbound) ? Qnil : Qt);
472 }
473
474 DEFUN ("fboundp", Ffboundp, Sfboundp, 1, 1, 0, "T if SYMBOL's function definition is not void.")
475 (sym)
476 register Lisp_Object sym;
477 {
478 CHECK_SYMBOL (sym, 0);
479 return (EQ (XSYMBOL (sym)->function, Qunbound) ? Qnil : Qt);
480 }
481
482 DEFUN ("makunbound", Fmakunbound, Smakunbound, 1, 1, 0, "Make SYMBOL's value be void.")
483 (sym)
484 register Lisp_Object sym;
485 {
486 CHECK_SYMBOL (sym, 0);
487 if (NILP (sym) || EQ (sym, Qt))
488 return Fsignal (Qsetting_constant, Fcons (sym, Qnil));
489 Fset (sym, Qunbound);
490 return sym;
491 }
492
493 DEFUN ("fmakunbound", Ffmakunbound, Sfmakunbound, 1, 1, 0, "Make SYMBOL's function definition be void.")
494 (sym)
495 register Lisp_Object sym;
496 {
497 CHECK_SYMBOL (sym, 0);
498 if (NILP (sym) || EQ (sym, Qt))
499 return Fsignal (Qsetting_constant, Fcons (sym, Qnil));
500 XSYMBOL (sym)->function = Qunbound;
501 return sym;
502 }
503
504 DEFUN ("symbol-function", Fsymbol_function, Ssymbol_function, 1, 1, 0,
505 "Return SYMBOL's function definition. Error if that is void.")
506 (symbol)
507 register Lisp_Object symbol;
508 {
509 CHECK_SYMBOL (symbol, 0);
510 if (EQ (XSYMBOL (symbol)->function, Qunbound))
511 return Fsignal (Qvoid_function, Fcons (symbol, Qnil));
512 return XSYMBOL (symbol)->function;
513 }
514
515 DEFUN ("symbol-plist", Fsymbol_plist, Ssymbol_plist, 1, 1, 0, "Return SYMBOL's property list.")
516 (sym)
517 register Lisp_Object sym;
518 {
519 CHECK_SYMBOL (sym, 0);
520 return XSYMBOL (sym)->plist;
521 }
522
523 DEFUN ("symbol-name", Fsymbol_name, Ssymbol_name, 1, 1, 0, "Return SYMBOL's name, a string.")
524 (sym)
525 register Lisp_Object sym;
526 {
527 register Lisp_Object name;
528
529 CHECK_SYMBOL (sym, 0);
530 XSETSTRING (name, XSYMBOL (sym)->name);
531 return name;
532 }
533
534 DEFUN ("fset", Ffset, Sfset, 2, 2, 0,
535 "Set SYMBOL's function definition to NEWVAL, and return NEWVAL.")
536 (sym, newdef)
537 register Lisp_Object sym, newdef;
538 {
539 CHECK_SYMBOL (sym, 0);
540 if (NILP (sym) || EQ (sym, Qt))
541 return Fsignal (Qsetting_constant, Fcons (sym, Qnil));
542 if (!NILP (Vautoload_queue) && !EQ (XSYMBOL (sym)->function, Qunbound))
543 Vautoload_queue = Fcons (Fcons (sym, XSYMBOL (sym)->function),
544 Vautoload_queue);
545 XSYMBOL (sym)->function = newdef;
546 /* Handle automatic advice activation */
547 if (CONSP (XSYMBOL (sym)->plist) && !NILP (Fget (sym, Qad_advice_info)))
548 {
549 call2 (Qad_activate, sym, Qnil);
550 newdef = XSYMBOL (sym)->function;
551 }
552 return newdef;
553 }
554
555 /* This name should be removed once it is eliminated from elsewhere. */
556
557 DEFUN ("defalias", Fdefalias, Sdefalias, 2, 2, 0,
558 "Set SYMBOL's function definition to NEWVAL, and return NEWVAL.\n\
559 Associates the function with the current load file, if any.")
560 (sym, newdef)
561 register Lisp_Object sym, newdef;
562 {
563 CHECK_SYMBOL (sym, 0);
564 if (!NILP (Vautoload_queue) && !EQ (XSYMBOL (sym)->function, Qunbound))
565 Vautoload_queue = Fcons (Fcons (sym, XSYMBOL (sym)->function),
566 Vautoload_queue);
567 XSYMBOL (sym)->function = newdef;
568 /* Handle automatic advice activation */
569 if (CONSP (XSYMBOL (sym)->plist) && !NILP (Fget (sym, Qad_advice_info)))
570 {
571 call2 (Qad_activate, sym, Qnil);
572 newdef = XSYMBOL (sym)->function;
573 }
574 LOADHIST_ATTACH (sym);
575 return newdef;
576 }
577
578 DEFUN ("define-function", Fdefine_function, Sdefine_function, 2, 2, 0,
579 "Set SYMBOL's function definition to NEWVAL, and return NEWVAL.\n\
580 Associates the function with the current load file, if any.")
581 (sym, newdef)
582 register Lisp_Object sym, newdef;
583 {
584 CHECK_SYMBOL (sym, 0);
585 if (!NILP (Vautoload_queue) && !EQ (XSYMBOL (sym)->function, Qunbound))
586 Vautoload_queue = Fcons (Fcons (sym, XSYMBOL (sym)->function),
587 Vautoload_queue);
588 XSYMBOL (sym)->function = newdef;
589 /* Handle automatic advice activation */
590 if (CONSP (XSYMBOL (sym)->plist) && !NILP (Fget (sym, Qad_advice_info)))
591 {
592 call2 (Qad_activate, sym, Qnil);
593 newdef = XSYMBOL (sym)->function;
594 }
595 LOADHIST_ATTACH (sym);
596 return newdef;
597 }
598
599 DEFUN ("setplist", Fsetplist, Ssetplist, 2, 2, 0,
600 "Set SYMBOL's property list to NEWVAL, and return NEWVAL.")
601 (sym, newplist)
602 register Lisp_Object sym, newplist;
603 {
604 CHECK_SYMBOL (sym, 0);
605 XSYMBOL (sym)->plist = newplist;
606 return newplist;
607 }
608
609 \f
610 /* Getting and setting values of symbols */
611
612 /* Given the raw contents of a symbol value cell,
613 return the Lisp value of the symbol.
614 This does not handle buffer-local variables; use
615 swap_in_symval_forwarding for that. */
616
617 Lisp_Object
618 do_symval_forwarding (valcontents)
619 register Lisp_Object valcontents;
620 {
621 register Lisp_Object val;
622 int offset;
623 if (MISCP (valcontents))
624 switch (XMISC (valcontents)->type)
625 {
626 case Lisp_Misc_Intfwd:
627 XSETINT (val, *XINTFWD (valcontents)->intvar);
628 return val;
629
630 case Lisp_Misc_Boolfwd:
631 return (*XBOOLFWD (valcontents)->boolvar ? Qt : Qnil);
632
633 case Lisp_Misc_Objfwd:
634 return *XOBJFWD (valcontents)->objvar;
635
636 case Lisp_Misc_Buffer_Objfwd:
637 offset = XBUFFER_OBJFWD (valcontents)->offset;
638 return *(Lisp_Object *)(offset + (char *)current_buffer);
639 }
640 return valcontents;
641 }
642
643 /* Store NEWVAL into SYM, where VALCONTENTS is found in the value cell
644 of SYM. If SYM is buffer-local, VALCONTENTS should be the
645 buffer-independent contents of the value cell: forwarded just one
646 step past the buffer-localness. */
647
648 void
649 store_symval_forwarding (sym, valcontents, newval)
650 Lisp_Object sym;
651 register Lisp_Object valcontents, newval;
652 {
653 #ifdef SWITCH_ENUM_BUG
654 switch ((int) XTYPE (valcontents))
655 #else
656 switch (XTYPE (valcontents))
657 #endif
658 {
659 case Lisp_Misc:
660 switch (XMISC (valcontents)->type)
661 {
662 case Lisp_Misc_Intfwd:
663 CHECK_NUMBER (newval, 1);
664 *XINTFWD (valcontents)->intvar = XINT (newval);
665 break;
666
667 case Lisp_Misc_Boolfwd:
668 *XBOOLFWD (valcontents)->boolvar = NILP (newval) ? 0 : 1;
669 break;
670
671 case Lisp_Misc_Objfwd:
672 *XOBJFWD (valcontents)->objvar = newval;
673 break;
674
675 case Lisp_Misc_Buffer_Objfwd:
676 {
677 int offset = XBUFFER_OBJFWD (valcontents)->offset;
678 Lisp_Object type;
679
680 type = *(Lisp_Object *)(offset + (char *)&buffer_local_types);
681 if (! NILP (type) && ! NILP (newval)
682 && XTYPE (newval) != XINT (type))
683 buffer_slot_type_mismatch (offset);
684
685 *(Lisp_Object *)(offset + (char *)current_buffer) = newval;
686 break;
687 }
688 default:
689 goto def;
690 }
691 break;
692
693 default:
694 def:
695 valcontents = XSYMBOL (sym)->value;
696 if (BUFFER_LOCAL_VALUEP (valcontents)
697 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
698 XBUFFER_LOCAL_VALUE (valcontents)->car = newval;
699 else
700 XSYMBOL (sym)->value = newval;
701 }
702 }
703
704 /* Set up the buffer-local symbol SYM for validity in the current
705 buffer. VALCONTENTS is the contents of its value cell.
706 Return the value forwarded one step past the buffer-local indicator. */
707
708 static Lisp_Object
709 swap_in_symval_forwarding (sym, valcontents)
710 Lisp_Object sym, valcontents;
711 {
712 /* valcontents is a list
713 (REALVALUE BUFFER CURRENT-ALIST-ELEMENT . DEFAULT-VALUE)).
714
715 CURRENT-ALIST-ELEMENT is a pointer to an element of BUFFER's
716 local_var_alist, that being the element whose car is this
717 variable. Or it can be a pointer to the
718 (CURRENT-ALIST-ELEMENT . DEFAULT-VALUE), if BUFFER does not have
719 an element in its alist for this variable.
720
721 If the current buffer is not BUFFER, we store the current
722 REALVALUE value into CURRENT-ALIST-ELEMENT, then find the
723 appropriate alist element for the buffer now current and set up
724 CURRENT-ALIST-ELEMENT. Then we set REALVALUE out of that
725 element, and store into BUFFER.
726
727 Note that REALVALUE can be a forwarding pointer. */
728
729 register Lisp_Object tem1;
730 tem1 = XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->car;
731
732 if (NILP (tem1) || current_buffer != XBUFFER (tem1))
733 {
734 tem1 = XCONS (XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->cdr)->car;
735 Fsetcdr (tem1,
736 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->car));
737 tem1 = assq_no_quit (sym, current_buffer->local_var_alist);
738 if (NILP (tem1))
739 tem1 = XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->cdr;
740 XCONS (XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->cdr)->car = tem1;
741 XSETBUFFER (XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->car,
742 current_buffer);
743 store_symval_forwarding (sym, XBUFFER_LOCAL_VALUE (valcontents)->car,
744 Fcdr (tem1));
745 }
746 return XBUFFER_LOCAL_VALUE (valcontents)->car;
747 }
748 \f
749 /* Find the value of a symbol, returning Qunbound if it's not bound.
750 This is helpful for code which just wants to get a variable's value
751 if it has one, without signalling an error.
752 Note that it must not be possible to quit
753 within this function. Great care is required for this. */
754
755 Lisp_Object
756 find_symbol_value (sym)
757 Lisp_Object sym;
758 {
759 register Lisp_Object valcontents, tem1;
760 register Lisp_Object val;
761 CHECK_SYMBOL (sym, 0);
762 valcontents = XSYMBOL (sym)->value;
763
764 if (BUFFER_LOCAL_VALUEP (valcontents)
765 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
766 valcontents = swap_in_symval_forwarding (sym, valcontents);
767
768 if (MISCP (valcontents))
769 {
770 switch (XMISC (valcontents)->type)
771 {
772 case Lisp_Misc_Intfwd:
773 XSETINT (val, *XINTFWD (valcontents)->intvar);
774 return val;
775
776 case Lisp_Misc_Boolfwd:
777 return (*XBOOLFWD (valcontents)->boolvar ? Qt : Qnil);
778
779 case Lisp_Misc_Objfwd:
780 return *XOBJFWD (valcontents)->objvar;
781
782 case Lisp_Misc_Buffer_Objfwd:
783 return *(Lisp_Object *)(XBUFFER_OBJFWD (valcontents)->offset
784 + (char *)current_buffer);
785 }
786 }
787
788 return valcontents;
789 }
790
791 DEFUN ("symbol-value", Fsymbol_value, Ssymbol_value, 1, 1, 0,
792 "Return SYMBOL's value. Error if that is void.")
793 (sym)
794 Lisp_Object sym;
795 {
796 Lisp_Object val;
797
798 val = find_symbol_value (sym);
799 if (EQ (val, Qunbound))
800 return Fsignal (Qvoid_variable, Fcons (sym, Qnil));
801 else
802 return val;
803 }
804
805 DEFUN ("set", Fset, Sset, 2, 2, 0,
806 "Set SYMBOL's value to NEWVAL, and return NEWVAL.")
807 (sym, newval)
808 register Lisp_Object sym, newval;
809 {
810 int voide = EQ (newval, Qunbound);
811
812 register Lisp_Object valcontents, tem1, current_alist_element;
813
814 CHECK_SYMBOL (sym, 0);
815 if (NILP (sym) || EQ (sym, Qt))
816 return Fsignal (Qsetting_constant, Fcons (sym, Qnil));
817 valcontents = XSYMBOL (sym)->value;
818
819 if (BUFFER_OBJFWDP (valcontents))
820 {
821 register int idx = XBUFFER_OBJFWD (valcontents)->offset;
822 register int mask = XINT (*((Lisp_Object *)
823 (idx + (char *)&buffer_local_flags)));
824 if (mask > 0)
825 current_buffer->local_var_flags |= mask;
826 }
827
828 else if (BUFFER_LOCAL_VALUEP (valcontents)
829 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
830 {
831 /* valcontents is actually a pointer to a struct resembling a cons,
832 with contents something like:
833 (REALVALUE BUFFER CURRENT-ALIST-ELEMENT . DEFAULT-VALUE).
834
835 BUFFER is the last buffer for which this symbol's value was
836 made up to date.
837
838 CURRENT-ALIST-ELEMENT is a pointer to an element of BUFFER's
839 local_var_alist, that being the element whose car is this
840 variable. Or it can be a pointer to the
841 (CURRENT-ALIST-ELEMENT . DEFAULT-VALUE), if BUFFER does not
842 have an element in its alist for this variable (that is, if
843 BUFFER sees the default value of this variable).
844
845 If we want to examine or set the value and BUFFER is current,
846 we just examine or set REALVALUE. If BUFFER is not current, we
847 store the current REALVALUE value into CURRENT-ALIST-ELEMENT,
848 then find the appropriate alist element for the buffer now
849 current and set up CURRENT-ALIST-ELEMENT. Then we set
850 REALVALUE out of that element, and store into BUFFER.
851
852 If we are setting the variable and the current buffer does
853 not have an alist entry for this variable, an alist entry is
854 created.
855
856 Note that REALVALUE can be a forwarding pointer. Each time
857 it is examined or set, forwarding must be done. */
858
859 /* What value are we caching right now? */
860 current_alist_element =
861 XCONS (XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->cdr)->car;
862
863 /* If the current buffer is not the buffer whose binding is
864 currently cached, or if it's a Lisp_Buffer_Local_Value and
865 we're looking at the default value, the cache is invalid; we
866 need to write it out, and find the new CURRENT-ALIST-ELEMENT. */
867 if ((current_buffer
868 != XBUFFER (XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->car))
869 || (BUFFER_LOCAL_VALUEP (valcontents)
870 && EQ (XCONS (current_alist_element)->car,
871 current_alist_element)))
872 {
873 /* Write out the cached value for the old buffer; copy it
874 back to its alist element. This works if the current
875 buffer only sees the default value, too. */
876 Fsetcdr (current_alist_element,
877 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->car));
878
879 /* Find the new value for CURRENT-ALIST-ELEMENT. */
880 tem1 = Fassq (sym, current_buffer->local_var_alist);
881 if (NILP (tem1))
882 {
883 /* This buffer still sees the default value. */
884
885 /* If the variable is a Lisp_Some_Buffer_Local_Value,
886 make CURRENT-ALIST-ELEMENT point to itself,
887 indicating that we're seeing the default value. */
888 if (SOME_BUFFER_LOCAL_VALUEP (valcontents))
889 tem1 = XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->cdr;
890
891 /* If it's a Lisp_Buffer_Local_Value, give this buffer a
892 new assoc for a local value and set
893 CURRENT-ALIST-ELEMENT to point to that. */
894 else
895 {
896 tem1 = Fcons (sym, Fcdr (current_alist_element));
897 current_buffer->local_var_alist =
898 Fcons (tem1, current_buffer->local_var_alist);
899 }
900 }
901 /* Cache the new buffer's assoc in CURRENT-ALIST-ELEMENT. */
902 XCONS (XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->cdr)->car
903 = tem1;
904
905 /* Set BUFFER, now that CURRENT-ALIST-ELEMENT is accurate. */
906 XSETBUFFER (XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->car,
907 current_buffer);
908 }
909 valcontents = XBUFFER_LOCAL_VALUE (valcontents)->car;
910 }
911
912 /* If storing void (making the symbol void), forward only through
913 buffer-local indicator, not through Lisp_Objfwd, etc. */
914 if (voide)
915 store_symval_forwarding (sym, Qnil, newval);
916 else
917 store_symval_forwarding (sym, valcontents, newval);
918
919 return newval;
920 }
921 \f
922 /* Access or set a buffer-local symbol's default value. */
923
924 /* Return the default value of SYM, but don't check for voidness.
925 Return Qunbound if it is void. */
926
927 Lisp_Object
928 default_value (sym)
929 Lisp_Object sym;
930 {
931 register Lisp_Object valcontents;
932
933 CHECK_SYMBOL (sym, 0);
934 valcontents = XSYMBOL (sym)->value;
935
936 /* For a built-in buffer-local variable, get the default value
937 rather than letting do_symval_forwarding get the current value. */
938 if (BUFFER_OBJFWDP (valcontents))
939 {
940 register int idx = XBUFFER_OBJFWD (valcontents)->offset;
941
942 if (XINT (*(Lisp_Object *) (idx + (char *) &buffer_local_flags)) != 0)
943 return *(Lisp_Object *)(idx + (char *) &buffer_defaults);
944 }
945
946 /* Handle user-created local variables. */
947 if (BUFFER_LOCAL_VALUEP (valcontents)
948 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
949 {
950 /* If var is set up for a buffer that lacks a local value for it,
951 the current value is nominally the default value.
952 But the current value slot may be more up to date, since
953 ordinary setq stores just that slot. So use that. */
954 Lisp_Object current_alist_element, alist_element_car;
955 current_alist_element
956 = XCONS (XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->cdr)->car;
957 alist_element_car = XCONS (current_alist_element)->car;
958 if (EQ (alist_element_car, current_alist_element))
959 return do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->car);
960 else
961 return XCONS (XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->cdr)->cdr;
962 }
963 /* For other variables, get the current value. */
964 return do_symval_forwarding (valcontents);
965 }
966
967 DEFUN ("default-boundp", Fdefault_boundp, Sdefault_boundp, 1, 1, 0,
968 "Return T if SYMBOL has a non-void default value.\n\
969 This is the value that is seen in buffers that do not have their own values\n\
970 for this variable.")
971 (sym)
972 Lisp_Object sym;
973 {
974 register Lisp_Object value;
975
976 value = default_value (sym);
977 return (EQ (value, Qunbound) ? Qnil : Qt);
978 }
979
980 DEFUN ("default-value", Fdefault_value, Sdefault_value, 1, 1, 0,
981 "Return SYMBOL's default value.\n\
982 This is the value that is seen in buffers that do not have their own values\n\
983 for this variable. The default value is meaningful for variables with\n\
984 local bindings in certain buffers.")
985 (sym)
986 Lisp_Object sym;
987 {
988 register Lisp_Object value;
989
990 value = default_value (sym);
991 if (EQ (value, Qunbound))
992 return Fsignal (Qvoid_variable, Fcons (sym, Qnil));
993 return value;
994 }
995
996 DEFUN ("set-default", Fset_default, Sset_default, 2, 2, 0,
997 "Set SYMBOL's default value to VAL. SYMBOL and VAL are evaluated.\n\
998 The default value is seen in buffers that do not have their own values\n\
999 for this variable.")
1000 (sym, value)
1001 Lisp_Object sym, value;
1002 {
1003 register Lisp_Object valcontents, current_alist_element, alist_element_buffer;
1004
1005 CHECK_SYMBOL (sym, 0);
1006 valcontents = XSYMBOL (sym)->value;
1007
1008 /* Handle variables like case-fold-search that have special slots
1009 in the buffer. Make them work apparently like Lisp_Buffer_Local_Value
1010 variables. */
1011 if (BUFFER_OBJFWDP (valcontents))
1012 {
1013 register int idx = XBUFFER_OBJFWD (valcontents)->offset;
1014 register struct buffer *b;
1015 register int mask = XINT (*((Lisp_Object *)
1016 (idx + (char *)&buffer_local_flags)));
1017
1018 if (mask > 0)
1019 {
1020 *(Lisp_Object *)(idx + (char *) &buffer_defaults) = value;
1021 for (b = all_buffers; b; b = b->next)
1022 if (!(b->local_var_flags & mask))
1023 *(Lisp_Object *)(idx + (char *) b) = value;
1024 }
1025 return value;
1026 }
1027
1028 if (!BUFFER_LOCAL_VALUEP (valcontents)
1029 && !SOME_BUFFER_LOCAL_VALUEP (valcontents))
1030 return Fset (sym, value);
1031
1032 /* Store new value into the DEFAULT-VALUE slot */
1033 XCONS (XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->cdr)->cdr = value;
1034
1035 /* If that slot is current, we must set the REALVALUE slot too */
1036 current_alist_element
1037 = XCONS (XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->cdr)->car;
1038 alist_element_buffer = Fcar (current_alist_element);
1039 if (EQ (alist_element_buffer, current_alist_element))
1040 store_symval_forwarding (sym, XBUFFER_LOCAL_VALUE (valcontents)->car,
1041 value);
1042
1043 return value;
1044 }
1045
1046 DEFUN ("setq-default", Fsetq_default, Ssetq_default, 2, UNEVALLED, 0,
1047 "Set the default value of variable VAR to VALUE.\n\
1048 VAR, the variable name, is literal (not evaluated);\n\
1049 VALUE is an expression and it is evaluated.\n\
1050 The default value of a variable is seen in buffers\n\
1051 that do not have their own values for the variable.\n\
1052 \n\
1053 More generally, you can use multiple variables and values, as in\n\
1054 (setq-default SYM VALUE SYM VALUE...)\n\
1055 This sets each SYM's default value to the corresponding VALUE.\n\
1056 The VALUE for the Nth SYM can refer to the new default values\n\
1057 of previous SYMs.")
1058 (args)
1059 Lisp_Object args;
1060 {
1061 register Lisp_Object args_left;
1062 register Lisp_Object val, sym;
1063 struct gcpro gcpro1;
1064
1065 if (NILP (args))
1066 return Qnil;
1067
1068 args_left = args;
1069 GCPRO1 (args);
1070
1071 do
1072 {
1073 val = Feval (Fcar (Fcdr (args_left)));
1074 sym = Fcar (args_left);
1075 Fset_default (sym, val);
1076 args_left = Fcdr (Fcdr (args_left));
1077 }
1078 while (!NILP (args_left));
1079
1080 UNGCPRO;
1081 return val;
1082 }
1083 \f
1084 /* Lisp functions for creating and removing buffer-local variables. */
1085
1086 DEFUN ("make-variable-buffer-local", Fmake_variable_buffer_local, Smake_variable_buffer_local,
1087 1, 1, "vMake Variable Buffer Local: ",
1088 "Make VARIABLE have a separate value for each buffer.\n\
1089 At any time, the value for the current buffer is in effect.\n\
1090 There is also a default value which is seen in any buffer which has not yet\n\
1091 set its own value.\n\
1092 Using `set' or `setq' to set the variable causes it to have a separate value\n\
1093 for the current buffer if it was previously using the default value.\n\
1094 The function `default-value' gets the default value and `set-default' sets it.")
1095 (sym)
1096 register Lisp_Object sym;
1097 {
1098 register Lisp_Object tem, valcontents, newval;
1099
1100 CHECK_SYMBOL (sym, 0);
1101
1102 if (EQ (sym, Qnil) || EQ (sym, Qt))
1103 error ("Symbol %s may not be buffer-local", XSYMBOL (sym)->name->data);
1104
1105 valcontents = XSYMBOL (sym)->value;
1106 if (BUFFER_LOCAL_VALUEP (valcontents) || BUFFER_OBJFWDP (valcontents))
1107 return sym;
1108 if (SOME_BUFFER_LOCAL_VALUEP (valcontents))
1109 {
1110 XMISC (XSYMBOL (sym)->value)->type = Lisp_Misc_Buffer_Local_Value;
1111 return sym;
1112 }
1113 if (EQ (valcontents, Qunbound))
1114 XSYMBOL (sym)->value = Qnil;
1115 tem = Fcons (Qnil, Fsymbol_value (sym));
1116 XCONS (tem)->car = tem;
1117 newval = allocate_misc ();
1118 XMISC (newval)->type = Lisp_Misc_Buffer_Local_Value;
1119 XBUFFER_LOCAL_VALUE (newval)->car = XSYMBOL (sym)->value;
1120 XBUFFER_LOCAL_VALUE (newval)->cdr = Fcons (Fcurrent_buffer (), tem);
1121 XSYMBOL (sym)->value = newval;
1122 return sym;
1123 }
1124
1125 DEFUN ("make-local-variable", Fmake_local_variable, Smake_local_variable,
1126 1, 1, "vMake Local Variable: ",
1127 "Make VARIABLE have a separate value in the current buffer.\n\
1128 Other buffers will continue to share a common default value.\n\
1129 \(The buffer-local value of VARIABLE starts out as the same value\n\
1130 VARIABLE previously had. If VARIABLE was void, it remains void.\)\n\
1131 See also `make-variable-buffer-local'.\n\n\
1132 If the variable is already arranged to become local when set,\n\
1133 this function causes a local value to exist for this buffer,\n\
1134 just as setting the variable would do.\n\
1135 \n\
1136 Do not use `make-local-variable' to make a hook variable buffer-local.\n\
1137 Use `make-local-hook' instead.")
1138 (sym)
1139 register Lisp_Object sym;
1140 {
1141 register Lisp_Object tem, valcontents;
1142
1143 CHECK_SYMBOL (sym, 0);
1144
1145 if (EQ (sym, Qnil) || EQ (sym, Qt))
1146 error ("Symbol %s may not be buffer-local", XSYMBOL (sym)->name->data);
1147
1148 valcontents = XSYMBOL (sym)->value;
1149 if (BUFFER_LOCAL_VALUEP (valcontents) || BUFFER_OBJFWDP (valcontents))
1150 {
1151 tem = Fboundp (sym);
1152
1153 /* Make sure the symbol has a local value in this particular buffer,
1154 by setting it to the same value it already has. */
1155 Fset (sym, (EQ (tem, Qt) ? Fsymbol_value (sym) : Qunbound));
1156 return sym;
1157 }
1158 /* Make sure sym is set up to hold per-buffer values */
1159 if (!SOME_BUFFER_LOCAL_VALUEP (valcontents))
1160 {
1161 Lisp_Object newval;
1162 tem = Fcons (Qnil, do_symval_forwarding (valcontents));
1163 XCONS (tem)->car = tem;
1164 newval = allocate_misc ();
1165 XMISC (newval)->type = Lisp_Misc_Some_Buffer_Local_Value;
1166 XBUFFER_LOCAL_VALUE (newval)->car = XSYMBOL (sym)->value;
1167 XBUFFER_LOCAL_VALUE (newval)->cdr = Fcons (Qnil, tem);
1168 XSYMBOL (sym)->value = newval;
1169 }
1170 /* Make sure this buffer has its own value of sym */
1171 tem = Fassq (sym, current_buffer->local_var_alist);
1172 if (NILP (tem))
1173 {
1174 current_buffer->local_var_alist
1175 = Fcons (Fcons (sym, XCONS (XCONS (XBUFFER_LOCAL_VALUE (XSYMBOL (sym)->value)->cdr)->cdr)->cdr),
1176 current_buffer->local_var_alist);
1177
1178 /* Make sure symbol does not think it is set up for this buffer;
1179 force it to look once again for this buffer's value */
1180 {
1181 Lisp_Object *pvalbuf;
1182 valcontents = XSYMBOL (sym)->value;
1183 pvalbuf = &XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->car;
1184 if (current_buffer == XBUFFER (*pvalbuf))
1185 *pvalbuf = Qnil;
1186 }
1187 }
1188
1189 /* If the symbol forwards into a C variable, then swap in the
1190 variable for this buffer immediately. If C code modifies the
1191 variable before we swap in, then that new value will clobber the
1192 default value the next time we swap. */
1193 valcontents = XBUFFER_LOCAL_VALUE (XSYMBOL (sym)->value)->car;
1194 if (INTFWDP (valcontents) || BOOLFWDP (valcontents) || OBJFWDP (valcontents))
1195 swap_in_symval_forwarding (sym, XSYMBOL (sym)->value);
1196
1197 return sym;
1198 }
1199
1200 DEFUN ("kill-local-variable", Fkill_local_variable, Skill_local_variable,
1201 1, 1, "vKill Local Variable: ",
1202 "Make VARIABLE no longer have a separate value in the current buffer.\n\
1203 From now on the default value will apply in this buffer.")
1204 (sym)
1205 register Lisp_Object sym;
1206 {
1207 register Lisp_Object tem, valcontents;
1208
1209 CHECK_SYMBOL (sym, 0);
1210
1211 valcontents = XSYMBOL (sym)->value;
1212
1213 if (BUFFER_OBJFWDP (valcontents))
1214 {
1215 register int idx = XBUFFER_OBJFWD (valcontents)->offset;
1216 register int mask = XINT (*((Lisp_Object*)
1217 (idx + (char *)&buffer_local_flags)));
1218
1219 if (mask > 0)
1220 {
1221 *(Lisp_Object *)(idx + (char *) current_buffer)
1222 = *(Lisp_Object *)(idx + (char *) &buffer_defaults);
1223 current_buffer->local_var_flags &= ~mask;
1224 }
1225 return sym;
1226 }
1227
1228 if (!BUFFER_LOCAL_VALUEP (valcontents)
1229 && !SOME_BUFFER_LOCAL_VALUEP (valcontents))
1230 return sym;
1231
1232 /* Get rid of this buffer's alist element, if any */
1233
1234 tem = Fassq (sym, current_buffer->local_var_alist);
1235 if (!NILP (tem))
1236 current_buffer->local_var_alist
1237 = Fdelq (tem, current_buffer->local_var_alist);
1238
1239 /* Make sure symbol does not think it is set up for this buffer;
1240 force it to look once again for this buffer's value */
1241 {
1242 Lisp_Object *pvalbuf;
1243 valcontents = XSYMBOL (sym)->value;
1244 pvalbuf = &XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->car;
1245 if (current_buffer == XBUFFER (*pvalbuf))
1246 *pvalbuf = Qnil;
1247 }
1248
1249 return sym;
1250 }
1251
1252 DEFUN ("local-variable-p", Flocal_variable_p, Slocal_variable_p,
1253 1, 1, 0,
1254 "Non-nil if VARIABLE has a local binding in the current buffer.")
1255 (sym)
1256 register Lisp_Object sym;
1257 {
1258 Lisp_Object valcontents;
1259
1260 CHECK_SYMBOL (sym, 0);
1261
1262 valcontents = XSYMBOL (sym)->value;
1263 return ((BUFFER_LOCAL_VALUEP (valcontents)
1264 || SOME_BUFFER_LOCAL_VALUEP (valcontents)
1265 || BUFFER_OBJFWDP (valcontents))
1266 ? Qt : Qnil);
1267 }
1268 \f
1269 /* Find the function at the end of a chain of symbol function indirections. */
1270
1271 /* If OBJECT is a symbol, find the end of its function chain and
1272 return the value found there. If OBJECT is not a symbol, just
1273 return it. If there is a cycle in the function chain, signal a
1274 cyclic-function-indirection error.
1275
1276 This is like Findirect_function, except that it doesn't signal an
1277 error if the chain ends up unbound. */
1278 Lisp_Object
1279 indirect_function (object)
1280 register Lisp_Object object;
1281 {
1282 Lisp_Object tortoise, hare;
1283
1284 hare = tortoise = object;
1285
1286 for (;;)
1287 {
1288 if (!SYMBOLP (hare) || EQ (hare, Qunbound))
1289 break;
1290 hare = XSYMBOL (hare)->function;
1291 if (!SYMBOLP (hare) || EQ (hare, Qunbound))
1292 break;
1293 hare = XSYMBOL (hare)->function;
1294
1295 tortoise = XSYMBOL (tortoise)->function;
1296
1297 if (EQ (hare, tortoise))
1298 Fsignal (Qcyclic_function_indirection, Fcons (object, Qnil));
1299 }
1300
1301 return hare;
1302 }
1303
1304 DEFUN ("indirect-function", Findirect_function, Sindirect_function, 1, 1, 0,
1305 "Return the function at the end of OBJECT's function chain.\n\
1306 If OBJECT is a symbol, follow all function indirections and return the final\n\
1307 function binding.\n\
1308 If OBJECT is not a symbol, just return it.\n\
1309 Signal a void-function error if the final symbol is unbound.\n\
1310 Signal a cyclic-function-indirection error if there is a loop in the\n\
1311 function chain of symbols.")
1312 (object)
1313 register Lisp_Object object;
1314 {
1315 Lisp_Object result;
1316
1317 result = indirect_function (object);
1318
1319 if (EQ (result, Qunbound))
1320 return Fsignal (Qvoid_function, Fcons (object, Qnil));
1321 return result;
1322 }
1323 \f
1324 /* Extract and set vector and string elements */
1325
1326 DEFUN ("aref", Faref, Saref, 2, 2, 0,
1327 "Return the element of ARRAY at index INDEX.\n\
1328 ARRAY may be a vector or a string, or a byte-code object. INDEX starts at 0.")
1329 (array, idx)
1330 register Lisp_Object array;
1331 Lisp_Object idx;
1332 {
1333 register int idxval;
1334
1335 CHECK_NUMBER (idx, 1);
1336 idxval = XINT (idx);
1337 if (STRINGP (array))
1338 {
1339 Lisp_Object val;
1340 if (idxval < 0 || idxval >= XSTRING (array)->size)
1341 args_out_of_range (array, idx);
1342 XSETFASTINT (val, (unsigned char) XSTRING (array)->data[idxval]);
1343 return val;
1344 }
1345 else
1346 {
1347 if (!VECTORP (array) && !COMPILEDP (array))
1348 array = wrong_type_argument (Qarrayp, array);
1349 if (idxval < 0 || idxval >= XVECTOR (array)->size)
1350 args_out_of_range (array, idx);
1351 return XVECTOR (array)->contents[idxval];
1352 }
1353 }
1354
1355 DEFUN ("aset", Faset, Saset, 3, 3, 0,
1356 "Store into the element of ARRAY at index IDX the value NEWELT.\n\
1357 ARRAY may be a vector or a string. IDX starts at 0.")
1358 (array, idx, newelt)
1359 register Lisp_Object array;
1360 Lisp_Object idx, newelt;
1361 {
1362 register int idxval;
1363
1364 CHECK_NUMBER (idx, 1);
1365 idxval = XINT (idx);
1366 if (!VECTORP (array) && !STRINGP (array))
1367 array = wrong_type_argument (Qarrayp, array);
1368 CHECK_IMPURE (array);
1369
1370 if (VECTORP (array))
1371 {
1372 if (idxval < 0 || idxval >= XVECTOR (array)->size)
1373 args_out_of_range (array, idx);
1374 XVECTOR (array)->contents[idxval] = newelt;
1375 }
1376 else
1377 {
1378 if (idxval < 0 || idxval >= XSTRING (array)->size)
1379 args_out_of_range (array, idx);
1380 CHECK_NUMBER (newelt, 2);
1381 XSTRING (array)->data[idxval] = XINT (newelt);
1382 }
1383
1384 return newelt;
1385 }
1386 \f
1387 /* Arithmetic functions */
1388
1389 enum comparison { equal, notequal, less, grtr, less_or_equal, grtr_or_equal };
1390
1391 Lisp_Object
1392 arithcompare (num1, num2, comparison)
1393 Lisp_Object num1, num2;
1394 enum comparison comparison;
1395 {
1396 double f1, f2;
1397 int floatp = 0;
1398
1399 #ifdef LISP_FLOAT_TYPE
1400 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num1, 0);
1401 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num2, 0);
1402
1403 if (FLOATP (num1) || FLOATP (num2))
1404 {
1405 floatp = 1;
1406 f1 = (FLOATP (num1)) ? XFLOAT (num1)->data : XINT (num1);
1407 f2 = (FLOATP (num2)) ? XFLOAT (num2)->data : XINT (num2);
1408 }
1409 #else
1410 CHECK_NUMBER_COERCE_MARKER (num1, 0);
1411 CHECK_NUMBER_COERCE_MARKER (num2, 0);
1412 #endif /* LISP_FLOAT_TYPE */
1413
1414 switch (comparison)
1415 {
1416 case equal:
1417 if (floatp ? f1 == f2 : XINT (num1) == XINT (num2))
1418 return Qt;
1419 return Qnil;
1420
1421 case notequal:
1422 if (floatp ? f1 != f2 : XINT (num1) != XINT (num2))
1423 return Qt;
1424 return Qnil;
1425
1426 case less:
1427 if (floatp ? f1 < f2 : XINT (num1) < XINT (num2))
1428 return Qt;
1429 return Qnil;
1430
1431 case less_or_equal:
1432 if (floatp ? f1 <= f2 : XINT (num1) <= XINT (num2))
1433 return Qt;
1434 return Qnil;
1435
1436 case grtr:
1437 if (floatp ? f1 > f2 : XINT (num1) > XINT (num2))
1438 return Qt;
1439 return Qnil;
1440
1441 case grtr_or_equal:
1442 if (floatp ? f1 >= f2 : XINT (num1) >= XINT (num2))
1443 return Qt;
1444 return Qnil;
1445
1446 default:
1447 abort ();
1448 }
1449 }
1450
1451 DEFUN ("=", Feqlsign, Seqlsign, 2, 2, 0,
1452 "T if two args, both numbers or markers, are equal.")
1453 (num1, num2)
1454 register Lisp_Object num1, num2;
1455 {
1456 return arithcompare (num1, num2, equal);
1457 }
1458
1459 DEFUN ("<", Flss, Slss, 2, 2, 0,
1460 "T if first arg is less than second arg. Both must be numbers or markers.")
1461 (num1, num2)
1462 register Lisp_Object num1, num2;
1463 {
1464 return arithcompare (num1, num2, less);
1465 }
1466
1467 DEFUN (">", Fgtr, Sgtr, 2, 2, 0,
1468 "T if first arg is greater than second arg. Both must be numbers or markers.")
1469 (num1, num2)
1470 register Lisp_Object num1, num2;
1471 {
1472 return arithcompare (num1, num2, grtr);
1473 }
1474
1475 DEFUN ("<=", Fleq, Sleq, 2, 2, 0,
1476 "T if first arg is less than or equal to second arg.\n\
1477 Both must be numbers or markers.")
1478 (num1, num2)
1479 register Lisp_Object num1, num2;
1480 {
1481 return arithcompare (num1, num2, less_or_equal);
1482 }
1483
1484 DEFUN (">=", Fgeq, Sgeq, 2, 2, 0,
1485 "T if first arg is greater than or equal to second arg.\n\
1486 Both must be numbers or markers.")
1487 (num1, num2)
1488 register Lisp_Object num1, num2;
1489 {
1490 return arithcompare (num1, num2, grtr_or_equal);
1491 }
1492
1493 DEFUN ("/=", Fneq, Sneq, 2, 2, 0,
1494 "T if first arg is not equal to second arg. Both must be numbers or markers.")
1495 (num1, num2)
1496 register Lisp_Object num1, num2;
1497 {
1498 return arithcompare (num1, num2, notequal);
1499 }
1500
1501 DEFUN ("zerop", Fzerop, Szerop, 1, 1, 0, "T if NUMBER is zero.")
1502 (num)
1503 register Lisp_Object num;
1504 {
1505 #ifdef LISP_FLOAT_TYPE
1506 CHECK_NUMBER_OR_FLOAT (num, 0);
1507
1508 if (FLOATP (num))
1509 {
1510 if (XFLOAT(num)->data == 0.0)
1511 return Qt;
1512 return Qnil;
1513 }
1514 #else
1515 CHECK_NUMBER (num, 0);
1516 #endif /* LISP_FLOAT_TYPE */
1517
1518 if (!XINT (num))
1519 return Qt;
1520 return Qnil;
1521 }
1522 \f
1523 /* Convert between 32-bit values and pairs of lispy 24-bit values. */
1524
1525 Lisp_Object
1526 long_to_cons (i)
1527 unsigned long i;
1528 {
1529 unsigned int top = i >> 16;
1530 unsigned int bot = i & 0xFFFF;
1531 if (top == 0)
1532 return make_number (bot);
1533 if (top == 0xFFFF)
1534 return Fcons (make_number (-1), make_number (bot));
1535 return Fcons (make_number (top), make_number (bot));
1536 }
1537
1538 unsigned long
1539 cons_to_long (c)
1540 Lisp_Object c;
1541 {
1542 Lisp_Object top, bot;
1543 if (INTEGERP (c))
1544 return XINT (c);
1545 top = XCONS (c)->car;
1546 bot = XCONS (c)->cdr;
1547 if (CONSP (bot))
1548 bot = XCONS (bot)->car;
1549 return ((XINT (top) << 16) | XINT (bot));
1550 }
1551 \f
1552 DEFUN ("number-to-string", Fnumber_to_string, Snumber_to_string, 1, 1, 0,
1553 "Convert NUM to a string by printing it in decimal.\n\
1554 Uses a minus sign if negative.\n\
1555 NUM may be an integer or a floating point number.")
1556 (num)
1557 Lisp_Object num;
1558 {
1559 char buffer[20];
1560
1561 #ifndef LISP_FLOAT_TYPE
1562 CHECK_NUMBER (num, 0);
1563 #else
1564 CHECK_NUMBER_OR_FLOAT (num, 0);
1565
1566 if (FLOATP (num))
1567 {
1568 char pigbuf[350]; /* see comments in float_to_string */
1569
1570 float_to_string (pigbuf, XFLOAT(num)->data);
1571 return build_string (pigbuf);
1572 }
1573 #endif /* LISP_FLOAT_TYPE */
1574
1575 sprintf (buffer, "%d", XINT (num));
1576 return build_string (buffer);
1577 }
1578
1579 DEFUN ("string-to-number", Fstring_to_number, Sstring_to_number, 1, 1, 0,
1580 "Convert STRING to a number by parsing it as a decimal number.\n\
1581 This parses both integers and floating point numbers.\n\
1582 It ignores leading spaces and tabs.")
1583 (str)
1584 register Lisp_Object str;
1585 {
1586 unsigned char *p;
1587
1588 CHECK_STRING (str, 0);
1589
1590 p = XSTRING (str)->data;
1591
1592 /* Skip any whitespace at the front of the number. Some versions of
1593 atoi do this anyway, so we might as well make Emacs lisp consistent. */
1594 while (*p == ' ' || *p == '\t')
1595 p++;
1596
1597 #ifdef LISP_FLOAT_TYPE
1598 if (isfloat_string (p))
1599 return make_float (atof (p));
1600 #endif /* LISP_FLOAT_TYPE */
1601
1602 return make_number (atoi (p));
1603 }
1604 \f
1605 enum arithop
1606 { Aadd, Asub, Amult, Adiv, Alogand, Alogior, Alogxor, Amax, Amin };
1607
1608 extern Lisp_Object float_arith_driver ();
1609
1610 Lisp_Object
1611 arith_driver (code, nargs, args)
1612 enum arithop code;
1613 int nargs;
1614 register Lisp_Object *args;
1615 {
1616 register Lisp_Object val;
1617 register int argnum;
1618 register int accum;
1619 register int next;
1620
1621 #ifdef SWITCH_ENUM_BUG
1622 switch ((int) code)
1623 #else
1624 switch (code)
1625 #endif
1626 {
1627 case Alogior:
1628 case Alogxor:
1629 case Aadd:
1630 case Asub:
1631 accum = 0; break;
1632 case Amult:
1633 accum = 1; break;
1634 case Alogand:
1635 accum = -1; break;
1636 }
1637
1638 for (argnum = 0; argnum < nargs; argnum++)
1639 {
1640 val = args[argnum]; /* using args[argnum] as argument to CHECK_NUMBER_... */
1641 #ifdef LISP_FLOAT_TYPE
1642 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val, argnum);
1643
1644 if (FLOATP (val)) /* time to do serious math */
1645 return (float_arith_driver ((double) accum, argnum, code,
1646 nargs, args));
1647 #else
1648 CHECK_NUMBER_COERCE_MARKER (val, argnum);
1649 #endif /* LISP_FLOAT_TYPE */
1650 args[argnum] = val; /* runs into a compiler bug. */
1651 next = XINT (args[argnum]);
1652 #ifdef SWITCH_ENUM_BUG
1653 switch ((int) code)
1654 #else
1655 switch (code)
1656 #endif
1657 {
1658 case Aadd: accum += next; break;
1659 case Asub:
1660 if (!argnum && nargs != 1)
1661 next = - next;
1662 accum -= next;
1663 break;
1664 case Amult: accum *= next; break;
1665 case Adiv:
1666 if (!argnum) accum = next;
1667 else
1668 {
1669 if (next == 0)
1670 Fsignal (Qarith_error, Qnil);
1671 accum /= next;
1672 }
1673 break;
1674 case Alogand: accum &= next; break;
1675 case Alogior: accum |= next; break;
1676 case Alogxor: accum ^= next; break;
1677 case Amax: if (!argnum || next > accum) accum = next; break;
1678 case Amin: if (!argnum || next < accum) accum = next; break;
1679 }
1680 }
1681
1682 XSETINT (val, accum);
1683 return val;
1684 }
1685
1686 #ifdef LISP_FLOAT_TYPE
1687
1688 #undef isnan
1689 #define isnan(x) ((x) != (x))
1690
1691 Lisp_Object
1692 float_arith_driver (accum, argnum, code, nargs, args)
1693 double accum;
1694 register int argnum;
1695 enum arithop code;
1696 int nargs;
1697 register Lisp_Object *args;
1698 {
1699 register Lisp_Object val;
1700 double next;
1701
1702 for (; argnum < nargs; argnum++)
1703 {
1704 val = args[argnum]; /* using args[argnum] as argument to CHECK_NUMBER_... */
1705 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val, argnum);
1706
1707 if (FLOATP (val))
1708 {
1709 next = XFLOAT (val)->data;
1710 }
1711 else
1712 {
1713 args[argnum] = val; /* runs into a compiler bug. */
1714 next = XINT (args[argnum]);
1715 }
1716 #ifdef SWITCH_ENUM_BUG
1717 switch ((int) code)
1718 #else
1719 switch (code)
1720 #endif
1721 {
1722 case Aadd:
1723 accum += next;
1724 break;
1725 case Asub:
1726 if (!argnum && nargs != 1)
1727 next = - next;
1728 accum -= next;
1729 break;
1730 case Amult:
1731 accum *= next;
1732 break;
1733 case Adiv:
1734 if (!argnum)
1735 accum = next;
1736 else
1737 {
1738 if (next == 0)
1739 Fsignal (Qarith_error, Qnil);
1740 accum /= next;
1741 }
1742 break;
1743 case Alogand:
1744 case Alogior:
1745 case Alogxor:
1746 return wrong_type_argument (Qinteger_or_marker_p, val);
1747 case Amax:
1748 if (!argnum || isnan (next) || next > accum)
1749 accum = next;
1750 break;
1751 case Amin:
1752 if (!argnum || isnan (next) || next < accum)
1753 accum = next;
1754 break;
1755 }
1756 }
1757
1758 return make_float (accum);
1759 }
1760 #endif /* LISP_FLOAT_TYPE */
1761
1762 DEFUN ("+", Fplus, Splus, 0, MANY, 0,
1763 "Return sum of any number of arguments, which are numbers or markers.")
1764 (nargs, args)
1765 int nargs;
1766 Lisp_Object *args;
1767 {
1768 return arith_driver (Aadd, nargs, args);
1769 }
1770
1771 DEFUN ("-", Fminus, Sminus, 0, MANY, 0,
1772 "Negate number or subtract numbers or markers.\n\
1773 With one arg, negates it. With more than one arg,\n\
1774 subtracts all but the first from the first.")
1775 (nargs, args)
1776 int nargs;
1777 Lisp_Object *args;
1778 {
1779 return arith_driver (Asub, nargs, args);
1780 }
1781
1782 DEFUN ("*", Ftimes, Stimes, 0, MANY, 0,
1783 "Returns product of any number of arguments, which are numbers or markers.")
1784 (nargs, args)
1785 int nargs;
1786 Lisp_Object *args;
1787 {
1788 return arith_driver (Amult, nargs, args);
1789 }
1790
1791 DEFUN ("/", Fquo, Squo, 2, MANY, 0,
1792 "Returns first argument divided by all the remaining arguments.\n\
1793 The arguments must be numbers or markers.")
1794 (nargs, args)
1795 int nargs;
1796 Lisp_Object *args;
1797 {
1798 return arith_driver (Adiv, nargs, args);
1799 }
1800
1801 DEFUN ("%", Frem, Srem, 2, 2, 0,
1802 "Returns remainder of first arg divided by second.\n\
1803 Both must be integers or markers.")
1804 (num1, num2)
1805 register Lisp_Object num1, num2;
1806 {
1807 Lisp_Object val;
1808
1809 CHECK_NUMBER_COERCE_MARKER (num1, 0);
1810 CHECK_NUMBER_COERCE_MARKER (num2, 1);
1811
1812 if (XFASTINT (num2) == 0)
1813 Fsignal (Qarith_error, Qnil);
1814
1815 XSETINT (val, XINT (num1) % XINT (num2));
1816 return val;
1817 }
1818
1819 #ifndef HAVE_FMOD
1820 double
1821 fmod (f1, f2)
1822 double f1, f2;
1823 {
1824 #ifdef HAVE_DREM /* Some systems use this non-standard name. */
1825 return (drem (f1, f2));
1826 #else /* Other systems don't seem to have it at all. */
1827 return (f1 - f2 * floor (f1/f2));
1828 #endif
1829 }
1830 #endif /* ! HAVE_FMOD */
1831
1832 DEFUN ("mod", Fmod, Smod, 2, 2, 0,
1833 "Returns X modulo Y.\n\
1834 The result falls between zero (inclusive) and Y (exclusive).\n\
1835 Both X and Y must be numbers or markers.")
1836 (num1, num2)
1837 register Lisp_Object num1, num2;
1838 {
1839 Lisp_Object val;
1840 int i1, i2;
1841
1842 #ifdef LISP_FLOAT_TYPE
1843 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num1, 0);
1844 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num2, 1);
1845
1846 if (FLOATP (num1) || FLOATP (num2))
1847 {
1848 double f1, f2;
1849
1850 f1 = FLOATP (num1) ? XFLOAT (num1)->data : XINT (num1);
1851 f2 = FLOATP (num2) ? XFLOAT (num2)->data : XINT (num2);
1852 if (f2 == 0)
1853 Fsignal (Qarith_error, Qnil);
1854
1855 f1 = fmod (f1, f2);
1856 /* If the "remainder" comes out with the wrong sign, fix it. */
1857 if ((f1 < 0) != (f2 < 0))
1858 f1 += f2;
1859 return (make_float (f1));
1860 }
1861 #else /* not LISP_FLOAT_TYPE */
1862 CHECK_NUMBER_COERCE_MARKER (num1, 0);
1863 CHECK_NUMBER_COERCE_MARKER (num2, 1);
1864 #endif /* not LISP_FLOAT_TYPE */
1865
1866 i1 = XINT (num1);
1867 i2 = XINT (num2);
1868
1869 if (i2 == 0)
1870 Fsignal (Qarith_error, Qnil);
1871
1872 i1 %= i2;
1873
1874 /* If the "remainder" comes out with the wrong sign, fix it. */
1875 if ((i1 < 0) != (i2 < 0))
1876 i1 += i2;
1877
1878 XSETINT (val, i1);
1879 return val;
1880 }
1881
1882 DEFUN ("max", Fmax, Smax, 1, MANY, 0,
1883 "Return largest of all the arguments (which must be numbers or markers).\n\
1884 The value is always a number; markers are converted to numbers.")
1885 (nargs, args)
1886 int nargs;
1887 Lisp_Object *args;
1888 {
1889 return arith_driver (Amax, nargs, args);
1890 }
1891
1892 DEFUN ("min", Fmin, Smin, 1, MANY, 0,
1893 "Return smallest of all the arguments (which must be numbers or markers).\n\
1894 The value is always a number; markers are converted to numbers.")
1895 (nargs, args)
1896 int nargs;
1897 Lisp_Object *args;
1898 {
1899 return arith_driver (Amin, nargs, args);
1900 }
1901
1902 DEFUN ("logand", Flogand, Slogand, 0, MANY, 0,
1903 "Return bitwise-and of all the arguments.\n\
1904 Arguments may be integers, or markers converted to integers.")
1905 (nargs, args)
1906 int nargs;
1907 Lisp_Object *args;
1908 {
1909 return arith_driver (Alogand, nargs, args);
1910 }
1911
1912 DEFUN ("logior", Flogior, Slogior, 0, MANY, 0,
1913 "Return bitwise-or of all the arguments.\n\
1914 Arguments may be integers, or markers converted to integers.")
1915 (nargs, args)
1916 int nargs;
1917 Lisp_Object *args;
1918 {
1919 return arith_driver (Alogior, nargs, args);
1920 }
1921
1922 DEFUN ("logxor", Flogxor, Slogxor, 0, MANY, 0,
1923 "Return bitwise-exclusive-or of all the arguments.\n\
1924 Arguments may be integers, or markers converted to integers.")
1925 (nargs, args)
1926 int nargs;
1927 Lisp_Object *args;
1928 {
1929 return arith_driver (Alogxor, nargs, args);
1930 }
1931
1932 DEFUN ("ash", Fash, Sash, 2, 2, 0,
1933 "Return VALUE with its bits shifted left by COUNT.\n\
1934 If COUNT is negative, shifting is actually to the right.\n\
1935 In this case, the sign bit is duplicated.")
1936 (num1, num2)
1937 register Lisp_Object num1, num2;
1938 {
1939 register Lisp_Object val;
1940
1941 CHECK_NUMBER (num1, 0);
1942 CHECK_NUMBER (num2, 1);
1943
1944 if (XINT (num2) > 0)
1945 XSETINT (val, XINT (num1) << XFASTINT (num2));
1946 else
1947 XSETINT (val, XINT (num1) >> -XINT (num2));
1948 return val;
1949 }
1950
1951 DEFUN ("lsh", Flsh, Slsh, 2, 2, 0,
1952 "Return VALUE with its bits shifted left by COUNT.\n\
1953 If COUNT is negative, shifting is actually to the right.\n\
1954 In this case, zeros are shifted in on the left.")
1955 (num1, num2)
1956 register Lisp_Object num1, num2;
1957 {
1958 register Lisp_Object val;
1959
1960 CHECK_NUMBER (num1, 0);
1961 CHECK_NUMBER (num2, 1);
1962
1963 if (XINT (num2) > 0)
1964 XSETINT (val, (EMACS_UINT) XUINT (num1) << XFASTINT (num2));
1965 else
1966 XSETINT (val, (EMACS_UINT) XUINT (num1) >> -XINT (num2));
1967 return val;
1968 }
1969
1970 DEFUN ("1+", Fadd1, Sadd1, 1, 1, 0,
1971 "Return NUMBER plus one. NUMBER may be a number or a marker.\n\
1972 Markers are converted to integers.")
1973 (num)
1974 register Lisp_Object num;
1975 {
1976 #ifdef LISP_FLOAT_TYPE
1977 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num, 0);
1978
1979 if (FLOATP (num))
1980 return (make_float (1.0 + XFLOAT (num)->data));
1981 #else
1982 CHECK_NUMBER_COERCE_MARKER (num, 0);
1983 #endif /* LISP_FLOAT_TYPE */
1984
1985 XSETINT (num, XINT (num) + 1);
1986 return num;
1987 }
1988
1989 DEFUN ("1-", Fsub1, Ssub1, 1, 1, 0,
1990 "Return NUMBER minus one. NUMBER may be a number or a marker.\n\
1991 Markers are converted to integers.")
1992 (num)
1993 register Lisp_Object num;
1994 {
1995 #ifdef LISP_FLOAT_TYPE
1996 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num, 0);
1997
1998 if (FLOATP (num))
1999 return (make_float (-1.0 + XFLOAT (num)->data));
2000 #else
2001 CHECK_NUMBER_COERCE_MARKER (num, 0);
2002 #endif /* LISP_FLOAT_TYPE */
2003
2004 XSETINT (num, XINT (num) - 1);
2005 return num;
2006 }
2007
2008 DEFUN ("lognot", Flognot, Slognot, 1, 1, 0,
2009 "Return the bitwise complement of ARG. ARG must be an integer.")
2010 (num)
2011 register Lisp_Object num;
2012 {
2013 CHECK_NUMBER (num, 0);
2014 XSETINT (num, ~XINT (num));
2015 return num;
2016 }
2017 \f
2018 void
2019 syms_of_data ()
2020 {
2021 Lisp_Object error_tail, arith_tail;
2022
2023 Qquote = intern ("quote");
2024 Qlambda = intern ("lambda");
2025 Qsubr = intern ("subr");
2026 Qerror_conditions = intern ("error-conditions");
2027 Qerror_message = intern ("error-message");
2028 Qtop_level = intern ("top-level");
2029
2030 Qerror = intern ("error");
2031 Qquit = intern ("quit");
2032 Qwrong_type_argument = intern ("wrong-type-argument");
2033 Qargs_out_of_range = intern ("args-out-of-range");
2034 Qvoid_function = intern ("void-function");
2035 Qcyclic_function_indirection = intern ("cyclic-function-indirection");
2036 Qvoid_variable = intern ("void-variable");
2037 Qsetting_constant = intern ("setting-constant");
2038 Qinvalid_read_syntax = intern ("invalid-read-syntax");
2039
2040 Qinvalid_function = intern ("invalid-function");
2041 Qwrong_number_of_arguments = intern ("wrong-number-of-arguments");
2042 Qno_catch = intern ("no-catch");
2043 Qend_of_file = intern ("end-of-file");
2044 Qarith_error = intern ("arith-error");
2045 Qbeginning_of_buffer = intern ("beginning-of-buffer");
2046 Qend_of_buffer = intern ("end-of-buffer");
2047 Qbuffer_read_only = intern ("buffer-read-only");
2048 Qmark_inactive = intern ("mark-inactive");
2049
2050 Qlistp = intern ("listp");
2051 Qconsp = intern ("consp");
2052 Qsymbolp = intern ("symbolp");
2053 Qintegerp = intern ("integerp");
2054 Qnatnump = intern ("natnump");
2055 Qwholenump = intern ("wholenump");
2056 Qstringp = intern ("stringp");
2057 Qarrayp = intern ("arrayp");
2058 Qsequencep = intern ("sequencep");
2059 Qbufferp = intern ("bufferp");
2060 Qvectorp = intern ("vectorp");
2061 Qchar_or_string_p = intern ("char-or-string-p");
2062 Qmarkerp = intern ("markerp");
2063 Qbuffer_or_string_p = intern ("buffer-or-string-p");
2064 Qinteger_or_marker_p = intern ("integer-or-marker-p");
2065 Qboundp = intern ("boundp");
2066 Qfboundp = intern ("fboundp");
2067
2068 #ifdef LISP_FLOAT_TYPE
2069 Qfloatp = intern ("floatp");
2070 Qnumberp = intern ("numberp");
2071 Qnumber_or_marker_p = intern ("number-or-marker-p");
2072 #endif /* LISP_FLOAT_TYPE */
2073
2074 Qcdr = intern ("cdr");
2075
2076 /* Handle automatic advice activation */
2077 Qad_advice_info = intern ("ad-advice-info");
2078 Qad_activate = intern ("ad-activate");
2079
2080 error_tail = Fcons (Qerror, Qnil);
2081
2082 /* ERROR is used as a signaler for random errors for which nothing else is right */
2083
2084 Fput (Qerror, Qerror_conditions,
2085 error_tail);
2086 Fput (Qerror, Qerror_message,
2087 build_string ("error"));
2088
2089 Fput (Qquit, Qerror_conditions,
2090 Fcons (Qquit, Qnil));
2091 Fput (Qquit, Qerror_message,
2092 build_string ("Quit"));
2093
2094 Fput (Qwrong_type_argument, Qerror_conditions,
2095 Fcons (Qwrong_type_argument, error_tail));
2096 Fput (Qwrong_type_argument, Qerror_message,
2097 build_string ("Wrong type argument"));
2098
2099 Fput (Qargs_out_of_range, Qerror_conditions,
2100 Fcons (Qargs_out_of_range, error_tail));
2101 Fput (Qargs_out_of_range, Qerror_message,
2102 build_string ("Args out of range"));
2103
2104 Fput (Qvoid_function, Qerror_conditions,
2105 Fcons (Qvoid_function, error_tail));
2106 Fput (Qvoid_function, Qerror_message,
2107 build_string ("Symbol's function definition is void"));
2108
2109 Fput (Qcyclic_function_indirection, Qerror_conditions,
2110 Fcons (Qcyclic_function_indirection, error_tail));
2111 Fput (Qcyclic_function_indirection, Qerror_message,
2112 build_string ("Symbol's chain of function indirections contains a loop"));
2113
2114 Fput (Qvoid_variable, Qerror_conditions,
2115 Fcons (Qvoid_variable, error_tail));
2116 Fput (Qvoid_variable, Qerror_message,
2117 build_string ("Symbol's value as variable is void"));
2118
2119 Fput (Qsetting_constant, Qerror_conditions,
2120 Fcons (Qsetting_constant, error_tail));
2121 Fput (Qsetting_constant, Qerror_message,
2122 build_string ("Attempt to set a constant symbol"));
2123
2124 Fput (Qinvalid_read_syntax, Qerror_conditions,
2125 Fcons (Qinvalid_read_syntax, error_tail));
2126 Fput (Qinvalid_read_syntax, Qerror_message,
2127 build_string ("Invalid read syntax"));
2128
2129 Fput (Qinvalid_function, Qerror_conditions,
2130 Fcons (Qinvalid_function, error_tail));
2131 Fput (Qinvalid_function, Qerror_message,
2132 build_string ("Invalid function"));
2133
2134 Fput (Qwrong_number_of_arguments, Qerror_conditions,
2135 Fcons (Qwrong_number_of_arguments, error_tail));
2136 Fput (Qwrong_number_of_arguments, Qerror_message,
2137 build_string ("Wrong number of arguments"));
2138
2139 Fput (Qno_catch, Qerror_conditions,
2140 Fcons (Qno_catch, error_tail));
2141 Fput (Qno_catch, Qerror_message,
2142 build_string ("No catch for tag"));
2143
2144 Fput (Qend_of_file, Qerror_conditions,
2145 Fcons (Qend_of_file, error_tail));
2146 Fput (Qend_of_file, Qerror_message,
2147 build_string ("End of file during parsing"));
2148
2149 arith_tail = Fcons (Qarith_error, error_tail);
2150 Fput (Qarith_error, Qerror_conditions,
2151 arith_tail);
2152 Fput (Qarith_error, Qerror_message,
2153 build_string ("Arithmetic error"));
2154
2155 Fput (Qbeginning_of_buffer, Qerror_conditions,
2156 Fcons (Qbeginning_of_buffer, error_tail));
2157 Fput (Qbeginning_of_buffer, Qerror_message,
2158 build_string ("Beginning of buffer"));
2159
2160 Fput (Qend_of_buffer, Qerror_conditions,
2161 Fcons (Qend_of_buffer, error_tail));
2162 Fput (Qend_of_buffer, Qerror_message,
2163 build_string ("End of buffer"));
2164
2165 Fput (Qbuffer_read_only, Qerror_conditions,
2166 Fcons (Qbuffer_read_only, error_tail));
2167 Fput (Qbuffer_read_only, Qerror_message,
2168 build_string ("Buffer is read-only"));
2169
2170 #ifdef LISP_FLOAT_TYPE
2171 Qrange_error = intern ("range-error");
2172 Qdomain_error = intern ("domain-error");
2173 Qsingularity_error = intern ("singularity-error");
2174 Qoverflow_error = intern ("overflow-error");
2175 Qunderflow_error = intern ("underflow-error");
2176
2177 Fput (Qdomain_error, Qerror_conditions,
2178 Fcons (Qdomain_error, arith_tail));
2179 Fput (Qdomain_error, Qerror_message,
2180 build_string ("Arithmetic domain error"));
2181
2182 Fput (Qrange_error, Qerror_conditions,
2183 Fcons (Qrange_error, arith_tail));
2184 Fput (Qrange_error, Qerror_message,
2185 build_string ("Arithmetic range error"));
2186
2187 Fput (Qsingularity_error, Qerror_conditions,
2188 Fcons (Qsingularity_error, Fcons (Qdomain_error, arith_tail)));
2189 Fput (Qsingularity_error, Qerror_message,
2190 build_string ("Arithmetic singularity error"));
2191
2192 Fput (Qoverflow_error, Qerror_conditions,
2193 Fcons (Qoverflow_error, Fcons (Qdomain_error, arith_tail)));
2194 Fput (Qoverflow_error, Qerror_message,
2195 build_string ("Arithmetic overflow error"));
2196
2197 Fput (Qunderflow_error, Qerror_conditions,
2198 Fcons (Qunderflow_error, Fcons (Qdomain_error, arith_tail)));
2199 Fput (Qunderflow_error, Qerror_message,
2200 build_string ("Arithmetic underflow error"));
2201
2202 staticpro (&Qrange_error);
2203 staticpro (&Qdomain_error);
2204 staticpro (&Qsingularity_error);
2205 staticpro (&Qoverflow_error);
2206 staticpro (&Qunderflow_error);
2207 #endif /* LISP_FLOAT_TYPE */
2208
2209 staticpro (&Qnil);
2210 staticpro (&Qt);
2211 staticpro (&Qquote);
2212 staticpro (&Qlambda);
2213 staticpro (&Qsubr);
2214 staticpro (&Qunbound);
2215 staticpro (&Qerror_conditions);
2216 staticpro (&Qerror_message);
2217 staticpro (&Qtop_level);
2218
2219 staticpro (&Qerror);
2220 staticpro (&Qquit);
2221 staticpro (&Qwrong_type_argument);
2222 staticpro (&Qargs_out_of_range);
2223 staticpro (&Qvoid_function);
2224 staticpro (&Qcyclic_function_indirection);
2225 staticpro (&Qvoid_variable);
2226 staticpro (&Qsetting_constant);
2227 staticpro (&Qinvalid_read_syntax);
2228 staticpro (&Qwrong_number_of_arguments);
2229 staticpro (&Qinvalid_function);
2230 staticpro (&Qno_catch);
2231 staticpro (&Qend_of_file);
2232 staticpro (&Qarith_error);
2233 staticpro (&Qbeginning_of_buffer);
2234 staticpro (&Qend_of_buffer);
2235 staticpro (&Qbuffer_read_only);
2236 staticpro (&Qmark_inactive);
2237
2238 staticpro (&Qlistp);
2239 staticpro (&Qconsp);
2240 staticpro (&Qsymbolp);
2241 staticpro (&Qintegerp);
2242 staticpro (&Qnatnump);
2243 staticpro (&Qwholenump);
2244 staticpro (&Qstringp);
2245 staticpro (&Qarrayp);
2246 staticpro (&Qsequencep);
2247 staticpro (&Qbufferp);
2248 staticpro (&Qvectorp);
2249 staticpro (&Qchar_or_string_p);
2250 staticpro (&Qmarkerp);
2251 staticpro (&Qbuffer_or_string_p);
2252 staticpro (&Qinteger_or_marker_p);
2253 #ifdef LISP_FLOAT_TYPE
2254 staticpro (&Qfloatp);
2255 staticpro (&Qnumberp);
2256 staticpro (&Qnumber_or_marker_p);
2257 #endif /* LISP_FLOAT_TYPE */
2258
2259 staticpro (&Qboundp);
2260 staticpro (&Qfboundp);
2261 staticpro (&Qcdr);
2262 staticpro (&Qad_advice_info);
2263 staticpro (&Qad_activate);
2264
2265 defsubr (&Seq);
2266 defsubr (&Snull);
2267 defsubr (&Slistp);
2268 defsubr (&Snlistp);
2269 defsubr (&Sconsp);
2270 defsubr (&Satom);
2271 defsubr (&Sintegerp);
2272 defsubr (&Sinteger_or_marker_p);
2273 defsubr (&Snumberp);
2274 defsubr (&Snumber_or_marker_p);
2275 #ifdef LISP_FLOAT_TYPE
2276 defsubr (&Sfloatp);
2277 #endif /* LISP_FLOAT_TYPE */
2278 defsubr (&Snatnump);
2279 defsubr (&Ssymbolp);
2280 defsubr (&Sstringp);
2281 defsubr (&Svectorp);
2282 defsubr (&Sarrayp);
2283 defsubr (&Ssequencep);
2284 defsubr (&Sbufferp);
2285 defsubr (&Smarkerp);
2286 defsubr (&Ssubrp);
2287 defsubr (&Sbyte_code_function_p);
2288 defsubr (&Schar_or_string_p);
2289 defsubr (&Scar);
2290 defsubr (&Scdr);
2291 defsubr (&Scar_safe);
2292 defsubr (&Scdr_safe);
2293 defsubr (&Ssetcar);
2294 defsubr (&Ssetcdr);
2295 defsubr (&Ssymbol_function);
2296 defsubr (&Sindirect_function);
2297 defsubr (&Ssymbol_plist);
2298 defsubr (&Ssymbol_name);
2299 defsubr (&Smakunbound);
2300 defsubr (&Sfmakunbound);
2301 defsubr (&Sboundp);
2302 defsubr (&Sfboundp);
2303 defsubr (&Sfset);
2304 defsubr (&Sdefalias);
2305 defsubr (&Sdefine_function);
2306 defsubr (&Ssetplist);
2307 defsubr (&Ssymbol_value);
2308 defsubr (&Sset);
2309 defsubr (&Sdefault_boundp);
2310 defsubr (&Sdefault_value);
2311 defsubr (&Sset_default);
2312 defsubr (&Ssetq_default);
2313 defsubr (&Smake_variable_buffer_local);
2314 defsubr (&Smake_local_variable);
2315 defsubr (&Skill_local_variable);
2316 defsubr (&Slocal_variable_p);
2317 defsubr (&Saref);
2318 defsubr (&Saset);
2319 defsubr (&Snumber_to_string);
2320 defsubr (&Sstring_to_number);
2321 defsubr (&Seqlsign);
2322 defsubr (&Slss);
2323 defsubr (&Sgtr);
2324 defsubr (&Sleq);
2325 defsubr (&Sgeq);
2326 defsubr (&Sneq);
2327 defsubr (&Szerop);
2328 defsubr (&Splus);
2329 defsubr (&Sminus);
2330 defsubr (&Stimes);
2331 defsubr (&Squo);
2332 defsubr (&Srem);
2333 defsubr (&Smod);
2334 defsubr (&Smax);
2335 defsubr (&Smin);
2336 defsubr (&Slogand);
2337 defsubr (&Slogior);
2338 defsubr (&Slogxor);
2339 defsubr (&Slsh);
2340 defsubr (&Sash);
2341 defsubr (&Sadd1);
2342 defsubr (&Ssub1);
2343 defsubr (&Slognot);
2344
2345 XSYMBOL (Qwholenump)->function = XSYMBOL (Qnatnump)->function;
2346 }
2347
2348 SIGTYPE
2349 arith_error (signo)
2350 int signo;
2351 {
2352 #ifdef USG
2353 /* USG systems forget handlers when they are used;
2354 must reestablish each time */
2355 signal (signo, arith_error);
2356 #endif /* USG */
2357 #ifdef VMS
2358 /* VMS systems are like USG. */
2359 signal (signo, arith_error);
2360 #endif /* VMS */
2361 #ifdef BSD4_1
2362 sigrelse (SIGFPE);
2363 #else /* not BSD4_1 */
2364 sigsetmask (SIGEMPTYMASK);
2365 #endif /* not BSD4_1 */
2366
2367 Fsignal (Qarith_error, Qnil);
2368 }
2369
2370 init_data ()
2371 {
2372 /* Don't do this if just dumping out.
2373 We don't want to call `signal' in this case
2374 so that we don't have trouble with dumping
2375 signal-delivering routines in an inconsistent state. */
2376 #ifndef CANNOT_DUMP
2377 if (!initialized)
2378 return;
2379 #endif /* CANNOT_DUMP */
2380 signal (SIGFPE, arith_error);
2381
2382 #ifdef uts
2383 signal (SIGEMT, arith_error);
2384 #endif /* uts */
2385 }