1 /* Random utility Lisp functions.
2 Copyright (C) 1985-1987, 1993-1995, 1997-2011
3 Free Software Foundation, Inc.
5 This file is part of GNU Emacs.
7 GNU Emacs is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
28 #include "character.h"
33 #include "intervals.h"
36 #include "blockinput.h"
38 #if defined (HAVE_X_WINDOWS)
41 #endif /* HAVE_MENUS */
44 #define NULL ((POINTER_TYPE *)0)
47 Lisp_Object Qstring_lessp
;
48 static Lisp_Object Qprovide
, Qrequire
;
49 static Lisp_Object Qyes_or_no_p_history
;
50 Lisp_Object Qcursor_in_echo_area
;
51 static Lisp_Object Qwidget_type
;
52 static Lisp_Object Qcodeset
, Qdays
, Qmonths
, Qpaper
;
54 static int internal_equal (Lisp_Object
, Lisp_Object
, int, int);
60 DEFUN ("identity", Fidentity
, Sidentity
, 1, 1, 0,
61 doc
: /* Return the argument unchanged. */)
67 DEFUN ("random", Frandom
, Srandom
, 0, 1, 0,
68 doc
: /* Return a pseudo-random number.
69 All integers representable in Lisp are equally likely.
70 On most systems, this is 29 bits' worth.
71 With positive integer LIMIT, return random number in interval [0,LIMIT).
72 With argument t, set the random number seed from the current time and pid.
73 Other values of LIMIT are ignored. */)
77 Lisp_Object lispy_val
;
78 EMACS_UINT denominator
;
81 seed_random (getpid () + time (NULL
));
82 if (NATNUMP (limit
) && XFASTINT (limit
) != 0)
84 /* Try to take our random number from the higher bits of VAL,
85 not the lower, since (says Gentzel) the low bits of `random'
86 are less random than the higher ones. We do this by using the
87 quotient rather than the remainder. At the high end of the RNG
88 it's possible to get a quotient larger than n; discarding
89 these values eliminates the bias that would otherwise appear
90 when using a large n. */
91 denominator
= ((EMACS_UINT
) 1 << VALBITS
) / XFASTINT (limit
);
93 val
= get_random () / denominator
;
94 while (val
>= XFASTINT (limit
));
98 XSETINT (lispy_val
, val
);
102 /* Random data-structure functions */
104 DEFUN ("length", Flength
, Slength
, 1, 1, 0,
105 doc
: /* Return the length of vector, list or string SEQUENCE.
106 A byte-code function object is also allowed.
107 If the string contains multibyte characters, this is not necessarily
108 the number of bytes in the string; it is the number of characters.
109 To get the number of bytes, use `string-bytes'. */)
110 (register Lisp_Object sequence
)
112 register Lisp_Object val
;
115 if (STRINGP (sequence
))
116 XSETFASTINT (val
, SCHARS (sequence
));
117 else if (VECTORP (sequence
))
118 XSETFASTINT (val
, ASIZE (sequence
));
119 else if (CHAR_TABLE_P (sequence
))
120 XSETFASTINT (val
, MAX_CHAR
);
121 else if (BOOL_VECTOR_P (sequence
))
122 XSETFASTINT (val
, XBOOL_VECTOR (sequence
)->size
);
123 else if (COMPILEDP (sequence
))
124 XSETFASTINT (val
, ASIZE (sequence
) & PSEUDOVECTOR_SIZE_MASK
);
125 else if (CONSP (sequence
))
128 while (CONSP (sequence
))
130 sequence
= XCDR (sequence
);
133 if (!CONSP (sequence
))
136 sequence
= XCDR (sequence
);
141 CHECK_LIST_END (sequence
, sequence
);
143 val
= make_number (i
);
145 else if (NILP (sequence
))
146 XSETFASTINT (val
, 0);
148 wrong_type_argument (Qsequencep
, sequence
);
153 /* This does not check for quits. That is safe since it must terminate. */
155 DEFUN ("safe-length", Fsafe_length
, Ssafe_length
, 1, 1, 0,
156 doc
: /* Return the length of a list, but avoid error or infinite loop.
157 This function never gets an error. If LIST is not really a list,
158 it returns 0. If LIST is circular, it returns a finite value
159 which is at least the number of distinct elements. */)
162 Lisp_Object tail
, halftail
, length
;
165 /* halftail is used to detect circular lists. */
167 for (tail
= list
; CONSP (tail
); tail
= XCDR (tail
))
169 if (EQ (tail
, halftail
) && len
!= 0)
173 halftail
= XCDR (halftail
);
176 XSETINT (length
, len
);
180 DEFUN ("string-bytes", Fstring_bytes
, Sstring_bytes
, 1, 1, 0,
181 doc
: /* Return the number of bytes in STRING.
182 If STRING is multibyte, this may be greater than the length of STRING. */)
185 CHECK_STRING (string
);
186 return make_number (SBYTES (string
));
189 DEFUN ("string-equal", Fstring_equal
, Sstring_equal
, 2, 2, 0,
190 doc
: /* Return t if two strings have identical contents.
191 Case is significant, but text properties are ignored.
192 Symbols are also allowed; their print names are used instead. */)
193 (register Lisp_Object s1
, Lisp_Object s2
)
196 s1
= SYMBOL_NAME (s1
);
198 s2
= SYMBOL_NAME (s2
);
202 if (SCHARS (s1
) != SCHARS (s2
)
203 || SBYTES (s1
) != SBYTES (s2
)
204 || memcmp (SDATA (s1
), SDATA (s2
), SBYTES (s1
)))
209 DEFUN ("compare-strings", Fcompare_strings
, Scompare_strings
, 6, 7, 0,
210 doc
: /* Compare the contents of two strings, converting to multibyte if needed.
211 In string STR1, skip the first START1 characters and stop at END1.
212 In string STR2, skip the first START2 characters and stop at END2.
213 END1 and END2 default to the full lengths of the respective strings.
215 Case is significant in this comparison if IGNORE-CASE is nil.
216 Unibyte strings are converted to multibyte for comparison.
218 The value is t if the strings (or specified portions) match.
219 If string STR1 is less, the value is a negative number N;
220 - 1 - N is the number of characters that match at the beginning.
221 If string STR1 is greater, the value is a positive number N;
222 N - 1 is the number of characters that match at the beginning. */)
223 (Lisp_Object str1
, Lisp_Object start1
, Lisp_Object end1
, Lisp_Object str2
, Lisp_Object start2
, Lisp_Object end2
, Lisp_Object ignore_case
)
225 register EMACS_INT end1_char
, end2_char
;
226 register EMACS_INT i1
, i1_byte
, i2
, i2_byte
;
231 start1
= make_number (0);
233 start2
= make_number (0);
234 CHECK_NATNUM (start1
);
235 CHECK_NATNUM (start2
);
244 i1_byte
= string_char_to_byte (str1
, i1
);
245 i2_byte
= string_char_to_byte (str2
, i2
);
247 end1_char
= SCHARS (str1
);
248 if (! NILP (end1
) && end1_char
> XINT (end1
))
249 end1_char
= XINT (end1
);
251 end2_char
= SCHARS (str2
);
252 if (! NILP (end2
) && end2_char
> XINT (end2
))
253 end2_char
= XINT (end2
);
255 while (i1
< end1_char
&& i2
< end2_char
)
257 /* When we find a mismatch, we must compare the
258 characters, not just the bytes. */
261 if (STRING_MULTIBYTE (str1
))
262 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c1
, str1
, i1
, i1_byte
);
265 c1
= SREF (str1
, i1
++);
266 MAKE_CHAR_MULTIBYTE (c1
);
269 if (STRING_MULTIBYTE (str2
))
270 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c2
, str2
, i2
, i2_byte
);
273 c2
= SREF (str2
, i2
++);
274 MAKE_CHAR_MULTIBYTE (c2
);
280 if (! NILP (ignore_case
))
284 tem
= Fupcase (make_number (c1
));
286 tem
= Fupcase (make_number (c2
));
293 /* Note that I1 has already been incremented
294 past the character that we are comparing;
295 hence we don't add or subtract 1 here. */
297 return make_number (- i1
+ XINT (start1
));
299 return make_number (i1
- XINT (start1
));
303 return make_number (i1
- XINT (start1
) + 1);
305 return make_number (- i1
+ XINT (start1
) - 1);
310 DEFUN ("string-lessp", Fstring_lessp
, Sstring_lessp
, 2, 2, 0,
311 doc
: /* Return t if first arg string is less than second in lexicographic order.
313 Symbols are also allowed; their print names are used instead. */)
314 (register Lisp_Object s1
, Lisp_Object s2
)
316 register EMACS_INT end
;
317 register EMACS_INT i1
, i1_byte
, i2
, i2_byte
;
320 s1
= SYMBOL_NAME (s1
);
322 s2
= SYMBOL_NAME (s2
);
326 i1
= i1_byte
= i2
= i2_byte
= 0;
329 if (end
> SCHARS (s2
))
334 /* When we find a mismatch, we must compare the
335 characters, not just the bytes. */
338 FETCH_STRING_CHAR_ADVANCE (c1
, s1
, i1
, i1_byte
);
339 FETCH_STRING_CHAR_ADVANCE (c2
, s2
, i2
, i2_byte
);
342 return c1
< c2
? Qt
: Qnil
;
344 return i1
< SCHARS (s2
) ? Qt
: Qnil
;
347 static Lisp_Object
concat (size_t nargs
, Lisp_Object
*args
,
348 enum Lisp_Type target_type
, int last_special
);
352 concat2 (Lisp_Object s1
, Lisp_Object s2
)
357 return concat (2, args
, Lisp_String
, 0);
362 concat3 (Lisp_Object s1
, Lisp_Object s2
, Lisp_Object s3
)
368 return concat (3, args
, Lisp_String
, 0);
371 DEFUN ("append", Fappend
, Sappend
, 0, MANY
, 0,
372 doc
: /* Concatenate all the arguments and make the result a list.
373 The result is a list whose elements are the elements of all the arguments.
374 Each argument may be a list, vector or string.
375 The last argument is not copied, just used as the tail of the new list.
376 usage: (append &rest SEQUENCES) */)
377 (size_t nargs
, Lisp_Object
*args
)
379 return concat (nargs
, args
, Lisp_Cons
, 1);
382 DEFUN ("concat", Fconcat
, Sconcat
, 0, MANY
, 0,
383 doc
: /* Concatenate all the arguments and make the result a string.
384 The result is a string whose elements are the elements of all the arguments.
385 Each argument may be a string or a list or vector of characters (integers).
386 usage: (concat &rest SEQUENCES) */)
387 (size_t nargs
, Lisp_Object
*args
)
389 return concat (nargs
, args
, Lisp_String
, 0);
392 DEFUN ("vconcat", Fvconcat
, Svconcat
, 0, MANY
, 0,
393 doc
: /* Concatenate all the arguments and make the result a vector.
394 The result is a vector whose elements are the elements of all the arguments.
395 Each argument may be a list, vector or string.
396 usage: (vconcat &rest SEQUENCES) */)
397 (size_t nargs
, Lisp_Object
*args
)
399 return concat (nargs
, args
, Lisp_Vectorlike
, 0);
403 DEFUN ("copy-sequence", Fcopy_sequence
, Scopy_sequence
, 1, 1, 0,
404 doc
: /* Return a copy of a list, vector, string or char-table.
405 The elements of a list or vector are not copied; they are shared
406 with the original. */)
409 if (NILP (arg
)) return arg
;
411 if (CHAR_TABLE_P (arg
))
413 return copy_char_table (arg
);
416 if (BOOL_VECTOR_P (arg
))
420 = ((XBOOL_VECTOR (arg
)->size
+ BOOL_VECTOR_BITS_PER_CHAR
- 1)
421 / BOOL_VECTOR_BITS_PER_CHAR
);
423 val
= Fmake_bool_vector (Flength (arg
), Qnil
);
424 memcpy (XBOOL_VECTOR (val
)->data
, XBOOL_VECTOR (arg
)->data
,
429 if (!CONSP (arg
) && !VECTORP (arg
) && !STRINGP (arg
))
430 wrong_type_argument (Qsequencep
, arg
);
432 return concat (1, &arg
, CONSP (arg
) ? Lisp_Cons
: XTYPE (arg
), 0);
435 /* This structure holds information of an argument of `concat' that is
436 a string and has text properties to be copied. */
439 int argnum
; /* refer to ARGS (arguments of `concat') */
440 EMACS_INT from
; /* refer to ARGS[argnum] (argument string) */
441 EMACS_INT to
; /* refer to VAL (the target string) */
445 concat (size_t nargs
, Lisp_Object
*args
,
446 enum Lisp_Type target_type
, int last_special
)
449 register Lisp_Object tail
;
450 register Lisp_Object
this;
452 EMACS_INT toindex_byte
= 0;
453 register EMACS_INT result_len
;
454 register EMACS_INT result_len_byte
;
455 register size_t argnum
;
456 Lisp_Object last_tail
;
459 /* When we make a multibyte string, we can't copy text properties
460 while concatenating each string because the length of resulting
461 string can't be decided until we finish the whole concatenation.
462 So, we record strings that have text properties to be copied
463 here, and copy the text properties after the concatenation. */
464 struct textprop_rec
*textprops
= NULL
;
465 /* Number of elements in textprops. */
466 int num_textprops
= 0;
471 /* In append, the last arg isn't treated like the others */
472 if (last_special
&& nargs
> 0)
475 last_tail
= args
[nargs
];
480 /* Check each argument. */
481 for (argnum
= 0; argnum
< nargs
; argnum
++)
484 if (!(CONSP (this) || NILP (this) || VECTORP (this) || STRINGP (this)
485 || COMPILEDP (this) || BOOL_VECTOR_P (this)))
486 wrong_type_argument (Qsequencep
, this);
489 /* Compute total length in chars of arguments in RESULT_LEN.
490 If desired output is a string, also compute length in bytes
491 in RESULT_LEN_BYTE, and determine in SOME_MULTIBYTE
492 whether the result should be a multibyte string. */
496 for (argnum
= 0; argnum
< nargs
; argnum
++)
500 len
= XFASTINT (Flength (this));
501 if (target_type
== Lisp_String
)
503 /* We must count the number of bytes needed in the string
504 as well as the number of characters. */
507 EMACS_INT this_len_byte
;
509 if (VECTORP (this) || COMPILEDP (this))
510 for (i
= 0; i
< len
; i
++)
513 CHECK_CHARACTER (ch
);
514 this_len_byte
= CHAR_BYTES (XINT (ch
));
515 result_len_byte
+= this_len_byte
;
516 if (! ASCII_CHAR_P (XINT (ch
)) && ! CHAR_BYTE8_P (XINT (ch
)))
519 else if (BOOL_VECTOR_P (this) && XBOOL_VECTOR (this)->size
> 0)
520 wrong_type_argument (Qintegerp
, Faref (this, make_number (0)));
521 else if (CONSP (this))
522 for (; CONSP (this); this = XCDR (this))
525 CHECK_CHARACTER (ch
);
526 this_len_byte
= CHAR_BYTES (XINT (ch
));
527 result_len_byte
+= this_len_byte
;
528 if (! ASCII_CHAR_P (XINT (ch
)) && ! CHAR_BYTE8_P (XINT (ch
)))
531 else if (STRINGP (this))
533 if (STRING_MULTIBYTE (this))
536 result_len_byte
+= SBYTES (this);
539 result_len_byte
+= count_size_as_multibyte (SDATA (this),
546 error ("String overflow");
549 if (! some_multibyte
)
550 result_len_byte
= result_len
;
552 /* Create the output object. */
553 if (target_type
== Lisp_Cons
)
554 val
= Fmake_list (make_number (result_len
), Qnil
);
555 else if (target_type
== Lisp_Vectorlike
)
556 val
= Fmake_vector (make_number (result_len
), Qnil
);
557 else if (some_multibyte
)
558 val
= make_uninit_multibyte_string (result_len
, result_len_byte
);
560 val
= make_uninit_string (result_len
);
562 /* In `append', if all but last arg are nil, return last arg. */
563 if (target_type
== Lisp_Cons
&& EQ (val
, Qnil
))
566 /* Copy the contents of the args into the result. */
568 tail
= val
, toindex
= -1; /* -1 in toindex is flag we are making a list */
570 toindex
= 0, toindex_byte
= 0;
574 SAFE_ALLOCA (textprops
, struct textprop_rec
*, sizeof (struct textprop_rec
) * nargs
);
576 for (argnum
= 0; argnum
< nargs
; argnum
++)
579 EMACS_INT thisleni
= 0;
580 register EMACS_INT thisindex
= 0;
581 register EMACS_INT thisindex_byte
= 0;
585 thislen
= Flength (this), thisleni
= XINT (thislen
);
587 /* Between strings of the same kind, copy fast. */
588 if (STRINGP (this) && STRINGP (val
)
589 && STRING_MULTIBYTE (this) == some_multibyte
)
591 EMACS_INT thislen_byte
= SBYTES (this);
593 memcpy (SDATA (val
) + toindex_byte
, SDATA (this), SBYTES (this));
594 if (! NULL_INTERVAL_P (STRING_INTERVALS (this)))
596 textprops
[num_textprops
].argnum
= argnum
;
597 textprops
[num_textprops
].from
= 0;
598 textprops
[num_textprops
++].to
= toindex
;
600 toindex_byte
+= thislen_byte
;
603 /* Copy a single-byte string to a multibyte string. */
604 else if (STRINGP (this) && STRINGP (val
))
606 if (! NULL_INTERVAL_P (STRING_INTERVALS (this)))
608 textprops
[num_textprops
].argnum
= argnum
;
609 textprops
[num_textprops
].from
= 0;
610 textprops
[num_textprops
++].to
= toindex
;
612 toindex_byte
+= copy_text (SDATA (this),
613 SDATA (val
) + toindex_byte
,
614 SCHARS (this), 0, 1);
618 /* Copy element by element. */
621 register Lisp_Object elt
;
623 /* Fetch next element of `this' arg into `elt', or break if
624 `this' is exhausted. */
625 if (NILP (this)) break;
627 elt
= XCAR (this), this = XCDR (this);
628 else if (thisindex
>= thisleni
)
630 else if (STRINGP (this))
633 if (STRING_MULTIBYTE (this))
635 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c
, this,
638 XSETFASTINT (elt
, c
);
642 XSETFASTINT (elt
, SREF (this, thisindex
)); thisindex
++;
644 && !ASCII_CHAR_P (XINT (elt
))
645 && XINT (elt
) < 0400)
647 c
= BYTE8_TO_CHAR (XINT (elt
));
652 else if (BOOL_VECTOR_P (this))
655 byte
= XBOOL_VECTOR (this)->data
[thisindex
/ BOOL_VECTOR_BITS_PER_CHAR
];
656 if (byte
& (1 << (thisindex
% BOOL_VECTOR_BITS_PER_CHAR
)))
664 elt
= AREF (this, thisindex
);
668 /* Store this element into the result. */
675 else if (VECTORP (val
))
677 ASET (val
, toindex
, elt
);
684 toindex_byte
+= CHAR_STRING (XINT (elt
),
685 SDATA (val
) + toindex_byte
);
687 SSET (val
, toindex_byte
++, XINT (elt
));
693 XSETCDR (prev
, last_tail
);
695 if (num_textprops
> 0)
698 EMACS_INT last_to_end
= -1;
700 for (argnum
= 0; argnum
< num_textprops
; argnum
++)
702 this = args
[textprops
[argnum
].argnum
];
703 props
= text_property_list (this,
705 make_number (SCHARS (this)),
707 /* If successive arguments have properties, be sure that the
708 value of `composition' property be the copy. */
709 if (last_to_end
== textprops
[argnum
].to
)
710 make_composition_value_copy (props
);
711 add_text_properties_from_list (val
, props
,
712 make_number (textprops
[argnum
].to
));
713 last_to_end
= textprops
[argnum
].to
+ SCHARS (this);
721 static Lisp_Object string_char_byte_cache_string
;
722 static EMACS_INT string_char_byte_cache_charpos
;
723 static EMACS_INT string_char_byte_cache_bytepos
;
726 clear_string_char_byte_cache (void)
728 string_char_byte_cache_string
= Qnil
;
731 /* Return the byte index corresponding to CHAR_INDEX in STRING. */
734 string_char_to_byte (Lisp_Object string
, EMACS_INT char_index
)
737 EMACS_INT best_below
, best_below_byte
;
738 EMACS_INT best_above
, best_above_byte
;
740 best_below
= best_below_byte
= 0;
741 best_above
= SCHARS (string
);
742 best_above_byte
= SBYTES (string
);
743 if (best_above
== best_above_byte
)
746 if (EQ (string
, string_char_byte_cache_string
))
748 if (string_char_byte_cache_charpos
< char_index
)
750 best_below
= string_char_byte_cache_charpos
;
751 best_below_byte
= string_char_byte_cache_bytepos
;
755 best_above
= string_char_byte_cache_charpos
;
756 best_above_byte
= string_char_byte_cache_bytepos
;
760 if (char_index
- best_below
< best_above
- char_index
)
762 unsigned char *p
= SDATA (string
) + best_below_byte
;
764 while (best_below
< char_index
)
766 p
+= BYTES_BY_CHAR_HEAD (*p
);
769 i_byte
= p
- SDATA (string
);
773 unsigned char *p
= SDATA (string
) + best_above_byte
;
775 while (best_above
> char_index
)
778 while (!CHAR_HEAD_P (*p
)) p
--;
781 i_byte
= p
- SDATA (string
);
784 string_char_byte_cache_bytepos
= i_byte
;
785 string_char_byte_cache_charpos
= char_index
;
786 string_char_byte_cache_string
= string
;
791 /* Return the character index corresponding to BYTE_INDEX in STRING. */
794 string_byte_to_char (Lisp_Object string
, EMACS_INT byte_index
)
797 EMACS_INT best_below
, best_below_byte
;
798 EMACS_INT best_above
, best_above_byte
;
800 best_below
= best_below_byte
= 0;
801 best_above
= SCHARS (string
);
802 best_above_byte
= SBYTES (string
);
803 if (best_above
== best_above_byte
)
806 if (EQ (string
, string_char_byte_cache_string
))
808 if (string_char_byte_cache_bytepos
< byte_index
)
810 best_below
= string_char_byte_cache_charpos
;
811 best_below_byte
= string_char_byte_cache_bytepos
;
815 best_above
= string_char_byte_cache_charpos
;
816 best_above_byte
= string_char_byte_cache_bytepos
;
820 if (byte_index
- best_below_byte
< best_above_byte
- byte_index
)
822 unsigned char *p
= SDATA (string
) + best_below_byte
;
823 unsigned char *pend
= SDATA (string
) + byte_index
;
827 p
+= BYTES_BY_CHAR_HEAD (*p
);
831 i_byte
= p
- SDATA (string
);
835 unsigned char *p
= SDATA (string
) + best_above_byte
;
836 unsigned char *pbeg
= SDATA (string
) + byte_index
;
841 while (!CHAR_HEAD_P (*p
)) p
--;
845 i_byte
= p
- SDATA (string
);
848 string_char_byte_cache_bytepos
= i_byte
;
849 string_char_byte_cache_charpos
= i
;
850 string_char_byte_cache_string
= string
;
855 /* Convert STRING to a multibyte string. */
858 string_make_multibyte (Lisp_Object string
)
865 if (STRING_MULTIBYTE (string
))
868 nbytes
= count_size_as_multibyte (SDATA (string
),
870 /* If all the chars are ASCII, they won't need any more bytes
871 once converted. In that case, we can return STRING itself. */
872 if (nbytes
== SBYTES (string
))
875 SAFE_ALLOCA (buf
, unsigned char *, nbytes
);
876 copy_text (SDATA (string
), buf
, SBYTES (string
),
879 ret
= make_multibyte_string ((char *) buf
, SCHARS (string
), nbytes
);
886 /* Convert STRING (if unibyte) to a multibyte string without changing
887 the number of characters. Characters 0200 trough 0237 are
888 converted to eight-bit characters. */
891 string_to_multibyte (Lisp_Object string
)
898 if (STRING_MULTIBYTE (string
))
901 nbytes
= count_size_as_multibyte (SDATA (string
), SBYTES (string
));
902 /* If all the chars are ASCII, they won't need any more bytes once
904 if (nbytes
== SBYTES (string
))
905 return make_multibyte_string (SSDATA (string
), nbytes
, nbytes
);
907 SAFE_ALLOCA (buf
, unsigned char *, nbytes
);
908 memcpy (buf
, SDATA (string
), SBYTES (string
));
909 str_to_multibyte (buf
, nbytes
, SBYTES (string
));
911 ret
= make_multibyte_string ((char *) buf
, SCHARS (string
), nbytes
);
918 /* Convert STRING to a single-byte string. */
921 string_make_unibyte (Lisp_Object string
)
928 if (! STRING_MULTIBYTE (string
))
931 nchars
= SCHARS (string
);
933 SAFE_ALLOCA (buf
, unsigned char *, nchars
);
934 copy_text (SDATA (string
), buf
, SBYTES (string
),
937 ret
= make_unibyte_string ((char *) buf
, nchars
);
943 DEFUN ("string-make-multibyte", Fstring_make_multibyte
, Sstring_make_multibyte
,
945 doc
: /* Return the multibyte equivalent of STRING.
946 If STRING is unibyte and contains non-ASCII characters, the function
947 `unibyte-char-to-multibyte' is used to convert each unibyte character
948 to a multibyte character. In this case, the returned string is a
949 newly created string with no text properties. If STRING is multibyte
950 or entirely ASCII, it is returned unchanged. In particular, when
951 STRING is unibyte and entirely ASCII, the returned string is unibyte.
952 \(When the characters are all ASCII, Emacs primitives will treat the
953 string the same way whether it is unibyte or multibyte.) */)
956 CHECK_STRING (string
);
958 return string_make_multibyte (string
);
961 DEFUN ("string-make-unibyte", Fstring_make_unibyte
, Sstring_make_unibyte
,
963 doc
: /* Return the unibyte equivalent of STRING.
964 Multibyte character codes are converted to unibyte according to
965 `nonascii-translation-table' or, if that is nil, `nonascii-insert-offset'.
966 If the lookup in the translation table fails, this function takes just
967 the low 8 bits of each character. */)
970 CHECK_STRING (string
);
972 return string_make_unibyte (string
);
975 DEFUN ("string-as-unibyte", Fstring_as_unibyte
, Sstring_as_unibyte
,
977 doc
: /* Return a unibyte string with the same individual bytes as STRING.
978 If STRING is unibyte, the result is STRING itself.
979 Otherwise it is a newly created string, with no text properties.
980 If STRING is multibyte and contains a character of charset
981 `eight-bit', it is converted to the corresponding single byte. */)
984 CHECK_STRING (string
);
986 if (STRING_MULTIBYTE (string
))
988 EMACS_INT bytes
= SBYTES (string
);
989 unsigned char *str
= (unsigned char *) xmalloc (bytes
);
991 memcpy (str
, SDATA (string
), bytes
);
992 bytes
= str_as_unibyte (str
, bytes
);
993 string
= make_unibyte_string ((char *) str
, bytes
);
999 DEFUN ("string-as-multibyte", Fstring_as_multibyte
, Sstring_as_multibyte
,
1001 doc
: /* Return a multibyte string with the same individual bytes as STRING.
1002 If STRING is multibyte, the result is STRING itself.
1003 Otherwise it is a newly created string, with no text properties.
1005 If STRING is unibyte and contains an individual 8-bit byte (i.e. not
1006 part of a correct utf-8 sequence), it is converted to the corresponding
1007 multibyte character of charset `eight-bit'.
1008 See also `string-to-multibyte'.
1010 Beware, this often doesn't really do what you think it does.
1011 It is similar to (decode-coding-string STRING 'utf-8-emacs).
1012 If you're not sure, whether to use `string-as-multibyte' or
1013 `string-to-multibyte', use `string-to-multibyte'. */)
1014 (Lisp_Object string
)
1016 CHECK_STRING (string
);
1018 if (! STRING_MULTIBYTE (string
))
1020 Lisp_Object new_string
;
1021 EMACS_INT nchars
, nbytes
;
1023 parse_str_as_multibyte (SDATA (string
),
1026 new_string
= make_uninit_multibyte_string (nchars
, nbytes
);
1027 memcpy (SDATA (new_string
), SDATA (string
), SBYTES (string
));
1028 if (nbytes
!= SBYTES (string
))
1029 str_as_multibyte (SDATA (new_string
), nbytes
,
1030 SBYTES (string
), NULL
);
1031 string
= new_string
;
1032 STRING_SET_INTERVALS (string
, NULL_INTERVAL
);
1037 DEFUN ("string-to-multibyte", Fstring_to_multibyte
, Sstring_to_multibyte
,
1039 doc
: /* Return a multibyte string with the same individual chars as STRING.
1040 If STRING is multibyte, the result is STRING itself.
1041 Otherwise it is a newly created string, with no text properties.
1043 If STRING is unibyte and contains an 8-bit byte, it is converted to
1044 the corresponding multibyte character of charset `eight-bit'.
1046 This differs from `string-as-multibyte' by converting each byte of a correct
1047 utf-8 sequence to an eight-bit character, not just bytes that don't form a
1048 correct sequence. */)
1049 (Lisp_Object string
)
1051 CHECK_STRING (string
);
1053 return string_to_multibyte (string
);
1056 DEFUN ("string-to-unibyte", Fstring_to_unibyte
, Sstring_to_unibyte
,
1058 doc
: /* Return a unibyte string with the same individual chars as STRING.
1059 If STRING is unibyte, the result is STRING itself.
1060 Otherwise it is a newly created string, with no text properties,
1061 where each `eight-bit' character is converted to the corresponding byte.
1062 If STRING contains a non-ASCII, non-`eight-bit' character,
1063 an error is signaled. */)
1064 (Lisp_Object string
)
1066 CHECK_STRING (string
);
1068 if (STRING_MULTIBYTE (string
))
1070 EMACS_INT chars
= SCHARS (string
);
1071 unsigned char *str
= (unsigned char *) xmalloc (chars
);
1072 EMACS_INT converted
= str_to_unibyte (SDATA (string
), str
, chars
, 0);
1074 if (converted
< chars
)
1075 error ("Can't convert the %"pI
"dth character to unibyte", converted
);
1076 string
= make_unibyte_string ((char *) str
, chars
);
1083 DEFUN ("copy-alist", Fcopy_alist
, Scopy_alist
, 1, 1, 0,
1084 doc
: /* Return a copy of ALIST.
1085 This is an alist which represents the same mapping from objects to objects,
1086 but does not share the alist structure with ALIST.
1087 The objects mapped (cars and cdrs of elements of the alist)
1088 are shared, however.
1089 Elements of ALIST that are not conses are also shared. */)
1092 register Lisp_Object tem
;
1097 alist
= concat (1, &alist
, Lisp_Cons
, 0);
1098 for (tem
= alist
; CONSP (tem
); tem
= XCDR (tem
))
1100 register Lisp_Object car
;
1104 XSETCAR (tem
, Fcons (XCAR (car
), XCDR (car
)));
1109 DEFUN ("substring", Fsubstring
, Ssubstring
, 2, 3, 0,
1110 doc
: /* Return a new string whose contents are a substring of STRING.
1111 The returned string consists of the characters between index FROM
1112 \(inclusive) and index TO (exclusive) of STRING. FROM and TO are
1113 zero-indexed: 0 means the first character of STRING. Negative values
1114 are counted from the end of STRING. If TO is nil, the substring runs
1115 to the end of STRING.
1117 The STRING argument may also be a vector. In that case, the return
1118 value is a new vector that contains the elements between index FROM
1119 \(inclusive) and index TO (exclusive) of that vector argument. */)
1120 (Lisp_Object string
, register Lisp_Object from
, Lisp_Object to
)
1124 EMACS_INT size_byte
= 0;
1125 EMACS_INT from_char
, to_char
;
1126 EMACS_INT from_byte
= 0, to_byte
= 0;
1128 CHECK_VECTOR_OR_STRING (string
);
1129 CHECK_NUMBER (from
);
1131 if (STRINGP (string
))
1133 size
= SCHARS (string
);
1134 size_byte
= SBYTES (string
);
1137 size
= ASIZE (string
);
1142 to_byte
= size_byte
;
1148 to_char
= XINT (to
);
1152 if (STRINGP (string
))
1153 to_byte
= string_char_to_byte (string
, to_char
);
1156 from_char
= XINT (from
);
1159 if (STRINGP (string
))
1160 from_byte
= string_char_to_byte (string
, from_char
);
1162 if (!(0 <= from_char
&& from_char
<= to_char
&& to_char
<= size
))
1163 args_out_of_range_3 (string
, make_number (from_char
),
1164 make_number (to_char
));
1166 if (STRINGP (string
))
1168 res
= make_specified_string (SSDATA (string
) + from_byte
,
1169 to_char
- from_char
, to_byte
- from_byte
,
1170 STRING_MULTIBYTE (string
));
1171 copy_text_properties (make_number (from_char
), make_number (to_char
),
1172 string
, make_number (0), res
, Qnil
);
1175 res
= Fvector (to_char
- from_char
, &AREF (string
, from_char
));
1181 DEFUN ("substring-no-properties", Fsubstring_no_properties
, Ssubstring_no_properties
, 1, 3, 0,
1182 doc
: /* Return a substring of STRING, without text properties.
1183 It starts at index FROM and ends before TO.
1184 TO may be nil or omitted; then the substring runs to the end of STRING.
1185 If FROM is nil or omitted, the substring starts at the beginning of STRING.
1186 If FROM or TO is negative, it counts from the end.
1188 With one argument, just copy STRING without its properties. */)
1189 (Lisp_Object string
, register Lisp_Object from
, Lisp_Object to
)
1191 EMACS_INT size
, size_byte
;
1192 EMACS_INT from_char
, to_char
;
1193 EMACS_INT from_byte
, to_byte
;
1195 CHECK_STRING (string
);
1197 size
= SCHARS (string
);
1198 size_byte
= SBYTES (string
);
1201 from_char
= from_byte
= 0;
1204 CHECK_NUMBER (from
);
1205 from_char
= XINT (from
);
1209 from_byte
= string_char_to_byte (string
, from_char
);
1215 to_byte
= size_byte
;
1221 to_char
= XINT (to
);
1225 to_byte
= string_char_to_byte (string
, to_char
);
1228 if (!(0 <= from_char
&& from_char
<= to_char
&& to_char
<= size
))
1229 args_out_of_range_3 (string
, make_number (from_char
),
1230 make_number (to_char
));
1232 return make_specified_string (SSDATA (string
) + from_byte
,
1233 to_char
- from_char
, to_byte
- from_byte
,
1234 STRING_MULTIBYTE (string
));
1237 /* Extract a substring of STRING, giving start and end positions
1238 both in characters and in bytes. */
1241 substring_both (Lisp_Object string
, EMACS_INT from
, EMACS_INT from_byte
,
1242 EMACS_INT to
, EMACS_INT to_byte
)
1247 CHECK_VECTOR_OR_STRING (string
);
1249 size
= STRINGP (string
) ? SCHARS (string
) : ASIZE (string
);
1251 if (!(0 <= from
&& from
<= to
&& to
<= size
))
1252 args_out_of_range_3 (string
, make_number (from
), make_number (to
));
1254 if (STRINGP (string
))
1256 res
= make_specified_string (SSDATA (string
) + from_byte
,
1257 to
- from
, to_byte
- from_byte
,
1258 STRING_MULTIBYTE (string
));
1259 copy_text_properties (make_number (from
), make_number (to
),
1260 string
, make_number (0), res
, Qnil
);
1263 res
= Fvector (to
- from
, &AREF (string
, from
));
1268 DEFUN ("nthcdr", Fnthcdr
, Snthcdr
, 2, 2, 0,
1269 doc
: /* Take cdr N times on LIST, return the result. */)
1270 (Lisp_Object n
, Lisp_Object list
)
1272 register int i
, num
;
1275 for (i
= 0; i
< num
&& !NILP (list
); i
++)
1278 CHECK_LIST_CONS (list
, list
);
1284 DEFUN ("nth", Fnth
, Snth
, 2, 2, 0,
1285 doc
: /* Return the Nth element of LIST.
1286 N counts from zero. If LIST is not that long, nil is returned. */)
1287 (Lisp_Object n
, Lisp_Object list
)
1289 return Fcar (Fnthcdr (n
, list
));
1292 DEFUN ("elt", Felt
, Selt
, 2, 2, 0,
1293 doc
: /* Return element of SEQUENCE at index N. */)
1294 (register Lisp_Object sequence
, Lisp_Object n
)
1297 if (CONSP (sequence
) || NILP (sequence
))
1298 return Fcar (Fnthcdr (n
, sequence
));
1300 /* Faref signals a "not array" error, so check here. */
1301 CHECK_ARRAY (sequence
, Qsequencep
);
1302 return Faref (sequence
, n
);
1305 DEFUN ("member", Fmember
, Smember
, 2, 2, 0,
1306 doc
: /* Return non-nil if ELT is an element of LIST. Comparison done with `equal'.
1307 The value is actually the tail of LIST whose car is ELT. */)
1308 (register Lisp_Object elt
, Lisp_Object list
)
1310 register Lisp_Object tail
;
1311 for (tail
= list
; CONSP (tail
); tail
= XCDR (tail
))
1313 register Lisp_Object tem
;
1314 CHECK_LIST_CONS (tail
, list
);
1316 if (! NILP (Fequal (elt
, tem
)))
1323 DEFUN ("memq", Fmemq
, Smemq
, 2, 2, 0,
1324 doc
: /* Return non-nil if ELT is an element of LIST. Comparison done with `eq'.
1325 The value is actually the tail of LIST whose car is ELT. */)
1326 (register Lisp_Object elt
, Lisp_Object list
)
1330 if (!CONSP (list
) || EQ (XCAR (list
), elt
))
1334 if (!CONSP (list
) || EQ (XCAR (list
), elt
))
1338 if (!CONSP (list
) || EQ (XCAR (list
), elt
))
1349 DEFUN ("memql", Fmemql
, Smemql
, 2, 2, 0,
1350 doc
: /* Return non-nil if ELT is an element of LIST. Comparison done with `eql'.
1351 The value is actually the tail of LIST whose car is ELT. */)
1352 (register Lisp_Object elt
, Lisp_Object list
)
1354 register Lisp_Object tail
;
1357 return Fmemq (elt
, list
);
1359 for (tail
= list
; CONSP (tail
); tail
= XCDR (tail
))
1361 register Lisp_Object tem
;
1362 CHECK_LIST_CONS (tail
, list
);
1364 if (FLOATP (tem
) && internal_equal (elt
, tem
, 0, 0))
1371 DEFUN ("assq", Fassq
, Sassq
, 2, 2, 0,
1372 doc
: /* Return non-nil if KEY is `eq' to the car of an element of LIST.
1373 The value is actually the first element of LIST whose car is KEY.
1374 Elements of LIST that are not conses are ignored. */)
1375 (Lisp_Object key
, Lisp_Object list
)
1380 || (CONSP (XCAR (list
))
1381 && EQ (XCAR (XCAR (list
)), key
)))
1386 || (CONSP (XCAR (list
))
1387 && EQ (XCAR (XCAR (list
)), key
)))
1392 || (CONSP (XCAR (list
))
1393 && EQ (XCAR (XCAR (list
)), key
)))
1403 /* Like Fassq but never report an error and do not allow quits.
1404 Use only on lists known never to be circular. */
1407 assq_no_quit (Lisp_Object key
, Lisp_Object list
)
1410 && (!CONSP (XCAR (list
))
1411 || !EQ (XCAR (XCAR (list
)), key
)))
1414 return CAR_SAFE (list
);
1417 DEFUN ("assoc", Fassoc
, Sassoc
, 2, 2, 0,
1418 doc
: /* Return non-nil if KEY is `equal' to the car of an element of LIST.
1419 The value is actually the first element of LIST whose car equals KEY. */)
1420 (Lisp_Object key
, Lisp_Object list
)
1427 || (CONSP (XCAR (list
))
1428 && (car
= XCAR (XCAR (list
)),
1429 EQ (car
, key
) || !NILP (Fequal (car
, key
)))))
1434 || (CONSP (XCAR (list
))
1435 && (car
= XCAR (XCAR (list
)),
1436 EQ (car
, key
) || !NILP (Fequal (car
, key
)))))
1441 || (CONSP (XCAR (list
))
1442 && (car
= XCAR (XCAR (list
)),
1443 EQ (car
, key
) || !NILP (Fequal (car
, key
)))))
1453 /* Like Fassoc but never report an error and do not allow quits.
1454 Use only on lists known never to be circular. */
1457 assoc_no_quit (Lisp_Object key
, Lisp_Object list
)
1460 && (!CONSP (XCAR (list
))
1461 || (!EQ (XCAR (XCAR (list
)), key
)
1462 && NILP (Fequal (XCAR (XCAR (list
)), key
)))))
1465 return CONSP (list
) ? XCAR (list
) : Qnil
;
1468 DEFUN ("rassq", Frassq
, Srassq
, 2, 2, 0,
1469 doc
: /* Return non-nil if KEY is `eq' to the cdr of an element of LIST.
1470 The value is actually the first element of LIST whose cdr is KEY. */)
1471 (register Lisp_Object key
, Lisp_Object list
)
1476 || (CONSP (XCAR (list
))
1477 && EQ (XCDR (XCAR (list
)), key
)))
1482 || (CONSP (XCAR (list
))
1483 && EQ (XCDR (XCAR (list
)), key
)))
1488 || (CONSP (XCAR (list
))
1489 && EQ (XCDR (XCAR (list
)), key
)))
1499 DEFUN ("rassoc", Frassoc
, Srassoc
, 2, 2, 0,
1500 doc
: /* Return non-nil if KEY is `equal' to the cdr of an element of LIST.
1501 The value is actually the first element of LIST whose cdr equals KEY. */)
1502 (Lisp_Object key
, Lisp_Object list
)
1509 || (CONSP (XCAR (list
))
1510 && (cdr
= XCDR (XCAR (list
)),
1511 EQ (cdr
, key
) || !NILP (Fequal (cdr
, key
)))))
1516 || (CONSP (XCAR (list
))
1517 && (cdr
= XCDR (XCAR (list
)),
1518 EQ (cdr
, key
) || !NILP (Fequal (cdr
, key
)))))
1523 || (CONSP (XCAR (list
))
1524 && (cdr
= XCDR (XCAR (list
)),
1525 EQ (cdr
, key
) || !NILP (Fequal (cdr
, key
)))))
1535 DEFUN ("delq", Fdelq
, Sdelq
, 2, 2, 0,
1536 doc
: /* Delete by side effect any occurrences of ELT as a member of LIST.
1537 The modified LIST is returned. Comparison is done with `eq'.
1538 If the first member of LIST is ELT, there is no way to remove it by side effect;
1539 therefore, write `(setq foo (delq element foo))'
1540 to be sure of changing the value of `foo'. */)
1541 (register Lisp_Object elt
, Lisp_Object list
)
1543 register Lisp_Object tail
, prev
;
1544 register Lisp_Object tem
;
1548 while (!NILP (tail
))
1550 CHECK_LIST_CONS (tail
, list
);
1557 Fsetcdr (prev
, XCDR (tail
));
1567 DEFUN ("delete", Fdelete
, Sdelete
, 2, 2, 0,
1568 doc
: /* Delete by side effect any occurrences of ELT as a member of SEQ.
1569 SEQ must be a list, a vector, or a string.
1570 The modified SEQ is returned. Comparison is done with `equal'.
1571 If SEQ is not a list, or the first member of SEQ is ELT, deleting it
1572 is not a side effect; it is simply using a different sequence.
1573 Therefore, write `(setq foo (delete element foo))'
1574 to be sure of changing the value of `foo'. */)
1575 (Lisp_Object elt
, Lisp_Object seq
)
1581 for (i
= n
= 0; i
< ASIZE (seq
); ++i
)
1582 if (NILP (Fequal (AREF (seq
, i
), elt
)))
1585 if (n
!= ASIZE (seq
))
1587 struct Lisp_Vector
*p
= allocate_vector (n
);
1589 for (i
= n
= 0; i
< ASIZE (seq
); ++i
)
1590 if (NILP (Fequal (AREF (seq
, i
), elt
)))
1591 p
->contents
[n
++] = AREF (seq
, i
);
1593 XSETVECTOR (seq
, p
);
1596 else if (STRINGP (seq
))
1598 EMACS_INT i
, ibyte
, nchars
, nbytes
, cbytes
;
1601 for (i
= nchars
= nbytes
= ibyte
= 0;
1603 ++i
, ibyte
+= cbytes
)
1605 if (STRING_MULTIBYTE (seq
))
1607 c
= STRING_CHAR (SDATA (seq
) + ibyte
);
1608 cbytes
= CHAR_BYTES (c
);
1616 if (!INTEGERP (elt
) || c
!= XINT (elt
))
1623 if (nchars
!= SCHARS (seq
))
1627 tem
= make_uninit_multibyte_string (nchars
, nbytes
);
1628 if (!STRING_MULTIBYTE (seq
))
1629 STRING_SET_UNIBYTE (tem
);
1631 for (i
= nchars
= nbytes
= ibyte
= 0;
1633 ++i
, ibyte
+= cbytes
)
1635 if (STRING_MULTIBYTE (seq
))
1637 c
= STRING_CHAR (SDATA (seq
) + ibyte
);
1638 cbytes
= CHAR_BYTES (c
);
1646 if (!INTEGERP (elt
) || c
!= XINT (elt
))
1648 unsigned char *from
= SDATA (seq
) + ibyte
;
1649 unsigned char *to
= SDATA (tem
) + nbytes
;
1655 for (n
= cbytes
; n
--; )
1665 Lisp_Object tail
, prev
;
1667 for (tail
= seq
, prev
= Qnil
; CONSP (tail
); tail
= XCDR (tail
))
1669 CHECK_LIST_CONS (tail
, seq
);
1671 if (!NILP (Fequal (elt
, XCAR (tail
))))
1676 Fsetcdr (prev
, XCDR (tail
));
1687 DEFUN ("nreverse", Fnreverse
, Snreverse
, 1, 1, 0,
1688 doc
: /* Reverse LIST by modifying cdr pointers.
1689 Return the reversed list. */)
1692 register Lisp_Object prev
, tail
, next
;
1694 if (NILP (list
)) return list
;
1697 while (!NILP (tail
))
1700 CHECK_LIST_CONS (tail
, list
);
1702 Fsetcdr (tail
, prev
);
1709 DEFUN ("reverse", Freverse
, Sreverse
, 1, 1, 0,
1710 doc
: /* Reverse LIST, copying. Return the reversed list.
1711 See also the function `nreverse', which is used more often. */)
1716 for (new = Qnil
; CONSP (list
); list
= XCDR (list
))
1719 new = Fcons (XCAR (list
), new);
1721 CHECK_LIST_END (list
, list
);
1725 Lisp_Object
merge (Lisp_Object org_l1
, Lisp_Object org_l2
, Lisp_Object pred
);
1727 DEFUN ("sort", Fsort
, Ssort
, 2, 2, 0,
1728 doc
: /* Sort LIST, stably, comparing elements using PREDICATE.
1729 Returns the sorted list. LIST is modified by side effects.
1730 PREDICATE is called with two elements of LIST, and should return non-nil
1731 if the first element should sort before the second. */)
1732 (Lisp_Object list
, Lisp_Object predicate
)
1734 Lisp_Object front
, back
;
1735 register Lisp_Object len
, tem
;
1736 struct gcpro gcpro1
, gcpro2
;
1737 register int length
;
1740 len
= Flength (list
);
1741 length
= XINT (len
);
1745 XSETINT (len
, (length
/ 2) - 1);
1746 tem
= Fnthcdr (len
, list
);
1748 Fsetcdr (tem
, Qnil
);
1750 GCPRO2 (front
, back
);
1751 front
= Fsort (front
, predicate
);
1752 back
= Fsort (back
, predicate
);
1754 return merge (front
, back
, predicate
);
1758 merge (Lisp_Object org_l1
, Lisp_Object org_l2
, Lisp_Object pred
)
1761 register Lisp_Object tail
;
1763 register Lisp_Object l1
, l2
;
1764 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
;
1771 /* It is sufficient to protect org_l1 and org_l2.
1772 When l1 and l2 are updated, we copy the new values
1773 back into the org_ vars. */
1774 GCPRO4 (org_l1
, org_l2
, pred
, value
);
1794 tem
= call2 (pred
, Fcar (l2
), Fcar (l1
));
1810 Fsetcdr (tail
, tem
);
1816 /* This does not check for quits. That is safe since it must terminate. */
1818 DEFUN ("plist-get", Fplist_get
, Splist_get
, 2, 2, 0,
1819 doc
: /* Extract a value from a property list.
1820 PLIST is a property list, which is a list of the form
1821 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value
1822 corresponding to the given PROP, or nil if PROP is not one of the
1823 properties on the list. This function never signals an error. */)
1824 (Lisp_Object plist
, Lisp_Object prop
)
1826 Lisp_Object tail
, halftail
;
1828 /* halftail is used to detect circular lists. */
1829 tail
= halftail
= plist
;
1830 while (CONSP (tail
) && CONSP (XCDR (tail
)))
1832 if (EQ (prop
, XCAR (tail
)))
1833 return XCAR (XCDR (tail
));
1835 tail
= XCDR (XCDR (tail
));
1836 halftail
= XCDR (halftail
);
1837 if (EQ (tail
, halftail
))
1840 #if 0 /* Unsafe version. */
1841 /* This function can be called asynchronously
1842 (setup_coding_system). Don't QUIT in that case. */
1843 if (!interrupt_input_blocked
)
1851 DEFUN ("get", Fget
, Sget
, 2, 2, 0,
1852 doc
: /* Return the value of SYMBOL's PROPNAME property.
1853 This is the last value stored with `(put SYMBOL PROPNAME VALUE)'. */)
1854 (Lisp_Object symbol
, Lisp_Object propname
)
1856 CHECK_SYMBOL (symbol
);
1857 return Fplist_get (XSYMBOL (symbol
)->plist
, propname
);
1860 DEFUN ("plist-put", Fplist_put
, Splist_put
, 3, 3, 0,
1861 doc
: /* Change value in PLIST of PROP to VAL.
1862 PLIST is a property list, which is a list of the form
1863 \(PROP1 VALUE1 PROP2 VALUE2 ...). PROP is a symbol and VAL is any object.
1864 If PROP is already a property on the list, its value is set to VAL,
1865 otherwise the new PROP VAL pair is added. The new plist is returned;
1866 use `(setq x (plist-put x prop val))' to be sure to use the new value.
1867 The PLIST is modified by side effects. */)
1868 (Lisp_Object plist
, register Lisp_Object prop
, Lisp_Object val
)
1870 register Lisp_Object tail
, prev
;
1871 Lisp_Object newcell
;
1873 for (tail
= plist
; CONSP (tail
) && CONSP (XCDR (tail
));
1874 tail
= XCDR (XCDR (tail
)))
1876 if (EQ (prop
, XCAR (tail
)))
1878 Fsetcar (XCDR (tail
), val
);
1885 newcell
= Fcons (prop
, Fcons (val
, NILP (prev
) ? plist
: XCDR (XCDR (prev
))));
1889 Fsetcdr (XCDR (prev
), newcell
);
1893 DEFUN ("put", Fput
, Sput
, 3, 3, 0,
1894 doc
: /* Store SYMBOL's PROPNAME property with value VALUE.
1895 It can be retrieved with `(get SYMBOL PROPNAME)'. */)
1896 (Lisp_Object symbol
, Lisp_Object propname
, Lisp_Object value
)
1898 CHECK_SYMBOL (symbol
);
1899 XSYMBOL (symbol
)->plist
1900 = Fplist_put (XSYMBOL (symbol
)->plist
, propname
, value
);
1904 DEFUN ("lax-plist-get", Flax_plist_get
, Slax_plist_get
, 2, 2, 0,
1905 doc
: /* Extract a value from a property list, comparing with `equal'.
1906 PLIST is a property list, which is a list of the form
1907 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value
1908 corresponding to the given PROP, or nil if PROP is not
1909 one of the properties on the list. */)
1910 (Lisp_Object plist
, Lisp_Object prop
)
1915 CONSP (tail
) && CONSP (XCDR (tail
));
1916 tail
= XCDR (XCDR (tail
)))
1918 if (! NILP (Fequal (prop
, XCAR (tail
))))
1919 return XCAR (XCDR (tail
));
1924 CHECK_LIST_END (tail
, prop
);
1929 DEFUN ("lax-plist-put", Flax_plist_put
, Slax_plist_put
, 3, 3, 0,
1930 doc
: /* Change value in PLIST of PROP to VAL, comparing with `equal'.
1931 PLIST is a property list, which is a list of the form
1932 \(PROP1 VALUE1 PROP2 VALUE2 ...). PROP and VAL are any objects.
1933 If PROP is already a property on the list, its value is set to VAL,
1934 otherwise the new PROP VAL pair is added. The new plist is returned;
1935 use `(setq x (lax-plist-put x prop val))' to be sure to use the new value.
1936 The PLIST is modified by side effects. */)
1937 (Lisp_Object plist
, register Lisp_Object prop
, Lisp_Object val
)
1939 register Lisp_Object tail
, prev
;
1940 Lisp_Object newcell
;
1942 for (tail
= plist
; CONSP (tail
) && CONSP (XCDR (tail
));
1943 tail
= XCDR (XCDR (tail
)))
1945 if (! NILP (Fequal (prop
, XCAR (tail
))))
1947 Fsetcar (XCDR (tail
), val
);
1954 newcell
= Fcons (prop
, Fcons (val
, Qnil
));
1958 Fsetcdr (XCDR (prev
), newcell
);
1962 DEFUN ("eql", Feql
, Seql
, 2, 2, 0,
1963 doc
: /* Return t if the two args are the same Lisp object.
1964 Floating-point numbers of equal value are `eql', but they may not be `eq'. */)
1965 (Lisp_Object obj1
, Lisp_Object obj2
)
1968 return internal_equal (obj1
, obj2
, 0, 0) ? Qt
: Qnil
;
1970 return EQ (obj1
, obj2
) ? Qt
: Qnil
;
1973 DEFUN ("equal", Fequal
, Sequal
, 2, 2, 0,
1974 doc
: /* Return t if two Lisp objects have similar structure and contents.
1975 They must have the same data type.
1976 Conses are compared by comparing the cars and the cdrs.
1977 Vectors and strings are compared element by element.
1978 Numbers are compared by value, but integers cannot equal floats.
1979 (Use `=' if you want integers and floats to be able to be equal.)
1980 Symbols must match exactly. */)
1981 (register Lisp_Object o1
, Lisp_Object o2
)
1983 return internal_equal (o1
, o2
, 0, 0) ? Qt
: Qnil
;
1986 DEFUN ("equal-including-properties", Fequal_including_properties
, Sequal_including_properties
, 2, 2, 0,
1987 doc
: /* Return t if two Lisp objects have similar structure and contents.
1988 This is like `equal' except that it compares the text properties
1989 of strings. (`equal' ignores text properties.) */)
1990 (register Lisp_Object o1
, Lisp_Object o2
)
1992 return internal_equal (o1
, o2
, 0, 1) ? Qt
: Qnil
;
1995 /* DEPTH is current depth of recursion. Signal an error if it
1997 PROPS, if non-nil, means compare string text properties too. */
2000 internal_equal (register Lisp_Object o1
, register Lisp_Object o2
, int depth
, int props
)
2003 error ("Stack overflow in equal");
2009 if (XTYPE (o1
) != XTYPE (o2
))
2018 d1
= extract_float (o1
);
2019 d2
= extract_float (o2
);
2020 /* If d is a NaN, then d != d. Two NaNs should be `equal' even
2021 though they are not =. */
2022 return d1
== d2
|| (d1
!= d1
&& d2
!= d2
);
2026 if (!internal_equal (XCAR (o1
), XCAR (o2
), depth
+ 1, props
))
2033 if (XMISCTYPE (o1
) != XMISCTYPE (o2
))
2037 if (!internal_equal (OVERLAY_START (o1
), OVERLAY_START (o2
),
2039 || !internal_equal (OVERLAY_END (o1
), OVERLAY_END (o2
),
2042 o1
= XOVERLAY (o1
)->plist
;
2043 o2
= XOVERLAY (o2
)->plist
;
2048 return (XMARKER (o1
)->buffer
== XMARKER (o2
)->buffer
2049 && (XMARKER (o1
)->buffer
== 0
2050 || XMARKER (o1
)->bytepos
== XMARKER (o2
)->bytepos
));
2054 case Lisp_Vectorlike
:
2057 EMACS_INT size
= ASIZE (o1
);
2058 /* Pseudovectors have the type encoded in the size field, so this test
2059 actually checks that the objects have the same type as well as the
2061 if (ASIZE (o2
) != size
)
2063 /* Boolvectors are compared much like strings. */
2064 if (BOOL_VECTOR_P (o1
))
2066 if (XBOOL_VECTOR (o1
)->size
!= XBOOL_VECTOR (o2
)->size
)
2068 if (memcmp (XBOOL_VECTOR (o1
)->data
, XBOOL_VECTOR (o2
)->data
,
2069 ((XBOOL_VECTOR (o1
)->size
2070 + BOOL_VECTOR_BITS_PER_CHAR
- 1)
2071 / BOOL_VECTOR_BITS_PER_CHAR
)))
2075 if (WINDOW_CONFIGURATIONP (o1
))
2076 return compare_window_configurations (o1
, o2
, 0);
2078 /* Aside from them, only true vectors, char-tables, compiled
2079 functions, and fonts (font-spec, font-entity, font-object)
2080 are sensible to compare, so eliminate the others now. */
2081 if (size
& PSEUDOVECTOR_FLAG
)
2083 if (!(size
& (PVEC_COMPILED
2084 | PVEC_CHAR_TABLE
| PVEC_SUB_CHAR_TABLE
| PVEC_FONT
)))
2086 size
&= PSEUDOVECTOR_SIZE_MASK
;
2088 for (i
= 0; i
< size
; i
++)
2093 if (!internal_equal (v1
, v2
, depth
+ 1, props
))
2101 if (SCHARS (o1
) != SCHARS (o2
))
2103 if (SBYTES (o1
) != SBYTES (o2
))
2105 if (memcmp (SDATA (o1
), SDATA (o2
), SBYTES (o1
)))
2107 if (props
&& !compare_string_intervals (o1
, o2
))
2119 DEFUN ("fillarray", Ffillarray
, Sfillarray
, 2, 2, 0,
2120 doc
: /* Store each element of ARRAY with ITEM.
2121 ARRAY is a vector, string, char-table, or bool-vector. */)
2122 (Lisp_Object array
, Lisp_Object item
)
2124 register EMACS_INT size
, idx
;
2127 if (VECTORP (array
))
2129 register Lisp_Object
*p
= XVECTOR (array
)->contents
;
2130 size
= ASIZE (array
);
2131 for (idx
= 0; idx
< size
; idx
++)
2134 else if (CHAR_TABLE_P (array
))
2138 for (i
= 0; i
< (1 << CHARTAB_SIZE_BITS_0
); i
++)
2139 XCHAR_TABLE (array
)->contents
[i
] = item
;
2140 XCHAR_TABLE (array
)->defalt
= item
;
2142 else if (STRINGP (array
))
2144 register unsigned char *p
= SDATA (array
);
2145 CHECK_NUMBER (item
);
2146 charval
= XINT (item
);
2147 size
= SCHARS (array
);
2148 if (STRING_MULTIBYTE (array
))
2150 unsigned char str
[MAX_MULTIBYTE_LENGTH
];
2151 int len
= CHAR_STRING (charval
, str
);
2152 EMACS_INT size_byte
= SBYTES (array
);
2153 unsigned char *p1
= p
, *endp
= p
+ size_byte
;
2156 if (size
!= size_byte
)
2159 int this_len
= BYTES_BY_CHAR_HEAD (*p1
);
2160 if (len
!= this_len
)
2161 error ("Attempt to change byte length of a string");
2164 for (i
= 0; i
< size_byte
; i
++)
2165 *p
++ = str
[i
% len
];
2168 for (idx
= 0; idx
< size
; idx
++)
2171 else if (BOOL_VECTOR_P (array
))
2173 register unsigned char *p
= XBOOL_VECTOR (array
)->data
;
2175 = ((XBOOL_VECTOR (array
)->size
+ BOOL_VECTOR_BITS_PER_CHAR
- 1)
2176 / BOOL_VECTOR_BITS_PER_CHAR
);
2178 charval
= (! NILP (item
) ? -1 : 0);
2179 for (idx
= 0; idx
< size_in_chars
- 1; idx
++)
2181 if (idx
< size_in_chars
)
2183 /* Mask out bits beyond the vector size. */
2184 if (XBOOL_VECTOR (array
)->size
% BOOL_VECTOR_BITS_PER_CHAR
)
2185 charval
&= (1 << (XBOOL_VECTOR (array
)->size
% BOOL_VECTOR_BITS_PER_CHAR
)) - 1;
2190 wrong_type_argument (Qarrayp
, array
);
2194 DEFUN ("clear-string", Fclear_string
, Sclear_string
,
2196 doc
: /* Clear the contents of STRING.
2197 This makes STRING unibyte and may change its length. */)
2198 (Lisp_Object string
)
2201 CHECK_STRING (string
);
2202 len
= SBYTES (string
);
2203 memset (SDATA (string
), 0, len
);
2204 STRING_SET_CHARS (string
, len
);
2205 STRING_SET_UNIBYTE (string
);
2211 nconc2 (Lisp_Object s1
, Lisp_Object s2
)
2213 Lisp_Object args
[2];
2216 return Fnconc (2, args
);
2219 DEFUN ("nconc", Fnconc
, Snconc
, 0, MANY
, 0,
2220 doc
: /* Concatenate any number of lists by altering them.
2221 Only the last argument is not altered, and need not be a list.
2222 usage: (nconc &rest LISTS) */)
2223 (size_t nargs
, Lisp_Object
*args
)
2225 register size_t argnum
;
2226 register Lisp_Object tail
, tem
, val
;
2230 for (argnum
= 0; argnum
< nargs
; argnum
++)
2233 if (NILP (tem
)) continue;
2238 if (argnum
+ 1 == nargs
) break;
2240 CHECK_LIST_CONS (tem
, tem
);
2249 tem
= args
[argnum
+ 1];
2250 Fsetcdr (tail
, tem
);
2252 args
[argnum
+ 1] = tail
;
2258 /* This is the guts of all mapping functions.
2259 Apply FN to each element of SEQ, one by one,
2260 storing the results into elements of VALS, a C vector of Lisp_Objects.
2261 LENI is the length of VALS, which should also be the length of SEQ. */
2264 mapcar1 (EMACS_INT leni
, Lisp_Object
*vals
, Lisp_Object fn
, Lisp_Object seq
)
2266 register Lisp_Object tail
;
2268 register EMACS_INT i
;
2269 struct gcpro gcpro1
, gcpro2
, gcpro3
;
2273 /* Don't let vals contain any garbage when GC happens. */
2274 for (i
= 0; i
< leni
; i
++)
2277 GCPRO3 (dummy
, fn
, seq
);
2279 gcpro1
.nvars
= leni
;
2283 /* We need not explicitly protect `tail' because it is used only on lists, and
2284 1) lists are not relocated and 2) the list is marked via `seq' so will not
2287 if (VECTORP (seq
) || COMPILEDP (seq
))
2289 for (i
= 0; i
< leni
; i
++)
2291 dummy
= call1 (fn
, AREF (seq
, i
));
2296 else if (BOOL_VECTOR_P (seq
))
2298 for (i
= 0; i
< leni
; i
++)
2301 byte
= XBOOL_VECTOR (seq
)->data
[i
/ BOOL_VECTOR_BITS_PER_CHAR
];
2302 dummy
= (byte
& (1 << (i
% BOOL_VECTOR_BITS_PER_CHAR
))) ? Qt
: Qnil
;
2303 dummy
= call1 (fn
, dummy
);
2308 else if (STRINGP (seq
))
2312 for (i
= 0, i_byte
= 0; i
< leni
;)
2315 EMACS_INT i_before
= i
;
2317 FETCH_STRING_CHAR_ADVANCE (c
, seq
, i
, i_byte
);
2318 XSETFASTINT (dummy
, c
);
2319 dummy
= call1 (fn
, dummy
);
2321 vals
[i_before
] = dummy
;
2324 else /* Must be a list, since Flength did not get an error */
2327 for (i
= 0; i
< leni
&& CONSP (tail
); i
++)
2329 dummy
= call1 (fn
, XCAR (tail
));
2339 DEFUN ("mapconcat", Fmapconcat
, Smapconcat
, 3, 3, 0,
2340 doc
: /* Apply FUNCTION to each element of SEQUENCE, and concat the results as strings.
2341 In between each pair of results, stick in SEPARATOR. Thus, " " as
2342 SEPARATOR results in spaces between the values returned by FUNCTION.
2343 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
2344 (Lisp_Object function
, Lisp_Object sequence
, Lisp_Object separator
)
2347 register EMACS_INT leni
;
2349 register Lisp_Object
*args
;
2350 register EMACS_INT i
;
2351 struct gcpro gcpro1
;
2355 len
= Flength (sequence
);
2356 if (CHAR_TABLE_P (sequence
))
2357 wrong_type_argument (Qlistp
, sequence
);
2359 nargs
= leni
+ leni
- 1;
2360 if (nargs
< 0) return empty_unibyte_string
;
2362 SAFE_ALLOCA_LISP (args
, nargs
);
2365 mapcar1 (leni
, args
, function
, sequence
);
2368 for (i
= leni
- 1; i
> 0; i
--)
2369 args
[i
+ i
] = args
[i
];
2371 for (i
= 1; i
< nargs
; i
+= 2)
2372 args
[i
] = separator
;
2374 ret
= Fconcat (nargs
, args
);
2380 DEFUN ("mapcar", Fmapcar
, Smapcar
, 2, 2, 0,
2381 doc
: /* Apply FUNCTION to each element of SEQUENCE, and make a list of the results.
2382 The result is a list just as long as SEQUENCE.
2383 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
2384 (Lisp_Object function
, Lisp_Object sequence
)
2386 register Lisp_Object len
;
2387 register EMACS_INT leni
;
2388 register Lisp_Object
*args
;
2392 len
= Flength (sequence
);
2393 if (CHAR_TABLE_P (sequence
))
2394 wrong_type_argument (Qlistp
, sequence
);
2395 leni
= XFASTINT (len
);
2397 SAFE_ALLOCA_LISP (args
, leni
);
2399 mapcar1 (leni
, args
, function
, sequence
);
2401 ret
= Flist (leni
, args
);
2407 DEFUN ("mapc", Fmapc
, Smapc
, 2, 2, 0,
2408 doc
: /* Apply FUNCTION to each element of SEQUENCE for side effects only.
2409 Unlike `mapcar', don't accumulate the results. Return SEQUENCE.
2410 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
2411 (Lisp_Object function
, Lisp_Object sequence
)
2413 register EMACS_INT leni
;
2415 leni
= XFASTINT (Flength (sequence
));
2416 if (CHAR_TABLE_P (sequence
))
2417 wrong_type_argument (Qlistp
, sequence
);
2418 mapcar1 (leni
, 0, function
, sequence
);
2423 /* This is how C code calls `yes-or-no-p' and allows the user
2426 Anything that calls this function must protect from GC! */
2429 do_yes_or_no_p (Lisp_Object prompt
)
2431 return call1 (intern ("yes-or-no-p"), prompt
);
2434 /* Anything that calls this function must protect from GC! */
2436 DEFUN ("yes-or-no-p", Fyes_or_no_p
, Syes_or_no_p
, 1, 1, 0,
2437 doc
: /* Ask user a yes-or-no question. Return t if answer is yes.
2438 PROMPT is the string to display to ask the question. It should end in
2439 a space; `yes-or-no-p' adds \"(yes or no) \" to it.
2441 The user must confirm the answer with RET, and can edit it until it
2444 Under a windowing system a dialog box will be used if `last-nonmenu-event'
2445 is nil, and `use-dialog-box' is non-nil. */)
2446 (Lisp_Object prompt
)
2448 register Lisp_Object ans
;
2449 Lisp_Object args
[2];
2450 struct gcpro gcpro1
;
2452 CHECK_STRING (prompt
);
2455 if (FRAME_WINDOW_P (SELECTED_FRAME ())
2456 && (NILP (last_nonmenu_event
) || CONSP (last_nonmenu_event
))
2460 Lisp_Object pane
, menu
, obj
;
2461 redisplay_preserve_echo_area (4);
2462 pane
= Fcons (Fcons (build_string ("Yes"), Qt
),
2463 Fcons (Fcons (build_string ("No"), Qnil
),
2466 menu
= Fcons (prompt
, pane
);
2467 obj
= Fx_popup_dialog (Qt
, menu
, Qnil
);
2471 #endif /* HAVE_MENUS */
2474 args
[1] = build_string ("(yes or no) ");
2475 prompt
= Fconcat (2, args
);
2481 ans
= Fdowncase (Fread_from_minibuffer (prompt
, Qnil
, Qnil
, Qnil
,
2482 Qyes_or_no_p_history
, Qnil
,
2484 if (SCHARS (ans
) == 3 && !strcmp (SSDATA (ans
), "yes"))
2489 if (SCHARS (ans
) == 2 && !strcmp (SSDATA (ans
), "no"))
2497 message ("Please answer yes or no.");
2498 Fsleep_for (make_number (2), Qnil
);
2502 DEFUN ("load-average", Fload_average
, Sload_average
, 0, 1, 0,
2503 doc
: /* Return list of 1 minute, 5 minute and 15 minute load averages.
2505 Each of the three load averages is multiplied by 100, then converted
2508 When USE-FLOATS is non-nil, floats will be used instead of integers.
2509 These floats are not multiplied by 100.
2511 If the 5-minute or 15-minute load averages are not available, return a
2512 shortened list, containing only those averages which are available.
2514 An error is thrown if the load average can't be obtained. In some
2515 cases making it work would require Emacs being installed setuid or
2516 setgid so that it can read kernel information, and that usually isn't
2518 (Lisp_Object use_floats
)
2521 int loads
= getloadavg (load_ave
, 3);
2522 Lisp_Object ret
= Qnil
;
2525 error ("load-average not implemented for this operating system");
2529 Lisp_Object load
= (NILP (use_floats
) ?
2530 make_number ((int) (100.0 * load_ave
[loads
]))
2531 : make_float (load_ave
[loads
]));
2532 ret
= Fcons (load
, ret
);
2538 static Lisp_Object Qsubfeatures
;
2540 DEFUN ("featurep", Ffeaturep
, Sfeaturep
, 1, 2, 0,
2541 doc
: /* Return t if FEATURE is present in this Emacs.
2543 Use this to conditionalize execution of lisp code based on the
2544 presence or absence of Emacs or environment extensions.
2545 Use `provide' to declare that a feature is available. This function
2546 looks at the value of the variable `features'. The optional argument
2547 SUBFEATURE can be used to check a specific subfeature of FEATURE. */)
2548 (Lisp_Object feature
, Lisp_Object subfeature
)
2550 register Lisp_Object tem
;
2551 CHECK_SYMBOL (feature
);
2552 tem
= Fmemq (feature
, Vfeatures
);
2553 if (!NILP (tem
) && !NILP (subfeature
))
2554 tem
= Fmember (subfeature
, Fget (feature
, Qsubfeatures
));
2555 return (NILP (tem
)) ? Qnil
: Qt
;
2558 DEFUN ("provide", Fprovide
, Sprovide
, 1, 2, 0,
2559 doc
: /* Announce that FEATURE is a feature of the current Emacs.
2560 The optional argument SUBFEATURES should be a list of symbols listing
2561 particular subfeatures supported in this version of FEATURE. */)
2562 (Lisp_Object feature
, Lisp_Object subfeatures
)
2564 register Lisp_Object tem
;
2565 CHECK_SYMBOL (feature
);
2566 CHECK_LIST (subfeatures
);
2567 if (!NILP (Vautoload_queue
))
2568 Vautoload_queue
= Fcons (Fcons (make_number (0), Vfeatures
),
2570 tem
= Fmemq (feature
, Vfeatures
);
2572 Vfeatures
= Fcons (feature
, Vfeatures
);
2573 if (!NILP (subfeatures
))
2574 Fput (feature
, Qsubfeatures
, subfeatures
);
2575 LOADHIST_ATTACH (Fcons (Qprovide
, feature
));
2577 /* Run any load-hooks for this file. */
2578 tem
= Fassq (feature
, Vafter_load_alist
);
2580 Fprogn (XCDR (tem
));
2585 /* `require' and its subroutines. */
2587 /* List of features currently being require'd, innermost first. */
2589 static Lisp_Object require_nesting_list
;
2592 require_unwind (Lisp_Object old_value
)
2594 return require_nesting_list
= old_value
;
2597 DEFUN ("require", Frequire
, Srequire
, 1, 3, 0,
2598 doc
: /* If feature FEATURE is not loaded, load it from FILENAME.
2599 If FEATURE is not a member of the list `features', then the feature
2600 is not loaded; so load the file FILENAME.
2601 If FILENAME is omitted, the printname of FEATURE is used as the file name,
2602 and `load' will try to load this name appended with the suffix `.elc' or
2603 `.el', in that order. The name without appended suffix will not be used.
2604 If the optional third argument NOERROR is non-nil,
2605 then return nil if the file is not found instead of signaling an error.
2606 Normally the return value is FEATURE.
2607 The normal messages at start and end of loading FILENAME are suppressed. */)
2608 (Lisp_Object feature
, Lisp_Object filename
, Lisp_Object noerror
)
2610 register Lisp_Object tem
;
2611 struct gcpro gcpro1
, gcpro2
;
2612 int from_file
= load_in_progress
;
2614 CHECK_SYMBOL (feature
);
2616 /* Record the presence of `require' in this file
2617 even if the feature specified is already loaded.
2618 But not more than once in any file,
2619 and not when we aren't loading or reading from a file. */
2621 for (tem
= Vcurrent_load_list
; CONSP (tem
); tem
= XCDR (tem
))
2622 if (NILP (XCDR (tem
)) && STRINGP (XCAR (tem
)))
2627 tem
= Fcons (Qrequire
, feature
);
2628 if (NILP (Fmember (tem
, Vcurrent_load_list
)))
2629 LOADHIST_ATTACH (tem
);
2631 tem
= Fmemq (feature
, Vfeatures
);
2635 int count
= SPECPDL_INDEX ();
2638 /* This is to make sure that loadup.el gives a clear picture
2639 of what files are preloaded and when. */
2640 if (! NILP (Vpurify_flag
))
2641 error ("(require %s) while preparing to dump",
2642 SDATA (SYMBOL_NAME (feature
)));
2644 /* A certain amount of recursive `require' is legitimate,
2645 but if we require the same feature recursively 3 times,
2647 tem
= require_nesting_list
;
2648 while (! NILP (tem
))
2650 if (! NILP (Fequal (feature
, XCAR (tem
))))
2655 error ("Recursive `require' for feature `%s'",
2656 SDATA (SYMBOL_NAME (feature
)));
2658 /* Update the list for any nested `require's that occur. */
2659 record_unwind_protect (require_unwind
, require_nesting_list
);
2660 require_nesting_list
= Fcons (feature
, require_nesting_list
);
2662 /* Value saved here is to be restored into Vautoload_queue */
2663 record_unwind_protect (un_autoload
, Vautoload_queue
);
2664 Vautoload_queue
= Qt
;
2666 /* Load the file. */
2667 GCPRO2 (feature
, filename
);
2668 tem
= Fload (NILP (filename
) ? Fsymbol_name (feature
) : filename
,
2669 noerror
, Qt
, Qnil
, (NILP (filename
) ? Qt
: Qnil
));
2672 /* If load failed entirely, return nil. */
2674 return unbind_to (count
, Qnil
);
2676 tem
= Fmemq (feature
, Vfeatures
);
2678 error ("Required feature `%s' was not provided",
2679 SDATA (SYMBOL_NAME (feature
)));
2681 /* Once loading finishes, don't undo it. */
2682 Vautoload_queue
= Qt
;
2683 feature
= unbind_to (count
, feature
);
2689 /* Primitives for work of the "widget" library.
2690 In an ideal world, this section would not have been necessary.
2691 However, lisp function calls being as slow as they are, it turns
2692 out that some functions in the widget library (wid-edit.el) are the
2693 bottleneck of Widget operation. Here is their translation to C,
2694 for the sole reason of efficiency. */
2696 DEFUN ("plist-member", Fplist_member
, Splist_member
, 2, 2, 0,
2697 doc
: /* Return non-nil if PLIST has the property PROP.
2698 PLIST is a property list, which is a list of the form
2699 \(PROP1 VALUE1 PROP2 VALUE2 ...\). PROP is a symbol.
2700 Unlike `plist-get', this allows you to distinguish between a missing
2701 property and a property with the value nil.
2702 The value is actually the tail of PLIST whose car is PROP. */)
2703 (Lisp_Object plist
, Lisp_Object prop
)
2705 while (CONSP (plist
) && !EQ (XCAR (plist
), prop
))
2708 plist
= XCDR (plist
);
2709 plist
= CDR (plist
);
2714 DEFUN ("widget-put", Fwidget_put
, Swidget_put
, 3, 3, 0,
2715 doc
: /* In WIDGET, set PROPERTY to VALUE.
2716 The value can later be retrieved with `widget-get'. */)
2717 (Lisp_Object widget
, Lisp_Object property
, Lisp_Object value
)
2719 CHECK_CONS (widget
);
2720 XSETCDR (widget
, Fplist_put (XCDR (widget
), property
, value
));
2724 DEFUN ("widget-get", Fwidget_get
, Swidget_get
, 2, 2, 0,
2725 doc
: /* In WIDGET, get the value of PROPERTY.
2726 The value could either be specified when the widget was created, or
2727 later with `widget-put'. */)
2728 (Lisp_Object widget
, Lisp_Object property
)
2736 CHECK_CONS (widget
);
2737 tmp
= Fplist_member (XCDR (widget
), property
);
2743 tmp
= XCAR (widget
);
2746 widget
= Fget (tmp
, Qwidget_type
);
2750 DEFUN ("widget-apply", Fwidget_apply
, Swidget_apply
, 2, MANY
, 0,
2751 doc
: /* Apply the value of WIDGET's PROPERTY to the widget itself.
2752 ARGS are passed as extra arguments to the function.
2753 usage: (widget-apply WIDGET PROPERTY &rest ARGS) */)
2754 (size_t nargs
, Lisp_Object
*args
)
2756 /* This function can GC. */
2757 Lisp_Object newargs
[3];
2758 struct gcpro gcpro1
, gcpro2
;
2761 newargs
[0] = Fwidget_get (args
[0], args
[1]);
2762 newargs
[1] = args
[0];
2763 newargs
[2] = Flist (nargs
- 2, args
+ 2);
2764 GCPRO2 (newargs
[0], newargs
[2]);
2765 result
= Fapply (3, newargs
);
2770 #ifdef HAVE_LANGINFO_CODESET
2771 #include <langinfo.h>
2774 DEFUN ("locale-info", Flocale_info
, Slocale_info
, 1, 1, 0,
2775 doc
: /* Access locale data ITEM for the current C locale, if available.
2776 ITEM should be one of the following:
2778 `codeset', returning the character set as a string (locale item CODESET);
2780 `days', returning a 7-element vector of day names (locale items DAY_n);
2782 `months', returning a 12-element vector of month names (locale items MON_n);
2784 `paper', returning a list (WIDTH HEIGHT) for the default paper size,
2785 both measured in millimeters (locale items PAPER_WIDTH, PAPER_HEIGHT).
2787 If the system can't provide such information through a call to
2788 `nl_langinfo', or if ITEM isn't from the list above, return nil.
2790 See also Info node `(libc)Locales'.
2792 The data read from the system are decoded using `locale-coding-system'. */)
2796 #ifdef HAVE_LANGINFO_CODESET
2798 if (EQ (item
, Qcodeset
))
2800 str
= nl_langinfo (CODESET
);
2801 return build_string (str
);
2804 else if (EQ (item
, Qdays
)) /* e.g. for calendar-day-name-array */
2806 Lisp_Object v
= Fmake_vector (make_number (7), Qnil
);
2807 const int days
[7] = {DAY_1
, DAY_2
, DAY_3
, DAY_4
, DAY_5
, DAY_6
, DAY_7
};
2809 struct gcpro gcpro1
;
2811 synchronize_system_time_locale ();
2812 for (i
= 0; i
< 7; i
++)
2814 str
= nl_langinfo (days
[i
]);
2815 val
= make_unibyte_string (str
, strlen (str
));
2816 /* Fixme: Is this coding system necessarily right, even if
2817 it is consistent with CODESET? If not, what to do? */
2818 Faset (v
, make_number (i
),
2819 code_convert_string_norecord (val
, Vlocale_coding_system
,
2827 else if (EQ (item
, Qmonths
)) /* e.g. for calendar-month-name-array */
2829 Lisp_Object v
= Fmake_vector (make_number (12), Qnil
);
2830 const int months
[12] = {MON_1
, MON_2
, MON_3
, MON_4
, MON_5
, MON_6
, MON_7
,
2831 MON_8
, MON_9
, MON_10
, MON_11
, MON_12
};
2833 struct gcpro gcpro1
;
2835 synchronize_system_time_locale ();
2836 for (i
= 0; i
< 12; i
++)
2838 str
= nl_langinfo (months
[i
]);
2839 val
= make_unibyte_string (str
, strlen (str
));
2840 Faset (v
, make_number (i
),
2841 code_convert_string_norecord (val
, Vlocale_coding_system
, 0));
2847 /* LC_PAPER stuff isn't defined as accessible in glibc as of 2.3.1,
2848 but is in the locale files. This could be used by ps-print. */
2850 else if (EQ (item
, Qpaper
))
2852 return list2 (make_number (nl_langinfo (PAPER_WIDTH
)),
2853 make_number (nl_langinfo (PAPER_HEIGHT
)));
2855 #endif /* PAPER_WIDTH */
2856 #endif /* HAVE_LANGINFO_CODESET*/
2860 /* base64 encode/decode functions (RFC 2045).
2861 Based on code from GNU recode. */
2863 #define MIME_LINE_LENGTH 76
2865 #define IS_ASCII(Character) \
2867 #define IS_BASE64(Character) \
2868 (IS_ASCII (Character) && base64_char_to_value[Character] >= 0)
2869 #define IS_BASE64_IGNORABLE(Character) \
2870 ((Character) == ' ' || (Character) == '\t' || (Character) == '\n' \
2871 || (Character) == '\f' || (Character) == '\r')
2873 /* Used by base64_decode_1 to retrieve a non-base64-ignorable
2874 character or return retval if there are no characters left to
2876 #define READ_QUADRUPLET_BYTE(retval) \
2881 if (nchars_return) \
2882 *nchars_return = nchars; \
2887 while (IS_BASE64_IGNORABLE (c))
2889 /* Table of characters coding the 64 values. */
2890 static const char base64_value_to_char
[64] =
2892 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', /* 0- 9 */
2893 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', /* 10-19 */
2894 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', /* 20-29 */
2895 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', /* 30-39 */
2896 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', /* 40-49 */
2897 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', /* 50-59 */
2898 '8', '9', '+', '/' /* 60-63 */
2901 /* Table of base64 values for first 128 characters. */
2902 static const short base64_char_to_value
[128] =
2904 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0- 9 */
2905 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 10- 19 */
2906 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 20- 29 */
2907 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 30- 39 */
2908 -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, /* 40- 49 */
2909 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, /* 50- 59 */
2910 -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, /* 60- 69 */
2911 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, /* 70- 79 */
2912 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, /* 80- 89 */
2913 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, /* 90- 99 */
2914 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, /* 100-109 */
2915 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, /* 110-119 */
2916 49, 50, 51, -1, -1, -1, -1, -1 /* 120-127 */
2919 /* The following diagram shows the logical steps by which three octets
2920 get transformed into four base64 characters.
2922 .--------. .--------. .--------.
2923 |aaaaaabb| |bbbbcccc| |ccdddddd|
2924 `--------' `--------' `--------'
2926 .--------+--------+--------+--------.
2927 |00aaaaaa|00bbbbbb|00cccccc|00dddddd|
2928 `--------+--------+--------+--------'
2930 .--------+--------+--------+--------.
2931 |AAAAAAAA|BBBBBBBB|CCCCCCCC|DDDDDDDD|
2932 `--------+--------+--------+--------'
2934 The octets are divided into 6 bit chunks, which are then encoded into
2935 base64 characters. */
2938 static EMACS_INT
base64_encode_1 (const char *, char *, EMACS_INT
, int, int);
2939 static EMACS_INT
base64_decode_1 (const char *, char *, EMACS_INT
, int,
2942 DEFUN ("base64-encode-region", Fbase64_encode_region
, Sbase64_encode_region
,
2944 doc
: /* Base64-encode the region between BEG and END.
2945 Return the length of the encoded text.
2946 Optional third argument NO-LINE-BREAK means do not break long lines
2947 into shorter lines. */)
2948 (Lisp_Object beg
, Lisp_Object end
, Lisp_Object no_line_break
)
2951 EMACS_INT allength
, length
;
2952 EMACS_INT ibeg
, iend
, encoded_length
;
2953 EMACS_INT old_pos
= PT
;
2956 validate_region (&beg
, &end
);
2958 ibeg
= CHAR_TO_BYTE (XFASTINT (beg
));
2959 iend
= CHAR_TO_BYTE (XFASTINT (end
));
2960 move_gap_both (XFASTINT (beg
), ibeg
);
2962 /* We need to allocate enough room for encoding the text.
2963 We need 33 1/3% more space, plus a newline every 76
2964 characters, and then we round up. */
2965 length
= iend
- ibeg
;
2966 allength
= length
+ length
/3 + 1;
2967 allength
+= allength
/ MIME_LINE_LENGTH
+ 1 + 6;
2969 SAFE_ALLOCA (encoded
, char *, allength
);
2970 encoded_length
= base64_encode_1 ((char *) BYTE_POS_ADDR (ibeg
),
2971 encoded
, length
, NILP (no_line_break
),
2972 !NILP (BVAR (current_buffer
, enable_multibyte_characters
)));
2973 if (encoded_length
> allength
)
2976 if (encoded_length
< 0)
2978 /* The encoding wasn't possible. */
2980 error ("Multibyte character in data for base64 encoding");
2983 /* Now we have encoded the region, so we insert the new contents
2984 and delete the old. (Insert first in order to preserve markers.) */
2985 SET_PT_BOTH (XFASTINT (beg
), ibeg
);
2986 insert (encoded
, encoded_length
);
2988 del_range_byte (ibeg
+ encoded_length
, iend
+ encoded_length
, 1);
2990 /* If point was outside of the region, restore it exactly; else just
2991 move to the beginning of the region. */
2992 if (old_pos
>= XFASTINT (end
))
2993 old_pos
+= encoded_length
- (XFASTINT (end
) - XFASTINT (beg
));
2994 else if (old_pos
> XFASTINT (beg
))
2995 old_pos
= XFASTINT (beg
);
2998 /* We return the length of the encoded text. */
2999 return make_number (encoded_length
);
3002 DEFUN ("base64-encode-string", Fbase64_encode_string
, Sbase64_encode_string
,
3004 doc
: /* Base64-encode STRING and return the result.
3005 Optional second argument NO-LINE-BREAK means do not break long lines
3006 into shorter lines. */)
3007 (Lisp_Object string
, Lisp_Object no_line_break
)
3009 EMACS_INT allength
, length
, encoded_length
;
3011 Lisp_Object encoded_string
;
3014 CHECK_STRING (string
);
3016 /* We need to allocate enough room for encoding the text.
3017 We need 33 1/3% more space, plus a newline every 76
3018 characters, and then we round up. */
3019 length
= SBYTES (string
);
3020 allength
= length
+ length
/3 + 1;
3021 allength
+= allength
/ MIME_LINE_LENGTH
+ 1 + 6;
3023 /* We need to allocate enough room for decoding the text. */
3024 SAFE_ALLOCA (encoded
, char *, allength
);
3026 encoded_length
= base64_encode_1 (SSDATA (string
),
3027 encoded
, length
, NILP (no_line_break
),
3028 STRING_MULTIBYTE (string
));
3029 if (encoded_length
> allength
)
3032 if (encoded_length
< 0)
3034 /* The encoding wasn't possible. */
3036 error ("Multibyte character in data for base64 encoding");
3039 encoded_string
= make_unibyte_string (encoded
, encoded_length
);
3042 return encoded_string
;
3046 base64_encode_1 (const char *from
, char *to
, EMACS_INT length
,
3047 int line_break
, int multibyte
)
3060 c
= STRING_CHAR_AND_LENGTH ((unsigned char *) from
+ i
, bytes
);
3061 if (CHAR_BYTE8_P (c
))
3062 c
= CHAR_TO_BYTE8 (c
);
3070 /* Wrap line every 76 characters. */
3074 if (counter
< MIME_LINE_LENGTH
/ 4)
3083 /* Process first byte of a triplet. */
3085 *e
++ = base64_value_to_char
[0x3f & c
>> 2];
3086 value
= (0x03 & c
) << 4;
3088 /* Process second byte of a triplet. */
3092 *e
++ = base64_value_to_char
[value
];
3100 c
= STRING_CHAR_AND_LENGTH ((unsigned char *) from
+ i
, bytes
);
3101 if (CHAR_BYTE8_P (c
))
3102 c
= CHAR_TO_BYTE8 (c
);
3110 *e
++ = base64_value_to_char
[value
| (0x0f & c
>> 4)];
3111 value
= (0x0f & c
) << 2;
3113 /* Process third byte of a triplet. */
3117 *e
++ = base64_value_to_char
[value
];
3124 c
= STRING_CHAR_AND_LENGTH ((unsigned char *) from
+ i
, bytes
);
3125 if (CHAR_BYTE8_P (c
))
3126 c
= CHAR_TO_BYTE8 (c
);
3134 *e
++ = base64_value_to_char
[value
| (0x03 & c
>> 6)];
3135 *e
++ = base64_value_to_char
[0x3f & c
];
3142 DEFUN ("base64-decode-region", Fbase64_decode_region
, Sbase64_decode_region
,
3144 doc
: /* Base64-decode the region between BEG and END.
3145 Return the length of the decoded text.
3146 If the region can't be decoded, signal an error and don't modify the buffer. */)
3147 (Lisp_Object beg
, Lisp_Object end
)
3149 EMACS_INT ibeg
, iend
, length
, allength
;
3151 EMACS_INT old_pos
= PT
;
3152 EMACS_INT decoded_length
;
3153 EMACS_INT inserted_chars
;
3154 int multibyte
= !NILP (BVAR (current_buffer
, enable_multibyte_characters
));
3157 validate_region (&beg
, &end
);
3159 ibeg
= CHAR_TO_BYTE (XFASTINT (beg
));
3160 iend
= CHAR_TO_BYTE (XFASTINT (end
));
3162 length
= iend
- ibeg
;
3164 /* We need to allocate enough room for decoding the text. If we are
3165 working on a multibyte buffer, each decoded code may occupy at
3167 allength
= multibyte
? length
* 2 : length
;
3168 SAFE_ALLOCA (decoded
, char *, allength
);
3170 move_gap_both (XFASTINT (beg
), ibeg
);
3171 decoded_length
= base64_decode_1 ((char *) BYTE_POS_ADDR (ibeg
),
3173 multibyte
, &inserted_chars
);
3174 if (decoded_length
> allength
)
3177 if (decoded_length
< 0)
3179 /* The decoding wasn't possible. */
3181 error ("Invalid base64 data");
3184 /* Now we have decoded the region, so we insert the new contents
3185 and delete the old. (Insert first in order to preserve markers.) */
3186 TEMP_SET_PT_BOTH (XFASTINT (beg
), ibeg
);
3187 insert_1_both (decoded
, inserted_chars
, decoded_length
, 0, 1, 0);
3190 /* Delete the original text. */
3191 del_range_both (PT
, PT_BYTE
, XFASTINT (end
) + inserted_chars
,
3192 iend
+ decoded_length
, 1);
3194 /* If point was outside of the region, restore it exactly; else just
3195 move to the beginning of the region. */
3196 if (old_pos
>= XFASTINT (end
))
3197 old_pos
+= inserted_chars
- (XFASTINT (end
) - XFASTINT (beg
));
3198 else if (old_pos
> XFASTINT (beg
))
3199 old_pos
= XFASTINT (beg
);
3200 SET_PT (old_pos
> ZV
? ZV
: old_pos
);
3202 return make_number (inserted_chars
);
3205 DEFUN ("base64-decode-string", Fbase64_decode_string
, Sbase64_decode_string
,
3207 doc
: /* Base64-decode STRING and return the result. */)
3208 (Lisp_Object string
)
3211 EMACS_INT length
, decoded_length
;
3212 Lisp_Object decoded_string
;
3215 CHECK_STRING (string
);
3217 length
= SBYTES (string
);
3218 /* We need to allocate enough room for decoding the text. */
3219 SAFE_ALLOCA (decoded
, char *, length
);
3221 /* The decoded result should be unibyte. */
3222 decoded_length
= base64_decode_1 (SSDATA (string
), decoded
, length
,
3224 if (decoded_length
> length
)
3226 else if (decoded_length
>= 0)
3227 decoded_string
= make_unibyte_string (decoded
, decoded_length
);
3229 decoded_string
= Qnil
;
3232 if (!STRINGP (decoded_string
))
3233 error ("Invalid base64 data");
3235 return decoded_string
;
3238 /* Base64-decode the data at FROM of LENGHT bytes into TO. If
3239 MULTIBYTE is nonzero, the decoded result should be in multibyte
3240 form. If NCHARS_RETRUN is not NULL, store the number of produced
3241 characters in *NCHARS_RETURN. */
3244 base64_decode_1 (const char *from
, char *to
, EMACS_INT length
,
3245 int multibyte
, EMACS_INT
*nchars_return
)
3247 EMACS_INT i
= 0; /* Used inside READ_QUADRUPLET_BYTE */
3250 unsigned long value
;
3251 EMACS_INT nchars
= 0;
3255 /* Process first byte of a quadruplet. */
3257 READ_QUADRUPLET_BYTE (e
-to
);
3261 value
= base64_char_to_value
[c
] << 18;
3263 /* Process second byte of a quadruplet. */
3265 READ_QUADRUPLET_BYTE (-1);
3269 value
|= base64_char_to_value
[c
] << 12;
3271 c
= (unsigned char) (value
>> 16);
3272 if (multibyte
&& c
>= 128)
3273 e
+= BYTE8_STRING (c
, e
);
3278 /* Process third byte of a quadruplet. */
3280 READ_QUADRUPLET_BYTE (-1);
3284 READ_QUADRUPLET_BYTE (-1);
3293 value
|= base64_char_to_value
[c
] << 6;
3295 c
= (unsigned char) (0xff & value
>> 8);
3296 if (multibyte
&& c
>= 128)
3297 e
+= BYTE8_STRING (c
, e
);
3302 /* Process fourth byte of a quadruplet. */
3304 READ_QUADRUPLET_BYTE (-1);
3311 value
|= base64_char_to_value
[c
];
3313 c
= (unsigned char) (0xff & value
);
3314 if (multibyte
&& c
>= 128)
3315 e
+= BYTE8_STRING (c
, e
);
3324 /***********************************************************************
3326 ***** Hash Tables *****
3328 ***********************************************************************/
3330 /* Implemented by gerd@gnu.org. This hash table implementation was
3331 inspired by CMUCL hash tables. */
3335 1. For small tables, association lists are probably faster than
3336 hash tables because they have lower overhead.
3338 For uses of hash tables where the O(1) behavior of table
3339 operations is not a requirement, it might therefore be a good idea
3340 not to hash. Instead, we could just do a linear search in the
3341 key_and_value vector of the hash table. This could be done
3342 if a `:linear-search t' argument is given to make-hash-table. */
3345 /* The list of all weak hash tables. Don't staticpro this one. */
3347 static struct Lisp_Hash_Table
*weak_hash_tables
;
3349 /* Various symbols. */
3351 static Lisp_Object Qhash_table_p
, Qkey
, Qvalue
;
3352 Lisp_Object Qeq
, Qeql
, Qequal
;
3353 Lisp_Object QCtest
, QCsize
, QCrehash_size
, QCrehash_threshold
, QCweakness
;
3354 static Lisp_Object Qhash_table_test
, Qkey_or_value
, Qkey_and_value
;
3356 /* Function prototypes. */
3358 static struct Lisp_Hash_Table
*check_hash_table (Lisp_Object
);
3359 static size_t get_key_arg (Lisp_Object
, size_t, Lisp_Object
*, char *);
3360 static void maybe_resize_hash_table (struct Lisp_Hash_Table
*);
3361 static int sweep_weak_table (struct Lisp_Hash_Table
*, int);
3365 /***********************************************************************
3367 ***********************************************************************/
3369 /* If OBJ is a Lisp hash table, return a pointer to its struct
3370 Lisp_Hash_Table. Otherwise, signal an error. */
3372 static struct Lisp_Hash_Table
*
3373 check_hash_table (Lisp_Object obj
)
3375 CHECK_HASH_TABLE (obj
);
3376 return XHASH_TABLE (obj
);
3380 /* Value is the next integer I >= N, N >= 0 which is "almost" a prime
3384 next_almost_prime (EMACS_INT n
)
3396 /* Find KEY in ARGS which has size NARGS. Don't consider indices for
3397 which USED[I] is non-zero. If found at index I in ARGS, set
3398 USED[I] and USED[I + 1] to 1, and return I + 1. Otherwise return
3399 0. This function is used to extract a keyword/argument pair from
3400 a DEFUN parameter list. */
3403 get_key_arg (Lisp_Object key
, size_t nargs
, Lisp_Object
*args
, char *used
)
3407 for (i
= 1; i
< nargs
; i
++)
3408 if (!used
[i
- 1] && EQ (args
[i
- 1], key
))
3419 /* Return a Lisp vector which has the same contents as VEC but has
3420 size NEW_SIZE, NEW_SIZE >= VEC->size. Entries in the resulting
3421 vector that are not copied from VEC are set to INIT. */
3424 larger_vector (Lisp_Object vec
, EMACS_INT new_size
, Lisp_Object init
)
3426 struct Lisp_Vector
*v
;
3427 EMACS_INT i
, old_size
;
3429 xassert (VECTORP (vec
));
3430 old_size
= ASIZE (vec
);
3431 xassert (new_size
>= old_size
);
3433 v
= allocate_vector (new_size
);
3434 memcpy (v
->contents
, XVECTOR (vec
)->contents
, old_size
* sizeof *v
->contents
);
3435 for (i
= old_size
; i
< new_size
; ++i
)
3436 v
->contents
[i
] = init
;
3437 XSETVECTOR (vec
, v
);
3442 /***********************************************************************
3444 ***********************************************************************/
3446 /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code
3447 HASH2 in hash table H using `eql'. Value is non-zero if KEY1 and
3448 KEY2 are the same. */
3451 cmpfn_eql (struct Lisp_Hash_Table
*h
,
3452 Lisp_Object key1
, EMACS_UINT hash1
,
3453 Lisp_Object key2
, EMACS_UINT hash2
)
3455 return (FLOATP (key1
)
3457 && XFLOAT_DATA (key1
) == XFLOAT_DATA (key2
));
3461 /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code
3462 HASH2 in hash table H using `equal'. Value is non-zero if KEY1 and
3463 KEY2 are the same. */
3466 cmpfn_equal (struct Lisp_Hash_Table
*h
,
3467 Lisp_Object key1
, EMACS_UINT hash1
,
3468 Lisp_Object key2
, EMACS_UINT hash2
)
3470 return hash1
== hash2
&& !NILP (Fequal (key1
, key2
));
3474 /* Compare KEY1 which has hash code HASH1, and KEY2 with hash code
3475 HASH2 in hash table H using H->user_cmp_function. Value is non-zero
3476 if KEY1 and KEY2 are the same. */
3479 cmpfn_user_defined (struct Lisp_Hash_Table
*h
,
3480 Lisp_Object key1
, EMACS_UINT hash1
,
3481 Lisp_Object key2
, EMACS_UINT hash2
)
3485 Lisp_Object args
[3];
3487 args
[0] = h
->user_cmp_function
;
3490 return !NILP (Ffuncall (3, args
));
3497 /* Value is a hash code for KEY for use in hash table H which uses
3498 `eq' to compare keys. The hash code returned is guaranteed to fit
3499 in a Lisp integer. */
3502 hashfn_eq (struct Lisp_Hash_Table
*h
, Lisp_Object key
)
3504 EMACS_UINT hash
= XUINT (key
) ^ XTYPE (key
);
3505 xassert ((hash
& ~INTMASK
) == 0);
3510 /* Value is a hash code for KEY for use in hash table H which uses
3511 `eql' to compare keys. The hash code returned is guaranteed to fit
3512 in a Lisp integer. */
3515 hashfn_eql (struct Lisp_Hash_Table
*h
, Lisp_Object key
)
3519 hash
= sxhash (key
, 0);
3521 hash
= XUINT (key
) ^ XTYPE (key
);
3522 xassert ((hash
& ~INTMASK
) == 0);
3527 /* Value is a hash code for KEY for use in hash table H which uses
3528 `equal' to compare keys. The hash code returned is guaranteed to fit
3529 in a Lisp integer. */
3532 hashfn_equal (struct Lisp_Hash_Table
*h
, Lisp_Object key
)
3534 EMACS_UINT hash
= sxhash (key
, 0);
3535 xassert ((hash
& ~INTMASK
) == 0);
3540 /* Value is a hash code for KEY for use in hash table H which uses as
3541 user-defined function to compare keys. The hash code returned is
3542 guaranteed to fit in a Lisp integer. */
3545 hashfn_user_defined (struct Lisp_Hash_Table
*h
, Lisp_Object key
)
3547 Lisp_Object args
[2], hash
;
3549 args
[0] = h
->user_hash_function
;
3551 hash
= Ffuncall (2, args
);
3552 if (!INTEGERP (hash
))
3553 signal_error ("Invalid hash code returned from user-supplied hash function", hash
);
3554 return XUINT (hash
);
3558 /* Create and initialize a new hash table.
3560 TEST specifies the test the hash table will use to compare keys.
3561 It must be either one of the predefined tests `eq', `eql' or
3562 `equal' or a symbol denoting a user-defined test named TEST with
3563 test and hash functions USER_TEST and USER_HASH.
3565 Give the table initial capacity SIZE, SIZE >= 0, an integer.
3567 If REHASH_SIZE is an integer, it must be > 0, and this hash table's
3568 new size when it becomes full is computed by adding REHASH_SIZE to
3569 its old size. If REHASH_SIZE is a float, it must be > 1.0, and the
3570 table's new size is computed by multiplying its old size with
3573 REHASH_THRESHOLD must be a float <= 1.0, and > 0. The table will
3574 be resized when the ratio of (number of entries in the table) /
3575 (table size) is >= REHASH_THRESHOLD.
3577 WEAK specifies the weakness of the table. If non-nil, it must be
3578 one of the symbols `key', `value', `key-or-value', or `key-and-value'. */
3581 make_hash_table (Lisp_Object test
, Lisp_Object size
, Lisp_Object rehash_size
,
3582 Lisp_Object rehash_threshold
, Lisp_Object weak
,
3583 Lisp_Object user_test
, Lisp_Object user_hash
)
3585 struct Lisp_Hash_Table
*h
;
3587 EMACS_INT index_size
, i
, sz
;
3590 /* Preconditions. */
3591 xassert (SYMBOLP (test
));
3592 xassert (INTEGERP (size
) && XINT (size
) >= 0);
3593 xassert ((INTEGERP (rehash_size
) && XINT (rehash_size
) > 0)
3594 || (FLOATP (rehash_size
) && 1 < XFLOAT_DATA (rehash_size
)));
3595 xassert (FLOATP (rehash_threshold
)
3596 && 0 < XFLOAT_DATA (rehash_threshold
)
3597 && XFLOAT_DATA (rehash_threshold
) <= 1.0);
3599 if (XFASTINT (size
) == 0)
3600 size
= make_number (1);
3602 sz
= XFASTINT (size
);
3603 index_float
= sz
/ XFLOAT_DATA (rehash_threshold
);
3604 index_size
= (index_float
< MOST_POSITIVE_FIXNUM
+ 1
3605 ? next_almost_prime (index_float
)
3606 : MOST_POSITIVE_FIXNUM
+ 1);
3607 if (MOST_POSITIVE_FIXNUM
< max (index_size
, 2 * sz
))
3608 error ("Hash table too large");
3610 /* Allocate a table and initialize it. */
3611 h
= allocate_hash_table ();
3613 /* Initialize hash table slots. */
3615 if (EQ (test
, Qeql
))
3617 h
->cmpfn
= cmpfn_eql
;
3618 h
->hashfn
= hashfn_eql
;
3620 else if (EQ (test
, Qeq
))
3623 h
->hashfn
= hashfn_eq
;
3625 else if (EQ (test
, Qequal
))
3627 h
->cmpfn
= cmpfn_equal
;
3628 h
->hashfn
= hashfn_equal
;
3632 h
->user_cmp_function
= user_test
;
3633 h
->user_hash_function
= user_hash
;
3634 h
->cmpfn
= cmpfn_user_defined
;
3635 h
->hashfn
= hashfn_user_defined
;
3639 h
->rehash_threshold
= rehash_threshold
;
3640 h
->rehash_size
= rehash_size
;
3642 h
->key_and_value
= Fmake_vector (make_number (2 * sz
), Qnil
);
3643 h
->hash
= Fmake_vector (size
, Qnil
);
3644 h
->next
= Fmake_vector (size
, Qnil
);
3645 h
->index
= Fmake_vector (make_number (index_size
), Qnil
);
3647 /* Set up the free list. */
3648 for (i
= 0; i
< sz
- 1; ++i
)
3649 HASH_NEXT (h
, i
) = make_number (i
+ 1);
3650 h
->next_free
= make_number (0);
3652 XSET_HASH_TABLE (table
, h
);
3653 xassert (HASH_TABLE_P (table
));
3654 xassert (XHASH_TABLE (table
) == h
);
3656 /* Maybe add this hash table to the list of all weak hash tables. */
3658 h
->next_weak
= NULL
;
3661 h
->next_weak
= weak_hash_tables
;
3662 weak_hash_tables
= h
;
3669 /* Return a copy of hash table H1. Keys and values are not copied,
3670 only the table itself is. */
3673 copy_hash_table (struct Lisp_Hash_Table
*h1
)
3676 struct Lisp_Hash_Table
*h2
;
3677 struct Lisp_Vector
*next
;
3679 h2
= allocate_hash_table ();
3680 next
= h2
->header
.next
.vector
;
3681 memcpy (h2
, h1
, sizeof *h2
);
3682 h2
->header
.next
.vector
= next
;
3683 h2
->key_and_value
= Fcopy_sequence (h1
->key_and_value
);
3684 h2
->hash
= Fcopy_sequence (h1
->hash
);
3685 h2
->next
= Fcopy_sequence (h1
->next
);
3686 h2
->index
= Fcopy_sequence (h1
->index
);
3687 XSET_HASH_TABLE (table
, h2
);
3689 /* Maybe add this hash table to the list of all weak hash tables. */
3690 if (!NILP (h2
->weak
))
3692 h2
->next_weak
= weak_hash_tables
;
3693 weak_hash_tables
= h2
;
3700 /* Resize hash table H if it's too full. If H cannot be resized
3701 because it's already too large, throw an error. */
3704 maybe_resize_hash_table (struct Lisp_Hash_Table
*h
)
3706 if (NILP (h
->next_free
))
3708 EMACS_INT old_size
= HASH_TABLE_SIZE (h
);
3709 EMACS_INT i
, new_size
, index_size
;
3713 if (INTEGERP (h
->rehash_size
))
3714 new_size
= old_size
+ XFASTINT (h
->rehash_size
);
3717 double float_new_size
= old_size
* XFLOAT_DATA (h
->rehash_size
);
3718 if (float_new_size
< MOST_POSITIVE_FIXNUM
+ 1)
3720 new_size
= float_new_size
;
3721 if (new_size
<= old_size
)
3722 new_size
= old_size
+ 1;
3725 new_size
= MOST_POSITIVE_FIXNUM
+ 1;
3727 index_float
= new_size
/ XFLOAT_DATA (h
->rehash_threshold
);
3728 index_size
= (index_float
< MOST_POSITIVE_FIXNUM
+ 1
3729 ? next_almost_prime (index_float
)
3730 : MOST_POSITIVE_FIXNUM
+ 1);
3731 nsize
= max (index_size
, 2 * new_size
);
3732 if (nsize
> MOST_POSITIVE_FIXNUM
)
3733 error ("Hash table too large to resize");
3735 h
->key_and_value
= larger_vector (h
->key_and_value
, 2 * new_size
, Qnil
);
3736 h
->next
= larger_vector (h
->next
, new_size
, Qnil
);
3737 h
->hash
= larger_vector (h
->hash
, new_size
, Qnil
);
3738 h
->index
= Fmake_vector (make_number (index_size
), Qnil
);
3740 /* Update the free list. Do it so that new entries are added at
3741 the end of the free list. This makes some operations like
3743 for (i
= old_size
; i
< new_size
- 1; ++i
)
3744 HASH_NEXT (h
, i
) = make_number (i
+ 1);
3746 if (!NILP (h
->next_free
))
3748 Lisp_Object last
, next
;
3750 last
= h
->next_free
;
3751 while (next
= HASH_NEXT (h
, XFASTINT (last
)),
3755 HASH_NEXT (h
, XFASTINT (last
)) = make_number (old_size
);
3758 XSETFASTINT (h
->next_free
, old_size
);
3761 for (i
= 0; i
< old_size
; ++i
)
3762 if (!NILP (HASH_HASH (h
, i
)))
3764 EMACS_UINT hash_code
= XUINT (HASH_HASH (h
, i
));
3765 EMACS_INT start_of_bucket
= hash_code
% ASIZE (h
->index
);
3766 HASH_NEXT (h
, i
) = HASH_INDEX (h
, start_of_bucket
);
3767 HASH_INDEX (h
, start_of_bucket
) = make_number (i
);
3773 /* Lookup KEY in hash table H. If HASH is non-null, return in *HASH
3774 the hash code of KEY. Value is the index of the entry in H
3775 matching KEY, or -1 if not found. */
3778 hash_lookup (struct Lisp_Hash_Table
*h
, Lisp_Object key
, EMACS_UINT
*hash
)
3780 EMACS_UINT hash_code
;
3781 EMACS_INT start_of_bucket
;
3784 hash_code
= h
->hashfn (h
, key
);
3788 start_of_bucket
= hash_code
% ASIZE (h
->index
);
3789 idx
= HASH_INDEX (h
, start_of_bucket
);
3791 /* We need not gcpro idx since it's either an integer or nil. */
3794 EMACS_INT i
= XFASTINT (idx
);
3795 if (EQ (key
, HASH_KEY (h
, i
))
3797 && h
->cmpfn (h
, key
, hash_code
,
3798 HASH_KEY (h
, i
), XUINT (HASH_HASH (h
, i
)))))
3800 idx
= HASH_NEXT (h
, i
);
3803 return NILP (idx
) ? -1 : XFASTINT (idx
);
3807 /* Put an entry into hash table H that associates KEY with VALUE.
3808 HASH is a previously computed hash code of KEY.
3809 Value is the index of the entry in H matching KEY. */
3812 hash_put (struct Lisp_Hash_Table
*h
, Lisp_Object key
, Lisp_Object value
,
3815 EMACS_INT start_of_bucket
, i
;
3817 xassert ((hash
& ~INTMASK
) == 0);
3819 /* Increment count after resizing because resizing may fail. */
3820 maybe_resize_hash_table (h
);
3823 /* Store key/value in the key_and_value vector. */
3824 i
= XFASTINT (h
->next_free
);
3825 h
->next_free
= HASH_NEXT (h
, i
);
3826 HASH_KEY (h
, i
) = key
;
3827 HASH_VALUE (h
, i
) = value
;
3829 /* Remember its hash code. */
3830 HASH_HASH (h
, i
) = make_number (hash
);
3832 /* Add new entry to its collision chain. */
3833 start_of_bucket
= hash
% ASIZE (h
->index
);
3834 HASH_NEXT (h
, i
) = HASH_INDEX (h
, start_of_bucket
);
3835 HASH_INDEX (h
, start_of_bucket
) = make_number (i
);
3840 /* Remove the entry matching KEY from hash table H, if there is one. */
3843 hash_remove_from_table (struct Lisp_Hash_Table
*h
, Lisp_Object key
)
3845 EMACS_UINT hash_code
;
3846 EMACS_INT start_of_bucket
;
3847 Lisp_Object idx
, prev
;
3849 hash_code
= h
->hashfn (h
, key
);
3850 start_of_bucket
= hash_code
% ASIZE (h
->index
);
3851 idx
= HASH_INDEX (h
, start_of_bucket
);
3854 /* We need not gcpro idx, prev since they're either integers or nil. */
3857 EMACS_INT i
= XFASTINT (idx
);
3859 if (EQ (key
, HASH_KEY (h
, i
))
3861 && h
->cmpfn (h
, key
, hash_code
,
3862 HASH_KEY (h
, i
), XUINT (HASH_HASH (h
, i
)))))
3864 /* Take entry out of collision chain. */
3866 HASH_INDEX (h
, start_of_bucket
) = HASH_NEXT (h
, i
);
3868 HASH_NEXT (h
, XFASTINT (prev
)) = HASH_NEXT (h
, i
);
3870 /* Clear slots in key_and_value and add the slots to
3872 HASH_KEY (h
, i
) = HASH_VALUE (h
, i
) = HASH_HASH (h
, i
) = Qnil
;
3873 HASH_NEXT (h
, i
) = h
->next_free
;
3874 h
->next_free
= make_number (i
);
3876 xassert (h
->count
>= 0);
3882 idx
= HASH_NEXT (h
, i
);
3888 /* Clear hash table H. */
3891 hash_clear (struct Lisp_Hash_Table
*h
)
3895 EMACS_INT i
, size
= HASH_TABLE_SIZE (h
);
3897 for (i
= 0; i
< size
; ++i
)
3899 HASH_NEXT (h
, i
) = i
< size
- 1 ? make_number (i
+ 1) : Qnil
;
3900 HASH_KEY (h
, i
) = Qnil
;
3901 HASH_VALUE (h
, i
) = Qnil
;
3902 HASH_HASH (h
, i
) = Qnil
;
3905 for (i
= 0; i
< ASIZE (h
->index
); ++i
)
3906 ASET (h
->index
, i
, Qnil
);
3908 h
->next_free
= make_number (0);
3915 /************************************************************************
3917 ************************************************************************/
3920 init_weak_hash_tables (void)
3922 weak_hash_tables
= NULL
;
3925 /* Sweep weak hash table H. REMOVE_ENTRIES_P non-zero means remove
3926 entries from the table that don't survive the current GC.
3927 REMOVE_ENTRIES_P zero means mark entries that are in use. Value is
3928 non-zero if anything was marked. */
3931 sweep_weak_table (struct Lisp_Hash_Table
*h
, int remove_entries_p
)
3933 EMACS_INT bucket
, n
;
3936 n
= ASIZE (h
->index
) & ~ARRAY_MARK_FLAG
;
3939 for (bucket
= 0; bucket
< n
; ++bucket
)
3941 Lisp_Object idx
, next
, prev
;
3943 /* Follow collision chain, removing entries that
3944 don't survive this garbage collection. */
3946 for (idx
= HASH_INDEX (h
, bucket
); !NILP (idx
); idx
= next
)
3948 EMACS_INT i
= XFASTINT (idx
);
3949 int key_known_to_survive_p
= survives_gc_p (HASH_KEY (h
, i
));
3950 int value_known_to_survive_p
= survives_gc_p (HASH_VALUE (h
, i
));
3953 if (EQ (h
->weak
, Qkey
))
3954 remove_p
= !key_known_to_survive_p
;
3955 else if (EQ (h
->weak
, Qvalue
))
3956 remove_p
= !value_known_to_survive_p
;
3957 else if (EQ (h
->weak
, Qkey_or_value
))
3958 remove_p
= !(key_known_to_survive_p
|| value_known_to_survive_p
);
3959 else if (EQ (h
->weak
, Qkey_and_value
))
3960 remove_p
= !(key_known_to_survive_p
&& value_known_to_survive_p
);
3964 next
= HASH_NEXT (h
, i
);
3966 if (remove_entries_p
)
3970 /* Take out of collision chain. */
3972 HASH_INDEX (h
, bucket
) = next
;
3974 HASH_NEXT (h
, XFASTINT (prev
)) = next
;
3976 /* Add to free list. */
3977 HASH_NEXT (h
, i
) = h
->next_free
;
3980 /* Clear key, value, and hash. */
3981 HASH_KEY (h
, i
) = HASH_VALUE (h
, i
) = Qnil
;
3982 HASH_HASH (h
, i
) = Qnil
;
3995 /* Make sure key and value survive. */
3996 if (!key_known_to_survive_p
)
3998 mark_object (HASH_KEY (h
, i
));
4002 if (!value_known_to_survive_p
)
4004 mark_object (HASH_VALUE (h
, i
));
4015 /* Remove elements from weak hash tables that don't survive the
4016 current garbage collection. Remove weak tables that don't survive
4017 from Vweak_hash_tables. Called from gc_sweep. */
4020 sweep_weak_hash_tables (void)
4022 struct Lisp_Hash_Table
*h
, *used
, *next
;
4025 /* Mark all keys and values that are in use. Keep on marking until
4026 there is no more change. This is necessary for cases like
4027 value-weak table A containing an entry X -> Y, where Y is used in a
4028 key-weak table B, Z -> Y. If B comes after A in the list of weak
4029 tables, X -> Y might be removed from A, although when looking at B
4030 one finds that it shouldn't. */
4034 for (h
= weak_hash_tables
; h
; h
= h
->next_weak
)
4036 if (h
->header
.size
& ARRAY_MARK_FLAG
)
4037 marked
|= sweep_weak_table (h
, 0);
4042 /* Remove tables and entries that aren't used. */
4043 for (h
= weak_hash_tables
, used
= NULL
; h
; h
= next
)
4045 next
= h
->next_weak
;
4047 if (h
->header
.size
& ARRAY_MARK_FLAG
)
4049 /* TABLE is marked as used. Sweep its contents. */
4051 sweep_weak_table (h
, 1);
4053 /* Add table to the list of used weak hash tables. */
4054 h
->next_weak
= used
;
4059 weak_hash_tables
= used
;
4064 /***********************************************************************
4065 Hash Code Computation
4066 ***********************************************************************/
4068 /* Maximum depth up to which to dive into Lisp structures. */
4070 #define SXHASH_MAX_DEPTH 3
4072 /* Maximum length up to which to take list and vector elements into
4075 #define SXHASH_MAX_LEN 7
4077 /* Combine two integers X and Y for hashing. The result might not fit
4078 into a Lisp integer. */
4080 #define SXHASH_COMBINE(X, Y) \
4081 ((((EMACS_UINT) (X) << 4) + ((EMACS_UINT) (X) >> (BITS_PER_EMACS_INT - 4))) \
4084 /* Hash X, returning a value that fits into a Lisp integer. */
4085 #define SXHASH_REDUCE(X) \
4086 ((((X) ^ (X) >> (BITS_PER_EMACS_INT - FIXNUM_BITS))) & INTMASK)
4088 /* Return a hash for string PTR which has length LEN. The hash
4089 code returned is guaranteed to fit in a Lisp integer. */
4092 sxhash_string (unsigned char *ptr
, EMACS_INT len
)
4094 unsigned char *p
= ptr
;
4095 unsigned char *end
= p
+ len
;
4097 EMACS_UINT hash
= 0;
4104 hash
= SXHASH_COMBINE (hash
, c
);
4107 return SXHASH_REDUCE (hash
);
4110 /* Return a hash for the floating point value VAL. */
4113 sxhash_float (double val
)
4115 EMACS_UINT hash
= 0;
4117 WORDS_PER_DOUBLE
= (sizeof val
/ sizeof hash
4118 + (sizeof val
% sizeof hash
!= 0))
4122 EMACS_UINT word
[WORDS_PER_DOUBLE
];
4126 memset (&u
.val
+ 1, 0, sizeof u
- sizeof u
.val
);
4127 for (i
= 0; i
< WORDS_PER_DOUBLE
; i
++)
4128 hash
= SXHASH_COMBINE (hash
, u
.word
[i
]);
4129 return SXHASH_REDUCE (hash
);
4132 /* Return a hash for list LIST. DEPTH is the current depth in the
4133 list. We don't recurse deeper than SXHASH_MAX_DEPTH in it. */
4136 sxhash_list (Lisp_Object list
, int depth
)
4138 EMACS_UINT hash
= 0;
4141 if (depth
< SXHASH_MAX_DEPTH
)
4143 CONSP (list
) && i
< SXHASH_MAX_LEN
;
4144 list
= XCDR (list
), ++i
)
4146 EMACS_UINT hash2
= sxhash (XCAR (list
), depth
+ 1);
4147 hash
= SXHASH_COMBINE (hash
, hash2
);
4152 EMACS_UINT hash2
= sxhash (list
, depth
+ 1);
4153 hash
= SXHASH_COMBINE (hash
, hash2
);
4156 return SXHASH_REDUCE (hash
);
4160 /* Return a hash for vector VECTOR. DEPTH is the current depth in
4161 the Lisp structure. */
4164 sxhash_vector (Lisp_Object vec
, int depth
)
4166 EMACS_UINT hash
= ASIZE (vec
);
4169 n
= min (SXHASH_MAX_LEN
, ASIZE (vec
));
4170 for (i
= 0; i
< n
; ++i
)
4172 EMACS_UINT hash2
= sxhash (AREF (vec
, i
), depth
+ 1);
4173 hash
= SXHASH_COMBINE (hash
, hash2
);
4176 return SXHASH_REDUCE (hash
);
4179 /* Return a hash for bool-vector VECTOR. */
4182 sxhash_bool_vector (Lisp_Object vec
)
4184 EMACS_UINT hash
= XBOOL_VECTOR (vec
)->size
;
4187 n
= min (SXHASH_MAX_LEN
, XBOOL_VECTOR (vec
)->header
.size
);
4188 for (i
= 0; i
< n
; ++i
)
4189 hash
= SXHASH_COMBINE (hash
, XBOOL_VECTOR (vec
)->data
[i
]);
4191 return SXHASH_REDUCE (hash
);
4195 /* Return a hash code for OBJ. DEPTH is the current depth in the Lisp
4196 structure. Value is an unsigned integer clipped to INTMASK. */
4199 sxhash (Lisp_Object obj
, int depth
)
4203 if (depth
> SXHASH_MAX_DEPTH
)
4206 switch (XTYPE (obj
))
4217 obj
= SYMBOL_NAME (obj
);
4221 hash
= sxhash_string (SDATA (obj
), SCHARS (obj
));
4224 /* This can be everything from a vector to an overlay. */
4225 case Lisp_Vectorlike
:
4227 /* According to the CL HyperSpec, two arrays are equal only if
4228 they are `eq', except for strings and bit-vectors. In
4229 Emacs, this works differently. We have to compare element
4231 hash
= sxhash_vector (obj
, depth
);
4232 else if (BOOL_VECTOR_P (obj
))
4233 hash
= sxhash_bool_vector (obj
);
4235 /* Others are `equal' if they are `eq', so let's take their
4241 hash
= sxhash_list (obj
, depth
);
4245 hash
= sxhash_float (XFLOAT_DATA (obj
));
4257 /***********************************************************************
4259 ***********************************************************************/
4262 DEFUN ("sxhash", Fsxhash
, Ssxhash
, 1, 1, 0,
4263 doc
: /* Compute a hash code for OBJ and return it as integer. */)
4266 EMACS_UINT hash
= sxhash (obj
, 0);
4267 return make_number (hash
);
4271 DEFUN ("make-hash-table", Fmake_hash_table
, Smake_hash_table
, 0, MANY
, 0,
4272 doc
: /* Create and return a new hash table.
4274 Arguments are specified as keyword/argument pairs. The following
4275 arguments are defined:
4277 :test TEST -- TEST must be a symbol that specifies how to compare
4278 keys. Default is `eql'. Predefined are the tests `eq', `eql', and
4279 `equal'. User-supplied test and hash functions can be specified via
4280 `define-hash-table-test'.
4282 :size SIZE -- A hint as to how many elements will be put in the table.
4285 :rehash-size REHASH-SIZE - Indicates how to expand the table when it
4286 fills up. If REHASH-SIZE is an integer, increase the size by that
4287 amount. If it is a float, it must be > 1.0, and the new size is the
4288 old size multiplied by that factor. Default is 1.5.
4290 :rehash-threshold THRESHOLD -- THRESHOLD must a float > 0, and <= 1.0.
4291 Resize the hash table when the ratio (number of entries / table size)
4292 is greater than or equal to THRESHOLD. Default is 0.8.
4294 :weakness WEAK -- WEAK must be one of nil, t, `key', `value',
4295 `key-or-value', or `key-and-value'. If WEAK is not nil, the table
4296 returned is a weak table. Key/value pairs are removed from a weak
4297 hash table when there are no non-weak references pointing to their
4298 key, value, one of key or value, or both key and value, depending on
4299 WEAK. WEAK t is equivalent to `key-and-value'. Default value of WEAK
4302 usage: (make-hash-table &rest KEYWORD-ARGS) */)
4303 (size_t nargs
, Lisp_Object
*args
)
4305 Lisp_Object test
, size
, rehash_size
, rehash_threshold
, weak
;
4306 Lisp_Object user_test
, user_hash
;
4310 /* The vector `used' is used to keep track of arguments that
4311 have been consumed. */
4312 used
= (char *) alloca (nargs
* sizeof *used
);
4313 memset (used
, 0, nargs
* sizeof *used
);
4315 /* See if there's a `:test TEST' among the arguments. */
4316 i
= get_key_arg (QCtest
, nargs
, args
, used
);
4317 test
= i
? args
[i
] : Qeql
;
4318 if (!EQ (test
, Qeq
) && !EQ (test
, Qeql
) && !EQ (test
, Qequal
))
4320 /* See if it is a user-defined test. */
4323 prop
= Fget (test
, Qhash_table_test
);
4324 if (!CONSP (prop
) || !CONSP (XCDR (prop
)))
4325 signal_error ("Invalid hash table test", test
);
4326 user_test
= XCAR (prop
);
4327 user_hash
= XCAR (XCDR (prop
));
4330 user_test
= user_hash
= Qnil
;
4332 /* See if there's a `:size SIZE' argument. */
4333 i
= get_key_arg (QCsize
, nargs
, args
, used
);
4334 size
= i
? args
[i
] : Qnil
;
4336 size
= make_number (DEFAULT_HASH_SIZE
);
4337 else if (!INTEGERP (size
) || XINT (size
) < 0)
4338 signal_error ("Invalid hash table size", size
);
4340 /* Look for `:rehash-size SIZE'. */
4341 i
= get_key_arg (QCrehash_size
, nargs
, args
, used
);
4342 rehash_size
= i
? args
[i
] : make_float (DEFAULT_REHASH_SIZE
);
4343 if (! ((INTEGERP (rehash_size
) && 0 < XINT (rehash_size
))
4344 || (FLOATP (rehash_size
) && 1 < XFLOAT_DATA (rehash_size
))))
4345 signal_error ("Invalid hash table rehash size", rehash_size
);
4347 /* Look for `:rehash-threshold THRESHOLD'. */
4348 i
= get_key_arg (QCrehash_threshold
, nargs
, args
, used
);
4349 rehash_threshold
= i
? args
[i
] : make_float (DEFAULT_REHASH_THRESHOLD
);
4350 if (! (FLOATP (rehash_threshold
)
4351 && 0 < XFLOAT_DATA (rehash_threshold
)
4352 && XFLOAT_DATA (rehash_threshold
) <= 1))
4353 signal_error ("Invalid hash table rehash threshold", rehash_threshold
);
4355 /* Look for `:weakness WEAK'. */
4356 i
= get_key_arg (QCweakness
, nargs
, args
, used
);
4357 weak
= i
? args
[i
] : Qnil
;
4359 weak
= Qkey_and_value
;
4362 && !EQ (weak
, Qvalue
)
4363 && !EQ (weak
, Qkey_or_value
)
4364 && !EQ (weak
, Qkey_and_value
))
4365 signal_error ("Invalid hash table weakness", weak
);
4367 /* Now, all args should have been used up, or there's a problem. */
4368 for (i
= 0; i
< nargs
; ++i
)
4370 signal_error ("Invalid argument list", args
[i
]);
4372 return make_hash_table (test
, size
, rehash_size
, rehash_threshold
, weak
,
4373 user_test
, user_hash
);
4377 DEFUN ("copy-hash-table", Fcopy_hash_table
, Scopy_hash_table
, 1, 1, 0,
4378 doc
: /* Return a copy of hash table TABLE. */)
4381 return copy_hash_table (check_hash_table (table
));
4385 DEFUN ("hash-table-count", Fhash_table_count
, Shash_table_count
, 1, 1, 0,
4386 doc
: /* Return the number of elements in TABLE. */)
4389 return make_number (check_hash_table (table
)->count
);
4393 DEFUN ("hash-table-rehash-size", Fhash_table_rehash_size
,
4394 Shash_table_rehash_size
, 1, 1, 0,
4395 doc
: /* Return the current rehash size of TABLE. */)
4398 return check_hash_table (table
)->rehash_size
;
4402 DEFUN ("hash-table-rehash-threshold", Fhash_table_rehash_threshold
,
4403 Shash_table_rehash_threshold
, 1, 1, 0,
4404 doc
: /* Return the current rehash threshold of TABLE. */)
4407 return check_hash_table (table
)->rehash_threshold
;
4411 DEFUN ("hash-table-size", Fhash_table_size
, Shash_table_size
, 1, 1, 0,
4412 doc
: /* Return the size of TABLE.
4413 The size can be used as an argument to `make-hash-table' to create
4414 a hash table than can hold as many elements as TABLE holds
4415 without need for resizing. */)
4418 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
4419 return make_number (HASH_TABLE_SIZE (h
));
4423 DEFUN ("hash-table-test", Fhash_table_test
, Shash_table_test
, 1, 1, 0,
4424 doc
: /* Return the test TABLE uses. */)
4427 return check_hash_table (table
)->test
;
4431 DEFUN ("hash-table-weakness", Fhash_table_weakness
, Shash_table_weakness
,
4433 doc
: /* Return the weakness of TABLE. */)
4436 return check_hash_table (table
)->weak
;
4440 DEFUN ("hash-table-p", Fhash_table_p
, Shash_table_p
, 1, 1, 0,
4441 doc
: /* Return t if OBJ is a Lisp hash table object. */)
4444 return HASH_TABLE_P (obj
) ? Qt
: Qnil
;
4448 DEFUN ("clrhash", Fclrhash
, Sclrhash
, 1, 1, 0,
4449 doc
: /* Clear hash table TABLE and return it. */)
4452 hash_clear (check_hash_table (table
));
4453 /* Be compatible with XEmacs. */
4458 DEFUN ("gethash", Fgethash
, Sgethash
, 2, 3, 0,
4459 doc
: /* Look up KEY in TABLE and return its associated value.
4460 If KEY is not found, return DFLT which defaults to nil. */)
4461 (Lisp_Object key
, Lisp_Object table
, Lisp_Object dflt
)
4463 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
4464 EMACS_INT i
= hash_lookup (h
, key
, NULL
);
4465 return i
>= 0 ? HASH_VALUE (h
, i
) : dflt
;
4469 DEFUN ("puthash", Fputhash
, Sputhash
, 3, 3, 0,
4470 doc
: /* Associate KEY with VALUE in hash table TABLE.
4471 If KEY is already present in table, replace its current value with
4473 (Lisp_Object key
, Lisp_Object value
, Lisp_Object table
)
4475 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
4479 i
= hash_lookup (h
, key
, &hash
);
4481 HASH_VALUE (h
, i
) = value
;
4483 hash_put (h
, key
, value
, hash
);
4489 DEFUN ("remhash", Fremhash
, Sremhash
, 2, 2, 0,
4490 doc
: /* Remove KEY from TABLE. */)
4491 (Lisp_Object key
, Lisp_Object table
)
4493 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
4494 hash_remove_from_table (h
, key
);
4499 DEFUN ("maphash", Fmaphash
, Smaphash
, 2, 2, 0,
4500 doc
: /* Call FUNCTION for all entries in hash table TABLE.
4501 FUNCTION is called with two arguments, KEY and VALUE. */)
4502 (Lisp_Object function
, Lisp_Object table
)
4504 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
4505 Lisp_Object args
[3];
4508 for (i
= 0; i
< HASH_TABLE_SIZE (h
); ++i
)
4509 if (!NILP (HASH_HASH (h
, i
)))
4512 args
[1] = HASH_KEY (h
, i
);
4513 args
[2] = HASH_VALUE (h
, i
);
4521 DEFUN ("define-hash-table-test", Fdefine_hash_table_test
,
4522 Sdefine_hash_table_test
, 3, 3, 0,
4523 doc
: /* Define a new hash table test with name NAME, a symbol.
4525 In hash tables created with NAME specified as test, use TEST to
4526 compare keys, and HASH for computing hash codes of keys.
4528 TEST must be a function taking two arguments and returning non-nil if
4529 both arguments are the same. HASH must be a function taking one
4530 argument and return an integer that is the hash code of the argument.
4531 Hash code computation should use the whole value range of integers,
4532 including negative integers. */)
4533 (Lisp_Object name
, Lisp_Object test
, Lisp_Object hash
)
4535 return Fput (name
, Qhash_table_test
, list2 (test
, hash
));
4540 /************************************************************************
4542 ************************************************************************/
4547 /* Convert a possibly-signed character to an unsigned character. This is
4548 a bit safer than casting to unsigned char, since it catches some type
4549 errors that the cast doesn't. */
4550 static inline unsigned char to_uchar (char ch
) { return ch
; }
4552 /* TYPE: 0 for md5, 1 for sha1. */
4555 crypto_hash_function (int type
, Lisp_Object object
, Lisp_Object start
, Lisp_Object end
, Lisp_Object coding_system
, Lisp_Object noerror
, Lisp_Object binary
)
4559 EMACS_INT size_byte
= 0;
4560 EMACS_INT start_char
= 0, end_char
= 0;
4561 EMACS_INT start_byte
= 0, end_byte
= 0;
4562 register EMACS_INT b
, e
;
4563 register struct buffer
*bp
;
4565 Lisp_Object res
=Qnil
;
4567 if (STRINGP (object
))
4569 if (NILP (coding_system
))
4571 /* Decide the coding-system to encode the data with. */
4573 if (STRING_MULTIBYTE (object
))
4574 /* use default, we can't guess correct value */
4575 coding_system
= preferred_coding_system ();
4577 coding_system
= Qraw_text
;
4580 if (NILP (Fcoding_system_p (coding_system
)))
4582 /* Invalid coding system. */
4584 if (!NILP (noerror
))
4585 coding_system
= Qraw_text
;
4587 xsignal1 (Qcoding_system_error
, coding_system
);
4590 if (STRING_MULTIBYTE (object
))
4591 object
= code_convert_string (object
, coding_system
, Qnil
, 1, 0, 1);
4593 size
= SCHARS (object
);
4594 size_byte
= SBYTES (object
);
4598 CHECK_NUMBER (start
);
4600 start_char
= XINT (start
);
4605 start_byte
= string_char_to_byte (object
, start_char
);
4611 end_byte
= size_byte
;
4617 end_char
= XINT (end
);
4622 end_byte
= string_char_to_byte (object
, end_char
);
4625 if (!(0 <= start_char
&& start_char
<= end_char
&& end_char
<= size
))
4626 args_out_of_range_3 (object
, make_number (start_char
),
4627 make_number (end_char
));
4631 struct buffer
*prev
= current_buffer
;
4633 record_unwind_protect (Fset_buffer
, Fcurrent_buffer ());
4635 CHECK_BUFFER (object
);
4637 bp
= XBUFFER (object
);
4638 if (bp
!= current_buffer
)
4639 set_buffer_internal (bp
);
4645 CHECK_NUMBER_COERCE_MARKER (start
);
4653 CHECK_NUMBER_COERCE_MARKER (end
);
4658 temp
= b
, b
= e
, e
= temp
;
4660 if (!(BEGV
<= b
&& e
<= ZV
))
4661 args_out_of_range (start
, end
);
4663 if (NILP (coding_system
))
4665 /* Decide the coding-system to encode the data with.
4666 See fileio.c:Fwrite-region */
4668 if (!NILP (Vcoding_system_for_write
))
4669 coding_system
= Vcoding_system_for_write
;
4672 int force_raw_text
= 0;
4674 coding_system
= BVAR (XBUFFER (object
), buffer_file_coding_system
);
4675 if (NILP (coding_system
)
4676 || NILP (Flocal_variable_p (Qbuffer_file_coding_system
, Qnil
)))
4678 coding_system
= Qnil
;
4679 if (NILP (BVAR (current_buffer
, enable_multibyte_characters
)))
4683 if (NILP (coding_system
) && !NILP (Fbuffer_file_name(object
)))
4685 /* Check file-coding-system-alist. */
4686 Lisp_Object args
[4], val
;
4688 args
[0] = Qwrite_region
; args
[1] = start
; args
[2] = end
;
4689 args
[3] = Fbuffer_file_name(object
);
4690 val
= Ffind_operation_coding_system (4, args
);
4691 if (CONSP (val
) && !NILP (XCDR (val
)))
4692 coding_system
= XCDR (val
);
4695 if (NILP (coding_system
)
4696 && !NILP (BVAR (XBUFFER (object
), buffer_file_coding_system
)))
4698 /* If we still have not decided a coding system, use the
4699 default value of buffer-file-coding-system. */
4700 coding_system
= BVAR (XBUFFER (object
), buffer_file_coding_system
);
4704 && !NILP (Ffboundp (Vselect_safe_coding_system_function
)))
4705 /* Confirm that VAL can surely encode the current region. */
4706 coding_system
= call4 (Vselect_safe_coding_system_function
,
4707 make_number (b
), make_number (e
),
4708 coding_system
, Qnil
);
4711 coding_system
= Qraw_text
;
4714 if (NILP (Fcoding_system_p (coding_system
)))
4716 /* Invalid coding system. */
4718 if (!NILP (noerror
))
4719 coding_system
= Qraw_text
;
4721 xsignal1 (Qcoding_system_error
, coding_system
);
4725 object
= make_buffer_string (b
, e
, 0);
4726 if (prev
!= current_buffer
)
4727 set_buffer_internal (prev
);
4728 /* Discard the unwind protect for recovering the current
4732 if (STRING_MULTIBYTE (object
))
4733 object
= code_convert_string (object
, coding_system
, Qnil
, 1, 0, 0);
4741 md5_buffer (SSDATA (object
) + start_byte
,
4742 SBYTES (object
) - (size_byte
- end_byte
),
4748 for (i
= 0; i
< 16; i
++)
4749 sprintf (&value
[2 * i
], "%02x", to_uchar (digest
[i
]));
4750 res
= make_string (value
, 32);
4753 res
= make_string (digest
, 16);
4760 sha1_buffer (SSDATA (object
) + start_byte
,
4761 SBYTES (object
) - (size_byte
- end_byte
),
4766 for (i
= 0; i
< 20; i
++)
4767 sprintf (&value
[2 * i
], "%02x", to_uchar (digest
[i
]));
4768 res
= make_string (value
, 40);
4771 res
= make_string (digest
, 20);
4779 DEFUN ("md5", Fmd5
, Smd5
, 1, 5, 0,
4780 doc
: /* Return MD5 message digest of OBJECT, a buffer or string.
4782 A message digest is a cryptographic checksum of a document, and the
4783 algorithm to calculate it is defined in RFC 1321.
4785 The two optional arguments START and END are character positions
4786 specifying for which part of OBJECT the message digest should be
4787 computed. If nil or omitted, the digest is computed for the whole
4790 The MD5 message digest is computed from the result of encoding the
4791 text in a coding system, not directly from the internal Emacs form of
4792 the text. The optional fourth argument CODING-SYSTEM specifies which
4793 coding system to encode the text with. It should be the same coding
4794 system that you used or will use when actually writing the text into a
4797 If CODING-SYSTEM is nil or omitted, the default depends on OBJECT. If
4798 OBJECT is a buffer, the default for CODING-SYSTEM is whatever coding
4799 system would be chosen by default for writing this text into a file.
4801 If OBJECT is a string, the most preferred coding system (see the
4802 command `prefer-coding-system') is used.
4804 If NOERROR is non-nil, silently assume the `raw-text' coding if the
4805 guesswork fails. Normally, an error is signaled in such case. */)
4806 (Lisp_Object object
, Lisp_Object start
, Lisp_Object end
, Lisp_Object coding_system
, Lisp_Object noerror
)
4808 return crypto_hash_function (0, object
, start
, end
, coding_system
, noerror
, Qnil
);
4811 DEFUN ("sha1", Fsha1
, Ssha1
, 1, 4, 0,
4812 doc
: /* Return the SHA-1 (Secure Hash Algorithm) of an OBJECT.
4814 OBJECT is either a string or a buffer. Optional arguments START and
4815 END are character positions specifying which portion of OBJECT for
4816 computing the hash. If BINARY is non-nil, return a string in binary
4818 (Lisp_Object object
, Lisp_Object start
, Lisp_Object end
, Lisp_Object binary
)
4820 return crypto_hash_function (1, object
, start
, end
, Qnil
, Qnil
, binary
);
4827 /* Hash table stuff. */
4828 Qhash_table_p
= intern_c_string ("hash-table-p");
4829 staticpro (&Qhash_table_p
);
4830 Qeq
= intern_c_string ("eq");
4832 Qeql
= intern_c_string ("eql");
4834 Qequal
= intern_c_string ("equal");
4835 staticpro (&Qequal
);
4836 QCtest
= intern_c_string (":test");
4837 staticpro (&QCtest
);
4838 QCsize
= intern_c_string (":size");
4839 staticpro (&QCsize
);
4840 QCrehash_size
= intern_c_string (":rehash-size");
4841 staticpro (&QCrehash_size
);
4842 QCrehash_threshold
= intern_c_string (":rehash-threshold");
4843 staticpro (&QCrehash_threshold
);
4844 QCweakness
= intern_c_string (":weakness");
4845 staticpro (&QCweakness
);
4846 Qkey
= intern_c_string ("key");
4848 Qvalue
= intern_c_string ("value");
4849 staticpro (&Qvalue
);
4850 Qhash_table_test
= intern_c_string ("hash-table-test");
4851 staticpro (&Qhash_table_test
);
4852 Qkey_or_value
= intern_c_string ("key-or-value");
4853 staticpro (&Qkey_or_value
);
4854 Qkey_and_value
= intern_c_string ("key-and-value");
4855 staticpro (&Qkey_and_value
);
4858 defsubr (&Smake_hash_table
);
4859 defsubr (&Scopy_hash_table
);
4860 defsubr (&Shash_table_count
);
4861 defsubr (&Shash_table_rehash_size
);
4862 defsubr (&Shash_table_rehash_threshold
);
4863 defsubr (&Shash_table_size
);
4864 defsubr (&Shash_table_test
);
4865 defsubr (&Shash_table_weakness
);
4866 defsubr (&Shash_table_p
);
4867 defsubr (&Sclrhash
);
4868 defsubr (&Sgethash
);
4869 defsubr (&Sputhash
);
4870 defsubr (&Sremhash
);
4871 defsubr (&Smaphash
);
4872 defsubr (&Sdefine_hash_table_test
);
4874 Qstring_lessp
= intern_c_string ("string-lessp");
4875 staticpro (&Qstring_lessp
);
4876 Qprovide
= intern_c_string ("provide");
4877 staticpro (&Qprovide
);
4878 Qrequire
= intern_c_string ("require");
4879 staticpro (&Qrequire
);
4880 Qyes_or_no_p_history
= intern_c_string ("yes-or-no-p-history");
4881 staticpro (&Qyes_or_no_p_history
);
4882 Qcursor_in_echo_area
= intern_c_string ("cursor-in-echo-area");
4883 staticpro (&Qcursor_in_echo_area
);
4884 Qwidget_type
= intern_c_string ("widget-type");
4885 staticpro (&Qwidget_type
);
4887 staticpro (&string_char_byte_cache_string
);
4888 string_char_byte_cache_string
= Qnil
;
4890 require_nesting_list
= Qnil
;
4891 staticpro (&require_nesting_list
);
4893 Fset (Qyes_or_no_p_history
, Qnil
);
4895 DEFVAR_LISP ("features", Vfeatures
,
4896 doc
: /* A list of symbols which are the features of the executing Emacs.
4897 Used by `featurep' and `require', and altered by `provide'. */);
4898 Vfeatures
= Fcons (intern_c_string ("emacs"), Qnil
);
4899 Qsubfeatures
= intern_c_string ("subfeatures");
4900 staticpro (&Qsubfeatures
);
4902 #ifdef HAVE_LANGINFO_CODESET
4903 Qcodeset
= intern_c_string ("codeset");
4904 staticpro (&Qcodeset
);
4905 Qdays
= intern_c_string ("days");
4907 Qmonths
= intern_c_string ("months");
4908 staticpro (&Qmonths
);
4909 Qpaper
= intern_c_string ("paper");
4910 staticpro (&Qpaper
);
4911 #endif /* HAVE_LANGINFO_CODESET */
4913 DEFVAR_BOOL ("use-dialog-box", use_dialog_box
,
4914 doc
: /* *Non-nil means mouse commands use dialog boxes to ask questions.
4915 This applies to `y-or-n-p' and `yes-or-no-p' questions asked by commands
4916 invoked by mouse clicks and mouse menu items.
4918 On some platforms, file selection dialogs are also enabled if this is
4922 DEFVAR_BOOL ("use-file-dialog", use_file_dialog
,
4923 doc
: /* *Non-nil means mouse commands use a file dialog to ask for files.
4924 This applies to commands from menus and tool bar buttons even when
4925 they are initiated from the keyboard. If `use-dialog-box' is nil,
4926 that disables the use of a file dialog, regardless of the value of
4928 use_file_dialog
= 1;
4930 defsubr (&Sidentity
);
4933 defsubr (&Ssafe_length
);
4934 defsubr (&Sstring_bytes
);
4935 defsubr (&Sstring_equal
);
4936 defsubr (&Scompare_strings
);
4937 defsubr (&Sstring_lessp
);
4940 defsubr (&Svconcat
);
4941 defsubr (&Scopy_sequence
);
4942 defsubr (&Sstring_make_multibyte
);
4943 defsubr (&Sstring_make_unibyte
);
4944 defsubr (&Sstring_as_multibyte
);
4945 defsubr (&Sstring_as_unibyte
);
4946 defsubr (&Sstring_to_multibyte
);
4947 defsubr (&Sstring_to_unibyte
);
4948 defsubr (&Scopy_alist
);
4949 defsubr (&Ssubstring
);
4950 defsubr (&Ssubstring_no_properties
);
4963 defsubr (&Snreverse
);
4964 defsubr (&Sreverse
);
4966 defsubr (&Splist_get
);
4968 defsubr (&Splist_put
);
4970 defsubr (&Slax_plist_get
);
4971 defsubr (&Slax_plist_put
);
4974 defsubr (&Sequal_including_properties
);
4975 defsubr (&Sfillarray
);
4976 defsubr (&Sclear_string
);
4980 defsubr (&Smapconcat
);
4981 defsubr (&Syes_or_no_p
);
4982 defsubr (&Sload_average
);
4983 defsubr (&Sfeaturep
);
4984 defsubr (&Srequire
);
4985 defsubr (&Sprovide
);
4986 defsubr (&Splist_member
);
4987 defsubr (&Swidget_put
);
4988 defsubr (&Swidget_get
);
4989 defsubr (&Swidget_apply
);
4990 defsubr (&Sbase64_encode_region
);
4991 defsubr (&Sbase64_decode_region
);
4992 defsubr (&Sbase64_encode_string
);
4993 defsubr (&Sbase64_decode_string
);
4996 defsubr (&Slocale_info
);