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