912cf939548973fad8f9f2d90f40b27eab12663b
[bpt/emacs.git] / src / fns.c
1 /* Random utility Lisp functions.
2
3 Copyright (C) 1985-1987, 1993-1995, 1997-2014 Free Software Foundation,
4 Inc.
5
6 This file is part of GNU Emacs.
7
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.
12
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.
17
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/>. */
20
21 #include <config.h>
22
23 #include <unistd.h>
24 #include <time.h>
25
26 #include <intprops.h>
27
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
42
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;
49
50 static Lisp_Object Qmd5, Qsha1, Qsha224, Qsha256, Qsha384, Qsha512;
51 \f
52 DEFUN ("identity", Fidentity, Sidentity, 1, 1, 0,
53 doc: /* Return the argument unchanged. */)
54 (Lisp_Object arg)
55 {
56 return arg;
57 }
58
59 DEFUN ("random", Frandom, Srandom, 0, 1, 0,
60 doc: /* Return a pseudo-random number.
61 All integers representable in Lisp, i.e. between `most-negative-fixnum'
62 and `most-positive-fixnum', inclusive, are equally likely.
63
64 With positive integer LIMIT, return random number in interval [0,LIMIT).
65 With argument t, set the random number seed from the current time and pid.
66 With a string argument, set the seed based on the string's contents.
67 Other values of LIMIT are ignored.
68
69 See Info node `(elisp)Random Numbers' for more details. */)
70 (Lisp_Object limit)
71 {
72 EMACS_INT val;
73
74 if (EQ (limit, Qt))
75 init_random ();
76 else if (STRINGP (limit))
77 seed_random (SSDATA (limit), SBYTES (limit));
78
79 val = get_random ();
80 if (INTEGERP (limit) && 0 < XINT (limit))
81 while (true)
82 {
83 /* Return the remainder, except reject the rare case where
84 get_random returns a number so close to INTMASK that the
85 remainder isn't random. */
86 EMACS_INT remainder = val % XINT (limit);
87 if (val - remainder <= INTMASK - XINT (limit) + 1)
88 return make_number (remainder);
89 val = get_random ();
90 }
91 return make_number (val);
92 }
93 \f
94 /* Heuristic on how many iterations of a tight loop can be safely done
95 before it's time to do a QUIT. This must be a power of 2. */
96 enum { QUIT_COUNT_HEURISTIC = 1 << 16 };
97
98 /* Random data-structure functions. */
99
100 static void
101 CHECK_LIST_END (Lisp_Object x, Lisp_Object y)
102 {
103 CHECK_TYPE (NILP (x), Qlistp, y);
104 }
105
106 DEFUN ("length", Flength, Slength, 1, 1, 0,
107 doc: /* Return the length of vector, list or string SEQUENCE.
108 A byte-code function object is also allowed.
109 If the string contains multibyte characters, this is not necessarily
110 the number of bytes in the string; it is the number of characters.
111 To get the number of bytes, use `string-bytes'. */)
112 (register Lisp_Object sequence)
113 {
114 register Lisp_Object val;
115
116 if (STRINGP (sequence))
117 XSETFASTINT (val, SCHARS (sequence));
118 else if (VECTORP (sequence))
119 XSETFASTINT (val, ASIZE (sequence));
120 else if (CHAR_TABLE_P (sequence))
121 XSETFASTINT (val, MAX_CHAR);
122 else if (BOOL_VECTOR_P (sequence))
123 XSETFASTINT (val, bool_vector_size (sequence));
124 else if (COMPILEDP (sequence))
125 XSETFASTINT (val, ASIZE (sequence) & PSEUDOVECTOR_SIZE_MASK);
126 else if (CONSP (sequence))
127 {
128 EMACS_INT i = 0;
129
130 do
131 {
132 ++i;
133 if ((i & (QUIT_COUNT_HEURISTIC - 1)) == 0)
134 {
135 if (MOST_POSITIVE_FIXNUM < i)
136 error ("List too long");
137 QUIT;
138 }
139 sequence = XCDR (sequence);
140 }
141 while (CONSP (sequence));
142
143 CHECK_LIST_END (sequence, sequence);
144
145 val = make_number (i);
146 }
147 else if (NILP (sequence))
148 XSETFASTINT (val, 0);
149 else
150 wrong_type_argument (Qsequencep, sequence);
151
152 return val;
153 }
154
155 DEFUN ("safe-length", Fsafe_length, Ssafe_length, 1, 1, 0,
156 doc: /* Return the length of a list, but avoid error or infinite loop.
157 This function never gets an error. If LIST is not really a list,
158 it returns 0. If LIST is circular, it returns a finite value
159 which is at least the number of distinct elements. */)
160 (Lisp_Object list)
161 {
162 Lisp_Object tail, halftail;
163 double hilen = 0;
164 uintmax_t lolen = 1;
165
166 if (! CONSP (list))
167 return make_number (0);
168
169 /* halftail is used to detect circular lists. */
170 for (tail = halftail = list; ; )
171 {
172 tail = XCDR (tail);
173 if (! CONSP (tail))
174 break;
175 if (EQ (tail, halftail))
176 break;
177 lolen++;
178 if ((lolen & 1) == 0)
179 {
180 halftail = XCDR (halftail);
181 if ((lolen & (QUIT_COUNT_HEURISTIC - 1)) == 0)
182 {
183 QUIT;
184 if (lolen == 0)
185 hilen += UINTMAX_MAX + 1.0;
186 }
187 }
188 }
189
190 /* If the length does not fit into a fixnum, return a float.
191 On all known practical machines this returns an upper bound on
192 the true length. */
193 return hilen ? make_float (hilen + lolen) : make_fixnum_or_float (lolen);
194 }
195
196 DEFUN ("string-bytes", Fstring_bytes, Sstring_bytes, 1, 1, 0,
197 doc: /* Return the number of bytes in STRING.
198 If STRING is multibyte, this may be greater than the length of STRING. */)
199 (Lisp_Object string)
200 {
201 CHECK_STRING (string);
202 return make_number (SBYTES (string));
203 }
204
205 DEFUN ("string-equal", Fstring_equal, Sstring_equal, 2, 2, 0,
206 doc: /* Return t if two strings have identical contents.
207 Case is significant, but text properties are ignored.
208 Symbols are also allowed; their print names are used instead. */)
209 (register Lisp_Object s1, Lisp_Object s2)
210 {
211 if (SYMBOLP (s1))
212 s1 = SYMBOL_NAME (s1);
213 if (SYMBOLP (s2))
214 s2 = SYMBOL_NAME (s2);
215 CHECK_STRING (s1);
216 CHECK_STRING (s2);
217
218 if (SCHARS (s1) != SCHARS (s2)
219 || SBYTES (s1) != SBYTES (s2)
220 || memcmp (SDATA (s1), SDATA (s2), SBYTES (s1)))
221 return Qnil;
222 return Qt;
223 }
224
225 DEFUN ("compare-strings", Fcompare_strings, Scompare_strings, 6, 7, 0,
226 doc: /* Compare the contents of two strings, converting to multibyte if needed.
227 The arguments START1, END1, START2, and END2, if non-nil, are
228 positions specifying which parts of STR1 or STR2 to compare. In
229 string STR1, compare the part between START1 (inclusive) and END1
230 \(exclusive). If START1 is nil, it defaults to 0, the beginning of
231 the string; if END1 is nil, it defaults to the length of the string.
232 Likewise, in string STR2, compare the part between START2 and END2.
233 Like in `substring', negative values are counted from the end.
234
235 The strings are compared by the numeric values of their characters.
236 For instance, STR1 is "less than" STR2 if its first differing
237 character has a smaller numeric value. If IGNORE-CASE is non-nil,
238 characters are converted to lower-case before comparing them. Unibyte
239 strings are converted to multibyte for comparison.
240
241 The value is t if the strings (or specified portions) match.
242 If string STR1 is less, the value is a negative number N;
243 - 1 - N is the number of characters that match at the beginning.
244 If string STR1 is greater, the value is a positive number N;
245 N - 1 is the number of characters that match at the beginning. */)
246 (Lisp_Object str1, Lisp_Object start1, Lisp_Object end1, Lisp_Object str2,
247 Lisp_Object start2, Lisp_Object end2, Lisp_Object ignore_case)
248 {
249 ptrdiff_t from1, to1, from2, to2, i1, i1_byte, i2, i2_byte;
250
251 CHECK_STRING (str1);
252 CHECK_STRING (str2);
253
254 validate_subarray (str1, start1, end1, SCHARS (str1), &from1, &to1);
255 validate_subarray (str2, start2, end2, SCHARS (str2), &from2, &to2);
256
257 i1 = from1;
258 i2 = from2;
259
260 i1_byte = string_char_to_byte (str1, i1);
261 i2_byte = string_char_to_byte (str2, i2);
262
263 while (i1 < to1 && i2 < to2)
264 {
265 /* When we find a mismatch, we must compare the
266 characters, not just the bytes. */
267 int c1, c2;
268
269 FETCH_STRING_CHAR_AS_MULTIBYTE_ADVANCE (c1, str1, i1, i1_byte);
270 FETCH_STRING_CHAR_AS_MULTIBYTE_ADVANCE (c2, str2, i2, i2_byte);
271
272 if (c1 == c2)
273 continue;
274
275 if (! NILP (ignore_case))
276 {
277 c1 = XINT (Fupcase (make_number (c1)));
278 c2 = XINT (Fupcase (make_number (c2)));
279 }
280
281 if (c1 == c2)
282 continue;
283
284 /* Note that I1 has already been incremented
285 past the character that we are comparing;
286 hence we don't add or subtract 1 here. */
287 if (c1 < c2)
288 return make_number (- i1 + from1);
289 else
290 return make_number (i1 - from1);
291 }
292
293 if (i1 < to1)
294 return make_number (i1 - from1 + 1);
295 if (i2 < to2)
296 return make_number (- i1 + from1 - 1);
297
298 return Qt;
299 }
300
301 DEFUN ("string-lessp", Fstring_lessp, Sstring_lessp, 2, 2, 0,
302 doc: /* Return t if first arg string is less than second in lexicographic order.
303 Case is significant.
304 Symbols are also allowed; their print names are used instead. */)
305 (register Lisp_Object s1, Lisp_Object s2)
306 {
307 register ptrdiff_t end;
308 register ptrdiff_t i1, i1_byte, i2, i2_byte;
309
310 if (SYMBOLP (s1))
311 s1 = SYMBOL_NAME (s1);
312 if (SYMBOLP (s2))
313 s2 = SYMBOL_NAME (s2);
314 CHECK_STRING (s1);
315 CHECK_STRING (s2);
316
317 i1 = i1_byte = i2 = i2_byte = 0;
318
319 end = SCHARS (s1);
320 if (end > SCHARS (s2))
321 end = SCHARS (s2);
322
323 while (i1 < end)
324 {
325 /* When we find a mismatch, we must compare the
326 characters, not just the bytes. */
327 int c1, c2;
328
329 FETCH_STRING_CHAR_ADVANCE (c1, s1, i1, i1_byte);
330 FETCH_STRING_CHAR_ADVANCE (c2, s2, i2, i2_byte);
331
332 if (c1 != c2)
333 return c1 < c2 ? Qt : Qnil;
334 }
335 return i1 < SCHARS (s2) ? Qt : Qnil;
336 }
337 \f
338 static Lisp_Object concat (ptrdiff_t nargs, Lisp_Object *args,
339 enum Lisp_Type target_type, bool last_special);
340
341 /* ARGSUSED */
342 Lisp_Object
343 concat2 (Lisp_Object s1, Lisp_Object s2)
344 {
345 Lisp_Object args[2];
346 args[0] = s1;
347 args[1] = s2;
348 return concat (2, args, Lisp_String, 0);
349 }
350
351 /* ARGSUSED */
352 Lisp_Object
353 concat3 (Lisp_Object s1, Lisp_Object s2, Lisp_Object s3)
354 {
355 Lisp_Object args[3];
356 args[0] = s1;
357 args[1] = s2;
358 args[2] = s3;
359 return concat (3, args, Lisp_String, 0);
360 }
361
362 DEFUN ("append", Fappend, Sappend, 0, MANY, 0,
363 doc: /* Concatenate all the arguments and make the result a list.
364 The result is a list whose elements are the elements of all the arguments.
365 Each argument may be a list, vector or string.
366 The last argument is not copied, just used as the tail of the new list.
367 usage: (append &rest SEQUENCES) */)
368 (ptrdiff_t nargs, Lisp_Object *args)
369 {
370 return concat (nargs, args, Lisp_Cons, 1);
371 }
372
373 DEFUN ("concat", Fconcat, Sconcat, 0, MANY, 0,
374 doc: /* Concatenate all the arguments and make the result a string.
375 The result is a string whose elements are the elements of all the arguments.
376 Each argument may be a string or a list or vector of characters (integers).
377 usage: (concat &rest SEQUENCES) */)
378 (ptrdiff_t nargs, Lisp_Object *args)
379 {
380 return concat (nargs, args, Lisp_String, 0);
381 }
382
383 DEFUN ("vconcat", Fvconcat, Svconcat, 0, MANY, 0,
384 doc: /* Concatenate all the arguments and make the result a vector.
385 The result is a vector whose elements are the elements of all the arguments.
386 Each argument may be a list, vector or string.
387 usage: (vconcat &rest SEQUENCES) */)
388 (ptrdiff_t nargs, Lisp_Object *args)
389 {
390 return concat (nargs, args, Lisp_Vectorlike, 0);
391 }
392
393
394 DEFUN ("copy-sequence", Fcopy_sequence, Scopy_sequence, 1, 1, 0,
395 doc: /* Return a copy of a list, vector, string or char-table.
396 The elements of a list or vector are not copied; they are shared
397 with the original. */)
398 (Lisp_Object arg)
399 {
400 if (NILP (arg)) return arg;
401
402 if (CHAR_TABLE_P (arg))
403 {
404 return copy_char_table (arg);
405 }
406
407 if (BOOL_VECTOR_P (arg))
408 {
409 EMACS_INT nbits = bool_vector_size (arg);
410 ptrdiff_t nbytes = bool_vector_bytes (nbits);
411 Lisp_Object val = make_uninit_bool_vector (nbits);
412 memcpy (bool_vector_data (val), bool_vector_data (arg), nbytes);
413 return val;
414 }
415
416 if (!CONSP (arg) && !VECTORP (arg) && !STRINGP (arg))
417 wrong_type_argument (Qsequencep, arg);
418
419 return concat (1, &arg, XTYPE (arg), 0);
420 }
421
422 /* This structure holds information of an argument of `concat' that is
423 a string and has text properties to be copied. */
424 struct textprop_rec
425 {
426 ptrdiff_t argnum; /* refer to ARGS (arguments of `concat') */
427 ptrdiff_t from; /* refer to ARGS[argnum] (argument string) */
428 ptrdiff_t to; /* refer to VAL (the target string) */
429 };
430
431 static Lisp_Object
432 concat (ptrdiff_t nargs, Lisp_Object *args,
433 enum Lisp_Type target_type, bool last_special)
434 {
435 Lisp_Object val;
436 Lisp_Object tail;
437 Lisp_Object this;
438 ptrdiff_t toindex;
439 ptrdiff_t toindex_byte = 0;
440 EMACS_INT result_len;
441 EMACS_INT result_len_byte;
442 ptrdiff_t argnum;
443 Lisp_Object last_tail;
444 Lisp_Object prev;
445 bool some_multibyte;
446 /* When we make a multibyte string, we can't copy text properties
447 while concatenating each string because the length of resulting
448 string can't be decided until we finish the whole concatenation.
449 So, we record strings that have text properties to be copied
450 here, and copy the text properties after the concatenation. */
451 struct textprop_rec *textprops = NULL;
452 /* Number of elements in textprops. */
453 ptrdiff_t num_textprops = 0;
454 USE_SAFE_ALLOCA;
455
456 tail = Qnil;
457
458 /* In append, the last arg isn't treated like the others */
459 if (last_special && nargs > 0)
460 {
461 nargs--;
462 last_tail = args[nargs];
463 }
464 else
465 last_tail = Qnil;
466
467 /* Check each argument. */
468 for (argnum = 0; argnum < nargs; argnum++)
469 {
470 this = args[argnum];
471 if (!(CONSP (this) || NILP (this) || VECTORP (this) || STRINGP (this)
472 || COMPILEDP (this) || BOOL_VECTOR_P (this)))
473 wrong_type_argument (Qsequencep, this);
474 }
475
476 /* Compute total length in chars of arguments in RESULT_LEN.
477 If desired output is a string, also compute length in bytes
478 in RESULT_LEN_BYTE, and determine in SOME_MULTIBYTE
479 whether the result should be a multibyte string. */
480 result_len_byte = 0;
481 result_len = 0;
482 some_multibyte = 0;
483 for (argnum = 0; argnum < nargs; argnum++)
484 {
485 EMACS_INT len;
486 this = args[argnum];
487 len = XFASTINT (Flength (this));
488 if (target_type == Lisp_String)
489 {
490 /* We must count the number of bytes needed in the string
491 as well as the number of characters. */
492 ptrdiff_t i;
493 Lisp_Object ch;
494 int c;
495 ptrdiff_t this_len_byte;
496
497 if (VECTORP (this) || COMPILEDP (this))
498 for (i = 0; i < len; i++)
499 {
500 ch = AREF (this, i);
501 CHECK_CHARACTER (ch);
502 c = XFASTINT (ch);
503 this_len_byte = CHAR_BYTES (c);
504 if (STRING_BYTES_BOUND - result_len_byte < this_len_byte)
505 string_overflow ();
506 result_len_byte += this_len_byte;
507 if (! ASCII_CHAR_P (c) && ! CHAR_BYTE8_P (c))
508 some_multibyte = 1;
509 }
510 else if (BOOL_VECTOR_P (this) && bool_vector_size (this) > 0)
511 wrong_type_argument (Qintegerp, Faref (this, make_number (0)));
512 else if (CONSP (this))
513 for (; CONSP (this); this = XCDR (this))
514 {
515 ch = XCAR (this);
516 CHECK_CHARACTER (ch);
517 c = XFASTINT (ch);
518 this_len_byte = CHAR_BYTES (c);
519 if (STRING_BYTES_BOUND - result_len_byte < this_len_byte)
520 string_overflow ();
521 result_len_byte += this_len_byte;
522 if (! ASCII_CHAR_P (c) && ! CHAR_BYTE8_P (c))
523 some_multibyte = 1;
524 }
525 else if (STRINGP (this))
526 {
527 if (STRING_MULTIBYTE (this))
528 {
529 some_multibyte = 1;
530 this_len_byte = SBYTES (this);
531 }
532 else
533 this_len_byte = count_size_as_multibyte (SDATA (this),
534 SCHARS (this));
535 if (STRING_BYTES_BOUND - result_len_byte < this_len_byte)
536 string_overflow ();
537 result_len_byte += this_len_byte;
538 }
539 }
540
541 result_len += len;
542 if (MOST_POSITIVE_FIXNUM < result_len)
543 memory_full (SIZE_MAX);
544 }
545
546 if (! some_multibyte)
547 result_len_byte = result_len;
548
549 /* Create the output object. */
550 if (target_type == Lisp_Cons)
551 val = Fmake_list (make_number (result_len), Qnil);
552 else if (target_type == Lisp_Vectorlike)
553 val = Fmake_vector (make_number (result_len), Qnil);
554 else if (some_multibyte)
555 val = make_uninit_multibyte_string (result_len, result_len_byte);
556 else
557 val = make_uninit_string (result_len);
558
559 /* In `append', if all but last arg are nil, return last arg. */
560 if (target_type == Lisp_Cons && EQ (val, Qnil))
561 return last_tail;
562
563 /* Copy the contents of the args into the result. */
564 if (CONSP (val))
565 tail = val, toindex = -1; /* -1 in toindex is flag we are making a list */
566 else
567 toindex = 0, toindex_byte = 0;
568
569 prev = Qnil;
570 if (STRINGP (val))
571 SAFE_NALLOCA (textprops, 1, nargs);
572
573 for (argnum = 0; argnum < nargs; argnum++)
574 {
575 Lisp_Object thislen;
576 ptrdiff_t thisleni = 0;
577 register ptrdiff_t thisindex = 0;
578 register ptrdiff_t thisindex_byte = 0;
579
580 this = args[argnum];
581 if (!CONSP (this))
582 thislen = Flength (this), thisleni = XINT (thislen);
583
584 /* Between strings of the same kind, copy fast. */
585 if (STRINGP (this) && STRINGP (val)
586 && STRING_MULTIBYTE (this) == some_multibyte)
587 {
588 ptrdiff_t thislen_byte = SBYTES (this);
589
590 memcpy (SDATA (val) + toindex_byte, SDATA (this), SBYTES (this));
591 if (string_intervals (this))
592 {
593 textprops[num_textprops].argnum = argnum;
594 textprops[num_textprops].from = 0;
595 textprops[num_textprops++].to = toindex;
596 }
597 toindex_byte += thislen_byte;
598 toindex += thisleni;
599 }
600 /* Copy a single-byte string to a multibyte string. */
601 else if (STRINGP (this) && STRINGP (val))
602 {
603 if (string_intervals (this))
604 {
605 textprops[num_textprops].argnum = argnum;
606 textprops[num_textprops].from = 0;
607 textprops[num_textprops++].to = toindex;
608 }
609 toindex_byte += copy_text (SDATA (this),
610 SDATA (val) + toindex_byte,
611 SCHARS (this), 0, 1);
612 toindex += thisleni;
613 }
614 else
615 /* Copy element by element. */
616 while (1)
617 {
618 register Lisp_Object elt;
619
620 /* Fetch next element of `this' arg into `elt', or break if
621 `this' is exhausted. */
622 if (NILP (this)) break;
623 if (CONSP (this))
624 elt = XCAR (this), this = XCDR (this);
625 else if (thisindex >= thisleni)
626 break;
627 else if (STRINGP (this))
628 {
629 int c;
630 if (STRING_MULTIBYTE (this))
631 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c, this,
632 thisindex,
633 thisindex_byte);
634 else
635 {
636 c = SREF (this, thisindex); thisindex++;
637 if (some_multibyte && !ASCII_CHAR_P (c))
638 c = BYTE8_TO_CHAR (c);
639 }
640 XSETFASTINT (elt, c);
641 }
642 else if (BOOL_VECTOR_P (this))
643 {
644 elt = bool_vector_ref (this, thisindex);
645 thisindex++;
646 }
647 else
648 {
649 elt = AREF (this, thisindex);
650 thisindex++;
651 }
652
653 /* Store this element into the result. */
654 if (toindex < 0)
655 {
656 XSETCAR (tail, elt);
657 prev = tail;
658 tail = XCDR (tail);
659 }
660 else if (VECTORP (val))
661 {
662 ASET (val, toindex, elt);
663 toindex++;
664 }
665 else
666 {
667 int c;
668 CHECK_CHARACTER (elt);
669 c = XFASTINT (elt);
670 if (some_multibyte)
671 toindex_byte += CHAR_STRING (c, SDATA (val) + toindex_byte);
672 else
673 SSET (val, toindex_byte++, c);
674 toindex++;
675 }
676 }
677 }
678 if (!NILP (prev))
679 XSETCDR (prev, last_tail);
680
681 if (num_textprops > 0)
682 {
683 Lisp_Object props;
684 ptrdiff_t last_to_end = -1;
685
686 for (argnum = 0; argnum < num_textprops; argnum++)
687 {
688 this = args[textprops[argnum].argnum];
689 props = text_property_list (this,
690 make_number (0),
691 make_number (SCHARS (this)),
692 Qnil);
693 /* If successive arguments have properties, be sure that the
694 value of `composition' property be the copy. */
695 if (last_to_end == textprops[argnum].to)
696 make_composition_value_copy (props);
697 add_text_properties_from_list (val, props,
698 make_number (textprops[argnum].to));
699 last_to_end = textprops[argnum].to + SCHARS (this);
700 }
701 }
702
703 SAFE_FREE ();
704 return val;
705 }
706 \f
707 static Lisp_Object string_char_byte_cache_string;
708 static ptrdiff_t string_char_byte_cache_charpos;
709 static ptrdiff_t string_char_byte_cache_bytepos;
710
711 void
712 clear_string_char_byte_cache (void)
713 {
714 string_char_byte_cache_string = Qnil;
715 }
716
717 /* Return the byte index corresponding to CHAR_INDEX in STRING. */
718
719 ptrdiff_t
720 string_char_to_byte (Lisp_Object string, ptrdiff_t char_index)
721 {
722 ptrdiff_t i_byte;
723 ptrdiff_t best_below, best_below_byte;
724 ptrdiff_t best_above, best_above_byte;
725
726 best_below = best_below_byte = 0;
727 best_above = SCHARS (string);
728 best_above_byte = SBYTES (string);
729 if (best_above == best_above_byte)
730 return char_index;
731
732 if (EQ (string, string_char_byte_cache_string))
733 {
734 if (string_char_byte_cache_charpos < char_index)
735 {
736 best_below = string_char_byte_cache_charpos;
737 best_below_byte = string_char_byte_cache_bytepos;
738 }
739 else
740 {
741 best_above = string_char_byte_cache_charpos;
742 best_above_byte = string_char_byte_cache_bytepos;
743 }
744 }
745
746 if (char_index - best_below < best_above - char_index)
747 {
748 unsigned char *p = SDATA (string) + best_below_byte;
749
750 while (best_below < char_index)
751 {
752 p += BYTES_BY_CHAR_HEAD (*p);
753 best_below++;
754 }
755 i_byte = p - SDATA (string);
756 }
757 else
758 {
759 unsigned char *p = SDATA (string) + best_above_byte;
760
761 while (best_above > char_index)
762 {
763 p--;
764 while (!CHAR_HEAD_P (*p)) p--;
765 best_above--;
766 }
767 i_byte = p - SDATA (string);
768 }
769
770 string_char_byte_cache_bytepos = i_byte;
771 string_char_byte_cache_charpos = char_index;
772 string_char_byte_cache_string = string;
773
774 return i_byte;
775 }
776 \f
777 /* Return the character index corresponding to BYTE_INDEX in STRING. */
778
779 ptrdiff_t
780 string_byte_to_char (Lisp_Object string, ptrdiff_t byte_index)
781 {
782 ptrdiff_t i, i_byte;
783 ptrdiff_t best_below, best_below_byte;
784 ptrdiff_t best_above, best_above_byte;
785
786 best_below = best_below_byte = 0;
787 best_above = SCHARS (string);
788 best_above_byte = SBYTES (string);
789 if (best_above == best_above_byte)
790 return byte_index;
791
792 if (EQ (string, string_char_byte_cache_string))
793 {
794 if (string_char_byte_cache_bytepos < byte_index)
795 {
796 best_below = string_char_byte_cache_charpos;
797 best_below_byte = string_char_byte_cache_bytepos;
798 }
799 else
800 {
801 best_above = string_char_byte_cache_charpos;
802 best_above_byte = string_char_byte_cache_bytepos;
803 }
804 }
805
806 if (byte_index - best_below_byte < best_above_byte - byte_index)
807 {
808 unsigned char *p = SDATA (string) + best_below_byte;
809 unsigned char *pend = SDATA (string) + byte_index;
810
811 while (p < pend)
812 {
813 p += BYTES_BY_CHAR_HEAD (*p);
814 best_below++;
815 }
816 i = best_below;
817 i_byte = p - SDATA (string);
818 }
819 else
820 {
821 unsigned char *p = SDATA (string) + best_above_byte;
822 unsigned char *pbeg = SDATA (string) + byte_index;
823
824 while (p > pbeg)
825 {
826 p--;
827 while (!CHAR_HEAD_P (*p)) p--;
828 best_above--;
829 }
830 i = best_above;
831 i_byte = p - SDATA (string);
832 }
833
834 string_char_byte_cache_bytepos = i_byte;
835 string_char_byte_cache_charpos = i;
836 string_char_byte_cache_string = string;
837
838 return i;
839 }
840 \f
841 /* Convert STRING to a multibyte string. */
842
843 static Lisp_Object
844 string_make_multibyte (Lisp_Object string)
845 {
846 unsigned char *buf;
847 ptrdiff_t nbytes;
848 Lisp_Object ret;
849 USE_SAFE_ALLOCA;
850
851 if (STRING_MULTIBYTE (string))
852 return string;
853
854 nbytes = count_size_as_multibyte (SDATA (string),
855 SCHARS (string));
856 /* If all the chars are ASCII, they won't need any more bytes
857 once converted. In that case, we can return STRING itself. */
858 if (nbytes == SBYTES (string))
859 return string;
860
861 buf = SAFE_ALLOCA (nbytes);
862 copy_text (SDATA (string), buf, SBYTES (string),
863 0, 1);
864
865 ret = make_multibyte_string ((char *) buf, SCHARS (string), nbytes);
866 SAFE_FREE ();
867
868 return ret;
869 }
870
871
872 /* Convert STRING (if unibyte) to a multibyte string without changing
873 the number of characters. Characters 0200 trough 0237 are
874 converted to eight-bit characters. */
875
876 Lisp_Object
877 string_to_multibyte (Lisp_Object string)
878 {
879 unsigned char *buf;
880 ptrdiff_t nbytes;
881 Lisp_Object ret;
882 USE_SAFE_ALLOCA;
883
884 if (STRING_MULTIBYTE (string))
885 return string;
886
887 nbytes = count_size_as_multibyte (SDATA (string), SBYTES (string));
888 /* If all the chars are ASCII, they won't need any more bytes once
889 converted. */
890 if (nbytes == SBYTES (string))
891 return make_multibyte_string (SSDATA (string), nbytes, nbytes);
892
893 buf = SAFE_ALLOCA (nbytes);
894 memcpy (buf, SDATA (string), SBYTES (string));
895 str_to_multibyte (buf, nbytes, SBYTES (string));
896
897 ret = make_multibyte_string ((char *) buf, SCHARS (string), nbytes);
898 SAFE_FREE ();
899
900 return ret;
901 }
902
903
904 /* Convert STRING to a single-byte string. */
905
906 Lisp_Object
907 string_make_unibyte (Lisp_Object string)
908 {
909 ptrdiff_t nchars;
910 unsigned char *buf;
911 Lisp_Object ret;
912 USE_SAFE_ALLOCA;
913
914 if (! STRING_MULTIBYTE (string))
915 return string;
916
917 nchars = SCHARS (string);
918
919 buf = SAFE_ALLOCA (nchars);
920 copy_text (SDATA (string), buf, SBYTES (string),
921 1, 0);
922
923 ret = make_unibyte_string ((char *) buf, nchars);
924 SAFE_FREE ();
925
926 return ret;
927 }
928
929 DEFUN ("string-make-multibyte", Fstring_make_multibyte, Sstring_make_multibyte,
930 1, 1, 0,
931 doc: /* Return the multibyte equivalent of STRING.
932 If STRING is unibyte and contains non-ASCII characters, the function
933 `unibyte-char-to-multibyte' is used to convert each unibyte character
934 to a multibyte character. In this case, the returned string is a
935 newly created string with no text properties. If STRING is multibyte
936 or entirely ASCII, it is returned unchanged. In particular, when
937 STRING is unibyte and entirely ASCII, the returned string is unibyte.
938 \(When the characters are all ASCII, Emacs primitives will treat the
939 string the same way whether it is unibyte or multibyte.) */)
940 (Lisp_Object string)
941 {
942 CHECK_STRING (string);
943
944 return string_make_multibyte (string);
945 }
946
947 DEFUN ("string-make-unibyte", Fstring_make_unibyte, Sstring_make_unibyte,
948 1, 1, 0,
949 doc: /* Return the unibyte equivalent of STRING.
950 Multibyte character codes are converted to unibyte according to
951 `nonascii-translation-table' or, if that is nil, `nonascii-insert-offset'.
952 If the lookup in the translation table fails, this function takes just
953 the low 8 bits of each character. */)
954 (Lisp_Object string)
955 {
956 CHECK_STRING (string);
957
958 return string_make_unibyte (string);
959 }
960
961 DEFUN ("string-as-unibyte", Fstring_as_unibyte, Sstring_as_unibyte,
962 1, 1, 0,
963 doc: /* Return a unibyte string with the same individual bytes as STRING.
964 If STRING is unibyte, the result is STRING itself.
965 Otherwise it is a newly created string, with no text properties.
966 If STRING is multibyte and contains a character of charset
967 `eight-bit', it is converted to the corresponding single byte. */)
968 (Lisp_Object string)
969 {
970 CHECK_STRING (string);
971
972 if (STRING_MULTIBYTE (string))
973 {
974 unsigned char *str = (unsigned char *) xlispstrdup (string);
975 ptrdiff_t bytes = str_as_unibyte (str, SBYTES (string));
976
977 string = make_unibyte_string ((char *) str, bytes);
978 xfree (str);
979 }
980 return string;
981 }
982
983 DEFUN ("string-as-multibyte", Fstring_as_multibyte, Sstring_as_multibyte,
984 1, 1, 0,
985 doc: /* Return a multibyte string with the same individual bytes as STRING.
986 If STRING is multibyte, the result is STRING itself.
987 Otherwise it is a newly created string, with no text properties.
988
989 If STRING is unibyte and contains an individual 8-bit byte (i.e. not
990 part of a correct utf-8 sequence), it is converted to the corresponding
991 multibyte character of charset `eight-bit'.
992 See also `string-to-multibyte'.
993
994 Beware, this often doesn't really do what you think it does.
995 It is similar to (decode-coding-string STRING 'utf-8-emacs).
996 If you're not sure, whether to use `string-as-multibyte' or
997 `string-to-multibyte', use `string-to-multibyte'. */)
998 (Lisp_Object string)
999 {
1000 CHECK_STRING (string);
1001
1002 if (! STRING_MULTIBYTE (string))
1003 {
1004 Lisp_Object new_string;
1005 ptrdiff_t nchars, nbytes;
1006
1007 parse_str_as_multibyte (SDATA (string),
1008 SBYTES (string),
1009 &nchars, &nbytes);
1010 new_string = make_uninit_multibyte_string (nchars, nbytes);
1011 memcpy (SDATA (new_string), SDATA (string), SBYTES (string));
1012 if (nbytes != SBYTES (string))
1013 str_as_multibyte (SDATA (new_string), nbytes,
1014 SBYTES (string), NULL);
1015 string = new_string;
1016 set_string_intervals (string, NULL);
1017 }
1018 return string;
1019 }
1020
1021 DEFUN ("string-to-multibyte", Fstring_to_multibyte, Sstring_to_multibyte,
1022 1, 1, 0,
1023 doc: /* Return a multibyte string with the same individual chars as STRING.
1024 If STRING is multibyte, the result is STRING itself.
1025 Otherwise it is a newly created string, with no text properties.
1026
1027 If STRING is unibyte and contains an 8-bit byte, it is converted to
1028 the corresponding multibyte character of charset `eight-bit'.
1029
1030 This differs from `string-as-multibyte' by converting each byte of a correct
1031 utf-8 sequence to an eight-bit character, not just bytes that don't form a
1032 correct sequence. */)
1033 (Lisp_Object string)
1034 {
1035 CHECK_STRING (string);
1036
1037 return string_to_multibyte (string);
1038 }
1039
1040 DEFUN ("string-to-unibyte", Fstring_to_unibyte, Sstring_to_unibyte,
1041 1, 1, 0,
1042 doc: /* Return a unibyte string with the same individual chars as STRING.
1043 If STRING is unibyte, the result is STRING itself.
1044 Otherwise it is a newly created string, with no text properties,
1045 where each `eight-bit' character is converted to the corresponding byte.
1046 If STRING contains a non-ASCII, non-`eight-bit' character,
1047 an error is signaled. */)
1048 (Lisp_Object string)
1049 {
1050 CHECK_STRING (string);
1051
1052 if (STRING_MULTIBYTE (string))
1053 {
1054 ptrdiff_t chars = SCHARS (string);
1055 unsigned char *str = xmalloc_atomic (chars);
1056 ptrdiff_t converted = str_to_unibyte (SDATA (string), str, chars);
1057
1058 if (converted < chars)
1059 error ("Can't convert the %"pD"dth character to unibyte", converted);
1060 string = make_unibyte_string ((char *) str, chars);
1061 xfree (str);
1062 }
1063 return string;
1064 }
1065
1066 \f
1067 DEFUN ("copy-alist", Fcopy_alist, Scopy_alist, 1, 1, 0,
1068 doc: /* Return a copy of ALIST.
1069 This is an alist which represents the same mapping from objects to objects,
1070 but does not share the alist structure with ALIST.
1071 The objects mapped (cars and cdrs of elements of the alist)
1072 are shared, however.
1073 Elements of ALIST that are not conses are also shared. */)
1074 (Lisp_Object alist)
1075 {
1076 register Lisp_Object tem;
1077
1078 CHECK_LIST (alist);
1079 if (NILP (alist))
1080 return alist;
1081 alist = concat (1, &alist, Lisp_Cons, 0);
1082 for (tem = alist; CONSP (tem); tem = XCDR (tem))
1083 {
1084 register Lisp_Object car;
1085 car = XCAR (tem);
1086
1087 if (CONSP (car))
1088 XSETCAR (tem, Fcons (XCAR (car), XCDR (car)));
1089 }
1090 return alist;
1091 }
1092
1093 /* Check that ARRAY can have a valid subarray [FROM..TO),
1094 given that its size is SIZE.
1095 If FROM is nil, use 0; if TO is nil, use SIZE.
1096 Count negative values backwards from the end.
1097 Set *IFROM and *ITO to the two indexes used. */
1098
1099 void
1100 validate_subarray (Lisp_Object array, Lisp_Object from, Lisp_Object to,
1101 ptrdiff_t size, ptrdiff_t *ifrom, ptrdiff_t *ito)
1102 {
1103 EMACS_INT f, t;
1104
1105 if (INTEGERP (from))
1106 {
1107 f = XINT (from);
1108 if (f < 0)
1109 f += size;
1110 }
1111 else if (NILP (from))
1112 f = 0;
1113 else
1114 wrong_type_argument (Qintegerp, from);
1115
1116 if (INTEGERP (to))
1117 {
1118 t = XINT (to);
1119 if (t < 0)
1120 t += size;
1121 }
1122 else if (NILP (to))
1123 t = size;
1124 else
1125 wrong_type_argument (Qintegerp, to);
1126
1127 if (! (0 <= f && f <= t && t <= size))
1128 args_out_of_range_3 (array, from, to);
1129
1130 *ifrom = f;
1131 *ito = t;
1132 }
1133
1134 DEFUN ("substring", Fsubstring, Ssubstring, 1, 3, 0,
1135 doc: /* Return a new string whose contents are a substring of STRING.
1136 The returned string consists of the characters between index FROM
1137 \(inclusive) and index TO (exclusive) of STRING. FROM and TO are
1138 zero-indexed: 0 means the first character of STRING. Negative values
1139 are counted from the end of STRING. If TO is nil, the substring runs
1140 to the end of STRING.
1141
1142 The STRING argument may also be a vector. In that case, the return
1143 value is a new vector that contains the elements between index FROM
1144 \(inclusive) and index TO (exclusive) of that vector argument.
1145
1146 With one argument, just copy STRING (with properties, if any). */)
1147 (Lisp_Object string, Lisp_Object from, Lisp_Object to)
1148 {
1149 Lisp_Object res;
1150 ptrdiff_t size, ifrom, ito;
1151
1152 if (STRINGP (string))
1153 size = SCHARS (string);
1154 else if (VECTORP (string))
1155 size = ASIZE (string);
1156 else
1157 wrong_type_argument (Qarrayp, string);
1158
1159 validate_subarray (string, from, to, size, &ifrom, &ito);
1160
1161 if (STRINGP (string))
1162 {
1163 ptrdiff_t from_byte
1164 = !ifrom ? 0 : string_char_to_byte (string, ifrom);
1165 ptrdiff_t to_byte
1166 = ito == size ? SBYTES (string) : string_char_to_byte (string, ito);
1167 res = make_specified_string (SSDATA (string) + from_byte,
1168 ito - ifrom, to_byte - from_byte,
1169 STRING_MULTIBYTE (string));
1170 copy_text_properties (make_number (ifrom), make_number (ito),
1171 string, make_number (0), res, Qnil);
1172 }
1173 else
1174 res = Fvector (ito - ifrom, aref_addr (string, ifrom));
1175
1176 return res;
1177 }
1178
1179
1180 DEFUN ("substring-no-properties", Fsubstring_no_properties, Ssubstring_no_properties, 1, 3, 0,
1181 doc: /* Return a substring of STRING, without text properties.
1182 It starts at index FROM and ends before TO.
1183 TO may be nil or omitted; then the substring runs to the end of STRING.
1184 If FROM is nil or omitted, the substring starts at the beginning of STRING.
1185 If FROM or TO is negative, it counts from the end.
1186
1187 With one argument, just copy STRING without its properties. */)
1188 (Lisp_Object string, register Lisp_Object from, Lisp_Object to)
1189 {
1190 ptrdiff_t from_char, to_char, from_byte, to_byte, size;
1191
1192 CHECK_STRING (string);
1193
1194 size = SCHARS (string);
1195 validate_subarray (string, from, to, size, &from_char, &to_char);
1196
1197 from_byte = !from_char ? 0 : string_char_to_byte (string, from_char);
1198 to_byte =
1199 to_char == size ? SBYTES (string) : string_char_to_byte (string, to_char);
1200 return make_specified_string (SSDATA (string) + from_byte,
1201 to_char - from_char, to_byte - from_byte,
1202 STRING_MULTIBYTE (string));
1203 }
1204
1205 /* Extract a substring of STRING, giving start and end positions
1206 both in characters and in bytes. */
1207
1208 Lisp_Object
1209 substring_both (Lisp_Object string, ptrdiff_t from, ptrdiff_t from_byte,
1210 ptrdiff_t to, ptrdiff_t to_byte)
1211 {
1212 Lisp_Object res;
1213 ptrdiff_t size;
1214
1215 CHECK_VECTOR_OR_STRING (string);
1216
1217 size = STRINGP (string) ? SCHARS (string) : ASIZE (string);
1218
1219 if (!(0 <= from && from <= to && to <= size))
1220 args_out_of_range_3 (string, make_number (from), make_number (to));
1221
1222 if (STRINGP (string))
1223 {
1224 res = make_specified_string (SSDATA (string) + from_byte,
1225 to - from, to_byte - from_byte,
1226 STRING_MULTIBYTE (string));
1227 copy_text_properties (make_number (from), make_number (to),
1228 string, make_number (0), res, Qnil);
1229 }
1230 else
1231 res = Fvector (to - from, aref_addr (string, from));
1232
1233 return res;
1234 }
1235 \f
1236 DEFUN ("nthcdr", Fnthcdr, Snthcdr, 2, 2, 0,
1237 doc: /* Take cdr N times on LIST, return the result. */)
1238 (Lisp_Object n, Lisp_Object list)
1239 {
1240 EMACS_INT i, num;
1241 CHECK_NUMBER (n);
1242 num = XINT (n);
1243 for (i = 0; i < num && !NILP (list); i++)
1244 {
1245 QUIT;
1246 CHECK_LIST_CONS (list, list);
1247 list = XCDR (list);
1248 }
1249 return list;
1250 }
1251
1252 DEFUN ("nth", Fnth, Snth, 2, 2, 0,
1253 doc: /* Return the Nth element of LIST.
1254 N counts from zero. If LIST is not that long, nil is returned. */)
1255 (Lisp_Object n, Lisp_Object list)
1256 {
1257 return Fcar (Fnthcdr (n, list));
1258 }
1259
1260 DEFUN ("elt", Felt, Selt, 2, 2, 0,
1261 doc: /* Return element of SEQUENCE at index N. */)
1262 (register Lisp_Object sequence, Lisp_Object n)
1263 {
1264 CHECK_NUMBER (n);
1265 if (CONSP (sequence) || NILP (sequence))
1266 return Fcar (Fnthcdr (n, sequence));
1267
1268 /* Faref signals a "not array" error, so check here. */
1269 CHECK_ARRAY (sequence, Qsequencep);
1270 return Faref (sequence, n);
1271 }
1272
1273 DEFUN ("member", Fmember, Smember, 2, 2, 0,
1274 doc: /* Return non-nil if ELT is an element of LIST. Comparison done with `equal'.
1275 The value is actually the tail of LIST whose car is ELT. */)
1276 (register Lisp_Object elt, Lisp_Object list)
1277 {
1278 register Lisp_Object tail;
1279 for (tail = list; CONSP (tail); tail = XCDR (tail))
1280 {
1281 register Lisp_Object tem;
1282 CHECK_LIST_CONS (tail, list);
1283 tem = XCAR (tail);
1284 if (! NILP (Fequal (elt, tem)))
1285 return tail;
1286 QUIT;
1287 }
1288 return Qnil;
1289 }
1290
1291 DEFUN ("memq", Fmemq, Smemq, 2, 2, 0,
1292 doc: /* Return non-nil if ELT is an element of LIST. Comparison done with `eq'.
1293 The value is actually the tail of LIST whose car is ELT. */)
1294 (register Lisp_Object elt, Lisp_Object list)
1295 {
1296 while (1)
1297 {
1298 if (!CONSP (list) || EQ (XCAR (list), elt))
1299 break;
1300
1301 list = XCDR (list);
1302 if (!CONSP (list) || EQ (XCAR (list), elt))
1303 break;
1304
1305 list = XCDR (list);
1306 if (!CONSP (list) || EQ (XCAR (list), elt))
1307 break;
1308
1309 list = XCDR (list);
1310 QUIT;
1311 }
1312
1313 CHECK_LIST (list);
1314 return list;
1315 }
1316
1317 DEFUN ("memql", Fmemql, Smemql, 2, 2, 0,
1318 doc: /* Return non-nil if ELT is an element of LIST. Comparison done with `eql'.
1319 The value is actually the tail of LIST whose car is ELT. */)
1320 (register Lisp_Object elt, Lisp_Object list)
1321 {
1322 register Lisp_Object tail;
1323
1324 for (tail = list; CONSP (tail); tail = XCDR (tail))
1325 {
1326 register Lisp_Object tem;
1327 CHECK_LIST_CONS (tail, list);
1328 tem = XCAR (tail);
1329 if (!NILP (Feql (elt, tem)))
1330 return tail;
1331 QUIT;
1332 }
1333 return Qnil;
1334 }
1335
1336 DEFUN ("assq", Fassq, Sassq, 2, 2, 0,
1337 doc: /* Return non-nil if KEY is `eq' to the car of an element of LIST.
1338 The value is actually the first element of LIST whose car is KEY.
1339 Elements of LIST that are not conses are ignored. */)
1340 (Lisp_Object key, Lisp_Object list)
1341 {
1342 while (1)
1343 {
1344 if (!CONSP (list)
1345 || (CONSP (XCAR (list))
1346 && EQ (XCAR (XCAR (list)), key)))
1347 break;
1348
1349 list = XCDR (list);
1350 if (!CONSP (list)
1351 || (CONSP (XCAR (list))
1352 && EQ (XCAR (XCAR (list)), key)))
1353 break;
1354
1355 list = XCDR (list);
1356 if (!CONSP (list)
1357 || (CONSP (XCAR (list))
1358 && EQ (XCAR (XCAR (list)), key)))
1359 break;
1360
1361 list = XCDR (list);
1362 QUIT;
1363 }
1364
1365 return CAR (list);
1366 }
1367
1368 /* Like Fassq but never report an error and do not allow quits.
1369 Use only on lists known never to be circular. */
1370
1371 Lisp_Object
1372 assq_no_quit (Lisp_Object key, Lisp_Object list)
1373 {
1374 while (CONSP (list)
1375 && (!CONSP (XCAR (list))
1376 || !EQ (XCAR (XCAR (list)), key)))
1377 list = XCDR (list);
1378
1379 return CAR_SAFE (list);
1380 }
1381
1382 DEFUN ("assoc", Fassoc, Sassoc, 2, 2, 0,
1383 doc: /* Return non-nil if KEY is `equal' to the car of an element of LIST.
1384 The value is actually the first element of LIST whose car equals KEY. */)
1385 (Lisp_Object key, Lisp_Object list)
1386 {
1387 Lisp_Object car;
1388
1389 while (1)
1390 {
1391 if (!CONSP (list)
1392 || (CONSP (XCAR (list))
1393 && (car = XCAR (XCAR (list)),
1394 EQ (car, key) || !NILP (Fequal (car, key)))))
1395 break;
1396
1397 list = XCDR (list);
1398 if (!CONSP (list)
1399 || (CONSP (XCAR (list))
1400 && (car = XCAR (XCAR (list)),
1401 EQ (car, key) || !NILP (Fequal (car, key)))))
1402 break;
1403
1404 list = XCDR (list);
1405 if (!CONSP (list)
1406 || (CONSP (XCAR (list))
1407 && (car = XCAR (XCAR (list)),
1408 EQ (car, key) || !NILP (Fequal (car, key)))))
1409 break;
1410
1411 list = XCDR (list);
1412 QUIT;
1413 }
1414
1415 return CAR (list);
1416 }
1417
1418 /* Like Fassoc but never report an error and do not allow quits.
1419 Use only on lists known never to be circular. */
1420
1421 Lisp_Object
1422 assoc_no_quit (Lisp_Object key, Lisp_Object list)
1423 {
1424 while (CONSP (list)
1425 && (!CONSP (XCAR (list))
1426 || (!EQ (XCAR (XCAR (list)), key)
1427 && NILP (Fequal (XCAR (XCAR (list)), key)))))
1428 list = XCDR (list);
1429
1430 return CONSP (list) ? XCAR (list) : Qnil;
1431 }
1432
1433 DEFUN ("rassq", Frassq, Srassq, 2, 2, 0,
1434 doc: /* Return non-nil if KEY is `eq' to the cdr of an element of LIST.
1435 The value is actually the first element of LIST whose cdr is KEY. */)
1436 (register Lisp_Object key, Lisp_Object list)
1437 {
1438 while (1)
1439 {
1440 if (!CONSP (list)
1441 || (CONSP (XCAR (list))
1442 && EQ (XCDR (XCAR (list)), key)))
1443 break;
1444
1445 list = XCDR (list);
1446 if (!CONSP (list)
1447 || (CONSP (XCAR (list))
1448 && EQ (XCDR (XCAR (list)), key)))
1449 break;
1450
1451 list = XCDR (list);
1452 if (!CONSP (list)
1453 || (CONSP (XCAR (list))
1454 && EQ (XCDR (XCAR (list)), key)))
1455 break;
1456
1457 list = XCDR (list);
1458 QUIT;
1459 }
1460
1461 return CAR (list);
1462 }
1463
1464 DEFUN ("rassoc", Frassoc, Srassoc, 2, 2, 0,
1465 doc: /* Return non-nil if KEY is `equal' to the cdr of an element of LIST.
1466 The value is actually the first element of LIST whose cdr equals KEY. */)
1467 (Lisp_Object key, Lisp_Object list)
1468 {
1469 Lisp_Object cdr;
1470
1471 while (1)
1472 {
1473 if (!CONSP (list)
1474 || (CONSP (XCAR (list))
1475 && (cdr = XCDR (XCAR (list)),
1476 EQ (cdr, key) || !NILP (Fequal (cdr, key)))))
1477 break;
1478
1479 list = XCDR (list);
1480 if (!CONSP (list)
1481 || (CONSP (XCAR (list))
1482 && (cdr = XCDR (XCAR (list)),
1483 EQ (cdr, key) || !NILP (Fequal (cdr, key)))))
1484 break;
1485
1486 list = XCDR (list);
1487 if (!CONSP (list)
1488 || (CONSP (XCAR (list))
1489 && (cdr = XCDR (XCAR (list)),
1490 EQ (cdr, key) || !NILP (Fequal (cdr, key)))))
1491 break;
1492
1493 list = XCDR (list);
1494 QUIT;
1495 }
1496
1497 return CAR (list);
1498 }
1499 \f
1500 DEFUN ("delq", Fdelq, Sdelq, 2, 2, 0,
1501 doc: /* Delete members of LIST which are `eq' to ELT, and return the result.
1502 More precisely, this function skips any members `eq' to ELT at the
1503 front of LIST, then removes members `eq' to ELT from the remaining
1504 sublist by modifying its list structure, then returns the resulting
1505 list.
1506
1507 Write `(setq foo (delq element foo))' to be sure of correctly changing
1508 the value of a list `foo'. */)
1509 (register Lisp_Object elt, Lisp_Object list)
1510 {
1511 Lisp_Object tail, tortoise, prev = Qnil;
1512 bool skip;
1513
1514 FOR_EACH_TAIL (tail, list, tortoise, skip)
1515 {
1516 Lisp_Object tem = XCAR (tail);
1517 if (EQ (elt, tem))
1518 {
1519 if (NILP (prev))
1520 list = XCDR (tail);
1521 else
1522 Fsetcdr (prev, XCDR (tail));
1523 }
1524 else
1525 prev = tail;
1526 }
1527 return list;
1528 }
1529
1530 DEFUN ("delete", Fdelete, Sdelete, 2, 2, 0,
1531 doc: /* Delete members of SEQ which are `equal' to ELT, and return the result.
1532 SEQ must be a sequence (i.e. a list, a vector, or a string).
1533 The return value is a sequence of the same type.
1534
1535 If SEQ is a list, this behaves like `delq', except that it compares
1536 with `equal' instead of `eq'. In particular, it may remove elements
1537 by altering the list structure.
1538
1539 If SEQ is not a list, deletion is never performed destructively;
1540 instead this function creates and returns a new vector or string.
1541
1542 Write `(setq foo (delete element foo))' to be sure of correctly
1543 changing the value of a sequence `foo'. */)
1544 (Lisp_Object elt, Lisp_Object seq)
1545 {
1546 if (VECTORP (seq))
1547 {
1548 ptrdiff_t i, n;
1549
1550 for (i = n = 0; i < ASIZE (seq); ++i)
1551 if (NILP (Fequal (AREF (seq, i), elt)))
1552 ++n;
1553
1554 if (n != ASIZE (seq))
1555 {
1556 struct Lisp_Vector *p = allocate_vector (n);
1557
1558 for (i = n = 0; i < ASIZE (seq); ++i)
1559 if (NILP (Fequal (AREF (seq, i), elt)))
1560 p->contents[n++] = AREF (seq, i);
1561
1562 XSETVECTOR (seq, p);
1563 }
1564 }
1565 else if (STRINGP (seq))
1566 {
1567 ptrdiff_t i, ibyte, nchars, nbytes, cbytes;
1568 int c;
1569
1570 for (i = nchars = nbytes = ibyte = 0;
1571 i < SCHARS (seq);
1572 ++i, ibyte += cbytes)
1573 {
1574 if (STRING_MULTIBYTE (seq))
1575 {
1576 c = STRING_CHAR (SDATA (seq) + ibyte);
1577 cbytes = CHAR_BYTES (c);
1578 }
1579 else
1580 {
1581 c = SREF (seq, i);
1582 cbytes = 1;
1583 }
1584
1585 if (!INTEGERP (elt) || c != XINT (elt))
1586 {
1587 ++nchars;
1588 nbytes += cbytes;
1589 }
1590 }
1591
1592 if (nchars != SCHARS (seq))
1593 {
1594 Lisp_Object tem;
1595
1596 tem = make_uninit_multibyte_string (nchars, nbytes);
1597 if (!STRING_MULTIBYTE (seq))
1598 STRING_SET_UNIBYTE (tem);
1599
1600 for (i = nchars = nbytes = ibyte = 0;
1601 i < SCHARS (seq);
1602 ++i, ibyte += cbytes)
1603 {
1604 if (STRING_MULTIBYTE (seq))
1605 {
1606 c = STRING_CHAR (SDATA (seq) + ibyte);
1607 cbytes = CHAR_BYTES (c);
1608 }
1609 else
1610 {
1611 c = SREF (seq, i);
1612 cbytes = 1;
1613 }
1614
1615 if (!INTEGERP (elt) || c != XINT (elt))
1616 {
1617 unsigned char *from = SDATA (seq) + ibyte;
1618 unsigned char *to = SDATA (tem) + nbytes;
1619 ptrdiff_t n;
1620
1621 ++nchars;
1622 nbytes += cbytes;
1623
1624 for (n = cbytes; n--; )
1625 *to++ = *from++;
1626 }
1627 }
1628
1629 seq = tem;
1630 }
1631 }
1632 else
1633 {
1634 Lisp_Object tail, prev;
1635
1636 for (tail = seq, prev = Qnil; CONSP (tail); tail = XCDR (tail))
1637 {
1638 CHECK_LIST_CONS (tail, seq);
1639
1640 if (!NILP (Fequal (elt, XCAR (tail))))
1641 {
1642 if (NILP (prev))
1643 seq = XCDR (tail);
1644 else
1645 Fsetcdr (prev, XCDR (tail));
1646 }
1647 else
1648 prev = tail;
1649 QUIT;
1650 }
1651 }
1652
1653 return seq;
1654 }
1655
1656 DEFUN ("nreverse", Fnreverse, Snreverse, 1, 1, 0,
1657 doc: /* Reverse order of items in a list, vector or string SEQ.
1658 If SEQ is a list, it should be nil-terminated.
1659 This function may destructively modify SEQ to produce the value. */)
1660 (Lisp_Object seq)
1661 {
1662 if (NILP (seq))
1663 return seq;
1664 else if (STRINGP (seq))
1665 return Freverse (seq);
1666 else if (CONSP (seq))
1667 {
1668 Lisp_Object prev, tail, next;
1669
1670 for (prev = Qnil, tail = seq; !NILP (tail); tail = next)
1671 {
1672 QUIT;
1673 CHECK_LIST_CONS (tail, tail);
1674 next = XCDR (tail);
1675 Fsetcdr (tail, prev);
1676 prev = tail;
1677 }
1678 seq = prev;
1679 }
1680 else if (VECTORP (seq))
1681 {
1682 ptrdiff_t i, size = ASIZE (seq);
1683
1684 for (i = 0; i < size / 2; i++)
1685 {
1686 Lisp_Object tem = AREF (seq, i);
1687 ASET (seq, i, AREF (seq, size - i - 1));
1688 ASET (seq, size - i - 1, tem);
1689 }
1690 }
1691 else if (BOOL_VECTOR_P (seq))
1692 {
1693 ptrdiff_t i, size = bool_vector_size (seq);
1694
1695 for (i = 0; i < size / 2; i++)
1696 {
1697 bool tem = bool_vector_bitref (seq, i);
1698 bool_vector_set (seq, i, bool_vector_bitref (seq, size - i - 1));
1699 bool_vector_set (seq, size - i - 1, tem);
1700 }
1701 }
1702 else
1703 wrong_type_argument (Qarrayp, seq);
1704 return seq;
1705 }
1706
1707 DEFUN ("reverse", Freverse, Sreverse, 1, 1, 0,
1708 doc: /* Return the reversed copy of list, vector, or string SEQ.
1709 See also the function `nreverse', which is used more often. */)
1710 (Lisp_Object seq)
1711 {
1712 Lisp_Object new;
1713
1714 if (NILP (seq))
1715 return Qnil;
1716 else if (CONSP (seq))
1717 {
1718 for (new = Qnil; CONSP (seq); seq = XCDR (seq))
1719 {
1720 QUIT;
1721 new = Fcons (XCAR (seq), new);
1722 }
1723 CHECK_LIST_END (seq, seq);
1724 }
1725 else if (VECTORP (seq))
1726 {
1727 ptrdiff_t i, size = ASIZE (seq);
1728
1729 new = make_uninit_vector (size);
1730 for (i = 0; i < size; i++)
1731 ASET (new, i, AREF (seq, size - i - 1));
1732 }
1733 else if (BOOL_VECTOR_P (seq))
1734 {
1735 ptrdiff_t i;
1736 EMACS_INT nbits = bool_vector_size (seq);
1737
1738 new = make_uninit_bool_vector (nbits);
1739 for (i = 0; i < nbits; i++)
1740 bool_vector_set (new, i, bool_vector_bitref (seq, nbits - i - 1));
1741 }
1742 else if (STRINGP (seq))
1743 {
1744 ptrdiff_t size = SCHARS (seq), bytes = SBYTES (seq);
1745
1746 if (size == bytes)
1747 {
1748 ptrdiff_t i;
1749
1750 new = make_uninit_string (size);
1751 for (i = 0; i < size; i++)
1752 SSET (new, i, SREF (seq, size - i - 1));
1753 }
1754 else
1755 {
1756 unsigned char *p, *q;
1757
1758 new = make_uninit_multibyte_string (size, bytes);
1759 p = SDATA (seq), q = SDATA (new) + bytes;
1760 while (q > SDATA (new))
1761 {
1762 int ch, len;
1763
1764 ch = STRING_CHAR_AND_LENGTH (p, len);
1765 p += len, q -= len;
1766 CHAR_STRING (ch, q);
1767 }
1768 }
1769 }
1770 else
1771 wrong_type_argument (Qsequencep, seq);
1772 return new;
1773 }
1774 \f
1775 DEFUN ("sort", Fsort, Ssort, 2, 2, 0,
1776 doc: /* Sort LIST, stably, comparing elements using PREDICATE.
1777 Returns the sorted list. LIST is modified by side effects.
1778 PREDICATE is called with two elements of LIST, and should return non-nil
1779 if the first element should sort before the second. */)
1780 (Lisp_Object list, Lisp_Object predicate)
1781 {
1782 Lisp_Object front, back;
1783 register Lisp_Object len, tem;
1784 struct gcpro gcpro1, gcpro2;
1785 EMACS_INT length;
1786
1787 front = list;
1788 len = Flength (list);
1789 length = XINT (len);
1790 if (length < 2)
1791 return list;
1792
1793 XSETINT (len, (length / 2) - 1);
1794 tem = Fnthcdr (len, list);
1795 back = Fcdr (tem);
1796 Fsetcdr (tem, Qnil);
1797
1798 GCPRO2 (front, back);
1799 front = Fsort (front, predicate);
1800 back = Fsort (back, predicate);
1801 UNGCPRO;
1802 return merge (front, back, predicate);
1803 }
1804
1805 Lisp_Object
1806 merge (Lisp_Object org_l1, Lisp_Object org_l2, Lisp_Object pred)
1807 {
1808 Lisp_Object value;
1809 register Lisp_Object tail;
1810 Lisp_Object tem;
1811 register Lisp_Object l1, l2;
1812 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
1813
1814 l1 = org_l1;
1815 l2 = org_l2;
1816 tail = Qnil;
1817 value = Qnil;
1818
1819 /* It is sufficient to protect org_l1 and org_l2.
1820 When l1 and l2 are updated, we copy the new values
1821 back into the org_ vars. */
1822 GCPRO4 (org_l1, org_l2, pred, value);
1823
1824 while (1)
1825 {
1826 if (NILP (l1))
1827 {
1828 UNGCPRO;
1829 if (NILP (tail))
1830 return l2;
1831 Fsetcdr (tail, l2);
1832 return value;
1833 }
1834 if (NILP (l2))
1835 {
1836 UNGCPRO;
1837 if (NILP (tail))
1838 return l1;
1839 Fsetcdr (tail, l1);
1840 return value;
1841 }
1842 tem = call2 (pred, Fcar (l2), Fcar (l1));
1843 if (NILP (tem))
1844 {
1845 tem = l1;
1846 l1 = Fcdr (l1);
1847 org_l1 = l1;
1848 }
1849 else
1850 {
1851 tem = l2;
1852 l2 = Fcdr (l2);
1853 org_l2 = l2;
1854 }
1855 if (NILP (tail))
1856 value = tem;
1857 else
1858 Fsetcdr (tail, tem);
1859 tail = tem;
1860 }
1861 }
1862
1863 \f
1864 /* This does not check for quits. That is safe since it must terminate. */
1865
1866 DEFUN ("plist-get", Fplist_get, Splist_get, 2, 2, 0,
1867 doc: /* Extract a value from a property list.
1868 PLIST is a property list, which is a list of the form
1869 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value
1870 corresponding to the given PROP, or nil if PROP is not one of the
1871 properties on the list. This function never signals an error. */)
1872 (Lisp_Object plist, Lisp_Object prop)
1873 {
1874 Lisp_Object tail, halftail;
1875
1876 /* halftail is used to detect circular lists. */
1877 tail = halftail = plist;
1878 while (CONSP (tail) && CONSP (XCDR (tail)))
1879 {
1880 if (EQ (prop, XCAR (tail)))
1881 return XCAR (XCDR (tail));
1882
1883 tail = XCDR (XCDR (tail));
1884 halftail = XCDR (halftail);
1885 if (EQ (tail, halftail))
1886 break;
1887 }
1888
1889 return Qnil;
1890 }
1891
1892 DEFUN ("get", Fget, Sget, 2, 2, 0,
1893 doc: /* Return the value of SYMBOL's PROPNAME property.
1894 This is the last value stored with `(put SYMBOL PROPNAME VALUE)'. */)
1895 (Lisp_Object symbol, Lisp_Object propname)
1896 {
1897 CHECK_SYMBOL (symbol);
1898 return Fplist_get (XSYMBOL (symbol)->plist, propname);
1899 }
1900
1901 DEFUN ("plist-put", Fplist_put, Splist_put, 3, 3, 0,
1902 doc: /* Change value in PLIST of PROP to VAL.
1903 PLIST is a property list, which is a list of the form
1904 \(PROP1 VALUE1 PROP2 VALUE2 ...). PROP is a symbol and VAL is any object.
1905 If PROP is already a property on the list, its value is set to VAL,
1906 otherwise the new PROP VAL pair is added. The new plist is returned;
1907 use `(setq x (plist-put x prop val))' to be sure to use the new value.
1908 The PLIST is modified by side effects. */)
1909 (Lisp_Object plist, register Lisp_Object prop, Lisp_Object val)
1910 {
1911 register Lisp_Object tail, prev;
1912 Lisp_Object newcell;
1913 prev = Qnil;
1914 for (tail = plist; CONSP (tail) && CONSP (XCDR (tail));
1915 tail = XCDR (XCDR (tail)))
1916 {
1917 if (EQ (prop, XCAR (tail)))
1918 {
1919 Fsetcar (XCDR (tail), val);
1920 return plist;
1921 }
1922
1923 prev = tail;
1924 QUIT;
1925 }
1926 newcell = Fcons (prop, Fcons (val, NILP (prev) ? plist : XCDR (XCDR (prev))));
1927 if (NILP (prev))
1928 return newcell;
1929 else
1930 Fsetcdr (XCDR (prev), newcell);
1931 return plist;
1932 }
1933
1934 DEFUN ("put", Fput, Sput, 3, 3, 0,
1935 doc: /* Store SYMBOL's PROPNAME property with value VALUE.
1936 It can be retrieved with `(get SYMBOL PROPNAME)'. */)
1937 (Lisp_Object symbol, Lisp_Object propname, Lisp_Object value)
1938 {
1939 CHECK_SYMBOL (symbol);
1940 set_symbol_plist
1941 (symbol, Fplist_put (XSYMBOL (symbol)->plist, propname, value));
1942 return value;
1943 }
1944 \f
1945 DEFUN ("lax-plist-get", Flax_plist_get, Slax_plist_get, 2, 2, 0,
1946 doc: /* Extract a value from a property list, comparing with `equal'.
1947 PLIST is a property list, which is a list of the form
1948 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value
1949 corresponding to the given PROP, or nil if PROP is not
1950 one of the properties on the list. */)
1951 (Lisp_Object plist, Lisp_Object prop)
1952 {
1953 Lisp_Object tail;
1954
1955 for (tail = plist;
1956 CONSP (tail) && CONSP (XCDR (tail));
1957 tail = XCDR (XCDR (tail)))
1958 {
1959 if (! NILP (Fequal (prop, XCAR (tail))))
1960 return XCAR (XCDR (tail));
1961
1962 QUIT;
1963 }
1964
1965 CHECK_LIST_END (tail, prop);
1966
1967 return Qnil;
1968 }
1969
1970 DEFUN ("lax-plist-put", Flax_plist_put, Slax_plist_put, 3, 3, 0,
1971 doc: /* Change value in PLIST of PROP to VAL, comparing with `equal'.
1972 PLIST is a property list, which is a list of the form
1973 \(PROP1 VALUE1 PROP2 VALUE2 ...). PROP and VAL are any objects.
1974 If PROP is already a property on the list, its value is set to VAL,
1975 otherwise the new PROP VAL pair is added. The new plist is returned;
1976 use `(setq x (lax-plist-put x prop val))' to be sure to use the new value.
1977 The PLIST is modified by side effects. */)
1978 (Lisp_Object plist, register Lisp_Object prop, Lisp_Object val)
1979 {
1980 register Lisp_Object tail, prev;
1981 Lisp_Object newcell;
1982 prev = Qnil;
1983 for (tail = plist; CONSP (tail) && CONSP (XCDR (tail));
1984 tail = XCDR (XCDR (tail)))
1985 {
1986 if (! NILP (Fequal (prop, XCAR (tail))))
1987 {
1988 Fsetcar (XCDR (tail), val);
1989 return plist;
1990 }
1991
1992 prev = tail;
1993 QUIT;
1994 }
1995 newcell = list2 (prop, val);
1996 if (NILP (prev))
1997 return newcell;
1998 else
1999 Fsetcdr (XCDR (prev), newcell);
2000 return plist;
2001 }
2002 \f
2003 DEFUN ("eql", Feql, Seql, 2, 2, 0,
2004 doc: /* Return t if the two args are the same Lisp object.
2005 Floating-point numbers of equal value are `eql', but they may not be `eq'. */)
2006 (Lisp_Object obj1, Lisp_Object obj2)
2007 {
2008 return scm_is_true (scm_eqv_p (obj1, obj2)) ? Qt : Qnil;
2009 }
2010
2011 DEFUN ("equal", Fequal, Sequal, 2, 2, 0,
2012 doc: /* Return t if two Lisp objects have similar structure and contents.
2013 They must have the same data type.
2014 Conses are compared by comparing the cars and the cdrs.
2015 Vectors and strings are compared element by element.
2016 Numbers are compared by value, but integers cannot equal floats.
2017 (Use `=' if you want integers and floats to be able to be equal.)
2018 Symbols must match exactly. */)
2019 (register Lisp_Object o1, Lisp_Object o2)
2020 {
2021 return scm_is_true (scm_equal_p (o1, o2)) ? Qt : Qnil;
2022 }
2023
2024 SCM compare_text_properties = SCM_BOOL_F;
2025
2026 DEFUN ("equal-including-properties", Fequal_including_properties, Sequal_including_properties, 2, 2, 0,
2027 doc: /* Return t if two Lisp objects have similar structure and contents.
2028 This is like `equal' except that it compares the text properties
2029 of strings. (`equal' ignores text properties.) */)
2030 (register Lisp_Object o1, Lisp_Object o2)
2031 {
2032 Lisp_Object tem;
2033
2034 scm_dynwind_begin (0);
2035 scm_dynwind_fluid (compare_text_properties, SCM_BOOL_T);
2036 tem = Fequal (o1, o2);
2037 scm_dynwind_end ();
2038 return tem;
2039 }
2040
2041 static SCM
2042 misc_equal_p (SCM o1, SCM o2)
2043 {
2044 if (XMISCTYPE (o1) != XMISCTYPE (o2))
2045 return SCM_BOOL_F;
2046 if (OVERLAYP (o1))
2047 {
2048 if (NILP (Fequal (OVERLAY_START (o1), OVERLAY_START (o2)))
2049 || NILP (Fequal (OVERLAY_END (o1), OVERLAY_END (o2))))
2050 return SCM_BOOL_F;
2051 return scm_equal_p (XOVERLAY (o1)->plist, XOVERLAY (o2)->plist);
2052 }
2053 if (MARKERP (o1))
2054 {
2055 struct Lisp_Marker *m1 = XMARKER (o1), *m2 = XMARKER (o2);
2056 return scm_from_bool (m1->buffer == m2->buffer
2057 && (m1->buffer == 0
2058 || m1->bytepos == m2->bytepos));
2059 }
2060 return SCM_BOOL_F;
2061 }
2062
2063 static SCM
2064 vectorlike_equal_p (SCM o1, SCM o2)
2065 {
2066 int i;
2067 ptrdiff_t size = ASIZE (o1);
2068 /* Pseudovectors have the type encoded in the size field, so this
2069 test actually checks that the objects have the same type as well
2070 as the same size. */
2071 if (ASIZE (o2) != size)
2072 return SCM_BOOL_F;
2073 /* Boolvectors are compared much like strings. */
2074 if (BOOL_VECTOR_P (o1))
2075 {
2076 if (XBOOL_VECTOR (o1)->size != XBOOL_VECTOR (o2)->size)
2077 return SCM_BOOL_F;
2078 if (memcmp (XBOOL_VECTOR (o1)->data, XBOOL_VECTOR (o2)->data,
2079 ((XBOOL_VECTOR (o1)->size
2080 + BOOL_VECTOR_BITS_PER_CHAR - 1)
2081 / BOOL_VECTOR_BITS_PER_CHAR)))
2082 return SCM_BOOL_F;
2083 return SCM_BOOL_T;
2084 }
2085 if (WINDOW_CONFIGURATIONP (o1))
2086 return scm_from_bool (compare_window_configurations (o1, o2, 0));
2087
2088 /* Aside from them, only true vectors, char-tables, compiled
2089 functions, and fonts (font-spec, font-entity, font-object) are
2090 sensible to compare, so eliminate the others now. */
2091 if (size & PSEUDOVECTOR_FLAG)
2092 {
2093 if (((size & PVEC_TYPE_MASK) >> PSEUDOVECTOR_AREA_BITS)
2094 < PVEC_COMPILED)
2095 return SCM_BOOL_F;
2096 size &= PSEUDOVECTOR_SIZE_MASK;
2097 }
2098 for (i = 0; i < size; i++)
2099 {
2100 Lisp_Object v1, v2;
2101 v1 = AREF (o1, i);
2102 v2 = AREF (o2, i);
2103 if (scm_is_false (scm_equal_p (v1, v2)))
2104 return SCM_BOOL_F;
2105 }
2106 return SCM_BOOL_T;
2107 }
2108
2109 static SCM
2110 string_equal_p (SCM o1, SCM o2)
2111 {
2112 if (SCHARS (o1) != SCHARS (o2))
2113 return SCM_BOOL_F;
2114 if (SBYTES (o1) != SBYTES (o2))
2115 return SCM_BOOL_F;
2116 if (memcmp (SDATA (o1), SDATA (o2), SBYTES (o1)))
2117 return SCM_BOOL_F;
2118 if (scm_is_true (scm_fluid_ref (compare_text_properties))
2119 && !compare_string_intervals (o1, o2))
2120 return SCM_BOOL_F;
2121 return SCM_BOOL_T;
2122 }
2123 \f
2124
2125 DEFUN ("fillarray", Ffillarray, Sfillarray, 2, 2, 0,
2126 doc: /* Store each element of ARRAY with ITEM.
2127 ARRAY is a vector, string, char-table, or bool-vector. */)
2128 (Lisp_Object array, Lisp_Object item)
2129 {
2130 register ptrdiff_t size, idx;
2131
2132 if (VECTORP (array))
2133 for (idx = 0, size = ASIZE (array); idx < size; idx++)
2134 ASET (array, idx, item);
2135 else if (CHAR_TABLE_P (array))
2136 {
2137 int i;
2138
2139 for (i = 0; i < (1 << CHARTAB_SIZE_BITS_0); i++)
2140 set_char_table_contents (array, i, item);
2141 set_char_table_defalt (array, item);
2142 }
2143 else if (STRINGP (array))
2144 {
2145 register unsigned char *p = SDATA (array);
2146 int charval;
2147 CHECK_CHARACTER (item);
2148 charval = XFASTINT (item);
2149 size = SCHARS (array);
2150 if (STRING_MULTIBYTE (array))
2151 {
2152 unsigned char str[MAX_MULTIBYTE_LENGTH];
2153 int len = CHAR_STRING (charval, str);
2154 ptrdiff_t size_byte = SBYTES (array);
2155
2156 if (INT_MULTIPLY_OVERFLOW (SCHARS (array), len)
2157 || SCHARS (array) * len != size_byte)
2158 error ("Attempt to change byte length of a string");
2159 for (idx = 0; idx < size_byte; idx++)
2160 *p++ = str[idx % len];
2161 }
2162 else
2163 for (idx = 0; idx < size; idx++)
2164 p[idx] = charval;
2165 }
2166 else if (BOOL_VECTOR_P (array))
2167 return bool_vector_fill (array, item);
2168 else
2169 wrong_type_argument (Qarrayp, array);
2170 return array;
2171 }
2172
2173 DEFUN ("clear-string", Fclear_string, Sclear_string,
2174 1, 1, 0,
2175 doc: /* Clear the contents of STRING.
2176 This makes STRING unibyte and may change its length. */)
2177 (Lisp_Object string)
2178 {
2179 ptrdiff_t len;
2180 CHECK_STRING (string);
2181 len = SBYTES (string);
2182 memset (SDATA (string), 0, len);
2183 STRING_SET_CHARS (string, len);
2184 STRING_SET_UNIBYTE (string);
2185 return Qnil;
2186 }
2187 \f
2188 /* ARGSUSED */
2189 Lisp_Object
2190 nconc2 (Lisp_Object s1, Lisp_Object s2)
2191 {
2192 Lisp_Object args[2];
2193 args[0] = s1;
2194 args[1] = s2;
2195 return Fnconc (2, args);
2196 }
2197
2198 DEFUN ("nconc", Fnconc, Snconc, 0, MANY, 0,
2199 doc: /* Concatenate any number of lists by altering them.
2200 Only the last argument is not altered, and need not be a list.
2201 usage: (nconc &rest LISTS) */)
2202 (ptrdiff_t nargs, Lisp_Object *args)
2203 {
2204 ptrdiff_t argnum;
2205 register Lisp_Object tail, tem, val;
2206
2207 val = tail = Qnil;
2208
2209 for (argnum = 0; argnum < nargs; argnum++)
2210 {
2211 tem = args[argnum];
2212 if (NILP (tem)) continue;
2213
2214 if (NILP (val))
2215 val = tem;
2216
2217 if (argnum + 1 == nargs) break;
2218
2219 CHECK_LIST_CONS (tem, tem);
2220
2221 while (CONSP (tem))
2222 {
2223 tail = tem;
2224 tem = XCDR (tail);
2225 QUIT;
2226 }
2227
2228 tem = args[argnum + 1];
2229 Fsetcdr (tail, tem);
2230 if (NILP (tem))
2231 args[argnum + 1] = tail;
2232 }
2233
2234 return val;
2235 }
2236 \f
2237 /* This is the guts of all mapping functions.
2238 Apply FN to each element of SEQ, one by one,
2239 storing the results into elements of VALS, a C vector of Lisp_Objects.
2240 LENI is the length of VALS, which should also be the length of SEQ. */
2241
2242 static void
2243 mapcar1 (EMACS_INT leni, Lisp_Object *vals, Lisp_Object fn, Lisp_Object seq)
2244 {
2245 register Lisp_Object tail;
2246 Lisp_Object dummy;
2247 register EMACS_INT i;
2248 struct gcpro gcpro1, gcpro2, gcpro3;
2249
2250 if (vals)
2251 {
2252 /* Don't let vals contain any garbage when GC happens. */
2253 for (i = 0; i < leni; i++)
2254 vals[i] = Qnil;
2255
2256 GCPRO3 (dummy, fn, seq);
2257 gcpro1.var = vals;
2258 gcpro1.nvars = leni;
2259 }
2260 else
2261 GCPRO2 (fn, seq);
2262 /* We need not explicitly protect `tail' because it is used only on lists, and
2263 1) lists are not relocated and 2) the list is marked via `seq' so will not
2264 be freed */
2265
2266 if (VECTORP (seq) || COMPILEDP (seq))
2267 {
2268 for (i = 0; i < leni; i++)
2269 {
2270 dummy = call1 (fn, AREF (seq, i));
2271 if (vals)
2272 vals[i] = dummy;
2273 }
2274 }
2275 else if (BOOL_VECTOR_P (seq))
2276 {
2277 for (i = 0; i < leni; i++)
2278 {
2279 dummy = call1 (fn, bool_vector_ref (seq, i));
2280 if (vals)
2281 vals[i] = dummy;
2282 }
2283 }
2284 else if (STRINGP (seq))
2285 {
2286 ptrdiff_t i_byte;
2287
2288 for (i = 0, i_byte = 0; i < leni;)
2289 {
2290 int c;
2291 ptrdiff_t i_before = i;
2292
2293 FETCH_STRING_CHAR_ADVANCE (c, seq, i, i_byte);
2294 XSETFASTINT (dummy, c);
2295 dummy = call1 (fn, dummy);
2296 if (vals)
2297 vals[i_before] = dummy;
2298 }
2299 }
2300 else /* Must be a list, since Flength did not get an error */
2301 {
2302 tail = seq;
2303 for (i = 0; i < leni && CONSP (tail); i++)
2304 {
2305 dummy = call1 (fn, XCAR (tail));
2306 if (vals)
2307 vals[i] = dummy;
2308 tail = XCDR (tail);
2309 }
2310 }
2311
2312 UNGCPRO;
2313 }
2314
2315 DEFUN ("mapconcat", Fmapconcat, Smapconcat, 3, 3, 0,
2316 doc: /* Apply FUNCTION to each element of SEQUENCE, and concat the results as strings.
2317 In between each pair of results, stick in SEPARATOR. Thus, " " as
2318 SEPARATOR results in spaces between the values returned by FUNCTION.
2319 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
2320 (Lisp_Object function, Lisp_Object sequence, Lisp_Object separator)
2321 {
2322 Lisp_Object len;
2323 register EMACS_INT leni;
2324 EMACS_INT nargs;
2325 ptrdiff_t i;
2326 register Lisp_Object *args;
2327 struct gcpro gcpro1;
2328 Lisp_Object ret;
2329 USE_SAFE_ALLOCA;
2330
2331 len = Flength (sequence);
2332 if (CHAR_TABLE_P (sequence))
2333 wrong_type_argument (Qlistp, sequence);
2334 leni = XINT (len);
2335 nargs = leni + leni - 1;
2336 if (nargs < 0) return empty_unibyte_string;
2337
2338 SAFE_ALLOCA_LISP (args, nargs);
2339
2340 GCPRO1 (separator);
2341 mapcar1 (leni, args, function, sequence);
2342 UNGCPRO;
2343
2344 for (i = leni - 1; i > 0; i--)
2345 args[i + i] = args[i];
2346
2347 for (i = 1; i < nargs; i += 2)
2348 args[i] = separator;
2349
2350 ret = Fconcat (nargs, args);
2351 SAFE_FREE ();
2352
2353 return ret;
2354 }
2355
2356 DEFUN ("mapcar", Fmapcar, Smapcar, 2, 2, 0,
2357 doc: /* Apply FUNCTION to each element of SEQUENCE, and make a list of the results.
2358 The result is a list just as long as SEQUENCE.
2359 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
2360 (Lisp_Object function, Lisp_Object sequence)
2361 {
2362 register Lisp_Object len;
2363 register EMACS_INT leni;
2364 register Lisp_Object *args;
2365 Lisp_Object ret;
2366 USE_SAFE_ALLOCA;
2367
2368 len = Flength (sequence);
2369 if (CHAR_TABLE_P (sequence))
2370 wrong_type_argument (Qlistp, sequence);
2371 leni = XFASTINT (len);
2372
2373 SAFE_ALLOCA_LISP (args, leni);
2374
2375 mapcar1 (leni, args, function, sequence);
2376
2377 ret = Flist (leni, args);
2378 SAFE_FREE ();
2379
2380 return ret;
2381 }
2382
2383 DEFUN ("mapc", Fmapc, Smapc, 2, 2, 0,
2384 doc: /* Apply FUNCTION to each element of SEQUENCE for side effects only.
2385 Unlike `mapcar', don't accumulate the results. Return SEQUENCE.
2386 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
2387 (Lisp_Object function, Lisp_Object sequence)
2388 {
2389 register EMACS_INT leni;
2390
2391 leni = XFASTINT (Flength (sequence));
2392 if (CHAR_TABLE_P (sequence))
2393 wrong_type_argument (Qlistp, sequence);
2394 mapcar1 (leni, 0, function, sequence);
2395
2396 return sequence;
2397 }
2398 \f
2399 /* This is how C code calls `yes-or-no-p' and allows the user
2400 to redefined it.
2401
2402 Anything that calls this function must protect from GC! */
2403
2404 Lisp_Object
2405 do_yes_or_no_p (Lisp_Object prompt)
2406 {
2407 return call1 (intern ("yes-or-no-p"), prompt);
2408 }
2409
2410 /* Anything that calls this function must protect from GC! */
2411
2412 DEFUN ("yes-or-no-p", Fyes_or_no_p, Syes_or_no_p, 1, 1, 0,
2413 doc: /* Ask user a yes-or-no question.
2414 Return t if answer is yes, and nil if the answer is no.
2415 PROMPT is the string to display to ask the question. It should end in
2416 a space; `yes-or-no-p' adds \"(yes or no) \" to it.
2417
2418 The user must confirm the answer with RET, and can edit it until it
2419 has been confirmed.
2420
2421 If dialog boxes are supported, a dialog box will be used
2422 if `last-nonmenu-event' is nil, and `use-dialog-box' is non-nil. */)
2423 (Lisp_Object prompt)
2424 {
2425 register Lisp_Object ans;
2426 Lisp_Object args[2];
2427 struct gcpro gcpro1;
2428
2429 CHECK_STRING (prompt);
2430
2431 if ((NILP (last_nonmenu_event) || CONSP (last_nonmenu_event))
2432 && use_dialog_box)
2433 {
2434 Lisp_Object pane, menu, obj;
2435 redisplay_preserve_echo_area (4);
2436 pane = list2 (Fcons (build_string ("Yes"), Qt),
2437 Fcons (build_string ("No"), Qnil));
2438 GCPRO1 (pane);
2439 menu = Fcons (prompt, pane);
2440 obj = Fx_popup_dialog (Qt, menu, Qnil);
2441 UNGCPRO;
2442 return obj;
2443 }
2444
2445 args[0] = prompt;
2446 args[1] = build_string ("(yes or no) ");
2447 prompt = Fconcat (2, args);
2448
2449 GCPRO1 (prompt);
2450
2451 while (1)
2452 {
2453 ans = Fdowncase (Fread_from_minibuffer (prompt, Qnil, Qnil, Qnil,
2454 Qyes_or_no_p_history, Qnil,
2455 Qnil));
2456 if (SCHARS (ans) == 3 && !strcmp (SSDATA (ans), "yes"))
2457 {
2458 UNGCPRO;
2459 return Qt;
2460 }
2461 if (SCHARS (ans) == 2 && !strcmp (SSDATA (ans), "no"))
2462 {
2463 UNGCPRO;
2464 return Qnil;
2465 }
2466
2467 Fding (Qnil);
2468 Fdiscard_input ();
2469 message1 ("Please answer yes or no.");
2470 Fsleep_for (make_number (2), Qnil);
2471 }
2472 }
2473 \f
2474 DEFUN ("load-average", Fload_average, Sload_average, 0, 1, 0,
2475 doc: /* Return list of 1 minute, 5 minute and 15 minute load averages.
2476
2477 Each of the three load averages is multiplied by 100, then converted
2478 to integer.
2479
2480 When USE-FLOATS is non-nil, floats will be used instead of integers.
2481 These floats are not multiplied by 100.
2482
2483 If the 5-minute or 15-minute load averages are not available, return a
2484 shortened list, containing only those averages which are available.
2485
2486 An error is thrown if the load average can't be obtained. In some
2487 cases making it work would require Emacs being installed setuid or
2488 setgid so that it can read kernel information, and that usually isn't
2489 advisable. */)
2490 (Lisp_Object use_floats)
2491 {
2492 double load_ave[3];
2493 int loads = getloadavg (load_ave, 3);
2494 Lisp_Object ret = Qnil;
2495
2496 if (loads < 0)
2497 error ("load-average not implemented for this operating system");
2498
2499 while (loads-- > 0)
2500 {
2501 Lisp_Object load = (NILP (use_floats)
2502 ? make_number (100.0 * load_ave[loads])
2503 : make_float (load_ave[loads]));
2504 ret = Fcons (load, ret);
2505 }
2506
2507 return ret;
2508 }
2509 \f
2510 static Lisp_Object Qsubfeatures;
2511
2512 DEFUN ("featurep", Ffeaturep, Sfeaturep, 1, 2, 0,
2513 doc: /* Return t if FEATURE is present in this Emacs.
2514
2515 Use this to conditionalize execution of lisp code based on the
2516 presence or absence of Emacs or environment extensions.
2517 Use `provide' to declare that a feature is available. This function
2518 looks at the value of the variable `features'. The optional argument
2519 SUBFEATURE can be used to check a specific subfeature of FEATURE. */)
2520 (Lisp_Object feature, Lisp_Object subfeature)
2521 {
2522 register Lisp_Object tem;
2523 CHECK_SYMBOL (feature);
2524 tem = Fmemq (feature, Vfeatures);
2525 if (!NILP (tem) && !NILP (subfeature))
2526 tem = Fmember (subfeature, Fget (feature, Qsubfeatures));
2527 return (NILP (tem)) ? Qnil : Qt;
2528 }
2529
2530 static Lisp_Object Qfuncall;
2531
2532 DEFUN ("provide", Fprovide, Sprovide, 1, 2, 0,
2533 doc: /* Announce that FEATURE is a feature of the current Emacs.
2534 The optional argument SUBFEATURES should be a list of symbols listing
2535 particular subfeatures supported in this version of FEATURE. */)
2536 (Lisp_Object feature, Lisp_Object subfeatures)
2537 {
2538 register Lisp_Object tem;
2539 CHECK_SYMBOL (feature);
2540 CHECK_LIST (subfeatures);
2541 if (!NILP (Vautoload_queue))
2542 Vautoload_queue = Fcons (Fcons (make_number (0), Vfeatures),
2543 Vautoload_queue);
2544 tem = Fmemq (feature, Vfeatures);
2545 if (NILP (tem))
2546 Vfeatures = Fcons (feature, Vfeatures);
2547 if (!NILP (subfeatures))
2548 Fput (feature, Qsubfeatures, subfeatures);
2549 LOADHIST_ATTACH (Fcons (Qprovide, feature));
2550
2551 /* Run any load-hooks for this file. */
2552 tem = Fassq (feature, Vafter_load_alist);
2553 if (CONSP (tem))
2554 Fmapc (Qfuncall, XCDR (tem));
2555
2556 return feature;
2557 }
2558 \f
2559 /* `require' and its subroutines. */
2560
2561 /* List of features currently being require'd, innermost first. */
2562
2563 static Lisp_Object require_nesting_list;
2564
2565 static void
2566 require_unwind (Lisp_Object old_value)
2567 {
2568 require_nesting_list = old_value;
2569 }
2570
2571 DEFUN ("require", Frequire, Srequire, 1, 3, 0,
2572 doc: /* If feature FEATURE is not loaded, load it from FILENAME.
2573 If FEATURE is not a member of the list `features', then the feature
2574 is not loaded; so load the file FILENAME.
2575 If FILENAME is omitted, the printname of FEATURE is used as the file name,
2576 and `load' will try to load this name appended with the suffix `.elc' or
2577 `.el', in that order. The name without appended suffix will not be used.
2578 See `get-load-suffixes' for the complete list of suffixes.
2579 If the optional third argument NOERROR is non-nil,
2580 then return nil if the file is not found instead of signaling an error.
2581 Normally the return value is FEATURE.
2582 The normal messages at start and end of loading FILENAME are suppressed. */)
2583 (Lisp_Object feature, Lisp_Object filename, Lisp_Object noerror)
2584 {
2585 Lisp_Object tem;
2586 struct gcpro gcpro1, gcpro2;
2587 bool from_file = load_in_progress;
2588
2589 CHECK_SYMBOL (feature);
2590
2591 /* Record the presence of `require' in this file
2592 even if the feature specified is already loaded.
2593 But not more than once in any file,
2594 and not when we aren't loading or reading from a file. */
2595 if (!from_file)
2596 for (tem = Vcurrent_load_list; CONSP (tem); tem = XCDR (tem))
2597 if (NILP (XCDR (tem)) && STRINGP (XCAR (tem)))
2598 from_file = 1;
2599
2600 if (from_file)
2601 {
2602 tem = Fcons (Qrequire, feature);
2603 if (NILP (Fmember (tem, Vcurrent_load_list)))
2604 LOADHIST_ATTACH (tem);
2605 }
2606 tem = Fmemq (feature, Vfeatures);
2607
2608 if (NILP (tem))
2609 {
2610 ptrdiff_t count = SPECPDL_INDEX ();
2611 int nesting = 0;
2612
2613 /* This is to make sure that loadup.el gives a clear picture
2614 of what files are preloaded and when. */
2615 if (! NILP (Vpurify_flag))
2616 error ("(require %s) while preparing to dump",
2617 SDATA (SYMBOL_NAME (feature)));
2618
2619 /* A certain amount of recursive `require' is legitimate,
2620 but if we require the same feature recursively 3 times,
2621 signal an error. */
2622 tem = require_nesting_list;
2623 while (! NILP (tem))
2624 {
2625 if (! NILP (Fequal (feature, XCAR (tem))))
2626 nesting++;
2627 tem = XCDR (tem);
2628 }
2629 if (nesting > 3)
2630 error ("Recursive `require' for feature `%s'",
2631 SDATA (SYMBOL_NAME (feature)));
2632
2633 /* Update the list for any nested `require's that occur. */
2634 record_unwind_protect (require_unwind, require_nesting_list);
2635 require_nesting_list = Fcons (feature, require_nesting_list);
2636
2637 /* Value saved here is to be restored into Vautoload_queue */
2638 record_unwind_protect (un_autoload, Vautoload_queue);
2639 Vautoload_queue = Qt;
2640
2641 /* Load the file. */
2642 GCPRO2 (feature, filename);
2643 tem = Fload (NILP (filename) ? Fsymbol_name (feature) : filename,
2644 noerror, Qt, Qnil, (NILP (filename) ? Qt : Qnil));
2645 UNGCPRO;
2646
2647 /* If load failed entirely, return nil. */
2648 if (NILP (tem))
2649 return unbind_to (count, Qnil);
2650
2651 tem = Fmemq (feature, Vfeatures);
2652 if (NILP (tem))
2653 error ("Required feature `%s' was not provided",
2654 SDATA (SYMBOL_NAME (feature)));
2655
2656 /* Once loading finishes, don't undo it. */
2657 Vautoload_queue = Qt;
2658 feature = unbind_to (count, feature);
2659 }
2660
2661 return feature;
2662 }
2663 \f
2664 /* Primitives for work of the "widget" library.
2665 In an ideal world, this section would not have been necessary.
2666 However, lisp function calls being as slow as they are, it turns
2667 out that some functions in the widget library (wid-edit.el) are the
2668 bottleneck of Widget operation. Here is their translation to C,
2669 for the sole reason of efficiency. */
2670
2671 DEFUN ("plist-member", Fplist_member, Splist_member, 2, 2, 0,
2672 doc: /* Return non-nil if PLIST has the property PROP.
2673 PLIST is a property list, which is a list of the form
2674 \(PROP1 VALUE1 PROP2 VALUE2 ...\). PROP is a symbol.
2675 Unlike `plist-get', this allows you to distinguish between a missing
2676 property and a property with the value nil.
2677 The value is actually the tail of PLIST whose car is PROP. */)
2678 (Lisp_Object plist, Lisp_Object prop)
2679 {
2680 while (CONSP (plist) && !EQ (XCAR (plist), prop))
2681 {
2682 QUIT;
2683 plist = XCDR (plist);
2684 plist = CDR (plist);
2685 }
2686 return plist;
2687 }
2688
2689 DEFUN ("widget-put", Fwidget_put, Swidget_put, 3, 3, 0,
2690 doc: /* In WIDGET, set PROPERTY to VALUE.
2691 The value can later be retrieved with `widget-get'. */)
2692 (Lisp_Object widget, Lisp_Object property, Lisp_Object value)
2693 {
2694 CHECK_CONS (widget);
2695 XSETCDR (widget, Fplist_put (XCDR (widget), property, value));
2696 return value;
2697 }
2698
2699 DEFUN ("widget-get", Fwidget_get, Swidget_get, 2, 2, 0,
2700 doc: /* In WIDGET, get the value of PROPERTY.
2701 The value could either be specified when the widget was created, or
2702 later with `widget-put'. */)
2703 (Lisp_Object widget, Lisp_Object property)
2704 {
2705 Lisp_Object tmp;
2706
2707 while (1)
2708 {
2709 if (NILP (widget))
2710 return Qnil;
2711 CHECK_CONS (widget);
2712 tmp = Fplist_member (XCDR (widget), property);
2713 if (CONSP (tmp))
2714 {
2715 tmp = XCDR (tmp);
2716 return CAR (tmp);
2717 }
2718 tmp = XCAR (widget);
2719 if (NILP (tmp))
2720 return Qnil;
2721 widget = Fget (tmp, Qwidget_type);
2722 }
2723 }
2724
2725 DEFUN ("widget-apply", Fwidget_apply, Swidget_apply, 2, MANY, 0,
2726 doc: /* Apply the value of WIDGET's PROPERTY to the widget itself.
2727 ARGS are passed as extra arguments to the function.
2728 usage: (widget-apply WIDGET PROPERTY &rest ARGS) */)
2729 (ptrdiff_t nargs, Lisp_Object *args)
2730 {
2731 /* This function can GC. */
2732 Lisp_Object newargs[3];
2733 struct gcpro gcpro1, gcpro2;
2734 Lisp_Object result;
2735
2736 newargs[0] = Fwidget_get (args[0], args[1]);
2737 newargs[1] = args[0];
2738 newargs[2] = Flist (nargs - 2, args + 2);
2739 GCPRO2 (newargs[0], newargs[2]);
2740 result = Fapply (3, newargs);
2741 UNGCPRO;
2742 return result;
2743 }
2744
2745 #ifdef HAVE_LANGINFO_CODESET
2746 #include <langinfo.h>
2747 #endif
2748
2749 DEFUN ("locale-info", Flocale_info, Slocale_info, 1, 1, 0,
2750 doc: /* Access locale data ITEM for the current C locale, if available.
2751 ITEM should be one of the following:
2752
2753 `codeset', returning the character set as a string (locale item CODESET);
2754
2755 `days', returning a 7-element vector of day names (locale items DAY_n);
2756
2757 `months', returning a 12-element vector of month names (locale items MON_n);
2758
2759 `paper', returning a list (WIDTH HEIGHT) for the default paper size,
2760 both measured in millimeters (locale items PAPER_WIDTH, PAPER_HEIGHT).
2761
2762 If the system can't provide such information through a call to
2763 `nl_langinfo', or if ITEM isn't from the list above, return nil.
2764
2765 See also Info node `(libc)Locales'.
2766
2767 The data read from the system are decoded using `locale-coding-system'. */)
2768 (Lisp_Object item)
2769 {
2770 char *str = NULL;
2771 #ifdef HAVE_LANGINFO_CODESET
2772 Lisp_Object val;
2773 if (EQ (item, Qcodeset))
2774 {
2775 str = nl_langinfo (CODESET);
2776 return build_string (str);
2777 }
2778 #ifdef DAY_1
2779 else if (EQ (item, Qdays)) /* e.g. for calendar-day-name-array */
2780 {
2781 Lisp_Object v = Fmake_vector (make_number (7), Qnil);
2782 const int days[7] = {DAY_1, DAY_2, DAY_3, DAY_4, DAY_5, DAY_6, DAY_7};
2783 int i;
2784 struct gcpro gcpro1;
2785 GCPRO1 (v);
2786 synchronize_system_time_locale ();
2787 for (i = 0; i < 7; i++)
2788 {
2789 str = nl_langinfo (days[i]);
2790 val = build_unibyte_string (str);
2791 /* Fixme: Is this coding system necessarily right, even if
2792 it is consistent with CODESET? If not, what to do? */
2793 ASET (v, i, code_convert_string_norecord (val, Vlocale_coding_system,
2794 0));
2795 }
2796 UNGCPRO;
2797 return v;
2798 }
2799 #endif /* DAY_1 */
2800 #ifdef MON_1
2801 else if (EQ (item, Qmonths)) /* e.g. for calendar-month-name-array */
2802 {
2803 Lisp_Object v = Fmake_vector (make_number (12), Qnil);
2804 const int months[12] = {MON_1, MON_2, MON_3, MON_4, MON_5, MON_6, MON_7,
2805 MON_8, MON_9, MON_10, MON_11, MON_12};
2806 int i;
2807 struct gcpro gcpro1;
2808 GCPRO1 (v);
2809 synchronize_system_time_locale ();
2810 for (i = 0; i < 12; i++)
2811 {
2812 str = nl_langinfo (months[i]);
2813 val = build_unibyte_string (str);
2814 ASET (v, i, code_convert_string_norecord (val, Vlocale_coding_system,
2815 0));
2816 }
2817 UNGCPRO;
2818 return v;
2819 }
2820 #endif /* MON_1 */
2821 /* LC_PAPER stuff isn't defined as accessible in glibc as of 2.3.1,
2822 but is in the locale files. This could be used by ps-print. */
2823 #ifdef PAPER_WIDTH
2824 else if (EQ (item, Qpaper))
2825 return list2i (nl_langinfo (PAPER_WIDTH), nl_langinfo (PAPER_HEIGHT));
2826 #endif /* PAPER_WIDTH */
2827 #endif /* HAVE_LANGINFO_CODESET*/
2828 return Qnil;
2829 }
2830 \f
2831 /* base64 encode/decode functions (RFC 2045).
2832 Based on code from GNU recode. */
2833
2834 #define MIME_LINE_LENGTH 76
2835
2836 #define IS_ASCII(Character) \
2837 ((Character) < 128)
2838 #define IS_BASE64(Character) \
2839 (IS_ASCII (Character) && base64_char_to_value[Character] >= 0)
2840 #define IS_BASE64_IGNORABLE(Character) \
2841 ((Character) == ' ' || (Character) == '\t' || (Character) == '\n' \
2842 || (Character) == '\f' || (Character) == '\r')
2843
2844 /* Used by base64_decode_1 to retrieve a non-base64-ignorable
2845 character or return retval if there are no characters left to
2846 process. */
2847 #define READ_QUADRUPLET_BYTE(retval) \
2848 do \
2849 { \
2850 if (i == length) \
2851 { \
2852 if (nchars_return) \
2853 *nchars_return = nchars; \
2854 return (retval); \
2855 } \
2856 c = from[i++]; \
2857 } \
2858 while (IS_BASE64_IGNORABLE (c))
2859
2860 /* Table of characters coding the 64 values. */
2861 static const char base64_value_to_char[64] =
2862 {
2863 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', /* 0- 9 */
2864 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', /* 10-19 */
2865 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', /* 20-29 */
2866 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', /* 30-39 */
2867 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', /* 40-49 */
2868 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', /* 50-59 */
2869 '8', '9', '+', '/' /* 60-63 */
2870 };
2871
2872 /* Table of base64 values for first 128 characters. */
2873 static const short base64_char_to_value[128] =
2874 {
2875 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0- 9 */
2876 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 10- 19 */
2877 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 20- 29 */
2878 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 30- 39 */
2879 -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, /* 40- 49 */
2880 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, /* 50- 59 */
2881 -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, /* 60- 69 */
2882 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, /* 70- 79 */
2883 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, /* 80- 89 */
2884 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, /* 90- 99 */
2885 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, /* 100-109 */
2886 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, /* 110-119 */
2887 49, 50, 51, -1, -1, -1, -1, -1 /* 120-127 */
2888 };
2889
2890 /* The following diagram shows the logical steps by which three octets
2891 get transformed into four base64 characters.
2892
2893 .--------. .--------. .--------.
2894 |aaaaaabb| |bbbbcccc| |ccdddddd|
2895 `--------' `--------' `--------'
2896 6 2 4 4 2 6
2897 .--------+--------+--------+--------.
2898 |00aaaaaa|00bbbbbb|00cccccc|00dddddd|
2899 `--------+--------+--------+--------'
2900
2901 .--------+--------+--------+--------.
2902 |AAAAAAAA|BBBBBBBB|CCCCCCCC|DDDDDDDD|
2903 `--------+--------+--------+--------'
2904
2905 The octets are divided into 6 bit chunks, which are then encoded into
2906 base64 characters. */
2907
2908
2909 static ptrdiff_t base64_encode_1 (const char *, char *, ptrdiff_t, bool, bool);
2910 static ptrdiff_t base64_decode_1 (const char *, char *, ptrdiff_t, bool,
2911 ptrdiff_t *);
2912
2913 DEFUN ("base64-encode-region", Fbase64_encode_region, Sbase64_encode_region,
2914 2, 3, "r",
2915 doc: /* Base64-encode the region between BEG and END.
2916 Return the length of the encoded text.
2917 Optional third argument NO-LINE-BREAK means do not break long lines
2918 into shorter lines. */)
2919 (Lisp_Object beg, Lisp_Object end, Lisp_Object no_line_break)
2920 {
2921 char *encoded;
2922 ptrdiff_t allength, length;
2923 ptrdiff_t ibeg, iend, encoded_length;
2924 ptrdiff_t old_pos = PT;
2925 USE_SAFE_ALLOCA;
2926
2927 validate_region (&beg, &end);
2928
2929 ibeg = CHAR_TO_BYTE (XFASTINT (beg));
2930 iend = CHAR_TO_BYTE (XFASTINT (end));
2931 move_gap_both (XFASTINT (beg), ibeg);
2932
2933 /* We need to allocate enough room for encoding the text.
2934 We need 33 1/3% more space, plus a newline every 76
2935 characters, and then we round up. */
2936 length = iend - ibeg;
2937 allength = length + length/3 + 1;
2938 allength += allength / MIME_LINE_LENGTH + 1 + 6;
2939
2940 encoded = SAFE_ALLOCA (allength);
2941 encoded_length = base64_encode_1 ((char *) BYTE_POS_ADDR (ibeg),
2942 encoded, length, NILP (no_line_break),
2943 !NILP (BVAR (current_buffer, enable_multibyte_characters)));
2944 if (encoded_length > allength)
2945 emacs_abort ();
2946
2947 if (encoded_length < 0)
2948 {
2949 /* The encoding wasn't possible. */
2950 SAFE_FREE ();
2951 error ("Multibyte character in data for base64 encoding");
2952 }
2953
2954 /* Now we have encoded the region, so we insert the new contents
2955 and delete the old. (Insert first in order to preserve markers.) */
2956 SET_PT_BOTH (XFASTINT (beg), ibeg);
2957 insert (encoded, encoded_length);
2958 SAFE_FREE ();
2959 del_range_byte (ibeg + encoded_length, iend + encoded_length, 1);
2960
2961 /* If point was outside of the region, restore it exactly; else just
2962 move to the beginning of the region. */
2963 if (old_pos >= XFASTINT (end))
2964 old_pos += encoded_length - (XFASTINT (end) - XFASTINT (beg));
2965 else if (old_pos > XFASTINT (beg))
2966 old_pos = XFASTINT (beg);
2967 SET_PT (old_pos);
2968
2969 /* We return the length of the encoded text. */
2970 return make_number (encoded_length);
2971 }
2972
2973 DEFUN ("base64-encode-string", Fbase64_encode_string, Sbase64_encode_string,
2974 1, 2, 0,
2975 doc: /* Base64-encode STRING and return the result.
2976 Optional second argument NO-LINE-BREAK means do not break long lines
2977 into shorter lines. */)
2978 (Lisp_Object string, Lisp_Object no_line_break)
2979 {
2980 ptrdiff_t allength, length, encoded_length;
2981 char *encoded;
2982 Lisp_Object encoded_string;
2983 USE_SAFE_ALLOCA;
2984
2985 CHECK_STRING (string);
2986
2987 /* We need to allocate enough room for encoding the text.
2988 We need 33 1/3% more space, plus a newline every 76
2989 characters, and then we round up. */
2990 length = SBYTES (string);
2991 allength = length + length/3 + 1;
2992 allength += allength / MIME_LINE_LENGTH + 1 + 6;
2993
2994 /* We need to allocate enough room for decoding the text. */
2995 encoded = SAFE_ALLOCA (allength);
2996
2997 encoded_length = base64_encode_1 (SSDATA (string),
2998 encoded, length, NILP (no_line_break),
2999 STRING_MULTIBYTE (string));
3000 if (encoded_length > allength)
3001 emacs_abort ();
3002
3003 if (encoded_length < 0)
3004 {
3005 /* The encoding wasn't possible. */
3006 SAFE_FREE ();
3007 error ("Multibyte character in data for base64 encoding");
3008 }
3009
3010 encoded_string = make_unibyte_string (encoded, encoded_length);
3011 SAFE_FREE ();
3012
3013 return encoded_string;
3014 }
3015
3016 static ptrdiff_t
3017 base64_encode_1 (const char *from, char *to, ptrdiff_t length,
3018 bool line_break, bool multibyte)
3019 {
3020 int counter = 0;
3021 ptrdiff_t i = 0;
3022 char *e = to;
3023 int c;
3024 unsigned int value;
3025 int bytes;
3026
3027 while (i < length)
3028 {
3029 if (multibyte)
3030 {
3031 c = STRING_CHAR_AND_LENGTH ((unsigned char *) from + i, bytes);
3032 if (CHAR_BYTE8_P (c))
3033 c = CHAR_TO_BYTE8 (c);
3034 else if (c >= 256)
3035 return -1;
3036 i += bytes;
3037 }
3038 else
3039 c = from[i++];
3040
3041 /* Wrap line every 76 characters. */
3042
3043 if (line_break)
3044 {
3045 if (counter < MIME_LINE_LENGTH / 4)
3046 counter++;
3047 else
3048 {
3049 *e++ = '\n';
3050 counter = 1;
3051 }
3052 }
3053
3054 /* Process first byte of a triplet. */
3055
3056 *e++ = base64_value_to_char[0x3f & c >> 2];
3057 value = (0x03 & c) << 4;
3058
3059 /* Process second byte of a triplet. */
3060
3061 if (i == length)
3062 {
3063 *e++ = base64_value_to_char[value];
3064 *e++ = '=';
3065 *e++ = '=';
3066 break;
3067 }
3068
3069 if (multibyte)
3070 {
3071 c = STRING_CHAR_AND_LENGTH ((unsigned char *) from + i, bytes);
3072 if (CHAR_BYTE8_P (c))
3073 c = CHAR_TO_BYTE8 (c);
3074 else if (c >= 256)
3075 return -1;
3076 i += bytes;
3077 }
3078 else
3079 c = from[i++];
3080
3081 *e++ = base64_value_to_char[value | (0x0f & c >> 4)];
3082 value = (0x0f & c) << 2;
3083
3084 /* Process third byte of a triplet. */
3085
3086 if (i == length)
3087 {
3088 *e++ = base64_value_to_char[value];
3089 *e++ = '=';
3090 break;
3091 }
3092
3093 if (multibyte)
3094 {
3095 c = STRING_CHAR_AND_LENGTH ((unsigned char *) from + i, bytes);
3096 if (CHAR_BYTE8_P (c))
3097 c = CHAR_TO_BYTE8 (c);
3098 else if (c >= 256)
3099 return -1;
3100 i += bytes;
3101 }
3102 else
3103 c = from[i++];
3104
3105 *e++ = base64_value_to_char[value | (0x03 & c >> 6)];
3106 *e++ = base64_value_to_char[0x3f & c];
3107 }
3108
3109 return e - to;
3110 }
3111
3112
3113 DEFUN ("base64-decode-region", Fbase64_decode_region, Sbase64_decode_region,
3114 2, 2, "r",
3115 doc: /* Base64-decode the region between BEG and END.
3116 Return the length of the decoded text.
3117 If the region can't be decoded, signal an error and don't modify the buffer. */)
3118 (Lisp_Object beg, Lisp_Object end)
3119 {
3120 ptrdiff_t ibeg, iend, length, allength;
3121 char *decoded;
3122 ptrdiff_t old_pos = PT;
3123 ptrdiff_t decoded_length;
3124 ptrdiff_t inserted_chars;
3125 bool multibyte = !NILP (BVAR (current_buffer, enable_multibyte_characters));
3126 USE_SAFE_ALLOCA;
3127
3128 validate_region (&beg, &end);
3129
3130 ibeg = CHAR_TO_BYTE (XFASTINT (beg));
3131 iend = CHAR_TO_BYTE (XFASTINT (end));
3132
3133 length = iend - ibeg;
3134
3135 /* We need to allocate enough room for decoding the text. If we are
3136 working on a multibyte buffer, each decoded code may occupy at
3137 most two bytes. */
3138 allength = multibyte ? length * 2 : length;
3139 decoded = SAFE_ALLOCA (allength);
3140
3141 move_gap_both (XFASTINT (beg), ibeg);
3142 decoded_length = base64_decode_1 ((char *) BYTE_POS_ADDR (ibeg),
3143 decoded, length,
3144 multibyte, &inserted_chars);
3145 if (decoded_length > allength)
3146 emacs_abort ();
3147
3148 if (decoded_length < 0)
3149 {
3150 /* The decoding wasn't possible. */
3151 SAFE_FREE ();
3152 error ("Invalid base64 data");
3153 }
3154
3155 /* Now we have decoded the region, so we insert the new contents
3156 and delete the old. (Insert first in order to preserve markers.) */
3157 TEMP_SET_PT_BOTH (XFASTINT (beg), ibeg);
3158 insert_1_both (decoded, inserted_chars, decoded_length, 0, 1, 0);
3159 SAFE_FREE ();
3160
3161 /* Delete the original text. */
3162 del_range_both (PT, PT_BYTE, XFASTINT (end) + inserted_chars,
3163 iend + decoded_length, 1);
3164
3165 /* If point was outside of the region, restore it exactly; else just
3166 move to the beginning of the region. */
3167 if (old_pos >= XFASTINT (end))
3168 old_pos += inserted_chars - (XFASTINT (end) - XFASTINT (beg));
3169 else if (old_pos > XFASTINT (beg))
3170 old_pos = XFASTINT (beg);
3171 SET_PT (old_pos > ZV ? ZV : old_pos);
3172
3173 return make_number (inserted_chars);
3174 }
3175
3176 DEFUN ("base64-decode-string", Fbase64_decode_string, Sbase64_decode_string,
3177 1, 1, 0,
3178 doc: /* Base64-decode STRING and return the result. */)
3179 (Lisp_Object string)
3180 {
3181 char *decoded;
3182 ptrdiff_t length, decoded_length;
3183 Lisp_Object decoded_string;
3184 USE_SAFE_ALLOCA;
3185
3186 CHECK_STRING (string);
3187
3188 length = SBYTES (string);
3189 /* We need to allocate enough room for decoding the text. */
3190 decoded = SAFE_ALLOCA (length);
3191
3192 /* The decoded result should be unibyte. */
3193 decoded_length = base64_decode_1 (SSDATA (string), decoded, length,
3194 0, NULL);
3195 if (decoded_length > length)
3196 emacs_abort ();
3197 else if (decoded_length >= 0)
3198 decoded_string = make_unibyte_string (decoded, decoded_length);
3199 else
3200 decoded_string = Qnil;
3201
3202 SAFE_FREE ();
3203 if (!STRINGP (decoded_string))
3204 error ("Invalid base64 data");
3205
3206 return decoded_string;
3207 }
3208
3209 /* Base64-decode the data at FROM of LENGTH bytes into TO. If
3210 MULTIBYTE, the decoded result should be in multibyte
3211 form. If NCHARS_RETURN is not NULL, store the number of produced
3212 characters in *NCHARS_RETURN. */
3213
3214 static ptrdiff_t
3215 base64_decode_1 (const char *from, char *to, ptrdiff_t length,
3216 bool multibyte, ptrdiff_t *nchars_return)
3217 {
3218 ptrdiff_t i = 0; /* Used inside READ_QUADRUPLET_BYTE */
3219 char *e = to;
3220 unsigned char c;
3221 unsigned long value;
3222 ptrdiff_t nchars = 0;
3223
3224 while (1)
3225 {
3226 /* Process first byte of a quadruplet. */
3227
3228 READ_QUADRUPLET_BYTE (e-to);
3229
3230 if (!IS_BASE64 (c))
3231 return -1;
3232 value = base64_char_to_value[c] << 18;
3233
3234 /* Process second byte of a quadruplet. */
3235
3236 READ_QUADRUPLET_BYTE (-1);
3237
3238 if (!IS_BASE64 (c))
3239 return -1;
3240 value |= base64_char_to_value[c] << 12;
3241
3242 c = (unsigned char) (value >> 16);
3243 if (multibyte && c >= 128)
3244 e += BYTE8_STRING (c, e);
3245 else
3246 *e++ = c;
3247 nchars++;
3248
3249 /* Process third byte of a quadruplet. */
3250
3251 READ_QUADRUPLET_BYTE (-1);
3252
3253 if (c == '=')
3254 {
3255 READ_QUADRUPLET_BYTE (-1);
3256
3257 if (c != '=')
3258 return -1;
3259 continue;
3260 }
3261
3262 if (!IS_BASE64 (c))
3263 return -1;
3264 value |= base64_char_to_value[c] << 6;
3265
3266 c = (unsigned char) (0xff & value >> 8);
3267 if (multibyte && c >= 128)
3268 e += BYTE8_STRING (c, e);
3269 else
3270 *e++ = c;
3271 nchars++;
3272
3273 /* Process fourth byte of a quadruplet. */
3274
3275 READ_QUADRUPLET_BYTE (-1);
3276
3277 if (c == '=')
3278 continue;
3279
3280 if (!IS_BASE64 (c))
3281 return -1;
3282 value |= base64_char_to_value[c];
3283
3284 c = (unsigned char) (0xff & value);
3285 if (multibyte && c >= 128)
3286 e += BYTE8_STRING (c, e);
3287 else
3288 *e++ = c;
3289 nchars++;
3290 }
3291 }
3292
3293
3294 \f
3295 /***********************************************************************
3296 ***** *****
3297 ***** Hash Tables *****
3298 ***** *****
3299 ***********************************************************************/
3300
3301 /* Implemented by gerd@gnu.org. This hash table implementation was
3302 inspired by CMUCL hash tables. */
3303
3304 /* Ideas:
3305
3306 1. For small tables, association lists are probably faster than
3307 hash tables because they have lower overhead.
3308
3309 For uses of hash tables where the O(1) behavior of table
3310 operations is not a requirement, it might therefore be a good idea
3311 not to hash. Instead, we could just do a linear search in the
3312 key_and_value vector of the hash table. This could be done
3313 if a `:linear-search t' argument is given to make-hash-table. */
3314
3315 /* Various symbols. */
3316
3317 static Lisp_Object Qhash_table_p;
3318 static Lisp_Object Qkey, Qvalue, Qeql;
3319 Lisp_Object Qeq, Qequal;
3320 Lisp_Object QCtest, QCsize, QCrehash_size, QCrehash_threshold, QCweakness;
3321 static Lisp_Object Qhash_table_test, Qkey_or_value, Qkey_and_value;
3322
3323 \f
3324 /***********************************************************************
3325 Utilities
3326 ***********************************************************************/
3327
3328 static void
3329 CHECK_HASH_TABLE (Lisp_Object x)
3330 {
3331 CHECK_TYPE (HASH_TABLE_P (x), Qhash_table_p, x);
3332 }
3333
3334 static void
3335 set_hash_key_and_value (struct Lisp_Hash_Table *h, Lisp_Object key_and_value)
3336 {
3337 h->key_and_value = key_and_value;
3338 }
3339 static void
3340 set_hash_next (struct Lisp_Hash_Table *h, Lisp_Object next)
3341 {
3342 h->next = next;
3343 }
3344 static void
3345 set_hash_next_slot (struct Lisp_Hash_Table *h, ptrdiff_t idx, Lisp_Object val)
3346 {
3347 gc_aset (h->next, idx, val);
3348 }
3349 static void
3350 set_hash_hash (struct Lisp_Hash_Table *h, Lisp_Object hash)
3351 {
3352 h->hash = hash;
3353 }
3354 static void
3355 set_hash_hash_slot (struct Lisp_Hash_Table *h, ptrdiff_t idx, Lisp_Object val)
3356 {
3357 gc_aset (h->hash, idx, val);
3358 }
3359 static void
3360 set_hash_index (struct Lisp_Hash_Table *h, Lisp_Object index)
3361 {
3362 h->index = index;
3363 }
3364 static void
3365 set_hash_index_slot (struct Lisp_Hash_Table *h, ptrdiff_t idx, Lisp_Object val)
3366 {
3367 gc_aset (h->index, idx, val);
3368 }
3369
3370 /* If OBJ is a Lisp hash table, return a pointer to its struct
3371 Lisp_Hash_Table. Otherwise, signal an error. */
3372
3373 static struct Lisp_Hash_Table *
3374 check_hash_table (Lisp_Object obj)
3375 {
3376 CHECK_HASH_TABLE (obj);
3377 return XHASH_TABLE (obj);
3378 }
3379
3380
3381 /* Value is the next integer I >= N, N >= 0 which is "almost" a prime
3382 number. A number is "almost" a prime number if it is not divisible
3383 by any integer in the range 2 .. (NEXT_ALMOST_PRIME_LIMIT - 1). */
3384
3385 EMACS_INT
3386 next_almost_prime (EMACS_INT n)
3387 {
3388 verify (NEXT_ALMOST_PRIME_LIMIT == 11);
3389 for (n |= 1; ; n += 2)
3390 if (n % 3 != 0 && n % 5 != 0 && n % 7 != 0)
3391 return n;
3392 }
3393
3394
3395 /* Find KEY in ARGS which has size NARGS. Don't consider indices for
3396 which USED[I] is non-zero. If found at index I in ARGS, set
3397 USED[I] and USED[I + 1] to 1, and return I + 1. Otherwise return
3398 0. This function is used to extract a keyword/argument pair from
3399 a DEFUN parameter list. */
3400
3401 static ptrdiff_t
3402 get_key_arg (Lisp_Object key, ptrdiff_t nargs, Lisp_Object *args, char *used)
3403 {
3404 ptrdiff_t i;
3405
3406 for (i = 1; i < nargs; i++)
3407 if (!used[i - 1] && EQ (args[i - 1], key))
3408 {
3409 used[i - 1] = 1;
3410 used[i] = 1;
3411 return i;
3412 }
3413
3414 return 0;
3415 }
3416
3417
3418 /* Return a Lisp vector which has the same contents as VEC but has
3419 at least INCR_MIN more entries, where INCR_MIN is positive.
3420 If NITEMS_MAX is not -1, do not grow the vector to be any larger
3421 than NITEMS_MAX. Entries in the resulting
3422 vector that are not copied from VEC are set to nil. */
3423
3424 Lisp_Object
3425 larger_vector (Lisp_Object vec, ptrdiff_t incr_min, ptrdiff_t nitems_max)
3426 {
3427 struct Lisp_Vector *v;
3428 ptrdiff_t i, incr, incr_max, old_size, new_size;
3429 ptrdiff_t C_language_max = min (PTRDIFF_MAX, SIZE_MAX) / sizeof *v->contents;
3430 ptrdiff_t n_max = (0 <= nitems_max && nitems_max < C_language_max
3431 ? nitems_max : C_language_max);
3432 eassert (VECTORP (vec));
3433 eassert (0 < incr_min && -1 <= nitems_max);
3434 old_size = ASIZE (vec);
3435 incr_max = n_max - old_size;
3436 incr = max (incr_min, min (old_size >> 1, incr_max));
3437 if (incr_max < incr)
3438 memory_full (SIZE_MAX);
3439 new_size = old_size + incr;
3440 v = allocate_vector (new_size);
3441 memcpy (v->contents, XVECTOR (vec)->contents, old_size * sizeof *v->contents);
3442 for (i = old_size; i < new_size; ++i)
3443 v->contents[i] = Qnil;
3444 XSETVECTOR (vec, v);
3445 return vec;
3446 }
3447
3448
3449 /***********************************************************************
3450 Low-level Functions
3451 ***********************************************************************/
3452
3453 static struct hash_table_test hashtest_eq;
3454 struct hash_table_test hashtest_eql, hashtest_equal;
3455
3456 /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code
3457 HASH2 in hash table H using `eql'. Value is true if KEY1 and
3458 KEY2 are the same. */
3459
3460 static bool
3461 cmpfn_eql (struct hash_table_test *ht,
3462 Lisp_Object key1,
3463 Lisp_Object key2)
3464 {
3465 return (FLOATP (key1)
3466 && FLOATP (key2)
3467 && XFLOAT_DATA (key1) == XFLOAT_DATA (key2));
3468 }
3469
3470
3471 /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code
3472 HASH2 in hash table H using `equal'. Value is true if KEY1 and
3473 KEY2 are the same. */
3474
3475 static bool
3476 cmpfn_equal (struct hash_table_test *ht,
3477 Lisp_Object key1,
3478 Lisp_Object key2)
3479 {
3480 return !NILP (Fequal (key1, key2));
3481 }
3482
3483
3484 /* Compare KEY1 which has hash code HASH1, and KEY2 with hash code
3485 HASH2 in hash table H using H->user_cmp_function. Value is true
3486 if KEY1 and KEY2 are the same. */
3487
3488 static bool
3489 cmpfn_user_defined (struct hash_table_test *ht,
3490 Lisp_Object key1,
3491 Lisp_Object key2)
3492 {
3493 Lisp_Object args[3];
3494
3495 args[0] = ht->user_cmp_function;
3496 args[1] = key1;
3497 args[2] = key2;
3498 return !NILP (Ffuncall (3, args));
3499 }
3500
3501
3502 /* Value is a hash code for KEY for use in hash table H which uses
3503 `eq' to compare keys. The hash code returned is guaranteed to fit
3504 in a Lisp integer. */
3505
3506 static EMACS_UINT
3507 hashfn_eq (struct hash_table_test *ht, Lisp_Object key)
3508 {
3509 EMACS_UINT hash = XHASH (key) ^ XTYPE (key);
3510 return hash;
3511 }
3512
3513 /* Value is a hash code for KEY for use in hash table H which uses
3514 `eql' to compare keys. The hash code returned is guaranteed to fit
3515 in a Lisp integer. */
3516
3517 static EMACS_UINT
3518 hashfn_eql (struct hash_table_test *ht, Lisp_Object key)
3519 {
3520 EMACS_UINT hash;
3521 if (FLOATP (key))
3522 hash = sxhash (key, 0);
3523 else
3524 hash = XHASH (key) ^ XTYPE (key);
3525 return hash;
3526 }
3527
3528 /* Value is a hash code for KEY for use in hash table H which uses
3529 `equal' to compare keys. The hash code returned is guaranteed to fit
3530 in a Lisp integer. */
3531
3532 static EMACS_UINT
3533 hashfn_equal (struct hash_table_test *ht, Lisp_Object key)
3534 {
3535 EMACS_UINT hash = sxhash (key, 0);
3536 return hash;
3537 }
3538
3539 /* Value is a hash code for KEY for use in hash table H which uses as
3540 user-defined function to compare keys. The hash code returned is
3541 guaranteed to fit in a Lisp integer. */
3542
3543 static EMACS_UINT
3544 hashfn_user_defined (struct hash_table_test *ht, Lisp_Object key)
3545 {
3546 Lisp_Object args[2], hash;
3547
3548 args[0] = ht->user_hash_function;
3549 args[1] = key;
3550 hash = Ffuncall (2, args);
3551 return hashfn_eq (ht, hash);
3552 }
3553
3554 /* An upper bound on the size of a hash table index. It must fit in
3555 ptrdiff_t and be a valid Emacs fixnum. */
3556 #define INDEX_SIZE_BOUND \
3557 ((ptrdiff_t) min (MOST_POSITIVE_FIXNUM, PTRDIFF_MAX / word_size))
3558
3559 /* Create and initialize a new hash table.
3560
3561 TEST specifies the test the hash table will use to compare keys.
3562 It must be either one of the predefined tests `eq', `eql' or
3563 `equal' or a symbol denoting a user-defined test named TEST with
3564 test and hash functions USER_TEST and USER_HASH.
3565
3566 Give the table initial capacity SIZE, SIZE >= 0, an integer.
3567
3568 If REHASH_SIZE is an integer, it must be > 0, and this hash table's
3569 new size when it becomes full is computed by adding REHASH_SIZE to
3570 its old size. If REHASH_SIZE is a float, it must be > 1.0, and the
3571 table's new size is computed by multiplying its old size with
3572 REHASH_SIZE.
3573
3574 REHASH_THRESHOLD must be a float <= 1.0, and > 0. The table will
3575 be resized when the ratio of (number of entries in the table) /
3576 (table size) is >= REHASH_THRESHOLD.
3577
3578 WEAK specifies the weakness of the table. If non-nil, it must be
3579 one of the symbols `key', `value', `key-or-value', or `key-and-value'. */
3580
3581 Lisp_Object
3582 make_hash_table (struct hash_table_test test,
3583 Lisp_Object size, Lisp_Object rehash_size,
3584 Lisp_Object rehash_threshold, Lisp_Object weak)
3585 {
3586 struct Lisp_Hash_Table *h;
3587 Lisp_Object table;
3588 EMACS_INT index_size, sz;
3589 ptrdiff_t i;
3590 double index_float;
3591
3592 /* Preconditions. */
3593 eassert (SYMBOLP (test.name));
3594 eassert (INTEGERP (size) && XINT (size) >= 0);
3595 eassert ((INTEGERP (rehash_size) && XINT (rehash_size) > 0)
3596 || (FLOATP (rehash_size) && 1 < XFLOAT_DATA (rehash_size)));
3597 eassert (FLOATP (rehash_threshold)
3598 && 0 < XFLOAT_DATA (rehash_threshold)
3599 && XFLOAT_DATA (rehash_threshold) <= 1.0);
3600
3601 if (XFASTINT (size) == 0)
3602 size = make_number (1);
3603
3604 sz = XFASTINT (size);
3605 index_float = sz / XFLOAT_DATA (rehash_threshold);
3606 index_size = (index_float < INDEX_SIZE_BOUND + 1
3607 ? next_almost_prime (index_float)
3608 : INDEX_SIZE_BOUND + 1);
3609 if (INDEX_SIZE_BOUND < max (index_size, 2 * sz))
3610 error ("Hash table too large");
3611
3612 /* Allocate a table and initialize it. */
3613 h = allocate_hash_table ();
3614
3615 /* Initialize hash table slots. */
3616 h->test = test;
3617 h->weak = weak;
3618 h->rehash_threshold = rehash_threshold;
3619 h->rehash_size = rehash_size;
3620 h->count = 0;
3621 h->key_and_value = Fmake_vector (make_number (2 * sz), Qnil);
3622 h->hash = Fmake_vector (size, Qnil);
3623 h->next = Fmake_vector (size, Qnil);
3624 h->index = Fmake_vector (make_number (index_size), Qnil);
3625
3626 /* Set up the free list. */
3627 for (i = 0; i < sz - 1; ++i)
3628 set_hash_next_slot (h, i, make_number (i + 1));
3629 h->next_free = make_number (0);
3630
3631 XSET_HASH_TABLE (table, h);
3632 eassert (HASH_TABLE_P (table));
3633 eassert (XHASH_TABLE (table) == h);
3634
3635 return table;
3636 }
3637
3638
3639 /* Return a copy of hash table H1. Keys and values are not copied,
3640 only the table itself is. */
3641
3642 static Lisp_Object
3643 copy_hash_table (struct Lisp_Hash_Table *h1)
3644 {
3645 Lisp_Object table;
3646 struct Lisp_Hash_Table *h2;
3647
3648 h2 = allocate_hash_table ();
3649 *h2 = *h1;
3650 h2->key_and_value = Fcopy_sequence (h1->key_and_value);
3651 h2->hash = Fcopy_sequence (h1->hash);
3652 h2->next = Fcopy_sequence (h1->next);
3653 h2->index = Fcopy_sequence (h1->index);
3654 XSET_HASH_TABLE (table, h2);
3655
3656 return table;
3657 }
3658
3659
3660 /* Resize hash table H if it's too full. If H cannot be resized
3661 because it's already too large, throw an error. */
3662
3663 static void
3664 maybe_resize_hash_table (struct Lisp_Hash_Table *h)
3665 {
3666 if (NILP (h->next_free))
3667 {
3668 ptrdiff_t old_size = HASH_TABLE_SIZE (h);
3669 EMACS_INT new_size, index_size, nsize;
3670 ptrdiff_t i;
3671 double index_float;
3672
3673 if (INTEGERP (h->rehash_size))
3674 new_size = old_size + XFASTINT (h->rehash_size);
3675 else
3676 {
3677 double float_new_size = old_size * XFLOAT_DATA (h->rehash_size);
3678 if (float_new_size < INDEX_SIZE_BOUND + 1)
3679 {
3680 new_size = float_new_size;
3681 if (new_size <= old_size)
3682 new_size = old_size + 1;
3683 }
3684 else
3685 new_size = INDEX_SIZE_BOUND + 1;
3686 }
3687 index_float = new_size / XFLOAT_DATA (h->rehash_threshold);
3688 index_size = (index_float < INDEX_SIZE_BOUND + 1
3689 ? next_almost_prime (index_float)
3690 : INDEX_SIZE_BOUND + 1);
3691 nsize = max (index_size, 2 * new_size);
3692 if (INDEX_SIZE_BOUND < nsize)
3693 error ("Hash table too large to resize");
3694
3695 #ifdef ENABLE_CHECKING
3696 if (HASH_TABLE_P (Vpurify_flag)
3697 && XHASH_TABLE (Vpurify_flag) == h)
3698 {
3699 Lisp_Object args[2];
3700 args[0] = build_string ("Growing hash table to: %d");
3701 args[1] = make_number (new_size);
3702 Fmessage (2, args);
3703 }
3704 #endif
3705
3706 set_hash_key_and_value (h, larger_vector (h->key_and_value,
3707 2 * (new_size - old_size), -1));
3708 set_hash_next (h, larger_vector (h->next, new_size - old_size, -1));
3709 set_hash_hash (h, larger_vector (h->hash, new_size - old_size, -1));
3710 set_hash_index (h, Fmake_vector (make_number (index_size), Qnil));
3711
3712 /* Update the free list. Do it so that new entries are added at
3713 the end of the free list. This makes some operations like
3714 maphash faster. */
3715 for (i = old_size; i < new_size - 1; ++i)
3716 set_hash_next_slot (h, i, make_number (i + 1));
3717
3718 if (!NILP (h->next_free))
3719 {
3720 Lisp_Object last, next;
3721
3722 last = h->next_free;
3723 while (next = HASH_NEXT (h, XFASTINT (last)),
3724 !NILP (next))
3725 last = next;
3726
3727 set_hash_next_slot (h, XFASTINT (last), make_number (old_size));
3728 }
3729 else
3730 XSETFASTINT (h->next_free, old_size);
3731
3732 /* Rehash. */
3733 for (i = 0; i < old_size; ++i)
3734 if (!NILP (HASH_HASH (h, i)))
3735 {
3736 EMACS_UINT hash_code = XUINT (HASH_HASH (h, i));
3737 ptrdiff_t start_of_bucket = hash_code % ASIZE (h->index);
3738 set_hash_next_slot (h, i, HASH_INDEX (h, start_of_bucket));
3739 set_hash_index_slot (h, start_of_bucket, make_number (i));
3740 }
3741 }
3742 }
3743
3744
3745 /* Lookup KEY in hash table H. If HASH is non-null, return in *HASH
3746 the hash code of KEY. Value is the index of the entry in H
3747 matching KEY, or -1 if not found. */
3748
3749 ptrdiff_t
3750 hash_lookup (struct Lisp_Hash_Table *h, Lisp_Object key, EMACS_UINT *hash)
3751 {
3752 EMACS_UINT hash_code;
3753 ptrdiff_t start_of_bucket;
3754 Lisp_Object idx;
3755
3756 hash_code = h->test.hashfn (&h->test, key);
3757 eassert ((hash_code & ~INTMASK) == 0);
3758 if (hash)
3759 *hash = hash_code;
3760
3761 start_of_bucket = hash_code % ASIZE (h->index);
3762 idx = HASH_INDEX (h, start_of_bucket);
3763
3764 /* We need not gcpro idx since it's either an integer or nil. */
3765 while (!NILP (idx))
3766 {
3767 ptrdiff_t i = XFASTINT (idx);
3768 if (EQ (key, HASH_KEY (h, i))
3769 || (h->test.cmpfn
3770 && hash_code == XUINT (HASH_HASH (h, i))
3771 && h->test.cmpfn (&h->test, key, HASH_KEY (h, i))))
3772 break;
3773 idx = HASH_NEXT (h, i);
3774 }
3775
3776 return NILP (idx) ? -1 : XFASTINT (idx);
3777 }
3778
3779
3780 /* Put an entry into hash table H that associates KEY with VALUE.
3781 HASH is a previously computed hash code of KEY.
3782 Value is the index of the entry in H matching KEY. */
3783
3784 ptrdiff_t
3785 hash_put (struct Lisp_Hash_Table *h, Lisp_Object key, Lisp_Object value,
3786 EMACS_UINT hash)
3787 {
3788 ptrdiff_t start_of_bucket, i;
3789
3790 eassert ((hash & ~INTMASK) == 0);
3791
3792 /* Increment count after resizing because resizing may fail. */
3793 maybe_resize_hash_table (h);
3794 h->count++;
3795
3796 /* Store key/value in the key_and_value vector. */
3797 i = XFASTINT (h->next_free);
3798 h->next_free = HASH_NEXT (h, i);
3799 set_hash_key_slot (h, i, key);
3800 set_hash_value_slot (h, i, value);
3801
3802 /* Remember its hash code. */
3803 set_hash_hash_slot (h, i, make_number (hash));
3804
3805 /* Add new entry to its collision chain. */
3806 start_of_bucket = hash % ASIZE (h->index);
3807 set_hash_next_slot (h, i, HASH_INDEX (h, start_of_bucket));
3808 set_hash_index_slot (h, start_of_bucket, make_number (i));
3809 return i;
3810 }
3811
3812
3813 /* Remove the entry matching KEY from hash table H, if there is one. */
3814
3815 static void
3816 hash_remove_from_table (struct Lisp_Hash_Table *h, Lisp_Object key)
3817 {
3818 EMACS_UINT hash_code;
3819 ptrdiff_t start_of_bucket;
3820 Lisp_Object idx, prev;
3821
3822 hash_code = h->test.hashfn (&h->test, key);
3823 eassert ((hash_code & ~INTMASK) == 0);
3824 start_of_bucket = hash_code % ASIZE (h->index);
3825 idx = HASH_INDEX (h, start_of_bucket);
3826 prev = Qnil;
3827
3828 /* We need not gcpro idx, prev since they're either integers or nil. */
3829 while (!NILP (idx))
3830 {
3831 ptrdiff_t i = XFASTINT (idx);
3832
3833 if (EQ (key, HASH_KEY (h, i))
3834 || (h->test.cmpfn
3835 && hash_code == XUINT (HASH_HASH (h, i))
3836 && h->test.cmpfn (&h->test, key, HASH_KEY (h, i))))
3837 {
3838 /* Take entry out of collision chain. */
3839 if (NILP (prev))
3840 set_hash_index_slot (h, start_of_bucket, HASH_NEXT (h, i));
3841 else
3842 set_hash_next_slot (h, XFASTINT (prev), HASH_NEXT (h, i));
3843
3844 /* Clear slots in key_and_value and add the slots to
3845 the free list. */
3846 set_hash_key_slot (h, i, Qnil);
3847 set_hash_value_slot (h, i, Qnil);
3848 set_hash_hash_slot (h, i, Qnil);
3849 set_hash_next_slot (h, i, h->next_free);
3850 h->next_free = make_number (i);
3851 h->count--;
3852 eassert (h->count >= 0);
3853 break;
3854 }
3855 else
3856 {
3857 prev = idx;
3858 idx = HASH_NEXT (h, i);
3859 }
3860 }
3861 }
3862
3863
3864 /* Clear hash table H. */
3865
3866 static void
3867 hash_clear (struct Lisp_Hash_Table *h)
3868 {
3869 if (h->count > 0)
3870 {
3871 ptrdiff_t i, size = HASH_TABLE_SIZE (h);
3872
3873 for (i = 0; i < size; ++i)
3874 {
3875 set_hash_next_slot (h, i, i < size - 1 ? make_number (i + 1) : Qnil);
3876 set_hash_key_slot (h, i, Qnil);
3877 set_hash_value_slot (h, i, Qnil);
3878 set_hash_hash_slot (h, i, Qnil);
3879 }
3880
3881 for (i = 0; i < ASIZE (h->index); ++i)
3882 ASET (h->index, i, Qnil);
3883
3884 h->next_free = make_number (0);
3885 h->count = 0;
3886 }
3887 }
3888
3889
3890 \f
3891 /***********************************************************************
3892 Hash Code Computation
3893 ***********************************************************************/
3894
3895 /* Maximum depth up to which to dive into Lisp structures. */
3896
3897 #define SXHASH_MAX_DEPTH 3
3898
3899 /* Maximum length up to which to take list and vector elements into
3900 account. */
3901
3902 #define SXHASH_MAX_LEN 7
3903
3904 /* Return a hash for string PTR which has length LEN. The hash value
3905 can be any EMACS_UINT value. */
3906
3907 EMACS_UINT
3908 hash_string (char const *ptr, ptrdiff_t len)
3909 {
3910 char const *p = ptr;
3911 char const *end = p + len;
3912 unsigned char c;
3913 EMACS_UINT hash = 0;
3914
3915 while (p != end)
3916 {
3917 c = *p++;
3918 hash = sxhash_combine (hash, c);
3919 }
3920
3921 return hash;
3922 }
3923
3924 /* Return a hash for string PTR which has length LEN. The hash
3925 code returned is guaranteed to fit in a Lisp integer. */
3926
3927 static EMACS_UINT
3928 sxhash_string (char const *ptr, ptrdiff_t len)
3929 {
3930 EMACS_UINT hash = hash_string (ptr, len);
3931 return SXHASH_REDUCE (hash);
3932 }
3933
3934 /* Return a hash for the floating point value VAL. */
3935
3936 static EMACS_UINT
3937 sxhash_float (double val)
3938 {
3939 EMACS_UINT hash = 0;
3940 enum {
3941 WORDS_PER_DOUBLE = (sizeof val / sizeof hash
3942 + (sizeof val % sizeof hash != 0))
3943 };
3944 union {
3945 double val;
3946 EMACS_UINT word[WORDS_PER_DOUBLE];
3947 } u;
3948 int i;
3949 u.val = val;
3950 memset (&u.val + 1, 0, sizeof u - sizeof u.val);
3951 for (i = 0; i < WORDS_PER_DOUBLE; i++)
3952 hash = sxhash_combine (hash, u.word[i]);
3953 return SXHASH_REDUCE (hash);
3954 }
3955
3956 /* Return a hash for list LIST. DEPTH is the current depth in the
3957 list. We don't recurse deeper than SXHASH_MAX_DEPTH in it. */
3958
3959 static EMACS_UINT
3960 sxhash_list (Lisp_Object list, int depth)
3961 {
3962 EMACS_UINT hash = 0;
3963 int i;
3964
3965 if (depth < SXHASH_MAX_DEPTH)
3966 for (i = 0;
3967 CONSP (list) && i < SXHASH_MAX_LEN;
3968 list = XCDR (list), ++i)
3969 {
3970 EMACS_UINT hash2 = sxhash (XCAR (list), depth + 1);
3971 hash = sxhash_combine (hash, hash2);
3972 }
3973
3974 if (!NILP (list))
3975 {
3976 EMACS_UINT hash2 = sxhash (list, depth + 1);
3977 hash = sxhash_combine (hash, hash2);
3978 }
3979
3980 return SXHASH_REDUCE (hash);
3981 }
3982
3983
3984 /* Return a hash for vector VECTOR. DEPTH is the current depth in
3985 the Lisp structure. */
3986
3987 static EMACS_UINT
3988 sxhash_vector (Lisp_Object vec, int depth)
3989 {
3990 EMACS_UINT hash = ASIZE (vec);
3991 int i, n;
3992
3993 n = min (SXHASH_MAX_LEN, ASIZE (vec));
3994 for (i = 0; i < n; ++i)
3995 {
3996 EMACS_UINT hash2 = sxhash (AREF (vec, i), depth + 1);
3997 hash = sxhash_combine (hash, hash2);
3998 }
3999
4000 return SXHASH_REDUCE (hash);
4001 }
4002
4003 /* Return a hash for bool-vector VECTOR. */
4004
4005 static EMACS_UINT
4006 sxhash_bool_vector (Lisp_Object vec)
4007 {
4008 EMACS_INT size = bool_vector_size (vec);
4009 EMACS_UINT hash = size;
4010 int i, n;
4011
4012 n = min (SXHASH_MAX_LEN, bool_vector_words (size));
4013 for (i = 0; i < n; ++i)
4014 hash = sxhash_combine (hash, bool_vector_data (vec)[i]);
4015
4016 return SXHASH_REDUCE (hash);
4017 }
4018
4019
4020 /* Return a hash code for OBJ. DEPTH is the current depth in the Lisp
4021 structure. Value is an unsigned integer clipped to INTMASK. */
4022
4023 EMACS_UINT
4024 sxhash (Lisp_Object obj, int depth)
4025 {
4026 EMACS_UINT hash;
4027
4028 if (depth > SXHASH_MAX_DEPTH)
4029 return 0;
4030
4031 switch (XTYPE (obj))
4032 {
4033 case_Lisp_Int:
4034 hash = XUINT (obj);
4035 break;
4036
4037 case Lisp_Misc:
4038 hash = XHASH (obj);
4039 break;
4040
4041 case Lisp_Symbol:
4042 obj = SYMBOL_NAME (obj);
4043 /* Fall through. */
4044
4045 case Lisp_String:
4046 hash = sxhash_string (SSDATA (obj), SBYTES (obj));
4047 break;
4048
4049 /* This can be everything from a vector to an overlay. */
4050 case Lisp_Vectorlike:
4051 if (VECTORP (obj))
4052 /* According to the CL HyperSpec, two arrays are equal only if
4053 they are `eq', except for strings and bit-vectors. In
4054 Emacs, this works differently. We have to compare element
4055 by element. */
4056 hash = sxhash_vector (obj, depth);
4057 else if (BOOL_VECTOR_P (obj))
4058 hash = sxhash_bool_vector (obj);
4059 else
4060 /* Others are `equal' if they are `eq', so let's take their
4061 address as hash. */
4062 hash = XHASH (obj);
4063 break;
4064
4065 case Lisp_Cons:
4066 hash = sxhash_list (obj, depth);
4067 break;
4068
4069 case Lisp_Float:
4070 hash = sxhash_float (XFLOAT_DATA (obj));
4071 break;
4072
4073 default:
4074 emacs_abort ();
4075 }
4076
4077 return hash;
4078 }
4079
4080
4081 \f
4082 /***********************************************************************
4083 Lisp Interface
4084 ***********************************************************************/
4085
4086
4087 DEFUN ("sxhash", Fsxhash, Ssxhash, 1, 1, 0,
4088 doc: /* Compute a hash code for OBJ and return it as integer. */)
4089 (Lisp_Object obj)
4090 {
4091 EMACS_UINT hash = sxhash (obj, 0);
4092 return make_number (hash);
4093 }
4094
4095
4096 DEFUN ("make-hash-table", Fmake_hash_table, Smake_hash_table, 0, MANY, 0,
4097 doc: /* Create and return a new hash table.
4098
4099 Arguments are specified as keyword/argument pairs. The following
4100 arguments are defined:
4101
4102 :test TEST -- TEST must be a symbol that specifies how to compare
4103 keys. Default is `eql'. Predefined are the tests `eq', `eql', and
4104 `equal'. User-supplied test and hash functions can be specified via
4105 `define-hash-table-test'.
4106
4107 :size SIZE -- A hint as to how many elements will be put in the table.
4108 Default is 65.
4109
4110 :rehash-size REHASH-SIZE - Indicates how to expand the table when it
4111 fills up. If REHASH-SIZE is an integer, increase the size by that
4112 amount. If it is a float, it must be > 1.0, and the new size is the
4113 old size multiplied by that factor. Default is 1.5.
4114
4115 :rehash-threshold THRESHOLD -- THRESHOLD must a float > 0, and <= 1.0.
4116 Resize the hash table when the ratio (number of entries / table size)
4117 is greater than or equal to THRESHOLD. Default is 0.8.
4118
4119 :weakness WEAK -- WEAK must be one of nil, t, `key', `value',
4120 `key-or-value', or `key-and-value'. If WEAK is not nil, the table
4121 returned is a weak table. Key/value pairs are removed from a weak
4122 hash table when there are no non-weak references pointing to their
4123 key, value, one of key or value, or both key and value, depending on
4124 WEAK. WEAK t is equivalent to `key-and-value'. Default value of WEAK
4125 is nil.
4126
4127 usage: (make-hash-table &rest KEYWORD-ARGS) */)
4128 (ptrdiff_t nargs, Lisp_Object *args)
4129 {
4130 Lisp_Object test, size, rehash_size, rehash_threshold, weak;
4131 struct hash_table_test testdesc;
4132 char *used;
4133 ptrdiff_t i;
4134
4135 /* The vector `used' is used to keep track of arguments that
4136 have been consumed. */
4137 used = alloca (nargs * sizeof *used);
4138 memset (used, 0, nargs * sizeof *used);
4139
4140 /* See if there's a `:test TEST' among the arguments. */
4141 i = get_key_arg (QCtest, nargs, args, used);
4142 test = i ? args[i] : Qeql;
4143 if (EQ (test, Qeq))
4144 testdesc = hashtest_eq;
4145 else if (EQ (test, Qeql))
4146 testdesc = hashtest_eql;
4147 else if (EQ (test, Qequal))
4148 testdesc = hashtest_equal;
4149 else
4150 {
4151 /* See if it is a user-defined test. */
4152 Lisp_Object prop;
4153
4154 prop = Fget (test, Qhash_table_test);
4155 if (!CONSP (prop) || !CONSP (XCDR (prop)))
4156 signal_error ("Invalid hash table test", test);
4157 testdesc.name = test;
4158 testdesc.user_cmp_function = XCAR (prop);
4159 testdesc.user_hash_function = XCAR (XCDR (prop));
4160 testdesc.hashfn = hashfn_user_defined;
4161 testdesc.cmpfn = cmpfn_user_defined;
4162 }
4163
4164 /* See if there's a `:size SIZE' argument. */
4165 i = get_key_arg (QCsize, nargs, args, used);
4166 size = i ? args[i] : Qnil;
4167 if (NILP (size))
4168 size = make_number (DEFAULT_HASH_SIZE);
4169 else if (!INTEGERP (size) || XINT (size) < 0)
4170 signal_error ("Invalid hash table size", size);
4171
4172 /* Look for `:rehash-size SIZE'. */
4173 i = get_key_arg (QCrehash_size, nargs, args, used);
4174 rehash_size = i ? args[i] : make_float (DEFAULT_REHASH_SIZE);
4175 if (! ((INTEGERP (rehash_size) && 0 < XINT (rehash_size))
4176 || (FLOATP (rehash_size) && 1 < XFLOAT_DATA (rehash_size))))
4177 signal_error ("Invalid hash table rehash size", rehash_size);
4178
4179 /* Look for `:rehash-threshold THRESHOLD'. */
4180 i = get_key_arg (QCrehash_threshold, nargs, args, used);
4181 rehash_threshold = i ? args[i] : make_float (DEFAULT_REHASH_THRESHOLD);
4182 if (! (FLOATP (rehash_threshold)
4183 && 0 < XFLOAT_DATA (rehash_threshold)
4184 && XFLOAT_DATA (rehash_threshold) <= 1))
4185 signal_error ("Invalid hash table rehash threshold", rehash_threshold);
4186
4187 /* Look for `:weakness WEAK'. */
4188 i = get_key_arg (QCweakness, nargs, args, used);
4189 weak = i ? args[i] : Qnil;
4190 if (EQ (weak, Qt))
4191 weak = Qkey_and_value;
4192 if (!NILP (weak)
4193 && !EQ (weak, Qkey)
4194 && !EQ (weak, Qvalue)
4195 && !EQ (weak, Qkey_or_value)
4196 && !EQ (weak, Qkey_and_value))
4197 signal_error ("Invalid hash table weakness", weak);
4198
4199 /* Now, all args should have been used up, or there's a problem. */
4200 for (i = 0; i < nargs; ++i)
4201 if (!used[i])
4202 signal_error ("Invalid argument list", args[i]);
4203
4204 return make_hash_table (testdesc, size, rehash_size, rehash_threshold, weak);
4205 }
4206
4207
4208 DEFUN ("copy-hash-table", Fcopy_hash_table, Scopy_hash_table, 1, 1, 0,
4209 doc: /* Return a copy of hash table TABLE. */)
4210 (Lisp_Object table)
4211 {
4212 return copy_hash_table (check_hash_table (table));
4213 }
4214
4215
4216 DEFUN ("hash-table-count", Fhash_table_count, Shash_table_count, 1, 1, 0,
4217 doc: /* Return the number of elements in TABLE. */)
4218 (Lisp_Object table)
4219 {
4220 return make_number (check_hash_table (table)->count);
4221 }
4222
4223
4224 DEFUN ("hash-table-rehash-size", Fhash_table_rehash_size,
4225 Shash_table_rehash_size, 1, 1, 0,
4226 doc: /* Return the current rehash size of TABLE. */)
4227 (Lisp_Object table)
4228 {
4229 return check_hash_table (table)->rehash_size;
4230 }
4231
4232
4233 DEFUN ("hash-table-rehash-threshold", Fhash_table_rehash_threshold,
4234 Shash_table_rehash_threshold, 1, 1, 0,
4235 doc: /* Return the current rehash threshold of TABLE. */)
4236 (Lisp_Object table)
4237 {
4238 return check_hash_table (table)->rehash_threshold;
4239 }
4240
4241
4242 DEFUN ("hash-table-size", Fhash_table_size, Shash_table_size, 1, 1, 0,
4243 doc: /* Return the size of TABLE.
4244 The size can be used as an argument to `make-hash-table' to create
4245 a hash table than can hold as many elements as TABLE holds
4246 without need for resizing. */)
4247 (Lisp_Object table)
4248 {
4249 struct Lisp_Hash_Table *h = check_hash_table (table);
4250 return make_number (HASH_TABLE_SIZE (h));
4251 }
4252
4253
4254 DEFUN ("hash-table-test", Fhash_table_test, Shash_table_test, 1, 1, 0,
4255 doc: /* Return the test TABLE uses. */)
4256 (Lisp_Object table)
4257 {
4258 return check_hash_table (table)->test.name;
4259 }
4260
4261
4262 DEFUN ("hash-table-weakness", Fhash_table_weakness, Shash_table_weakness,
4263 1, 1, 0,
4264 doc: /* Return the weakness of TABLE. */)
4265 (Lisp_Object table)
4266 {
4267 return check_hash_table (table)->weak;
4268 }
4269
4270
4271 DEFUN ("hash-table-p", Fhash_table_p, Shash_table_p, 1, 1, 0,
4272 doc: /* Return t if OBJ is a Lisp hash table object. */)
4273 (Lisp_Object obj)
4274 {
4275 return HASH_TABLE_P (obj) ? Qt : Qnil;
4276 }
4277
4278
4279 DEFUN ("clrhash", Fclrhash, Sclrhash, 1, 1, 0,
4280 doc: /* Clear hash table TABLE and return it. */)
4281 (Lisp_Object table)
4282 {
4283 hash_clear (check_hash_table (table));
4284 /* Be compatible with XEmacs. */
4285 return table;
4286 }
4287
4288
4289 DEFUN ("gethash", Fgethash, Sgethash, 2, 3, 0,
4290 doc: /* Look up KEY in TABLE and return its associated value.
4291 If KEY is not found, return DFLT which defaults to nil. */)
4292 (Lisp_Object key, Lisp_Object table, Lisp_Object dflt)
4293 {
4294 struct Lisp_Hash_Table *h = check_hash_table (table);
4295 ptrdiff_t i = hash_lookup (h, key, NULL);
4296 return i >= 0 ? HASH_VALUE (h, i) : dflt;
4297 }
4298
4299
4300 DEFUN ("puthash", Fputhash, Sputhash, 3, 3, 0,
4301 doc: /* Associate KEY with VALUE in hash table TABLE.
4302 If KEY is already present in table, replace its current value with
4303 VALUE. In any case, return VALUE. */)
4304 (Lisp_Object key, Lisp_Object value, Lisp_Object table)
4305 {
4306 struct Lisp_Hash_Table *h = check_hash_table (table);
4307 ptrdiff_t i;
4308 EMACS_UINT hash;
4309
4310 i = hash_lookup (h, key, &hash);
4311 if (i >= 0)
4312 set_hash_value_slot (h, i, value);
4313 else
4314 hash_put (h, key, value, hash);
4315
4316 return value;
4317 }
4318
4319
4320 DEFUN ("remhash", Fremhash, Sremhash, 2, 2, 0,
4321 doc: /* Remove KEY from TABLE. */)
4322 (Lisp_Object key, Lisp_Object table)
4323 {
4324 struct Lisp_Hash_Table *h = check_hash_table (table);
4325 hash_remove_from_table (h, key);
4326 return Qnil;
4327 }
4328
4329
4330 DEFUN ("maphash", Fmaphash, Smaphash, 2, 2, 0,
4331 doc: /* Call FUNCTION for all entries in hash table TABLE.
4332 FUNCTION is called with two arguments, KEY and VALUE.
4333 `maphash' always returns nil. */)
4334 (Lisp_Object function, Lisp_Object table)
4335 {
4336 struct Lisp_Hash_Table *h = check_hash_table (table);
4337 Lisp_Object args[3];
4338 ptrdiff_t i;
4339
4340 for (i = 0; i < HASH_TABLE_SIZE (h); ++i)
4341 if (!NILP (HASH_HASH (h, i)))
4342 {
4343 args[0] = function;
4344 args[1] = HASH_KEY (h, i);
4345 args[2] = HASH_VALUE (h, i);
4346 Ffuncall (3, args);
4347 }
4348
4349 return Qnil;
4350 }
4351
4352
4353 DEFUN ("define-hash-table-test", Fdefine_hash_table_test,
4354 Sdefine_hash_table_test, 3, 3, 0,
4355 doc: /* Define a new hash table test with name NAME, a symbol.
4356
4357 In hash tables created with NAME specified as test, use TEST to
4358 compare keys, and HASH for computing hash codes of keys.
4359
4360 TEST must be a function taking two arguments and returning non-nil if
4361 both arguments are the same. HASH must be a function taking one
4362 argument and returning an object that is the hash code of the argument.
4363 It should be the case that if (eq (funcall HASH x1) (funcall HASH x2))
4364 returns nil, then (funcall TEST x1 x2) also returns nil. */)
4365 (Lisp_Object name, Lisp_Object test, Lisp_Object hash)
4366 {
4367 return Fput (name, Qhash_table_test, list2 (test, hash));
4368 }
4369
4370
4371 \f
4372 /************************************************************************
4373 MD5, SHA-1, and SHA-2
4374 ************************************************************************/
4375
4376 #include "md5.h"
4377 #include "sha1.h"
4378 #include "sha256.h"
4379 #include "sha512.h"
4380
4381 /* ALGORITHM is a symbol: md5, sha1, sha224 and so on. */
4382
4383 static Lisp_Object
4384 secure_hash (Lisp_Object algorithm, Lisp_Object object, Lisp_Object start,
4385 Lisp_Object end, Lisp_Object coding_system, Lisp_Object noerror,
4386 Lisp_Object binary)
4387 {
4388 int i;
4389 ptrdiff_t size, start_char = 0, start_byte, end_char = 0, end_byte;
4390 register EMACS_INT b, e;
4391 register struct buffer *bp;
4392 EMACS_INT temp;
4393 int digest_size;
4394 void *(*hash_func) (const char *, size_t, void *);
4395 Lisp_Object digest;
4396
4397 CHECK_SYMBOL (algorithm);
4398
4399 if (STRINGP (object))
4400 {
4401 if (NILP (coding_system))
4402 {
4403 /* Decide the coding-system to encode the data with. */
4404
4405 if (STRING_MULTIBYTE (object))
4406 /* use default, we can't guess correct value */
4407 coding_system = preferred_coding_system ();
4408 else
4409 coding_system = Qraw_text;
4410 }
4411
4412 if (NILP (Fcoding_system_p (coding_system)))
4413 {
4414 /* Invalid coding system. */
4415
4416 if (!NILP (noerror))
4417 coding_system = Qraw_text;
4418 else
4419 xsignal1 (Qcoding_system_error, coding_system);
4420 }
4421
4422 if (STRING_MULTIBYTE (object))
4423 object = code_convert_string (object, coding_system, Qnil, 1, 0, 1);
4424
4425 size = SCHARS (object);
4426 validate_subarray (object, start, end, size, &start_char, &end_char);
4427
4428 start_byte = !start_char ? 0 : string_char_to_byte (object, start_char);
4429 end_byte = (end_char == size
4430 ? SBYTES (object)
4431 : string_char_to_byte (object, end_char));
4432 }
4433 else
4434 {
4435 struct buffer *prev = current_buffer;
4436
4437 record_unwind_current_buffer ();
4438
4439 CHECK_BUFFER (object);
4440
4441 bp = XBUFFER (object);
4442 set_buffer_internal (bp);
4443
4444 if (NILP (start))
4445 b = BEGV;
4446 else
4447 {
4448 CHECK_NUMBER_COERCE_MARKER (start);
4449 b = XINT (start);
4450 }
4451
4452 if (NILP (end))
4453 e = ZV;
4454 else
4455 {
4456 CHECK_NUMBER_COERCE_MARKER (end);
4457 e = XINT (end);
4458 }
4459
4460 if (b > e)
4461 temp = b, b = e, e = temp;
4462
4463 if (!(BEGV <= b && e <= ZV))
4464 args_out_of_range (start, end);
4465
4466 if (NILP (coding_system))
4467 {
4468 /* Decide the coding-system to encode the data with.
4469 See fileio.c:Fwrite-region */
4470
4471 if (!NILP (Vcoding_system_for_write))
4472 coding_system = Vcoding_system_for_write;
4473 else
4474 {
4475 bool force_raw_text = 0;
4476
4477 coding_system = BVAR (XBUFFER (object), buffer_file_coding_system);
4478 if (NILP (coding_system)
4479 || NILP (Flocal_variable_p (Qbuffer_file_coding_system, Qnil)))
4480 {
4481 coding_system = Qnil;
4482 if (NILP (BVAR (current_buffer, enable_multibyte_characters)))
4483 force_raw_text = 1;
4484 }
4485
4486 if (NILP (coding_system) && !NILP (Fbuffer_file_name (object)))
4487 {
4488 /* Check file-coding-system-alist. */
4489 Lisp_Object args[4], val;
4490
4491 args[0] = Qwrite_region; args[1] = start; args[2] = end;
4492 args[3] = Fbuffer_file_name (object);
4493 val = Ffind_operation_coding_system (4, args);
4494 if (CONSP (val) && !NILP (XCDR (val)))
4495 coding_system = XCDR (val);
4496 }
4497
4498 if (NILP (coding_system)
4499 && !NILP (BVAR (XBUFFER (object), buffer_file_coding_system)))
4500 {
4501 /* If we still have not decided a coding system, use the
4502 default value of buffer-file-coding-system. */
4503 coding_system = BVAR (XBUFFER (object), buffer_file_coding_system);
4504 }
4505
4506 if (!force_raw_text
4507 && !NILP (Ffboundp (Vselect_safe_coding_system_function)))
4508 /* Confirm that VAL can surely encode the current region. */
4509 coding_system = call4 (Vselect_safe_coding_system_function,
4510 make_number (b), make_number (e),
4511 coding_system, Qnil);
4512
4513 if (force_raw_text)
4514 coding_system = Qraw_text;
4515 }
4516
4517 if (NILP (Fcoding_system_p (coding_system)))
4518 {
4519 /* Invalid coding system. */
4520
4521 if (!NILP (noerror))
4522 coding_system = Qraw_text;
4523 else
4524 xsignal1 (Qcoding_system_error, coding_system);
4525 }
4526 }
4527
4528 object = make_buffer_string (b, e, 0);
4529 set_buffer_internal (prev);
4530 /* Discard the unwind protect for recovering the current
4531 buffer. */
4532 specpdl_ptr--;
4533
4534 if (STRING_MULTIBYTE (object))
4535 object = code_convert_string (object, coding_system, Qnil, 1, 0, 0);
4536 start_byte = 0;
4537 end_byte = SBYTES (object);
4538 }
4539
4540 if (EQ (algorithm, Qmd5))
4541 {
4542 digest_size = MD5_DIGEST_SIZE;
4543 hash_func = md5_buffer;
4544 }
4545 else if (EQ (algorithm, Qsha1))
4546 {
4547 digest_size = SHA1_DIGEST_SIZE;
4548 hash_func = sha1_buffer;
4549 }
4550 else if (EQ (algorithm, Qsha224))
4551 {
4552 digest_size = SHA224_DIGEST_SIZE;
4553 hash_func = sha224_buffer;
4554 }
4555 else if (EQ (algorithm, Qsha256))
4556 {
4557 digest_size = SHA256_DIGEST_SIZE;
4558 hash_func = sha256_buffer;
4559 }
4560 else if (EQ (algorithm, Qsha384))
4561 {
4562 digest_size = SHA384_DIGEST_SIZE;
4563 hash_func = sha384_buffer;
4564 }
4565 else if (EQ (algorithm, Qsha512))
4566 {
4567 digest_size = SHA512_DIGEST_SIZE;
4568 hash_func = sha512_buffer;
4569 }
4570 else
4571 error ("Invalid algorithm arg: %s", SDATA (Fsymbol_name (algorithm)));
4572
4573 /* allocate 2 x digest_size so that it can be re-used to hold the
4574 hexified value */
4575 digest = make_uninit_string (digest_size * 2);
4576
4577 hash_func (SSDATA (object) + start_byte,
4578 end_byte - start_byte,
4579 SSDATA (digest));
4580
4581 if (NILP (binary))
4582 {
4583 unsigned char *p = SDATA (digest);
4584 for (i = digest_size - 1; i >= 0; i--)
4585 {
4586 static char const hexdigit[16] = "0123456789abcdef";
4587 int p_i = p[i];
4588 p[2 * i] = hexdigit[p_i >> 4];
4589 p[2 * i + 1] = hexdigit[p_i & 0xf];
4590 }
4591 return digest;
4592 }
4593 else
4594 return make_unibyte_string (SSDATA (digest), digest_size);
4595 }
4596
4597 DEFUN ("md5", Fmd5, Smd5, 1, 5, 0,
4598 doc: /* Return MD5 message digest of OBJECT, a buffer or string.
4599
4600 A message digest is a cryptographic checksum of a document, and the
4601 algorithm to calculate it is defined in RFC 1321.
4602
4603 The two optional arguments START and END are character positions
4604 specifying for which part of OBJECT the message digest should be
4605 computed. If nil or omitted, the digest is computed for the whole
4606 OBJECT.
4607
4608 The MD5 message digest is computed from the result of encoding the
4609 text in a coding system, not directly from the internal Emacs form of
4610 the text. The optional fourth argument CODING-SYSTEM specifies which
4611 coding system to encode the text with. It should be the same coding
4612 system that you used or will use when actually writing the text into a
4613 file.
4614
4615 If CODING-SYSTEM is nil or omitted, the default depends on OBJECT. If
4616 OBJECT is a buffer, the default for CODING-SYSTEM is whatever coding
4617 system would be chosen by default for writing this text into a file.
4618
4619 If OBJECT is a string, the most preferred coding system (see the
4620 command `prefer-coding-system') is used.
4621
4622 If NOERROR is non-nil, silently assume the `raw-text' coding if the
4623 guesswork fails. Normally, an error is signaled in such case. */)
4624 (Lisp_Object object, Lisp_Object start, Lisp_Object end, Lisp_Object coding_system, Lisp_Object noerror)
4625 {
4626 return secure_hash (Qmd5, object, start, end, coding_system, noerror, Qnil);
4627 }
4628
4629 DEFUN ("secure-hash", Fsecure_hash, Ssecure_hash, 2, 5, 0,
4630 doc: /* Return the secure hash of OBJECT, a buffer or string.
4631 ALGORITHM is a symbol specifying the hash to use:
4632 md5, sha1, sha224, sha256, sha384 or sha512.
4633
4634 The two optional arguments START and END are positions specifying for
4635 which part of OBJECT to compute the hash. If nil or omitted, uses the
4636 whole OBJECT.
4637
4638 If BINARY is non-nil, returns a string in binary form. */)
4639 (Lisp_Object algorithm, Lisp_Object object, Lisp_Object start, Lisp_Object end, Lisp_Object binary)
4640 {
4641 return secure_hash (algorithm, object, start, end, Qnil, Qnil, binary);
4642 }
4643 \f
4644 void
4645 init_fns_once (void)
4646 {
4647 compare_text_properties = scm_make_fluid ();
4648 scm_set_smob_equalp (lisp_misc_tag, misc_equal_p);
4649 scm_set_smob_equalp (lisp_string_tag, string_equal_p);
4650 scm_set_smob_equalp (lisp_vectorlike_tag, vectorlike_equal_p);
4651 }
4652
4653 void
4654 syms_of_fns (void)
4655 {
4656 #include "fns.x"
4657
4658 DEFSYM (Qmd5, "md5");
4659 DEFSYM (Qsha1, "sha1");
4660 DEFSYM (Qsha224, "sha224");
4661 DEFSYM (Qsha256, "sha256");
4662 DEFSYM (Qsha384, "sha384");
4663 DEFSYM (Qsha512, "sha512");
4664
4665 /* Hash table stuff. */
4666 DEFSYM (Qhash_table_p, "hash-table-p");
4667 DEFSYM (Qeq, "eq");
4668 DEFSYM (Qeql, "eql");
4669 DEFSYM (Qequal, "equal");
4670 DEFSYM (QCtest, ":test");
4671 DEFSYM (QCsize, ":size");
4672 DEFSYM (QCrehash_size, ":rehash-size");
4673 DEFSYM (QCrehash_threshold, ":rehash-threshold");
4674 DEFSYM (QCweakness, ":weakness");
4675 DEFSYM (Qkey, "key");
4676 DEFSYM (Qvalue, "value");
4677 DEFSYM (Qhash_table_test, "hash-table-test");
4678 DEFSYM (Qkey_or_value, "key-or-value");
4679 DEFSYM (Qkey_and_value, "key-and-value");
4680
4681 DEFSYM (Qstring_lessp, "string-lessp");
4682 DEFSYM (Qprovide, "provide");
4683 DEFSYM (Qrequire, "require");
4684 DEFSYM (Qyes_or_no_p_history, "yes-or-no-p-history");
4685 DEFSYM (Qcursor_in_echo_area, "cursor-in-echo-area");
4686 DEFSYM (Qwidget_type, "widget-type");
4687
4688 staticpro (&string_char_byte_cache_string);
4689 string_char_byte_cache_string = Qnil;
4690
4691 require_nesting_list = Qnil;
4692 staticpro (&require_nesting_list);
4693
4694 Fset (Qyes_or_no_p_history, Qnil);
4695
4696 DEFVAR_LISP ("features", Vfeatures,
4697 doc: /* A list of symbols which are the features of the executing Emacs.
4698 Used by `featurep' and `require', and altered by `provide'. */);
4699 Vfeatures = list1 (intern_c_string ("emacs"));
4700 DEFSYM (Qsubfeatures, "subfeatures");
4701 DEFSYM (Qfuncall, "funcall");
4702
4703 #ifdef HAVE_LANGINFO_CODESET
4704 DEFSYM (Qcodeset, "codeset");
4705 DEFSYM (Qdays, "days");
4706 DEFSYM (Qmonths, "months");
4707 DEFSYM (Qpaper, "paper");
4708 #endif /* HAVE_LANGINFO_CODESET */
4709
4710 DEFVAR_BOOL ("use-dialog-box", use_dialog_box,
4711 doc: /* Non-nil means mouse commands use dialog boxes to ask questions.
4712 This applies to `y-or-n-p' and `yes-or-no-p' questions asked by commands
4713 invoked by mouse clicks and mouse menu items.
4714
4715 On some platforms, file selection dialogs are also enabled if this is
4716 non-nil. */);
4717 use_dialog_box = 1;
4718
4719 DEFVAR_BOOL ("use-file-dialog", use_file_dialog,
4720 doc: /* Non-nil means mouse commands use a file dialog to ask for files.
4721 This applies to commands from menus and tool bar buttons even when
4722 they are initiated from the keyboard. If `use-dialog-box' is nil,
4723 that disables the use of a file dialog, regardless of the value of
4724 this variable. */);
4725 use_file_dialog = 1;
4726
4727 hashtest_eq.name = Qeq;
4728 hashtest_eq.user_hash_function = Qnil;
4729 hashtest_eq.user_cmp_function = Qnil;
4730 hashtest_eq.cmpfn = 0;
4731 hashtest_eq.hashfn = hashfn_eq;
4732
4733 hashtest_eql.name = Qeql;
4734 hashtest_eql.user_hash_function = Qnil;
4735 hashtest_eql.user_cmp_function = Qnil;
4736 hashtest_eql.cmpfn = cmpfn_eql;
4737 hashtest_eql.hashfn = hashfn_eql;
4738
4739 hashtest_equal.name = Qequal;
4740 hashtest_equal.user_hash_function = Qnil;
4741 hashtest_equal.user_cmp_function = Qnil;
4742 hashtest_equal.cmpfn = cmpfn_equal;
4743 hashtest_equal.hashfn = hashfn_equal;
4744 }