*** empty log message ***
[bpt/emacs.git] / src / data.c
CommitLineData
7921925c 1/* Primitive operations on Lisp data types for GNU Emacs Lisp interpreter.
6f0e897f 2 Copyright (C) 1985,86,88,93,94,95,97,98,99,2000 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
7c938215 8the Free Software Foundation; either version 2, or (at your option)
7921925c
JB
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
3b7ad313
EN
18the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19Boston, MA 02111-1307, USA. */
7921925c
JB
20
21
18160b98 22#include <config.h>
68c45bf0 23#include <signal.h>
dd8daec5 24#include <stdio.h>
7921925c 25#include "lisp.h"
29eab336 26#include "puresize.h"
8313c4e7 27#include "charset.h"
7921925c 28#include "buffer.h"
077d751f 29#include "keyboard.h"
b0c2d1c6 30#include "frame.h"
a44804c2 31#include "syssignal.h"
fb8e9847 32
93b91208 33#ifdef STDC_HEADERS
2f261542 34#include <float.h>
93b91208 35#endif
defa77b5 36
ad8d56b9
PE
37/* If IEEE_FLOATING_POINT isn't defined, default it from FLT_*. */
38#ifndef IEEE_FLOATING_POINT
39#if (FLT_RADIX == 2 && FLT_MANT_DIG == 24 \
40 && FLT_MIN_EXP == -125 && FLT_MAX_EXP == 128)
41#define IEEE_FLOATING_POINT 1
42#else
43#define IEEE_FLOATING_POINT 0
44#endif
45#endif
46
defa77b5
RS
47/* Work around a problem that happens because math.h on hpux 7
48 defines two static variables--which, in Emacs, are not really static,
49 because `static' is defined as nothing. The problem is that they are
50 here, in floatfns.c, and in lread.c.
51 These macros prevent the name conflict. */
52#if defined (HPUX) && !defined (HPUX8)
53#define _MAXLDBL data_c_maxldbl
54#define _NMAXLDBL data_c_nmaxldbl
55#endif
56
7921925c 57#include <math.h>
7921925c 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;
8f9f49d7 71Lisp_Object Qtext_read_only;
8e86942b 72Lisp_Object Qintegerp, Qnatnump, Qwholenump, Qsymbolp, Qlistp, Qconsp;
7921925c
JB
73Lisp_Object Qstringp, Qarrayp, Qsequencep, Qbufferp;
74Lisp_Object Qchar_or_string_p, Qmarkerp, Qinteger_or_marker_p, Qvectorp;
cda9b832 75Lisp_Object Qbuffer_or_string_p, Qkeywordp;
7921925c 76Lisp_Object Qboundp, Qfboundp;
7f0edce7 77Lisp_Object Qchar_table_p, Qvector_or_char_table_p;
39bcc759 78
7921925c 79Lisp_Object Qcdr;
c1307a23 80Lisp_Object Qad_advice_info, Qad_activate_internal;
7921925c 81
6315e761
RS
82Lisp_Object Qrange_error, Qdomain_error, Qsingularity_error;
83Lisp_Object Qoverflow_error, Qunderflow_error;
84
464f8898 85Lisp_Object Qfloatp;
7921925c 86Lisp_Object Qnumberp, Qnumber_or_marker_p;
7921925c 87
39bcc759 88static Lisp_Object Qinteger, Qsymbol, Qstring, Qcons, Qmarker, Qoverlay;
8313c4e7
KH
89static Lisp_Object Qfloat, Qwindow_configuration, Qwindow;
90Lisp_Object Qprocess;
39bcc759 91static Lisp_Object Qcompiled_function, Qbuffer, Qframe, Qvector;
81dc5de5 92static Lisp_Object Qchar_table, Qbool_vector, Qhash_table;
6f0e897f 93static Lisp_Object Qsubrp, Qmany, Qunevalled;
39bcc759 94
7921925c
JB
95static Lisp_Object swap_in_symval_forwarding ();
96
d02eeab3
KH
97Lisp_Object set_internal ();
98
7921925c
JB
99Lisp_Object
100wrong_type_argument (predicate, value)
101 register Lisp_Object predicate, value;
102{
103 register Lisp_Object tem;
104 do
105 {
106 if (!EQ (Vmocklisp_arguments, Qt))
107 {
e9ebc175 108 if (STRINGP (value) &&
7921925c 109 (EQ (predicate, Qintegerp) || EQ (predicate, Qinteger_or_marker_p)))
3883fbeb 110 return Fstring_to_number (value, Qnil);
e9ebc175 111 if (INTEGERP (value) && EQ (predicate, Qstringp))
f2980264 112 return Fnumber_to_string (value);
7921925c 113 }
e1351ff7
RS
114
115 /* If VALUE is not even a valid Lisp object, abort here
116 where we can get a backtrace showing where it came from. */
04be3993 117 if ((unsigned int) XGCTYPE (value) >= Lisp_Type_Limit)
e1351ff7
RS
118 abort ();
119
7921925c
JB
120 value = Fsignal (Qwrong_type_argument, Fcons (predicate, Fcons (value, Qnil)));
121 tem = call1 (predicate, value);
122 }
a33ef3ab 123 while (NILP (tem));
7921925c
JB
124 return value;
125}
126
dfcf069d 127void
7921925c
JB
128pure_write_error ()
129{
130 error ("Attempt to modify read-only object");
131}
132
133void
134args_out_of_range (a1, a2)
135 Lisp_Object a1, a2;
136{
137 while (1)
138 Fsignal (Qargs_out_of_range, Fcons (a1, Fcons (a2, Qnil)));
139}
140
141void
142args_out_of_range_3 (a1, a2, a3)
143 Lisp_Object a1, a2, a3;
144{
145 while (1)
146 Fsignal (Qargs_out_of_range, Fcons (a1, Fcons (a2, Fcons (a3, Qnil))));
147}
148
7921925c
JB
149/* On some machines, XINT needs a temporary location.
150 Here it is, in case it is needed. */
151
152int sign_extend_temp;
153
154/* On a few machines, XINT can only be done by calling this. */
155
156int
157sign_extend_lisp_int (num)
a0ed95ea 158 EMACS_INT num;
7921925c 159{
a0ed95ea
RS
160 if (num & (((EMACS_INT) 1) << (VALBITS - 1)))
161 return num | (((EMACS_INT) (-1)) << VALBITS);
7921925c 162 else
a0ed95ea 163 return num & ((((EMACS_INT) 1) << VALBITS) - 1);
7921925c
JB
164}
165\f
166/* Data type predicates */
167
168DEFUN ("eq", Feq, Seq, 2, 2, 0,
c2124165 169 "Return t if the two args are the same Lisp object.")
7921925c
JB
170 (obj1, obj2)
171 Lisp_Object obj1, obj2;
172{
173 if (EQ (obj1, obj2))
174 return Qt;
175 return Qnil;
176}
177
c2124165 178DEFUN ("null", Fnull, Snull, 1, 1, 0, "Return t if OBJECT is nil.")
39bcc759
RS
179 (object)
180 Lisp_Object object;
7921925c 181{
39bcc759 182 if (NILP (object))
7921925c
JB
183 return Qt;
184 return Qnil;
185}
186
39bcc759
RS
187DEFUN ("type-of", Ftype_of, Stype_of, 1, 1, 0,
188 "Return a symbol representing the type of OBJECT.\n\
189The symbol returned names the object's basic type;\n\
190for example, (type-of 1) returns `integer'.")
191 (object)
192 Lisp_Object object;
193{
194 switch (XGCTYPE (object))
195 {
196 case Lisp_Int:
197 return Qinteger;
198
199 case Lisp_Symbol:
200 return Qsymbol;
201
202 case Lisp_String:
203 return Qstring;
204
205 case Lisp_Cons:
206 return Qcons;
207
208 case Lisp_Misc:
324a6eef 209 switch (XMISCTYPE (object))
39bcc759
RS
210 {
211 case Lisp_Misc_Marker:
212 return Qmarker;
213 case Lisp_Misc_Overlay:
214 return Qoverlay;
215 case Lisp_Misc_Float:
216 return Qfloat;
217 }
218 abort ();
219
220 case Lisp_Vectorlike:
221 if (GC_WINDOW_CONFIGURATIONP (object))
222 return Qwindow_configuration;
223 if (GC_PROCESSP (object))
224 return Qprocess;
225 if (GC_WINDOWP (object))
226 return Qwindow;
227 if (GC_SUBRP (object))
228 return Qsubr;
229 if (GC_COMPILEDP (object))
230 return Qcompiled_function;
231 if (GC_BUFFERP (object))
232 return Qbuffer;
fc67d5be
KH
233 if (GC_CHAR_TABLE_P (object))
234 return Qchar_table;
235 if (GC_BOOL_VECTOR_P (object))
236 return Qbool_vector;
39bcc759
RS
237 if (GC_FRAMEP (object))
238 return Qframe;
81dc5de5
GM
239 if (GC_HASH_TABLE_P (object))
240 return Qhash_table;
39bcc759
RS
241 return Qvector;
242
39bcc759
RS
243 case Lisp_Float:
244 return Qfloat;
39bcc759
RS
245
246 default:
247 abort ();
248 }
249}
250
c2124165 251DEFUN ("consp", Fconsp, Sconsp, 1, 1, 0, "Return t if OBJECT is a cons cell.")
39bcc759
RS
252 (object)
253 Lisp_Object object;
7921925c 254{
39bcc759 255 if (CONSP (object))
7921925c
JB
256 return Qt;
257 return Qnil;
258}
259
25638b07
RS
260DEFUN ("atom", Fatom, Satom, 1, 1, 0,
261 "Return t if OBJECT is not a cons cell. This includes nil.")
39bcc759
RS
262 (object)
263 Lisp_Object object;
7921925c 264{
39bcc759 265 if (CONSP (object))
7921925c
JB
266 return Qnil;
267 return Qt;
268}
269
25638b07
RS
270DEFUN ("listp", Flistp, Slistp, 1, 1, 0,
271 "Return t if OBJECT is a list. This includes nil.")
39bcc759
RS
272 (object)
273 Lisp_Object object;
7921925c 274{
39bcc759 275 if (CONSP (object) || NILP (object))
7921925c
JB
276 return Qt;
277 return Qnil;
278}
279
25638b07
RS
280DEFUN ("nlistp", Fnlistp, Snlistp, 1, 1, 0,
281 "Return t if OBJECT is not a list. Lists include nil.")
39bcc759
RS
282 (object)
283 Lisp_Object object;
7921925c 284{
39bcc759 285 if (CONSP (object) || NILP (object))
7921925c
JB
286 return Qnil;
287 return Qt;
288}
289\f
25638b07
RS
290DEFUN ("symbolp", Fsymbolp, Ssymbolp, 1, 1, 0,
291 "Return t if OBJECT is a symbol.")
39bcc759
RS
292 (object)
293 Lisp_Object object;
7921925c 294{
39bcc759 295 if (SYMBOLP (object))
7921925c
JB
296 return Qt;
297 return Qnil;
298}
299
cda9b832
DL
300/* Define this in C to avoid unnecessarily consing up the symbol
301 name. */
302DEFUN ("keywordp", Fkeywordp, Skeywordp, 1, 1, 0,
303 "Return t if OBJECT is a keyword.\n\
304This means that it is a symbol with a print name beginning with `:'\n\
305interned in the initial obarray.")
306 (object)
307 Lisp_Object object;
308{
309 if (SYMBOLP (object)
310 && XSYMBOL (object)->name->data[0] == ':'
311 && EQ (XSYMBOL (object)->obarray, initial_obarray))
312 return Qt;
313 return Qnil;
314}
315
25638b07
RS
316DEFUN ("vectorp", Fvectorp, Svectorp, 1, 1, 0,
317 "Return t if OBJECT is a vector.")
39bcc759
RS
318 (object)
319 Lisp_Object object;
7921925c 320{
39bcc759 321 if (VECTORP (object))
7921925c
JB
322 return Qt;
323 return Qnil;
324}
325
25638b07
RS
326DEFUN ("stringp", Fstringp, Sstringp, 1, 1, 0,
327 "Return t if OBJECT is a string.")
39bcc759
RS
328 (object)
329 Lisp_Object object;
7921925c 330{
39bcc759 331 if (STRINGP (object))
7921925c
JB
332 return Qt;
333 return Qnil;
334}
335
25638b07
RS
336DEFUN ("multibyte-string-p", Fmultibyte_string_p, Smultibyte_string_p,
337 1, 1, 0, "Return t if OBJECT is a multibyte string.")
338 (object)
339 Lisp_Object object;
340{
341 if (STRINGP (object) && STRING_MULTIBYTE (object))
342 return Qt;
343 return Qnil;
344}
345
346DEFUN ("char-table-p", Fchar_table_p, Schar_table_p, 1, 1, 0,
347 "Return t if OBJECT is a char-table.")
4d276982
RS
348 (object)
349 Lisp_Object object;
350{
351 if (CHAR_TABLE_P (object))
352 return Qt;
353 return Qnil;
354}
355
7f0edce7
RS
356DEFUN ("vector-or-char-table-p", Fvector_or_char_table_p,
357 Svector_or_char_table_p, 1, 1, 0,
c2124165 358 "Return t if OBJECT is a char-table or vector.")
7f0edce7
RS
359 (object)
360 Lisp_Object object;
361{
362 if (VECTORP (object) || CHAR_TABLE_P (object))
363 return Qt;
364 return Qnil;
365}
366
c2124165 367DEFUN ("bool-vector-p", Fbool_vector_p, Sbool_vector_p, 1, 1, 0, "Return t if OBJECT is a bool-vector.")
4d276982
RS
368 (object)
369 Lisp_Object object;
370{
371 if (BOOL_VECTOR_P (object))
372 return Qt;
373 return Qnil;
374}
375
c2124165 376DEFUN ("arrayp", Farrayp, Sarrayp, 1, 1, 0, "Return t if OBJECT is an array (string or vector).")
39bcc759
RS
377 (object)
378 Lisp_Object object;
7921925c 379{
a9729926
RS
380 if (VECTORP (object) || STRINGP (object)
381 || CHAR_TABLE_P (object) || BOOL_VECTOR_P (object))
7921925c
JB
382 return Qt;
383 return Qnil;
384}
385
386DEFUN ("sequencep", Fsequencep, Ssequencep, 1, 1, 0,
c2124165 387 "Return t if OBJECT is a sequence (list or array).")
39bcc759
RS
388 (object)
389 register Lisp_Object object;
7921925c 390{
4d276982
RS
391 if (CONSP (object) || NILP (object) || VECTORP (object) || STRINGP (object)
392 || CHAR_TABLE_P (object) || BOOL_VECTOR_P (object))
7921925c
JB
393 return Qt;
394 return Qnil;
395}
396
c2124165 397DEFUN ("bufferp", Fbufferp, Sbufferp, 1, 1, 0, "Return t if OBJECT is an editor buffer.")
39bcc759
RS
398 (object)
399 Lisp_Object object;
7921925c 400{
39bcc759 401 if (BUFFERP (object))
7921925c
JB
402 return Qt;
403 return Qnil;
404}
405
c2124165 406DEFUN ("markerp", Fmarkerp, Smarkerp, 1, 1, 0, "Return t if OBJECT is a marker (editor pointer).")
39bcc759
RS
407 (object)
408 Lisp_Object object;
7921925c 409{
39bcc759 410 if (MARKERP (object))
7921925c
JB
411 return Qt;
412 return Qnil;
413}
414
c2124165 415DEFUN ("subrp", Fsubrp, Ssubrp, 1, 1, 0, "Return t if OBJECT is a built-in function.")
39bcc759
RS
416 (object)
417 Lisp_Object object;
7921925c 418{
39bcc759 419 if (SUBRP (object))
7921925c
JB
420 return Qt;
421 return Qnil;
422}
423
dbc4e1c1 424DEFUN ("byte-code-function-p", Fbyte_code_function_p, Sbyte_code_function_p,
c2124165 425 1, 1, 0, "Return t if OBJECT is a byte-compiled function object.")
39bcc759
RS
426 (object)
427 Lisp_Object object;
7921925c 428{
39bcc759 429 if (COMPILEDP (object))
7921925c
JB
430 return Qt;
431 return Qnil;
432}
433
0321d75c 434DEFUN ("char-or-string-p", Fchar_or_string_p, Schar_or_string_p, 1, 1, 0,
c2124165 435 "Return t if OBJECT is a character (an integer) or a string.")
39bcc759
RS
436 (object)
437 register Lisp_Object object;
7921925c 438{
39bcc759 439 if (INTEGERP (object) || STRINGP (object))
7921925c
JB
440 return Qt;
441 return Qnil;
442}
443\f
c2124165 444DEFUN ("integerp", Fintegerp, Sintegerp, 1, 1, 0, "Return t if OBJECT is an integer.")
39bcc759
RS
445 (object)
446 Lisp_Object object;
7921925c 447{
39bcc759 448 if (INTEGERP (object))
7921925c
JB
449 return Qt;
450 return Qnil;
451}
452
464f8898 453DEFUN ("integer-or-marker-p", Finteger_or_marker_p, Sinteger_or_marker_p, 1, 1, 0,
c2124165 454 "Return t if OBJECT is an integer or a marker (editor pointer).")
39bcc759
RS
455 (object)
456 register Lisp_Object object;
7921925c 457{
39bcc759 458 if (MARKERP (object) || INTEGERP (object))
7921925c
JB
459 return Qt;
460 return Qnil;
461}
462
0321d75c 463DEFUN ("natnump", Fnatnump, Snatnump, 1, 1, 0,
c2124165 464 "Return t if OBJECT is a nonnegative integer.")
39bcc759
RS
465 (object)
466 Lisp_Object object;
7921925c 467{
39bcc759 468 if (NATNUMP (object))
7921925c
JB
469 return Qt;
470 return Qnil;
471}
472
473DEFUN ("numberp", Fnumberp, Snumberp, 1, 1, 0,
c2124165 474 "Return t if OBJECT is a number (floating point or integer).")
39bcc759
RS
475 (object)
476 Lisp_Object object;
7921925c 477{
39bcc759 478 if (NUMBERP (object))
7921925c 479 return Qt;
dbc4e1c1
JB
480 else
481 return Qnil;
7921925c
JB
482}
483
484DEFUN ("number-or-marker-p", Fnumber_or_marker_p,
485 Snumber_or_marker_p, 1, 1, 0,
c2124165 486 "Return t if OBJECT is a number or a marker.")
39bcc759
RS
487 (object)
488 Lisp_Object object;
7921925c 489{
39bcc759 490 if (NUMBERP (object) || MARKERP (object))
7921925c
JB
491 return Qt;
492 return Qnil;
493}
464f8898 494
464f8898 495DEFUN ("floatp", Ffloatp, Sfloatp, 1, 1, 0,
c2124165 496 "Return t if OBJECT is a floating point number.")
39bcc759
RS
497 (object)
498 Lisp_Object object;
464f8898 499{
39bcc759 500 if (FLOATP (object))
464f8898
RS
501 return Qt;
502 return Qnil;
503}
cc94f3b2 504
7921925c
JB
505\f
506/* Extract and set components of lists */
507
508DEFUN ("car", Fcar, Scar, 1, 1, 0,
e1960a18 509 "Return the car of LIST. If arg is nil, return nil.\n\
7921925c
JB
510Error if arg is not nil and not a cons cell. See also `car-safe'.")
511 (list)
512 register Lisp_Object list;
513{
514 while (1)
515 {
e9ebc175 516 if (CONSP (list))
7539e11f 517 return XCAR (list);
7921925c
JB
518 else if (EQ (list, Qnil))
519 return Qnil;
520 else
521 list = wrong_type_argument (Qlistp, list);
522 }
523}
524
525DEFUN ("car-safe", Fcar_safe, Scar_safe, 1, 1, 0,
526 "Return the car of OBJECT if it is a cons cell, or else nil.")
527 (object)
528 Lisp_Object object;
529{
e9ebc175 530 if (CONSP (object))
7539e11f 531 return XCAR (object);
7921925c
JB
532 else
533 return Qnil;
534}
535
536DEFUN ("cdr", Fcdr, Scdr, 1, 1, 0,
e1960a18 537 "Return the cdr of LIST. If arg is nil, return nil.\n\
7921925c
JB
538Error if arg is not nil and not a cons cell. See also `cdr-safe'.")
539
540 (list)
541 register Lisp_Object list;
542{
543 while (1)
544 {
e9ebc175 545 if (CONSP (list))
7539e11f 546 return XCDR (list);
7921925c
JB
547 else if (EQ (list, Qnil))
548 return Qnil;
549 else
550 list = wrong_type_argument (Qlistp, list);
551 }
552}
553
554DEFUN ("cdr-safe", Fcdr_safe, Scdr_safe, 1, 1, 0,
b7abc8fa 555 "Return the cdr of OBJECT if it is a cons cell, or else nil.")
7921925c
JB
556 (object)
557 Lisp_Object object;
558{
e9ebc175 559 if (CONSP (object))
7539e11f 560 return XCDR (object);
7921925c
JB
561 else
562 return Qnil;
563}
564
565DEFUN ("setcar", Fsetcar, Ssetcar, 2, 2, 0,
e1960a18 566 "Set the car of CELL to be NEWCAR. Returns NEWCAR.")
7921925c
JB
567 (cell, newcar)
568 register Lisp_Object cell, newcar;
569{
e9ebc175 570 if (!CONSP (cell))
7921925c
JB
571 cell = wrong_type_argument (Qconsp, cell);
572
573 CHECK_IMPURE (cell);
7539e11f 574 XCAR (cell) = newcar;
7921925c
JB
575 return newcar;
576}
577
578DEFUN ("setcdr", Fsetcdr, Ssetcdr, 2, 2, 0,
e1960a18 579 "Set the cdr of CELL to be NEWCDR. Returns NEWCDR.")
7921925c
JB
580 (cell, newcdr)
581 register Lisp_Object cell, newcdr;
582{
e9ebc175 583 if (!CONSP (cell))
7921925c
JB
584 cell = wrong_type_argument (Qconsp, cell);
585
586 CHECK_IMPURE (cell);
7539e11f 587 XCDR (cell) = newcdr;
7921925c
JB
588 return newcdr;
589}
590\f
591/* Extract and set components of symbols */
592
c2124165 593DEFUN ("boundp", Fboundp, Sboundp, 1, 1, 0, "Return t if SYMBOL's value is not void.")
d9c2a0f2
EN
594 (symbol)
595 register Lisp_Object symbol;
7921925c
JB
596{
597 Lisp_Object valcontents;
d9c2a0f2 598 CHECK_SYMBOL (symbol, 0);
7921925c 599
d9c2a0f2 600 valcontents = XSYMBOL (symbol)->value;
7921925c 601
aabf6bec
KH
602 if (BUFFER_LOCAL_VALUEP (valcontents)
603 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
d9c2a0f2 604 valcontents = swap_in_symval_forwarding (symbol, valcontents);
7921925c 605
1bfcade3 606 return (EQ (valcontents, Qunbound) ? Qnil : Qt);
7921925c
JB
607}
608
c2124165 609DEFUN ("fboundp", Ffboundp, Sfboundp, 1, 1, 0, "Return t if SYMBOL's function definition is not void.")
d9c2a0f2
EN
610 (symbol)
611 register Lisp_Object symbol;
7921925c 612{
d9c2a0f2
EN
613 CHECK_SYMBOL (symbol, 0);
614 return (EQ (XSYMBOL (symbol)->function, Qunbound) ? Qnil : Qt);
7921925c
JB
615}
616
617DEFUN ("makunbound", Fmakunbound, Smakunbound, 1, 1, 0, "Make SYMBOL's value be void.")
d9c2a0f2
EN
618 (symbol)
619 register Lisp_Object symbol;
7921925c 620{
d9c2a0f2 621 CHECK_SYMBOL (symbol, 0);
5c5aad07
KH
622 if (NILP (symbol) || EQ (symbol, Qt)
623 || (XSYMBOL (symbol)->name->data[0] == ':'
f50d847a 624 && EQ (XSYMBOL (symbol)->obarray, initial_obarray)))
d9c2a0f2
EN
625 return Fsignal (Qsetting_constant, Fcons (symbol, Qnil));
626 Fset (symbol, Qunbound);
627 return symbol;
7921925c
JB
628}
629
630DEFUN ("fmakunbound", Ffmakunbound, Sfmakunbound, 1, 1, 0, "Make SYMBOL's function definition be void.")
d9c2a0f2
EN
631 (symbol)
632 register Lisp_Object symbol;
7921925c 633{
d9c2a0f2
EN
634 CHECK_SYMBOL (symbol, 0);
635 if (NILP (symbol) || EQ (symbol, Qt))
636 return Fsignal (Qsetting_constant, Fcons (symbol, Qnil));
637 XSYMBOL (symbol)->function = Qunbound;
638 return symbol;
7921925c
JB
639}
640
641DEFUN ("symbol-function", Fsymbol_function, Ssymbol_function, 1, 1, 0,
642 "Return SYMBOL's function definition. Error if that is void.")
ffd56f97
JB
643 (symbol)
644 register Lisp_Object symbol;
7921925c 645{
ffd56f97
JB
646 CHECK_SYMBOL (symbol, 0);
647 if (EQ (XSYMBOL (symbol)->function, Qunbound))
648 return Fsignal (Qvoid_function, Fcons (symbol, Qnil));
649 return XSYMBOL (symbol)->function;
7921925c
JB
650}
651
652DEFUN ("symbol-plist", Fsymbol_plist, Ssymbol_plist, 1, 1, 0, "Return SYMBOL's property list.")
d9c2a0f2
EN
653 (symbol)
654 register Lisp_Object symbol;
7921925c 655{
d9c2a0f2
EN
656 CHECK_SYMBOL (symbol, 0);
657 return XSYMBOL (symbol)->plist;
7921925c
JB
658}
659
660DEFUN ("symbol-name", Fsymbol_name, Ssymbol_name, 1, 1, 0, "Return SYMBOL's name, a string.")
d9c2a0f2
EN
661 (symbol)
662 register Lisp_Object symbol;
7921925c
JB
663{
664 register Lisp_Object name;
665
d9c2a0f2
EN
666 CHECK_SYMBOL (symbol, 0);
667 XSETSTRING (name, XSYMBOL (symbol)->name);
7921925c
JB
668 return name;
669}
670
671DEFUN ("fset", Ffset, Sfset, 2, 2, 0,
8c0b5540
RS
672 "Set SYMBOL's function definition to DEFINITION, and return DEFINITION.")
673 (symbol, definition)
674 register Lisp_Object symbol, definition;
d9c2a0f2
EN
675{
676 CHECK_SYMBOL (symbol, 0);
677 if (NILP (symbol) || EQ (symbol, Qt))
678 return Fsignal (Qsetting_constant, Fcons (symbol, Qnil));
679 if (!NILP (Vautoload_queue) && !EQ (XSYMBOL (symbol)->function, Qunbound))
680 Vautoload_queue = Fcons (Fcons (symbol, XSYMBOL (symbol)->function),
7921925c 681 Vautoload_queue);
8c0b5540 682 XSYMBOL (symbol)->function = definition;
f845f2c9 683 /* Handle automatic advice activation */
d9c2a0f2 684 if (CONSP (XSYMBOL (symbol)->plist) && !NILP (Fget (symbol, Qad_advice_info)))
f845f2c9 685 {
c1307a23 686 call2 (Qad_activate_internal, symbol, Qnil);
8c0b5540 687 definition = XSYMBOL (symbol)->function;
f845f2c9 688 }
8c0b5540 689 return definition;
7921925c
JB
690}
691
80df38a2 692DEFUN ("defalias", Fdefalias, Sdefalias, 2, 2, 0,
73e0d965 693 "Set SYMBOL's function definition to DEFINITION, and return DEFINITION.\n\
fc08c367 694Associates the function with the current load file, if any.")
73e0d965
RS
695 (symbol, definition)
696 register Lisp_Object symbol, definition;
fc08c367 697{
32f532b7 698 definition = Ffset (symbol, definition);
d9c2a0f2 699 LOADHIST_ATTACH (symbol);
73e0d965 700 return definition;
fc08c367
RS
701}
702
7921925c
JB
703DEFUN ("setplist", Fsetplist, Ssetplist, 2, 2, 0,
704 "Set SYMBOL's property list to NEWVAL, and return NEWVAL.")
d9c2a0f2
EN
705 (symbol, newplist)
706 register Lisp_Object symbol, newplist;
7921925c 707{
d9c2a0f2
EN
708 CHECK_SYMBOL (symbol, 0);
709 XSYMBOL (symbol)->plist = newplist;
7921925c
JB
710 return newplist;
711}
ffd56f97 712
6f0e897f
DL
713DEFUN ("subr-arity", Fsubr_arity, Ssubr_arity, 1, 1, 0,
714 "Return minimum and maximum number of args allowed for SUBR.\n\
715SUBR must be a built-in function.\n\
716The returned value is a pair (MIN . MAX). MIN is the minimum number\n\
717of args. MAX is the maximum number or the symbol `many', for a\n\
718function with `&rest' args, or `unevalled' for a special form.")
719 (subr)
720 Lisp_Object subr;
721{
722 short minargs, maxargs;
723 if (!SUBRP (subr))
724 wrong_type_argument (Qsubrp, subr);
725 minargs = XSUBR (subr)->min_args;
726 maxargs = XSUBR (subr)->max_args;
727 if (maxargs == MANY)
728 return Fcons (make_number (minargs), Qmany);
729 else if (maxargs == UNEVALLED)
730 return Fcons (make_number (minargs), Qunevalled);
731 else
732 return Fcons (make_number (minargs), make_number (maxargs));
733}
734
7921925c
JB
735\f
736/* Getting and setting values of symbols */
737
738/* Given the raw contents of a symbol value cell,
739 return the Lisp value of the symbol.
740 This does not handle buffer-local variables; use
741 swap_in_symval_forwarding for that. */
742
743Lisp_Object
744do_symval_forwarding (valcontents)
745 register Lisp_Object valcontents;
746{
747 register Lisp_Object val;
46b2ac21
KH
748 int offset;
749 if (MISCP (valcontents))
324a6eef 750 switch (XMISCTYPE (valcontents))
46b2ac21
KH
751 {
752 case Lisp_Misc_Intfwd:
753 XSETINT (val, *XINTFWD (valcontents)->intvar);
754 return val;
7921925c 755
46b2ac21
KH
756 case Lisp_Misc_Boolfwd:
757 return (*XBOOLFWD (valcontents)->boolvar ? Qt : Qnil);
7921925c 758
46b2ac21
KH
759 case Lisp_Misc_Objfwd:
760 return *XOBJFWD (valcontents)->objvar;
7921925c 761
46b2ac21
KH
762 case Lisp_Misc_Buffer_Objfwd:
763 offset = XBUFFER_OBJFWD (valcontents)->offset;
f6cd0527 764 return PER_BUFFER_VALUE (current_buffer, offset);
7403b5c8 765
e5f8af9e
KH
766 case Lisp_Misc_Kboard_Objfwd:
767 offset = XKBOARD_OBJFWD (valcontents)->offset;
768 return *(Lisp_Object *)(offset + (char *)current_kboard);
46b2ac21 769 }
7921925c
JB
770 return valcontents;
771}
772
d9c2a0f2
EN
773/* Store NEWVAL into SYMBOL, where VALCONTENTS is found in the value cell
774 of SYMBOL. If SYMBOL is buffer-local, VALCONTENTS should be the
7921925c
JB
775 buffer-independent contents of the value cell: forwarded just one
776 step past the buffer-localness. */
777
778void
d9c2a0f2
EN
779store_symval_forwarding (symbol, valcontents, newval)
780 Lisp_Object symbol;
7921925c
JB
781 register Lisp_Object valcontents, newval;
782{
0220c518 783 switch (SWITCH_ENUM_CAST (XTYPE (valcontents)))
7921925c 784 {
46b2ac21 785 case Lisp_Misc:
324a6eef 786 switch (XMISCTYPE (valcontents))
46b2ac21
KH
787 {
788 case Lisp_Misc_Intfwd:
789 CHECK_NUMBER (newval, 1);
790 *XINTFWD (valcontents)->intvar = XINT (newval);
e6c82a8d
RS
791 if (*XINTFWD (valcontents)->intvar != XINT (newval))
792 error ("Value out of range for variable `%s'",
d9c2a0f2 793 XSYMBOL (symbol)->name->data);
46b2ac21
KH
794 break;
795
796 case Lisp_Misc_Boolfwd:
797 *XBOOLFWD (valcontents)->boolvar = NILP (newval) ? 0 : 1;
798 break;
799
800 case Lisp_Misc_Objfwd:
801 *XOBJFWD (valcontents)->objvar = newval;
802 break;
803
804 case Lisp_Misc_Buffer_Objfwd:
805 {
806 int offset = XBUFFER_OBJFWD (valcontents)->offset;
807 Lisp_Object type;
808
f6cd0527 809 type = PER_BUFFER_TYPE (offset);
984ef137
KH
810 if (XINT (type) == -1)
811 error ("Variable %s is read-only", XSYMBOL (symbol)->name->data);
812
46b2ac21
KH
813 if (! NILP (type) && ! NILP (newval)
814 && XTYPE (newval) != XINT (type))
815 buffer_slot_type_mismatch (offset);
816
f6cd0527 817 PER_BUFFER_VALUE (current_buffer, offset) = newval;
46b2ac21 818 }
7403b5c8
KH
819 break;
820
e5f8af9e
KH
821 case Lisp_Misc_Kboard_Objfwd:
822 (*(Lisp_Object *)((char *)current_kboard
823 + XKBOARD_OBJFWD (valcontents)->offset))
7403b5c8
KH
824 = newval;
825 break;
826
46b2ac21
KH
827 default:
828 goto def;
829 }
7921925c
JB
830 break;
831
7921925c 832 default:
46b2ac21 833 def:
d9c2a0f2 834 valcontents = XSYMBOL (symbol)->value;
e9ebc175
KH
835 if (BUFFER_LOCAL_VALUEP (valcontents)
836 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
b0c2d1c6 837 XBUFFER_LOCAL_VALUE (valcontents)->realvalue = newval;
7921925c 838 else
d9c2a0f2 839 XSYMBOL (symbol)->value = newval;
7921925c
JB
840 }
841}
842
b0d53add
GM
843/* Set up SYMBOL to refer to its global binding.
844 This makes it safe to alter the status of other bindings. */
845
846void
847swap_in_global_binding (symbol)
848 Lisp_Object symbol;
849{
850 Lisp_Object valcontents, cdr;
851
852 valcontents = XSYMBOL (symbol)->value;
853 if (!BUFFER_LOCAL_VALUEP (valcontents)
854 && !SOME_BUFFER_LOCAL_VALUEP (valcontents))
855 abort ();
856 cdr = XBUFFER_LOCAL_VALUE (valcontents)->cdr;
857
858 /* Unload the previously loaded binding. */
859 Fsetcdr (XCAR (cdr),
860 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue));
861
862 /* Select the global binding in the symbol. */
863 XCAR (cdr) = cdr;
864 store_symval_forwarding (symbol, valcontents, XCDR (cdr));
865
866 /* Indicate that the global binding is set up now. */
867 XBUFFER_LOCAL_VALUE (valcontents)->frame = Qnil;
868 XBUFFER_LOCAL_VALUE (valcontents)->buffer = Qnil;
869 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 0;
870 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
871}
872
2829d05f 873/* Set up the buffer-local symbol SYMBOL for validity in the current buffer.
42e975f0
RS
874 VALCONTENTS is the contents of its value cell,
875 which points to a struct Lisp_Buffer_Local_Value.
876
877 Return the value forwarded one step past the buffer-local stage.
878 This could be another forwarding pointer. */
7921925c
JB
879
880static Lisp_Object
d9c2a0f2
EN
881swap_in_symval_forwarding (symbol, valcontents)
882 Lisp_Object symbol, valcontents;
7921925c 883{
7921925c 884 register Lisp_Object tem1;
b0c2d1c6 885 tem1 = XBUFFER_LOCAL_VALUE (valcontents)->buffer;
7921925c 886
42e975f0
RS
887 if (NILP (tem1)
888 || current_buffer != XBUFFER (tem1)
889 || (XBUFFER_LOCAL_VALUE (valcontents)->check_frame
890 && ! EQ (selected_frame, XBUFFER_LOCAL_VALUE (valcontents)->frame)))
7921925c 891 {
42e975f0 892 /* Unload the previously loaded binding. */
7539e11f 893 tem1 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
8d4afcac 894 Fsetcdr (tem1,
b0c2d1c6 895 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue));
42e975f0 896 /* Choose the new binding. */
d9c2a0f2 897 tem1 = assq_no_quit (symbol, current_buffer->local_var_alist);
b0c2d1c6
RS
898 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 0;
899 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
a33ef3ab 900 if (NILP (tem1))
b0c2d1c6
RS
901 {
902 if (XBUFFER_LOCAL_VALUE (valcontents)->check_frame)
1cc04aed 903 tem1 = assq_no_quit (symbol, XFRAME (selected_frame)->param_alist);
b0c2d1c6
RS
904 if (! NILP (tem1))
905 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 1;
906 else
907 tem1 = XBUFFER_LOCAL_VALUE (valcontents)->cdr;
908 }
909 else
910 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 1;
911
42e975f0 912 /* Load the new binding. */
7539e11f 913 XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr) = tem1;
b0c2d1c6 914 XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer, current_buffer);
1cc04aed 915 XBUFFER_LOCAL_VALUE (valcontents)->frame = selected_frame;
b0c2d1c6
RS
916 store_symval_forwarding (symbol,
917 XBUFFER_LOCAL_VALUE (valcontents)->realvalue,
8d4afcac 918 Fcdr (tem1));
7921925c 919 }
b0c2d1c6 920 return XBUFFER_LOCAL_VALUE (valcontents)->realvalue;
7921925c
JB
921}
922\f
14e76af9
JB
923/* Find the value of a symbol, returning Qunbound if it's not bound.
924 This is helpful for code which just wants to get a variable's value
8e6208c5 925 if it has one, without signaling an error.
14e76af9
JB
926 Note that it must not be possible to quit
927 within this function. Great care is required for this. */
7921925c 928
14e76af9 929Lisp_Object
d9c2a0f2
EN
930find_symbol_value (symbol)
931 Lisp_Object symbol;
7921925c 932{
dd8daec5 933 register Lisp_Object valcontents;
7921925c 934 register Lisp_Object val;
d9c2a0f2
EN
935 CHECK_SYMBOL (symbol, 0);
936 valcontents = XSYMBOL (symbol)->value;
7921925c 937
aabf6bec
KH
938 if (BUFFER_LOCAL_VALUEP (valcontents)
939 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
2829d05f
RS
940 valcontents = swap_in_symval_forwarding (symbol, valcontents,
941 current_buffer);
7921925c 942
536b772a
KH
943 if (MISCP (valcontents))
944 {
324a6eef 945 switch (XMISCTYPE (valcontents))
46b2ac21
KH
946 {
947 case Lisp_Misc_Intfwd:
948 XSETINT (val, *XINTFWD (valcontents)->intvar);
949 return val;
7921925c 950
46b2ac21
KH
951 case Lisp_Misc_Boolfwd:
952 return (*XBOOLFWD (valcontents)->boolvar ? Qt : Qnil);
7921925c 953
46b2ac21
KH
954 case Lisp_Misc_Objfwd:
955 return *XOBJFWD (valcontents)->objvar;
7921925c 956
46b2ac21 957 case Lisp_Misc_Buffer_Objfwd:
f6cd0527 958 return PER_BUFFER_VALUE (current_buffer,
999b32fd 959 XBUFFER_OBJFWD (valcontents)->offset);
7403b5c8 960
e5f8af9e
KH
961 case Lisp_Misc_Kboard_Objfwd:
962 return *(Lisp_Object *)(XKBOARD_OBJFWD (valcontents)->offset
963 + (char *)current_kboard);
46b2ac21 964 }
7921925c
JB
965 }
966
967 return valcontents;
968}
969
14e76af9
JB
970DEFUN ("symbol-value", Fsymbol_value, Ssymbol_value, 1, 1, 0,
971 "Return SYMBOL's value. Error if that is void.")
d9c2a0f2
EN
972 (symbol)
973 Lisp_Object symbol;
14e76af9 974{
0671d7c0 975 Lisp_Object val;
14e76af9 976
d9c2a0f2 977 val = find_symbol_value (symbol);
14e76af9 978 if (EQ (val, Qunbound))
d9c2a0f2 979 return Fsignal (Qvoid_variable, Fcons (symbol, Qnil));
14e76af9
JB
980 else
981 return val;
982}
983
7921925c
JB
984DEFUN ("set", Fset, Sset, 2, 2, 0,
985 "Set SYMBOL's value to NEWVAL, and return NEWVAL.")
d9c2a0f2
EN
986 (symbol, newval)
987 register Lisp_Object symbol, newval;
05ef7169 988{
2829d05f 989 return set_internal (symbol, newval, current_buffer, 0);
05ef7169
RS
990}
991
1f35ce36
RS
992/* Return 1 if SYMBOL currently has a let-binding
993 which was made in the buffer that is now current. */
994
995static int
996let_shadows_buffer_binding_p (symbol)
997 Lisp_Object symbol;
998{
999 struct specbinding *p;
1000
1001 for (p = specpdl_ptr - 1; p >= specpdl; p--)
f0930f35
GM
1002 if (p->func == 0
1003 && CONSP (p->symbol)
1004 && EQ (symbol, XCAR (p->symbol))
1f35ce36
RS
1005 && XBUFFER (XCDR (XCDR (p->symbol))) == current_buffer)
1006 return 1;
1007
1008 return 0;
1009}
1010
25638b07 1011/* Store the value NEWVAL into SYMBOL.
2829d05f
RS
1012 If buffer-locality is an issue, BUF specifies which buffer to use.
1013 (0 stands for the current buffer.)
1014
05ef7169
RS
1015 If BINDFLAG is zero, then if this symbol is supposed to become
1016 local in every buffer where it is set, then we make it local.
1017 If BINDFLAG is nonzero, we don't do that. */
1018
1019Lisp_Object
2829d05f 1020set_internal (symbol, newval, buf, bindflag)
05ef7169 1021 register Lisp_Object symbol, newval;
2829d05f 1022 struct buffer *buf;
05ef7169 1023 int bindflag;
7921925c 1024{
1bfcade3 1025 int voide = EQ (newval, Qunbound);
7921925c 1026
4c47c973 1027 register Lisp_Object valcontents, innercontents, tem1, current_alist_element;
7921925c 1028
2829d05f
RS
1029 if (buf == 0)
1030 buf = current_buffer;
1031
1032 /* If restoring in a dead buffer, do nothing. */
1033 if (NILP (buf->name))
1034 return newval;
1035
d9c2a0f2 1036 CHECK_SYMBOL (symbol, 0);
5c5aad07
KH
1037 if (NILP (symbol) || EQ (symbol, Qt)
1038 || (XSYMBOL (symbol)->name->data[0] == ':'
899cb8f0 1039 && EQ (XSYMBOL (symbol)->obarray, initial_obarray)
f50d847a 1040 && !EQ (newval, symbol)))
d9c2a0f2 1041 return Fsignal (Qsetting_constant, Fcons (symbol, Qnil));
4c47c973
GM
1042
1043 innercontents = valcontents = XSYMBOL (symbol)->value;
7921925c 1044
e9ebc175 1045 if (BUFFER_OBJFWDP (valcontents))
7921925c 1046 {
999b32fd 1047 int offset = XBUFFER_OBJFWD (valcontents)->offset;
f6cd0527 1048 int idx = PER_BUFFER_IDX (offset);
999b32fd
GM
1049 if (idx > 0
1050 && !bindflag
1051 && !let_shadows_buffer_binding_p (symbol))
f6cd0527 1052 SET_PER_BUFFER_VALUE_P (buf, idx, 1);
7921925c
JB
1053 }
1054
e9ebc175
KH
1055 else if (BUFFER_LOCAL_VALUEP (valcontents)
1056 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
7921925c 1057 {
42e975f0
RS
1058 /* valcontents is a struct Lisp_Buffer_Local_Value. */
1059
1060 /* What binding is loaded right now? */
b0c2d1c6 1061 current_alist_element
7539e11f 1062 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
d8cafeb5
JB
1063
1064 /* If the current buffer is not the buffer whose binding is
42e975f0
RS
1065 loaded, or if there may be frame-local bindings and the frame
1066 isn't the right one, or if it's a Lisp_Buffer_Local_Value and
1067 the default binding is loaded, the loaded binding may be the
1068 wrong one. */
8801a864
KR
1069 if (!BUFFERP (XBUFFER_LOCAL_VALUE (valcontents)->buffer)
1070 || buf != XBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer)
42e975f0
RS
1071 || (XBUFFER_LOCAL_VALUE (valcontents)->check_frame
1072 && !EQ (selected_frame, XBUFFER_LOCAL_VALUE (valcontents)->frame))
1073 || (BUFFER_LOCAL_VALUEP (valcontents)
1074 && EQ (XCAR (current_alist_element),
1075 current_alist_element)))
7921925c 1076 {
42e975f0
RS
1077 /* The currently loaded binding is not necessarily valid.
1078 We need to unload it, and choose a new binding. */
1079
1080 /* Write out `realvalue' to the old loaded binding. */
d8cafeb5 1081 Fsetcdr (current_alist_element,
b0c2d1c6 1082 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue));
7921925c 1083
42e975f0 1084 /* Find the new binding. */
2829d05f 1085 tem1 = Fassq (symbol, buf->local_var_alist);
b0c2d1c6
RS
1086 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 1;
1087 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 0;
1088
a33ef3ab 1089 if (NILP (tem1))
d8cafeb5
JB
1090 {
1091 /* This buffer still sees the default value. */
1092
1093 /* If the variable is a Lisp_Some_Buffer_Local_Value,
05ef7169 1094 or if this is `let' rather than `set',
d8cafeb5 1095 make CURRENT-ALIST-ELEMENT point to itself,
1f35ce36
RS
1096 indicating that we're seeing the default value.
1097 Likewise if the variable has been let-bound
1098 in the current buffer. */
1099 if (bindflag || SOME_BUFFER_LOCAL_VALUEP (valcontents)
1100 || let_shadows_buffer_binding_p (symbol))
b0c2d1c6
RS
1101 {
1102 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
1103
1104 if (XBUFFER_LOCAL_VALUE (valcontents)->check_frame)
1cc04aed
GM
1105 tem1 = Fassq (symbol,
1106 XFRAME (selected_frame)->param_alist);
d8cafeb5 1107
b0c2d1c6
RS
1108 if (! NILP (tem1))
1109 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 1;
1110 else
1111 tem1 = XBUFFER_LOCAL_VALUE (valcontents)->cdr;
1112 }
05ef7169 1113 /* If it's a Lisp_Buffer_Local_Value, being set not bound,
1f35ce36
RS
1114 and we're not within a let that was made for this buffer,
1115 create a new buffer-local binding for the variable.
1116 That means, give this buffer a new assoc for a local value
42e975f0 1117 and load that binding. */
d8cafeb5
JB
1118 else
1119 {
d9c2a0f2 1120 tem1 = Fcons (symbol, Fcdr (current_alist_element));
2829d05f
RS
1121 buf->local_var_alist
1122 = Fcons (tem1, buf->local_var_alist);
d8cafeb5
JB
1123 }
1124 }
b0c2d1c6 1125
42e975f0 1126 /* Record which binding is now loaded. */
7539e11f 1127 XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr)
8d4afcac 1128 = tem1;
d8cafeb5 1129
42e975f0 1130 /* Set `buffer' and `frame' slots for thebinding now loaded. */
2829d05f 1131 XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer, buf);
1cc04aed 1132 XBUFFER_LOCAL_VALUE (valcontents)->frame = selected_frame;
7921925c 1133 }
4c47c973 1134 innercontents = XBUFFER_LOCAL_VALUE (valcontents)->realvalue;
7921925c 1135 }
d8cafeb5 1136
7921925c
JB
1137 /* If storing void (making the symbol void), forward only through
1138 buffer-local indicator, not through Lisp_Objfwd, etc. */
1139 if (voide)
d9c2a0f2 1140 store_symval_forwarding (symbol, Qnil, newval);
7921925c 1141 else
4c47c973
GM
1142 store_symval_forwarding (symbol, innercontents, newval);
1143
1144 /* If we just set a variable whose current binding is frame-local,
1145 store the new value in the frame parameter too. */
1146
1147 if (BUFFER_LOCAL_VALUEP (valcontents)
1148 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1149 {
1150 /* What binding is loaded right now? */
1151 current_alist_element
1152 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1153
1154 /* If the current buffer is not the buffer whose binding is
1155 loaded, or if there may be frame-local bindings and the frame
1156 isn't the right one, or if it's a Lisp_Buffer_Local_Value and
1157 the default binding is loaded, the loaded binding may be the
1158 wrong one. */
1159 if (XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame)
1160 XCDR (current_alist_element) = newval;
1161 }
d8cafeb5 1162
7921925c
JB
1163 return newval;
1164}
1165\f
1166/* Access or set a buffer-local symbol's default value. */
1167
d9c2a0f2 1168/* Return the default value of SYMBOL, but don't check for voidness.
1bfcade3 1169 Return Qunbound if it is void. */
7921925c
JB
1170
1171Lisp_Object
d9c2a0f2
EN
1172default_value (symbol)
1173 Lisp_Object symbol;
7921925c
JB
1174{
1175 register Lisp_Object valcontents;
1176
d9c2a0f2
EN
1177 CHECK_SYMBOL (symbol, 0);
1178 valcontents = XSYMBOL (symbol)->value;
7921925c
JB
1179
1180 /* For a built-in buffer-local variable, get the default value
1181 rather than letting do_symval_forwarding get the current value. */
e9ebc175 1182 if (BUFFER_OBJFWDP (valcontents))
7921925c 1183 {
999b32fd 1184 int offset = XBUFFER_OBJFWD (valcontents)->offset;
f6cd0527
GM
1185 if (PER_BUFFER_IDX (offset) != 0)
1186 return PER_BUFFER_DEFAULT (offset);
7921925c
JB
1187 }
1188
1189 /* Handle user-created local variables. */
e9ebc175
KH
1190 if (BUFFER_LOCAL_VALUEP (valcontents)
1191 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
7921925c
JB
1192 {
1193 /* If var is set up for a buffer that lacks a local value for it,
1194 the current value is nominally the default value.
42e975f0 1195 But the `realvalue' slot may be more up to date, since
7921925c
JB
1196 ordinary setq stores just that slot. So use that. */
1197 Lisp_Object current_alist_element, alist_element_car;
1198 current_alist_element
7539e11f
KR
1199 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1200 alist_element_car = XCAR (current_alist_element);
7921925c 1201 if (EQ (alist_element_car, current_alist_element))
b0c2d1c6 1202 return do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue);
7921925c 1203 else
7539e11f 1204 return XCDR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
7921925c
JB
1205 }
1206 /* For other variables, get the current value. */
1207 return do_symval_forwarding (valcontents);
1208}
1209
1210DEFUN ("default-boundp", Fdefault_boundp, Sdefault_boundp, 1, 1, 0,
c2124165 1211 "Return t if SYMBOL has a non-void default value.\n\
7921925c
JB
1212This is the value that is seen in buffers that do not have their own values\n\
1213for this variable.")
d9c2a0f2
EN
1214 (symbol)
1215 Lisp_Object symbol;
7921925c
JB
1216{
1217 register Lisp_Object value;
1218
d9c2a0f2 1219 value = default_value (symbol);
1bfcade3 1220 return (EQ (value, Qunbound) ? Qnil : Qt);
7921925c
JB
1221}
1222
1223DEFUN ("default-value", Fdefault_value, Sdefault_value, 1, 1, 0,
1224 "Return SYMBOL's default value.\n\
1225This is the value that is seen in buffers that do not have their own values\n\
1226for this variable. The default value is meaningful for variables with\n\
1227local bindings in certain buffers.")
d9c2a0f2
EN
1228 (symbol)
1229 Lisp_Object symbol;
7921925c
JB
1230{
1231 register Lisp_Object value;
1232
d9c2a0f2 1233 value = default_value (symbol);
1bfcade3 1234 if (EQ (value, Qunbound))
d9c2a0f2 1235 return Fsignal (Qvoid_variable, Fcons (symbol, Qnil));
7921925c
JB
1236 return value;
1237}
1238
1239DEFUN ("set-default", Fset_default, Sset_default, 2, 2, 0,
1240 "Set SYMBOL's default value to VAL. SYMBOL and VAL are evaluated.\n\
1241The default value is seen in buffers that do not have their own values\n\
1242for this variable.")
d9c2a0f2
EN
1243 (symbol, value)
1244 Lisp_Object symbol, value;
7921925c
JB
1245{
1246 register Lisp_Object valcontents, current_alist_element, alist_element_buffer;
1247
d9c2a0f2
EN
1248 CHECK_SYMBOL (symbol, 0);
1249 valcontents = XSYMBOL (symbol)->value;
7921925c
JB
1250
1251 /* Handle variables like case-fold-search that have special slots
1252 in the buffer. Make them work apparently like Lisp_Buffer_Local_Value
1253 variables. */
e9ebc175 1254 if (BUFFER_OBJFWDP (valcontents))
7921925c 1255 {
999b32fd 1256 int offset = XBUFFER_OBJFWD (valcontents)->offset;
f6cd0527 1257 int idx = PER_BUFFER_IDX (offset);
7921925c 1258
f6cd0527 1259 PER_BUFFER_DEFAULT (offset) = value;
984ef137
KH
1260
1261 /* If this variable is not always local in all buffers,
1262 set it in the buffers that don't nominally have a local value. */
999b32fd 1263 if (idx > 0)
7921925c 1264 {
999b32fd
GM
1265 struct buffer *b;
1266
7921925c 1267 for (b = all_buffers; b; b = b->next)
f6cd0527
GM
1268 if (!PER_BUFFER_VALUE_P (b, idx))
1269 PER_BUFFER_VALUE (b, offset) = value;
7921925c
JB
1270 }
1271 return value;
1272 }
1273
e9ebc175
KH
1274 if (!BUFFER_LOCAL_VALUEP (valcontents)
1275 && !SOME_BUFFER_LOCAL_VALUEP (valcontents))
d9c2a0f2 1276 return Fset (symbol, value);
7921925c 1277
42e975f0 1278 /* Store new value into the DEFAULT-VALUE slot. */
7539e11f 1279 XCDR (XBUFFER_LOCAL_VALUE (valcontents)->cdr) = value;
7921925c 1280
42e975f0 1281 /* If the default binding is now loaded, set the REALVALUE slot too. */
8d4afcac 1282 current_alist_element
7539e11f 1283 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
7921925c
JB
1284 alist_element_buffer = Fcar (current_alist_element);
1285 if (EQ (alist_element_buffer, current_alist_element))
b0c2d1c6 1286 store_symval_forwarding (symbol, XBUFFER_LOCAL_VALUE (valcontents)->realvalue,
8d4afcac 1287 value);
7921925c
JB
1288
1289 return value;
1290}
1291
1292DEFUN ("setq-default", Fsetq_default, Ssetq_default, 2, UNEVALLED, 0,
0412bf67
RS
1293 "Set the default value of variable VAR to VALUE.\n\
1294VAR, the variable name, is literal (not evaluated);\n\
1295VALUE is an expression and it is evaluated.\n\
1296The default value of a variable is seen in buffers\n\
1297that do not have their own values for the variable.\n\
1298\n\
1299More generally, you can use multiple variables and values, as in\n\
d9c2a0f2
EN
1300 (setq-default SYMBOL VALUE SYMBOL VALUE...)\n\
1301This sets each SYMBOL's default value to the corresponding VALUE.\n\
1302The VALUE for the Nth SYMBOL can refer to the new default values\n\
0412bf67 1303of previous SYMs.")
7921925c
JB
1304 (args)
1305 Lisp_Object args;
1306{
1307 register Lisp_Object args_left;
d9c2a0f2 1308 register Lisp_Object val, symbol;
7921925c
JB
1309 struct gcpro gcpro1;
1310
a33ef3ab 1311 if (NILP (args))
7921925c
JB
1312 return Qnil;
1313
1314 args_left = args;
1315 GCPRO1 (args);
1316
1317 do
1318 {
1319 val = Feval (Fcar (Fcdr (args_left)));
d9c2a0f2
EN
1320 symbol = Fcar (args_left);
1321 Fset_default (symbol, val);
7921925c
JB
1322 args_left = Fcdr (Fcdr (args_left));
1323 }
a33ef3ab 1324 while (!NILP (args_left));
7921925c
JB
1325
1326 UNGCPRO;
1327 return val;
1328}
1329\f
a5ca2b75
JB
1330/* Lisp functions for creating and removing buffer-local variables. */
1331
7921925c
JB
1332DEFUN ("make-variable-buffer-local", Fmake_variable_buffer_local, Smake_variable_buffer_local,
1333 1, 1, "vMake Variable Buffer Local: ",
42e975f0
RS
1334 "Make VARIABLE become buffer-local whenever it is set.\n\
1335At any time, the value for the current buffer is in effect,\n\
1336unless the variable has never been set in this buffer,\n\
1337in which case the default value is in effect.\n\
1338Note that binding the variable with `let', or setting it while\n\
1339a `let'-style binding made in this buffer is in effect,\n\
1340does not make the variable buffer-local.\n\
1341\n\
7921925c 1342The function `default-value' gets the default value and `set-default' sets it.")
d9c2a0f2
EN
1343 (variable)
1344 register Lisp_Object variable;
7921925c 1345{
8d4afcac 1346 register Lisp_Object tem, valcontents, newval;
7921925c 1347
d9c2a0f2 1348 CHECK_SYMBOL (variable, 0);
7921925c 1349
d9c2a0f2
EN
1350 valcontents = XSYMBOL (variable)->value;
1351 if (EQ (variable, Qnil) || EQ (variable, Qt) || KBOARD_OBJFWDP (valcontents))
1352 error ("Symbol %s may not be buffer-local", XSYMBOL (variable)->name->data);
7921925c 1353
e9ebc175 1354 if (BUFFER_LOCAL_VALUEP (valcontents) || BUFFER_OBJFWDP (valcontents))
d9c2a0f2 1355 return variable;
e9ebc175 1356 if (SOME_BUFFER_LOCAL_VALUEP (valcontents))
7921925c 1357 {
d9c2a0f2
EN
1358 XMISCTYPE (XSYMBOL (variable)->value) = Lisp_Misc_Buffer_Local_Value;
1359 return variable;
7921925c
JB
1360 }
1361 if (EQ (valcontents, Qunbound))
d9c2a0f2
EN
1362 XSYMBOL (variable)->value = Qnil;
1363 tem = Fcons (Qnil, Fsymbol_value (variable));
7539e11f 1364 XCAR (tem) = tem;
8d4afcac 1365 newval = allocate_misc ();
324a6eef 1366 XMISCTYPE (newval) = Lisp_Misc_Buffer_Local_Value;
b0c2d1c6
RS
1367 XBUFFER_LOCAL_VALUE (newval)->realvalue = XSYMBOL (variable)->value;
1368 XBUFFER_LOCAL_VALUE (newval)->buffer = Fcurrent_buffer ();
1369 XBUFFER_LOCAL_VALUE (newval)->frame = Qnil;
42e975f0 1370 XBUFFER_LOCAL_VALUE (newval)->found_for_buffer = 0;
b0c2d1c6
RS
1371 XBUFFER_LOCAL_VALUE (newval)->found_for_frame = 0;
1372 XBUFFER_LOCAL_VALUE (newval)->check_frame = 0;
1373 XBUFFER_LOCAL_VALUE (newval)->cdr = tem;
d9c2a0f2
EN
1374 XSYMBOL (variable)->value = newval;
1375 return variable;
7921925c
JB
1376}
1377
1378DEFUN ("make-local-variable", Fmake_local_variable, Smake_local_variable,
1379 1, 1, "vMake Local Variable: ",
1380 "Make VARIABLE have a separate value in the current buffer.\n\
1381Other buffers will continue to share a common default value.\n\
a782f0d5
RS
1382\(The buffer-local value of VARIABLE starts out as the same value\n\
1383VARIABLE previously had. If VARIABLE was void, it remains void.\)\n\
05edf8bd
KH
1384See also `make-variable-buffer-local'.\n\
1385\n\
7921925c
JB
1386If the variable is already arranged to become local when set,\n\
1387this function causes a local value to exist for this buffer,\n\
62476adc
RS
1388just as setting the variable would do.\n\
1389\n\
05edf8bd
KH
1390This function returns VARIABLE, and therefore\n\
1391 (set (make-local-variable 'VARIABLE) VALUE-EXP)\n\
1392works.\n\
1393\n\
62476adc
RS
1394Do not use `make-local-variable' to make a hook variable buffer-local.\n\
1395Use `make-local-hook' instead.")
d9c2a0f2
EN
1396 (variable)
1397 register Lisp_Object variable;
7921925c
JB
1398{
1399 register Lisp_Object tem, valcontents;
1400
d9c2a0f2 1401 CHECK_SYMBOL (variable, 0);
7921925c 1402
d9c2a0f2
EN
1403 valcontents = XSYMBOL (variable)->value;
1404 if (EQ (variable, Qnil) || EQ (variable, Qt) || KBOARD_OBJFWDP (valcontents))
1405 error ("Symbol %s may not be buffer-local", XSYMBOL (variable)->name->data);
7921925c 1406
e9ebc175 1407 if (BUFFER_LOCAL_VALUEP (valcontents) || BUFFER_OBJFWDP (valcontents))
7921925c 1408 {
d9c2a0f2 1409 tem = Fboundp (variable);
7403b5c8 1410
7921925c
JB
1411 /* Make sure the symbol has a local value in this particular buffer,
1412 by setting it to the same value it already has. */
d9c2a0f2
EN
1413 Fset (variable, (EQ (tem, Qt) ? Fsymbol_value (variable) : Qunbound));
1414 return variable;
7921925c 1415 }
42e975f0 1416 /* Make sure symbol is set up to hold per-buffer values. */
e9ebc175 1417 if (!SOME_BUFFER_LOCAL_VALUEP (valcontents))
7921925c 1418 {
8d4afcac 1419 Lisp_Object newval;
7921925c 1420 tem = Fcons (Qnil, do_symval_forwarding (valcontents));
7539e11f 1421 XCAR (tem) = tem;
8d4afcac 1422 newval = allocate_misc ();
324a6eef 1423 XMISCTYPE (newval) = Lisp_Misc_Some_Buffer_Local_Value;
b0c2d1c6
RS
1424 XBUFFER_LOCAL_VALUE (newval)->realvalue = XSYMBOL (variable)->value;
1425 XBUFFER_LOCAL_VALUE (newval)->buffer = Qnil;
1426 XBUFFER_LOCAL_VALUE (newval)->frame = Qnil;
1427 XBUFFER_LOCAL_VALUE (newval)->found_for_buffer = 0;
1428 XBUFFER_LOCAL_VALUE (newval)->found_for_frame = 0;
1429 XBUFFER_LOCAL_VALUE (newval)->check_frame = 0;
1430 XBUFFER_LOCAL_VALUE (newval)->cdr = tem;
d9c2a0f2 1431 XSYMBOL (variable)->value = newval;
7921925c 1432 }
42e975f0 1433 /* Make sure this buffer has its own value of symbol. */
d9c2a0f2 1434 tem = Fassq (variable, current_buffer->local_var_alist);
a33ef3ab 1435 if (NILP (tem))
7921925c 1436 {
a5d004a1
RS
1437 /* Swap out any local binding for some other buffer, and make
1438 sure the current value is permanently recorded, if it's the
1439 default value. */
d9c2a0f2 1440 find_symbol_value (variable);
a5d004a1 1441
7921925c 1442 current_buffer->local_var_alist
7539e11f 1443 = Fcons (Fcons (variable, XCDR (XBUFFER_LOCAL_VALUE (XSYMBOL (variable)->value)->cdr)),
7921925c
JB
1444 current_buffer->local_var_alist);
1445
1446 /* Make sure symbol does not think it is set up for this buffer;
42e975f0 1447 force it to look once again for this buffer's value. */
7921925c 1448 {
8d4afcac 1449 Lisp_Object *pvalbuf;
a5d004a1 1450
d9c2a0f2 1451 valcontents = XSYMBOL (variable)->value;
a5d004a1 1452
b0c2d1c6 1453 pvalbuf = &XBUFFER_LOCAL_VALUE (valcontents)->buffer;
8d4afcac
KH
1454 if (current_buffer == XBUFFER (*pvalbuf))
1455 *pvalbuf = Qnil;
b0c2d1c6 1456 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
7921925c 1457 }
7921925c 1458 }
a5ca2b75 1459
42e975f0
RS
1460 /* If the symbol forwards into a C variable, then load the binding
1461 for this buffer now. If C code modifies the variable before we
1462 load the binding in, then that new value will clobber the default
1463 binding the next time we unload it. */
b0c2d1c6 1464 valcontents = XBUFFER_LOCAL_VALUE (XSYMBOL (variable)->value)->realvalue;
e9ebc175 1465 if (INTFWDP (valcontents) || BOOLFWDP (valcontents) || OBJFWDP (valcontents))
d9c2a0f2 1466 swap_in_symval_forwarding (variable, XSYMBOL (variable)->value);
a5ca2b75 1467
d9c2a0f2 1468 return variable;
7921925c
JB
1469}
1470
1471DEFUN ("kill-local-variable", Fkill_local_variable, Skill_local_variable,
1472 1, 1, "vKill Local Variable: ",
1473 "Make VARIABLE no longer have a separate value in the current buffer.\n\
1474From now on the default value will apply in this buffer.")
d9c2a0f2
EN
1475 (variable)
1476 register Lisp_Object variable;
7921925c
JB
1477{
1478 register Lisp_Object tem, valcontents;
1479
d9c2a0f2 1480 CHECK_SYMBOL (variable, 0);
7921925c 1481
d9c2a0f2 1482 valcontents = XSYMBOL (variable)->value;
7921925c 1483
e9ebc175 1484 if (BUFFER_OBJFWDP (valcontents))
7921925c 1485 {
999b32fd 1486 int offset = XBUFFER_OBJFWD (valcontents)->offset;
f6cd0527 1487 int idx = PER_BUFFER_IDX (offset);
7921925c 1488
999b32fd 1489 if (idx > 0)
7921925c 1490 {
f6cd0527
GM
1491 SET_PER_BUFFER_VALUE_P (current_buffer, idx, 0);
1492 PER_BUFFER_VALUE (current_buffer, offset)
1493 = PER_BUFFER_DEFAULT (offset);
7921925c 1494 }
d9c2a0f2 1495 return variable;
7921925c
JB
1496 }
1497
e9ebc175
KH
1498 if (!BUFFER_LOCAL_VALUEP (valcontents)
1499 && !SOME_BUFFER_LOCAL_VALUEP (valcontents))
d9c2a0f2 1500 return variable;
7921925c 1501
42e975f0 1502 /* Get rid of this buffer's alist element, if any. */
7921925c 1503
d9c2a0f2 1504 tem = Fassq (variable, current_buffer->local_var_alist);
a33ef3ab 1505 if (!NILP (tem))
8d4afcac
KH
1506 current_buffer->local_var_alist
1507 = Fdelq (tem, current_buffer->local_var_alist);
7921925c 1508
42e975f0
RS
1509 /* If the symbol is set up with the current buffer's binding
1510 loaded, recompute its value. We have to do it now, or else
1511 forwarded objects won't work right. */
7921925c 1512 {
8d4afcac 1513 Lisp_Object *pvalbuf;
d9c2a0f2 1514 valcontents = XSYMBOL (variable)->value;
b0c2d1c6 1515 pvalbuf = &XBUFFER_LOCAL_VALUE (valcontents)->buffer;
8d4afcac 1516 if (current_buffer == XBUFFER (*pvalbuf))
79c83e03
KH
1517 {
1518 *pvalbuf = Qnil;
b0c2d1c6 1519 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
978dd578 1520 find_symbol_value (variable);
79c83e03 1521 }
7921925c
JB
1522 }
1523
d9c2a0f2 1524 return variable;
7921925c 1525}
62476adc 1526
b0c2d1c6
RS
1527/* Lisp functions for creating and removing buffer-local variables. */
1528
1529DEFUN ("make-variable-frame-local", Fmake_variable_frame_local, Smake_variable_frame_local,
1530 1, 1, "vMake Variable Frame Local: ",
37254ece
RS
1531 "Enable VARIABLE to have frame-local bindings.\n\
1532When a frame-local binding exists in the current frame,\n\
1533it is in effect whenever the current buffer has no buffer-local binding.\n\
1534A frame-local binding is actual a frame parameter value;\n\
1535thus, any given frame has a local binding for VARIABLE\n\
1536if it has a value for the frame parameter named VARIABLE.\n\
1537See `modify-frame-parameters'.")
8f152ad4 1538 (variable)
b0c2d1c6
RS
1539 register Lisp_Object variable;
1540{
1541 register Lisp_Object tem, valcontents, newval;
1542
1543 CHECK_SYMBOL (variable, 0);
1544
1545 valcontents = XSYMBOL (variable)->value;
1546 if (EQ (variable, Qnil) || EQ (variable, Qt) || KBOARD_OBJFWDP (valcontents)
1547 || BUFFER_OBJFWDP (valcontents))
1548 error ("Symbol %s may not be frame-local", XSYMBOL (variable)->name->data);
1549
1550 if (BUFFER_LOCAL_VALUEP (valcontents)
1551 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
42e975f0
RS
1552 {
1553 XBUFFER_LOCAL_VALUE (valcontents)->check_frame = 1;
1554 return variable;
1555 }
b0c2d1c6
RS
1556
1557 if (EQ (valcontents, Qunbound))
1558 XSYMBOL (variable)->value = Qnil;
1559 tem = Fcons (Qnil, Fsymbol_value (variable));
7539e11f 1560 XCAR (tem) = tem;
b0c2d1c6
RS
1561 newval = allocate_misc ();
1562 XMISCTYPE (newval) = Lisp_Misc_Some_Buffer_Local_Value;
1563 XBUFFER_LOCAL_VALUE (newval)->realvalue = XSYMBOL (variable)->value;
1564 XBUFFER_LOCAL_VALUE (newval)->buffer = Qnil;
1565 XBUFFER_LOCAL_VALUE (newval)->frame = Qnil;
1566 XBUFFER_LOCAL_VALUE (newval)->found_for_buffer = 0;
1567 XBUFFER_LOCAL_VALUE (newval)->found_for_frame = 0;
1568 XBUFFER_LOCAL_VALUE (newval)->check_frame = 1;
1569 XBUFFER_LOCAL_VALUE (newval)->cdr = tem;
1570 XSYMBOL (variable)->value = newval;
1571 return variable;
1572}
1573
62476adc 1574DEFUN ("local-variable-p", Flocal_variable_p, Slocal_variable_p,
c48ead86
KH
1575 1, 2, 0,
1576 "Non-nil if VARIABLE has a local binding in buffer BUFFER.\n\
1577BUFFER defaults to the current buffer.")
d9c2a0f2
EN
1578 (variable, buffer)
1579 register Lisp_Object variable, buffer;
62476adc
RS
1580{
1581 Lisp_Object valcontents;
c48ead86
KH
1582 register struct buffer *buf;
1583
1584 if (NILP (buffer))
1585 buf = current_buffer;
1586 else
1587 {
1588 CHECK_BUFFER (buffer, 0);
1589 buf = XBUFFER (buffer);
1590 }
62476adc 1591
d9c2a0f2 1592 CHECK_SYMBOL (variable, 0);
62476adc 1593
d9c2a0f2 1594 valcontents = XSYMBOL (variable)->value;
c48ead86 1595 if (BUFFER_LOCAL_VALUEP (valcontents)
1e5f16fa 1596 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
c48ead86
KH
1597 {
1598 Lisp_Object tail, elt;
7539e11f 1599 for (tail = buf->local_var_alist; CONSP (tail); tail = XCDR (tail))
c48ead86 1600 {
7539e11f
KR
1601 elt = XCAR (tail);
1602 if (EQ (variable, XCAR (elt)))
c48ead86
KH
1603 return Qt;
1604 }
1605 }
1606 if (BUFFER_OBJFWDP (valcontents))
1607 {
1608 int offset = XBUFFER_OBJFWD (valcontents)->offset;
f6cd0527
GM
1609 int idx = PER_BUFFER_IDX (offset);
1610 if (idx == -1 || PER_BUFFER_VALUE_P (buf, idx))
c48ead86
KH
1611 return Qt;
1612 }
1613 return Qnil;
62476adc 1614}
f4f04cee
RS
1615
1616DEFUN ("local-variable-if-set-p", Flocal_variable_if_set_p, Slocal_variable_if_set_p,
1617 1, 2, 0,
1618 "Non-nil if VARIABLE will be local in buffer BUFFER if it is set there.\n\
1619BUFFER defaults to the current buffer.")
d9c2a0f2
EN
1620 (variable, buffer)
1621 register Lisp_Object variable, buffer;
f4f04cee
RS
1622{
1623 Lisp_Object valcontents;
1624 register struct buffer *buf;
1625
1626 if (NILP (buffer))
1627 buf = current_buffer;
1628 else
1629 {
1630 CHECK_BUFFER (buffer, 0);
1631 buf = XBUFFER (buffer);
1632 }
1633
d9c2a0f2 1634 CHECK_SYMBOL (variable, 0);
f4f04cee 1635
d9c2a0f2 1636 valcontents = XSYMBOL (variable)->value;
f4f04cee
RS
1637
1638 /* This means that make-variable-buffer-local was done. */
1639 if (BUFFER_LOCAL_VALUEP (valcontents))
1640 return Qt;
1641 /* All these slots become local if they are set. */
1642 if (BUFFER_OBJFWDP (valcontents))
1643 return Qt;
1644 if (SOME_BUFFER_LOCAL_VALUEP (valcontents))
1645 {
1646 Lisp_Object tail, elt;
7539e11f 1647 for (tail = buf->local_var_alist; CONSP (tail); tail = XCDR (tail))
f4f04cee 1648 {
7539e11f
KR
1649 elt = XCAR (tail);
1650 if (EQ (variable, XCAR (elt)))
f4f04cee
RS
1651 return Qt;
1652 }
1653 }
1654 return Qnil;
1655}
7921925c 1656\f
ffd56f97
JB
1657/* Find the function at the end of a chain of symbol function indirections. */
1658
1659/* If OBJECT is a symbol, find the end of its function chain and
1660 return the value found there. If OBJECT is not a symbol, just
1661 return it. If there is a cycle in the function chain, signal a
1662 cyclic-function-indirection error.
1663
1664 This is like Findirect_function, except that it doesn't signal an
1665 error if the chain ends up unbound. */
1666Lisp_Object
a2932990 1667indirect_function (object)
62476adc 1668 register Lisp_Object object;
ffd56f97 1669{
eb8c3be9 1670 Lisp_Object tortoise, hare;
ffd56f97 1671
eb8c3be9 1672 hare = tortoise = object;
ffd56f97
JB
1673
1674 for (;;)
1675 {
e9ebc175 1676 if (!SYMBOLP (hare) || EQ (hare, Qunbound))
ffd56f97
JB
1677 break;
1678 hare = XSYMBOL (hare)->function;
e9ebc175 1679 if (!SYMBOLP (hare) || EQ (hare, Qunbound))
ffd56f97
JB
1680 break;
1681 hare = XSYMBOL (hare)->function;
1682
eb8c3be9 1683 tortoise = XSYMBOL (tortoise)->function;
ffd56f97 1684
eb8c3be9 1685 if (EQ (hare, tortoise))
ffd56f97
JB
1686 Fsignal (Qcyclic_function_indirection, Fcons (object, Qnil));
1687 }
1688
1689 return hare;
1690}
1691
1692DEFUN ("indirect-function", Findirect_function, Sindirect_function, 1, 1, 0,
1693 "Return the function at the end of OBJECT's function chain.\n\
1694If OBJECT is a symbol, follow all function indirections and return the final\n\
1695function binding.\n\
1696If OBJECT is not a symbol, just return it.\n\
1697Signal a void-function error if the final symbol is unbound.\n\
1698Signal a cyclic-function-indirection error if there is a loop in the\n\
1699function chain of symbols.")
1700 (object)
1701 register Lisp_Object object;
1702{
1703 Lisp_Object result;
1704
1705 result = indirect_function (object);
1706
1707 if (EQ (result, Qunbound))
1708 return Fsignal (Qvoid_function, Fcons (object, Qnil));
1709 return result;
1710}
1711\f
7921925c
JB
1712/* Extract and set vector and string elements */
1713
1714DEFUN ("aref", Faref, Saref, 2, 2, 0,
d9c2a0f2 1715 "Return the element of ARRAY at index IDX.\n\
4d276982 1716ARRAY may be a vector, a string, a char-table, a bool-vector,\n\
d9c2a0f2 1717or a byte-code object. IDX starts at 0.")
7921925c
JB
1718 (array, idx)
1719 register Lisp_Object array;
1720 Lisp_Object idx;
1721{
1722 register int idxval;
1723
1724 CHECK_NUMBER (idx, 1);
1725 idxval = XINT (idx);
e9ebc175 1726 if (STRINGP (array))
7921925c 1727 {
25638b07
RS
1728 int c, idxval_byte;
1729
c24e4efe
KH
1730 if (idxval < 0 || idxval >= XSTRING (array)->size)
1731 args_out_of_range (array, idx);
25638b07
RS
1732 if (! STRING_MULTIBYTE (array))
1733 return make_number ((unsigned char) XSTRING (array)->data[idxval]);
1734 idxval_byte = string_char_to_byte (array, idxval);
1735
1736 c = STRING_CHAR (&XSTRING (array)->data[idxval_byte],
fc932ac6 1737 STRING_BYTES (XSTRING (array)) - idxval_byte);
25638b07 1738 return make_number (c);
7921925c 1739 }
4d276982
RS
1740 else if (BOOL_VECTOR_P (array))
1741 {
1742 int val;
4d276982
RS
1743
1744 if (idxval < 0 || idxval >= XBOOL_VECTOR (array)->size)
1745 args_out_of_range (array, idx);
1746
68be917d
KH
1747 val = (unsigned char) XBOOL_VECTOR (array)->data[idxval / BITS_PER_CHAR];
1748 return (val & (1 << (idxval % BITS_PER_CHAR)) ? Qt : Qnil);
4d276982
RS
1749 }
1750 else if (CHAR_TABLE_P (array))
1751 {
1752 Lisp_Object val;
1753
6bbd7a29
GM
1754 val = Qnil;
1755
4d276982
RS
1756 if (idxval < 0)
1757 args_out_of_range (array, idx);
ab5c3f93 1758 if (idxval < CHAR_TABLE_ORDINARY_SLOTS)
8313c4e7 1759 {
39e16e51 1760 /* For ASCII and 8-bit European characters, the element is
3a6cf6bd 1761 stored in the top table. */
8313c4e7
KH
1762 val = XCHAR_TABLE (array)->contents[idxval];
1763 if (NILP (val))
1764 val = XCHAR_TABLE (array)->defalt;
1765 while (NILP (val)) /* Follow parents until we find some value. */
1766 {
1767 array = XCHAR_TABLE (array)->parent;
1768 if (NILP (array))
1769 return Qnil;
1770 val = XCHAR_TABLE (array)->contents[idxval];
1771 if (NILP (val))
1772 val = XCHAR_TABLE (array)->defalt;
1773 }
1774 return val;
1775 }
4d276982
RS
1776 else
1777 {
39e16e51
KH
1778 int code[4], i;
1779 Lisp_Object sub_table;
8313c4e7 1780
37309c9d 1781 SPLIT_CHAR (idxval, code[0], code[1], code[2]);
e19c1eb4
KH
1782 if (code[1] < 32) code[1] = -1;
1783 else if (code[2] < 32) code[2] = -1;
1784
39e16e51
KH
1785 /* Here, the possible range of CODE[0] (== charset ID) is
1786 128..MAX_CHARSET. Since the top level char table contains
1787 data for multibyte characters after 256th element, we must
1788 increment CODE[0] by 128 to get a correct index. */
1789 code[0] += 128;
1790 code[3] = -1; /* anchor */
4d276982
RS
1791
1792 try_parent_char_table:
39e16e51
KH
1793 sub_table = array;
1794 for (i = 0; code[i] >= 0; i++)
4d276982 1795 {
39e16e51
KH
1796 val = XCHAR_TABLE (sub_table)->contents[code[i]];
1797 if (SUB_CHAR_TABLE_P (val))
1798 sub_table = val;
1799 else
8313c4e7 1800 {
39e16e51
KH
1801 if (NILP (val))
1802 val = XCHAR_TABLE (sub_table)->defalt;
1803 if (NILP (val))
1804 {
1805 array = XCHAR_TABLE (array)->parent;
1806 if (!NILP (array))
1807 goto try_parent_char_table;
1808 }
1809 return val;
8313c4e7 1810 }
4d276982 1811 }
39e16e51
KH
1812 /* Here, VAL is a sub char table. We try the default value
1813 and parent. */
1814 val = XCHAR_TABLE (val)->defalt;
8313c4e7 1815 if (NILP (val))
4d276982
RS
1816 {
1817 array = XCHAR_TABLE (array)->parent;
39e16e51
KH
1818 if (!NILP (array))
1819 goto try_parent_char_table;
4d276982 1820 }
4d276982
RS
1821 return val;
1822 }
4d276982 1823 }
7921925c 1824 else
c24e4efe 1825 {
6bbd7a29 1826 int size = 0;
7f358972
RS
1827 if (VECTORP (array))
1828 size = XVECTOR (array)->size;
1829 else if (COMPILEDP (array))
1830 size = XVECTOR (array)->size & PSEUDOVECTOR_SIZE_MASK;
1831 else
1832 wrong_type_argument (Qarrayp, array);
1833
1834 if (idxval < 0 || idxval >= size)
c24e4efe
KH
1835 args_out_of_range (array, idx);
1836 return XVECTOR (array)->contents[idxval];
1837 }
7921925c
JB
1838}
1839
3c9de1af
KH
1840/* Don't use alloca for relocating string data larger than this, lest
1841 we overflow their stack. The value is the same as what used in
1842 fns.c for base64 handling. */
1843#define MAX_ALLOCA 16*1024
1844
7921925c 1845DEFUN ("aset", Faset, Saset, 3, 3, 0,
73d40355 1846 "Store into the element of ARRAY at index IDX the value NEWELT.\n\
9346f507
RS
1847ARRAY may be a vector, a string, a char-table or a bool-vector.\n\
1848IDX starts at 0.")
7921925c
JB
1849 (array, idx, newelt)
1850 register Lisp_Object array;
1851 Lisp_Object idx, newelt;
1852{
1853 register int idxval;
1854
1855 CHECK_NUMBER (idx, 1);
1856 idxval = XINT (idx);
4d276982
RS
1857 if (!VECTORP (array) && !STRINGP (array) && !BOOL_VECTOR_P (array)
1858 && ! CHAR_TABLE_P (array))
7921925c 1859 array = wrong_type_argument (Qarrayp, array);
7921925c
JB
1860 CHECK_IMPURE (array);
1861
e9ebc175 1862 if (VECTORP (array))
c24e4efe
KH
1863 {
1864 if (idxval < 0 || idxval >= XVECTOR (array)->size)
1865 args_out_of_range (array, idx);
1866 XVECTOR (array)->contents[idxval] = newelt;
1867 }
4d276982
RS
1868 else if (BOOL_VECTOR_P (array))
1869 {
1870 int val;
4d276982
RS
1871
1872 if (idxval < 0 || idxval >= XBOOL_VECTOR (array)->size)
1873 args_out_of_range (array, idx);
1874
68be917d 1875 val = (unsigned char) XBOOL_VECTOR (array)->data[idxval / BITS_PER_CHAR];
4d276982
RS
1876
1877 if (! NILP (newelt))
68be917d 1878 val |= 1 << (idxval % BITS_PER_CHAR);
4d276982 1879 else
68be917d
KH
1880 val &= ~(1 << (idxval % BITS_PER_CHAR));
1881 XBOOL_VECTOR (array)->data[idxval / BITS_PER_CHAR] = val;
4d276982
RS
1882 }
1883 else if (CHAR_TABLE_P (array))
1884 {
4d276982
RS
1885 if (idxval < 0)
1886 args_out_of_range (array, idx);
ab5c3f93 1887 if (idxval < CHAR_TABLE_ORDINARY_SLOTS)
8313c4e7 1888 XCHAR_TABLE (array)->contents[idxval] = newelt;
4d276982
RS
1889 else
1890 {
39e16e51 1891 int code[4], i;
8313c4e7 1892 Lisp_Object val;
4d276982 1893
37309c9d 1894 SPLIT_CHAR (idxval, code[0], code[1], code[2]);
e19c1eb4
KH
1895 if (code[1] < 32) code[1] = -1;
1896 else if (code[2] < 32) code[2] = -1;
1897
39e16e51
KH
1898 /* See the comment of the corresponding part in Faref. */
1899 code[0] += 128;
1900 code[3] = -1; /* anchor */
1901 for (i = 0; code[i + 1] >= 0; i++)
8313c4e7 1902 {
39e16e51
KH
1903 val = XCHAR_TABLE (array)->contents[code[i]];
1904 if (SUB_CHAR_TABLE_P (val))
8313c4e7
KH
1905 array = val;
1906 else
3c8fccc3
RS
1907 {
1908 Lisp_Object temp;
1909
1910 /* VAL is a leaf. Create a sub char table with the
1911 default value VAL or XCHAR_TABLE (array)->defalt
1912 and look into it. */
1913
1914 temp = make_sub_char_table (NILP (val)
1915 ? XCHAR_TABLE (array)->defalt
1916 : val);
1917 XCHAR_TABLE (array)->contents[code[i]] = temp;
1918 array = temp;
1919 }
8313c4e7 1920 }
39e16e51 1921 XCHAR_TABLE (array)->contents[code[i]] = newelt;
4d276982 1922 }
4d276982 1923 }
25638b07
RS
1924 else if (STRING_MULTIBYTE (array))
1925 {
3c9de1af
KH
1926 int idxval_byte, prev_bytes, new_bytes;
1927 unsigned char workbuf[MAX_MULTIBYTE_LENGTH], *p0 = workbuf, *p1;
25638b07
RS
1928
1929 if (idxval < 0 || idxval >= XSTRING (array)->size)
1930 args_out_of_range (array, idx);
3c9de1af 1931 CHECK_NUMBER (newelt, 2);
25638b07
RS
1932
1933 idxval_byte = string_char_to_byte (array, idxval);
3c9de1af
KH
1934 p1 = &XSTRING (array)->data[idxval_byte];
1935 PARSE_MULTIBYTE_SEQ (p1, nbytes - idxval_byte, prev_bytes);
1936 new_bytes = CHAR_STRING (XINT (newelt), p0);
1937 if (prev_bytes != new_bytes)
1938 {
1939 /* We must relocate the string data. */
1940 int nchars = XSTRING (array)->size;
1941 int nbytes = STRING_BYTES (XSTRING (array));
1942 unsigned char *str;
1943
1944 str = (nbytes <= MAX_ALLOCA
1945 ? (unsigned char *) alloca (nbytes)
1946 : (unsigned char *) xmalloc (nbytes));
1947 bcopy (XSTRING (array)->data, str, nbytes);
1948 allocate_string_data (XSTRING (array), nchars,
1949 nbytes + new_bytes - prev_bytes);
1950 bcopy (str, XSTRING (array)->data, idxval_byte);
1951 p1 = XSTRING (array)->data + idxval_byte;
1952 bcopy (str + idxval_byte + prev_bytes, p1 + new_bytes,
1953 nbytes - (idxval_byte + prev_bytes));
1954 if (nbytes > MAX_ALLOCA)
1955 xfree (str);
1956 clear_string_char_byte_cache ();
1957 }
1958 while (new_bytes--)
1959 *p1++ = *p0++;
25638b07 1960 }
7921925c
JB
1961 else
1962 {
c24e4efe
KH
1963 if (idxval < 0 || idxval >= XSTRING (array)->size)
1964 args_out_of_range (array, idx);
7921925c 1965 CHECK_NUMBER (newelt, 2);
3c9de1af
KH
1966
1967 if (XINT (newelt) < 0 || SINGLE_BYTE_CHAR_P (XINT (newelt)))
1968 XSTRING (array)->data[idxval] = XINT (newelt);
1969 else
1970 {
1971 /* We must relocate the string data while converting it to
1972 multibyte. */
1973 int idxval_byte, prev_bytes, new_bytes;
1974 unsigned char workbuf[MAX_MULTIBYTE_LENGTH], *p0 = workbuf, *p1;
1975 unsigned char *origstr = XSTRING (array)->data, *str;
1976 int nchars, nbytes;
1977
1978 nchars = XSTRING (array)->size;
1979 nbytes = idxval_byte = count_size_as_multibyte (origstr, idxval);
1980 nbytes += count_size_as_multibyte (origstr + idxval,
1981 nchars - idxval);
1982 str = (nbytes <= MAX_ALLOCA
1983 ? (unsigned char *) alloca (nbytes)
1984 : (unsigned char *) xmalloc (nbytes));
1985 copy_text (XSTRING (array)->data, str, nchars, 0, 1);
1986 PARSE_MULTIBYTE_SEQ (str + idxval_byte, nbytes - idxval_byte,
1987 prev_bytes);
1988 new_bytes = CHAR_STRING (XINT (newelt), p0);
1989 allocate_string_data (XSTRING (array), nchars,
1990 nbytes + new_bytes - prev_bytes);
1991 bcopy (str, XSTRING (array)->data, idxval_byte);
1992 p1 = XSTRING (array)->data + idxval_byte;
1993 while (new_bytes--)
1994 *p1++ = *p0++;
1995 bcopy (str + idxval_byte + prev_bytes, p1,
1996 nbytes - (idxval_byte + prev_bytes));
1997 if (nbytes > MAX_ALLOCA)
1998 xfree (str);
1999 clear_string_char_byte_cache ();
2000 }
7921925c
JB
2001 }
2002
2003 return newelt;
2004}
7921925c
JB
2005\f
2006/* Arithmetic functions */
2007
2008enum comparison { equal, notequal, less, grtr, less_or_equal, grtr_or_equal };
2009
2010Lisp_Object
2011arithcompare (num1, num2, comparison)
2012 Lisp_Object num1, num2;
2013 enum comparison comparison;
2014{
6bbd7a29 2015 double f1 = 0, f2 = 0;
7921925c
JB
2016 int floatp = 0;
2017
7921925c
JB
2018 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num1, 0);
2019 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num2, 0);
2020
e9ebc175 2021 if (FLOATP (num1) || FLOATP (num2))
7921925c
JB
2022 {
2023 floatp = 1;
7539e11f
KR
2024 f1 = (FLOATP (num1)) ? XFLOAT_DATA (num1) : XINT (num1);
2025 f2 = (FLOATP (num2)) ? XFLOAT_DATA (num2) : XINT (num2);
7921925c 2026 }
7921925c
JB
2027
2028 switch (comparison)
2029 {
2030 case equal:
2031 if (floatp ? f1 == f2 : XINT (num1) == XINT (num2))
2032 return Qt;
2033 return Qnil;
2034
2035 case notequal:
2036 if (floatp ? f1 != f2 : XINT (num1) != XINT (num2))
2037 return Qt;
2038 return Qnil;
2039
2040 case less:
2041 if (floatp ? f1 < f2 : XINT (num1) < XINT (num2))
2042 return Qt;
2043 return Qnil;
2044
2045 case less_or_equal:
2046 if (floatp ? f1 <= f2 : XINT (num1) <= XINT (num2))
2047 return Qt;
2048 return Qnil;
2049
2050 case grtr:
2051 if (floatp ? f1 > f2 : XINT (num1) > XINT (num2))
2052 return Qt;
2053 return Qnil;
2054
2055 case grtr_or_equal:
2056 if (floatp ? f1 >= f2 : XINT (num1) >= XINT (num2))
2057 return Qt;
2058 return Qnil;
25e40a4b
JB
2059
2060 default:
2061 abort ();
7921925c
JB
2062 }
2063}
2064
2065DEFUN ("=", Feqlsign, Seqlsign, 2, 2, 0,
c2124165 2066 "Return t if two args, both numbers or markers, are equal.")
7921925c
JB
2067 (num1, num2)
2068 register Lisp_Object num1, num2;
2069{
2070 return arithcompare (num1, num2, equal);
2071}
2072
2073DEFUN ("<", Flss, Slss, 2, 2, 0,
c2124165 2074 "Return t if first arg is less than second arg. Both must be numbers or markers.")
7921925c
JB
2075 (num1, num2)
2076 register Lisp_Object num1, num2;
2077{
2078 return arithcompare (num1, num2, less);
2079}
2080
2081DEFUN (">", Fgtr, Sgtr, 2, 2, 0,
c2124165 2082 "Return t if first arg is greater than second arg. Both must be numbers or markers.")
7921925c
JB
2083 (num1, num2)
2084 register Lisp_Object num1, num2;
2085{
2086 return arithcompare (num1, num2, grtr);
2087}
2088
2089DEFUN ("<=", Fleq, Sleq, 2, 2, 0,
c2124165 2090 "Return t if first arg is less than or equal to second arg.\n\
7921925c
JB
2091Both must be numbers or markers.")
2092 (num1, num2)
2093 register Lisp_Object num1, num2;
2094{
2095 return arithcompare (num1, num2, less_or_equal);
2096}
2097
2098DEFUN (">=", Fgeq, Sgeq, 2, 2, 0,
c2124165 2099 "Return t if first arg is greater than or equal to second arg.\n\
7921925c
JB
2100Both must be numbers or markers.")
2101 (num1, num2)
2102 register Lisp_Object num1, num2;
2103{
2104 return arithcompare (num1, num2, grtr_or_equal);
2105}
2106
2107DEFUN ("/=", Fneq, Sneq, 2, 2, 0,
c2124165 2108 "Return t if first arg is not equal to second arg. Both must be numbers or markers.")
7921925c
JB
2109 (num1, num2)
2110 register Lisp_Object num1, num2;
2111{
2112 return arithcompare (num1, num2, notequal);
2113}
2114
c2124165 2115DEFUN ("zerop", Fzerop, Szerop, 1, 1, 0, "Return t if NUMBER is zero.")
d9c2a0f2
EN
2116 (number)
2117 register Lisp_Object number;
7921925c 2118{
d9c2a0f2 2119 CHECK_NUMBER_OR_FLOAT (number, 0);
7921925c 2120
d9c2a0f2 2121 if (FLOATP (number))
7921925c 2122 {
7539e11f 2123 if (XFLOAT_DATA (number) == 0.0)
7921925c
JB
2124 return Qt;
2125 return Qnil;
2126 }
7921925c 2127
d9c2a0f2 2128 if (!XINT (number))
7921925c
JB
2129 return Qt;
2130 return Qnil;
2131}
2132\f
34f4f6c6 2133/* Convert between long values and pairs of Lisp integers. */
51cf3e31
JB
2134
2135Lisp_Object
2136long_to_cons (i)
2137 unsigned long i;
2138{
2139 unsigned int top = i >> 16;
2140 unsigned int bot = i & 0xFFFF;
2141 if (top == 0)
2142 return make_number (bot);
b42cfa11 2143 if (top == (unsigned long)-1 >> 16)
51cf3e31
JB
2144 return Fcons (make_number (-1), make_number (bot));
2145 return Fcons (make_number (top), make_number (bot));
2146}
2147
2148unsigned long
2149cons_to_long (c)
2150 Lisp_Object c;
2151{
878a80cc 2152 Lisp_Object top, bot;
51cf3e31
JB
2153 if (INTEGERP (c))
2154 return XINT (c);
7539e11f
KR
2155 top = XCAR (c);
2156 bot = XCDR (c);
51cf3e31 2157 if (CONSP (bot))
7539e11f 2158 bot = XCAR (bot);
51cf3e31
JB
2159 return ((XINT (top) << 16) | XINT (bot));
2160}
2161\f
f2980264 2162DEFUN ("number-to-string", Fnumber_to_string, Snumber_to_string, 1, 1, 0,
d9c2a0f2 2163 "Convert NUMBER to a string by printing it in decimal.\n\
25e40a4b 2164Uses a minus sign if negative.\n\
d9c2a0f2
EN
2165NUMBER may be an integer or a floating point number.")
2166 (number)
2167 Lisp_Object number;
7921925c 2168{
6030ce64 2169 char buffer[VALBITS];
7921925c 2170
d9c2a0f2 2171 CHECK_NUMBER_OR_FLOAT (number, 0);
7921925c 2172
d9c2a0f2 2173 if (FLOATP (number))
7921925c
JB
2174 {
2175 char pigbuf[350]; /* see comments in float_to_string */
2176
7539e11f 2177 float_to_string (pigbuf, XFLOAT_DATA (number));
7403b5c8 2178 return build_string (pigbuf);
7921925c 2179 }
7921925c 2180
e6c82a8d 2181 if (sizeof (int) == sizeof (EMACS_INT))
d9c2a0f2 2182 sprintf (buffer, "%d", XINT (number));
e6c82a8d 2183 else if (sizeof (long) == sizeof (EMACS_INT))
dd8daec5 2184 sprintf (buffer, "%ld", (long) XINT (number));
e6c82a8d
RS
2185 else
2186 abort ();
7921925c
JB
2187 return build_string (buffer);
2188}
2189
3883fbeb
RS
2190INLINE static int
2191digit_to_number (character, base)
2192 int character, base;
2193{
2194 int digit;
2195
2196 if (character >= '0' && character <= '9')
2197 digit = character - '0';
2198 else if (character >= 'a' && character <= 'z')
2199 digit = character - 'a' + 10;
2200 else if (character >= 'A' && character <= 'Z')
2201 digit = character - 'A' + 10;
2202 else
2203 return -1;
2204
2205 if (digit >= base)
2206 return -1;
2207 else
2208 return digit;
2209}
2210
2211DEFUN ("string-to-number", Fstring_to_number, Sstring_to_number, 1, 2, 0,
25e40a4b 2212 "Convert STRING to a number by parsing it as a decimal number.\n\
1c1c17eb 2213This parses both integers and floating point numbers.\n\
3883fbeb
RS
2214It ignores leading spaces and tabs.\n\
2215\n\
2216If BASE, interpret STRING as a number in that base. If BASE isn't\n\
2217present, base 10 is used. BASE must be between 2 and 16 (inclusive).\n\
8e36ae7f 2218If the base used is not 10, floating point is not recognized.")
3883fbeb
RS
2219 (string, base)
2220 register Lisp_Object string, base;
7921925c 2221{
3883fbeb 2222 register unsigned char *p;
342858a5
GM
2223 register int b;
2224 int sign = 1;
2225 Lisp_Object val;
25e40a4b 2226
d9c2a0f2 2227 CHECK_STRING (string, 0);
7921925c 2228
3883fbeb
RS
2229 if (NILP (base))
2230 b = 10;
2231 else
2232 {
2233 CHECK_NUMBER (base, 1);
2234 b = XINT (base);
2235 if (b < 2 || b > 16)
2236 Fsignal (Qargs_out_of_range, Fcons (base, Qnil));
2237 }
2238
25e40a4b
JB
2239 /* Skip any whitespace at the front of the number. Some versions of
2240 atoi do this anyway, so we might as well make Emacs lisp consistent. */
342858a5 2241 p = XSTRING (string)->data;
0a3e4d65 2242 while (*p == ' ' || *p == '\t')
25e40a4b
JB
2243 p++;
2244
3883fbeb
RS
2245 if (*p == '-')
2246 {
342858a5 2247 sign = -1;
3883fbeb
RS
2248 p++;
2249 }
2250 else if (*p == '+')
2251 p++;
2252
8e36ae7f 2253 if (isfloat_string (p) && b == 10)
342858a5
GM
2254 val = make_float (sign * atof (p));
2255 else
3883fbeb 2256 {
342858a5
GM
2257 double v = 0;
2258
2259 while (1)
2260 {
2261 int digit = digit_to_number (*p++, b);
2262 if (digit < 0)
2263 break;
2264 v = v * b + digit;
2265 }
2266
2267 if (v > (EMACS_UINT) (VALMASK >> 1))
2268 val = make_float (sign * v);
2269 else
2270 val = make_number (sign * (int) v);
3883fbeb 2271 }
342858a5
GM
2272
2273 return val;
7921925c 2274}
3883fbeb 2275
7403b5c8 2276\f
7921925c
JB
2277enum arithop
2278 { Aadd, Asub, Amult, Adiv, Alogand, Alogior, Alogxor, Amax, Amin };
2279
b06faa91 2280extern Lisp_Object float_arith_driver ();
ad8d56b9 2281extern Lisp_Object fmod_float ();
b06faa91 2282
7921925c 2283Lisp_Object
87fbf902 2284arith_driver (code, nargs, args)
7921925c
JB
2285 enum arithop code;
2286 int nargs;
2287 register Lisp_Object *args;
2288{
2289 register Lisp_Object val;
2290 register int argnum;
5260234d
RS
2291 register EMACS_INT accum;
2292 register EMACS_INT next;
7921925c 2293
0220c518 2294 switch (SWITCH_ENUM_CAST (code))
7921925c
JB
2295 {
2296 case Alogior:
2297 case Alogxor:
2298 case Aadd:
2299 case Asub:
2300 accum = 0; break;
2301 case Amult:
2302 accum = 1; break;
2303 case Alogand:
2304 accum = -1; break;
2305 }
2306
2307 for (argnum = 0; argnum < nargs; argnum++)
2308 {
2309 val = args[argnum]; /* using args[argnum] as argument to CHECK_NUMBER_... */
7921925c
JB
2310 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val, argnum);
2311
e9ebc175 2312 if (FLOATP (val)) /* time to do serious math */
7921925c
JB
2313 return (float_arith_driver ((double) accum, argnum, code,
2314 nargs, args));
7921925c
JB
2315 args[argnum] = val; /* runs into a compiler bug. */
2316 next = XINT (args[argnum]);
0220c518 2317 switch (SWITCH_ENUM_CAST (code))
7921925c
JB
2318 {
2319 case Aadd: accum += next; break;
2320 case Asub:
e64981da 2321 accum = argnum ? accum - next : nargs == 1 ? - next : next;
7921925c
JB
2322 break;
2323 case Amult: accum *= next; break;
2324 case Adiv:
2325 if (!argnum) accum = next;
87fbf902
RS
2326 else
2327 {
2328 if (next == 0)
2329 Fsignal (Qarith_error, Qnil);
2330 accum /= next;
2331 }
7921925c
JB
2332 break;
2333 case Alogand: accum &= next; break;
2334 case Alogior: accum |= next; break;
2335 case Alogxor: accum ^= next; break;
2336 case Amax: if (!argnum || next > accum) accum = next; break;
2337 case Amin: if (!argnum || next < accum) accum = next; break;
2338 }
2339 }
2340
f187f1f7 2341 XSETINT (val, accum);
7921925c
JB
2342 return val;
2343}
2344
1a2f2d33
KH
2345#undef isnan
2346#define isnan(x) ((x) != (x))
2347
7921925c
JB
2348Lisp_Object
2349float_arith_driver (accum, argnum, code, nargs, args)
2350 double accum;
2351 register int argnum;
2352 enum arithop code;
2353 int nargs;
2354 register Lisp_Object *args;
2355{
2356 register Lisp_Object val;
2357 double next;
7403b5c8 2358
7921925c
JB
2359 for (; argnum < nargs; argnum++)
2360 {
2361 val = args[argnum]; /* using args[argnum] as argument to CHECK_NUMBER_... */
2362 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val, argnum);
2363
e9ebc175 2364 if (FLOATP (val))
7921925c 2365 {
7539e11f 2366 next = XFLOAT_DATA (val);
7921925c
JB
2367 }
2368 else
2369 {
2370 args[argnum] = val; /* runs into a compiler bug. */
2371 next = XINT (args[argnum]);
2372 }
0220c518 2373 switch (SWITCH_ENUM_CAST (code))
7921925c
JB
2374 {
2375 case Aadd:
2376 accum += next;
2377 break;
2378 case Asub:
e64981da 2379 accum = argnum ? accum - next : nargs == 1 ? - next : next;
7921925c
JB
2380 break;
2381 case Amult:
2382 accum *= next;
2383 break;
2384 case Adiv:
2385 if (!argnum)
2386 accum = next;
2387 else
87fbf902 2388 {
ad8d56b9 2389 if (! IEEE_FLOATING_POINT && next == 0)
87fbf902
RS
2390 Fsignal (Qarith_error, Qnil);
2391 accum /= next;
2392 }
7921925c
JB
2393 break;
2394 case Alogand:
2395 case Alogior:
2396 case Alogxor:
2397 return wrong_type_argument (Qinteger_or_marker_p, val);
2398 case Amax:
1a2f2d33 2399 if (!argnum || isnan (next) || next > accum)
7921925c
JB
2400 accum = next;
2401 break;
2402 case Amin:
1a2f2d33 2403 if (!argnum || isnan (next) || next < accum)
7921925c
JB
2404 accum = next;
2405 break;
2406 }
2407 }
2408
2409 return make_float (accum);
2410}
cc94f3b2 2411
7921925c
JB
2412
2413DEFUN ("+", Fplus, Splus, 0, MANY, 0,
2414 "Return sum of any number of arguments, which are numbers or markers.")
2415 (nargs, args)
2416 int nargs;
2417 Lisp_Object *args;
2418{
2419 return arith_driver (Aadd, nargs, args);
2420}
2421
2422DEFUN ("-", Fminus, Sminus, 0, MANY, 0,
2423 "Negate number or subtract numbers or markers.\n\
2424With one arg, negates it. With more than one arg,\n\
2425subtracts all but the first from the first.")
2426 (nargs, args)
2427 int nargs;
2428 Lisp_Object *args;
2429{
2430 return arith_driver (Asub, nargs, args);
2431}
2432
2433DEFUN ("*", Ftimes, Stimes, 0, MANY, 0,
2434 "Returns product of any number of arguments, which are numbers or markers.")
2435 (nargs, args)
2436 int nargs;
2437 Lisp_Object *args;
2438{
2439 return arith_driver (Amult, nargs, args);
2440}
2441
2442DEFUN ("/", Fquo, Squo, 2, MANY, 0,
2443 "Returns first argument divided by all the remaining arguments.\n\
2444The arguments must be numbers or markers.")
2445 (nargs, args)
2446 int nargs;
2447 Lisp_Object *args;
2448{
2449 return arith_driver (Adiv, nargs, args);
2450}
2451
2452DEFUN ("%", Frem, Srem, 2, 2, 0,
d9c2a0f2 2453 "Returns remainder of X divided by Y.\n\
aa29f9b9 2454Both must be integers or markers.")
d9c2a0f2
EN
2455 (x, y)
2456 register Lisp_Object x, y;
7921925c
JB
2457{
2458 Lisp_Object val;
2459
d9c2a0f2
EN
2460 CHECK_NUMBER_COERCE_MARKER (x, 0);
2461 CHECK_NUMBER_COERCE_MARKER (y, 1);
7921925c 2462
d9c2a0f2 2463 if (XFASTINT (y) == 0)
87fbf902
RS
2464 Fsignal (Qarith_error, Qnil);
2465
d9c2a0f2 2466 XSETINT (val, XINT (x) % XINT (y));
7921925c
JB
2467 return val;
2468}
2469
1d66a5fa
KH
2470#ifndef HAVE_FMOD
2471double
2472fmod (f1, f2)
2473 double f1, f2;
2474{
bc1c9d7e
PE
2475 double r = f1;
2476
fa43b1e8
KH
2477 if (f2 < 0.0)
2478 f2 = -f2;
bc1c9d7e
PE
2479
2480 /* If the magnitude of the result exceeds that of the divisor, or
2481 the sign of the result does not agree with that of the dividend,
2482 iterate with the reduced value. This does not yield a
2483 particularly accurate result, but at least it will be in the
2484 range promised by fmod. */
2485 do
2486 r -= f2 * floor (r / f2);
2487 while (f2 <= (r < 0 ? -r : r) || ((r < 0) != (f1 < 0) && ! isnan (r)));
2488
2489 return r;
1d66a5fa
KH
2490}
2491#endif /* ! HAVE_FMOD */
2492
44fa9da5
PE
2493DEFUN ("mod", Fmod, Smod, 2, 2, 0,
2494 "Returns X modulo Y.\n\
2495The result falls between zero (inclusive) and Y (exclusive).\n\
2496Both X and Y must be numbers or markers.")
d9c2a0f2
EN
2497 (x, y)
2498 register Lisp_Object x, y;
44fa9da5
PE
2499{
2500 Lisp_Object val;
5260234d 2501 EMACS_INT i1, i2;
44fa9da5 2502
d9c2a0f2
EN
2503 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (x, 0);
2504 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (y, 1);
44fa9da5 2505
d9c2a0f2 2506 if (FLOATP (x) || FLOATP (y))
ad8d56b9
PE
2507 return fmod_float (x, y);
2508
d9c2a0f2
EN
2509 i1 = XINT (x);
2510 i2 = XINT (y);
44fa9da5
PE
2511
2512 if (i2 == 0)
2513 Fsignal (Qarith_error, Qnil);
7403b5c8 2514
44fa9da5
PE
2515 i1 %= i2;
2516
2517 /* If the "remainder" comes out with the wrong sign, fix it. */
04f7ec69 2518 if (i2 < 0 ? i1 > 0 : i1 < 0)
44fa9da5
PE
2519 i1 += i2;
2520
f187f1f7 2521 XSETINT (val, i1);
44fa9da5
PE
2522 return val;
2523}
2524
7921925c
JB
2525DEFUN ("max", Fmax, Smax, 1, MANY, 0,
2526 "Return largest of all the arguments (which must be numbers or markers).\n\
2527The value is always a number; markers are converted to numbers.")
2528 (nargs, args)
2529 int nargs;
2530 Lisp_Object *args;
2531{
2532 return arith_driver (Amax, nargs, args);
2533}
2534
2535DEFUN ("min", Fmin, Smin, 1, MANY, 0,
2536 "Return smallest of all the arguments (which must be numbers or markers).\n\
2537The value is always a number; markers are converted to numbers.")
2538 (nargs, args)
2539 int nargs;
2540 Lisp_Object *args;
2541{
2542 return arith_driver (Amin, nargs, args);
2543}
2544
2545DEFUN ("logand", Flogand, Slogand, 0, MANY, 0,
2546 "Return bitwise-and of all the arguments.\n\
2547Arguments may be integers, or markers converted to integers.")
2548 (nargs, args)
2549 int nargs;
2550 Lisp_Object *args;
2551{
2552 return arith_driver (Alogand, nargs, args);
2553}
2554
2555DEFUN ("logior", Flogior, Slogior, 0, MANY, 0,
2556 "Return bitwise-or of all the arguments.\n\
2557Arguments may be integers, or markers converted to integers.")
2558 (nargs, args)
2559 int nargs;
2560 Lisp_Object *args;
2561{
2562 return arith_driver (Alogior, nargs, args);
2563}
2564
2565DEFUN ("logxor", Flogxor, Slogxor, 0, MANY, 0,
2566 "Return bitwise-exclusive-or of all the arguments.\n\
2567Arguments may be integers, or markers converted to integers.")
2568 (nargs, args)
2569 int nargs;
2570 Lisp_Object *args;
2571{
2572 return arith_driver (Alogxor, nargs, args);
2573}
2574
2575DEFUN ("ash", Fash, Sash, 2, 2, 0,
2576 "Return VALUE with its bits shifted left by COUNT.\n\
2577If COUNT is negative, shifting is actually to the right.\n\
2578In this case, the sign bit is duplicated.")
3b9f7964
RS
2579 (value, count)
2580 register Lisp_Object value, count;
7921925c
JB
2581{
2582 register Lisp_Object val;
2583
3d9652eb
RS
2584 CHECK_NUMBER (value, 0);
2585 CHECK_NUMBER (count, 1);
7921925c 2586
81d70626
RS
2587 if (XINT (count) >= BITS_PER_EMACS_INT)
2588 XSETINT (val, 0);
2589 else if (XINT (count) > 0)
3d9652eb 2590 XSETINT (val, XINT (value) << XFASTINT (count));
81d70626
RS
2591 else if (XINT (count) <= -BITS_PER_EMACS_INT)
2592 XSETINT (val, XINT (value) < 0 ? -1 : 0);
7921925c 2593 else
3d9652eb 2594 XSETINT (val, XINT (value) >> -XINT (count));
7921925c
JB
2595 return val;
2596}
2597
2598DEFUN ("lsh", Flsh, Slsh, 2, 2, 0,
2599 "Return VALUE with its bits shifted left by COUNT.\n\
2600If COUNT is negative, shifting is actually to the right.\n\
2601In this case, zeros are shifted in on the left.")
3d9652eb
RS
2602 (value, count)
2603 register Lisp_Object value, count;
7921925c
JB
2604{
2605 register Lisp_Object val;
2606
3d9652eb
RS
2607 CHECK_NUMBER (value, 0);
2608 CHECK_NUMBER (count, 1);
7921925c 2609
81d70626
RS
2610 if (XINT (count) >= BITS_PER_EMACS_INT)
2611 XSETINT (val, 0);
2612 else if (XINT (count) > 0)
3d9652eb 2613 XSETINT (val, (EMACS_UINT) XUINT (value) << XFASTINT (count));
81d70626
RS
2614 else if (XINT (count) <= -BITS_PER_EMACS_INT)
2615 XSETINT (val, 0);
7921925c 2616 else
3d9652eb 2617 XSETINT (val, (EMACS_UINT) XUINT (value) >> -XINT (count));
7921925c
JB
2618 return val;
2619}
2620
2621DEFUN ("1+", Fadd1, Sadd1, 1, 1, 0,
2622 "Return NUMBER plus one. NUMBER may be a number or a marker.\n\
2623Markers are converted to integers.")
d9c2a0f2
EN
2624 (number)
2625 register Lisp_Object number;
7921925c 2626{
d9c2a0f2 2627 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number, 0);
7921925c 2628
d9c2a0f2 2629 if (FLOATP (number))
7539e11f 2630 return (make_float (1.0 + XFLOAT_DATA (number)));
7921925c 2631
d9c2a0f2
EN
2632 XSETINT (number, XINT (number) + 1);
2633 return number;
7921925c
JB
2634}
2635
2636DEFUN ("1-", Fsub1, Ssub1, 1, 1, 0,
2637 "Return NUMBER minus one. NUMBER may be a number or a marker.\n\
2638Markers are converted to integers.")
d9c2a0f2
EN
2639 (number)
2640 register Lisp_Object number;
7921925c 2641{
d9c2a0f2 2642 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number, 0);
7921925c 2643
d9c2a0f2 2644 if (FLOATP (number))
7539e11f 2645 return (make_float (-1.0 + XFLOAT_DATA (number)));
7921925c 2646
d9c2a0f2
EN
2647 XSETINT (number, XINT (number) - 1);
2648 return number;
7921925c
JB
2649}
2650
2651DEFUN ("lognot", Flognot, Slognot, 1, 1, 0,
d9c2a0f2
EN
2652 "Return the bitwise complement of NUMBER. NUMBER must be an integer.")
2653 (number)
2654 register Lisp_Object number;
7921925c 2655{
d9c2a0f2 2656 CHECK_NUMBER (number, 0);
53924017 2657 XSETINT (number, ~XINT (number));
d9c2a0f2 2658 return number;
7921925c
JB
2659}
2660\f
2661void
2662syms_of_data ()
2663{
6315e761
RS
2664 Lisp_Object error_tail, arith_tail;
2665
7921925c
JB
2666 Qquote = intern ("quote");
2667 Qlambda = intern ("lambda");
2668 Qsubr = intern ("subr");
2669 Qerror_conditions = intern ("error-conditions");
2670 Qerror_message = intern ("error-message");
2671 Qtop_level = intern ("top-level");
2672
2673 Qerror = intern ("error");
2674 Qquit = intern ("quit");
2675 Qwrong_type_argument = intern ("wrong-type-argument");
2676 Qargs_out_of_range = intern ("args-out-of-range");
2677 Qvoid_function = intern ("void-function");
ffd56f97 2678 Qcyclic_function_indirection = intern ("cyclic-function-indirection");
7921925c
JB
2679 Qvoid_variable = intern ("void-variable");
2680 Qsetting_constant = intern ("setting-constant");
2681 Qinvalid_read_syntax = intern ("invalid-read-syntax");
2682
2683 Qinvalid_function = intern ("invalid-function");
2684 Qwrong_number_of_arguments = intern ("wrong-number-of-arguments");
2685 Qno_catch = intern ("no-catch");
2686 Qend_of_file = intern ("end-of-file");
2687 Qarith_error = intern ("arith-error");
2688 Qbeginning_of_buffer = intern ("beginning-of-buffer");
2689 Qend_of_buffer = intern ("end-of-buffer");
2690 Qbuffer_read_only = intern ("buffer-read-only");
8f9f49d7 2691 Qtext_read_only = intern ("text-read-only");
3b8819d6 2692 Qmark_inactive = intern ("mark-inactive");
7921925c
JB
2693
2694 Qlistp = intern ("listp");
2695 Qconsp = intern ("consp");
2696 Qsymbolp = intern ("symbolp");
cda9b832 2697 Qkeywordp = intern ("keywordp");
7921925c
JB
2698 Qintegerp = intern ("integerp");
2699 Qnatnump = intern ("natnump");
8e86942b 2700 Qwholenump = intern ("wholenump");
7921925c
JB
2701 Qstringp = intern ("stringp");
2702 Qarrayp = intern ("arrayp");
2703 Qsequencep = intern ("sequencep");
2704 Qbufferp = intern ("bufferp");
2705 Qvectorp = intern ("vectorp");
2706 Qchar_or_string_p = intern ("char-or-string-p");
2707 Qmarkerp = intern ("markerp");
07bd8472 2708 Qbuffer_or_string_p = intern ("buffer-or-string-p");
7921925c
JB
2709 Qinteger_or_marker_p = intern ("integer-or-marker-p");
2710 Qboundp = intern ("boundp");
2711 Qfboundp = intern ("fboundp");
2712
7921925c
JB
2713 Qfloatp = intern ("floatp");
2714 Qnumberp = intern ("numberp");
2715 Qnumber_or_marker_p = intern ("number-or-marker-p");
7921925c 2716
4d276982 2717 Qchar_table_p = intern ("char-table-p");
7f0edce7 2718 Qvector_or_char_table_p = intern ("vector-or-char-table-p");
4d276982 2719
6f0e897f
DL
2720 Qsubrp = intern ("subrp");
2721 Qunevalled = intern ("unevalled");
2722 Qmany = intern ("many");
2723
7921925c
JB
2724 Qcdr = intern ("cdr");
2725
f845f2c9 2726 /* Handle automatic advice activation */
ab297811 2727 Qad_advice_info = intern ("ad-advice-info");
c1307a23 2728 Qad_activate_internal = intern ("ad-activate-internal");
f845f2c9 2729
6315e761
RS
2730 error_tail = Fcons (Qerror, Qnil);
2731
7921925c
JB
2732 /* ERROR is used as a signaler for random errors for which nothing else is right */
2733
2734 Fput (Qerror, Qerror_conditions,
6315e761 2735 error_tail);
7921925c
JB
2736 Fput (Qerror, Qerror_message,
2737 build_string ("error"));
2738
2739 Fput (Qquit, Qerror_conditions,
2740 Fcons (Qquit, Qnil));
2741 Fput (Qquit, Qerror_message,
2742 build_string ("Quit"));
2743
2744 Fput (Qwrong_type_argument, Qerror_conditions,
6315e761 2745 Fcons (Qwrong_type_argument, error_tail));
7921925c
JB
2746 Fput (Qwrong_type_argument, Qerror_message,
2747 build_string ("Wrong type argument"));
2748
2749 Fput (Qargs_out_of_range, Qerror_conditions,
6315e761 2750 Fcons (Qargs_out_of_range, error_tail));
7921925c
JB
2751 Fput (Qargs_out_of_range, Qerror_message,
2752 build_string ("Args out of range"));
2753
2754 Fput (Qvoid_function, Qerror_conditions,
6315e761 2755 Fcons (Qvoid_function, error_tail));
7921925c
JB
2756 Fput (Qvoid_function, Qerror_message,
2757 build_string ("Symbol's function definition is void"));
2758
ffd56f97 2759 Fput (Qcyclic_function_indirection, Qerror_conditions,
6315e761 2760 Fcons (Qcyclic_function_indirection, error_tail));
ffd56f97
JB
2761 Fput (Qcyclic_function_indirection, Qerror_message,
2762 build_string ("Symbol's chain of function indirections contains a loop"));
2763
7921925c 2764 Fput (Qvoid_variable, Qerror_conditions,
6315e761 2765 Fcons (Qvoid_variable, error_tail));
7921925c
JB
2766 Fput (Qvoid_variable, Qerror_message,
2767 build_string ("Symbol's value as variable is void"));
2768
2769 Fput (Qsetting_constant, Qerror_conditions,
6315e761 2770 Fcons (Qsetting_constant, error_tail));
7921925c
JB
2771 Fput (Qsetting_constant, Qerror_message,
2772 build_string ("Attempt to set a constant symbol"));
2773
2774 Fput (Qinvalid_read_syntax, Qerror_conditions,
6315e761 2775 Fcons (Qinvalid_read_syntax, error_tail));
7921925c
JB
2776 Fput (Qinvalid_read_syntax, Qerror_message,
2777 build_string ("Invalid read syntax"));
2778
2779 Fput (Qinvalid_function, Qerror_conditions,
6315e761 2780 Fcons (Qinvalid_function, error_tail));
7921925c
JB
2781 Fput (Qinvalid_function, Qerror_message,
2782 build_string ("Invalid function"));
2783
2784 Fput (Qwrong_number_of_arguments, Qerror_conditions,
6315e761 2785 Fcons (Qwrong_number_of_arguments, error_tail));
7921925c
JB
2786 Fput (Qwrong_number_of_arguments, Qerror_message,
2787 build_string ("Wrong number of arguments"));
2788
2789 Fput (Qno_catch, Qerror_conditions,
6315e761 2790 Fcons (Qno_catch, error_tail));
7921925c
JB
2791 Fput (Qno_catch, Qerror_message,
2792 build_string ("No catch for tag"));
2793
2794 Fput (Qend_of_file, Qerror_conditions,
6315e761 2795 Fcons (Qend_of_file, error_tail));
7921925c
JB
2796 Fput (Qend_of_file, Qerror_message,
2797 build_string ("End of file during parsing"));
2798
6315e761 2799 arith_tail = Fcons (Qarith_error, error_tail);
7921925c 2800 Fput (Qarith_error, Qerror_conditions,
6315e761 2801 arith_tail);
7921925c
JB
2802 Fput (Qarith_error, Qerror_message,
2803 build_string ("Arithmetic error"));
2804
2805 Fput (Qbeginning_of_buffer, Qerror_conditions,
6315e761 2806 Fcons (Qbeginning_of_buffer, error_tail));
7921925c
JB
2807 Fput (Qbeginning_of_buffer, Qerror_message,
2808 build_string ("Beginning of buffer"));
2809
2810 Fput (Qend_of_buffer, Qerror_conditions,
6315e761 2811 Fcons (Qend_of_buffer, error_tail));
7921925c
JB
2812 Fput (Qend_of_buffer, Qerror_message,
2813 build_string ("End of buffer"));
2814
2815 Fput (Qbuffer_read_only, Qerror_conditions,
6315e761 2816 Fcons (Qbuffer_read_only, error_tail));
7921925c
JB
2817 Fput (Qbuffer_read_only, Qerror_message,
2818 build_string ("Buffer is read-only"));
2819
8f9f49d7
GM
2820 Fput (Qtext_read_only, Qerror_conditions,
2821 Fcons (Qtext_read_only, error_tail));
2822 Fput (Qtext_read_only, Qerror_message,
2823 build_string ("Text is read-only"));
2824
6315e761
RS
2825 Qrange_error = intern ("range-error");
2826 Qdomain_error = intern ("domain-error");
2827 Qsingularity_error = intern ("singularity-error");
2828 Qoverflow_error = intern ("overflow-error");
2829 Qunderflow_error = intern ("underflow-error");
2830
2831 Fput (Qdomain_error, Qerror_conditions,
2832 Fcons (Qdomain_error, arith_tail));
2833 Fput (Qdomain_error, Qerror_message,
2834 build_string ("Arithmetic domain error"));
2835
2836 Fput (Qrange_error, Qerror_conditions,
2837 Fcons (Qrange_error, arith_tail));
2838 Fput (Qrange_error, Qerror_message,
2839 build_string ("Arithmetic range error"));
2840
2841 Fput (Qsingularity_error, Qerror_conditions,
2842 Fcons (Qsingularity_error, Fcons (Qdomain_error, arith_tail)));
2843 Fput (Qsingularity_error, Qerror_message,
2844 build_string ("Arithmetic singularity error"));
2845
2846 Fput (Qoverflow_error, Qerror_conditions,
2847 Fcons (Qoverflow_error, Fcons (Qdomain_error, arith_tail)));
2848 Fput (Qoverflow_error, Qerror_message,
2849 build_string ("Arithmetic overflow error"));
2850
2851 Fput (Qunderflow_error, Qerror_conditions,
2852 Fcons (Qunderflow_error, Fcons (Qdomain_error, arith_tail)));
2853 Fput (Qunderflow_error, Qerror_message,
2854 build_string ("Arithmetic underflow error"));
2855
2856 staticpro (&Qrange_error);
2857 staticpro (&Qdomain_error);
2858 staticpro (&Qsingularity_error);
2859 staticpro (&Qoverflow_error);
2860 staticpro (&Qunderflow_error);
6315e761 2861
7921925c
JB
2862 staticpro (&Qnil);
2863 staticpro (&Qt);
2864 staticpro (&Qquote);
2865 staticpro (&Qlambda);
2866 staticpro (&Qsubr);
2867 staticpro (&Qunbound);
2868 staticpro (&Qerror_conditions);
2869 staticpro (&Qerror_message);
2870 staticpro (&Qtop_level);
2871
2872 staticpro (&Qerror);
2873 staticpro (&Qquit);
2874 staticpro (&Qwrong_type_argument);
2875 staticpro (&Qargs_out_of_range);
2876 staticpro (&Qvoid_function);
ffd56f97 2877 staticpro (&Qcyclic_function_indirection);
7921925c
JB
2878 staticpro (&Qvoid_variable);
2879 staticpro (&Qsetting_constant);
2880 staticpro (&Qinvalid_read_syntax);
2881 staticpro (&Qwrong_number_of_arguments);
2882 staticpro (&Qinvalid_function);
2883 staticpro (&Qno_catch);
2884 staticpro (&Qend_of_file);
2885 staticpro (&Qarith_error);
2886 staticpro (&Qbeginning_of_buffer);
2887 staticpro (&Qend_of_buffer);
2888 staticpro (&Qbuffer_read_only);
8f9f49d7 2889 staticpro (&Qtext_read_only);
638b77e6 2890 staticpro (&Qmark_inactive);
7921925c
JB
2891
2892 staticpro (&Qlistp);
2893 staticpro (&Qconsp);
2894 staticpro (&Qsymbolp);
cda9b832 2895 staticpro (&Qkeywordp);
7921925c
JB
2896 staticpro (&Qintegerp);
2897 staticpro (&Qnatnump);
8e86942b 2898 staticpro (&Qwholenump);
7921925c
JB
2899 staticpro (&Qstringp);
2900 staticpro (&Qarrayp);
2901 staticpro (&Qsequencep);
2902 staticpro (&Qbufferp);
2903 staticpro (&Qvectorp);
2904 staticpro (&Qchar_or_string_p);
2905 staticpro (&Qmarkerp);
07bd8472 2906 staticpro (&Qbuffer_or_string_p);
7921925c 2907 staticpro (&Qinteger_or_marker_p);
7921925c 2908 staticpro (&Qfloatp);
464f8898
RS
2909 staticpro (&Qnumberp);
2910 staticpro (&Qnumber_or_marker_p);
4d276982 2911 staticpro (&Qchar_table_p);
7f0edce7 2912 staticpro (&Qvector_or_char_table_p);
6f0e897f
DL
2913 staticpro (&Qsubrp);
2914 staticpro (&Qmany);
2915 staticpro (&Qunevalled);
7921925c
JB
2916
2917 staticpro (&Qboundp);
2918 staticpro (&Qfboundp);
2919 staticpro (&Qcdr);
ab297811 2920 staticpro (&Qad_advice_info);
c1307a23 2921 staticpro (&Qad_activate_internal);
7921925c 2922
39bcc759
RS
2923 /* Types that type-of returns. */
2924 Qinteger = intern ("integer");
2925 Qsymbol = intern ("symbol");
2926 Qstring = intern ("string");
2927 Qcons = intern ("cons");
2928 Qmarker = intern ("marker");
2929 Qoverlay = intern ("overlay");
2930 Qfloat = intern ("float");
2931 Qwindow_configuration = intern ("window-configuration");
2932 Qprocess = intern ("process");
2933 Qwindow = intern ("window");
2934 /* Qsubr = intern ("subr"); */
2935 Qcompiled_function = intern ("compiled-function");
2936 Qbuffer = intern ("buffer");
2937 Qframe = intern ("frame");
2938 Qvector = intern ("vector");
fc67d5be
KH
2939 Qchar_table = intern ("char-table");
2940 Qbool_vector = intern ("bool-vector");
81dc5de5 2941 Qhash_table = intern ("hash-table");
39bcc759
RS
2942
2943 staticpro (&Qinteger);
2944 staticpro (&Qsymbol);
2945 staticpro (&Qstring);
2946 staticpro (&Qcons);
2947 staticpro (&Qmarker);
2948 staticpro (&Qoverlay);
2949 staticpro (&Qfloat);
2950 staticpro (&Qwindow_configuration);
2951 staticpro (&Qprocess);
2952 staticpro (&Qwindow);
2953 /* staticpro (&Qsubr); */
2954 staticpro (&Qcompiled_function);
2955 staticpro (&Qbuffer);
2956 staticpro (&Qframe);
2957 staticpro (&Qvector);
fc67d5be
KH
2958 staticpro (&Qchar_table);
2959 staticpro (&Qbool_vector);
81dc5de5 2960 staticpro (&Qhash_table);
39bcc759 2961
7921925c
JB
2962 defsubr (&Seq);
2963 defsubr (&Snull);
39bcc759 2964 defsubr (&Stype_of);
7921925c
JB
2965 defsubr (&Slistp);
2966 defsubr (&Snlistp);
2967 defsubr (&Sconsp);
2968 defsubr (&Satom);
2969 defsubr (&Sintegerp);
464f8898 2970 defsubr (&Sinteger_or_marker_p);
7921925c
JB
2971 defsubr (&Snumberp);
2972 defsubr (&Snumber_or_marker_p);
464f8898 2973 defsubr (&Sfloatp);
7921925c
JB
2974 defsubr (&Snatnump);
2975 defsubr (&Ssymbolp);
cda9b832 2976 defsubr (&Skeywordp);
7921925c 2977 defsubr (&Sstringp);
0f56470d 2978 defsubr (&Smultibyte_string_p);
7921925c 2979 defsubr (&Svectorp);
4d276982 2980 defsubr (&Schar_table_p);
7f0edce7 2981 defsubr (&Svector_or_char_table_p);
4d276982 2982 defsubr (&Sbool_vector_p);
7921925c
JB
2983 defsubr (&Sarrayp);
2984 defsubr (&Ssequencep);
2985 defsubr (&Sbufferp);
2986 defsubr (&Smarkerp);
7921925c 2987 defsubr (&Ssubrp);
dbc4e1c1 2988 defsubr (&Sbyte_code_function_p);
7921925c
JB
2989 defsubr (&Schar_or_string_p);
2990 defsubr (&Scar);
2991 defsubr (&Scdr);
2992 defsubr (&Scar_safe);
2993 defsubr (&Scdr_safe);
2994 defsubr (&Ssetcar);
2995 defsubr (&Ssetcdr);
2996 defsubr (&Ssymbol_function);
ffd56f97 2997 defsubr (&Sindirect_function);
7921925c
JB
2998 defsubr (&Ssymbol_plist);
2999 defsubr (&Ssymbol_name);
3000 defsubr (&Smakunbound);
3001 defsubr (&Sfmakunbound);
3002 defsubr (&Sboundp);
3003 defsubr (&Sfboundp);
3004 defsubr (&Sfset);
80df38a2 3005 defsubr (&Sdefalias);
7921925c
JB
3006 defsubr (&Ssetplist);
3007 defsubr (&Ssymbol_value);
3008 defsubr (&Sset);
3009 defsubr (&Sdefault_boundp);
3010 defsubr (&Sdefault_value);
3011 defsubr (&Sset_default);
3012 defsubr (&Ssetq_default);
3013 defsubr (&Smake_variable_buffer_local);
3014 defsubr (&Smake_local_variable);
3015 defsubr (&Skill_local_variable);
b0c2d1c6 3016 defsubr (&Smake_variable_frame_local);
62476adc 3017 defsubr (&Slocal_variable_p);
f4f04cee 3018 defsubr (&Slocal_variable_if_set_p);
7921925c
JB
3019 defsubr (&Saref);
3020 defsubr (&Saset);
f2980264 3021 defsubr (&Snumber_to_string);
25e40a4b 3022 defsubr (&Sstring_to_number);
7921925c
JB
3023 defsubr (&Seqlsign);
3024 defsubr (&Slss);
3025 defsubr (&Sgtr);
3026 defsubr (&Sleq);
3027 defsubr (&Sgeq);
3028 defsubr (&Sneq);
3029 defsubr (&Szerop);
3030 defsubr (&Splus);
3031 defsubr (&Sminus);
3032 defsubr (&Stimes);
3033 defsubr (&Squo);
3034 defsubr (&Srem);
44fa9da5 3035 defsubr (&Smod);
7921925c
JB
3036 defsubr (&Smax);
3037 defsubr (&Smin);
3038 defsubr (&Slogand);
3039 defsubr (&Slogior);
3040 defsubr (&Slogxor);
3041 defsubr (&Slsh);
3042 defsubr (&Sash);
3043 defsubr (&Sadd1);
3044 defsubr (&Ssub1);
3045 defsubr (&Slognot);
6f0e897f 3046 defsubr (&Ssubr_arity);
8e86942b 3047
c80bd143 3048 XSYMBOL (Qwholenump)->function = XSYMBOL (Qnatnump)->function;
7921925c
JB
3049}
3050
a33ef3ab 3051SIGTYPE
7921925c
JB
3052arith_error (signo)
3053 int signo;
3054{
fe42a920 3055#if defined(USG) && !defined(POSIX_SIGNALS)
7921925c
JB
3056 /* USG systems forget handlers when they are used;
3057 must reestablish each time */
3058 signal (signo, arith_error);
3059#endif /* USG */
3060#ifdef VMS
3061 /* VMS systems are like USG. */
3062 signal (signo, arith_error);
3063#endif /* VMS */
3064#ifdef BSD4_1
3065 sigrelse (SIGFPE);
3066#else /* not BSD4_1 */
e065a56e 3067 sigsetmask (SIGEMPTYMASK);
7921925c
JB
3068#endif /* not BSD4_1 */
3069
3070 Fsignal (Qarith_error, Qnil);
3071}
3072
dfcf069d 3073void
7921925c
JB
3074init_data ()
3075{
3076 /* Don't do this if just dumping out.
3077 We don't want to call `signal' in this case
3078 so that we don't have trouble with dumping
3079 signal-delivering routines in an inconsistent state. */
3080#ifndef CANNOT_DUMP
3081 if (!initialized)
3082 return;
3083#endif /* CANNOT_DUMP */
3084 signal (SIGFPE, arith_error);
7403b5c8 3085
7921925c
JB
3086#ifdef uts
3087 signal (SIGEMT, arith_error);
3088#endif /* uts */
3089}