(postscript, ps-print, ps-print-horizontal, ps-print-vertical, ps-print-headers,
[emacs.git] / src / fns.c
blob7365aa05e7920c4ceeffec5022202f20bc32700b
1 /* Random utility Lisp functions.
2 Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1997, 1998, 1999, 2000,
3 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
5 This file is part of GNU Emacs.
7 GNU Emacs is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs; see the file COPYING. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
22 #include <config.h>
24 #ifdef HAVE_UNISTD_H
25 #include <unistd.h>
26 #endif
27 #include <time.h>
29 #ifndef MAC_OS
30 /* On Mac OS, defining this conflicts with precompiled headers. */
32 /* Note on some machines this defines `vector' as a typedef,
33 so make sure we don't use that name in this file. */
34 #undef vector
35 #define vector *****
37 #endif /* ! MAC_OSX */
39 #include "lisp.h"
40 #include "commands.h"
41 #include "charset.h"
42 #include "coding.h"
43 #include "buffer.h"
44 #include "keyboard.h"
45 #include "keymap.h"
46 #include "intervals.h"
47 #include "frame.h"
48 #include "window.h"
49 #include "blockinput.h"
50 #if defined (HAVE_MENUS) && defined (HAVE_X_WINDOWS)
51 #include "xterm.h"
52 #endif
54 #ifndef NULL
55 #define NULL ((POINTER_TYPE *)0)
56 #endif
58 /* Nonzero enables use of dialog boxes for questions
59 asked by mouse commands. */
60 int use_dialog_box;
62 /* Nonzero enables use of a file dialog for file name
63 questions asked by mouse commands. */
64 int use_file_dialog;
66 extern int minibuffer_auto_raise;
67 extern Lisp_Object minibuf_window;
68 extern Lisp_Object Vlocale_coding_system;
69 extern int load_in_progress;
71 Lisp_Object Qstring_lessp, Qprovide, Qrequire;
72 Lisp_Object Qyes_or_no_p_history;
73 Lisp_Object Qcursor_in_echo_area;
74 Lisp_Object Qwidget_type;
75 Lisp_Object Qcodeset, Qdays, Qmonths, Qpaper;
77 extern Lisp_Object Qinput_method_function;
79 static int internal_equal ();
81 extern long get_random ();
82 extern void seed_random ();
84 #ifndef HAVE_UNISTD_H
85 extern long time ();
86 #endif
88 DEFUN ("identity", Fidentity, Sidentity, 1, 1, 0,
89 doc: /* Return the argument unchanged. */)
90 (arg)
91 Lisp_Object arg;
93 return arg;
96 DEFUN ("random", Frandom, Srandom, 0, 1, 0,
97 doc: /* Return a pseudo-random number.
98 All integers representable in Lisp are equally likely.
99 On most systems, this is 29 bits' worth.
100 With positive integer argument N, return random number in interval [0,N).
101 With argument t, set the random number seed from the current time and pid. */)
103 Lisp_Object n;
105 EMACS_INT val;
106 Lisp_Object lispy_val;
107 unsigned long denominator;
109 if (EQ (n, Qt))
110 seed_random (getpid () + time (NULL));
111 if (NATNUMP (n) && XFASTINT (n) != 0)
113 /* Try to take our random number from the higher bits of VAL,
114 not the lower, since (says Gentzel) the low bits of `random'
115 are less random than the higher ones. We do this by using the
116 quotient rather than the remainder. At the high end of the RNG
117 it's possible to get a quotient larger than n; discarding
118 these values eliminates the bias that would otherwise appear
119 when using a large n. */
120 denominator = ((unsigned long)1 << VALBITS) / XFASTINT (n);
122 val = get_random () / denominator;
123 while (val >= XFASTINT (n));
125 else
126 val = get_random ();
127 XSETINT (lispy_val, val);
128 return lispy_val;
131 /* Random data-structure functions */
133 DEFUN ("length", Flength, Slength, 1, 1, 0,
134 doc: /* Return the length of vector, list or string SEQUENCE.
135 A byte-code function object is also allowed.
136 If the string contains multibyte characters, this is not necessarily
137 the number of bytes in the string; it is the number of characters.
138 To get the number of bytes, use `string-bytes'. */)
139 (sequence)
140 register Lisp_Object sequence;
142 register Lisp_Object val;
143 register int i;
145 retry:
146 if (STRINGP (sequence))
147 XSETFASTINT (val, SCHARS (sequence));
148 else if (VECTORP (sequence))
149 XSETFASTINT (val, XVECTOR (sequence)->size);
150 else if (SUB_CHAR_TABLE_P (sequence))
151 XSETFASTINT (val, SUB_CHAR_TABLE_ORDINARY_SLOTS);
152 else if (CHAR_TABLE_P (sequence))
153 XSETFASTINT (val, MAX_CHAR);
154 else if (BOOL_VECTOR_P (sequence))
155 XSETFASTINT (val, XBOOL_VECTOR (sequence)->size);
156 else if (COMPILEDP (sequence))
157 XSETFASTINT (val, XVECTOR (sequence)->size & PSEUDOVECTOR_SIZE_MASK);
158 else if (CONSP (sequence))
160 i = 0;
161 while (CONSP (sequence))
163 sequence = XCDR (sequence);
164 ++i;
166 if (!CONSP (sequence))
167 break;
169 sequence = XCDR (sequence);
170 ++i;
171 QUIT;
174 if (!NILP (sequence))
175 wrong_type_argument (Qlistp, sequence);
177 val = make_number (i);
179 else if (NILP (sequence))
180 XSETFASTINT (val, 0);
181 else
183 sequence = wrong_type_argument (Qsequencep, sequence);
184 goto retry;
186 return val;
189 /* This does not check for quits. That is safe since it must terminate. */
191 DEFUN ("safe-length", Fsafe_length, Ssafe_length, 1, 1, 0,
192 doc: /* Return the length of a list, but avoid error or infinite loop.
193 This function never gets an error. If LIST is not really a list,
194 it returns 0. If LIST is circular, it returns a finite value
195 which is at least the number of distinct elements. */)
196 (list)
197 Lisp_Object list;
199 Lisp_Object tail, halftail, length;
200 int len = 0;
202 /* halftail is used to detect circular lists. */
203 halftail = list;
204 for (tail = list; CONSP (tail); tail = XCDR (tail))
206 if (EQ (tail, halftail) && len != 0)
207 break;
208 len++;
209 if ((len & 1) == 0)
210 halftail = XCDR (halftail);
213 XSETINT (length, len);
214 return length;
217 DEFUN ("string-bytes", Fstring_bytes, Sstring_bytes, 1, 1, 0,
218 doc: /* Return the number of bytes in STRING.
219 If STRING is a multibyte string, this is greater than the length of STRING. */)
220 (string)
221 Lisp_Object string;
223 CHECK_STRING (string);
224 return make_number (SBYTES (string));
227 DEFUN ("string-equal", Fstring_equal, Sstring_equal, 2, 2, 0,
228 doc: /* Return t if two strings have identical contents.
229 Case is significant, but text properties are ignored.
230 Symbols are also allowed; their print names are used instead. */)
231 (s1, s2)
232 register Lisp_Object s1, s2;
234 if (SYMBOLP (s1))
235 s1 = SYMBOL_NAME (s1);
236 if (SYMBOLP (s2))
237 s2 = SYMBOL_NAME (s2);
238 CHECK_STRING (s1);
239 CHECK_STRING (s2);
241 if (SCHARS (s1) != SCHARS (s2)
242 || SBYTES (s1) != SBYTES (s2)
243 || bcmp (SDATA (s1), SDATA (s2), SBYTES (s1)))
244 return Qnil;
245 return Qt;
248 DEFUN ("compare-strings", Fcompare_strings,
249 Scompare_strings, 6, 7, 0,
250 doc: /* Compare the contents of two strings, converting to multibyte if needed.
251 In string STR1, skip the first START1 characters and stop at END1.
252 In string STR2, skip the first START2 characters and stop at END2.
253 END1 and END2 default to the full lengths of the respective strings.
255 Case is significant in this comparison if IGNORE-CASE is nil.
256 Unibyte strings are converted to multibyte for comparison.
258 The value is t if the strings (or specified portions) match.
259 If string STR1 is less, the value is a negative number N;
260 - 1 - N is the number of characters that match at the beginning.
261 If string STR1 is greater, the value is a positive number N;
262 N - 1 is the number of characters that match at the beginning. */)
263 (str1, start1, end1, str2, start2, end2, ignore_case)
264 Lisp_Object str1, start1, end1, start2, str2, end2, ignore_case;
266 register int end1_char, end2_char;
267 register int i1, i1_byte, i2, i2_byte;
269 CHECK_STRING (str1);
270 CHECK_STRING (str2);
271 if (NILP (start1))
272 start1 = make_number (0);
273 if (NILP (start2))
274 start2 = make_number (0);
275 CHECK_NATNUM (start1);
276 CHECK_NATNUM (start2);
277 if (! NILP (end1))
278 CHECK_NATNUM (end1);
279 if (! NILP (end2))
280 CHECK_NATNUM (end2);
282 i1 = XINT (start1);
283 i2 = XINT (start2);
285 i1_byte = string_char_to_byte (str1, i1);
286 i2_byte = string_char_to_byte (str2, i2);
288 end1_char = SCHARS (str1);
289 if (! NILP (end1) && end1_char > XINT (end1))
290 end1_char = XINT (end1);
292 end2_char = SCHARS (str2);
293 if (! NILP (end2) && end2_char > XINT (end2))
294 end2_char = XINT (end2);
296 while (i1 < end1_char && i2 < end2_char)
298 /* When we find a mismatch, we must compare the
299 characters, not just the bytes. */
300 int c1, c2;
302 if (STRING_MULTIBYTE (str1))
303 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c1, str1, i1, i1_byte);
304 else
306 c1 = SREF (str1, i1++);
307 c1 = unibyte_char_to_multibyte (c1);
310 if (STRING_MULTIBYTE (str2))
311 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c2, str2, i2, i2_byte);
312 else
314 c2 = SREF (str2, i2++);
315 c2 = unibyte_char_to_multibyte (c2);
318 if (c1 == c2)
319 continue;
321 if (! NILP (ignore_case))
323 Lisp_Object tem;
325 tem = Fupcase (make_number (c1));
326 c1 = XINT (tem);
327 tem = Fupcase (make_number (c2));
328 c2 = XINT (tem);
331 if (c1 == c2)
332 continue;
334 /* Note that I1 has already been incremented
335 past the character that we are comparing;
336 hence we don't add or subtract 1 here. */
337 if (c1 < c2)
338 return make_number (- i1 + XINT (start1));
339 else
340 return make_number (i1 - XINT (start1));
343 if (i1 < end1_char)
344 return make_number (i1 - XINT (start1) + 1);
345 if (i2 < end2_char)
346 return make_number (- i1 + XINT (start1) - 1);
348 return Qt;
351 DEFUN ("string-lessp", Fstring_lessp, Sstring_lessp, 2, 2, 0,
352 doc: /* Return t if first arg string is less than second in lexicographic order.
353 Case is significant.
354 Symbols are also allowed; their print names are used instead. */)
355 (s1, s2)
356 register Lisp_Object s1, s2;
358 register int end;
359 register int i1, i1_byte, i2, i2_byte;
361 if (SYMBOLP (s1))
362 s1 = SYMBOL_NAME (s1);
363 if (SYMBOLP (s2))
364 s2 = SYMBOL_NAME (s2);
365 CHECK_STRING (s1);
366 CHECK_STRING (s2);
368 i1 = i1_byte = i2 = i2_byte = 0;
370 end = SCHARS (s1);
371 if (end > SCHARS (s2))
372 end = SCHARS (s2);
374 while (i1 < end)
376 /* When we find a mismatch, we must compare the
377 characters, not just the bytes. */
378 int c1, c2;
380 FETCH_STRING_CHAR_ADVANCE (c1, s1, i1, i1_byte);
381 FETCH_STRING_CHAR_ADVANCE (c2, s2, i2, i2_byte);
383 if (c1 != c2)
384 return c1 < c2 ? Qt : Qnil;
386 return i1 < SCHARS (s2) ? Qt : Qnil;
389 static Lisp_Object concat ();
391 /* ARGSUSED */
392 Lisp_Object
393 concat2 (s1, s2)
394 Lisp_Object s1, s2;
396 #ifdef NO_ARG_ARRAY
397 Lisp_Object args[2];
398 args[0] = s1;
399 args[1] = s2;
400 return concat (2, args, Lisp_String, 0);
401 #else
402 return concat (2, &s1, Lisp_String, 0);
403 #endif /* NO_ARG_ARRAY */
406 /* ARGSUSED */
407 Lisp_Object
408 concat3 (s1, s2, s3)
409 Lisp_Object s1, s2, s3;
411 #ifdef NO_ARG_ARRAY
412 Lisp_Object args[3];
413 args[0] = s1;
414 args[1] = s2;
415 args[2] = s3;
416 return concat (3, args, Lisp_String, 0);
417 #else
418 return concat (3, &s1, Lisp_String, 0);
419 #endif /* NO_ARG_ARRAY */
422 DEFUN ("append", Fappend, Sappend, 0, MANY, 0,
423 doc: /* Concatenate all the arguments and make the result a list.
424 The result is a list whose elements are the elements of all the arguments.
425 Each argument may be a list, vector or string.
426 The last argument is not copied, just used as the tail of the new list.
427 usage: (append &rest SEQUENCES) */)
428 (nargs, args)
429 int nargs;
430 Lisp_Object *args;
432 return concat (nargs, args, Lisp_Cons, 1);
435 DEFUN ("concat", Fconcat, Sconcat, 0, MANY, 0,
436 doc: /* Concatenate all the arguments and make the result a string.
437 The result is a string whose elements are the elements of all the arguments.
438 Each argument may be a string or a list or vector of characters (integers).
439 usage: (concat &rest SEQUENCES) */)
440 (nargs, args)
441 int nargs;
442 Lisp_Object *args;
444 return concat (nargs, args, Lisp_String, 0);
447 DEFUN ("vconcat", Fvconcat, Svconcat, 0, MANY, 0,
448 doc: /* Concatenate all the arguments and make the result a vector.
449 The result is a vector whose elements are the elements of all the arguments.
450 Each argument may be a list, vector or string.
451 usage: (vconcat &rest SEQUENCES) */)
452 (nargs, args)
453 int nargs;
454 Lisp_Object *args;
456 return concat (nargs, args, Lisp_Vectorlike, 0);
459 /* Return a copy of a sub char table ARG. The elements except for a
460 nested sub char table are not copied. */
461 static Lisp_Object
462 copy_sub_char_table (arg)
463 Lisp_Object arg;
465 Lisp_Object copy = make_sub_char_table (Qnil);
466 int i;
468 XCHAR_TABLE (copy)->defalt = XCHAR_TABLE (arg)->defalt;
469 /* Copy all the contents. */
470 bcopy (XCHAR_TABLE (arg)->contents, XCHAR_TABLE (copy)->contents,
471 SUB_CHAR_TABLE_ORDINARY_SLOTS * sizeof (Lisp_Object));
472 /* Recursively copy any sub char-tables in the ordinary slots. */
473 for (i = 32; i < SUB_CHAR_TABLE_ORDINARY_SLOTS; i++)
474 if (SUB_CHAR_TABLE_P (XCHAR_TABLE (arg)->contents[i]))
475 XCHAR_TABLE (copy)->contents[i]
476 = copy_sub_char_table (XCHAR_TABLE (copy)->contents[i]);
478 return copy;
482 DEFUN ("copy-sequence", Fcopy_sequence, Scopy_sequence, 1, 1, 0,
483 doc: /* Return a copy of a list, vector, string or char-table.
484 The elements of a list or vector are not copied; they are shared
485 with the original. */)
486 (arg)
487 Lisp_Object arg;
489 if (NILP (arg)) return arg;
491 if (CHAR_TABLE_P (arg))
493 int i;
494 Lisp_Object copy;
496 copy = Fmake_char_table (XCHAR_TABLE (arg)->purpose, Qnil);
497 /* Copy all the slots, including the extra ones. */
498 bcopy (XVECTOR (arg)->contents, XVECTOR (copy)->contents,
499 ((XCHAR_TABLE (arg)->size & PSEUDOVECTOR_SIZE_MASK)
500 * sizeof (Lisp_Object)));
502 /* Recursively copy any sub char tables in the ordinary slots
503 for multibyte characters. */
504 for (i = CHAR_TABLE_SINGLE_BYTE_SLOTS;
505 i < CHAR_TABLE_ORDINARY_SLOTS; i++)
506 if (SUB_CHAR_TABLE_P (XCHAR_TABLE (arg)->contents[i]))
507 XCHAR_TABLE (copy)->contents[i]
508 = copy_sub_char_table (XCHAR_TABLE (copy)->contents[i]);
510 return copy;
513 if (BOOL_VECTOR_P (arg))
515 Lisp_Object val;
516 int size_in_chars
517 = ((XBOOL_VECTOR (arg)->size + BOOL_VECTOR_BITS_PER_CHAR - 1)
518 / BOOL_VECTOR_BITS_PER_CHAR);
520 val = Fmake_bool_vector (Flength (arg), Qnil);
521 bcopy (XBOOL_VECTOR (arg)->data, XBOOL_VECTOR (val)->data,
522 size_in_chars);
523 return val;
526 if (!CONSP (arg) && !VECTORP (arg) && !STRINGP (arg))
527 arg = wrong_type_argument (Qsequencep, arg);
528 return concat (1, &arg, CONSP (arg) ? Lisp_Cons : XTYPE (arg), 0);
531 /* This structure holds information of an argument of `concat' that is
532 a string and has text properties to be copied. */
533 struct textprop_rec
535 int argnum; /* refer to ARGS (arguments of `concat') */
536 int from; /* refer to ARGS[argnum] (argument string) */
537 int to; /* refer to VAL (the target string) */
540 static Lisp_Object
541 concat (nargs, args, target_type, last_special)
542 int nargs;
543 Lisp_Object *args;
544 enum Lisp_Type target_type;
545 int last_special;
547 Lisp_Object val;
548 register Lisp_Object tail;
549 register Lisp_Object this;
550 int toindex;
551 int toindex_byte = 0;
552 register int result_len;
553 register int result_len_byte;
554 register int argnum;
555 Lisp_Object last_tail;
556 Lisp_Object prev;
557 int some_multibyte;
558 /* When we make a multibyte string, we can't copy text properties
559 while concatinating each string because the length of resulting
560 string can't be decided until we finish the whole concatination.
561 So, we record strings that have text properties to be copied
562 here, and copy the text properties after the concatination. */
563 struct textprop_rec *textprops = NULL;
564 /* Number of elments in textprops. */
565 int num_textprops = 0;
566 USE_SAFE_ALLOCA;
568 tail = Qnil;
570 /* In append, the last arg isn't treated like the others */
571 if (last_special && nargs > 0)
573 nargs--;
574 last_tail = args[nargs];
576 else
577 last_tail = Qnil;
579 /* Canonicalize each argument. */
580 for (argnum = 0; argnum < nargs; argnum++)
582 this = args[argnum];
583 if (!(CONSP (this) || NILP (this) || VECTORP (this) || STRINGP (this)
584 || COMPILEDP (this) || BOOL_VECTOR_P (this)))
586 args[argnum] = wrong_type_argument (Qsequencep, this);
590 /* Compute total length in chars of arguments in RESULT_LEN.
591 If desired output is a string, also compute length in bytes
592 in RESULT_LEN_BYTE, and determine in SOME_MULTIBYTE
593 whether the result should be a multibyte string. */
594 result_len_byte = 0;
595 result_len = 0;
596 some_multibyte = 0;
597 for (argnum = 0; argnum < nargs; argnum++)
599 int len;
600 this = args[argnum];
601 len = XFASTINT (Flength (this));
602 if (target_type == Lisp_String)
604 /* We must count the number of bytes needed in the string
605 as well as the number of characters. */
606 int i;
607 Lisp_Object ch;
608 int this_len_byte;
610 if (VECTORP (this))
611 for (i = 0; i < len; i++)
613 ch = XVECTOR (this)->contents[i];
614 if (! INTEGERP (ch))
615 wrong_type_argument (Qintegerp, ch);
616 this_len_byte = CHAR_BYTES (XINT (ch));
617 result_len_byte += this_len_byte;
618 if (!SINGLE_BYTE_CHAR_P (XINT (ch)))
619 some_multibyte = 1;
621 else if (BOOL_VECTOR_P (this) && XBOOL_VECTOR (this)->size > 0)
622 wrong_type_argument (Qintegerp, Faref (this, make_number (0)));
623 else if (CONSP (this))
624 for (; CONSP (this); this = XCDR (this))
626 ch = XCAR (this);
627 if (! INTEGERP (ch))
628 wrong_type_argument (Qintegerp, ch);
629 this_len_byte = CHAR_BYTES (XINT (ch));
630 result_len_byte += this_len_byte;
631 if (!SINGLE_BYTE_CHAR_P (XINT (ch)))
632 some_multibyte = 1;
634 else if (STRINGP (this))
636 if (STRING_MULTIBYTE (this))
638 some_multibyte = 1;
639 result_len_byte += SBYTES (this);
641 else
642 result_len_byte += count_size_as_multibyte (SDATA (this),
643 SCHARS (this));
647 result_len += len;
650 if (! some_multibyte)
651 result_len_byte = result_len;
653 /* Create the output object. */
654 if (target_type == Lisp_Cons)
655 val = Fmake_list (make_number (result_len), Qnil);
656 else if (target_type == Lisp_Vectorlike)
657 val = Fmake_vector (make_number (result_len), Qnil);
658 else if (some_multibyte)
659 val = make_uninit_multibyte_string (result_len, result_len_byte);
660 else
661 val = make_uninit_string (result_len);
663 /* In `append', if all but last arg are nil, return last arg. */
664 if (target_type == Lisp_Cons && EQ (val, Qnil))
665 return last_tail;
667 /* Copy the contents of the args into the result. */
668 if (CONSP (val))
669 tail = val, toindex = -1; /* -1 in toindex is flag we are making a list */
670 else
671 toindex = 0, toindex_byte = 0;
673 prev = Qnil;
674 if (STRINGP (val))
675 SAFE_ALLOCA (textprops, struct textprop_rec *, sizeof (struct textprop_rec) * nargs);
677 for (argnum = 0; argnum < nargs; argnum++)
679 Lisp_Object thislen;
680 int thisleni = 0;
681 register unsigned int thisindex = 0;
682 register unsigned int thisindex_byte = 0;
684 this = args[argnum];
685 if (!CONSP (this))
686 thislen = Flength (this), thisleni = XINT (thislen);
688 /* Between strings of the same kind, copy fast. */
689 if (STRINGP (this) && STRINGP (val)
690 && STRING_MULTIBYTE (this) == some_multibyte)
692 int thislen_byte = SBYTES (this);
694 bcopy (SDATA (this), SDATA (val) + toindex_byte,
695 SBYTES (this));
696 if (! NULL_INTERVAL_P (STRING_INTERVALS (this)))
698 textprops[num_textprops].argnum = argnum;
699 textprops[num_textprops].from = 0;
700 textprops[num_textprops++].to = toindex;
702 toindex_byte += thislen_byte;
703 toindex += thisleni;
704 STRING_SET_CHARS (val, SCHARS (val));
706 /* Copy a single-byte string to a multibyte string. */
707 else if (STRINGP (this) && STRINGP (val))
709 if (! NULL_INTERVAL_P (STRING_INTERVALS (this)))
711 textprops[num_textprops].argnum = argnum;
712 textprops[num_textprops].from = 0;
713 textprops[num_textprops++].to = toindex;
715 toindex_byte += copy_text (SDATA (this),
716 SDATA (val) + toindex_byte,
717 SCHARS (this), 0, 1);
718 toindex += thisleni;
720 else
721 /* Copy element by element. */
722 while (1)
724 register Lisp_Object elt;
726 /* Fetch next element of `this' arg into `elt', or break if
727 `this' is exhausted. */
728 if (NILP (this)) break;
729 if (CONSP (this))
730 elt = XCAR (this), this = XCDR (this);
731 else if (thisindex >= thisleni)
732 break;
733 else if (STRINGP (this))
735 int c;
736 if (STRING_MULTIBYTE (this))
738 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c, this,
739 thisindex,
740 thisindex_byte);
741 XSETFASTINT (elt, c);
743 else
745 XSETFASTINT (elt, SREF (this, thisindex)); thisindex++;
746 if (some_multibyte
747 && (XINT (elt) >= 0240
748 || (XINT (elt) >= 0200
749 && ! NILP (Vnonascii_translation_table)))
750 && XINT (elt) < 0400)
752 c = unibyte_char_to_multibyte (XINT (elt));
753 XSETINT (elt, c);
757 else if (BOOL_VECTOR_P (this))
759 int byte;
760 byte = XBOOL_VECTOR (this)->data[thisindex / BOOL_VECTOR_BITS_PER_CHAR];
761 if (byte & (1 << (thisindex % BOOL_VECTOR_BITS_PER_CHAR)))
762 elt = Qt;
763 else
764 elt = Qnil;
765 thisindex++;
767 else
768 elt = XVECTOR (this)->contents[thisindex++];
770 /* Store this element into the result. */
771 if (toindex < 0)
773 XSETCAR (tail, elt);
774 prev = tail;
775 tail = XCDR (tail);
777 else if (VECTORP (val))
778 XVECTOR (val)->contents[toindex++] = elt;
779 else
781 CHECK_NUMBER (elt);
782 if (SINGLE_BYTE_CHAR_P (XINT (elt)))
784 if (some_multibyte)
785 toindex_byte
786 += CHAR_STRING (XINT (elt),
787 SDATA (val) + toindex_byte);
788 else
789 SSET (val, toindex_byte++, XINT (elt));
790 toindex++;
792 else
793 /* If we have any multibyte characters,
794 we already decided to make a multibyte string. */
796 int c = XINT (elt);
797 /* P exists as a variable
798 to avoid a bug on the Masscomp C compiler. */
799 unsigned char *p = SDATA (val) + toindex_byte;
801 toindex_byte += CHAR_STRING (c, p);
802 toindex++;
807 if (!NILP (prev))
808 XSETCDR (prev, last_tail);
810 if (num_textprops > 0)
812 Lisp_Object props;
813 int last_to_end = -1;
815 for (argnum = 0; argnum < num_textprops; argnum++)
817 this = args[textprops[argnum].argnum];
818 props = text_property_list (this,
819 make_number (0),
820 make_number (SCHARS (this)),
821 Qnil);
822 /* If successive arguments have properites, be sure that the
823 value of `composition' property be the copy. */
824 if (last_to_end == textprops[argnum].to)
825 make_composition_value_copy (props);
826 add_text_properties_from_list (val, props,
827 make_number (textprops[argnum].to));
828 last_to_end = textprops[argnum].to + SCHARS (this);
832 SAFE_FREE ();
833 return val;
836 static Lisp_Object string_char_byte_cache_string;
837 static int string_char_byte_cache_charpos;
838 static int string_char_byte_cache_bytepos;
840 void
841 clear_string_char_byte_cache ()
843 string_char_byte_cache_string = Qnil;
846 /* Return the character index corresponding to CHAR_INDEX in STRING. */
849 string_char_to_byte (string, char_index)
850 Lisp_Object string;
851 int char_index;
853 int i, i_byte;
854 int best_below, best_below_byte;
855 int best_above, best_above_byte;
857 best_below = best_below_byte = 0;
858 best_above = SCHARS (string);
859 best_above_byte = SBYTES (string);
860 if (best_above == best_above_byte)
861 return char_index;
863 if (EQ (string, string_char_byte_cache_string))
865 if (string_char_byte_cache_charpos < char_index)
867 best_below = string_char_byte_cache_charpos;
868 best_below_byte = string_char_byte_cache_bytepos;
870 else
872 best_above = string_char_byte_cache_charpos;
873 best_above_byte = string_char_byte_cache_bytepos;
877 if (char_index - best_below < best_above - char_index)
879 while (best_below < char_index)
881 int c;
882 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c, string,
883 best_below, best_below_byte);
885 i = best_below;
886 i_byte = best_below_byte;
888 else
890 while (best_above > char_index)
892 unsigned char *pend = SDATA (string) + best_above_byte;
893 unsigned char *pbeg = pend - best_above_byte;
894 unsigned char *p = pend - 1;
895 int bytes;
897 while (p > pbeg && !CHAR_HEAD_P (*p)) p--;
898 PARSE_MULTIBYTE_SEQ (p, pend - p, bytes);
899 if (bytes == pend - p)
900 best_above_byte -= bytes;
901 else if (bytes > pend - p)
902 best_above_byte -= (pend - p);
903 else
904 best_above_byte--;
905 best_above--;
907 i = best_above;
908 i_byte = best_above_byte;
911 string_char_byte_cache_bytepos = i_byte;
912 string_char_byte_cache_charpos = i;
913 string_char_byte_cache_string = string;
915 return i_byte;
918 /* Return the character index corresponding to BYTE_INDEX in STRING. */
921 string_byte_to_char (string, byte_index)
922 Lisp_Object string;
923 int byte_index;
925 int i, i_byte;
926 int best_below, best_below_byte;
927 int best_above, best_above_byte;
929 best_below = best_below_byte = 0;
930 best_above = SCHARS (string);
931 best_above_byte = SBYTES (string);
932 if (best_above == best_above_byte)
933 return byte_index;
935 if (EQ (string, string_char_byte_cache_string))
937 if (string_char_byte_cache_bytepos < byte_index)
939 best_below = string_char_byte_cache_charpos;
940 best_below_byte = string_char_byte_cache_bytepos;
942 else
944 best_above = string_char_byte_cache_charpos;
945 best_above_byte = string_char_byte_cache_bytepos;
949 if (byte_index - best_below_byte < best_above_byte - byte_index)
951 while (best_below_byte < byte_index)
953 int c;
954 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c, string,
955 best_below, best_below_byte);
957 i = best_below;
958 i_byte = best_below_byte;
960 else
962 while (best_above_byte > byte_index)
964 unsigned char *pend = SDATA (string) + best_above_byte;
965 unsigned char *pbeg = pend - best_above_byte;
966 unsigned char *p = pend - 1;
967 int bytes;
969 while (p > pbeg && !CHAR_HEAD_P (*p)) p--;
970 PARSE_MULTIBYTE_SEQ (p, pend - p, bytes);
971 if (bytes == pend - p)
972 best_above_byte -= bytes;
973 else if (bytes > pend - p)
974 best_above_byte -= (pend - p);
975 else
976 best_above_byte--;
977 best_above--;
979 i = best_above;
980 i_byte = best_above_byte;
983 string_char_byte_cache_bytepos = i_byte;
984 string_char_byte_cache_charpos = i;
985 string_char_byte_cache_string = string;
987 return i;
990 /* Convert STRING to a multibyte string.
991 Single-byte characters 0240 through 0377 are converted
992 by adding nonascii_insert_offset to each. */
994 Lisp_Object
995 string_make_multibyte (string)
996 Lisp_Object string;
998 unsigned char *buf;
999 int nbytes;
1000 Lisp_Object ret;
1001 USE_SAFE_ALLOCA;
1003 if (STRING_MULTIBYTE (string))
1004 return string;
1006 nbytes = count_size_as_multibyte (SDATA (string),
1007 SCHARS (string));
1008 /* If all the chars are ASCII, they won't need any more bytes
1009 once converted. In that case, we can return STRING itself. */
1010 if (nbytes == SBYTES (string))
1011 return string;
1013 SAFE_ALLOCA (buf, unsigned char *, nbytes);
1014 copy_text (SDATA (string), buf, SBYTES (string),
1015 0, 1);
1017 ret = make_multibyte_string (buf, SCHARS (string), nbytes);
1018 SAFE_FREE ();
1020 return ret;
1024 /* Convert STRING to a multibyte string without changing each
1025 character codes. Thus, characters 0200 trough 0237 are converted
1026 to eight-bit-control characters, and characters 0240 through 0377
1027 are converted eight-bit-graphic characters. */
1029 Lisp_Object
1030 string_to_multibyte (string)
1031 Lisp_Object string;
1033 unsigned char *buf;
1034 int nbytes;
1035 Lisp_Object ret;
1036 USE_SAFE_ALLOCA;
1038 if (STRING_MULTIBYTE (string))
1039 return string;
1041 nbytes = parse_str_to_multibyte (SDATA (string), SBYTES (string));
1042 /* If all the chars are ASCII or eight-bit-graphic, they won't need
1043 any more bytes once converted. */
1044 if (nbytes == SBYTES (string))
1045 return make_multibyte_string (SDATA (string), nbytes, nbytes);
1047 SAFE_ALLOCA (buf, unsigned char *, nbytes);
1048 bcopy (SDATA (string), buf, SBYTES (string));
1049 str_to_multibyte (buf, nbytes, SBYTES (string));
1051 ret = make_multibyte_string (buf, SCHARS (string), nbytes);
1052 SAFE_FREE ();
1054 return ret;
1058 /* Convert STRING to a single-byte string. */
1060 Lisp_Object
1061 string_make_unibyte (string)
1062 Lisp_Object string;
1064 int nchars;
1065 unsigned char *buf;
1066 Lisp_Object ret;
1067 USE_SAFE_ALLOCA;
1069 if (! STRING_MULTIBYTE (string))
1070 return string;
1072 nchars = SCHARS (string);
1074 SAFE_ALLOCA (buf, unsigned char *, nchars);
1075 copy_text (SDATA (string), buf, SBYTES (string),
1076 1, 0);
1078 ret = make_unibyte_string (buf, nchars);
1079 SAFE_FREE ();
1081 return ret;
1084 DEFUN ("string-make-multibyte", Fstring_make_multibyte, Sstring_make_multibyte,
1085 1, 1, 0,
1086 doc: /* Return the multibyte equivalent of STRING.
1087 If STRING is unibyte and contains non-ASCII characters, the function
1088 `unibyte-char-to-multibyte' is used to convert each unibyte character
1089 to a multibyte character. In this case, the returned string is a
1090 newly created string with no text properties. If STRING is multibyte
1091 or entirely ASCII, it is returned unchanged. In particular, when
1092 STRING is unibyte and entirely ASCII, the returned string is unibyte.
1093 \(When the characters are all ASCII, Emacs primitives will treat the
1094 string the same way whether it is unibyte or multibyte.) */)
1095 (string)
1096 Lisp_Object string;
1098 CHECK_STRING (string);
1100 return string_make_multibyte (string);
1103 DEFUN ("string-make-unibyte", Fstring_make_unibyte, Sstring_make_unibyte,
1104 1, 1, 0,
1105 doc: /* Return the unibyte equivalent of STRING.
1106 Multibyte character codes are converted to unibyte according to
1107 `nonascii-translation-table' or, if that is nil, `nonascii-insert-offset'.
1108 If the lookup in the translation table fails, this function takes just
1109 the low 8 bits of each character. */)
1110 (string)
1111 Lisp_Object string;
1113 CHECK_STRING (string);
1115 return string_make_unibyte (string);
1118 DEFUN ("string-as-unibyte", Fstring_as_unibyte, Sstring_as_unibyte,
1119 1, 1, 0,
1120 doc: /* Return a unibyte string with the same individual bytes as STRING.
1121 If STRING is unibyte, the result is STRING itself.
1122 Otherwise it is a newly created string, with no text properties.
1123 If STRING is multibyte and contains a character of charset
1124 `eight-bit-control' or `eight-bit-graphic', it is converted to the
1125 corresponding single byte. */)
1126 (string)
1127 Lisp_Object string;
1129 CHECK_STRING (string);
1131 if (STRING_MULTIBYTE (string))
1133 int bytes = SBYTES (string);
1134 unsigned char *str = (unsigned char *) xmalloc (bytes);
1136 bcopy (SDATA (string), str, bytes);
1137 bytes = str_as_unibyte (str, bytes);
1138 string = make_unibyte_string (str, bytes);
1139 xfree (str);
1141 return string;
1144 DEFUN ("string-as-multibyte", Fstring_as_multibyte, Sstring_as_multibyte,
1145 1, 1, 0,
1146 doc: /* Return a multibyte string with the same individual bytes as STRING.
1147 If STRING is multibyte, the result is STRING itself.
1148 Otherwise it is a newly created string, with no text properties.
1149 If STRING is unibyte and contains an individual 8-bit byte (i.e. not
1150 part of a multibyte form), it is converted to the corresponding
1151 multibyte character of charset `eight-bit-control' or `eight-bit-graphic'.
1152 Beware, this often doesn't really do what you think it does.
1153 It is similar to (decode-coding-string STRING 'emacs-mule-unix).
1154 If you're not sure, whether to use `string-as-multibyte' or
1155 `string-to-multibyte', use `string-to-multibyte'. Beware:
1156 (aref (string-as-multibyte "\201") 0) -> 129 (aka ?\201)
1157 (aref (string-as-multibyte "\300") 0) -> 192 (aka ?\300)
1158 (aref (string-as-multibyte "\300\201") 0) -> 192 (aka ?\300)
1159 (aref (string-as-multibyte "\300\201") 1) -> 129 (aka ?\201)
1161 (aref (string-as-multibyte "\201\300") 0) -> 2240
1162 (aref (string-as-multibyte "\201\300") 1) -> <error> */)
1163 (string)
1164 Lisp_Object string;
1166 CHECK_STRING (string);
1168 if (! STRING_MULTIBYTE (string))
1170 Lisp_Object new_string;
1171 int nchars, nbytes;
1173 parse_str_as_multibyte (SDATA (string),
1174 SBYTES (string),
1175 &nchars, &nbytes);
1176 new_string = make_uninit_multibyte_string (nchars, nbytes);
1177 bcopy (SDATA (string), SDATA (new_string),
1178 SBYTES (string));
1179 if (nbytes != SBYTES (string))
1180 str_as_multibyte (SDATA (new_string), nbytes,
1181 SBYTES (string), NULL);
1182 string = new_string;
1183 STRING_SET_INTERVALS (string, NULL_INTERVAL);
1185 return string;
1188 DEFUN ("string-to-multibyte", Fstring_to_multibyte, Sstring_to_multibyte,
1189 1, 1, 0,
1190 doc: /* Return a multibyte string with the same individual chars as STRING.
1191 If STRING is multibyte, the result is STRING itself.
1192 Otherwise it is a newly created string, with no text properties.
1193 Characters 0200 through 0237 are converted to eight-bit-control
1194 characters of the same character code. Characters 0240 through 0377
1195 are converted to eight-bit-graphic characters of the same character
1196 codes.
1197 This is similar to (decode-coding-string STRING 'binary) */)
1198 (string)
1199 Lisp_Object string;
1201 CHECK_STRING (string);
1203 return string_to_multibyte (string);
1207 DEFUN ("copy-alist", Fcopy_alist, Scopy_alist, 1, 1, 0,
1208 doc: /* Return a copy of ALIST.
1209 This is an alist which represents the same mapping from objects to objects,
1210 but does not share the alist structure with ALIST.
1211 The objects mapped (cars and cdrs of elements of the alist)
1212 are shared, however.
1213 Elements of ALIST that are not conses are also shared. */)
1214 (alist)
1215 Lisp_Object alist;
1217 register Lisp_Object tem;
1219 CHECK_LIST (alist);
1220 if (NILP (alist))
1221 return alist;
1222 alist = concat (1, &alist, Lisp_Cons, 0);
1223 for (tem = alist; CONSP (tem); tem = XCDR (tem))
1225 register Lisp_Object car;
1226 car = XCAR (tem);
1228 if (CONSP (car))
1229 XSETCAR (tem, Fcons (XCAR (car), XCDR (car)));
1231 return alist;
1234 DEFUN ("substring", Fsubstring, Ssubstring, 2, 3, 0,
1235 doc: /* Return a substring of STRING, starting at index FROM and ending before TO.
1236 TO may be nil or omitted; then the substring runs to the end of STRING.
1237 FROM and TO start at 0. If either is negative, it counts from the end.
1239 This function allows vectors as well as strings. */)
1240 (string, from, to)
1241 Lisp_Object string;
1242 register Lisp_Object from, to;
1244 Lisp_Object res;
1245 int size;
1246 int size_byte = 0;
1247 int from_char, to_char;
1248 int from_byte = 0, to_byte = 0;
1250 if (! (STRINGP (string) || VECTORP (string)))
1251 wrong_type_argument (Qarrayp, string);
1253 CHECK_NUMBER (from);
1255 if (STRINGP (string))
1257 size = SCHARS (string);
1258 size_byte = SBYTES (string);
1260 else
1261 size = XVECTOR (string)->size;
1263 if (NILP (to))
1265 to_char = size;
1266 to_byte = size_byte;
1268 else
1270 CHECK_NUMBER (to);
1272 to_char = XINT (to);
1273 if (to_char < 0)
1274 to_char += size;
1276 if (STRINGP (string))
1277 to_byte = string_char_to_byte (string, to_char);
1280 from_char = XINT (from);
1281 if (from_char < 0)
1282 from_char += size;
1283 if (STRINGP (string))
1284 from_byte = string_char_to_byte (string, from_char);
1286 if (!(0 <= from_char && from_char <= to_char && to_char <= size))
1287 args_out_of_range_3 (string, make_number (from_char),
1288 make_number (to_char));
1290 if (STRINGP (string))
1292 res = make_specified_string (SDATA (string) + from_byte,
1293 to_char - from_char, to_byte - from_byte,
1294 STRING_MULTIBYTE (string));
1295 copy_text_properties (make_number (from_char), make_number (to_char),
1296 string, make_number (0), res, Qnil);
1298 else
1299 res = Fvector (to_char - from_char,
1300 XVECTOR (string)->contents + from_char);
1302 return res;
1306 DEFUN ("substring-no-properties", Fsubstring_no_properties, Ssubstring_no_properties, 1, 3, 0,
1307 doc: /* Return a substring of STRING, without text properties.
1308 It starts at index FROM and ending before TO.
1309 TO may be nil or omitted; then the substring runs to the end of STRING.
1310 If FROM is nil or omitted, the substring starts at the beginning of STRING.
1311 If FROM or TO is negative, it counts from the end.
1313 With one argument, just copy STRING without its properties. */)
1314 (string, from, to)
1315 Lisp_Object string;
1316 register Lisp_Object from, to;
1318 int size, size_byte;
1319 int from_char, to_char;
1320 int from_byte, to_byte;
1322 CHECK_STRING (string);
1324 size = SCHARS (string);
1325 size_byte = SBYTES (string);
1327 if (NILP (from))
1328 from_char = from_byte = 0;
1329 else
1331 CHECK_NUMBER (from);
1332 from_char = XINT (from);
1333 if (from_char < 0)
1334 from_char += size;
1336 from_byte = string_char_to_byte (string, from_char);
1339 if (NILP (to))
1341 to_char = size;
1342 to_byte = size_byte;
1344 else
1346 CHECK_NUMBER (to);
1348 to_char = XINT (to);
1349 if (to_char < 0)
1350 to_char += size;
1352 to_byte = string_char_to_byte (string, to_char);
1355 if (!(0 <= from_char && from_char <= to_char && to_char <= size))
1356 args_out_of_range_3 (string, make_number (from_char),
1357 make_number (to_char));
1359 return make_specified_string (SDATA (string) + from_byte,
1360 to_char - from_char, to_byte - from_byte,
1361 STRING_MULTIBYTE (string));
1364 /* Extract a substring of STRING, giving start and end positions
1365 both in characters and in bytes. */
1367 Lisp_Object
1368 substring_both (string, from, from_byte, to, to_byte)
1369 Lisp_Object string;
1370 int from, from_byte, to, to_byte;
1372 Lisp_Object res;
1373 int size;
1374 int size_byte;
1376 if (! (STRINGP (string) || VECTORP (string)))
1377 wrong_type_argument (Qarrayp, string);
1379 if (STRINGP (string))
1381 size = SCHARS (string);
1382 size_byte = SBYTES (string);
1384 else
1385 size = XVECTOR (string)->size;
1387 if (!(0 <= from && from <= to && to <= size))
1388 args_out_of_range_3 (string, make_number (from), make_number (to));
1390 if (STRINGP (string))
1392 res = make_specified_string (SDATA (string) + from_byte,
1393 to - from, to_byte - from_byte,
1394 STRING_MULTIBYTE (string));
1395 copy_text_properties (make_number (from), make_number (to),
1396 string, make_number (0), res, Qnil);
1398 else
1399 res = Fvector (to - from,
1400 XVECTOR (string)->contents + 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 if (! CONSP (list))
1418 wrong_type_argument (Qlistp, list);
1419 list = XCDR (list);
1421 return list;
1424 DEFUN ("nth", Fnth, Snth, 2, 2, 0,
1425 doc: /* Return the Nth element of LIST.
1426 N counts from zero. If LIST is not that long, nil is returned. */)
1427 (n, list)
1428 Lisp_Object n, list;
1430 return Fcar (Fnthcdr (n, list));
1433 DEFUN ("elt", Felt, Selt, 2, 2, 0,
1434 doc: /* Return element of SEQUENCE at index N. */)
1435 (sequence, n)
1436 register Lisp_Object sequence, n;
1438 CHECK_NUMBER (n);
1439 while (1)
1441 if (CONSP (sequence) || NILP (sequence))
1442 return Fcar (Fnthcdr (n, sequence));
1443 else if (STRINGP (sequence) || VECTORP (sequence)
1444 || BOOL_VECTOR_P (sequence) || CHAR_TABLE_P (sequence))
1445 return Faref (sequence, n);
1446 else
1447 sequence = wrong_type_argument (Qsequencep, sequence);
1451 DEFUN ("member", Fmember, Smember, 2, 2, 0,
1452 doc: /* Return non-nil if ELT is an element of LIST. Comparison done with `equal'.
1453 The value is actually the tail of LIST whose car is ELT. */)
1454 (elt, list)
1455 register Lisp_Object elt;
1456 Lisp_Object list;
1458 register Lisp_Object tail;
1459 for (tail = list; !NILP (tail); tail = XCDR (tail))
1461 register Lisp_Object tem;
1462 if (! CONSP (tail))
1463 wrong_type_argument (Qlistp, list);
1464 tem = XCAR (tail);
1465 if (! NILP (Fequal (elt, tem)))
1466 return tail;
1467 QUIT;
1469 return Qnil;
1472 DEFUN ("memq", Fmemq, Smemq, 2, 2, 0,
1473 doc: /* Return non-nil if ELT is an element of LIST.
1474 Comparison done with `eq'. The value is actually the tail of LIST
1475 whose car is ELT. */)
1476 (elt, list)
1477 Lisp_Object elt, list;
1479 while (1)
1481 if (!CONSP (list) || EQ (XCAR (list), elt))
1482 break;
1484 list = XCDR (list);
1485 if (!CONSP (list) || EQ (XCAR (list), elt))
1486 break;
1488 list = XCDR (list);
1489 if (!CONSP (list) || EQ (XCAR (list), elt))
1490 break;
1492 list = XCDR (list);
1493 QUIT;
1496 if (!CONSP (list) && !NILP (list))
1497 list = wrong_type_argument (Qlistp, list);
1499 return list;
1502 DEFUN ("assq", Fassq, Sassq, 2, 2, 0,
1503 doc: /* Return non-nil if KEY is `eq' to the car of an element of LIST.
1504 The value is actually the first element of LIST whose car is KEY.
1505 Elements of LIST that are not conses are ignored. */)
1506 (key, list)
1507 Lisp_Object key, list;
1509 Lisp_Object result;
1511 while (1)
1513 if (!CONSP (list)
1514 || (CONSP (XCAR (list))
1515 && EQ (XCAR (XCAR (list)), key)))
1516 break;
1518 list = XCDR (list);
1519 if (!CONSP (list)
1520 || (CONSP (XCAR (list))
1521 && EQ (XCAR (XCAR (list)), key)))
1522 break;
1524 list = XCDR (list);
1525 if (!CONSP (list)
1526 || (CONSP (XCAR (list))
1527 && EQ (XCAR (XCAR (list)), key)))
1528 break;
1530 list = XCDR (list);
1531 QUIT;
1534 if (CONSP (list))
1535 result = XCAR (list);
1536 else if (NILP (list))
1537 result = Qnil;
1538 else
1539 result = wrong_type_argument (Qlistp, list);
1541 return result;
1544 /* Like Fassq but never report an error and do not allow quits.
1545 Use only on lists known never to be circular. */
1547 Lisp_Object
1548 assq_no_quit (key, list)
1549 Lisp_Object key, list;
1551 while (CONSP (list)
1552 && (!CONSP (XCAR (list))
1553 || !EQ (XCAR (XCAR (list)), key)))
1554 list = XCDR (list);
1556 return CONSP (list) ? XCAR (list) : Qnil;
1559 DEFUN ("assoc", Fassoc, Sassoc, 2, 2, 0,
1560 doc: /* Return non-nil if KEY is `equal' to the car of an element of LIST.
1561 The value is actually the first element of LIST whose car equals KEY. */)
1562 (key, list)
1563 Lisp_Object key, list;
1565 Lisp_Object result, car;
1567 while (1)
1569 if (!CONSP (list)
1570 || (CONSP (XCAR (list))
1571 && (car = XCAR (XCAR (list)),
1572 EQ (car, key) || !NILP (Fequal (car, key)))))
1573 break;
1575 list = XCDR (list);
1576 if (!CONSP (list)
1577 || (CONSP (XCAR (list))
1578 && (car = XCAR (XCAR (list)),
1579 EQ (car, key) || !NILP (Fequal (car, key)))))
1580 break;
1582 list = XCDR (list);
1583 if (!CONSP (list)
1584 || (CONSP (XCAR (list))
1585 && (car = XCAR (XCAR (list)),
1586 EQ (car, key) || !NILP (Fequal (car, key)))))
1587 break;
1589 list = XCDR (list);
1590 QUIT;
1593 if (CONSP (list))
1594 result = XCAR (list);
1595 else if (NILP (list))
1596 result = Qnil;
1597 else
1598 result = wrong_type_argument (Qlistp, list);
1600 return result;
1603 DEFUN ("rassq", Frassq, Srassq, 2, 2, 0,
1604 doc: /* Return non-nil if KEY is `eq' to the cdr of an element of LIST.
1605 The value is actually the first element of LIST whose cdr is KEY. */)
1606 (key, list)
1607 register Lisp_Object key;
1608 Lisp_Object list;
1610 Lisp_Object result;
1612 while (1)
1614 if (!CONSP (list)
1615 || (CONSP (XCAR (list))
1616 && EQ (XCDR (XCAR (list)), key)))
1617 break;
1619 list = XCDR (list);
1620 if (!CONSP (list)
1621 || (CONSP (XCAR (list))
1622 && EQ (XCDR (XCAR (list)), key)))
1623 break;
1625 list = XCDR (list);
1626 if (!CONSP (list)
1627 || (CONSP (XCAR (list))
1628 && EQ (XCDR (XCAR (list)), key)))
1629 break;
1631 list = XCDR (list);
1632 QUIT;
1635 if (NILP (list))
1636 result = Qnil;
1637 else if (CONSP (list))
1638 result = XCAR (list);
1639 else
1640 result = wrong_type_argument (Qlistp, list);
1642 return result;
1645 DEFUN ("rassoc", Frassoc, Srassoc, 2, 2, 0,
1646 doc: /* Return non-nil if KEY is `equal' to the cdr of an element of LIST.
1647 The value is actually the first element of LIST whose cdr equals KEY. */)
1648 (key, list)
1649 Lisp_Object key, list;
1651 Lisp_Object result, cdr;
1653 while (1)
1655 if (!CONSP (list)
1656 || (CONSP (XCAR (list))
1657 && (cdr = XCDR (XCAR (list)),
1658 EQ (cdr, key) || !NILP (Fequal (cdr, key)))))
1659 break;
1661 list = XCDR (list);
1662 if (!CONSP (list)
1663 || (CONSP (XCAR (list))
1664 && (cdr = XCDR (XCAR (list)),
1665 EQ (cdr, key) || !NILP (Fequal (cdr, key)))))
1666 break;
1668 list = XCDR (list);
1669 if (!CONSP (list)
1670 || (CONSP (XCAR (list))
1671 && (cdr = XCDR (XCAR (list)),
1672 EQ (cdr, key) || !NILP (Fequal (cdr, key)))))
1673 break;
1675 list = XCDR (list);
1676 QUIT;
1679 if (CONSP (list))
1680 result = XCAR (list);
1681 else if (NILP (list))
1682 result = Qnil;
1683 else
1684 result = wrong_type_argument (Qlistp, list);
1686 return result;
1689 DEFUN ("delq", Fdelq, Sdelq, 2, 2, 0,
1690 doc: /* Delete by side effect any occurrences of ELT as a member of LIST.
1691 The modified LIST is returned. Comparison is done with `eq'.
1692 If the first member of LIST is ELT, there is no way to remove it by side effect;
1693 therefore, write `(setq foo (delq element foo))'
1694 to be sure of changing the value of `foo'. */)
1695 (elt, list)
1696 register Lisp_Object elt;
1697 Lisp_Object list;
1699 register Lisp_Object tail, prev;
1700 register Lisp_Object tem;
1702 tail = list;
1703 prev = Qnil;
1704 while (!NILP (tail))
1706 if (! CONSP (tail))
1707 wrong_type_argument (Qlistp, list);
1708 tem = XCAR (tail);
1709 if (EQ (elt, tem))
1711 if (NILP (prev))
1712 list = XCDR (tail);
1713 else
1714 Fsetcdr (prev, XCDR (tail));
1716 else
1717 prev = tail;
1718 tail = XCDR (tail);
1719 QUIT;
1721 return list;
1724 DEFUN ("delete", Fdelete, Sdelete, 2, 2, 0,
1725 doc: /* Delete by side effect any occurrences of ELT as a member of SEQ.
1726 SEQ must be a list, a vector, or a string.
1727 The modified SEQ is returned. Comparison is done with `equal'.
1728 If SEQ is not a list, or the first member of SEQ is ELT, deleting it
1729 is not a side effect; it is simply using a different sequence.
1730 Therefore, write `(setq foo (delete element foo))'
1731 to be sure of changing the value of `foo'. */)
1732 (elt, seq)
1733 Lisp_Object elt, seq;
1735 if (VECTORP (seq))
1737 EMACS_INT i, n;
1739 for (i = n = 0; i < ASIZE (seq); ++i)
1740 if (NILP (Fequal (AREF (seq, i), elt)))
1741 ++n;
1743 if (n != ASIZE (seq))
1745 struct Lisp_Vector *p = allocate_vector (n);
1747 for (i = n = 0; i < ASIZE (seq); ++i)
1748 if (NILP (Fequal (AREF (seq, i), elt)))
1749 p->contents[n++] = AREF (seq, i);
1751 XSETVECTOR (seq, p);
1754 else if (STRINGP (seq))
1756 EMACS_INT i, ibyte, nchars, nbytes, cbytes;
1757 int c;
1759 for (i = nchars = nbytes = ibyte = 0;
1760 i < SCHARS (seq);
1761 ++i, ibyte += cbytes)
1763 if (STRING_MULTIBYTE (seq))
1765 c = STRING_CHAR (SDATA (seq) + ibyte,
1766 SBYTES (seq) - ibyte);
1767 cbytes = CHAR_BYTES (c);
1769 else
1771 c = SREF (seq, i);
1772 cbytes = 1;
1775 if (!INTEGERP (elt) || c != XINT (elt))
1777 ++nchars;
1778 nbytes += cbytes;
1782 if (nchars != SCHARS (seq))
1784 Lisp_Object tem;
1786 tem = make_uninit_multibyte_string (nchars, nbytes);
1787 if (!STRING_MULTIBYTE (seq))
1788 STRING_SET_UNIBYTE (tem);
1790 for (i = nchars = nbytes = ibyte = 0;
1791 i < SCHARS (seq);
1792 ++i, ibyte += cbytes)
1794 if (STRING_MULTIBYTE (seq))
1796 c = STRING_CHAR (SDATA (seq) + ibyte,
1797 SBYTES (seq) - ibyte);
1798 cbytes = CHAR_BYTES (c);
1800 else
1802 c = SREF (seq, i);
1803 cbytes = 1;
1806 if (!INTEGERP (elt) || c != XINT (elt))
1808 unsigned char *from = SDATA (seq) + ibyte;
1809 unsigned char *to = SDATA (tem) + nbytes;
1810 EMACS_INT n;
1812 ++nchars;
1813 nbytes += cbytes;
1815 for (n = cbytes; n--; )
1816 *to++ = *from++;
1820 seq = tem;
1823 else
1825 Lisp_Object tail, prev;
1827 for (tail = seq, prev = Qnil; !NILP (tail); tail = XCDR (tail))
1829 if (!CONSP (tail))
1830 wrong_type_argument (Qlistp, seq);
1832 if (!NILP (Fequal (elt, XCAR (tail))))
1834 if (NILP (prev))
1835 seq = XCDR (tail);
1836 else
1837 Fsetcdr (prev, XCDR (tail));
1839 else
1840 prev = tail;
1841 QUIT;
1845 return seq;
1848 DEFUN ("nreverse", Fnreverse, Snreverse, 1, 1, 0,
1849 doc: /* Reverse LIST by modifying cdr pointers.
1850 Return the reversed list. */)
1851 (list)
1852 Lisp_Object list;
1854 register Lisp_Object prev, tail, next;
1856 if (NILP (list)) return list;
1857 prev = Qnil;
1858 tail = list;
1859 while (!NILP (tail))
1861 QUIT;
1862 if (! CONSP (tail))
1863 wrong_type_argument (Qlistp, list);
1864 next = XCDR (tail);
1865 Fsetcdr (tail, prev);
1866 prev = tail;
1867 tail = next;
1869 return prev;
1872 DEFUN ("reverse", Freverse, Sreverse, 1, 1, 0,
1873 doc: /* Reverse LIST, copying. Return the reversed list.
1874 See also the function `nreverse', which is used more often. */)
1875 (list)
1876 Lisp_Object list;
1878 Lisp_Object new;
1880 for (new = Qnil; CONSP (list); list = XCDR (list))
1882 QUIT;
1883 new = Fcons (XCAR (list), new);
1885 if (!NILP (list))
1886 wrong_type_argument (Qconsp, list);
1887 return new;
1890 Lisp_Object merge ();
1892 DEFUN ("sort", Fsort, Ssort, 2, 2, 0,
1893 doc: /* Sort LIST, stably, comparing elements using PREDICATE.
1894 Returns the sorted list. LIST is modified by side effects.
1895 PREDICATE is called with two elements of LIST, and should return non-nil
1896 if the first element is "less" than the second. */)
1897 (list, predicate)
1898 Lisp_Object list, predicate;
1900 Lisp_Object front, back;
1901 register Lisp_Object len, tem;
1902 struct gcpro gcpro1, gcpro2;
1903 register int length;
1905 front = list;
1906 len = Flength (list);
1907 length = XINT (len);
1908 if (length < 2)
1909 return list;
1911 XSETINT (len, (length / 2) - 1);
1912 tem = Fnthcdr (len, list);
1913 back = Fcdr (tem);
1914 Fsetcdr (tem, Qnil);
1916 GCPRO2 (front, back);
1917 front = Fsort (front, predicate);
1918 back = Fsort (back, predicate);
1919 UNGCPRO;
1920 return merge (front, back, predicate);
1923 Lisp_Object
1924 merge (org_l1, org_l2, pred)
1925 Lisp_Object org_l1, org_l2;
1926 Lisp_Object pred;
1928 Lisp_Object value;
1929 register Lisp_Object tail;
1930 Lisp_Object tem;
1931 register Lisp_Object l1, l2;
1932 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
1934 l1 = org_l1;
1935 l2 = org_l2;
1936 tail = Qnil;
1937 value = Qnil;
1939 /* It is sufficient to protect org_l1 and org_l2.
1940 When l1 and l2 are updated, we copy the new values
1941 back into the org_ vars. */
1942 GCPRO4 (org_l1, org_l2, pred, value);
1944 while (1)
1946 if (NILP (l1))
1948 UNGCPRO;
1949 if (NILP (tail))
1950 return l2;
1951 Fsetcdr (tail, l2);
1952 return value;
1954 if (NILP (l2))
1956 UNGCPRO;
1957 if (NILP (tail))
1958 return l1;
1959 Fsetcdr (tail, l1);
1960 return value;
1962 tem = call2 (pred, Fcar (l2), Fcar (l1));
1963 if (NILP (tem))
1965 tem = l1;
1966 l1 = Fcdr (l1);
1967 org_l1 = l1;
1969 else
1971 tem = l2;
1972 l2 = Fcdr (l2);
1973 org_l2 = l2;
1975 if (NILP (tail))
1976 value = tem;
1977 else
1978 Fsetcdr (tail, tem);
1979 tail = tem;
1984 #if 0 /* Unsafe version. */
1985 DEFUN ("plist-get", Fplist_get, Splist_get, 2, 2, 0,
1986 doc: /* Extract a value from a property list.
1987 PLIST is a property list, which is a list of the form
1988 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value
1989 corresponding to the given PROP, or nil if PROP is not
1990 one of the properties on the list. */)
1991 (plist, prop)
1992 Lisp_Object plist;
1993 Lisp_Object prop;
1995 Lisp_Object tail;
1997 for (tail = plist;
1998 CONSP (tail) && CONSP (XCDR (tail));
1999 tail = XCDR (XCDR (tail)))
2001 if (EQ (prop, XCAR (tail)))
2002 return XCAR (XCDR (tail));
2004 /* This function can be called asynchronously
2005 (setup_coding_system). Don't QUIT in that case. */
2006 if (!interrupt_input_blocked)
2007 QUIT;
2010 if (!NILP (tail))
2011 wrong_type_argument (Qlistp, prop);
2013 return Qnil;
2015 #endif
2017 /* This does not check for quits. That is safe since it must terminate. */
2019 DEFUN ("plist-get", Fplist_get, Splist_get, 2, 2, 0,
2020 doc: /* Extract a value from a property list.
2021 PLIST is a property list, which is a list of the form
2022 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value
2023 corresponding to the given PROP, or nil if PROP is not one of the
2024 properties on the list. This function never signals an error. */)
2025 (plist, prop)
2026 Lisp_Object plist;
2027 Lisp_Object prop;
2029 Lisp_Object tail, halftail;
2031 /* halftail is used to detect circular lists. */
2032 tail = halftail = plist;
2033 while (CONSP (tail) && CONSP (XCDR (tail)))
2035 if (EQ (prop, XCAR (tail)))
2036 return XCAR (XCDR (tail));
2038 tail = XCDR (XCDR (tail));
2039 halftail = XCDR (halftail);
2040 if (EQ (tail, halftail))
2041 break;
2044 return Qnil;
2047 DEFUN ("get", Fget, Sget, 2, 2, 0,
2048 doc: /* Return the value of SYMBOL's PROPNAME property.
2049 This is the last value stored with `(put SYMBOL PROPNAME VALUE)'. */)
2050 (symbol, propname)
2051 Lisp_Object symbol, propname;
2053 CHECK_SYMBOL (symbol);
2054 return Fplist_get (XSYMBOL (symbol)->plist, propname);
2057 DEFUN ("plist-put", Fplist_put, Splist_put, 3, 3, 0,
2058 doc: /* Change value in PLIST of PROP to VAL.
2059 PLIST is a property list, which is a list of the form
2060 \(PROP1 VALUE1 PROP2 VALUE2 ...). PROP is a symbol and VAL is any object.
2061 If PROP is already a property on the list, its value is set to VAL,
2062 otherwise the new PROP VAL pair is added. The new plist is returned;
2063 use `(setq x (plist-put x prop val))' to be sure to use the new value.
2064 The PLIST is modified by side effects. */)
2065 (plist, prop, val)
2066 Lisp_Object plist;
2067 register Lisp_Object prop;
2068 Lisp_Object val;
2070 register Lisp_Object tail, prev;
2071 Lisp_Object newcell;
2072 prev = Qnil;
2073 for (tail = plist; CONSP (tail) && CONSP (XCDR (tail));
2074 tail = XCDR (XCDR (tail)))
2076 if (EQ (prop, XCAR (tail)))
2078 Fsetcar (XCDR (tail), val);
2079 return plist;
2082 prev = tail;
2083 QUIT;
2085 newcell = Fcons (prop, Fcons (val, Qnil));
2086 if (NILP (prev))
2087 return newcell;
2088 else
2089 Fsetcdr (XCDR (prev), newcell);
2090 return plist;
2093 DEFUN ("put", Fput, Sput, 3, 3, 0,
2094 doc: /* Store SYMBOL's PROPNAME property with value VALUE.
2095 It can be retrieved with `(get SYMBOL PROPNAME)'. */)
2096 (symbol, propname, value)
2097 Lisp_Object symbol, propname, value;
2099 CHECK_SYMBOL (symbol);
2100 XSYMBOL (symbol)->plist
2101 = Fplist_put (XSYMBOL (symbol)->plist, propname, value);
2102 return value;
2105 DEFUN ("lax-plist-get", Flax_plist_get, Slax_plist_get, 2, 2, 0,
2106 doc: /* Extract a value from a property list, comparing with `equal'.
2107 PLIST is a property list, which is a list of the form
2108 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value
2109 corresponding to the given PROP, or nil if PROP is not
2110 one of the properties on the list. */)
2111 (plist, prop)
2112 Lisp_Object plist;
2113 Lisp_Object prop;
2115 Lisp_Object tail;
2117 for (tail = plist;
2118 CONSP (tail) && CONSP (XCDR (tail));
2119 tail = XCDR (XCDR (tail)))
2121 if (! NILP (Fequal (prop, XCAR (tail))))
2122 return XCAR (XCDR (tail));
2124 QUIT;
2127 if (!NILP (tail))
2128 wrong_type_argument (Qlistp, prop);
2130 return Qnil;
2133 DEFUN ("lax-plist-put", Flax_plist_put, Slax_plist_put, 3, 3, 0,
2134 doc: /* Change value in PLIST of PROP to VAL, comparing with `equal'.
2135 PLIST is a property list, which is a list of the form
2136 \(PROP1 VALUE1 PROP2 VALUE2 ...). PROP and VAL are any objects.
2137 If PROP is already a property on the list, its value is set to VAL,
2138 otherwise the new PROP VAL pair is added. The new plist is returned;
2139 use `(setq x (lax-plist-put x prop val))' to be sure to use the new value.
2140 The PLIST is modified by side effects. */)
2141 (plist, prop, val)
2142 Lisp_Object plist;
2143 register Lisp_Object prop;
2144 Lisp_Object val;
2146 register Lisp_Object tail, prev;
2147 Lisp_Object newcell;
2148 prev = Qnil;
2149 for (tail = plist; CONSP (tail) && CONSP (XCDR (tail));
2150 tail = XCDR (XCDR (tail)))
2152 if (! NILP (Fequal (prop, XCAR (tail))))
2154 Fsetcar (XCDR (tail), val);
2155 return plist;
2158 prev = tail;
2159 QUIT;
2161 newcell = Fcons (prop, Fcons (val, Qnil));
2162 if (NILP (prev))
2163 return newcell;
2164 else
2165 Fsetcdr (XCDR (prev), newcell);
2166 return plist;
2169 DEFUN ("eql", Feql, Seql, 2, 2, 0,
2170 doc: /* Return t if the two args are the same Lisp object.
2171 Floating-point numbers of equal value are `eql', but they may not be `eq'. */)
2172 (obj1, obj2)
2173 Lisp_Object obj1, obj2;
2175 if (FLOATP (obj1))
2176 return internal_equal (obj1, obj2, 0, 0) ? Qt : Qnil;
2177 else
2178 return EQ (obj1, obj2) ? Qt : Qnil;
2181 DEFUN ("equal", Fequal, Sequal, 2, 2, 0,
2182 doc: /* Return t if two Lisp objects have similar structure and contents.
2183 They must have the same data type.
2184 Conses are compared by comparing the cars and the cdrs.
2185 Vectors and strings are compared element by element.
2186 Numbers are compared by value, but integers cannot equal floats.
2187 (Use `=' if you want integers and floats to be able to be equal.)
2188 Symbols must match exactly. */)
2189 (o1, o2)
2190 register Lisp_Object o1, o2;
2192 return internal_equal (o1, o2, 0, 0) ? Qt : Qnil;
2195 DEFUN ("equal-including-properties", Fequal_including_properties, Sequal_including_properties, 2, 2, 0,
2196 doc: /* Return t if two Lisp objects have similar structure and contents.
2197 This is like `equal' except that it compares the text properties
2198 of strings. (`equal' ignores text properties.) */)
2199 (o1, o2)
2200 register Lisp_Object o1, o2;
2202 return internal_equal (o1, o2, 0, 1) ? Qt : Qnil;
2205 /* DEPTH is current depth of recursion. Signal an error if it
2206 gets too deep.
2207 PROPS, if non-nil, means compare string text properties too. */
2209 static int
2210 internal_equal (o1, o2, depth, props)
2211 register Lisp_Object o1, o2;
2212 int depth, props;
2214 if (depth > 200)
2215 error ("Stack overflow in equal");
2217 tail_recurse:
2218 QUIT;
2219 if (EQ (o1, o2))
2220 return 1;
2221 if (XTYPE (o1) != XTYPE (o2))
2222 return 0;
2224 switch (XTYPE (o1))
2226 case Lisp_Float:
2228 double d1, d2;
2230 d1 = extract_float (o1);
2231 d2 = extract_float (o2);
2232 /* If d is a NaN, then d != d. Two NaNs should be `equal' even
2233 though they are not =. */
2234 return d1 == d2 || (d1 != d1 && d2 != d2);
2237 case Lisp_Cons:
2238 if (!internal_equal (XCAR (o1), XCAR (o2), depth + 1, props))
2239 return 0;
2240 o1 = XCDR (o1);
2241 o2 = XCDR (o2);
2242 goto tail_recurse;
2244 case Lisp_Misc:
2245 if (XMISCTYPE (o1) != XMISCTYPE (o2))
2246 return 0;
2247 if (OVERLAYP (o1))
2249 if (!internal_equal (OVERLAY_START (o1), OVERLAY_START (o2),
2250 depth + 1, props)
2251 || !internal_equal (OVERLAY_END (o1), OVERLAY_END (o2),
2252 depth + 1))
2253 return 0;
2254 o1 = XOVERLAY (o1)->plist;
2255 o2 = XOVERLAY (o2)->plist;
2256 goto tail_recurse;
2258 if (MARKERP (o1))
2260 return (XMARKER (o1)->buffer == XMARKER (o2)->buffer
2261 && (XMARKER (o1)->buffer == 0
2262 || XMARKER (o1)->bytepos == XMARKER (o2)->bytepos));
2264 break;
2266 case Lisp_Vectorlike:
2268 register int i;
2269 EMACS_INT size = XVECTOR (o1)->size;
2270 /* Pseudovectors have the type encoded in the size field, so this test
2271 actually checks that the objects have the same type as well as the
2272 same size. */
2273 if (XVECTOR (o2)->size != size)
2274 return 0;
2275 /* Boolvectors are compared much like strings. */
2276 if (BOOL_VECTOR_P (o1))
2278 int size_in_chars
2279 = ((XBOOL_VECTOR (o1)->size + BOOL_VECTOR_BITS_PER_CHAR - 1)
2280 / BOOL_VECTOR_BITS_PER_CHAR);
2282 if (XBOOL_VECTOR (o1)->size != XBOOL_VECTOR (o2)->size)
2283 return 0;
2284 if (bcmp (XBOOL_VECTOR (o1)->data, XBOOL_VECTOR (o2)->data,
2285 size_in_chars))
2286 return 0;
2287 return 1;
2289 if (WINDOW_CONFIGURATIONP (o1))
2290 return compare_window_configurations (o1, o2, 0);
2292 /* Aside from them, only true vectors, char-tables, and compiled
2293 functions are sensible to compare, so eliminate the others now. */
2294 if (size & PSEUDOVECTOR_FLAG)
2296 if (!(size & (PVEC_COMPILED | PVEC_CHAR_TABLE)))
2297 return 0;
2298 size &= PSEUDOVECTOR_SIZE_MASK;
2300 for (i = 0; i < size; i++)
2302 Lisp_Object v1, v2;
2303 v1 = XVECTOR (o1)->contents [i];
2304 v2 = XVECTOR (o2)->contents [i];
2305 if (!internal_equal (v1, v2, depth + 1, props))
2306 return 0;
2308 return 1;
2310 break;
2312 case Lisp_String:
2313 if (SCHARS (o1) != SCHARS (o2))
2314 return 0;
2315 if (SBYTES (o1) != SBYTES (o2))
2316 return 0;
2317 if (bcmp (SDATA (o1), SDATA (o2),
2318 SBYTES (o1)))
2319 return 0;
2320 if (props && !compare_string_intervals (o1, o2))
2321 return 0;
2322 return 1;
2324 case Lisp_Int:
2325 case Lisp_Symbol:
2326 case Lisp_Type_Limit:
2327 break;
2330 return 0;
2333 extern Lisp_Object Fmake_char_internal ();
2335 DEFUN ("fillarray", Ffillarray, Sfillarray, 2, 2, 0,
2336 doc: /* Store each element of ARRAY with ITEM.
2337 ARRAY is a vector, string, char-table, or bool-vector. */)
2338 (array, item)
2339 Lisp_Object array, item;
2341 register int size, index, charval;
2342 retry:
2343 if (VECTORP (array))
2345 register Lisp_Object *p = XVECTOR (array)->contents;
2346 size = XVECTOR (array)->size;
2347 for (index = 0; index < size; index++)
2348 p[index] = item;
2350 else if (CHAR_TABLE_P (array))
2352 register Lisp_Object *p = XCHAR_TABLE (array)->contents;
2353 size = CHAR_TABLE_ORDINARY_SLOTS;
2354 for (index = 0; index < size; index++)
2355 p[index] = item;
2356 XCHAR_TABLE (array)->defalt = Qnil;
2358 else if (STRINGP (array))
2360 register unsigned char *p = SDATA (array);
2361 CHECK_NUMBER (item);
2362 charval = XINT (item);
2363 size = SCHARS (array);
2364 if (STRING_MULTIBYTE (array))
2366 unsigned char str[MAX_MULTIBYTE_LENGTH];
2367 int len = CHAR_STRING (charval, str);
2368 int size_byte = SBYTES (array);
2369 unsigned char *p1 = p, *endp = p + size_byte;
2370 int i;
2372 if (size != size_byte)
2373 while (p1 < endp)
2375 int this_len = MULTIBYTE_FORM_LENGTH (p1, endp - p1);
2376 if (len != this_len)
2377 error ("Attempt to change byte length of a string");
2378 p1 += this_len;
2380 for (i = 0; i < size_byte; i++)
2381 *p++ = str[i % len];
2383 else
2384 for (index = 0; index < size; index++)
2385 p[index] = charval;
2387 else if (BOOL_VECTOR_P (array))
2389 register unsigned char *p = XBOOL_VECTOR (array)->data;
2390 int size_in_chars
2391 = ((XBOOL_VECTOR (array)->size + BOOL_VECTOR_BITS_PER_CHAR - 1)
2392 / BOOL_VECTOR_BITS_PER_CHAR);
2394 charval = (! NILP (item) ? -1 : 0);
2395 for (index = 0; index < size_in_chars - 1; index++)
2396 p[index] = charval;
2397 if (index < size_in_chars)
2399 /* Mask out bits beyond the vector size. */
2400 if (XBOOL_VECTOR (array)->size % BOOL_VECTOR_BITS_PER_CHAR)
2401 charval &= (1 << (XBOOL_VECTOR (array)->size % BOOL_VECTOR_BITS_PER_CHAR)) - 1;
2402 p[index] = charval;
2405 else
2407 array = wrong_type_argument (Qarrayp, array);
2408 goto retry;
2410 return array;
2413 DEFUN ("clear-string", Fclear_string, Sclear_string,
2414 1, 1, 0,
2415 doc: /* Clear the contents of STRING.
2416 This makes STRING unibyte and may change its length. */)
2417 (string)
2418 Lisp_Object string;
2420 int len;
2421 CHECK_STRING (string);
2422 len = SBYTES (string);
2423 bzero (SDATA (string), len);
2424 STRING_SET_CHARS (string, len);
2425 STRING_SET_UNIBYTE (string);
2426 return Qnil;
2429 DEFUN ("char-table-subtype", Fchar_table_subtype, Schar_table_subtype,
2430 1, 1, 0,
2431 doc: /* Return the subtype of char-table CHAR-TABLE. The value is a symbol. */)
2432 (char_table)
2433 Lisp_Object char_table;
2435 CHECK_CHAR_TABLE (char_table);
2437 return XCHAR_TABLE (char_table)->purpose;
2440 DEFUN ("char-table-parent", Fchar_table_parent, Schar_table_parent,
2441 1, 1, 0,
2442 doc: /* Return the parent char-table of CHAR-TABLE.
2443 The value is either nil or another char-table.
2444 If CHAR-TABLE holds nil for a given character,
2445 then the actual applicable value is inherited from the parent char-table
2446 \(or from its parents, if necessary). */)
2447 (char_table)
2448 Lisp_Object char_table;
2450 CHECK_CHAR_TABLE (char_table);
2452 return XCHAR_TABLE (char_table)->parent;
2455 DEFUN ("set-char-table-parent", Fset_char_table_parent, Sset_char_table_parent,
2456 2, 2, 0,
2457 doc: /* Set the parent char-table of CHAR-TABLE to PARENT.
2458 Return PARENT. PARENT must be either nil or another char-table. */)
2459 (char_table, parent)
2460 Lisp_Object char_table, parent;
2462 Lisp_Object temp;
2464 CHECK_CHAR_TABLE (char_table);
2466 if (!NILP (parent))
2468 CHECK_CHAR_TABLE (parent);
2470 for (temp = parent; !NILP (temp); temp = XCHAR_TABLE (temp)->parent)
2471 if (EQ (temp, char_table))
2472 error ("Attempt to make a chartable be its own parent");
2475 XCHAR_TABLE (char_table)->parent = parent;
2477 return parent;
2480 DEFUN ("char-table-extra-slot", Fchar_table_extra_slot, Schar_table_extra_slot,
2481 2, 2, 0,
2482 doc: /* Return the value of CHAR-TABLE's extra-slot number N. */)
2483 (char_table, n)
2484 Lisp_Object char_table, n;
2486 CHECK_CHAR_TABLE (char_table);
2487 CHECK_NUMBER (n);
2488 if (XINT (n) < 0
2489 || XINT (n) >= CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (char_table)))
2490 args_out_of_range (char_table, n);
2492 return XCHAR_TABLE (char_table)->extras[XINT (n)];
2495 DEFUN ("set-char-table-extra-slot", Fset_char_table_extra_slot,
2496 Sset_char_table_extra_slot,
2497 3, 3, 0,
2498 doc: /* Set CHAR-TABLE's extra-slot number N to VALUE. */)
2499 (char_table, n, value)
2500 Lisp_Object char_table, n, value;
2502 CHECK_CHAR_TABLE (char_table);
2503 CHECK_NUMBER (n);
2504 if (XINT (n) < 0
2505 || XINT (n) >= CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (char_table)))
2506 args_out_of_range (char_table, n);
2508 return XCHAR_TABLE (char_table)->extras[XINT (n)] = value;
2511 static Lisp_Object
2512 char_table_range (table, from, to, defalt)
2513 Lisp_Object table;
2514 int from, to;
2515 Lisp_Object defalt;
2517 Lisp_Object val;
2519 if (! NILP (XCHAR_TABLE (table)->defalt))
2520 defalt = XCHAR_TABLE (table)->defalt;
2521 val = XCHAR_TABLE (table)->contents[from];
2522 if (SUB_CHAR_TABLE_P (val))
2523 val = char_table_range (val, 32, 127, defalt);
2524 else if (NILP (val))
2525 val = defalt;
2526 for (from++; from <= to; from++)
2528 Lisp_Object this_val;
2530 this_val = XCHAR_TABLE (table)->contents[from];
2531 if (SUB_CHAR_TABLE_P (this_val))
2532 this_val = char_table_range (this_val, 32, 127, defalt);
2533 else if (NILP (this_val))
2534 this_val = defalt;
2535 if (! EQ (val, this_val))
2536 error ("Characters in the range have inconsistent values");
2538 return val;
2542 DEFUN ("char-table-range", Fchar_table_range, Schar_table_range,
2543 2, 2, 0,
2544 doc: /* Return the value in CHAR-TABLE for a range of characters RANGE.
2545 RANGE should be nil (for the default value),
2546 a vector which identifies a character set or a row of a character set,
2547 a character set name, or a character code.
2548 If the characters in the specified range have different values,
2549 an error is signaled.
2551 Note that this function doesn't check the parent of CHAR-TABLE. */)
2552 (char_table, range)
2553 Lisp_Object char_table, range;
2555 int charset_id, c1 = 0, c2 = 0;
2556 int size, i;
2557 Lisp_Object ch, val, current_default;
2559 CHECK_CHAR_TABLE (char_table);
2561 if (EQ (range, Qnil))
2562 return XCHAR_TABLE (char_table)->defalt;
2563 if (INTEGERP (range))
2565 int c = XINT (range);
2566 if (! CHAR_VALID_P (c, 0))
2567 error ("Invalid character code: %d", c);
2568 ch = range;
2569 SPLIT_CHAR (c, charset_id, c1, c2);
2571 else if (SYMBOLP (range))
2573 Lisp_Object charset_info;
2575 charset_info = Fget (range, Qcharset);
2576 CHECK_VECTOR (charset_info);
2577 charset_id = XINT (XVECTOR (charset_info)->contents[0]);
2578 ch = Fmake_char_internal (make_number (charset_id),
2579 make_number (0), make_number (0));
2581 else if (VECTORP (range))
2583 size = ASIZE (range);
2584 if (size == 0)
2585 args_out_of_range (range, make_number (0));
2586 CHECK_NUMBER (AREF (range, 0));
2587 charset_id = XINT (AREF (range, 0));
2588 if (size > 1)
2590 CHECK_NUMBER (AREF (range, 1));
2591 c1 = XINT (AREF (range, 1));
2592 if (size > 2)
2594 CHECK_NUMBER (AREF (range, 2));
2595 c2 = XINT (AREF (range, 2));
2599 /* This checks if charset_id, c0, and c1 are all valid or not. */
2600 ch = Fmake_char_internal (make_number (charset_id),
2601 make_number (c1), make_number (c2));
2603 else
2604 error ("Invalid RANGE argument to `char-table-range'");
2606 if (c1 > 0 && (CHARSET_DIMENSION (charset_id) == 1 || c2 > 0))
2608 /* Fully specified character. */
2609 Lisp_Object parent = XCHAR_TABLE (char_table)->parent;
2611 XCHAR_TABLE (char_table)->parent = Qnil;
2612 val = Faref (char_table, ch);
2613 XCHAR_TABLE (char_table)->parent = parent;
2614 return val;
2617 current_default = XCHAR_TABLE (char_table)->defalt;
2618 if (charset_id == CHARSET_ASCII
2619 || charset_id == CHARSET_8_BIT_CONTROL
2620 || charset_id == CHARSET_8_BIT_GRAPHIC)
2622 int from, to, defalt;
2624 if (charset_id == CHARSET_ASCII)
2625 from = 0, to = 127, defalt = CHAR_TABLE_DEFAULT_SLOT_ASCII;
2626 else if (charset_id == CHARSET_8_BIT_CONTROL)
2627 from = 128, to = 159, defalt = CHAR_TABLE_DEFAULT_SLOT_8_BIT_CONTROL;
2628 else
2629 from = 160, to = 255, defalt = CHAR_TABLE_DEFAULT_SLOT_8_BIT_GRAPHIC;
2630 if (! NILP (XCHAR_TABLE (char_table)->contents[defalt]))
2631 current_default = XCHAR_TABLE (char_table)->contents[defalt];
2632 return char_table_range (char_table, from, to, current_default);
2635 val = XCHAR_TABLE (char_table)->contents[128 + charset_id];
2636 if (! SUB_CHAR_TABLE_P (val))
2637 return (NILP (val) ? current_default : val);
2638 if (! NILP (XCHAR_TABLE (val)->defalt))
2639 current_default = XCHAR_TABLE (val)->defalt;
2640 if (c1 == 0)
2641 return char_table_range (val, 32, 127, current_default);
2642 val = XCHAR_TABLE (val)->contents[c1];
2643 if (! SUB_CHAR_TABLE_P (val))
2644 return (NILP (val) ? current_default : val);
2645 if (! NILP (XCHAR_TABLE (val)->defalt))
2646 current_default = XCHAR_TABLE (val)->defalt;
2647 return char_table_range (val, 32, 127, current_default);
2650 DEFUN ("set-char-table-range", Fset_char_table_range, Sset_char_table_range,
2651 3, 3, 0,
2652 doc: /* Set the value in CHAR-TABLE for a range of characters RANGE to VALUE.
2653 RANGE should be t (for all characters), nil (for the default value),
2654 a character set, a vector which identifies a character set, a row of a
2655 character set, or a character code. Return VALUE. */)
2656 (char_table, range, value)
2657 Lisp_Object char_table, range, value;
2659 int i;
2661 CHECK_CHAR_TABLE (char_table);
2663 if (EQ (range, Qt))
2664 for (i = 0; i < CHAR_TABLE_ORDINARY_SLOTS; i++)
2666 /* Don't set these special slots used for default values of
2667 ascii, eight-bit-control, and eight-bit-graphic. */
2668 if (i != CHAR_TABLE_DEFAULT_SLOT_ASCII
2669 && i != CHAR_TABLE_DEFAULT_SLOT_8_BIT_CONTROL
2670 && i != CHAR_TABLE_DEFAULT_SLOT_8_BIT_GRAPHIC)
2671 XCHAR_TABLE (char_table)->contents[i] = value;
2673 else if (EQ (range, Qnil))
2674 XCHAR_TABLE (char_table)->defalt = value;
2675 else if (SYMBOLP (range))
2677 Lisp_Object charset_info;
2678 int charset_id;
2680 charset_info = Fget (range, Qcharset);
2681 if (! VECTORP (charset_info)
2682 || ! NATNUMP (AREF (charset_info, 0))
2683 || (charset_id = XINT (AREF (charset_info, 0)),
2684 ! CHARSET_DEFINED_P (charset_id)))
2685 error ("Invalid charset: %s", SDATA (SYMBOL_NAME (range)));
2687 if (charset_id == CHARSET_ASCII)
2688 for (i = 0; i < 128; i++)
2689 XCHAR_TABLE (char_table)->contents[i] = value;
2690 else if (charset_id == CHARSET_8_BIT_CONTROL)
2691 for (i = 128; i < 160; i++)
2692 XCHAR_TABLE (char_table)->contents[i] = value;
2693 else if (charset_id == CHARSET_8_BIT_GRAPHIC)
2694 for (i = 160; i < 256; i++)
2695 XCHAR_TABLE (char_table)->contents[i] = value;
2696 else
2697 XCHAR_TABLE (char_table)->contents[charset_id + 128] = value;
2699 else if (INTEGERP (range))
2700 Faset (char_table, range, value);
2701 else if (VECTORP (range))
2703 int size = XVECTOR (range)->size;
2704 Lisp_Object *val = XVECTOR (range)->contents;
2705 Lisp_Object ch = Fmake_char_internal (size <= 0 ? Qnil : val[0],
2706 size <= 1 ? Qnil : val[1],
2707 size <= 2 ? Qnil : val[2]);
2708 Faset (char_table, ch, value);
2710 else
2711 error ("Invalid RANGE argument to `set-char-table-range'");
2713 return value;
2716 DEFUN ("set-char-table-default", Fset_char_table_default,
2717 Sset_char_table_default, 3, 3, 0,
2718 doc: /* Set the default value in CHAR-TABLE for generic character CH to VALUE.
2719 The generic character specifies the group of characters.
2720 If CH is a normal character, set the default value for a group of
2721 characters to which CH belongs.
2722 See also the documentation of `make-char'. */)
2723 (char_table, ch, value)
2724 Lisp_Object char_table, ch, value;
2726 int c, charset, code1, code2;
2727 Lisp_Object temp;
2729 CHECK_CHAR_TABLE (char_table);
2730 CHECK_NUMBER (ch);
2732 c = XINT (ch);
2733 SPLIT_CHAR (c, charset, code1, code2);
2735 /* Since we may want to set the default value for a character set
2736 not yet defined, we check only if the character set is in the
2737 valid range or not, instead of it is already defined or not. */
2738 if (! CHARSET_VALID_P (charset))
2739 invalid_character (c);
2741 if (SINGLE_BYTE_CHAR_P (c))
2743 /* We use special slots for the default values of single byte
2744 characters. */
2745 int default_slot
2746 = (c < 0x80 ? CHAR_TABLE_DEFAULT_SLOT_ASCII
2747 : c < 0xA0 ? CHAR_TABLE_DEFAULT_SLOT_8_BIT_CONTROL
2748 : CHAR_TABLE_DEFAULT_SLOT_8_BIT_GRAPHIC);
2750 return (XCHAR_TABLE (char_table)->contents[default_slot] = value);
2753 /* Even if C is not a generic char, we had better behave as if a
2754 generic char is specified. */
2755 if (!CHARSET_DEFINED_P (charset) || CHARSET_DIMENSION (charset) == 1)
2756 code1 = 0;
2757 temp = XCHAR_TABLE (char_table)->contents[charset + 128];
2758 if (! SUB_CHAR_TABLE_P (temp))
2760 temp = make_sub_char_table (temp);
2761 XCHAR_TABLE (char_table)->contents[charset + 128] = temp;
2763 if (!code1)
2765 XCHAR_TABLE (temp)->defalt = value;
2766 return value;
2768 char_table = temp;
2769 temp = XCHAR_TABLE (char_table)->contents[code1];
2770 if (SUB_CHAR_TABLE_P (temp))
2771 XCHAR_TABLE (temp)->defalt = value;
2772 else
2773 XCHAR_TABLE (char_table)->contents[code1] = value;
2774 return value;
2777 /* Look up the element in TABLE at index CH,
2778 and return it as an integer.
2779 If the element is nil, return CH itself.
2780 (Actually we do that for any non-integer.) */
2783 char_table_translate (table, ch)
2784 Lisp_Object table;
2785 int ch;
2787 Lisp_Object value;
2788 value = Faref (table, make_number (ch));
2789 if (! INTEGERP (value))
2790 return ch;
2791 return XINT (value);
2794 static void
2795 optimize_sub_char_table (table, chars)
2796 Lisp_Object *table;
2797 int chars;
2799 Lisp_Object elt;
2800 int from, to;
2802 if (chars == 94)
2803 from = 33, to = 127;
2804 else
2805 from = 32, to = 128;
2807 if (!SUB_CHAR_TABLE_P (*table))
2808 return;
2809 elt = XCHAR_TABLE (*table)->contents[from++];
2810 for (; from < to; from++)
2811 if (NILP (Fequal (elt, XCHAR_TABLE (*table)->contents[from])))
2812 return;
2813 *table = elt;
2816 DEFUN ("optimize-char-table", Foptimize_char_table, Soptimize_char_table,
2817 1, 1, 0, doc: /* Optimize char table TABLE. */)
2818 (table)
2819 Lisp_Object table;
2821 Lisp_Object elt;
2822 int dim;
2823 int i, j;
2825 CHECK_CHAR_TABLE (table);
2827 for (i = CHAR_TABLE_SINGLE_BYTE_SLOTS; i < CHAR_TABLE_ORDINARY_SLOTS; i++)
2829 elt = XCHAR_TABLE (table)->contents[i];
2830 if (!SUB_CHAR_TABLE_P (elt))
2831 continue;
2832 dim = CHARSET_DIMENSION (i - 128);
2833 if (dim == 2)
2834 for (j = 32; j < SUB_CHAR_TABLE_ORDINARY_SLOTS; j++)
2835 optimize_sub_char_table (XCHAR_TABLE (elt)->contents + j, dim);
2836 optimize_sub_char_table (XCHAR_TABLE (table)->contents + i, dim);
2838 return Qnil;
2842 /* Map C_FUNCTION or FUNCTION over SUBTABLE, calling it for each
2843 character or group of characters that share a value.
2844 DEPTH is the current depth in the originally specified
2845 chartable, and INDICES contains the vector indices
2846 for the levels our callers have descended.
2848 ARG is passed to C_FUNCTION when that is called. */
2850 void
2851 map_char_table (c_function, function, table, subtable, arg, depth, indices)
2852 void (*c_function) P_ ((Lisp_Object, Lisp_Object, Lisp_Object));
2853 Lisp_Object function, table, subtable, arg, *indices;
2854 int depth;
2856 int i, to;
2857 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
2859 GCPRO4 (arg, table, subtable, function);
2861 if (depth == 0)
2863 /* At first, handle ASCII and 8-bit European characters. */
2864 for (i = 0; i < CHAR_TABLE_SINGLE_BYTE_SLOTS; i++)
2866 Lisp_Object elt= XCHAR_TABLE (subtable)->contents[i];
2867 if (NILP (elt))
2868 elt = XCHAR_TABLE (subtable)->defalt;
2869 if (NILP (elt))
2870 elt = Faref (subtable, make_number (i));
2871 if (c_function)
2872 (*c_function) (arg, make_number (i), elt);
2873 else
2874 call2 (function, make_number (i), elt);
2876 #if 0 /* If the char table has entries for higher characters,
2877 we should report them. */
2878 if (NILP (current_buffer->enable_multibyte_characters))
2880 UNGCPRO;
2881 return;
2883 #endif
2884 to = CHAR_TABLE_ORDINARY_SLOTS;
2886 else
2888 int charset = XFASTINT (indices[0]) - 128;
2890 i = 32;
2891 to = SUB_CHAR_TABLE_ORDINARY_SLOTS;
2892 if (CHARSET_CHARS (charset) == 94)
2893 i++, to--;
2896 for (; i < to; i++)
2898 Lisp_Object elt;
2899 int charset;
2901 elt = XCHAR_TABLE (subtable)->contents[i];
2902 XSETFASTINT (indices[depth], i);
2903 charset = XFASTINT (indices[0]) - 128;
2904 if (depth == 0
2905 && (!CHARSET_DEFINED_P (charset)
2906 || charset == CHARSET_8_BIT_CONTROL
2907 || charset == CHARSET_8_BIT_GRAPHIC))
2908 continue;
2910 if (SUB_CHAR_TABLE_P (elt))
2912 if (depth >= 3)
2913 error ("Too deep char table");
2914 map_char_table (c_function, function, table, elt, arg, depth + 1, indices);
2916 else
2918 int c1, c2, c;
2920 c1 = depth >= 1 ? XFASTINT (indices[1]) : 0;
2921 c2 = depth >= 2 ? XFASTINT (indices[2]) : 0;
2922 c = MAKE_CHAR (charset, c1, c2);
2924 if (NILP (elt))
2925 elt = XCHAR_TABLE (subtable)->defalt;
2926 if (NILP (elt))
2927 elt = Faref (table, make_number (c));
2929 if (c_function)
2930 (*c_function) (arg, make_number (c), elt);
2931 else
2932 call2 (function, make_number (c), elt);
2935 UNGCPRO;
2938 static void void_call2 P_ ((Lisp_Object a, Lisp_Object b, Lisp_Object c));
2939 static void
2940 void_call2 (a, b, c)
2941 Lisp_Object a, b, c;
2943 call2 (a, b, c);
2946 DEFUN ("map-char-table", Fmap_char_table, Smap_char_table,
2947 2, 2, 0,
2948 doc: /* Call FUNCTION for each (normal and generic) characters in CHAR-TABLE.
2949 FUNCTION is called with two arguments--a key and a value.
2950 The key is always a possible IDX argument to `aref'. */)
2951 (function, char_table)
2952 Lisp_Object function, char_table;
2954 /* The depth of char table is at most 3. */
2955 Lisp_Object indices[3];
2957 CHECK_CHAR_TABLE (char_table);
2959 /* When Lisp_Object is represented as a union, `call2' cannot directly
2960 be passed to map_char_table because it returns a Lisp_Object rather
2961 than returning nothing.
2962 Casting leads to crashes on some architectures. -stef */
2963 map_char_table (void_call2, Qnil, char_table, char_table, function, 0, indices);
2964 return Qnil;
2967 /* Return a value for character C in char-table TABLE. Store the
2968 actual index for that value in *IDX. Ignore the default value of
2969 TABLE. */
2971 Lisp_Object
2972 char_table_ref_and_index (table, c, idx)
2973 Lisp_Object table;
2974 int c, *idx;
2976 int charset, c1, c2;
2977 Lisp_Object elt;
2979 if (SINGLE_BYTE_CHAR_P (c))
2981 *idx = c;
2982 return XCHAR_TABLE (table)->contents[c];
2984 SPLIT_CHAR (c, charset, c1, c2);
2985 elt = XCHAR_TABLE (table)->contents[charset + 128];
2986 *idx = MAKE_CHAR (charset, 0, 0);
2987 if (!SUB_CHAR_TABLE_P (elt))
2988 return elt;
2989 if (c1 < 32 || NILP (XCHAR_TABLE (elt)->contents[c1]))
2990 return XCHAR_TABLE (elt)->defalt;
2991 elt = XCHAR_TABLE (elt)->contents[c1];
2992 *idx = MAKE_CHAR (charset, c1, 0);
2993 if (!SUB_CHAR_TABLE_P (elt))
2994 return elt;
2995 if (c2 < 32 || NILP (XCHAR_TABLE (elt)->contents[c2]))
2996 return XCHAR_TABLE (elt)->defalt;
2997 *idx = c;
2998 return XCHAR_TABLE (elt)->contents[c2];
3002 /* ARGSUSED */
3003 Lisp_Object
3004 nconc2 (s1, s2)
3005 Lisp_Object s1, s2;
3007 #ifdef NO_ARG_ARRAY
3008 Lisp_Object args[2];
3009 args[0] = s1;
3010 args[1] = s2;
3011 return Fnconc (2, args);
3012 #else
3013 return Fnconc (2, &s1);
3014 #endif /* NO_ARG_ARRAY */
3017 DEFUN ("nconc", Fnconc, Snconc, 0, MANY, 0,
3018 doc: /* Concatenate any number of lists by altering them.
3019 Only the last argument is not altered, and need not be a list.
3020 usage: (nconc &rest LISTS) */)
3021 (nargs, args)
3022 int nargs;
3023 Lisp_Object *args;
3025 register int argnum;
3026 register Lisp_Object tail, tem, val;
3028 val = tail = Qnil;
3030 for (argnum = 0; argnum < nargs; argnum++)
3032 tem = args[argnum];
3033 if (NILP (tem)) continue;
3035 if (NILP (val))
3036 val = tem;
3038 if (argnum + 1 == nargs) break;
3040 if (!CONSP (tem))
3041 tem = wrong_type_argument (Qlistp, tem);
3043 while (CONSP (tem))
3045 tail = tem;
3046 tem = XCDR (tail);
3047 QUIT;
3050 tem = args[argnum + 1];
3051 Fsetcdr (tail, tem);
3052 if (NILP (tem))
3053 args[argnum + 1] = tail;
3056 return val;
3059 /* This is the guts of all mapping functions.
3060 Apply FN to each element of SEQ, one by one,
3061 storing the results into elements of VALS, a C vector of Lisp_Objects.
3062 LENI is the length of VALS, which should also be the length of SEQ. */
3064 static void
3065 mapcar1 (leni, vals, fn, seq)
3066 int leni;
3067 Lisp_Object *vals;
3068 Lisp_Object fn, seq;
3070 register Lisp_Object tail;
3071 Lisp_Object dummy;
3072 register int i;
3073 struct gcpro gcpro1, gcpro2, gcpro3;
3075 if (vals)
3077 /* Don't let vals contain any garbage when GC happens. */
3078 for (i = 0; i < leni; i++)
3079 vals[i] = Qnil;
3081 GCPRO3 (dummy, fn, seq);
3082 gcpro1.var = vals;
3083 gcpro1.nvars = leni;
3085 else
3086 GCPRO2 (fn, seq);
3087 /* We need not explicitly protect `tail' because it is used only on lists, and
3088 1) lists are not relocated and 2) the list is marked via `seq' so will not be freed */
3090 if (VECTORP (seq))
3092 for (i = 0; i < leni; i++)
3094 dummy = XVECTOR (seq)->contents[i];
3095 dummy = call1 (fn, dummy);
3096 if (vals)
3097 vals[i] = dummy;
3100 else if (BOOL_VECTOR_P (seq))
3102 for (i = 0; i < leni; i++)
3104 int byte;
3105 byte = XBOOL_VECTOR (seq)->data[i / BOOL_VECTOR_BITS_PER_CHAR];
3106 if (byte & (1 << (i % BOOL_VECTOR_BITS_PER_CHAR)))
3107 dummy = Qt;
3108 else
3109 dummy = Qnil;
3111 dummy = call1 (fn, dummy);
3112 if (vals)
3113 vals[i] = dummy;
3116 else if (STRINGP (seq))
3118 int i_byte;
3120 for (i = 0, i_byte = 0; i < leni;)
3122 int c;
3123 int i_before = i;
3125 FETCH_STRING_CHAR_ADVANCE (c, seq, i, i_byte);
3126 XSETFASTINT (dummy, c);
3127 dummy = call1 (fn, dummy);
3128 if (vals)
3129 vals[i_before] = dummy;
3132 else /* Must be a list, since Flength did not get an error */
3134 tail = seq;
3135 for (i = 0; i < leni && CONSP (tail); i++)
3137 dummy = call1 (fn, XCAR (tail));
3138 if (vals)
3139 vals[i] = dummy;
3140 tail = XCDR (tail);
3144 UNGCPRO;
3147 DEFUN ("mapconcat", Fmapconcat, Smapconcat, 3, 3, 0,
3148 doc: /* Apply FUNCTION to each element of SEQUENCE, and concat the results as strings.
3149 In between each pair of results, stick in SEPARATOR. Thus, " " as
3150 SEPARATOR results in spaces between the values returned by FUNCTION.
3151 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
3152 (function, sequence, separator)
3153 Lisp_Object function, sequence, separator;
3155 Lisp_Object len;
3156 register int leni;
3157 int nargs;
3158 register Lisp_Object *args;
3159 register int i;
3160 struct gcpro gcpro1;
3161 Lisp_Object ret;
3162 USE_SAFE_ALLOCA;
3164 len = Flength (sequence);
3165 leni = XINT (len);
3166 nargs = leni + leni - 1;
3167 if (nargs < 0) return build_string ("");
3169 SAFE_ALLOCA_LISP (args, nargs);
3171 GCPRO1 (separator);
3172 mapcar1 (leni, args, function, sequence);
3173 UNGCPRO;
3175 for (i = leni - 1; i > 0; i--)
3176 args[i + i] = args[i];
3178 for (i = 1; i < nargs; i += 2)
3179 args[i] = separator;
3181 ret = Fconcat (nargs, args);
3182 SAFE_FREE ();
3184 return ret;
3187 DEFUN ("mapcar", Fmapcar, Smapcar, 2, 2, 0,
3188 doc: /* Apply FUNCTION to each element of SEQUENCE, and make a list of the results.
3189 The result is a list just as long as SEQUENCE.
3190 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
3191 (function, sequence)
3192 Lisp_Object function, sequence;
3194 register Lisp_Object len;
3195 register int leni;
3196 register Lisp_Object *args;
3197 Lisp_Object ret;
3198 USE_SAFE_ALLOCA;
3200 len = Flength (sequence);
3201 leni = XFASTINT (len);
3203 SAFE_ALLOCA_LISP (args, leni);
3205 mapcar1 (leni, args, function, sequence);
3207 ret = Flist (leni, args);
3208 SAFE_FREE ();
3210 return ret;
3213 DEFUN ("mapc", Fmapc, Smapc, 2, 2, 0,
3214 doc: /* Apply FUNCTION to each element of SEQUENCE for side effects only.
3215 Unlike `mapcar', don't accumulate the results. Return SEQUENCE.
3216 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
3217 (function, sequence)
3218 Lisp_Object function, sequence;
3220 register int leni;
3222 leni = XFASTINT (Flength (sequence));
3223 mapcar1 (leni, 0, function, sequence);
3225 return sequence;
3228 /* Anything that calls this function must protect from GC! */
3230 DEFUN ("y-or-n-p", Fy_or_n_p, Sy_or_n_p, 1, 1, 0,
3231 doc: /* Ask user a "y or n" question. Return t if answer is "y".
3232 Takes one argument, which is the string to display to ask the question.
3233 It should end in a space; `y-or-n-p' adds `(y or n) ' to it.
3234 No confirmation of the answer is requested; a single character is enough.
3235 Also accepts Space to mean yes, or Delete to mean no. \(Actually, it uses
3236 the bindings in `query-replace-map'; see the documentation of that variable
3237 for more information. In this case, the useful bindings are `act', `skip',
3238 `recenter', and `quit'.\)
3240 Under a windowing system a dialog box will be used if `last-nonmenu-event'
3241 is nil and `use-dialog-box' is non-nil. */)
3242 (prompt)
3243 Lisp_Object prompt;
3245 register Lisp_Object obj, key, def, map;
3246 register int answer;
3247 Lisp_Object xprompt;
3248 Lisp_Object args[2];
3249 struct gcpro gcpro1, gcpro2;
3250 int count = SPECPDL_INDEX ();
3252 specbind (Qcursor_in_echo_area, Qt);
3254 map = Fsymbol_value (intern ("query-replace-map"));
3256 CHECK_STRING (prompt);
3257 xprompt = prompt;
3258 GCPRO2 (prompt, xprompt);
3260 #ifdef HAVE_X_WINDOWS
3261 if (display_hourglass_p)
3262 cancel_hourglass ();
3263 #endif
3265 while (1)
3268 #ifdef HAVE_MENUS
3269 if ((NILP (last_nonmenu_event) || CONSP (last_nonmenu_event))
3270 && use_dialog_box
3271 && have_menus_p ())
3273 Lisp_Object pane, menu;
3274 redisplay_preserve_echo_area (3);
3275 pane = Fcons (Fcons (build_string ("Yes"), Qt),
3276 Fcons (Fcons (build_string ("No"), Qnil),
3277 Qnil));
3278 menu = Fcons (prompt, pane);
3279 obj = Fx_popup_dialog (Qt, menu, Qnil);
3280 answer = !NILP (obj);
3281 break;
3283 #endif /* HAVE_MENUS */
3284 cursor_in_echo_area = 1;
3285 choose_minibuf_frame ();
3288 Lisp_Object pargs[3];
3290 /* Colorize prompt according to `minibuffer-prompt' face. */
3291 pargs[0] = build_string ("%s(y or n) ");
3292 pargs[1] = intern ("face");
3293 pargs[2] = intern ("minibuffer-prompt");
3294 args[0] = Fpropertize (3, pargs);
3295 args[1] = xprompt;
3296 Fmessage (2, args);
3299 if (minibuffer_auto_raise)
3301 Lisp_Object mini_frame;
3303 mini_frame = WINDOW_FRAME (XWINDOW (minibuf_window));
3305 Fraise_frame (mini_frame);
3308 obj = read_filtered_event (1, 0, 0, 0);
3309 cursor_in_echo_area = 0;
3310 /* If we need to quit, quit with cursor_in_echo_area = 0. */
3311 QUIT;
3313 key = Fmake_vector (make_number (1), obj);
3314 def = Flookup_key (map, key, Qt);
3316 if (EQ (def, intern ("skip")))
3318 answer = 0;
3319 break;
3321 else if (EQ (def, intern ("act")))
3323 answer = 1;
3324 break;
3326 else if (EQ (def, intern ("recenter")))
3328 Frecenter (Qnil);
3329 xprompt = prompt;
3330 continue;
3332 else if (EQ (def, intern ("quit")))
3333 Vquit_flag = Qt;
3334 /* We want to exit this command for exit-prefix,
3335 and this is the only way to do it. */
3336 else if (EQ (def, intern ("exit-prefix")))
3337 Vquit_flag = Qt;
3339 QUIT;
3341 /* If we don't clear this, then the next call to read_char will
3342 return quit_char again, and we'll enter an infinite loop. */
3343 Vquit_flag = Qnil;
3345 Fding (Qnil);
3346 Fdiscard_input ();
3347 if (EQ (xprompt, prompt))
3349 args[0] = build_string ("Please answer y or n. ");
3350 args[1] = prompt;
3351 xprompt = Fconcat (2, args);
3354 UNGCPRO;
3356 if (! noninteractive)
3358 cursor_in_echo_area = -1;
3359 message_with_string (answer ? "%s(y or n) y" : "%s(y or n) n",
3360 xprompt, 0);
3363 unbind_to (count, Qnil);
3364 return answer ? Qt : Qnil;
3367 /* This is how C code calls `yes-or-no-p' and allows the user
3368 to redefined it.
3370 Anything that calls this function must protect from GC! */
3372 Lisp_Object
3373 do_yes_or_no_p (prompt)
3374 Lisp_Object prompt;
3376 return call1 (intern ("yes-or-no-p"), prompt);
3379 /* Anything that calls this function must protect from GC! */
3381 DEFUN ("yes-or-no-p", Fyes_or_no_p, Syes_or_no_p, 1, 1, 0,
3382 doc: /* Ask user a yes-or-no question. Return t if answer is yes.
3383 Takes one argument, which is the string to display to ask the question.
3384 It should end in a space; `yes-or-no-p' adds `(yes or no) ' to it.
3385 The user must confirm the answer with RET,
3386 and can edit it until it has been confirmed.
3388 Under a windowing system a dialog box will be used if `last-nonmenu-event'
3389 is nil, and `use-dialog-box' is non-nil. */)
3390 (prompt)
3391 Lisp_Object prompt;
3393 register Lisp_Object ans;
3394 Lisp_Object args[2];
3395 struct gcpro gcpro1;
3397 CHECK_STRING (prompt);
3399 #ifdef HAVE_MENUS
3400 if ((NILP (last_nonmenu_event) || CONSP (last_nonmenu_event))
3401 && use_dialog_box
3402 && have_menus_p ())
3404 Lisp_Object pane, menu, obj;
3405 redisplay_preserve_echo_area (4);
3406 pane = Fcons (Fcons (build_string ("Yes"), Qt),
3407 Fcons (Fcons (build_string ("No"), Qnil),
3408 Qnil));
3409 GCPRO1 (pane);
3410 menu = Fcons (prompt, pane);
3411 obj = Fx_popup_dialog (Qt, menu, Qnil);
3412 UNGCPRO;
3413 return obj;
3415 #endif /* HAVE_MENUS */
3417 args[0] = prompt;
3418 args[1] = build_string ("(yes or no) ");
3419 prompt = Fconcat (2, args);
3421 GCPRO1 (prompt);
3423 while (1)
3425 ans = Fdowncase (Fread_from_minibuffer (prompt, Qnil, Qnil, Qnil,
3426 Qyes_or_no_p_history, Qnil,
3427 Qnil, Qnil));
3428 if (SCHARS (ans) == 3 && !strcmp (SDATA (ans), "yes"))
3430 UNGCPRO;
3431 return Qt;
3433 if (SCHARS (ans) == 2 && !strcmp (SDATA (ans), "no"))
3435 UNGCPRO;
3436 return Qnil;
3439 Fding (Qnil);
3440 Fdiscard_input ();
3441 message ("Please answer yes or no.");
3442 Fsleep_for (make_number (2), Qnil);
3446 DEFUN ("load-average", Fload_average, Sload_average, 0, 1, 0,
3447 doc: /* Return list of 1 minute, 5 minute and 15 minute load averages.
3449 Each of the three load averages is multiplied by 100, then converted
3450 to integer.
3452 When USE-FLOATS is non-nil, floats will be used instead of integers.
3453 These floats are not multiplied by 100.
3455 If the 5-minute or 15-minute load averages are not available, return a
3456 shortened list, containing only those averages which are available.
3458 An error is thrown if the load average can't be obtained. In some
3459 cases making it work would require Emacs being installed setuid or
3460 setgid so that it can read kernel information, and that usually isn't
3461 advisable. */)
3462 (use_floats)
3463 Lisp_Object use_floats;
3465 double load_ave[3];
3466 int loads = getloadavg (load_ave, 3);
3467 Lisp_Object ret = Qnil;
3469 if (loads < 0)
3470 error ("load-average not implemented for this operating system");
3472 while (loads-- > 0)
3474 Lisp_Object load = (NILP (use_floats) ?
3475 make_number ((int) (100.0 * load_ave[loads]))
3476 : make_float (load_ave[loads]));
3477 ret = Fcons (load, ret);
3480 return ret;
3483 Lisp_Object Vfeatures, Qsubfeatures;
3484 extern Lisp_Object Vafter_load_alist;
3486 DEFUN ("featurep", Ffeaturep, Sfeaturep, 1, 2, 0,
3487 doc: /* Returns t if FEATURE is present in this Emacs.
3489 Use this to conditionalize execution of lisp code based on the
3490 presence or absence of emacs or environment extensions.
3491 Use `provide' to declare that a feature is available. This function
3492 looks at the value of the variable `features'. The optional argument
3493 SUBFEATURE can be used to check a specific subfeature of FEATURE. */)
3494 (feature, subfeature)
3495 Lisp_Object feature, subfeature;
3497 register Lisp_Object tem;
3498 CHECK_SYMBOL (feature);
3499 tem = Fmemq (feature, Vfeatures);
3500 if (!NILP (tem) && !NILP (subfeature))
3501 tem = Fmember (subfeature, Fget (feature, Qsubfeatures));
3502 return (NILP (tem)) ? Qnil : Qt;
3505 DEFUN ("provide", Fprovide, Sprovide, 1, 2, 0,
3506 doc: /* Announce that FEATURE is a feature of the current Emacs.
3507 The optional argument SUBFEATURES should be a list of symbols listing
3508 particular subfeatures supported in this version of FEATURE. */)
3509 (feature, subfeatures)
3510 Lisp_Object feature, subfeatures;
3512 register Lisp_Object tem;
3513 CHECK_SYMBOL (feature);
3514 CHECK_LIST (subfeatures);
3515 if (!NILP (Vautoload_queue))
3516 Vautoload_queue = Fcons (Fcons (Vfeatures, Qnil), Vautoload_queue);
3517 tem = Fmemq (feature, Vfeatures);
3518 if (NILP (tem))
3519 Vfeatures = Fcons (feature, Vfeatures);
3520 if (!NILP (subfeatures))
3521 Fput (feature, Qsubfeatures, subfeatures);
3522 LOADHIST_ATTACH (Fcons (Qprovide, feature));
3524 /* Run any load-hooks for this file. */
3525 tem = Fassq (feature, Vafter_load_alist);
3526 if (CONSP (tem))
3527 Fprogn (XCDR (tem));
3529 return feature;
3532 /* `require' and its subroutines. */
3534 /* List of features currently being require'd, innermost first. */
3536 Lisp_Object require_nesting_list;
3538 Lisp_Object
3539 require_unwind (old_value)
3540 Lisp_Object old_value;
3542 return require_nesting_list = old_value;
3545 DEFUN ("require", Frequire, Srequire, 1, 3, 0,
3546 doc: /* If feature FEATURE is not loaded, load it from FILENAME.
3547 If FEATURE is not a member of the list `features', then the feature
3548 is not loaded; so load the file FILENAME.
3549 If FILENAME is omitted, the printname of FEATURE is used as the file name,
3550 and `load' will try to load this name appended with the suffix `.elc' or
3551 `.el', in that order. The name without appended suffix will not be used.
3552 If the optional third argument NOERROR is non-nil,
3553 then return nil if the file is not found instead of signaling an error.
3554 Normally the return value is FEATURE.
3555 The normal messages at start and end of loading FILENAME are suppressed. */)
3556 (feature, filename, noerror)
3557 Lisp_Object feature, filename, noerror;
3559 register Lisp_Object tem;
3560 struct gcpro gcpro1, gcpro2;
3562 CHECK_SYMBOL (feature);
3564 /* Record the presence of `require' in this file
3565 even if the feature specified is already loaded.
3566 But not more than once in any file,
3567 and not when we aren't loading a file. */
3568 if (load_in_progress)
3570 tem = Fcons (Qrequire, feature);
3571 if (NILP (Fmember (tem, Vcurrent_load_list)))
3572 LOADHIST_ATTACH (tem);
3574 tem = Fmemq (feature, Vfeatures);
3576 if (NILP (tem))
3578 int count = SPECPDL_INDEX ();
3579 int nesting = 0;
3581 /* This is to make sure that loadup.el gives a clear picture
3582 of what files are preloaded and when. */
3583 if (! NILP (Vpurify_flag))
3584 error ("(require %s) while preparing to dump",
3585 SDATA (SYMBOL_NAME (feature)));
3587 /* A certain amount of recursive `require' is legitimate,
3588 but if we require the same feature recursively 3 times,
3589 signal an error. */
3590 tem = require_nesting_list;
3591 while (! NILP (tem))
3593 if (! NILP (Fequal (feature, XCAR (tem))))
3594 nesting++;
3595 tem = XCDR (tem);
3597 if (nesting > 3)
3598 error ("Recursive `require' for feature `%s'",
3599 SDATA (SYMBOL_NAME (feature)));
3601 /* Update the list for any nested `require's that occur. */
3602 record_unwind_protect (require_unwind, require_nesting_list);
3603 require_nesting_list = Fcons (feature, require_nesting_list);
3605 /* Value saved here is to be restored into Vautoload_queue */
3606 record_unwind_protect (un_autoload, Vautoload_queue);
3607 Vautoload_queue = Qt;
3609 /* Load the file. */
3610 GCPRO2 (feature, filename);
3611 tem = Fload (NILP (filename) ? Fsymbol_name (feature) : filename,
3612 noerror, Qt, Qnil, (NILP (filename) ? Qt : Qnil));
3613 UNGCPRO;
3615 /* If load failed entirely, return nil. */
3616 if (NILP (tem))
3617 return unbind_to (count, Qnil);
3619 tem = Fmemq (feature, Vfeatures);
3620 if (NILP (tem))
3621 error ("Required feature `%s' was not provided",
3622 SDATA (SYMBOL_NAME (feature)));
3624 /* Once loading finishes, don't undo it. */
3625 Vautoload_queue = Qt;
3626 feature = unbind_to (count, feature);
3629 return feature;
3632 /* Primitives for work of the "widget" library.
3633 In an ideal world, this section would not have been necessary.
3634 However, lisp function calls being as slow as they are, it turns
3635 out that some functions in the widget library (wid-edit.el) are the
3636 bottleneck of Widget operation. Here is their translation to C,
3637 for the sole reason of efficiency. */
3639 DEFUN ("plist-member", Fplist_member, Splist_member, 2, 2, 0,
3640 doc: /* Return non-nil if PLIST has the property PROP.
3641 PLIST is a property list, which is a list of the form
3642 \(PROP1 VALUE1 PROP2 VALUE2 ...\). PROP is a symbol.
3643 Unlike `plist-get', this allows you to distinguish between a missing
3644 property and a property with the value nil.
3645 The value is actually the tail of PLIST whose car is PROP. */)
3646 (plist, prop)
3647 Lisp_Object plist, prop;
3649 while (CONSP (plist) && !EQ (XCAR (plist), prop))
3651 QUIT;
3652 plist = XCDR (plist);
3653 plist = CDR (plist);
3655 return plist;
3658 DEFUN ("widget-put", Fwidget_put, Swidget_put, 3, 3, 0,
3659 doc: /* In WIDGET, set PROPERTY to VALUE.
3660 The value can later be retrieved with `widget-get'. */)
3661 (widget, property, value)
3662 Lisp_Object widget, property, value;
3664 CHECK_CONS (widget);
3665 XSETCDR (widget, Fplist_put (XCDR (widget), property, value));
3666 return value;
3669 DEFUN ("widget-get", Fwidget_get, Swidget_get, 2, 2, 0,
3670 doc: /* In WIDGET, get the value of PROPERTY.
3671 The value could either be specified when the widget was created, or
3672 later with `widget-put'. */)
3673 (widget, property)
3674 Lisp_Object widget, property;
3676 Lisp_Object tmp;
3678 while (1)
3680 if (NILP (widget))
3681 return Qnil;
3682 CHECK_CONS (widget);
3683 tmp = Fplist_member (XCDR (widget), property);
3684 if (CONSP (tmp))
3686 tmp = XCDR (tmp);
3687 return CAR (tmp);
3689 tmp = XCAR (widget);
3690 if (NILP (tmp))
3691 return Qnil;
3692 widget = Fget (tmp, Qwidget_type);
3696 DEFUN ("widget-apply", Fwidget_apply, Swidget_apply, 2, MANY, 0,
3697 doc: /* Apply the value of WIDGET's PROPERTY to the widget itself.
3698 ARGS are passed as extra arguments to the function.
3699 usage: (widget-apply WIDGET PROPERTY &rest ARGS) */)
3700 (nargs, args)
3701 int nargs;
3702 Lisp_Object *args;
3704 /* This function can GC. */
3705 Lisp_Object newargs[3];
3706 struct gcpro gcpro1, gcpro2;
3707 Lisp_Object result;
3709 newargs[0] = Fwidget_get (args[0], args[1]);
3710 newargs[1] = args[0];
3711 newargs[2] = Flist (nargs - 2, args + 2);
3712 GCPRO2 (newargs[0], newargs[2]);
3713 result = Fapply (3, newargs);
3714 UNGCPRO;
3715 return result;
3718 #ifdef HAVE_LANGINFO_CODESET
3719 #include <langinfo.h>
3720 #endif
3722 DEFUN ("locale-info", Flocale_info, Slocale_info, 1, 1, 0,
3723 doc: /* Access locale data ITEM for the current C locale, if available.
3724 ITEM should be one of the following:
3726 `codeset', returning the character set as a string (locale item CODESET);
3728 `days', returning a 7-element vector of day names (locale items DAY_n);
3730 `months', returning a 12-element vector of month names (locale items MON_n);
3732 `paper', returning a list (WIDTH HEIGHT) for the default paper size,
3733 both measured in milimeters (locale items PAPER_WIDTH, PAPER_HEIGHT).
3735 If the system can't provide such information through a call to
3736 `nl_langinfo', or if ITEM isn't from the list above, return nil.
3738 See also Info node `(libc)Locales'.
3740 The data read from the system are decoded using `locale-coding-system'. */)
3741 (item)
3742 Lisp_Object item;
3744 char *str = NULL;
3745 #ifdef HAVE_LANGINFO_CODESET
3746 Lisp_Object val;
3747 if (EQ (item, Qcodeset))
3749 str = nl_langinfo (CODESET);
3750 return build_string (str);
3752 #ifdef DAY_1
3753 else if (EQ (item, Qdays)) /* e.g. for calendar-day-name-array */
3755 Lisp_Object v = Fmake_vector (make_number (7), Qnil);
3756 int days[7] = {DAY_1, DAY_2, DAY_3, DAY_4, DAY_5, DAY_6, DAY_7};
3757 int i;
3758 synchronize_system_time_locale ();
3759 for (i = 0; i < 7; i++)
3761 str = nl_langinfo (days[i]);
3762 val = make_unibyte_string (str, strlen (str));
3763 /* Fixme: Is this coding system necessarily right, even if
3764 it is consistent with CODESET? If not, what to do? */
3765 Faset (v, make_number (i),
3766 code_convert_string_norecord (val, Vlocale_coding_system,
3767 0));
3769 return v;
3771 #endif /* DAY_1 */
3772 #ifdef MON_1
3773 else if (EQ (item, Qmonths)) /* e.g. for calendar-month-name-array */
3775 struct Lisp_Vector *p = allocate_vector (12);
3776 int months[12] = {MON_1, MON_2, MON_3, MON_4, MON_5, MON_6, MON_7,
3777 MON_8, MON_9, MON_10, MON_11, MON_12};
3778 int i;
3779 synchronize_system_time_locale ();
3780 for (i = 0; i < 12; i++)
3782 str = nl_langinfo (months[i]);
3783 val = make_unibyte_string (str, strlen (str));
3784 p->contents[i] =
3785 code_convert_string_norecord (val, Vlocale_coding_system, 0);
3787 XSETVECTOR (val, p);
3788 return val;
3790 #endif /* MON_1 */
3791 /* LC_PAPER stuff isn't defined as accessible in glibc as of 2.3.1,
3792 but is in the locale files. This could be used by ps-print. */
3793 #ifdef PAPER_WIDTH
3794 else if (EQ (item, Qpaper))
3796 return list2 (make_number (nl_langinfo (PAPER_WIDTH)),
3797 make_number (nl_langinfo (PAPER_HEIGHT)));
3799 #endif /* PAPER_WIDTH */
3800 #endif /* HAVE_LANGINFO_CODESET*/
3801 return Qnil;
3804 /* base64 encode/decode functions (RFC 2045).
3805 Based on code from GNU recode. */
3807 #define MIME_LINE_LENGTH 76
3809 #define IS_ASCII(Character) \
3810 ((Character) < 128)
3811 #define IS_BASE64(Character) \
3812 (IS_ASCII (Character) && base64_char_to_value[Character] >= 0)
3813 #define IS_BASE64_IGNORABLE(Character) \
3814 ((Character) == ' ' || (Character) == '\t' || (Character) == '\n' \
3815 || (Character) == '\f' || (Character) == '\r')
3817 /* Used by base64_decode_1 to retrieve a non-base64-ignorable
3818 character or return retval if there are no characters left to
3819 process. */
3820 #define READ_QUADRUPLET_BYTE(retval) \
3821 do \
3823 if (i == length) \
3825 if (nchars_return) \
3826 *nchars_return = nchars; \
3827 return (retval); \
3829 c = from[i++]; \
3831 while (IS_BASE64_IGNORABLE (c))
3833 /* Table of characters coding the 64 values. */
3834 static char base64_value_to_char[64] =
3836 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', /* 0- 9 */
3837 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', /* 10-19 */
3838 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', /* 20-29 */
3839 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', /* 30-39 */
3840 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', /* 40-49 */
3841 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', /* 50-59 */
3842 '8', '9', '+', '/' /* 60-63 */
3845 /* Table of base64 values for first 128 characters. */
3846 static short base64_char_to_value[128] =
3848 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0- 9 */
3849 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 10- 19 */
3850 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 20- 29 */
3851 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 30- 39 */
3852 -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, /* 40- 49 */
3853 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, /* 50- 59 */
3854 -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, /* 60- 69 */
3855 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, /* 70- 79 */
3856 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, /* 80- 89 */
3857 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, /* 90- 99 */
3858 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, /* 100-109 */
3859 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, /* 110-119 */
3860 49, 50, 51, -1, -1, -1, -1, -1 /* 120-127 */
3863 /* The following diagram shows the logical steps by which three octets
3864 get transformed into four base64 characters.
3866 .--------. .--------. .--------.
3867 |aaaaaabb| |bbbbcccc| |ccdddddd|
3868 `--------' `--------' `--------'
3869 6 2 4 4 2 6
3870 .--------+--------+--------+--------.
3871 |00aaaaaa|00bbbbbb|00cccccc|00dddddd|
3872 `--------+--------+--------+--------'
3874 .--------+--------+--------+--------.
3875 |AAAAAAAA|BBBBBBBB|CCCCCCCC|DDDDDDDD|
3876 `--------+--------+--------+--------'
3878 The octets are divided into 6 bit chunks, which are then encoded into
3879 base64 characters. */
3882 static int base64_encode_1 P_ ((const char *, char *, int, int, int));
3883 static int base64_decode_1 P_ ((const char *, char *, int, int, int *));
3885 DEFUN ("base64-encode-region", Fbase64_encode_region, Sbase64_encode_region,
3886 2, 3, "r",
3887 doc: /* Base64-encode the region between BEG and END.
3888 Return the length of the encoded text.
3889 Optional third argument NO-LINE-BREAK means do not break long lines
3890 into shorter lines. */)
3891 (beg, end, no_line_break)
3892 Lisp_Object beg, end, no_line_break;
3894 char *encoded;
3895 int allength, length;
3896 int ibeg, iend, encoded_length;
3897 int old_pos = PT;
3898 USE_SAFE_ALLOCA;
3900 validate_region (&beg, &end);
3902 ibeg = CHAR_TO_BYTE (XFASTINT (beg));
3903 iend = CHAR_TO_BYTE (XFASTINT (end));
3904 move_gap_both (XFASTINT (beg), ibeg);
3906 /* We need to allocate enough room for encoding the text.
3907 We need 33 1/3% more space, plus a newline every 76
3908 characters, and then we round up. */
3909 length = iend - ibeg;
3910 allength = length + length/3 + 1;
3911 allength += allength / MIME_LINE_LENGTH + 1 + 6;
3913 SAFE_ALLOCA (encoded, char *, allength);
3914 encoded_length = base64_encode_1 (BYTE_POS_ADDR (ibeg), encoded, length,
3915 NILP (no_line_break),
3916 !NILP (current_buffer->enable_multibyte_characters));
3917 if (encoded_length > allength)
3918 abort ();
3920 if (encoded_length < 0)
3922 /* The encoding wasn't possible. */
3923 SAFE_FREE ();
3924 error ("Multibyte character in data for base64 encoding");
3927 /* Now we have encoded the region, so we insert the new contents
3928 and delete the old. (Insert first in order to preserve markers.) */
3929 SET_PT_BOTH (XFASTINT (beg), ibeg);
3930 insert (encoded, encoded_length);
3931 SAFE_FREE ();
3932 del_range_byte (ibeg + encoded_length, iend + encoded_length, 1);
3934 /* If point was outside of the region, restore it exactly; else just
3935 move to the beginning of the region. */
3936 if (old_pos >= XFASTINT (end))
3937 old_pos += encoded_length - (XFASTINT (end) - XFASTINT (beg));
3938 else if (old_pos > XFASTINT (beg))
3939 old_pos = XFASTINT (beg);
3940 SET_PT (old_pos);
3942 /* We return the length of the encoded text. */
3943 return make_number (encoded_length);
3946 DEFUN ("base64-encode-string", Fbase64_encode_string, Sbase64_encode_string,
3947 1, 2, 0,
3948 doc: /* Base64-encode STRING and return the result.
3949 Optional second argument NO-LINE-BREAK means do not break long lines
3950 into shorter lines. */)
3951 (string, no_line_break)
3952 Lisp_Object string, no_line_break;
3954 int allength, length, encoded_length;
3955 char *encoded;
3956 Lisp_Object encoded_string;
3957 USE_SAFE_ALLOCA;
3959 CHECK_STRING (string);
3961 /* We need to allocate enough room for encoding the text.
3962 We need 33 1/3% more space, plus a newline every 76
3963 characters, and then we round up. */
3964 length = SBYTES (string);
3965 allength = length + length/3 + 1;
3966 allength += allength / MIME_LINE_LENGTH + 1 + 6;
3968 /* We need to allocate enough room for decoding the text. */
3969 SAFE_ALLOCA (encoded, char *, allength);
3971 encoded_length = base64_encode_1 (SDATA (string),
3972 encoded, length, NILP (no_line_break),
3973 STRING_MULTIBYTE (string));
3974 if (encoded_length > allength)
3975 abort ();
3977 if (encoded_length < 0)
3979 /* The encoding wasn't possible. */
3980 SAFE_FREE ();
3981 error ("Multibyte character in data for base64 encoding");
3984 encoded_string = make_unibyte_string (encoded, encoded_length);
3985 SAFE_FREE ();
3987 return encoded_string;
3990 static int
3991 base64_encode_1 (from, to, length, line_break, multibyte)
3992 const char *from;
3993 char *to;
3994 int length;
3995 int line_break;
3996 int multibyte;
3998 int counter = 0, i = 0;
3999 char *e = to;
4000 int c;
4001 unsigned int value;
4002 int bytes;
4004 while (i < length)
4006 if (multibyte)
4008 c = STRING_CHAR_AND_LENGTH (from + i, length - i, bytes);
4009 if (c >= 256)
4010 return -1;
4011 i += bytes;
4013 else
4014 c = from[i++];
4016 /* Wrap line every 76 characters. */
4018 if (line_break)
4020 if (counter < MIME_LINE_LENGTH / 4)
4021 counter++;
4022 else
4024 *e++ = '\n';
4025 counter = 1;
4029 /* Process first byte of a triplet. */
4031 *e++ = base64_value_to_char[0x3f & c >> 2];
4032 value = (0x03 & c) << 4;
4034 /* Process second byte of a triplet. */
4036 if (i == length)
4038 *e++ = base64_value_to_char[value];
4039 *e++ = '=';
4040 *e++ = '=';
4041 break;
4044 if (multibyte)
4046 c = STRING_CHAR_AND_LENGTH (from + i, length - i, bytes);
4047 if (c >= 256)
4048 return -1;
4049 i += bytes;
4051 else
4052 c = from[i++];
4054 *e++ = base64_value_to_char[value | (0x0f & c >> 4)];
4055 value = (0x0f & c) << 2;
4057 /* Process third byte of a triplet. */
4059 if (i == length)
4061 *e++ = base64_value_to_char[value];
4062 *e++ = '=';
4063 break;
4066 if (multibyte)
4068 c = STRING_CHAR_AND_LENGTH (from + i, length - i, bytes);
4069 if (c >= 256)
4070 return -1;
4071 i += bytes;
4073 else
4074 c = from[i++];
4076 *e++ = base64_value_to_char[value | (0x03 & c >> 6)];
4077 *e++ = base64_value_to_char[0x3f & c];
4080 return e - to;
4084 DEFUN ("base64-decode-region", Fbase64_decode_region, Sbase64_decode_region,
4085 2, 2, "r",
4086 doc: /* Base64-decode the region between BEG and END.
4087 Return the length of the decoded text.
4088 If the region can't be decoded, signal an error and don't modify the buffer. */)
4089 (beg, end)
4090 Lisp_Object beg, end;
4092 int ibeg, iend, length, allength;
4093 char *decoded;
4094 int old_pos = PT;
4095 int decoded_length;
4096 int inserted_chars;
4097 int multibyte = !NILP (current_buffer->enable_multibyte_characters);
4098 USE_SAFE_ALLOCA;
4100 validate_region (&beg, &end);
4102 ibeg = CHAR_TO_BYTE (XFASTINT (beg));
4103 iend = CHAR_TO_BYTE (XFASTINT (end));
4105 length = iend - ibeg;
4107 /* We need to allocate enough room for decoding the text. If we are
4108 working on a multibyte buffer, each decoded code may occupy at
4109 most two bytes. */
4110 allength = multibyte ? length * 2 : length;
4111 SAFE_ALLOCA (decoded, char *, allength);
4113 move_gap_both (XFASTINT (beg), ibeg);
4114 decoded_length = base64_decode_1 (BYTE_POS_ADDR (ibeg), decoded, length,
4115 multibyte, &inserted_chars);
4116 if (decoded_length > allength)
4117 abort ();
4119 if (decoded_length < 0)
4121 /* The decoding wasn't possible. */
4122 SAFE_FREE ();
4123 error ("Invalid base64 data");
4126 /* Now we have decoded the region, so we insert the new contents
4127 and delete the old. (Insert first in order to preserve markers.) */
4128 TEMP_SET_PT_BOTH (XFASTINT (beg), ibeg);
4129 insert_1_both (decoded, inserted_chars, decoded_length, 0, 1, 0);
4130 SAFE_FREE ();
4132 /* Delete the original text. */
4133 del_range_both (PT, PT_BYTE, XFASTINT (end) + inserted_chars,
4134 iend + decoded_length, 1);
4136 /* If point was outside of the region, restore it exactly; else just
4137 move to the beginning of the region. */
4138 if (old_pos >= XFASTINT (end))
4139 old_pos += inserted_chars - (XFASTINT (end) - XFASTINT (beg));
4140 else if (old_pos > XFASTINT (beg))
4141 old_pos = XFASTINT (beg);
4142 SET_PT (old_pos > ZV ? ZV : old_pos);
4144 return make_number (inserted_chars);
4147 DEFUN ("base64-decode-string", Fbase64_decode_string, Sbase64_decode_string,
4148 1, 1, 0,
4149 doc: /* Base64-decode STRING and return the result. */)
4150 (string)
4151 Lisp_Object string;
4153 char *decoded;
4154 int length, decoded_length;
4155 Lisp_Object decoded_string;
4156 USE_SAFE_ALLOCA;
4158 CHECK_STRING (string);
4160 length = SBYTES (string);
4161 /* We need to allocate enough room for decoding the text. */
4162 SAFE_ALLOCA (decoded, char *, length);
4164 /* The decoded result should be unibyte. */
4165 decoded_length = base64_decode_1 (SDATA (string), decoded, length,
4166 0, NULL);
4167 if (decoded_length > length)
4168 abort ();
4169 else if (decoded_length >= 0)
4170 decoded_string = make_unibyte_string (decoded, decoded_length);
4171 else
4172 decoded_string = Qnil;
4174 SAFE_FREE ();
4175 if (!STRINGP (decoded_string))
4176 error ("Invalid base64 data");
4178 return decoded_string;
4181 /* Base64-decode the data at FROM of LENGHT bytes into TO. If
4182 MULTIBYTE is nonzero, the decoded result should be in multibyte
4183 form. If NCHARS_RETRUN is not NULL, store the number of produced
4184 characters in *NCHARS_RETURN. */
4186 static int
4187 base64_decode_1 (from, to, length, multibyte, nchars_return)
4188 const char *from;
4189 char *to;
4190 int length;
4191 int multibyte;
4192 int *nchars_return;
4194 int i = 0;
4195 char *e = to;
4196 unsigned char c;
4197 unsigned long value;
4198 int nchars = 0;
4200 while (1)
4202 /* Process first byte of a quadruplet. */
4204 READ_QUADRUPLET_BYTE (e-to);
4206 if (!IS_BASE64 (c))
4207 return -1;
4208 value = base64_char_to_value[c] << 18;
4210 /* Process second byte of a quadruplet. */
4212 READ_QUADRUPLET_BYTE (-1);
4214 if (!IS_BASE64 (c))
4215 return -1;
4216 value |= base64_char_to_value[c] << 12;
4218 c = (unsigned char) (value >> 16);
4219 if (multibyte)
4220 e += CHAR_STRING (c, e);
4221 else
4222 *e++ = c;
4223 nchars++;
4225 /* Process third byte of a quadruplet. */
4227 READ_QUADRUPLET_BYTE (-1);
4229 if (c == '=')
4231 READ_QUADRUPLET_BYTE (-1);
4233 if (c != '=')
4234 return -1;
4235 continue;
4238 if (!IS_BASE64 (c))
4239 return -1;
4240 value |= base64_char_to_value[c] << 6;
4242 c = (unsigned char) (0xff & value >> 8);
4243 if (multibyte)
4244 e += CHAR_STRING (c, e);
4245 else
4246 *e++ = c;
4247 nchars++;
4249 /* Process fourth byte of a quadruplet. */
4251 READ_QUADRUPLET_BYTE (-1);
4253 if (c == '=')
4254 continue;
4256 if (!IS_BASE64 (c))
4257 return -1;
4258 value |= base64_char_to_value[c];
4260 c = (unsigned char) (0xff & value);
4261 if (multibyte)
4262 e += CHAR_STRING (c, e);
4263 else
4264 *e++ = c;
4265 nchars++;
4271 /***********************************************************************
4272 ***** *****
4273 ***** Hash Tables *****
4274 ***** *****
4275 ***********************************************************************/
4277 /* Implemented by gerd@gnu.org. This hash table implementation was
4278 inspired by CMUCL hash tables. */
4280 /* Ideas:
4282 1. For small tables, association lists are probably faster than
4283 hash tables because they have lower overhead.
4285 For uses of hash tables where the O(1) behavior of table
4286 operations is not a requirement, it might therefore be a good idea
4287 not to hash. Instead, we could just do a linear search in the
4288 key_and_value vector of the hash table. This could be done
4289 if a `:linear-search t' argument is given to make-hash-table. */
4292 /* The list of all weak hash tables. Don't staticpro this one. */
4294 Lisp_Object Vweak_hash_tables;
4296 /* Various symbols. */
4298 Lisp_Object Qhash_table_p, Qeq, Qeql, Qequal, Qkey, Qvalue;
4299 Lisp_Object QCtest, QCsize, QCrehash_size, QCrehash_threshold, QCweakness;
4300 Lisp_Object Qhash_table_test, Qkey_or_value, Qkey_and_value;
4302 /* Function prototypes. */
4304 static struct Lisp_Hash_Table *check_hash_table P_ ((Lisp_Object));
4305 static int get_key_arg P_ ((Lisp_Object, int, Lisp_Object *, char *));
4306 static void maybe_resize_hash_table P_ ((struct Lisp_Hash_Table *));
4307 static int cmpfn_eql P_ ((struct Lisp_Hash_Table *, Lisp_Object, unsigned,
4308 Lisp_Object, unsigned));
4309 static int cmpfn_equal P_ ((struct Lisp_Hash_Table *, Lisp_Object, unsigned,
4310 Lisp_Object, unsigned));
4311 static int cmpfn_user_defined P_ ((struct Lisp_Hash_Table *, Lisp_Object,
4312 unsigned, Lisp_Object, unsigned));
4313 static unsigned hashfn_eq P_ ((struct Lisp_Hash_Table *, Lisp_Object));
4314 static unsigned hashfn_eql P_ ((struct Lisp_Hash_Table *, Lisp_Object));
4315 static unsigned hashfn_equal P_ ((struct Lisp_Hash_Table *, Lisp_Object));
4316 static unsigned hashfn_user_defined P_ ((struct Lisp_Hash_Table *,
4317 Lisp_Object));
4318 static unsigned sxhash_string P_ ((unsigned char *, int));
4319 static unsigned sxhash_list P_ ((Lisp_Object, int));
4320 static unsigned sxhash_vector P_ ((Lisp_Object, int));
4321 static unsigned sxhash_bool_vector P_ ((Lisp_Object));
4322 static int sweep_weak_table P_ ((struct Lisp_Hash_Table *, int));
4326 /***********************************************************************
4327 Utilities
4328 ***********************************************************************/
4330 /* If OBJ is a Lisp hash table, return a pointer to its struct
4331 Lisp_Hash_Table. Otherwise, signal an error. */
4333 static struct Lisp_Hash_Table *
4334 check_hash_table (obj)
4335 Lisp_Object obj;
4337 CHECK_HASH_TABLE (obj);
4338 return XHASH_TABLE (obj);
4342 /* Value is the next integer I >= N, N >= 0 which is "almost" a prime
4343 number. */
4346 next_almost_prime (n)
4347 int n;
4349 if (n % 2 == 0)
4350 n += 1;
4351 if (n % 3 == 0)
4352 n += 2;
4353 if (n % 7 == 0)
4354 n += 4;
4355 return n;
4359 /* Find KEY in ARGS which has size NARGS. Don't consider indices for
4360 which USED[I] is non-zero. If found at index I in ARGS, set
4361 USED[I] and USED[I + 1] to 1, and return I + 1. Otherwise return
4362 -1. This function is used to extract a keyword/argument pair from
4363 a DEFUN parameter list. */
4365 static int
4366 get_key_arg (key, nargs, args, used)
4367 Lisp_Object key;
4368 int nargs;
4369 Lisp_Object *args;
4370 char *used;
4372 int i;
4374 for (i = 0; i < nargs - 1; ++i)
4375 if (!used[i] && EQ (args[i], key))
4376 break;
4378 if (i >= nargs - 1)
4379 i = -1;
4380 else
4382 used[i++] = 1;
4383 used[i] = 1;
4386 return i;
4390 /* Return a Lisp vector which has the same contents as VEC but has
4391 size NEW_SIZE, NEW_SIZE >= VEC->size. Entries in the resulting
4392 vector that are not copied from VEC are set to INIT. */
4394 Lisp_Object
4395 larger_vector (vec, new_size, init)
4396 Lisp_Object vec;
4397 int new_size;
4398 Lisp_Object init;
4400 struct Lisp_Vector *v;
4401 int i, old_size;
4403 xassert (VECTORP (vec));
4404 old_size = XVECTOR (vec)->size;
4405 xassert (new_size >= old_size);
4407 v = allocate_vector (new_size);
4408 bcopy (XVECTOR (vec)->contents, v->contents,
4409 old_size * sizeof *v->contents);
4410 for (i = old_size; i < new_size; ++i)
4411 v->contents[i] = init;
4412 XSETVECTOR (vec, v);
4413 return vec;
4417 /***********************************************************************
4418 Low-level Functions
4419 ***********************************************************************/
4421 /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code
4422 HASH2 in hash table H using `eql'. Value is non-zero if KEY1 and
4423 KEY2 are the same. */
4425 static int
4426 cmpfn_eql (h, key1, hash1, key2, hash2)
4427 struct Lisp_Hash_Table *h;
4428 Lisp_Object key1, key2;
4429 unsigned hash1, hash2;
4431 return (FLOATP (key1)
4432 && FLOATP (key2)
4433 && XFLOAT_DATA (key1) == XFLOAT_DATA (key2));
4437 /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code
4438 HASH2 in hash table H using `equal'. Value is non-zero if KEY1 and
4439 KEY2 are the same. */
4441 static int
4442 cmpfn_equal (h, key1, hash1, key2, hash2)
4443 struct Lisp_Hash_Table *h;
4444 Lisp_Object key1, key2;
4445 unsigned hash1, hash2;
4447 return hash1 == hash2 && !NILP (Fequal (key1, key2));
4451 /* Compare KEY1 which has hash code HASH1, and KEY2 with hash code
4452 HASH2 in hash table H using H->user_cmp_function. Value is non-zero
4453 if KEY1 and KEY2 are the same. */
4455 static int
4456 cmpfn_user_defined (h, key1, hash1, key2, hash2)
4457 struct Lisp_Hash_Table *h;
4458 Lisp_Object key1, key2;
4459 unsigned hash1, hash2;
4461 if (hash1 == hash2)
4463 Lisp_Object args[3];
4465 args[0] = h->user_cmp_function;
4466 args[1] = key1;
4467 args[2] = key2;
4468 return !NILP (Ffuncall (3, args));
4470 else
4471 return 0;
4475 /* Value is a hash code for KEY for use in hash table H which uses
4476 `eq' to compare keys. The hash code returned is guaranteed to fit
4477 in a Lisp integer. */
4479 static unsigned
4480 hashfn_eq (h, key)
4481 struct Lisp_Hash_Table *h;
4482 Lisp_Object key;
4484 unsigned 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 `eql' to compare keys. The hash code returned is guaranteed to fit
4492 in a Lisp integer. */
4494 static unsigned
4495 hashfn_eql (h, key)
4496 struct Lisp_Hash_Table *h;
4497 Lisp_Object key;
4499 unsigned hash;
4500 if (FLOATP (key))
4501 hash = sxhash (key, 0);
4502 else
4503 hash = XUINT (key) ^ XGCTYPE (key);
4504 xassert ((hash & ~INTMASK) == 0);
4505 return hash;
4509 /* Value is a hash code for KEY for use in hash table H which uses
4510 `equal' to compare keys. The hash code returned is guaranteed to fit
4511 in a Lisp integer. */
4513 static unsigned
4514 hashfn_equal (h, key)
4515 struct Lisp_Hash_Table *h;
4516 Lisp_Object key;
4518 unsigned hash = sxhash (key, 0);
4519 xassert ((hash & ~INTMASK) == 0);
4520 return hash;
4524 /* Value is a hash code for KEY for use in hash table H which uses as
4525 user-defined function to compare keys. The hash code returned is
4526 guaranteed to fit in a Lisp integer. */
4528 static unsigned
4529 hashfn_user_defined (h, key)
4530 struct Lisp_Hash_Table *h;
4531 Lisp_Object key;
4533 Lisp_Object args[2], hash;
4535 args[0] = h->user_hash_function;
4536 args[1] = key;
4537 hash = Ffuncall (2, args);
4538 if (!INTEGERP (hash))
4539 Fsignal (Qerror,
4540 list2 (build_string ("Invalid hash code returned from \
4541 user-supplied hash function"),
4542 hash));
4543 return XUINT (hash);
4547 /* Create and initialize a new hash table.
4549 TEST specifies the test the hash table will use to compare keys.
4550 It must be either one of the predefined tests `eq', `eql' or
4551 `equal' or a symbol denoting a user-defined test named TEST with
4552 test and hash functions USER_TEST and USER_HASH.
4554 Give the table initial capacity SIZE, SIZE >= 0, an integer.
4556 If REHASH_SIZE is an integer, it must be > 0, and this hash table's
4557 new size when it becomes full is computed by adding REHASH_SIZE to
4558 its old size. If REHASH_SIZE is a float, it must be > 1.0, and the
4559 table's new size is computed by multiplying its old size with
4560 REHASH_SIZE.
4562 REHASH_THRESHOLD must be a float <= 1.0, and > 0. The table will
4563 be resized when the ratio of (number of entries in the table) /
4564 (table size) is >= REHASH_THRESHOLD.
4566 WEAK specifies the weakness of the table. If non-nil, it must be
4567 one of the symbols `key', `value', `key-or-value', or `key-and-value'. */
4569 Lisp_Object
4570 make_hash_table (test, size, rehash_size, rehash_threshold, weak,
4571 user_test, user_hash)
4572 Lisp_Object test, size, rehash_size, rehash_threshold, weak;
4573 Lisp_Object user_test, user_hash;
4575 struct Lisp_Hash_Table *h;
4576 Lisp_Object table;
4577 int index_size, i, sz;
4579 /* Preconditions. */
4580 xassert (SYMBOLP (test));
4581 xassert (INTEGERP (size) && XINT (size) >= 0);
4582 xassert ((INTEGERP (rehash_size) && XINT (rehash_size) > 0)
4583 || (FLOATP (rehash_size) && XFLOATINT (rehash_size) > 1.0));
4584 xassert (FLOATP (rehash_threshold)
4585 && XFLOATINT (rehash_threshold) > 0
4586 && XFLOATINT (rehash_threshold) <= 1.0);
4588 if (XFASTINT (size) == 0)
4589 size = make_number (1);
4591 /* Allocate a table and initialize it. */
4592 h = allocate_hash_table ();
4594 /* Initialize hash table slots. */
4595 sz = XFASTINT (size);
4597 h->test = test;
4598 if (EQ (test, Qeql))
4600 h->cmpfn = cmpfn_eql;
4601 h->hashfn = hashfn_eql;
4603 else if (EQ (test, Qeq))
4605 h->cmpfn = NULL;
4606 h->hashfn = hashfn_eq;
4608 else if (EQ (test, Qequal))
4610 h->cmpfn = cmpfn_equal;
4611 h->hashfn = hashfn_equal;
4613 else
4615 h->user_cmp_function = user_test;
4616 h->user_hash_function = user_hash;
4617 h->cmpfn = cmpfn_user_defined;
4618 h->hashfn = hashfn_user_defined;
4621 h->weak = weak;
4622 h->rehash_threshold = rehash_threshold;
4623 h->rehash_size = rehash_size;
4624 h->count = make_number (0);
4625 h->key_and_value = Fmake_vector (make_number (2 * sz), Qnil);
4626 h->hash = Fmake_vector (size, Qnil);
4627 h->next = Fmake_vector (size, Qnil);
4628 /* Cast to int here avoids losing with gcc 2.95 on Tru64/Alpha... */
4629 index_size = next_almost_prime ((int) (sz / XFLOATINT (rehash_threshold)));
4630 h->index = Fmake_vector (make_number (index_size), Qnil);
4632 /* Set up the free list. */
4633 for (i = 0; i < sz - 1; ++i)
4634 HASH_NEXT (h, i) = make_number (i + 1);
4635 h->next_free = make_number (0);
4637 XSET_HASH_TABLE (table, h);
4638 xassert (HASH_TABLE_P (table));
4639 xassert (XHASH_TABLE (table) == h);
4641 /* Maybe add this hash table to the list of all weak hash tables. */
4642 if (NILP (h->weak))
4643 h->next_weak = Qnil;
4644 else
4646 h->next_weak = Vweak_hash_tables;
4647 Vweak_hash_tables = table;
4650 return table;
4654 /* Return a copy of hash table H1. Keys and values are not copied,
4655 only the table itself is. */
4657 Lisp_Object
4658 copy_hash_table (h1)
4659 struct Lisp_Hash_Table *h1;
4661 Lisp_Object table;
4662 struct Lisp_Hash_Table *h2;
4663 struct Lisp_Vector *next;
4665 h2 = allocate_hash_table ();
4666 next = h2->vec_next;
4667 bcopy (h1, h2, sizeof *h2);
4668 h2->vec_next = next;
4669 h2->key_and_value = Fcopy_sequence (h1->key_and_value);
4670 h2->hash = Fcopy_sequence (h1->hash);
4671 h2->next = Fcopy_sequence (h1->next);
4672 h2->index = Fcopy_sequence (h1->index);
4673 XSET_HASH_TABLE (table, h2);
4675 /* Maybe add this hash table to the list of all weak hash tables. */
4676 if (!NILP (h2->weak))
4678 h2->next_weak = Vweak_hash_tables;
4679 Vweak_hash_tables = table;
4682 return table;
4686 /* Resize hash table H if it's too full. If H cannot be resized
4687 because it's already too large, throw an error. */
4689 static INLINE void
4690 maybe_resize_hash_table (h)
4691 struct Lisp_Hash_Table *h;
4693 if (NILP (h->next_free))
4695 int old_size = HASH_TABLE_SIZE (h);
4696 int i, new_size, index_size;
4698 if (INTEGERP (h->rehash_size))
4699 new_size = old_size + XFASTINT (h->rehash_size);
4700 else
4701 new_size = old_size * XFLOATINT (h->rehash_size);
4702 new_size = max (old_size + 1, new_size);
4703 index_size = next_almost_prime ((int)
4704 (new_size
4705 / XFLOATINT (h->rehash_threshold)));
4706 if (max (index_size, 2 * new_size) > MOST_POSITIVE_FIXNUM)
4707 error ("Hash table too large to resize");
4709 h->key_and_value = larger_vector (h->key_and_value, 2 * new_size, Qnil);
4710 h->next = larger_vector (h->next, new_size, Qnil);
4711 h->hash = larger_vector (h->hash, new_size, Qnil);
4712 h->index = Fmake_vector (make_number (index_size), Qnil);
4714 /* Update the free list. Do it so that new entries are added at
4715 the end of the free list. This makes some operations like
4716 maphash faster. */
4717 for (i = old_size; i < new_size - 1; ++i)
4718 HASH_NEXT (h, i) = make_number (i + 1);
4720 if (!NILP (h->next_free))
4722 Lisp_Object last, next;
4724 last = h->next_free;
4725 while (next = HASH_NEXT (h, XFASTINT (last)),
4726 !NILP (next))
4727 last = next;
4729 HASH_NEXT (h, XFASTINT (last)) = make_number (old_size);
4731 else
4732 XSETFASTINT (h->next_free, old_size);
4734 /* Rehash. */
4735 for (i = 0; i < old_size; ++i)
4736 if (!NILP (HASH_HASH (h, i)))
4738 unsigned hash_code = XUINT (HASH_HASH (h, i));
4739 int start_of_bucket = hash_code % XVECTOR (h->index)->size;
4740 HASH_NEXT (h, i) = HASH_INDEX (h, start_of_bucket);
4741 HASH_INDEX (h, start_of_bucket) = make_number (i);
4747 /* Lookup KEY in hash table H. If HASH is non-null, return in *HASH
4748 the hash code of KEY. Value is the index of the entry in H
4749 matching KEY, or -1 if not found. */
4752 hash_lookup (h, key, hash)
4753 struct Lisp_Hash_Table *h;
4754 Lisp_Object key;
4755 unsigned *hash;
4757 unsigned hash_code;
4758 int start_of_bucket;
4759 Lisp_Object idx;
4761 hash_code = h->hashfn (h, key);
4762 if (hash)
4763 *hash = hash_code;
4765 start_of_bucket = hash_code % XVECTOR (h->index)->size;
4766 idx = HASH_INDEX (h, start_of_bucket);
4768 /* We need not gcpro idx since it's either an integer or nil. */
4769 while (!NILP (idx))
4771 int i = XFASTINT (idx);
4772 if (EQ (key, HASH_KEY (h, i))
4773 || (h->cmpfn
4774 && h->cmpfn (h, key, hash_code,
4775 HASH_KEY (h, i), XUINT (HASH_HASH (h, i)))))
4776 break;
4777 idx = HASH_NEXT (h, i);
4780 return NILP (idx) ? -1 : XFASTINT (idx);
4784 /* Put an entry into hash table H that associates KEY with VALUE.
4785 HASH is a previously computed hash code of KEY.
4786 Value is the index of the entry in H matching KEY. */
4789 hash_put (h, key, value, hash)
4790 struct Lisp_Hash_Table *h;
4791 Lisp_Object key, value;
4792 unsigned hash;
4794 int start_of_bucket, i;
4796 xassert ((hash & ~INTMASK) == 0);
4798 /* Increment count after resizing because resizing may fail. */
4799 maybe_resize_hash_table (h);
4800 h->count = make_number (XFASTINT (h->count) + 1);
4802 /* Store key/value in the key_and_value vector. */
4803 i = XFASTINT (h->next_free);
4804 h->next_free = HASH_NEXT (h, i);
4805 HASH_KEY (h, i) = key;
4806 HASH_VALUE (h, i) = value;
4808 /* Remember its hash code. */
4809 HASH_HASH (h, i) = make_number (hash);
4811 /* Add new entry to its collision chain. */
4812 start_of_bucket = hash % XVECTOR (h->index)->size;
4813 HASH_NEXT (h, i) = HASH_INDEX (h, start_of_bucket);
4814 HASH_INDEX (h, start_of_bucket) = make_number (i);
4815 return i;
4819 /* Remove the entry matching KEY from hash table H, if there is one. */
4821 void
4822 hash_remove (h, key)
4823 struct Lisp_Hash_Table *h;
4824 Lisp_Object key;
4826 unsigned hash_code;
4827 int start_of_bucket;
4828 Lisp_Object idx, prev;
4830 hash_code = h->hashfn (h, key);
4831 start_of_bucket = hash_code % XVECTOR (h->index)->size;
4832 idx = HASH_INDEX (h, start_of_bucket);
4833 prev = Qnil;
4835 /* We need not gcpro idx, prev since they're either integers or nil. */
4836 while (!NILP (idx))
4838 int i = XFASTINT (idx);
4840 if (EQ (key, HASH_KEY (h, i))
4841 || (h->cmpfn
4842 && h->cmpfn (h, key, hash_code,
4843 HASH_KEY (h, i), XUINT (HASH_HASH (h, i)))))
4845 /* Take entry out of collision chain. */
4846 if (NILP (prev))
4847 HASH_INDEX (h, start_of_bucket) = HASH_NEXT (h, i);
4848 else
4849 HASH_NEXT (h, XFASTINT (prev)) = HASH_NEXT (h, i);
4851 /* Clear slots in key_and_value and add the slots to
4852 the free list. */
4853 HASH_KEY (h, i) = HASH_VALUE (h, i) = HASH_HASH (h, i) = Qnil;
4854 HASH_NEXT (h, i) = h->next_free;
4855 h->next_free = make_number (i);
4856 h->count = make_number (XFASTINT (h->count) - 1);
4857 xassert (XINT (h->count) >= 0);
4858 break;
4860 else
4862 prev = idx;
4863 idx = HASH_NEXT (h, i);
4869 /* Clear hash table H. */
4871 void
4872 hash_clear (h)
4873 struct Lisp_Hash_Table *h;
4875 if (XFASTINT (h->count) > 0)
4877 int i, size = HASH_TABLE_SIZE (h);
4879 for (i = 0; i < size; ++i)
4881 HASH_NEXT (h, i) = i < size - 1 ? make_number (i + 1) : Qnil;
4882 HASH_KEY (h, i) = Qnil;
4883 HASH_VALUE (h, i) = Qnil;
4884 HASH_HASH (h, i) = Qnil;
4887 for (i = 0; i < XVECTOR (h->index)->size; ++i)
4888 XVECTOR (h->index)->contents[i] = Qnil;
4890 h->next_free = make_number (0);
4891 h->count = make_number (0);
4897 /************************************************************************
4898 Weak Hash Tables
4899 ************************************************************************/
4901 /* Sweep weak hash table H. REMOVE_ENTRIES_P non-zero means remove
4902 entries from the table that don't survive the current GC.
4903 REMOVE_ENTRIES_P zero means mark entries that are in use. Value is
4904 non-zero if anything was marked. */
4906 static int
4907 sweep_weak_table (h, remove_entries_p)
4908 struct Lisp_Hash_Table *h;
4909 int remove_entries_p;
4911 int bucket, n, marked;
4913 n = XVECTOR (h->index)->size & ~ARRAY_MARK_FLAG;
4914 marked = 0;
4916 for (bucket = 0; bucket < n; ++bucket)
4918 Lisp_Object idx, next, prev;
4920 /* Follow collision chain, removing entries that
4921 don't survive this garbage collection. */
4922 prev = Qnil;
4923 for (idx = HASH_INDEX (h, bucket); !GC_NILP (idx); idx = next)
4925 int i = XFASTINT (idx);
4926 int key_known_to_survive_p = survives_gc_p (HASH_KEY (h, i));
4927 int value_known_to_survive_p = survives_gc_p (HASH_VALUE (h, i));
4928 int remove_p;
4930 if (EQ (h->weak, Qkey))
4931 remove_p = !key_known_to_survive_p;
4932 else if (EQ (h->weak, Qvalue))
4933 remove_p = !value_known_to_survive_p;
4934 else if (EQ (h->weak, Qkey_or_value))
4935 remove_p = !(key_known_to_survive_p || value_known_to_survive_p);
4936 else if (EQ (h->weak, Qkey_and_value))
4937 remove_p = !(key_known_to_survive_p && value_known_to_survive_p);
4938 else
4939 abort ();
4941 next = HASH_NEXT (h, i);
4943 if (remove_entries_p)
4945 if (remove_p)
4947 /* Take out of collision chain. */
4948 if (GC_NILP (prev))
4949 HASH_INDEX (h, bucket) = next;
4950 else
4951 HASH_NEXT (h, XFASTINT (prev)) = next;
4953 /* Add to free list. */
4954 HASH_NEXT (h, i) = h->next_free;
4955 h->next_free = idx;
4957 /* Clear key, value, and hash. */
4958 HASH_KEY (h, i) = HASH_VALUE (h, i) = Qnil;
4959 HASH_HASH (h, i) = Qnil;
4961 h->count = make_number (XFASTINT (h->count) - 1);
4963 else
4965 prev = idx;
4968 else
4970 if (!remove_p)
4972 /* Make sure key and value survive. */
4973 if (!key_known_to_survive_p)
4975 mark_object (HASH_KEY (h, i));
4976 marked = 1;
4979 if (!value_known_to_survive_p)
4981 mark_object (HASH_VALUE (h, i));
4982 marked = 1;
4989 return marked;
4992 /* Remove elements from weak hash tables that don't survive the
4993 current garbage collection. Remove weak tables that don't survive
4994 from Vweak_hash_tables. Called from gc_sweep. */
4996 void
4997 sweep_weak_hash_tables ()
4999 Lisp_Object table, used, next;
5000 struct Lisp_Hash_Table *h;
5001 int marked;
5003 /* Mark all keys and values that are in use. Keep on marking until
5004 there is no more change. This is necessary for cases like
5005 value-weak table A containing an entry X -> Y, where Y is used in a
5006 key-weak table B, Z -> Y. If B comes after A in the list of weak
5007 tables, X -> Y might be removed from A, although when looking at B
5008 one finds that it shouldn't. */
5011 marked = 0;
5012 for (table = Vweak_hash_tables; !GC_NILP (table); table = h->next_weak)
5014 h = XHASH_TABLE (table);
5015 if (h->size & ARRAY_MARK_FLAG)
5016 marked |= sweep_weak_table (h, 0);
5019 while (marked);
5021 /* Remove tables and entries that aren't used. */
5022 for (table = Vweak_hash_tables, used = Qnil; !GC_NILP (table); table = next)
5024 h = XHASH_TABLE (table);
5025 next = h->next_weak;
5027 if (h->size & ARRAY_MARK_FLAG)
5029 /* TABLE is marked as used. Sweep its contents. */
5030 if (XFASTINT (h->count) > 0)
5031 sweep_weak_table (h, 1);
5033 /* Add table to the list of used weak hash tables. */
5034 h->next_weak = used;
5035 used = table;
5039 Vweak_hash_tables = used;
5044 /***********************************************************************
5045 Hash Code Computation
5046 ***********************************************************************/
5048 /* Maximum depth up to which to dive into Lisp structures. */
5050 #define SXHASH_MAX_DEPTH 3
5052 /* Maximum length up to which to take list and vector elements into
5053 account. */
5055 #define SXHASH_MAX_LEN 7
5057 /* Combine two integers X and Y for hashing. */
5059 #define SXHASH_COMBINE(X, Y) \
5060 ((((unsigned)(X) << 4) + (((unsigned)(X) >> 24) & 0x0fffffff)) \
5061 + (unsigned)(Y))
5064 /* Return a hash for string PTR which has length LEN. The hash
5065 code returned is guaranteed to fit in a Lisp integer. */
5067 static unsigned
5068 sxhash_string (ptr, len)
5069 unsigned char *ptr;
5070 int len;
5072 unsigned char *p = ptr;
5073 unsigned char *end = p + len;
5074 unsigned char c;
5075 unsigned hash = 0;
5077 while (p != end)
5079 c = *p++;
5080 if (c >= 0140)
5081 c -= 40;
5082 hash = ((hash << 3) + (hash >> 28) + c);
5085 return hash & INTMASK;
5089 /* Return a hash for list LIST. DEPTH is the current depth in the
5090 list. We don't recurse deeper than SXHASH_MAX_DEPTH in it. */
5092 static unsigned
5093 sxhash_list (list, depth)
5094 Lisp_Object list;
5095 int depth;
5097 unsigned hash = 0;
5098 int i;
5100 if (depth < SXHASH_MAX_DEPTH)
5101 for (i = 0;
5102 CONSP (list) && i < SXHASH_MAX_LEN;
5103 list = XCDR (list), ++i)
5105 unsigned hash2 = sxhash (XCAR (list), depth + 1);
5106 hash = SXHASH_COMBINE (hash, hash2);
5109 return hash;
5113 /* Return a hash for vector VECTOR. DEPTH is the current depth in
5114 the Lisp structure. */
5116 static unsigned
5117 sxhash_vector (vec, depth)
5118 Lisp_Object vec;
5119 int depth;
5121 unsigned hash = XVECTOR (vec)->size;
5122 int i, n;
5124 n = min (SXHASH_MAX_LEN, XVECTOR (vec)->size);
5125 for (i = 0; i < n; ++i)
5127 unsigned hash2 = sxhash (XVECTOR (vec)->contents[i], depth + 1);
5128 hash = SXHASH_COMBINE (hash, hash2);
5131 return hash;
5135 /* Return a hash for bool-vector VECTOR. */
5137 static unsigned
5138 sxhash_bool_vector (vec)
5139 Lisp_Object vec;
5141 unsigned hash = XBOOL_VECTOR (vec)->size;
5142 int i, n;
5144 n = min (SXHASH_MAX_LEN, XBOOL_VECTOR (vec)->vector_size);
5145 for (i = 0; i < n; ++i)
5146 hash = SXHASH_COMBINE (hash, XBOOL_VECTOR (vec)->data[i]);
5148 return hash;
5152 /* Return a hash code for OBJ. DEPTH is the current depth in the Lisp
5153 structure. Value is an unsigned integer clipped to INTMASK. */
5155 unsigned
5156 sxhash (obj, depth)
5157 Lisp_Object obj;
5158 int depth;
5160 unsigned hash;
5162 if (depth > SXHASH_MAX_DEPTH)
5163 return 0;
5165 switch (XTYPE (obj))
5167 case Lisp_Int:
5168 hash = XUINT (obj);
5169 break;
5171 case Lisp_Misc:
5172 hash = XUINT (obj);
5173 break;
5175 case Lisp_Symbol:
5176 obj = SYMBOL_NAME (obj);
5177 /* Fall through. */
5179 case Lisp_String:
5180 hash = sxhash_string (SDATA (obj), SCHARS (obj));
5181 break;
5183 /* This can be everything from a vector to an overlay. */
5184 case Lisp_Vectorlike:
5185 if (VECTORP (obj))
5186 /* According to the CL HyperSpec, two arrays are equal only if
5187 they are `eq', except for strings and bit-vectors. In
5188 Emacs, this works differently. We have to compare element
5189 by element. */
5190 hash = sxhash_vector (obj, depth);
5191 else if (BOOL_VECTOR_P (obj))
5192 hash = sxhash_bool_vector (obj);
5193 else
5194 /* Others are `equal' if they are `eq', so let's take their
5195 address as hash. */
5196 hash = XUINT (obj);
5197 break;
5199 case Lisp_Cons:
5200 hash = sxhash_list (obj, depth);
5201 break;
5203 case Lisp_Float:
5205 unsigned char *p = (unsigned char *) &XFLOAT_DATA (obj);
5206 unsigned char *e = p + sizeof XFLOAT_DATA (obj);
5207 for (hash = 0; p < e; ++p)
5208 hash = SXHASH_COMBINE (hash, *p);
5209 break;
5212 default:
5213 abort ();
5216 return hash & INTMASK;
5221 /***********************************************************************
5222 Lisp Interface
5223 ***********************************************************************/
5226 DEFUN ("sxhash", Fsxhash, Ssxhash, 1, 1, 0,
5227 doc: /* Compute a hash code for OBJ and return it as integer. */)
5228 (obj)
5229 Lisp_Object obj;
5231 unsigned hash = sxhash (obj, 0);;
5232 return make_number (hash);
5236 DEFUN ("make-hash-table", Fmake_hash_table, Smake_hash_table, 0, MANY, 0,
5237 doc: /* Create and return a new hash table.
5239 Arguments are specified as keyword/argument pairs. The following
5240 arguments are defined:
5242 :test TEST -- TEST must be a symbol that specifies how to compare
5243 keys. Default is `eql'. Predefined are the tests `eq', `eql', and
5244 `equal'. User-supplied test and hash functions can be specified via
5245 `define-hash-table-test'.
5247 :size SIZE -- A hint as to how many elements will be put in the table.
5248 Default is 65.
5250 :rehash-size REHASH-SIZE - Indicates how to expand the table when it
5251 fills up. If REHASH-SIZE is an integer, add that many space. If it
5252 is a float, it must be > 1.0, and the new size is computed by
5253 multiplying the old size with that factor. Default is 1.5.
5255 :rehash-threshold THRESHOLD -- THRESHOLD must a float > 0, and <= 1.0.
5256 Resize the hash table when ratio of the number of entries in the
5257 table. Default is 0.8.
5259 :weakness WEAK -- WEAK must be one of nil, t, `key', `value',
5260 `key-or-value', or `key-and-value'. If WEAK is not nil, the table
5261 returned is a weak table. Key/value pairs are removed from a weak
5262 hash table when there are no non-weak references pointing to their
5263 key, value, one of key or value, or both key and value, depending on
5264 WEAK. WEAK t is equivalent to `key-and-value'. Default value of WEAK
5265 is nil.
5267 usage: (make-hash-table &rest KEYWORD-ARGS) */)
5268 (nargs, args)
5269 int nargs;
5270 Lisp_Object *args;
5272 Lisp_Object test, size, rehash_size, rehash_threshold, weak;
5273 Lisp_Object user_test, user_hash;
5274 char *used;
5275 int i;
5277 /* The vector `used' is used to keep track of arguments that
5278 have been consumed. */
5279 used = (char *) alloca (nargs * sizeof *used);
5280 bzero (used, nargs * sizeof *used);
5282 /* See if there's a `:test TEST' among the arguments. */
5283 i = get_key_arg (QCtest, nargs, args, used);
5284 test = i < 0 ? Qeql : args[i];
5285 if (!EQ (test, Qeq) && !EQ (test, Qeql) && !EQ (test, Qequal))
5287 /* See if it is a user-defined test. */
5288 Lisp_Object prop;
5290 prop = Fget (test, Qhash_table_test);
5291 if (!CONSP (prop) || !CONSP (XCDR (prop)))
5292 Fsignal (Qerror, list2 (build_string ("Invalid hash table test"),
5293 test));
5294 user_test = XCAR (prop);
5295 user_hash = XCAR (XCDR (prop));
5297 else
5298 user_test = user_hash = Qnil;
5300 /* See if there's a `:size SIZE' argument. */
5301 i = get_key_arg (QCsize, nargs, args, used);
5302 size = i < 0 ? Qnil : args[i];
5303 if (NILP (size))
5304 size = make_number (DEFAULT_HASH_SIZE);
5305 else if (!INTEGERP (size) || XINT (size) < 0)
5306 Fsignal (Qerror,
5307 list2 (build_string ("Invalid hash table size"),
5308 size));
5310 /* Look for `:rehash-size SIZE'. */
5311 i = get_key_arg (QCrehash_size, nargs, args, used);
5312 rehash_size = i < 0 ? make_float (DEFAULT_REHASH_SIZE) : args[i];
5313 if (!NUMBERP (rehash_size)
5314 || (INTEGERP (rehash_size) && XINT (rehash_size) <= 0)
5315 || XFLOATINT (rehash_size) <= 1.0)
5316 Fsignal (Qerror,
5317 list2 (build_string ("Invalid hash table rehash size"),
5318 rehash_size));
5320 /* Look for `:rehash-threshold THRESHOLD'. */
5321 i = get_key_arg (QCrehash_threshold, nargs, args, used);
5322 rehash_threshold = i < 0 ? make_float (DEFAULT_REHASH_THRESHOLD) : args[i];
5323 if (!FLOATP (rehash_threshold)
5324 || XFLOATINT (rehash_threshold) <= 0.0
5325 || XFLOATINT (rehash_threshold) > 1.0)
5326 Fsignal (Qerror,
5327 list2 (build_string ("Invalid hash table rehash threshold"),
5328 rehash_threshold));
5330 /* Look for `:weakness WEAK'. */
5331 i = get_key_arg (QCweakness, nargs, args, used);
5332 weak = i < 0 ? Qnil : args[i];
5333 if (EQ (weak, Qt))
5334 weak = Qkey_and_value;
5335 if (!NILP (weak)
5336 && !EQ (weak, Qkey)
5337 && !EQ (weak, Qvalue)
5338 && !EQ (weak, Qkey_or_value)
5339 && !EQ (weak, Qkey_and_value))
5340 Fsignal (Qerror, list2 (build_string ("Invalid hash table weakness"),
5341 weak));
5343 /* Now, all args should have been used up, or there's a problem. */
5344 for (i = 0; i < nargs; ++i)
5345 if (!used[i])
5346 Fsignal (Qerror,
5347 list2 (build_string ("Invalid argument list"), args[i]));
5349 return make_hash_table (test, size, rehash_size, rehash_threshold, weak,
5350 user_test, user_hash);
5354 DEFUN ("copy-hash-table", Fcopy_hash_table, Scopy_hash_table, 1, 1, 0,
5355 doc: /* Return a copy of hash table TABLE. */)
5356 (table)
5357 Lisp_Object table;
5359 return copy_hash_table (check_hash_table (table));
5363 DEFUN ("hash-table-count", Fhash_table_count, Shash_table_count, 1, 1, 0,
5364 doc: /* Return the number of elements in TABLE. */)
5365 (table)
5366 Lisp_Object table;
5368 return check_hash_table (table)->count;
5372 DEFUN ("hash-table-rehash-size", Fhash_table_rehash_size,
5373 Shash_table_rehash_size, 1, 1, 0,
5374 doc: /* Return the current rehash size of TABLE. */)
5375 (table)
5376 Lisp_Object table;
5378 return check_hash_table (table)->rehash_size;
5382 DEFUN ("hash-table-rehash-threshold", Fhash_table_rehash_threshold,
5383 Shash_table_rehash_threshold, 1, 1, 0,
5384 doc: /* Return the current rehash threshold of TABLE. */)
5385 (table)
5386 Lisp_Object table;
5388 return check_hash_table (table)->rehash_threshold;
5392 DEFUN ("hash-table-size", Fhash_table_size, Shash_table_size, 1, 1, 0,
5393 doc: /* Return the size of TABLE.
5394 The size can be used as an argument to `make-hash-table' to create
5395 a hash table than can hold as many elements of TABLE holds
5396 without need for resizing. */)
5397 (table)
5398 Lisp_Object table;
5400 struct Lisp_Hash_Table *h = check_hash_table (table);
5401 return make_number (HASH_TABLE_SIZE (h));
5405 DEFUN ("hash-table-test", Fhash_table_test, Shash_table_test, 1, 1, 0,
5406 doc: /* Return the test TABLE uses. */)
5407 (table)
5408 Lisp_Object table;
5410 return check_hash_table (table)->test;
5414 DEFUN ("hash-table-weakness", Fhash_table_weakness, Shash_table_weakness,
5415 1, 1, 0,
5416 doc: /* Return the weakness of TABLE. */)
5417 (table)
5418 Lisp_Object table;
5420 return check_hash_table (table)->weak;
5424 DEFUN ("hash-table-p", Fhash_table_p, Shash_table_p, 1, 1, 0,
5425 doc: /* Return t if OBJ is a Lisp hash table object. */)
5426 (obj)
5427 Lisp_Object obj;
5429 return HASH_TABLE_P (obj) ? Qt : Qnil;
5433 DEFUN ("clrhash", Fclrhash, Sclrhash, 1, 1, 0,
5434 doc: /* Clear hash table TABLE. */)
5435 (table)
5436 Lisp_Object table;
5438 hash_clear (check_hash_table (table));
5439 return Qnil;
5443 DEFUN ("gethash", Fgethash, Sgethash, 2, 3, 0,
5444 doc: /* Look up KEY in TABLE and return its associated value.
5445 If KEY is not found, return DFLT which defaults to nil. */)
5446 (key, table, dflt)
5447 Lisp_Object key, table, dflt;
5449 struct Lisp_Hash_Table *h = check_hash_table (table);
5450 int i = hash_lookup (h, key, NULL);
5451 return i >= 0 ? HASH_VALUE (h, i) : dflt;
5455 DEFUN ("puthash", Fputhash, Sputhash, 3, 3, 0,
5456 doc: /* Associate KEY with VALUE in hash table TABLE.
5457 If KEY is already present in table, replace its current value with
5458 VALUE. */)
5459 (key, value, table)
5460 Lisp_Object key, value, table;
5462 struct Lisp_Hash_Table *h = check_hash_table (table);
5463 int i;
5464 unsigned hash;
5466 i = hash_lookup (h, key, &hash);
5467 if (i >= 0)
5468 HASH_VALUE (h, i) = value;
5469 else
5470 hash_put (h, key, value, hash);
5472 return value;
5476 DEFUN ("remhash", Fremhash, Sremhash, 2, 2, 0,
5477 doc: /* Remove KEY from TABLE. */)
5478 (key, table)
5479 Lisp_Object key, table;
5481 struct Lisp_Hash_Table *h = check_hash_table (table);
5482 hash_remove (h, key);
5483 return Qnil;
5487 DEFUN ("maphash", Fmaphash, Smaphash, 2, 2, 0,
5488 doc: /* Call FUNCTION for all entries in hash table TABLE.
5489 FUNCTION is called with two arguments, KEY and VALUE. */)
5490 (function, table)
5491 Lisp_Object function, table;
5493 struct Lisp_Hash_Table *h = check_hash_table (table);
5494 Lisp_Object args[3];
5495 int i;
5497 for (i = 0; i < HASH_TABLE_SIZE (h); ++i)
5498 if (!NILP (HASH_HASH (h, i)))
5500 args[0] = function;
5501 args[1] = HASH_KEY (h, i);
5502 args[2] = HASH_VALUE (h, i);
5503 Ffuncall (3, args);
5506 return Qnil;
5510 DEFUN ("define-hash-table-test", Fdefine_hash_table_test,
5511 Sdefine_hash_table_test, 3, 3, 0,
5512 doc: /* Define a new hash table test with name NAME, a symbol.
5514 In hash tables created with NAME specified as test, use TEST to
5515 compare keys, and HASH for computing hash codes of keys.
5517 TEST must be a function taking two arguments and returning non-nil if
5518 both arguments are the same. HASH must be a function taking one
5519 argument and return an integer that is the hash code of the argument.
5520 Hash code computation should use the whole value range of integers,
5521 including negative integers. */)
5522 (name, test, hash)
5523 Lisp_Object name, test, hash;
5525 return Fput (name, Qhash_table_test, list2 (test, hash));
5530 /************************************************************************
5532 ************************************************************************/
5534 #include "md5.h"
5535 #include "coding.h"
5537 DEFUN ("md5", Fmd5, Smd5, 1, 5, 0,
5538 doc: /* Return MD5 message digest of OBJECT, a buffer or string.
5540 A message digest is a cryptographic checksum of a document, and the
5541 algorithm to calculate it is defined in RFC 1321.
5543 The two optional arguments START and END are character positions
5544 specifying for which part of OBJECT the message digest should be
5545 computed. If nil or omitted, the digest is computed for the whole
5546 OBJECT.
5548 The MD5 message digest is computed from the result of encoding the
5549 text in a coding system, not directly from the internal Emacs form of
5550 the text. The optional fourth argument CODING-SYSTEM specifies which
5551 coding system to encode the text with. It should be the same coding
5552 system that you used or will use when actually writing the text into a
5553 file.
5555 If CODING-SYSTEM is nil or omitted, the default depends on OBJECT. If
5556 OBJECT is a buffer, the default for CODING-SYSTEM is whatever coding
5557 system would be chosen by default for writing this text into a file.
5559 If OBJECT is a string, the most preferred coding system (see the
5560 command `prefer-coding-system') is used.
5562 If NOERROR is non-nil, silently assume the `raw-text' coding if the
5563 guesswork fails. Normally, an error is signaled in such case. */)
5564 (object, start, end, coding_system, noerror)
5565 Lisp_Object object, start, end, coding_system, noerror;
5567 unsigned char digest[16];
5568 unsigned char value[33];
5569 int i;
5570 int size;
5571 int size_byte = 0;
5572 int start_char = 0, end_char = 0;
5573 int start_byte = 0, end_byte = 0;
5574 register int b, e;
5575 register struct buffer *bp;
5576 int temp;
5578 if (STRINGP (object))
5580 if (NILP (coding_system))
5582 /* Decide the coding-system to encode the data with. */
5584 if (STRING_MULTIBYTE (object))
5585 /* use default, we can't guess correct value */
5586 coding_system = SYMBOL_VALUE (XCAR (Vcoding_category_list));
5587 else
5588 coding_system = Qraw_text;
5591 if (NILP (Fcoding_system_p (coding_system)))
5593 /* Invalid coding system. */
5595 if (!NILP (noerror))
5596 coding_system = Qraw_text;
5597 else
5598 while (1)
5599 Fsignal (Qcoding_system_error, Fcons (coding_system, Qnil));
5602 if (STRING_MULTIBYTE (object))
5603 object = code_convert_string1 (object, coding_system, Qnil, 1);
5605 size = SCHARS (object);
5606 size_byte = SBYTES (object);
5608 if (!NILP (start))
5610 CHECK_NUMBER (start);
5612 start_char = XINT (start);
5614 if (start_char < 0)
5615 start_char += size;
5617 start_byte = string_char_to_byte (object, start_char);
5620 if (NILP (end))
5622 end_char = size;
5623 end_byte = size_byte;
5625 else
5627 CHECK_NUMBER (end);
5629 end_char = XINT (end);
5631 if (end_char < 0)
5632 end_char += size;
5634 end_byte = string_char_to_byte (object, end_char);
5637 if (!(0 <= start_char && start_char <= end_char && end_char <= size))
5638 args_out_of_range_3 (object, make_number (start_char),
5639 make_number (end_char));
5641 else
5643 struct buffer *prev = current_buffer;
5645 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
5647 CHECK_BUFFER (object);
5649 bp = XBUFFER (object);
5650 if (bp != current_buffer)
5651 set_buffer_internal (bp);
5653 if (NILP (start))
5654 b = BEGV;
5655 else
5657 CHECK_NUMBER_COERCE_MARKER (start);
5658 b = XINT (start);
5661 if (NILP (end))
5662 e = ZV;
5663 else
5665 CHECK_NUMBER_COERCE_MARKER (end);
5666 e = XINT (end);
5669 if (b > e)
5670 temp = b, b = e, e = temp;
5672 if (!(BEGV <= b && e <= ZV))
5673 args_out_of_range (start, end);
5675 if (NILP (coding_system))
5677 /* Decide the coding-system to encode the data with.
5678 See fileio.c:Fwrite-region */
5680 if (!NILP (Vcoding_system_for_write))
5681 coding_system = Vcoding_system_for_write;
5682 else
5684 int force_raw_text = 0;
5686 coding_system = XBUFFER (object)->buffer_file_coding_system;
5687 if (NILP (coding_system)
5688 || NILP (Flocal_variable_p (Qbuffer_file_coding_system, Qnil)))
5690 coding_system = Qnil;
5691 if (NILP (current_buffer->enable_multibyte_characters))
5692 force_raw_text = 1;
5695 if (NILP (coding_system) && !NILP (Fbuffer_file_name(object)))
5697 /* Check file-coding-system-alist. */
5698 Lisp_Object args[4], val;
5700 args[0] = Qwrite_region; args[1] = start; args[2] = end;
5701 args[3] = Fbuffer_file_name(object);
5702 val = Ffind_operation_coding_system (4, args);
5703 if (CONSP (val) && !NILP (XCDR (val)))
5704 coding_system = XCDR (val);
5707 if (NILP (coding_system)
5708 && !NILP (XBUFFER (object)->buffer_file_coding_system))
5710 /* If we still have not decided a coding system, use the
5711 default value of buffer-file-coding-system. */
5712 coding_system = XBUFFER (object)->buffer_file_coding_system;
5715 if (!force_raw_text
5716 && !NILP (Ffboundp (Vselect_safe_coding_system_function)))
5717 /* Confirm that VAL can surely encode the current region. */
5718 coding_system = call4 (Vselect_safe_coding_system_function,
5719 make_number (b), make_number (e),
5720 coding_system, Qnil);
5722 if (force_raw_text)
5723 coding_system = Qraw_text;
5726 if (NILP (Fcoding_system_p (coding_system)))
5728 /* Invalid coding system. */
5730 if (!NILP (noerror))
5731 coding_system = Qraw_text;
5732 else
5733 while (1)
5734 Fsignal (Qcoding_system_error, Fcons (coding_system, Qnil));
5738 object = make_buffer_string (b, e, 0);
5739 if (prev != current_buffer)
5740 set_buffer_internal (prev);
5741 /* Discard the unwind protect for recovering the current
5742 buffer. */
5743 specpdl_ptr--;
5745 if (STRING_MULTIBYTE (object))
5746 object = code_convert_string1 (object, coding_system, Qnil, 1);
5749 md5_buffer (SDATA (object) + start_byte,
5750 SBYTES (object) - (size_byte - end_byte),
5751 digest);
5753 for (i = 0; i < 16; i++)
5754 sprintf (&value[2 * i], "%02x", digest[i]);
5755 value[32] = '\0';
5757 return make_string (value, 32);
5761 void
5762 syms_of_fns ()
5764 /* Hash table stuff. */
5765 Qhash_table_p = intern ("hash-table-p");
5766 staticpro (&Qhash_table_p);
5767 Qeq = intern ("eq");
5768 staticpro (&Qeq);
5769 Qeql = intern ("eql");
5770 staticpro (&Qeql);
5771 Qequal = intern ("equal");
5772 staticpro (&Qequal);
5773 QCtest = intern (":test");
5774 staticpro (&QCtest);
5775 QCsize = intern (":size");
5776 staticpro (&QCsize);
5777 QCrehash_size = intern (":rehash-size");
5778 staticpro (&QCrehash_size);
5779 QCrehash_threshold = intern (":rehash-threshold");
5780 staticpro (&QCrehash_threshold);
5781 QCweakness = intern (":weakness");
5782 staticpro (&QCweakness);
5783 Qkey = intern ("key");
5784 staticpro (&Qkey);
5785 Qvalue = intern ("value");
5786 staticpro (&Qvalue);
5787 Qhash_table_test = intern ("hash-table-test");
5788 staticpro (&Qhash_table_test);
5789 Qkey_or_value = intern ("key-or-value");
5790 staticpro (&Qkey_or_value);
5791 Qkey_and_value = intern ("key-and-value");
5792 staticpro (&Qkey_and_value);
5794 defsubr (&Ssxhash);
5795 defsubr (&Smake_hash_table);
5796 defsubr (&Scopy_hash_table);
5797 defsubr (&Shash_table_count);
5798 defsubr (&Shash_table_rehash_size);
5799 defsubr (&Shash_table_rehash_threshold);
5800 defsubr (&Shash_table_size);
5801 defsubr (&Shash_table_test);
5802 defsubr (&Shash_table_weakness);
5803 defsubr (&Shash_table_p);
5804 defsubr (&Sclrhash);
5805 defsubr (&Sgethash);
5806 defsubr (&Sputhash);
5807 defsubr (&Sremhash);
5808 defsubr (&Smaphash);
5809 defsubr (&Sdefine_hash_table_test);
5811 Qstring_lessp = intern ("string-lessp");
5812 staticpro (&Qstring_lessp);
5813 Qprovide = intern ("provide");
5814 staticpro (&Qprovide);
5815 Qrequire = intern ("require");
5816 staticpro (&Qrequire);
5817 Qyes_or_no_p_history = intern ("yes-or-no-p-history");
5818 staticpro (&Qyes_or_no_p_history);
5819 Qcursor_in_echo_area = intern ("cursor-in-echo-area");
5820 staticpro (&Qcursor_in_echo_area);
5821 Qwidget_type = intern ("widget-type");
5822 staticpro (&Qwidget_type);
5824 staticpro (&string_char_byte_cache_string);
5825 string_char_byte_cache_string = Qnil;
5827 require_nesting_list = Qnil;
5828 staticpro (&require_nesting_list);
5830 Fset (Qyes_or_no_p_history, Qnil);
5832 DEFVAR_LISP ("features", &Vfeatures,
5833 doc: /* A list of symbols which are the features of the executing emacs.
5834 Used by `featurep' and `require', and altered by `provide'. */);
5835 Vfeatures = Qnil;
5836 Qsubfeatures = intern ("subfeatures");
5837 staticpro (&Qsubfeatures);
5839 #ifdef HAVE_LANGINFO_CODESET
5840 Qcodeset = intern ("codeset");
5841 staticpro (&Qcodeset);
5842 Qdays = intern ("days");
5843 staticpro (&Qdays);
5844 Qmonths = intern ("months");
5845 staticpro (&Qmonths);
5846 Qpaper = intern ("paper");
5847 staticpro (&Qpaper);
5848 #endif /* HAVE_LANGINFO_CODESET */
5850 DEFVAR_BOOL ("use-dialog-box", &use_dialog_box,
5851 doc: /* *Non-nil means mouse commands use dialog boxes to ask questions.
5852 This applies to `y-or-n-p' and `yes-or-no-p' questions asked by commands
5853 invoked by mouse clicks and mouse menu items. */);
5854 use_dialog_box = 1;
5856 DEFVAR_BOOL ("use-file-dialog", &use_file_dialog,
5857 doc: /* *Non-nil means mouse commands use a file dialog to ask for files.
5858 This applies to commands from menus and tool bar buttons. The value of
5859 `use-dialog-box' takes precedence over this variable, so a file dialog is only
5860 used if both `use-dialog-box' and this variable are non-nil. */);
5861 use_file_dialog = 1;
5863 defsubr (&Sidentity);
5864 defsubr (&Srandom);
5865 defsubr (&Slength);
5866 defsubr (&Ssafe_length);
5867 defsubr (&Sstring_bytes);
5868 defsubr (&Sstring_equal);
5869 defsubr (&Scompare_strings);
5870 defsubr (&Sstring_lessp);
5871 defsubr (&Sappend);
5872 defsubr (&Sconcat);
5873 defsubr (&Svconcat);
5874 defsubr (&Scopy_sequence);
5875 defsubr (&Sstring_make_multibyte);
5876 defsubr (&Sstring_make_unibyte);
5877 defsubr (&Sstring_as_multibyte);
5878 defsubr (&Sstring_as_unibyte);
5879 defsubr (&Sstring_to_multibyte);
5880 defsubr (&Scopy_alist);
5881 defsubr (&Ssubstring);
5882 defsubr (&Ssubstring_no_properties);
5883 defsubr (&Snthcdr);
5884 defsubr (&Snth);
5885 defsubr (&Selt);
5886 defsubr (&Smember);
5887 defsubr (&Smemq);
5888 defsubr (&Sassq);
5889 defsubr (&Sassoc);
5890 defsubr (&Srassq);
5891 defsubr (&Srassoc);
5892 defsubr (&Sdelq);
5893 defsubr (&Sdelete);
5894 defsubr (&Snreverse);
5895 defsubr (&Sreverse);
5896 defsubr (&Ssort);
5897 defsubr (&Splist_get);
5898 defsubr (&Sget);
5899 defsubr (&Splist_put);
5900 defsubr (&Sput);
5901 defsubr (&Slax_plist_get);
5902 defsubr (&Slax_plist_put);
5903 defsubr (&Seql);
5904 defsubr (&Sequal);
5905 defsubr (&Sequal_including_properties);
5906 defsubr (&Sfillarray);
5907 defsubr (&Sclear_string);
5908 defsubr (&Schar_table_subtype);
5909 defsubr (&Schar_table_parent);
5910 defsubr (&Sset_char_table_parent);
5911 defsubr (&Schar_table_extra_slot);
5912 defsubr (&Sset_char_table_extra_slot);
5913 defsubr (&Schar_table_range);
5914 defsubr (&Sset_char_table_range);
5915 defsubr (&Sset_char_table_default);
5916 defsubr (&Soptimize_char_table);
5917 defsubr (&Smap_char_table);
5918 defsubr (&Snconc);
5919 defsubr (&Smapcar);
5920 defsubr (&Smapc);
5921 defsubr (&Smapconcat);
5922 defsubr (&Sy_or_n_p);
5923 defsubr (&Syes_or_no_p);
5924 defsubr (&Sload_average);
5925 defsubr (&Sfeaturep);
5926 defsubr (&Srequire);
5927 defsubr (&Sprovide);
5928 defsubr (&Splist_member);
5929 defsubr (&Swidget_put);
5930 defsubr (&Swidget_get);
5931 defsubr (&Swidget_apply);
5932 defsubr (&Sbase64_encode_region);
5933 defsubr (&Sbase64_decode_region);
5934 defsubr (&Sbase64_encode_string);
5935 defsubr (&Sbase64_decode_string);
5936 defsubr (&Smd5);
5937 defsubr (&Slocale_info);
5941 void
5942 init_fns ()
5944 Vweak_hash_tables = Qnil;
5947 /* arch-tag: 787f8219-5b74-46bd-8469-7e1cc475fa31
5948 (do not change this comment) */