Mercurial > hg > xemacs-beta
comparison src/data.c @ 272:c5d627a313b1 r21-0b34
Import from CVS: tag r21-0b34
author | cvs |
---|---|
date | Mon, 13 Aug 2007 10:28:48 +0200 |
parents | 11cf20601dec |
children | 6330739388db |
comparison
equal
deleted
inserted
replaced
271:c7b7086b0a39 | 272:c5d627a313b1 |
---|---|
27 #include <config.h> | 27 #include <config.h> |
28 #include "lisp.h" | 28 #include "lisp.h" |
29 | 29 |
30 #include "buffer.h" | 30 #include "buffer.h" |
31 #include "bytecode.h" | 31 #include "bytecode.h" |
32 | |
33 #include "syssignal.h" | 32 #include "syssignal.h" |
33 | |
34 #ifdef LISP_FLOAT_TYPE | 34 #ifdef LISP_FLOAT_TYPE |
35 /* Need to define a differentiating symbol -- see sysfloat.h */ | 35 /* Need to define a differentiating symbol -- see sysfloat.h */ |
36 # define THIS_FILENAME data_c | 36 # define THIS_FILENAME data_c |
37 # include "sysfloat.h" | 37 # include "sysfloat.h" |
38 #endif /* LISP_FLOAT_TYPE */ | 38 #endif /* LISP_FLOAT_TYPE */ |
39 | 39 |
40 Lisp_Object Qnil, Qt, Qquote, Qlambda, Qunbound; | 40 Lisp_Object Qnil, Qt, Qquote, Qlambda, Qunbound; |
41 Lisp_Object Qerror_conditions, Qerror_message, Qtop_level; | 41 Lisp_Object Qerror_conditions, Qerror_message; |
42 Lisp_Object Qsignal, Qerror, Qquit, Qwrong_type_argument, Qargs_out_of_range; | 42 Lisp_Object Qerror, Qquit, Qwrong_type_argument, Qargs_out_of_range; |
43 Lisp_Object Qvoid_variable, Qcyclic_variable_indirection; | 43 Lisp_Object Qvoid_variable, Qcyclic_variable_indirection; |
44 Lisp_Object Qvoid_function, Qcyclic_function_indirection; | 44 Lisp_Object Qvoid_function, Qcyclic_function_indirection; |
45 Lisp_Object Qsetting_constant, Qinvalid_read_syntax; | 45 Lisp_Object Qsetting_constant, Qinvalid_read_syntax; |
46 Lisp_Object Qmalformed_list, Qmalformed_property_list; | 46 Lisp_Object Qmalformed_list, Qmalformed_property_list; |
47 Lisp_Object Qcircular_list, Qcircular_property_list; | 47 Lisp_Object Qcircular_list, Qcircular_property_list; |
48 Lisp_Object Qinvalid_function, Qwrong_number_of_arguments, Qno_catch; | 48 Lisp_Object Qinvalid_function, Qwrong_number_of_arguments, Qno_catch; |
49 Lisp_Object Qio_error, Qend_of_file; | 49 Lisp_Object Qio_error, Qend_of_file; |
50 Lisp_Object Qarith_error, Qrange_error, Qdomain_error; | 50 Lisp_Object Qarith_error, Qrange_error, Qdomain_error; |
51 Lisp_Object Qsingularity_error, Qoverflow_error, Qunderflow_error; | 51 Lisp_Object Qsingularity_error, Qoverflow_error, Qunderflow_error; |
52 Lisp_Object Qbeginning_of_buffer, Qend_of_buffer, Qbuffer_read_only; | 52 Lisp_Object Qbeginning_of_buffer, Qend_of_buffer, Qbuffer_read_only; |
53 Lisp_Object Qintegerp, Qnatnump, Qsymbolp, Qkeywordp, Qlistp, Qconsp, Qsubrp; | 53 Lisp_Object Qintegerp, Qnatnump, Qsymbolp, Qkeywordp; |
54 Lisp_Object Qcharacterp, Qstringp, Qarrayp, Qsequencep, Qbufferp; | 54 Lisp_Object Qlistp, Qtrue_list_p, Qweak_listp; |
55 Lisp_Object Qcompiled_functionp; | 55 Lisp_Object Qconsp, Qsubrp, Qcompiled_functionp; |
56 Lisp_Object Qchar_or_string_p, Qmarkerp, Qinteger_or_marker_p, Qvectorp; | 56 Lisp_Object Qcharacterp, Qstringp, Qarrayp, Qsequencep, Qvectorp; |
57 Lisp_Object Qchar_or_string_p, Qmarkerp, Qinteger_or_marker_p, Qbufferp; | |
57 Lisp_Object Qinteger_or_char_p, Qinteger_char_or_marker_p; | 58 Lisp_Object Qinteger_or_char_p, Qinteger_char_or_marker_p; |
58 Lisp_Object Qbit_vectorp, Qbitp; | 59 Lisp_Object Qnumberp, Qnumber_or_marker_p, Qnumber_char_or_marker_p; |
59 | 60 Lisp_Object Qbit_vectorp, Qbitp, Qcons, Qkeyword, Qcdr, Qignore; |
60 /* Qstring, Qinteger, Qsymbol, Qvector defined in general.c */ | |
61 Lisp_Object Qcons, Qkeyword; | |
62 | |
63 Lisp_Object Qcdr; | |
64 | |
65 Lisp_Object Qignore; | |
66 | 61 |
67 #ifdef LISP_FLOAT_TYPE | 62 #ifdef LISP_FLOAT_TYPE |
68 Lisp_Object Qfloatp; | 63 Lisp_Object Qfloatp; |
69 #endif | 64 #endif |
70 Lisp_Object Qnumberp, Qnumber_or_marker_p, Qnumber_char_or_marker_p; | |
71 | |
72 Lisp_Object Qweak_listp; | |
73 | 65 |
74 #ifdef DEBUG_XEMACS | 66 #ifdef DEBUG_XEMACS |
75 | 67 |
76 int debug_issue_ebola_notices; | 68 int debug_issue_ebola_notices; |
77 | 69 |
155 | 147 |
156 void | 148 void |
157 check_int_range (int val, int min, int max) | 149 check_int_range (int val, int min, int max) |
158 { | 150 { |
159 if (val < min || val > max) | 151 if (val < min || val > max) |
160 args_out_of_range_3 (make_int (val), make_int (min), | 152 args_out_of_range_3 (make_int (val), make_int (min), make_int (max)); |
161 make_int (max)); | 153 } |
162 } | |
163 | |
164 #ifndef make_int | |
165 Lisp_Object | |
166 make_int (EMACS_INT num) | |
167 { | |
168 Lisp_Object val; | |
169 #ifdef USE_MINIMAL_TAGBITS | |
170 XSETINT(val, num); | |
171 #else | |
172 /* Don't use XSETINT here -- it's defined in terms of make_int (). */ | |
173 XSETOBJ (val, Lisp_Type_Int, num); | |
174 #endif | |
175 return val; | |
176 } | |
177 #endif /* ! defined (make_int) */ | |
178 | 154 |
179 /* On some machines, XINT needs a temporary location. | 155 /* On some machines, XINT needs a temporary location. |
180 Here it is, in case it is needed. */ | 156 Here it is, in case it is needed. */ |
181 | 157 |
182 EMACS_INT sign_extend_temp; | 158 EMACS_INT sign_extend_temp; |
191 return num | ((-1L) << VALBITS); | 167 return num | ((-1L) << VALBITS); |
192 else | 168 else |
193 return num & ((1L << VALBITS) - 1); | 169 return num & ((1L << VALBITS) - 1); |
194 } | 170 } |
195 | 171 |
196 /* characters do not need to sign extend so there's no need for special | |
197 futzing like with ints. */ | |
198 #ifndef make_char | |
199 Lisp_Object | |
200 make_char (Emchar num) | |
201 { | |
202 Lisp_Object val; | |
203 #ifdef USE_MINIMAL_TAGBITS | |
204 XSETCHAR (val, num); | |
205 #else | |
206 XSETOBJ (val, Lisp_Type_Char, num); | |
207 #endif | |
208 return val; | |
209 } | |
210 #endif /* ! make_char */ | |
211 | 172 |
212 /* Data type predicates */ | 173 /* Data type predicates */ |
213 | 174 |
214 DEFUN ("eq", Feq, 2, 2, 0, /* | 175 DEFUN ("eq", Feq, 2, 2, 0, /* |
215 T if the two args are the same Lisp object. | 176 Return t if the two args are the same Lisp object. |
216 */ | 177 */ |
217 (obj1, obj2)) | 178 (obj1, obj2)) |
218 { | 179 { |
219 return EQ_WITH_EBOLA_NOTICE (obj1, obj2) ? Qt : Qnil; | 180 return EQ_WITH_EBOLA_NOTICE (obj1, obj2) ? Qt : Qnil; |
220 } | 181 } |
221 | 182 |
222 DEFUN ("old-eq", Fold_eq, 2, 2, 0, /* | 183 DEFUN ("old-eq", Fold_eq, 2, 2, 0, /* |
223 T if the two args are (in most cases) the same Lisp object. | 184 Return t if the two args are (in most cases) the same Lisp object. |
224 | 185 |
225 Special kludge: A character is considered `old-eq' to its equivalent integer | 186 Special kludge: A character is considered `old-eq' to its equivalent integer |
226 even though they are not the same object and are in fact of different | 187 even though they are not the same object and are in fact of different |
227 types. This is ABSOLUTELY AND UTTERLY HORRENDOUS but is necessary to | 188 types. This is ABSOLUTELY AND UTTERLY HORRENDOUS but is necessary to |
228 preserve byte-code compatibility with v19. This kludge is known as the | 189 preserve byte-code compatibility with v19. This kludge is known as the |
236 /* #### blasphemy */ | 197 /* #### blasphemy */ |
237 return HACKEQ_UNSAFE (obj1, obj2) ? Qt : Qnil; | 198 return HACKEQ_UNSAFE (obj1, obj2) ? Qt : Qnil; |
238 } | 199 } |
239 | 200 |
240 DEFUN ("null", Fnull, 1, 1, 0, /* | 201 DEFUN ("null", Fnull, 1, 1, 0, /* |
241 T if OBJECT is nil. | 202 Return t if OBJECT is nil. |
242 */ | 203 */ |
243 (object)) | 204 (object)) |
244 { | 205 { |
245 return NILP (object) ? Qt : Qnil; | 206 return NILP (object) ? Qt : Qnil; |
246 } | 207 } |
247 | 208 |
248 DEFUN ("consp", Fconsp, 1, 1, 0, /* | 209 DEFUN ("consp", Fconsp, 1, 1, 0, /* |
249 T if OBJECT is a cons cell. | 210 Return t if OBJECT is a cons cell. |
250 */ | 211 */ |
251 (object)) | 212 (object)) |
252 { | 213 { |
253 return CONSP (object) ? Qt : Qnil; | 214 return CONSP (object) ? Qt : Qnil; |
254 } | 215 } |
255 | 216 |
256 DEFUN ("atom", Fatom, 1, 1, 0, /* | 217 DEFUN ("atom", Fatom, 1, 1, 0, /* |
257 T if OBJECT is not a cons cell. This includes nil. | 218 Return t if OBJECT is not a cons cell. Atoms include nil. |
258 */ | 219 */ |
259 (object)) | 220 (object)) |
260 { | 221 { |
261 return CONSP (object) ? Qnil : Qt; | 222 return CONSP (object) ? Qnil : Qt; |
262 } | 223 } |
263 | 224 |
264 DEFUN ("listp", Flistp, 1, 1, 0, /* | 225 DEFUN ("listp", Flistp, 1, 1, 0, /* |
265 T if OBJECT is a list. This includes nil. | 226 Return t if OBJECT is a list. Lists includes nil. |
266 */ | 227 */ |
267 (object)) | 228 (object)) |
268 { | 229 { |
269 return CONSP (object) || NILP (object) ? Qt : Qnil; | 230 return LISTP (object) ? Qt : Qnil; |
270 } | 231 } |
271 | 232 |
272 DEFUN ("nlistp", Fnlistp, 1, 1, 0, /* | 233 DEFUN ("nlistp", Fnlistp, 1, 1, 0, /* |
273 T if OBJECT is not a list. Lists include nil. | 234 Return t if OBJECT is not a list. Lists include nil. |
274 */ | 235 */ |
275 (object)) | 236 (object)) |
276 { | 237 { |
277 return CONSP (object) || NILP (object) ? Qnil : Qt; | 238 return LISTP (object) ? Qnil : Qt; |
239 } | |
240 | |
241 DEFUN ("true-list-p", Ftrue_list_p, 1, 1, 0, /* | |
242 Return t if OBJECT is a non-dotted, i.e. nil-terminated, list. | |
243 */ | |
244 (object)) | |
245 { | |
246 return TRUE_LIST_P (object) ? Qt : Qnil; | |
278 } | 247 } |
279 | 248 |
280 DEFUN ("symbolp", Fsymbolp, 1, 1, 0, /* | 249 DEFUN ("symbolp", Fsymbolp, 1, 1, 0, /* |
281 T if OBJECT is a symbol. | 250 Return t if OBJECT is a symbol. |
282 */ | 251 */ |
283 (object)) | 252 (object)) |
284 { | 253 { |
285 return SYMBOLP (object) ? Qt : Qnil; | 254 return SYMBOLP (object) ? Qt : Qnil; |
286 } | 255 } |
287 | 256 |
288 DEFUN ("keywordp", Fkeywordp, 1, 1, 0, /* | 257 DEFUN ("keywordp", Fkeywordp, 1, 1, 0, /* |
289 T if OBJECT is a keyword. | 258 Return t if OBJECT is a keyword. |
290 */ | 259 */ |
291 (object)) | 260 (object)) |
292 { | 261 { |
293 return KEYWORDP (object) ? Qt : Qnil; | 262 return KEYWORDP (object) ? Qt : Qnil; |
294 } | 263 } |
295 | 264 |
296 DEFUN ("vectorp", Fvectorp, 1, 1, 0, /* | 265 DEFUN ("vectorp", Fvectorp, 1, 1, 0, /* |
297 T if OBJECT is a vector. | 266 REturn t if OBJECT is a vector. |
298 */ | 267 */ |
299 (object)) | 268 (object)) |
300 { | 269 { |
301 return VECTORP (object) ? Qt : Qnil; | 270 return VECTORP (object) ? Qt : Qnil; |
302 } | 271 } |
303 | 272 |
304 DEFUN ("bit-vector-p", Fbit_vector_p, 1, 1, 0, /* | 273 DEFUN ("bit-vector-p", Fbit_vector_p, 1, 1, 0, /* |
305 T if OBJECT is a bit vector. | 274 Return t if OBJECT is a bit vector. |
306 */ | 275 */ |
307 (object)) | 276 (object)) |
308 { | 277 { |
309 return BIT_VECTORP (object) ? Qt : Qnil; | 278 return BIT_VECTORP (object) ? Qt : Qnil; |
310 } | 279 } |
311 | 280 |
312 DEFUN ("stringp", Fstringp, 1, 1, 0, /* | 281 DEFUN ("stringp", Fstringp, 1, 1, 0, /* |
313 T if OBJECT is a string. | 282 Return t if OBJECT is a string. |
314 */ | 283 */ |
315 (object)) | 284 (object)) |
316 { | 285 { |
317 return STRINGP (object) ? Qt : Qnil; | 286 return STRINGP (object) ? Qt : Qnil; |
318 } | 287 } |
319 | 288 |
320 DEFUN ("arrayp", Farrayp, 1, 1, 0, /* | 289 DEFUN ("arrayp", Farrayp, 1, 1, 0, /* |
321 T if OBJECT is an array (string, vector, or bit vector). | 290 Return t if OBJECT is an array (string, vector, or bit vector). |
322 */ | 291 */ |
323 (object)) | 292 (object)) |
324 { | 293 { |
325 return (VECTORP (object) || | 294 return (VECTORP (object) || |
326 STRINGP (object) || | 295 STRINGP (object) || |
327 BIT_VECTORP (object)) | 296 BIT_VECTORP (object)) |
328 ? Qt : Qnil; | 297 ? Qt : Qnil; |
329 } | 298 } |
330 | 299 |
331 DEFUN ("sequencep", Fsequencep, 1, 1, 0, /* | 300 DEFUN ("sequencep", Fsequencep, 1, 1, 0, /* |
332 T if OBJECT is a sequence (list or array). | 301 Return t if OBJECT is a sequence (list or array). |
333 */ | 302 */ |
334 (object)) | 303 (object)) |
335 { | 304 { |
336 return (CONSP (object) || | 305 return (CONSP (object) || |
337 NILP (object) || | 306 NILP (object) || |
338 VECTORP (object) || | 307 VECTORP (object) || |
339 STRINGP (object) || | 308 STRINGP (object) || |
340 BIT_VECTORP (object)) | 309 BIT_VECTORP (object)) |
341 ? Qt : Qnil; | 310 ? Qt : Qnil; |
342 } | 311 } |
343 | 312 |
344 DEFUN ("markerp", Fmarkerp, 1, 1, 0, /* | 313 DEFUN ("markerp", Fmarkerp, 1, 1, 0, /* |
345 T if OBJECT is a marker (editor pointer). | 314 Return t if OBJECT is a marker (editor pointer). |
346 */ | 315 */ |
347 (object)) | 316 (object)) |
348 { | 317 { |
349 return MARKERP (object) ? Qt : Qnil; | 318 return MARKERP (object) ? Qt : Qnil; |
350 } | 319 } |
351 | 320 |
352 DEFUN ("subrp", Fsubrp, 1, 1, 0, /* | 321 DEFUN ("subrp", Fsubrp, 1, 1, 0, /* |
353 T if OBJECT is a built-in function. | 322 Return t if OBJECT is a built-in function. |
354 */ | 323 */ |
355 (object)) | 324 (object)) |
356 { | 325 { |
357 return SUBRP (object) ? Qt : Qnil; | 326 return SUBRP (object) ? Qt : Qnil; |
358 } | 327 } |
393 prompt = XSUBR (subr)->prompt; | 362 prompt = XSUBR (subr)->prompt; |
394 return prompt ? list2 (Qinteractive, build_string (prompt)) : Qnil; | 363 return prompt ? list2 (Qinteractive, build_string (prompt)) : Qnil; |
395 } | 364 } |
396 | 365 |
397 DEFUN ("compiled-function-p", Fcompiled_function_p, 1, 1, 0, /* | 366 DEFUN ("compiled-function-p", Fcompiled_function_p, 1, 1, 0, /* |
398 t if OBJECT is a byte-compiled function object. | 367 Return t if OBJECT is a byte-compiled function object. |
399 */ | 368 */ |
400 (object)) | 369 (object)) |
401 { | 370 { |
402 return COMPILED_FUNCTIONP (object) ? Qt : Qnil; | 371 return COMPILED_FUNCTIONP (object) ? Qt : Qnil; |
403 } | 372 } |
404 | 373 |
405 | 374 |
406 DEFUN ("characterp", Fcharacterp, 1, 1, 0, /* | 375 DEFUN ("characterp", Fcharacterp, 1, 1, 0, /* |
407 t if OBJECT is a character. | 376 Return t if OBJECT is a character. |
408 Unlike in XEmacs v19 and Emacs, a character is its own primitive type. | 377 Unlike in XEmacs v19 and Emacs, a character is its own primitive type. |
409 Any character can be converted into an equivalent integer using | 378 Any character can be converted into an equivalent integer using |
410 `char-to-int'. To convert the other way, use `int-to-char'; however, | 379 `char-to-int'. To convert the other way, use `int-to-char'; however, |
411 only some integers can be converted into characters. Such an integer | 380 only some integers can be converted into characters. Such an integer |
412 is called a `char-int'; see `char-int-p'. | 381 is called a `char-int'; see `char-int-p'. |
462 else | 431 else |
463 return Qnil; | 432 return Qnil; |
464 } | 433 } |
465 | 434 |
466 DEFUN ("char-int-p", Fchar_int_p, 1, 1, 0, /* | 435 DEFUN ("char-int-p", Fchar_int_p, 1, 1, 0, /* |
467 t if OBJECT is an integer that can be converted into a character. | 436 Return t if OBJECT is an integer that can be converted into a character. |
468 See `char-to-int'. | 437 See `char-to-int'. |
469 */ | 438 */ |
470 (object)) | 439 (object)) |
471 { | 440 { |
472 return CHAR_INTP (object) ? Qt : Qnil; | 441 return CHAR_INTP (object) ? Qt : Qnil; |
473 } | 442 } |
474 | 443 |
475 DEFUN ("char-or-char-int-p", Fchar_or_char_int_p, 1, 1, 0, /* | 444 DEFUN ("char-or-char-int-p", Fchar_or_char_int_p, 1, 1, 0, /* |
476 t if OBJECT is a character or an integer that can be converted into one. | 445 Return t if OBJECT is a character or an integer that can be converted into one. |
477 */ | 446 */ |
478 (object)) | 447 (object)) |
479 { | 448 { |
480 return CHAR_OR_CHAR_INTP (object) ? Qt : Qnil; | 449 return CHAR_OR_CHAR_INTP (object) ? Qt : Qnil; |
481 } | 450 } |
482 | 451 |
483 DEFUN ("char-or-string-p", Fchar_or_string_p, 1, 1, 0, /* | 452 DEFUN ("char-or-string-p", Fchar_or_string_p, 1, 1, 0, /* |
484 t if OBJECT is a character (or a char-int) or a string. | 453 Return t if OBJECT is a character (or a char-int) or a string. |
485 It is semi-hateful that we allow a char-int here, as it goes against | 454 It is semi-hateful that we allow a char-int here, as it goes against |
486 the name of this function, but it makes the most sense considering the | 455 the name of this function, but it makes the most sense considering the |
487 other steps we take to maintain compatibility with the old character/integer | 456 other steps we take to maintain compatibility with the old character/integer |
488 confoundedness in older versions of E-Lisp. | 457 confoundedness in older versions of E-Lisp. |
489 */ | 458 */ |
491 { | 460 { |
492 return CHAR_OR_CHAR_INTP (object) || STRINGP (object) ? Qt : Qnil; | 461 return CHAR_OR_CHAR_INTP (object) || STRINGP (object) ? Qt : Qnil; |
493 } | 462 } |
494 | 463 |
495 DEFUN ("integerp", Fintegerp, 1, 1, 0, /* | 464 DEFUN ("integerp", Fintegerp, 1, 1, 0, /* |
496 t if OBJECT is an integer. | 465 Return t if OBJECT is an integer. |
497 */ | 466 */ |
498 (object)) | 467 (object)) |
499 { | 468 { |
500 return INTP (object) ? Qt : Qnil; | 469 return INTP (object) ? Qt : Qnil; |
501 } | 470 } |
502 | 471 |
503 DEFUN ("integer-or-marker-p", Finteger_or_marker_p, 1, 1, 0, /* | 472 DEFUN ("integer-or-marker-p", Finteger_or_marker_p, 1, 1, 0, /* |
504 t if OBJECT is an integer or a marker (editor pointer). | 473 Return t if OBJECT is an integer or a marker (editor pointer). |
505 */ | 474 */ |
506 (object)) | 475 (object)) |
507 { | 476 { |
508 return INTP (object) || MARKERP (object) ? Qt : Qnil; | 477 return INTP (object) || MARKERP (object) ? Qt : Qnil; |
509 } | 478 } |
510 | 479 |
511 DEFUN ("integer-or-char-p", Finteger_or_char_p, 1, 1, 0, /* | 480 DEFUN ("integer-or-char-p", Finteger_or_char_p, 1, 1, 0, /* |
512 t if OBJECT is an integer or a character. | 481 Return t if OBJECT is an integer or a character. |
513 */ | 482 */ |
514 (object)) | 483 (object)) |
515 { | 484 { |
516 return INTP (object) || CHARP (object) ? Qt : Qnil; | 485 return INTP (object) || CHARP (object) ? Qt : Qnil; |
517 } | 486 } |
518 | 487 |
519 DEFUN ("integer-char-or-marker-p", Finteger_char_or_marker_p, 1, 1, 0, /* | 488 DEFUN ("integer-char-or-marker-p", Finteger_char_or_marker_p, 1, 1, 0, /* |
520 t if OBJECT is an integer, character or a marker (editor pointer). | 489 Return t if OBJECT is an integer, character or a marker (editor pointer). |
521 */ | 490 */ |
522 (object)) | 491 (object)) |
523 { | 492 { |
524 return INTP (object) || CHARP (object) || MARKERP (object) ? Qt : Qnil; | 493 return INTP (object) || CHARP (object) || MARKERP (object) ? Qt : Qnil; |
525 } | 494 } |
526 | 495 |
527 DEFUN ("natnump", Fnatnump, 1, 1, 0, /* | 496 DEFUN ("natnump", Fnatnump, 1, 1, 0, /* |
528 t if OBJECT is a nonnegative integer. | 497 Return t if OBJECT is a nonnegative integer. |
529 */ | 498 */ |
530 (object)) | 499 (object)) |
531 { | 500 { |
532 return NATNUMP (object) ? Qt : Qnil; | 501 return NATNUMP (object) ? Qt : Qnil; |
533 } | 502 } |
534 | 503 |
535 DEFUN ("bitp", Fbitp, 1, 1, 0, /* | 504 DEFUN ("bitp", Fbitp, 1, 1, 0, /* |
536 t if OBJECT is a bit (0 or 1). | 505 Return t if OBJECT is a bit (0 or 1). |
537 */ | 506 */ |
538 (object)) | 507 (object)) |
539 { | 508 { |
540 return BITP (object) ? Qt : Qnil; | 509 return BITP (object) ? Qt : Qnil; |
541 } | 510 } |
542 | 511 |
543 DEFUN ("numberp", Fnumberp, 1, 1, 0, /* | 512 DEFUN ("numberp", Fnumberp, 1, 1, 0, /* |
544 t if OBJECT is a number (floating point or integer). | 513 Return t if OBJECT is a number (floating point or integer). |
545 */ | 514 */ |
546 (object)) | 515 (object)) |
547 { | 516 { |
548 return INT_OR_FLOATP (object) ? Qt : Qnil; | 517 return INT_OR_FLOATP (object) ? Qt : Qnil; |
549 } | 518 } |
550 | 519 |
551 DEFUN ("number-or-marker-p", Fnumber_or_marker_p, 1, 1, 0, /* | 520 DEFUN ("number-or-marker-p", Fnumber_or_marker_p, 1, 1, 0, /* |
552 t if OBJECT is a number or a marker. | 521 Return t if OBJECT is a number or a marker. |
553 */ | 522 */ |
554 (object)) | 523 (object)) |
555 { | 524 { |
556 return INT_OR_FLOATP (object) || MARKERP (object) ? Qt : Qnil; | 525 return INT_OR_FLOATP (object) || MARKERP (object) ? Qt : Qnil; |
557 } | 526 } |
558 | 527 |
559 DEFUN ("number-char-or-marker-p", Fnumber_char_or_marker_p, 1, 1, 0, /* | 528 DEFUN ("number-char-or-marker-p", Fnumber_char_or_marker_p, 1, 1, 0, /* |
560 t if OBJECT is a number, character or a marker. | 529 Return t if OBJECT is a number, character or a marker. |
561 */ | 530 */ |
562 (object)) | 531 (object)) |
563 { | 532 { |
564 return (INT_OR_FLOATP (object) || | 533 return (INT_OR_FLOATP (object) || |
565 CHARP (object) || | 534 CHARP (object) || |
567 ? Qt : Qnil; | 536 ? Qt : Qnil; |
568 } | 537 } |
569 | 538 |
570 #ifdef LISP_FLOAT_TYPE | 539 #ifdef LISP_FLOAT_TYPE |
571 DEFUN ("floatp", Ffloatp, 1, 1, 0, /* | 540 DEFUN ("floatp", Ffloatp, 1, 1, 0, /* |
572 t if OBJECT is a floating point number. | 541 Return t if OBJECT is a floating point number. |
573 */ | 542 */ |
574 (object)) | 543 (object)) |
575 { | 544 { |
576 return FLOATP (object) ? Qt : Qnil; | 545 return FLOATP (object) ? Qt : Qnil; |
577 } | 546 } |
608 if (CONSP (list)) | 577 if (CONSP (list)) |
609 return XCAR (list); | 578 return XCAR (list); |
610 else if (NILP (list)) | 579 else if (NILP (list)) |
611 return Qnil; | 580 return Qnil; |
612 else | 581 else |
613 list = wrong_type_argument (Qconsp, list); | 582 list = wrong_type_argument (Qlistp, list); |
614 } | 583 } |
615 } | 584 } |
616 | 585 |
617 DEFUN ("car-safe", Fcar_safe, 1, 1, 0, /* | 586 DEFUN ("car-safe", Fcar_safe, 1, 1, 0, /* |
618 Return the car of OBJECT if it is a cons cell, or else nil. | 587 Return the car of OBJECT if it is a cons cell, or else nil. |
633 if (CONSP (list)) | 602 if (CONSP (list)) |
634 return XCDR (list); | 603 return XCDR (list); |
635 else if (NILP (list)) | 604 else if (NILP (list)) |
636 return Qnil; | 605 return Qnil; |
637 else | 606 else |
638 list = wrong_type_argument (Qconsp, list); | 607 list = wrong_type_argument (Qlistp, list); |
639 } | 608 } |
640 } | 609 } |
641 | 610 |
642 DEFUN ("cdr-safe", Fcdr_safe, 1, 1, 0, /* | 611 DEFUN ("cdr-safe", Fcdr_safe, 1, 1, 0, /* |
643 Return the cdr of OBJECT if it is a cons cell, or else nil. | 612 Return the cdr of OBJECT if it is a cons cell, else nil. |
644 */ | 613 */ |
645 (object)) | 614 (object)) |
646 { | 615 { |
647 return CONSP (object) ? XCDR (object) : Qnil; | 616 return CONSP (object) ? XCDR (object) : Qnil; |
648 } | 617 } |
649 | 618 |
650 DEFUN ("setcar", Fsetcar, 2, 2, 0, /* | 619 DEFUN ("setcar", Fsetcar, 2, 2, 0, /* |
651 Set the car of CONSCELL to be NEWCAR. Returns NEWCAR. | 620 Set the car of CONSCELL to be NEWCAR. Return NEWCAR. |
652 */ | 621 */ |
653 (conscell, newcar)) | 622 (conscell, newcar)) |
654 { | 623 { |
655 if (!CONSP (conscell)) | 624 if (!CONSP (conscell)) |
656 conscell = wrong_type_argument (Qconsp, conscell); | 625 conscell = wrong_type_argument (Qconsp, conscell); |
659 XCAR (conscell) = newcar; | 628 XCAR (conscell) = newcar; |
660 return newcar; | 629 return newcar; |
661 } | 630 } |
662 | 631 |
663 DEFUN ("setcdr", Fsetcdr, 2, 2, 0, /* | 632 DEFUN ("setcdr", Fsetcdr, 2, 2, 0, /* |
664 Set the cdr of CONSCELL to be NEWCDR. Returns NEWCDR. | 633 Set the cdr of CONSCELL to be NEWCDR. Return NEWCDR. |
665 */ | 634 */ |
666 (conscell, newcdr)) | 635 (conscell, newcdr)) |
667 { | 636 { |
668 if (!CONSP (conscell)) | 637 if (!CONSP (conscell)) |
669 conscell = wrong_type_argument (Qconsp, conscell); | 638 conscell = wrong_type_argument (Qconsp, conscell); |
751 if (idxval >= bit_vector_length (XBIT_VECTOR (array))) goto lose; | 720 if (idxval >= bit_vector_length (XBIT_VECTOR (array))) goto lose; |
752 return make_int (bit_vector_bit (XBIT_VECTOR (array), idxval)); | 721 return make_int (bit_vector_bit (XBIT_VECTOR (array), idxval)); |
753 } | 722 } |
754 else if (STRINGP (array)) | 723 else if (STRINGP (array)) |
755 { | 724 { |
756 if (idxval >= string_char_length (XSTRING (array))) goto lose; | 725 if (idxval >= XSTRING_CHAR_LENGTH (array)) goto lose; |
757 return make_char (string_char (XSTRING (array), idxval)); | 726 return make_char (string_char (XSTRING (array), idxval)); |
758 } | 727 } |
759 #ifdef LOSING_BYTECODE | 728 #ifdef LOSING_BYTECODE |
760 else if (COMPILED_FUNCTIONP (array)) | 729 else if (COMPILED_FUNCTIONP (array)) |
761 { | 730 { |
803 set_bit_vector_bit (XBIT_VECTOR (array), idxval, !ZEROP (newval)); | 772 set_bit_vector_bit (XBIT_VECTOR (array), idxval, !ZEROP (newval)); |
804 } | 773 } |
805 else /* string */ | 774 else /* string */ |
806 { | 775 { |
807 CHECK_CHAR_COERCE_INT (newval); | 776 CHECK_CHAR_COERCE_INT (newval); |
808 if (idxval >= string_char_length (XSTRING (array))) goto lose; | 777 if (idxval >= XSTRING_CHAR_LENGTH (array)) goto lose; |
809 set_string_char (XSTRING (array), idxval, XCHAR (newval)); | 778 set_string_char (XSTRING (array), idxval, XCHAR (newval)); |
810 bump_string_modiff (array); | 779 bump_string_modiff (array); |
811 } | 780 } |
812 | 781 |
813 return newval; | 782 return newval; |
1014 CHECK_INT_OR_FLOAT_COERCE_CHAR_OR_MARKER (num2); | 983 CHECK_INT_OR_FLOAT_COERCE_CHAR_OR_MARKER (num2); |
1015 | 984 |
1016 #ifdef LISP_FLOAT_TYPE | 985 #ifdef LISP_FLOAT_TYPE |
1017 if (FLOATP (num1) || FLOATP (num2)) | 986 if (FLOATP (num1) || FLOATP (num2)) |
1018 { | 987 { |
1019 double f1 = (FLOATP (num1)) ? float_data (XFLOAT (num1)) : XINT (num1); | 988 double f1 = FLOATP (num1) ? float_data (XFLOAT (num1)) : XINT (num1); |
1020 double f2 = (FLOATP (num2)) ? float_data (XFLOAT (num2)) : XINT (num2); | 989 double f2 = FLOATP (num2) ? float_data (XFLOAT (num2)) : XINT (num2); |
1021 | 990 |
1022 switch (comparison) | 991 switch (comparison) |
1023 { | 992 { |
1024 case equal: return f1 == f2 ? Qt : Qnil; | 993 case equal: return f1 == f2 ? Qt : Qnil; |
1025 case notequal: return f1 != f2 ? Qt : Qnil; | 994 case notequal: return f1 != f2 ? Qt : Qnil; |
1044 abort (); | 1013 abort (); |
1045 return Qnil; /* suppress compiler warning */ | 1014 return Qnil; /* suppress compiler warning */ |
1046 } | 1015 } |
1047 | 1016 |
1048 DEFUN ("=", Feqlsign, 2, 2, 0, /* | 1017 DEFUN ("=", Feqlsign, 2, 2, 0, /* |
1049 T if two args, both numbers, characters or markers, are equal. | 1018 Return t if two args, both numbers, characters or markers, are equal. |
1050 */ | 1019 */ |
1051 (num1, num2)) | 1020 (num1, num2)) |
1052 { | 1021 { |
1053 return arithcompare (num1, num2, equal); | 1022 return arithcompare (num1, num2, equal); |
1054 } | 1023 } |
1055 | 1024 |
1056 DEFUN ("<", Flss, 2, 2, 0, /* | 1025 DEFUN ("<", Flss, 2, 2, 0, /* |
1057 T if first arg is less than second arg. | 1026 Return t if first arg is less than second arg. |
1058 Both must be numbers, characters or markers. | 1027 Both must be numbers, characters or markers. |
1059 */ | 1028 */ |
1060 (num1, num2)) | 1029 (num1, num2)) |
1061 { | 1030 { |
1062 return arithcompare (num1, num2, less); | 1031 return arithcompare (num1, num2, less); |
1063 } | 1032 } |
1064 | 1033 |
1065 DEFUN (">", Fgtr, 2, 2, 0, /* | 1034 DEFUN (">", Fgtr, 2, 2, 0, /* |
1066 T if first arg is greater than second arg. | 1035 Return t if first arg is greater than second arg. |
1067 Both must be numbers, characters or markers. | 1036 Both must be numbers, characters or markers. |
1068 */ | 1037 */ |
1069 (num1, num2)) | 1038 (num1, num2)) |
1070 { | 1039 { |
1071 return arithcompare (num1, num2, grtr); | 1040 return arithcompare (num1, num2, grtr); |
1072 } | 1041 } |
1073 | 1042 |
1074 DEFUN ("<=", Fleq, 2, 2, 0, /* | 1043 DEFUN ("<=", Fleq, 2, 2, 0, /* |
1075 T if first arg is less than or equal to second arg. | 1044 Return t if first arg is less than or equal to second arg. |
1076 Both must be numbers, characters or markers. | 1045 Both must be numbers, characters or markers. |
1077 */ | 1046 */ |
1078 (num1, num2)) | 1047 (num1, num2)) |
1079 { | 1048 { |
1080 return arithcompare (num1, num2, less_or_equal); | 1049 return arithcompare (num1, num2, less_or_equal); |
1081 } | 1050 } |
1082 | 1051 |
1083 DEFUN (">=", Fgeq, 2, 2, 0, /* | 1052 DEFUN (">=", Fgeq, 2, 2, 0, /* |
1084 T if first arg is greater than or equal to second arg. | 1053 Return t if first arg is greater than or equal to second arg. |
1085 Both must be numbers, characters or markers. | 1054 Both must be numbers, characters or markers. |
1086 */ | 1055 */ |
1087 (num1, num2)) | 1056 (num1, num2)) |
1088 { | 1057 { |
1089 return arithcompare (num1, num2, grtr_or_equal); | 1058 return arithcompare (num1, num2, grtr_or_equal); |
1090 } | 1059 } |
1091 | 1060 |
1092 DEFUN ("/=", Fneq, 2, 2, 0, /* | 1061 DEFUN ("/=", Fneq, 2, 2, 0, /* |
1093 T if first arg is not equal to second arg. | 1062 Return t if first arg is not equal to second arg. |
1094 Both must be numbers, characters or markers. | 1063 Both must be numbers, characters or markers. |
1095 */ | 1064 */ |
1096 (num1, num2)) | 1065 (num1, num2)) |
1097 { | 1066 { |
1098 return arithcompare (num1, num2, notequal); | 1067 return arithcompare (num1, num2, notequal); |
1112 | 1081 |
1113 return Qt; | 1082 return Qt; |
1114 } | 1083 } |
1115 | 1084 |
1116 xxxDEFUN ("=", Feqlsign, 1, MANY, 0, /* | 1085 xxxDEFUN ("=", Feqlsign, 1, MANY, 0, /* |
1117 T if all the arguments are equal. | 1086 Return t if all the arguments are equal. |
1118 The arguments may be numbers, characters or markers. | 1087 The arguments may be numbers, characters or markers. |
1119 */ | 1088 */ |
1120 (int nargs, Lisp_Object *args)) | 1089 (int nargs, Lisp_Object *args)) |
1121 { | 1090 { |
1122 return arithcompare (equal, nargs, args); | 1091 return arithcompare (equal, nargs, args); |
1123 } | 1092 } |
1124 | 1093 |
1125 xxxDEFUN ("<", Flss, 1, MANY, 0, /* | 1094 xxxDEFUN ("<", Flss, 1, MANY, 0, /* |
1126 T if the sequence of arguments is monotonically increasing. | 1095 Return t if the sequence of arguments is monotonically increasing. |
1127 The arguments may be numbers, characters or markers. | 1096 The arguments may be numbers, characters or markers. |
1128 */ | 1097 */ |
1129 (int nargs, Lisp_Object *args)) | 1098 (int nargs, Lisp_Object *args)) |
1130 { | 1099 { |
1131 return arithcompare (less, nargs, args); | 1100 return arithcompare (less, nargs, args); |
1132 } | 1101 } |
1133 | 1102 |
1134 xxxDEFUN (">", Fgtr, 1, MANY, 0, /* | 1103 xxxDEFUN (">", Fgtr, 1, MANY, 0, /* |
1135 T if the sequence of arguments is monotonically decreasing. | 1104 Return t if the sequence of arguments is monotonically decreasing. |
1136 The arguments may be numbers, characters or markers. | 1105 The arguments may be numbers, characters or markers. |
1137 */ | 1106 */ |
1138 (int nargs, Lisp_Object *args)) | 1107 (int nargs, Lisp_Object *args)) |
1139 { | 1108 { |
1140 return arithcompare (grtr, nargs, args); | 1109 return arithcompare (grtr, nargs, args); |
1141 } | 1110 } |
1142 | 1111 |
1143 xxxDEFUN ("<=", Fleq, 1, MANY, 0, /* | 1112 xxxDEFUN ("<=", Fleq, 1, MANY, 0, /* |
1144 T if the sequence of arguments is monotonically nondecreasing. | 1113 Return t if the sequence of arguments is monotonically nondecreasing. |
1145 The arguments may be numbers, characters or markers. | 1114 The arguments may be numbers, characters or markers. |
1146 */ | 1115 */ |
1147 (int nargs, Lisp_Object *args)) | 1116 (int nargs, Lisp_Object *args)) |
1148 { | 1117 { |
1149 return arithcompare (less_or_equal, nargs, args); | 1118 return arithcompare (less_or_equal, nargs, args); |
1150 } | 1119 } |
1151 | 1120 |
1152 xxxDEFUN (">=", Fgeq, 1, MANY, 0, /* | 1121 xxxDEFUN (">=", Fgeq, 1, MANY, 0, /* |
1153 T if the sequence of arguments is monotonically nonincreasing. | 1122 Return t if the sequence of arguments is monotonically nonincreasing. |
1154 The arguments may be numbers, characters or markers. | 1123 The arguments may be numbers, characters or markers. |
1155 */ | 1124 */ |
1156 (int nargs, Lisp_Object *args)) | 1125 (int nargs, Lisp_Object *args)) |
1157 { | 1126 { |
1158 return arithcompare_many (grtr_or_equal, nargs, args); | 1127 return arithcompare_many (grtr_or_equal, nargs, args); |
1159 } | 1128 } |
1160 | 1129 |
1161 xxxDEFUN ("/=", Fneq, 1, MANY, 0, /* | 1130 xxxDEFUN ("/=", Fneq, 1, MANY, 0, /* |
1162 T if the sequence of arguments is monotonically increasing. | 1131 Return t if the sequence of arguments is monotonically increasing. |
1163 The arguments may be numbers, characters or markers. | 1132 The arguments may be numbers, characters or markers. |
1164 */ | 1133 */ |
1165 (int nargs, Lisp_Object *args)) | 1134 (int nargs, Lisp_Object *args)) |
1166 { | 1135 { |
1167 return arithcompare_many (notequal, nargs, args); | 1136 return arithcompare_many (notequal, nargs, args); |
1168 } | 1137 } |
1169 #endif /* 0 - disabled for now */ | 1138 #endif /* 0 - disabled for now */ |
1170 | 1139 |
1171 DEFUN ("zerop", Fzerop, 1, 1, 0, /* | 1140 DEFUN ("zerop", Fzerop, 1, 1, 0, /* |
1172 T if NUMBER is zero. | 1141 Return t if NUMBER is zero. |
1173 */ | 1142 */ |
1174 (number)) | 1143 (number)) |
1175 { | 1144 { |
1176 CHECK_INT_OR_FLOAT (number); | 1145 CHECK_INT_OR_FLOAT (number); |
1177 | 1146 |
1178 #ifdef LISP_FLOAT_TYPE | 1147 #ifdef LISP_FLOAT_TYPE |
1179 if (FLOATP (number)) | 1148 if (FLOATP (number)) |
1180 return float_data (XFLOAT (number)) == 0.0 ? Qt : Qnil; | 1149 return float_data (XFLOAT (number)) == 0.0 ? Qt : Qnil; |
1181 #endif /* LISP_FLOAT_TYPE */ | 1150 #endif /* LISP_FLOAT_TYPE */ |
1182 | 1151 |
1183 return XINT (number) == 0 ? Qt : Qnil; | 1152 return EQ (number, Qzero) ? Qt : Qnil; |
1184 } | 1153 } |
1185 | 1154 |
1186 /* Convert between a 32-bit value and a cons of two 16-bit values. | 1155 /* Convert between a 32-bit value and a cons of two 16-bit values. |
1187 This is used to pass 32-bit integers to and from the user. | 1156 This is used to pass 32-bit integers to and from the user. |
1188 Use time_to_lisp() and lisp_to_time() for time values. | 1157 Use time_to_lisp() and lisp_to_time() for time values. |
1238 } | 1207 } |
1239 | 1208 |
1240 static int | 1209 static int |
1241 digit_to_number (int character, int base) | 1210 digit_to_number (int character, int base) |
1242 { | 1211 { |
1243 int digit; | 1212 /* Assumes ASCII */ |
1244 | 1213 int digit = ((character >= '0' && character <= '9') ? character - '0' : |
1245 if (character >= '0' && character <= '9') | 1214 (character >= 'a' && character <= 'z') ? character - 'a' + 10 : |
1246 digit = character - '0'; | 1215 (character >= 'A' && character <= 'Z') ? character - 'A' + 10 : |
1247 else if (character >= 'a' && character <= 'z') | 1216 -1); |
1248 digit = character - 'a' + 10; | 1217 |
1249 else if (character >= 'A' && character <= 'Z') | 1218 return digit >= base ? -1 : digit; |
1250 digit = character - 'A' + 10; | |
1251 else | |
1252 return -1; | |
1253 | |
1254 if (digit >= base) | |
1255 return -1; | |
1256 else | |
1257 return digit; | |
1258 } | 1219 } |
1259 | 1220 |
1260 DEFUN ("string-to-number", Fstring_to_number, 1, 2, 0, /* | 1221 DEFUN ("string-to-number", Fstring_to_number, 1, 2, 0, /* |
1261 Convert STRING to a number by parsing it as a decimal number. | 1222 Convert STRING to a number by parsing it as a decimal number. |
1262 This parses both integers and floating point numbers. | 1223 This parses both integers and floating point numbers. |
1295 #endif /* LISP_FLOAT_TYPE */ | 1256 #endif /* LISP_FLOAT_TYPE */ |
1296 | 1257 |
1297 if (b == 10) | 1258 if (b == 10) |
1298 { | 1259 { |
1299 /* Use the system-provided functions for base 10. */ | 1260 /* Use the system-provided functions for base 10. */ |
1300 Lisp_Object value; | 1261 #if SIZEOF_EMACS_INT == SIZEOF_INT |
1301 if (sizeof (int) == sizeof (EMACS_INT)) | 1262 return make_int (atoi (p)); |
1302 XSETINT (value, atoi (p)); | 1263 #elif SIZEOF_EMACS_INT == SIZEOF_LONG |
1303 else if (sizeof (long) == sizeof (EMACS_INT)) | 1264 return make_int (atol (p)); |
1304 XSETINT (value, atol (p)); | 1265 #elif SIZEOF_EMACS_INT == SIZEOF_LONG_LONG |
1305 else | 1266 return make_int (atoll (p)); |
1306 abort (); | 1267 #endif |
1307 return value; | |
1308 } | 1268 } |
1309 else | 1269 else |
1310 { | 1270 { |
1311 int digit, negative = 1; | 1271 int digit, negative = 1; |
1312 EMACS_INT v = 0; | 1272 EMACS_INT v = 0; |
1655 If COUNT is negative, shifting is actually to the right. | 1615 If COUNT is negative, shifting is actually to the right. |
1656 In this case, zeros are shifted in on the left. | 1616 In this case, zeros are shifted in on the left. |
1657 */ | 1617 */ |
1658 (value, count)) | 1618 (value, count)) |
1659 { | 1619 { |
1660 Lisp_Object val; | |
1661 | |
1662 CHECK_INT_COERCE_CHAR (value); | 1620 CHECK_INT_COERCE_CHAR (value); |
1663 CHECK_INT (count); | 1621 CHECK_INT (count); |
1664 | 1622 |
1665 { | 1623 return make_int (XINT (count) > 0 ? |
1666 int C_count = XINT (count); | 1624 XUINT (value) << XINT (count) : |
1667 /* EMACS_UINT C_value = (EMACS_UINT) XUINT (value);*/ | 1625 XUINT (value) >> -XINT (count)); |
1668 EMACS_UINT C_value = (EMACS_UINT) XUINT (value); | |
1669 XSETINT (val, C_count > 0 ? C_value << C_count : C_value >> -C_count); | |
1670 } | |
1671 return val; | |
1672 } | 1626 } |
1673 | 1627 |
1674 DEFUN ("1+", Fadd1, 1, 1, 0, /* | 1628 DEFUN ("1+", Fadd1, 1, 1, 0, /* |
1675 Return NUMBER plus one. NUMBER may be a number or a marker. | 1629 Return NUMBER plus one. NUMBER may be a number or a marker. |
1676 Markers and characters are converted to integers. | 1630 Markers and characters are converted to integers. |
1722 The basic idea is that we don't mark the elements during GC, but | 1676 The basic idea is that we don't mark the elements during GC, but |
1723 wait for them to be marked elsewhere. If they're not marked, we | 1677 wait for them to be marked elsewhere. If they're not marked, we |
1724 remove them. This is analogous to weak hashtables; see the explanation | 1678 remove them. This is analogous to weak hashtables; see the explanation |
1725 there for more info. */ | 1679 there for more info. */ |
1726 | 1680 |
1727 static Lisp_Object mark_weak_list (Lisp_Object, void (*) (Lisp_Object)); | |
1728 static void print_weak_list (Lisp_Object, Lisp_Object, int); | |
1729 static int weak_list_equal (Lisp_Object, Lisp_Object, int depth); | |
1730 static unsigned long weak_list_hash (Lisp_Object obj, int depth); | |
1731 DEFINE_LRECORD_IMPLEMENTATION ("weak-list", weak_list, | |
1732 mark_weak_list, print_weak_list, | |
1733 0, weak_list_equal, weak_list_hash, | |
1734 struct weak_list); | |
1735 | |
1736 static Lisp_Object Vall_weak_lists; /* Gemarke es nicht!!! */ | 1681 static Lisp_Object Vall_weak_lists; /* Gemarke es nicht!!! */ |
1737 | 1682 |
1738 static Lisp_Object encode_weak_list_type (enum weak_list_type type); | 1683 static Lisp_Object encode_weak_list_type (enum weak_list_type type); |
1739 | 1684 |
1740 static Lisp_Object | 1685 static Lisp_Object |
1777 } | 1722 } |
1778 | 1723 |
1779 Lisp_Object | 1724 Lisp_Object |
1780 make_weak_list (enum weak_list_type type) | 1725 make_weak_list (enum weak_list_type type) |
1781 { | 1726 { |
1782 Lisp_Object result = Qnil; | 1727 Lisp_Object result; |
1783 struct weak_list *wl = | 1728 struct weak_list *wl = |
1784 alloc_lcrecord_type (struct weak_list, lrecord_weak_list); | 1729 alloc_lcrecord_type (struct weak_list, lrecord_weak_list); |
1785 | 1730 |
1786 wl->list = Qnil; | 1731 wl->list = Qnil; |
1787 wl->type = type; | 1732 wl->type = type; |
1789 wl->next_weak = Vall_weak_lists; | 1734 wl->next_weak = Vall_weak_lists; |
1790 Vall_weak_lists = result; | 1735 Vall_weak_lists = result; |
1791 return result; | 1736 return result; |
1792 } | 1737 } |
1793 | 1738 |
1739 DEFINE_LRECORD_IMPLEMENTATION ("weak-list", weak_list, | |
1740 mark_weak_list, print_weak_list, | |
1741 0, weak_list_equal, weak_list_hash, | |
1742 struct weak_list); | |
1794 /* | 1743 /* |
1795 -- we do not mark the list elements (either the elements themselves | 1744 -- we do not mark the list elements (either the elements themselves |
1796 or the cons cells that hold them) in the normal marking phase. | 1745 or the cons cells that hold them) in the normal marking phase. |
1797 -- at the end of marking, we go through all weak lists that are | 1746 -- at the end of marking, we go through all weak lists that are |
1798 marked, and mark the cons cells that hold all marked | 1747 marked, and mark the cons cells that hold all marked |
2074 { | 2023 { |
2075 return WEAK_LISTP (object) ? Qt : Qnil; | 2024 return WEAK_LISTP (object) ? Qt : Qnil; |
2076 } | 2025 } |
2077 | 2026 |
2078 DEFUN ("make-weak-list", Fmake_weak_list, 0, 1, 0, /* | 2027 DEFUN ("make-weak-list", Fmake_weak_list, 0, 1, 0, /* |
2079 Create a new weak list. | 2028 Return a new weak list object of type TYPE. |
2080 A weak list object is an object that contains a list. This list behaves | 2029 A weak list object is an object that contains a list. This list behaves |
2081 like any other list except that its elements do not count towards | 2030 like any other list except that its elements do not count towards |
2082 garbage collection -- if the only pointer to an object in inside a weak | 2031 garbage collection -- if the only pointer to an object in inside a weak |
2083 list (other than pointers in similar objects such as weak hash tables), | 2032 list (other than pointers in similar objects such as weak hash tables), |
2084 the object is garbage collected and automatically removed from the list. | 2033 the object is garbage collected and automatically removed from the list. |
2235 void | 2184 void |
2236 syms_of_data (void) | 2185 syms_of_data (void) |
2237 { | 2186 { |
2238 defsymbol (&Qcons, "cons"); | 2187 defsymbol (&Qcons, "cons"); |
2239 defsymbol (&Qkeyword, "keyword"); | 2188 defsymbol (&Qkeyword, "keyword"); |
2240 /* Qstring, Qinteger, Qsymbol, Qvector defined in general.c */ | |
2241 | |
2242 defsymbol (&Qquote, "quote"); | 2189 defsymbol (&Qquote, "quote"); |
2243 defsymbol (&Qlambda, "lambda"); | 2190 defsymbol (&Qlambda, "lambda"); |
2244 defsymbol (&Qsignal, "signal"); | |
2245 defsymbol (&Qtop_level, "top-level"); | |
2246 defsymbol (&Qignore, "ignore"); | 2191 defsymbol (&Qignore, "ignore"); |
2247 | |
2248 defsymbol (&Qlistp, "listp"); | 2192 defsymbol (&Qlistp, "listp"); |
2193 defsymbol (&Qtrue_list_p, "true-list-p"); | |
2249 defsymbol (&Qconsp, "consp"); | 2194 defsymbol (&Qconsp, "consp"); |
2250 defsymbol (&Qsubrp, "subrp"); | 2195 defsymbol (&Qsubrp, "subrp"); |
2251 defsymbol (&Qsymbolp, "symbolp"); | 2196 defsymbol (&Qsymbolp, "symbolp"); |
2252 defsymbol (&Qkeywordp, "keywordp"); | 2197 defsymbol (&Qkeywordp, "keywordp"); |
2253 defsymbol (&Qintegerp, "integerp"); | 2198 defsymbol (&Qintegerp, "integerp"); |
2264 defsymbol (&Qchar_or_string_p, "char-or-string-p"); | 2209 defsymbol (&Qchar_or_string_p, "char-or-string-p"); |
2265 defsymbol (&Qmarkerp, "markerp"); | 2210 defsymbol (&Qmarkerp, "markerp"); |
2266 defsymbol (&Qinteger_or_marker_p, "integer-or-marker-p"); | 2211 defsymbol (&Qinteger_or_marker_p, "integer-or-marker-p"); |
2267 defsymbol (&Qinteger_or_char_p, "integer-or-char-p"); | 2212 defsymbol (&Qinteger_or_char_p, "integer-or-char-p"); |
2268 defsymbol (&Qinteger_char_or_marker_p, "integer-char-or-marker-p"); | 2213 defsymbol (&Qinteger_char_or_marker_p, "integer-char-or-marker-p"); |
2214 defsymbol (&Qnumberp, "numberp"); | |
2215 defsymbol (&Qnumber_or_marker_p, "number-or-marker-p"); | |
2216 defsymbol (&Qnumber_char_or_marker_p, "number-char-or-marker-p"); | |
2217 defsymbol (&Qcdr, "cdr"); | |
2218 defsymbol (&Qweak_listp, "weak-list-p"); | |
2269 | 2219 |
2270 #ifdef LISP_FLOAT_TYPE | 2220 #ifdef LISP_FLOAT_TYPE |
2271 defsymbol (&Qfloatp, "floatp"); | 2221 defsymbol (&Qfloatp, "floatp"); |
2272 #endif /* LISP_FLOAT_TYPE */ | 2222 #endif /* LISP_FLOAT_TYPE */ |
2273 defsymbol (&Qnumberp, "numberp"); | |
2274 defsymbol (&Qnumber_or_marker_p, "number-or-marker-p"); | |
2275 defsymbol (&Qnumber_char_or_marker_p, "number-char-or-marker-p"); | |
2276 | |
2277 defsymbol (&Qcdr, "cdr"); | |
2278 | |
2279 defsymbol (&Qweak_listp, "weak-list-p"); | |
2280 | 2223 |
2281 DEFSUBR (Fwrong_type_argument); | 2224 DEFSUBR (Fwrong_type_argument); |
2282 | 2225 |
2283 DEFSUBR (Feq); | 2226 DEFSUBR (Feq); |
2284 DEFSUBR (Fold_eq); | 2227 DEFSUBR (Fold_eq); |
2285 DEFSUBR (Fnull); | 2228 DEFSUBR (Fnull); |
2286 DEFSUBR (Flistp); | 2229 DEFSUBR (Flistp); |
2287 DEFSUBR (Fnlistp); | 2230 DEFSUBR (Fnlistp); |
2231 DEFSUBR (Ftrue_list_p); | |
2288 DEFSUBR (Fconsp); | 2232 DEFSUBR (Fconsp); |
2289 DEFSUBR (Fatom); | 2233 DEFSUBR (Fatom); |
2290 DEFSUBR (Fchar_or_string_p); | 2234 DEFSUBR (Fchar_or_string_p); |
2291 DEFSUBR (Fcharacterp); | 2235 DEFSUBR (Fcharacterp); |
2292 DEFSUBR (Fchar_int_p); | 2236 DEFSUBR (Fchar_int_p); |