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