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