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