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