(Fmessage_or_box): Doc fix.
[bpt/emacs.git] / 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 current_buffer);
942
943 if (MISCP (valcontents))
944 {
945 switch (XMISCTYPE (valcontents))
946 {
947 case Lisp_Misc_Intfwd:
948 XSETINT (val, *XINTFWD (valcontents)->intvar);
949 return val;
950
951 case Lisp_Misc_Boolfwd:
952 return (*XBOOLFWD (valcontents)->boolvar ? Qt : Qnil);
953
954 case Lisp_Misc_Objfwd:
955 return *XOBJFWD (valcontents)->objvar;
956
957 case Lisp_Misc_Buffer_Objfwd:
958 return PER_BUFFER_VALUE (current_buffer,
959 XBUFFER_OBJFWD (valcontents)->offset);
960
961 case Lisp_Misc_Kboard_Objfwd:
962 return *(Lisp_Object *)(XKBOARD_OBJFWD (valcontents)->offset
963 + (char *)current_kboard);
964 }
965 }
966
967 return valcontents;
968 }
969
970 DEFUN ("symbol-value", Fsymbol_value, Ssymbol_value, 1, 1, 0,
971 "Return SYMBOL's value. Error if that is void.")
972 (symbol)
973 Lisp_Object symbol;
974 {
975 Lisp_Object val;
976
977 val = find_symbol_value (symbol);
978 if (EQ (val, Qunbound))
979 return Fsignal (Qvoid_variable, Fcons (symbol, Qnil));
980 else
981 return val;
982 }
983
984 DEFUN ("set", Fset, Sset, 2, 2, 0,
985 "Set SYMBOL's value to NEWVAL, and return NEWVAL.")
986 (symbol, newval)
987 register Lisp_Object symbol, newval;
988 {
989 return set_internal (symbol, newval, current_buffer, 0);
990 }
991
992 /* Return 1 if SYMBOL currently has a let-binding
993 which was made in the buffer that is now current. */
994
995 static int
996 let_shadows_buffer_binding_p (symbol)
997 Lisp_Object symbol;
998 {
999 struct specbinding *p;
1000
1001 for (p = specpdl_ptr - 1; p >= specpdl; p--)
1002 if (p->func == 0
1003 && CONSP (p->symbol)
1004 && EQ (symbol, XCAR (p->symbol))
1005 && XBUFFER (XCDR (XCDR (p->symbol))) == current_buffer)
1006 return 1;
1007
1008 return 0;
1009 }
1010
1011 /* Store the value NEWVAL into SYMBOL.
1012 If buffer-locality is an issue, BUF specifies which buffer to use.
1013 (0 stands for the current buffer.)
1014
1015 If BINDFLAG is zero, then if this symbol is supposed to become
1016 local in every buffer where it is set, then we make it local.
1017 If BINDFLAG is nonzero, we don't do that. */
1018
1019 Lisp_Object
1020 set_internal (symbol, newval, buf, bindflag)
1021 register Lisp_Object symbol, newval;
1022 struct buffer *buf;
1023 int bindflag;
1024 {
1025 int voide = EQ (newval, Qunbound);
1026
1027 register Lisp_Object valcontents, innercontents, tem1, current_alist_element;
1028
1029 if (buf == 0)
1030 buf = current_buffer;
1031
1032 /* If restoring in a dead buffer, do nothing. */
1033 if (NILP (buf->name))
1034 return newval;
1035
1036 CHECK_SYMBOL (symbol, 0);
1037 if (NILP (symbol) || EQ (symbol, Qt)
1038 || (XSYMBOL (symbol)->name->data[0] == ':'
1039 && EQ (XSYMBOL (symbol)->obarray, initial_obarray)
1040 && !EQ (newval, symbol)))
1041 return Fsignal (Qsetting_constant, Fcons (symbol, Qnil));
1042
1043 innercontents = valcontents = XSYMBOL (symbol)->value;
1044
1045 if (BUFFER_OBJFWDP (valcontents))
1046 {
1047 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1048 int idx = PER_BUFFER_IDX (offset);
1049 if (idx > 0
1050 && !bindflag
1051 && !let_shadows_buffer_binding_p (symbol))
1052 SET_PER_BUFFER_VALUE_P (buf, idx, 1);
1053 }
1054
1055 else if (BUFFER_LOCAL_VALUEP (valcontents)
1056 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1057 {
1058 /* valcontents is a struct Lisp_Buffer_Local_Value. */
1059
1060 /* What binding is loaded right now? */
1061 current_alist_element
1062 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1063
1064 /* If the current buffer is not the buffer whose binding is
1065 loaded, or if there may be frame-local bindings and the frame
1066 isn't the right one, or if it's a Lisp_Buffer_Local_Value and
1067 the default binding is loaded, the loaded binding may be the
1068 wrong one. */
1069 if (!BUFFERP (XBUFFER_LOCAL_VALUE (valcontents)->buffer)
1070 || buf != XBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer)
1071 || (XBUFFER_LOCAL_VALUE (valcontents)->check_frame
1072 && !EQ (selected_frame, XBUFFER_LOCAL_VALUE (valcontents)->frame))
1073 || (BUFFER_LOCAL_VALUEP (valcontents)
1074 && EQ (XCAR (current_alist_element),
1075 current_alist_element)))
1076 {
1077 /* The currently loaded binding is not necessarily valid.
1078 We need to unload it, and choose a new binding. */
1079
1080 /* Write out `realvalue' to the old loaded binding. */
1081 Fsetcdr (current_alist_element,
1082 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue));
1083
1084 /* Find the new binding. */
1085 tem1 = Fassq (symbol, buf->local_var_alist);
1086 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 1;
1087 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 0;
1088
1089 if (NILP (tem1))
1090 {
1091 /* This buffer still sees the default value. */
1092
1093 /* If the variable is a Lisp_Some_Buffer_Local_Value,
1094 or if this is `let' rather than `set',
1095 make CURRENT-ALIST-ELEMENT point to itself,
1096 indicating that we're seeing the default value.
1097 Likewise if the variable has been let-bound
1098 in the current buffer. */
1099 if (bindflag || SOME_BUFFER_LOCAL_VALUEP (valcontents)
1100 || let_shadows_buffer_binding_p (symbol))
1101 {
1102 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
1103
1104 if (XBUFFER_LOCAL_VALUE (valcontents)->check_frame)
1105 tem1 = Fassq (symbol,
1106 XFRAME (selected_frame)->param_alist);
1107
1108 if (! NILP (tem1))
1109 XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 1;
1110 else
1111 tem1 = XBUFFER_LOCAL_VALUE (valcontents)->cdr;
1112 }
1113 /* If it's a Lisp_Buffer_Local_Value, being set not bound,
1114 and we're not within a let that was made for this buffer,
1115 create a new buffer-local binding for the variable.
1116 That means, give this buffer a new assoc for a local value
1117 and load that binding. */
1118 else
1119 {
1120 tem1 = Fcons (symbol, Fcdr (current_alist_element));
1121 buf->local_var_alist
1122 = Fcons (tem1, buf->local_var_alist);
1123 }
1124 }
1125
1126 /* Record which binding is now loaded. */
1127 XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr)
1128 = tem1;
1129
1130 /* Set `buffer' and `frame' slots for thebinding now loaded. */
1131 XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer, buf);
1132 XBUFFER_LOCAL_VALUE (valcontents)->frame = selected_frame;
1133 }
1134 innercontents = XBUFFER_LOCAL_VALUE (valcontents)->realvalue;
1135 }
1136
1137 /* If storing void (making the symbol void), forward only through
1138 buffer-local indicator, not through Lisp_Objfwd, etc. */
1139 if (voide)
1140 store_symval_forwarding (symbol, Qnil, newval);
1141 else
1142 store_symval_forwarding (symbol, innercontents, newval);
1143
1144 /* If we just set a variable whose current binding is frame-local,
1145 store the new value in the frame parameter too. */
1146
1147 if (BUFFER_LOCAL_VALUEP (valcontents)
1148 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1149 {
1150 /* What binding is loaded right now? */
1151 current_alist_element
1152 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1153
1154 /* If the current buffer is not the buffer whose binding is
1155 loaded, or if there may be frame-local bindings and the frame
1156 isn't the right one, or if it's a Lisp_Buffer_Local_Value and
1157 the default binding is loaded, the loaded binding may be the
1158 wrong one. */
1159 if (XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame)
1160 XCDR (current_alist_element) = newval;
1161 }
1162
1163 return newval;
1164 }
1165 \f
1166 /* Access or set a buffer-local symbol's default value. */
1167
1168 /* Return the default value of SYMBOL, but don't check for voidness.
1169 Return Qunbound if it is void. */
1170
1171 Lisp_Object
1172 default_value (symbol)
1173 Lisp_Object symbol;
1174 {
1175 register Lisp_Object valcontents;
1176
1177 CHECK_SYMBOL (symbol, 0);
1178 valcontents = XSYMBOL (symbol)->value;
1179
1180 /* For a built-in buffer-local variable, get the default value
1181 rather than letting do_symval_forwarding get the current value. */
1182 if (BUFFER_OBJFWDP (valcontents))
1183 {
1184 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1185 if (PER_BUFFER_IDX (offset) != 0)
1186 return PER_BUFFER_DEFAULT (offset);
1187 }
1188
1189 /* Handle user-created local variables. */
1190 if (BUFFER_LOCAL_VALUEP (valcontents)
1191 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1192 {
1193 /* If var is set up for a buffer that lacks a local value for it,
1194 the current value is nominally the default value.
1195 But the `realvalue' slot may be more up to date, since
1196 ordinary setq stores just that slot. So use that. */
1197 Lisp_Object current_alist_element, alist_element_car;
1198 current_alist_element
1199 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1200 alist_element_car = XCAR (current_alist_element);
1201 if (EQ (alist_element_car, current_alist_element))
1202 return do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue);
1203 else
1204 return XCDR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1205 }
1206 /* For other variables, get the current value. */
1207 return do_symval_forwarding (valcontents);
1208 }
1209
1210 DEFUN ("default-boundp", Fdefault_boundp, Sdefault_boundp, 1, 1, 0,
1211 "Return t if SYMBOL has a non-void default value.\n\
1212 This is the value that is seen in buffers that do not have their own values\n\
1213 for this variable.")
1214 (symbol)
1215 Lisp_Object symbol;
1216 {
1217 register Lisp_Object value;
1218
1219 value = default_value (symbol);
1220 return (EQ (value, Qunbound) ? Qnil : Qt);
1221 }
1222
1223 DEFUN ("default-value", Fdefault_value, Sdefault_value, 1, 1, 0,
1224 "Return SYMBOL's default value.\n\
1225 This is the value that is seen in buffers that do not have their own values\n\
1226 for this variable. The default value is meaningful for variables with\n\
1227 local bindings in certain buffers.")
1228 (symbol)
1229 Lisp_Object symbol;
1230 {
1231 register Lisp_Object value;
1232
1233 value = default_value (symbol);
1234 if (EQ (value, Qunbound))
1235 return Fsignal (Qvoid_variable, Fcons (symbol, Qnil));
1236 return value;
1237 }
1238
1239 DEFUN ("set-default", Fset_default, Sset_default, 2, 2, 0,
1240 "Set SYMBOL's default value to VAL. SYMBOL and VAL are evaluated.\n\
1241 The default value is seen in buffers that do not have their own values\n\
1242 for this variable.")
1243 (symbol, value)
1244 Lisp_Object symbol, value;
1245 {
1246 register Lisp_Object valcontents, current_alist_element, alist_element_buffer;
1247
1248 CHECK_SYMBOL (symbol, 0);
1249 valcontents = XSYMBOL (symbol)->value;
1250
1251 /* Handle variables like case-fold-search that have special slots
1252 in the buffer. Make them work apparently like Lisp_Buffer_Local_Value
1253 variables. */
1254 if (BUFFER_OBJFWDP (valcontents))
1255 {
1256 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1257 int idx = PER_BUFFER_IDX (offset);
1258
1259 PER_BUFFER_DEFAULT (offset) = value;
1260
1261 /* If this variable is not always local in all buffers,
1262 set it in the buffers that don't nominally have a local value. */
1263 if (idx > 0)
1264 {
1265 struct buffer *b;
1266
1267 for (b = all_buffers; b; b = b->next)
1268 if (!PER_BUFFER_VALUE_P (b, idx))
1269 PER_BUFFER_VALUE (b, offset) = value;
1270 }
1271 return value;
1272 }
1273
1274 if (!BUFFER_LOCAL_VALUEP (valcontents)
1275 && !SOME_BUFFER_LOCAL_VALUEP (valcontents))
1276 return Fset (symbol, value);
1277
1278 /* Store new value into the DEFAULT-VALUE slot. */
1279 XCDR (XBUFFER_LOCAL_VALUE (valcontents)->cdr) = value;
1280
1281 /* If the default binding is now loaded, set the REALVALUE slot too. */
1282 current_alist_element
1283 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1284 alist_element_buffer = Fcar (current_alist_element);
1285 if (EQ (alist_element_buffer, current_alist_element))
1286 store_symval_forwarding (symbol, XBUFFER_LOCAL_VALUE (valcontents)->realvalue,
1287 value);
1288
1289 return value;
1290 }
1291
1292 DEFUN ("setq-default", Fsetq_default, Ssetq_default, 2, UNEVALLED, 0,
1293 "Set the default value of variable VAR to VALUE.\n\
1294 VAR, the variable name, is literal (not evaluated);\n\
1295 VALUE is an expression and it is evaluated.\n\
1296 The default value of a variable is seen in buffers\n\
1297 that do not have their own values for the variable.\n\
1298 \n\
1299 More generally, you can use multiple variables and values, as in\n\
1300 (setq-default SYMBOL VALUE SYMBOL VALUE...)\n\
1301 This sets each SYMBOL's default value to the corresponding VALUE.\n\
1302 The VALUE for the Nth SYMBOL can refer to the new default values\n\
1303 of previous SYMs.")
1304 (args)
1305 Lisp_Object args;
1306 {
1307 register Lisp_Object args_left;
1308 register Lisp_Object val, symbol;
1309 struct gcpro gcpro1;
1310
1311 if (NILP (args))
1312 return Qnil;
1313
1314 args_left = args;
1315 GCPRO1 (args);
1316
1317 do
1318 {
1319 val = Feval (Fcar (Fcdr (args_left)));
1320 symbol = Fcar (args_left);
1321 Fset_default (symbol, val);
1322 args_left = Fcdr (Fcdr (args_left));
1323 }
1324 while (!NILP (args_left));
1325
1326 UNGCPRO;
1327 return val;
1328 }
1329 \f
1330 /* Lisp functions for creating and removing buffer-local variables. */
1331
1332 DEFUN ("make-variable-buffer-local", Fmake_variable_buffer_local, Smake_variable_buffer_local,
1333 1, 1, "vMake Variable Buffer Local: ",
1334 "Make VARIABLE become buffer-local whenever it is set.\n\
1335 At any time, the value for the current buffer is in effect,\n\
1336 unless the variable has never been set in this buffer,\n\
1337 in which case the default value is in effect.\n\
1338 Note that binding the variable with `let', or setting it while\n\
1339 a `let'-style binding made in this buffer is in effect,\n\
1340 does not make the variable buffer-local.\n\
1341 \n\
1342 The function `default-value' gets the default value and `set-default' sets it.")
1343 (variable)
1344 register Lisp_Object variable;
1345 {
1346 register Lisp_Object tem, valcontents, newval;
1347
1348 CHECK_SYMBOL (variable, 0);
1349
1350 valcontents = XSYMBOL (variable)->value;
1351 if (EQ (variable, Qnil) || EQ (variable, Qt) || KBOARD_OBJFWDP (valcontents))
1352 error ("Symbol %s may not be buffer-local", XSYMBOL (variable)->name->data);
1353
1354 if (BUFFER_LOCAL_VALUEP (valcontents) || BUFFER_OBJFWDP (valcontents))
1355 return variable;
1356 if (SOME_BUFFER_LOCAL_VALUEP (valcontents))
1357 {
1358 XMISCTYPE (XSYMBOL (variable)->value) = Lisp_Misc_Buffer_Local_Value;
1359 return variable;
1360 }
1361 if (EQ (valcontents, Qunbound))
1362 XSYMBOL (variable)->value = Qnil;
1363 tem = Fcons (Qnil, Fsymbol_value (variable));
1364 XCAR (tem) = tem;
1365 newval = allocate_misc ();
1366 XMISCTYPE (newval) = Lisp_Misc_Buffer_Local_Value;
1367 XBUFFER_LOCAL_VALUE (newval)->realvalue = XSYMBOL (variable)->value;
1368 XBUFFER_LOCAL_VALUE (newval)->buffer = Fcurrent_buffer ();
1369 XBUFFER_LOCAL_VALUE (newval)->frame = Qnil;
1370 XBUFFER_LOCAL_VALUE (newval)->found_for_buffer = 0;
1371 XBUFFER_LOCAL_VALUE (newval)->found_for_frame = 0;
1372 XBUFFER_LOCAL_VALUE (newval)->check_frame = 0;
1373 XBUFFER_LOCAL_VALUE (newval)->cdr = tem;
1374 XSYMBOL (variable)->value = newval;
1375 return variable;
1376 }
1377
1378 DEFUN ("make-local-variable", Fmake_local_variable, Smake_local_variable,
1379 1, 1, "vMake Local Variable: ",
1380 "Make VARIABLE have a separate value in the current buffer.\n\
1381 Other buffers will continue to share a common default value.\n\
1382 \(The buffer-local value of VARIABLE starts out as the same value\n\
1383 VARIABLE previously had. If VARIABLE was void, it remains void.\)\n\
1384 See also `make-variable-buffer-local'.\n\
1385 \n\
1386 If the variable is already arranged to become local when set,\n\
1387 this function causes a local value to exist for this buffer,\n\
1388 just as setting the variable would do.\n\
1389 \n\
1390 This function returns VARIABLE, and therefore\n\
1391 (set (make-local-variable 'VARIABLE) VALUE-EXP)\n\
1392 works.\n\
1393 \n\
1394 Do not use `make-local-variable' to make a hook variable buffer-local.\n\
1395 Use `make-local-hook' instead.")
1396 (variable)
1397 register Lisp_Object variable;
1398 {
1399 register Lisp_Object tem, valcontents;
1400
1401 CHECK_SYMBOL (variable, 0);
1402
1403 valcontents = XSYMBOL (variable)->value;
1404 if (EQ (variable, Qnil) || EQ (variable, Qt) || KBOARD_OBJFWDP (valcontents))
1405 error ("Symbol %s may not be buffer-local", XSYMBOL (variable)->name->data);
1406
1407 if (BUFFER_LOCAL_VALUEP (valcontents) || BUFFER_OBJFWDP (valcontents))
1408 {
1409 tem = Fboundp (variable);
1410
1411 /* Make sure the symbol has a local value in this particular buffer,
1412 by setting it to the same value it already has. */
1413 Fset (variable, (EQ (tem, Qt) ? Fsymbol_value (variable) : Qunbound));
1414 return variable;
1415 }
1416 /* Make sure symbol is set up to hold per-buffer values. */
1417 if (!SOME_BUFFER_LOCAL_VALUEP (valcontents))
1418 {
1419 Lisp_Object newval;
1420 tem = Fcons (Qnil, do_symval_forwarding (valcontents));
1421 XCAR (tem) = tem;
1422 newval = allocate_misc ();
1423 XMISCTYPE (newval) = Lisp_Misc_Some_Buffer_Local_Value;
1424 XBUFFER_LOCAL_VALUE (newval)->realvalue = XSYMBOL (variable)->value;
1425 XBUFFER_LOCAL_VALUE (newval)->buffer = Qnil;
1426 XBUFFER_LOCAL_VALUE (newval)->frame = Qnil;
1427 XBUFFER_LOCAL_VALUE (newval)->found_for_buffer = 0;
1428 XBUFFER_LOCAL_VALUE (newval)->found_for_frame = 0;
1429 XBUFFER_LOCAL_VALUE (newval)->check_frame = 0;
1430 XBUFFER_LOCAL_VALUE (newval)->cdr = tem;
1431 XSYMBOL (variable)->value = newval;
1432 }
1433 /* Make sure this buffer has its own value of symbol. */
1434 tem = Fassq (variable, current_buffer->local_var_alist);
1435 if (NILP (tem))
1436 {
1437 /* Swap out any local binding for some other buffer, and make
1438 sure the current value is permanently recorded, if it's the
1439 default value. */
1440 find_symbol_value (variable);
1441
1442 current_buffer->local_var_alist
1443 = Fcons (Fcons (variable, XCDR (XBUFFER_LOCAL_VALUE (XSYMBOL (variable)->value)->cdr)),
1444 current_buffer->local_var_alist);
1445
1446 /* Make sure symbol does not think it is set up for this buffer;
1447 force it to look once again for this buffer's value. */
1448 {
1449 Lisp_Object *pvalbuf;
1450
1451 valcontents = XSYMBOL (variable)->value;
1452
1453 pvalbuf = &XBUFFER_LOCAL_VALUE (valcontents)->buffer;
1454 if (current_buffer == XBUFFER (*pvalbuf))
1455 *pvalbuf = Qnil;
1456 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
1457 }
1458 }
1459
1460 /* If the symbol forwards into a C variable, then load the binding
1461 for this buffer now. If C code modifies the variable before we
1462 load the binding in, then that new value will clobber the default
1463 binding the next time we unload it. */
1464 valcontents = XBUFFER_LOCAL_VALUE (XSYMBOL (variable)->value)->realvalue;
1465 if (INTFWDP (valcontents) || BOOLFWDP (valcontents) || OBJFWDP (valcontents))
1466 swap_in_symval_forwarding (variable, XSYMBOL (variable)->value);
1467
1468 return variable;
1469 }
1470
1471 DEFUN ("kill-local-variable", Fkill_local_variable, Skill_local_variable,
1472 1, 1, "vKill Local Variable: ",
1473 "Make VARIABLE no longer have a separate value in the current buffer.\n\
1474 From now on the default value will apply in this buffer.")
1475 (variable)
1476 register Lisp_Object variable;
1477 {
1478 register Lisp_Object tem, valcontents;
1479
1480 CHECK_SYMBOL (variable, 0);
1481
1482 valcontents = XSYMBOL (variable)->value;
1483
1484 if (BUFFER_OBJFWDP (valcontents))
1485 {
1486 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1487 int idx = PER_BUFFER_IDX (offset);
1488
1489 if (idx > 0)
1490 {
1491 SET_PER_BUFFER_VALUE_P (current_buffer, idx, 0);
1492 PER_BUFFER_VALUE (current_buffer, offset)
1493 = PER_BUFFER_DEFAULT (offset);
1494 }
1495 return variable;
1496 }
1497
1498 if (!BUFFER_LOCAL_VALUEP (valcontents)
1499 && !SOME_BUFFER_LOCAL_VALUEP (valcontents))
1500 return variable;
1501
1502 /* Get rid of this buffer's alist element, if any. */
1503
1504 tem = Fassq (variable, current_buffer->local_var_alist);
1505 if (!NILP (tem))
1506 current_buffer->local_var_alist
1507 = Fdelq (tem, current_buffer->local_var_alist);
1508
1509 /* If the symbol is set up with the current buffer's binding
1510 loaded, recompute its value. We have to do it now, or else
1511 forwarded objects won't work right. */
1512 {
1513 Lisp_Object *pvalbuf;
1514 valcontents = XSYMBOL (variable)->value;
1515 pvalbuf = &XBUFFER_LOCAL_VALUE (valcontents)->buffer;
1516 if (current_buffer == XBUFFER (*pvalbuf))
1517 {
1518 *pvalbuf = Qnil;
1519 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
1520 find_symbol_value (variable);
1521 }
1522 }
1523
1524 return variable;
1525 }
1526
1527 /* Lisp functions for creating and removing buffer-local variables. */
1528
1529 DEFUN ("make-variable-frame-local", Fmake_variable_frame_local, Smake_variable_frame_local,
1530 1, 1, "vMake Variable Frame Local: ",
1531 "Enable VARIABLE to have frame-local bindings.\n\
1532 When a frame-local binding exists in the current frame,\n\
1533 it is in effect whenever the current buffer has no buffer-local binding.\n\
1534 A frame-local binding is actual a frame parameter value;\n\
1535 thus, any given frame has a local binding for VARIABLE\n\
1536 if it has a value for the frame parameter named VARIABLE.\n\
1537 See `modify-frame-parameters'.")
1538 (variable)
1539 register Lisp_Object variable;
1540 {
1541 register Lisp_Object tem, valcontents, newval;
1542
1543 CHECK_SYMBOL (variable, 0);
1544
1545 valcontents = XSYMBOL (variable)->value;
1546 if (EQ (variable, Qnil) || EQ (variable, Qt) || KBOARD_OBJFWDP (valcontents)
1547 || BUFFER_OBJFWDP (valcontents))
1548 error ("Symbol %s may not be frame-local", XSYMBOL (variable)->name->data);
1549
1550 if (BUFFER_LOCAL_VALUEP (valcontents)
1551 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1552 {
1553 XBUFFER_LOCAL_VALUE (valcontents)->check_frame = 1;
1554 return variable;
1555 }
1556
1557 if (EQ (valcontents, Qunbound))
1558 XSYMBOL (variable)->value = Qnil;
1559 tem = Fcons (Qnil, Fsymbol_value (variable));
1560 XCAR (tem) = tem;
1561 newval = allocate_misc ();
1562 XMISCTYPE (newval) = Lisp_Misc_Some_Buffer_Local_Value;
1563 XBUFFER_LOCAL_VALUE (newval)->realvalue = XSYMBOL (variable)->value;
1564 XBUFFER_LOCAL_VALUE (newval)->buffer = Qnil;
1565 XBUFFER_LOCAL_VALUE (newval)->frame = Qnil;
1566 XBUFFER_LOCAL_VALUE (newval)->found_for_buffer = 0;
1567 XBUFFER_LOCAL_VALUE (newval)->found_for_frame = 0;
1568 XBUFFER_LOCAL_VALUE (newval)->check_frame = 1;
1569 XBUFFER_LOCAL_VALUE (newval)->cdr = tem;
1570 XSYMBOL (variable)->value = newval;
1571 return variable;
1572 }
1573
1574 DEFUN ("local-variable-p", Flocal_variable_p, Slocal_variable_p,
1575 1, 2, 0,
1576 "Non-nil if VARIABLE has a local binding in buffer BUFFER.\n\
1577 BUFFER defaults to the current buffer.")
1578 (variable, buffer)
1579 register Lisp_Object variable, buffer;
1580 {
1581 Lisp_Object valcontents;
1582 register struct buffer *buf;
1583
1584 if (NILP (buffer))
1585 buf = current_buffer;
1586 else
1587 {
1588 CHECK_BUFFER (buffer, 0);
1589 buf = XBUFFER (buffer);
1590 }
1591
1592 CHECK_SYMBOL (variable, 0);
1593
1594 valcontents = XSYMBOL (variable)->value;
1595 if (BUFFER_LOCAL_VALUEP (valcontents)
1596 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1597 {
1598 Lisp_Object tail, elt;
1599 for (tail = buf->local_var_alist; CONSP (tail); tail = XCDR (tail))
1600 {
1601 elt = XCAR (tail);
1602 if (EQ (variable, XCAR (elt)))
1603 return Qt;
1604 }
1605 }
1606 if (BUFFER_OBJFWDP (valcontents))
1607 {
1608 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1609 int idx = PER_BUFFER_IDX (offset);
1610 if (idx == -1 || PER_BUFFER_VALUE_P (buf, idx))
1611 return Qt;
1612 }
1613 return Qnil;
1614 }
1615
1616 DEFUN ("local-variable-if-set-p", Flocal_variable_if_set_p, Slocal_variable_if_set_p,
1617 1, 2, 0,
1618 "Non-nil if VARIABLE will be local in buffer BUFFER if it is set there.\n\
1619 BUFFER defaults to the current buffer.")
1620 (variable, buffer)
1621 register Lisp_Object variable, buffer;
1622 {
1623 Lisp_Object valcontents;
1624 register struct buffer *buf;
1625
1626 if (NILP (buffer))
1627 buf = current_buffer;
1628 else
1629 {
1630 CHECK_BUFFER (buffer, 0);
1631 buf = XBUFFER (buffer);
1632 }
1633
1634 CHECK_SYMBOL (variable, 0);
1635
1636 valcontents = XSYMBOL (variable)->value;
1637
1638 /* This means that make-variable-buffer-local was done. */
1639 if (BUFFER_LOCAL_VALUEP (valcontents))
1640 return Qt;
1641 /* All these slots become local if they are set. */
1642 if (BUFFER_OBJFWDP (valcontents))
1643 return Qt;
1644 if (SOME_BUFFER_LOCAL_VALUEP (valcontents))
1645 {
1646 Lisp_Object tail, elt;
1647 for (tail = buf->local_var_alist; CONSP (tail); tail = XCDR (tail))
1648 {
1649 elt = XCAR (tail);
1650 if (EQ (variable, XCAR (elt)))
1651 return Qt;
1652 }
1653 }
1654 return Qnil;
1655 }
1656 \f
1657 /* Find the function at the end of a chain of symbol function indirections. */
1658
1659 /* If OBJECT is a symbol, find the end of its function chain and
1660 return the value found there. If OBJECT is not a symbol, just
1661 return it. If there is a cycle in the function chain, signal a
1662 cyclic-function-indirection error.
1663
1664 This is like Findirect_function, except that it doesn't signal an
1665 error if the chain ends up unbound. */
1666 Lisp_Object
1667 indirect_function (object)
1668 register Lisp_Object object;
1669 {
1670 Lisp_Object tortoise, hare;
1671
1672 hare = tortoise = object;
1673
1674 for (;;)
1675 {
1676 if (!SYMBOLP (hare) || EQ (hare, Qunbound))
1677 break;
1678 hare = XSYMBOL (hare)->function;
1679 if (!SYMBOLP (hare) || EQ (hare, Qunbound))
1680 break;
1681 hare = XSYMBOL (hare)->function;
1682
1683 tortoise = XSYMBOL (tortoise)->function;
1684
1685 if (EQ (hare, tortoise))
1686 Fsignal (Qcyclic_function_indirection, Fcons (object, Qnil));
1687 }
1688
1689 return hare;
1690 }
1691
1692 DEFUN ("indirect-function", Findirect_function, Sindirect_function, 1, 1, 0,
1693 "Return the function at the end of OBJECT's function chain.\n\
1694 If OBJECT is a symbol, follow all function indirections and return the final\n\
1695 function binding.\n\
1696 If OBJECT is not a symbol, just return it.\n\
1697 Signal a void-function error if the final symbol is unbound.\n\
1698 Signal a cyclic-function-indirection error if there is a loop in the\n\
1699 function chain of symbols.")
1700 (object)
1701 register Lisp_Object object;
1702 {
1703 Lisp_Object result;
1704
1705 result = indirect_function (object);
1706
1707 if (EQ (result, Qunbound))
1708 return Fsignal (Qvoid_function, Fcons (object, Qnil));
1709 return result;
1710 }
1711 \f
1712 /* Extract and set vector and string elements */
1713
1714 DEFUN ("aref", Faref, Saref, 2, 2, 0,
1715 "Return the element of ARRAY at index IDX.\n\
1716 ARRAY may be a vector, a string, a char-table, a bool-vector,\n\
1717 or a byte-code object. IDX starts at 0.")
1718 (array, idx)
1719 register Lisp_Object array;
1720 Lisp_Object idx;
1721 {
1722 register int idxval;
1723
1724 CHECK_NUMBER (idx, 1);
1725 idxval = XINT (idx);
1726 if (STRINGP (array))
1727 {
1728 int c, idxval_byte;
1729
1730 if (idxval < 0 || idxval >= XSTRING (array)->size)
1731 args_out_of_range (array, idx);
1732 if (! STRING_MULTIBYTE (array))
1733 return make_number ((unsigned char) XSTRING (array)->data[idxval]);
1734 idxval_byte = string_char_to_byte (array, idxval);
1735
1736 c = STRING_CHAR (&XSTRING (array)->data[idxval_byte],
1737 STRING_BYTES (XSTRING (array)) - idxval_byte);
1738 return make_number (c);
1739 }
1740 else if (BOOL_VECTOR_P (array))
1741 {
1742 int val;
1743
1744 if (idxval < 0 || idxval >= XBOOL_VECTOR (array)->size)
1745 args_out_of_range (array, idx);
1746
1747 val = (unsigned char) XBOOL_VECTOR (array)->data[idxval / BITS_PER_CHAR];
1748 return (val & (1 << (idxval % BITS_PER_CHAR)) ? Qt : Qnil);
1749 }
1750 else if (CHAR_TABLE_P (array))
1751 {
1752 Lisp_Object val;
1753
1754 if (idxval < 0)
1755 args_out_of_range (array, idx);
1756 if (idxval < CHAR_TABLE_ORDINARY_SLOTS)
1757 {
1758 /* For ASCII and 8-bit European characters, the element is
1759 stored in the top table. */
1760 val = XCHAR_TABLE (array)->contents[idxval];
1761 if (NILP (val))
1762 val = XCHAR_TABLE (array)->defalt;
1763 while (NILP (val)) /* Follow parents until we find some value. */
1764 {
1765 array = XCHAR_TABLE (array)->parent;
1766 if (NILP (array))
1767 return Qnil;
1768 val = XCHAR_TABLE (array)->contents[idxval];
1769 if (NILP (val))
1770 val = XCHAR_TABLE (array)->defalt;
1771 }
1772 return val;
1773 }
1774 else
1775 {
1776 int code[4], i;
1777 Lisp_Object sub_table;
1778
1779 SPLIT_CHAR (idxval, code[0], code[1], code[2]);
1780 if (code[1] < 32) code[1] = -1;
1781 else if (code[2] < 32) code[2] = -1;
1782
1783 /* Here, the possible range of CODE[0] (== charset ID) is
1784 128..MAX_CHARSET. Since the top level char table contains
1785 data for multibyte characters after 256th element, we must
1786 increment CODE[0] by 128 to get a correct index. */
1787 code[0] += 128;
1788 code[3] = -1; /* anchor */
1789
1790 try_parent_char_table:
1791 sub_table = array;
1792 for (i = 0; code[i] >= 0; i++)
1793 {
1794 val = XCHAR_TABLE (sub_table)->contents[code[i]];
1795 if (SUB_CHAR_TABLE_P (val))
1796 sub_table = val;
1797 else
1798 {
1799 if (NILP (val))
1800 val = XCHAR_TABLE (sub_table)->defalt;
1801 if (NILP (val))
1802 {
1803 array = XCHAR_TABLE (array)->parent;
1804 if (!NILP (array))
1805 goto try_parent_char_table;
1806 }
1807 return val;
1808 }
1809 }
1810 /* Here, VAL is a sub char table. We try the default value
1811 and parent. */
1812 val = XCHAR_TABLE (val)->defalt;
1813 if (NILP (val))
1814 {
1815 array = XCHAR_TABLE (array)->parent;
1816 if (!NILP (array))
1817 goto try_parent_char_table;
1818 }
1819 return val;
1820 }
1821 }
1822 else
1823 {
1824 int size;
1825 if (VECTORP (array))
1826 size = XVECTOR (array)->size;
1827 else if (COMPILEDP (array))
1828 size = XVECTOR (array)->size & PSEUDOVECTOR_SIZE_MASK;
1829 else
1830 wrong_type_argument (Qarrayp, array);
1831
1832 if (idxval < 0 || idxval >= size)
1833 args_out_of_range (array, idx);
1834 return XVECTOR (array)->contents[idxval];
1835 }
1836 }
1837
1838 /* Don't use alloca for relocating string data larger than this, lest
1839 we overflow their stack. The value is the same as what used in
1840 fns.c for base64 handling. */
1841 #define MAX_ALLOCA 16*1024
1842
1843 DEFUN ("aset", Faset, Saset, 3, 3, 0,
1844 "Store into the element of ARRAY at index IDX the value NEWELT.\n\
1845 ARRAY may be a vector, a string, a char-table or a bool-vector.\n\
1846 IDX starts at 0.")
1847 (array, idx, newelt)
1848 register Lisp_Object array;
1849 Lisp_Object idx, newelt;
1850 {
1851 register int idxval;
1852
1853 CHECK_NUMBER (idx, 1);
1854 idxval = XINT (idx);
1855 if (!VECTORP (array) && !STRINGP (array) && !BOOL_VECTOR_P (array)
1856 && ! CHAR_TABLE_P (array))
1857 array = wrong_type_argument (Qarrayp, array);
1858 CHECK_IMPURE (array);
1859
1860 if (VECTORP (array))
1861 {
1862 if (idxval < 0 || idxval >= XVECTOR (array)->size)
1863 args_out_of_range (array, idx);
1864 XVECTOR (array)->contents[idxval] = newelt;
1865 }
1866 else if (BOOL_VECTOR_P (array))
1867 {
1868 int val;
1869
1870 if (idxval < 0 || idxval >= XBOOL_VECTOR (array)->size)
1871 args_out_of_range (array, idx);
1872
1873 val = (unsigned char) XBOOL_VECTOR (array)->data[idxval / BITS_PER_CHAR];
1874
1875 if (! NILP (newelt))
1876 val |= 1 << (idxval % BITS_PER_CHAR);
1877 else
1878 val &= ~(1 << (idxval % BITS_PER_CHAR));
1879 XBOOL_VECTOR (array)->data[idxval / BITS_PER_CHAR] = val;
1880 }
1881 else if (CHAR_TABLE_P (array))
1882 {
1883 if (idxval < 0)
1884 args_out_of_range (array, idx);
1885 if (idxval < CHAR_TABLE_ORDINARY_SLOTS)
1886 XCHAR_TABLE (array)->contents[idxval] = newelt;
1887 else
1888 {
1889 int code[4], i;
1890 Lisp_Object val;
1891
1892 SPLIT_CHAR (idxval, code[0], code[1], code[2]);
1893 if (code[1] < 32) code[1] = -1;
1894 else if (code[2] < 32) code[2] = -1;
1895
1896 /* See the comment of the corresponding part in Faref. */
1897 code[0] += 128;
1898 code[3] = -1; /* anchor */
1899 for (i = 0; code[i + 1] >= 0; i++)
1900 {
1901 val = XCHAR_TABLE (array)->contents[code[i]];
1902 if (SUB_CHAR_TABLE_P (val))
1903 array = val;
1904 else
1905 {
1906 Lisp_Object temp;
1907
1908 /* VAL is a leaf. Create a sub char table with the
1909 default value VAL or XCHAR_TABLE (array)->defalt
1910 and look into it. */
1911
1912 temp = make_sub_char_table (NILP (val)
1913 ? XCHAR_TABLE (array)->defalt
1914 : val);
1915 XCHAR_TABLE (array)->contents[code[i]] = temp;
1916 array = temp;
1917 }
1918 }
1919 XCHAR_TABLE (array)->contents[code[i]] = newelt;
1920 }
1921 }
1922 else if (STRING_MULTIBYTE (array))
1923 {
1924 int idxval_byte, prev_bytes, new_bytes;
1925 unsigned char workbuf[MAX_MULTIBYTE_LENGTH], *p0 = workbuf, *p1;
1926
1927 if (idxval < 0 || idxval >= XSTRING (array)->size)
1928 args_out_of_range (array, idx);
1929 CHECK_NUMBER (newelt, 2);
1930
1931 idxval_byte = string_char_to_byte (array, idxval);
1932 p1 = &XSTRING (array)->data[idxval_byte];
1933 PARSE_MULTIBYTE_SEQ (p1, nbytes - idxval_byte, prev_bytes);
1934 new_bytes = CHAR_STRING (XINT (newelt), p0);
1935 if (prev_bytes != new_bytes)
1936 {
1937 /* We must relocate the string data. */
1938 int nchars = XSTRING (array)->size;
1939 int nbytes = STRING_BYTES (XSTRING (array));
1940 unsigned char *str;
1941
1942 str = (nbytes <= MAX_ALLOCA
1943 ? (unsigned char *) alloca (nbytes)
1944 : (unsigned char *) xmalloc (nbytes));
1945 bcopy (XSTRING (array)->data, str, nbytes);
1946 allocate_string_data (XSTRING (array), nchars,
1947 nbytes + new_bytes - prev_bytes);
1948 bcopy (str, XSTRING (array)->data, idxval_byte);
1949 p1 = XSTRING (array)->data + idxval_byte;
1950 bcopy (str + idxval_byte + prev_bytes, p1 + new_bytes,
1951 nbytes - (idxval_byte + prev_bytes));
1952 if (nbytes > MAX_ALLOCA)
1953 xfree (str);
1954 clear_string_char_byte_cache ();
1955 }
1956 while (new_bytes--)
1957 *p1++ = *p0++;
1958 }
1959 else
1960 {
1961 if (idxval < 0 || idxval >= XSTRING (array)->size)
1962 args_out_of_range (array, idx);
1963 CHECK_NUMBER (newelt, 2);
1964
1965 if (XINT (newelt) < 0 || SINGLE_BYTE_CHAR_P (XINT (newelt)))
1966 XSTRING (array)->data[idxval] = XINT (newelt);
1967 else
1968 {
1969 /* We must relocate the string data while converting it to
1970 multibyte. */
1971 int idxval_byte, prev_bytes, new_bytes;
1972 unsigned char workbuf[MAX_MULTIBYTE_LENGTH], *p0 = workbuf, *p1;
1973 unsigned char *origstr = XSTRING (array)->data, *str;
1974 int nchars, nbytes;
1975
1976 nchars = XSTRING (array)->size;
1977 nbytes = idxval_byte = count_size_as_multibyte (origstr, idxval);
1978 nbytes += count_size_as_multibyte (origstr + idxval,
1979 nchars - idxval);
1980 str = (nbytes <= MAX_ALLOCA
1981 ? (unsigned char *) alloca (nbytes)
1982 : (unsigned char *) xmalloc (nbytes));
1983 copy_text (XSTRING (array)->data, str, nchars, 0, 1);
1984 PARSE_MULTIBYTE_SEQ (str + idxval_byte, nbytes - idxval_byte,
1985 prev_bytes);
1986 new_bytes = CHAR_STRING (XINT (newelt), p0);
1987 allocate_string_data (XSTRING (array), nchars,
1988 nbytes + new_bytes - prev_bytes);
1989 bcopy (str, XSTRING (array)->data, idxval_byte);
1990 p1 = XSTRING (array)->data + idxval_byte;
1991 while (new_bytes--)
1992 *p1++ = *p0++;
1993 bcopy (str + idxval_byte + prev_bytes, p1,
1994 nbytes - (idxval_byte + prev_bytes));
1995 if (nbytes > MAX_ALLOCA)
1996 xfree (str);
1997 clear_string_char_byte_cache ();
1998 }
1999 }
2000
2001 return newelt;
2002 }
2003 \f
2004 /* Arithmetic functions */
2005
2006 enum comparison { equal, notequal, less, grtr, less_or_equal, grtr_or_equal };
2007
2008 Lisp_Object
2009 arithcompare (num1, num2, comparison)
2010 Lisp_Object num1, num2;
2011 enum comparison comparison;
2012 {
2013 double f1, f2;
2014 int floatp = 0;
2015
2016 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num1, 0);
2017 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num2, 0);
2018
2019 if (FLOATP (num1) || FLOATP (num2))
2020 {
2021 floatp = 1;
2022 f1 = (FLOATP (num1)) ? XFLOAT_DATA (num1) : XINT (num1);
2023 f2 = (FLOATP (num2)) ? XFLOAT_DATA (num2) : XINT (num2);
2024 }
2025
2026 switch (comparison)
2027 {
2028 case equal:
2029 if (floatp ? f1 == f2 : XINT (num1) == XINT (num2))
2030 return Qt;
2031 return Qnil;
2032
2033 case notequal:
2034 if (floatp ? f1 != f2 : XINT (num1) != XINT (num2))
2035 return Qt;
2036 return Qnil;
2037
2038 case less:
2039 if (floatp ? f1 < f2 : XINT (num1) < XINT (num2))
2040 return Qt;
2041 return Qnil;
2042
2043 case less_or_equal:
2044 if (floatp ? f1 <= f2 : XINT (num1) <= XINT (num2))
2045 return Qt;
2046 return Qnil;
2047
2048 case grtr:
2049 if (floatp ? f1 > f2 : XINT (num1) > XINT (num2))
2050 return Qt;
2051 return Qnil;
2052
2053 case grtr_or_equal:
2054 if (floatp ? f1 >= f2 : XINT (num1) >= XINT (num2))
2055 return Qt;
2056 return Qnil;
2057
2058 default:
2059 abort ();
2060 }
2061 }
2062
2063 DEFUN ("=", Feqlsign, Seqlsign, 2, 2, 0,
2064 "Return t if two args, both numbers or markers, are equal.")
2065 (num1, num2)
2066 register Lisp_Object num1, num2;
2067 {
2068 return arithcompare (num1, num2, equal);
2069 }
2070
2071 DEFUN ("<", Flss, Slss, 2, 2, 0,
2072 "Return t if first arg is less than second arg. Both must be numbers or markers.")
2073 (num1, num2)
2074 register Lisp_Object num1, num2;
2075 {
2076 return arithcompare (num1, num2, less);
2077 }
2078
2079 DEFUN (">", Fgtr, Sgtr, 2, 2, 0,
2080 "Return t if first arg is greater than second arg. Both must be numbers or markers.")
2081 (num1, num2)
2082 register Lisp_Object num1, num2;
2083 {
2084 return arithcompare (num1, num2, grtr);
2085 }
2086
2087 DEFUN ("<=", Fleq, Sleq, 2, 2, 0,
2088 "Return t if first arg is less than or equal to second arg.\n\
2089 Both must be numbers or markers.")
2090 (num1, num2)
2091 register Lisp_Object num1, num2;
2092 {
2093 return arithcompare (num1, num2, less_or_equal);
2094 }
2095
2096 DEFUN (">=", Fgeq, Sgeq, 2, 2, 0,
2097 "Return t if first arg is greater than or equal to second arg.\n\
2098 Both must be numbers or markers.")
2099 (num1, num2)
2100 register Lisp_Object num1, num2;
2101 {
2102 return arithcompare (num1, num2, grtr_or_equal);
2103 }
2104
2105 DEFUN ("/=", Fneq, Sneq, 2, 2, 0,
2106 "Return t if first arg is not equal to second arg. Both must be numbers or markers.")
2107 (num1, num2)
2108 register Lisp_Object num1, num2;
2109 {
2110 return arithcompare (num1, num2, notequal);
2111 }
2112
2113 DEFUN ("zerop", Fzerop, Szerop, 1, 1, 0, "Return t if NUMBER is zero.")
2114 (number)
2115 register Lisp_Object number;
2116 {
2117 CHECK_NUMBER_OR_FLOAT (number, 0);
2118
2119 if (FLOATP (number))
2120 {
2121 if (XFLOAT_DATA (number) == 0.0)
2122 return Qt;
2123 return Qnil;
2124 }
2125
2126 if (!XINT (number))
2127 return Qt;
2128 return Qnil;
2129 }
2130 \f
2131 /* Convert between long values and pairs of Lisp integers. */
2132
2133 Lisp_Object
2134 long_to_cons (i)
2135 unsigned long i;
2136 {
2137 unsigned int top = i >> 16;
2138 unsigned int bot = i & 0xFFFF;
2139 if (top == 0)
2140 return make_number (bot);
2141 if (top == (unsigned long)-1 >> 16)
2142 return Fcons (make_number (-1), make_number (bot));
2143 return Fcons (make_number (top), make_number (bot));
2144 }
2145
2146 unsigned long
2147 cons_to_long (c)
2148 Lisp_Object c;
2149 {
2150 Lisp_Object top, bot;
2151 if (INTEGERP (c))
2152 return XINT (c);
2153 top = XCAR (c);
2154 bot = XCDR (c);
2155 if (CONSP (bot))
2156 bot = XCAR (bot);
2157 return ((XINT (top) << 16) | XINT (bot));
2158 }
2159 \f
2160 DEFUN ("number-to-string", Fnumber_to_string, Snumber_to_string, 1, 1, 0,
2161 "Convert NUMBER to a string by printing it in decimal.\n\
2162 Uses a minus sign if negative.\n\
2163 NUMBER may be an integer or a floating point number.")
2164 (number)
2165 Lisp_Object number;
2166 {
2167 char buffer[VALBITS];
2168
2169 CHECK_NUMBER_OR_FLOAT (number, 0);
2170
2171 if (FLOATP (number))
2172 {
2173 char pigbuf[350]; /* see comments in float_to_string */
2174
2175 float_to_string (pigbuf, XFLOAT_DATA (number));
2176 return build_string (pigbuf);
2177 }
2178
2179 if (sizeof (int) == sizeof (EMACS_INT))
2180 sprintf (buffer, "%d", XINT (number));
2181 else if (sizeof (long) == sizeof (EMACS_INT))
2182 sprintf (buffer, "%ld", (long) XINT (number));
2183 else
2184 abort ();
2185 return build_string (buffer);
2186 }
2187
2188 INLINE static int
2189 digit_to_number (character, base)
2190 int character, base;
2191 {
2192 int digit;
2193
2194 if (character >= '0' && character <= '9')
2195 digit = character - '0';
2196 else if (character >= 'a' && character <= 'z')
2197 digit = character - 'a' + 10;
2198 else if (character >= 'A' && character <= 'Z')
2199 digit = character - 'A' + 10;
2200 else
2201 return -1;
2202
2203 if (digit >= base)
2204 return -1;
2205 else
2206 return digit;
2207 }
2208
2209 DEFUN ("string-to-number", Fstring_to_number, Sstring_to_number, 1, 2, 0,
2210 "Convert STRING to a number by parsing it as a decimal number.\n\
2211 This parses both integers and floating point numbers.\n\
2212 It ignores leading spaces and tabs.\n\
2213 \n\
2214 If BASE, interpret STRING as a number in that base. If BASE isn't\n\
2215 present, base 10 is used. BASE must be between 2 and 16 (inclusive).\n\
2216 If the base used is not 10, floating point is not recognized.")
2217 (string, base)
2218 register Lisp_Object string, base;
2219 {
2220 register unsigned char *p;
2221 register int b;
2222 int sign = 1;
2223 Lisp_Object val;
2224
2225 CHECK_STRING (string, 0);
2226
2227 if (NILP (base))
2228 b = 10;
2229 else
2230 {
2231 CHECK_NUMBER (base, 1);
2232 b = XINT (base);
2233 if (b < 2 || b > 16)
2234 Fsignal (Qargs_out_of_range, Fcons (base, Qnil));
2235 }
2236
2237 /* Skip any whitespace at the front of the number. Some versions of
2238 atoi do this anyway, so we might as well make Emacs lisp consistent. */
2239 p = XSTRING (string)->data;
2240 while (*p == ' ' || *p == '\t')
2241 p++;
2242
2243 if (*p == '-')
2244 {
2245 sign = -1;
2246 p++;
2247 }
2248 else if (*p == '+')
2249 p++;
2250
2251 if (isfloat_string (p) && b == 10)
2252 val = make_float (sign * atof (p));
2253 else
2254 {
2255 double v = 0;
2256
2257 while (1)
2258 {
2259 int digit = digit_to_number (*p++, b);
2260 if (digit < 0)
2261 break;
2262 v = v * b + digit;
2263 }
2264
2265 if (v > (EMACS_UINT) (VALMASK >> 1))
2266 val = make_float (sign * v);
2267 else
2268 val = make_number (sign * (int) v);
2269 }
2270
2271 return val;
2272 }
2273
2274 \f
2275 enum arithop
2276 { Aadd, Asub, Amult, Adiv, Alogand, Alogior, Alogxor, Amax, Amin };
2277
2278 extern Lisp_Object float_arith_driver ();
2279 extern Lisp_Object fmod_float ();
2280
2281 Lisp_Object
2282 arith_driver (code, nargs, args)
2283 enum arithop code;
2284 int nargs;
2285 register Lisp_Object *args;
2286 {
2287 register Lisp_Object val;
2288 register int argnum;
2289 register EMACS_INT accum;
2290 register EMACS_INT next;
2291
2292 switch (SWITCH_ENUM_CAST (code))
2293 {
2294 case Alogior:
2295 case Alogxor:
2296 case Aadd:
2297 case Asub:
2298 accum = 0; break;
2299 case Amult:
2300 accum = 1; break;
2301 case Alogand:
2302 accum = -1; break;
2303 }
2304
2305 for (argnum = 0; argnum < nargs; argnum++)
2306 {
2307 val = args[argnum]; /* using args[argnum] as argument to CHECK_NUMBER_... */
2308 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val, argnum);
2309
2310 if (FLOATP (val)) /* time to do serious math */
2311 return (float_arith_driver ((double) accum, argnum, code,
2312 nargs, args));
2313 args[argnum] = val; /* runs into a compiler bug. */
2314 next = XINT (args[argnum]);
2315 switch (SWITCH_ENUM_CAST (code))
2316 {
2317 case Aadd: accum += next; break;
2318 case Asub:
2319 accum = argnum ? accum - next : nargs == 1 ? - next : next;
2320 break;
2321 case Amult: accum *= next; break;
2322 case Adiv:
2323 if (!argnum) accum = next;
2324 else
2325 {
2326 if (next == 0)
2327 Fsignal (Qarith_error, Qnil);
2328 accum /= next;
2329 }
2330 break;
2331 case Alogand: accum &= next; break;
2332 case Alogior: accum |= next; break;
2333 case Alogxor: accum ^= next; break;
2334 case Amax: if (!argnum || next > accum) accum = next; break;
2335 case Amin: if (!argnum || next < accum) accum = next; break;
2336 }
2337 }
2338
2339 XSETINT (val, accum);
2340 return val;
2341 }
2342
2343 #undef isnan
2344 #define isnan(x) ((x) != (x))
2345
2346 Lisp_Object
2347 float_arith_driver (accum, argnum, code, nargs, args)
2348 double accum;
2349 register int argnum;
2350 enum arithop code;
2351 int nargs;
2352 register Lisp_Object *args;
2353 {
2354 register Lisp_Object val;
2355 double next;
2356
2357 for (; argnum < nargs; argnum++)
2358 {
2359 val = args[argnum]; /* using args[argnum] as argument to CHECK_NUMBER_... */
2360 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val, argnum);
2361
2362 if (FLOATP (val))
2363 {
2364 next = XFLOAT_DATA (val);
2365 }
2366 else
2367 {
2368 args[argnum] = val; /* runs into a compiler bug. */
2369 next = XINT (args[argnum]);
2370 }
2371 switch (SWITCH_ENUM_CAST (code))
2372 {
2373 case Aadd:
2374 accum += next;
2375 break;
2376 case Asub:
2377 accum = argnum ? accum - next : nargs == 1 ? - next : next;
2378 break;
2379 case Amult:
2380 accum *= next;
2381 break;
2382 case Adiv:
2383 if (!argnum)
2384 accum = next;
2385 else
2386 {
2387 if (! IEEE_FLOATING_POINT && next == 0)
2388 Fsignal (Qarith_error, Qnil);
2389 accum /= next;
2390 }
2391 break;
2392 case Alogand:
2393 case Alogior:
2394 case Alogxor:
2395 return wrong_type_argument (Qinteger_or_marker_p, val);
2396 case Amax:
2397 if (!argnum || isnan (next) || next > accum)
2398 accum = next;
2399 break;
2400 case Amin:
2401 if (!argnum || isnan (next) || next < accum)
2402 accum = next;
2403 break;
2404 }
2405 }
2406
2407 return make_float (accum);
2408 }
2409
2410
2411 DEFUN ("+", Fplus, Splus, 0, MANY, 0,
2412 "Return sum of any number of arguments, which are numbers or markers.")
2413 (nargs, args)
2414 int nargs;
2415 Lisp_Object *args;
2416 {
2417 return arith_driver (Aadd, nargs, args);
2418 }
2419
2420 DEFUN ("-", Fminus, Sminus, 0, MANY, 0,
2421 "Negate number or subtract numbers or markers.\n\
2422 With one arg, negates it. With more than one arg,\n\
2423 subtracts all but the first from the first.")
2424 (nargs, args)
2425 int nargs;
2426 Lisp_Object *args;
2427 {
2428 return arith_driver (Asub, nargs, args);
2429 }
2430
2431 DEFUN ("*", Ftimes, Stimes, 0, MANY, 0,
2432 "Returns product of any number of arguments, which are numbers or markers.")
2433 (nargs, args)
2434 int nargs;
2435 Lisp_Object *args;
2436 {
2437 return arith_driver (Amult, nargs, args);
2438 }
2439
2440 DEFUN ("/", Fquo, Squo, 2, MANY, 0,
2441 "Returns first argument divided by all the remaining arguments.\n\
2442 The arguments must be numbers or markers.")
2443 (nargs, args)
2444 int nargs;
2445 Lisp_Object *args;
2446 {
2447 return arith_driver (Adiv, nargs, args);
2448 }
2449
2450 DEFUN ("%", Frem, Srem, 2, 2, 0,
2451 "Returns remainder of X divided by Y.\n\
2452 Both must be integers or markers.")
2453 (x, y)
2454 register Lisp_Object x, y;
2455 {
2456 Lisp_Object val;
2457
2458 CHECK_NUMBER_COERCE_MARKER (x, 0);
2459 CHECK_NUMBER_COERCE_MARKER (y, 1);
2460
2461 if (XFASTINT (y) == 0)
2462 Fsignal (Qarith_error, Qnil);
2463
2464 XSETINT (val, XINT (x) % XINT (y));
2465 return val;
2466 }
2467
2468 #ifndef HAVE_FMOD
2469 double
2470 fmod (f1, f2)
2471 double f1, f2;
2472 {
2473 double r = f1;
2474
2475 if (f2 < 0.0)
2476 f2 = -f2;
2477
2478 /* If the magnitude of the result exceeds that of the divisor, or
2479 the sign of the result does not agree with that of the dividend,
2480 iterate with the reduced value. This does not yield a
2481 particularly accurate result, but at least it will be in the
2482 range promised by fmod. */
2483 do
2484 r -= f2 * floor (r / f2);
2485 while (f2 <= (r < 0 ? -r : r) || ((r < 0) != (f1 < 0) && ! isnan (r)));
2486
2487 return r;
2488 }
2489 #endif /* ! HAVE_FMOD */
2490
2491 DEFUN ("mod", Fmod, Smod, 2, 2, 0,
2492 "Returns X modulo Y.\n\
2493 The result falls between zero (inclusive) and Y (exclusive).\n\
2494 Both X and Y must be numbers or markers.")
2495 (x, y)
2496 register Lisp_Object x, y;
2497 {
2498 Lisp_Object val;
2499 EMACS_INT i1, i2;
2500
2501 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (x, 0);
2502 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (y, 1);
2503
2504 if (FLOATP (x) || FLOATP (y))
2505 return fmod_float (x, y);
2506
2507 i1 = XINT (x);
2508 i2 = XINT (y);
2509
2510 if (i2 == 0)
2511 Fsignal (Qarith_error, Qnil);
2512
2513 i1 %= i2;
2514
2515 /* If the "remainder" comes out with the wrong sign, fix it. */
2516 if (i2 < 0 ? i1 > 0 : i1 < 0)
2517 i1 += i2;
2518
2519 XSETINT (val, i1);
2520 return val;
2521 }
2522
2523 DEFUN ("max", Fmax, Smax, 1, MANY, 0,
2524 "Return largest of all the arguments (which must be numbers or markers).\n\
2525 The value is always a number; markers are converted to numbers.")
2526 (nargs, args)
2527 int nargs;
2528 Lisp_Object *args;
2529 {
2530 return arith_driver (Amax, nargs, args);
2531 }
2532
2533 DEFUN ("min", Fmin, Smin, 1, MANY, 0,
2534 "Return smallest of all the arguments (which must be numbers or markers).\n\
2535 The value is always a number; markers are converted to numbers.")
2536 (nargs, args)
2537 int nargs;
2538 Lisp_Object *args;
2539 {
2540 return arith_driver (Amin, nargs, args);
2541 }
2542
2543 DEFUN ("logand", Flogand, Slogand, 0, MANY, 0,
2544 "Return bitwise-and of all the arguments.\n\
2545 Arguments may be integers, or markers converted to integers.")
2546 (nargs, args)
2547 int nargs;
2548 Lisp_Object *args;
2549 {
2550 return arith_driver (Alogand, nargs, args);
2551 }
2552
2553 DEFUN ("logior", Flogior, Slogior, 0, MANY, 0,
2554 "Return bitwise-or of all the arguments.\n\
2555 Arguments may be integers, or markers converted to integers.")
2556 (nargs, args)
2557 int nargs;
2558 Lisp_Object *args;
2559 {
2560 return arith_driver (Alogior, nargs, args);
2561 }
2562
2563 DEFUN ("logxor", Flogxor, Slogxor, 0, MANY, 0,
2564 "Return bitwise-exclusive-or of all the arguments.\n\
2565 Arguments may be integers, or markers converted to integers.")
2566 (nargs, args)
2567 int nargs;
2568 Lisp_Object *args;
2569 {
2570 return arith_driver (Alogxor, nargs, args);
2571 }
2572
2573 DEFUN ("ash", Fash, Sash, 2, 2, 0,
2574 "Return VALUE with its bits shifted left by COUNT.\n\
2575 If COUNT is negative, shifting is actually to the right.\n\
2576 In this case, the sign bit is duplicated.")
2577 (value, count)
2578 register Lisp_Object value, count;
2579 {
2580 register Lisp_Object val;
2581
2582 CHECK_NUMBER (value, 0);
2583 CHECK_NUMBER (count, 1);
2584
2585 if (XINT (count) >= BITS_PER_EMACS_INT)
2586 XSETINT (val, 0);
2587 else if (XINT (count) > 0)
2588 XSETINT (val, XINT (value) << XFASTINT (count));
2589 else if (XINT (count) <= -BITS_PER_EMACS_INT)
2590 XSETINT (val, XINT (value) < 0 ? -1 : 0);
2591 else
2592 XSETINT (val, XINT (value) >> -XINT (count));
2593 return val;
2594 }
2595
2596 DEFUN ("lsh", Flsh, Slsh, 2, 2, 0,
2597 "Return VALUE with its bits shifted left by COUNT.\n\
2598 If COUNT is negative, shifting is actually to the right.\n\
2599 In this case, zeros are shifted in on the left.")
2600 (value, count)
2601 register Lisp_Object value, count;
2602 {
2603 register Lisp_Object val;
2604
2605 CHECK_NUMBER (value, 0);
2606 CHECK_NUMBER (count, 1);
2607
2608 if (XINT (count) >= BITS_PER_EMACS_INT)
2609 XSETINT (val, 0);
2610 else if (XINT (count) > 0)
2611 XSETINT (val, (EMACS_UINT) XUINT (value) << XFASTINT (count));
2612 else if (XINT (count) <= -BITS_PER_EMACS_INT)
2613 XSETINT (val, 0);
2614 else
2615 XSETINT (val, (EMACS_UINT) XUINT (value) >> -XINT (count));
2616 return val;
2617 }
2618
2619 DEFUN ("1+", Fadd1, Sadd1, 1, 1, 0,
2620 "Return NUMBER plus one. NUMBER may be a number or a marker.\n\
2621 Markers are converted to integers.")
2622 (number)
2623 register Lisp_Object number;
2624 {
2625 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number, 0);
2626
2627 if (FLOATP (number))
2628 return (make_float (1.0 + XFLOAT_DATA (number)));
2629
2630 XSETINT (number, XINT (number) + 1);
2631 return number;
2632 }
2633
2634 DEFUN ("1-", Fsub1, Ssub1, 1, 1, 0,
2635 "Return NUMBER minus one. NUMBER may be a number or a marker.\n\
2636 Markers are converted to integers.")
2637 (number)
2638 register Lisp_Object number;
2639 {
2640 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number, 0);
2641
2642 if (FLOATP (number))
2643 return (make_float (-1.0 + XFLOAT_DATA (number)));
2644
2645 XSETINT (number, XINT (number) - 1);
2646 return number;
2647 }
2648
2649 DEFUN ("lognot", Flognot, Slognot, 1, 1, 0,
2650 "Return the bitwise complement of NUMBER. NUMBER must be an integer.")
2651 (number)
2652 register Lisp_Object number;
2653 {
2654 CHECK_NUMBER (number, 0);
2655 XSETINT (number, ~XINT (number));
2656 return number;
2657 }
2658 \f
2659 void
2660 syms_of_data ()
2661 {
2662 Lisp_Object error_tail, arith_tail;
2663
2664 Qquote = intern ("quote");
2665 Qlambda = intern ("lambda");
2666 Qsubr = intern ("subr");
2667 Qerror_conditions = intern ("error-conditions");
2668 Qerror_message = intern ("error-message");
2669 Qtop_level = intern ("top-level");
2670
2671 Qerror = intern ("error");
2672 Qquit = intern ("quit");
2673 Qwrong_type_argument = intern ("wrong-type-argument");
2674 Qargs_out_of_range = intern ("args-out-of-range");
2675 Qvoid_function = intern ("void-function");
2676 Qcyclic_function_indirection = intern ("cyclic-function-indirection");
2677 Qvoid_variable = intern ("void-variable");
2678 Qsetting_constant = intern ("setting-constant");
2679 Qinvalid_read_syntax = intern ("invalid-read-syntax");
2680
2681 Qinvalid_function = intern ("invalid-function");
2682 Qwrong_number_of_arguments = intern ("wrong-number-of-arguments");
2683 Qno_catch = intern ("no-catch");
2684 Qend_of_file = intern ("end-of-file");
2685 Qarith_error = intern ("arith-error");
2686 Qbeginning_of_buffer = intern ("beginning-of-buffer");
2687 Qend_of_buffer = intern ("end-of-buffer");
2688 Qbuffer_read_only = intern ("buffer-read-only");
2689 Qtext_read_only = intern ("text-read-only");
2690 Qmark_inactive = intern ("mark-inactive");
2691
2692 Qlistp = intern ("listp");
2693 Qconsp = intern ("consp");
2694 Qsymbolp = intern ("symbolp");
2695 Qkeywordp = intern ("keywordp");
2696 Qintegerp = intern ("integerp");
2697 Qnatnump = intern ("natnump");
2698 Qwholenump = intern ("wholenump");
2699 Qstringp = intern ("stringp");
2700 Qarrayp = intern ("arrayp");
2701 Qsequencep = intern ("sequencep");
2702 Qbufferp = intern ("bufferp");
2703 Qvectorp = intern ("vectorp");
2704 Qchar_or_string_p = intern ("char-or-string-p");
2705 Qmarkerp = intern ("markerp");
2706 Qbuffer_or_string_p = intern ("buffer-or-string-p");
2707 Qinteger_or_marker_p = intern ("integer-or-marker-p");
2708 Qboundp = intern ("boundp");
2709 Qfboundp = intern ("fboundp");
2710
2711 Qfloatp = intern ("floatp");
2712 Qnumberp = intern ("numberp");
2713 Qnumber_or_marker_p = intern ("number-or-marker-p");
2714
2715 Qchar_table_p = intern ("char-table-p");
2716 Qvector_or_char_table_p = intern ("vector-or-char-table-p");
2717
2718 Qsubrp = intern ("subrp");
2719 Qunevalled = intern ("unevalled");
2720 Qmany = intern ("many");
2721
2722 Qcdr = intern ("cdr");
2723
2724 /* Handle automatic advice activation */
2725 Qad_advice_info = intern ("ad-advice-info");
2726 Qad_activate_internal = intern ("ad-activate-internal");
2727
2728 error_tail = Fcons (Qerror, Qnil);
2729
2730 /* ERROR is used as a signaler for random errors for which nothing else is right */
2731
2732 Fput (Qerror, Qerror_conditions,
2733 error_tail);
2734 Fput (Qerror, Qerror_message,
2735 build_string ("error"));
2736
2737 Fput (Qquit, Qerror_conditions,
2738 Fcons (Qquit, Qnil));
2739 Fput (Qquit, Qerror_message,
2740 build_string ("Quit"));
2741
2742 Fput (Qwrong_type_argument, Qerror_conditions,
2743 Fcons (Qwrong_type_argument, error_tail));
2744 Fput (Qwrong_type_argument, Qerror_message,
2745 build_string ("Wrong type argument"));
2746
2747 Fput (Qargs_out_of_range, Qerror_conditions,
2748 Fcons (Qargs_out_of_range, error_tail));
2749 Fput (Qargs_out_of_range, Qerror_message,
2750 build_string ("Args out of range"));
2751
2752 Fput (Qvoid_function, Qerror_conditions,
2753 Fcons (Qvoid_function, error_tail));
2754 Fput (Qvoid_function, Qerror_message,
2755 build_string ("Symbol's function definition is void"));
2756
2757 Fput (Qcyclic_function_indirection, Qerror_conditions,
2758 Fcons (Qcyclic_function_indirection, error_tail));
2759 Fput (Qcyclic_function_indirection, Qerror_message,
2760 build_string ("Symbol's chain of function indirections contains a loop"));
2761
2762 Fput (Qvoid_variable, Qerror_conditions,
2763 Fcons (Qvoid_variable, error_tail));
2764 Fput (Qvoid_variable, Qerror_message,
2765 build_string ("Symbol's value as variable is void"));
2766
2767 Fput (Qsetting_constant, Qerror_conditions,
2768 Fcons (Qsetting_constant, error_tail));
2769 Fput (Qsetting_constant, Qerror_message,
2770 build_string ("Attempt to set a constant symbol"));
2771
2772 Fput (Qinvalid_read_syntax, Qerror_conditions,
2773 Fcons (Qinvalid_read_syntax, error_tail));
2774 Fput (Qinvalid_read_syntax, Qerror_message,
2775 build_string ("Invalid read syntax"));
2776
2777 Fput (Qinvalid_function, Qerror_conditions,
2778 Fcons (Qinvalid_function, error_tail));
2779 Fput (Qinvalid_function, Qerror_message,
2780 build_string ("Invalid function"));
2781
2782 Fput (Qwrong_number_of_arguments, Qerror_conditions,
2783 Fcons (Qwrong_number_of_arguments, error_tail));
2784 Fput (Qwrong_number_of_arguments, Qerror_message,
2785 build_string ("Wrong number of arguments"));
2786
2787 Fput (Qno_catch, Qerror_conditions,
2788 Fcons (Qno_catch, error_tail));
2789 Fput (Qno_catch, Qerror_message,
2790 build_string ("No catch for tag"));
2791
2792 Fput (Qend_of_file, Qerror_conditions,
2793 Fcons (Qend_of_file, error_tail));
2794 Fput (Qend_of_file, Qerror_message,
2795 build_string ("End of file during parsing"));
2796
2797 arith_tail = Fcons (Qarith_error, error_tail);
2798 Fput (Qarith_error, Qerror_conditions,
2799 arith_tail);
2800 Fput (Qarith_error, Qerror_message,
2801 build_string ("Arithmetic error"));
2802
2803 Fput (Qbeginning_of_buffer, Qerror_conditions,
2804 Fcons (Qbeginning_of_buffer, error_tail));
2805 Fput (Qbeginning_of_buffer, Qerror_message,
2806 build_string ("Beginning of buffer"));
2807
2808 Fput (Qend_of_buffer, Qerror_conditions,
2809 Fcons (Qend_of_buffer, error_tail));
2810 Fput (Qend_of_buffer, Qerror_message,
2811 build_string ("End of buffer"));
2812
2813 Fput (Qbuffer_read_only, Qerror_conditions,
2814 Fcons (Qbuffer_read_only, error_tail));
2815 Fput (Qbuffer_read_only, Qerror_message,
2816 build_string ("Buffer is read-only"));
2817
2818 Fput (Qtext_read_only, Qerror_conditions,
2819 Fcons (Qtext_read_only, error_tail));
2820 Fput (Qtext_read_only, Qerror_message,
2821 build_string ("Text is read-only"));
2822
2823 Qrange_error = intern ("range-error");
2824 Qdomain_error = intern ("domain-error");
2825 Qsingularity_error = intern ("singularity-error");
2826 Qoverflow_error = intern ("overflow-error");
2827 Qunderflow_error = intern ("underflow-error");
2828
2829 Fput (Qdomain_error, Qerror_conditions,
2830 Fcons (Qdomain_error, arith_tail));
2831 Fput (Qdomain_error, Qerror_message,
2832 build_string ("Arithmetic domain error"));
2833
2834 Fput (Qrange_error, Qerror_conditions,
2835 Fcons (Qrange_error, arith_tail));
2836 Fput (Qrange_error, Qerror_message,
2837 build_string ("Arithmetic range error"));
2838
2839 Fput (Qsingularity_error, Qerror_conditions,
2840 Fcons (Qsingularity_error, Fcons (Qdomain_error, arith_tail)));
2841 Fput (Qsingularity_error, Qerror_message,
2842 build_string ("Arithmetic singularity error"));
2843
2844 Fput (Qoverflow_error, Qerror_conditions,
2845 Fcons (Qoverflow_error, Fcons (Qdomain_error, arith_tail)));
2846 Fput (Qoverflow_error, Qerror_message,
2847 build_string ("Arithmetic overflow error"));
2848
2849 Fput (Qunderflow_error, Qerror_conditions,
2850 Fcons (Qunderflow_error, Fcons (Qdomain_error, arith_tail)));
2851 Fput (Qunderflow_error, Qerror_message,
2852 build_string ("Arithmetic underflow error"));
2853
2854 staticpro (&Qrange_error);
2855 staticpro (&Qdomain_error);
2856 staticpro (&Qsingularity_error);
2857 staticpro (&Qoverflow_error);
2858 staticpro (&Qunderflow_error);
2859
2860 staticpro (&Qnil);
2861 staticpro (&Qt);
2862 staticpro (&Qquote);
2863 staticpro (&Qlambda);
2864 staticpro (&Qsubr);
2865 staticpro (&Qunbound);
2866 staticpro (&Qerror_conditions);
2867 staticpro (&Qerror_message);
2868 staticpro (&Qtop_level);
2869
2870 staticpro (&Qerror);
2871 staticpro (&Qquit);
2872 staticpro (&Qwrong_type_argument);
2873 staticpro (&Qargs_out_of_range);
2874 staticpro (&Qvoid_function);
2875 staticpro (&Qcyclic_function_indirection);
2876 staticpro (&Qvoid_variable);
2877 staticpro (&Qsetting_constant);
2878 staticpro (&Qinvalid_read_syntax);
2879 staticpro (&Qwrong_number_of_arguments);
2880 staticpro (&Qinvalid_function);
2881 staticpro (&Qno_catch);
2882 staticpro (&Qend_of_file);
2883 staticpro (&Qarith_error);
2884 staticpro (&Qbeginning_of_buffer);
2885 staticpro (&Qend_of_buffer);
2886 staticpro (&Qbuffer_read_only);
2887 staticpro (&Qtext_read_only);
2888 staticpro (&Qmark_inactive);
2889
2890 staticpro (&Qlistp);
2891 staticpro (&Qconsp);
2892 staticpro (&Qsymbolp);
2893 staticpro (&Qkeywordp);
2894 staticpro (&Qintegerp);
2895 staticpro (&Qnatnump);
2896 staticpro (&Qwholenump);
2897 staticpro (&Qstringp);
2898 staticpro (&Qarrayp);
2899 staticpro (&Qsequencep);
2900 staticpro (&Qbufferp);
2901 staticpro (&Qvectorp);
2902 staticpro (&Qchar_or_string_p);
2903 staticpro (&Qmarkerp);
2904 staticpro (&Qbuffer_or_string_p);
2905 staticpro (&Qinteger_or_marker_p);
2906 staticpro (&Qfloatp);
2907 staticpro (&Qnumberp);
2908 staticpro (&Qnumber_or_marker_p);
2909 staticpro (&Qchar_table_p);
2910 staticpro (&Qvector_or_char_table_p);
2911 staticpro (&Qsubrp);
2912 staticpro (&Qmany);
2913 staticpro (&Qunevalled);
2914
2915 staticpro (&Qboundp);
2916 staticpro (&Qfboundp);
2917 staticpro (&Qcdr);
2918 staticpro (&Qad_advice_info);
2919 staticpro (&Qad_activate_internal);
2920
2921 /* Types that type-of returns. */
2922 Qinteger = intern ("integer");
2923 Qsymbol = intern ("symbol");
2924 Qstring = intern ("string");
2925 Qcons = intern ("cons");
2926 Qmarker = intern ("marker");
2927 Qoverlay = intern ("overlay");
2928 Qfloat = intern ("float");
2929 Qwindow_configuration = intern ("window-configuration");
2930 Qprocess = intern ("process");
2931 Qwindow = intern ("window");
2932 /* Qsubr = intern ("subr"); */
2933 Qcompiled_function = intern ("compiled-function");
2934 Qbuffer = intern ("buffer");
2935 Qframe = intern ("frame");
2936 Qvector = intern ("vector");
2937 Qchar_table = intern ("char-table");
2938 Qbool_vector = intern ("bool-vector");
2939 Qhash_table = intern ("hash-table");
2940
2941 staticpro (&Qinteger);
2942 staticpro (&Qsymbol);
2943 staticpro (&Qstring);
2944 staticpro (&Qcons);
2945 staticpro (&Qmarker);
2946 staticpro (&Qoverlay);
2947 staticpro (&Qfloat);
2948 staticpro (&Qwindow_configuration);
2949 staticpro (&Qprocess);
2950 staticpro (&Qwindow);
2951 /* staticpro (&Qsubr); */
2952 staticpro (&Qcompiled_function);
2953 staticpro (&Qbuffer);
2954 staticpro (&Qframe);
2955 staticpro (&Qvector);
2956 staticpro (&Qchar_table);
2957 staticpro (&Qbool_vector);
2958 staticpro (&Qhash_table);
2959
2960 defsubr (&Seq);
2961 defsubr (&Snull);
2962 defsubr (&Stype_of);
2963 defsubr (&Slistp);
2964 defsubr (&Snlistp);
2965 defsubr (&Sconsp);
2966 defsubr (&Satom);
2967 defsubr (&Sintegerp);
2968 defsubr (&Sinteger_or_marker_p);
2969 defsubr (&Snumberp);
2970 defsubr (&Snumber_or_marker_p);
2971 defsubr (&Sfloatp);
2972 defsubr (&Snatnump);
2973 defsubr (&Ssymbolp);
2974 defsubr (&Skeywordp);
2975 defsubr (&Sstringp);
2976 defsubr (&Smultibyte_string_p);
2977 defsubr (&Svectorp);
2978 defsubr (&Schar_table_p);
2979 defsubr (&Svector_or_char_table_p);
2980 defsubr (&Sbool_vector_p);
2981 defsubr (&Sarrayp);
2982 defsubr (&Ssequencep);
2983 defsubr (&Sbufferp);
2984 defsubr (&Smarkerp);
2985 defsubr (&Ssubrp);
2986 defsubr (&Sbyte_code_function_p);
2987 defsubr (&Schar_or_string_p);
2988 defsubr (&Scar);
2989 defsubr (&Scdr);
2990 defsubr (&Scar_safe);
2991 defsubr (&Scdr_safe);
2992 defsubr (&Ssetcar);
2993 defsubr (&Ssetcdr);
2994 defsubr (&Ssymbol_function);
2995 defsubr (&Sindirect_function);
2996 defsubr (&Ssymbol_plist);
2997 defsubr (&Ssymbol_name);
2998 defsubr (&Smakunbound);
2999 defsubr (&Sfmakunbound);
3000 defsubr (&Sboundp);
3001 defsubr (&Sfboundp);
3002 defsubr (&Sfset);
3003 defsubr (&Sdefalias);
3004 defsubr (&Ssetplist);
3005 defsubr (&Ssymbol_value);
3006 defsubr (&Sset);
3007 defsubr (&Sdefault_boundp);
3008 defsubr (&Sdefault_value);
3009 defsubr (&Sset_default);
3010 defsubr (&Ssetq_default);
3011 defsubr (&Smake_variable_buffer_local);
3012 defsubr (&Smake_local_variable);
3013 defsubr (&Skill_local_variable);
3014 defsubr (&Smake_variable_frame_local);
3015 defsubr (&Slocal_variable_p);
3016 defsubr (&Slocal_variable_if_set_p);
3017 defsubr (&Saref);
3018 defsubr (&Saset);
3019 defsubr (&Snumber_to_string);
3020 defsubr (&Sstring_to_number);
3021 defsubr (&Seqlsign);
3022 defsubr (&Slss);
3023 defsubr (&Sgtr);
3024 defsubr (&Sleq);
3025 defsubr (&Sgeq);
3026 defsubr (&Sneq);
3027 defsubr (&Szerop);
3028 defsubr (&Splus);
3029 defsubr (&Sminus);
3030 defsubr (&Stimes);
3031 defsubr (&Squo);
3032 defsubr (&Srem);
3033 defsubr (&Smod);
3034 defsubr (&Smax);
3035 defsubr (&Smin);
3036 defsubr (&Slogand);
3037 defsubr (&Slogior);
3038 defsubr (&Slogxor);
3039 defsubr (&Slsh);
3040 defsubr (&Sash);
3041 defsubr (&Sadd1);
3042 defsubr (&Ssub1);
3043 defsubr (&Slognot);
3044 defsubr (&Ssubr_arity);
3045
3046 XSYMBOL (Qwholenump)->function = XSYMBOL (Qnatnump)->function;
3047 }
3048
3049 SIGTYPE
3050 arith_error (signo)
3051 int signo;
3052 {
3053 #if defined(USG) && !defined(POSIX_SIGNALS)
3054 /* USG systems forget handlers when they are used;
3055 must reestablish each time */
3056 signal (signo, arith_error);
3057 #endif /* USG */
3058 #ifdef VMS
3059 /* VMS systems are like USG. */
3060 signal (signo, arith_error);
3061 #endif /* VMS */
3062 #ifdef BSD4_1
3063 sigrelse (SIGFPE);
3064 #else /* not BSD4_1 */
3065 sigsetmask (SIGEMPTYMASK);
3066 #endif /* not BSD4_1 */
3067
3068 Fsignal (Qarith_error, Qnil);
3069 }
3070
3071 void
3072 init_data ()
3073 {
3074 /* Don't do this if just dumping out.
3075 We don't want to call `signal' in this case
3076 so that we don't have trouble with dumping
3077 signal-delivering routines in an inconsistent state. */
3078 #ifndef CANNOT_DUMP
3079 if (!initialized)
3080 return;
3081 #endif /* CANNOT_DUMP */
3082 signal (SIGFPE, arith_error);
3083
3084 #ifdef uts
3085 signal (SIGEMT, arith_error);
3086 #endif /* uts */
3087 }