lisp/gnus/gnus-art.el (gnus-mime-inline-part, gnus-mm-display-part): Don't delete...
[emacs/old-mirror.git] / src / fns.c
blob8f9734cd7cc87a7d9ae040dc46d0ad16cae41c59
1 /* Random utility Lisp functions.
3 Copyright (C) 1985-1987, 1993-1995, 1997-2014 Free Software Foundation,
4 Inc.
6 This file is part of GNU Emacs.
8 GNU Emacs is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
13 GNU Emacs is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
21 #include <config.h>
23 #include <unistd.h>
24 #include <time.h>
26 #include <intprops.h>
28 #include "lisp.h"
29 #include "commands.h"
30 #include "character.h"
31 #include "coding.h"
32 #include "buffer.h"
33 #include "keyboard.h"
34 #include "keymap.h"
35 #include "intervals.h"
36 #include "frame.h"
37 #include "window.h"
38 #include "blockinput.h"
39 #if defined (HAVE_X_WINDOWS)
40 #include "xterm.h"
41 #endif
43 Lisp_Object Qstring_lessp;
44 static Lisp_Object Qprovide, Qrequire;
45 static Lisp_Object Qyes_or_no_p_history;
46 Lisp_Object Qcursor_in_echo_area;
47 static Lisp_Object Qwidget_type;
48 static Lisp_Object Qcodeset, Qdays, Qmonths, Qpaper;
50 static Lisp_Object Qmd5, Qsha1, Qsha224, Qsha256, Qsha384, Qsha512;
52 static bool internal_equal (Lisp_Object, Lisp_Object, int, bool, Lisp_Object);
54 DEFUN ("identity", Fidentity, Sidentity, 1, 1, 0,
55 doc: /* Return the argument unchanged. */)
56 (Lisp_Object arg)
58 return arg;
61 DEFUN ("random", Frandom, Srandom, 0, 1, 0,
62 doc: /* Return a pseudo-random number.
63 All integers representable in Lisp, i.e. between `most-negative-fixnum'
64 and `most-positive-fixnum', inclusive, are equally likely.
66 With positive integer LIMIT, return random number in interval [0,LIMIT).
67 With argument t, set the random number seed from the current time and pid.
68 With a string argument, set the seed based on the string's contents.
69 Other values of LIMIT are ignored.
71 See Info node `(elisp)Random Numbers' for more details. */)
72 (Lisp_Object limit)
74 EMACS_INT val;
76 if (EQ (limit, Qt))
77 init_random ();
78 else if (STRINGP (limit))
79 seed_random (SSDATA (limit), SBYTES (limit));
81 val = get_random ();
82 if (INTEGERP (limit) && 0 < XINT (limit))
83 while (true)
85 /* Return the remainder, except reject the rare case where
86 get_random returns a number so close to INTMASK that the
87 remainder isn't random. */
88 EMACS_INT remainder = val % XINT (limit);
89 if (val - remainder <= INTMASK - XINT (limit) + 1)
90 return make_number (remainder);
91 val = get_random ();
93 return make_number (val);
96 /* Heuristic on how many iterations of a tight loop can be safely done
97 before it's time to do a QUIT. This must be a power of 2. */
98 enum { QUIT_COUNT_HEURISTIC = 1 << 16 };
100 /* Random data-structure functions. */
102 static void
103 CHECK_LIST_END (Lisp_Object x, Lisp_Object y)
105 CHECK_TYPE (NILP (x), Qlistp, y);
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;
118 if (STRINGP (sequence))
119 XSETFASTINT (val, SCHARS (sequence));
120 else if (VECTORP (sequence))
121 XSETFASTINT (val, ASIZE (sequence));
122 else if (CHAR_TABLE_P (sequence))
123 XSETFASTINT (val, MAX_CHAR);
124 else if (BOOL_VECTOR_P (sequence))
125 XSETFASTINT (val, bool_vector_size (sequence));
126 else if (COMPILEDP (sequence))
127 XSETFASTINT (val, ASIZE (sequence) & PSEUDOVECTOR_SIZE_MASK);
128 else if (CONSP (sequence))
130 EMACS_INT i = 0;
134 ++i;
135 if ((i & (QUIT_COUNT_HEURISTIC - 1)) == 0)
137 if (MOST_POSITIVE_FIXNUM < i)
138 error ("List too long");
139 QUIT;
141 sequence = XCDR (sequence);
143 while (CONSP (sequence));
145 CHECK_LIST_END (sequence, sequence);
147 val = make_number (i);
149 else if (NILP (sequence))
150 XSETFASTINT (val, 0);
151 else
152 wrong_type_argument (Qsequencep, sequence);
154 return val;
157 DEFUN ("safe-length", Fsafe_length, Ssafe_length, 1, 1, 0,
158 doc: /* Return the length of a list, but avoid error or infinite loop.
159 This function never gets an error. If LIST is not really a list,
160 it returns 0. If LIST is circular, it returns a finite value
161 which is at least the number of distinct elements. */)
162 (Lisp_Object list)
164 Lisp_Object tail, halftail;
165 double hilen = 0;
166 uintmax_t lolen = 1;
168 if (! CONSP (list))
169 return make_number (0);
171 /* halftail is used to detect circular lists. */
172 for (tail = halftail = list; ; )
174 tail = XCDR (tail);
175 if (! CONSP (tail))
176 break;
177 if (EQ (tail, halftail))
178 break;
179 lolen++;
180 if ((lolen & 1) == 0)
182 halftail = XCDR (halftail);
183 if ((lolen & (QUIT_COUNT_HEURISTIC - 1)) == 0)
185 QUIT;
186 if (lolen == 0)
187 hilen += UINTMAX_MAX + 1.0;
192 /* If the length does not fit into a fixnum, return a float.
193 On all known practical machines this returns an upper bound on
194 the true length. */
195 return hilen ? make_float (hilen + lolen) : make_fixnum_or_float (lolen);
198 DEFUN ("string-bytes", Fstring_bytes, Sstring_bytes, 1, 1, 0,
199 doc: /* Return the number of bytes in STRING.
200 If STRING is multibyte, this may be greater than the length of STRING. */)
201 (Lisp_Object string)
203 CHECK_STRING (string);
204 return make_number (SBYTES (string));
207 DEFUN ("string-equal", Fstring_equal, Sstring_equal, 2, 2, 0,
208 doc: /* Return t if two strings have identical contents.
209 Case is significant, but text properties are ignored.
210 Symbols are also allowed; their print names are used instead. */)
211 (register Lisp_Object s1, Lisp_Object s2)
213 if (SYMBOLP (s1))
214 s1 = SYMBOL_NAME (s1);
215 if (SYMBOLP (s2))
216 s2 = SYMBOL_NAME (s2);
217 CHECK_STRING (s1);
218 CHECK_STRING (s2);
220 if (SCHARS (s1) != SCHARS (s2)
221 || SBYTES (s1) != SBYTES (s2)
222 || memcmp (SDATA (s1), SDATA (s2), SBYTES (s1)))
223 return Qnil;
224 return Qt;
227 DEFUN ("compare-strings", Fcompare_strings, Scompare_strings, 6, 7, 0,
228 doc: /* Compare the contents of two strings, converting to multibyte if needed.
229 The arguments START1, END1, START2, and END2, if non-nil, are
230 positions specifying which parts of STR1 or STR2 to compare. In
231 string STR1, compare the part between START1 (inclusive) and END1
232 \(exclusive). If START1 is nil, it defaults to 0, the beginning of
233 the string; if END1 is nil, it defaults to the length of the string.
234 Likewise, in string STR2, compare the part between START2 and END2.
236 The strings are compared by the numeric values of their characters.
237 For instance, STR1 is "less than" STR2 if its first differing
238 character has a smaller numeric value. If IGNORE-CASE is non-nil,
239 characters are converted to lower-case before comparing them. Unibyte
240 strings are converted to multibyte for comparison.
242 The value is t if the strings (or specified portions) match.
243 If string STR1 is less, the value is a negative number N;
244 - 1 - N is the number of characters that match at the beginning.
245 If string STR1 is greater, the value is a positive number N;
246 N - 1 is the number of characters that match at the beginning. */)
247 (Lisp_Object str1, Lisp_Object start1, Lisp_Object end1, Lisp_Object str2, Lisp_Object start2, Lisp_Object end2, Lisp_Object ignore_case)
249 register ptrdiff_t end1_char, end2_char;
250 register ptrdiff_t i1, i1_byte, i2, i2_byte;
252 CHECK_STRING (str1);
253 CHECK_STRING (str2);
254 if (NILP (start1))
255 start1 = make_number (0);
256 if (NILP (start2))
257 start2 = make_number (0);
258 CHECK_NATNUM (start1);
259 CHECK_NATNUM (start2);
260 if (! NILP (end1))
261 CHECK_NATNUM (end1);
262 if (! NILP (end2))
263 CHECK_NATNUM (end2);
265 end1_char = SCHARS (str1);
266 if (! NILP (end1) && end1_char > XINT (end1))
267 end1_char = XINT (end1);
268 if (end1_char < XINT (start1))
269 args_out_of_range (str1, start1);
271 end2_char = SCHARS (str2);
272 if (! NILP (end2) && end2_char > XINT (end2))
273 end2_char = XINT (end2);
274 if (end2_char < XINT (start2))
275 args_out_of_range (str2, start2);
277 i1 = XINT (start1);
278 i2 = XINT (start2);
280 i1_byte = string_char_to_byte (str1, i1);
281 i2_byte = string_char_to_byte (str2, i2);
283 while (i1 < end1_char && i2 < end2_char)
285 /* When we find a mismatch, we must compare the
286 characters, not just the bytes. */
287 int c1, c2;
289 if (STRING_MULTIBYTE (str1))
290 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c1, str1, i1, i1_byte);
291 else
293 c1 = SREF (str1, i1++);
294 MAKE_CHAR_MULTIBYTE (c1);
297 if (STRING_MULTIBYTE (str2))
298 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c2, str2, i2, i2_byte);
299 else
301 c2 = SREF (str2, i2++);
302 MAKE_CHAR_MULTIBYTE (c2);
305 if (c1 == c2)
306 continue;
308 if (! NILP (ignore_case))
310 Lisp_Object tem;
312 tem = Fupcase (make_number (c1));
313 c1 = XINT (tem);
314 tem = Fupcase (make_number (c2));
315 c2 = XINT (tem);
318 if (c1 == c2)
319 continue;
321 /* Note that I1 has already been incremented
322 past the character that we are comparing;
323 hence we don't add or subtract 1 here. */
324 if (c1 < c2)
325 return make_number (- i1 + XINT (start1));
326 else
327 return make_number (i1 - XINT (start1));
330 if (i1 < end1_char)
331 return make_number (i1 - XINT (start1) + 1);
332 if (i2 < end2_char)
333 return make_number (- i1 + XINT (start1) - 1);
335 return Qt;
338 DEFUN ("string-lessp", Fstring_lessp, Sstring_lessp, 2, 2, 0,
339 doc: /* Return t if first arg string is less than second in lexicographic order.
340 Case is significant.
341 Symbols are also allowed; their print names are used instead. */)
342 (register Lisp_Object s1, Lisp_Object s2)
344 register ptrdiff_t end;
345 register ptrdiff_t i1, i1_byte, i2, i2_byte;
347 if (SYMBOLP (s1))
348 s1 = SYMBOL_NAME (s1);
349 if (SYMBOLP (s2))
350 s2 = SYMBOL_NAME (s2);
351 CHECK_STRING (s1);
352 CHECK_STRING (s2);
354 i1 = i1_byte = i2 = i2_byte = 0;
356 end = SCHARS (s1);
357 if (end > SCHARS (s2))
358 end = SCHARS (s2);
360 while (i1 < end)
362 /* When we find a mismatch, we must compare the
363 characters, not just the bytes. */
364 int c1, c2;
366 FETCH_STRING_CHAR_ADVANCE (c1, s1, i1, i1_byte);
367 FETCH_STRING_CHAR_ADVANCE (c2, s2, i2, i2_byte);
369 if (c1 != c2)
370 return c1 < c2 ? Qt : Qnil;
372 return i1 < SCHARS (s2) ? Qt : Qnil;
375 static Lisp_Object concat (ptrdiff_t nargs, Lisp_Object *args,
376 enum Lisp_Type target_type, bool last_special);
378 /* ARGSUSED */
379 Lisp_Object
380 concat2 (Lisp_Object s1, Lisp_Object s2)
382 Lisp_Object args[2];
383 args[0] = s1;
384 args[1] = s2;
385 return concat (2, args, Lisp_String, 0);
388 /* ARGSUSED */
389 Lisp_Object
390 concat3 (Lisp_Object s1, Lisp_Object s2, Lisp_Object s3)
392 Lisp_Object args[3];
393 args[0] = s1;
394 args[1] = s2;
395 args[2] = s3;
396 return concat (3, args, Lisp_String, 0);
399 DEFUN ("append", Fappend, Sappend, 0, MANY, 0,
400 doc: /* Concatenate all the arguments and make the result a list.
401 The result is a list whose elements are the elements of all the arguments.
402 Each argument may be a list, vector or string.
403 The last argument is not copied, just used as the tail of the new list.
404 usage: (append &rest SEQUENCES) */)
405 (ptrdiff_t nargs, Lisp_Object *args)
407 return concat (nargs, args, Lisp_Cons, 1);
410 DEFUN ("concat", Fconcat, Sconcat, 0, MANY, 0,
411 doc: /* Concatenate all the arguments and make the result a string.
412 The result is a string whose elements are the elements of all the arguments.
413 Each argument may be a string or a list or vector of characters (integers).
414 usage: (concat &rest SEQUENCES) */)
415 (ptrdiff_t nargs, Lisp_Object *args)
417 return concat (nargs, args, Lisp_String, 0);
420 DEFUN ("vconcat", Fvconcat, Svconcat, 0, MANY, 0,
421 doc: /* Concatenate all the arguments and make the result a vector.
422 The result is a vector whose elements are the elements of all the arguments.
423 Each argument may be a list, vector or string.
424 usage: (vconcat &rest SEQUENCES) */)
425 (ptrdiff_t nargs, Lisp_Object *args)
427 return concat (nargs, args, Lisp_Vectorlike, 0);
431 DEFUN ("copy-sequence", Fcopy_sequence, Scopy_sequence, 1, 1, 0,
432 doc: /* Return a copy of a list, vector, string or char-table.
433 The elements of a list or vector are not copied; they are shared
434 with the original. */)
435 (Lisp_Object arg)
437 if (NILP (arg)) return arg;
439 if (CHAR_TABLE_P (arg))
441 return copy_char_table (arg);
444 if (BOOL_VECTOR_P (arg))
446 EMACS_INT nbits = bool_vector_size (arg);
447 ptrdiff_t nbytes = bool_vector_bytes (nbits);
448 Lisp_Object val = make_uninit_bool_vector (nbits);
449 memcpy (bool_vector_data (val), bool_vector_data (arg), nbytes);
450 return val;
453 if (!CONSP (arg) && !VECTORP (arg) && !STRINGP (arg))
454 wrong_type_argument (Qsequencep, arg);
456 return concat (1, &arg, XTYPE (arg), 0);
459 /* This structure holds information of an argument of `concat' that is
460 a string and has text properties to be copied. */
461 struct textprop_rec
463 ptrdiff_t argnum; /* refer to ARGS (arguments of `concat') */
464 ptrdiff_t from; /* refer to ARGS[argnum] (argument string) */
465 ptrdiff_t to; /* refer to VAL (the target string) */
468 static Lisp_Object
469 concat (ptrdiff_t nargs, Lisp_Object *args,
470 enum Lisp_Type target_type, bool last_special)
472 Lisp_Object val;
473 Lisp_Object tail;
474 Lisp_Object this;
475 ptrdiff_t toindex;
476 ptrdiff_t toindex_byte = 0;
477 EMACS_INT result_len;
478 EMACS_INT result_len_byte;
479 ptrdiff_t argnum;
480 Lisp_Object last_tail;
481 Lisp_Object prev;
482 bool some_multibyte;
483 /* When we make a multibyte string, we can't copy text properties
484 while concatenating each string because the length of resulting
485 string can't be decided until we finish the whole concatenation.
486 So, we record strings that have text properties to be copied
487 here, and copy the text properties after the concatenation. */
488 struct textprop_rec *textprops = NULL;
489 /* Number of elements in textprops. */
490 ptrdiff_t num_textprops = 0;
491 USE_SAFE_ALLOCA;
493 tail = Qnil;
495 /* In append, the last arg isn't treated like the others */
496 if (last_special && nargs > 0)
498 nargs--;
499 last_tail = args[nargs];
501 else
502 last_tail = Qnil;
504 /* Check each argument. */
505 for (argnum = 0; argnum < nargs; argnum++)
507 this = args[argnum];
508 if (!(CONSP (this) || NILP (this) || VECTORP (this) || STRINGP (this)
509 || COMPILEDP (this) || BOOL_VECTOR_P (this)))
510 wrong_type_argument (Qsequencep, this);
513 /* Compute total length in chars of arguments in RESULT_LEN.
514 If desired output is a string, also compute length in bytes
515 in RESULT_LEN_BYTE, and determine in SOME_MULTIBYTE
516 whether the result should be a multibyte string. */
517 result_len_byte = 0;
518 result_len = 0;
519 some_multibyte = 0;
520 for (argnum = 0; argnum < nargs; argnum++)
522 EMACS_INT len;
523 this = args[argnum];
524 len = XFASTINT (Flength (this));
525 if (target_type == Lisp_String)
527 /* We must count the number of bytes needed in the string
528 as well as the number of characters. */
529 ptrdiff_t i;
530 Lisp_Object ch;
531 int c;
532 ptrdiff_t this_len_byte;
534 if (VECTORP (this) || COMPILEDP (this))
535 for (i = 0; i < len; i++)
537 ch = AREF (this, i);
538 CHECK_CHARACTER (ch);
539 c = XFASTINT (ch);
540 this_len_byte = CHAR_BYTES (c);
541 if (STRING_BYTES_BOUND - result_len_byte < this_len_byte)
542 string_overflow ();
543 result_len_byte += this_len_byte;
544 if (! ASCII_CHAR_P (c) && ! CHAR_BYTE8_P (c))
545 some_multibyte = 1;
547 else if (BOOL_VECTOR_P (this) && bool_vector_size (this) > 0)
548 wrong_type_argument (Qintegerp, Faref (this, make_number (0)));
549 else if (CONSP (this))
550 for (; CONSP (this); this = XCDR (this))
552 ch = XCAR (this);
553 CHECK_CHARACTER (ch);
554 c = XFASTINT (ch);
555 this_len_byte = CHAR_BYTES (c);
556 if (STRING_BYTES_BOUND - result_len_byte < this_len_byte)
557 string_overflow ();
558 result_len_byte += this_len_byte;
559 if (! ASCII_CHAR_P (c) && ! CHAR_BYTE8_P (c))
560 some_multibyte = 1;
562 else if (STRINGP (this))
564 if (STRING_MULTIBYTE (this))
566 some_multibyte = 1;
567 this_len_byte = SBYTES (this);
569 else
570 this_len_byte = count_size_as_multibyte (SDATA (this),
571 SCHARS (this));
572 if (STRING_BYTES_BOUND - result_len_byte < this_len_byte)
573 string_overflow ();
574 result_len_byte += this_len_byte;
578 result_len += len;
579 if (MOST_POSITIVE_FIXNUM < result_len)
580 memory_full (SIZE_MAX);
583 if (! some_multibyte)
584 result_len_byte = result_len;
586 /* Create the output object. */
587 if (target_type == Lisp_Cons)
588 val = Fmake_list (make_number (result_len), Qnil);
589 else if (target_type == Lisp_Vectorlike)
590 val = Fmake_vector (make_number (result_len), Qnil);
591 else if (some_multibyte)
592 val = make_uninit_multibyte_string (result_len, result_len_byte);
593 else
594 val = make_uninit_string (result_len);
596 /* In `append', if all but last arg are nil, return last arg. */
597 if (target_type == Lisp_Cons && EQ (val, Qnil))
598 return last_tail;
600 /* Copy the contents of the args into the result. */
601 if (CONSP (val))
602 tail = val, toindex = -1; /* -1 in toindex is flag we are making a list */
603 else
604 toindex = 0, toindex_byte = 0;
606 prev = Qnil;
607 if (STRINGP (val))
608 SAFE_NALLOCA (textprops, 1, nargs);
610 for (argnum = 0; argnum < nargs; argnum++)
612 Lisp_Object thislen;
613 ptrdiff_t thisleni = 0;
614 register ptrdiff_t thisindex = 0;
615 register ptrdiff_t thisindex_byte = 0;
617 this = args[argnum];
618 if (!CONSP (this))
619 thislen = Flength (this), thisleni = XINT (thislen);
621 /* Between strings of the same kind, copy fast. */
622 if (STRINGP (this) && STRINGP (val)
623 && STRING_MULTIBYTE (this) == some_multibyte)
625 ptrdiff_t thislen_byte = SBYTES (this);
627 memcpy (SDATA (val) + toindex_byte, SDATA (this), SBYTES (this));
628 if (string_intervals (this))
630 textprops[num_textprops].argnum = argnum;
631 textprops[num_textprops].from = 0;
632 textprops[num_textprops++].to = toindex;
634 toindex_byte += thislen_byte;
635 toindex += thisleni;
637 /* Copy a single-byte string to a multibyte string. */
638 else if (STRINGP (this) && STRINGP (val))
640 if (string_intervals (this))
642 textprops[num_textprops].argnum = argnum;
643 textprops[num_textprops].from = 0;
644 textprops[num_textprops++].to = toindex;
646 toindex_byte += copy_text (SDATA (this),
647 SDATA (val) + toindex_byte,
648 SCHARS (this), 0, 1);
649 toindex += thisleni;
651 else
652 /* Copy element by element. */
653 while (1)
655 register Lisp_Object elt;
657 /* Fetch next element of `this' arg into `elt', or break if
658 `this' is exhausted. */
659 if (NILP (this)) break;
660 if (CONSP (this))
661 elt = XCAR (this), this = XCDR (this);
662 else if (thisindex >= thisleni)
663 break;
664 else if (STRINGP (this))
666 int c;
667 if (STRING_MULTIBYTE (this))
668 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c, this,
669 thisindex,
670 thisindex_byte);
671 else
673 c = SREF (this, thisindex); thisindex++;
674 if (some_multibyte && !ASCII_CHAR_P (c))
675 c = BYTE8_TO_CHAR (c);
677 XSETFASTINT (elt, c);
679 else if (BOOL_VECTOR_P (this))
681 elt = bool_vector_ref (this, thisindex);
682 thisindex++;
684 else
686 elt = AREF (this, thisindex);
687 thisindex++;
690 /* Store this element into the result. */
691 if (toindex < 0)
693 XSETCAR (tail, elt);
694 prev = tail;
695 tail = XCDR (tail);
697 else if (VECTORP (val))
699 ASET (val, toindex, elt);
700 toindex++;
702 else
704 int c;
705 CHECK_CHARACTER (elt);
706 c = XFASTINT (elt);
707 if (some_multibyte)
708 toindex_byte += CHAR_STRING (c, SDATA (val) + toindex_byte);
709 else
710 SSET (val, toindex_byte++, c);
711 toindex++;
715 if (!NILP (prev))
716 XSETCDR (prev, last_tail);
718 if (num_textprops > 0)
720 Lisp_Object props;
721 ptrdiff_t last_to_end = -1;
723 for (argnum = 0; argnum < num_textprops; argnum++)
725 this = args[textprops[argnum].argnum];
726 props = text_property_list (this,
727 make_number (0),
728 make_number (SCHARS (this)),
729 Qnil);
730 /* If successive arguments have properties, be sure that the
731 value of `composition' property be the copy. */
732 if (last_to_end == textprops[argnum].to)
733 make_composition_value_copy (props);
734 add_text_properties_from_list (val, props,
735 make_number (textprops[argnum].to));
736 last_to_end = textprops[argnum].to + SCHARS (this);
740 SAFE_FREE ();
741 return val;
744 static Lisp_Object string_char_byte_cache_string;
745 static ptrdiff_t string_char_byte_cache_charpos;
746 static ptrdiff_t string_char_byte_cache_bytepos;
748 void
749 clear_string_char_byte_cache (void)
751 string_char_byte_cache_string = Qnil;
754 /* Return the byte index corresponding to CHAR_INDEX in STRING. */
756 ptrdiff_t
757 string_char_to_byte (Lisp_Object string, ptrdiff_t char_index)
759 ptrdiff_t i_byte;
760 ptrdiff_t best_below, best_below_byte;
761 ptrdiff_t best_above, best_above_byte;
763 best_below = best_below_byte = 0;
764 best_above = SCHARS (string);
765 best_above_byte = SBYTES (string);
766 if (best_above == best_above_byte)
767 return char_index;
769 if (EQ (string, string_char_byte_cache_string))
771 if (string_char_byte_cache_charpos < char_index)
773 best_below = string_char_byte_cache_charpos;
774 best_below_byte = string_char_byte_cache_bytepos;
776 else
778 best_above = string_char_byte_cache_charpos;
779 best_above_byte = string_char_byte_cache_bytepos;
783 if (char_index - best_below < best_above - char_index)
785 unsigned char *p = SDATA (string) + best_below_byte;
787 while (best_below < char_index)
789 p += BYTES_BY_CHAR_HEAD (*p);
790 best_below++;
792 i_byte = p - SDATA (string);
794 else
796 unsigned char *p = SDATA (string) + best_above_byte;
798 while (best_above > char_index)
800 p--;
801 while (!CHAR_HEAD_P (*p)) p--;
802 best_above--;
804 i_byte = p - SDATA (string);
807 string_char_byte_cache_bytepos = i_byte;
808 string_char_byte_cache_charpos = char_index;
809 string_char_byte_cache_string = string;
811 return i_byte;
814 /* Return the character index corresponding to BYTE_INDEX in STRING. */
816 ptrdiff_t
817 string_byte_to_char (Lisp_Object string, ptrdiff_t byte_index)
819 ptrdiff_t i, i_byte;
820 ptrdiff_t best_below, best_below_byte;
821 ptrdiff_t best_above, best_above_byte;
823 best_below = best_below_byte = 0;
824 best_above = SCHARS (string);
825 best_above_byte = SBYTES (string);
826 if (best_above == best_above_byte)
827 return byte_index;
829 if (EQ (string, string_char_byte_cache_string))
831 if (string_char_byte_cache_bytepos < byte_index)
833 best_below = string_char_byte_cache_charpos;
834 best_below_byte = string_char_byte_cache_bytepos;
836 else
838 best_above = string_char_byte_cache_charpos;
839 best_above_byte = string_char_byte_cache_bytepos;
843 if (byte_index - best_below_byte < best_above_byte - byte_index)
845 unsigned char *p = SDATA (string) + best_below_byte;
846 unsigned char *pend = SDATA (string) + byte_index;
848 while (p < pend)
850 p += BYTES_BY_CHAR_HEAD (*p);
851 best_below++;
853 i = best_below;
854 i_byte = p - SDATA (string);
856 else
858 unsigned char *p = SDATA (string) + best_above_byte;
859 unsigned char *pbeg = SDATA (string) + byte_index;
861 while (p > pbeg)
863 p--;
864 while (!CHAR_HEAD_P (*p)) p--;
865 best_above--;
867 i = best_above;
868 i_byte = p - SDATA (string);
871 string_char_byte_cache_bytepos = i_byte;
872 string_char_byte_cache_charpos = i;
873 string_char_byte_cache_string = string;
875 return i;
878 /* Convert STRING to a multibyte string. */
880 static Lisp_Object
881 string_make_multibyte (Lisp_Object string)
883 unsigned char *buf;
884 ptrdiff_t nbytes;
885 Lisp_Object ret;
886 USE_SAFE_ALLOCA;
888 if (STRING_MULTIBYTE (string))
889 return string;
891 nbytes = count_size_as_multibyte (SDATA (string),
892 SCHARS (string));
893 /* If all the chars are ASCII, they won't need any more bytes
894 once converted. In that case, we can return STRING itself. */
895 if (nbytes == SBYTES (string))
896 return string;
898 buf = SAFE_ALLOCA (nbytes);
899 copy_text (SDATA (string), buf, SBYTES (string),
900 0, 1);
902 ret = make_multibyte_string ((char *) buf, SCHARS (string), nbytes);
903 SAFE_FREE ();
905 return ret;
909 /* Convert STRING (if unibyte) to a multibyte string without changing
910 the number of characters. Characters 0200 trough 0237 are
911 converted to eight-bit characters. */
913 Lisp_Object
914 string_to_multibyte (Lisp_Object string)
916 unsigned char *buf;
917 ptrdiff_t nbytes;
918 Lisp_Object ret;
919 USE_SAFE_ALLOCA;
921 if (STRING_MULTIBYTE (string))
922 return string;
924 nbytes = count_size_as_multibyte (SDATA (string), SBYTES (string));
925 /* If all the chars are ASCII, they won't need any more bytes once
926 converted. */
927 if (nbytes == SBYTES (string))
928 return make_multibyte_string (SSDATA (string), nbytes, nbytes);
930 buf = SAFE_ALLOCA (nbytes);
931 memcpy (buf, SDATA (string), SBYTES (string));
932 str_to_multibyte (buf, nbytes, SBYTES (string));
934 ret = make_multibyte_string ((char *) buf, SCHARS (string), nbytes);
935 SAFE_FREE ();
937 return ret;
941 /* Convert STRING to a single-byte string. */
943 Lisp_Object
944 string_make_unibyte (Lisp_Object string)
946 ptrdiff_t nchars;
947 unsigned char *buf;
948 Lisp_Object ret;
949 USE_SAFE_ALLOCA;
951 if (! STRING_MULTIBYTE (string))
952 return string;
954 nchars = SCHARS (string);
956 buf = SAFE_ALLOCA (nchars);
957 copy_text (SDATA (string), buf, SBYTES (string),
958 1, 0);
960 ret = make_unibyte_string ((char *) buf, nchars);
961 SAFE_FREE ();
963 return ret;
966 DEFUN ("string-make-multibyte", Fstring_make_multibyte, Sstring_make_multibyte,
967 1, 1, 0,
968 doc: /* Return the multibyte equivalent of STRING.
969 If STRING is unibyte and contains non-ASCII characters, the function
970 `unibyte-char-to-multibyte' is used to convert each unibyte character
971 to a multibyte character. In this case, the returned string is a
972 newly created string with no text properties. If STRING is multibyte
973 or entirely ASCII, it is returned unchanged. In particular, when
974 STRING is unibyte and entirely ASCII, the returned string is unibyte.
975 \(When the characters are all ASCII, Emacs primitives will treat the
976 string the same way whether it is unibyte or multibyte.) */)
977 (Lisp_Object string)
979 CHECK_STRING (string);
981 return string_make_multibyte (string);
984 DEFUN ("string-make-unibyte", Fstring_make_unibyte, Sstring_make_unibyte,
985 1, 1, 0,
986 doc: /* Return the unibyte equivalent of STRING.
987 Multibyte character codes are converted to unibyte according to
988 `nonascii-translation-table' or, if that is nil, `nonascii-insert-offset'.
989 If the lookup in the translation table fails, this function takes just
990 the low 8 bits of each character. */)
991 (Lisp_Object string)
993 CHECK_STRING (string);
995 return string_make_unibyte (string);
998 DEFUN ("string-as-unibyte", Fstring_as_unibyte, Sstring_as_unibyte,
999 1, 1, 0,
1000 doc: /* Return a unibyte string with the same individual bytes as STRING.
1001 If STRING is unibyte, the result is STRING itself.
1002 Otherwise it is a newly created string, with no text properties.
1003 If STRING is multibyte and contains a character of charset
1004 `eight-bit', it is converted to the corresponding single byte. */)
1005 (Lisp_Object string)
1007 CHECK_STRING (string);
1009 if (STRING_MULTIBYTE (string))
1011 unsigned char *str = (unsigned char *) xlispstrdup (string);
1012 ptrdiff_t bytes = str_as_unibyte (str, SBYTES (string));
1014 string = make_unibyte_string ((char *) str, bytes);
1015 xfree (str);
1017 return string;
1020 DEFUN ("string-as-multibyte", Fstring_as_multibyte, Sstring_as_multibyte,
1021 1, 1, 0,
1022 doc: /* Return a multibyte string with the same individual bytes as STRING.
1023 If STRING is multibyte, the result is STRING itself.
1024 Otherwise it is a newly created string, with no text properties.
1026 If STRING is unibyte and contains an individual 8-bit byte (i.e. not
1027 part of a correct utf-8 sequence), it is converted to the corresponding
1028 multibyte character of charset `eight-bit'.
1029 See also `string-to-multibyte'.
1031 Beware, this often doesn't really do what you think it does.
1032 It is similar to (decode-coding-string STRING 'utf-8-emacs).
1033 If you're not sure, whether to use `string-as-multibyte' or
1034 `string-to-multibyte', use `string-to-multibyte'. */)
1035 (Lisp_Object string)
1037 CHECK_STRING (string);
1039 if (! STRING_MULTIBYTE (string))
1041 Lisp_Object new_string;
1042 ptrdiff_t nchars, nbytes;
1044 parse_str_as_multibyte (SDATA (string),
1045 SBYTES (string),
1046 &nchars, &nbytes);
1047 new_string = make_uninit_multibyte_string (nchars, nbytes);
1048 memcpy (SDATA (new_string), SDATA (string), SBYTES (string));
1049 if (nbytes != SBYTES (string))
1050 str_as_multibyte (SDATA (new_string), nbytes,
1051 SBYTES (string), NULL);
1052 string = new_string;
1053 set_string_intervals (string, NULL);
1055 return string;
1058 DEFUN ("string-to-multibyte", Fstring_to_multibyte, Sstring_to_multibyte,
1059 1, 1, 0,
1060 doc: /* Return a multibyte string with the same individual chars as STRING.
1061 If STRING is multibyte, the result is STRING itself.
1062 Otherwise it is a newly created string, with no text properties.
1064 If STRING is unibyte and contains an 8-bit byte, it is converted to
1065 the corresponding multibyte character of charset `eight-bit'.
1067 This differs from `string-as-multibyte' by converting each byte of a correct
1068 utf-8 sequence to an eight-bit character, not just bytes that don't form a
1069 correct sequence. */)
1070 (Lisp_Object string)
1072 CHECK_STRING (string);
1074 return string_to_multibyte (string);
1077 DEFUN ("string-to-unibyte", Fstring_to_unibyte, Sstring_to_unibyte,
1078 1, 1, 0,
1079 doc: /* Return a unibyte string with the same individual chars as STRING.
1080 If STRING is unibyte, the result is STRING itself.
1081 Otherwise it is a newly created string, with no text properties,
1082 where each `eight-bit' character is converted to the corresponding byte.
1083 If STRING contains a non-ASCII, non-`eight-bit' character,
1084 an error is signaled. */)
1085 (Lisp_Object string)
1087 CHECK_STRING (string);
1089 if (STRING_MULTIBYTE (string))
1091 ptrdiff_t chars = SCHARS (string);
1092 unsigned char *str = xmalloc (chars);
1093 ptrdiff_t converted = str_to_unibyte (SDATA (string), str, chars);
1095 if (converted < chars)
1096 error ("Can't convert the %"pD"dth character to unibyte", converted);
1097 string = make_unibyte_string ((char *) str, chars);
1098 xfree (str);
1100 return string;
1104 DEFUN ("copy-alist", Fcopy_alist, Scopy_alist, 1, 1, 0,
1105 doc: /* Return a copy of ALIST.
1106 This is an alist which represents the same mapping from objects to objects,
1107 but does not share the alist structure with ALIST.
1108 The objects mapped (cars and cdrs of elements of the alist)
1109 are shared, however.
1110 Elements of ALIST that are not conses are also shared. */)
1111 (Lisp_Object alist)
1113 register Lisp_Object tem;
1115 CHECK_LIST (alist);
1116 if (NILP (alist))
1117 return alist;
1118 alist = concat (1, &alist, Lisp_Cons, 0);
1119 for (tem = alist; CONSP (tem); tem = XCDR (tem))
1121 register Lisp_Object car;
1122 car = XCAR (tem);
1124 if (CONSP (car))
1125 XSETCAR (tem, Fcons (XCAR (car), XCDR (car)));
1127 return alist;
1130 /* Check that ARRAY can have a valid subarray [FROM..TO),
1131 given that its size is SIZE.
1132 If FROM is nil, use 0; if TO is nil, use SIZE.
1133 Count negative values backwards from the end.
1134 Set *IFROM and *ITO to the two indexes used. */
1136 static void
1137 validate_subarray (Lisp_Object array, Lisp_Object from, Lisp_Object to,
1138 ptrdiff_t size, EMACS_INT *ifrom, EMACS_INT *ito)
1140 EMACS_INT f, t;
1142 if (INTEGERP (from))
1144 f = XINT (from);
1145 if (f < 0)
1146 f += size;
1148 else if (NILP (from))
1149 f = 0;
1150 else
1151 wrong_type_argument (Qintegerp, from);
1153 if (INTEGERP (to))
1155 t = XINT (to);
1156 if (t < 0)
1157 t += size;
1159 else if (NILP (to))
1160 t = size;
1161 else
1162 wrong_type_argument (Qintegerp, to);
1164 if (! (0 <= f && f <= t && t <= size))
1165 args_out_of_range_3 (array, from, to);
1167 *ifrom = f;
1168 *ito = t;
1171 DEFUN ("substring", Fsubstring, Ssubstring, 1, 3, 0,
1172 doc: /* Return a new string whose contents are a substring of STRING.
1173 The returned string consists of the characters between index FROM
1174 \(inclusive) and index TO (exclusive) of STRING. FROM and TO are
1175 zero-indexed: 0 means the first character of STRING. Negative values
1176 are counted from the end of STRING. If TO is nil, the substring runs
1177 to the end of STRING.
1179 The STRING argument may also be a vector. In that case, the return
1180 value is a new vector that contains the elements between index FROM
1181 \(inclusive) and index TO (exclusive) of that vector argument.
1183 With one argument, just copy STRING (with properties, if any). */)
1184 (Lisp_Object string, Lisp_Object from, Lisp_Object to)
1186 Lisp_Object res;
1187 ptrdiff_t size;
1188 EMACS_INT ifrom, ito;
1190 if (STRINGP (string))
1191 size = SCHARS (string);
1192 else if (VECTORP (string))
1193 size = ASIZE (string);
1194 else
1195 wrong_type_argument (Qarrayp, string);
1197 validate_subarray (string, from, to, size, &ifrom, &ito);
1199 if (STRINGP (string))
1201 ptrdiff_t from_byte
1202 = !ifrom ? 0 : string_char_to_byte (string, ifrom);
1203 ptrdiff_t to_byte
1204 = ito == size ? SBYTES (string) : string_char_to_byte (string, ito);
1205 res = make_specified_string (SSDATA (string) + from_byte,
1206 ito - ifrom, to_byte - from_byte,
1207 STRING_MULTIBYTE (string));
1208 copy_text_properties (make_number (ifrom), make_number (ito),
1209 string, make_number (0), res, Qnil);
1211 else
1212 res = Fvector (ito - ifrom, aref_addr (string, ifrom));
1214 return res;
1218 DEFUN ("substring-no-properties", Fsubstring_no_properties, Ssubstring_no_properties, 1, 3, 0,
1219 doc: /* Return a substring of STRING, without text properties.
1220 It starts at index FROM and ends before TO.
1221 TO may be nil or omitted; then the substring runs to the end of STRING.
1222 If FROM is nil or omitted, the substring starts at the beginning of STRING.
1223 If FROM or TO is negative, it counts from the end.
1225 With one argument, just copy STRING without its properties. */)
1226 (Lisp_Object string, register Lisp_Object from, Lisp_Object to)
1228 ptrdiff_t size;
1229 EMACS_INT from_char, to_char;
1230 ptrdiff_t from_byte, to_byte;
1232 CHECK_STRING (string);
1234 size = SCHARS (string);
1235 validate_subarray (string, from, to, size, &from_char, &to_char);
1237 from_byte = !from_char ? 0 : string_char_to_byte (string, from_char);
1238 to_byte =
1239 to_char == size ? SBYTES (string) : string_char_to_byte (string, to_char);
1240 return make_specified_string (SSDATA (string) + from_byte,
1241 to_char - from_char, to_byte - from_byte,
1242 STRING_MULTIBYTE (string));
1245 /* Extract a substring of STRING, giving start and end positions
1246 both in characters and in bytes. */
1248 Lisp_Object
1249 substring_both (Lisp_Object string, ptrdiff_t from, ptrdiff_t from_byte,
1250 ptrdiff_t to, ptrdiff_t to_byte)
1252 Lisp_Object res;
1253 ptrdiff_t size;
1255 CHECK_VECTOR_OR_STRING (string);
1257 size = STRINGP (string) ? SCHARS (string) : ASIZE (string);
1259 if (!(0 <= from && from <= to && to <= size))
1260 args_out_of_range_3 (string, make_number (from), make_number (to));
1262 if (STRINGP (string))
1264 res = make_specified_string (SSDATA (string) + from_byte,
1265 to - from, to_byte - from_byte,
1266 STRING_MULTIBYTE (string));
1267 copy_text_properties (make_number (from), make_number (to),
1268 string, make_number (0), res, Qnil);
1270 else
1271 res = Fvector (to - from, aref_addr (string, from));
1273 return res;
1276 DEFUN ("nthcdr", Fnthcdr, Snthcdr, 2, 2, 0,
1277 doc: /* Take cdr N times on LIST, return the result. */)
1278 (Lisp_Object n, Lisp_Object list)
1280 EMACS_INT i, num;
1281 CHECK_NUMBER (n);
1282 num = XINT (n);
1283 for (i = 0; i < num && !NILP (list); i++)
1285 QUIT;
1286 CHECK_LIST_CONS (list, list);
1287 list = XCDR (list);
1289 return list;
1292 DEFUN ("nth", Fnth, Snth, 2, 2, 0,
1293 doc: /* Return the Nth element of LIST.
1294 N counts from zero. If LIST is not that long, nil is returned. */)
1295 (Lisp_Object n, Lisp_Object list)
1297 return Fcar (Fnthcdr (n, list));
1300 DEFUN ("elt", Felt, Selt, 2, 2, 0,
1301 doc: /* Return element of SEQUENCE at index N. */)
1302 (register Lisp_Object sequence, Lisp_Object n)
1304 CHECK_NUMBER (n);
1305 if (CONSP (sequence) || NILP (sequence))
1306 return Fcar (Fnthcdr (n, sequence));
1308 /* Faref signals a "not array" error, so check here. */
1309 CHECK_ARRAY (sequence, Qsequencep);
1310 return Faref (sequence, n);
1313 DEFUN ("member", Fmember, Smember, 2, 2, 0,
1314 doc: /* Return non-nil if ELT is an element of LIST. Comparison done with `equal'.
1315 The value is actually the tail of LIST whose car is ELT. */)
1316 (register Lisp_Object elt, Lisp_Object list)
1318 register Lisp_Object tail;
1319 for (tail = list; CONSP (tail); tail = XCDR (tail))
1321 register Lisp_Object tem;
1322 CHECK_LIST_CONS (tail, list);
1323 tem = XCAR (tail);
1324 if (! NILP (Fequal (elt, tem)))
1325 return tail;
1326 QUIT;
1328 return Qnil;
1331 DEFUN ("memq", Fmemq, Smemq, 2, 2, 0,
1332 doc: /* Return non-nil if ELT is an element of LIST. Comparison done with `eq'.
1333 The value is actually the tail of LIST whose car is ELT. */)
1334 (register Lisp_Object elt, Lisp_Object list)
1336 while (1)
1338 if (!CONSP (list) || EQ (XCAR (list), elt))
1339 break;
1341 list = XCDR (list);
1342 if (!CONSP (list) || EQ (XCAR (list), elt))
1343 break;
1345 list = XCDR (list);
1346 if (!CONSP (list) || EQ (XCAR (list), elt))
1347 break;
1349 list = XCDR (list);
1350 QUIT;
1353 CHECK_LIST (list);
1354 return list;
1357 DEFUN ("memql", Fmemql, Smemql, 2, 2, 0,
1358 doc: /* Return non-nil if ELT is an element of LIST. Comparison done with `eql'.
1359 The value is actually the tail of LIST whose car is ELT. */)
1360 (register Lisp_Object elt, Lisp_Object list)
1362 register Lisp_Object tail;
1364 if (!FLOATP (elt))
1365 return Fmemq (elt, list);
1367 for (tail = list; CONSP (tail); tail = XCDR (tail))
1369 register Lisp_Object tem;
1370 CHECK_LIST_CONS (tail, list);
1371 tem = XCAR (tail);
1372 if (FLOATP (tem) && internal_equal (elt, tem, 0, 0, Qnil))
1373 return tail;
1374 QUIT;
1376 return Qnil;
1379 DEFUN ("assq", Fassq, Sassq, 2, 2, 0,
1380 doc: /* Return non-nil if KEY is `eq' to the car of an element of LIST.
1381 The value is actually the first element of LIST whose car is KEY.
1382 Elements of LIST that are not conses are ignored. */)
1383 (Lisp_Object key, Lisp_Object list)
1385 while (1)
1387 if (!CONSP (list)
1388 || (CONSP (XCAR (list))
1389 && EQ (XCAR (XCAR (list)), key)))
1390 break;
1392 list = XCDR (list);
1393 if (!CONSP (list)
1394 || (CONSP (XCAR (list))
1395 && EQ (XCAR (XCAR (list)), key)))
1396 break;
1398 list = XCDR (list);
1399 if (!CONSP (list)
1400 || (CONSP (XCAR (list))
1401 && EQ (XCAR (XCAR (list)), key)))
1402 break;
1404 list = XCDR (list);
1405 QUIT;
1408 return CAR (list);
1411 /* Like Fassq but never report an error and do not allow quits.
1412 Use only on lists known never to be circular. */
1414 Lisp_Object
1415 assq_no_quit (Lisp_Object key, Lisp_Object list)
1417 while (CONSP (list)
1418 && (!CONSP (XCAR (list))
1419 || !EQ (XCAR (XCAR (list)), key)))
1420 list = XCDR (list);
1422 return CAR_SAFE (list);
1425 DEFUN ("assoc", Fassoc, Sassoc, 2, 2, 0,
1426 doc: /* Return non-nil if KEY is `equal' to the car of an element of LIST.
1427 The value is actually the first element of LIST whose car equals KEY. */)
1428 (Lisp_Object key, Lisp_Object list)
1430 Lisp_Object car;
1432 while (1)
1434 if (!CONSP (list)
1435 || (CONSP (XCAR (list))
1436 && (car = XCAR (XCAR (list)),
1437 EQ (car, key) || !NILP (Fequal (car, key)))))
1438 break;
1440 list = XCDR (list);
1441 if (!CONSP (list)
1442 || (CONSP (XCAR (list))
1443 && (car = XCAR (XCAR (list)),
1444 EQ (car, key) || !NILP (Fequal (car, key)))))
1445 break;
1447 list = XCDR (list);
1448 if (!CONSP (list)
1449 || (CONSP (XCAR (list))
1450 && (car = XCAR (XCAR (list)),
1451 EQ (car, key) || !NILP (Fequal (car, key)))))
1452 break;
1454 list = XCDR (list);
1455 QUIT;
1458 return CAR (list);
1461 /* Like Fassoc but never report an error and do not allow quits.
1462 Use only on lists known never to be circular. */
1464 Lisp_Object
1465 assoc_no_quit (Lisp_Object key, Lisp_Object list)
1467 while (CONSP (list)
1468 && (!CONSP (XCAR (list))
1469 || (!EQ (XCAR (XCAR (list)), key)
1470 && NILP (Fequal (XCAR (XCAR (list)), key)))))
1471 list = XCDR (list);
1473 return CONSP (list) ? XCAR (list) : Qnil;
1476 DEFUN ("rassq", Frassq, Srassq, 2, 2, 0,
1477 doc: /* Return non-nil if KEY is `eq' to the cdr of an element of LIST.
1478 The value is actually the first element of LIST whose cdr is KEY. */)
1479 (register Lisp_Object key, Lisp_Object list)
1481 while (1)
1483 if (!CONSP (list)
1484 || (CONSP (XCAR (list))
1485 && EQ (XCDR (XCAR (list)), key)))
1486 break;
1488 list = XCDR (list);
1489 if (!CONSP (list)
1490 || (CONSP (XCAR (list))
1491 && EQ (XCDR (XCAR (list)), key)))
1492 break;
1494 list = XCDR (list);
1495 if (!CONSP (list)
1496 || (CONSP (XCAR (list))
1497 && EQ (XCDR (XCAR (list)), key)))
1498 break;
1500 list = XCDR (list);
1501 QUIT;
1504 return CAR (list);
1507 DEFUN ("rassoc", Frassoc, Srassoc, 2, 2, 0,
1508 doc: /* Return non-nil if KEY is `equal' to the cdr of an element of LIST.
1509 The value is actually the first element of LIST whose cdr equals KEY. */)
1510 (Lisp_Object key, Lisp_Object list)
1512 Lisp_Object cdr;
1514 while (1)
1516 if (!CONSP (list)
1517 || (CONSP (XCAR (list))
1518 && (cdr = XCDR (XCAR (list)),
1519 EQ (cdr, key) || !NILP (Fequal (cdr, key)))))
1520 break;
1522 list = XCDR (list);
1523 if (!CONSP (list)
1524 || (CONSP (XCAR (list))
1525 && (cdr = XCDR (XCAR (list)),
1526 EQ (cdr, key) || !NILP (Fequal (cdr, key)))))
1527 break;
1529 list = XCDR (list);
1530 if (!CONSP (list)
1531 || (CONSP (XCAR (list))
1532 && (cdr = XCDR (XCAR (list)),
1533 EQ (cdr, key) || !NILP (Fequal (cdr, key)))))
1534 break;
1536 list = XCDR (list);
1537 QUIT;
1540 return CAR (list);
1543 DEFUN ("delq", Fdelq, Sdelq, 2, 2, 0,
1544 doc: /* Delete members of LIST which are `eq' to ELT, and return the result.
1545 More precisely, this function skips any members `eq' to ELT at the
1546 front of LIST, then removes members `eq' to ELT from the remaining
1547 sublist by modifying its list structure, then returns the resulting
1548 list.
1550 Write `(setq foo (delq element foo))' to be sure of correctly changing
1551 the value of a list `foo'. */)
1552 (register Lisp_Object elt, Lisp_Object list)
1554 Lisp_Object tail, tortoise, prev = Qnil;
1555 bool skip;
1557 FOR_EACH_TAIL (tail, list, tortoise, skip)
1559 Lisp_Object tem = XCAR (tail);
1560 if (EQ (elt, tem))
1562 if (NILP (prev))
1563 list = XCDR (tail);
1564 else
1565 Fsetcdr (prev, XCDR (tail));
1567 else
1568 prev = tail;
1570 return list;
1573 DEFUN ("delete", Fdelete, Sdelete, 2, 2, 0,
1574 doc: /* Delete members of SEQ which are `equal' to ELT, and return the result.
1575 SEQ must be a sequence (i.e. a list, a vector, or a string).
1576 The return value is a sequence of the same type.
1578 If SEQ is a list, this behaves like `delq', except that it compares
1579 with `equal' instead of `eq'. In particular, it may remove elements
1580 by altering the list structure.
1582 If SEQ is not a list, deletion is never performed destructively;
1583 instead this function creates and returns a new vector or string.
1585 Write `(setq foo (delete element foo))' to be sure of correctly
1586 changing the value of a sequence `foo'. */)
1587 (Lisp_Object elt, Lisp_Object seq)
1589 if (VECTORP (seq))
1591 ptrdiff_t i, n;
1593 for (i = n = 0; i < ASIZE (seq); ++i)
1594 if (NILP (Fequal (AREF (seq, i), elt)))
1595 ++n;
1597 if (n != ASIZE (seq))
1599 struct Lisp_Vector *p = allocate_vector (n);
1601 for (i = n = 0; i < ASIZE (seq); ++i)
1602 if (NILP (Fequal (AREF (seq, i), elt)))
1603 p->contents[n++] = AREF (seq, i);
1605 XSETVECTOR (seq, p);
1608 else if (STRINGP (seq))
1610 ptrdiff_t i, ibyte, nchars, nbytes, cbytes;
1611 int c;
1613 for (i = nchars = nbytes = ibyte = 0;
1614 i < SCHARS (seq);
1615 ++i, ibyte += cbytes)
1617 if (STRING_MULTIBYTE (seq))
1619 c = STRING_CHAR (SDATA (seq) + ibyte);
1620 cbytes = CHAR_BYTES (c);
1622 else
1624 c = SREF (seq, i);
1625 cbytes = 1;
1628 if (!INTEGERP (elt) || c != XINT (elt))
1630 ++nchars;
1631 nbytes += cbytes;
1635 if (nchars != SCHARS (seq))
1637 Lisp_Object tem;
1639 tem = make_uninit_multibyte_string (nchars, nbytes);
1640 if (!STRING_MULTIBYTE (seq))
1641 STRING_SET_UNIBYTE (tem);
1643 for (i = nchars = nbytes = ibyte = 0;
1644 i < SCHARS (seq);
1645 ++i, ibyte += cbytes)
1647 if (STRING_MULTIBYTE (seq))
1649 c = STRING_CHAR (SDATA (seq) + ibyte);
1650 cbytes = CHAR_BYTES (c);
1652 else
1654 c = SREF (seq, i);
1655 cbytes = 1;
1658 if (!INTEGERP (elt) || c != XINT (elt))
1660 unsigned char *from = SDATA (seq) + ibyte;
1661 unsigned char *to = SDATA (tem) + nbytes;
1662 ptrdiff_t n;
1664 ++nchars;
1665 nbytes += cbytes;
1667 for (n = cbytes; n--; )
1668 *to++ = *from++;
1672 seq = tem;
1675 else
1677 Lisp_Object tail, prev;
1679 for (tail = seq, prev = Qnil; CONSP (tail); tail = XCDR (tail))
1681 CHECK_LIST_CONS (tail, seq);
1683 if (!NILP (Fequal (elt, XCAR (tail))))
1685 if (NILP (prev))
1686 seq = XCDR (tail);
1687 else
1688 Fsetcdr (prev, XCDR (tail));
1690 else
1691 prev = tail;
1692 QUIT;
1696 return seq;
1699 DEFUN ("nreverse", Fnreverse, Snreverse, 1, 1, 0,
1700 doc: /* Reverse LIST by modifying cdr pointers.
1701 Return the reversed list. Expects a properly nil-terminated list. */)
1702 (Lisp_Object list)
1704 register Lisp_Object prev, tail, next;
1706 if (NILP (list)) return list;
1707 prev = Qnil;
1708 tail = list;
1709 while (!NILP (tail))
1711 QUIT;
1712 CHECK_LIST_CONS (tail, tail);
1713 next = XCDR (tail);
1714 Fsetcdr (tail, prev);
1715 prev = tail;
1716 tail = next;
1718 return prev;
1721 DEFUN ("reverse", Freverse, Sreverse, 1, 1, 0,
1722 doc: /* Return the reversed copy of list, vector, or string SEQ.
1723 See also the function `nreverse', which is used more often. */)
1724 (Lisp_Object seq)
1726 Lisp_Object new;
1728 if (NILP (seq))
1729 return Qnil;
1730 else if (CONSP (seq))
1732 for (new = Qnil; CONSP (seq); seq = XCDR (seq))
1734 QUIT;
1735 new = Fcons (XCAR (seq), new);
1737 CHECK_LIST_END (seq, seq);
1739 else if (VECTORP (seq))
1741 ptrdiff_t i, size = ASIZE (seq);
1743 new = make_uninit_vector (size);
1744 for (i = 0; i < size; i++)
1745 ASET (new, i, AREF (seq, size - i - 1));
1747 else if (BOOL_VECTOR_P (seq))
1749 ptrdiff_t i;
1750 EMACS_INT nbits = bool_vector_size (seq);
1752 new = make_uninit_bool_vector (nbits);
1753 for (i = 0; i < nbits; i++)
1754 bool_vector_set (new, i, bool_vector_bitref (seq, nbits - i - 1));
1756 else if (STRINGP (seq))
1758 ptrdiff_t size = SCHARS (seq), bytes = SBYTES (seq);
1760 if (size == bytes)
1762 ptrdiff_t i;
1764 new = make_uninit_string (size);
1765 for (i = 0; i < size; i++)
1766 SSET (new, i, SREF (seq, size - i - 1));
1768 else
1770 unsigned char *p, *q;
1772 new = make_uninit_multibyte_string (size, bytes);
1773 p = SDATA (seq), q = SDATA (new) + bytes;
1774 while (q > SDATA (new))
1776 int ch, len;
1778 ch = STRING_CHAR_AND_LENGTH (p, len);
1779 p += len, q -= len;
1780 CHAR_STRING (ch, q);
1784 else
1785 wrong_type_argument (Qsequencep, seq);
1786 return new;
1789 DEFUN ("sort", Fsort, Ssort, 2, 2, 0,
1790 doc: /* Sort LIST, stably, comparing elements using PREDICATE.
1791 Returns the sorted list. LIST is modified by side effects.
1792 PREDICATE is called with two elements of LIST, and should return non-nil
1793 if the first element should sort before the second. */)
1794 (Lisp_Object list, Lisp_Object predicate)
1796 Lisp_Object front, back;
1797 register Lisp_Object len, tem;
1798 struct gcpro gcpro1, gcpro2;
1799 EMACS_INT length;
1801 front = list;
1802 len = Flength (list);
1803 length = XINT (len);
1804 if (length < 2)
1805 return list;
1807 XSETINT (len, (length / 2) - 1);
1808 tem = Fnthcdr (len, list);
1809 back = Fcdr (tem);
1810 Fsetcdr (tem, Qnil);
1812 GCPRO2 (front, back);
1813 front = Fsort (front, predicate);
1814 back = Fsort (back, predicate);
1815 UNGCPRO;
1816 return merge (front, back, predicate);
1819 Lisp_Object
1820 merge (Lisp_Object org_l1, Lisp_Object org_l2, Lisp_Object pred)
1822 Lisp_Object value;
1823 register Lisp_Object tail;
1824 Lisp_Object tem;
1825 register Lisp_Object l1, l2;
1826 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
1828 l1 = org_l1;
1829 l2 = org_l2;
1830 tail = Qnil;
1831 value = Qnil;
1833 /* It is sufficient to protect org_l1 and org_l2.
1834 When l1 and l2 are updated, we copy the new values
1835 back into the org_ vars. */
1836 GCPRO4 (org_l1, org_l2, pred, value);
1838 while (1)
1840 if (NILP (l1))
1842 UNGCPRO;
1843 if (NILP (tail))
1844 return l2;
1845 Fsetcdr (tail, l2);
1846 return value;
1848 if (NILP (l2))
1850 UNGCPRO;
1851 if (NILP (tail))
1852 return l1;
1853 Fsetcdr (tail, l1);
1854 return value;
1856 tem = call2 (pred, Fcar (l2), Fcar (l1));
1857 if (NILP (tem))
1859 tem = l1;
1860 l1 = Fcdr (l1);
1861 org_l1 = l1;
1863 else
1865 tem = l2;
1866 l2 = Fcdr (l2);
1867 org_l2 = l2;
1869 if (NILP (tail))
1870 value = tem;
1871 else
1872 Fsetcdr (tail, tem);
1873 tail = tem;
1878 /* This does not check for quits. That is safe since it must terminate. */
1880 DEFUN ("plist-get", Fplist_get, Splist_get, 2, 2, 0,
1881 doc: /* Extract a value from a property list.
1882 PLIST is a property list, which is a list of the form
1883 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value
1884 corresponding to the given PROP, or nil if PROP is not one of the
1885 properties on the list. This function never signals an error. */)
1886 (Lisp_Object plist, Lisp_Object prop)
1888 Lisp_Object tail, halftail;
1890 /* halftail is used to detect circular lists. */
1891 tail = halftail = plist;
1892 while (CONSP (tail) && CONSP (XCDR (tail)))
1894 if (EQ (prop, XCAR (tail)))
1895 return XCAR (XCDR (tail));
1897 tail = XCDR (XCDR (tail));
1898 halftail = XCDR (halftail);
1899 if (EQ (tail, halftail))
1900 break;
1903 return Qnil;
1906 DEFUN ("get", Fget, Sget, 2, 2, 0,
1907 doc: /* Return the value of SYMBOL's PROPNAME property.
1908 This is the last value stored with `(put SYMBOL PROPNAME VALUE)'. */)
1909 (Lisp_Object symbol, Lisp_Object propname)
1911 CHECK_SYMBOL (symbol);
1912 return Fplist_get (XSYMBOL (symbol)->plist, propname);
1915 DEFUN ("plist-put", Fplist_put, Splist_put, 3, 3, 0,
1916 doc: /* Change value in PLIST of PROP to VAL.
1917 PLIST is a property list, which is a list of the form
1918 \(PROP1 VALUE1 PROP2 VALUE2 ...). PROP is a symbol and VAL is any object.
1919 If PROP is already a property on the list, its value is set to VAL,
1920 otherwise the new PROP VAL pair is added. The new plist is returned;
1921 use `(setq x (plist-put x prop val))' to be sure to use the new value.
1922 The PLIST is modified by side effects. */)
1923 (Lisp_Object plist, register Lisp_Object prop, Lisp_Object val)
1925 register Lisp_Object tail, prev;
1926 Lisp_Object newcell;
1927 prev = Qnil;
1928 for (tail = plist; CONSP (tail) && CONSP (XCDR (tail));
1929 tail = XCDR (XCDR (tail)))
1931 if (EQ (prop, XCAR (tail)))
1933 Fsetcar (XCDR (tail), val);
1934 return plist;
1937 prev = tail;
1938 QUIT;
1940 newcell = Fcons (prop, Fcons (val, NILP (prev) ? plist : XCDR (XCDR (prev))));
1941 if (NILP (prev))
1942 return newcell;
1943 else
1944 Fsetcdr (XCDR (prev), newcell);
1945 return plist;
1948 DEFUN ("put", Fput, Sput, 3, 3, 0,
1949 doc: /* Store SYMBOL's PROPNAME property with value VALUE.
1950 It can be retrieved with `(get SYMBOL PROPNAME)'. */)
1951 (Lisp_Object symbol, Lisp_Object propname, Lisp_Object value)
1953 CHECK_SYMBOL (symbol);
1954 set_symbol_plist
1955 (symbol, Fplist_put (XSYMBOL (symbol)->plist, propname, value));
1956 return value;
1959 DEFUN ("lax-plist-get", Flax_plist_get, Slax_plist_get, 2, 2, 0,
1960 doc: /* Extract a value from a property list, comparing with `equal'.
1961 PLIST is a property list, which is a list of the form
1962 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value
1963 corresponding to the given PROP, or nil if PROP is not
1964 one of the properties on the list. */)
1965 (Lisp_Object plist, Lisp_Object prop)
1967 Lisp_Object tail;
1969 for (tail = plist;
1970 CONSP (tail) && CONSP (XCDR (tail));
1971 tail = XCDR (XCDR (tail)))
1973 if (! NILP (Fequal (prop, XCAR (tail))))
1974 return XCAR (XCDR (tail));
1976 QUIT;
1979 CHECK_LIST_END (tail, prop);
1981 return Qnil;
1984 DEFUN ("lax-plist-put", Flax_plist_put, Slax_plist_put, 3, 3, 0,
1985 doc: /* Change value in PLIST of PROP to VAL, comparing with `equal'.
1986 PLIST is a property list, which is a list of the form
1987 \(PROP1 VALUE1 PROP2 VALUE2 ...). PROP and VAL are any objects.
1988 If PROP is already a property on the list, its value is set to VAL,
1989 otherwise the new PROP VAL pair is added. The new plist is returned;
1990 use `(setq x (lax-plist-put x prop val))' to be sure to use the new value.
1991 The PLIST is modified by side effects. */)
1992 (Lisp_Object plist, register Lisp_Object prop, Lisp_Object val)
1994 register Lisp_Object tail, prev;
1995 Lisp_Object newcell;
1996 prev = Qnil;
1997 for (tail = plist; CONSP (tail) && CONSP (XCDR (tail));
1998 tail = XCDR (XCDR (tail)))
2000 if (! NILP (Fequal (prop, XCAR (tail))))
2002 Fsetcar (XCDR (tail), val);
2003 return plist;
2006 prev = tail;
2007 QUIT;
2009 newcell = list2 (prop, val);
2010 if (NILP (prev))
2011 return newcell;
2012 else
2013 Fsetcdr (XCDR (prev), newcell);
2014 return plist;
2017 DEFUN ("eql", Feql, Seql, 2, 2, 0,
2018 doc: /* Return t if the two args are the same Lisp object.
2019 Floating-point numbers of equal value are `eql', but they may not be `eq'. */)
2020 (Lisp_Object obj1, Lisp_Object obj2)
2022 if (FLOATP (obj1))
2023 return internal_equal (obj1, obj2, 0, 0, Qnil) ? Qt : Qnil;
2024 else
2025 return EQ (obj1, obj2) ? Qt : Qnil;
2028 DEFUN ("equal", Fequal, Sequal, 2, 2, 0,
2029 doc: /* Return t if two Lisp objects have similar structure and contents.
2030 They must have the same data type.
2031 Conses are compared by comparing the cars and the cdrs.
2032 Vectors and strings are compared element by element.
2033 Numbers are compared by value, but integers cannot equal floats.
2034 (Use `=' if you want integers and floats to be able to be equal.)
2035 Symbols must match exactly. */)
2036 (register Lisp_Object o1, Lisp_Object o2)
2038 return internal_equal (o1, o2, 0, 0, Qnil) ? Qt : Qnil;
2041 DEFUN ("equal-including-properties", Fequal_including_properties, Sequal_including_properties, 2, 2, 0,
2042 doc: /* Return t if two Lisp objects have similar structure and contents.
2043 This is like `equal' except that it compares the text properties
2044 of strings. (`equal' ignores text properties.) */)
2045 (register Lisp_Object o1, Lisp_Object o2)
2047 return internal_equal (o1, o2, 0, 1, Qnil) ? Qt : Qnil;
2050 /* DEPTH is current depth of recursion. Signal an error if it
2051 gets too deep.
2052 PROPS means compare string text properties too. */
2054 static bool
2055 internal_equal (Lisp_Object o1, Lisp_Object o2, int depth, bool props,
2056 Lisp_Object ht)
2058 if (depth > 10)
2060 if (depth > 200)
2061 error ("Stack overflow in equal");
2062 if (NILP (ht))
2064 Lisp_Object args[2];
2065 args[0] = QCtest;
2066 args[1] = Qeq;
2067 ht = Fmake_hash_table (2, args);
2069 switch (XTYPE (o1))
2071 case Lisp_Cons: case Lisp_Misc: case Lisp_Vectorlike:
2073 struct Lisp_Hash_Table *h = XHASH_TABLE (ht);
2074 EMACS_UINT hash;
2075 ptrdiff_t i = hash_lookup (h, o1, &hash);
2076 if (i >= 0)
2077 { /* `o1' was seen already. */
2078 Lisp_Object o2s = HASH_VALUE (h, i);
2079 if (!NILP (Fmemq (o2, o2s)))
2080 return 1;
2081 else
2082 set_hash_value_slot (h, i, Fcons (o2, o2s));
2084 else
2085 hash_put (h, o1, Fcons (o2, Qnil), hash);
2087 default: ;
2091 tail_recurse:
2092 QUIT;
2093 if (EQ (o1, o2))
2094 return 1;
2095 if (XTYPE (o1) != XTYPE (o2))
2096 return 0;
2098 switch (XTYPE (o1))
2100 case Lisp_Float:
2102 double d1, d2;
2104 d1 = extract_float (o1);
2105 d2 = extract_float (o2);
2106 /* If d is a NaN, then d != d. Two NaNs should be `equal' even
2107 though they are not =. */
2108 return d1 == d2 || (d1 != d1 && d2 != d2);
2111 case Lisp_Cons:
2112 if (!internal_equal (XCAR (o1), XCAR (o2), depth + 1, props, ht))
2113 return 0;
2114 o1 = XCDR (o1);
2115 o2 = XCDR (o2);
2116 /* FIXME: This inf-loops in a circular list! */
2117 goto tail_recurse;
2119 case Lisp_Misc:
2120 if (XMISCTYPE (o1) != XMISCTYPE (o2))
2121 return 0;
2122 if (OVERLAYP (o1))
2124 if (!internal_equal (OVERLAY_START (o1), OVERLAY_START (o2),
2125 depth + 1, props, ht)
2126 || !internal_equal (OVERLAY_END (o1), OVERLAY_END (o2),
2127 depth + 1, props, ht))
2128 return 0;
2129 o1 = XOVERLAY (o1)->plist;
2130 o2 = XOVERLAY (o2)->plist;
2131 goto tail_recurse;
2133 if (MARKERP (o1))
2135 return (XMARKER (o1)->buffer == XMARKER (o2)->buffer
2136 && (XMARKER (o1)->buffer == 0
2137 || XMARKER (o1)->bytepos == XMARKER (o2)->bytepos));
2139 break;
2141 case Lisp_Vectorlike:
2143 register int i;
2144 ptrdiff_t size = ASIZE (o1);
2145 /* Pseudovectors have the type encoded in the size field, so this test
2146 actually checks that the objects have the same type as well as the
2147 same size. */
2148 if (ASIZE (o2) != size)
2149 return 0;
2150 /* Boolvectors are compared much like strings. */
2151 if (BOOL_VECTOR_P (o1))
2153 EMACS_INT size = bool_vector_size (o1);
2154 if (size != bool_vector_size (o2))
2155 return 0;
2156 if (memcmp (bool_vector_data (o1), bool_vector_data (o2),
2157 bool_vector_bytes (size)))
2158 return 0;
2159 return 1;
2161 if (WINDOW_CONFIGURATIONP (o1))
2162 return compare_window_configurations (o1, o2, 0);
2164 /* Aside from them, only true vectors, char-tables, compiled
2165 functions, and fonts (font-spec, font-entity, font-object)
2166 are sensible to compare, so eliminate the others now. */
2167 if (size & PSEUDOVECTOR_FLAG)
2169 if (((size & PVEC_TYPE_MASK) >> PSEUDOVECTOR_AREA_BITS)
2170 < PVEC_COMPILED)
2171 return 0;
2172 size &= PSEUDOVECTOR_SIZE_MASK;
2174 for (i = 0; i < size; i++)
2176 Lisp_Object v1, v2;
2177 v1 = AREF (o1, i);
2178 v2 = AREF (o2, i);
2179 if (!internal_equal (v1, v2, depth + 1, props, ht))
2180 return 0;
2182 return 1;
2184 break;
2186 case Lisp_String:
2187 if (SCHARS (o1) != SCHARS (o2))
2188 return 0;
2189 if (SBYTES (o1) != SBYTES (o2))
2190 return 0;
2191 if (memcmp (SDATA (o1), SDATA (o2), SBYTES (o1)))
2192 return 0;
2193 if (props && !compare_string_intervals (o1, o2))
2194 return 0;
2195 return 1;
2197 default:
2198 break;
2201 return 0;
2205 DEFUN ("fillarray", Ffillarray, Sfillarray, 2, 2, 0,
2206 doc: /* Store each element of ARRAY with ITEM.
2207 ARRAY is a vector, string, char-table, or bool-vector. */)
2208 (Lisp_Object array, Lisp_Object item)
2210 register ptrdiff_t size, idx;
2212 if (VECTORP (array))
2213 for (idx = 0, size = ASIZE (array); idx < size; idx++)
2214 ASET (array, idx, item);
2215 else if (CHAR_TABLE_P (array))
2217 int i;
2219 for (i = 0; i < (1 << CHARTAB_SIZE_BITS_0); i++)
2220 set_char_table_contents (array, i, item);
2221 set_char_table_defalt (array, item);
2223 else if (STRINGP (array))
2225 register unsigned char *p = SDATA (array);
2226 int charval;
2227 CHECK_CHARACTER (item);
2228 charval = XFASTINT (item);
2229 size = SCHARS (array);
2230 if (STRING_MULTIBYTE (array))
2232 unsigned char str[MAX_MULTIBYTE_LENGTH];
2233 int len = CHAR_STRING (charval, str);
2234 ptrdiff_t size_byte = SBYTES (array);
2236 if (INT_MULTIPLY_OVERFLOW (SCHARS (array), len)
2237 || SCHARS (array) * len != size_byte)
2238 error ("Attempt to change byte length of a string");
2239 for (idx = 0; idx < size_byte; idx++)
2240 *p++ = str[idx % len];
2242 else
2243 for (idx = 0; idx < size; idx++)
2244 p[idx] = charval;
2246 else if (BOOL_VECTOR_P (array))
2247 return bool_vector_fill (array, item);
2248 else
2249 wrong_type_argument (Qarrayp, array);
2250 return array;
2253 DEFUN ("clear-string", Fclear_string, Sclear_string,
2254 1, 1, 0,
2255 doc: /* Clear the contents of STRING.
2256 This makes STRING unibyte and may change its length. */)
2257 (Lisp_Object string)
2259 ptrdiff_t len;
2260 CHECK_STRING (string);
2261 len = SBYTES (string);
2262 memset (SDATA (string), 0, len);
2263 STRING_SET_CHARS (string, len);
2264 STRING_SET_UNIBYTE (string);
2265 return Qnil;
2268 /* ARGSUSED */
2269 Lisp_Object
2270 nconc2 (Lisp_Object s1, Lisp_Object s2)
2272 Lisp_Object args[2];
2273 args[0] = s1;
2274 args[1] = s2;
2275 return Fnconc (2, args);
2278 DEFUN ("nconc", Fnconc, Snconc, 0, MANY, 0,
2279 doc: /* Concatenate any number of lists by altering them.
2280 Only the last argument is not altered, and need not be a list.
2281 usage: (nconc &rest LISTS) */)
2282 (ptrdiff_t nargs, Lisp_Object *args)
2284 ptrdiff_t argnum;
2285 register Lisp_Object tail, tem, val;
2287 val = tail = Qnil;
2289 for (argnum = 0; argnum < nargs; argnum++)
2291 tem = args[argnum];
2292 if (NILP (tem)) continue;
2294 if (NILP (val))
2295 val = tem;
2297 if (argnum + 1 == nargs) break;
2299 CHECK_LIST_CONS (tem, tem);
2301 while (CONSP (tem))
2303 tail = tem;
2304 tem = XCDR (tail);
2305 QUIT;
2308 tem = args[argnum + 1];
2309 Fsetcdr (tail, tem);
2310 if (NILP (tem))
2311 args[argnum + 1] = tail;
2314 return val;
2317 /* This is the guts of all mapping functions.
2318 Apply FN to each element of SEQ, one by one,
2319 storing the results into elements of VALS, a C vector of Lisp_Objects.
2320 LENI is the length of VALS, which should also be the length of SEQ. */
2322 static void
2323 mapcar1 (EMACS_INT leni, Lisp_Object *vals, Lisp_Object fn, Lisp_Object seq)
2325 register Lisp_Object tail;
2326 Lisp_Object dummy;
2327 register EMACS_INT i;
2328 struct gcpro gcpro1, gcpro2, gcpro3;
2330 if (vals)
2332 /* Don't let vals contain any garbage when GC happens. */
2333 for (i = 0; i < leni; i++)
2334 vals[i] = Qnil;
2336 GCPRO3 (dummy, fn, seq);
2337 gcpro1.var = vals;
2338 gcpro1.nvars = leni;
2340 else
2341 GCPRO2 (fn, seq);
2342 /* We need not explicitly protect `tail' because it is used only on lists, and
2343 1) lists are not relocated and 2) the list is marked via `seq' so will not
2344 be freed */
2346 if (VECTORP (seq) || COMPILEDP (seq))
2348 for (i = 0; i < leni; i++)
2350 dummy = call1 (fn, AREF (seq, i));
2351 if (vals)
2352 vals[i] = dummy;
2355 else if (BOOL_VECTOR_P (seq))
2357 for (i = 0; i < leni; i++)
2359 dummy = call1 (fn, bool_vector_ref (seq, i));
2360 if (vals)
2361 vals[i] = dummy;
2364 else if (STRINGP (seq))
2366 ptrdiff_t i_byte;
2368 for (i = 0, i_byte = 0; i < leni;)
2370 int c;
2371 ptrdiff_t i_before = i;
2373 FETCH_STRING_CHAR_ADVANCE (c, seq, i, i_byte);
2374 XSETFASTINT (dummy, c);
2375 dummy = call1 (fn, dummy);
2376 if (vals)
2377 vals[i_before] = dummy;
2380 else /* Must be a list, since Flength did not get an error */
2382 tail = seq;
2383 for (i = 0; i < leni && CONSP (tail); i++)
2385 dummy = call1 (fn, XCAR (tail));
2386 if (vals)
2387 vals[i] = dummy;
2388 tail = XCDR (tail);
2392 UNGCPRO;
2395 DEFUN ("mapconcat", Fmapconcat, Smapconcat, 3, 3, 0,
2396 doc: /* Apply FUNCTION to each element of SEQUENCE, and concat the results as strings.
2397 In between each pair of results, stick in SEPARATOR. Thus, " " as
2398 SEPARATOR results in spaces between the values returned by FUNCTION.
2399 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
2400 (Lisp_Object function, Lisp_Object sequence, Lisp_Object separator)
2402 Lisp_Object len;
2403 register EMACS_INT leni;
2404 EMACS_INT nargs;
2405 ptrdiff_t i;
2406 register Lisp_Object *args;
2407 struct gcpro gcpro1;
2408 Lisp_Object ret;
2409 USE_SAFE_ALLOCA;
2411 len = Flength (sequence);
2412 if (CHAR_TABLE_P (sequence))
2413 wrong_type_argument (Qlistp, sequence);
2414 leni = XINT (len);
2415 nargs = leni + leni - 1;
2416 if (nargs < 0) return empty_unibyte_string;
2418 SAFE_ALLOCA_LISP (args, nargs);
2420 GCPRO1 (separator);
2421 mapcar1 (leni, args, function, sequence);
2422 UNGCPRO;
2424 for (i = leni - 1; i > 0; i--)
2425 args[i + i] = args[i];
2427 for (i = 1; i < nargs; i += 2)
2428 args[i] = separator;
2430 ret = Fconcat (nargs, args);
2431 SAFE_FREE ();
2433 return ret;
2436 DEFUN ("mapcar", Fmapcar, Smapcar, 2, 2, 0,
2437 doc: /* Apply FUNCTION to each element of SEQUENCE, and make a list of the results.
2438 The result is a list just as long as SEQUENCE.
2439 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
2440 (Lisp_Object function, Lisp_Object sequence)
2442 register Lisp_Object len;
2443 register EMACS_INT leni;
2444 register Lisp_Object *args;
2445 Lisp_Object ret;
2446 USE_SAFE_ALLOCA;
2448 len = Flength (sequence);
2449 if (CHAR_TABLE_P (sequence))
2450 wrong_type_argument (Qlistp, sequence);
2451 leni = XFASTINT (len);
2453 SAFE_ALLOCA_LISP (args, leni);
2455 mapcar1 (leni, args, function, sequence);
2457 ret = Flist (leni, args);
2458 SAFE_FREE ();
2460 return ret;
2463 DEFUN ("mapc", Fmapc, Smapc, 2, 2, 0,
2464 doc: /* Apply FUNCTION to each element of SEQUENCE for side effects only.
2465 Unlike `mapcar', don't accumulate the results. Return SEQUENCE.
2466 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
2467 (Lisp_Object function, Lisp_Object sequence)
2469 register EMACS_INT leni;
2471 leni = XFASTINT (Flength (sequence));
2472 if (CHAR_TABLE_P (sequence))
2473 wrong_type_argument (Qlistp, sequence);
2474 mapcar1 (leni, 0, function, sequence);
2476 return sequence;
2479 /* This is how C code calls `yes-or-no-p' and allows the user
2480 to redefined it.
2482 Anything that calls this function must protect from GC! */
2484 Lisp_Object
2485 do_yes_or_no_p (Lisp_Object prompt)
2487 return call1 (intern ("yes-or-no-p"), prompt);
2490 /* Anything that calls this function must protect from GC! */
2492 DEFUN ("yes-or-no-p", Fyes_or_no_p, Syes_or_no_p, 1, 1, 0,
2493 doc: /* Ask user a yes-or-no question.
2494 Return t if answer is yes, and nil if the answer is no.
2495 PROMPT is the string to display to ask the question. It should end in
2496 a space; `yes-or-no-p' adds \"(yes or no) \" to it.
2498 The user must confirm the answer with RET, and can edit it until it
2499 has been confirmed.
2501 If dialog boxes are supported, a dialog box will be used
2502 if `last-nonmenu-event' is nil, and `use-dialog-box' is non-nil. */)
2503 (Lisp_Object prompt)
2505 register Lisp_Object ans;
2506 Lisp_Object args[2];
2507 struct gcpro gcpro1;
2509 CHECK_STRING (prompt);
2511 if ((NILP (last_nonmenu_event) || CONSP (last_nonmenu_event))
2512 && use_dialog_box)
2514 Lisp_Object pane, menu, obj;
2515 redisplay_preserve_echo_area (4);
2516 pane = list2 (Fcons (build_string ("Yes"), Qt),
2517 Fcons (build_string ("No"), Qnil));
2518 GCPRO1 (pane);
2519 menu = Fcons (prompt, pane);
2520 obj = Fx_popup_dialog (Qt, menu, Qnil);
2521 UNGCPRO;
2522 return obj;
2525 args[0] = prompt;
2526 args[1] = build_string ("(yes or no) ");
2527 prompt = Fconcat (2, args);
2529 GCPRO1 (prompt);
2531 while (1)
2533 ans = Fdowncase (Fread_from_minibuffer (prompt, Qnil, Qnil, Qnil,
2534 Qyes_or_no_p_history, Qnil,
2535 Qnil));
2536 if (SCHARS (ans) == 3 && !strcmp (SSDATA (ans), "yes"))
2538 UNGCPRO;
2539 return Qt;
2541 if (SCHARS (ans) == 2 && !strcmp (SSDATA (ans), "no"))
2543 UNGCPRO;
2544 return Qnil;
2547 Fding (Qnil);
2548 Fdiscard_input ();
2549 message1 ("Please answer yes or no.");
2550 Fsleep_for (make_number (2), Qnil);
2554 DEFUN ("load-average", Fload_average, Sload_average, 0, 1, 0,
2555 doc: /* Return list of 1 minute, 5 minute and 15 minute load averages.
2557 Each of the three load averages is multiplied by 100, then converted
2558 to integer.
2560 When USE-FLOATS is non-nil, floats will be used instead of integers.
2561 These floats are not multiplied by 100.
2563 If the 5-minute or 15-minute load averages are not available, return a
2564 shortened list, containing only those averages which are available.
2566 An error is thrown if the load average can't be obtained. In some
2567 cases making it work would require Emacs being installed setuid or
2568 setgid so that it can read kernel information, and that usually isn't
2569 advisable. */)
2570 (Lisp_Object use_floats)
2572 double load_ave[3];
2573 int loads = getloadavg (load_ave, 3);
2574 Lisp_Object ret = Qnil;
2576 if (loads < 0)
2577 error ("load-average not implemented for this operating system");
2579 while (loads-- > 0)
2581 Lisp_Object load = (NILP (use_floats)
2582 ? make_number (100.0 * load_ave[loads])
2583 : make_float (load_ave[loads]));
2584 ret = Fcons (load, ret);
2587 return ret;
2590 static Lisp_Object Qsubfeatures;
2592 DEFUN ("featurep", Ffeaturep, Sfeaturep, 1, 2, 0,
2593 doc: /* Return t if FEATURE is present in this Emacs.
2595 Use this to conditionalize execution of lisp code based on the
2596 presence or absence of Emacs or environment extensions.
2597 Use `provide' to declare that a feature is available. This function
2598 looks at the value of the variable `features'. The optional argument
2599 SUBFEATURE can be used to check a specific subfeature of FEATURE. */)
2600 (Lisp_Object feature, Lisp_Object subfeature)
2602 register Lisp_Object tem;
2603 CHECK_SYMBOL (feature);
2604 tem = Fmemq (feature, Vfeatures);
2605 if (!NILP (tem) && !NILP (subfeature))
2606 tem = Fmember (subfeature, Fget (feature, Qsubfeatures));
2607 return (NILP (tem)) ? Qnil : Qt;
2610 static Lisp_Object Qfuncall;
2612 DEFUN ("provide", Fprovide, Sprovide, 1, 2, 0,
2613 doc: /* Announce that FEATURE is a feature of the current Emacs.
2614 The optional argument SUBFEATURES should be a list of symbols listing
2615 particular subfeatures supported in this version of FEATURE. */)
2616 (Lisp_Object feature, Lisp_Object subfeatures)
2618 register Lisp_Object tem;
2619 CHECK_SYMBOL (feature);
2620 CHECK_LIST (subfeatures);
2621 if (!NILP (Vautoload_queue))
2622 Vautoload_queue = Fcons (Fcons (make_number (0), Vfeatures),
2623 Vautoload_queue);
2624 tem = Fmemq (feature, Vfeatures);
2625 if (NILP (tem))
2626 Vfeatures = Fcons (feature, Vfeatures);
2627 if (!NILP (subfeatures))
2628 Fput (feature, Qsubfeatures, subfeatures);
2629 LOADHIST_ATTACH (Fcons (Qprovide, feature));
2631 /* Run any load-hooks for this file. */
2632 tem = Fassq (feature, Vafter_load_alist);
2633 if (CONSP (tem))
2634 Fmapc (Qfuncall, XCDR (tem));
2636 return feature;
2639 /* `require' and its subroutines. */
2641 /* List of features currently being require'd, innermost first. */
2643 static Lisp_Object require_nesting_list;
2645 static void
2646 require_unwind (Lisp_Object old_value)
2648 require_nesting_list = old_value;
2651 DEFUN ("require", Frequire, Srequire, 1, 3, 0,
2652 doc: /* If feature FEATURE is not loaded, load it from FILENAME.
2653 If FEATURE is not a member of the list `features', then the feature
2654 is not loaded; so load the file FILENAME.
2655 If FILENAME is omitted, the printname of FEATURE is used as the file name,
2656 and `load' will try to load this name appended with the suffix `.elc' or
2657 `.el', in that order. The name without appended suffix will not be used.
2658 See `get-load-suffixes' for the complete list of suffixes.
2659 If the optional third argument NOERROR is non-nil,
2660 then return nil if the file is not found instead of signaling an error.
2661 Normally the return value is FEATURE.
2662 The normal messages at start and end of loading FILENAME are suppressed. */)
2663 (Lisp_Object feature, Lisp_Object filename, Lisp_Object noerror)
2665 Lisp_Object tem;
2666 struct gcpro gcpro1, gcpro2;
2667 bool from_file = load_in_progress;
2669 CHECK_SYMBOL (feature);
2671 /* Record the presence of `require' in this file
2672 even if the feature specified is already loaded.
2673 But not more than once in any file,
2674 and not when we aren't loading or reading from a file. */
2675 if (!from_file)
2676 for (tem = Vcurrent_load_list; CONSP (tem); tem = XCDR (tem))
2677 if (NILP (XCDR (tem)) && STRINGP (XCAR (tem)))
2678 from_file = 1;
2680 if (from_file)
2682 tem = Fcons (Qrequire, feature);
2683 if (NILP (Fmember (tem, Vcurrent_load_list)))
2684 LOADHIST_ATTACH (tem);
2686 tem = Fmemq (feature, Vfeatures);
2688 if (NILP (tem))
2690 ptrdiff_t count = SPECPDL_INDEX ();
2691 int nesting = 0;
2693 /* This is to make sure that loadup.el gives a clear picture
2694 of what files are preloaded and when. */
2695 if (! NILP (Vpurify_flag))
2696 error ("(require %s) while preparing to dump",
2697 SDATA (SYMBOL_NAME (feature)));
2699 /* A certain amount of recursive `require' is legitimate,
2700 but if we require the same feature recursively 3 times,
2701 signal an error. */
2702 tem = require_nesting_list;
2703 while (! NILP (tem))
2705 if (! NILP (Fequal (feature, XCAR (tem))))
2706 nesting++;
2707 tem = XCDR (tem);
2709 if (nesting > 3)
2710 error ("Recursive `require' for feature `%s'",
2711 SDATA (SYMBOL_NAME (feature)));
2713 /* Update the list for any nested `require's that occur. */
2714 record_unwind_protect (require_unwind, require_nesting_list);
2715 require_nesting_list = Fcons (feature, require_nesting_list);
2717 /* Value saved here is to be restored into Vautoload_queue */
2718 record_unwind_protect (un_autoload, Vautoload_queue);
2719 Vautoload_queue = Qt;
2721 /* Load the file. */
2722 GCPRO2 (feature, filename);
2723 tem = Fload (NILP (filename) ? Fsymbol_name (feature) : filename,
2724 noerror, Qt, Qnil, (NILP (filename) ? Qt : Qnil));
2725 UNGCPRO;
2727 /* If load failed entirely, return nil. */
2728 if (NILP (tem))
2729 return unbind_to (count, Qnil);
2731 tem = Fmemq (feature, Vfeatures);
2732 if (NILP (tem))
2733 error ("Required feature `%s' was not provided",
2734 SDATA (SYMBOL_NAME (feature)));
2736 /* Once loading finishes, don't undo it. */
2737 Vautoload_queue = Qt;
2738 feature = unbind_to (count, feature);
2741 return feature;
2744 /* Primitives for work of the "widget" library.
2745 In an ideal world, this section would not have been necessary.
2746 However, lisp function calls being as slow as they are, it turns
2747 out that some functions in the widget library (wid-edit.el) are the
2748 bottleneck of Widget operation. Here is their translation to C,
2749 for the sole reason of efficiency. */
2751 DEFUN ("plist-member", Fplist_member, Splist_member, 2, 2, 0,
2752 doc: /* Return non-nil if PLIST has the property PROP.
2753 PLIST is a property list, which is a list of the form
2754 \(PROP1 VALUE1 PROP2 VALUE2 ...\). PROP is a symbol.
2755 Unlike `plist-get', this allows you to distinguish between a missing
2756 property and a property with the value nil.
2757 The value is actually the tail of PLIST whose car is PROP. */)
2758 (Lisp_Object plist, Lisp_Object prop)
2760 while (CONSP (plist) && !EQ (XCAR (plist), prop))
2762 QUIT;
2763 plist = XCDR (plist);
2764 plist = CDR (plist);
2766 return plist;
2769 DEFUN ("widget-put", Fwidget_put, Swidget_put, 3, 3, 0,
2770 doc: /* In WIDGET, set PROPERTY to VALUE.
2771 The value can later be retrieved with `widget-get'. */)
2772 (Lisp_Object widget, Lisp_Object property, Lisp_Object value)
2774 CHECK_CONS (widget);
2775 XSETCDR (widget, Fplist_put (XCDR (widget), property, value));
2776 return value;
2779 DEFUN ("widget-get", Fwidget_get, Swidget_get, 2, 2, 0,
2780 doc: /* In WIDGET, get the value of PROPERTY.
2781 The value could either be specified when the widget was created, or
2782 later with `widget-put'. */)
2783 (Lisp_Object widget, Lisp_Object property)
2785 Lisp_Object tmp;
2787 while (1)
2789 if (NILP (widget))
2790 return Qnil;
2791 CHECK_CONS (widget);
2792 tmp = Fplist_member (XCDR (widget), property);
2793 if (CONSP (tmp))
2795 tmp = XCDR (tmp);
2796 return CAR (tmp);
2798 tmp = XCAR (widget);
2799 if (NILP (tmp))
2800 return Qnil;
2801 widget = Fget (tmp, Qwidget_type);
2805 DEFUN ("widget-apply", Fwidget_apply, Swidget_apply, 2, MANY, 0,
2806 doc: /* Apply the value of WIDGET's PROPERTY to the widget itself.
2807 ARGS are passed as extra arguments to the function.
2808 usage: (widget-apply WIDGET PROPERTY &rest ARGS) */)
2809 (ptrdiff_t nargs, Lisp_Object *args)
2811 /* This function can GC. */
2812 Lisp_Object newargs[3];
2813 struct gcpro gcpro1, gcpro2;
2814 Lisp_Object result;
2816 newargs[0] = Fwidget_get (args[0], args[1]);
2817 newargs[1] = args[0];
2818 newargs[2] = Flist (nargs - 2, args + 2);
2819 GCPRO2 (newargs[0], newargs[2]);
2820 result = Fapply (3, newargs);
2821 UNGCPRO;
2822 return result;
2825 #ifdef HAVE_LANGINFO_CODESET
2826 #include <langinfo.h>
2827 #endif
2829 DEFUN ("locale-info", Flocale_info, Slocale_info, 1, 1, 0,
2830 doc: /* Access locale data ITEM for the current C locale, if available.
2831 ITEM should be one of the following:
2833 `codeset', returning the character set as a string (locale item CODESET);
2835 `days', returning a 7-element vector of day names (locale items DAY_n);
2837 `months', returning a 12-element vector of month names (locale items MON_n);
2839 `paper', returning a list (WIDTH HEIGHT) for the default paper size,
2840 both measured in millimeters (locale items PAPER_WIDTH, PAPER_HEIGHT).
2842 If the system can't provide such information through a call to
2843 `nl_langinfo', or if ITEM isn't from the list above, return nil.
2845 See also Info node `(libc)Locales'.
2847 The data read from the system are decoded using `locale-coding-system'. */)
2848 (Lisp_Object item)
2850 char *str = NULL;
2851 #ifdef HAVE_LANGINFO_CODESET
2852 Lisp_Object val;
2853 if (EQ (item, Qcodeset))
2855 str = nl_langinfo (CODESET);
2856 return build_string (str);
2858 #ifdef DAY_1
2859 else if (EQ (item, Qdays)) /* e.g. for calendar-day-name-array */
2861 Lisp_Object v = Fmake_vector (make_number (7), Qnil);
2862 const int days[7] = {DAY_1, DAY_2, DAY_3, DAY_4, DAY_5, DAY_6, DAY_7};
2863 int i;
2864 struct gcpro gcpro1;
2865 GCPRO1 (v);
2866 synchronize_system_time_locale ();
2867 for (i = 0; i < 7; i++)
2869 str = nl_langinfo (days[i]);
2870 val = build_unibyte_string (str);
2871 /* Fixme: Is this coding system necessarily right, even if
2872 it is consistent with CODESET? If not, what to do? */
2873 ASET (v, i, code_convert_string_norecord (val, Vlocale_coding_system,
2874 0));
2876 UNGCPRO;
2877 return v;
2879 #endif /* DAY_1 */
2880 #ifdef MON_1
2881 else if (EQ (item, Qmonths)) /* e.g. for calendar-month-name-array */
2883 Lisp_Object v = Fmake_vector (make_number (12), Qnil);
2884 const int months[12] = {MON_1, MON_2, MON_3, MON_4, MON_5, MON_6, MON_7,
2885 MON_8, MON_9, MON_10, MON_11, MON_12};
2886 int i;
2887 struct gcpro gcpro1;
2888 GCPRO1 (v);
2889 synchronize_system_time_locale ();
2890 for (i = 0; i < 12; i++)
2892 str = nl_langinfo (months[i]);
2893 val = build_unibyte_string (str);
2894 ASET (v, i, code_convert_string_norecord (val, Vlocale_coding_system,
2895 0));
2897 UNGCPRO;
2898 return v;
2900 #endif /* MON_1 */
2901 /* LC_PAPER stuff isn't defined as accessible in glibc as of 2.3.1,
2902 but is in the locale files. This could be used by ps-print. */
2903 #ifdef PAPER_WIDTH
2904 else if (EQ (item, Qpaper))
2905 return list2i (nl_langinfo (PAPER_WIDTH), nl_langinfo (PAPER_HEIGHT));
2906 #endif /* PAPER_WIDTH */
2907 #endif /* HAVE_LANGINFO_CODESET*/
2908 return Qnil;
2911 /* base64 encode/decode functions (RFC 2045).
2912 Based on code from GNU recode. */
2914 #define MIME_LINE_LENGTH 76
2916 #define IS_ASCII(Character) \
2917 ((Character) < 128)
2918 #define IS_BASE64(Character) \
2919 (IS_ASCII (Character) && base64_char_to_value[Character] >= 0)
2920 #define IS_BASE64_IGNORABLE(Character) \
2921 ((Character) == ' ' || (Character) == '\t' || (Character) == '\n' \
2922 || (Character) == '\f' || (Character) == '\r')
2924 /* Used by base64_decode_1 to retrieve a non-base64-ignorable
2925 character or return retval if there are no characters left to
2926 process. */
2927 #define READ_QUADRUPLET_BYTE(retval) \
2928 do \
2930 if (i == length) \
2932 if (nchars_return) \
2933 *nchars_return = nchars; \
2934 return (retval); \
2936 c = from[i++]; \
2938 while (IS_BASE64_IGNORABLE (c))
2940 /* Table of characters coding the 64 values. */
2941 static const char base64_value_to_char[64] =
2943 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', /* 0- 9 */
2944 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', /* 10-19 */
2945 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', /* 20-29 */
2946 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', /* 30-39 */
2947 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', /* 40-49 */
2948 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', /* 50-59 */
2949 '8', '9', '+', '/' /* 60-63 */
2952 /* Table of base64 values for first 128 characters. */
2953 static const short base64_char_to_value[128] =
2955 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0- 9 */
2956 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 10- 19 */
2957 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 20- 29 */
2958 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 30- 39 */
2959 -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, /* 40- 49 */
2960 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, /* 50- 59 */
2961 -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, /* 60- 69 */
2962 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, /* 70- 79 */
2963 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, /* 80- 89 */
2964 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, /* 90- 99 */
2965 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, /* 100-109 */
2966 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, /* 110-119 */
2967 49, 50, 51, -1, -1, -1, -1, -1 /* 120-127 */
2970 /* The following diagram shows the logical steps by which three octets
2971 get transformed into four base64 characters.
2973 .--------. .--------. .--------.
2974 |aaaaaabb| |bbbbcccc| |ccdddddd|
2975 `--------' `--------' `--------'
2976 6 2 4 4 2 6
2977 .--------+--------+--------+--------.
2978 |00aaaaaa|00bbbbbb|00cccccc|00dddddd|
2979 `--------+--------+--------+--------'
2981 .--------+--------+--------+--------.
2982 |AAAAAAAA|BBBBBBBB|CCCCCCCC|DDDDDDDD|
2983 `--------+--------+--------+--------'
2985 The octets are divided into 6 bit chunks, which are then encoded into
2986 base64 characters. */
2989 static ptrdiff_t base64_encode_1 (const char *, char *, ptrdiff_t, bool, bool);
2990 static ptrdiff_t base64_decode_1 (const char *, char *, ptrdiff_t, bool,
2991 ptrdiff_t *);
2993 DEFUN ("base64-encode-region", Fbase64_encode_region, Sbase64_encode_region,
2994 2, 3, "r",
2995 doc: /* Base64-encode the region between BEG and END.
2996 Return the length of the encoded text.
2997 Optional third argument NO-LINE-BREAK means do not break long lines
2998 into shorter lines. */)
2999 (Lisp_Object beg, Lisp_Object end, Lisp_Object no_line_break)
3001 char *encoded;
3002 ptrdiff_t allength, length;
3003 ptrdiff_t ibeg, iend, encoded_length;
3004 ptrdiff_t old_pos = PT;
3005 USE_SAFE_ALLOCA;
3007 validate_region (&beg, &end);
3009 ibeg = CHAR_TO_BYTE (XFASTINT (beg));
3010 iend = CHAR_TO_BYTE (XFASTINT (end));
3011 move_gap_both (XFASTINT (beg), ibeg);
3013 /* We need to allocate enough room for encoding the text.
3014 We need 33 1/3% more space, plus a newline every 76
3015 characters, and then we round up. */
3016 length = iend - ibeg;
3017 allength = length + length/3 + 1;
3018 allength += allength / MIME_LINE_LENGTH + 1 + 6;
3020 encoded = SAFE_ALLOCA (allength);
3021 encoded_length = base64_encode_1 ((char *) BYTE_POS_ADDR (ibeg),
3022 encoded, length, NILP (no_line_break),
3023 !NILP (BVAR (current_buffer, enable_multibyte_characters)));
3024 if (encoded_length > allength)
3025 emacs_abort ();
3027 if (encoded_length < 0)
3029 /* The encoding wasn't possible. */
3030 SAFE_FREE ();
3031 error ("Multibyte character in data for base64 encoding");
3034 /* Now we have encoded the region, so we insert the new contents
3035 and delete the old. (Insert first in order to preserve markers.) */
3036 SET_PT_BOTH (XFASTINT (beg), ibeg);
3037 insert (encoded, encoded_length);
3038 SAFE_FREE ();
3039 del_range_byte (ibeg + encoded_length, iend + encoded_length, 1);
3041 /* If point was outside of the region, restore it exactly; else just
3042 move to the beginning of the region. */
3043 if (old_pos >= XFASTINT (end))
3044 old_pos += encoded_length - (XFASTINT (end) - XFASTINT (beg));
3045 else if (old_pos > XFASTINT (beg))
3046 old_pos = XFASTINT (beg);
3047 SET_PT (old_pos);
3049 /* We return the length of the encoded text. */
3050 return make_number (encoded_length);
3053 DEFUN ("base64-encode-string", Fbase64_encode_string, Sbase64_encode_string,
3054 1, 2, 0,
3055 doc: /* Base64-encode STRING and return the result.
3056 Optional second argument NO-LINE-BREAK means do not break long lines
3057 into shorter lines. */)
3058 (Lisp_Object string, Lisp_Object no_line_break)
3060 ptrdiff_t allength, length, encoded_length;
3061 char *encoded;
3062 Lisp_Object encoded_string;
3063 USE_SAFE_ALLOCA;
3065 CHECK_STRING (string);
3067 /* We need to allocate enough room for encoding the text.
3068 We need 33 1/3% more space, plus a newline every 76
3069 characters, and then we round up. */
3070 length = SBYTES (string);
3071 allength = length + length/3 + 1;
3072 allength += allength / MIME_LINE_LENGTH + 1 + 6;
3074 /* We need to allocate enough room for decoding the text. */
3075 encoded = SAFE_ALLOCA (allength);
3077 encoded_length = base64_encode_1 (SSDATA (string),
3078 encoded, length, NILP (no_line_break),
3079 STRING_MULTIBYTE (string));
3080 if (encoded_length > allength)
3081 emacs_abort ();
3083 if (encoded_length < 0)
3085 /* The encoding wasn't possible. */
3086 SAFE_FREE ();
3087 error ("Multibyte character in data for base64 encoding");
3090 encoded_string = make_unibyte_string (encoded, encoded_length);
3091 SAFE_FREE ();
3093 return encoded_string;
3096 static ptrdiff_t
3097 base64_encode_1 (const char *from, char *to, ptrdiff_t length,
3098 bool line_break, bool multibyte)
3100 int counter = 0;
3101 ptrdiff_t i = 0;
3102 char *e = to;
3103 int c;
3104 unsigned int value;
3105 int bytes;
3107 while (i < length)
3109 if (multibyte)
3111 c = STRING_CHAR_AND_LENGTH ((unsigned char *) from + i, bytes);
3112 if (CHAR_BYTE8_P (c))
3113 c = CHAR_TO_BYTE8 (c);
3114 else if (c >= 256)
3115 return -1;
3116 i += bytes;
3118 else
3119 c = from[i++];
3121 /* Wrap line every 76 characters. */
3123 if (line_break)
3125 if (counter < MIME_LINE_LENGTH / 4)
3126 counter++;
3127 else
3129 *e++ = '\n';
3130 counter = 1;
3134 /* Process first byte of a triplet. */
3136 *e++ = base64_value_to_char[0x3f & c >> 2];
3137 value = (0x03 & c) << 4;
3139 /* Process second byte of a triplet. */
3141 if (i == length)
3143 *e++ = base64_value_to_char[value];
3144 *e++ = '=';
3145 *e++ = '=';
3146 break;
3149 if (multibyte)
3151 c = STRING_CHAR_AND_LENGTH ((unsigned char *) from + i, bytes);
3152 if (CHAR_BYTE8_P (c))
3153 c = CHAR_TO_BYTE8 (c);
3154 else if (c >= 256)
3155 return -1;
3156 i += bytes;
3158 else
3159 c = from[i++];
3161 *e++ = base64_value_to_char[value | (0x0f & c >> 4)];
3162 value = (0x0f & c) << 2;
3164 /* Process third byte of a triplet. */
3166 if (i == length)
3168 *e++ = base64_value_to_char[value];
3169 *e++ = '=';
3170 break;
3173 if (multibyte)
3175 c = STRING_CHAR_AND_LENGTH ((unsigned char *) from + i, bytes);
3176 if (CHAR_BYTE8_P (c))
3177 c = CHAR_TO_BYTE8 (c);
3178 else if (c >= 256)
3179 return -1;
3180 i += bytes;
3182 else
3183 c = from[i++];
3185 *e++ = base64_value_to_char[value | (0x03 & c >> 6)];
3186 *e++ = base64_value_to_char[0x3f & c];
3189 return e - to;
3193 DEFUN ("base64-decode-region", Fbase64_decode_region, Sbase64_decode_region,
3194 2, 2, "r",
3195 doc: /* Base64-decode the region between BEG and END.
3196 Return the length of the decoded text.
3197 If the region can't be decoded, signal an error and don't modify the buffer. */)
3198 (Lisp_Object beg, Lisp_Object end)
3200 ptrdiff_t ibeg, iend, length, allength;
3201 char *decoded;
3202 ptrdiff_t old_pos = PT;
3203 ptrdiff_t decoded_length;
3204 ptrdiff_t inserted_chars;
3205 bool multibyte = !NILP (BVAR (current_buffer, enable_multibyte_characters));
3206 USE_SAFE_ALLOCA;
3208 validate_region (&beg, &end);
3210 ibeg = CHAR_TO_BYTE (XFASTINT (beg));
3211 iend = CHAR_TO_BYTE (XFASTINT (end));
3213 length = iend - ibeg;
3215 /* We need to allocate enough room for decoding the text. If we are
3216 working on a multibyte buffer, each decoded code may occupy at
3217 most two bytes. */
3218 allength = multibyte ? length * 2 : length;
3219 decoded = SAFE_ALLOCA (allength);
3221 move_gap_both (XFASTINT (beg), ibeg);
3222 decoded_length = base64_decode_1 ((char *) BYTE_POS_ADDR (ibeg),
3223 decoded, length,
3224 multibyte, &inserted_chars);
3225 if (decoded_length > allength)
3226 emacs_abort ();
3228 if (decoded_length < 0)
3230 /* The decoding wasn't possible. */
3231 SAFE_FREE ();
3232 error ("Invalid base64 data");
3235 /* Now we have decoded the region, so we insert the new contents
3236 and delete the old. (Insert first in order to preserve markers.) */
3237 TEMP_SET_PT_BOTH (XFASTINT (beg), ibeg);
3238 insert_1_both (decoded, inserted_chars, decoded_length, 0, 1, 0);
3239 SAFE_FREE ();
3241 /* Delete the original text. */
3242 del_range_both (PT, PT_BYTE, XFASTINT (end) + inserted_chars,
3243 iend + decoded_length, 1);
3245 /* If point was outside of the region, restore it exactly; else just
3246 move to the beginning of the region. */
3247 if (old_pos >= XFASTINT (end))
3248 old_pos += inserted_chars - (XFASTINT (end) - XFASTINT (beg));
3249 else if (old_pos > XFASTINT (beg))
3250 old_pos = XFASTINT (beg);
3251 SET_PT (old_pos > ZV ? ZV : old_pos);
3253 return make_number (inserted_chars);
3256 DEFUN ("base64-decode-string", Fbase64_decode_string, Sbase64_decode_string,
3257 1, 1, 0,
3258 doc: /* Base64-decode STRING and return the result. */)
3259 (Lisp_Object string)
3261 char *decoded;
3262 ptrdiff_t length, decoded_length;
3263 Lisp_Object decoded_string;
3264 USE_SAFE_ALLOCA;
3266 CHECK_STRING (string);
3268 length = SBYTES (string);
3269 /* We need to allocate enough room for decoding the text. */
3270 decoded = SAFE_ALLOCA (length);
3272 /* The decoded result should be unibyte. */
3273 decoded_length = base64_decode_1 (SSDATA (string), decoded, length,
3274 0, NULL);
3275 if (decoded_length > length)
3276 emacs_abort ();
3277 else if (decoded_length >= 0)
3278 decoded_string = make_unibyte_string (decoded, decoded_length);
3279 else
3280 decoded_string = Qnil;
3282 SAFE_FREE ();
3283 if (!STRINGP (decoded_string))
3284 error ("Invalid base64 data");
3286 return decoded_string;
3289 /* Base64-decode the data at FROM of LENGTH bytes into TO. If
3290 MULTIBYTE, the decoded result should be in multibyte
3291 form. If NCHARS_RETURN is not NULL, store the number of produced
3292 characters in *NCHARS_RETURN. */
3294 static ptrdiff_t
3295 base64_decode_1 (const char *from, char *to, ptrdiff_t length,
3296 bool multibyte, ptrdiff_t *nchars_return)
3298 ptrdiff_t i = 0; /* Used inside READ_QUADRUPLET_BYTE */
3299 char *e = to;
3300 unsigned char c;
3301 unsigned long value;
3302 ptrdiff_t nchars = 0;
3304 while (1)
3306 /* Process first byte of a quadruplet. */
3308 READ_QUADRUPLET_BYTE (e-to);
3310 if (!IS_BASE64 (c))
3311 return -1;
3312 value = base64_char_to_value[c] << 18;
3314 /* Process second byte of a quadruplet. */
3316 READ_QUADRUPLET_BYTE (-1);
3318 if (!IS_BASE64 (c))
3319 return -1;
3320 value |= base64_char_to_value[c] << 12;
3322 c = (unsigned char) (value >> 16);
3323 if (multibyte && c >= 128)
3324 e += BYTE8_STRING (c, e);
3325 else
3326 *e++ = c;
3327 nchars++;
3329 /* Process third byte of a quadruplet. */
3331 READ_QUADRUPLET_BYTE (-1);
3333 if (c == '=')
3335 READ_QUADRUPLET_BYTE (-1);
3337 if (c != '=')
3338 return -1;
3339 continue;
3342 if (!IS_BASE64 (c))
3343 return -1;
3344 value |= base64_char_to_value[c] << 6;
3346 c = (unsigned char) (0xff & value >> 8);
3347 if (multibyte && c >= 128)
3348 e += BYTE8_STRING (c, e);
3349 else
3350 *e++ = c;
3351 nchars++;
3353 /* Process fourth byte of a quadruplet. */
3355 READ_QUADRUPLET_BYTE (-1);
3357 if (c == '=')
3358 continue;
3360 if (!IS_BASE64 (c))
3361 return -1;
3362 value |= base64_char_to_value[c];
3364 c = (unsigned char) (0xff & value);
3365 if (multibyte && c >= 128)
3366 e += BYTE8_STRING (c, e);
3367 else
3368 *e++ = c;
3369 nchars++;
3375 /***********************************************************************
3376 ***** *****
3377 ***** Hash Tables *****
3378 ***** *****
3379 ***********************************************************************/
3381 /* Implemented by gerd@gnu.org. This hash table implementation was
3382 inspired by CMUCL hash tables. */
3384 /* Ideas:
3386 1. For small tables, association lists are probably faster than
3387 hash tables because they have lower overhead.
3389 For uses of hash tables where the O(1) behavior of table
3390 operations is not a requirement, it might therefore be a good idea
3391 not to hash. Instead, we could just do a linear search in the
3392 key_and_value vector of the hash table. This could be done
3393 if a `:linear-search t' argument is given to make-hash-table. */
3396 /* The list of all weak hash tables. Don't staticpro this one. */
3398 static struct Lisp_Hash_Table *weak_hash_tables;
3400 /* Various symbols. */
3402 static Lisp_Object Qhash_table_p;
3403 static Lisp_Object Qkey, Qvalue, Qeql;
3404 Lisp_Object Qeq, Qequal;
3405 Lisp_Object QCtest, QCsize, QCrehash_size, QCrehash_threshold, QCweakness;
3406 static Lisp_Object Qhash_table_test, Qkey_or_value, Qkey_and_value;
3409 /***********************************************************************
3410 Utilities
3411 ***********************************************************************/
3413 static void
3414 CHECK_HASH_TABLE (Lisp_Object x)
3416 CHECK_TYPE (HASH_TABLE_P (x), Qhash_table_p, x);
3419 static void
3420 set_hash_key_and_value (struct Lisp_Hash_Table *h, Lisp_Object key_and_value)
3422 h->key_and_value = key_and_value;
3424 static void
3425 set_hash_next (struct Lisp_Hash_Table *h, Lisp_Object next)
3427 h->next = next;
3429 static void
3430 set_hash_next_slot (struct Lisp_Hash_Table *h, ptrdiff_t idx, Lisp_Object val)
3432 gc_aset (h->next, idx, val);
3434 static void
3435 set_hash_hash (struct Lisp_Hash_Table *h, Lisp_Object hash)
3437 h->hash = hash;
3439 static void
3440 set_hash_hash_slot (struct Lisp_Hash_Table *h, ptrdiff_t idx, Lisp_Object val)
3442 gc_aset (h->hash, idx, val);
3444 static void
3445 set_hash_index (struct Lisp_Hash_Table *h, Lisp_Object index)
3447 h->index = index;
3449 static void
3450 set_hash_index_slot (struct Lisp_Hash_Table *h, ptrdiff_t idx, Lisp_Object val)
3452 gc_aset (h->index, idx, val);
3455 /* If OBJ is a Lisp hash table, return a pointer to its struct
3456 Lisp_Hash_Table. Otherwise, signal an error. */
3458 static struct Lisp_Hash_Table *
3459 check_hash_table (Lisp_Object obj)
3461 CHECK_HASH_TABLE (obj);
3462 return XHASH_TABLE (obj);
3466 /* Value is the next integer I >= N, N >= 0 which is "almost" a prime
3467 number. A number is "almost" a prime number if it is not divisible
3468 by any integer in the range 2 .. (NEXT_ALMOST_PRIME_LIMIT - 1). */
3470 EMACS_INT
3471 next_almost_prime (EMACS_INT n)
3473 verify (NEXT_ALMOST_PRIME_LIMIT == 11);
3474 for (n |= 1; ; n += 2)
3475 if (n % 3 != 0 && n % 5 != 0 && n % 7 != 0)
3476 return n;
3480 /* Find KEY in ARGS which has size NARGS. Don't consider indices for
3481 which USED[I] is non-zero. If found at index I in ARGS, set
3482 USED[I] and USED[I + 1] to 1, and return I + 1. Otherwise return
3483 0. This function is used to extract a keyword/argument pair from
3484 a DEFUN parameter list. */
3486 static ptrdiff_t
3487 get_key_arg (Lisp_Object key, ptrdiff_t nargs, Lisp_Object *args, char *used)
3489 ptrdiff_t i;
3491 for (i = 1; i < nargs; i++)
3492 if (!used[i - 1] && EQ (args[i - 1], key))
3494 used[i - 1] = 1;
3495 used[i] = 1;
3496 return i;
3499 return 0;
3503 /* Return a Lisp vector which has the same contents as VEC but has
3504 at least INCR_MIN more entries, where INCR_MIN is positive.
3505 If NITEMS_MAX is not -1, do not grow the vector to be any larger
3506 than NITEMS_MAX. Entries in the resulting
3507 vector that are not copied from VEC are set to nil. */
3509 Lisp_Object
3510 larger_vector (Lisp_Object vec, ptrdiff_t incr_min, ptrdiff_t nitems_max)
3512 struct Lisp_Vector *v;
3513 ptrdiff_t i, incr, incr_max, old_size, new_size;
3514 ptrdiff_t C_language_max = min (PTRDIFF_MAX, SIZE_MAX) / sizeof *v->contents;
3515 ptrdiff_t n_max = (0 <= nitems_max && nitems_max < C_language_max
3516 ? nitems_max : C_language_max);
3517 eassert (VECTORP (vec));
3518 eassert (0 < incr_min && -1 <= nitems_max);
3519 old_size = ASIZE (vec);
3520 incr_max = n_max - old_size;
3521 incr = max (incr_min, min (old_size >> 1, incr_max));
3522 if (incr_max < incr)
3523 memory_full (SIZE_MAX);
3524 new_size = old_size + incr;
3525 v = allocate_vector (new_size);
3526 memcpy (v->contents, XVECTOR (vec)->contents, old_size * sizeof *v->contents);
3527 for (i = old_size; i < new_size; ++i)
3528 v->contents[i] = Qnil;
3529 XSETVECTOR (vec, v);
3530 return vec;
3534 /***********************************************************************
3535 Low-level Functions
3536 ***********************************************************************/
3538 static struct hash_table_test hashtest_eq;
3539 struct hash_table_test hashtest_eql, hashtest_equal;
3541 /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code
3542 HASH2 in hash table H using `eql'. Value is true if KEY1 and
3543 KEY2 are the same. */
3545 static bool
3546 cmpfn_eql (struct hash_table_test *ht,
3547 Lisp_Object key1,
3548 Lisp_Object key2)
3550 return (FLOATP (key1)
3551 && FLOATP (key2)
3552 && XFLOAT_DATA (key1) == XFLOAT_DATA (key2));
3556 /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code
3557 HASH2 in hash table H using `equal'. Value is true if KEY1 and
3558 KEY2 are the same. */
3560 static bool
3561 cmpfn_equal (struct hash_table_test *ht,
3562 Lisp_Object key1,
3563 Lisp_Object key2)
3565 return !NILP (Fequal (key1, key2));
3569 /* Compare KEY1 which has hash code HASH1, and KEY2 with hash code
3570 HASH2 in hash table H using H->user_cmp_function. Value is true
3571 if KEY1 and KEY2 are the same. */
3573 static bool
3574 cmpfn_user_defined (struct hash_table_test *ht,
3575 Lisp_Object key1,
3576 Lisp_Object key2)
3578 Lisp_Object args[3];
3580 args[0] = ht->user_cmp_function;
3581 args[1] = key1;
3582 args[2] = key2;
3583 return !NILP (Ffuncall (3, args));
3587 /* Value is a hash code for KEY for use in hash table H which uses
3588 `eq' to compare keys. The hash code returned is guaranteed to fit
3589 in a Lisp integer. */
3591 static EMACS_UINT
3592 hashfn_eq (struct hash_table_test *ht, Lisp_Object key)
3594 EMACS_UINT hash = XHASH (key) ^ XTYPE (key);
3595 return hash;
3598 /* Value is a hash code for KEY for use in hash table H which uses
3599 `eql' to compare keys. The hash code returned is guaranteed to fit
3600 in a Lisp integer. */
3602 static EMACS_UINT
3603 hashfn_eql (struct hash_table_test *ht, Lisp_Object key)
3605 EMACS_UINT hash;
3606 if (FLOATP (key))
3607 hash = sxhash (key, 0);
3608 else
3609 hash = XHASH (key) ^ XTYPE (key);
3610 return hash;
3613 /* Value is a hash code for KEY for use in hash table H which uses
3614 `equal' to compare keys. The hash code returned is guaranteed to fit
3615 in a Lisp integer. */
3617 static EMACS_UINT
3618 hashfn_equal (struct hash_table_test *ht, Lisp_Object key)
3620 EMACS_UINT hash = sxhash (key, 0);
3621 return hash;
3624 /* Value is a hash code for KEY for use in hash table H which uses as
3625 user-defined function to compare keys. The hash code returned is
3626 guaranteed to fit in a Lisp integer. */
3628 static EMACS_UINT
3629 hashfn_user_defined (struct hash_table_test *ht, Lisp_Object key)
3631 Lisp_Object args[2], hash;
3633 args[0] = ht->user_hash_function;
3634 args[1] = key;
3635 hash = Ffuncall (2, args);
3636 return hashfn_eq (ht, hash);
3639 /* An upper bound on the size of a hash table index. It must fit in
3640 ptrdiff_t and be a valid Emacs fixnum. */
3641 #define INDEX_SIZE_BOUND \
3642 ((ptrdiff_t) min (MOST_POSITIVE_FIXNUM, PTRDIFF_MAX / word_size))
3644 /* Create and initialize a new hash table.
3646 TEST specifies the test the hash table will use to compare keys.
3647 It must be either one of the predefined tests `eq', `eql' or
3648 `equal' or a symbol denoting a user-defined test named TEST with
3649 test and hash functions USER_TEST and USER_HASH.
3651 Give the table initial capacity SIZE, SIZE >= 0, an integer.
3653 If REHASH_SIZE is an integer, it must be > 0, and this hash table's
3654 new size when it becomes full is computed by adding REHASH_SIZE to
3655 its old size. If REHASH_SIZE is a float, it must be > 1.0, and the
3656 table's new size is computed by multiplying its old size with
3657 REHASH_SIZE.
3659 REHASH_THRESHOLD must be a float <= 1.0, and > 0. The table will
3660 be resized when the ratio of (number of entries in the table) /
3661 (table size) is >= REHASH_THRESHOLD.
3663 WEAK specifies the weakness of the table. If non-nil, it must be
3664 one of the symbols `key', `value', `key-or-value', or `key-and-value'. */
3666 Lisp_Object
3667 make_hash_table (struct hash_table_test test,
3668 Lisp_Object size, Lisp_Object rehash_size,
3669 Lisp_Object rehash_threshold, Lisp_Object weak)
3671 struct Lisp_Hash_Table *h;
3672 Lisp_Object table;
3673 EMACS_INT index_size, sz;
3674 ptrdiff_t i;
3675 double index_float;
3677 /* Preconditions. */
3678 eassert (SYMBOLP (test.name));
3679 eassert (INTEGERP (size) && XINT (size) >= 0);
3680 eassert ((INTEGERP (rehash_size) && XINT (rehash_size) > 0)
3681 || (FLOATP (rehash_size) && 1 < XFLOAT_DATA (rehash_size)));
3682 eassert (FLOATP (rehash_threshold)
3683 && 0 < XFLOAT_DATA (rehash_threshold)
3684 && XFLOAT_DATA (rehash_threshold) <= 1.0);
3686 if (XFASTINT (size) == 0)
3687 size = make_number (1);
3689 sz = XFASTINT (size);
3690 index_float = sz / XFLOAT_DATA (rehash_threshold);
3691 index_size = (index_float < INDEX_SIZE_BOUND + 1
3692 ? next_almost_prime (index_float)
3693 : INDEX_SIZE_BOUND + 1);
3694 if (INDEX_SIZE_BOUND < max (index_size, 2 * sz))
3695 error ("Hash table too large");
3697 /* Allocate a table and initialize it. */
3698 h = allocate_hash_table ();
3700 /* Initialize hash table slots. */
3701 h->test = test;
3702 h->weak = weak;
3703 h->rehash_threshold = rehash_threshold;
3704 h->rehash_size = rehash_size;
3705 h->count = 0;
3706 h->key_and_value = Fmake_vector (make_number (2 * sz), Qnil);
3707 h->hash = Fmake_vector (size, Qnil);
3708 h->next = Fmake_vector (size, Qnil);
3709 h->index = Fmake_vector (make_number (index_size), Qnil);
3711 /* Set up the free list. */
3712 for (i = 0; i < sz - 1; ++i)
3713 set_hash_next_slot (h, i, make_number (i + 1));
3714 h->next_free = make_number (0);
3716 XSET_HASH_TABLE (table, h);
3717 eassert (HASH_TABLE_P (table));
3718 eassert (XHASH_TABLE (table) == h);
3720 /* Maybe add this hash table to the list of all weak hash tables. */
3721 if (NILP (h->weak))
3722 h->next_weak = NULL;
3723 else
3725 h->next_weak = weak_hash_tables;
3726 weak_hash_tables = h;
3729 return table;
3733 /* Return a copy of hash table H1. Keys and values are not copied,
3734 only the table itself is. */
3736 static Lisp_Object
3737 copy_hash_table (struct Lisp_Hash_Table *h1)
3739 Lisp_Object table;
3740 struct Lisp_Hash_Table *h2;
3742 h2 = allocate_hash_table ();
3743 *h2 = *h1;
3744 h2->key_and_value = Fcopy_sequence (h1->key_and_value);
3745 h2->hash = Fcopy_sequence (h1->hash);
3746 h2->next = Fcopy_sequence (h1->next);
3747 h2->index = Fcopy_sequence (h1->index);
3748 XSET_HASH_TABLE (table, h2);
3750 /* Maybe add this hash table to the list of all weak hash tables. */
3751 if (!NILP (h2->weak))
3753 h2->next_weak = weak_hash_tables;
3754 weak_hash_tables = h2;
3757 return table;
3761 /* Resize hash table H if it's too full. If H cannot be resized
3762 because it's already too large, throw an error. */
3764 static void
3765 maybe_resize_hash_table (struct Lisp_Hash_Table *h)
3767 if (NILP (h->next_free))
3769 ptrdiff_t old_size = HASH_TABLE_SIZE (h);
3770 EMACS_INT new_size, index_size, nsize;
3771 ptrdiff_t i;
3772 double index_float;
3774 if (INTEGERP (h->rehash_size))
3775 new_size = old_size + XFASTINT (h->rehash_size);
3776 else
3778 double float_new_size = old_size * XFLOAT_DATA (h->rehash_size);
3779 if (float_new_size < INDEX_SIZE_BOUND + 1)
3781 new_size = float_new_size;
3782 if (new_size <= old_size)
3783 new_size = old_size + 1;
3785 else
3786 new_size = INDEX_SIZE_BOUND + 1;
3788 index_float = new_size / XFLOAT_DATA (h->rehash_threshold);
3789 index_size = (index_float < INDEX_SIZE_BOUND + 1
3790 ? next_almost_prime (index_float)
3791 : INDEX_SIZE_BOUND + 1);
3792 nsize = max (index_size, 2 * new_size);
3793 if (INDEX_SIZE_BOUND < nsize)
3794 error ("Hash table too large to resize");
3796 #ifdef ENABLE_CHECKING
3797 if (HASH_TABLE_P (Vpurify_flag)
3798 && XHASH_TABLE (Vpurify_flag) == h)
3800 Lisp_Object args[2];
3801 args[0] = build_string ("Growing hash table to: %d");
3802 args[1] = make_number (new_size);
3803 Fmessage (2, args);
3805 #endif
3807 set_hash_key_and_value (h, larger_vector (h->key_and_value,
3808 2 * (new_size - old_size), -1));
3809 set_hash_next (h, larger_vector (h->next, new_size - old_size, -1));
3810 set_hash_hash (h, larger_vector (h->hash, new_size - old_size, -1));
3811 set_hash_index (h, Fmake_vector (make_number (index_size), Qnil));
3813 /* Update the free list. Do it so that new entries are added at
3814 the end of the free list. This makes some operations like
3815 maphash faster. */
3816 for (i = old_size; i < new_size - 1; ++i)
3817 set_hash_next_slot (h, i, make_number (i + 1));
3819 if (!NILP (h->next_free))
3821 Lisp_Object last, next;
3823 last = h->next_free;
3824 while (next = HASH_NEXT (h, XFASTINT (last)),
3825 !NILP (next))
3826 last = next;
3828 set_hash_next_slot (h, XFASTINT (last), make_number (old_size));
3830 else
3831 XSETFASTINT (h->next_free, old_size);
3833 /* Rehash. */
3834 for (i = 0; i < old_size; ++i)
3835 if (!NILP (HASH_HASH (h, i)))
3837 EMACS_UINT hash_code = XUINT (HASH_HASH (h, i));
3838 ptrdiff_t start_of_bucket = hash_code % ASIZE (h->index);
3839 set_hash_next_slot (h, i, HASH_INDEX (h, start_of_bucket));
3840 set_hash_index_slot (h, start_of_bucket, make_number (i));
3846 /* Lookup KEY in hash table H. If HASH is non-null, return in *HASH
3847 the hash code of KEY. Value is the index of the entry in H
3848 matching KEY, or -1 if not found. */
3850 ptrdiff_t
3851 hash_lookup (struct Lisp_Hash_Table *h, Lisp_Object key, EMACS_UINT *hash)
3853 EMACS_UINT hash_code;
3854 ptrdiff_t start_of_bucket;
3855 Lisp_Object idx;
3857 hash_code = h->test.hashfn (&h->test, key);
3858 eassert ((hash_code & ~INTMASK) == 0);
3859 if (hash)
3860 *hash = hash_code;
3862 start_of_bucket = hash_code % ASIZE (h->index);
3863 idx = HASH_INDEX (h, start_of_bucket);
3865 /* We need not gcpro idx since it's either an integer or nil. */
3866 while (!NILP (idx))
3868 ptrdiff_t i = XFASTINT (idx);
3869 if (EQ (key, HASH_KEY (h, i))
3870 || (h->test.cmpfn
3871 && hash_code == XUINT (HASH_HASH (h, i))
3872 && h->test.cmpfn (&h->test, key, HASH_KEY (h, i))))
3873 break;
3874 idx = HASH_NEXT (h, i);
3877 return NILP (idx) ? -1 : XFASTINT (idx);
3881 /* Put an entry into hash table H that associates KEY with VALUE.
3882 HASH is a previously computed hash code of KEY.
3883 Value is the index of the entry in H matching KEY. */
3885 ptrdiff_t
3886 hash_put (struct Lisp_Hash_Table *h, Lisp_Object key, Lisp_Object value,
3887 EMACS_UINT hash)
3889 ptrdiff_t start_of_bucket, i;
3891 eassert ((hash & ~INTMASK) == 0);
3893 /* Increment count after resizing because resizing may fail. */
3894 maybe_resize_hash_table (h);
3895 h->count++;
3897 /* Store key/value in the key_and_value vector. */
3898 i = XFASTINT (h->next_free);
3899 h->next_free = HASH_NEXT (h, i);
3900 set_hash_key_slot (h, i, key);
3901 set_hash_value_slot (h, i, value);
3903 /* Remember its hash code. */
3904 set_hash_hash_slot (h, i, make_number (hash));
3906 /* Add new entry to its collision chain. */
3907 start_of_bucket = hash % ASIZE (h->index);
3908 set_hash_next_slot (h, i, HASH_INDEX (h, start_of_bucket));
3909 set_hash_index_slot (h, start_of_bucket, make_number (i));
3910 return i;
3914 /* Remove the entry matching KEY from hash table H, if there is one. */
3916 static void
3917 hash_remove_from_table (struct Lisp_Hash_Table *h, Lisp_Object key)
3919 EMACS_UINT hash_code;
3920 ptrdiff_t start_of_bucket;
3921 Lisp_Object idx, prev;
3923 hash_code = h->test.hashfn (&h->test, key);
3924 eassert ((hash_code & ~INTMASK) == 0);
3925 start_of_bucket = hash_code % ASIZE (h->index);
3926 idx = HASH_INDEX (h, start_of_bucket);
3927 prev = Qnil;
3929 /* We need not gcpro idx, prev since they're either integers or nil. */
3930 while (!NILP (idx))
3932 ptrdiff_t i = XFASTINT (idx);
3934 if (EQ (key, HASH_KEY (h, i))
3935 || (h->test.cmpfn
3936 && hash_code == XUINT (HASH_HASH (h, i))
3937 && h->test.cmpfn (&h->test, key, HASH_KEY (h, i))))
3939 /* Take entry out of collision chain. */
3940 if (NILP (prev))
3941 set_hash_index_slot (h, start_of_bucket, HASH_NEXT (h, i));
3942 else
3943 set_hash_next_slot (h, XFASTINT (prev), HASH_NEXT (h, i));
3945 /* Clear slots in key_and_value and add the slots to
3946 the free list. */
3947 set_hash_key_slot (h, i, Qnil);
3948 set_hash_value_slot (h, i, Qnil);
3949 set_hash_hash_slot (h, i, Qnil);
3950 set_hash_next_slot (h, i, h->next_free);
3951 h->next_free = make_number (i);
3952 h->count--;
3953 eassert (h->count >= 0);
3954 break;
3956 else
3958 prev = idx;
3959 idx = HASH_NEXT (h, i);
3965 /* Clear hash table H. */
3967 static void
3968 hash_clear (struct Lisp_Hash_Table *h)
3970 if (h->count > 0)
3972 ptrdiff_t i, size = HASH_TABLE_SIZE (h);
3974 for (i = 0; i < size; ++i)
3976 set_hash_next_slot (h, i, i < size - 1 ? make_number (i + 1) : Qnil);
3977 set_hash_key_slot (h, i, Qnil);
3978 set_hash_value_slot (h, i, Qnil);
3979 set_hash_hash_slot (h, i, Qnil);
3982 for (i = 0; i < ASIZE (h->index); ++i)
3983 ASET (h->index, i, Qnil);
3985 h->next_free = make_number (0);
3986 h->count = 0;
3992 /************************************************************************
3993 Weak Hash Tables
3994 ************************************************************************/
3996 /* Sweep weak hash table H. REMOVE_ENTRIES_P means remove
3997 entries from the table that don't survive the current GC.
3998 !REMOVE_ENTRIES_P means mark entries that are in use. Value is
3999 true if anything was marked. */
4001 static bool
4002 sweep_weak_table (struct Lisp_Hash_Table *h, bool remove_entries_p)
4004 ptrdiff_t bucket, n;
4005 bool marked;
4007 n = ASIZE (h->index) & ~ARRAY_MARK_FLAG;
4008 marked = 0;
4010 for (bucket = 0; bucket < n; ++bucket)
4012 Lisp_Object idx, next, prev;
4014 /* Follow collision chain, removing entries that
4015 don't survive this garbage collection. */
4016 prev = Qnil;
4017 for (idx = HASH_INDEX (h, bucket); !NILP (idx); idx = next)
4019 ptrdiff_t i = XFASTINT (idx);
4020 bool key_known_to_survive_p = survives_gc_p (HASH_KEY (h, i));
4021 bool value_known_to_survive_p = survives_gc_p (HASH_VALUE (h, i));
4022 bool remove_p;
4024 if (EQ (h->weak, Qkey))
4025 remove_p = !key_known_to_survive_p;
4026 else if (EQ (h->weak, Qvalue))
4027 remove_p = !value_known_to_survive_p;
4028 else if (EQ (h->weak, Qkey_or_value))
4029 remove_p = !(key_known_to_survive_p || value_known_to_survive_p);
4030 else if (EQ (h->weak, Qkey_and_value))
4031 remove_p = !(key_known_to_survive_p && value_known_to_survive_p);
4032 else
4033 emacs_abort ();
4035 next = HASH_NEXT (h, i);
4037 if (remove_entries_p)
4039 if (remove_p)
4041 /* Take out of collision chain. */
4042 if (NILP (prev))
4043 set_hash_index_slot (h, bucket, next);
4044 else
4045 set_hash_next_slot (h, XFASTINT (prev), next);
4047 /* Add to free list. */
4048 set_hash_next_slot (h, i, h->next_free);
4049 h->next_free = idx;
4051 /* Clear key, value, and hash. */
4052 set_hash_key_slot (h, i, Qnil);
4053 set_hash_value_slot (h, i, Qnil);
4054 set_hash_hash_slot (h, i, Qnil);
4056 h->count--;
4058 else
4060 prev = idx;
4063 else
4065 if (!remove_p)
4067 /* Make sure key and value survive. */
4068 if (!key_known_to_survive_p)
4070 mark_object (HASH_KEY (h, i));
4071 marked = 1;
4074 if (!value_known_to_survive_p)
4076 mark_object (HASH_VALUE (h, i));
4077 marked = 1;
4084 return marked;
4087 /* Remove elements from weak hash tables that don't survive the
4088 current garbage collection. Remove weak tables that don't survive
4089 from Vweak_hash_tables. Called from gc_sweep. */
4091 NO_INLINE /* For better stack traces */
4092 void
4093 sweep_weak_hash_tables (void)
4095 struct Lisp_Hash_Table *h, *used, *next;
4096 bool marked;
4098 /* Mark all keys and values that are in use. Keep on marking until
4099 there is no more change. This is necessary for cases like
4100 value-weak table A containing an entry X -> Y, where Y is used in a
4101 key-weak table B, Z -> Y. If B comes after A in the list of weak
4102 tables, X -> Y might be removed from A, although when looking at B
4103 one finds that it shouldn't. */
4106 marked = 0;
4107 for (h = weak_hash_tables; h; h = h->next_weak)
4109 if (h->header.size & ARRAY_MARK_FLAG)
4110 marked |= sweep_weak_table (h, 0);
4113 while (marked);
4115 /* Remove tables and entries that aren't used. */
4116 for (h = weak_hash_tables, used = NULL; h; h = next)
4118 next = h->next_weak;
4120 if (h->header.size & ARRAY_MARK_FLAG)
4122 /* TABLE is marked as used. Sweep its contents. */
4123 if (h->count > 0)
4124 sweep_weak_table (h, 1);
4126 /* Add table to the list of used weak hash tables. */
4127 h->next_weak = used;
4128 used = h;
4132 weak_hash_tables = used;
4137 /***********************************************************************
4138 Hash Code Computation
4139 ***********************************************************************/
4141 /* Maximum depth up to which to dive into Lisp structures. */
4143 #define SXHASH_MAX_DEPTH 3
4145 /* Maximum length up to which to take list and vector elements into
4146 account. */
4148 #define SXHASH_MAX_LEN 7
4150 /* Return a hash for string PTR which has length LEN. The hash value
4151 can be any EMACS_UINT value. */
4153 EMACS_UINT
4154 hash_string (char const *ptr, ptrdiff_t len)
4156 char const *p = ptr;
4157 char const *end = p + len;
4158 unsigned char c;
4159 EMACS_UINT hash = 0;
4161 while (p != end)
4163 c = *p++;
4164 hash = sxhash_combine (hash, c);
4167 return hash;
4170 /* Return a hash for string PTR which has length LEN. The hash
4171 code returned is guaranteed to fit in a Lisp integer. */
4173 static EMACS_UINT
4174 sxhash_string (char const *ptr, ptrdiff_t len)
4176 EMACS_UINT hash = hash_string (ptr, len);
4177 return SXHASH_REDUCE (hash);
4180 /* Return a hash for the floating point value VAL. */
4182 static EMACS_UINT
4183 sxhash_float (double val)
4185 EMACS_UINT hash = 0;
4186 enum {
4187 WORDS_PER_DOUBLE = (sizeof val / sizeof hash
4188 + (sizeof val % sizeof hash != 0))
4190 union {
4191 double val;
4192 EMACS_UINT word[WORDS_PER_DOUBLE];
4193 } u;
4194 int i;
4195 u.val = val;
4196 memset (&u.val + 1, 0, sizeof u - sizeof u.val);
4197 for (i = 0; i < WORDS_PER_DOUBLE; i++)
4198 hash = sxhash_combine (hash, u.word[i]);
4199 return SXHASH_REDUCE (hash);
4202 /* Return a hash for list LIST. DEPTH is the current depth in the
4203 list. We don't recurse deeper than SXHASH_MAX_DEPTH in it. */
4205 static EMACS_UINT
4206 sxhash_list (Lisp_Object list, int depth)
4208 EMACS_UINT hash = 0;
4209 int i;
4211 if (depth < SXHASH_MAX_DEPTH)
4212 for (i = 0;
4213 CONSP (list) && i < SXHASH_MAX_LEN;
4214 list = XCDR (list), ++i)
4216 EMACS_UINT hash2 = sxhash (XCAR (list), depth + 1);
4217 hash = sxhash_combine (hash, hash2);
4220 if (!NILP (list))
4222 EMACS_UINT hash2 = sxhash (list, depth + 1);
4223 hash = sxhash_combine (hash, hash2);
4226 return SXHASH_REDUCE (hash);
4230 /* Return a hash for vector VECTOR. DEPTH is the current depth in
4231 the Lisp structure. */
4233 static EMACS_UINT
4234 sxhash_vector (Lisp_Object vec, int depth)
4236 EMACS_UINT hash = ASIZE (vec);
4237 int i, n;
4239 n = min (SXHASH_MAX_LEN, ASIZE (vec));
4240 for (i = 0; i < n; ++i)
4242 EMACS_UINT hash2 = sxhash (AREF (vec, i), depth + 1);
4243 hash = sxhash_combine (hash, hash2);
4246 return SXHASH_REDUCE (hash);
4249 /* Return a hash for bool-vector VECTOR. */
4251 static EMACS_UINT
4252 sxhash_bool_vector (Lisp_Object vec)
4254 EMACS_INT size = bool_vector_size (vec);
4255 EMACS_UINT hash = size;
4256 int i, n;
4258 n = min (SXHASH_MAX_LEN, bool_vector_words (size));
4259 for (i = 0; i < n; ++i)
4260 hash = sxhash_combine (hash, bool_vector_data (vec)[i]);
4262 return SXHASH_REDUCE (hash);
4266 /* Return a hash code for OBJ. DEPTH is the current depth in the Lisp
4267 structure. Value is an unsigned integer clipped to INTMASK. */
4269 EMACS_UINT
4270 sxhash (Lisp_Object obj, int depth)
4272 EMACS_UINT hash;
4274 if (depth > SXHASH_MAX_DEPTH)
4275 return 0;
4277 switch (XTYPE (obj))
4279 case_Lisp_Int:
4280 hash = XUINT (obj);
4281 break;
4283 case Lisp_Misc:
4284 hash = XHASH (obj);
4285 break;
4287 case Lisp_Symbol:
4288 obj = SYMBOL_NAME (obj);
4289 /* Fall through. */
4291 case Lisp_String:
4292 hash = sxhash_string (SSDATA (obj), SBYTES (obj));
4293 break;
4295 /* This can be everything from a vector to an overlay. */
4296 case Lisp_Vectorlike:
4297 if (VECTORP (obj))
4298 /* According to the CL HyperSpec, two arrays are equal only if
4299 they are `eq', except for strings and bit-vectors. In
4300 Emacs, this works differently. We have to compare element
4301 by element. */
4302 hash = sxhash_vector (obj, depth);
4303 else if (BOOL_VECTOR_P (obj))
4304 hash = sxhash_bool_vector (obj);
4305 else
4306 /* Others are `equal' if they are `eq', so let's take their
4307 address as hash. */
4308 hash = XHASH (obj);
4309 break;
4311 case Lisp_Cons:
4312 hash = sxhash_list (obj, depth);
4313 break;
4315 case Lisp_Float:
4316 hash = sxhash_float (XFLOAT_DATA (obj));
4317 break;
4319 default:
4320 emacs_abort ();
4323 return hash;
4328 /***********************************************************************
4329 Lisp Interface
4330 ***********************************************************************/
4333 DEFUN ("sxhash", Fsxhash, Ssxhash, 1, 1, 0,
4334 doc: /* Compute a hash code for OBJ and return it as integer. */)
4335 (Lisp_Object obj)
4337 EMACS_UINT hash = sxhash (obj, 0);
4338 return make_number (hash);
4342 DEFUN ("make-hash-table", Fmake_hash_table, Smake_hash_table, 0, MANY, 0,
4343 doc: /* Create and return a new hash table.
4345 Arguments are specified as keyword/argument pairs. The following
4346 arguments are defined:
4348 :test TEST -- TEST must be a symbol that specifies how to compare
4349 keys. Default is `eql'. Predefined are the tests `eq', `eql', and
4350 `equal'. User-supplied test and hash functions can be specified via
4351 `define-hash-table-test'.
4353 :size SIZE -- A hint as to how many elements will be put in the table.
4354 Default is 65.
4356 :rehash-size REHASH-SIZE - Indicates how to expand the table when it
4357 fills up. If REHASH-SIZE is an integer, increase the size by that
4358 amount. If it is a float, it must be > 1.0, and the new size is the
4359 old size multiplied by that factor. Default is 1.5.
4361 :rehash-threshold THRESHOLD -- THRESHOLD must a float > 0, and <= 1.0.
4362 Resize the hash table when the ratio (number of entries / table size)
4363 is greater than or equal to THRESHOLD. Default is 0.8.
4365 :weakness WEAK -- WEAK must be one of nil, t, `key', `value',
4366 `key-or-value', or `key-and-value'. If WEAK is not nil, the table
4367 returned is a weak table. Key/value pairs are removed from a weak
4368 hash table when there are no non-weak references pointing to their
4369 key, value, one of key or value, or both key and value, depending on
4370 WEAK. WEAK t is equivalent to `key-and-value'. Default value of WEAK
4371 is nil.
4373 usage: (make-hash-table &rest KEYWORD-ARGS) */)
4374 (ptrdiff_t nargs, Lisp_Object *args)
4376 Lisp_Object test, size, rehash_size, rehash_threshold, weak;
4377 struct hash_table_test testdesc;
4378 char *used;
4379 ptrdiff_t i;
4381 /* The vector `used' is used to keep track of arguments that
4382 have been consumed. */
4383 used = alloca (nargs * sizeof *used);
4384 memset (used, 0, nargs * sizeof *used);
4386 /* See if there's a `:test TEST' among the arguments. */
4387 i = get_key_arg (QCtest, nargs, args, used);
4388 test = i ? args[i] : Qeql;
4389 if (EQ (test, Qeq))
4390 testdesc = hashtest_eq;
4391 else if (EQ (test, Qeql))
4392 testdesc = hashtest_eql;
4393 else if (EQ (test, Qequal))
4394 testdesc = hashtest_equal;
4395 else
4397 /* See if it is a user-defined test. */
4398 Lisp_Object prop;
4400 prop = Fget (test, Qhash_table_test);
4401 if (!CONSP (prop) || !CONSP (XCDR (prop)))
4402 signal_error ("Invalid hash table test", test);
4403 testdesc.name = test;
4404 testdesc.user_cmp_function = XCAR (prop);
4405 testdesc.user_hash_function = XCAR (XCDR (prop));
4406 testdesc.hashfn = hashfn_user_defined;
4407 testdesc.cmpfn = cmpfn_user_defined;
4410 /* See if there's a `:size SIZE' argument. */
4411 i = get_key_arg (QCsize, nargs, args, used);
4412 size = i ? args[i] : Qnil;
4413 if (NILP (size))
4414 size = make_number (DEFAULT_HASH_SIZE);
4415 else if (!INTEGERP (size) || XINT (size) < 0)
4416 signal_error ("Invalid hash table size", size);
4418 /* Look for `:rehash-size SIZE'. */
4419 i = get_key_arg (QCrehash_size, nargs, args, used);
4420 rehash_size = i ? args[i] : make_float (DEFAULT_REHASH_SIZE);
4421 if (! ((INTEGERP (rehash_size) && 0 < XINT (rehash_size))
4422 || (FLOATP (rehash_size) && 1 < XFLOAT_DATA (rehash_size))))
4423 signal_error ("Invalid hash table rehash size", rehash_size);
4425 /* Look for `:rehash-threshold THRESHOLD'. */
4426 i = get_key_arg (QCrehash_threshold, nargs, args, used);
4427 rehash_threshold = i ? args[i] : make_float (DEFAULT_REHASH_THRESHOLD);
4428 if (! (FLOATP (rehash_threshold)
4429 && 0 < XFLOAT_DATA (rehash_threshold)
4430 && XFLOAT_DATA (rehash_threshold) <= 1))
4431 signal_error ("Invalid hash table rehash threshold", rehash_threshold);
4433 /* Look for `:weakness WEAK'. */
4434 i = get_key_arg (QCweakness, nargs, args, used);
4435 weak = i ? args[i] : Qnil;
4436 if (EQ (weak, Qt))
4437 weak = Qkey_and_value;
4438 if (!NILP (weak)
4439 && !EQ (weak, Qkey)
4440 && !EQ (weak, Qvalue)
4441 && !EQ (weak, Qkey_or_value)
4442 && !EQ (weak, Qkey_and_value))
4443 signal_error ("Invalid hash table weakness", weak);
4445 /* Now, all args should have been used up, or there's a problem. */
4446 for (i = 0; i < nargs; ++i)
4447 if (!used[i])
4448 signal_error ("Invalid argument list", args[i]);
4450 return make_hash_table (testdesc, size, rehash_size, rehash_threshold, weak);
4454 DEFUN ("copy-hash-table", Fcopy_hash_table, Scopy_hash_table, 1, 1, 0,
4455 doc: /* Return a copy of hash table TABLE. */)
4456 (Lisp_Object table)
4458 return copy_hash_table (check_hash_table (table));
4462 DEFUN ("hash-table-count", Fhash_table_count, Shash_table_count, 1, 1, 0,
4463 doc: /* Return the number of elements in TABLE. */)
4464 (Lisp_Object table)
4466 return make_number (check_hash_table (table)->count);
4470 DEFUN ("hash-table-rehash-size", Fhash_table_rehash_size,
4471 Shash_table_rehash_size, 1, 1, 0,
4472 doc: /* Return the current rehash size of TABLE. */)
4473 (Lisp_Object table)
4475 return check_hash_table (table)->rehash_size;
4479 DEFUN ("hash-table-rehash-threshold", Fhash_table_rehash_threshold,
4480 Shash_table_rehash_threshold, 1, 1, 0,
4481 doc: /* Return the current rehash threshold of TABLE. */)
4482 (Lisp_Object table)
4484 return check_hash_table (table)->rehash_threshold;
4488 DEFUN ("hash-table-size", Fhash_table_size, Shash_table_size, 1, 1, 0,
4489 doc: /* Return the size of TABLE.
4490 The size can be used as an argument to `make-hash-table' to create
4491 a hash table than can hold as many elements as TABLE holds
4492 without need for resizing. */)
4493 (Lisp_Object table)
4495 struct Lisp_Hash_Table *h = check_hash_table (table);
4496 return make_number (HASH_TABLE_SIZE (h));
4500 DEFUN ("hash-table-test", Fhash_table_test, Shash_table_test, 1, 1, 0,
4501 doc: /* Return the test TABLE uses. */)
4502 (Lisp_Object table)
4504 return check_hash_table (table)->test.name;
4508 DEFUN ("hash-table-weakness", Fhash_table_weakness, Shash_table_weakness,
4509 1, 1, 0,
4510 doc: /* Return the weakness of TABLE. */)
4511 (Lisp_Object table)
4513 return check_hash_table (table)->weak;
4517 DEFUN ("hash-table-p", Fhash_table_p, Shash_table_p, 1, 1, 0,
4518 doc: /* Return t if OBJ is a Lisp hash table object. */)
4519 (Lisp_Object obj)
4521 return HASH_TABLE_P (obj) ? Qt : Qnil;
4525 DEFUN ("clrhash", Fclrhash, Sclrhash, 1, 1, 0,
4526 doc: /* Clear hash table TABLE and return it. */)
4527 (Lisp_Object table)
4529 hash_clear (check_hash_table (table));
4530 /* Be compatible with XEmacs. */
4531 return table;
4535 DEFUN ("gethash", Fgethash, Sgethash, 2, 3, 0,
4536 doc: /* Look up KEY in TABLE and return its associated value.
4537 If KEY is not found, return DFLT which defaults to nil. */)
4538 (Lisp_Object key, Lisp_Object table, Lisp_Object dflt)
4540 struct Lisp_Hash_Table *h = check_hash_table (table);
4541 ptrdiff_t i = hash_lookup (h, key, NULL);
4542 return i >= 0 ? HASH_VALUE (h, i) : dflt;
4546 DEFUN ("puthash", Fputhash, Sputhash, 3, 3, 0,
4547 doc: /* Associate KEY with VALUE in hash table TABLE.
4548 If KEY is already present in table, replace its current value with
4549 VALUE. In any case, return VALUE. */)
4550 (Lisp_Object key, Lisp_Object value, Lisp_Object table)
4552 struct Lisp_Hash_Table *h = check_hash_table (table);
4553 ptrdiff_t i;
4554 EMACS_UINT hash;
4556 i = hash_lookup (h, key, &hash);
4557 if (i >= 0)
4558 set_hash_value_slot (h, i, value);
4559 else
4560 hash_put (h, key, value, hash);
4562 return value;
4566 DEFUN ("remhash", Fremhash, Sremhash, 2, 2, 0,
4567 doc: /* Remove KEY from TABLE. */)
4568 (Lisp_Object key, Lisp_Object table)
4570 struct Lisp_Hash_Table *h = check_hash_table (table);
4571 hash_remove_from_table (h, key);
4572 return Qnil;
4576 DEFUN ("maphash", Fmaphash, Smaphash, 2, 2, 0,
4577 doc: /* Call FUNCTION for all entries in hash table TABLE.
4578 FUNCTION is called with two arguments, KEY and VALUE.
4579 `maphash' always returns nil. */)
4580 (Lisp_Object function, Lisp_Object table)
4582 struct Lisp_Hash_Table *h = check_hash_table (table);
4583 Lisp_Object args[3];
4584 ptrdiff_t i;
4586 for (i = 0; i < HASH_TABLE_SIZE (h); ++i)
4587 if (!NILP (HASH_HASH (h, i)))
4589 args[0] = function;
4590 args[1] = HASH_KEY (h, i);
4591 args[2] = HASH_VALUE (h, i);
4592 Ffuncall (3, args);
4595 return Qnil;
4599 DEFUN ("define-hash-table-test", Fdefine_hash_table_test,
4600 Sdefine_hash_table_test, 3, 3, 0,
4601 doc: /* Define a new hash table test with name NAME, a symbol.
4603 In hash tables created with NAME specified as test, use TEST to
4604 compare keys, and HASH for computing hash codes of keys.
4606 TEST must be a function taking two arguments and returning non-nil if
4607 both arguments are the same. HASH must be a function taking one
4608 argument and returning an object that is the hash code of the argument.
4609 It should be the case that if (eq (funcall HASH x1) (funcall HASH x2))
4610 returns nil, then (funcall TEST x1 x2) also returns nil. */)
4611 (Lisp_Object name, Lisp_Object test, Lisp_Object hash)
4613 return Fput (name, Qhash_table_test, list2 (test, hash));
4618 /************************************************************************
4619 MD5, SHA-1, and SHA-2
4620 ************************************************************************/
4622 #include "md5.h"
4623 #include "sha1.h"
4624 #include "sha256.h"
4625 #include "sha512.h"
4627 /* ALGORITHM is a symbol: md5, sha1, sha224 and so on. */
4629 static Lisp_Object
4630 secure_hash (Lisp_Object algorithm, Lisp_Object object, Lisp_Object start, Lisp_Object end, Lisp_Object coding_system, Lisp_Object noerror, Lisp_Object binary)
4632 int i;
4633 ptrdiff_t size;
4634 EMACS_INT start_char = 0, end_char = 0;
4635 ptrdiff_t start_byte, end_byte;
4636 register EMACS_INT b, e;
4637 register struct buffer *bp;
4638 EMACS_INT temp;
4639 int digest_size;
4640 void *(*hash_func) (const char *, size_t, void *);
4641 Lisp_Object digest;
4643 CHECK_SYMBOL (algorithm);
4645 if (STRINGP (object))
4647 if (NILP (coding_system))
4649 /* Decide the coding-system to encode the data with. */
4651 if (STRING_MULTIBYTE (object))
4652 /* use default, we can't guess correct value */
4653 coding_system = preferred_coding_system ();
4654 else
4655 coding_system = Qraw_text;
4658 if (NILP (Fcoding_system_p (coding_system)))
4660 /* Invalid coding system. */
4662 if (!NILP (noerror))
4663 coding_system = Qraw_text;
4664 else
4665 xsignal1 (Qcoding_system_error, coding_system);
4668 if (STRING_MULTIBYTE (object))
4669 object = code_convert_string (object, coding_system, Qnil, 1, 0, 1);
4671 size = SCHARS (object);
4672 validate_subarray (object, start, end, size, &start_char, &end_char);
4674 start_byte = !start_char ? 0 : string_char_to_byte (object, start_char);
4675 end_byte = (end_char == size
4676 ? SBYTES (object)
4677 : string_char_to_byte (object, end_char));
4679 else
4681 struct buffer *prev = current_buffer;
4683 record_unwind_current_buffer ();
4685 CHECK_BUFFER (object);
4687 bp = XBUFFER (object);
4688 set_buffer_internal (bp);
4690 if (NILP (start))
4691 b = BEGV;
4692 else
4694 CHECK_NUMBER_COERCE_MARKER (start);
4695 b = XINT (start);
4698 if (NILP (end))
4699 e = ZV;
4700 else
4702 CHECK_NUMBER_COERCE_MARKER (end);
4703 e = XINT (end);
4706 if (b > e)
4707 temp = b, b = e, e = temp;
4709 if (!(BEGV <= b && e <= ZV))
4710 args_out_of_range (start, end);
4712 if (NILP (coding_system))
4714 /* Decide the coding-system to encode the data with.
4715 See fileio.c:Fwrite-region */
4717 if (!NILP (Vcoding_system_for_write))
4718 coding_system = Vcoding_system_for_write;
4719 else
4721 bool force_raw_text = 0;
4723 coding_system = BVAR (XBUFFER (object), buffer_file_coding_system);
4724 if (NILP (coding_system)
4725 || NILP (Flocal_variable_p (Qbuffer_file_coding_system, Qnil)))
4727 coding_system = Qnil;
4728 if (NILP (BVAR (current_buffer, enable_multibyte_characters)))
4729 force_raw_text = 1;
4732 if (NILP (coding_system) && !NILP (Fbuffer_file_name (object)))
4734 /* Check file-coding-system-alist. */
4735 Lisp_Object args[4], val;
4737 args[0] = Qwrite_region; args[1] = start; args[2] = end;
4738 args[3] = Fbuffer_file_name (object);
4739 val = Ffind_operation_coding_system (4, args);
4740 if (CONSP (val) && !NILP (XCDR (val)))
4741 coding_system = XCDR (val);
4744 if (NILP (coding_system)
4745 && !NILP (BVAR (XBUFFER (object), buffer_file_coding_system)))
4747 /* If we still have not decided a coding system, use the
4748 default value of buffer-file-coding-system. */
4749 coding_system = BVAR (XBUFFER (object), buffer_file_coding_system);
4752 if (!force_raw_text
4753 && !NILP (Ffboundp (Vselect_safe_coding_system_function)))
4754 /* Confirm that VAL can surely encode the current region. */
4755 coding_system = call4 (Vselect_safe_coding_system_function,
4756 make_number (b), make_number (e),
4757 coding_system, Qnil);
4759 if (force_raw_text)
4760 coding_system = Qraw_text;
4763 if (NILP (Fcoding_system_p (coding_system)))
4765 /* Invalid coding system. */
4767 if (!NILP (noerror))
4768 coding_system = Qraw_text;
4769 else
4770 xsignal1 (Qcoding_system_error, coding_system);
4774 object = make_buffer_string (b, e, 0);
4775 set_buffer_internal (prev);
4776 /* Discard the unwind protect for recovering the current
4777 buffer. */
4778 specpdl_ptr--;
4780 if (STRING_MULTIBYTE (object))
4781 object = code_convert_string (object, coding_system, Qnil, 1, 0, 0);
4782 start_byte = 0;
4783 end_byte = SBYTES (object);
4786 if (EQ (algorithm, Qmd5))
4788 digest_size = MD5_DIGEST_SIZE;
4789 hash_func = md5_buffer;
4791 else if (EQ (algorithm, Qsha1))
4793 digest_size = SHA1_DIGEST_SIZE;
4794 hash_func = sha1_buffer;
4796 else if (EQ (algorithm, Qsha224))
4798 digest_size = SHA224_DIGEST_SIZE;
4799 hash_func = sha224_buffer;
4801 else if (EQ (algorithm, Qsha256))
4803 digest_size = SHA256_DIGEST_SIZE;
4804 hash_func = sha256_buffer;
4806 else if (EQ (algorithm, Qsha384))
4808 digest_size = SHA384_DIGEST_SIZE;
4809 hash_func = sha384_buffer;
4811 else if (EQ (algorithm, Qsha512))
4813 digest_size = SHA512_DIGEST_SIZE;
4814 hash_func = sha512_buffer;
4816 else
4817 error ("Invalid algorithm arg: %s", SDATA (Fsymbol_name (algorithm)));
4819 /* allocate 2 x digest_size so that it can be re-used to hold the
4820 hexified value */
4821 digest = make_uninit_string (digest_size * 2);
4823 hash_func (SSDATA (object) + start_byte,
4824 end_byte - start_byte,
4825 SSDATA (digest));
4827 if (NILP (binary))
4829 unsigned char *p = SDATA (digest);
4830 for (i = digest_size - 1; i >= 0; i--)
4832 static char const hexdigit[16] = "0123456789abcdef";
4833 int p_i = p[i];
4834 p[2 * i] = hexdigit[p_i >> 4];
4835 p[2 * i + 1] = hexdigit[p_i & 0xf];
4837 return digest;
4839 else
4840 return make_unibyte_string (SSDATA (digest), digest_size);
4843 DEFUN ("md5", Fmd5, Smd5, 1, 5, 0,
4844 doc: /* Return MD5 message digest of OBJECT, a buffer or string.
4846 A message digest is a cryptographic checksum of a document, and the
4847 algorithm to calculate it is defined in RFC 1321.
4849 The two optional arguments START and END are character positions
4850 specifying for which part of OBJECT the message digest should be
4851 computed. If nil or omitted, the digest is computed for the whole
4852 OBJECT.
4854 The MD5 message digest is computed from the result of encoding the
4855 text in a coding system, not directly from the internal Emacs form of
4856 the text. The optional fourth argument CODING-SYSTEM specifies which
4857 coding system to encode the text with. It should be the same coding
4858 system that you used or will use when actually writing the text into a
4859 file.
4861 If CODING-SYSTEM is nil or omitted, the default depends on OBJECT. If
4862 OBJECT is a buffer, the default for CODING-SYSTEM is whatever coding
4863 system would be chosen by default for writing this text into a file.
4865 If OBJECT is a string, the most preferred coding system (see the
4866 command `prefer-coding-system') is used.
4868 If NOERROR is non-nil, silently assume the `raw-text' coding if the
4869 guesswork fails. Normally, an error is signaled in such case. */)
4870 (Lisp_Object object, Lisp_Object start, Lisp_Object end, Lisp_Object coding_system, Lisp_Object noerror)
4872 return secure_hash (Qmd5, object, start, end, coding_system, noerror, Qnil);
4875 DEFUN ("secure-hash", Fsecure_hash, Ssecure_hash, 2, 5, 0,
4876 doc: /* Return the secure hash of OBJECT, a buffer or string.
4877 ALGORITHM is a symbol specifying the hash to use:
4878 md5, sha1, sha224, sha256, sha384 or sha512.
4880 The two optional arguments START and END are positions specifying for
4881 which part of OBJECT to compute the hash. If nil or omitted, uses the
4882 whole OBJECT.
4884 If BINARY is non-nil, returns a string in binary form. */)
4885 (Lisp_Object algorithm, Lisp_Object object, Lisp_Object start, Lisp_Object end, Lisp_Object binary)
4887 return secure_hash (algorithm, object, start, end, Qnil, Qnil, binary);
4890 void
4891 syms_of_fns (void)
4893 DEFSYM (Qmd5, "md5");
4894 DEFSYM (Qsha1, "sha1");
4895 DEFSYM (Qsha224, "sha224");
4896 DEFSYM (Qsha256, "sha256");
4897 DEFSYM (Qsha384, "sha384");
4898 DEFSYM (Qsha512, "sha512");
4900 /* Hash table stuff. */
4901 DEFSYM (Qhash_table_p, "hash-table-p");
4902 DEFSYM (Qeq, "eq");
4903 DEFSYM (Qeql, "eql");
4904 DEFSYM (Qequal, "equal");
4905 DEFSYM (QCtest, ":test");
4906 DEFSYM (QCsize, ":size");
4907 DEFSYM (QCrehash_size, ":rehash-size");
4908 DEFSYM (QCrehash_threshold, ":rehash-threshold");
4909 DEFSYM (QCweakness, ":weakness");
4910 DEFSYM (Qkey, "key");
4911 DEFSYM (Qvalue, "value");
4912 DEFSYM (Qhash_table_test, "hash-table-test");
4913 DEFSYM (Qkey_or_value, "key-or-value");
4914 DEFSYM (Qkey_and_value, "key-and-value");
4916 defsubr (&Ssxhash);
4917 defsubr (&Smake_hash_table);
4918 defsubr (&Scopy_hash_table);
4919 defsubr (&Shash_table_count);
4920 defsubr (&Shash_table_rehash_size);
4921 defsubr (&Shash_table_rehash_threshold);
4922 defsubr (&Shash_table_size);
4923 defsubr (&Shash_table_test);
4924 defsubr (&Shash_table_weakness);
4925 defsubr (&Shash_table_p);
4926 defsubr (&Sclrhash);
4927 defsubr (&Sgethash);
4928 defsubr (&Sputhash);
4929 defsubr (&Sremhash);
4930 defsubr (&Smaphash);
4931 defsubr (&Sdefine_hash_table_test);
4933 DEFSYM (Qstring_lessp, "string-lessp");
4934 DEFSYM (Qprovide, "provide");
4935 DEFSYM (Qrequire, "require");
4936 DEFSYM (Qyes_or_no_p_history, "yes-or-no-p-history");
4937 DEFSYM (Qcursor_in_echo_area, "cursor-in-echo-area");
4938 DEFSYM (Qwidget_type, "widget-type");
4940 staticpro (&string_char_byte_cache_string);
4941 string_char_byte_cache_string = Qnil;
4943 require_nesting_list = Qnil;
4944 staticpro (&require_nesting_list);
4946 Fset (Qyes_or_no_p_history, Qnil);
4948 DEFVAR_LISP ("features", Vfeatures,
4949 doc: /* A list of symbols which are the features of the executing Emacs.
4950 Used by `featurep' and `require', and altered by `provide'. */);
4951 Vfeatures = list1 (intern_c_string ("emacs"));
4952 DEFSYM (Qsubfeatures, "subfeatures");
4953 DEFSYM (Qfuncall, "funcall");
4955 #ifdef HAVE_LANGINFO_CODESET
4956 DEFSYM (Qcodeset, "codeset");
4957 DEFSYM (Qdays, "days");
4958 DEFSYM (Qmonths, "months");
4959 DEFSYM (Qpaper, "paper");
4960 #endif /* HAVE_LANGINFO_CODESET */
4962 DEFVAR_BOOL ("use-dialog-box", use_dialog_box,
4963 doc: /* Non-nil means mouse commands use dialog boxes to ask questions.
4964 This applies to `y-or-n-p' and `yes-or-no-p' questions asked by commands
4965 invoked by mouse clicks and mouse menu items.
4967 On some platforms, file selection dialogs are also enabled if this is
4968 non-nil. */);
4969 use_dialog_box = 1;
4971 DEFVAR_BOOL ("use-file-dialog", use_file_dialog,
4972 doc: /* Non-nil means mouse commands use a file dialog to ask for files.
4973 This applies to commands from menus and tool bar buttons even when
4974 they are initiated from the keyboard. If `use-dialog-box' is nil,
4975 that disables the use of a file dialog, regardless of the value of
4976 this variable. */);
4977 use_file_dialog = 1;
4979 defsubr (&Sidentity);
4980 defsubr (&Srandom);
4981 defsubr (&Slength);
4982 defsubr (&Ssafe_length);
4983 defsubr (&Sstring_bytes);
4984 defsubr (&Sstring_equal);
4985 defsubr (&Scompare_strings);
4986 defsubr (&Sstring_lessp);
4987 defsubr (&Sappend);
4988 defsubr (&Sconcat);
4989 defsubr (&Svconcat);
4990 defsubr (&Scopy_sequence);
4991 defsubr (&Sstring_make_multibyte);
4992 defsubr (&Sstring_make_unibyte);
4993 defsubr (&Sstring_as_multibyte);
4994 defsubr (&Sstring_as_unibyte);
4995 defsubr (&Sstring_to_multibyte);
4996 defsubr (&Sstring_to_unibyte);
4997 defsubr (&Scopy_alist);
4998 defsubr (&Ssubstring);
4999 defsubr (&Ssubstring_no_properties);
5000 defsubr (&Snthcdr);
5001 defsubr (&Snth);
5002 defsubr (&Selt);
5003 defsubr (&Smember);
5004 defsubr (&Smemq);
5005 defsubr (&Smemql);
5006 defsubr (&Sassq);
5007 defsubr (&Sassoc);
5008 defsubr (&Srassq);
5009 defsubr (&Srassoc);
5010 defsubr (&Sdelq);
5011 defsubr (&Sdelete);
5012 defsubr (&Snreverse);
5013 defsubr (&Sreverse);
5014 defsubr (&Ssort);
5015 defsubr (&Splist_get);
5016 defsubr (&Sget);
5017 defsubr (&Splist_put);
5018 defsubr (&Sput);
5019 defsubr (&Slax_plist_get);
5020 defsubr (&Slax_plist_put);
5021 defsubr (&Seql);
5022 defsubr (&Sequal);
5023 defsubr (&Sequal_including_properties);
5024 defsubr (&Sfillarray);
5025 defsubr (&Sclear_string);
5026 defsubr (&Snconc);
5027 defsubr (&Smapcar);
5028 defsubr (&Smapc);
5029 defsubr (&Smapconcat);
5030 defsubr (&Syes_or_no_p);
5031 defsubr (&Sload_average);
5032 defsubr (&Sfeaturep);
5033 defsubr (&Srequire);
5034 defsubr (&Sprovide);
5035 defsubr (&Splist_member);
5036 defsubr (&Swidget_put);
5037 defsubr (&Swidget_get);
5038 defsubr (&Swidget_apply);
5039 defsubr (&Sbase64_encode_region);
5040 defsubr (&Sbase64_decode_region);
5041 defsubr (&Sbase64_encode_string);
5042 defsubr (&Sbase64_decode_string);
5043 defsubr (&Smd5);
5044 defsubr (&Ssecure_hash);
5045 defsubr (&Slocale_info);
5047 hashtest_eq.name = Qeq;
5048 hashtest_eq.user_hash_function = Qnil;
5049 hashtest_eq.user_cmp_function = Qnil;
5050 hashtest_eq.cmpfn = 0;
5051 hashtest_eq.hashfn = hashfn_eq;
5053 hashtest_eql.name = Qeql;
5054 hashtest_eql.user_hash_function = Qnil;
5055 hashtest_eql.user_cmp_function = Qnil;
5056 hashtest_eql.cmpfn = cmpfn_eql;
5057 hashtest_eql.hashfn = hashfn_eql;
5059 hashtest_equal.name = Qequal;
5060 hashtest_equal.user_hash_function = Qnil;
5061 hashtest_equal.user_cmp_function = Qnil;
5062 hashtest_equal.cmpfn = cmpfn_equal;
5063 hashtest_equal.hashfn = hashfn_equal;