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