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