(thumbs-call-convert): Use call-process directly
[emacs.git] / src / fns.c
blob618ccb5025fc1a11addc64cffb36e405f2178366
1 /* Random utility Lisp functions.
2 Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1997,
3 1998, 1999, 2000, 2001, 2002, 2003, 2004,
4 2005, 2006, 2007 Free Software Foundation, Inc.
6 This file is part of GNU Emacs.
8 GNU Emacs is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
13 GNU Emacs is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GNU Emacs; see the file COPYING. If not, write to
20 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 Boston, MA 02110-1301, USA. */
23 #include <config.h>
25 #ifdef HAVE_UNISTD_H
26 #include <unistd.h>
27 #endif
28 #include <time.h>
30 #ifndef MAC_OS
31 /* On Mac OS, defining this conflicts with precompiled headers. */
33 /* Note on some machines this defines `vector' as a typedef,
34 so make sure we don't use that name in this file. */
35 #undef vector
36 #define vector *****
38 #endif /* ! MAC_OSX */
40 #include "lisp.h"
41 #include "commands.h"
42 #include "charset.h"
43 #include "coding.h"
44 #include "buffer.h"
45 #include "keyboard.h"
46 #include "keymap.h"
47 #include "intervals.h"
48 #include "frame.h"
49 #include "window.h"
50 #include "blockinput.h"
51 #ifdef HAVE_MENUS
52 #if defined (HAVE_X_WINDOWS)
53 #include "xterm.h"
54 #elif defined (MAC_OS)
55 #include "macterm.h"
56 #endif
57 #endif
59 #ifndef NULL
60 #define NULL ((POINTER_TYPE *)0)
61 #endif
63 /* Nonzero enables use of dialog boxes for questions
64 asked by mouse commands. */
65 int use_dialog_box;
67 /* Nonzero enables use of a file dialog for file name
68 questions asked by mouse commands. */
69 int use_file_dialog;
71 extern int minibuffer_auto_raise;
72 extern Lisp_Object minibuf_window;
73 extern Lisp_Object Vlocale_coding_system;
74 extern int load_in_progress;
76 Lisp_Object Qstring_lessp, Qprovide, Qrequire;
77 Lisp_Object Qyes_or_no_p_history;
78 Lisp_Object Qcursor_in_echo_area;
79 Lisp_Object Qwidget_type;
80 Lisp_Object Qcodeset, Qdays, Qmonths, Qpaper;
82 extern Lisp_Object Qinput_method_function;
84 static int internal_equal P_ ((Lisp_Object , Lisp_Object, int, int));
86 extern long get_random ();
87 extern void seed_random P_ ((long));
89 #ifndef HAVE_UNISTD_H
90 extern long time ();
91 #endif
93 DEFUN ("identity", Fidentity, Sidentity, 1, 1, 0,
94 doc: /* Return the argument unchanged. */)
95 (arg)
96 Lisp_Object arg;
98 return arg;
101 DEFUN ("random", Frandom, Srandom, 0, 1, 0,
102 doc: /* Return a pseudo-random number.
103 All integers representable in Lisp are equally likely.
104 On most systems, this is 29 bits' worth.
105 With positive integer argument N, return random number in interval [0,N).
106 With argument t, set the random number seed from the current time and pid. */)
108 Lisp_Object n;
110 EMACS_INT val;
111 Lisp_Object lispy_val;
112 unsigned long denominator;
114 if (EQ (n, Qt))
115 seed_random (getpid () + time (NULL));
116 if (NATNUMP (n) && XFASTINT (n) != 0)
118 /* Try to take our random number from the higher bits of VAL,
119 not the lower, since (says Gentzel) the low bits of `random'
120 are less random than the higher ones. We do this by using the
121 quotient rather than the remainder. At the high end of the RNG
122 it's possible to get a quotient larger than n; discarding
123 these values eliminates the bias that would otherwise appear
124 when using a large n. */
125 denominator = ((unsigned long)1 << VALBITS) / XFASTINT (n);
127 val = get_random () / denominator;
128 while (val >= XFASTINT (n));
130 else
131 val = get_random ();
132 XSETINT (lispy_val, val);
133 return lispy_val;
136 /* Random data-structure functions */
138 DEFUN ("length", Flength, Slength, 1, 1, 0,
139 doc: /* Return the length of vector, list or string SEQUENCE.
140 A byte-code function object is also allowed.
141 If the string contains multibyte characters, this is not necessarily
142 the number of bytes in the string; it is the number of characters.
143 To get the number of bytes, use `string-bytes'. */)
144 (sequence)
145 register Lisp_Object sequence;
147 register Lisp_Object val;
148 register int i;
150 if (STRINGP (sequence))
151 XSETFASTINT (val, SCHARS (sequence));
152 else if (VECTORP (sequence))
153 XSETFASTINT (val, ASIZE (sequence));
154 else if (SUB_CHAR_TABLE_P (sequence))
155 XSETFASTINT (val, SUB_CHAR_TABLE_ORDINARY_SLOTS);
156 else if (CHAR_TABLE_P (sequence))
157 XSETFASTINT (val, MAX_CHAR);
158 else if (BOOL_VECTOR_P (sequence))
159 XSETFASTINT (val, XBOOL_VECTOR (sequence)->size);
160 else if (COMPILEDP (sequence))
161 XSETFASTINT (val, ASIZE (sequence) & PSEUDOVECTOR_SIZE_MASK);
162 else if (CONSP (sequence))
164 i = 0;
165 while (CONSP (sequence))
167 sequence = XCDR (sequence);
168 ++i;
170 if (!CONSP (sequence))
171 break;
173 sequence = XCDR (sequence);
174 ++i;
175 QUIT;
178 CHECK_LIST_END (sequence, sequence);
180 val = make_number (i);
182 else if (NILP (sequence))
183 XSETFASTINT (val, 0);
184 else
185 wrong_type_argument (Qsequencep, sequence);
187 return val;
190 /* This does not check for quits. That is safe since it must terminate. */
192 DEFUN ("safe-length", Fsafe_length, Ssafe_length, 1, 1, 0,
193 doc: /* Return the length of a list, but avoid error or infinite loop.
194 This function never gets an error. If LIST is not really a list,
195 it returns 0. If LIST is circular, it returns a finite value
196 which is at least the number of distinct elements. */)
197 (list)
198 Lisp_Object list;
200 Lisp_Object tail, halftail, length;
201 int len = 0;
203 /* halftail is used to detect circular lists. */
204 halftail = list;
205 for (tail = list; CONSP (tail); tail = XCDR (tail))
207 if (EQ (tail, halftail) && len != 0)
208 break;
209 len++;
210 if ((len & 1) == 0)
211 halftail = XCDR (halftail);
214 XSETINT (length, len);
215 return length;
218 DEFUN ("string-bytes", Fstring_bytes, Sstring_bytes, 1, 1, 0,
219 doc: /* Return the number of bytes in STRING.
220 If STRING is a multibyte string, this is greater than the length of STRING. */)
221 (string)
222 Lisp_Object string;
224 CHECK_STRING (string);
225 return make_number (SBYTES (string));
228 DEFUN ("string-equal", Fstring_equal, Sstring_equal, 2, 2, 0,
229 doc: /* Return t if two strings have identical contents.
230 Case is significant, but text properties are ignored.
231 Symbols are also allowed; their print names are used instead. */)
232 (s1, s2)
233 register Lisp_Object s1, s2;
235 if (SYMBOLP (s1))
236 s1 = SYMBOL_NAME (s1);
237 if (SYMBOLP (s2))
238 s2 = SYMBOL_NAME (s2);
239 CHECK_STRING (s1);
240 CHECK_STRING (s2);
242 if (SCHARS (s1) != SCHARS (s2)
243 || SBYTES (s1) != SBYTES (s2)
244 || bcmp (SDATA (s1), SDATA (s2), SBYTES (s1)))
245 return Qnil;
246 return Qt;
249 DEFUN ("compare-strings", Fcompare_strings,
250 Scompare_strings, 6, 7, 0,
251 doc: /* Compare the contents of two strings, converting to multibyte if needed.
252 In string STR1, skip the first START1 characters and stop at END1.
253 In string STR2, skip the first START2 characters and stop at END2.
254 END1 and END2 default to the full lengths of the respective strings.
256 Case is significant in this comparison if IGNORE-CASE is nil.
257 Unibyte strings are converted to multibyte for comparison.
259 The value is t if the strings (or specified portions) match.
260 If string STR1 is less, the value is a negative number N;
261 - 1 - N is the number of characters that match at the beginning.
262 If string STR1 is greater, the value is a positive number N;
263 N - 1 is the number of characters that match at the beginning. */)
264 (str1, start1, end1, str2, start2, end2, ignore_case)
265 Lisp_Object str1, start1, end1, start2, str2, end2, ignore_case;
267 register int end1_char, end2_char;
268 register int i1, i1_byte, i2, i2_byte;
270 CHECK_STRING (str1);
271 CHECK_STRING (str2);
272 if (NILP (start1))
273 start1 = make_number (0);
274 if (NILP (start2))
275 start2 = make_number (0);
276 CHECK_NATNUM (start1);
277 CHECK_NATNUM (start2);
278 if (! NILP (end1))
279 CHECK_NATNUM (end1);
280 if (! NILP (end2))
281 CHECK_NATNUM (end2);
283 i1 = XINT (start1);
284 i2 = XINT (start2);
286 i1_byte = string_char_to_byte (str1, i1);
287 i2_byte = string_char_to_byte (str2, i2);
289 end1_char = SCHARS (str1);
290 if (! NILP (end1) && end1_char > XINT (end1))
291 end1_char = XINT (end1);
293 end2_char = SCHARS (str2);
294 if (! NILP (end2) && end2_char > XINT (end2))
295 end2_char = XINT (end2);
297 while (i1 < end1_char && i2 < end2_char)
299 /* When we find a mismatch, we must compare the
300 characters, not just the bytes. */
301 int c1, c2;
303 if (STRING_MULTIBYTE (str1))
304 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c1, str1, i1, i1_byte);
305 else
307 c1 = SREF (str1, i1++);
308 c1 = unibyte_char_to_multibyte (c1);
311 if (STRING_MULTIBYTE (str2))
312 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c2, str2, i2, i2_byte);
313 else
315 c2 = SREF (str2, i2++);
316 c2 = unibyte_char_to_multibyte (c2);
319 if (c1 == c2)
320 continue;
322 if (! NILP (ignore_case))
324 Lisp_Object tem;
326 tem = Fupcase (make_number (c1));
327 c1 = XINT (tem);
328 tem = Fupcase (make_number (c2));
329 c2 = XINT (tem);
332 if (c1 == c2)
333 continue;
335 /* Note that I1 has already been incremented
336 past the character that we are comparing;
337 hence we don't add or subtract 1 here. */
338 if (c1 < c2)
339 return make_number (- i1 + XINT (start1));
340 else
341 return make_number (i1 - XINT (start1));
344 if (i1 < end1_char)
345 return make_number (i1 - XINT (start1) + 1);
346 if (i2 < end2_char)
347 return make_number (- i1 + XINT (start1) - 1);
349 return Qt;
352 DEFUN ("string-lessp", Fstring_lessp, Sstring_lessp, 2, 2, 0,
353 doc: /* Return t if first arg string is less than second in lexicographic order.
354 Case is significant.
355 Symbols are also allowed; their print names are used instead. */)
356 (s1, s2)
357 register Lisp_Object s1, s2;
359 register int end;
360 register int i1, i1_byte, i2, i2_byte;
362 if (SYMBOLP (s1))
363 s1 = SYMBOL_NAME (s1);
364 if (SYMBOLP (s2))
365 s2 = SYMBOL_NAME (s2);
366 CHECK_STRING (s1);
367 CHECK_STRING (s2);
369 i1 = i1_byte = i2 = i2_byte = 0;
371 end = SCHARS (s1);
372 if (end > SCHARS (s2))
373 end = SCHARS (s2);
375 while (i1 < end)
377 /* When we find a mismatch, we must compare the
378 characters, not just the bytes. */
379 int c1, c2;
381 FETCH_STRING_CHAR_ADVANCE (c1, s1, i1, i1_byte);
382 FETCH_STRING_CHAR_ADVANCE (c2, s2, i2, i2_byte);
384 if (c1 != c2)
385 return c1 < c2 ? Qt : Qnil;
387 return i1 < SCHARS (s2) ? Qt : Qnil;
390 #if __GNUC__
391 /* "gcc -O3" enables automatic function inlining, which optimizes out
392 the arguments for the invocations of this function, whereas it
393 expects these values on the stack. */
394 static Lisp_Object concat P_ ((int nargs, Lisp_Object *args, enum Lisp_Type target_type, int last_special)) __attribute__((noinline));
395 #else /* !__GNUC__ */
396 static Lisp_Object concat P_ ((int nargs, Lisp_Object *args, enum Lisp_Type target_type, int last_special));
397 #endif
399 /* ARGSUSED */
400 Lisp_Object
401 concat2 (s1, s2)
402 Lisp_Object s1, s2;
404 #ifdef NO_ARG_ARRAY
405 Lisp_Object args[2];
406 args[0] = s1;
407 args[1] = s2;
408 return concat (2, args, Lisp_String, 0);
409 #else
410 return concat (2, &s1, Lisp_String, 0);
411 #endif /* NO_ARG_ARRAY */
414 /* ARGSUSED */
415 Lisp_Object
416 concat3 (s1, s2, s3)
417 Lisp_Object s1, s2, s3;
419 #ifdef NO_ARG_ARRAY
420 Lisp_Object args[3];
421 args[0] = s1;
422 args[1] = s2;
423 args[2] = s3;
424 return concat (3, args, Lisp_String, 0);
425 #else
426 return concat (3, &s1, Lisp_String, 0);
427 #endif /* NO_ARG_ARRAY */
430 DEFUN ("append", Fappend, Sappend, 0, MANY, 0,
431 doc: /* Concatenate all the arguments and make the result a list.
432 The result is a list whose elements are the elements of all the arguments.
433 Each argument may be a list, vector or string.
434 The last argument is not copied, just used as the tail of the new list.
435 usage: (append &rest SEQUENCES) */)
436 (nargs, args)
437 int nargs;
438 Lisp_Object *args;
440 return concat (nargs, args, Lisp_Cons, 1);
443 DEFUN ("concat", Fconcat, Sconcat, 0, MANY, 0,
444 doc: /* Concatenate all the arguments and make the result a string.
445 The result is a string whose elements are the elements of all the arguments.
446 Each argument may be a string or a list or vector of characters (integers).
447 usage: (concat &rest SEQUENCES) */)
448 (nargs, args)
449 int nargs;
450 Lisp_Object *args;
452 return concat (nargs, args, Lisp_String, 0);
455 DEFUN ("vconcat", Fvconcat, Svconcat, 0, MANY, 0,
456 doc: /* Concatenate all the arguments and make the result a vector.
457 The result is a vector whose elements are the elements of all the arguments.
458 Each argument may be a list, vector or string.
459 usage: (vconcat &rest SEQUENCES) */)
460 (nargs, args)
461 int nargs;
462 Lisp_Object *args;
464 return concat (nargs, args, Lisp_Vectorlike, 0);
467 /* Return a copy of a sub char table ARG. The elements except for a
468 nested sub char table are not copied. */
469 static Lisp_Object
470 copy_sub_char_table (arg)
471 Lisp_Object arg;
473 Lisp_Object copy = make_sub_char_table (Qnil);
474 int i;
476 XCHAR_TABLE (copy)->defalt = XCHAR_TABLE (arg)->defalt;
477 /* Copy all the contents. */
478 bcopy (XCHAR_TABLE (arg)->contents, XCHAR_TABLE (copy)->contents,
479 SUB_CHAR_TABLE_ORDINARY_SLOTS * sizeof (Lisp_Object));
480 /* Recursively copy any sub char-tables in the ordinary slots. */
481 for (i = 32; i < SUB_CHAR_TABLE_ORDINARY_SLOTS; i++)
482 if (SUB_CHAR_TABLE_P (XCHAR_TABLE (arg)->contents[i]))
483 XCHAR_TABLE (copy)->contents[i]
484 = copy_sub_char_table (XCHAR_TABLE (copy)->contents[i]);
486 return copy;
490 DEFUN ("copy-sequence", Fcopy_sequence, Scopy_sequence, 1, 1, 0,
491 doc: /* Return a copy of a list, vector, string or char-table.
492 The elements of a list or vector are not copied; they are shared
493 with the original. */)
494 (arg)
495 Lisp_Object arg;
497 if (NILP (arg)) return arg;
499 if (CHAR_TABLE_P (arg))
501 int i;
502 Lisp_Object copy;
504 copy = Fmake_char_table (XCHAR_TABLE (arg)->purpose, Qnil);
505 /* Copy all the slots, including the extra ones. */
506 bcopy (XVECTOR (arg)->contents, XVECTOR (copy)->contents,
507 ((XCHAR_TABLE (arg)->size & PSEUDOVECTOR_SIZE_MASK)
508 * sizeof (Lisp_Object)));
510 /* Recursively copy any sub char tables in the ordinary slots
511 for multibyte characters. */
512 for (i = CHAR_TABLE_SINGLE_BYTE_SLOTS;
513 i < CHAR_TABLE_ORDINARY_SLOTS; i++)
514 if (SUB_CHAR_TABLE_P (XCHAR_TABLE (arg)->contents[i]))
515 XCHAR_TABLE (copy)->contents[i]
516 = copy_sub_char_table (XCHAR_TABLE (copy)->contents[i]);
518 return copy;
521 if (BOOL_VECTOR_P (arg))
523 Lisp_Object val;
524 int size_in_chars
525 = ((XBOOL_VECTOR (arg)->size + BOOL_VECTOR_BITS_PER_CHAR - 1)
526 / BOOL_VECTOR_BITS_PER_CHAR);
528 val = Fmake_bool_vector (Flength (arg), Qnil);
529 bcopy (XBOOL_VECTOR (arg)->data, XBOOL_VECTOR (val)->data,
530 size_in_chars);
531 return val;
534 if (!CONSP (arg) && !VECTORP (arg) && !STRINGP (arg))
535 wrong_type_argument (Qsequencep, arg);
537 return concat (1, &arg, CONSP (arg) ? Lisp_Cons : XTYPE (arg), 0);
540 /* This structure holds information of an argument of `concat' that is
541 a string and has text properties to be copied. */
542 struct textprop_rec
544 int argnum; /* refer to ARGS (arguments of `concat') */
545 int from; /* refer to ARGS[argnum] (argument string) */
546 int to; /* refer to VAL (the target string) */
549 static Lisp_Object
550 concat (nargs, args, target_type, last_special)
551 int nargs;
552 Lisp_Object *args;
553 enum Lisp_Type target_type;
554 int last_special;
556 Lisp_Object val;
557 register Lisp_Object tail;
558 register Lisp_Object this;
559 int toindex;
560 int toindex_byte = 0;
561 register int result_len;
562 register int result_len_byte;
563 register int argnum;
564 Lisp_Object last_tail;
565 Lisp_Object prev;
566 int some_multibyte;
567 /* When we make a multibyte string, we can't copy text properties
568 while concatinating each string because the length of resulting
569 string can't be decided until we finish the whole concatination.
570 So, we record strings that have text properties to be copied
571 here, and copy the text properties after the concatination. */
572 struct textprop_rec *textprops = NULL;
573 /* Number of elments in textprops. */
574 int num_textprops = 0;
575 USE_SAFE_ALLOCA;
577 tail = Qnil;
579 /* In append, the last arg isn't treated like the others */
580 if (last_special && nargs > 0)
582 nargs--;
583 last_tail = args[nargs];
585 else
586 last_tail = Qnil;
588 /* Check each argument. */
589 for (argnum = 0; argnum < nargs; argnum++)
591 this = args[argnum];
592 if (!(CONSP (this) || NILP (this) || VECTORP (this) || STRINGP (this)
593 || COMPILEDP (this) || BOOL_VECTOR_P (this)))
594 wrong_type_argument (Qsequencep, this);
597 /* Compute total length in chars of arguments in RESULT_LEN.
598 If desired output is a string, also compute length in bytes
599 in RESULT_LEN_BYTE, and determine in SOME_MULTIBYTE
600 whether the result should be a multibyte string. */
601 result_len_byte = 0;
602 result_len = 0;
603 some_multibyte = 0;
604 for (argnum = 0; argnum < nargs; argnum++)
606 int len;
607 this = args[argnum];
608 len = XFASTINT (Flength (this));
609 if (target_type == Lisp_String)
611 /* We must count the number of bytes needed in the string
612 as well as the number of characters. */
613 int i;
614 Lisp_Object ch;
615 int this_len_byte;
617 if (VECTORP (this))
618 for (i = 0; i < len; i++)
620 ch = AREF (this, i);
621 CHECK_NUMBER (ch);
622 this_len_byte = CHAR_BYTES (XINT (ch));
623 result_len_byte += this_len_byte;
624 if (!SINGLE_BYTE_CHAR_P (XINT (ch)))
625 some_multibyte = 1;
627 else if (BOOL_VECTOR_P (this) && XBOOL_VECTOR (this)->size > 0)
628 wrong_type_argument (Qintegerp, Faref (this, make_number (0)));
629 else if (CONSP (this))
630 for (; CONSP (this); this = XCDR (this))
632 ch = XCAR (this);
633 CHECK_NUMBER (ch);
634 this_len_byte = CHAR_BYTES (XINT (ch));
635 result_len_byte += this_len_byte;
636 if (!SINGLE_BYTE_CHAR_P (XINT (ch)))
637 some_multibyte = 1;
639 else if (STRINGP (this))
641 if (STRING_MULTIBYTE (this))
643 some_multibyte = 1;
644 result_len_byte += SBYTES (this);
646 else
647 result_len_byte += count_size_as_multibyte (SDATA (this),
648 SCHARS (this));
652 result_len += len;
655 if (! some_multibyte)
656 result_len_byte = result_len;
658 /* Create the output object. */
659 if (target_type == Lisp_Cons)
660 val = Fmake_list (make_number (result_len), Qnil);
661 else if (target_type == Lisp_Vectorlike)
662 val = Fmake_vector (make_number (result_len), Qnil);
663 else if (some_multibyte)
664 val = make_uninit_multibyte_string (result_len, result_len_byte);
665 else
666 val = make_uninit_string (result_len);
668 /* In `append', if all but last arg are nil, return last arg. */
669 if (target_type == Lisp_Cons && EQ (val, Qnil))
670 return last_tail;
672 /* Copy the contents of the args into the result. */
673 if (CONSP (val))
674 tail = val, toindex = -1; /* -1 in toindex is flag we are making a list */
675 else
676 toindex = 0, toindex_byte = 0;
678 prev = Qnil;
679 if (STRINGP (val))
680 SAFE_ALLOCA (textprops, struct textprop_rec *, sizeof (struct textprop_rec) * nargs);
682 for (argnum = 0; argnum < nargs; argnum++)
684 Lisp_Object thislen;
685 int thisleni = 0;
686 register unsigned int thisindex = 0;
687 register unsigned int thisindex_byte = 0;
689 this = args[argnum];
690 if (!CONSP (this))
691 thislen = Flength (this), thisleni = XINT (thislen);
693 /* Between strings of the same kind, copy fast. */
694 if (STRINGP (this) && STRINGP (val)
695 && STRING_MULTIBYTE (this) == some_multibyte)
697 int thislen_byte = SBYTES (this);
699 bcopy (SDATA (this), SDATA (val) + toindex_byte,
700 SBYTES (this));
701 if (! NULL_INTERVAL_P (STRING_INTERVALS (this)))
703 textprops[num_textprops].argnum = argnum;
704 textprops[num_textprops].from = 0;
705 textprops[num_textprops++].to = toindex;
707 toindex_byte += thislen_byte;
708 toindex += thisleni;
709 STRING_SET_CHARS (val, SCHARS (val));
711 /* Copy a single-byte string to a multibyte string. */
712 else if (STRINGP (this) && STRINGP (val))
714 if (! NULL_INTERVAL_P (STRING_INTERVALS (this)))
716 textprops[num_textprops].argnum = argnum;
717 textprops[num_textprops].from = 0;
718 textprops[num_textprops++].to = toindex;
720 toindex_byte += copy_text (SDATA (this),
721 SDATA (val) + toindex_byte,
722 SCHARS (this), 0, 1);
723 toindex += thisleni;
725 else
726 /* Copy element by element. */
727 while (1)
729 register Lisp_Object elt;
731 /* Fetch next element of `this' arg into `elt', or break if
732 `this' is exhausted. */
733 if (NILP (this)) break;
734 if (CONSP (this))
735 elt = XCAR (this), this = XCDR (this);
736 else if (thisindex >= thisleni)
737 break;
738 else if (STRINGP (this))
740 int c;
741 if (STRING_MULTIBYTE (this))
743 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c, this,
744 thisindex,
745 thisindex_byte);
746 XSETFASTINT (elt, c);
748 else
750 XSETFASTINT (elt, SREF (this, thisindex)); thisindex++;
751 if (some_multibyte
752 && (XINT (elt) >= 0240
753 || (XINT (elt) >= 0200
754 && ! NILP (Vnonascii_translation_table)))
755 && XINT (elt) < 0400)
757 c = unibyte_char_to_multibyte (XINT (elt));
758 XSETINT (elt, c);
762 else if (BOOL_VECTOR_P (this))
764 int byte;
765 byte = XBOOL_VECTOR (this)->data[thisindex / BOOL_VECTOR_BITS_PER_CHAR];
766 if (byte & (1 << (thisindex % BOOL_VECTOR_BITS_PER_CHAR)))
767 elt = Qt;
768 else
769 elt = Qnil;
770 thisindex++;
772 else
773 elt = AREF (this, thisindex++);
775 /* Store this element into the result. */
776 if (toindex < 0)
778 XSETCAR (tail, elt);
779 prev = tail;
780 tail = XCDR (tail);
782 else if (VECTORP (val))
783 AREF (val, toindex++) = elt;
784 else
786 CHECK_NUMBER (elt);
787 if (SINGLE_BYTE_CHAR_P (XINT (elt)))
789 if (some_multibyte)
790 toindex_byte
791 += CHAR_STRING (XINT (elt),
792 SDATA (val) + toindex_byte);
793 else
794 SSET (val, toindex_byte++, XINT (elt));
795 toindex++;
797 else
798 /* If we have any multibyte characters,
799 we already decided to make a multibyte string. */
801 int c = XINT (elt);
802 /* P exists as a variable
803 to avoid a bug on the Masscomp C compiler. */
804 unsigned char *p = SDATA (val) + toindex_byte;
806 toindex_byte += CHAR_STRING (c, p);
807 toindex++;
812 if (!NILP (prev))
813 XSETCDR (prev, last_tail);
815 if (num_textprops > 0)
817 Lisp_Object props;
818 int last_to_end = -1;
820 for (argnum = 0; argnum < num_textprops; argnum++)
822 this = args[textprops[argnum].argnum];
823 props = text_property_list (this,
824 make_number (0),
825 make_number (SCHARS (this)),
826 Qnil);
827 /* If successive arguments have properites, be sure that the
828 value of `composition' property be the copy. */
829 if (last_to_end == textprops[argnum].to)
830 make_composition_value_copy (props);
831 add_text_properties_from_list (val, props,
832 make_number (textprops[argnum].to));
833 last_to_end = textprops[argnum].to + SCHARS (this);
837 SAFE_FREE ();
838 return val;
841 static Lisp_Object string_char_byte_cache_string;
842 static int string_char_byte_cache_charpos;
843 static int string_char_byte_cache_bytepos;
845 void
846 clear_string_char_byte_cache ()
848 string_char_byte_cache_string = Qnil;
851 /* Return the character index corresponding to CHAR_INDEX in STRING. */
854 string_char_to_byte (string, char_index)
855 Lisp_Object string;
856 int char_index;
858 int i, i_byte;
859 int best_below, best_below_byte;
860 int best_above, best_above_byte;
862 best_below = best_below_byte = 0;
863 best_above = SCHARS (string);
864 best_above_byte = SBYTES (string);
865 if (best_above == best_above_byte)
866 return char_index;
868 if (EQ (string, string_char_byte_cache_string))
870 if (string_char_byte_cache_charpos < char_index)
872 best_below = string_char_byte_cache_charpos;
873 best_below_byte = string_char_byte_cache_bytepos;
875 else
877 best_above = string_char_byte_cache_charpos;
878 best_above_byte = string_char_byte_cache_bytepos;
882 if (char_index - best_below < best_above - char_index)
884 while (best_below < char_index)
886 int c;
887 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c, string,
888 best_below, best_below_byte);
890 i = best_below;
891 i_byte = best_below_byte;
893 else
895 while (best_above > char_index)
897 unsigned char *pend = SDATA (string) + best_above_byte;
898 unsigned char *pbeg = pend - best_above_byte;
899 unsigned char *p = pend - 1;
900 int bytes;
902 while (p > pbeg && !CHAR_HEAD_P (*p)) p--;
903 PARSE_MULTIBYTE_SEQ (p, pend - p, bytes);
904 if (bytes == pend - p)
905 best_above_byte -= bytes;
906 else if (bytes > pend - p)
907 best_above_byte -= (pend - p);
908 else
909 best_above_byte--;
910 best_above--;
912 i = best_above;
913 i_byte = best_above_byte;
916 string_char_byte_cache_bytepos = i_byte;
917 string_char_byte_cache_charpos = i;
918 string_char_byte_cache_string = string;
920 return i_byte;
923 /* Return the character index corresponding to BYTE_INDEX in STRING. */
926 string_byte_to_char (string, byte_index)
927 Lisp_Object string;
928 int byte_index;
930 int i, i_byte;
931 int best_below, best_below_byte;
932 int best_above, best_above_byte;
934 best_below = best_below_byte = 0;
935 best_above = SCHARS (string);
936 best_above_byte = SBYTES (string);
937 if (best_above == best_above_byte)
938 return byte_index;
940 if (EQ (string, string_char_byte_cache_string))
942 if (string_char_byte_cache_bytepos < byte_index)
944 best_below = string_char_byte_cache_charpos;
945 best_below_byte = string_char_byte_cache_bytepos;
947 else
949 best_above = string_char_byte_cache_charpos;
950 best_above_byte = string_char_byte_cache_bytepos;
954 if (byte_index - best_below_byte < best_above_byte - byte_index)
956 while (best_below_byte < byte_index)
958 int c;
959 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c, string,
960 best_below, best_below_byte);
962 i = best_below;
963 i_byte = best_below_byte;
965 else
967 while (best_above_byte > byte_index)
969 unsigned char *pend = SDATA (string) + best_above_byte;
970 unsigned char *pbeg = pend - best_above_byte;
971 unsigned char *p = pend - 1;
972 int bytes;
974 while (p > pbeg && !CHAR_HEAD_P (*p)) p--;
975 PARSE_MULTIBYTE_SEQ (p, pend - p, bytes);
976 if (bytes == pend - p)
977 best_above_byte -= bytes;
978 else if (bytes > pend - p)
979 best_above_byte -= (pend - p);
980 else
981 best_above_byte--;
982 best_above--;
984 i = best_above;
985 i_byte = best_above_byte;
988 string_char_byte_cache_bytepos = i_byte;
989 string_char_byte_cache_charpos = i;
990 string_char_byte_cache_string = string;
992 return i;
995 /* Convert STRING to a multibyte string.
996 Single-byte characters 0240 through 0377 are converted
997 by adding nonascii_insert_offset to each. */
999 Lisp_Object
1000 string_make_multibyte (string)
1001 Lisp_Object string;
1003 unsigned char *buf;
1004 int nbytes;
1005 Lisp_Object ret;
1006 USE_SAFE_ALLOCA;
1008 if (STRING_MULTIBYTE (string))
1009 return string;
1011 nbytes = count_size_as_multibyte (SDATA (string),
1012 SCHARS (string));
1013 /* If all the chars are ASCII, they won't need any more bytes
1014 once converted. In that case, we can return STRING itself. */
1015 if (nbytes == SBYTES (string))
1016 return string;
1018 SAFE_ALLOCA (buf, unsigned char *, nbytes);
1019 copy_text (SDATA (string), buf, SBYTES (string),
1020 0, 1);
1022 ret = make_multibyte_string (buf, SCHARS (string), nbytes);
1023 SAFE_FREE ();
1025 return ret;
1029 /* Convert STRING to a multibyte string without changing each
1030 character codes. Thus, characters 0200 trough 0237 are converted
1031 to eight-bit-control characters, and characters 0240 through 0377
1032 are converted eight-bit-graphic characters. */
1034 Lisp_Object
1035 string_to_multibyte (string)
1036 Lisp_Object string;
1038 unsigned char *buf;
1039 int nbytes;
1040 Lisp_Object ret;
1041 USE_SAFE_ALLOCA;
1043 if (STRING_MULTIBYTE (string))
1044 return string;
1046 nbytes = parse_str_to_multibyte (SDATA (string), SBYTES (string));
1047 /* If all the chars are ASCII or eight-bit-graphic, they won't need
1048 any more bytes once converted. */
1049 if (nbytes == SBYTES (string))
1050 return make_multibyte_string (SDATA (string), nbytes, nbytes);
1052 SAFE_ALLOCA (buf, unsigned char *, nbytes);
1053 bcopy (SDATA (string), buf, SBYTES (string));
1054 str_to_multibyte (buf, nbytes, SBYTES (string));
1056 ret = make_multibyte_string (buf, SCHARS (string), nbytes);
1057 SAFE_FREE ();
1059 return ret;
1063 /* Convert STRING to a single-byte string. */
1065 Lisp_Object
1066 string_make_unibyte (string)
1067 Lisp_Object string;
1069 int nchars;
1070 unsigned char *buf;
1071 Lisp_Object ret;
1072 USE_SAFE_ALLOCA;
1074 if (! STRING_MULTIBYTE (string))
1075 return string;
1077 nchars = SCHARS (string);
1079 SAFE_ALLOCA (buf, unsigned char *, nchars);
1080 copy_text (SDATA (string), buf, SBYTES (string),
1081 1, 0);
1083 ret = make_unibyte_string (buf, nchars);
1084 SAFE_FREE ();
1086 return ret;
1089 DEFUN ("string-make-multibyte", Fstring_make_multibyte, Sstring_make_multibyte,
1090 1, 1, 0,
1091 doc: /* Return the multibyte equivalent of STRING.
1092 If STRING is unibyte and contains non-ASCII characters, the function
1093 `unibyte-char-to-multibyte' is used to convert each unibyte character
1094 to a multibyte character. In this case, the returned string is a
1095 newly created string with no text properties. If STRING is multibyte
1096 or entirely ASCII, it is returned unchanged. In particular, when
1097 STRING is unibyte and entirely ASCII, the returned string is unibyte.
1098 \(When the characters are all ASCII, Emacs primitives will treat the
1099 string the same way whether it is unibyte or multibyte.) */)
1100 (string)
1101 Lisp_Object string;
1103 CHECK_STRING (string);
1105 return string_make_multibyte (string);
1108 DEFUN ("string-make-unibyte", Fstring_make_unibyte, Sstring_make_unibyte,
1109 1, 1, 0,
1110 doc: /* Return the unibyte equivalent of STRING.
1111 Multibyte character codes are converted to unibyte according to
1112 `nonascii-translation-table' or, if that is nil, `nonascii-insert-offset'.
1113 If the lookup in the translation table fails, this function takes just
1114 the low 8 bits of each character. */)
1115 (string)
1116 Lisp_Object string;
1118 CHECK_STRING (string);
1120 return string_make_unibyte (string);
1123 DEFUN ("string-as-unibyte", Fstring_as_unibyte, Sstring_as_unibyte,
1124 1, 1, 0,
1125 doc: /* Return a unibyte string with the same individual bytes as STRING.
1126 If STRING is unibyte, the result is STRING itself.
1127 Otherwise it is a newly created string, with no text properties.
1128 If STRING is multibyte and contains a character of charset
1129 `eight-bit-control' or `eight-bit-graphic', it is converted to the
1130 corresponding single byte. */)
1131 (string)
1132 Lisp_Object string;
1134 CHECK_STRING (string);
1136 if (STRING_MULTIBYTE (string))
1138 int bytes = SBYTES (string);
1139 unsigned char *str = (unsigned char *) xmalloc (bytes);
1141 bcopy (SDATA (string), str, bytes);
1142 bytes = str_as_unibyte (str, bytes);
1143 string = make_unibyte_string (str, bytes);
1144 xfree (str);
1146 return string;
1149 DEFUN ("string-as-multibyte", Fstring_as_multibyte, Sstring_as_multibyte,
1150 1, 1, 0,
1151 doc: /* Return a multibyte string with the same individual bytes as STRING.
1152 If STRING is multibyte, the result is STRING itself.
1153 Otherwise it is a newly created string, with no text properties.
1154 If STRING is unibyte and contains an individual 8-bit byte (i.e. not
1155 part of a multibyte form), it is converted to the corresponding
1156 multibyte character of charset `eight-bit-control' or `eight-bit-graphic'.
1157 Beware, this often doesn't really do what you think it does.
1158 It is similar to (decode-coding-string STRING 'emacs-mule-unix).
1159 If you're not sure, whether to use `string-as-multibyte' or
1160 `string-to-multibyte', use `string-to-multibyte'. Beware:
1161 (aref (string-as-multibyte "\\201") 0) -> 129 (aka ?\\201)
1162 (aref (string-as-multibyte "\\300") 0) -> 192 (aka ?\\300)
1163 (aref (string-as-multibyte "\\300\\201") 0) -> 192 (aka ?\\300)
1164 (aref (string-as-multibyte "\\300\\201") 1) -> 129 (aka ?\\201)
1166 (aref (string-as-multibyte "\\201\\300") 0) -> 2240
1167 (aref (string-as-multibyte "\\201\\300") 1) -> <error> */)
1168 (string)
1169 Lisp_Object string;
1171 CHECK_STRING (string);
1173 if (! STRING_MULTIBYTE (string))
1175 Lisp_Object new_string;
1176 int nchars, nbytes;
1178 parse_str_as_multibyte (SDATA (string),
1179 SBYTES (string),
1180 &nchars, &nbytes);
1181 new_string = make_uninit_multibyte_string (nchars, nbytes);
1182 bcopy (SDATA (string), SDATA (new_string),
1183 SBYTES (string));
1184 if (nbytes != SBYTES (string))
1185 str_as_multibyte (SDATA (new_string), nbytes,
1186 SBYTES (string), NULL);
1187 string = new_string;
1188 STRING_SET_INTERVALS (string, NULL_INTERVAL);
1190 return string;
1193 DEFUN ("string-to-multibyte", Fstring_to_multibyte, Sstring_to_multibyte,
1194 1, 1, 0,
1195 doc: /* Return a multibyte string with the same individual chars as STRING.
1196 If STRING is multibyte, the result is STRING itself.
1197 Otherwise it is a newly created string, with no text properties.
1198 Characters 0200 through 0237 are converted to eight-bit-control
1199 characters of the same character code. Characters 0240 through 0377
1200 are converted to eight-bit-graphic characters of the same character
1201 codes.
1202 This is similar to (decode-coding-string STRING 'binary) */)
1203 (string)
1204 Lisp_Object string;
1206 CHECK_STRING (string);
1208 return string_to_multibyte (string);
1212 DEFUN ("copy-alist", Fcopy_alist, Scopy_alist, 1, 1, 0,
1213 doc: /* Return a copy of ALIST.
1214 This is an alist which represents the same mapping from objects to objects,
1215 but does not share the alist structure with ALIST.
1216 The objects mapped (cars and cdrs of elements of the alist)
1217 are shared, however.
1218 Elements of ALIST that are not conses are also shared. */)
1219 (alist)
1220 Lisp_Object alist;
1222 register Lisp_Object tem;
1224 CHECK_LIST (alist);
1225 if (NILP (alist))
1226 return alist;
1227 alist = concat (1, &alist, Lisp_Cons, 0);
1228 for (tem = alist; CONSP (tem); tem = XCDR (tem))
1230 register Lisp_Object car;
1231 car = XCAR (tem);
1233 if (CONSP (car))
1234 XSETCAR (tem, Fcons (XCAR (car), XCDR (car)));
1236 return alist;
1239 DEFUN ("substring", Fsubstring, Ssubstring, 2, 3, 0,
1240 doc: /* Return a substring of STRING, starting at index FROM and ending before TO.
1241 TO may be nil or omitted; then the substring runs to the end of STRING.
1242 FROM and TO start at 0. If either is negative, it counts from the end.
1244 This function allows vectors as well as strings. */)
1245 (string, from, to)
1246 Lisp_Object string;
1247 register Lisp_Object from, to;
1249 Lisp_Object res;
1250 int size;
1251 int size_byte = 0;
1252 int from_char, to_char;
1253 int from_byte = 0, to_byte = 0;
1255 CHECK_VECTOR_OR_STRING (string);
1256 CHECK_NUMBER (from);
1258 if (STRINGP (string))
1260 size = SCHARS (string);
1261 size_byte = SBYTES (string);
1263 else
1264 size = ASIZE (string);
1266 if (NILP (to))
1268 to_char = size;
1269 to_byte = size_byte;
1271 else
1273 CHECK_NUMBER (to);
1275 to_char = XINT (to);
1276 if (to_char < 0)
1277 to_char += size;
1279 if (STRINGP (string))
1280 to_byte = string_char_to_byte (string, to_char);
1283 from_char = XINT (from);
1284 if (from_char < 0)
1285 from_char += size;
1286 if (STRINGP (string))
1287 from_byte = string_char_to_byte (string, from_char);
1289 if (!(0 <= from_char && from_char <= to_char && to_char <= size))
1290 args_out_of_range_3 (string, make_number (from_char),
1291 make_number (to_char));
1293 if (STRINGP (string))
1295 res = make_specified_string (SDATA (string) + from_byte,
1296 to_char - from_char, to_byte - from_byte,
1297 STRING_MULTIBYTE (string));
1298 copy_text_properties (make_number (from_char), make_number (to_char),
1299 string, make_number (0), res, Qnil);
1301 else
1302 res = Fvector (to_char - from_char, &AREF (string, from_char));
1304 return res;
1308 DEFUN ("substring-no-properties", Fsubstring_no_properties, Ssubstring_no_properties, 1, 3, 0,
1309 doc: /* Return a substring of STRING, without text properties.
1310 It starts at index FROM and ending before TO.
1311 TO may be nil or omitted; then the substring runs to the end of STRING.
1312 If FROM is nil or omitted, the substring starts at the beginning of STRING.
1313 If FROM or TO is negative, it counts from the end.
1315 With one argument, just copy STRING without its properties. */)
1316 (string, from, to)
1317 Lisp_Object string;
1318 register Lisp_Object from, to;
1320 int size, size_byte;
1321 int from_char, to_char;
1322 int from_byte, to_byte;
1324 CHECK_STRING (string);
1326 size = SCHARS (string);
1327 size_byte = SBYTES (string);
1329 if (NILP (from))
1330 from_char = from_byte = 0;
1331 else
1333 CHECK_NUMBER (from);
1334 from_char = XINT (from);
1335 if (from_char < 0)
1336 from_char += size;
1338 from_byte = string_char_to_byte (string, from_char);
1341 if (NILP (to))
1343 to_char = size;
1344 to_byte = size_byte;
1346 else
1348 CHECK_NUMBER (to);
1350 to_char = XINT (to);
1351 if (to_char < 0)
1352 to_char += size;
1354 to_byte = string_char_to_byte (string, to_char);
1357 if (!(0 <= from_char && from_char <= to_char && to_char <= size))
1358 args_out_of_range_3 (string, make_number (from_char),
1359 make_number (to_char));
1361 return make_specified_string (SDATA (string) + from_byte,
1362 to_char - from_char, to_byte - from_byte,
1363 STRING_MULTIBYTE (string));
1366 /* Extract a substring of STRING, giving start and end positions
1367 both in characters and in bytes. */
1369 Lisp_Object
1370 substring_both (string, from, from_byte, to, to_byte)
1371 Lisp_Object string;
1372 int from, from_byte, to, to_byte;
1374 Lisp_Object res;
1375 int size;
1376 int size_byte;
1378 CHECK_VECTOR_OR_STRING (string);
1380 if (STRINGP (string))
1382 size = SCHARS (string);
1383 size_byte = SBYTES (string);
1385 else
1386 size = ASIZE (string);
1388 if (!(0 <= from && from <= to && to <= size))
1389 args_out_of_range_3 (string, make_number (from), make_number (to));
1391 if (STRINGP (string))
1393 res = make_specified_string (SDATA (string) + from_byte,
1394 to - from, to_byte - from_byte,
1395 STRING_MULTIBYTE (string));
1396 copy_text_properties (make_number (from), make_number (to),
1397 string, make_number (0), res, Qnil);
1399 else
1400 res = Fvector (to - from, &AREF (string, from));
1402 return res;
1405 DEFUN ("nthcdr", Fnthcdr, Snthcdr, 2, 2, 0,
1406 doc: /* Take cdr N times on LIST, returns the result. */)
1407 (n, list)
1408 Lisp_Object n;
1409 register Lisp_Object list;
1411 register int i, num;
1412 CHECK_NUMBER (n);
1413 num = XINT (n);
1414 for (i = 0; i < num && !NILP (list); i++)
1416 QUIT;
1417 CHECK_LIST_CONS (list, list);
1418 list = XCDR (list);
1420 return list;
1423 DEFUN ("nth", Fnth, Snth, 2, 2, 0,
1424 doc: /* Return the Nth element of LIST.
1425 N counts from zero. If LIST is not that long, nil is returned. */)
1426 (n, list)
1427 Lisp_Object n, list;
1429 return Fcar (Fnthcdr (n, list));
1432 DEFUN ("elt", Felt, Selt, 2, 2, 0,
1433 doc: /* Return element of SEQUENCE at index N. */)
1434 (sequence, n)
1435 register Lisp_Object sequence, n;
1437 CHECK_NUMBER (n);
1438 if (CONSP (sequence) || NILP (sequence))
1439 return Fcar (Fnthcdr (n, sequence));
1441 /* Faref signals a "not array" error, so check here. */
1442 CHECK_ARRAY (sequence, Qsequencep);
1443 return Faref (sequence, n);
1446 DEFUN ("member", Fmember, Smember, 2, 2, 0,
1447 doc: /* Return non-nil if ELT is an element of LIST. Comparison done with `equal'.
1448 The value is actually the tail of LIST whose car is ELT. */)
1449 (elt, list)
1450 register Lisp_Object elt;
1451 Lisp_Object list;
1453 register Lisp_Object tail;
1454 for (tail = list; CONSP (tail); tail = XCDR (tail))
1456 register Lisp_Object tem;
1457 CHECK_LIST_CONS (tail, list);
1458 tem = XCAR (tail);
1459 if (! NILP (Fequal (elt, tem)))
1460 return tail;
1461 QUIT;
1463 return Qnil;
1466 DEFUN ("memq", Fmemq, Smemq, 2, 2, 0,
1467 doc: /* Return non-nil if ELT is an element of LIST. Comparison done with `eq'.
1468 The value is actually the tail of LIST whose car is ELT. */)
1469 (elt, list)
1470 register Lisp_Object elt, list;
1472 while (1)
1474 if (!CONSP (list) || EQ (XCAR (list), elt))
1475 break;
1477 list = XCDR (list);
1478 if (!CONSP (list) || EQ (XCAR (list), elt))
1479 break;
1481 list = XCDR (list);
1482 if (!CONSP (list) || EQ (XCAR (list), elt))
1483 break;
1485 list = XCDR (list);
1486 QUIT;
1489 CHECK_LIST (list);
1490 return list;
1493 DEFUN ("memql", Fmemql, Smemql, 2, 2, 0,
1494 doc: /* Return non-nil if ELT is an element of LIST. Comparison done with `eql'.
1495 The value is actually the tail of LIST whose car is ELT. */)
1496 (elt, list)
1497 register Lisp_Object elt;
1498 Lisp_Object list;
1500 register Lisp_Object tail;
1502 if (!FLOATP (elt))
1503 return Fmemq (elt, list);
1505 for (tail = list; CONSP (tail); tail = XCDR (tail))
1507 register Lisp_Object tem;
1508 CHECK_LIST_CONS (tail, list);
1509 tem = XCAR (tail);
1510 if (FLOATP (tem) && internal_equal (elt, tem, 0, 0))
1511 return tail;
1512 QUIT;
1514 return Qnil;
1517 DEFUN ("assq", Fassq, Sassq, 2, 2, 0,
1518 doc: /* Return non-nil if KEY is `eq' to the car of an element of LIST.
1519 The value is actually the first element of LIST whose car is KEY.
1520 Elements of LIST that are not conses are ignored. */)
1521 (key, list)
1522 Lisp_Object key, list;
1524 while (1)
1526 if (!CONSP (list)
1527 || (CONSP (XCAR (list))
1528 && EQ (XCAR (XCAR (list)), key)))
1529 break;
1531 list = XCDR (list);
1532 if (!CONSP (list)
1533 || (CONSP (XCAR (list))
1534 && EQ (XCAR (XCAR (list)), key)))
1535 break;
1537 list = XCDR (list);
1538 if (!CONSP (list)
1539 || (CONSP (XCAR (list))
1540 && EQ (XCAR (XCAR (list)), key)))
1541 break;
1543 list = XCDR (list);
1544 QUIT;
1547 return CAR (list);
1550 /* Like Fassq but never report an error and do not allow quits.
1551 Use only on lists known never to be circular. */
1553 Lisp_Object
1554 assq_no_quit (key, list)
1555 Lisp_Object key, list;
1557 while (CONSP (list)
1558 && (!CONSP (XCAR (list))
1559 || !EQ (XCAR (XCAR (list)), key)))
1560 list = XCDR (list);
1562 return CAR_SAFE (list);
1565 DEFUN ("assoc", Fassoc, Sassoc, 2, 2, 0,
1566 doc: /* Return non-nil if KEY is `equal' to the car of an element of LIST.
1567 The value is actually the first element of LIST whose car equals KEY. */)
1568 (key, list)
1569 Lisp_Object key, list;
1571 Lisp_Object car;
1573 while (1)
1575 if (!CONSP (list)
1576 || (CONSP (XCAR (list))
1577 && (car = XCAR (XCAR (list)),
1578 EQ (car, key) || !NILP (Fequal (car, key)))))
1579 break;
1581 list = XCDR (list);
1582 if (!CONSP (list)
1583 || (CONSP (XCAR (list))
1584 && (car = XCAR (XCAR (list)),
1585 EQ (car, key) || !NILP (Fequal (car, key)))))
1586 break;
1588 list = XCDR (list);
1589 if (!CONSP (list)
1590 || (CONSP (XCAR (list))
1591 && (car = XCAR (XCAR (list)),
1592 EQ (car, key) || !NILP (Fequal (car, key)))))
1593 break;
1595 list = XCDR (list);
1596 QUIT;
1599 return CAR (list);
1602 DEFUN ("rassq", Frassq, Srassq, 2, 2, 0,
1603 doc: /* Return non-nil if KEY is `eq' to the cdr of an element of LIST.
1604 The value is actually the first element of LIST whose cdr is KEY. */)
1605 (key, list)
1606 register Lisp_Object key;
1607 Lisp_Object list;
1609 while (1)
1611 if (!CONSP (list)
1612 || (CONSP (XCAR (list))
1613 && EQ (XCDR (XCAR (list)), key)))
1614 break;
1616 list = XCDR (list);
1617 if (!CONSP (list)
1618 || (CONSP (XCAR (list))
1619 && EQ (XCDR (XCAR (list)), key)))
1620 break;
1622 list = XCDR (list);
1623 if (!CONSP (list)
1624 || (CONSP (XCAR (list))
1625 && EQ (XCDR (XCAR (list)), key)))
1626 break;
1628 list = XCDR (list);
1629 QUIT;
1632 return CAR (list);
1635 DEFUN ("rassoc", Frassoc, Srassoc, 2, 2, 0,
1636 doc: /* Return non-nil if KEY is `equal' to the cdr of an element of LIST.
1637 The value is actually the first element of LIST whose cdr equals KEY. */)
1638 (key, list)
1639 Lisp_Object key, list;
1641 Lisp_Object cdr;
1643 while (1)
1645 if (!CONSP (list)
1646 || (CONSP (XCAR (list))
1647 && (cdr = XCDR (XCAR (list)),
1648 EQ (cdr, key) || !NILP (Fequal (cdr, key)))))
1649 break;
1651 list = XCDR (list);
1652 if (!CONSP (list)
1653 || (CONSP (XCAR (list))
1654 && (cdr = XCDR (XCAR (list)),
1655 EQ (cdr, key) || !NILP (Fequal (cdr, key)))))
1656 break;
1658 list = XCDR (list);
1659 if (!CONSP (list)
1660 || (CONSP (XCAR (list))
1661 && (cdr = XCDR (XCAR (list)),
1662 EQ (cdr, key) || !NILP (Fequal (cdr, key)))))
1663 break;
1665 list = XCDR (list);
1666 QUIT;
1669 return CAR (list);
1672 DEFUN ("delq", Fdelq, Sdelq, 2, 2, 0,
1673 doc: /* Delete by side effect any occurrences of ELT as a member of LIST.
1674 The modified LIST is returned. Comparison is done with `eq'.
1675 If the first member of LIST is ELT, there is no way to remove it by side effect;
1676 therefore, write `(setq foo (delq element foo))'
1677 to be sure of changing the value of `foo'. */)
1678 (elt, list)
1679 register Lisp_Object elt;
1680 Lisp_Object list;
1682 register Lisp_Object tail, prev;
1683 register Lisp_Object tem;
1685 tail = list;
1686 prev = Qnil;
1687 while (!NILP (tail))
1689 CHECK_LIST_CONS (tail, list);
1690 tem = XCAR (tail);
1691 if (EQ (elt, tem))
1693 if (NILP (prev))
1694 list = XCDR (tail);
1695 else
1696 Fsetcdr (prev, XCDR (tail));
1698 else
1699 prev = tail;
1700 tail = XCDR (tail);
1701 QUIT;
1703 return list;
1706 DEFUN ("delete", Fdelete, Sdelete, 2, 2, 0,
1707 doc: /* Delete by side effect any occurrences of ELT as a member of SEQ.
1708 SEQ must be a list, a vector, or a string.
1709 The modified SEQ is returned. Comparison is done with `equal'.
1710 If SEQ is not a list, or the first member of SEQ is ELT, deleting it
1711 is not a side effect; it is simply using a different sequence.
1712 Therefore, write `(setq foo (delete element foo))'
1713 to be sure of changing the value of `foo'. */)
1714 (elt, seq)
1715 Lisp_Object elt, seq;
1717 if (VECTORP (seq))
1719 EMACS_INT i, n;
1721 for (i = n = 0; i < ASIZE (seq); ++i)
1722 if (NILP (Fequal (AREF (seq, i), elt)))
1723 ++n;
1725 if (n != ASIZE (seq))
1727 struct Lisp_Vector *p = allocate_vector (n);
1729 for (i = n = 0; i < ASIZE (seq); ++i)
1730 if (NILP (Fequal (AREF (seq, i), elt)))
1731 p->contents[n++] = AREF (seq, i);
1733 XSETVECTOR (seq, p);
1736 else if (STRINGP (seq))
1738 EMACS_INT i, ibyte, nchars, nbytes, cbytes;
1739 int c;
1741 for (i = nchars = nbytes = ibyte = 0;
1742 i < SCHARS (seq);
1743 ++i, ibyte += cbytes)
1745 if (STRING_MULTIBYTE (seq))
1747 c = STRING_CHAR (SDATA (seq) + ibyte,
1748 SBYTES (seq) - ibyte);
1749 cbytes = CHAR_BYTES (c);
1751 else
1753 c = SREF (seq, i);
1754 cbytes = 1;
1757 if (!INTEGERP (elt) || c != XINT (elt))
1759 ++nchars;
1760 nbytes += cbytes;
1764 if (nchars != SCHARS (seq))
1766 Lisp_Object tem;
1768 tem = make_uninit_multibyte_string (nchars, nbytes);
1769 if (!STRING_MULTIBYTE (seq))
1770 STRING_SET_UNIBYTE (tem);
1772 for (i = nchars = nbytes = ibyte = 0;
1773 i < SCHARS (seq);
1774 ++i, ibyte += cbytes)
1776 if (STRING_MULTIBYTE (seq))
1778 c = STRING_CHAR (SDATA (seq) + ibyte,
1779 SBYTES (seq) - ibyte);
1780 cbytes = CHAR_BYTES (c);
1782 else
1784 c = SREF (seq, i);
1785 cbytes = 1;
1788 if (!INTEGERP (elt) || c != XINT (elt))
1790 unsigned char *from = SDATA (seq) + ibyte;
1791 unsigned char *to = SDATA (tem) + nbytes;
1792 EMACS_INT n;
1794 ++nchars;
1795 nbytes += cbytes;
1797 for (n = cbytes; n--; )
1798 *to++ = *from++;
1802 seq = tem;
1805 else
1807 Lisp_Object tail, prev;
1809 for (tail = seq, prev = Qnil; CONSP (tail); tail = XCDR (tail))
1811 CHECK_LIST_CONS (tail, seq);
1813 if (!NILP (Fequal (elt, XCAR (tail))))
1815 if (NILP (prev))
1816 seq = XCDR (tail);
1817 else
1818 Fsetcdr (prev, XCDR (tail));
1820 else
1821 prev = tail;
1822 QUIT;
1826 return seq;
1829 DEFUN ("nreverse", Fnreverse, Snreverse, 1, 1, 0,
1830 doc: /* Reverse LIST by modifying cdr pointers.
1831 Return the reversed list. */)
1832 (list)
1833 Lisp_Object list;
1835 register Lisp_Object prev, tail, next;
1837 if (NILP (list)) return list;
1838 prev = Qnil;
1839 tail = list;
1840 while (!NILP (tail))
1842 QUIT;
1843 CHECK_LIST_CONS (tail, list);
1844 next = XCDR (tail);
1845 Fsetcdr (tail, prev);
1846 prev = tail;
1847 tail = next;
1849 return prev;
1852 DEFUN ("reverse", Freverse, Sreverse, 1, 1, 0,
1853 doc: /* Reverse LIST, copying. Return the reversed list.
1854 See also the function `nreverse', which is used more often. */)
1855 (list)
1856 Lisp_Object list;
1858 Lisp_Object new;
1860 for (new = Qnil; CONSP (list); list = XCDR (list))
1862 QUIT;
1863 new = Fcons (XCAR (list), new);
1865 CHECK_LIST_END (list, list);
1866 return new;
1869 Lisp_Object merge ();
1871 DEFUN ("sort", Fsort, Ssort, 2, 2, 0,
1872 doc: /* Sort LIST, stably, comparing elements using PREDICATE.
1873 Returns the sorted list. LIST is modified by side effects.
1874 PREDICATE is called with two elements of LIST, and should return non-nil
1875 if the first element should sort before the second. */)
1876 (list, predicate)
1877 Lisp_Object list, predicate;
1879 Lisp_Object front, back;
1880 register Lisp_Object len, tem;
1881 struct gcpro gcpro1, gcpro2;
1882 register int length;
1884 front = list;
1885 len = Flength (list);
1886 length = XINT (len);
1887 if (length < 2)
1888 return list;
1890 XSETINT (len, (length / 2) - 1);
1891 tem = Fnthcdr (len, list);
1892 back = Fcdr (tem);
1893 Fsetcdr (tem, Qnil);
1895 GCPRO2 (front, back);
1896 front = Fsort (front, predicate);
1897 back = Fsort (back, predicate);
1898 UNGCPRO;
1899 return merge (front, back, predicate);
1902 Lisp_Object
1903 merge (org_l1, org_l2, pred)
1904 Lisp_Object org_l1, org_l2;
1905 Lisp_Object pred;
1907 Lisp_Object value;
1908 register Lisp_Object tail;
1909 Lisp_Object tem;
1910 register Lisp_Object l1, l2;
1911 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
1913 l1 = org_l1;
1914 l2 = org_l2;
1915 tail = Qnil;
1916 value = Qnil;
1918 /* It is sufficient to protect org_l1 and org_l2.
1919 When l1 and l2 are updated, we copy the new values
1920 back into the org_ vars. */
1921 GCPRO4 (org_l1, org_l2, pred, value);
1923 while (1)
1925 if (NILP (l1))
1927 UNGCPRO;
1928 if (NILP (tail))
1929 return l2;
1930 Fsetcdr (tail, l2);
1931 return value;
1933 if (NILP (l2))
1935 UNGCPRO;
1936 if (NILP (tail))
1937 return l1;
1938 Fsetcdr (tail, l1);
1939 return value;
1941 tem = call2 (pred, Fcar (l2), Fcar (l1));
1942 if (NILP (tem))
1944 tem = l1;
1945 l1 = Fcdr (l1);
1946 org_l1 = l1;
1948 else
1950 tem = l2;
1951 l2 = Fcdr (l2);
1952 org_l2 = l2;
1954 if (NILP (tail))
1955 value = tem;
1956 else
1957 Fsetcdr (tail, tem);
1958 tail = tem;
1963 #if 0 /* Unsafe version. */
1964 DEFUN ("plist-get", Fplist_get, Splist_get, 2, 2, 0,
1965 doc: /* Extract a value from a property list.
1966 PLIST is a property list, which is a list of the form
1967 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value
1968 corresponding to the given PROP, or nil if PROP is not
1969 one of the properties on the list. */)
1970 (plist, prop)
1971 Lisp_Object plist;
1972 Lisp_Object prop;
1974 Lisp_Object tail;
1976 for (tail = plist;
1977 CONSP (tail) && CONSP (XCDR (tail));
1978 tail = XCDR (XCDR (tail)))
1980 if (EQ (prop, XCAR (tail)))
1981 return XCAR (XCDR (tail));
1983 /* This function can be called asynchronously
1984 (setup_coding_system). Don't QUIT in that case. */
1985 if (!interrupt_input_blocked)
1986 QUIT;
1989 CHECK_LIST_END (tail, prop);
1991 return Qnil;
1993 #endif
1995 /* This does not check for quits. That is safe since it must terminate. */
1997 DEFUN ("plist-get", Fplist_get, Splist_get, 2, 2, 0,
1998 doc: /* Extract a value from a property list.
1999 PLIST is a property list, which is a list of the form
2000 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value
2001 corresponding to the given PROP, or nil if PROP is not one of the
2002 properties on the list. This function never signals an error. */)
2003 (plist, prop)
2004 Lisp_Object plist;
2005 Lisp_Object prop;
2007 Lisp_Object tail, halftail;
2009 /* halftail is used to detect circular lists. */
2010 tail = halftail = plist;
2011 while (CONSP (tail) && CONSP (XCDR (tail)))
2013 if (EQ (prop, XCAR (tail)))
2014 return XCAR (XCDR (tail));
2016 tail = XCDR (XCDR (tail));
2017 halftail = XCDR (halftail);
2018 if (EQ (tail, halftail))
2019 break;
2022 return Qnil;
2025 DEFUN ("get", Fget, Sget, 2, 2, 0,
2026 doc: /* Return the value of SYMBOL's PROPNAME property.
2027 This is the last value stored with `(put SYMBOL PROPNAME VALUE)'. */)
2028 (symbol, propname)
2029 Lisp_Object symbol, propname;
2031 CHECK_SYMBOL (symbol);
2032 return Fplist_get (XSYMBOL (symbol)->plist, propname);
2035 DEFUN ("plist-put", Fplist_put, Splist_put, 3, 3, 0,
2036 doc: /* Change value in PLIST of PROP to VAL.
2037 PLIST is a property list, which is a list of the form
2038 \(PROP1 VALUE1 PROP2 VALUE2 ...). PROP is a symbol and VAL is any object.
2039 If PROP is already a property on the list, its value is set to VAL,
2040 otherwise the new PROP VAL pair is added. The new plist is returned;
2041 use `(setq x (plist-put x prop val))' to be sure to use the new value.
2042 The PLIST is modified by side effects. */)
2043 (plist, prop, val)
2044 Lisp_Object plist;
2045 register Lisp_Object prop;
2046 Lisp_Object val;
2048 register Lisp_Object tail, prev;
2049 Lisp_Object newcell;
2050 prev = Qnil;
2051 for (tail = plist; CONSP (tail) && CONSP (XCDR (tail));
2052 tail = XCDR (XCDR (tail)))
2054 if (EQ (prop, XCAR (tail)))
2056 Fsetcar (XCDR (tail), val);
2057 return plist;
2060 prev = tail;
2061 QUIT;
2063 newcell = Fcons (prop, Fcons (val, NILP (prev) ? plist : XCDR (XCDR (prev))));
2064 if (NILP (prev))
2065 return newcell;
2066 else
2067 Fsetcdr (XCDR (prev), newcell);
2068 return plist;
2071 DEFUN ("put", Fput, Sput, 3, 3, 0,
2072 doc: /* Store SYMBOL's PROPNAME property with value VALUE.
2073 It can be retrieved with `(get SYMBOL PROPNAME)'. */)
2074 (symbol, propname, value)
2075 Lisp_Object symbol, propname, value;
2077 CHECK_SYMBOL (symbol);
2078 XSYMBOL (symbol)->plist
2079 = Fplist_put (XSYMBOL (symbol)->plist, propname, value);
2080 return value;
2083 DEFUN ("lax-plist-get", Flax_plist_get, Slax_plist_get, 2, 2, 0,
2084 doc: /* Extract a value from a property list, comparing with `equal'.
2085 PLIST is a property list, which is a list of the form
2086 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value
2087 corresponding to the given PROP, or nil if PROP is not
2088 one of the properties on the list. */)
2089 (plist, prop)
2090 Lisp_Object plist;
2091 Lisp_Object prop;
2093 Lisp_Object tail;
2095 for (tail = plist;
2096 CONSP (tail) && CONSP (XCDR (tail));
2097 tail = XCDR (XCDR (tail)))
2099 if (! NILP (Fequal (prop, XCAR (tail))))
2100 return XCAR (XCDR (tail));
2102 QUIT;
2105 CHECK_LIST_END (tail, prop);
2107 return Qnil;
2110 DEFUN ("lax-plist-put", Flax_plist_put, Slax_plist_put, 3, 3, 0,
2111 doc: /* Change value in PLIST of PROP to VAL, comparing with `equal'.
2112 PLIST is a property list, which is a list of the form
2113 \(PROP1 VALUE1 PROP2 VALUE2 ...). PROP and VAL are any objects.
2114 If PROP is already a property on the list, its value is set to VAL,
2115 otherwise the new PROP VAL pair is added. The new plist is returned;
2116 use `(setq x (lax-plist-put x prop val))' to be sure to use the new value.
2117 The PLIST is modified by side effects. */)
2118 (plist, prop, val)
2119 Lisp_Object plist;
2120 register Lisp_Object prop;
2121 Lisp_Object val;
2123 register Lisp_Object tail, prev;
2124 Lisp_Object newcell;
2125 prev = Qnil;
2126 for (tail = plist; CONSP (tail) && CONSP (XCDR (tail));
2127 tail = XCDR (XCDR (tail)))
2129 if (! NILP (Fequal (prop, XCAR (tail))))
2131 Fsetcar (XCDR (tail), val);
2132 return plist;
2135 prev = tail;
2136 QUIT;
2138 newcell = Fcons (prop, Fcons (val, Qnil));
2139 if (NILP (prev))
2140 return newcell;
2141 else
2142 Fsetcdr (XCDR (prev), newcell);
2143 return plist;
2146 DEFUN ("eql", Feql, Seql, 2, 2, 0,
2147 doc: /* Return t if the two args are the same Lisp object.
2148 Floating-point numbers of equal value are `eql', but they may not be `eq'. */)
2149 (obj1, obj2)
2150 Lisp_Object obj1, obj2;
2152 if (FLOATP (obj1))
2153 return internal_equal (obj1, obj2, 0, 0) ? Qt : Qnil;
2154 else
2155 return EQ (obj1, obj2) ? Qt : Qnil;
2158 DEFUN ("equal", Fequal, Sequal, 2, 2, 0,
2159 doc: /* Return t if two Lisp objects have similar structure and contents.
2160 They must have the same data type.
2161 Conses are compared by comparing the cars and the cdrs.
2162 Vectors and strings are compared element by element.
2163 Numbers are compared by value, but integers cannot equal floats.
2164 (Use `=' if you want integers and floats to be able to be equal.)
2165 Symbols must match exactly. */)
2166 (o1, o2)
2167 register Lisp_Object o1, o2;
2169 return internal_equal (o1, o2, 0, 0) ? Qt : Qnil;
2172 DEFUN ("equal-including-properties", Fequal_including_properties, Sequal_including_properties, 2, 2, 0,
2173 doc: /* Return t if two Lisp objects have similar structure and contents.
2174 This is like `equal' except that it compares the text properties
2175 of strings. (`equal' ignores text properties.) */)
2176 (o1, o2)
2177 register Lisp_Object o1, o2;
2179 return internal_equal (o1, o2, 0, 1) ? Qt : Qnil;
2182 /* DEPTH is current depth of recursion. Signal an error if it
2183 gets too deep.
2184 PROPS, if non-nil, means compare string text properties too. */
2186 static int
2187 internal_equal (o1, o2, depth, props)
2188 register Lisp_Object o1, o2;
2189 int depth, props;
2191 if (depth > 200)
2192 error ("Stack overflow in equal");
2194 tail_recurse:
2195 QUIT;
2196 if (EQ (o1, o2))
2197 return 1;
2198 if (XTYPE (o1) != XTYPE (o2))
2199 return 0;
2201 switch (XTYPE (o1))
2203 case Lisp_Float:
2205 double d1, d2;
2207 d1 = extract_float (o1);
2208 d2 = extract_float (o2);
2209 /* If d is a NaN, then d != d. Two NaNs should be `equal' even
2210 though they are not =. */
2211 return d1 == d2 || (d1 != d1 && d2 != d2);
2214 case Lisp_Cons:
2215 if (!internal_equal (XCAR (o1), XCAR (o2), depth + 1, props))
2216 return 0;
2217 o1 = XCDR (o1);
2218 o2 = XCDR (o2);
2219 goto tail_recurse;
2221 case Lisp_Misc:
2222 if (XMISCTYPE (o1) != XMISCTYPE (o2))
2223 return 0;
2224 if (OVERLAYP (o1))
2226 if (!internal_equal (OVERLAY_START (o1), OVERLAY_START (o2),
2227 depth + 1, props)
2228 || !internal_equal (OVERLAY_END (o1), OVERLAY_END (o2),
2229 depth + 1, props))
2230 return 0;
2231 o1 = XOVERLAY (o1)->plist;
2232 o2 = XOVERLAY (o2)->plist;
2233 goto tail_recurse;
2235 if (MARKERP (o1))
2237 return (XMARKER (o1)->buffer == XMARKER (o2)->buffer
2238 && (XMARKER (o1)->buffer == 0
2239 || XMARKER (o1)->bytepos == XMARKER (o2)->bytepos));
2241 break;
2243 case Lisp_Vectorlike:
2245 register int i;
2246 EMACS_INT size = ASIZE (o1);
2247 /* Pseudovectors have the type encoded in the size field, so this test
2248 actually checks that the objects have the same type as well as the
2249 same size. */
2250 if (ASIZE (o2) != size)
2251 return 0;
2252 /* Boolvectors are compared much like strings. */
2253 if (BOOL_VECTOR_P (o1))
2255 int size_in_chars
2256 = ((XBOOL_VECTOR (o1)->size + BOOL_VECTOR_BITS_PER_CHAR - 1)
2257 / BOOL_VECTOR_BITS_PER_CHAR);
2259 if (XBOOL_VECTOR (o1)->size != XBOOL_VECTOR (o2)->size)
2260 return 0;
2261 if (bcmp (XBOOL_VECTOR (o1)->data, XBOOL_VECTOR (o2)->data,
2262 size_in_chars))
2263 return 0;
2264 return 1;
2266 if (WINDOW_CONFIGURATIONP (o1))
2267 return compare_window_configurations (o1, o2, 0);
2269 /* Aside from them, only true vectors, char-tables, and compiled
2270 functions are sensible to compare, so eliminate the others now. */
2271 if (size & PSEUDOVECTOR_FLAG)
2273 if (!(size & (PVEC_COMPILED | PVEC_CHAR_TABLE)))
2274 return 0;
2275 size &= PSEUDOVECTOR_SIZE_MASK;
2277 for (i = 0; i < size; i++)
2279 Lisp_Object v1, v2;
2280 v1 = AREF (o1, i);
2281 v2 = AREF (o2, i);
2282 if (!internal_equal (v1, v2, depth + 1, props))
2283 return 0;
2285 return 1;
2287 break;
2289 case Lisp_String:
2290 if (SCHARS (o1) != SCHARS (o2))
2291 return 0;
2292 if (SBYTES (o1) != SBYTES (o2))
2293 return 0;
2294 if (bcmp (SDATA (o1), SDATA (o2),
2295 SBYTES (o1)))
2296 return 0;
2297 if (props && !compare_string_intervals (o1, o2))
2298 return 0;
2299 return 1;
2301 case Lisp_Int:
2302 case Lisp_Symbol:
2303 case Lisp_Type_Limit:
2304 break;
2307 return 0;
2310 extern Lisp_Object Fmake_char_internal ();
2312 DEFUN ("fillarray", Ffillarray, Sfillarray, 2, 2, 0,
2313 doc: /* Store each element of ARRAY with ITEM.
2314 ARRAY is a vector, string, char-table, or bool-vector. */)
2315 (array, item)
2316 Lisp_Object array, item;
2318 register int size, index, charval;
2319 if (VECTORP (array))
2321 register Lisp_Object *p = XVECTOR (array)->contents;
2322 size = ASIZE (array);
2323 for (index = 0; index < size; index++)
2324 p[index] = item;
2326 else if (CHAR_TABLE_P (array))
2328 register Lisp_Object *p = XCHAR_TABLE (array)->contents;
2329 size = CHAR_TABLE_ORDINARY_SLOTS;
2330 for (index = 0; index < size; index++)
2331 p[index] = item;
2332 XCHAR_TABLE (array)->defalt = Qnil;
2334 else if (STRINGP (array))
2336 register unsigned char *p = SDATA (array);
2337 CHECK_NUMBER (item);
2338 charval = XINT (item);
2339 size = SCHARS (array);
2340 if (STRING_MULTIBYTE (array))
2342 unsigned char str[MAX_MULTIBYTE_LENGTH];
2343 int len = CHAR_STRING (charval, str);
2344 int size_byte = SBYTES (array);
2345 unsigned char *p1 = p, *endp = p + size_byte;
2346 int i;
2348 if (size != size_byte)
2349 while (p1 < endp)
2351 int this_len = MULTIBYTE_FORM_LENGTH (p1, endp - p1);
2352 if (len != this_len)
2353 error ("Attempt to change byte length of a string");
2354 p1 += this_len;
2356 for (i = 0; i < size_byte; i++)
2357 *p++ = str[i % len];
2359 else
2360 for (index = 0; index < size; index++)
2361 p[index] = charval;
2363 else if (BOOL_VECTOR_P (array))
2365 register unsigned char *p = XBOOL_VECTOR (array)->data;
2366 int size_in_chars
2367 = ((XBOOL_VECTOR (array)->size + BOOL_VECTOR_BITS_PER_CHAR - 1)
2368 / BOOL_VECTOR_BITS_PER_CHAR);
2370 charval = (! NILP (item) ? -1 : 0);
2371 for (index = 0; index < size_in_chars - 1; index++)
2372 p[index] = charval;
2373 if (index < size_in_chars)
2375 /* Mask out bits beyond the vector size. */
2376 if (XBOOL_VECTOR (array)->size % BOOL_VECTOR_BITS_PER_CHAR)
2377 charval &= (1 << (XBOOL_VECTOR (array)->size % BOOL_VECTOR_BITS_PER_CHAR)) - 1;
2378 p[index] = charval;
2381 else
2382 wrong_type_argument (Qarrayp, array);
2383 return array;
2386 DEFUN ("clear-string", Fclear_string, Sclear_string,
2387 1, 1, 0,
2388 doc: /* Clear the contents of STRING.
2389 This makes STRING unibyte and may change its length. */)
2390 (string)
2391 Lisp_Object string;
2393 int len;
2394 CHECK_STRING (string);
2395 len = SBYTES (string);
2396 bzero (SDATA (string), len);
2397 STRING_SET_CHARS (string, len);
2398 STRING_SET_UNIBYTE (string);
2399 return Qnil;
2402 DEFUN ("char-table-subtype", Fchar_table_subtype, Schar_table_subtype,
2403 1, 1, 0,
2404 doc: /* Return the subtype of char-table CHAR-TABLE. The value is a symbol. */)
2405 (char_table)
2406 Lisp_Object char_table;
2408 CHECK_CHAR_TABLE (char_table);
2410 return XCHAR_TABLE (char_table)->purpose;
2413 DEFUN ("char-table-parent", Fchar_table_parent, Schar_table_parent,
2414 1, 1, 0,
2415 doc: /* Return the parent char-table of CHAR-TABLE.
2416 The value is either nil or another char-table.
2417 If CHAR-TABLE holds nil for a given character,
2418 then the actual applicable value is inherited from the parent char-table
2419 \(or from its parents, if necessary). */)
2420 (char_table)
2421 Lisp_Object char_table;
2423 CHECK_CHAR_TABLE (char_table);
2425 return XCHAR_TABLE (char_table)->parent;
2428 DEFUN ("set-char-table-parent", Fset_char_table_parent, Sset_char_table_parent,
2429 2, 2, 0,
2430 doc: /* Set the parent char-table of CHAR-TABLE to PARENT.
2431 Return PARENT. PARENT must be either nil or another char-table. */)
2432 (char_table, parent)
2433 Lisp_Object char_table, parent;
2435 Lisp_Object temp;
2437 CHECK_CHAR_TABLE (char_table);
2439 if (!NILP (parent))
2441 CHECK_CHAR_TABLE (parent);
2443 for (temp = parent; CHAR_TABLE_P (temp);
2444 temp = XCHAR_TABLE (temp)->parent)
2445 if (EQ (temp, char_table))
2446 error ("Attempt to make a chartable be its own parent");
2449 XCHAR_TABLE (char_table)->parent = parent;
2451 return parent;
2454 DEFUN ("char-table-extra-slot", Fchar_table_extra_slot, Schar_table_extra_slot,
2455 2, 2, 0,
2456 doc: /* Return the value of CHAR-TABLE's extra-slot number N. */)
2457 (char_table, n)
2458 Lisp_Object char_table, n;
2460 CHECK_CHAR_TABLE (char_table);
2461 CHECK_NUMBER (n);
2462 if (XINT (n) < 0
2463 || XINT (n) >= CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (char_table)))
2464 args_out_of_range (char_table, n);
2466 return XCHAR_TABLE (char_table)->extras[XINT (n)];
2469 DEFUN ("set-char-table-extra-slot", Fset_char_table_extra_slot,
2470 Sset_char_table_extra_slot,
2471 3, 3, 0,
2472 doc: /* Set CHAR-TABLE's extra-slot number N to VALUE. */)
2473 (char_table, n, value)
2474 Lisp_Object char_table, n, value;
2476 CHECK_CHAR_TABLE (char_table);
2477 CHECK_NUMBER (n);
2478 if (XINT (n) < 0
2479 || XINT (n) >= CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (char_table)))
2480 args_out_of_range (char_table, n);
2482 return XCHAR_TABLE (char_table)->extras[XINT (n)] = value;
2485 static Lisp_Object
2486 char_table_range (table, from, to, defalt)
2487 Lisp_Object table;
2488 int from, to;
2489 Lisp_Object defalt;
2491 Lisp_Object val;
2493 if (! NILP (XCHAR_TABLE (table)->defalt))
2494 defalt = XCHAR_TABLE (table)->defalt;
2495 val = XCHAR_TABLE (table)->contents[from];
2496 if (SUB_CHAR_TABLE_P (val))
2497 val = char_table_range (val, 32, 127, defalt);
2498 else if (NILP (val))
2499 val = defalt;
2500 for (from++; from <= to; from++)
2502 Lisp_Object this_val;
2504 this_val = XCHAR_TABLE (table)->contents[from];
2505 if (SUB_CHAR_TABLE_P (this_val))
2506 this_val = char_table_range (this_val, 32, 127, defalt);
2507 else if (NILP (this_val))
2508 this_val = defalt;
2509 if (! EQ (val, this_val))
2510 error ("Characters in the range have inconsistent values");
2512 return val;
2516 DEFUN ("char-table-range", Fchar_table_range, Schar_table_range,
2517 2, 2, 0,
2518 doc: /* Return the value in CHAR-TABLE for a range of characters RANGE.
2519 RANGE should be nil (for the default value),
2520 a vector which identifies a character set or a row of a character set,
2521 a character set name, or a character code.
2522 If the characters in the specified range have different values,
2523 an error is signaled.
2525 Note that this function doesn't check the parent of CHAR-TABLE. */)
2526 (char_table, range)
2527 Lisp_Object char_table, range;
2529 int charset_id, c1 = 0, c2 = 0;
2530 int size;
2531 Lisp_Object ch, val, current_default;
2533 CHECK_CHAR_TABLE (char_table);
2535 if (EQ (range, Qnil))
2536 return XCHAR_TABLE (char_table)->defalt;
2537 if (INTEGERP (range))
2539 int c = XINT (range);
2540 if (! CHAR_VALID_P (c, 0))
2541 error ("Invalid character code: %d", c);
2542 ch = range;
2543 SPLIT_CHAR (c, charset_id, c1, c2);
2545 else if (SYMBOLP (range))
2547 Lisp_Object charset_info;
2549 charset_info = Fget (range, Qcharset);
2550 CHECK_VECTOR (charset_info);
2551 charset_id = XINT (AREF (charset_info, 0));
2552 ch = Fmake_char_internal (make_number (charset_id),
2553 make_number (0), make_number (0));
2555 else if (VECTORP (range))
2557 size = ASIZE (range);
2558 if (size == 0)
2559 args_out_of_range (range, make_number (0));
2560 CHECK_NUMBER (AREF (range, 0));
2561 charset_id = XINT (AREF (range, 0));
2562 if (size > 1)
2564 CHECK_NUMBER (AREF (range, 1));
2565 c1 = XINT (AREF (range, 1));
2566 if (size > 2)
2568 CHECK_NUMBER (AREF (range, 2));
2569 c2 = XINT (AREF (range, 2));
2573 /* This checks if charset_id, c0, and c1 are all valid or not. */
2574 ch = Fmake_char_internal (make_number (charset_id),
2575 make_number (c1), make_number (c2));
2577 else
2578 error ("Invalid RANGE argument to `char-table-range'");
2580 if (c1 > 0 && (CHARSET_DIMENSION (charset_id) == 1 || c2 > 0))
2582 /* Fully specified character. */
2583 Lisp_Object parent = XCHAR_TABLE (char_table)->parent;
2585 XCHAR_TABLE (char_table)->parent = Qnil;
2586 val = Faref (char_table, ch);
2587 XCHAR_TABLE (char_table)->parent = parent;
2588 return val;
2591 current_default = XCHAR_TABLE (char_table)->defalt;
2592 if (charset_id == CHARSET_ASCII
2593 || charset_id == CHARSET_8_BIT_CONTROL
2594 || charset_id == CHARSET_8_BIT_GRAPHIC)
2596 int from, to, defalt;
2598 if (charset_id == CHARSET_ASCII)
2599 from = 0, to = 127, defalt = CHAR_TABLE_DEFAULT_SLOT_ASCII;
2600 else if (charset_id == CHARSET_8_BIT_CONTROL)
2601 from = 128, to = 159, defalt = CHAR_TABLE_DEFAULT_SLOT_8_BIT_CONTROL;
2602 else
2603 from = 160, to = 255, defalt = CHAR_TABLE_DEFAULT_SLOT_8_BIT_GRAPHIC;
2604 if (! NILP (XCHAR_TABLE (char_table)->contents[defalt]))
2605 current_default = XCHAR_TABLE (char_table)->contents[defalt];
2606 return char_table_range (char_table, from, to, current_default);
2609 val = XCHAR_TABLE (char_table)->contents[128 + charset_id];
2610 if (! SUB_CHAR_TABLE_P (val))
2611 return (NILP (val) ? current_default : val);
2612 if (! NILP (XCHAR_TABLE (val)->defalt))
2613 current_default = XCHAR_TABLE (val)->defalt;
2614 if (c1 == 0)
2615 return char_table_range (val, 32, 127, current_default);
2616 val = XCHAR_TABLE (val)->contents[c1];
2617 if (! SUB_CHAR_TABLE_P (val))
2618 return (NILP (val) ? current_default : val);
2619 if (! NILP (XCHAR_TABLE (val)->defalt))
2620 current_default = XCHAR_TABLE (val)->defalt;
2621 return char_table_range (val, 32, 127, current_default);
2624 DEFUN ("set-char-table-range", Fset_char_table_range, Sset_char_table_range,
2625 3, 3, 0,
2626 doc: /* Set the value in CHAR-TABLE for a range of characters RANGE to VALUE.
2627 RANGE should be t (for all characters), nil (for the default value),
2628 a character set, a vector which identifies a character set, a row of a
2629 character set, or a character code. Return VALUE. */)
2630 (char_table, range, value)
2631 Lisp_Object char_table, range, value;
2633 int i;
2635 CHECK_CHAR_TABLE (char_table);
2637 if (EQ (range, Qt))
2638 for (i = 0; i < CHAR_TABLE_ORDINARY_SLOTS; i++)
2640 /* Don't set these special slots used for default values of
2641 ascii, eight-bit-control, and eight-bit-graphic. */
2642 if (i != CHAR_TABLE_DEFAULT_SLOT_ASCII
2643 && i != CHAR_TABLE_DEFAULT_SLOT_8_BIT_CONTROL
2644 && i != CHAR_TABLE_DEFAULT_SLOT_8_BIT_GRAPHIC)
2645 XCHAR_TABLE (char_table)->contents[i] = value;
2647 else if (EQ (range, Qnil))
2648 XCHAR_TABLE (char_table)->defalt = value;
2649 else if (SYMBOLP (range))
2651 Lisp_Object charset_info;
2652 int charset_id;
2654 charset_info = Fget (range, Qcharset);
2655 if (! VECTORP (charset_info)
2656 || ! NATNUMP (AREF (charset_info, 0))
2657 || (charset_id = XINT (AREF (charset_info, 0)),
2658 ! CHARSET_DEFINED_P (charset_id)))
2659 error ("Invalid charset: %s", SDATA (SYMBOL_NAME (range)));
2661 if (charset_id == CHARSET_ASCII)
2662 for (i = 0; i < 128; i++)
2663 XCHAR_TABLE (char_table)->contents[i] = value;
2664 else if (charset_id == CHARSET_8_BIT_CONTROL)
2665 for (i = 128; i < 160; i++)
2666 XCHAR_TABLE (char_table)->contents[i] = value;
2667 else if (charset_id == CHARSET_8_BIT_GRAPHIC)
2668 for (i = 160; i < 256; i++)
2669 XCHAR_TABLE (char_table)->contents[i] = value;
2670 else
2671 XCHAR_TABLE (char_table)->contents[charset_id + 128] = value;
2673 else if (INTEGERP (range))
2674 Faset (char_table, range, value);
2675 else if (VECTORP (range))
2677 int size = ASIZE (range);
2678 Lisp_Object *val = XVECTOR (range)->contents;
2679 Lisp_Object ch = Fmake_char_internal (size <= 0 ? Qnil : val[0],
2680 size <= 1 ? Qnil : val[1],
2681 size <= 2 ? Qnil : val[2]);
2682 Faset (char_table, ch, value);
2684 else
2685 error ("Invalid RANGE argument to `set-char-table-range'");
2687 return value;
2690 DEFUN ("set-char-table-default", Fset_char_table_default,
2691 Sset_char_table_default, 3, 3, 0,
2692 doc: /* Set the default value in CHAR-TABLE for generic character CH to VALUE.
2693 The generic character specifies the group of characters.
2694 If CH is a normal character, set the default value for a group of
2695 characters to which CH belongs.
2696 See also the documentation of `make-char'. */)
2697 (char_table, ch, value)
2698 Lisp_Object char_table, ch, value;
2700 int c, charset, code1, code2;
2701 Lisp_Object temp;
2703 CHECK_CHAR_TABLE (char_table);
2704 CHECK_NUMBER (ch);
2706 c = XINT (ch);
2707 SPLIT_CHAR (c, charset, code1, code2);
2709 /* Since we may want to set the default value for a character set
2710 not yet defined, we check only if the character set is in the
2711 valid range or not, instead of it is already defined or not. */
2712 if (! CHARSET_VALID_P (charset))
2713 invalid_character (c);
2715 if (SINGLE_BYTE_CHAR_P (c))
2717 /* We use special slots for the default values of single byte
2718 characters. */
2719 int default_slot
2720 = (c < 0x80 ? CHAR_TABLE_DEFAULT_SLOT_ASCII
2721 : c < 0xA0 ? CHAR_TABLE_DEFAULT_SLOT_8_BIT_CONTROL
2722 : CHAR_TABLE_DEFAULT_SLOT_8_BIT_GRAPHIC);
2724 return (XCHAR_TABLE (char_table)->contents[default_slot] = value);
2727 /* Even if C is not a generic char, we had better behave as if a
2728 generic char is specified. */
2729 if (!CHARSET_DEFINED_P (charset) || CHARSET_DIMENSION (charset) == 1)
2730 code1 = 0;
2731 temp = XCHAR_TABLE (char_table)->contents[charset + 128];
2732 if (! SUB_CHAR_TABLE_P (temp))
2734 temp = make_sub_char_table (temp);
2735 XCHAR_TABLE (char_table)->contents[charset + 128] = temp;
2737 if (!code1)
2739 XCHAR_TABLE (temp)->defalt = value;
2740 return value;
2742 char_table = temp;
2743 temp = XCHAR_TABLE (char_table)->contents[code1];
2744 if (SUB_CHAR_TABLE_P (temp))
2745 XCHAR_TABLE (temp)->defalt = value;
2746 else
2747 XCHAR_TABLE (char_table)->contents[code1] = value;
2748 return value;
2751 /* Look up the element in TABLE at index CH,
2752 and return it as an integer.
2753 If the element is nil, return CH itself.
2754 (Actually we do that for any non-integer.) */
2757 char_table_translate (table, ch)
2758 Lisp_Object table;
2759 int ch;
2761 Lisp_Object value;
2762 value = Faref (table, make_number (ch));
2763 if (! INTEGERP (value))
2764 return ch;
2765 return XINT (value);
2768 static void
2769 optimize_sub_char_table (table, chars)
2770 Lisp_Object *table;
2771 int chars;
2773 Lisp_Object elt;
2774 int from, to;
2776 if (chars == 94)
2777 from = 33, to = 127;
2778 else
2779 from = 32, to = 128;
2781 if (!SUB_CHAR_TABLE_P (*table)
2782 || ! NILP (XCHAR_TABLE (*table)->defalt))
2783 return;
2784 elt = XCHAR_TABLE (*table)->contents[from++];
2785 for (; from < to; from++)
2786 if (NILP (Fequal (elt, XCHAR_TABLE (*table)->contents[from])))
2787 return;
2788 *table = elt;
2791 DEFUN ("optimize-char-table", Foptimize_char_table, Soptimize_char_table,
2792 1, 1, 0, doc: /* Optimize char table TABLE. */)
2793 (table)
2794 Lisp_Object table;
2796 Lisp_Object elt;
2797 int dim, chars;
2798 int i, j;
2800 CHECK_CHAR_TABLE (table);
2802 for (i = CHAR_TABLE_SINGLE_BYTE_SLOTS; i < CHAR_TABLE_ORDINARY_SLOTS; i++)
2804 elt = XCHAR_TABLE (table)->contents[i];
2805 if (!SUB_CHAR_TABLE_P (elt))
2806 continue;
2807 dim = CHARSET_DIMENSION (i - 128);
2808 chars = CHARSET_CHARS (i - 128);
2809 if (dim == 2)
2810 for (j = 32; j < SUB_CHAR_TABLE_ORDINARY_SLOTS; j++)
2811 optimize_sub_char_table (XCHAR_TABLE (elt)->contents + j, chars);
2812 optimize_sub_char_table (XCHAR_TABLE (table)->contents + i, chars);
2814 return Qnil;
2818 /* Map C_FUNCTION or FUNCTION over SUBTABLE, calling it for each
2819 character or group of characters that share a value.
2820 DEPTH is the current depth in the originally specified
2821 chartable, and INDICES contains the vector indices
2822 for the levels our callers have descended.
2824 ARG is passed to C_FUNCTION when that is called. */
2826 void
2827 map_char_table (c_function, function, table, subtable, arg, depth, indices)
2828 void (*c_function) P_ ((Lisp_Object, Lisp_Object, Lisp_Object));
2829 Lisp_Object function, table, subtable, arg;
2830 int depth, *indices;
2832 int i, to;
2833 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
2835 GCPRO4 (arg, table, subtable, function);
2837 if (depth == 0)
2839 /* At first, handle ASCII and 8-bit European characters. */
2840 for (i = 0; i < CHAR_TABLE_SINGLE_BYTE_SLOTS; i++)
2842 Lisp_Object elt= XCHAR_TABLE (subtable)->contents[i];
2843 if (NILP (elt))
2844 elt = XCHAR_TABLE (subtable)->defalt;
2845 if (NILP (elt))
2846 elt = Faref (subtable, make_number (i));
2847 if (c_function)
2848 (*c_function) (arg, make_number (i), elt);
2849 else
2850 call2 (function, make_number (i), elt);
2852 #if 0 /* If the char table has entries for higher characters,
2853 we should report them. */
2854 if (NILP (current_buffer->enable_multibyte_characters))
2856 UNGCPRO;
2857 return;
2859 #endif
2860 to = CHAR_TABLE_ORDINARY_SLOTS;
2862 else
2864 int charset = indices[0] - 128;
2866 i = 32;
2867 to = SUB_CHAR_TABLE_ORDINARY_SLOTS;
2868 if (CHARSET_CHARS (charset) == 94)
2869 i++, to--;
2872 for (; i < to; i++)
2874 Lisp_Object elt;
2875 int charset;
2877 elt = XCHAR_TABLE (subtable)->contents[i];
2878 indices[depth] = i;
2879 charset = indices[0] - 128;
2880 if (depth == 0
2881 && (!CHARSET_DEFINED_P (charset)
2882 || charset == CHARSET_8_BIT_CONTROL
2883 || charset == CHARSET_8_BIT_GRAPHIC))
2884 continue;
2886 if (SUB_CHAR_TABLE_P (elt))
2888 if (depth >= 3)
2889 error ("Too deep char table");
2890 map_char_table (c_function, function, table, elt, arg, depth + 1, indices);
2892 else
2894 int c1, c2, c;
2896 c1 = depth >= 1 ? indices[1] : 0;
2897 c2 = depth >= 2 ? indices[2] : 0;
2898 c = MAKE_CHAR (charset, c1, c2);
2900 if (NILP (elt))
2901 elt = XCHAR_TABLE (subtable)->defalt;
2902 if (NILP (elt))
2903 elt = Faref (table, make_number (c));
2905 if (c_function)
2906 (*c_function) (arg, make_number (c), elt);
2907 else
2908 call2 (function, make_number (c), elt);
2911 UNGCPRO;
2914 static void void_call2 P_ ((Lisp_Object a, Lisp_Object b, Lisp_Object c));
2915 static void
2916 void_call2 (a, b, c)
2917 Lisp_Object a, b, c;
2919 call2 (a, b, c);
2922 DEFUN ("map-char-table", Fmap_char_table, Smap_char_table,
2923 2, 2, 0,
2924 doc: /* Call FUNCTION for each (normal and generic) characters in CHAR-TABLE.
2925 FUNCTION is called with two arguments--a key and a value.
2926 The key is always a possible IDX argument to `aref'. */)
2927 (function, char_table)
2928 Lisp_Object function, char_table;
2930 /* The depth of char table is at most 3. */
2931 int indices[3];
2933 CHECK_CHAR_TABLE (char_table);
2935 /* When Lisp_Object is represented as a union, `call2' cannot directly
2936 be passed to map_char_table because it returns a Lisp_Object rather
2937 than returning nothing.
2938 Casting leads to crashes on some architectures. --Stef */
2939 map_char_table (void_call2, Qnil, char_table, char_table, function, 0, indices);
2940 return Qnil;
2943 /* Return a value for character C in char-table TABLE. Store the
2944 actual index for that value in *IDX. Ignore the default value of
2945 TABLE. */
2947 Lisp_Object
2948 char_table_ref_and_index (table, c, idx)
2949 Lisp_Object table;
2950 int c, *idx;
2952 int charset, c1, c2;
2953 Lisp_Object elt;
2955 if (SINGLE_BYTE_CHAR_P (c))
2957 *idx = c;
2958 return XCHAR_TABLE (table)->contents[c];
2960 SPLIT_CHAR (c, charset, c1, c2);
2961 elt = XCHAR_TABLE (table)->contents[charset + 128];
2962 *idx = MAKE_CHAR (charset, 0, 0);
2963 if (!SUB_CHAR_TABLE_P (elt))
2964 return elt;
2965 if (c1 < 32 || NILP (XCHAR_TABLE (elt)->contents[c1]))
2966 return XCHAR_TABLE (elt)->defalt;
2967 elt = XCHAR_TABLE (elt)->contents[c1];
2968 *idx = MAKE_CHAR (charset, c1, 0);
2969 if (!SUB_CHAR_TABLE_P (elt))
2970 return elt;
2971 if (c2 < 32 || NILP (XCHAR_TABLE (elt)->contents[c2]))
2972 return XCHAR_TABLE (elt)->defalt;
2973 *idx = c;
2974 return XCHAR_TABLE (elt)->contents[c2];
2978 /* ARGSUSED */
2979 Lisp_Object
2980 nconc2 (s1, s2)
2981 Lisp_Object s1, s2;
2983 #ifdef NO_ARG_ARRAY
2984 Lisp_Object args[2];
2985 args[0] = s1;
2986 args[1] = s2;
2987 return Fnconc (2, args);
2988 #else
2989 return Fnconc (2, &s1);
2990 #endif /* NO_ARG_ARRAY */
2993 DEFUN ("nconc", Fnconc, Snconc, 0, MANY, 0,
2994 doc: /* Concatenate any number of lists by altering them.
2995 Only the last argument is not altered, and need not be a list.
2996 usage: (nconc &rest LISTS) */)
2997 (nargs, args)
2998 int nargs;
2999 Lisp_Object *args;
3001 register int argnum;
3002 register Lisp_Object tail, tem, val;
3004 val = tail = Qnil;
3006 for (argnum = 0; argnum < nargs; argnum++)
3008 tem = args[argnum];
3009 if (NILP (tem)) continue;
3011 if (NILP (val))
3012 val = tem;
3014 if (argnum + 1 == nargs) break;
3016 CHECK_LIST_CONS (tem, tem);
3018 while (CONSP (tem))
3020 tail = tem;
3021 tem = XCDR (tail);
3022 QUIT;
3025 tem = args[argnum + 1];
3026 Fsetcdr (tail, tem);
3027 if (NILP (tem))
3028 args[argnum + 1] = tail;
3031 return val;
3034 /* This is the guts of all mapping functions.
3035 Apply FN to each element of SEQ, one by one,
3036 storing the results into elements of VALS, a C vector of Lisp_Objects.
3037 LENI is the length of VALS, which should also be the length of SEQ. */
3039 static void
3040 mapcar1 (leni, vals, fn, seq)
3041 int leni;
3042 Lisp_Object *vals;
3043 Lisp_Object fn, seq;
3045 register Lisp_Object tail;
3046 Lisp_Object dummy;
3047 register int i;
3048 struct gcpro gcpro1, gcpro2, gcpro3;
3050 if (vals)
3052 /* Don't let vals contain any garbage when GC happens. */
3053 for (i = 0; i < leni; i++)
3054 vals[i] = Qnil;
3056 GCPRO3 (dummy, fn, seq);
3057 gcpro1.var = vals;
3058 gcpro1.nvars = leni;
3060 else
3061 GCPRO2 (fn, seq);
3062 /* We need not explicitly protect `tail' because it is used only on lists, and
3063 1) lists are not relocated and 2) the list is marked via `seq' so will not
3064 be freed */
3066 if (VECTORP (seq))
3068 for (i = 0; i < leni; i++)
3070 dummy = call1 (fn, AREF (seq, i));
3071 if (vals)
3072 vals[i] = dummy;
3075 else if (BOOL_VECTOR_P (seq))
3077 for (i = 0; i < leni; i++)
3079 int byte;
3080 byte = XBOOL_VECTOR (seq)->data[i / BOOL_VECTOR_BITS_PER_CHAR];
3081 dummy = (byte & (1 << (i % BOOL_VECTOR_BITS_PER_CHAR))) ? Qt : Qnil;
3082 dummy = call1 (fn, dummy);
3083 if (vals)
3084 vals[i] = dummy;
3087 else if (STRINGP (seq))
3089 int i_byte;
3091 for (i = 0, i_byte = 0; i < leni;)
3093 int c;
3094 int i_before = i;
3096 FETCH_STRING_CHAR_ADVANCE (c, seq, i, i_byte);
3097 XSETFASTINT (dummy, c);
3098 dummy = call1 (fn, dummy);
3099 if (vals)
3100 vals[i_before] = dummy;
3103 else /* Must be a list, since Flength did not get an error */
3105 tail = seq;
3106 for (i = 0; i < leni && CONSP (tail); i++)
3108 dummy = call1 (fn, XCAR (tail));
3109 if (vals)
3110 vals[i] = dummy;
3111 tail = XCDR (tail);
3115 UNGCPRO;
3118 DEFUN ("mapconcat", Fmapconcat, Smapconcat, 3, 3, 0,
3119 doc: /* Apply FUNCTION to each element of SEQUENCE, and concat the results as strings.
3120 In between each pair of results, stick in SEPARATOR. Thus, " " as
3121 SEPARATOR results in spaces between the values returned by FUNCTION.
3122 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
3123 (function, sequence, separator)
3124 Lisp_Object function, sequence, separator;
3126 Lisp_Object len;
3127 register int leni;
3128 int nargs;
3129 register Lisp_Object *args;
3130 register int i;
3131 struct gcpro gcpro1;
3132 Lisp_Object ret;
3133 USE_SAFE_ALLOCA;
3135 len = Flength (sequence);
3136 leni = XINT (len);
3137 nargs = leni + leni - 1;
3138 if (nargs < 0) return empty_unibyte_string;
3140 SAFE_ALLOCA_LISP (args, nargs);
3142 GCPRO1 (separator);
3143 mapcar1 (leni, args, function, sequence);
3144 UNGCPRO;
3146 for (i = leni - 1; i > 0; i--)
3147 args[i + i] = args[i];
3149 for (i = 1; i < nargs; i += 2)
3150 args[i] = separator;
3152 ret = Fconcat (nargs, args);
3153 SAFE_FREE ();
3155 return ret;
3158 DEFUN ("mapcar", Fmapcar, Smapcar, 2, 2, 0,
3159 doc: /* Apply FUNCTION to each element of SEQUENCE, and make a list of the results.
3160 The result is a list just as long as SEQUENCE.
3161 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
3162 (function, sequence)
3163 Lisp_Object function, sequence;
3165 register Lisp_Object len;
3166 register int leni;
3167 register Lisp_Object *args;
3168 Lisp_Object ret;
3169 USE_SAFE_ALLOCA;
3171 len = Flength (sequence);
3172 leni = XFASTINT (len);
3174 SAFE_ALLOCA_LISP (args, leni);
3176 mapcar1 (leni, args, function, sequence);
3178 ret = Flist (leni, args);
3179 SAFE_FREE ();
3181 return ret;
3184 DEFUN ("mapc", Fmapc, Smapc, 2, 2, 0,
3185 doc: /* Apply FUNCTION to each element of SEQUENCE for side effects only.
3186 Unlike `mapcar', don't accumulate the results. Return SEQUENCE.
3187 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
3188 (function, sequence)
3189 Lisp_Object function, sequence;
3191 register int leni;
3193 leni = XFASTINT (Flength (sequence));
3194 mapcar1 (leni, 0, function, sequence);
3196 return sequence;
3199 /* Anything that calls this function must protect from GC! */
3201 DEFUN ("y-or-n-p", Fy_or_n_p, Sy_or_n_p, 1, 1, 0,
3202 doc: /* Ask user a "y or n" question. Return t if answer is "y".
3203 Takes one argument, which is the string to display to ask the question.
3204 It should end in a space; `y-or-n-p' adds `(y or n) ' to it.
3205 No confirmation of the answer is requested; a single character is enough.
3206 Also accepts Space to mean yes, or Delete to mean no. \(Actually, it uses
3207 the bindings in `query-replace-map'; see the documentation of that variable
3208 for more information. In this case, the useful bindings are `act', `skip',
3209 `recenter', and `quit'.\)
3211 Under a windowing system a dialog box will be used if `last-nonmenu-event'
3212 is nil and `use-dialog-box' is non-nil. */)
3213 (prompt)
3214 Lisp_Object prompt;
3216 register Lisp_Object obj, key, def, map;
3217 register int answer;
3218 Lisp_Object xprompt;
3219 Lisp_Object args[2];
3220 struct gcpro gcpro1, gcpro2;
3221 int count = SPECPDL_INDEX ();
3223 specbind (Qcursor_in_echo_area, Qt);
3225 map = Fsymbol_value (intern ("query-replace-map"));
3227 CHECK_STRING (prompt);
3228 xprompt = prompt;
3229 GCPRO2 (prompt, xprompt);
3231 #ifdef HAVE_X_WINDOWS
3232 if (display_hourglass_p)
3233 cancel_hourglass ();
3234 #endif
3236 while (1)
3239 #ifdef HAVE_MENUS
3240 if (FRAME_WINDOW_P (SELECTED_FRAME ())
3241 && (NILP (last_nonmenu_event) || CONSP (last_nonmenu_event))
3242 && use_dialog_box
3243 && have_menus_p ())
3245 Lisp_Object pane, menu;
3246 redisplay_preserve_echo_area (3);
3247 pane = Fcons (Fcons (build_string ("Yes"), Qt),
3248 Fcons (Fcons (build_string ("No"), Qnil),
3249 Qnil));
3250 menu = Fcons (prompt, pane);
3251 obj = Fx_popup_dialog (Qt, menu, Qnil);
3252 answer = !NILP (obj);
3253 break;
3255 #endif /* HAVE_MENUS */
3256 cursor_in_echo_area = 1;
3257 choose_minibuf_frame ();
3260 Lisp_Object pargs[3];
3262 /* Colorize prompt according to `minibuffer-prompt' face. */
3263 pargs[0] = build_string ("%s(y or n) ");
3264 pargs[1] = intern ("face");
3265 pargs[2] = intern ("minibuffer-prompt");
3266 args[0] = Fpropertize (3, pargs);
3267 args[1] = xprompt;
3268 Fmessage (2, args);
3271 if (minibuffer_auto_raise)
3273 Lisp_Object mini_frame;
3275 mini_frame = WINDOW_FRAME (XWINDOW (minibuf_window));
3277 Fraise_frame (mini_frame);
3280 temporarily_switch_to_single_kboard (SELECTED_FRAME ());
3281 obj = read_filtered_event (1, 0, 0, 0, Qnil);
3282 cursor_in_echo_area = 0;
3283 /* If we need to quit, quit with cursor_in_echo_area = 0. */
3284 QUIT;
3286 key = Fmake_vector (make_number (1), obj);
3287 def = Flookup_key (map, key, Qt);
3289 if (EQ (def, intern ("skip")))
3291 answer = 0;
3292 break;
3294 else if (EQ (def, intern ("act")))
3296 answer = 1;
3297 break;
3299 else if (EQ (def, intern ("recenter")))
3301 Frecenter (Qnil);
3302 xprompt = prompt;
3303 continue;
3305 else if (EQ (def, intern ("quit")))
3306 Vquit_flag = Qt;
3307 /* We want to exit this command for exit-prefix,
3308 and this is the only way to do it. */
3309 else if (EQ (def, intern ("exit-prefix")))
3310 Vquit_flag = Qt;
3312 QUIT;
3314 /* If we don't clear this, then the next call to read_char will
3315 return quit_char again, and we'll enter an infinite loop. */
3316 Vquit_flag = Qnil;
3318 Fding (Qnil);
3319 Fdiscard_input ();
3320 if (EQ (xprompt, prompt))
3322 args[0] = build_string ("Please answer y or n. ");
3323 args[1] = prompt;
3324 xprompt = Fconcat (2, args);
3327 UNGCPRO;
3329 if (! noninteractive)
3331 cursor_in_echo_area = -1;
3332 message_with_string (answer ? "%s(y or n) y" : "%s(y or n) n",
3333 xprompt, 0);
3336 unbind_to (count, Qnil);
3337 return answer ? Qt : Qnil;
3340 /* This is how C code calls `yes-or-no-p' and allows the user
3341 to redefined it.
3343 Anything that calls this function must protect from GC! */
3345 Lisp_Object
3346 do_yes_or_no_p (prompt)
3347 Lisp_Object prompt;
3349 return call1 (intern ("yes-or-no-p"), prompt);
3352 /* Anything that calls this function must protect from GC! */
3354 DEFUN ("yes-or-no-p", Fyes_or_no_p, Syes_or_no_p, 1, 1, 0,
3355 doc: /* Ask user a yes-or-no question. Return t if answer is yes.
3356 Takes one argument, which is the string to display to ask the question.
3357 It should end in a space; `yes-or-no-p' adds `(yes or no) ' to it.
3358 The user must confirm the answer with RET,
3359 and can edit it until it has been confirmed.
3361 Under a windowing system a dialog box will be used if `last-nonmenu-event'
3362 is nil, and `use-dialog-box' is non-nil. */)
3363 (prompt)
3364 Lisp_Object prompt;
3366 register Lisp_Object ans;
3367 Lisp_Object args[2];
3368 struct gcpro gcpro1;
3370 CHECK_STRING (prompt);
3372 #ifdef HAVE_MENUS
3373 if (FRAME_WINDOW_P (SELECTED_FRAME ())
3374 && (NILP (last_nonmenu_event) || CONSP (last_nonmenu_event))
3375 && use_dialog_box
3376 && have_menus_p ())
3378 Lisp_Object pane, menu, obj;
3379 redisplay_preserve_echo_area (4);
3380 pane = Fcons (Fcons (build_string ("Yes"), Qt),
3381 Fcons (Fcons (build_string ("No"), Qnil),
3382 Qnil));
3383 GCPRO1 (pane);
3384 menu = Fcons (prompt, pane);
3385 obj = Fx_popup_dialog (Qt, menu, Qnil);
3386 UNGCPRO;
3387 return obj;
3389 #endif /* HAVE_MENUS */
3391 args[0] = prompt;
3392 args[1] = build_string ("(yes or no) ");
3393 prompt = Fconcat (2, args);
3395 GCPRO1 (prompt);
3397 while (1)
3399 ans = Fdowncase (Fread_from_minibuffer (prompt, Qnil, Qnil, Qnil,
3400 Qyes_or_no_p_history, Qnil,
3401 Qnil));
3402 if (SCHARS (ans) == 3 && !strcmp (SDATA (ans), "yes"))
3404 UNGCPRO;
3405 return Qt;
3407 if (SCHARS (ans) == 2 && !strcmp (SDATA (ans), "no"))
3409 UNGCPRO;
3410 return Qnil;
3413 Fding (Qnil);
3414 Fdiscard_input ();
3415 message ("Please answer yes or no.");
3416 Fsleep_for (make_number (2), Qnil);
3420 DEFUN ("load-average", Fload_average, Sload_average, 0, 1, 0,
3421 doc: /* Return list of 1 minute, 5 minute and 15 minute load averages.
3423 Each of the three load averages is multiplied by 100, then converted
3424 to integer.
3426 When USE-FLOATS is non-nil, floats will be used instead of integers.
3427 These floats are not multiplied by 100.
3429 If the 5-minute or 15-minute load averages are not available, return a
3430 shortened list, containing only those averages which are available.
3432 An error is thrown if the load average can't be obtained. In some
3433 cases making it work would require Emacs being installed setuid or
3434 setgid so that it can read kernel information, and that usually isn't
3435 advisable. */)
3436 (use_floats)
3437 Lisp_Object use_floats;
3439 double load_ave[3];
3440 int loads = getloadavg (load_ave, 3);
3441 Lisp_Object ret = Qnil;
3443 if (loads < 0)
3444 error ("load-average not implemented for this operating system");
3446 while (loads-- > 0)
3448 Lisp_Object load = (NILP (use_floats) ?
3449 make_number ((int) (100.0 * load_ave[loads]))
3450 : make_float (load_ave[loads]));
3451 ret = Fcons (load, ret);
3454 return ret;
3457 Lisp_Object Vfeatures, Qsubfeatures;
3458 extern Lisp_Object Vafter_load_alist;
3460 DEFUN ("featurep", Ffeaturep, Sfeaturep, 1, 2, 0,
3461 doc: /* Returns t if FEATURE is present in this Emacs.
3463 Use this to conditionalize execution of lisp code based on the
3464 presence or absence of Emacs or environment extensions.
3465 Use `provide' to declare that a feature is available. This function
3466 looks at the value of the variable `features'. The optional argument
3467 SUBFEATURE can be used to check a specific subfeature of FEATURE. */)
3468 (feature, subfeature)
3469 Lisp_Object feature, subfeature;
3471 register Lisp_Object tem;
3472 CHECK_SYMBOL (feature);
3473 tem = Fmemq (feature, Vfeatures);
3474 if (!NILP (tem) && !NILP (subfeature))
3475 tem = Fmember (subfeature, Fget (feature, Qsubfeatures));
3476 return (NILP (tem)) ? Qnil : Qt;
3479 DEFUN ("provide", Fprovide, Sprovide, 1, 2, 0,
3480 doc: /* Announce that FEATURE is a feature of the current Emacs.
3481 The optional argument SUBFEATURES should be a list of symbols listing
3482 particular subfeatures supported in this version of FEATURE. */)
3483 (feature, subfeatures)
3484 Lisp_Object feature, subfeatures;
3486 register Lisp_Object tem;
3487 CHECK_SYMBOL (feature);
3488 CHECK_LIST (subfeatures);
3489 if (!NILP (Vautoload_queue))
3490 Vautoload_queue = Fcons (Fcons (make_number (0), Vfeatures),
3491 Vautoload_queue);
3492 tem = Fmemq (feature, Vfeatures);
3493 if (NILP (tem))
3494 Vfeatures = Fcons (feature, Vfeatures);
3495 if (!NILP (subfeatures))
3496 Fput (feature, Qsubfeatures, subfeatures);
3497 LOADHIST_ATTACH (Fcons (Qprovide, feature));
3499 /* Run any load-hooks for this file. */
3500 tem = Fassq (feature, Vafter_load_alist);
3501 if (CONSP (tem))
3502 Fprogn (XCDR (tem));
3504 return feature;
3507 /* `require' and its subroutines. */
3509 /* List of features currently being require'd, innermost first. */
3511 Lisp_Object require_nesting_list;
3513 Lisp_Object
3514 require_unwind (old_value)
3515 Lisp_Object old_value;
3517 return require_nesting_list = old_value;
3520 DEFUN ("require", Frequire, Srequire, 1, 3, 0,
3521 doc: /* If feature FEATURE is not loaded, load it from FILENAME.
3522 If FEATURE is not a member of the list `features', then the feature
3523 is not loaded; so load the file FILENAME.
3524 If FILENAME is omitted, the printname of FEATURE is used as the file name,
3525 and `load' will try to load this name appended with the suffix `.elc' or
3526 `.el', in that order. The name without appended suffix will not be used.
3527 If the optional third argument NOERROR is non-nil,
3528 then return nil if the file is not found instead of signaling an error.
3529 Normally the return value is FEATURE.
3530 The normal messages at start and end of loading FILENAME are suppressed. */)
3531 (feature, filename, noerror)
3532 Lisp_Object feature, filename, noerror;
3534 register Lisp_Object tem;
3535 struct gcpro gcpro1, gcpro2;
3536 int from_file = load_in_progress;
3538 CHECK_SYMBOL (feature);
3540 /* Record the presence of `require' in this file
3541 even if the feature specified is already loaded.
3542 But not more than once in any file,
3543 and not when we aren't loading or reading from a file. */
3544 if (!from_file)
3545 for (tem = Vcurrent_load_list; CONSP (tem); tem = XCDR (tem))
3546 if (NILP (XCDR (tem)) && STRINGP (XCAR (tem)))
3547 from_file = 1;
3549 if (from_file)
3551 tem = Fcons (Qrequire, feature);
3552 if (NILP (Fmember (tem, Vcurrent_load_list)))
3553 LOADHIST_ATTACH (tem);
3555 tem = Fmemq (feature, Vfeatures);
3557 if (NILP (tem))
3559 int count = SPECPDL_INDEX ();
3560 int nesting = 0;
3562 /* This is to make sure that loadup.el gives a clear picture
3563 of what files are preloaded and when. */
3564 if (! NILP (Vpurify_flag))
3565 error ("(require %s) while preparing to dump",
3566 SDATA (SYMBOL_NAME (feature)));
3568 /* A certain amount of recursive `require' is legitimate,
3569 but if we require the same feature recursively 3 times,
3570 signal an error. */
3571 tem = require_nesting_list;
3572 while (! NILP (tem))
3574 if (! NILP (Fequal (feature, XCAR (tem))))
3575 nesting++;
3576 tem = XCDR (tem);
3578 if (nesting > 3)
3579 error ("Recursive `require' for feature `%s'",
3580 SDATA (SYMBOL_NAME (feature)));
3582 /* Update the list for any nested `require's that occur. */
3583 record_unwind_protect (require_unwind, require_nesting_list);
3584 require_nesting_list = Fcons (feature, require_nesting_list);
3586 /* Value saved here is to be restored into Vautoload_queue */
3587 record_unwind_protect (un_autoload, Vautoload_queue);
3588 Vautoload_queue = Qt;
3590 /* Load the file. */
3591 GCPRO2 (feature, filename);
3592 tem = Fload (NILP (filename) ? Fsymbol_name (feature) : filename,
3593 noerror, Qt, Qnil, (NILP (filename) ? Qt : Qnil));
3594 UNGCPRO;
3596 /* If load failed entirely, return nil. */
3597 if (NILP (tem))
3598 return unbind_to (count, Qnil);
3600 tem = Fmemq (feature, Vfeatures);
3601 if (NILP (tem))
3602 error ("Required feature `%s' was not provided",
3603 SDATA (SYMBOL_NAME (feature)));
3605 /* Once loading finishes, don't undo it. */
3606 Vautoload_queue = Qt;
3607 feature = unbind_to (count, feature);
3610 return feature;
3613 /* Primitives for work of the "widget" library.
3614 In an ideal world, this section would not have been necessary.
3615 However, lisp function calls being as slow as they are, it turns
3616 out that some functions in the widget library (wid-edit.el) are the
3617 bottleneck of Widget operation. Here is their translation to C,
3618 for the sole reason of efficiency. */
3620 DEFUN ("plist-member", Fplist_member, Splist_member, 2, 2, 0,
3621 doc: /* Return non-nil if PLIST has the property PROP.
3622 PLIST is a property list, which is a list of the form
3623 \(PROP1 VALUE1 PROP2 VALUE2 ...\). PROP is a symbol.
3624 Unlike `plist-get', this allows you to distinguish between a missing
3625 property and a property with the value nil.
3626 The value is actually the tail of PLIST whose car is PROP. */)
3627 (plist, prop)
3628 Lisp_Object plist, prop;
3630 while (CONSP (plist) && !EQ (XCAR (plist), prop))
3632 QUIT;
3633 plist = XCDR (plist);
3634 plist = CDR (plist);
3636 return plist;
3639 DEFUN ("widget-put", Fwidget_put, Swidget_put, 3, 3, 0,
3640 doc: /* In WIDGET, set PROPERTY to VALUE.
3641 The value can later be retrieved with `widget-get'. */)
3642 (widget, property, value)
3643 Lisp_Object widget, property, value;
3645 CHECK_CONS (widget);
3646 XSETCDR (widget, Fplist_put (XCDR (widget), property, value));
3647 return value;
3650 DEFUN ("widget-get", Fwidget_get, Swidget_get, 2, 2, 0,
3651 doc: /* In WIDGET, get the value of PROPERTY.
3652 The value could either be specified when the widget was created, or
3653 later with `widget-put'. */)
3654 (widget, property)
3655 Lisp_Object widget, property;
3657 Lisp_Object tmp;
3659 while (1)
3661 if (NILP (widget))
3662 return Qnil;
3663 CHECK_CONS (widget);
3664 tmp = Fplist_member (XCDR (widget), property);
3665 if (CONSP (tmp))
3667 tmp = XCDR (tmp);
3668 return CAR (tmp);
3670 tmp = XCAR (widget);
3671 if (NILP (tmp))
3672 return Qnil;
3673 widget = Fget (tmp, Qwidget_type);
3677 DEFUN ("widget-apply", Fwidget_apply, Swidget_apply, 2, MANY, 0,
3678 doc: /* Apply the value of WIDGET's PROPERTY to the widget itself.
3679 ARGS are passed as extra arguments to the function.
3680 usage: (widget-apply WIDGET PROPERTY &rest ARGS) */)
3681 (nargs, args)
3682 int nargs;
3683 Lisp_Object *args;
3685 /* This function can GC. */
3686 Lisp_Object newargs[3];
3687 struct gcpro gcpro1, gcpro2;
3688 Lisp_Object result;
3690 newargs[0] = Fwidget_get (args[0], args[1]);
3691 newargs[1] = args[0];
3692 newargs[2] = Flist (nargs - 2, args + 2);
3693 GCPRO2 (newargs[0], newargs[2]);
3694 result = Fapply (3, newargs);
3695 UNGCPRO;
3696 return result;
3699 #ifdef HAVE_LANGINFO_CODESET
3700 #include <langinfo.h>
3701 #endif
3703 DEFUN ("locale-info", Flocale_info, Slocale_info, 1, 1, 0,
3704 doc: /* Access locale data ITEM for the current C locale, if available.
3705 ITEM should be one of the following:
3707 `codeset', returning the character set as a string (locale item CODESET);
3709 `days', returning a 7-element vector of day names (locale items DAY_n);
3711 `months', returning a 12-element vector of month names (locale items MON_n);
3713 `paper', returning a list (WIDTH HEIGHT) for the default paper size,
3714 both measured in milimeters (locale items PAPER_WIDTH, PAPER_HEIGHT).
3716 If the system can't provide such information through a call to
3717 `nl_langinfo', or if ITEM isn't from the list above, return nil.
3719 See also Info node `(libc)Locales'.
3721 The data read from the system are decoded using `locale-coding-system'. */)
3722 (item)
3723 Lisp_Object item;
3725 char *str = NULL;
3726 #ifdef HAVE_LANGINFO_CODESET
3727 Lisp_Object val;
3728 if (EQ (item, Qcodeset))
3730 str = nl_langinfo (CODESET);
3731 return build_string (str);
3733 #ifdef DAY_1
3734 else if (EQ (item, Qdays)) /* e.g. for calendar-day-name-array */
3736 Lisp_Object v = Fmake_vector (make_number (7), Qnil);
3737 int days[7] = {DAY_1, DAY_2, DAY_3, DAY_4, DAY_5, DAY_6, DAY_7};
3738 int i;
3739 synchronize_system_time_locale ();
3740 for (i = 0; i < 7; i++)
3742 str = nl_langinfo (days[i]);
3743 val = make_unibyte_string (str, strlen (str));
3744 /* Fixme: Is this coding system necessarily right, even if
3745 it is consistent with CODESET? If not, what to do? */
3746 Faset (v, make_number (i),
3747 code_convert_string_norecord (val, Vlocale_coding_system,
3748 0));
3750 return v;
3752 #endif /* DAY_1 */
3753 #ifdef MON_1
3754 else if (EQ (item, Qmonths)) /* e.g. for calendar-month-name-array */
3756 struct Lisp_Vector *p = allocate_vector (12);
3757 int months[12] = {MON_1, MON_2, MON_3, MON_4, MON_5, MON_6, MON_7,
3758 MON_8, MON_9, MON_10, MON_11, MON_12};
3759 int i;
3760 synchronize_system_time_locale ();
3761 for (i = 0; i < 12; i++)
3763 str = nl_langinfo (months[i]);
3764 val = make_unibyte_string (str, strlen (str));
3765 p->contents[i] =
3766 code_convert_string_norecord (val, Vlocale_coding_system, 0);
3768 XSETVECTOR (val, p);
3769 return val;
3771 #endif /* MON_1 */
3772 /* LC_PAPER stuff isn't defined as accessible in glibc as of 2.3.1,
3773 but is in the locale files. This could be used by ps-print. */
3774 #ifdef PAPER_WIDTH
3775 else if (EQ (item, Qpaper))
3777 return list2 (make_number (nl_langinfo (PAPER_WIDTH)),
3778 make_number (nl_langinfo (PAPER_HEIGHT)));
3780 #endif /* PAPER_WIDTH */
3781 #endif /* HAVE_LANGINFO_CODESET*/
3782 return Qnil;
3785 /* base64 encode/decode functions (RFC 2045).
3786 Based on code from GNU recode. */
3788 #define MIME_LINE_LENGTH 76
3790 #define IS_ASCII(Character) \
3791 ((Character) < 128)
3792 #define IS_BASE64(Character) \
3793 (IS_ASCII (Character) && base64_char_to_value[Character] >= 0)
3794 #define IS_BASE64_IGNORABLE(Character) \
3795 ((Character) == ' ' || (Character) == '\t' || (Character) == '\n' \
3796 || (Character) == '\f' || (Character) == '\r')
3798 /* Used by base64_decode_1 to retrieve a non-base64-ignorable
3799 character or return retval if there are no characters left to
3800 process. */
3801 #define READ_QUADRUPLET_BYTE(retval) \
3802 do \
3804 if (i == length) \
3806 if (nchars_return) \
3807 *nchars_return = nchars; \
3808 return (retval); \
3810 c = from[i++]; \
3812 while (IS_BASE64_IGNORABLE (c))
3814 /* Table of characters coding the 64 values. */
3815 static char base64_value_to_char[64] =
3817 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', /* 0- 9 */
3818 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', /* 10-19 */
3819 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', /* 20-29 */
3820 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', /* 30-39 */
3821 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', /* 40-49 */
3822 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', /* 50-59 */
3823 '8', '9', '+', '/' /* 60-63 */
3826 /* Table of base64 values for first 128 characters. */
3827 static short base64_char_to_value[128] =
3829 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0- 9 */
3830 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 10- 19 */
3831 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 20- 29 */
3832 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 30- 39 */
3833 -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, /* 40- 49 */
3834 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, /* 50- 59 */
3835 -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, /* 60- 69 */
3836 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, /* 70- 79 */
3837 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, /* 80- 89 */
3838 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, /* 90- 99 */
3839 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, /* 100-109 */
3840 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, /* 110-119 */
3841 49, 50, 51, -1, -1, -1, -1, -1 /* 120-127 */
3844 /* The following diagram shows the logical steps by which three octets
3845 get transformed into four base64 characters.
3847 .--------. .--------. .--------.
3848 |aaaaaabb| |bbbbcccc| |ccdddddd|
3849 `--------' `--------' `--------'
3850 6 2 4 4 2 6
3851 .--------+--------+--------+--------.
3852 |00aaaaaa|00bbbbbb|00cccccc|00dddddd|
3853 `--------+--------+--------+--------'
3855 .--------+--------+--------+--------.
3856 |AAAAAAAA|BBBBBBBB|CCCCCCCC|DDDDDDDD|
3857 `--------+--------+--------+--------'
3859 The octets are divided into 6 bit chunks, which are then encoded into
3860 base64 characters. */
3863 static int base64_encode_1 P_ ((const char *, char *, int, int, int));
3864 static int base64_decode_1 P_ ((const char *, char *, int, int, int *));
3866 DEFUN ("base64-encode-region", Fbase64_encode_region, Sbase64_encode_region,
3867 2, 3, "r",
3868 doc: /* Base64-encode the region between BEG and END.
3869 Return the length of the encoded text.
3870 Optional third argument NO-LINE-BREAK means do not break long lines
3871 into shorter lines. */)
3872 (beg, end, no_line_break)
3873 Lisp_Object beg, end, no_line_break;
3875 char *encoded;
3876 int allength, length;
3877 int ibeg, iend, encoded_length;
3878 int old_pos = PT;
3879 USE_SAFE_ALLOCA;
3881 validate_region (&beg, &end);
3883 ibeg = CHAR_TO_BYTE (XFASTINT (beg));
3884 iend = CHAR_TO_BYTE (XFASTINT (end));
3885 move_gap_both (XFASTINT (beg), ibeg);
3887 /* We need to allocate enough room for encoding the text.
3888 We need 33 1/3% more space, plus a newline every 76
3889 characters, and then we round up. */
3890 length = iend - ibeg;
3891 allength = length + length/3 + 1;
3892 allength += allength / MIME_LINE_LENGTH + 1 + 6;
3894 SAFE_ALLOCA (encoded, char *, allength);
3895 encoded_length = base64_encode_1 (BYTE_POS_ADDR (ibeg), encoded, length,
3896 NILP (no_line_break),
3897 !NILP (current_buffer->enable_multibyte_characters));
3898 if (encoded_length > allength)
3899 abort ();
3901 if (encoded_length < 0)
3903 /* The encoding wasn't possible. */
3904 SAFE_FREE ();
3905 error ("Multibyte character in data for base64 encoding");
3908 /* Now we have encoded the region, so we insert the new contents
3909 and delete the old. (Insert first in order to preserve markers.) */
3910 SET_PT_BOTH (XFASTINT (beg), ibeg);
3911 insert (encoded, encoded_length);
3912 SAFE_FREE ();
3913 del_range_byte (ibeg + encoded_length, iend + encoded_length, 1);
3915 /* If point was outside of the region, restore it exactly; else just
3916 move to the beginning of the region. */
3917 if (old_pos >= XFASTINT (end))
3918 old_pos += encoded_length - (XFASTINT (end) - XFASTINT (beg));
3919 else if (old_pos > XFASTINT (beg))
3920 old_pos = XFASTINT (beg);
3921 SET_PT (old_pos);
3923 /* We return the length of the encoded text. */
3924 return make_number (encoded_length);
3927 DEFUN ("base64-encode-string", Fbase64_encode_string, Sbase64_encode_string,
3928 1, 2, 0,
3929 doc: /* Base64-encode STRING and return the result.
3930 Optional second argument NO-LINE-BREAK means do not break long lines
3931 into shorter lines. */)
3932 (string, no_line_break)
3933 Lisp_Object string, no_line_break;
3935 int allength, length, encoded_length;
3936 char *encoded;
3937 Lisp_Object encoded_string;
3938 USE_SAFE_ALLOCA;
3940 CHECK_STRING (string);
3942 /* We need to allocate enough room for encoding the text.
3943 We need 33 1/3% more space, plus a newline every 76
3944 characters, and then we round up. */
3945 length = SBYTES (string);
3946 allength = length + length/3 + 1;
3947 allength += allength / MIME_LINE_LENGTH + 1 + 6;
3949 /* We need to allocate enough room for decoding the text. */
3950 SAFE_ALLOCA (encoded, char *, allength);
3952 encoded_length = base64_encode_1 (SDATA (string),
3953 encoded, length, NILP (no_line_break),
3954 STRING_MULTIBYTE (string));
3955 if (encoded_length > allength)
3956 abort ();
3958 if (encoded_length < 0)
3960 /* The encoding wasn't possible. */
3961 SAFE_FREE ();
3962 error ("Multibyte character in data for base64 encoding");
3965 encoded_string = make_unibyte_string (encoded, encoded_length);
3966 SAFE_FREE ();
3968 return encoded_string;
3971 static int
3972 base64_encode_1 (from, to, length, line_break, multibyte)
3973 const char *from;
3974 char *to;
3975 int length;
3976 int line_break;
3977 int multibyte;
3979 int counter = 0, i = 0;
3980 char *e = to;
3981 int c;
3982 unsigned int value;
3983 int bytes;
3985 while (i < length)
3987 if (multibyte)
3989 c = STRING_CHAR_AND_LENGTH (from + i, length - i, bytes);
3990 if (c >= 256)
3991 return -1;
3992 i += bytes;
3994 else
3995 c = from[i++];
3997 /* Wrap line every 76 characters. */
3999 if (line_break)
4001 if (counter < MIME_LINE_LENGTH / 4)
4002 counter++;
4003 else
4005 *e++ = '\n';
4006 counter = 1;
4010 /* Process first byte of a triplet. */
4012 *e++ = base64_value_to_char[0x3f & c >> 2];
4013 value = (0x03 & c) << 4;
4015 /* Process second byte of a triplet. */
4017 if (i == length)
4019 *e++ = base64_value_to_char[value];
4020 *e++ = '=';
4021 *e++ = '=';
4022 break;
4025 if (multibyte)
4027 c = STRING_CHAR_AND_LENGTH (from + i, length - i, bytes);
4028 if (c >= 256)
4029 return -1;
4030 i += bytes;
4032 else
4033 c = from[i++];
4035 *e++ = base64_value_to_char[value | (0x0f & c >> 4)];
4036 value = (0x0f & c) << 2;
4038 /* Process third byte of a triplet. */
4040 if (i == length)
4042 *e++ = base64_value_to_char[value];
4043 *e++ = '=';
4044 break;
4047 if (multibyte)
4049 c = STRING_CHAR_AND_LENGTH (from + i, length - i, bytes);
4050 if (c >= 256)
4051 return -1;
4052 i += bytes;
4054 else
4055 c = from[i++];
4057 *e++ = base64_value_to_char[value | (0x03 & c >> 6)];
4058 *e++ = base64_value_to_char[0x3f & c];
4061 return e - to;
4065 DEFUN ("base64-decode-region", Fbase64_decode_region, Sbase64_decode_region,
4066 2, 2, "r",
4067 doc: /* Base64-decode the region between BEG and END.
4068 Return the length of the decoded text.
4069 If the region can't be decoded, signal an error and don't modify the buffer. */)
4070 (beg, end)
4071 Lisp_Object beg, end;
4073 int ibeg, iend, length, allength;
4074 char *decoded;
4075 int old_pos = PT;
4076 int decoded_length;
4077 int inserted_chars;
4078 int multibyte = !NILP (current_buffer->enable_multibyte_characters);
4079 USE_SAFE_ALLOCA;
4081 validate_region (&beg, &end);
4083 ibeg = CHAR_TO_BYTE (XFASTINT (beg));
4084 iend = CHAR_TO_BYTE (XFASTINT (end));
4086 length = iend - ibeg;
4088 /* We need to allocate enough room for decoding the text. If we are
4089 working on a multibyte buffer, each decoded code may occupy at
4090 most two bytes. */
4091 allength = multibyte ? length * 2 : length;
4092 SAFE_ALLOCA (decoded, char *, allength);
4094 move_gap_both (XFASTINT (beg), ibeg);
4095 decoded_length = base64_decode_1 (BYTE_POS_ADDR (ibeg), decoded, length,
4096 multibyte, &inserted_chars);
4097 if (decoded_length > allength)
4098 abort ();
4100 if (decoded_length < 0)
4102 /* The decoding wasn't possible. */
4103 SAFE_FREE ();
4104 error ("Invalid base64 data");
4107 /* Now we have decoded the region, so we insert the new contents
4108 and delete the old. (Insert first in order to preserve markers.) */
4109 TEMP_SET_PT_BOTH (XFASTINT (beg), ibeg);
4110 insert_1_both (decoded, inserted_chars, decoded_length, 0, 1, 0);
4111 SAFE_FREE ();
4113 /* Delete the original text. */
4114 del_range_both (PT, PT_BYTE, XFASTINT (end) + inserted_chars,
4115 iend + decoded_length, 1);
4117 /* If point was outside of the region, restore it exactly; else just
4118 move to the beginning of the region. */
4119 if (old_pos >= XFASTINT (end))
4120 old_pos += inserted_chars - (XFASTINT (end) - XFASTINT (beg));
4121 else if (old_pos > XFASTINT (beg))
4122 old_pos = XFASTINT (beg);
4123 SET_PT (old_pos > ZV ? ZV : old_pos);
4125 return make_number (inserted_chars);
4128 DEFUN ("base64-decode-string", Fbase64_decode_string, Sbase64_decode_string,
4129 1, 1, 0,
4130 doc: /* Base64-decode STRING and return the result. */)
4131 (string)
4132 Lisp_Object string;
4134 char *decoded;
4135 int length, decoded_length;
4136 Lisp_Object decoded_string;
4137 USE_SAFE_ALLOCA;
4139 CHECK_STRING (string);
4141 length = SBYTES (string);
4142 /* We need to allocate enough room for decoding the text. */
4143 SAFE_ALLOCA (decoded, char *, length);
4145 /* The decoded result should be unibyte. */
4146 decoded_length = base64_decode_1 (SDATA (string), decoded, length,
4147 0, NULL);
4148 if (decoded_length > length)
4149 abort ();
4150 else if (decoded_length >= 0)
4151 decoded_string = make_unibyte_string (decoded, decoded_length);
4152 else
4153 decoded_string = Qnil;
4155 SAFE_FREE ();
4156 if (!STRINGP (decoded_string))
4157 error ("Invalid base64 data");
4159 return decoded_string;
4162 /* Base64-decode the data at FROM of LENGHT bytes into TO. If
4163 MULTIBYTE is nonzero, the decoded result should be in multibyte
4164 form. If NCHARS_RETRUN is not NULL, store the number of produced
4165 characters in *NCHARS_RETURN. */
4167 static int
4168 base64_decode_1 (from, to, length, multibyte, nchars_return)
4169 const char *from;
4170 char *to;
4171 int length;
4172 int multibyte;
4173 int *nchars_return;
4175 int i = 0;
4176 char *e = to;
4177 unsigned char c;
4178 unsigned long value;
4179 int nchars = 0;
4181 while (1)
4183 /* Process first byte of a quadruplet. */
4185 READ_QUADRUPLET_BYTE (e-to);
4187 if (!IS_BASE64 (c))
4188 return -1;
4189 value = base64_char_to_value[c] << 18;
4191 /* Process second byte of a quadruplet. */
4193 READ_QUADRUPLET_BYTE (-1);
4195 if (!IS_BASE64 (c))
4196 return -1;
4197 value |= base64_char_to_value[c] << 12;
4199 c = (unsigned char) (value >> 16);
4200 if (multibyte)
4201 e += CHAR_STRING (c, e);
4202 else
4203 *e++ = c;
4204 nchars++;
4206 /* Process third byte of a quadruplet. */
4208 READ_QUADRUPLET_BYTE (-1);
4210 if (c == '=')
4212 READ_QUADRUPLET_BYTE (-1);
4214 if (c != '=')
4215 return -1;
4216 continue;
4219 if (!IS_BASE64 (c))
4220 return -1;
4221 value |= base64_char_to_value[c] << 6;
4223 c = (unsigned char) (0xff & value >> 8);
4224 if (multibyte)
4225 e += CHAR_STRING (c, e);
4226 else
4227 *e++ = c;
4228 nchars++;
4230 /* Process fourth byte of a quadruplet. */
4232 READ_QUADRUPLET_BYTE (-1);
4234 if (c == '=')
4235 continue;
4237 if (!IS_BASE64 (c))
4238 return -1;
4239 value |= base64_char_to_value[c];
4241 c = (unsigned char) (0xff & value);
4242 if (multibyte)
4243 e += CHAR_STRING (c, e);
4244 else
4245 *e++ = c;
4246 nchars++;
4252 /***********************************************************************
4253 ***** *****
4254 ***** Hash Tables *****
4255 ***** *****
4256 ***********************************************************************/
4258 /* Implemented by gerd@gnu.org. This hash table implementation was
4259 inspired by CMUCL hash tables. */
4261 /* Ideas:
4263 1. For small tables, association lists are probably faster than
4264 hash tables because they have lower overhead.
4266 For uses of hash tables where the O(1) behavior of table
4267 operations is not a requirement, it might therefore be a good idea
4268 not to hash. Instead, we could just do a linear search in the
4269 key_and_value vector of the hash table. This could be done
4270 if a `:linear-search t' argument is given to make-hash-table. */
4273 /* The list of all weak hash tables. Don't staticpro this one. */
4275 struct Lisp_Hash_Table *weak_hash_tables;
4277 /* Various symbols. */
4279 Lisp_Object Qhash_table_p, Qeq, Qeql, Qequal, Qkey, Qvalue;
4280 Lisp_Object QCtest, QCsize, QCrehash_size, QCrehash_threshold, QCweakness;
4281 Lisp_Object Qhash_table_test, Qkey_or_value, Qkey_and_value;
4283 /* Function prototypes. */
4285 static struct Lisp_Hash_Table *check_hash_table P_ ((Lisp_Object));
4286 static int get_key_arg P_ ((Lisp_Object, int, Lisp_Object *, char *));
4287 static void maybe_resize_hash_table P_ ((struct Lisp_Hash_Table *));
4288 static int cmpfn_eql P_ ((struct Lisp_Hash_Table *, Lisp_Object, unsigned,
4289 Lisp_Object, unsigned));
4290 static int cmpfn_equal P_ ((struct Lisp_Hash_Table *, Lisp_Object, unsigned,
4291 Lisp_Object, unsigned));
4292 static int cmpfn_user_defined P_ ((struct Lisp_Hash_Table *, Lisp_Object,
4293 unsigned, Lisp_Object, unsigned));
4294 static unsigned hashfn_eq P_ ((struct Lisp_Hash_Table *, Lisp_Object));
4295 static unsigned hashfn_eql P_ ((struct Lisp_Hash_Table *, Lisp_Object));
4296 static unsigned hashfn_equal P_ ((struct Lisp_Hash_Table *, Lisp_Object));
4297 static unsigned hashfn_user_defined P_ ((struct Lisp_Hash_Table *,
4298 Lisp_Object));
4299 static unsigned sxhash_string P_ ((unsigned char *, int));
4300 static unsigned sxhash_list P_ ((Lisp_Object, int));
4301 static unsigned sxhash_vector P_ ((Lisp_Object, int));
4302 static unsigned sxhash_bool_vector P_ ((Lisp_Object));
4303 static int sweep_weak_table P_ ((struct Lisp_Hash_Table *, int));
4307 /***********************************************************************
4308 Utilities
4309 ***********************************************************************/
4311 /* If OBJ is a Lisp hash table, return a pointer to its struct
4312 Lisp_Hash_Table. Otherwise, signal an error. */
4314 static struct Lisp_Hash_Table *
4315 check_hash_table (obj)
4316 Lisp_Object obj;
4318 CHECK_HASH_TABLE (obj);
4319 return XHASH_TABLE (obj);
4323 /* Value is the next integer I >= N, N >= 0 which is "almost" a prime
4324 number. */
4327 next_almost_prime (n)
4328 int n;
4330 if (n % 2 == 0)
4331 n += 1;
4332 if (n % 3 == 0)
4333 n += 2;
4334 if (n % 7 == 0)
4335 n += 4;
4336 return n;
4340 /* Find KEY in ARGS which has size NARGS. Don't consider indices for
4341 which USED[I] is non-zero. If found at index I in ARGS, set
4342 USED[I] and USED[I + 1] to 1, and return I + 1. Otherwise return
4343 -1. This function is used to extract a keyword/argument pair from
4344 a DEFUN parameter list. */
4346 static int
4347 get_key_arg (key, nargs, args, used)
4348 Lisp_Object key;
4349 int nargs;
4350 Lisp_Object *args;
4351 char *used;
4353 int i;
4355 for (i = 0; i < nargs - 1; ++i)
4356 if (!used[i] && EQ (args[i], key))
4357 break;
4359 if (i >= nargs - 1)
4360 i = -1;
4361 else
4363 used[i++] = 1;
4364 used[i] = 1;
4367 return i;
4371 /* Return a Lisp vector which has the same contents as VEC but has
4372 size NEW_SIZE, NEW_SIZE >= VEC->size. Entries in the resulting
4373 vector that are not copied from VEC are set to INIT. */
4375 Lisp_Object
4376 larger_vector (vec, new_size, init)
4377 Lisp_Object vec;
4378 int new_size;
4379 Lisp_Object init;
4381 struct Lisp_Vector *v;
4382 int i, old_size;
4384 xassert (VECTORP (vec));
4385 old_size = ASIZE (vec);
4386 xassert (new_size >= old_size);
4388 v = allocate_vector (new_size);
4389 bcopy (XVECTOR (vec)->contents, v->contents,
4390 old_size * sizeof *v->contents);
4391 for (i = old_size; i < new_size; ++i)
4392 v->contents[i] = init;
4393 XSETVECTOR (vec, v);
4394 return vec;
4398 /***********************************************************************
4399 Low-level Functions
4400 ***********************************************************************/
4402 /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code
4403 HASH2 in hash table H using `eql'. Value is non-zero if KEY1 and
4404 KEY2 are the same. */
4406 static int
4407 cmpfn_eql (h, key1, hash1, key2, hash2)
4408 struct Lisp_Hash_Table *h;
4409 Lisp_Object key1, key2;
4410 unsigned hash1, hash2;
4412 return (FLOATP (key1)
4413 && FLOATP (key2)
4414 && XFLOAT_DATA (key1) == XFLOAT_DATA (key2));
4418 /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code
4419 HASH2 in hash table H using `equal'. Value is non-zero if KEY1 and
4420 KEY2 are the same. */
4422 static int
4423 cmpfn_equal (h, key1, hash1, key2, hash2)
4424 struct Lisp_Hash_Table *h;
4425 Lisp_Object key1, key2;
4426 unsigned hash1, hash2;
4428 return hash1 == hash2 && !NILP (Fequal (key1, key2));
4432 /* Compare KEY1 which has hash code HASH1, and KEY2 with hash code
4433 HASH2 in hash table H using H->user_cmp_function. Value is non-zero
4434 if KEY1 and KEY2 are the same. */
4436 static int
4437 cmpfn_user_defined (h, key1, hash1, key2, hash2)
4438 struct Lisp_Hash_Table *h;
4439 Lisp_Object key1, key2;
4440 unsigned hash1, hash2;
4442 if (hash1 == hash2)
4444 Lisp_Object args[3];
4446 args[0] = h->user_cmp_function;
4447 args[1] = key1;
4448 args[2] = key2;
4449 return !NILP (Ffuncall (3, args));
4451 else
4452 return 0;
4456 /* Value is a hash code for KEY for use in hash table H which uses
4457 `eq' to compare keys. The hash code returned is guaranteed to fit
4458 in a Lisp integer. */
4460 static unsigned
4461 hashfn_eq (h, key)
4462 struct Lisp_Hash_Table *h;
4463 Lisp_Object key;
4465 unsigned hash = XUINT (key) ^ XGCTYPE (key);
4466 xassert ((hash & ~INTMASK) == 0);
4467 return hash;
4471 /* Value is a hash code for KEY for use in hash table H which uses
4472 `eql' to compare keys. The hash code returned is guaranteed to fit
4473 in a Lisp integer. */
4475 static unsigned
4476 hashfn_eql (h, key)
4477 struct Lisp_Hash_Table *h;
4478 Lisp_Object key;
4480 unsigned hash;
4481 if (FLOATP (key))
4482 hash = sxhash (key, 0);
4483 else
4484 hash = XUINT (key) ^ XGCTYPE (key);
4485 xassert ((hash & ~INTMASK) == 0);
4486 return hash;
4490 /* Value is a hash code for KEY for use in hash table H which uses
4491 `equal' to compare keys. The hash code returned is guaranteed to fit
4492 in a Lisp integer. */
4494 static unsigned
4495 hashfn_equal (h, key)
4496 struct Lisp_Hash_Table *h;
4497 Lisp_Object key;
4499 unsigned hash = sxhash (key, 0);
4500 xassert ((hash & ~INTMASK) == 0);
4501 return hash;
4505 /* Value is a hash code for KEY for use in hash table H which uses as
4506 user-defined function to compare keys. The hash code returned is
4507 guaranteed to fit in a Lisp integer. */
4509 static unsigned
4510 hashfn_user_defined (h, key)
4511 struct Lisp_Hash_Table *h;
4512 Lisp_Object key;
4514 Lisp_Object args[2], hash;
4516 args[0] = h->user_hash_function;
4517 args[1] = key;
4518 hash = Ffuncall (2, args);
4519 if (!INTEGERP (hash))
4520 signal_error ("Invalid hash code returned from user-supplied hash function", hash);
4521 return XUINT (hash);
4525 /* Create and initialize a new hash table.
4527 TEST specifies the test the hash table will use to compare keys.
4528 It must be either one of the predefined tests `eq', `eql' or
4529 `equal' or a symbol denoting a user-defined test named TEST with
4530 test and hash functions USER_TEST and USER_HASH.
4532 Give the table initial capacity SIZE, SIZE >= 0, an integer.
4534 If REHASH_SIZE is an integer, it must be > 0, and this hash table's
4535 new size when it becomes full is computed by adding REHASH_SIZE to
4536 its old size. If REHASH_SIZE is a float, it must be > 1.0, and the
4537 table's new size is computed by multiplying its old size with
4538 REHASH_SIZE.
4540 REHASH_THRESHOLD must be a float <= 1.0, and > 0. The table will
4541 be resized when the ratio of (number of entries in the table) /
4542 (table size) is >= REHASH_THRESHOLD.
4544 WEAK specifies the weakness of the table. If non-nil, it must be
4545 one of the symbols `key', `value', `key-or-value', or `key-and-value'. */
4547 Lisp_Object
4548 make_hash_table (test, size, rehash_size, rehash_threshold, weak,
4549 user_test, user_hash)
4550 Lisp_Object test, size, rehash_size, rehash_threshold, weak;
4551 Lisp_Object user_test, user_hash;
4553 struct Lisp_Hash_Table *h;
4554 Lisp_Object table;
4555 int index_size, i, sz;
4557 /* Preconditions. */
4558 xassert (SYMBOLP (test));
4559 xassert (INTEGERP (size) && XINT (size) >= 0);
4560 xassert ((INTEGERP (rehash_size) && XINT (rehash_size) > 0)
4561 || (FLOATP (rehash_size) && XFLOATINT (rehash_size) > 1.0));
4562 xassert (FLOATP (rehash_threshold)
4563 && XFLOATINT (rehash_threshold) > 0
4564 && XFLOATINT (rehash_threshold) <= 1.0);
4566 if (XFASTINT (size) == 0)
4567 size = make_number (1);
4569 /* Allocate a table and initialize it. */
4570 h = allocate_hash_table ();
4572 /* Initialize hash table slots. */
4573 sz = XFASTINT (size);
4575 h->test = test;
4576 if (EQ (test, Qeql))
4578 h->cmpfn = cmpfn_eql;
4579 h->hashfn = hashfn_eql;
4581 else if (EQ (test, Qeq))
4583 h->cmpfn = NULL;
4584 h->hashfn = hashfn_eq;
4586 else if (EQ (test, Qequal))
4588 h->cmpfn = cmpfn_equal;
4589 h->hashfn = hashfn_equal;
4591 else
4593 h->user_cmp_function = user_test;
4594 h->user_hash_function = user_hash;
4595 h->cmpfn = cmpfn_user_defined;
4596 h->hashfn = hashfn_user_defined;
4599 h->weak = weak;
4600 h->rehash_threshold = rehash_threshold;
4601 h->rehash_size = rehash_size;
4602 h->count = 0;
4603 h->key_and_value = Fmake_vector (make_number (2 * sz), Qnil);
4604 h->hash = Fmake_vector (size, Qnil);
4605 h->next = Fmake_vector (size, Qnil);
4606 /* Cast to int here avoids losing with gcc 2.95 on Tru64/Alpha... */
4607 index_size = next_almost_prime ((int) (sz / XFLOATINT (rehash_threshold)));
4608 h->index = Fmake_vector (make_number (index_size), Qnil);
4610 /* Set up the free list. */
4611 for (i = 0; i < sz - 1; ++i)
4612 HASH_NEXT (h, i) = make_number (i + 1);
4613 h->next_free = make_number (0);
4615 XSET_HASH_TABLE (table, h);
4616 xassert (HASH_TABLE_P (table));
4617 xassert (XHASH_TABLE (table) == h);
4619 /* Maybe add this hash table to the list of all weak hash tables. */
4620 if (NILP (h->weak))
4621 h->next_weak = NULL;
4622 else
4624 h->next_weak = weak_hash_tables;
4625 weak_hash_tables = h;
4628 return table;
4632 /* Return a copy of hash table H1. Keys and values are not copied,
4633 only the table itself is. */
4635 Lisp_Object
4636 copy_hash_table (h1)
4637 struct Lisp_Hash_Table *h1;
4639 Lisp_Object table;
4640 struct Lisp_Hash_Table *h2;
4641 struct Lisp_Vector *next;
4643 h2 = allocate_hash_table ();
4644 next = h2->vec_next;
4645 bcopy (h1, h2, sizeof *h2);
4646 h2->vec_next = next;
4647 h2->key_and_value = Fcopy_sequence (h1->key_and_value);
4648 h2->hash = Fcopy_sequence (h1->hash);
4649 h2->next = Fcopy_sequence (h1->next);
4650 h2->index = Fcopy_sequence (h1->index);
4651 XSET_HASH_TABLE (table, h2);
4653 /* Maybe add this hash table to the list of all weak hash tables. */
4654 if (!NILP (h2->weak))
4656 h2->next_weak = weak_hash_tables;
4657 weak_hash_tables = h2;
4660 return table;
4664 /* Resize hash table H if it's too full. If H cannot be resized
4665 because it's already too large, throw an error. */
4667 static INLINE void
4668 maybe_resize_hash_table (h)
4669 struct Lisp_Hash_Table *h;
4671 if (NILP (h->next_free))
4673 int old_size = HASH_TABLE_SIZE (h);
4674 int i, new_size, index_size;
4675 EMACS_INT nsize;
4677 if (INTEGERP (h->rehash_size))
4678 new_size = old_size + XFASTINT (h->rehash_size);
4679 else
4680 new_size = old_size * XFLOATINT (h->rehash_size);
4681 new_size = max (old_size + 1, new_size);
4682 index_size = next_almost_prime ((int)
4683 (new_size
4684 / XFLOATINT (h->rehash_threshold)));
4685 /* Assignment to EMACS_INT stops GCC whining about limited range
4686 of data type. */
4687 nsize = max (index_size, 2 * new_size);
4688 if (nsize > MOST_POSITIVE_FIXNUM)
4689 error ("Hash table too large to resize");
4691 h->key_and_value = larger_vector (h->key_and_value, 2 * new_size, Qnil);
4692 h->next = larger_vector (h->next, new_size, Qnil);
4693 h->hash = larger_vector (h->hash, new_size, Qnil);
4694 h->index = Fmake_vector (make_number (index_size), Qnil);
4696 /* Update the free list. Do it so that new entries are added at
4697 the end of the free list. This makes some operations like
4698 maphash faster. */
4699 for (i = old_size; i < new_size - 1; ++i)
4700 HASH_NEXT (h, i) = make_number (i + 1);
4702 if (!NILP (h->next_free))
4704 Lisp_Object last, next;
4706 last = h->next_free;
4707 while (next = HASH_NEXT (h, XFASTINT (last)),
4708 !NILP (next))
4709 last = next;
4711 HASH_NEXT (h, XFASTINT (last)) = make_number (old_size);
4713 else
4714 XSETFASTINT (h->next_free, old_size);
4716 /* Rehash. */
4717 for (i = 0; i < old_size; ++i)
4718 if (!NILP (HASH_HASH (h, i)))
4720 unsigned hash_code = XUINT (HASH_HASH (h, i));
4721 int start_of_bucket = hash_code % ASIZE (h->index);
4722 HASH_NEXT (h, i) = HASH_INDEX (h, start_of_bucket);
4723 HASH_INDEX (h, start_of_bucket) = make_number (i);
4729 /* Lookup KEY in hash table H. If HASH is non-null, return in *HASH
4730 the hash code of KEY. Value is the index of the entry in H
4731 matching KEY, or -1 if not found. */
4734 hash_lookup (h, key, hash)
4735 struct Lisp_Hash_Table *h;
4736 Lisp_Object key;
4737 unsigned *hash;
4739 unsigned hash_code;
4740 int start_of_bucket;
4741 Lisp_Object idx;
4743 hash_code = h->hashfn (h, key);
4744 if (hash)
4745 *hash = hash_code;
4747 start_of_bucket = hash_code % ASIZE (h->index);
4748 idx = HASH_INDEX (h, start_of_bucket);
4750 /* We need not gcpro idx since it's either an integer or nil. */
4751 while (!NILP (idx))
4753 int i = XFASTINT (idx);
4754 if (EQ (key, HASH_KEY (h, i))
4755 || (h->cmpfn
4756 && h->cmpfn (h, key, hash_code,
4757 HASH_KEY (h, i), XUINT (HASH_HASH (h, i)))))
4758 break;
4759 idx = HASH_NEXT (h, i);
4762 return NILP (idx) ? -1 : XFASTINT (idx);
4766 /* Put an entry into hash table H that associates KEY with VALUE.
4767 HASH is a previously computed hash code of KEY.
4768 Value is the index of the entry in H matching KEY. */
4771 hash_put (h, key, value, hash)
4772 struct Lisp_Hash_Table *h;
4773 Lisp_Object key, value;
4774 unsigned hash;
4776 int start_of_bucket, i;
4778 xassert ((hash & ~INTMASK) == 0);
4780 /* Increment count after resizing because resizing may fail. */
4781 maybe_resize_hash_table (h);
4782 h->count++;
4784 /* Store key/value in the key_and_value vector. */
4785 i = XFASTINT (h->next_free);
4786 h->next_free = HASH_NEXT (h, i);
4787 HASH_KEY (h, i) = key;
4788 HASH_VALUE (h, i) = value;
4790 /* Remember its hash code. */
4791 HASH_HASH (h, i) = make_number (hash);
4793 /* Add new entry to its collision chain. */
4794 start_of_bucket = hash % ASIZE (h->index);
4795 HASH_NEXT (h, i) = HASH_INDEX (h, start_of_bucket);
4796 HASH_INDEX (h, start_of_bucket) = make_number (i);
4797 return i;
4801 /* Remove the entry matching KEY from hash table H, if there is one. */
4803 void
4804 hash_remove (h, key)
4805 struct Lisp_Hash_Table *h;
4806 Lisp_Object key;
4808 unsigned hash_code;
4809 int start_of_bucket;
4810 Lisp_Object idx, prev;
4812 hash_code = h->hashfn (h, key);
4813 start_of_bucket = hash_code % ASIZE (h->index);
4814 idx = HASH_INDEX (h, start_of_bucket);
4815 prev = Qnil;
4817 /* We need not gcpro idx, prev since they're either integers or nil. */
4818 while (!NILP (idx))
4820 int i = XFASTINT (idx);
4822 if (EQ (key, HASH_KEY (h, i))
4823 || (h->cmpfn
4824 && h->cmpfn (h, key, hash_code,
4825 HASH_KEY (h, i), XUINT (HASH_HASH (h, i)))))
4827 /* Take entry out of collision chain. */
4828 if (NILP (prev))
4829 HASH_INDEX (h, start_of_bucket) = HASH_NEXT (h, i);
4830 else
4831 HASH_NEXT (h, XFASTINT (prev)) = HASH_NEXT (h, i);
4833 /* Clear slots in key_and_value and add the slots to
4834 the free list. */
4835 HASH_KEY (h, i) = HASH_VALUE (h, i) = HASH_HASH (h, i) = Qnil;
4836 HASH_NEXT (h, i) = h->next_free;
4837 h->next_free = make_number (i);
4838 h->count--;
4839 xassert (h->count >= 0);
4840 break;
4842 else
4844 prev = idx;
4845 idx = HASH_NEXT (h, i);
4851 /* Clear hash table H. */
4853 void
4854 hash_clear (h)
4855 struct Lisp_Hash_Table *h;
4857 if (h->count > 0)
4859 int i, size = HASH_TABLE_SIZE (h);
4861 for (i = 0; i < size; ++i)
4863 HASH_NEXT (h, i) = i < size - 1 ? make_number (i + 1) : Qnil;
4864 HASH_KEY (h, i) = Qnil;
4865 HASH_VALUE (h, i) = Qnil;
4866 HASH_HASH (h, i) = Qnil;
4869 for (i = 0; i < ASIZE (h->index); ++i)
4870 AREF (h->index, i) = Qnil;
4872 h->next_free = make_number (0);
4873 h->count = 0;
4879 /************************************************************************
4880 Weak Hash Tables
4881 ************************************************************************/
4883 /* Sweep weak hash table H. REMOVE_ENTRIES_P non-zero means remove
4884 entries from the table that don't survive the current GC.
4885 REMOVE_ENTRIES_P zero means mark entries that are in use. Value is
4886 non-zero if anything was marked. */
4888 static int
4889 sweep_weak_table (h, remove_entries_p)
4890 struct Lisp_Hash_Table *h;
4891 int remove_entries_p;
4893 int bucket, n, marked;
4895 n = ASIZE (h->index) & ~ARRAY_MARK_FLAG;
4896 marked = 0;
4898 for (bucket = 0; bucket < n; ++bucket)
4900 Lisp_Object idx, next, prev;
4902 /* Follow collision chain, removing entries that
4903 don't survive this garbage collection. */
4904 prev = Qnil;
4905 for (idx = HASH_INDEX (h, bucket); !GC_NILP (idx); idx = next)
4907 int i = XFASTINT (idx);
4908 int key_known_to_survive_p = survives_gc_p (HASH_KEY (h, i));
4909 int value_known_to_survive_p = survives_gc_p (HASH_VALUE (h, i));
4910 int remove_p;
4912 if (EQ (h->weak, Qkey))
4913 remove_p = !key_known_to_survive_p;
4914 else if (EQ (h->weak, Qvalue))
4915 remove_p = !value_known_to_survive_p;
4916 else if (EQ (h->weak, Qkey_or_value))
4917 remove_p = !(key_known_to_survive_p || value_known_to_survive_p);
4918 else if (EQ (h->weak, Qkey_and_value))
4919 remove_p = !(key_known_to_survive_p && value_known_to_survive_p);
4920 else
4921 abort ();
4923 next = HASH_NEXT (h, i);
4925 if (remove_entries_p)
4927 if (remove_p)
4929 /* Take out of collision chain. */
4930 if (GC_NILP (prev))
4931 HASH_INDEX (h, bucket) = next;
4932 else
4933 HASH_NEXT (h, XFASTINT (prev)) = next;
4935 /* Add to free list. */
4936 HASH_NEXT (h, i) = h->next_free;
4937 h->next_free = idx;
4939 /* Clear key, value, and hash. */
4940 HASH_KEY (h, i) = HASH_VALUE (h, i) = Qnil;
4941 HASH_HASH (h, i) = Qnil;
4943 h->count--;
4945 else
4947 prev = idx;
4950 else
4952 if (!remove_p)
4954 /* Make sure key and value survive. */
4955 if (!key_known_to_survive_p)
4957 mark_object (HASH_KEY (h, i));
4958 marked = 1;
4961 if (!value_known_to_survive_p)
4963 mark_object (HASH_VALUE (h, i));
4964 marked = 1;
4971 return marked;
4974 /* Remove elements from weak hash tables that don't survive the
4975 current garbage collection. Remove weak tables that don't survive
4976 from weak_hash_tables. Called from gc_sweep. */
4978 void
4979 sweep_weak_hash_tables ()
4981 struct Lisp_Hash_Table *h, *used, *next;
4982 int marked;
4984 /* Mark all keys and values that are in use. Keep on marking until
4985 there is no more change. This is necessary for cases like
4986 value-weak table A containing an entry X -> Y, where Y is used in a
4987 key-weak table B, Z -> Y. If B comes after A in the list of weak
4988 tables, X -> Y might be removed from A, although when looking at B
4989 one finds that it shouldn't. */
4992 marked = 0;
4993 for (h = weak_hash_tables; h; h = h->next_weak)
4995 if (h->size & ARRAY_MARK_FLAG)
4996 marked |= sweep_weak_table (h, 0);
4999 while (marked);
5001 /* Remove tables and entries that aren't used. */
5002 for (h = weak_hash_tables, used = NULL; h; h = next)
5004 next = h->next_weak;
5006 if (h->size & ARRAY_MARK_FLAG)
5008 /* TABLE is marked as used. Sweep its contents. */
5009 if (h->count > 0)
5010 sweep_weak_table (h, 1);
5012 /* Add table to the list of used weak hash tables. */
5013 h->next_weak = used;
5014 used = h;
5018 weak_hash_tables = used;
5023 /***********************************************************************
5024 Hash Code Computation
5025 ***********************************************************************/
5027 /* Maximum depth up to which to dive into Lisp structures. */
5029 #define SXHASH_MAX_DEPTH 3
5031 /* Maximum length up to which to take list and vector elements into
5032 account. */
5034 #define SXHASH_MAX_LEN 7
5036 /* Combine two integers X and Y for hashing. */
5038 #define SXHASH_COMBINE(X, Y) \
5039 ((((unsigned)(X) << 4) + (((unsigned)(X) >> 24) & 0x0fffffff)) \
5040 + (unsigned)(Y))
5043 /* Return a hash for string PTR which has length LEN. The hash
5044 code returned is guaranteed to fit in a Lisp integer. */
5046 static unsigned
5047 sxhash_string (ptr, len)
5048 unsigned char *ptr;
5049 int len;
5051 unsigned char *p = ptr;
5052 unsigned char *end = p + len;
5053 unsigned char c;
5054 unsigned hash = 0;
5056 while (p != end)
5058 c = *p++;
5059 if (c >= 0140)
5060 c -= 40;
5061 hash = ((hash << 4) + (hash >> 28) + c);
5064 return hash & INTMASK;
5068 /* Return a hash for list LIST. DEPTH is the current depth in the
5069 list. We don't recurse deeper than SXHASH_MAX_DEPTH in it. */
5071 static unsigned
5072 sxhash_list (list, depth)
5073 Lisp_Object list;
5074 int depth;
5076 unsigned hash = 0;
5077 int i;
5079 if (depth < SXHASH_MAX_DEPTH)
5080 for (i = 0;
5081 CONSP (list) && i < SXHASH_MAX_LEN;
5082 list = XCDR (list), ++i)
5084 unsigned hash2 = sxhash (XCAR (list), depth + 1);
5085 hash = SXHASH_COMBINE (hash, hash2);
5088 if (!NILP (list))
5090 unsigned hash2 = sxhash (list, depth + 1);
5091 hash = SXHASH_COMBINE (hash, hash2);
5094 return hash;
5098 /* Return a hash for vector VECTOR. DEPTH is the current depth in
5099 the Lisp structure. */
5101 static unsigned
5102 sxhash_vector (vec, depth)
5103 Lisp_Object vec;
5104 int depth;
5106 unsigned hash = ASIZE (vec);
5107 int i, n;
5109 n = min (SXHASH_MAX_LEN, ASIZE (vec));
5110 for (i = 0; i < n; ++i)
5112 unsigned hash2 = sxhash (AREF (vec, i), depth + 1);
5113 hash = SXHASH_COMBINE (hash, hash2);
5116 return hash;
5120 /* Return a hash for bool-vector VECTOR. */
5122 static unsigned
5123 sxhash_bool_vector (vec)
5124 Lisp_Object vec;
5126 unsigned hash = XBOOL_VECTOR (vec)->size;
5127 int i, n;
5129 n = min (SXHASH_MAX_LEN, XBOOL_VECTOR (vec)->vector_size);
5130 for (i = 0; i < n; ++i)
5131 hash = SXHASH_COMBINE (hash, XBOOL_VECTOR (vec)->data[i]);
5133 return hash;
5137 /* Return a hash code for OBJ. DEPTH is the current depth in the Lisp
5138 structure. Value is an unsigned integer clipped to INTMASK. */
5140 unsigned
5141 sxhash (obj, depth)
5142 Lisp_Object obj;
5143 int depth;
5145 unsigned hash;
5147 if (depth > SXHASH_MAX_DEPTH)
5148 return 0;
5150 switch (XTYPE (obj))
5152 case Lisp_Int:
5153 hash = XUINT (obj);
5154 break;
5156 case Lisp_Misc:
5157 hash = XUINT (obj);
5158 break;
5160 case Lisp_Symbol:
5161 obj = SYMBOL_NAME (obj);
5162 /* Fall through. */
5164 case Lisp_String:
5165 hash = sxhash_string (SDATA (obj), SCHARS (obj));
5166 break;
5168 /* This can be everything from a vector to an overlay. */
5169 case Lisp_Vectorlike:
5170 if (VECTORP (obj))
5171 /* According to the CL HyperSpec, two arrays are equal only if
5172 they are `eq', except for strings and bit-vectors. In
5173 Emacs, this works differently. We have to compare element
5174 by element. */
5175 hash = sxhash_vector (obj, depth);
5176 else if (BOOL_VECTOR_P (obj))
5177 hash = sxhash_bool_vector (obj);
5178 else
5179 /* Others are `equal' if they are `eq', so let's take their
5180 address as hash. */
5181 hash = XUINT (obj);
5182 break;
5184 case Lisp_Cons:
5185 hash = sxhash_list (obj, depth);
5186 break;
5188 case Lisp_Float:
5190 unsigned char *p = (unsigned char *) &XFLOAT_DATA (obj);
5191 unsigned char *e = p + sizeof XFLOAT_DATA (obj);
5192 for (hash = 0; p < e; ++p)
5193 hash = SXHASH_COMBINE (hash, *p);
5194 break;
5197 default:
5198 abort ();
5201 return hash & INTMASK;
5206 /***********************************************************************
5207 Lisp Interface
5208 ***********************************************************************/
5211 DEFUN ("sxhash", Fsxhash, Ssxhash, 1, 1, 0,
5212 doc: /* Compute a hash code for OBJ and return it as integer. */)
5213 (obj)
5214 Lisp_Object obj;
5216 unsigned hash = sxhash (obj, 0);
5217 return make_number (hash);
5221 DEFUN ("make-hash-table", Fmake_hash_table, Smake_hash_table, 0, MANY, 0,
5222 doc: /* Create and return a new hash table.
5224 Arguments are specified as keyword/argument pairs. The following
5225 arguments are defined:
5227 :test TEST -- TEST must be a symbol that specifies how to compare
5228 keys. Default is `eql'. Predefined are the tests `eq', `eql', and
5229 `equal'. User-supplied test and hash functions can be specified via
5230 `define-hash-table-test'.
5232 :size SIZE -- A hint as to how many elements will be put in the table.
5233 Default is 65.
5235 :rehash-size REHASH-SIZE - Indicates how to expand the table when it
5236 fills up. If REHASH-SIZE is an integer, add that many space. If it
5237 is a float, it must be > 1.0, and the new size is computed by
5238 multiplying the old size with that factor. Default is 1.5.
5240 :rehash-threshold THRESHOLD -- THRESHOLD must a float > 0, and <= 1.0.
5241 Resize the hash table when ratio of the number of entries in the
5242 table. Default is 0.8.
5244 :weakness WEAK -- WEAK must be one of nil, t, `key', `value',
5245 `key-or-value', or `key-and-value'. If WEAK is not nil, the table
5246 returned is a weak table. Key/value pairs are removed from a weak
5247 hash table when there are no non-weak references pointing to their
5248 key, value, one of key or value, or both key and value, depending on
5249 WEAK. WEAK t is equivalent to `key-and-value'. Default value of WEAK
5250 is nil.
5252 usage: (make-hash-table &rest KEYWORD-ARGS) */)
5253 (nargs, args)
5254 int nargs;
5255 Lisp_Object *args;
5257 Lisp_Object test, size, rehash_size, rehash_threshold, weak;
5258 Lisp_Object user_test, user_hash;
5259 char *used;
5260 int i;
5262 /* The vector `used' is used to keep track of arguments that
5263 have been consumed. */
5264 used = (char *) alloca (nargs * sizeof *used);
5265 bzero (used, nargs * sizeof *used);
5267 /* See if there's a `:test TEST' among the arguments. */
5268 i = get_key_arg (QCtest, nargs, args, used);
5269 test = i < 0 ? Qeql : args[i];
5270 if (!EQ (test, Qeq) && !EQ (test, Qeql) && !EQ (test, Qequal))
5272 /* See if it is a user-defined test. */
5273 Lisp_Object prop;
5275 prop = Fget (test, Qhash_table_test);
5276 if (!CONSP (prop) || !CONSP (XCDR (prop)))
5277 signal_error ("Invalid hash table test", test);
5278 user_test = XCAR (prop);
5279 user_hash = XCAR (XCDR (prop));
5281 else
5282 user_test = user_hash = Qnil;
5284 /* See if there's a `:size SIZE' argument. */
5285 i = get_key_arg (QCsize, nargs, args, used);
5286 size = i < 0 ? Qnil : args[i];
5287 if (NILP (size))
5288 size = make_number (DEFAULT_HASH_SIZE);
5289 else if (!INTEGERP (size) || XINT (size) < 0)
5290 signal_error ("Invalid hash table size", size);
5292 /* Look for `:rehash-size SIZE'. */
5293 i = get_key_arg (QCrehash_size, nargs, args, used);
5294 rehash_size = i < 0 ? make_float (DEFAULT_REHASH_SIZE) : args[i];
5295 if (!NUMBERP (rehash_size)
5296 || (INTEGERP (rehash_size) && XINT (rehash_size) <= 0)
5297 || XFLOATINT (rehash_size) <= 1.0)
5298 signal_error ("Invalid hash table rehash size", rehash_size);
5300 /* Look for `:rehash-threshold THRESHOLD'. */
5301 i = get_key_arg (QCrehash_threshold, nargs, args, used);
5302 rehash_threshold = i < 0 ? make_float (DEFAULT_REHASH_THRESHOLD) : args[i];
5303 if (!FLOATP (rehash_threshold)
5304 || XFLOATINT (rehash_threshold) <= 0.0
5305 || XFLOATINT (rehash_threshold) > 1.0)
5306 signal_error ("Invalid hash table rehash threshold", rehash_threshold);
5308 /* Look for `:weakness WEAK'. */
5309 i = get_key_arg (QCweakness, nargs, args, used);
5310 weak = i < 0 ? Qnil : args[i];
5311 if (EQ (weak, Qt))
5312 weak = Qkey_and_value;
5313 if (!NILP (weak)
5314 && !EQ (weak, Qkey)
5315 && !EQ (weak, Qvalue)
5316 && !EQ (weak, Qkey_or_value)
5317 && !EQ (weak, Qkey_and_value))
5318 signal_error ("Invalid hash table weakness", weak);
5320 /* Now, all args should have been used up, or there's a problem. */
5321 for (i = 0; i < nargs; ++i)
5322 if (!used[i])
5323 signal_error ("Invalid argument list", args[i]);
5325 return make_hash_table (test, size, rehash_size, rehash_threshold, weak,
5326 user_test, user_hash);
5330 DEFUN ("copy-hash-table", Fcopy_hash_table, Scopy_hash_table, 1, 1, 0,
5331 doc: /* Return a copy of hash table TABLE. */)
5332 (table)
5333 Lisp_Object table;
5335 return copy_hash_table (check_hash_table (table));
5339 DEFUN ("hash-table-count", Fhash_table_count, Shash_table_count, 1, 1, 0,
5340 doc: /* Return the number of elements in TABLE. */)
5341 (table)
5342 Lisp_Object table;
5344 return make_number (check_hash_table (table)->count);
5348 DEFUN ("hash-table-rehash-size", Fhash_table_rehash_size,
5349 Shash_table_rehash_size, 1, 1, 0,
5350 doc: /* Return the current rehash size of TABLE. */)
5351 (table)
5352 Lisp_Object table;
5354 return check_hash_table (table)->rehash_size;
5358 DEFUN ("hash-table-rehash-threshold", Fhash_table_rehash_threshold,
5359 Shash_table_rehash_threshold, 1, 1, 0,
5360 doc: /* Return the current rehash threshold of TABLE. */)
5361 (table)
5362 Lisp_Object table;
5364 return check_hash_table (table)->rehash_threshold;
5368 DEFUN ("hash-table-size", Fhash_table_size, Shash_table_size, 1, 1, 0,
5369 doc: /* Return the size of TABLE.
5370 The size can be used as an argument to `make-hash-table' to create
5371 a hash table than can hold as many elements of TABLE holds
5372 without need for resizing. */)
5373 (table)
5374 Lisp_Object table;
5376 struct Lisp_Hash_Table *h = check_hash_table (table);
5377 return make_number (HASH_TABLE_SIZE (h));
5381 DEFUN ("hash-table-test", Fhash_table_test, Shash_table_test, 1, 1, 0,
5382 doc: /* Return the test TABLE uses. */)
5383 (table)
5384 Lisp_Object table;
5386 return check_hash_table (table)->test;
5390 DEFUN ("hash-table-weakness", Fhash_table_weakness, Shash_table_weakness,
5391 1, 1, 0,
5392 doc: /* Return the weakness of TABLE. */)
5393 (table)
5394 Lisp_Object table;
5396 return check_hash_table (table)->weak;
5400 DEFUN ("hash-table-p", Fhash_table_p, Shash_table_p, 1, 1, 0,
5401 doc: /* Return t if OBJ is a Lisp hash table object. */)
5402 (obj)
5403 Lisp_Object obj;
5405 return HASH_TABLE_P (obj) ? Qt : Qnil;
5409 DEFUN ("clrhash", Fclrhash, Sclrhash, 1, 1, 0,
5410 doc: /* Clear hash table TABLE. */)
5411 (table)
5412 Lisp_Object table;
5414 hash_clear (check_hash_table (table));
5415 return Qnil;
5419 DEFUN ("gethash", Fgethash, Sgethash, 2, 3, 0,
5420 doc: /* Look up KEY in TABLE and return its associated value.
5421 If KEY is not found, return DFLT which defaults to nil. */)
5422 (key, table, dflt)
5423 Lisp_Object key, table, dflt;
5425 struct Lisp_Hash_Table *h = check_hash_table (table);
5426 int i = hash_lookup (h, key, NULL);
5427 return i >= 0 ? HASH_VALUE (h, i) : dflt;
5431 DEFUN ("puthash", Fputhash, Sputhash, 3, 3, 0,
5432 doc: /* Associate KEY with VALUE in hash table TABLE.
5433 If KEY is already present in table, replace its current value with
5434 VALUE. */)
5435 (key, value, table)
5436 Lisp_Object key, value, table;
5438 struct Lisp_Hash_Table *h = check_hash_table (table);
5439 int i;
5440 unsigned hash;
5442 i = hash_lookup (h, key, &hash);
5443 if (i >= 0)
5444 HASH_VALUE (h, i) = value;
5445 else
5446 hash_put (h, key, value, hash);
5448 return value;
5452 DEFUN ("remhash", Fremhash, Sremhash, 2, 2, 0,
5453 doc: /* Remove KEY from TABLE. */)
5454 (key, table)
5455 Lisp_Object key, table;
5457 struct Lisp_Hash_Table *h = check_hash_table (table);
5458 hash_remove (h, key);
5459 return Qnil;
5463 DEFUN ("maphash", Fmaphash, Smaphash, 2, 2, 0,
5464 doc: /* Call FUNCTION for all entries in hash table TABLE.
5465 FUNCTION is called with two arguments, KEY and VALUE. */)
5466 (function, table)
5467 Lisp_Object function, table;
5469 struct Lisp_Hash_Table *h = check_hash_table (table);
5470 Lisp_Object args[3];
5471 int i;
5473 for (i = 0; i < HASH_TABLE_SIZE (h); ++i)
5474 if (!NILP (HASH_HASH (h, i)))
5476 args[0] = function;
5477 args[1] = HASH_KEY (h, i);
5478 args[2] = HASH_VALUE (h, i);
5479 Ffuncall (3, args);
5482 return Qnil;
5486 DEFUN ("define-hash-table-test", Fdefine_hash_table_test,
5487 Sdefine_hash_table_test, 3, 3, 0,
5488 doc: /* Define a new hash table test with name NAME, a symbol.
5490 In hash tables created with NAME specified as test, use TEST to
5491 compare keys, and HASH for computing hash codes of keys.
5493 TEST must be a function taking two arguments and returning non-nil if
5494 both arguments are the same. HASH must be a function taking one
5495 argument and return an integer that is the hash code of the argument.
5496 Hash code computation should use the whole value range of integers,
5497 including negative integers. */)
5498 (name, test, hash)
5499 Lisp_Object name, test, hash;
5501 return Fput (name, Qhash_table_test, list2 (test, hash));
5506 /************************************************************************
5508 ************************************************************************/
5510 #include "md5.h"
5511 #include "coding.h"
5513 DEFUN ("md5", Fmd5, Smd5, 1, 5, 0,
5514 doc: /* Return MD5 message digest of OBJECT, a buffer or string.
5516 A message digest is a cryptographic checksum of a document, and the
5517 algorithm to calculate it is defined in RFC 1321.
5519 The two optional arguments START and END are character positions
5520 specifying for which part of OBJECT the message digest should be
5521 computed. If nil or omitted, the digest is computed for the whole
5522 OBJECT.
5524 The MD5 message digest is computed from the result of encoding the
5525 text in a coding system, not directly from the internal Emacs form of
5526 the text. The optional fourth argument CODING-SYSTEM specifies which
5527 coding system to encode the text with. It should be the same coding
5528 system that you used or will use when actually writing the text into a
5529 file.
5531 If CODING-SYSTEM is nil or omitted, the default depends on OBJECT. If
5532 OBJECT is a buffer, the default for CODING-SYSTEM is whatever coding
5533 system would be chosen by default for writing this text into a file.
5535 If OBJECT is a string, the most preferred coding system (see the
5536 command `prefer-coding-system') is used.
5538 If NOERROR is non-nil, silently assume the `raw-text' coding if the
5539 guesswork fails. Normally, an error is signaled in such case. */)
5540 (object, start, end, coding_system, noerror)
5541 Lisp_Object object, start, end, coding_system, noerror;
5543 unsigned char digest[16];
5544 unsigned char value[33];
5545 int i;
5546 int size;
5547 int size_byte = 0;
5548 int start_char = 0, end_char = 0;
5549 int start_byte = 0, end_byte = 0;
5550 register int b, e;
5551 register struct buffer *bp;
5552 int temp;
5554 if (STRINGP (object))
5556 if (NILP (coding_system))
5558 /* Decide the coding-system to encode the data with. */
5560 if (STRING_MULTIBYTE (object))
5561 /* use default, we can't guess correct value */
5562 coding_system = find_symbol_value (XCAR (Vcoding_category_list));
5563 else
5564 coding_system = Qraw_text;
5567 if (NILP (Fcoding_system_p (coding_system)))
5569 /* Invalid coding system. */
5571 if (!NILP (noerror))
5572 coding_system = Qraw_text;
5573 else
5574 xsignal1 (Qcoding_system_error, coding_system);
5577 if (STRING_MULTIBYTE (object))
5578 object = code_convert_string1 (object, coding_system, Qnil, 1);
5580 size = SCHARS (object);
5581 size_byte = SBYTES (object);
5583 if (!NILP (start))
5585 CHECK_NUMBER (start);
5587 start_char = XINT (start);
5589 if (start_char < 0)
5590 start_char += size;
5592 start_byte = string_char_to_byte (object, start_char);
5595 if (NILP (end))
5597 end_char = size;
5598 end_byte = size_byte;
5600 else
5602 CHECK_NUMBER (end);
5604 end_char = XINT (end);
5606 if (end_char < 0)
5607 end_char += size;
5609 end_byte = string_char_to_byte (object, end_char);
5612 if (!(0 <= start_char && start_char <= end_char && end_char <= size))
5613 args_out_of_range_3 (object, make_number (start_char),
5614 make_number (end_char));
5616 else
5618 struct buffer *prev = current_buffer;
5620 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
5622 CHECK_BUFFER (object);
5624 bp = XBUFFER (object);
5625 if (bp != current_buffer)
5626 set_buffer_internal (bp);
5628 if (NILP (start))
5629 b = BEGV;
5630 else
5632 CHECK_NUMBER_COERCE_MARKER (start);
5633 b = XINT (start);
5636 if (NILP (end))
5637 e = ZV;
5638 else
5640 CHECK_NUMBER_COERCE_MARKER (end);
5641 e = XINT (end);
5644 if (b > e)
5645 temp = b, b = e, e = temp;
5647 if (!(BEGV <= b && e <= ZV))
5648 args_out_of_range (start, end);
5650 if (NILP (coding_system))
5652 /* Decide the coding-system to encode the data with.
5653 See fileio.c:Fwrite-region */
5655 if (!NILP (Vcoding_system_for_write))
5656 coding_system = Vcoding_system_for_write;
5657 else
5659 int force_raw_text = 0;
5661 coding_system = XBUFFER (object)->buffer_file_coding_system;
5662 if (NILP (coding_system)
5663 || NILP (Flocal_variable_p (Qbuffer_file_coding_system, Qnil)))
5665 coding_system = Qnil;
5666 if (NILP (current_buffer->enable_multibyte_characters))
5667 force_raw_text = 1;
5670 if (NILP (coding_system) && !NILP (Fbuffer_file_name(object)))
5672 /* Check file-coding-system-alist. */
5673 Lisp_Object args[4], val;
5675 args[0] = Qwrite_region; args[1] = start; args[2] = end;
5676 args[3] = Fbuffer_file_name(object);
5677 val = Ffind_operation_coding_system (4, args);
5678 if (CONSP (val) && !NILP (XCDR (val)))
5679 coding_system = XCDR (val);
5682 if (NILP (coding_system)
5683 && !NILP (XBUFFER (object)->buffer_file_coding_system))
5685 /* If we still have not decided a coding system, use the
5686 default value of buffer-file-coding-system. */
5687 coding_system = XBUFFER (object)->buffer_file_coding_system;
5690 if (!force_raw_text
5691 && !NILP (Ffboundp (Vselect_safe_coding_system_function)))
5692 /* Confirm that VAL can surely encode the current region. */
5693 coding_system = call4 (Vselect_safe_coding_system_function,
5694 make_number (b), make_number (e),
5695 coding_system, Qnil);
5697 if (force_raw_text)
5698 coding_system = Qraw_text;
5701 if (NILP (Fcoding_system_p (coding_system)))
5703 /* Invalid coding system. */
5705 if (!NILP (noerror))
5706 coding_system = Qraw_text;
5707 else
5708 xsignal1 (Qcoding_system_error, coding_system);
5712 object = make_buffer_string (b, e, 0);
5713 if (prev != current_buffer)
5714 set_buffer_internal (prev);
5715 /* Discard the unwind protect for recovering the current
5716 buffer. */
5717 specpdl_ptr--;
5719 if (STRING_MULTIBYTE (object))
5720 object = code_convert_string1 (object, coding_system, Qnil, 1);
5723 md5_buffer (SDATA (object) + start_byte,
5724 SBYTES (object) - (size_byte - end_byte),
5725 digest);
5727 for (i = 0; i < 16; i++)
5728 sprintf (&value[2 * i], "%02x", digest[i]);
5729 value[32] = '\0';
5731 return make_string (value, 32);
5735 void
5736 syms_of_fns ()
5738 /* Hash table stuff. */
5739 Qhash_table_p = intern ("hash-table-p");
5740 staticpro (&Qhash_table_p);
5741 Qeq = intern ("eq");
5742 staticpro (&Qeq);
5743 Qeql = intern ("eql");
5744 staticpro (&Qeql);
5745 Qequal = intern ("equal");
5746 staticpro (&Qequal);
5747 QCtest = intern (":test");
5748 staticpro (&QCtest);
5749 QCsize = intern (":size");
5750 staticpro (&QCsize);
5751 QCrehash_size = intern (":rehash-size");
5752 staticpro (&QCrehash_size);
5753 QCrehash_threshold = intern (":rehash-threshold");
5754 staticpro (&QCrehash_threshold);
5755 QCweakness = intern (":weakness");
5756 staticpro (&QCweakness);
5757 Qkey = intern ("key");
5758 staticpro (&Qkey);
5759 Qvalue = intern ("value");
5760 staticpro (&Qvalue);
5761 Qhash_table_test = intern ("hash-table-test");
5762 staticpro (&Qhash_table_test);
5763 Qkey_or_value = intern ("key-or-value");
5764 staticpro (&Qkey_or_value);
5765 Qkey_and_value = intern ("key-and-value");
5766 staticpro (&Qkey_and_value);
5768 defsubr (&Ssxhash);
5769 defsubr (&Smake_hash_table);
5770 defsubr (&Scopy_hash_table);
5771 defsubr (&Shash_table_count);
5772 defsubr (&Shash_table_rehash_size);
5773 defsubr (&Shash_table_rehash_threshold);
5774 defsubr (&Shash_table_size);
5775 defsubr (&Shash_table_test);
5776 defsubr (&Shash_table_weakness);
5777 defsubr (&Shash_table_p);
5778 defsubr (&Sclrhash);
5779 defsubr (&Sgethash);
5780 defsubr (&Sputhash);
5781 defsubr (&Sremhash);
5782 defsubr (&Smaphash);
5783 defsubr (&Sdefine_hash_table_test);
5785 Qstring_lessp = intern ("string-lessp");
5786 staticpro (&Qstring_lessp);
5787 Qprovide = intern ("provide");
5788 staticpro (&Qprovide);
5789 Qrequire = intern ("require");
5790 staticpro (&Qrequire);
5791 Qyes_or_no_p_history = intern ("yes-or-no-p-history");
5792 staticpro (&Qyes_or_no_p_history);
5793 Qcursor_in_echo_area = intern ("cursor-in-echo-area");
5794 staticpro (&Qcursor_in_echo_area);
5795 Qwidget_type = intern ("widget-type");
5796 staticpro (&Qwidget_type);
5798 staticpro (&string_char_byte_cache_string);
5799 string_char_byte_cache_string = Qnil;
5801 require_nesting_list = Qnil;
5802 staticpro (&require_nesting_list);
5804 Fset (Qyes_or_no_p_history, Qnil);
5806 DEFVAR_LISP ("features", &Vfeatures,
5807 doc: /* A list of symbols which are the features of the executing Emacs.
5808 Used by `featurep' and `require', and altered by `provide'. */);
5809 Vfeatures = Fcons (intern ("emacs"), Qnil);
5810 Qsubfeatures = intern ("subfeatures");
5811 staticpro (&Qsubfeatures);
5813 #ifdef HAVE_LANGINFO_CODESET
5814 Qcodeset = intern ("codeset");
5815 staticpro (&Qcodeset);
5816 Qdays = intern ("days");
5817 staticpro (&Qdays);
5818 Qmonths = intern ("months");
5819 staticpro (&Qmonths);
5820 Qpaper = intern ("paper");
5821 staticpro (&Qpaper);
5822 #endif /* HAVE_LANGINFO_CODESET */
5824 DEFVAR_BOOL ("use-dialog-box", &use_dialog_box,
5825 doc: /* *Non-nil means mouse commands use dialog boxes to ask questions.
5826 This applies to `y-or-n-p' and `yes-or-no-p' questions asked by commands
5827 invoked by mouse clicks and mouse menu items. */);
5828 use_dialog_box = 1;
5830 DEFVAR_BOOL ("use-file-dialog", &use_file_dialog,
5831 doc: /* *Non-nil means mouse commands use a file dialog to ask for files.
5832 This applies to commands from menus and tool bar buttons. The value of
5833 `use-dialog-box' takes precedence over this variable, so a file dialog is only
5834 used if both `use-dialog-box' and this variable are non-nil. */);
5835 use_file_dialog = 1;
5837 defsubr (&Sidentity);
5838 defsubr (&Srandom);
5839 defsubr (&Slength);
5840 defsubr (&Ssafe_length);
5841 defsubr (&Sstring_bytes);
5842 defsubr (&Sstring_equal);
5843 defsubr (&Scompare_strings);
5844 defsubr (&Sstring_lessp);
5845 defsubr (&Sappend);
5846 defsubr (&Sconcat);
5847 defsubr (&Svconcat);
5848 defsubr (&Scopy_sequence);
5849 defsubr (&Sstring_make_multibyte);
5850 defsubr (&Sstring_make_unibyte);
5851 defsubr (&Sstring_as_multibyte);
5852 defsubr (&Sstring_as_unibyte);
5853 defsubr (&Sstring_to_multibyte);
5854 defsubr (&Scopy_alist);
5855 defsubr (&Ssubstring);
5856 defsubr (&Ssubstring_no_properties);
5857 defsubr (&Snthcdr);
5858 defsubr (&Snth);
5859 defsubr (&Selt);
5860 defsubr (&Smember);
5861 defsubr (&Smemq);
5862 defsubr (&Smemql);
5863 defsubr (&Sassq);
5864 defsubr (&Sassoc);
5865 defsubr (&Srassq);
5866 defsubr (&Srassoc);
5867 defsubr (&Sdelq);
5868 defsubr (&Sdelete);
5869 defsubr (&Snreverse);
5870 defsubr (&Sreverse);
5871 defsubr (&Ssort);
5872 defsubr (&Splist_get);
5873 defsubr (&Sget);
5874 defsubr (&Splist_put);
5875 defsubr (&Sput);
5876 defsubr (&Slax_plist_get);
5877 defsubr (&Slax_plist_put);
5878 defsubr (&Seql);
5879 defsubr (&Sequal);
5880 defsubr (&Sequal_including_properties);
5881 defsubr (&Sfillarray);
5882 defsubr (&Sclear_string);
5883 defsubr (&Schar_table_subtype);
5884 defsubr (&Schar_table_parent);
5885 defsubr (&Sset_char_table_parent);
5886 defsubr (&Schar_table_extra_slot);
5887 defsubr (&Sset_char_table_extra_slot);
5888 defsubr (&Schar_table_range);
5889 defsubr (&Sset_char_table_range);
5890 defsubr (&Sset_char_table_default);
5891 defsubr (&Soptimize_char_table);
5892 defsubr (&Smap_char_table);
5893 defsubr (&Snconc);
5894 defsubr (&Smapcar);
5895 defsubr (&Smapc);
5896 defsubr (&Smapconcat);
5897 defsubr (&Sy_or_n_p);
5898 defsubr (&Syes_or_no_p);
5899 defsubr (&Sload_average);
5900 defsubr (&Sfeaturep);
5901 defsubr (&Srequire);
5902 defsubr (&Sprovide);
5903 defsubr (&Splist_member);
5904 defsubr (&Swidget_put);
5905 defsubr (&Swidget_get);
5906 defsubr (&Swidget_apply);
5907 defsubr (&Sbase64_encode_region);
5908 defsubr (&Sbase64_decode_region);
5909 defsubr (&Sbase64_encode_string);
5910 defsubr (&Sbase64_decode_string);
5911 defsubr (&Smd5);
5912 defsubr (&Slocale_info);
5916 void
5917 init_fns ()
5919 weak_hash_tables = NULL;
5922 /* arch-tag: 787f8219-5b74-46bd-8469-7e1cc475fa31
5923 (do not change this comment) */