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