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/>. */
26 /* Note on some machines this defines `vector' as a typedef,
27 so make sure we don't use that name in this file. */
33 #include "character.h"
38 #include "intervals.h"
41 #include "blockinput.h"
43 #if defined (HAVE_X_WINDOWS)
46 #endif /* HAVE_MENUS */
49 #define NULL ((POINTER_TYPE *)0)
52 Lisp_Object Qstring_lessp
, Qprovide
, Qrequire
;
53 Lisp_Object Qyes_or_no_p_history
;
54 Lisp_Object Qcursor_in_echo_area
;
55 Lisp_Object Qwidget_type
;
56 Lisp_Object Qcodeset
, Qdays
, Qmonths
, Qpaper
;
58 static int internal_equal (Lisp_Object
, Lisp_Object
, int, int);
64 DEFUN ("identity", Fidentity
, Sidentity
, 1, 1, 0,
65 doc
: /* Return the argument unchanged. */)
71 DEFUN ("random", Frandom
, Srandom
, 0, 1, 0,
72 doc
: /* Return a pseudo-random number.
73 All integers representable in Lisp are equally likely.
74 On most systems, this is 29 bits' worth.
75 With positive integer LIMIT, return random number in interval [0,LIMIT).
76 With argument t, set the random number seed from the current time and pid.
77 Other values of LIMIT are ignored. */)
81 Lisp_Object lispy_val
;
82 unsigned long denominator
;
85 seed_random (getpid () + time (NULL
));
86 if (NATNUMP (limit
) && XFASTINT (limit
) != 0)
88 /* Try to take our random number from the higher bits of VAL,
89 not the lower, since (says Gentzel) the low bits of `random'
90 are less random than the higher ones. We do this by using the
91 quotient rather than the remainder. At the high end of the RNG
92 it's possible to get a quotient larger than n; discarding
93 these values eliminates the bias that would otherwise appear
94 when using a large n. */
95 denominator
= ((unsigned long)1 << VALBITS
) / XFASTINT (limit
);
97 val
= get_random () / denominator
;
98 while (val
>= XFASTINT (limit
));
102 XSETINT (lispy_val
, val
);
106 /* Random data-structure functions */
108 DEFUN ("length", Flength
, Slength
, 1, 1, 0,
109 doc
: /* Return the length of vector, list or string SEQUENCE.
110 A byte-code function object is also allowed.
111 If the string contains multibyte characters, this is not necessarily
112 the number of bytes in the string; it is the number of characters.
113 To get the number of bytes, use `string-bytes'. */)
114 (register Lisp_Object sequence
)
116 register Lisp_Object val
;
119 if (STRINGP (sequence
))
120 XSETFASTINT (val
, SCHARS (sequence
));
121 else if (VECTORP (sequence
))
122 XSETFASTINT (val
, ASIZE (sequence
));
123 else if (CHAR_TABLE_P (sequence
))
124 XSETFASTINT (val
, MAX_CHAR
);
125 else if (BOOL_VECTOR_P (sequence
))
126 XSETFASTINT (val
, XBOOL_VECTOR (sequence
)->size
);
127 else if (COMPILEDP (sequence
))
128 XSETFASTINT (val
, ASIZE (sequence
) & PSEUDOVECTOR_SIZE_MASK
);
129 else if (CONSP (sequence
))
132 while (CONSP (sequence
))
134 sequence
= XCDR (sequence
);
137 if (!CONSP (sequence
))
140 sequence
= XCDR (sequence
);
145 CHECK_LIST_END (sequence
, sequence
);
147 val
= make_number (i
);
149 else if (NILP (sequence
))
150 XSETFASTINT (val
, 0);
152 wrong_type_argument (Qsequencep
, sequence
);
157 /* This does not check for quits. That is safe since it must terminate. */
159 DEFUN ("safe-length", Fsafe_length
, Ssafe_length
, 1, 1, 0,
160 doc
: /* Return the length of a list, but avoid error or infinite loop.
161 This function never gets an error. If LIST is not really a list,
162 it returns 0. If LIST is circular, it returns a finite value
163 which is at least the number of distinct elements. */)
166 Lisp_Object tail
, halftail
, length
;
169 /* halftail is used to detect circular lists. */
171 for (tail
= list
; CONSP (tail
); tail
= XCDR (tail
))
173 if (EQ (tail
, halftail
) && len
!= 0)
177 halftail
= XCDR (halftail
);
180 XSETINT (length
, len
);
184 DEFUN ("string-bytes", Fstring_bytes
, Sstring_bytes
, 1, 1, 0,
185 doc
: /* Return the number of bytes in STRING.
186 If STRING is multibyte, this may be greater than the length of STRING. */)
189 CHECK_STRING (string
);
190 return make_number (SBYTES (string
));
193 DEFUN ("string-equal", Fstring_equal
, Sstring_equal
, 2, 2, 0,
194 doc
: /* Return t if two strings have identical contents.
195 Case is significant, but text properties are ignored.
196 Symbols are also allowed; their print names are used instead. */)
197 (register Lisp_Object s1
, Lisp_Object s2
)
200 s1
= SYMBOL_NAME (s1
);
202 s2
= SYMBOL_NAME (s2
);
206 if (SCHARS (s1
) != SCHARS (s2
)
207 || SBYTES (s1
) != SBYTES (s2
)
208 || memcmp (SDATA (s1
), SDATA (s2
), SBYTES (s1
)))
213 DEFUN ("compare-strings", Fcompare_strings
, Scompare_strings
, 6, 7, 0,
214 doc
: /* Compare the contents of two strings, converting to multibyte if needed.
215 In string STR1, skip the first START1 characters and stop at END1.
216 In string STR2, skip the first START2 characters and stop at END2.
217 END1 and END2 default to the full lengths of the respective strings.
219 Case is significant in this comparison if IGNORE-CASE is nil.
220 Unibyte strings are converted to multibyte for comparison.
222 The value is t if the strings (or specified portions) match.
223 If string STR1 is less, the value is a negative number N;
224 - 1 - N is the number of characters that match at the beginning.
225 If string STR1 is greater, the value is a positive number N;
226 N - 1 is the number of characters that match at the beginning. */)
227 (Lisp_Object str1
, Lisp_Object start1
, Lisp_Object end1
, Lisp_Object str2
, Lisp_Object start2
, Lisp_Object end2
, Lisp_Object ignore_case
)
229 register EMACS_INT end1_char
, end2_char
;
230 register EMACS_INT i1
, i1_byte
, i2
, i2_byte
;
235 start1
= make_number (0);
237 start2
= make_number (0);
238 CHECK_NATNUM (start1
);
239 CHECK_NATNUM (start2
);
248 i1_byte
= string_char_to_byte (str1
, i1
);
249 i2_byte
= string_char_to_byte (str2
, i2
);
251 end1_char
= SCHARS (str1
);
252 if (! NILP (end1
) && end1_char
> XINT (end1
))
253 end1_char
= XINT (end1
);
255 end2_char
= SCHARS (str2
);
256 if (! NILP (end2
) && end2_char
> XINT (end2
))
257 end2_char
= XINT (end2
);
259 while (i1
< end1_char
&& i2
< end2_char
)
261 /* When we find a mismatch, we must compare the
262 characters, not just the bytes. */
265 if (STRING_MULTIBYTE (str1
))
266 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c1
, str1
, i1
, i1_byte
);
269 c1
= SREF (str1
, i1
++);
270 MAKE_CHAR_MULTIBYTE (c1
);
273 if (STRING_MULTIBYTE (str2
))
274 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c2
, str2
, i2
, i2_byte
);
277 c2
= SREF (str2
, i2
++);
278 MAKE_CHAR_MULTIBYTE (c2
);
284 if (! NILP (ignore_case
))
288 tem
= Fupcase (make_number (c1
));
290 tem
= Fupcase (make_number (c2
));
297 /* Note that I1 has already been incremented
298 past the character that we are comparing;
299 hence we don't add or subtract 1 here. */
301 return make_number (- i1
+ XINT (start1
));
303 return make_number (i1
- XINT (start1
));
307 return make_number (i1
- XINT (start1
) + 1);
309 return make_number (- i1
+ XINT (start1
) - 1);
314 DEFUN ("string-lessp", Fstring_lessp
, Sstring_lessp
, 2, 2, 0,
315 doc
: /* Return t if first arg string is less than second in lexicographic order.
317 Symbols are also allowed; their print names are used instead. */)
318 (register Lisp_Object s1
, Lisp_Object s2
)
320 register EMACS_INT end
;
321 register EMACS_INT i1
, i1_byte
, i2
, i2_byte
;
324 s1
= SYMBOL_NAME (s1
);
326 s2
= SYMBOL_NAME (s2
);
330 i1
= i1_byte
= i2
= i2_byte
= 0;
333 if (end
> SCHARS (s2
))
338 /* When we find a mismatch, we must compare the
339 characters, not just the bytes. */
342 FETCH_STRING_CHAR_ADVANCE (c1
, s1
, i1
, i1_byte
);
343 FETCH_STRING_CHAR_ADVANCE (c2
, s2
, i2
, i2_byte
);
346 return c1
< c2
? Qt
: Qnil
;
348 return i1
< SCHARS (s2
) ? Qt
: Qnil
;
351 static Lisp_Object
concat (size_t nargs
, Lisp_Object
*args
,
352 enum Lisp_Type target_type
, int last_special
);
356 concat2 (Lisp_Object s1
, Lisp_Object s2
)
361 return concat (2, args
, Lisp_String
, 0);
366 concat3 (Lisp_Object s1
, Lisp_Object s2
, Lisp_Object s3
)
372 return concat (3, args
, Lisp_String
, 0);
375 DEFUN ("append", Fappend
, Sappend
, 0, MANY
, 0,
376 doc
: /* Concatenate all the arguments and make the result a list.
377 The result is a list whose elements are the elements of all the arguments.
378 Each argument may be a list, vector or string.
379 The last argument is not copied, just used as the tail of the new list.
380 usage: (append &rest SEQUENCES) */)
381 (size_t nargs
, Lisp_Object
*args
)
383 return concat (nargs
, args
, Lisp_Cons
, 1);
386 DEFUN ("concat", Fconcat
, Sconcat
, 0, MANY
, 0,
387 doc
: /* Concatenate all the arguments and make the result a string.
388 The result is a string whose elements are the elements of all the arguments.
389 Each argument may be a string or a list or vector of characters (integers).
390 usage: (concat &rest SEQUENCES) */)
391 (size_t nargs
, Lisp_Object
*args
)
393 return concat (nargs
, args
, Lisp_String
, 0);
396 DEFUN ("vconcat", Fvconcat
, Svconcat
, 0, MANY
, 0,
397 doc
: /* Concatenate all the arguments and make the result a vector.
398 The result is a vector whose elements are the elements of all the arguments.
399 Each argument may be a list, vector or string.
400 usage: (vconcat &rest SEQUENCES) */)
401 (size_t nargs
, Lisp_Object
*args
)
403 return concat (nargs
, args
, Lisp_Vectorlike
, 0);
407 DEFUN ("copy-sequence", Fcopy_sequence
, Scopy_sequence
, 1, 1, 0,
408 doc
: /* Return a copy of a list, vector, string or char-table.
409 The elements of a list or vector are not copied; they are shared
410 with the original. */)
413 if (NILP (arg
)) return arg
;
415 if (CHAR_TABLE_P (arg
))
417 return copy_char_table (arg
);
420 if (BOOL_VECTOR_P (arg
))
424 = ((XBOOL_VECTOR (arg
)->size
+ BOOL_VECTOR_BITS_PER_CHAR
- 1)
425 / BOOL_VECTOR_BITS_PER_CHAR
);
427 val
= Fmake_bool_vector (Flength (arg
), Qnil
);
428 memcpy (XBOOL_VECTOR (val
)->data
, XBOOL_VECTOR (arg
)->data
,
433 if (!CONSP (arg
) && !VECTORP (arg
) && !STRINGP (arg
))
434 wrong_type_argument (Qsequencep
, arg
);
436 return concat (1, &arg
, CONSP (arg
) ? Lisp_Cons
: XTYPE (arg
), 0);
439 /* This structure holds information of an argument of `concat' that is
440 a string and has text properties to be copied. */
443 int argnum
; /* refer to ARGS (arguments of `concat') */
444 EMACS_INT from
; /* refer to ARGS[argnum] (argument string) */
445 EMACS_INT to
; /* refer to VAL (the target string) */
449 concat (size_t nargs
, Lisp_Object
*args
,
450 enum Lisp_Type target_type
, int last_special
)
453 register Lisp_Object tail
;
454 register Lisp_Object
this;
456 EMACS_INT toindex_byte
= 0;
457 register EMACS_INT result_len
;
458 register EMACS_INT result_len_byte
;
459 register size_t argnum
;
460 Lisp_Object last_tail
;
463 /* When we make a multibyte string, we can't copy text properties
464 while concatinating each string because the length of resulting
465 string can't be decided until we finish the whole concatination.
466 So, we record strings that have text properties to be copied
467 here, and copy the text properties after the concatination. */
468 struct textprop_rec
*textprops
= NULL
;
469 /* Number of elements in textprops. */
470 int num_textprops
= 0;
475 /* In append, the last arg isn't treated like the others */
476 if (last_special
&& nargs
> 0)
479 last_tail
= args
[nargs
];
484 /* Check each argument. */
485 for (argnum
= 0; argnum
< nargs
; argnum
++)
488 if (!(CONSP (this) || NILP (this) || VECTORP (this) || STRINGP (this)
489 || COMPILEDP (this) || BOOL_VECTOR_P (this)))
490 wrong_type_argument (Qsequencep
, this);
493 /* Compute total length in chars of arguments in RESULT_LEN.
494 If desired output is a string, also compute length in bytes
495 in RESULT_LEN_BYTE, and determine in SOME_MULTIBYTE
496 whether the result should be a multibyte string. */
500 for (argnum
= 0; argnum
< nargs
; argnum
++)
504 len
= XFASTINT (Flength (this));
505 if (target_type
== Lisp_String
)
507 /* We must count the number of bytes needed in the string
508 as well as the number of characters. */
511 EMACS_INT this_len_byte
;
513 if (VECTORP (this) || COMPILEDP (this))
514 for (i
= 0; i
< len
; i
++)
517 CHECK_CHARACTER (ch
);
518 this_len_byte
= CHAR_BYTES (XINT (ch
));
519 result_len_byte
+= this_len_byte
;
520 if (! ASCII_CHAR_P (XINT (ch
)) && ! CHAR_BYTE8_P (XINT (ch
)))
523 else if (BOOL_VECTOR_P (this) && XBOOL_VECTOR (this)->size
> 0)
524 wrong_type_argument (Qintegerp
, Faref (this, make_number (0)));
525 else if (CONSP (this))
526 for (; CONSP (this); this = XCDR (this))
529 CHECK_CHARACTER (ch
);
530 this_len_byte
= CHAR_BYTES (XINT (ch
));
531 result_len_byte
+= this_len_byte
;
532 if (! ASCII_CHAR_P (XINT (ch
)) && ! CHAR_BYTE8_P (XINT (ch
)))
535 else if (STRINGP (this))
537 if (STRING_MULTIBYTE (this))
540 result_len_byte
+= SBYTES (this);
543 result_len_byte
+= count_size_as_multibyte (SDATA (this),
550 error ("String overflow");
553 if (! some_multibyte
)
554 result_len_byte
= result_len
;
556 /* Create the output object. */
557 if (target_type
== Lisp_Cons
)
558 val
= Fmake_list (make_number (result_len
), Qnil
);
559 else if (target_type
== Lisp_Vectorlike
)
560 val
= Fmake_vector (make_number (result_len
), Qnil
);
561 else if (some_multibyte
)
562 val
= make_uninit_multibyte_string (result_len
, result_len_byte
);
564 val
= make_uninit_string (result_len
);
566 /* In `append', if all but last arg are nil, return last arg. */
567 if (target_type
== Lisp_Cons
&& EQ (val
, Qnil
))
570 /* Copy the contents of the args into the result. */
572 tail
= val
, toindex
= -1; /* -1 in toindex is flag we are making a list */
574 toindex
= 0, toindex_byte
= 0;
578 SAFE_ALLOCA (textprops
, struct textprop_rec
*, sizeof (struct textprop_rec
) * nargs
);
580 for (argnum
= 0; argnum
< nargs
; argnum
++)
583 EMACS_INT thisleni
= 0;
584 register EMACS_INT thisindex
= 0;
585 register EMACS_INT thisindex_byte
= 0;
589 thislen
= Flength (this), thisleni
= XINT (thislen
);
591 /* Between strings of the same kind, copy fast. */
592 if (STRINGP (this) && STRINGP (val
)
593 && STRING_MULTIBYTE (this) == some_multibyte
)
595 EMACS_INT thislen_byte
= SBYTES (this);
597 memcpy (SDATA (val
) + toindex_byte
, SDATA (this), SBYTES (this));
598 if (! NULL_INTERVAL_P (STRING_INTERVALS (this)))
600 textprops
[num_textprops
].argnum
= argnum
;
601 textprops
[num_textprops
].from
= 0;
602 textprops
[num_textprops
++].to
= toindex
;
604 toindex_byte
+= thislen_byte
;
607 /* Copy a single-byte string to a multibyte string. */
608 else if (STRINGP (this) && STRINGP (val
))
610 if (! NULL_INTERVAL_P (STRING_INTERVALS (this)))
612 textprops
[num_textprops
].argnum
= argnum
;
613 textprops
[num_textprops
].from
= 0;
614 textprops
[num_textprops
++].to
= toindex
;
616 toindex_byte
+= copy_text (SDATA (this),
617 SDATA (val
) + toindex_byte
,
618 SCHARS (this), 0, 1);
622 /* Copy element by element. */
625 register Lisp_Object elt
;
627 /* Fetch next element of `this' arg into `elt', or break if
628 `this' is exhausted. */
629 if (NILP (this)) break;
631 elt
= XCAR (this), this = XCDR (this);
632 else if (thisindex
>= thisleni
)
634 else if (STRINGP (this))
637 if (STRING_MULTIBYTE (this))
639 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c
, this,
642 XSETFASTINT (elt
, c
);
646 XSETFASTINT (elt
, SREF (this, thisindex
)); thisindex
++;
648 && !ASCII_CHAR_P (XINT (elt
))
649 && XINT (elt
) < 0400)
651 c
= BYTE8_TO_CHAR (XINT (elt
));
656 else if (BOOL_VECTOR_P (this))
659 byte
= XBOOL_VECTOR (this)->data
[thisindex
/ BOOL_VECTOR_BITS_PER_CHAR
];
660 if (byte
& (1 << (thisindex
% BOOL_VECTOR_BITS_PER_CHAR
)))
668 elt
= AREF (this, thisindex
);
672 /* Store this element into the result. */
679 else if (VECTORP (val
))
681 ASET (val
, toindex
, elt
);
688 toindex_byte
+= CHAR_STRING (XINT (elt
),
689 SDATA (val
) + toindex_byte
);
691 SSET (val
, toindex_byte
++, XINT (elt
));
697 XSETCDR (prev
, last_tail
);
699 if (num_textprops
> 0)
702 EMACS_INT last_to_end
= -1;
704 for (argnum
= 0; argnum
< num_textprops
; argnum
++)
706 this = args
[textprops
[argnum
].argnum
];
707 props
= text_property_list (this,
709 make_number (SCHARS (this)),
711 /* If successive arguments have properites, be sure that the
712 value of `composition' property be the copy. */
713 if (last_to_end
== textprops
[argnum
].to
)
714 make_composition_value_copy (props
);
715 add_text_properties_from_list (val
, props
,
716 make_number (textprops
[argnum
].to
));
717 last_to_end
= textprops
[argnum
].to
+ SCHARS (this);
725 static Lisp_Object string_char_byte_cache_string
;
726 static EMACS_INT string_char_byte_cache_charpos
;
727 static EMACS_INT string_char_byte_cache_bytepos
;
730 clear_string_char_byte_cache (void)
732 string_char_byte_cache_string
= Qnil
;
735 /* Return the byte index corresponding to CHAR_INDEX in STRING. */
738 string_char_to_byte (Lisp_Object string
, EMACS_INT char_index
)
741 EMACS_INT best_below
, best_below_byte
;
742 EMACS_INT best_above
, best_above_byte
;
744 best_below
= best_below_byte
= 0;
745 best_above
= SCHARS (string
);
746 best_above_byte
= SBYTES (string
);
747 if (best_above
== best_above_byte
)
750 if (EQ (string
, string_char_byte_cache_string
))
752 if (string_char_byte_cache_charpos
< char_index
)
754 best_below
= string_char_byte_cache_charpos
;
755 best_below_byte
= string_char_byte_cache_bytepos
;
759 best_above
= string_char_byte_cache_charpos
;
760 best_above_byte
= string_char_byte_cache_bytepos
;
764 if (char_index
- best_below
< best_above
- char_index
)
766 unsigned char *p
= SDATA (string
) + best_below_byte
;
768 while (best_below
< char_index
)
770 p
+= BYTES_BY_CHAR_HEAD (*p
);
773 i_byte
= p
- SDATA (string
);
777 unsigned char *p
= SDATA (string
) + best_above_byte
;
779 while (best_above
> char_index
)
782 while (!CHAR_HEAD_P (*p
)) p
--;
785 i_byte
= p
- SDATA (string
);
788 string_char_byte_cache_bytepos
= i_byte
;
789 string_char_byte_cache_charpos
= char_index
;
790 string_char_byte_cache_string
= string
;
795 /* Return the character index corresponding to BYTE_INDEX in STRING. */
798 string_byte_to_char (Lisp_Object string
, EMACS_INT byte_index
)
801 EMACS_INT best_below
, best_below_byte
;
802 EMACS_INT best_above
, best_above_byte
;
804 best_below
= best_below_byte
= 0;
805 best_above
= SCHARS (string
);
806 best_above_byte
= SBYTES (string
);
807 if (best_above
== best_above_byte
)
810 if (EQ (string
, string_char_byte_cache_string
))
812 if (string_char_byte_cache_bytepos
< byte_index
)
814 best_below
= string_char_byte_cache_charpos
;
815 best_below_byte
= string_char_byte_cache_bytepos
;
819 best_above
= string_char_byte_cache_charpos
;
820 best_above_byte
= string_char_byte_cache_bytepos
;
824 if (byte_index
- best_below_byte
< best_above_byte
- byte_index
)
826 unsigned char *p
= SDATA (string
) + best_below_byte
;
827 unsigned char *pend
= SDATA (string
) + byte_index
;
831 p
+= BYTES_BY_CHAR_HEAD (*p
);
835 i_byte
= p
- SDATA (string
);
839 unsigned char *p
= SDATA (string
) + best_above_byte
;
840 unsigned char *pbeg
= SDATA (string
) + byte_index
;
845 while (!CHAR_HEAD_P (*p
)) p
--;
849 i_byte
= p
- SDATA (string
);
852 string_char_byte_cache_bytepos
= i_byte
;
853 string_char_byte_cache_charpos
= i
;
854 string_char_byte_cache_string
= string
;
859 /* Convert STRING to a multibyte string. */
862 string_make_multibyte (Lisp_Object string
)
869 if (STRING_MULTIBYTE (string
))
872 nbytes
= count_size_as_multibyte (SDATA (string
),
874 /* If all the chars are ASCII, they won't need any more bytes
875 once converted. In that case, we can return STRING itself. */
876 if (nbytes
== SBYTES (string
))
879 SAFE_ALLOCA (buf
, unsigned char *, nbytes
);
880 copy_text (SDATA (string
), buf
, SBYTES (string
),
883 ret
= make_multibyte_string ((char *) buf
, SCHARS (string
), nbytes
);
890 /* Convert STRING (if unibyte) to a multibyte string without changing
891 the number of characters. Characters 0200 trough 0237 are
892 converted to eight-bit characters. */
895 string_to_multibyte (Lisp_Object string
)
902 if (STRING_MULTIBYTE (string
))
905 nbytes
= parse_str_to_multibyte (SDATA (string
), SBYTES (string
));
906 /* If all the chars are ASCII, they won't need any more bytes once
908 if (nbytes
== SBYTES (string
))
909 return make_multibyte_string (SSDATA (string
), nbytes
, nbytes
);
911 SAFE_ALLOCA (buf
, unsigned char *, nbytes
);
912 memcpy (buf
, SDATA (string
), SBYTES (string
));
913 str_to_multibyte (buf
, nbytes
, SBYTES (string
));
915 ret
= make_multibyte_string ((char *) buf
, SCHARS (string
), nbytes
);
922 /* Convert STRING to a single-byte string. */
925 string_make_unibyte (Lisp_Object string
)
932 if (! STRING_MULTIBYTE (string
))
935 nchars
= SCHARS (string
);
937 SAFE_ALLOCA (buf
, unsigned char *, nchars
);
938 copy_text (SDATA (string
), buf
, SBYTES (string
),
941 ret
= make_unibyte_string ((char *) buf
, nchars
);
947 DEFUN ("string-make-multibyte", Fstring_make_multibyte
, Sstring_make_multibyte
,
949 doc
: /* Return the multibyte equivalent of STRING.
950 If STRING is unibyte and contains non-ASCII characters, the function
951 `unibyte-char-to-multibyte' is used to convert each unibyte character
952 to a multibyte character. In this case, the returned string is a
953 newly created string with no text properties. If STRING is multibyte
954 or entirely ASCII, it is returned unchanged. In particular, when
955 STRING is unibyte and entirely ASCII, the returned string is unibyte.
956 \(When the characters are all ASCII, Emacs primitives will treat the
957 string the same way whether it is unibyte or multibyte.) */)
960 CHECK_STRING (string
);
962 return string_make_multibyte (string
);
965 DEFUN ("string-make-unibyte", Fstring_make_unibyte
, Sstring_make_unibyte
,
967 doc
: /* Return the unibyte equivalent of STRING.
968 Multibyte character codes are converted to unibyte according to
969 `nonascii-translation-table' or, if that is nil, `nonascii-insert-offset'.
970 If the lookup in the translation table fails, this function takes just
971 the low 8 bits of each character. */)
974 CHECK_STRING (string
);
976 return string_make_unibyte (string
);
979 DEFUN ("string-as-unibyte", Fstring_as_unibyte
, Sstring_as_unibyte
,
981 doc
: /* Return a unibyte string with the same individual bytes as STRING.
982 If STRING is unibyte, the result is STRING itself.
983 Otherwise it is a newly created string, with no text properties.
984 If STRING is multibyte and contains a character of charset
985 `eight-bit', it is converted to the corresponding single byte. */)
988 CHECK_STRING (string
);
990 if (STRING_MULTIBYTE (string
))
992 EMACS_INT bytes
= SBYTES (string
);
993 unsigned char *str
= (unsigned char *) xmalloc (bytes
);
995 memcpy (str
, SDATA (string
), bytes
);
996 bytes
= str_as_unibyte (str
, bytes
);
997 string
= make_unibyte_string ((char *) str
, bytes
);
1003 DEFUN ("string-as-multibyte", Fstring_as_multibyte
, Sstring_as_multibyte
,
1005 doc
: /* Return a multibyte string with the same individual bytes as STRING.
1006 If STRING is multibyte, the result is STRING itself.
1007 Otherwise it is a newly created string, with no text properties.
1009 If STRING is unibyte and contains an individual 8-bit byte (i.e. not
1010 part of a correct utf-8 sequence), it is converted to the corresponding
1011 multibyte character of charset `eight-bit'.
1012 See also `string-to-multibyte'.
1014 Beware, this often doesn't really do what you think it does.
1015 It is similar to (decode-coding-string STRING 'utf-8-emacs).
1016 If you're not sure, whether to use `string-as-multibyte' or
1017 `string-to-multibyte', use `string-to-multibyte'. */)
1018 (Lisp_Object string
)
1020 CHECK_STRING (string
);
1022 if (! STRING_MULTIBYTE (string
))
1024 Lisp_Object new_string
;
1025 EMACS_INT nchars
, nbytes
;
1027 parse_str_as_multibyte (SDATA (string
),
1030 new_string
= make_uninit_multibyte_string (nchars
, nbytes
);
1031 memcpy (SDATA (new_string
), SDATA (string
), SBYTES (string
));
1032 if (nbytes
!= SBYTES (string
))
1033 str_as_multibyte (SDATA (new_string
), nbytes
,
1034 SBYTES (string
), NULL
);
1035 string
= new_string
;
1036 STRING_SET_INTERVALS (string
, NULL_INTERVAL
);
1041 DEFUN ("string-to-multibyte", Fstring_to_multibyte
, Sstring_to_multibyte
,
1043 doc
: /* Return a multibyte string with the same individual chars as STRING.
1044 If STRING is multibyte, the result is STRING itself.
1045 Otherwise it is a newly created string, with no text properties.
1047 If STRING is unibyte and contains an 8-bit byte, it is converted to
1048 the corresponding multibyte character of charset `eight-bit'.
1050 This differs from `string-as-multibyte' by converting each byte of a correct
1051 utf-8 sequence to an eight-bit character, not just bytes that don't form a
1052 correct sequence. */)
1053 (Lisp_Object string
)
1055 CHECK_STRING (string
);
1057 return string_to_multibyte (string
);
1060 DEFUN ("string-to-unibyte", Fstring_to_unibyte
, Sstring_to_unibyte
,
1062 doc
: /* Return a unibyte string with the same individual chars as STRING.
1063 If STRING is unibyte, the result is STRING itself.
1064 Otherwise it is a newly created string, with no text properties,
1065 where each `eight-bit' character is converted to the corresponding byte.
1066 If STRING contains a non-ASCII, non-`eight-bit' character,
1067 an error is signaled. */)
1068 (Lisp_Object string
)
1070 CHECK_STRING (string
);
1072 if (STRING_MULTIBYTE (string
))
1074 EMACS_INT chars
= SCHARS (string
);
1075 unsigned char *str
= (unsigned char *) xmalloc (chars
);
1076 EMACS_INT converted
= str_to_unibyte (SDATA (string
), str
, chars
, 0);
1078 if (converted
< chars
)
1079 error ("Can't convert the %"pEd
"th character to unibyte", converted
);
1080 string
= make_unibyte_string ((char *) str
, chars
);
1087 DEFUN ("copy-alist", Fcopy_alist
, Scopy_alist
, 1, 1, 0,
1088 doc
: /* Return a copy of ALIST.
1089 This is an alist which represents the same mapping from objects to objects,
1090 but does not share the alist structure with ALIST.
1091 The objects mapped (cars and cdrs of elements of the alist)
1092 are shared, however.
1093 Elements of ALIST that are not conses are also shared. */)
1096 register Lisp_Object tem
;
1101 alist
= concat (1, &alist
, Lisp_Cons
, 0);
1102 for (tem
= alist
; CONSP (tem
); tem
= XCDR (tem
))
1104 register Lisp_Object car
;
1108 XSETCAR (tem
, Fcons (XCAR (car
), XCDR (car
)));
1113 DEFUN ("substring", Fsubstring
, Ssubstring
, 2, 3, 0,
1114 doc
: /* Return a new string whose contents are a substring of STRING.
1115 The returned string consists of the characters between index FROM
1116 \(inclusive) and index TO (exclusive) of STRING. FROM and TO are
1117 zero-indexed: 0 means the first character of STRING. Negative values
1118 are counted from the end of STRING. If TO is nil, the substring runs
1119 to the end of STRING.
1121 The STRING argument may also be a vector. In that case, the return
1122 value is a new vector that contains the elements between index FROM
1123 \(inclusive) and index TO (exclusive) of that vector argument. */)
1124 (Lisp_Object string
, register Lisp_Object from
, Lisp_Object to
)
1128 EMACS_INT size_byte
= 0;
1129 EMACS_INT from_char
, to_char
;
1130 EMACS_INT from_byte
= 0, to_byte
= 0;
1132 CHECK_VECTOR_OR_STRING (string
);
1133 CHECK_NUMBER (from
);
1135 if (STRINGP (string
))
1137 size
= SCHARS (string
);
1138 size_byte
= SBYTES (string
);
1141 size
= ASIZE (string
);
1146 to_byte
= size_byte
;
1152 to_char
= XINT (to
);
1156 if (STRINGP (string
))
1157 to_byte
= string_char_to_byte (string
, to_char
);
1160 from_char
= XINT (from
);
1163 if (STRINGP (string
))
1164 from_byte
= string_char_to_byte (string
, from_char
);
1166 if (!(0 <= from_char
&& from_char
<= to_char
&& to_char
<= size
))
1167 args_out_of_range_3 (string
, make_number (from_char
),
1168 make_number (to_char
));
1170 if (STRINGP (string
))
1172 res
= make_specified_string (SSDATA (string
) + from_byte
,
1173 to_char
- from_char
, to_byte
- from_byte
,
1174 STRING_MULTIBYTE (string
));
1175 copy_text_properties (make_number (from_char
), make_number (to_char
),
1176 string
, make_number (0), res
, Qnil
);
1179 res
= Fvector (to_char
- from_char
, &AREF (string
, from_char
));
1185 DEFUN ("substring-no-properties", Fsubstring_no_properties
, Ssubstring_no_properties
, 1, 3, 0,
1186 doc
: /* Return a substring of STRING, without text properties.
1187 It starts at index FROM and ends before TO.
1188 TO may be nil or omitted; then the substring runs to the end of STRING.
1189 If FROM is nil or omitted, the substring starts at the beginning of STRING.
1190 If FROM or TO is negative, it counts from the end.
1192 With one argument, just copy STRING without its properties. */)
1193 (Lisp_Object string
, register Lisp_Object from
, Lisp_Object to
)
1195 EMACS_INT size
, size_byte
;
1196 EMACS_INT from_char
, to_char
;
1197 EMACS_INT from_byte
, to_byte
;
1199 CHECK_STRING (string
);
1201 size
= SCHARS (string
);
1202 size_byte
= SBYTES (string
);
1205 from_char
= from_byte
= 0;
1208 CHECK_NUMBER (from
);
1209 from_char
= XINT (from
);
1213 from_byte
= string_char_to_byte (string
, from_char
);
1219 to_byte
= size_byte
;
1225 to_char
= XINT (to
);
1229 to_byte
= string_char_to_byte (string
, to_char
);
1232 if (!(0 <= from_char
&& from_char
<= to_char
&& to_char
<= size
))
1233 args_out_of_range_3 (string
, make_number (from_char
),
1234 make_number (to_char
));
1236 return make_specified_string (SSDATA (string
) + from_byte
,
1237 to_char
- from_char
, to_byte
- from_byte
,
1238 STRING_MULTIBYTE (string
));
1241 /* Extract a substring of STRING, giving start and end positions
1242 both in characters and in bytes. */
1245 substring_both (Lisp_Object string
, EMACS_INT from
, EMACS_INT from_byte
,
1246 EMACS_INT to
, EMACS_INT to_byte
)
1251 CHECK_VECTOR_OR_STRING (string
);
1253 size
= STRINGP (string
) ? SCHARS (string
) : ASIZE (string
);
1255 if (!(0 <= from
&& from
<= to
&& to
<= size
))
1256 args_out_of_range_3 (string
, make_number (from
), make_number (to
));
1258 if (STRINGP (string
))
1260 res
= make_specified_string (SSDATA (string
) + from_byte
,
1261 to
- from
, to_byte
- from_byte
,
1262 STRING_MULTIBYTE (string
));
1263 copy_text_properties (make_number (from
), make_number (to
),
1264 string
, make_number (0), res
, Qnil
);
1267 res
= Fvector (to
- from
, &AREF (string
, from
));
1272 DEFUN ("nthcdr", Fnthcdr
, Snthcdr
, 2, 2, 0,
1273 doc
: /* Take cdr N times on LIST, return the result. */)
1274 (Lisp_Object n
, Lisp_Object list
)
1276 register int i
, num
;
1279 for (i
= 0; i
< num
&& !NILP (list
); i
++)
1282 CHECK_LIST_CONS (list
, list
);
1288 DEFUN ("nth", Fnth
, Snth
, 2, 2, 0,
1289 doc
: /* Return the Nth element of LIST.
1290 N counts from zero. If LIST is not that long, nil is returned. */)
1291 (Lisp_Object n
, Lisp_Object list
)
1293 return Fcar (Fnthcdr (n
, list
));
1296 DEFUN ("elt", Felt
, Selt
, 2, 2, 0,
1297 doc
: /* Return element of SEQUENCE at index N. */)
1298 (register Lisp_Object sequence
, Lisp_Object n
)
1301 if (CONSP (sequence
) || NILP (sequence
))
1302 return Fcar (Fnthcdr (n
, sequence
));
1304 /* Faref signals a "not array" error, so check here. */
1305 CHECK_ARRAY (sequence
, Qsequencep
);
1306 return Faref (sequence
, n
);
1309 DEFUN ("member", Fmember
, Smember
, 2, 2, 0,
1310 doc
: /* Return non-nil if ELT is an element of LIST. Comparison done with `equal'.
1311 The value is actually the tail of LIST whose car is ELT. */)
1312 (register Lisp_Object elt
, Lisp_Object list
)
1314 register Lisp_Object tail
;
1315 for (tail
= list
; CONSP (tail
); tail
= XCDR (tail
))
1317 register Lisp_Object tem
;
1318 CHECK_LIST_CONS (tail
, list
);
1320 if (! NILP (Fequal (elt
, tem
)))
1327 DEFUN ("memq", Fmemq
, Smemq
, 2, 2, 0,
1328 doc
: /* Return non-nil if ELT is an element of LIST. Comparison done with `eq'.
1329 The value is actually the tail of LIST whose car is ELT. */)
1330 (register Lisp_Object elt
, Lisp_Object list
)
1334 if (!CONSP (list
) || EQ (XCAR (list
), elt
))
1338 if (!CONSP (list
) || EQ (XCAR (list
), elt
))
1342 if (!CONSP (list
) || EQ (XCAR (list
), elt
))
1353 DEFUN ("memql", Fmemql
, Smemql
, 2, 2, 0,
1354 doc
: /* Return non-nil if ELT is an element of LIST. Comparison done with `eql'.
1355 The value is actually the tail of LIST whose car is ELT. */)
1356 (register Lisp_Object elt
, Lisp_Object list
)
1358 register Lisp_Object tail
;
1361 return Fmemq (elt
, list
);
1363 for (tail
= list
; CONSP (tail
); tail
= XCDR (tail
))
1365 register Lisp_Object tem
;
1366 CHECK_LIST_CONS (tail
, list
);
1368 if (FLOATP (tem
) && internal_equal (elt
, tem
, 0, 0))
1375 DEFUN ("assq", Fassq
, Sassq
, 2, 2, 0,
1376 doc
: /* Return non-nil if KEY is `eq' to the car of an element of LIST.
1377 The value is actually the first element of LIST whose car is KEY.
1378 Elements of LIST that are not conses are ignored. */)
1379 (Lisp_Object key
, Lisp_Object list
)
1384 || (CONSP (XCAR (list
))
1385 && EQ (XCAR (XCAR (list
)), key
)))
1390 || (CONSP (XCAR (list
))
1391 && EQ (XCAR (XCAR (list
)), key
)))
1396 || (CONSP (XCAR (list
))
1397 && EQ (XCAR (XCAR (list
)), key
)))
1407 /* Like Fassq but never report an error and do not allow quits.
1408 Use only on lists known never to be circular. */
1411 assq_no_quit (Lisp_Object key
, Lisp_Object list
)
1414 && (!CONSP (XCAR (list
))
1415 || !EQ (XCAR (XCAR (list
)), key
)))
1418 return CAR_SAFE (list
);
1421 DEFUN ("assoc", Fassoc
, Sassoc
, 2, 2, 0,
1422 doc
: /* Return non-nil if KEY is `equal' to the car of an element of LIST.
1423 The value is actually the first element of LIST whose car equals KEY. */)
1424 (Lisp_Object key
, Lisp_Object list
)
1431 || (CONSP (XCAR (list
))
1432 && (car
= XCAR (XCAR (list
)),
1433 EQ (car
, key
) || !NILP (Fequal (car
, key
)))))
1438 || (CONSP (XCAR (list
))
1439 && (car
= XCAR (XCAR (list
)),
1440 EQ (car
, key
) || !NILP (Fequal (car
, key
)))))
1445 || (CONSP (XCAR (list
))
1446 && (car
= XCAR (XCAR (list
)),
1447 EQ (car
, key
) || !NILP (Fequal (car
, key
)))))
1457 /* Like Fassoc but never report an error and do not allow quits.
1458 Use only on lists known never to be circular. */
1461 assoc_no_quit (Lisp_Object key
, Lisp_Object list
)
1464 && (!CONSP (XCAR (list
))
1465 || (!EQ (XCAR (XCAR (list
)), key
)
1466 && NILP (Fequal (XCAR (XCAR (list
)), key
)))))
1469 return CONSP (list
) ? XCAR (list
) : Qnil
;
1472 DEFUN ("rassq", Frassq
, Srassq
, 2, 2, 0,
1473 doc
: /* Return non-nil if KEY is `eq' to the cdr of an element of LIST.
1474 The value is actually the first element of LIST whose cdr is KEY. */)
1475 (register Lisp_Object key
, Lisp_Object list
)
1480 || (CONSP (XCAR (list
))
1481 && EQ (XCDR (XCAR (list
)), key
)))
1486 || (CONSP (XCAR (list
))
1487 && EQ (XCDR (XCAR (list
)), key
)))
1492 || (CONSP (XCAR (list
))
1493 && EQ (XCDR (XCAR (list
)), key
)))
1503 DEFUN ("rassoc", Frassoc
, Srassoc
, 2, 2, 0,
1504 doc
: /* Return non-nil if KEY is `equal' to the cdr of an element of LIST.
1505 The value is actually the first element of LIST whose cdr equals KEY. */)
1506 (Lisp_Object key
, Lisp_Object list
)
1513 || (CONSP (XCAR (list
))
1514 && (cdr
= XCDR (XCAR (list
)),
1515 EQ (cdr
, key
) || !NILP (Fequal (cdr
, key
)))))
1520 || (CONSP (XCAR (list
))
1521 && (cdr
= XCDR (XCAR (list
)),
1522 EQ (cdr
, key
) || !NILP (Fequal (cdr
, key
)))))
1527 || (CONSP (XCAR (list
))
1528 && (cdr
= XCDR (XCAR (list
)),
1529 EQ (cdr
, key
) || !NILP (Fequal (cdr
, key
)))))
1539 DEFUN ("delq", Fdelq
, Sdelq
, 2, 2, 0,
1540 doc
: /* Delete by side effect any occurrences of ELT as a member of LIST.
1541 The modified LIST is returned. Comparison is done with `eq'.
1542 If the first member of LIST is ELT, there is no way to remove it by side effect;
1543 therefore, write `(setq foo (delq element foo))'
1544 to be sure of changing the value of `foo'. */)
1545 (register Lisp_Object elt
, Lisp_Object list
)
1547 register Lisp_Object tail
, prev
;
1548 register Lisp_Object tem
;
1552 while (!NILP (tail
))
1554 CHECK_LIST_CONS (tail
, list
);
1561 Fsetcdr (prev
, XCDR (tail
));
1571 DEFUN ("delete", Fdelete
, Sdelete
, 2, 2, 0,
1572 doc
: /* Delete by side effect any occurrences of ELT as a member of SEQ.
1573 SEQ must be a list, a vector, or a string.
1574 The modified SEQ is returned. Comparison is done with `equal'.
1575 If SEQ is not a list, or the first member of SEQ is ELT, deleting it
1576 is not a side effect; it is simply using a different sequence.
1577 Therefore, write `(setq foo (delete element foo))'
1578 to be sure of changing the value of `foo'. */)
1579 (Lisp_Object elt
, Lisp_Object seq
)
1585 for (i
= n
= 0; i
< ASIZE (seq
); ++i
)
1586 if (NILP (Fequal (AREF (seq
, i
), elt
)))
1589 if (n
!= ASIZE (seq
))
1591 struct Lisp_Vector
*p
= allocate_vector (n
);
1593 for (i
= n
= 0; i
< ASIZE (seq
); ++i
)
1594 if (NILP (Fequal (AREF (seq
, i
), elt
)))
1595 p
->contents
[n
++] = AREF (seq
, i
);
1597 XSETVECTOR (seq
, p
);
1600 else if (STRINGP (seq
))
1602 EMACS_INT i
, ibyte
, nchars
, nbytes
, cbytes
;
1605 for (i
= nchars
= nbytes
= ibyte
= 0;
1607 ++i
, ibyte
+= cbytes
)
1609 if (STRING_MULTIBYTE (seq
))
1611 c
= STRING_CHAR (SDATA (seq
) + ibyte
);
1612 cbytes
= CHAR_BYTES (c
);
1620 if (!INTEGERP (elt
) || c
!= XINT (elt
))
1627 if (nchars
!= SCHARS (seq
))
1631 tem
= make_uninit_multibyte_string (nchars
, nbytes
);
1632 if (!STRING_MULTIBYTE (seq
))
1633 STRING_SET_UNIBYTE (tem
);
1635 for (i
= nchars
= nbytes
= ibyte
= 0;
1637 ++i
, ibyte
+= cbytes
)
1639 if (STRING_MULTIBYTE (seq
))
1641 c
= STRING_CHAR (SDATA (seq
) + ibyte
);
1642 cbytes
= CHAR_BYTES (c
);
1650 if (!INTEGERP (elt
) || c
!= XINT (elt
))
1652 unsigned char *from
= SDATA (seq
) + ibyte
;
1653 unsigned char *to
= SDATA (tem
) + nbytes
;
1659 for (n
= cbytes
; n
--; )
1669 Lisp_Object tail
, prev
;
1671 for (tail
= seq
, prev
= Qnil
; CONSP (tail
); tail
= XCDR (tail
))
1673 CHECK_LIST_CONS (tail
, seq
);
1675 if (!NILP (Fequal (elt
, XCAR (tail
))))
1680 Fsetcdr (prev
, XCDR (tail
));
1691 DEFUN ("nreverse", Fnreverse
, Snreverse
, 1, 1, 0,
1692 doc
: /* Reverse LIST by modifying cdr pointers.
1693 Return the reversed list. */)
1696 register Lisp_Object prev
, tail
, next
;
1698 if (NILP (list
)) return list
;
1701 while (!NILP (tail
))
1704 CHECK_LIST_CONS (tail
, list
);
1706 Fsetcdr (tail
, prev
);
1713 DEFUN ("reverse", Freverse
, Sreverse
, 1, 1, 0,
1714 doc
: /* Reverse LIST, copying. Return the reversed list.
1715 See also the function `nreverse', which is used more often. */)
1720 for (new = Qnil
; CONSP (list
); list
= XCDR (list
))
1723 new = Fcons (XCAR (list
), new);
1725 CHECK_LIST_END (list
, list
);
1729 Lisp_Object
merge (Lisp_Object org_l1
, Lisp_Object org_l2
, Lisp_Object pred
);
1731 DEFUN ("sort", Fsort
, Ssort
, 2, 2, 0,
1732 doc
: /* Sort LIST, stably, comparing elements using PREDICATE.
1733 Returns the sorted list. LIST is modified by side effects.
1734 PREDICATE is called with two elements of LIST, and should return non-nil
1735 if the first element should sort before the second. */)
1736 (Lisp_Object list
, Lisp_Object predicate
)
1738 Lisp_Object front
, back
;
1739 register Lisp_Object len
, tem
;
1740 struct gcpro gcpro1
, gcpro2
;
1741 register int length
;
1744 len
= Flength (list
);
1745 length
= XINT (len
);
1749 XSETINT (len
, (length
/ 2) - 1);
1750 tem
= Fnthcdr (len
, list
);
1752 Fsetcdr (tem
, Qnil
);
1754 GCPRO2 (front
, back
);
1755 front
= Fsort (front
, predicate
);
1756 back
= Fsort (back
, predicate
);
1758 return merge (front
, back
, predicate
);
1762 merge (Lisp_Object org_l1
, Lisp_Object org_l2
, Lisp_Object pred
)
1765 register Lisp_Object tail
;
1767 register Lisp_Object l1
, l2
;
1768 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
;
1775 /* It is sufficient to protect org_l1 and org_l2.
1776 When l1 and l2 are updated, we copy the new values
1777 back into the org_ vars. */
1778 GCPRO4 (org_l1
, org_l2
, pred
, value
);
1798 tem
= call2 (pred
, Fcar (l2
), Fcar (l1
));
1814 Fsetcdr (tail
, tem
);
1820 /* This does not check for quits. That is safe since it must terminate. */
1822 DEFUN ("plist-get", Fplist_get
, Splist_get
, 2, 2, 0,
1823 doc
: /* Extract a value from a property list.
1824 PLIST is a property list, which is a list of the form
1825 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value
1826 corresponding to the given PROP, or nil if PROP is not one of the
1827 properties on the list. This function never signals an error. */)
1828 (Lisp_Object plist
, Lisp_Object prop
)
1830 Lisp_Object tail
, halftail
;
1832 /* halftail is used to detect circular lists. */
1833 tail
= halftail
= plist
;
1834 while (CONSP (tail
) && CONSP (XCDR (tail
)))
1836 if (EQ (prop
, XCAR (tail
)))
1837 return XCAR (XCDR (tail
));
1839 tail
= XCDR (XCDR (tail
));
1840 halftail
= XCDR (halftail
);
1841 if (EQ (tail
, halftail
))
1844 #if 0 /* Unsafe version. */
1845 /* This function can be called asynchronously
1846 (setup_coding_system). Don't QUIT in that case. */
1847 if (!interrupt_input_blocked
)
1855 DEFUN ("get", Fget
, Sget
, 2, 2, 0,
1856 doc
: /* Return the value of SYMBOL's PROPNAME property.
1857 This is the last value stored with `(put SYMBOL PROPNAME VALUE)'. */)
1858 (Lisp_Object symbol
, Lisp_Object propname
)
1860 CHECK_SYMBOL (symbol
);
1861 return Fplist_get (XSYMBOL (symbol
)->plist
, propname
);
1864 DEFUN ("plist-put", Fplist_put
, Splist_put
, 3, 3, 0,
1865 doc
: /* Change value in PLIST of PROP to VAL.
1866 PLIST is a property list, which is a list of the form
1867 \(PROP1 VALUE1 PROP2 VALUE2 ...). PROP is a symbol and VAL is any object.
1868 If PROP is already a property on the list, its value is set to VAL,
1869 otherwise the new PROP VAL pair is added. The new plist is returned;
1870 use `(setq x (plist-put x prop val))' to be sure to use the new value.
1871 The PLIST is modified by side effects. */)
1872 (Lisp_Object plist
, register Lisp_Object prop
, Lisp_Object val
)
1874 register Lisp_Object tail
, prev
;
1875 Lisp_Object newcell
;
1877 for (tail
= plist
; CONSP (tail
) && CONSP (XCDR (tail
));
1878 tail
= XCDR (XCDR (tail
)))
1880 if (EQ (prop
, XCAR (tail
)))
1882 Fsetcar (XCDR (tail
), val
);
1889 newcell
= Fcons (prop
, Fcons (val
, NILP (prev
) ? plist
: XCDR (XCDR (prev
))));
1893 Fsetcdr (XCDR (prev
), newcell
);
1897 DEFUN ("put", Fput
, Sput
, 3, 3, 0,
1898 doc
: /* Store SYMBOL's PROPNAME property with value VALUE.
1899 It can be retrieved with `(get SYMBOL PROPNAME)'. */)
1900 (Lisp_Object symbol
, Lisp_Object propname
, Lisp_Object value
)
1902 CHECK_SYMBOL (symbol
);
1903 XSYMBOL (symbol
)->plist
1904 = Fplist_put (XSYMBOL (symbol
)->plist
, propname
, value
);
1908 DEFUN ("lax-plist-get", Flax_plist_get
, Slax_plist_get
, 2, 2, 0,
1909 doc
: /* Extract a value from a property list, comparing with `equal'.
1910 PLIST is a property list, which is a list of the form
1911 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value
1912 corresponding to the given PROP, or nil if PROP is not
1913 one of the properties on the list. */)
1914 (Lisp_Object plist
, Lisp_Object prop
)
1919 CONSP (tail
) && CONSP (XCDR (tail
));
1920 tail
= XCDR (XCDR (tail
)))
1922 if (! NILP (Fequal (prop
, XCAR (tail
))))
1923 return XCAR (XCDR (tail
));
1928 CHECK_LIST_END (tail
, prop
);
1933 DEFUN ("lax-plist-put", Flax_plist_put
, Slax_plist_put
, 3, 3, 0,
1934 doc
: /* Change value in PLIST of PROP to VAL, comparing with `equal'.
1935 PLIST is a property list, which is a list of the form
1936 \(PROP1 VALUE1 PROP2 VALUE2 ...). PROP and VAL are any objects.
1937 If PROP is already a property on the list, its value is set to VAL,
1938 otherwise the new PROP VAL pair is added. The new plist is returned;
1939 use `(setq x (lax-plist-put x prop val))' to be sure to use the new value.
1940 The PLIST is modified by side effects. */)
1941 (Lisp_Object plist
, register Lisp_Object prop
, Lisp_Object val
)
1943 register Lisp_Object tail
, prev
;
1944 Lisp_Object newcell
;
1946 for (tail
= plist
; CONSP (tail
) && CONSP (XCDR (tail
));
1947 tail
= XCDR (XCDR (tail
)))
1949 if (! NILP (Fequal (prop
, XCAR (tail
))))
1951 Fsetcar (XCDR (tail
), val
);
1958 newcell
= Fcons (prop
, Fcons (val
, Qnil
));
1962 Fsetcdr (XCDR (prev
), newcell
);
1966 DEFUN ("eql", Feql
, Seql
, 2, 2, 0,
1967 doc
: /* Return t if the two args are the same Lisp object.
1968 Floating-point numbers of equal value are `eql', but they may not be `eq'. */)
1969 (Lisp_Object obj1
, Lisp_Object obj2
)
1972 return internal_equal (obj1
, obj2
, 0, 0) ? Qt
: Qnil
;
1974 return EQ (obj1
, obj2
) ? Qt
: Qnil
;
1977 DEFUN ("equal", Fequal
, Sequal
, 2, 2, 0,
1978 doc
: /* Return t if two Lisp objects have similar structure and contents.
1979 They must have the same data type.
1980 Conses are compared by comparing the cars and the cdrs.
1981 Vectors and strings are compared element by element.
1982 Numbers are compared by value, but integers cannot equal floats.
1983 (Use `=' if you want integers and floats to be able to be equal.)
1984 Symbols must match exactly. */)
1985 (register Lisp_Object o1
, Lisp_Object o2
)
1987 return internal_equal (o1
, o2
, 0, 0) ? Qt
: Qnil
;
1990 DEFUN ("equal-including-properties", Fequal_including_properties
, Sequal_including_properties
, 2, 2, 0,
1991 doc
: /* Return t if two Lisp objects have similar structure and contents.
1992 This is like `equal' except that it compares the text properties
1993 of strings. (`equal' ignores text properties.) */)
1994 (register Lisp_Object o1
, Lisp_Object o2
)
1996 return internal_equal (o1
, o2
, 0, 1) ? Qt
: Qnil
;
1999 /* DEPTH is current depth of recursion. Signal an error if it
2001 PROPS, if non-nil, means compare string text properties too. */
2004 internal_equal (register Lisp_Object o1
, register Lisp_Object o2
, int depth
, int props
)
2007 error ("Stack overflow in equal");
2013 if (XTYPE (o1
) != XTYPE (o2
))
2022 d1
= extract_float (o1
);
2023 d2
= extract_float (o2
);
2024 /* If d is a NaN, then d != d. Two NaNs should be `equal' even
2025 though they are not =. */
2026 return d1
== d2
|| (d1
!= d1
&& d2
!= d2
);
2030 if (!internal_equal (XCAR (o1
), XCAR (o2
), depth
+ 1, props
))
2037 if (XMISCTYPE (o1
) != XMISCTYPE (o2
))
2041 if (!internal_equal (OVERLAY_START (o1
), OVERLAY_START (o2
),
2043 || !internal_equal (OVERLAY_END (o1
), OVERLAY_END (o2
),
2046 o1
= XOVERLAY (o1
)->plist
;
2047 o2
= XOVERLAY (o2
)->plist
;
2052 return (XMARKER (o1
)->buffer
== XMARKER (o2
)->buffer
2053 && (XMARKER (o1
)->buffer
== 0
2054 || XMARKER (o1
)->bytepos
== XMARKER (o2
)->bytepos
));
2058 case Lisp_Vectorlike
:
2061 EMACS_INT size
= ASIZE (o1
);
2062 /* Pseudovectors have the type encoded in the size field, so this test
2063 actually checks that the objects have the same type as well as the
2065 if (ASIZE (o2
) != size
)
2067 /* Boolvectors are compared much like strings. */
2068 if (BOOL_VECTOR_P (o1
))
2071 = ((XBOOL_VECTOR (o1
)->size
+ BOOL_VECTOR_BITS_PER_CHAR
- 1)
2072 / BOOL_VECTOR_BITS_PER_CHAR
);
2074 if (XBOOL_VECTOR (o1
)->size
!= XBOOL_VECTOR (o2
)->size
)
2076 if (memcmp (XBOOL_VECTOR (o1
)->data
, XBOOL_VECTOR (o2
)->data
,
2081 if (WINDOW_CONFIGURATIONP (o1
))
2082 return compare_window_configurations (o1
, o2
, 0);
2084 /* Aside from them, only true vectors, char-tables, compiled
2085 functions, and fonts (font-spec, font-entity, font-ojbect)
2086 are sensible to compare, so eliminate the others now. */
2087 if (size
& PSEUDOVECTOR_FLAG
)
2089 if (!(size
& (PVEC_COMPILED
2090 | PVEC_CHAR_TABLE
| PVEC_SUB_CHAR_TABLE
| PVEC_FONT
)))
2092 size
&= PSEUDOVECTOR_SIZE_MASK
;
2094 for (i
= 0; i
< size
; i
++)
2099 if (!internal_equal (v1
, v2
, depth
+ 1, props
))
2107 if (SCHARS (o1
) != SCHARS (o2
))
2109 if (SBYTES (o1
) != SBYTES (o2
))
2111 if (memcmp (SDATA (o1
), SDATA (o2
), SBYTES (o1
)))
2113 if (props
&& !compare_string_intervals (o1
, o2
))
2125 DEFUN ("fillarray", Ffillarray
, Sfillarray
, 2, 2, 0,
2126 doc
: /* Store each element of ARRAY with ITEM.
2127 ARRAY is a vector, string, char-table, or bool-vector. */)
2128 (Lisp_Object array
, Lisp_Object item
)
2130 register EMACS_INT size
, idx
;
2133 if (VECTORP (array
))
2135 register Lisp_Object
*p
= XVECTOR (array
)->contents
;
2136 size
= ASIZE (array
);
2137 for (idx
= 0; idx
< size
; idx
++)
2140 else if (CHAR_TABLE_P (array
))
2144 for (i
= 0; i
< (1 << CHARTAB_SIZE_BITS_0
); i
++)
2145 XCHAR_TABLE (array
)->contents
[i
] = item
;
2146 XCHAR_TABLE (array
)->defalt
= item
;
2148 else if (STRINGP (array
))
2150 register unsigned char *p
= SDATA (array
);
2151 CHECK_NUMBER (item
);
2152 charval
= XINT (item
);
2153 size
= SCHARS (array
);
2154 if (STRING_MULTIBYTE (array
))
2156 unsigned char str
[MAX_MULTIBYTE_LENGTH
];
2157 int len
= CHAR_STRING (charval
, str
);
2158 EMACS_INT size_byte
= SBYTES (array
);
2159 unsigned char *p1
= p
, *endp
= p
+ size_byte
;
2162 if (size
!= size_byte
)
2165 int this_len
= BYTES_BY_CHAR_HEAD (*p1
);
2166 if (len
!= this_len
)
2167 error ("Attempt to change byte length of a string");
2170 for (i
= 0; i
< size_byte
; i
++)
2171 *p
++ = str
[i
% len
];
2174 for (idx
= 0; idx
< size
; idx
++)
2177 else if (BOOL_VECTOR_P (array
))
2179 register unsigned char *p
= XBOOL_VECTOR (array
)->data
;
2181 = ((XBOOL_VECTOR (array
)->size
+ BOOL_VECTOR_BITS_PER_CHAR
- 1)
2182 / BOOL_VECTOR_BITS_PER_CHAR
);
2184 charval
= (! NILP (item
) ? -1 : 0);
2185 for (idx
= 0; idx
< size_in_chars
- 1; idx
++)
2187 if (idx
< size_in_chars
)
2189 /* Mask out bits beyond the vector size. */
2190 if (XBOOL_VECTOR (array
)->size
% BOOL_VECTOR_BITS_PER_CHAR
)
2191 charval
&= (1 << (XBOOL_VECTOR (array
)->size
% BOOL_VECTOR_BITS_PER_CHAR
)) - 1;
2196 wrong_type_argument (Qarrayp
, array
);
2200 DEFUN ("clear-string", Fclear_string
, Sclear_string
,
2202 doc
: /* Clear the contents of STRING.
2203 This makes STRING unibyte and may change its length. */)
2204 (Lisp_Object string
)
2207 CHECK_STRING (string
);
2208 len
= SBYTES (string
);
2209 memset (SDATA (string
), 0, len
);
2210 STRING_SET_CHARS (string
, len
);
2211 STRING_SET_UNIBYTE (string
);
2217 nconc2 (Lisp_Object s1
, Lisp_Object s2
)
2219 Lisp_Object args
[2];
2222 return Fnconc (2, args
);
2225 DEFUN ("nconc", Fnconc
, Snconc
, 0, MANY
, 0,
2226 doc
: /* Concatenate any number of lists by altering them.
2227 Only the last argument is not altered, and need not be a list.
2228 usage: (nconc &rest LISTS) */)
2229 (size_t nargs
, Lisp_Object
*args
)
2231 register size_t argnum
;
2232 register Lisp_Object tail
, tem
, val
;
2236 for (argnum
= 0; argnum
< nargs
; argnum
++)
2239 if (NILP (tem
)) continue;
2244 if (argnum
+ 1 == nargs
) break;
2246 CHECK_LIST_CONS (tem
, tem
);
2255 tem
= args
[argnum
+ 1];
2256 Fsetcdr (tail
, tem
);
2258 args
[argnum
+ 1] = tail
;
2264 /* This is the guts of all mapping functions.
2265 Apply FN to each element of SEQ, one by one,
2266 storing the results into elements of VALS, a C vector of Lisp_Objects.
2267 LENI is the length of VALS, which should also be the length of SEQ. */
2270 mapcar1 (EMACS_INT leni
, Lisp_Object
*vals
, Lisp_Object fn
, Lisp_Object seq
)
2272 register Lisp_Object tail
;
2274 register EMACS_INT i
;
2275 struct gcpro gcpro1
, gcpro2
, gcpro3
;
2279 /* Don't let vals contain any garbage when GC happens. */
2280 for (i
= 0; i
< leni
; i
++)
2283 GCPRO3 (dummy
, fn
, seq
);
2285 gcpro1
.nvars
= leni
;
2289 /* We need not explicitly protect `tail' because it is used only on lists, and
2290 1) lists are not relocated and 2) the list is marked via `seq' so will not
2293 if (VECTORP (seq
) || COMPILEDP (seq
))
2295 for (i
= 0; i
< leni
; i
++)
2297 dummy
= call1 (fn
, AREF (seq
, i
));
2302 else if (BOOL_VECTOR_P (seq
))
2304 for (i
= 0; i
< leni
; i
++)
2307 byte
= XBOOL_VECTOR (seq
)->data
[i
/ BOOL_VECTOR_BITS_PER_CHAR
];
2308 dummy
= (byte
& (1 << (i
% BOOL_VECTOR_BITS_PER_CHAR
))) ? Qt
: Qnil
;
2309 dummy
= call1 (fn
, dummy
);
2314 else if (STRINGP (seq
))
2318 for (i
= 0, i_byte
= 0; i
< leni
;)
2321 EMACS_INT i_before
= i
;
2323 FETCH_STRING_CHAR_ADVANCE (c
, seq
, i
, i_byte
);
2324 XSETFASTINT (dummy
, c
);
2325 dummy
= call1 (fn
, dummy
);
2327 vals
[i_before
] = dummy
;
2330 else /* Must be a list, since Flength did not get an error */
2333 for (i
= 0; i
< leni
&& CONSP (tail
); i
++)
2335 dummy
= call1 (fn
, XCAR (tail
));
2345 DEFUN ("mapconcat", Fmapconcat
, Smapconcat
, 3, 3, 0,
2346 doc
: /* Apply FUNCTION to each element of SEQUENCE, and concat the results as strings.
2347 In between each pair of results, stick in SEPARATOR. Thus, " " as
2348 SEPARATOR results in spaces between the values returned by FUNCTION.
2349 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
2350 (Lisp_Object function
, Lisp_Object sequence
, Lisp_Object separator
)
2353 register EMACS_INT leni
;
2355 register Lisp_Object
*args
;
2356 register EMACS_INT i
;
2357 struct gcpro gcpro1
;
2361 len
= Flength (sequence
);
2362 if (CHAR_TABLE_P (sequence
))
2363 wrong_type_argument (Qlistp
, sequence
);
2365 nargs
= leni
+ leni
- 1;
2366 if (nargs
< 0) return empty_unibyte_string
;
2368 SAFE_ALLOCA_LISP (args
, nargs
);
2371 mapcar1 (leni
, args
, function
, sequence
);
2374 for (i
= leni
- 1; i
> 0; i
--)
2375 args
[i
+ i
] = args
[i
];
2377 for (i
= 1; i
< nargs
; i
+= 2)
2378 args
[i
] = separator
;
2380 ret
= Fconcat (nargs
, args
);
2386 DEFUN ("mapcar", Fmapcar
, Smapcar
, 2, 2, 0,
2387 doc
: /* Apply FUNCTION to each element of SEQUENCE, and make a list of the results.
2388 The result is a list just as long as SEQUENCE.
2389 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
2390 (Lisp_Object function
, Lisp_Object sequence
)
2392 register Lisp_Object len
;
2393 register EMACS_INT leni
;
2394 register Lisp_Object
*args
;
2398 len
= Flength (sequence
);
2399 if (CHAR_TABLE_P (sequence
))
2400 wrong_type_argument (Qlistp
, sequence
);
2401 leni
= XFASTINT (len
);
2403 SAFE_ALLOCA_LISP (args
, leni
);
2405 mapcar1 (leni
, args
, function
, sequence
);
2407 ret
= Flist (leni
, args
);
2413 DEFUN ("mapc", Fmapc
, Smapc
, 2, 2, 0,
2414 doc
: /* Apply FUNCTION to each element of SEQUENCE for side effects only.
2415 Unlike `mapcar', don't accumulate the results. Return SEQUENCE.
2416 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
2417 (Lisp_Object function
, Lisp_Object sequence
)
2419 register EMACS_INT leni
;
2421 leni
= XFASTINT (Flength (sequence
));
2422 if (CHAR_TABLE_P (sequence
))
2423 wrong_type_argument (Qlistp
, sequence
);
2424 mapcar1 (leni
, 0, function
, sequence
);
2429 /* This is how C code calls `yes-or-no-p' and allows the user
2432 Anything that calls this function must protect from GC! */
2435 do_yes_or_no_p (Lisp_Object prompt
)
2437 return call1 (intern ("yes-or-no-p"), prompt
);
2440 /* Anything that calls this function must protect from GC! */
2442 DEFUN ("yes-or-no-p", Fyes_or_no_p
, Syes_or_no_p
, 1, 1, 0,
2443 doc
: /* Ask user a yes-or-no question. Return t if answer is yes.
2444 PROMPT is the string to display to ask the question. It should end in
2445 a space; `yes-or-no-p' adds \"(yes or no) \" to it.
2447 The user must confirm the answer with RET, and can edit it until it
2450 Under a windowing system a dialog box will be used if `last-nonmenu-event'
2451 is nil, and `use-dialog-box' is non-nil. */)
2452 (Lisp_Object prompt
)
2454 register Lisp_Object ans
;
2455 Lisp_Object args
[2];
2456 struct gcpro gcpro1
;
2458 CHECK_STRING (prompt
);
2461 if (FRAME_WINDOW_P (SELECTED_FRAME ())
2462 && (NILP (last_nonmenu_event
) || CONSP (last_nonmenu_event
))
2466 Lisp_Object pane
, menu
, obj
;
2467 redisplay_preserve_echo_area (4);
2468 pane
= Fcons (Fcons (build_string ("Yes"), Qt
),
2469 Fcons (Fcons (build_string ("No"), Qnil
),
2472 menu
= Fcons (prompt
, pane
);
2473 obj
= Fx_popup_dialog (Qt
, menu
, Qnil
);
2477 #endif /* HAVE_MENUS */
2480 args
[1] = build_string ("(yes or no) ");
2481 prompt
= Fconcat (2, args
);
2487 ans
= Fdowncase (Fread_from_minibuffer (prompt
, Qnil
, Qnil
, Qnil
,
2488 Qyes_or_no_p_history
, Qnil
,
2490 if (SCHARS (ans
) == 3 && !strcmp (SSDATA (ans
), "yes"))
2495 if (SCHARS (ans
) == 2 && !strcmp (SSDATA (ans
), "no"))
2503 message ("Please answer yes or no.");
2504 Fsleep_for (make_number (2), Qnil
);
2508 DEFUN ("load-average", Fload_average
, Sload_average
, 0, 1, 0,
2509 doc
: /* Return list of 1 minute, 5 minute and 15 minute load averages.
2511 Each of the three load averages is multiplied by 100, then converted
2514 When USE-FLOATS is non-nil, floats will be used instead of integers.
2515 These floats are not multiplied by 100.
2517 If the 5-minute or 15-minute load averages are not available, return a
2518 shortened list, containing only those averages which are available.
2520 An error is thrown if the load average can't be obtained. In some
2521 cases making it work would require Emacs being installed setuid or
2522 setgid so that it can read kernel information, and that usually isn't
2524 (Lisp_Object use_floats
)
2527 int loads
= getloadavg (load_ave
, 3);
2528 Lisp_Object ret
= Qnil
;
2531 error ("load-average not implemented for this operating system");
2535 Lisp_Object load
= (NILP (use_floats
) ?
2536 make_number ((int) (100.0 * load_ave
[loads
]))
2537 : make_float (load_ave
[loads
]));
2538 ret
= Fcons (load
, ret
);
2544 Lisp_Object Qsubfeatures
;
2546 DEFUN ("featurep", Ffeaturep
, Sfeaturep
, 1, 2, 0,
2547 doc
: /* Return t if FEATURE is present in this Emacs.
2549 Use this to conditionalize execution of lisp code based on the
2550 presence or absence of Emacs or environment extensions.
2551 Use `provide' to declare that a feature is available. This function
2552 looks at the value of the variable `features'. The optional argument
2553 SUBFEATURE can be used to check a specific subfeature of FEATURE. */)
2554 (Lisp_Object feature
, Lisp_Object subfeature
)
2556 register Lisp_Object tem
;
2557 CHECK_SYMBOL (feature
);
2558 tem
= Fmemq (feature
, Vfeatures
);
2559 if (!NILP (tem
) && !NILP (subfeature
))
2560 tem
= Fmember (subfeature
, Fget (feature
, Qsubfeatures
));
2561 return (NILP (tem
)) ? Qnil
: Qt
;
2564 DEFUN ("provide", Fprovide
, Sprovide
, 1, 2, 0,
2565 doc
: /* Announce that FEATURE is a feature of the current Emacs.
2566 The optional argument SUBFEATURES should be a list of symbols listing
2567 particular subfeatures supported in this version of FEATURE. */)
2568 (Lisp_Object feature
, Lisp_Object subfeatures
)
2570 register Lisp_Object tem
;
2571 CHECK_SYMBOL (feature
);
2572 CHECK_LIST (subfeatures
);
2573 if (!NILP (Vautoload_queue
))
2574 Vautoload_queue
= Fcons (Fcons (make_number (0), Vfeatures
),
2576 tem
= Fmemq (feature
, Vfeatures
);
2578 Vfeatures
= Fcons (feature
, Vfeatures
);
2579 if (!NILP (subfeatures
))
2580 Fput (feature
, Qsubfeatures
, subfeatures
);
2581 LOADHIST_ATTACH (Fcons (Qprovide
, feature
));
2583 /* Run any load-hooks for this file. */
2584 tem
= Fassq (feature
, Vafter_load_alist
);
2586 Fprogn (XCDR (tem
));
2591 /* `require' and its subroutines. */
2593 /* List of features currently being require'd, innermost first. */
2595 static Lisp_Object require_nesting_list
;
2598 require_unwind (Lisp_Object old_value
)
2600 return require_nesting_list
= old_value
;
2603 DEFUN ("require", Frequire
, Srequire
, 1, 3, 0,
2604 doc
: /* If feature FEATURE is not loaded, load it from FILENAME.
2605 If FEATURE is not a member of the list `features', then the feature
2606 is not loaded; so load the file FILENAME.
2607 If FILENAME is omitted, the printname of FEATURE is used as the file name,
2608 and `load' will try to load this name appended with the suffix `.elc' or
2609 `.el', in that order. The name without appended suffix will not be used.
2610 If the optional third argument NOERROR is non-nil,
2611 then return nil if the file is not found instead of signaling an error.
2612 Normally the return value is FEATURE.
2613 The normal messages at start and end of loading FILENAME are suppressed. */)
2614 (Lisp_Object feature
, Lisp_Object filename
, Lisp_Object noerror
)
2616 register Lisp_Object tem
;
2617 struct gcpro gcpro1
, gcpro2
;
2618 int from_file
= load_in_progress
;
2620 CHECK_SYMBOL (feature
);
2622 /* Record the presence of `require' in this file
2623 even if the feature specified is already loaded.
2624 But not more than once in any file,
2625 and not when we aren't loading or reading from a file. */
2627 for (tem
= Vcurrent_load_list
; CONSP (tem
); tem
= XCDR (tem
))
2628 if (NILP (XCDR (tem
)) && STRINGP (XCAR (tem
)))
2633 tem
= Fcons (Qrequire
, feature
);
2634 if (NILP (Fmember (tem
, Vcurrent_load_list
)))
2635 LOADHIST_ATTACH (tem
);
2637 tem
= Fmemq (feature
, Vfeatures
);
2641 int count
= SPECPDL_INDEX ();
2644 /* This is to make sure that loadup.el gives a clear picture
2645 of what files are preloaded and when. */
2646 if (! NILP (Vpurify_flag
))
2647 error ("(require %s) while preparing to dump",
2648 SDATA (SYMBOL_NAME (feature
)));
2650 /* A certain amount of recursive `require' is legitimate,
2651 but if we require the same feature recursively 3 times,
2653 tem
= require_nesting_list
;
2654 while (! NILP (tem
))
2656 if (! NILP (Fequal (feature
, XCAR (tem
))))
2661 error ("Recursive `require' for feature `%s'",
2662 SDATA (SYMBOL_NAME (feature
)));
2664 /* Update the list for any nested `require's that occur. */
2665 record_unwind_protect (require_unwind
, require_nesting_list
);
2666 require_nesting_list
= Fcons (feature
, require_nesting_list
);
2668 /* Value saved here is to be restored into Vautoload_queue */
2669 record_unwind_protect (un_autoload
, Vautoload_queue
);
2670 Vautoload_queue
= Qt
;
2672 /* Load the file. */
2673 GCPRO2 (feature
, filename
);
2674 tem
= Fload (NILP (filename
) ? Fsymbol_name (feature
) : filename
,
2675 noerror
, Qt
, Qnil
, (NILP (filename
) ? Qt
: Qnil
));
2678 /* If load failed entirely, return nil. */
2680 return unbind_to (count
, Qnil
);
2682 tem
= Fmemq (feature
, Vfeatures
);
2684 error ("Required feature `%s' was not provided",
2685 SDATA (SYMBOL_NAME (feature
)));
2687 /* Once loading finishes, don't undo it. */
2688 Vautoload_queue
= Qt
;
2689 feature
= unbind_to (count
, feature
);
2695 /* Primitives for work of the "widget" library.
2696 In an ideal world, this section would not have been necessary.
2697 However, lisp function calls being as slow as they are, it turns
2698 out that some functions in the widget library (wid-edit.el) are the
2699 bottleneck of Widget operation. Here is their translation to C,
2700 for the sole reason of efficiency. */
2702 DEFUN ("plist-member", Fplist_member
, Splist_member
, 2, 2, 0,
2703 doc
: /* Return non-nil if PLIST has the property PROP.
2704 PLIST is a property list, which is a list of the form
2705 \(PROP1 VALUE1 PROP2 VALUE2 ...\). PROP is a symbol.
2706 Unlike `plist-get', this allows you to distinguish between a missing
2707 property and a property with the value nil.
2708 The value is actually the tail of PLIST whose car is PROP. */)
2709 (Lisp_Object plist
, Lisp_Object prop
)
2711 while (CONSP (plist
) && !EQ (XCAR (plist
), prop
))
2714 plist
= XCDR (plist
);
2715 plist
= CDR (plist
);
2720 DEFUN ("widget-put", Fwidget_put
, Swidget_put
, 3, 3, 0,
2721 doc
: /* In WIDGET, set PROPERTY to VALUE.
2722 The value can later be retrieved with `widget-get'. */)
2723 (Lisp_Object widget
, Lisp_Object property
, Lisp_Object value
)
2725 CHECK_CONS (widget
);
2726 XSETCDR (widget
, Fplist_put (XCDR (widget
), property
, value
));
2730 DEFUN ("widget-get", Fwidget_get
, Swidget_get
, 2, 2, 0,
2731 doc
: /* In WIDGET, get the value of PROPERTY.
2732 The value could either be specified when the widget was created, or
2733 later with `widget-put'. */)
2734 (Lisp_Object widget
, Lisp_Object property
)
2742 CHECK_CONS (widget
);
2743 tmp
= Fplist_member (XCDR (widget
), property
);
2749 tmp
= XCAR (widget
);
2752 widget
= Fget (tmp
, Qwidget_type
);
2756 DEFUN ("widget-apply", Fwidget_apply
, Swidget_apply
, 2, MANY
, 0,
2757 doc
: /* Apply the value of WIDGET's PROPERTY to the widget itself.
2758 ARGS are passed as extra arguments to the function.
2759 usage: (widget-apply WIDGET PROPERTY &rest ARGS) */)
2760 (size_t nargs
, Lisp_Object
*args
)
2762 /* This function can GC. */
2763 Lisp_Object newargs
[3];
2764 struct gcpro gcpro1
, gcpro2
;
2767 newargs
[0] = Fwidget_get (args
[0], args
[1]);
2768 newargs
[1] = args
[0];
2769 newargs
[2] = Flist (nargs
- 2, args
+ 2);
2770 GCPRO2 (newargs
[0], newargs
[2]);
2771 result
= Fapply (3, newargs
);
2776 #ifdef HAVE_LANGINFO_CODESET
2777 #include <langinfo.h>
2780 DEFUN ("locale-info", Flocale_info
, Slocale_info
, 1, 1, 0,
2781 doc
: /* Access locale data ITEM for the current C locale, if available.
2782 ITEM should be one of the following:
2784 `codeset', returning the character set as a string (locale item CODESET);
2786 `days', returning a 7-element vector of day names (locale items DAY_n);
2788 `months', returning a 12-element vector of month names (locale items MON_n);
2790 `paper', returning a list (WIDTH HEIGHT) for the default paper size,
2791 both measured in milimeters (locale items PAPER_WIDTH, PAPER_HEIGHT).
2793 If the system can't provide such information through a call to
2794 `nl_langinfo', or if ITEM isn't from the list above, return nil.
2796 See also Info node `(libc)Locales'.
2798 The data read from the system are decoded using `locale-coding-system'. */)
2802 #ifdef HAVE_LANGINFO_CODESET
2804 if (EQ (item
, Qcodeset
))
2806 str
= nl_langinfo (CODESET
);
2807 return build_string (str
);
2810 else if (EQ (item
, Qdays
)) /* e.g. for calendar-day-name-array */
2812 Lisp_Object v
= Fmake_vector (make_number (7), Qnil
);
2813 const int days
[7] = {DAY_1
, DAY_2
, DAY_3
, DAY_4
, DAY_5
, DAY_6
, DAY_7
};
2815 struct gcpro gcpro1
;
2817 synchronize_system_time_locale ();
2818 for (i
= 0; i
< 7; i
++)
2820 str
= nl_langinfo (days
[i
]);
2821 val
= make_unibyte_string (str
, strlen (str
));
2822 /* Fixme: Is this coding system necessarily right, even if
2823 it is consistent with CODESET? If not, what to do? */
2824 Faset (v
, make_number (i
),
2825 code_convert_string_norecord (val
, Vlocale_coding_system
,
2833 else if (EQ (item
, Qmonths
)) /* e.g. for calendar-month-name-array */
2835 Lisp_Object v
= Fmake_vector (make_number (12), Qnil
);
2836 const int months
[12] = {MON_1
, MON_2
, MON_3
, MON_4
, MON_5
, MON_6
, MON_7
,
2837 MON_8
, MON_9
, MON_10
, MON_11
, MON_12
};
2839 struct gcpro gcpro1
;
2841 synchronize_system_time_locale ();
2842 for (i
= 0; i
< 12; i
++)
2844 str
= nl_langinfo (months
[i
]);
2845 val
= make_unibyte_string (str
, strlen (str
));
2846 Faset (v
, make_number (i
),
2847 code_convert_string_norecord (val
, Vlocale_coding_system
, 0));
2853 /* LC_PAPER stuff isn't defined as accessible in glibc as of 2.3.1,
2854 but is in the locale files. This could be used by ps-print. */
2856 else if (EQ (item
, Qpaper
))
2858 return list2 (make_number (nl_langinfo (PAPER_WIDTH
)),
2859 make_number (nl_langinfo (PAPER_HEIGHT
)));
2861 #endif /* PAPER_WIDTH */
2862 #endif /* HAVE_LANGINFO_CODESET*/
2866 /* base64 encode/decode functions (RFC 2045).
2867 Based on code from GNU recode. */
2869 #define MIME_LINE_LENGTH 76
2871 #define IS_ASCII(Character) \
2873 #define IS_BASE64(Character) \
2874 (IS_ASCII (Character) && base64_char_to_value[Character] >= 0)
2875 #define IS_BASE64_IGNORABLE(Character) \
2876 ((Character) == ' ' || (Character) == '\t' || (Character) == '\n' \
2877 || (Character) == '\f' || (Character) == '\r')
2879 /* Used by base64_decode_1 to retrieve a non-base64-ignorable
2880 character or return retval if there are no characters left to
2882 #define READ_QUADRUPLET_BYTE(retval) \
2887 if (nchars_return) \
2888 *nchars_return = nchars; \
2893 while (IS_BASE64_IGNORABLE (c))
2895 /* Table of characters coding the 64 values. */
2896 static const char base64_value_to_char
[64] =
2898 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', /* 0- 9 */
2899 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', /* 10-19 */
2900 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', /* 20-29 */
2901 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', /* 30-39 */
2902 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', /* 40-49 */
2903 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', /* 50-59 */
2904 '8', '9', '+', '/' /* 60-63 */
2907 /* Table of base64 values for first 128 characters. */
2908 static const short base64_char_to_value
[128] =
2910 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0- 9 */
2911 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 10- 19 */
2912 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 20- 29 */
2913 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 30- 39 */
2914 -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, /* 40- 49 */
2915 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, /* 50- 59 */
2916 -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, /* 60- 69 */
2917 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, /* 70- 79 */
2918 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, /* 80- 89 */
2919 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, /* 90- 99 */
2920 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, /* 100-109 */
2921 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, /* 110-119 */
2922 49, 50, 51, -1, -1, -1, -1, -1 /* 120-127 */
2925 /* The following diagram shows the logical steps by which three octets
2926 get transformed into four base64 characters.
2928 .--------. .--------. .--------.
2929 |aaaaaabb| |bbbbcccc| |ccdddddd|
2930 `--------' `--------' `--------'
2932 .--------+--------+--------+--------.
2933 |00aaaaaa|00bbbbbb|00cccccc|00dddddd|
2934 `--------+--------+--------+--------'
2936 .--------+--------+--------+--------.
2937 |AAAAAAAA|BBBBBBBB|CCCCCCCC|DDDDDDDD|
2938 `--------+--------+--------+--------'
2940 The octets are divided into 6 bit chunks, which are then encoded into
2941 base64 characters. */
2944 static EMACS_INT
base64_encode_1 (const char *, char *, EMACS_INT
, int, int);
2945 static EMACS_INT
base64_decode_1 (const char *, char *, EMACS_INT
, int,
2948 DEFUN ("base64-encode-region", Fbase64_encode_region
, Sbase64_encode_region
,
2950 doc
: /* Base64-encode the region between BEG and END.
2951 Return the length of the encoded text.
2952 Optional third argument NO-LINE-BREAK means do not break long lines
2953 into shorter lines. */)
2954 (Lisp_Object beg
, Lisp_Object end
, Lisp_Object no_line_break
)
2957 EMACS_INT allength
, length
;
2958 EMACS_INT ibeg
, iend
, encoded_length
;
2959 EMACS_INT old_pos
= PT
;
2962 validate_region (&beg
, &end
);
2964 ibeg
= CHAR_TO_BYTE (XFASTINT (beg
));
2965 iend
= CHAR_TO_BYTE (XFASTINT (end
));
2966 move_gap_both (XFASTINT (beg
), ibeg
);
2968 /* We need to allocate enough room for encoding the text.
2969 We need 33 1/3% more space, plus a newline every 76
2970 characters, and then we round up. */
2971 length
= iend
- ibeg
;
2972 allength
= length
+ length
/3 + 1;
2973 allength
+= allength
/ MIME_LINE_LENGTH
+ 1 + 6;
2975 SAFE_ALLOCA (encoded
, char *, allength
);
2976 encoded_length
= base64_encode_1 ((char *) BYTE_POS_ADDR (ibeg
),
2977 encoded
, length
, NILP (no_line_break
),
2978 !NILP (BVAR (current_buffer
, enable_multibyte_characters
)));
2979 if (encoded_length
> allength
)
2982 if (encoded_length
< 0)
2984 /* The encoding wasn't possible. */
2986 error ("Multibyte character in data for base64 encoding");
2989 /* Now we have encoded the region, so we insert the new contents
2990 and delete the old. (Insert first in order to preserve markers.) */
2991 SET_PT_BOTH (XFASTINT (beg
), ibeg
);
2992 insert (encoded
, encoded_length
);
2994 del_range_byte (ibeg
+ encoded_length
, iend
+ encoded_length
, 1);
2996 /* If point was outside of the region, restore it exactly; else just
2997 move to the beginning of the region. */
2998 if (old_pos
>= XFASTINT (end
))
2999 old_pos
+= encoded_length
- (XFASTINT (end
) - XFASTINT (beg
));
3000 else if (old_pos
> XFASTINT (beg
))
3001 old_pos
= XFASTINT (beg
);
3004 /* We return the length of the encoded text. */
3005 return make_number (encoded_length
);
3008 DEFUN ("base64-encode-string", Fbase64_encode_string
, Sbase64_encode_string
,
3010 doc
: /* Base64-encode STRING and return the result.
3011 Optional second argument NO-LINE-BREAK means do not break long lines
3012 into shorter lines. */)
3013 (Lisp_Object string
, Lisp_Object no_line_break
)
3015 EMACS_INT allength
, length
, encoded_length
;
3017 Lisp_Object encoded_string
;
3020 CHECK_STRING (string
);
3022 /* We need to allocate enough room for encoding the text.
3023 We need 33 1/3% more space, plus a newline every 76
3024 characters, and then we round up. */
3025 length
= SBYTES (string
);
3026 allength
= length
+ length
/3 + 1;
3027 allength
+= allength
/ MIME_LINE_LENGTH
+ 1 + 6;
3029 /* We need to allocate enough room for decoding the text. */
3030 SAFE_ALLOCA (encoded
, char *, allength
);
3032 encoded_length
= base64_encode_1 (SSDATA (string
),
3033 encoded
, length
, NILP (no_line_break
),
3034 STRING_MULTIBYTE (string
));
3035 if (encoded_length
> allength
)
3038 if (encoded_length
< 0)
3040 /* The encoding wasn't possible. */
3042 error ("Multibyte character in data for base64 encoding");
3045 encoded_string
= make_unibyte_string (encoded
, encoded_length
);
3048 return encoded_string
;
3052 base64_encode_1 (const char *from
, char *to
, EMACS_INT length
,
3053 int line_break
, int multibyte
)
3066 c
= STRING_CHAR_AND_LENGTH ((unsigned char *) from
+ i
, bytes
);
3067 if (CHAR_BYTE8_P (c
))
3068 c
= CHAR_TO_BYTE8 (c
);
3076 /* Wrap line every 76 characters. */
3080 if (counter
< MIME_LINE_LENGTH
/ 4)
3089 /* Process first byte of a triplet. */
3091 *e
++ = base64_value_to_char
[0x3f & c
>> 2];
3092 value
= (0x03 & c
) << 4;
3094 /* Process second byte of a triplet. */
3098 *e
++ = base64_value_to_char
[value
];
3106 c
= STRING_CHAR_AND_LENGTH ((unsigned char *) from
+ i
, bytes
);
3107 if (CHAR_BYTE8_P (c
))
3108 c
= CHAR_TO_BYTE8 (c
);
3116 *e
++ = base64_value_to_char
[value
| (0x0f & c
>> 4)];
3117 value
= (0x0f & c
) << 2;
3119 /* Process third byte of a triplet. */
3123 *e
++ = base64_value_to_char
[value
];
3130 c
= STRING_CHAR_AND_LENGTH ((unsigned char *) from
+ i
, bytes
);
3131 if (CHAR_BYTE8_P (c
))
3132 c
= CHAR_TO_BYTE8 (c
);
3140 *e
++ = base64_value_to_char
[value
| (0x03 & c
>> 6)];
3141 *e
++ = base64_value_to_char
[0x3f & c
];
3148 DEFUN ("base64-decode-region", Fbase64_decode_region
, Sbase64_decode_region
,
3150 doc
: /* Base64-decode the region between BEG and END.
3151 Return the length of the decoded text.
3152 If the region can't be decoded, signal an error and don't modify the buffer. */)
3153 (Lisp_Object beg
, Lisp_Object end
)
3155 EMACS_INT ibeg
, iend
, length
, allength
;
3157 EMACS_INT old_pos
= PT
;
3158 EMACS_INT decoded_length
;
3159 EMACS_INT inserted_chars
;
3160 int multibyte
= !NILP (BVAR (current_buffer
, enable_multibyte_characters
));
3163 validate_region (&beg
, &end
);
3165 ibeg
= CHAR_TO_BYTE (XFASTINT (beg
));
3166 iend
= CHAR_TO_BYTE (XFASTINT (end
));
3168 length
= iend
- ibeg
;
3170 /* We need to allocate enough room for decoding the text. If we are
3171 working on a multibyte buffer, each decoded code may occupy at
3173 allength
= multibyte
? length
* 2 : length
;
3174 SAFE_ALLOCA (decoded
, char *, allength
);
3176 move_gap_both (XFASTINT (beg
), ibeg
);
3177 decoded_length
= base64_decode_1 ((char *) BYTE_POS_ADDR (ibeg
),
3179 multibyte
, &inserted_chars
);
3180 if (decoded_length
> allength
)
3183 if (decoded_length
< 0)
3185 /* The decoding wasn't possible. */
3187 error ("Invalid base64 data");
3190 /* Now we have decoded the region, so we insert the new contents
3191 and delete the old. (Insert first in order to preserve markers.) */
3192 TEMP_SET_PT_BOTH (XFASTINT (beg
), ibeg
);
3193 insert_1_both (decoded
, inserted_chars
, decoded_length
, 0, 1, 0);
3196 /* Delete the original text. */
3197 del_range_both (PT
, PT_BYTE
, XFASTINT (end
) + inserted_chars
,
3198 iend
+ decoded_length
, 1);
3200 /* If point was outside of the region, restore it exactly; else just
3201 move to the beginning of the region. */
3202 if (old_pos
>= XFASTINT (end
))
3203 old_pos
+= inserted_chars
- (XFASTINT (end
) - XFASTINT (beg
));
3204 else if (old_pos
> XFASTINT (beg
))
3205 old_pos
= XFASTINT (beg
);
3206 SET_PT (old_pos
> ZV
? ZV
: old_pos
);
3208 return make_number (inserted_chars
);
3211 DEFUN ("base64-decode-string", Fbase64_decode_string
, Sbase64_decode_string
,
3213 doc
: /* Base64-decode STRING and return the result. */)
3214 (Lisp_Object string
)
3217 EMACS_INT length
, decoded_length
;
3218 Lisp_Object decoded_string
;
3221 CHECK_STRING (string
);
3223 length
= SBYTES (string
);
3224 /* We need to allocate enough room for decoding the text. */
3225 SAFE_ALLOCA (decoded
, char *, length
);
3227 /* The decoded result should be unibyte. */
3228 decoded_length
= base64_decode_1 (SSDATA (string
), decoded
, length
,
3230 if (decoded_length
> length
)
3232 else if (decoded_length
>= 0)
3233 decoded_string
= make_unibyte_string (decoded
, decoded_length
);
3235 decoded_string
= Qnil
;
3238 if (!STRINGP (decoded_string
))
3239 error ("Invalid base64 data");
3241 return decoded_string
;
3244 /* Base64-decode the data at FROM of LENGHT bytes into TO. If
3245 MULTIBYTE is nonzero, the decoded result should be in multibyte
3246 form. If NCHARS_RETRUN is not NULL, store the number of produced
3247 characters in *NCHARS_RETURN. */
3250 base64_decode_1 (const char *from
, char *to
, EMACS_INT length
,
3251 int multibyte
, EMACS_INT
*nchars_return
)
3253 EMACS_INT i
= 0; /* Used inside READ_QUADRUPLET_BYTE */
3256 unsigned long value
;
3257 EMACS_INT nchars
= 0;
3261 /* Process first byte of a quadruplet. */
3263 READ_QUADRUPLET_BYTE (e
-to
);
3267 value
= base64_char_to_value
[c
] << 18;
3269 /* Process second byte of a quadruplet. */
3271 READ_QUADRUPLET_BYTE (-1);
3275 value
|= base64_char_to_value
[c
] << 12;
3277 c
= (unsigned char) (value
>> 16);
3278 if (multibyte
&& c
>= 128)
3279 e
+= BYTE8_STRING (c
, e
);
3284 /* Process third byte of a quadruplet. */
3286 READ_QUADRUPLET_BYTE (-1);
3290 READ_QUADRUPLET_BYTE (-1);
3299 value
|= base64_char_to_value
[c
] << 6;
3301 c
= (unsigned char) (0xff & value
>> 8);
3302 if (multibyte
&& c
>= 128)
3303 e
+= BYTE8_STRING (c
, e
);
3308 /* Process fourth byte of a quadruplet. */
3310 READ_QUADRUPLET_BYTE (-1);
3317 value
|= base64_char_to_value
[c
];
3319 c
= (unsigned char) (0xff & value
);
3320 if (multibyte
&& c
>= 128)
3321 e
+= BYTE8_STRING (c
, e
);
3330 /***********************************************************************
3332 ***** Hash Tables *****
3334 ***********************************************************************/
3336 /* Implemented by gerd@gnu.org. This hash table implementation was
3337 inspired by CMUCL hash tables. */
3341 1. For small tables, association lists are probably faster than
3342 hash tables because they have lower overhead.
3344 For uses of hash tables where the O(1) behavior of table
3345 operations is not a requirement, it might therefore be a good idea
3346 not to hash. Instead, we could just do a linear search in the
3347 key_and_value vector of the hash table. This could be done
3348 if a `:linear-search t' argument is given to make-hash-table. */
3351 /* The list of all weak hash tables. Don't staticpro this one. */
3353 struct Lisp_Hash_Table
*weak_hash_tables
;
3355 /* Various symbols. */
3357 Lisp_Object Qhash_table_p
, Qeq
, Qeql
, Qequal
, Qkey
, Qvalue
;
3358 Lisp_Object QCtest
, QCsize
, QCrehash_size
, QCrehash_threshold
, QCweakness
;
3359 Lisp_Object Qhash_table_test
, Qkey_or_value
, Qkey_and_value
;
3361 /* Function prototypes. */
3363 static struct Lisp_Hash_Table
*check_hash_table (Lisp_Object
);
3364 static size_t get_key_arg (Lisp_Object
, size_t, Lisp_Object
*, char *);
3365 static void maybe_resize_hash_table (struct Lisp_Hash_Table
*);
3366 static int cmpfn_eql (struct Lisp_Hash_Table
*, Lisp_Object
, unsigned,
3367 Lisp_Object
, unsigned);
3368 static int cmpfn_equal (struct Lisp_Hash_Table
*, Lisp_Object
, unsigned,
3369 Lisp_Object
, unsigned);
3370 static int cmpfn_user_defined (struct Lisp_Hash_Table
*, Lisp_Object
,
3371 unsigned, Lisp_Object
, unsigned);
3372 static unsigned hashfn_eq (struct Lisp_Hash_Table
*, Lisp_Object
);
3373 static unsigned hashfn_eql (struct Lisp_Hash_Table
*, Lisp_Object
);
3374 static unsigned hashfn_equal (struct Lisp_Hash_Table
*, Lisp_Object
);
3375 static unsigned hashfn_user_defined (struct Lisp_Hash_Table
*,
3377 static unsigned sxhash_string (unsigned char *, int);
3378 static unsigned sxhash_list (Lisp_Object
, int);
3379 static unsigned sxhash_vector (Lisp_Object
, int);
3380 static unsigned sxhash_bool_vector (Lisp_Object
);
3381 static int sweep_weak_table (struct Lisp_Hash_Table
*, int);
3385 /***********************************************************************
3387 ***********************************************************************/
3389 /* If OBJ is a Lisp hash table, return a pointer to its struct
3390 Lisp_Hash_Table. Otherwise, signal an error. */
3392 static struct Lisp_Hash_Table
*
3393 check_hash_table (Lisp_Object obj
)
3395 CHECK_HASH_TABLE (obj
);
3396 return XHASH_TABLE (obj
);
3400 /* Value is the next integer I >= N, N >= 0 which is "almost" a prime
3404 next_almost_prime (int n
)
3416 /* Find KEY in ARGS which has size NARGS. Don't consider indices for
3417 which USED[I] is non-zero. If found at index I in ARGS, set
3418 USED[I] and USED[I + 1] to 1, and return I + 1. Otherwise return
3419 0. This function is used to extract a keyword/argument pair from
3420 a DEFUN parameter list. */
3423 get_key_arg (Lisp_Object key
, size_t nargs
, Lisp_Object
*args
, char *used
)
3427 for (i
= 1; i
< nargs
; i
++)
3428 if (!used
[i
- 1] && EQ (args
[i
- 1], key
))
3439 /* Return a Lisp vector which has the same contents as VEC but has
3440 size NEW_SIZE, NEW_SIZE >= VEC->size. Entries in the resulting
3441 vector that are not copied from VEC are set to INIT. */
3444 larger_vector (Lisp_Object vec
, int new_size
, Lisp_Object init
)
3446 struct Lisp_Vector
*v
;
3449 xassert (VECTORP (vec
));
3450 old_size
= ASIZE (vec
);
3451 xassert (new_size
>= old_size
);
3453 v
= allocate_vector (new_size
);
3454 memcpy (v
->contents
, XVECTOR (vec
)->contents
, old_size
* sizeof *v
->contents
);
3455 for (i
= old_size
; i
< new_size
; ++i
)
3456 v
->contents
[i
] = init
;
3457 XSETVECTOR (vec
, v
);
3462 /***********************************************************************
3464 ***********************************************************************/
3466 /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code
3467 HASH2 in hash table H using `eql'. Value is non-zero if KEY1 and
3468 KEY2 are the same. */
3471 cmpfn_eql (struct Lisp_Hash_Table
*h
, Lisp_Object key1
, unsigned int hash1
, Lisp_Object key2
, unsigned int hash2
)
3473 return (FLOATP (key1
)
3475 && XFLOAT_DATA (key1
) == XFLOAT_DATA (key2
));
3479 /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code
3480 HASH2 in hash table H using `equal'. Value is non-zero if KEY1 and
3481 KEY2 are the same. */
3484 cmpfn_equal (struct Lisp_Hash_Table
*h
, Lisp_Object key1
, unsigned int hash1
, Lisp_Object key2
, unsigned int hash2
)
3486 return hash1
== hash2
&& !NILP (Fequal (key1
, key2
));
3490 /* Compare KEY1 which has hash code HASH1, and KEY2 with hash code
3491 HASH2 in hash table H using H->user_cmp_function. Value is non-zero
3492 if KEY1 and KEY2 are the same. */
3495 cmpfn_user_defined (struct Lisp_Hash_Table
*h
, Lisp_Object key1
, unsigned int hash1
, Lisp_Object key2
, unsigned int hash2
)
3499 Lisp_Object args
[3];
3501 args
[0] = h
->user_cmp_function
;
3504 return !NILP (Ffuncall (3, args
));
3511 /* Value is a hash code for KEY for use in hash table H which uses
3512 `eq' to compare keys. The hash code returned is guaranteed to fit
3513 in a Lisp integer. */
3516 hashfn_eq (struct Lisp_Hash_Table
*h
, Lisp_Object key
)
3518 unsigned hash
= XUINT (key
) ^ XTYPE (key
);
3519 xassert ((hash
& ~INTMASK
) == 0);
3524 /* Value is a hash code for KEY for use in hash table H which uses
3525 `eql' to compare keys. The hash code returned is guaranteed to fit
3526 in a Lisp integer. */
3529 hashfn_eql (struct Lisp_Hash_Table
*h
, Lisp_Object key
)
3533 hash
= sxhash (key
, 0);
3535 hash
= XUINT (key
) ^ XTYPE (key
);
3536 xassert ((hash
& ~INTMASK
) == 0);
3541 /* Value is a hash code for KEY for use in hash table H which uses
3542 `equal' to compare keys. The hash code returned is guaranteed to fit
3543 in a Lisp integer. */
3546 hashfn_equal (struct Lisp_Hash_Table
*h
, Lisp_Object key
)
3548 unsigned hash
= sxhash (key
, 0);
3549 xassert ((hash
& ~INTMASK
) == 0);
3554 /* Value is a hash code for KEY for use in hash table H which uses as
3555 user-defined function to compare keys. The hash code returned is
3556 guaranteed to fit in a Lisp integer. */
3559 hashfn_user_defined (struct Lisp_Hash_Table
*h
, Lisp_Object key
)
3561 Lisp_Object args
[2], hash
;
3563 args
[0] = h
->user_hash_function
;
3565 hash
= Ffuncall (2, args
);
3566 if (!INTEGERP (hash
))
3567 signal_error ("Invalid hash code returned from user-supplied hash function", hash
);
3568 return XUINT (hash
);
3572 /* Create and initialize a new hash table.
3574 TEST specifies the test the hash table will use to compare keys.
3575 It must be either one of the predefined tests `eq', `eql' or
3576 `equal' or a symbol denoting a user-defined test named TEST with
3577 test and hash functions USER_TEST and USER_HASH.
3579 Give the table initial capacity SIZE, SIZE >= 0, an integer.
3581 If REHASH_SIZE is an integer, it must be > 0, and this hash table's
3582 new size when it becomes full is computed by adding REHASH_SIZE to
3583 its old size. If REHASH_SIZE is a float, it must be > 1.0, and the
3584 table's new size is computed by multiplying its old size with
3587 REHASH_THRESHOLD must be a float <= 1.0, and > 0. The table will
3588 be resized when the ratio of (number of entries in the table) /
3589 (table size) is >= REHASH_THRESHOLD.
3591 WEAK specifies the weakness of the table. If non-nil, it must be
3592 one of the symbols `key', `value', `key-or-value', or `key-and-value'. */
3595 make_hash_table (Lisp_Object test
, Lisp_Object size
, Lisp_Object rehash_size
,
3596 Lisp_Object rehash_threshold
, Lisp_Object weak
,
3597 Lisp_Object user_test
, Lisp_Object user_hash
)
3599 struct Lisp_Hash_Table
*h
;
3601 int index_size
, i
, sz
;
3603 /* Preconditions. */
3604 xassert (SYMBOLP (test
));
3605 xassert (INTEGERP (size
) && XINT (size
) >= 0);
3606 xassert ((INTEGERP (rehash_size
) && XINT (rehash_size
) > 0)
3607 || (FLOATP (rehash_size
) && XFLOATINT (rehash_size
) > 1.0));
3608 xassert (FLOATP (rehash_threshold
)
3609 && XFLOATINT (rehash_threshold
) > 0
3610 && XFLOATINT (rehash_threshold
) <= 1.0);
3612 if (XFASTINT (size
) == 0)
3613 size
= make_number (1);
3615 /* Allocate a table and initialize it. */
3616 h
= allocate_hash_table ();
3618 /* Initialize hash table slots. */
3619 sz
= XFASTINT (size
);
3622 if (EQ (test
, Qeql
))
3624 h
->cmpfn
= cmpfn_eql
;
3625 h
->hashfn
= hashfn_eql
;
3627 else if (EQ (test
, Qeq
))
3630 h
->hashfn
= hashfn_eq
;
3632 else if (EQ (test
, Qequal
))
3634 h
->cmpfn
= cmpfn_equal
;
3635 h
->hashfn
= hashfn_equal
;
3639 h
->user_cmp_function
= user_test
;
3640 h
->user_hash_function
= user_hash
;
3641 h
->cmpfn
= cmpfn_user_defined
;
3642 h
->hashfn
= hashfn_user_defined
;
3646 h
->rehash_threshold
= rehash_threshold
;
3647 h
->rehash_size
= rehash_size
;
3649 h
->key_and_value
= Fmake_vector (make_number (2 * sz
), Qnil
);
3650 h
->hash
= Fmake_vector (size
, Qnil
);
3651 h
->next
= Fmake_vector (size
, Qnil
);
3652 /* Cast to int here avoids losing with gcc 2.95 on Tru64/Alpha... */
3653 index_size
= next_almost_prime ((int) (sz
/ XFLOATINT (rehash_threshold
)));
3654 h
->index
= Fmake_vector (make_number (index_size
), Qnil
);
3656 /* Set up the free list. */
3657 for (i
= 0; i
< sz
- 1; ++i
)
3658 HASH_NEXT (h
, i
) = make_number (i
+ 1);
3659 h
->next_free
= make_number (0);
3661 XSET_HASH_TABLE (table
, h
);
3662 xassert (HASH_TABLE_P (table
));
3663 xassert (XHASH_TABLE (table
) == h
);
3665 /* Maybe add this hash table to the list of all weak hash tables. */
3667 h
->next_weak
= NULL
;
3670 h
->next_weak
= weak_hash_tables
;
3671 weak_hash_tables
= h
;
3678 /* Return a copy of hash table H1. Keys and values are not copied,
3679 only the table itself is. */
3682 copy_hash_table (struct Lisp_Hash_Table
*h1
)
3685 struct Lisp_Hash_Table
*h2
;
3686 struct Lisp_Vector
*next
;
3688 h2
= allocate_hash_table ();
3689 next
= h2
->vec_next
;
3690 memcpy (h2
, h1
, sizeof *h2
);
3691 h2
->vec_next
= next
;
3692 h2
->key_and_value
= Fcopy_sequence (h1
->key_and_value
);
3693 h2
->hash
= Fcopy_sequence (h1
->hash
);
3694 h2
->next
= Fcopy_sequence (h1
->next
);
3695 h2
->index
= Fcopy_sequence (h1
->index
);
3696 XSET_HASH_TABLE (table
, h2
);
3698 /* Maybe add this hash table to the list of all weak hash tables. */
3699 if (!NILP (h2
->weak
))
3701 h2
->next_weak
= weak_hash_tables
;
3702 weak_hash_tables
= h2
;
3709 /* Resize hash table H if it's too full. If H cannot be resized
3710 because it's already too large, throw an error. */
3713 maybe_resize_hash_table (struct Lisp_Hash_Table
*h
)
3715 if (NILP (h
->next_free
))
3717 int old_size
= HASH_TABLE_SIZE (h
);
3718 int i
, new_size
, index_size
;
3721 if (INTEGERP (h
->rehash_size
))
3722 new_size
= old_size
+ XFASTINT (h
->rehash_size
);
3724 new_size
= old_size
* XFLOATINT (h
->rehash_size
);
3725 new_size
= max (old_size
+ 1, new_size
);
3726 index_size
= next_almost_prime ((int)
3728 / XFLOATINT (h
->rehash_threshold
)));
3729 /* Assignment to EMACS_INT stops GCC whining about limited range
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 unsigned hash_code
= XUINT (HASH_HASH (h
, i
));
3765 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
, unsigned int *hash
)
3781 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 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
, unsigned int hash
)
3814 int start_of_bucket
, i
;
3816 xassert ((hash
& ~INTMASK
) == 0);
3818 /* Increment count after resizing because resizing may fail. */
3819 maybe_resize_hash_table (h
);
3822 /* Store key/value in the key_and_value vector. */
3823 i
= XFASTINT (h
->next_free
);
3824 h
->next_free
= HASH_NEXT (h
, i
);
3825 HASH_KEY (h
, i
) = key
;
3826 HASH_VALUE (h
, i
) = value
;
3828 /* Remember its hash code. */
3829 HASH_HASH (h
, i
) = make_number (hash
);
3831 /* Add new entry to its collision chain. */
3832 start_of_bucket
= hash
% ASIZE (h
->index
);
3833 HASH_NEXT (h
, i
) = HASH_INDEX (h
, start_of_bucket
);
3834 HASH_INDEX (h
, start_of_bucket
) = make_number (i
);
3839 /* Remove the entry matching KEY from hash table H, if there is one. */
3842 hash_remove_from_table (struct Lisp_Hash_Table
*h
, Lisp_Object key
)
3845 int start_of_bucket
;
3846 Lisp_Object idx
, prev
;
3848 hash_code
= h
->hashfn (h
, key
);
3849 start_of_bucket
= hash_code
% ASIZE (h
->index
);
3850 idx
= HASH_INDEX (h
, start_of_bucket
);
3853 /* We need not gcpro idx, prev since they're either integers or nil. */
3856 int i
= XFASTINT (idx
);
3858 if (EQ (key
, HASH_KEY (h
, i
))
3860 && h
->cmpfn (h
, key
, hash_code
,
3861 HASH_KEY (h
, i
), XUINT (HASH_HASH (h
, i
)))))
3863 /* Take entry out of collision chain. */
3865 HASH_INDEX (h
, start_of_bucket
) = HASH_NEXT (h
, i
);
3867 HASH_NEXT (h
, XFASTINT (prev
)) = HASH_NEXT (h
, i
);
3869 /* Clear slots in key_and_value and add the slots to
3871 HASH_KEY (h
, i
) = HASH_VALUE (h
, i
) = HASH_HASH (h
, i
) = Qnil
;
3872 HASH_NEXT (h
, i
) = h
->next_free
;
3873 h
->next_free
= make_number (i
);
3875 xassert (h
->count
>= 0);
3881 idx
= HASH_NEXT (h
, i
);
3887 /* Clear hash table H. */
3890 hash_clear (struct Lisp_Hash_Table
*h
)
3894 int i
, size
= HASH_TABLE_SIZE (h
);
3896 for (i
= 0; i
< size
; ++i
)
3898 HASH_NEXT (h
, i
) = i
< size
- 1 ? make_number (i
+ 1) : Qnil
;
3899 HASH_KEY (h
, i
) = Qnil
;
3900 HASH_VALUE (h
, i
) = Qnil
;
3901 HASH_HASH (h
, i
) = Qnil
;
3904 for (i
= 0; i
< ASIZE (h
->index
); ++i
)
3905 ASET (h
->index
, i
, Qnil
);
3907 h
->next_free
= make_number (0);
3914 /************************************************************************
3916 ************************************************************************/
3919 init_weak_hash_tables (void)
3921 weak_hash_tables
= NULL
;
3924 /* Sweep weak hash table H. REMOVE_ENTRIES_P non-zero means remove
3925 entries from the table that don't survive the current GC.
3926 REMOVE_ENTRIES_P zero means mark entries that are in use. Value is
3927 non-zero if anything was marked. */
3930 sweep_weak_table (struct Lisp_Hash_Table
*h
, int remove_entries_p
)
3932 int bucket
, n
, marked
;
3934 n
= ASIZE (h
->index
) & ~ARRAY_MARK_FLAG
;
3937 for (bucket
= 0; bucket
< n
; ++bucket
)
3939 Lisp_Object idx
, next
, prev
;
3941 /* Follow collision chain, removing entries that
3942 don't survive this garbage collection. */
3944 for (idx
= HASH_INDEX (h
, bucket
); !NILP (idx
); idx
= next
)
3946 int i
= XFASTINT (idx
);
3947 int key_known_to_survive_p
= survives_gc_p (HASH_KEY (h
, i
));
3948 int value_known_to_survive_p
= survives_gc_p (HASH_VALUE (h
, i
));
3951 if (EQ (h
->weak
, Qkey
))
3952 remove_p
= !key_known_to_survive_p
;
3953 else if (EQ (h
->weak
, Qvalue
))
3954 remove_p
= !value_known_to_survive_p
;
3955 else if (EQ (h
->weak
, Qkey_or_value
))
3956 remove_p
= !(key_known_to_survive_p
|| value_known_to_survive_p
);
3957 else if (EQ (h
->weak
, Qkey_and_value
))
3958 remove_p
= !(key_known_to_survive_p
&& value_known_to_survive_p
);
3962 next
= HASH_NEXT (h
, i
);
3964 if (remove_entries_p
)
3968 /* Take out of collision chain. */
3970 HASH_INDEX (h
, bucket
) = next
;
3972 HASH_NEXT (h
, XFASTINT (prev
)) = next
;
3974 /* Add to free list. */
3975 HASH_NEXT (h
, i
) = h
->next_free
;
3978 /* Clear key, value, and hash. */
3979 HASH_KEY (h
, i
) = HASH_VALUE (h
, i
) = Qnil
;
3980 HASH_HASH (h
, i
) = Qnil
;
3993 /* Make sure key and value survive. */
3994 if (!key_known_to_survive_p
)
3996 mark_object (HASH_KEY (h
, i
));
4000 if (!value_known_to_survive_p
)
4002 mark_object (HASH_VALUE (h
, i
));
4013 /* Remove elements from weak hash tables that don't survive the
4014 current garbage collection. Remove weak tables that don't survive
4015 from Vweak_hash_tables. Called from gc_sweep. */
4018 sweep_weak_hash_tables (void)
4020 struct Lisp_Hash_Table
*h
, *used
, *next
;
4023 /* Mark all keys and values that are in use. Keep on marking until
4024 there is no more change. This is necessary for cases like
4025 value-weak table A containing an entry X -> Y, where Y is used in a
4026 key-weak table B, Z -> Y. If B comes after A in the list of weak
4027 tables, X -> Y might be removed from A, although when looking at B
4028 one finds that it shouldn't. */
4032 for (h
= weak_hash_tables
; h
; h
= h
->next_weak
)
4034 if (h
->size
& ARRAY_MARK_FLAG
)
4035 marked
|= sweep_weak_table (h
, 0);
4040 /* Remove tables and entries that aren't used. */
4041 for (h
= weak_hash_tables
, used
= NULL
; h
; h
= next
)
4043 next
= h
->next_weak
;
4045 if (h
->size
& ARRAY_MARK_FLAG
)
4047 /* TABLE is marked as used. Sweep its contents. */
4049 sweep_weak_table (h
, 1);
4051 /* Add table to the list of used weak hash tables. */
4052 h
->next_weak
= used
;
4057 weak_hash_tables
= used
;
4062 /***********************************************************************
4063 Hash Code Computation
4064 ***********************************************************************/
4066 /* Maximum depth up to which to dive into Lisp structures. */
4068 #define SXHASH_MAX_DEPTH 3
4070 /* Maximum length up to which to take list and vector elements into
4073 #define SXHASH_MAX_LEN 7
4075 /* Combine two integers X and Y for hashing. */
4077 #define SXHASH_COMBINE(X, Y) \
4078 ((((unsigned)(X) << 4) + (((unsigned)(X) >> 24) & 0x0fffffff)) \
4082 /* Return a hash for string PTR which has length LEN. The hash
4083 code returned is guaranteed to fit in a Lisp integer. */
4086 sxhash_string (unsigned char *ptr
, int len
)
4088 unsigned char *p
= ptr
;
4089 unsigned char *end
= p
+ len
;
4098 hash
= ((hash
<< 4) + (hash
>> 28) + c
);
4101 return hash
& INTMASK
;
4105 /* Return a hash for list LIST. DEPTH is the current depth in the
4106 list. We don't recurse deeper than SXHASH_MAX_DEPTH in it. */
4109 sxhash_list (Lisp_Object list
, int depth
)
4114 if (depth
< SXHASH_MAX_DEPTH
)
4116 CONSP (list
) && i
< SXHASH_MAX_LEN
;
4117 list
= XCDR (list
), ++i
)
4119 unsigned hash2
= sxhash (XCAR (list
), depth
+ 1);
4120 hash
= SXHASH_COMBINE (hash
, hash2
);
4125 unsigned hash2
= sxhash (list
, depth
+ 1);
4126 hash
= SXHASH_COMBINE (hash
, hash2
);
4133 /* Return a hash for vector VECTOR. DEPTH is the current depth in
4134 the Lisp structure. */
4137 sxhash_vector (Lisp_Object vec
, int depth
)
4139 unsigned hash
= ASIZE (vec
);
4142 n
= min (SXHASH_MAX_LEN
, ASIZE (vec
));
4143 for (i
= 0; i
< n
; ++i
)
4145 unsigned hash2
= sxhash (AREF (vec
, i
), depth
+ 1);
4146 hash
= SXHASH_COMBINE (hash
, hash2
);
4153 /* Return a hash for bool-vector VECTOR. */
4156 sxhash_bool_vector (Lisp_Object vec
)
4158 unsigned hash
= XBOOL_VECTOR (vec
)->size
;
4161 n
= min (SXHASH_MAX_LEN
, XBOOL_VECTOR (vec
)->vector_size
);
4162 for (i
= 0; i
< n
; ++i
)
4163 hash
= SXHASH_COMBINE (hash
, XBOOL_VECTOR (vec
)->data
[i
]);
4169 /* Return a hash code for OBJ. DEPTH is the current depth in the Lisp
4170 structure. Value is an unsigned integer clipped to INTMASK. */
4173 sxhash (Lisp_Object obj
, int depth
)
4177 if (depth
> SXHASH_MAX_DEPTH
)
4180 switch (XTYPE (obj
))
4191 obj
= SYMBOL_NAME (obj
);
4195 hash
= sxhash_string (SDATA (obj
), SCHARS (obj
));
4198 /* This can be everything from a vector to an overlay. */
4199 case Lisp_Vectorlike
:
4201 /* According to the CL HyperSpec, two arrays are equal only if
4202 they are `eq', except for strings and bit-vectors. In
4203 Emacs, this works differently. We have to compare element
4205 hash
= sxhash_vector (obj
, depth
);
4206 else if (BOOL_VECTOR_P (obj
))
4207 hash
= sxhash_bool_vector (obj
);
4209 /* Others are `equal' if they are `eq', so let's take their
4215 hash
= sxhash_list (obj
, depth
);
4220 double val
= XFLOAT_DATA (obj
);
4221 unsigned char *p
= (unsigned char *) &val
;
4223 for (hash
= 0, i
= 0; i
< sizeof val
; i
++)
4224 hash
= SXHASH_COMBINE (hash
, p
[i
]);
4232 return hash
& INTMASK
;
4237 /***********************************************************************
4239 ***********************************************************************/
4242 DEFUN ("sxhash", Fsxhash
, Ssxhash
, 1, 1, 0,
4243 doc
: /* Compute a hash code for OBJ and return it as integer. */)
4246 unsigned hash
= sxhash (obj
, 0);
4247 return make_number (hash
);
4251 DEFUN ("make-hash-table", Fmake_hash_table
, Smake_hash_table
, 0, MANY
, 0,
4252 doc
: /* Create and return a new hash table.
4254 Arguments are specified as keyword/argument pairs. The following
4255 arguments are defined:
4257 :test TEST -- TEST must be a symbol that specifies how to compare
4258 keys. Default is `eql'. Predefined are the tests `eq', `eql', and
4259 `equal'. User-supplied test and hash functions can be specified via
4260 `define-hash-table-test'.
4262 :size SIZE -- A hint as to how many elements will be put in the table.
4265 :rehash-size REHASH-SIZE - Indicates how to expand the table when it
4266 fills up. If REHASH-SIZE is an integer, increase the size by that
4267 amount. If it is a float, it must be > 1.0, and the new size is the
4268 old size multiplied by that factor. Default is 1.5.
4270 :rehash-threshold THRESHOLD -- THRESHOLD must a float > 0, and <= 1.0.
4271 Resize the hash table when the ratio (number of entries / table size)
4272 is greater than or equal to THRESHOLD. Default is 0.8.
4274 :weakness WEAK -- WEAK must be one of nil, t, `key', `value',
4275 `key-or-value', or `key-and-value'. If WEAK is not nil, the table
4276 returned is a weak table. Key/value pairs are removed from a weak
4277 hash table when there are no non-weak references pointing to their
4278 key, value, one of key or value, or both key and value, depending on
4279 WEAK. WEAK t is equivalent to `key-and-value'. Default value of WEAK
4282 usage: (make-hash-table &rest KEYWORD-ARGS) */)
4283 (size_t nargs
, Lisp_Object
*args
)
4285 Lisp_Object test
, size
, rehash_size
, rehash_threshold
, weak
;
4286 Lisp_Object user_test
, user_hash
;
4290 /* The vector `used' is used to keep track of arguments that
4291 have been consumed. */
4292 used
= (char *) alloca (nargs
* sizeof *used
);
4293 memset (used
, 0, nargs
* sizeof *used
);
4295 /* See if there's a `:test TEST' among the arguments. */
4296 i
= get_key_arg (QCtest
, nargs
, args
, used
);
4297 test
= i
? args
[i
] : Qeql
;
4298 if (!EQ (test
, Qeq
) && !EQ (test
, Qeql
) && !EQ (test
, Qequal
))
4300 /* See if it is a user-defined test. */
4303 prop
= Fget (test
, Qhash_table_test
);
4304 if (!CONSP (prop
) || !CONSP (XCDR (prop
)))
4305 signal_error ("Invalid hash table test", test
);
4306 user_test
= XCAR (prop
);
4307 user_hash
= XCAR (XCDR (prop
));
4310 user_test
= user_hash
= Qnil
;
4312 /* See if there's a `:size SIZE' argument. */
4313 i
= get_key_arg (QCsize
, nargs
, args
, used
);
4314 size
= i
? args
[i
] : Qnil
;
4316 size
= make_number (DEFAULT_HASH_SIZE
);
4317 else if (!INTEGERP (size
) || XINT (size
) < 0)
4318 signal_error ("Invalid hash table size", size
);
4320 /* Look for `:rehash-size SIZE'. */
4321 i
= get_key_arg (QCrehash_size
, nargs
, args
, used
);
4322 rehash_size
= i
? args
[i
] : make_float (DEFAULT_REHASH_SIZE
);
4323 if (!NUMBERP (rehash_size
)
4324 || (INTEGERP (rehash_size
) && XINT (rehash_size
) <= 0)
4325 || XFLOATINT (rehash_size
) <= 1.0)
4326 signal_error ("Invalid hash table rehash size", rehash_size
);
4328 /* Look for `:rehash-threshold THRESHOLD'. */
4329 i
= get_key_arg (QCrehash_threshold
, nargs
, args
, used
);
4330 rehash_threshold
= i
? args
[i
] : make_float (DEFAULT_REHASH_THRESHOLD
);
4331 if (!FLOATP (rehash_threshold
)
4332 || XFLOATINT (rehash_threshold
) <= 0.0
4333 || XFLOATINT (rehash_threshold
) > 1.0)
4334 signal_error ("Invalid hash table rehash threshold", rehash_threshold
);
4336 /* Look for `:weakness WEAK'. */
4337 i
= get_key_arg (QCweakness
, nargs
, args
, used
);
4338 weak
= i
? args
[i
] : Qnil
;
4340 weak
= Qkey_and_value
;
4343 && !EQ (weak
, Qvalue
)
4344 && !EQ (weak
, Qkey_or_value
)
4345 && !EQ (weak
, Qkey_and_value
))
4346 signal_error ("Invalid hash table weakness", weak
);
4348 /* Now, all args should have been used up, or there's a problem. */
4349 for (i
= 0; i
< nargs
; ++i
)
4351 signal_error ("Invalid argument list", args
[i
]);
4353 return make_hash_table (test
, size
, rehash_size
, rehash_threshold
, weak
,
4354 user_test
, user_hash
);
4358 DEFUN ("copy-hash-table", Fcopy_hash_table
, Scopy_hash_table
, 1, 1, 0,
4359 doc
: /* Return a copy of hash table TABLE. */)
4362 return copy_hash_table (check_hash_table (table
));
4366 DEFUN ("hash-table-count", Fhash_table_count
, Shash_table_count
, 1, 1, 0,
4367 doc
: /* Return the number of elements in TABLE. */)
4370 return make_number (check_hash_table (table
)->count
);
4374 DEFUN ("hash-table-rehash-size", Fhash_table_rehash_size
,
4375 Shash_table_rehash_size
, 1, 1, 0,
4376 doc
: /* Return the current rehash size of TABLE. */)
4379 return check_hash_table (table
)->rehash_size
;
4383 DEFUN ("hash-table-rehash-threshold", Fhash_table_rehash_threshold
,
4384 Shash_table_rehash_threshold
, 1, 1, 0,
4385 doc
: /* Return the current rehash threshold of TABLE. */)
4388 return check_hash_table (table
)->rehash_threshold
;
4392 DEFUN ("hash-table-size", Fhash_table_size
, Shash_table_size
, 1, 1, 0,
4393 doc
: /* Return the size of TABLE.
4394 The size can be used as an argument to `make-hash-table' to create
4395 a hash table than can hold as many elements as TABLE holds
4396 without need for resizing. */)
4399 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
4400 return make_number (HASH_TABLE_SIZE (h
));
4404 DEFUN ("hash-table-test", Fhash_table_test
, Shash_table_test
, 1, 1, 0,
4405 doc
: /* Return the test TABLE uses. */)
4408 return check_hash_table (table
)->test
;
4412 DEFUN ("hash-table-weakness", Fhash_table_weakness
, Shash_table_weakness
,
4414 doc
: /* Return the weakness of TABLE. */)
4417 return check_hash_table (table
)->weak
;
4421 DEFUN ("hash-table-p", Fhash_table_p
, Shash_table_p
, 1, 1, 0,
4422 doc
: /* Return t if OBJ is a Lisp hash table object. */)
4425 return HASH_TABLE_P (obj
) ? Qt
: Qnil
;
4429 DEFUN ("clrhash", Fclrhash
, Sclrhash
, 1, 1, 0,
4430 doc
: /* Clear hash table TABLE and return it. */)
4433 hash_clear (check_hash_table (table
));
4434 /* Be compatible with XEmacs. */
4439 DEFUN ("gethash", Fgethash
, Sgethash
, 2, 3, 0,
4440 doc
: /* Look up KEY in TABLE and return its associated value.
4441 If KEY is not found, return DFLT which defaults to nil. */)
4442 (Lisp_Object key
, Lisp_Object table
, Lisp_Object dflt
)
4444 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
4445 int i
= hash_lookup (h
, key
, NULL
);
4446 return i
>= 0 ? HASH_VALUE (h
, i
) : dflt
;
4450 DEFUN ("puthash", Fputhash
, Sputhash
, 3, 3, 0,
4451 doc
: /* Associate KEY with VALUE in hash table TABLE.
4452 If KEY is already present in table, replace its current value with
4454 (Lisp_Object key
, Lisp_Object value
, Lisp_Object table
)
4456 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
4460 i
= hash_lookup (h
, key
, &hash
);
4462 HASH_VALUE (h
, i
) = value
;
4464 hash_put (h
, key
, value
, hash
);
4470 DEFUN ("remhash", Fremhash
, Sremhash
, 2, 2, 0,
4471 doc
: /* Remove KEY from TABLE. */)
4472 (Lisp_Object key
, Lisp_Object table
)
4474 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
4475 hash_remove_from_table (h
, key
);
4480 DEFUN ("maphash", Fmaphash
, Smaphash
, 2, 2, 0,
4481 doc
: /* Call FUNCTION for all entries in hash table TABLE.
4482 FUNCTION is called with two arguments, KEY and VALUE. */)
4483 (Lisp_Object function
, Lisp_Object table
)
4485 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
4486 Lisp_Object args
[3];
4489 for (i
= 0; i
< HASH_TABLE_SIZE (h
); ++i
)
4490 if (!NILP (HASH_HASH (h
, i
)))
4493 args
[1] = HASH_KEY (h
, i
);
4494 args
[2] = HASH_VALUE (h
, i
);
4502 DEFUN ("define-hash-table-test", Fdefine_hash_table_test
,
4503 Sdefine_hash_table_test
, 3, 3, 0,
4504 doc
: /* Define a new hash table test with name NAME, a symbol.
4506 In hash tables created with NAME specified as test, use TEST to
4507 compare keys, and HASH for computing hash codes of keys.
4509 TEST must be a function taking two arguments and returning non-nil if
4510 both arguments are the same. HASH must be a function taking one
4511 argument and return an integer that is the hash code of the argument.
4512 Hash code computation should use the whole value range of integers,
4513 including negative integers. */)
4514 (Lisp_Object name
, Lisp_Object test
, Lisp_Object hash
)
4516 return Fput (name
, Qhash_table_test
, list2 (test
, hash
));
4521 /************************************************************************
4523 ************************************************************************/
4527 DEFUN ("md5", Fmd5
, Smd5
, 1, 5, 0,
4528 doc
: /* Return MD5 message digest of OBJECT, a buffer or string.
4530 A message digest is a cryptographic checksum of a document, and the
4531 algorithm to calculate it is defined in RFC 1321.
4533 The two optional arguments START and END are character positions
4534 specifying for which part of OBJECT the message digest should be
4535 computed. If nil or omitted, the digest is computed for the whole
4538 The MD5 message digest is computed from the result of encoding the
4539 text in a coding system, not directly from the internal Emacs form of
4540 the text. The optional fourth argument CODING-SYSTEM specifies which
4541 coding system to encode the text with. It should be the same coding
4542 system that you used or will use when actually writing the text into a
4545 If CODING-SYSTEM is nil or omitted, the default depends on OBJECT. If
4546 OBJECT is a buffer, the default for CODING-SYSTEM is whatever coding
4547 system would be chosen by default for writing this text into a file.
4549 If OBJECT is a string, the most preferred coding system (see the
4550 command `prefer-coding-system') is used.
4552 If NOERROR is non-nil, silently assume the `raw-text' coding if the
4553 guesswork fails. Normally, an error is signaled in such case. */)
4554 (Lisp_Object object
, Lisp_Object start
, Lisp_Object end
, Lisp_Object coding_system
, Lisp_Object noerror
)
4556 unsigned char digest
[16];
4560 EMACS_INT size_byte
= 0;
4561 EMACS_INT start_char
= 0, end_char
= 0;
4562 EMACS_INT start_byte
= 0, end_byte
= 0;
4563 register EMACS_INT b
, e
;
4564 register struct buffer
*bp
;
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);
4736 md5_buffer (SSDATA (object
) + start_byte
,
4737 SBYTES (object
) - (size_byte
- end_byte
),
4740 for (i
= 0; i
< 16; i
++)
4741 sprintf (&value
[2 * i
], "%02x", digest
[i
]);
4744 return make_string (value
, 32);
4751 /* Hash table stuff. */
4752 Qhash_table_p
= intern_c_string ("hash-table-p");
4753 staticpro (&Qhash_table_p
);
4754 Qeq
= intern_c_string ("eq");
4756 Qeql
= intern_c_string ("eql");
4758 Qequal
= intern_c_string ("equal");
4759 staticpro (&Qequal
);
4760 QCtest
= intern_c_string (":test");
4761 staticpro (&QCtest
);
4762 QCsize
= intern_c_string (":size");
4763 staticpro (&QCsize
);
4764 QCrehash_size
= intern_c_string (":rehash-size");
4765 staticpro (&QCrehash_size
);
4766 QCrehash_threshold
= intern_c_string (":rehash-threshold");
4767 staticpro (&QCrehash_threshold
);
4768 QCweakness
= intern_c_string (":weakness");
4769 staticpro (&QCweakness
);
4770 Qkey
= intern_c_string ("key");
4772 Qvalue
= intern_c_string ("value");
4773 staticpro (&Qvalue
);
4774 Qhash_table_test
= intern_c_string ("hash-table-test");
4775 staticpro (&Qhash_table_test
);
4776 Qkey_or_value
= intern_c_string ("key-or-value");
4777 staticpro (&Qkey_or_value
);
4778 Qkey_and_value
= intern_c_string ("key-and-value");
4779 staticpro (&Qkey_and_value
);
4782 defsubr (&Smake_hash_table
);
4783 defsubr (&Scopy_hash_table
);
4784 defsubr (&Shash_table_count
);
4785 defsubr (&Shash_table_rehash_size
);
4786 defsubr (&Shash_table_rehash_threshold
);
4787 defsubr (&Shash_table_size
);
4788 defsubr (&Shash_table_test
);
4789 defsubr (&Shash_table_weakness
);
4790 defsubr (&Shash_table_p
);
4791 defsubr (&Sclrhash
);
4792 defsubr (&Sgethash
);
4793 defsubr (&Sputhash
);
4794 defsubr (&Sremhash
);
4795 defsubr (&Smaphash
);
4796 defsubr (&Sdefine_hash_table_test
);
4798 Qstring_lessp
= intern_c_string ("string-lessp");
4799 staticpro (&Qstring_lessp
);
4800 Qprovide
= intern_c_string ("provide");
4801 staticpro (&Qprovide
);
4802 Qrequire
= intern_c_string ("require");
4803 staticpro (&Qrequire
);
4804 Qyes_or_no_p_history
= intern_c_string ("yes-or-no-p-history");
4805 staticpro (&Qyes_or_no_p_history
);
4806 Qcursor_in_echo_area
= intern_c_string ("cursor-in-echo-area");
4807 staticpro (&Qcursor_in_echo_area
);
4808 Qwidget_type
= intern_c_string ("widget-type");
4809 staticpro (&Qwidget_type
);
4811 staticpro (&string_char_byte_cache_string
);
4812 string_char_byte_cache_string
= Qnil
;
4814 require_nesting_list
= Qnil
;
4815 staticpro (&require_nesting_list
);
4817 Fset (Qyes_or_no_p_history
, Qnil
);
4819 DEFVAR_LISP ("features", Vfeatures
,
4820 doc
: /* A list of symbols which are the features of the executing Emacs.
4821 Used by `featurep' and `require', and altered by `provide'. */);
4822 Vfeatures
= Fcons (intern_c_string ("emacs"), Qnil
);
4823 Qsubfeatures
= intern_c_string ("subfeatures");
4824 staticpro (&Qsubfeatures
);
4826 #ifdef HAVE_LANGINFO_CODESET
4827 Qcodeset
= intern_c_string ("codeset");
4828 staticpro (&Qcodeset
);
4829 Qdays
= intern_c_string ("days");
4831 Qmonths
= intern_c_string ("months");
4832 staticpro (&Qmonths
);
4833 Qpaper
= intern_c_string ("paper");
4834 staticpro (&Qpaper
);
4835 #endif /* HAVE_LANGINFO_CODESET */
4837 DEFVAR_BOOL ("use-dialog-box", use_dialog_box
,
4838 doc
: /* *Non-nil means mouse commands use dialog boxes to ask questions.
4839 This applies to `y-or-n-p' and `yes-or-no-p' questions asked by commands
4840 invoked by mouse clicks and mouse menu items.
4842 On some platforms, file selection dialogs are also enabled if this is
4846 DEFVAR_BOOL ("use-file-dialog", use_file_dialog
,
4847 doc
: /* *Non-nil means mouse commands use a file dialog to ask for files.
4848 This applies to commands from menus and tool bar buttons even when
4849 they are initiated from the keyboard. If `use-dialog-box' is nil,
4850 that disables the use of a file dialog, regardless of the value of
4852 use_file_dialog
= 1;
4854 defsubr (&Sidentity
);
4857 defsubr (&Ssafe_length
);
4858 defsubr (&Sstring_bytes
);
4859 defsubr (&Sstring_equal
);
4860 defsubr (&Scompare_strings
);
4861 defsubr (&Sstring_lessp
);
4864 defsubr (&Svconcat
);
4865 defsubr (&Scopy_sequence
);
4866 defsubr (&Sstring_make_multibyte
);
4867 defsubr (&Sstring_make_unibyte
);
4868 defsubr (&Sstring_as_multibyte
);
4869 defsubr (&Sstring_as_unibyte
);
4870 defsubr (&Sstring_to_multibyte
);
4871 defsubr (&Sstring_to_unibyte
);
4872 defsubr (&Scopy_alist
);
4873 defsubr (&Ssubstring
);
4874 defsubr (&Ssubstring_no_properties
);
4887 defsubr (&Snreverse
);
4888 defsubr (&Sreverse
);
4890 defsubr (&Splist_get
);
4892 defsubr (&Splist_put
);
4894 defsubr (&Slax_plist_get
);
4895 defsubr (&Slax_plist_put
);
4898 defsubr (&Sequal_including_properties
);
4899 defsubr (&Sfillarray
);
4900 defsubr (&Sclear_string
);
4904 defsubr (&Smapconcat
);
4905 defsubr (&Syes_or_no_p
);
4906 defsubr (&Sload_average
);
4907 defsubr (&Sfeaturep
);
4908 defsubr (&Srequire
);
4909 defsubr (&Sprovide
);
4910 defsubr (&Splist_member
);
4911 defsubr (&Swidget_put
);
4912 defsubr (&Swidget_get
);
4913 defsubr (&Swidget_apply
);
4914 defsubr (&Sbase64_encode_region
);
4915 defsubr (&Sbase64_decode_region
);
4916 defsubr (&Sbase64_encode_string
);
4917 defsubr (&Sbase64_decode_string
);
4919 defsubr (&Slocale_info
);