(Fx_popup_menu): Initialize error_name to NULL.
[bpt/emacs.git] / src / fns.c
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.
4
5 This file is part of GNU Emacs.
6
7 GNU Emacs is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs; 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. */
21
22 #include <config.h>
23
24 #ifdef HAVE_UNISTD_H
25 #include <unistd.h>
26 #endif
27 #include <time.h>
28
29 #ifndef MAC_OS
30 /* On Mac OS, defining this conflicts with precompiled headers. */
31
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 *****
36
37 #endif /* ! MAC_OSX */
38
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
53
54 #ifndef NULL
55 #define NULL ((POINTER_TYPE *)0)
56 #endif
57
58 /* Nonzero enables use of dialog boxes for questions
59 asked by mouse commands. */
60 int use_dialog_box;
61
62 /* Nonzero enables use of a file dialog for file name
63 questions asked by mouse commands. */
64 int use_file_dialog;
65
66 extern int minibuffer_auto_raise;
67 extern Lisp_Object minibuf_window;
68 extern Lisp_Object Vlocale_coding_system;
69 extern Lisp_Object Vloads_in_progress;
70
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;
76
77 extern Lisp_Object Qinput_method_function;
78
79 static int internal_equal ();
80
81 extern long get_random ();
82 extern void seed_random ();
83
84 #ifndef HAVE_UNISTD_H
85 extern long time ();
86 #endif
87 \f
88 DEFUN ("identity", Fidentity, Sidentity, 1, 1, 0,
89 doc: /* Return the argument unchanged. */)
90 (arg)
91 Lisp_Object arg;
92 {
93 return arg;
94 }
95
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. */)
102 (n)
103 Lisp_Object n;
104 {
105 EMACS_INT val;
106 Lisp_Object lispy_val;
107 unsigned long denominator;
108
109 if (EQ (n, Qt))
110 seed_random (getpid () + time (NULL));
111 if (NATNUMP (n) && XFASTINT (n) != 0)
112 {
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);
121 do
122 val = get_random () / denominator;
123 while (val >= XFASTINT (n));
124 }
125 else
126 val = get_random ();
127 XSETINT (lispy_val, val);
128 return lispy_val;
129 }
130 \f
131 /* Random data-structure functions */
132
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;
141 {
142 register Lisp_Object val;
143 register int i;
144
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))
159 {
160 i = 0;
161 while (CONSP (sequence))
162 {
163 sequence = XCDR (sequence);
164 ++i;
165
166 if (!CONSP (sequence))
167 break;
168
169 sequence = XCDR (sequence);
170 ++i;
171 QUIT;
172 }
173
174 if (!NILP (sequence))
175 wrong_type_argument (Qlistp, sequence);
176
177 val = make_number (i);
178 }
179 else if (NILP (sequence))
180 XSETFASTINT (val, 0);
181 else
182 {
183 sequence = wrong_type_argument (Qsequencep, sequence);
184 goto retry;
185 }
186 return val;
187 }
188
189 /* This does not check for quits. That is safe
190 since it must terminate. */
191
192 DEFUN ("safe-length", Fsafe_length, Ssafe_length, 1, 1, 0,
193 doc: /* Return the length of a list, but avoid error or infinite loop.
194 This function never gets an error. If LIST is not really a list,
195 it returns 0. If LIST is circular, it returns a finite value
196 which is at least the number of distinct elements. */)
197 (list)
198 Lisp_Object list;
199 {
200 Lisp_Object tail, halftail, length;
201 int len = 0;
202
203 /* halftail is used to detect circular lists. */
204 halftail = list;
205 for (tail = list; CONSP (tail); tail = XCDR (tail))
206 {
207 if (EQ (tail, halftail) && len != 0)
208 break;
209 len++;
210 if ((len & 1) == 0)
211 halftail = XCDR (halftail);
212 }
213
214 XSETINT (length, len);
215 return length;
216 }
217
218 DEFUN ("string-bytes", Fstring_bytes, Sstring_bytes, 1, 1, 0,
219 doc: /* Return the number of bytes in STRING.
220 If STRING is a multibyte string, this is greater than the length of STRING. */)
221 (string)
222 Lisp_Object string;
223 {
224 CHECK_STRING (string);
225 return make_number (SBYTES (string));
226 }
227
228 DEFUN ("string-equal", Fstring_equal, Sstring_equal, 2, 2, 0,
229 doc: /* Return t if two strings have identical contents.
230 Case is significant, but text properties are ignored.
231 Symbols are also allowed; their print names are used instead. */)
232 (s1, s2)
233 register Lisp_Object s1, s2;
234 {
235 if (SYMBOLP (s1))
236 s1 = SYMBOL_NAME (s1);
237 if (SYMBOLP (s2))
238 s2 = SYMBOL_NAME (s2);
239 CHECK_STRING (s1);
240 CHECK_STRING (s2);
241
242 if (SCHARS (s1) != SCHARS (s2)
243 || SBYTES (s1) != SBYTES (s2)
244 || bcmp (SDATA (s1), SDATA (s2), SBYTES (s1)))
245 return Qnil;
246 return Qt;
247 }
248
249 DEFUN ("compare-strings", Fcompare_strings,
250 Scompare_strings, 6, 7, 0,
251 doc: /* Compare the contents of two strings, converting to multibyte if needed.
252 In string STR1, skip the first START1 characters and stop at END1.
253 In string STR2, skip the first START2 characters and stop at END2.
254 END1 and END2 default to the full lengths of the respective strings.
255
256 Case is significant in this comparison if IGNORE-CASE is nil.
257 Unibyte strings are converted to multibyte for comparison.
258
259 The value is t if the strings (or specified portions) match.
260 If string STR1 is less, the value is a negative number N;
261 - 1 - N is the number of characters that match at the beginning.
262 If string STR1 is greater, the value is a positive number N;
263 N - 1 is the number of characters that match at the beginning. */)
264 (str1, start1, end1, str2, start2, end2, ignore_case)
265 Lisp_Object str1, start1, end1, start2, str2, end2, ignore_case;
266 {
267 register int end1_char, end2_char;
268 register int i1, i1_byte, i2, i2_byte;
269
270 CHECK_STRING (str1);
271 CHECK_STRING (str2);
272 if (NILP (start1))
273 start1 = make_number (0);
274 if (NILP (start2))
275 start2 = make_number (0);
276 CHECK_NATNUM (start1);
277 CHECK_NATNUM (start2);
278 if (! NILP (end1))
279 CHECK_NATNUM (end1);
280 if (! NILP (end2))
281 CHECK_NATNUM (end2);
282
283 i1 = XINT (start1);
284 i2 = XINT (start2);
285
286 i1_byte = string_char_to_byte (str1, i1);
287 i2_byte = string_char_to_byte (str2, i2);
288
289 end1_char = SCHARS (str1);
290 if (! NILP (end1) && end1_char > XINT (end1))
291 end1_char = XINT (end1);
292
293 end2_char = SCHARS (str2);
294 if (! NILP (end2) && end2_char > XINT (end2))
295 end2_char = XINT (end2);
296
297 while (i1 < end1_char && i2 < end2_char)
298 {
299 /* When we find a mismatch, we must compare the
300 characters, not just the bytes. */
301 int c1, c2;
302
303 if (STRING_MULTIBYTE (str1))
304 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c1, str1, i1, i1_byte);
305 else
306 {
307 c1 = SREF (str1, i1++);
308 c1 = unibyte_char_to_multibyte (c1);
309 }
310
311 if (STRING_MULTIBYTE (str2))
312 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c2, str2, i2, i2_byte);
313 else
314 {
315 c2 = SREF (str2, i2++);
316 c2 = unibyte_char_to_multibyte (c2);
317 }
318
319 if (c1 == c2)
320 continue;
321
322 if (! NILP (ignore_case))
323 {
324 Lisp_Object tem;
325
326 tem = Fupcase (make_number (c1));
327 c1 = XINT (tem);
328 tem = Fupcase (make_number (c2));
329 c2 = XINT (tem);
330 }
331
332 if (c1 == c2)
333 continue;
334
335 /* Note that I1 has already been incremented
336 past the character that we are comparing;
337 hence we don't add or subtract 1 here. */
338 if (c1 < c2)
339 return make_number (- i1 + XINT (start1));
340 else
341 return make_number (i1 - XINT (start1));
342 }
343
344 if (i1 < end1_char)
345 return make_number (i1 - XINT (start1) + 1);
346 if (i2 < end2_char)
347 return make_number (- i1 + XINT (start1) - 1);
348
349 return Qt;
350 }
351
352 DEFUN ("string-lessp", Fstring_lessp, Sstring_lessp, 2, 2, 0,
353 doc: /* Return t if first arg string is less than second in lexicographic order.
354 Case is significant.
355 Symbols are also allowed; their print names are used instead. */)
356 (s1, s2)
357 register Lisp_Object s1, s2;
358 {
359 register int end;
360 register int i1, i1_byte, i2, i2_byte;
361
362 if (SYMBOLP (s1))
363 s1 = SYMBOL_NAME (s1);
364 if (SYMBOLP (s2))
365 s2 = SYMBOL_NAME (s2);
366 CHECK_STRING (s1);
367 CHECK_STRING (s2);
368
369 i1 = i1_byte = i2 = i2_byte = 0;
370
371 end = SCHARS (s1);
372 if (end > SCHARS (s2))
373 end = SCHARS (s2);
374
375 while (i1 < end)
376 {
377 /* When we find a mismatch, we must compare the
378 characters, not just the bytes. */
379 int c1, c2;
380
381 FETCH_STRING_CHAR_ADVANCE (c1, s1, i1, i1_byte);
382 FETCH_STRING_CHAR_ADVANCE (c2, s2, i2, i2_byte);
383
384 if (c1 != c2)
385 return c1 < c2 ? Qt : Qnil;
386 }
387 return i1 < SCHARS (s2) ? Qt : Qnil;
388 }
389 \f
390 static Lisp_Object concat ();
391
392 /* ARGSUSED */
393 Lisp_Object
394 concat2 (s1, s2)
395 Lisp_Object s1, s2;
396 {
397 #ifdef NO_ARG_ARRAY
398 Lisp_Object args[2];
399 args[0] = s1;
400 args[1] = s2;
401 return concat (2, args, Lisp_String, 0);
402 #else
403 return concat (2, &s1, Lisp_String, 0);
404 #endif /* NO_ARG_ARRAY */
405 }
406
407 /* ARGSUSED */
408 Lisp_Object
409 concat3 (s1, s2, s3)
410 Lisp_Object s1, s2, s3;
411 {
412 #ifdef NO_ARG_ARRAY
413 Lisp_Object args[3];
414 args[0] = s1;
415 args[1] = s2;
416 args[2] = s3;
417 return concat (3, args, Lisp_String, 0);
418 #else
419 return concat (3, &s1, Lisp_String, 0);
420 #endif /* NO_ARG_ARRAY */
421 }
422
423 DEFUN ("append", Fappend, Sappend, 0, MANY, 0,
424 doc: /* Concatenate all the arguments and make the result a list.
425 The result is a list whose elements are the elements of all the arguments.
426 Each argument may be a list, vector or string.
427 The last argument is not copied, just used as the tail of the new list.
428 usage: (append &rest SEQUENCES) */)
429 (nargs, args)
430 int nargs;
431 Lisp_Object *args;
432 {
433 return concat (nargs, args, Lisp_Cons, 1);
434 }
435
436 DEFUN ("concat", Fconcat, Sconcat, 0, MANY, 0,
437 doc: /* Concatenate all the arguments and make the result a string.
438 The result is a string whose elements are the elements of all the arguments.
439 Each argument may be a string or a list or vector of characters (integers).
440 usage: (concat &rest SEQUENCES) */)
441 (nargs, args)
442 int nargs;
443 Lisp_Object *args;
444 {
445 return concat (nargs, args, Lisp_String, 0);
446 }
447
448 DEFUN ("vconcat", Fvconcat, Svconcat, 0, MANY, 0,
449 doc: /* Concatenate all the arguments and make the result a vector.
450 The result is a vector whose elements are the elements of all the arguments.
451 Each argument may be a list, vector or string.
452 usage: (vconcat &rest SEQUENCES) */)
453 (nargs, args)
454 int nargs;
455 Lisp_Object *args;
456 {
457 return concat (nargs, args, Lisp_Vectorlike, 0);
458 }
459
460 /* Return a copy of a sub char table ARG. The elements except for a
461 nested sub char table are not copied. */
462 static Lisp_Object
463 copy_sub_char_table (arg)
464 Lisp_Object arg;
465 {
466 Lisp_Object copy = make_sub_char_table (XCHAR_TABLE (arg)->defalt);
467 int i;
468
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]);
477
478 return copy;
479 }
480
481
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;
488 {
489 if (NILP (arg)) return arg;
490
491 if (CHAR_TABLE_P (arg))
492 {
493 int i;
494 Lisp_Object copy;
495
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)));
501
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]);
509
510 return copy;
511 }
512
513 if (BOOL_VECTOR_P (arg))
514 {
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);
519
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;
524 }
525
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);
529 }
530
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
534 {
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) */
538 };
539
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;
546 {
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;
567
568 tail = Qnil;
569
570 /* In append, the last arg isn't treated like the others */
571 if (last_special && nargs > 0)
572 {
573 nargs--;
574 last_tail = args[nargs];
575 }
576 else
577 last_tail = Qnil;
578
579 /* Canonicalize each argument. */
580 for (argnum = 0; argnum < nargs; argnum++)
581 {
582 this = args[argnum];
583 if (!(CONSP (this) || NILP (this) || VECTORP (this) || STRINGP (this)
584 || COMPILEDP (this) || BOOL_VECTOR_P (this)))
585 {
586 args[argnum] = wrong_type_argument (Qsequencep, this);
587 }
588 }
589
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++)
598 {
599 int len;
600 this = args[argnum];
601 len = XFASTINT (Flength (this));
602 if (target_type == Lisp_String)
603 {
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;
609
610 if (VECTORP (this))
611 for (i = 0; i < len; i++)
612 {
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;
620 }
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))
625 {
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;
633 }
634 else if (STRINGP (this))
635 {
636 if (STRING_MULTIBYTE (this))
637 {
638 some_multibyte = 1;
639 result_len_byte += SBYTES (this);
640 }
641 else
642 result_len_byte += count_size_as_multibyte (SDATA (this),
643 SCHARS (this));
644 }
645 }
646
647 result_len += len;
648 }
649
650 if (! some_multibyte)
651 result_len_byte = result_len;
652
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);
662
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;
666
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;
672
673 prev = Qnil;
674 if (STRINGP (val))
675 SAFE_ALLOCA (textprops, struct textprop_rec *, sizeof (struct textprop_rec) * nargs);
676
677 for (argnum = 0; argnum < nargs; argnum++)
678 {
679 Lisp_Object thislen;
680 int thisleni = 0;
681 register unsigned int thisindex = 0;
682 register unsigned int thisindex_byte = 0;
683
684 this = args[argnum];
685 if (!CONSP (this))
686 thislen = Flength (this), thisleni = XINT (thislen);
687
688 /* Between strings of the same kind, copy fast. */
689 if (STRINGP (this) && STRINGP (val)
690 && STRING_MULTIBYTE (this) == some_multibyte)
691 {
692 int thislen_byte = SBYTES (this);
693
694 bcopy (SDATA (this), SDATA (val) + toindex_byte,
695 SBYTES (this));
696 if (! NULL_INTERVAL_P (STRING_INTERVALS (this)))
697 {
698 textprops[num_textprops].argnum = argnum;
699 textprops[num_textprops].from = 0;
700 textprops[num_textprops++].to = toindex;
701 }
702 toindex_byte += thislen_byte;
703 toindex += thisleni;
704 STRING_SET_CHARS (val, SCHARS (val));
705 }
706 /* Copy a single-byte string to a multibyte string. */
707 else if (STRINGP (this) && STRINGP (val))
708 {
709 if (! NULL_INTERVAL_P (STRING_INTERVALS (this)))
710 {
711 textprops[num_textprops].argnum = argnum;
712 textprops[num_textprops].from = 0;
713 textprops[num_textprops++].to = toindex;
714 }
715 toindex_byte += copy_text (SDATA (this),
716 SDATA (val) + toindex_byte,
717 SCHARS (this), 0, 1);
718 toindex += thisleni;
719 }
720 else
721 /* Copy element by element. */
722 while (1)
723 {
724 register Lisp_Object elt;
725
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))
734 {
735 int c;
736 if (STRING_MULTIBYTE (this))
737 {
738 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c, this,
739 thisindex,
740 thisindex_byte);
741 XSETFASTINT (elt, c);
742 }
743 else
744 {
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)
751 {
752 c = unibyte_char_to_multibyte (XINT (elt));
753 XSETINT (elt, c);
754 }
755 }
756 }
757 else if (BOOL_VECTOR_P (this))
758 {
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++;
766 }
767 else
768 elt = XVECTOR (this)->contents[thisindex++];
769
770 /* Store this element into the result. */
771 if (toindex < 0)
772 {
773 XSETCAR (tail, elt);
774 prev = tail;
775 tail = XCDR (tail);
776 }
777 else if (VECTORP (val))
778 XVECTOR (val)->contents[toindex++] = elt;
779 else
780 {
781 CHECK_NUMBER (elt);
782 if (SINGLE_BYTE_CHAR_P (XINT (elt)))
783 {
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++;
791 }
792 else
793 /* If we have any multibyte characters,
794 we already decided to make a multibyte string. */
795 {
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;
800
801 toindex_byte += CHAR_STRING (c, p);
802 toindex++;
803 }
804 }
805 }
806 }
807 if (!NILP (prev))
808 XSETCDR (prev, last_tail);
809
810 if (num_textprops > 0)
811 {
812 Lisp_Object props;
813 int last_to_end = -1;
814
815 for (argnum = 0; argnum < num_textprops; argnum++)
816 {
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);
829 }
830 }
831
832 SAFE_FREE ();
833 return val;
834 }
835 \f
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;
839
840 void
841 clear_string_char_byte_cache ()
842 {
843 string_char_byte_cache_string = Qnil;
844 }
845
846 /* Return the character index corresponding to CHAR_INDEX in STRING. */
847
848 int
849 string_char_to_byte (string, char_index)
850 Lisp_Object string;
851 int char_index;
852 {
853 int i, i_byte;
854 int best_below, best_below_byte;
855 int best_above, best_above_byte;
856
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;
862
863 if (EQ (string, string_char_byte_cache_string))
864 {
865 if (string_char_byte_cache_charpos < char_index)
866 {
867 best_below = string_char_byte_cache_charpos;
868 best_below_byte = string_char_byte_cache_bytepos;
869 }
870 else
871 {
872 best_above = string_char_byte_cache_charpos;
873 best_above_byte = string_char_byte_cache_bytepos;
874 }
875 }
876
877 if (char_index - best_below < best_above - char_index)
878 {
879 while (best_below < char_index)
880 {
881 int c;
882 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c, string,
883 best_below, best_below_byte);
884 }
885 i = best_below;
886 i_byte = best_below_byte;
887 }
888 else
889 {
890 while (best_above > char_index)
891 {
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;
896
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--;
906 }
907 i = best_above;
908 i_byte = best_above_byte;
909 }
910
911 string_char_byte_cache_bytepos = i_byte;
912 string_char_byte_cache_charpos = i;
913 string_char_byte_cache_string = string;
914
915 return i_byte;
916 }
917 \f
918 /* Return the character index corresponding to BYTE_INDEX in STRING. */
919
920 int
921 string_byte_to_char (string, byte_index)
922 Lisp_Object string;
923 int byte_index;
924 {
925 int i, i_byte;
926 int best_below, best_below_byte;
927 int best_above, best_above_byte;
928
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;
934
935 if (EQ (string, string_char_byte_cache_string))
936 {
937 if (string_char_byte_cache_bytepos < byte_index)
938 {
939 best_below = string_char_byte_cache_charpos;
940 best_below_byte = string_char_byte_cache_bytepos;
941 }
942 else
943 {
944 best_above = string_char_byte_cache_charpos;
945 best_above_byte = string_char_byte_cache_bytepos;
946 }
947 }
948
949 if (byte_index - best_below_byte < best_above_byte - byte_index)
950 {
951 while (best_below_byte < byte_index)
952 {
953 int c;
954 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c, string,
955 best_below, best_below_byte);
956 }
957 i = best_below;
958 i_byte = best_below_byte;
959 }
960 else
961 {
962 while (best_above_byte > byte_index)
963 {
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;
968
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--;
978 }
979 i = best_above;
980 i_byte = best_above_byte;
981 }
982
983 string_char_byte_cache_bytepos = i_byte;
984 string_char_byte_cache_charpos = i;
985 string_char_byte_cache_string = string;
986
987 return i;
988 }
989 \f
990 /* Convert STRING to a multibyte string.
991 Single-byte characters 0240 through 0377 are converted
992 by adding nonascii_insert_offset to each. */
993
994 Lisp_Object
995 string_make_multibyte (string)
996 Lisp_Object string;
997 {
998 unsigned char *buf;
999 int nbytes;
1000 Lisp_Object ret;
1001 USE_SAFE_ALLOCA;
1002
1003 if (STRING_MULTIBYTE (string))
1004 return string;
1005
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;
1012
1013 SAFE_ALLOCA (buf, unsigned char *, nbytes);
1014 copy_text (SDATA (string), buf, SBYTES (string),
1015 0, 1);
1016
1017 ret = make_multibyte_string (buf, SCHARS (string), nbytes);
1018 SAFE_FREE ();
1019
1020 return ret;
1021 }
1022
1023
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. */
1028
1029 Lisp_Object
1030 string_to_multibyte (string)
1031 Lisp_Object string;
1032 {
1033 unsigned char *buf;
1034 int nbytes;
1035 Lisp_Object ret;
1036 USE_SAFE_ALLOCA;
1037
1038 if (STRING_MULTIBYTE (string))
1039 return string;
1040
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);
1046
1047 SAFE_ALLOCA (buf, unsigned char *, nbytes);
1048 bcopy (SDATA (string), buf, SBYTES (string));
1049 str_to_multibyte (buf, nbytes, SBYTES (string));
1050
1051 ret = make_multibyte_string (buf, SCHARS (string), nbytes);
1052 SAFE_FREE ();
1053
1054 return ret;
1055 }
1056
1057
1058 /* Convert STRING to a single-byte string. */
1059
1060 Lisp_Object
1061 string_make_unibyte (string)
1062 Lisp_Object string;
1063 {
1064 int nchars;
1065 unsigned char *buf;
1066 Lisp_Object ret;
1067 USE_SAFE_ALLOCA;
1068
1069 if (! STRING_MULTIBYTE (string))
1070 return string;
1071
1072 nchars = SCHARS (string);
1073
1074 SAFE_ALLOCA (buf, unsigned char *, nchars);
1075 copy_text (SDATA (string), buf, SBYTES (string),
1076 1, 0);
1077
1078 ret = make_unibyte_string (buf, nchars);
1079 SAFE_FREE ();
1080
1081 return ret;
1082 }
1083
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;
1097 {
1098 CHECK_STRING (string);
1099
1100 return string_make_multibyte (string);
1101 }
1102
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;
1112 {
1113 CHECK_STRING (string);
1114
1115 return string_make_unibyte (string);
1116 }
1117
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;
1128 {
1129 CHECK_STRING (string);
1130
1131 if (STRING_MULTIBYTE (string))
1132 {
1133 int bytes = SBYTES (string);
1134 unsigned char *str = (unsigned char *) xmalloc (bytes);
1135
1136 bcopy (SDATA (string), str, bytes);
1137 bytes = str_as_unibyte (str, bytes);
1138 string = make_unibyte_string (str, bytes);
1139 xfree (str);
1140 }
1141 return string;
1142 }
1143
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)
1160 but
1161 (aref (string-as-multibyte "\201\300") 0) -> 2240
1162 (aref (string-as-multibyte "\201\300") 1) -> <error> */)
1163 (string)
1164 Lisp_Object string;
1165 {
1166 CHECK_STRING (string);
1167
1168 if (! STRING_MULTIBYTE (string))
1169 {
1170 Lisp_Object new_string;
1171 int nchars, nbytes;
1172
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);
1184 }
1185 return string;
1186 }
1187
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;
1200 {
1201 CHECK_STRING (string);
1202
1203 return string_to_multibyte (string);
1204 }
1205
1206 \f
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;
1216 {
1217 register Lisp_Object tem;
1218
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))
1224 {
1225 register Lisp_Object car;
1226 car = XCAR (tem);
1227
1228 if (CONSP (car))
1229 XSETCAR (tem, Fcons (XCAR (car), XCDR (car)));
1230 }
1231 return alist;
1232 }
1233
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.
1238
1239 This function allows vectors as well as strings. */)
1240 (string, from, to)
1241 Lisp_Object string;
1242 register Lisp_Object from, to;
1243 {
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;
1249
1250 if (! (STRINGP (string) || VECTORP (string)))
1251 wrong_type_argument (Qarrayp, string);
1252
1253 CHECK_NUMBER (from);
1254
1255 if (STRINGP (string))
1256 {
1257 size = SCHARS (string);
1258 size_byte = SBYTES (string);
1259 }
1260 else
1261 size = XVECTOR (string)->size;
1262
1263 if (NILP (to))
1264 {
1265 to_char = size;
1266 to_byte = size_byte;
1267 }
1268 else
1269 {
1270 CHECK_NUMBER (to);
1271
1272 to_char = XINT (to);
1273 if (to_char < 0)
1274 to_char += size;
1275
1276 if (STRINGP (string))
1277 to_byte = string_char_to_byte (string, to_char);
1278 }
1279
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);
1285
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));
1289
1290 if (STRINGP (string))
1291 {
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);
1297 }
1298 else
1299 res = Fvector (to_char - from_char,
1300 XVECTOR (string)->contents + from_char);
1301
1302 return res;
1303 }
1304
1305
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.
1312
1313 With one argument, just copy STRING without its properties. */)
1314 (string, from, to)
1315 Lisp_Object string;
1316 register Lisp_Object from, to;
1317 {
1318 int size, size_byte;
1319 int from_char, to_char;
1320 int from_byte, to_byte;
1321
1322 CHECK_STRING (string);
1323
1324 size = SCHARS (string);
1325 size_byte = SBYTES (string);
1326
1327 if (NILP (from))
1328 from_char = from_byte = 0;
1329 else
1330 {
1331 CHECK_NUMBER (from);
1332 from_char = XINT (from);
1333 if (from_char < 0)
1334 from_char += size;
1335
1336 from_byte = string_char_to_byte (string, from_char);
1337 }
1338
1339 if (NILP (to))
1340 {
1341 to_char = size;
1342 to_byte = size_byte;
1343 }
1344 else
1345 {
1346 CHECK_NUMBER (to);
1347
1348 to_char = XINT (to);
1349 if (to_char < 0)
1350 to_char += size;
1351
1352 to_byte = string_char_to_byte (string, to_char);
1353 }
1354
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));
1358
1359 return make_specified_string (SDATA (string) + from_byte,
1360 to_char - from_char, to_byte - from_byte,
1361 STRING_MULTIBYTE (string));
1362 }
1363
1364 /* Extract a substring of STRING, giving start and end positions
1365 both in characters and in bytes. */
1366
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;
1371 {
1372 Lisp_Object res;
1373 int size;
1374 int size_byte;
1375
1376 if (! (STRINGP (string) || VECTORP (string)))
1377 wrong_type_argument (Qarrayp, string);
1378
1379 if (STRINGP (string))
1380 {
1381 size = SCHARS (string);
1382 size_byte = SBYTES (string);
1383 }
1384 else
1385 size = XVECTOR (string)->size;
1386
1387 if (!(0 <= from && from <= to && to <= size))
1388 args_out_of_range_3 (string, make_number (from), make_number (to));
1389
1390 if (STRINGP (string))
1391 {
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);
1397 }
1398 else
1399 res = Fvector (to - from,
1400 XVECTOR (string)->contents + from);
1401
1402 return res;
1403 }
1404 \f
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;
1410 {
1411 register int i, num;
1412 CHECK_NUMBER (n);
1413 num = XINT (n);
1414 for (i = 0; i < num && !NILP (list); i++)
1415 {
1416 QUIT;
1417 if (! CONSP (list))
1418 wrong_type_argument (Qlistp, list);
1419 list = XCDR (list);
1420 }
1421 return list;
1422 }
1423
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;
1429 {
1430 return Fcar (Fnthcdr (n, list));
1431 }
1432
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;
1437 {
1438 CHECK_NUMBER (n);
1439 while (1)
1440 {
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);
1448 }
1449 }
1450
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;
1457 {
1458 register Lisp_Object tail;
1459 for (tail = list; !NILP (tail); tail = XCDR (tail))
1460 {
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;
1468 }
1469 return Qnil;
1470 }
1471
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;
1478 {
1479 while (1)
1480 {
1481 if (!CONSP (list) || EQ (XCAR (list), elt))
1482 break;
1483
1484 list = XCDR (list);
1485 if (!CONSP (list) || EQ (XCAR (list), elt))
1486 break;
1487
1488 list = XCDR (list);
1489 if (!CONSP (list) || EQ (XCAR (list), elt))
1490 break;
1491
1492 list = XCDR (list);
1493 QUIT;
1494 }
1495
1496 if (!CONSP (list) && !NILP (list))
1497 list = wrong_type_argument (Qlistp, list);
1498
1499 return list;
1500 }
1501
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;
1508 {
1509 Lisp_Object result;
1510
1511 while (1)
1512 {
1513 if (!CONSP (list)
1514 || (CONSP (XCAR (list))
1515 && EQ (XCAR (XCAR (list)), key)))
1516 break;
1517
1518 list = XCDR (list);
1519 if (!CONSP (list)
1520 || (CONSP (XCAR (list))
1521 && EQ (XCAR (XCAR (list)), key)))
1522 break;
1523
1524 list = XCDR (list);
1525 if (!CONSP (list)
1526 || (CONSP (XCAR (list))
1527 && EQ (XCAR (XCAR (list)), key)))
1528 break;
1529
1530 list = XCDR (list);
1531 QUIT;
1532 }
1533
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);
1540
1541 return result;
1542 }
1543
1544 /* Like Fassq but never report an error and do not allow quits.
1545 Use only on lists known never to be circular. */
1546
1547 Lisp_Object
1548 assq_no_quit (key, list)
1549 Lisp_Object key, list;
1550 {
1551 while (CONSP (list)
1552 && (!CONSP (XCAR (list))
1553 || !EQ (XCAR (XCAR (list)), key)))
1554 list = XCDR (list);
1555
1556 return CONSP (list) ? XCAR (list) : Qnil;
1557 }
1558
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;
1564 {
1565 Lisp_Object result, car;
1566
1567 while (1)
1568 {
1569 if (!CONSP (list)
1570 || (CONSP (XCAR (list))
1571 && (car = XCAR (XCAR (list)),
1572 EQ (car, key) || !NILP (Fequal (car, key)))))
1573 break;
1574
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;
1581
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;
1588
1589 list = XCDR (list);
1590 QUIT;
1591 }
1592
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);
1599
1600 return result;
1601 }
1602
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;
1609 {
1610 Lisp_Object result;
1611
1612 while (1)
1613 {
1614 if (!CONSP (list)
1615 || (CONSP (XCAR (list))
1616 && EQ (XCDR (XCAR (list)), key)))
1617 break;
1618
1619 list = XCDR (list);
1620 if (!CONSP (list)
1621 || (CONSP (XCAR (list))
1622 && EQ (XCDR (XCAR (list)), key)))
1623 break;
1624
1625 list = XCDR (list);
1626 if (!CONSP (list)
1627 || (CONSP (XCAR (list))
1628 && EQ (XCDR (XCAR (list)), key)))
1629 break;
1630
1631 list = XCDR (list);
1632 QUIT;
1633 }
1634
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);
1641
1642 return result;
1643 }
1644
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;
1650 {
1651 Lisp_Object result, cdr;
1652
1653 while (1)
1654 {
1655 if (!CONSP (list)
1656 || (CONSP (XCAR (list))
1657 && (cdr = XCDR (XCAR (list)),
1658 EQ (cdr, key) || !NILP (Fequal (cdr, key)))))
1659 break;
1660
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;
1667
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;
1674
1675 list = XCDR (list);
1676 QUIT;
1677 }
1678
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);
1685
1686 return result;
1687 }
1688 \f
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;
1698 {
1699 register Lisp_Object tail, prev;
1700 register Lisp_Object tem;
1701
1702 tail = list;
1703 prev = Qnil;
1704 while (!NILP (tail))
1705 {
1706 if (! CONSP (tail))
1707 wrong_type_argument (Qlistp, list);
1708 tem = XCAR (tail);
1709 if (EQ (elt, tem))
1710 {
1711 if (NILP (prev))
1712 list = XCDR (tail);
1713 else
1714 Fsetcdr (prev, XCDR (tail));
1715 }
1716 else
1717 prev = tail;
1718 tail = XCDR (tail);
1719 QUIT;
1720 }
1721 return list;
1722 }
1723
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;
1734 {
1735 if (VECTORP (seq))
1736 {
1737 EMACS_INT i, n;
1738
1739 for (i = n = 0; i < ASIZE (seq); ++i)
1740 if (NILP (Fequal (AREF (seq, i), elt)))
1741 ++n;
1742
1743 if (n != ASIZE (seq))
1744 {
1745 struct Lisp_Vector *p = allocate_vector (n);
1746
1747 for (i = n = 0; i < ASIZE (seq); ++i)
1748 if (NILP (Fequal (AREF (seq, i), elt)))
1749 p->contents[n++] = AREF (seq, i);
1750
1751 XSETVECTOR (seq, p);
1752 }
1753 }
1754 else if (STRINGP (seq))
1755 {
1756 EMACS_INT i, ibyte, nchars, nbytes, cbytes;
1757 int c;
1758
1759 for (i = nchars = nbytes = ibyte = 0;
1760 i < SCHARS (seq);
1761 ++i, ibyte += cbytes)
1762 {
1763 if (STRING_MULTIBYTE (seq))
1764 {
1765 c = STRING_CHAR (SDATA (seq) + ibyte,
1766 SBYTES (seq) - ibyte);
1767 cbytes = CHAR_BYTES (c);
1768 }
1769 else
1770 {
1771 c = SREF (seq, i);
1772 cbytes = 1;
1773 }
1774
1775 if (!INTEGERP (elt) || c != XINT (elt))
1776 {
1777 ++nchars;
1778 nbytes += cbytes;
1779 }
1780 }
1781
1782 if (nchars != SCHARS (seq))
1783 {
1784 Lisp_Object tem;
1785
1786 tem = make_uninit_multibyte_string (nchars, nbytes);
1787 if (!STRING_MULTIBYTE (seq))
1788 STRING_SET_UNIBYTE (tem);
1789
1790 for (i = nchars = nbytes = ibyte = 0;
1791 i < SCHARS (seq);
1792 ++i, ibyte += cbytes)
1793 {
1794 if (STRING_MULTIBYTE (seq))
1795 {
1796 c = STRING_CHAR (SDATA (seq) + ibyte,
1797 SBYTES (seq) - ibyte);
1798 cbytes = CHAR_BYTES (c);
1799 }
1800 else
1801 {
1802 c = SREF (seq, i);
1803 cbytes = 1;
1804 }
1805
1806 if (!INTEGERP (elt) || c != XINT (elt))
1807 {
1808 unsigned char *from = SDATA (seq) + ibyte;
1809 unsigned char *to = SDATA (tem) + nbytes;
1810 EMACS_INT n;
1811
1812 ++nchars;
1813 nbytes += cbytes;
1814
1815 for (n = cbytes; n--; )
1816 *to++ = *from++;
1817 }
1818 }
1819
1820 seq = tem;
1821 }
1822 }
1823 else
1824 {
1825 Lisp_Object tail, prev;
1826
1827 for (tail = seq, prev = Qnil; !NILP (tail); tail = XCDR (tail))
1828 {
1829 if (!CONSP (tail))
1830 wrong_type_argument (Qlistp, seq);
1831
1832 if (!NILP (Fequal (elt, XCAR (tail))))
1833 {
1834 if (NILP (prev))
1835 seq = XCDR (tail);
1836 else
1837 Fsetcdr (prev, XCDR (tail));
1838 }
1839 else
1840 prev = tail;
1841 QUIT;
1842 }
1843 }
1844
1845 return seq;
1846 }
1847
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;
1853 {
1854 register Lisp_Object prev, tail, next;
1855
1856 if (NILP (list)) return list;
1857 prev = Qnil;
1858 tail = list;
1859 while (!NILP (tail))
1860 {
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;
1868 }
1869 return prev;
1870 }
1871
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;
1877 {
1878 Lisp_Object new;
1879
1880 for (new = Qnil; CONSP (list); list = XCDR (list))
1881 {
1882 QUIT;
1883 new = Fcons (XCAR (list), new);
1884 }
1885 if (!NILP (list))
1886 wrong_type_argument (Qconsp, list);
1887 return new;
1888 }
1889 \f
1890 Lisp_Object merge ();
1891
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 t
1896 if the first element is "less" than the second. */)
1897 (list, predicate)
1898 Lisp_Object list, predicate;
1899 {
1900 Lisp_Object front, back;
1901 register Lisp_Object len, tem;
1902 struct gcpro gcpro1, gcpro2;
1903 register int length;
1904
1905 front = list;
1906 len = Flength (list);
1907 length = XINT (len);
1908 if (length < 2)
1909 return list;
1910
1911 XSETINT (len, (length / 2) - 1);
1912 tem = Fnthcdr (len, list);
1913 back = Fcdr (tem);
1914 Fsetcdr (tem, Qnil);
1915
1916 GCPRO2 (front, back);
1917 front = Fsort (front, predicate);
1918 back = Fsort (back, predicate);
1919 UNGCPRO;
1920 return merge (front, back, predicate);
1921 }
1922
1923 Lisp_Object
1924 merge (org_l1, org_l2, pred)
1925 Lisp_Object org_l1, org_l2;
1926 Lisp_Object pred;
1927 {
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;
1933
1934 l1 = org_l1;
1935 l2 = org_l2;
1936 tail = Qnil;
1937 value = Qnil;
1938
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);
1943
1944 while (1)
1945 {
1946 if (NILP (l1))
1947 {
1948 UNGCPRO;
1949 if (NILP (tail))
1950 return l2;
1951 Fsetcdr (tail, l2);
1952 return value;
1953 }
1954 if (NILP (l2))
1955 {
1956 UNGCPRO;
1957 if (NILP (tail))
1958 return l1;
1959 Fsetcdr (tail, l1);
1960 return value;
1961 }
1962 tem = call2 (pred, Fcar (l2), Fcar (l1));
1963 if (NILP (tem))
1964 {
1965 tem = l1;
1966 l1 = Fcdr (l1);
1967 org_l1 = l1;
1968 }
1969 else
1970 {
1971 tem = l2;
1972 l2 = Fcdr (l2);
1973 org_l2 = l2;
1974 }
1975 if (NILP (tail))
1976 value = tem;
1977 else
1978 Fsetcdr (tail, tem);
1979 tail = tem;
1980 }
1981 }
1982
1983 \f
1984 DEFUN ("plist-get", Fplist_get, Splist_get, 2, 2, 0,
1985 doc: /* Extract a value from a property list.
1986 PLIST is a property list, which is a list of the form
1987 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value
1988 corresponding to the given PROP, or nil if PROP is not
1989 one of the properties on the list. */)
1990 (plist, prop)
1991 Lisp_Object plist;
1992 Lisp_Object prop;
1993 {
1994 Lisp_Object tail;
1995
1996 for (tail = plist;
1997 CONSP (tail) && CONSP (XCDR (tail));
1998 tail = XCDR (XCDR (tail)))
1999 {
2000 if (EQ (prop, XCAR (tail)))
2001 return XCAR (XCDR (tail));
2002
2003 /* This function can be called asynchronously
2004 (setup_coding_system). Don't QUIT in that case. */
2005 if (!interrupt_input_blocked)
2006 QUIT;
2007 }
2008
2009 if (!NILP (tail))
2010 wrong_type_argument (Qlistp, prop);
2011
2012 return Qnil;
2013 }
2014
2015 DEFUN ("safe-plist-get", Fsafe_plist_get, Ssafe_plist_get, 2, 2, 0,
2016 doc: /* Extract a value from a property list.
2017 PLIST is a property list, which is a list of the form
2018 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value
2019 corresponding to the given PROP, or nil if PROP is not
2020 one of the properties on the list.
2021 This function never signals an error. */)
2022 (plist, prop)
2023 Lisp_Object plist;
2024 Lisp_Object prop;
2025 {
2026 Lisp_Object tail, halftail;
2027
2028 /* halftail is used to detect circular lists. */
2029 tail = halftail = plist;
2030 while (CONSP (tail) && CONSP (XCDR (tail)))
2031 {
2032 if (EQ (prop, XCAR (tail)))
2033 return XCAR (XCDR (tail));
2034
2035 tail = XCDR (XCDR (tail));
2036 halftail = XCDR (halftail);
2037 if (EQ (tail, halftail))
2038 break;
2039 }
2040
2041 return Qnil;
2042 }
2043
2044 DEFUN ("get", Fget, Sget, 2, 2, 0,
2045 doc: /* Return the value of SYMBOL's PROPNAME property.
2046 This is the last value stored with `(put SYMBOL PROPNAME VALUE)'. */)
2047 (symbol, propname)
2048 Lisp_Object symbol, propname;
2049 {
2050 CHECK_SYMBOL (symbol);
2051 return Fplist_get (XSYMBOL (symbol)->plist, propname);
2052 }
2053
2054 DEFUN ("plist-put", Fplist_put, Splist_put, 3, 3, 0,
2055 doc: /* Change value in PLIST of PROP to VAL.
2056 PLIST is a property list, which is a list of the form
2057 \(PROP1 VALUE1 PROP2 VALUE2 ...). PROP is a symbol and VAL is any object.
2058 If PROP is already a property on the list, its value is set to VAL,
2059 otherwise the new PROP VAL pair is added. The new plist is returned;
2060 use `(setq x (plist-put x prop val))' to be sure to use the new value.
2061 The PLIST is modified by side effects. */)
2062 (plist, prop, val)
2063 Lisp_Object plist;
2064 register Lisp_Object prop;
2065 Lisp_Object val;
2066 {
2067 register Lisp_Object tail, prev;
2068 Lisp_Object newcell;
2069 prev = Qnil;
2070 for (tail = plist; CONSP (tail) && CONSP (XCDR (tail));
2071 tail = XCDR (XCDR (tail)))
2072 {
2073 if (EQ (prop, XCAR (tail)))
2074 {
2075 Fsetcar (XCDR (tail), val);
2076 return plist;
2077 }
2078
2079 prev = tail;
2080 QUIT;
2081 }
2082 newcell = Fcons (prop, Fcons (val, Qnil));
2083 if (NILP (prev))
2084 return newcell;
2085 else
2086 Fsetcdr (XCDR (prev), newcell);
2087 return plist;
2088 }
2089
2090 DEFUN ("put", Fput, Sput, 3, 3, 0,
2091 doc: /* Store SYMBOL's PROPNAME property with value VALUE.
2092 It can be retrieved with `(get SYMBOL PROPNAME)'. */)
2093 (symbol, propname, value)
2094 Lisp_Object symbol, propname, value;
2095 {
2096 CHECK_SYMBOL (symbol);
2097 XSYMBOL (symbol)->plist
2098 = Fplist_put (XSYMBOL (symbol)->plist, propname, value);
2099 return value;
2100 }
2101 \f
2102 DEFUN ("lax-plist-get", Flax_plist_get, Slax_plist_get, 2, 2, 0,
2103 doc: /* Extract a value from a property list, comparing with `equal'.
2104 PLIST is a property list, which is a list of the form
2105 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value
2106 corresponding to the given PROP, or nil if PROP is not
2107 one of the properties on the list. */)
2108 (plist, prop)
2109 Lisp_Object plist;
2110 Lisp_Object prop;
2111 {
2112 Lisp_Object tail;
2113
2114 for (tail = plist;
2115 CONSP (tail) && CONSP (XCDR (tail));
2116 tail = XCDR (XCDR (tail)))
2117 {
2118 if (! NILP (Fequal (prop, XCAR (tail))))
2119 return XCAR (XCDR (tail));
2120
2121 QUIT;
2122 }
2123
2124 if (!NILP (tail))
2125 wrong_type_argument (Qlistp, prop);
2126
2127 return Qnil;
2128 }
2129
2130 DEFUN ("lax-plist-put", Flax_plist_put, Slax_plist_put, 3, 3, 0,
2131 doc: /* Change value in PLIST of PROP to VAL, comparing with `equal'.
2132 PLIST is a property list, which is a list of the form
2133 \(PROP1 VALUE1 PROP2 VALUE2 ...). PROP and VAL are any objects.
2134 If PROP is already a property on the list, its value is set to VAL,
2135 otherwise the new PROP VAL pair is added. The new plist is returned;
2136 use `(setq x (lax-plist-put x prop val))' to be sure to use the new value.
2137 The PLIST is modified by side effects. */)
2138 (plist, prop, val)
2139 Lisp_Object plist;
2140 register Lisp_Object prop;
2141 Lisp_Object val;
2142 {
2143 register Lisp_Object tail, prev;
2144 Lisp_Object newcell;
2145 prev = Qnil;
2146 for (tail = plist; CONSP (tail) && CONSP (XCDR (tail));
2147 tail = XCDR (XCDR (tail)))
2148 {
2149 if (! NILP (Fequal (prop, XCAR (tail))))
2150 {
2151 Fsetcar (XCDR (tail), val);
2152 return plist;
2153 }
2154
2155 prev = tail;
2156 QUIT;
2157 }
2158 newcell = Fcons (prop, Fcons (val, Qnil));
2159 if (NILP (prev))
2160 return newcell;
2161 else
2162 Fsetcdr (XCDR (prev), newcell);
2163 return plist;
2164 }
2165 \f
2166 DEFUN ("eql", Feql, Seql, 2, 2, 0,
2167 doc: /* Return t if the two args are the same Lisp object.
2168 Floating-point numbers of equal value are `eql', but they may not be `eq'. */)
2169 (obj1, obj2)
2170 Lisp_Object obj1, obj2;
2171 {
2172 if (FLOATP (obj1))
2173 return internal_equal (obj1, obj2, 0, 0) ? Qt : Qnil;
2174 else
2175 return EQ (obj1, obj2) ? Qt : Qnil;
2176 }
2177
2178 DEFUN ("equal", Fequal, Sequal, 2, 2, 0,
2179 doc: /* Return t if two Lisp objects have similar structure and contents.
2180 They must have the same data type.
2181 Conses are compared by comparing the cars and the cdrs.
2182 Vectors and strings are compared element by element.
2183 Numbers are compared by value, but integers cannot equal floats.
2184 (Use `=' if you want integers and floats to be able to be equal.)
2185 Symbols must match exactly. */)
2186 (o1, o2)
2187 register Lisp_Object o1, o2;
2188 {
2189 return internal_equal (o1, o2, 0, 0) ? Qt : Qnil;
2190 }
2191
2192 DEFUN ("equal-including-properties", Fequal_including_properties, Sequal_including_properties, 2, 2, 0,
2193 doc: /* Return t if two Lisp objects have similar structure and contents.
2194 This is like `equal' except that it compares the text properties
2195 of strings. (`equal' ignores text properties.) */)
2196 (o1, o2)
2197 register Lisp_Object o1, o2;
2198 {
2199 return internal_equal (o1, o2, 0, 1) ? Qt : Qnil;
2200 }
2201
2202 /* DEPTH is current depth of recursion. Signal an error if it
2203 gets too deep.
2204 PROPS, if non-nil, means compare string text properties too. */
2205
2206 static int
2207 internal_equal (o1, o2, depth, props)
2208 register Lisp_Object o1, o2;
2209 int depth, props;
2210 {
2211 if (depth > 200)
2212 error ("Stack overflow in equal");
2213
2214 tail_recurse:
2215 QUIT;
2216 if (EQ (o1, o2))
2217 return 1;
2218 if (XTYPE (o1) != XTYPE (o2))
2219 return 0;
2220
2221 switch (XTYPE (o1))
2222 {
2223 case Lisp_Float:
2224 {
2225 double d1, d2;
2226
2227 d1 = extract_float (o1);
2228 d2 = extract_float (o2);
2229 /* If d is a NaN, then d != d. Two NaNs should be `equal' even
2230 though they are not =. */
2231 return d1 == d2 || (d1 != d1 && d2 != d2);
2232 }
2233
2234 case Lisp_Cons:
2235 if (!internal_equal (XCAR (o1), XCAR (o2), depth + 1, props))
2236 return 0;
2237 o1 = XCDR (o1);
2238 o2 = XCDR (o2);
2239 goto tail_recurse;
2240
2241 case Lisp_Misc:
2242 if (XMISCTYPE (o1) != XMISCTYPE (o2))
2243 return 0;
2244 if (OVERLAYP (o1))
2245 {
2246 if (!internal_equal (OVERLAY_START (o1), OVERLAY_START (o2),
2247 depth + 1, props)
2248 || !internal_equal (OVERLAY_END (o1), OVERLAY_END (o2),
2249 depth + 1))
2250 return 0;
2251 o1 = XOVERLAY (o1)->plist;
2252 o2 = XOVERLAY (o2)->plist;
2253 goto tail_recurse;
2254 }
2255 if (MARKERP (o1))
2256 {
2257 return (XMARKER (o1)->buffer == XMARKER (o2)->buffer
2258 && (XMARKER (o1)->buffer == 0
2259 || XMARKER (o1)->bytepos == XMARKER (o2)->bytepos));
2260 }
2261 break;
2262
2263 case Lisp_Vectorlike:
2264 {
2265 register int i;
2266 EMACS_INT size = XVECTOR (o1)->size;
2267 /* Pseudovectors have the type encoded in the size field, so this test
2268 actually checks that the objects have the same type as well as the
2269 same size. */
2270 if (XVECTOR (o2)->size != size)
2271 return 0;
2272 /* Boolvectors are compared much like strings. */
2273 if (BOOL_VECTOR_P (o1))
2274 {
2275 int size_in_chars
2276 = ((XBOOL_VECTOR (o1)->size + BOOL_VECTOR_BITS_PER_CHAR - 1)
2277 / BOOL_VECTOR_BITS_PER_CHAR);
2278
2279 if (XBOOL_VECTOR (o1)->size != XBOOL_VECTOR (o2)->size)
2280 return 0;
2281 if (bcmp (XBOOL_VECTOR (o1)->data, XBOOL_VECTOR (o2)->data,
2282 size_in_chars))
2283 return 0;
2284 return 1;
2285 }
2286 if (WINDOW_CONFIGURATIONP (o1))
2287 return compare_window_configurations (o1, o2, 0);
2288
2289 /* Aside from them, only true vectors, char-tables, and compiled
2290 functions are sensible to compare, so eliminate the others now. */
2291 if (size & PSEUDOVECTOR_FLAG)
2292 {
2293 if (!(size & (PVEC_COMPILED | PVEC_CHAR_TABLE)))
2294 return 0;
2295 size &= PSEUDOVECTOR_SIZE_MASK;
2296 }
2297 for (i = 0; i < size; i++)
2298 {
2299 Lisp_Object v1, v2;
2300 v1 = XVECTOR (o1)->contents [i];
2301 v2 = XVECTOR (o2)->contents [i];
2302 if (!internal_equal (v1, v2, depth + 1, props))
2303 return 0;
2304 }
2305 return 1;
2306 }
2307 break;
2308
2309 case Lisp_String:
2310 if (SCHARS (o1) != SCHARS (o2))
2311 return 0;
2312 if (SBYTES (o1) != SBYTES (o2))
2313 return 0;
2314 if (bcmp (SDATA (o1), SDATA (o2),
2315 SBYTES (o1)))
2316 return 0;
2317 if (props && !compare_string_intervals (o1, o2))
2318 return 0;
2319 return 1;
2320
2321 case Lisp_Int:
2322 case Lisp_Symbol:
2323 case Lisp_Type_Limit:
2324 break;
2325 }
2326
2327 return 0;
2328 }
2329 \f
2330 extern Lisp_Object Fmake_char_internal ();
2331
2332 DEFUN ("fillarray", Ffillarray, Sfillarray, 2, 2, 0,
2333 doc: /* Store each element of ARRAY with ITEM.
2334 ARRAY is a vector, string, char-table, or bool-vector. */)
2335 (array, item)
2336 Lisp_Object array, item;
2337 {
2338 register int size, index, charval;
2339 retry:
2340 if (VECTORP (array))
2341 {
2342 register Lisp_Object *p = XVECTOR (array)->contents;
2343 size = XVECTOR (array)->size;
2344 for (index = 0; index < size; index++)
2345 p[index] = item;
2346 }
2347 else if (CHAR_TABLE_P (array))
2348 {
2349 register Lisp_Object *p = XCHAR_TABLE (array)->contents;
2350 size = CHAR_TABLE_ORDINARY_SLOTS;
2351 for (index = 0; index < size; index++)
2352 p[index] = item;
2353 XCHAR_TABLE (array)->defalt = Qnil;
2354 }
2355 else if (STRINGP (array))
2356 {
2357 register unsigned char *p = SDATA (array);
2358 CHECK_NUMBER (item);
2359 charval = XINT (item);
2360 size = SCHARS (array);
2361 if (STRING_MULTIBYTE (array))
2362 {
2363 unsigned char str[MAX_MULTIBYTE_LENGTH];
2364 int len = CHAR_STRING (charval, str);
2365 int size_byte = SBYTES (array);
2366 unsigned char *p1 = p, *endp = p + size_byte;
2367 int i;
2368
2369 if (size != size_byte)
2370 while (p1 < endp)
2371 {
2372 int this_len = MULTIBYTE_FORM_LENGTH (p1, endp - p1);
2373 if (len != this_len)
2374 error ("Attempt to change byte length of a string");
2375 p1 += this_len;
2376 }
2377 for (i = 0; i < size_byte; i++)
2378 *p++ = str[i % len];
2379 }
2380 else
2381 for (index = 0; index < size; index++)
2382 p[index] = charval;
2383 }
2384 else if (BOOL_VECTOR_P (array))
2385 {
2386 register unsigned char *p = XBOOL_VECTOR (array)->data;
2387 int size_in_chars
2388 = ((XBOOL_VECTOR (array)->size + BOOL_VECTOR_BITS_PER_CHAR - 1)
2389 / BOOL_VECTOR_BITS_PER_CHAR);
2390
2391 charval = (! NILP (item) ? -1 : 0);
2392 for (index = 0; index < size_in_chars - 1; index++)
2393 p[index] = charval;
2394 if (index < size_in_chars)
2395 {
2396 /* Mask out bits beyond the vector size. */
2397 if (XBOOL_VECTOR (array)->size % BOOL_VECTOR_BITS_PER_CHAR)
2398 charval &= (1 << (XBOOL_VECTOR (array)->size % BOOL_VECTOR_BITS_PER_CHAR)) - 1;
2399 p[index] = charval;
2400 }
2401 }
2402 else
2403 {
2404 array = wrong_type_argument (Qarrayp, array);
2405 goto retry;
2406 }
2407 return array;
2408 }
2409
2410 DEFUN ("clear-string", Fclear_string, Sclear_string,
2411 1, 1, 0,
2412 doc: /* Clear the contents of STRING.
2413 This makes STRING unibyte and may change its length. */)
2414 (string)
2415 Lisp_Object string;
2416 {
2417 int len;
2418 CHECK_STRING (string);
2419 len = SBYTES (string);
2420 bzero (SDATA (string), len);
2421 STRING_SET_CHARS (string, len);
2422 STRING_SET_UNIBYTE (string);
2423 return Qnil;
2424 }
2425 \f
2426 DEFUN ("char-table-subtype", Fchar_table_subtype, Schar_table_subtype,
2427 1, 1, 0,
2428 doc: /* Return the subtype of char-table CHAR-TABLE. The value is a symbol. */)
2429 (char_table)
2430 Lisp_Object char_table;
2431 {
2432 CHECK_CHAR_TABLE (char_table);
2433
2434 return XCHAR_TABLE (char_table)->purpose;
2435 }
2436
2437 DEFUN ("char-table-parent", Fchar_table_parent, Schar_table_parent,
2438 1, 1, 0,
2439 doc: /* Return the parent char-table of CHAR-TABLE.
2440 The value is either nil or another char-table.
2441 If CHAR-TABLE holds nil for a given character,
2442 then the actual applicable value is inherited from the parent char-table
2443 \(or from its parents, if necessary). */)
2444 (char_table)
2445 Lisp_Object char_table;
2446 {
2447 CHECK_CHAR_TABLE (char_table);
2448
2449 return XCHAR_TABLE (char_table)->parent;
2450 }
2451
2452 DEFUN ("set-char-table-parent", Fset_char_table_parent, Sset_char_table_parent,
2453 2, 2, 0,
2454 doc: /* Set the parent char-table of CHAR-TABLE to PARENT.
2455 Return PARENT. PARENT must be either nil or another char-table. */)
2456 (char_table, parent)
2457 Lisp_Object char_table, parent;
2458 {
2459 Lisp_Object temp;
2460
2461 CHECK_CHAR_TABLE (char_table);
2462
2463 if (!NILP (parent))
2464 {
2465 CHECK_CHAR_TABLE (parent);
2466
2467 for (temp = parent; !NILP (temp); temp = XCHAR_TABLE (temp)->parent)
2468 if (EQ (temp, char_table))
2469 error ("Attempt to make a chartable be its own parent");
2470 }
2471
2472 XCHAR_TABLE (char_table)->parent = parent;
2473
2474 return parent;
2475 }
2476
2477 DEFUN ("char-table-extra-slot", Fchar_table_extra_slot, Schar_table_extra_slot,
2478 2, 2, 0,
2479 doc: /* Return the value of CHAR-TABLE's extra-slot number N. */)
2480 (char_table, n)
2481 Lisp_Object char_table, n;
2482 {
2483 CHECK_CHAR_TABLE (char_table);
2484 CHECK_NUMBER (n);
2485 if (XINT (n) < 0
2486 || XINT (n) >= CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (char_table)))
2487 args_out_of_range (char_table, n);
2488
2489 return XCHAR_TABLE (char_table)->extras[XINT (n)];
2490 }
2491
2492 DEFUN ("set-char-table-extra-slot", Fset_char_table_extra_slot,
2493 Sset_char_table_extra_slot,
2494 3, 3, 0,
2495 doc: /* Set CHAR-TABLE's extra-slot number N to VALUE. */)
2496 (char_table, n, value)
2497 Lisp_Object char_table, n, value;
2498 {
2499 CHECK_CHAR_TABLE (char_table);
2500 CHECK_NUMBER (n);
2501 if (XINT (n) < 0
2502 || XINT (n) >= CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (char_table)))
2503 args_out_of_range (char_table, n);
2504
2505 return XCHAR_TABLE (char_table)->extras[XINT (n)] = value;
2506 }
2507 \f
2508 DEFUN ("char-table-range", Fchar_table_range, Schar_table_range,
2509 2, 2, 0,
2510 doc: /* Return the value in CHAR-TABLE for a range of characters RANGE.
2511 RANGE should be nil (for the default value)
2512 a vector which identifies a character set or a row of a character set,
2513 a character set name, or a character code. */)
2514 (char_table, range)
2515 Lisp_Object char_table, range;
2516 {
2517 CHECK_CHAR_TABLE (char_table);
2518
2519 if (EQ (range, Qnil))
2520 return XCHAR_TABLE (char_table)->defalt;
2521 else if (INTEGERP (range))
2522 return Faref (char_table, range);
2523 else if (SYMBOLP (range))
2524 {
2525 Lisp_Object charset_info;
2526
2527 charset_info = Fget (range, Qcharset);
2528 CHECK_VECTOR (charset_info);
2529
2530 return Faref (char_table,
2531 make_number (XINT (XVECTOR (charset_info)->contents[0])
2532 + 128));
2533 }
2534 else if (VECTORP (range))
2535 {
2536 if (XVECTOR (range)->size == 1)
2537 return Faref (char_table,
2538 make_number (XINT (XVECTOR (range)->contents[0]) + 128));
2539 else
2540 {
2541 int size = XVECTOR (range)->size;
2542 Lisp_Object *val = XVECTOR (range)->contents;
2543 Lisp_Object ch = Fmake_char_internal (size <= 0 ? Qnil : val[0],
2544 size <= 1 ? Qnil : val[1],
2545 size <= 2 ? Qnil : val[2]);
2546 return Faref (char_table, ch);
2547 }
2548 }
2549 else
2550 error ("Invalid RANGE argument to `char-table-range'");
2551 return Qt;
2552 }
2553
2554 DEFUN ("set-char-table-range", Fset_char_table_range, Sset_char_table_range,
2555 3, 3, 0,
2556 doc: /* Set the value in CHAR-TABLE for a range of characters RANGE to VALUE.
2557 RANGE should be t (for all characters), nil (for the default value),
2558 a character set, a vector which identifies a character set, a row of a
2559 character set, or a character code. Return VALUE. */)
2560 (char_table, range, value)
2561 Lisp_Object char_table, range, value;
2562 {
2563 int i;
2564
2565 CHECK_CHAR_TABLE (char_table);
2566
2567 if (EQ (range, Qt))
2568 for (i = 0; i < CHAR_TABLE_ORDINARY_SLOTS; i++)
2569 XCHAR_TABLE (char_table)->contents[i] = value;
2570 else if (EQ (range, Qnil))
2571 XCHAR_TABLE (char_table)->defalt = value;
2572 else if (SYMBOLP (range))
2573 {
2574 Lisp_Object charset_info;
2575 int charset_id;
2576
2577 charset_info = Fget (range, Qcharset);
2578 if (! VECTORP (charset_info)
2579 || ! NATNUMP (AREF (charset_info, 0))
2580 || (charset_id = XINT (AREF (charset_info, 0)),
2581 ! CHARSET_DEFINED_P (charset_id)))
2582 error ("Invalid charset: %s", SDATA (SYMBOL_NAME (range)));
2583
2584 if (charset_id == CHARSET_ASCII)
2585 for (i = 0; i < 128; i++)
2586 XCHAR_TABLE (char_table)->contents[i] = value;
2587 else if (charset_id == CHARSET_8_BIT_CONTROL)
2588 for (i = 128; i < 160; i++)
2589 XCHAR_TABLE (char_table)->contents[i] = value;
2590 else if (charset_id == CHARSET_8_BIT_GRAPHIC)
2591 for (i = 160; i < 256; i++)
2592 XCHAR_TABLE (char_table)->contents[i] = value;
2593 else
2594 XCHAR_TABLE (char_table)->contents[charset_id + 128] = value;
2595 }
2596 else if (INTEGERP (range))
2597 Faset (char_table, range, value);
2598 else if (VECTORP (range))
2599 {
2600 if (XVECTOR (range)->size == 1)
2601 return Faset (char_table,
2602 make_number (XINT (XVECTOR (range)->contents[0]) + 128),
2603 value);
2604 else
2605 {
2606 int size = XVECTOR (range)->size;
2607 Lisp_Object *val = XVECTOR (range)->contents;
2608 Lisp_Object ch = Fmake_char_internal (size <= 0 ? Qnil : val[0],
2609 size <= 1 ? Qnil : val[1],
2610 size <= 2 ? Qnil : val[2]);
2611 return Faset (char_table, ch, value);
2612 }
2613 }
2614 else
2615 error ("Invalid RANGE argument to `set-char-table-range'");
2616
2617 return value;
2618 }
2619
2620 DEFUN ("set-char-table-default", Fset_char_table_default,
2621 Sset_char_table_default, 3, 3, 0,
2622 doc: /* Set the default value in CHAR-TABLE for generic character CH to VALUE.
2623 The generic character specifies the group of characters.
2624 See also the documentation of `make-char'. */)
2625 (char_table, ch, value)
2626 Lisp_Object char_table, ch, value;
2627 {
2628 int c, charset, code1, code2;
2629 Lisp_Object temp;
2630
2631 CHECK_CHAR_TABLE (char_table);
2632 CHECK_NUMBER (ch);
2633
2634 c = XINT (ch);
2635 SPLIT_CHAR (c, charset, code1, code2);
2636
2637 /* Since we may want to set the default value for a character set
2638 not yet defined, we check only if the character set is in the
2639 valid range or not, instead of it is already defined or not. */
2640 if (! CHARSET_VALID_P (charset))
2641 invalid_character (c);
2642
2643 if (charset == CHARSET_ASCII)
2644 return (XCHAR_TABLE (char_table)->defalt = value);
2645
2646 /* Even if C is not a generic char, we had better behave as if a
2647 generic char is specified. */
2648 if (!CHARSET_DEFINED_P (charset) || CHARSET_DIMENSION (charset) == 1)
2649 code1 = 0;
2650 temp = XCHAR_TABLE (char_table)->contents[charset + 128];
2651 if (!code1)
2652 {
2653 if (SUB_CHAR_TABLE_P (temp))
2654 XCHAR_TABLE (temp)->defalt = value;
2655 else
2656 XCHAR_TABLE (char_table)->contents[charset + 128] = value;
2657 return value;
2658 }
2659 if (SUB_CHAR_TABLE_P (temp))
2660 char_table = temp;
2661 else
2662 char_table = (XCHAR_TABLE (char_table)->contents[charset + 128]
2663 = make_sub_char_table (temp));
2664 temp = XCHAR_TABLE (char_table)->contents[code1];
2665 if (SUB_CHAR_TABLE_P (temp))
2666 XCHAR_TABLE (temp)->defalt = value;
2667 else
2668 XCHAR_TABLE (char_table)->contents[code1] = value;
2669 return value;
2670 }
2671
2672 /* Look up the element in TABLE at index CH,
2673 and return it as an integer.
2674 If the element is nil, return CH itself.
2675 (Actually we do that for any non-integer.) */
2676
2677 int
2678 char_table_translate (table, ch)
2679 Lisp_Object table;
2680 int ch;
2681 {
2682 Lisp_Object value;
2683 value = Faref (table, make_number (ch));
2684 if (! INTEGERP (value))
2685 return ch;
2686 return XINT (value);
2687 }
2688
2689 static void
2690 optimize_sub_char_table (table, chars)
2691 Lisp_Object *table;
2692 int chars;
2693 {
2694 Lisp_Object elt;
2695 int from, to;
2696
2697 if (chars == 94)
2698 from = 33, to = 127;
2699 else
2700 from = 32, to = 128;
2701
2702 if (!SUB_CHAR_TABLE_P (*table))
2703 return;
2704 elt = XCHAR_TABLE (*table)->contents[from++];
2705 for (; from < to; from++)
2706 if (NILP (Fequal (elt, XCHAR_TABLE (*table)->contents[from])))
2707 return;
2708 *table = elt;
2709 }
2710
2711 DEFUN ("optimize-char-table", Foptimize_char_table, Soptimize_char_table,
2712 1, 1, 0, doc: /* Optimize char table TABLE. */)
2713 (table)
2714 Lisp_Object table;
2715 {
2716 Lisp_Object elt;
2717 int dim;
2718 int i, j;
2719
2720 CHECK_CHAR_TABLE (table);
2721
2722 for (i = CHAR_TABLE_SINGLE_BYTE_SLOTS; i < CHAR_TABLE_ORDINARY_SLOTS; i++)
2723 {
2724 elt = XCHAR_TABLE (table)->contents[i];
2725 if (!SUB_CHAR_TABLE_P (elt))
2726 continue;
2727 dim = CHARSET_DIMENSION (i - 128);
2728 if (dim == 2)
2729 for (j = 32; j < SUB_CHAR_TABLE_ORDINARY_SLOTS; j++)
2730 optimize_sub_char_table (XCHAR_TABLE (elt)->contents + j, dim);
2731 optimize_sub_char_table (XCHAR_TABLE (table)->contents + i, dim);
2732 }
2733 return Qnil;
2734 }
2735
2736 \f
2737 /* Map C_FUNCTION or FUNCTION over SUBTABLE, calling it for each
2738 character or group of characters that share a value.
2739 DEPTH is the current depth in the originally specified
2740 chartable, and INDICES contains the vector indices
2741 for the levels our callers have descended.
2742
2743 ARG is passed to C_FUNCTION when that is called. */
2744
2745 void
2746 map_char_table (c_function, function, table, subtable, arg, depth, indices)
2747 void (*c_function) P_ ((Lisp_Object, Lisp_Object, Lisp_Object));
2748 Lisp_Object function, table, subtable, arg, *indices;
2749 int depth;
2750 {
2751 int i, to;
2752 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
2753
2754 GCPRO4 (arg, table, subtable, function);
2755
2756 if (depth == 0)
2757 {
2758 /* At first, handle ASCII and 8-bit European characters. */
2759 for (i = 0; i < CHAR_TABLE_SINGLE_BYTE_SLOTS; i++)
2760 {
2761 Lisp_Object elt= XCHAR_TABLE (subtable)->contents[i];
2762 if (NILP (elt))
2763 elt = XCHAR_TABLE (subtable)->defalt;
2764 if (NILP (elt))
2765 elt = Faref (subtable, make_number (i));
2766 if (c_function)
2767 (*c_function) (arg, make_number (i), elt);
2768 else
2769 call2 (function, make_number (i), elt);
2770 }
2771 #if 0 /* If the char table has entries for higher characters,
2772 we should report them. */
2773 if (NILP (current_buffer->enable_multibyte_characters))
2774 {
2775 UNGCPRO;
2776 return;
2777 }
2778 #endif
2779 to = CHAR_TABLE_ORDINARY_SLOTS;
2780 }
2781 else
2782 {
2783 int charset = XFASTINT (indices[0]) - 128;
2784
2785 i = 32;
2786 to = SUB_CHAR_TABLE_ORDINARY_SLOTS;
2787 if (CHARSET_CHARS (charset) == 94)
2788 i++, to--;
2789 }
2790
2791 for (; i < to; i++)
2792 {
2793 Lisp_Object elt;
2794 int charset;
2795
2796 elt = XCHAR_TABLE (subtable)->contents[i];
2797 XSETFASTINT (indices[depth], i);
2798 charset = XFASTINT (indices[0]) - 128;
2799 if (depth == 0
2800 && (!CHARSET_DEFINED_P (charset)
2801 || charset == CHARSET_8_BIT_CONTROL
2802 || charset == CHARSET_8_BIT_GRAPHIC))
2803 continue;
2804
2805 if (SUB_CHAR_TABLE_P (elt))
2806 {
2807 if (depth >= 3)
2808 error ("Too deep char table");
2809 map_char_table (c_function, function, table, elt, arg, depth + 1, indices);
2810 }
2811 else
2812 {
2813 int c1, c2, c;
2814
2815 c1 = depth >= 1 ? XFASTINT (indices[1]) : 0;
2816 c2 = depth >= 2 ? XFASTINT (indices[2]) : 0;
2817 c = MAKE_CHAR (charset, c1, c2);
2818
2819 if (NILP (elt))
2820 elt = XCHAR_TABLE (subtable)->defalt;
2821 if (NILP (elt))
2822 elt = Faref (table, make_number (c));
2823
2824 if (c_function)
2825 (*c_function) (arg, make_number (c), elt);
2826 else
2827 call2 (function, make_number (c), elt);
2828 }
2829 }
2830 UNGCPRO;
2831 }
2832
2833 static void void_call2 P_ ((Lisp_Object a, Lisp_Object b, Lisp_Object c));
2834 static void
2835 void_call2 (a, b, c)
2836 Lisp_Object a, b, c;
2837 {
2838 call2 (a, b, c);
2839 }
2840
2841 DEFUN ("map-char-table", Fmap_char_table, Smap_char_table,
2842 2, 2, 0,
2843 doc: /* Call FUNCTION for each (normal and generic) characters in CHAR-TABLE.
2844 FUNCTION is called with two arguments--a key and a value.
2845 The key is always a possible IDX argument to `aref'. */)
2846 (function, char_table)
2847 Lisp_Object function, char_table;
2848 {
2849 /* The depth of char table is at most 3. */
2850 Lisp_Object indices[3];
2851
2852 CHECK_CHAR_TABLE (char_table);
2853
2854 /* When Lisp_Object is represented as a union, `call2' cannot directly
2855 be passed to map_char_table because it returns a Lisp_Object rather
2856 than returning nothing.
2857 Casting leads to crashes on some architectures. -stef */
2858 map_char_table (void_call2, Qnil, char_table, char_table, function, 0, indices);
2859 return Qnil;
2860 }
2861
2862 /* Return a value for character C in char-table TABLE. Store the
2863 actual index for that value in *IDX. Ignore the default value of
2864 TABLE. */
2865
2866 Lisp_Object
2867 char_table_ref_and_index (table, c, idx)
2868 Lisp_Object table;
2869 int c, *idx;
2870 {
2871 int charset, c1, c2;
2872 Lisp_Object elt;
2873
2874 if (SINGLE_BYTE_CHAR_P (c))
2875 {
2876 *idx = c;
2877 return XCHAR_TABLE (table)->contents[c];
2878 }
2879 SPLIT_CHAR (c, charset, c1, c2);
2880 elt = XCHAR_TABLE (table)->contents[charset + 128];
2881 *idx = MAKE_CHAR (charset, 0, 0);
2882 if (!SUB_CHAR_TABLE_P (elt))
2883 return elt;
2884 if (c1 < 32 || NILP (XCHAR_TABLE (elt)->contents[c1]))
2885 return XCHAR_TABLE (elt)->defalt;
2886 elt = XCHAR_TABLE (elt)->contents[c1];
2887 *idx = MAKE_CHAR (charset, c1, 0);
2888 if (!SUB_CHAR_TABLE_P (elt))
2889 return elt;
2890 if (c2 < 32 || NILP (XCHAR_TABLE (elt)->contents[c2]))
2891 return XCHAR_TABLE (elt)->defalt;
2892 *idx = c;
2893 return XCHAR_TABLE (elt)->contents[c2];
2894 }
2895
2896 \f
2897 /* ARGSUSED */
2898 Lisp_Object
2899 nconc2 (s1, s2)
2900 Lisp_Object s1, s2;
2901 {
2902 #ifdef NO_ARG_ARRAY
2903 Lisp_Object args[2];
2904 args[0] = s1;
2905 args[1] = s2;
2906 return Fnconc (2, args);
2907 #else
2908 return Fnconc (2, &s1);
2909 #endif /* NO_ARG_ARRAY */
2910 }
2911
2912 DEFUN ("nconc", Fnconc, Snconc, 0, MANY, 0,
2913 doc: /* Concatenate any number of lists by altering them.
2914 Only the last argument is not altered, and need not be a list.
2915 usage: (nconc &rest LISTS) */)
2916 (nargs, args)
2917 int nargs;
2918 Lisp_Object *args;
2919 {
2920 register int argnum;
2921 register Lisp_Object tail, tem, val;
2922
2923 val = tail = Qnil;
2924
2925 for (argnum = 0; argnum < nargs; argnum++)
2926 {
2927 tem = args[argnum];
2928 if (NILP (tem)) continue;
2929
2930 if (NILP (val))
2931 val = tem;
2932
2933 if (argnum + 1 == nargs) break;
2934
2935 if (!CONSP (tem))
2936 tem = wrong_type_argument (Qlistp, tem);
2937
2938 while (CONSP (tem))
2939 {
2940 tail = tem;
2941 tem = XCDR (tail);
2942 QUIT;
2943 }
2944
2945 tem = args[argnum + 1];
2946 Fsetcdr (tail, tem);
2947 if (NILP (tem))
2948 args[argnum + 1] = tail;
2949 }
2950
2951 return val;
2952 }
2953 \f
2954 /* This is the guts of all mapping functions.
2955 Apply FN to each element of SEQ, one by one,
2956 storing the results into elements of VALS, a C vector of Lisp_Objects.
2957 LENI is the length of VALS, which should also be the length of SEQ. */
2958
2959 static void
2960 mapcar1 (leni, vals, fn, seq)
2961 int leni;
2962 Lisp_Object *vals;
2963 Lisp_Object fn, seq;
2964 {
2965 register Lisp_Object tail;
2966 Lisp_Object dummy;
2967 register int i;
2968 struct gcpro gcpro1, gcpro2, gcpro3;
2969
2970 if (vals)
2971 {
2972 /* Don't let vals contain any garbage when GC happens. */
2973 for (i = 0; i < leni; i++)
2974 vals[i] = Qnil;
2975
2976 GCPRO3 (dummy, fn, seq);
2977 gcpro1.var = vals;
2978 gcpro1.nvars = leni;
2979 }
2980 else
2981 GCPRO2 (fn, seq);
2982 /* We need not explicitly protect `tail' because it is used only on lists, and
2983 1) lists are not relocated and 2) the list is marked via `seq' so will not be freed */
2984
2985 if (VECTORP (seq))
2986 {
2987 for (i = 0; i < leni; i++)
2988 {
2989 dummy = XVECTOR (seq)->contents[i];
2990 dummy = call1 (fn, dummy);
2991 if (vals)
2992 vals[i] = dummy;
2993 }
2994 }
2995 else if (BOOL_VECTOR_P (seq))
2996 {
2997 for (i = 0; i < leni; i++)
2998 {
2999 int byte;
3000 byte = XBOOL_VECTOR (seq)->data[i / BOOL_VECTOR_BITS_PER_CHAR];
3001 if (byte & (1 << (i % BOOL_VECTOR_BITS_PER_CHAR)))
3002 dummy = Qt;
3003 else
3004 dummy = Qnil;
3005
3006 dummy = call1 (fn, dummy);
3007 if (vals)
3008 vals[i] = dummy;
3009 }
3010 }
3011 else if (STRINGP (seq))
3012 {
3013 int i_byte;
3014
3015 for (i = 0, i_byte = 0; i < leni;)
3016 {
3017 int c;
3018 int i_before = i;
3019
3020 FETCH_STRING_CHAR_ADVANCE (c, seq, i, i_byte);
3021 XSETFASTINT (dummy, c);
3022 dummy = call1 (fn, dummy);
3023 if (vals)
3024 vals[i_before] = dummy;
3025 }
3026 }
3027 else /* Must be a list, since Flength did not get an error */
3028 {
3029 tail = seq;
3030 for (i = 0; i < leni; i++)
3031 {
3032 dummy = call1 (fn, Fcar (tail));
3033 if (vals)
3034 vals[i] = dummy;
3035 tail = XCDR (tail);
3036 }
3037 }
3038
3039 UNGCPRO;
3040 }
3041
3042 DEFUN ("mapconcat", Fmapconcat, Smapconcat, 3, 3, 0,
3043 doc: /* Apply FUNCTION to each element of SEQUENCE, and concat the results as strings.
3044 In between each pair of results, stick in SEPARATOR. Thus, " " as
3045 SEPARATOR results in spaces between the values returned by FUNCTION.
3046 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
3047 (function, sequence, separator)
3048 Lisp_Object function, sequence, separator;
3049 {
3050 Lisp_Object len;
3051 register int leni;
3052 int nargs;
3053 register Lisp_Object *args;
3054 register int i;
3055 struct gcpro gcpro1;
3056 Lisp_Object ret;
3057 USE_SAFE_ALLOCA;
3058
3059 len = Flength (sequence);
3060 leni = XINT (len);
3061 nargs = leni + leni - 1;
3062 if (nargs < 0) return build_string ("");
3063
3064 SAFE_ALLOCA_LISP (args, nargs);
3065
3066 GCPRO1 (separator);
3067 mapcar1 (leni, args, function, sequence);
3068 UNGCPRO;
3069
3070 for (i = leni - 1; i >= 0; i--)
3071 args[i + i] = args[i];
3072
3073 for (i = 1; i < nargs; i += 2)
3074 args[i] = separator;
3075
3076 ret = Fconcat (nargs, args);
3077 SAFE_FREE ();
3078
3079 return ret;
3080 }
3081
3082 DEFUN ("mapcar", Fmapcar, Smapcar, 2, 2, 0,
3083 doc: /* Apply FUNCTION to each element of SEQUENCE, and make a list of the results.
3084 The result is a list just as long as SEQUENCE.
3085 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
3086 (function, sequence)
3087 Lisp_Object function, sequence;
3088 {
3089 register Lisp_Object len;
3090 register int leni;
3091 register Lisp_Object *args;
3092 Lisp_Object ret;
3093 USE_SAFE_ALLOCA;
3094
3095 len = Flength (sequence);
3096 leni = XFASTINT (len);
3097
3098 SAFE_ALLOCA_LISP (args, leni);
3099
3100 mapcar1 (leni, args, function, sequence);
3101
3102 ret = Flist (leni, args);
3103 SAFE_FREE ();
3104
3105 return ret;
3106 }
3107
3108 DEFUN ("mapc", Fmapc, Smapc, 2, 2, 0,
3109 doc: /* Apply FUNCTION to each element of SEQUENCE for side effects only.
3110 Unlike `mapcar', don't accumulate the results. Return SEQUENCE.
3111 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
3112 (function, sequence)
3113 Lisp_Object function, sequence;
3114 {
3115 register int leni;
3116
3117 leni = XFASTINT (Flength (sequence));
3118 mapcar1 (leni, 0, function, sequence);
3119
3120 return sequence;
3121 }
3122 \f
3123 /* Anything that calls this function must protect from GC! */
3124
3125 DEFUN ("y-or-n-p", Fy_or_n_p, Sy_or_n_p, 1, 1, 0,
3126 doc: /* Ask user a "y or n" question. Return t if answer is "y".
3127 Takes one argument, which is the string to display to ask the question.
3128 It should end in a space; `y-or-n-p' adds `(y or n) ' to it.
3129 No confirmation of the answer is requested; a single character is enough.
3130 Also accepts Space to mean yes, or Delete to mean no. \(Actually, it uses
3131 the bindings in `query-replace-map'; see the documentation of that variable
3132 for more information. In this case, the useful bindings are `act', `skip',
3133 `recenter', and `quit'.\)
3134
3135 Under a windowing system a dialog box will be used if `last-nonmenu-event'
3136 is nil and `use-dialog-box' is non-nil. */)
3137 (prompt)
3138 Lisp_Object prompt;
3139 {
3140 register Lisp_Object obj, key, def, map;
3141 register int answer;
3142 Lisp_Object xprompt;
3143 Lisp_Object args[2];
3144 struct gcpro gcpro1, gcpro2;
3145 int count = SPECPDL_INDEX ();
3146
3147 specbind (Qcursor_in_echo_area, Qt);
3148
3149 map = Fsymbol_value (intern ("query-replace-map"));
3150
3151 CHECK_STRING (prompt);
3152 xprompt = prompt;
3153 GCPRO2 (prompt, xprompt);
3154
3155 #ifdef HAVE_X_WINDOWS
3156 if (display_hourglass_p)
3157 cancel_hourglass ();
3158 #endif
3159
3160 while (1)
3161 {
3162
3163 #ifdef HAVE_MENUS
3164 if ((NILP (last_nonmenu_event) || CONSP (last_nonmenu_event))
3165 && use_dialog_box
3166 && have_menus_p ())
3167 {
3168 Lisp_Object pane, menu;
3169 redisplay_preserve_echo_area (3);
3170 pane = Fcons (Fcons (build_string ("Yes"), Qt),
3171 Fcons (Fcons (build_string ("No"), Qnil),
3172 Qnil));
3173 menu = Fcons (prompt, pane);
3174 obj = Fx_popup_dialog (Qt, menu);
3175 answer = !NILP (obj);
3176 break;
3177 }
3178 #endif /* HAVE_MENUS */
3179 cursor_in_echo_area = 1;
3180 choose_minibuf_frame ();
3181
3182 {
3183 Lisp_Object pargs[3];
3184
3185 /* Colorize prompt according to `minibuffer-prompt' face. */
3186 pargs[0] = build_string ("%s(y or n) ");
3187 pargs[1] = intern ("face");
3188 pargs[2] = intern ("minibuffer-prompt");
3189 args[0] = Fpropertize (3, pargs);
3190 args[1] = xprompt;
3191 Fmessage (2, args);
3192 }
3193
3194 if (minibuffer_auto_raise)
3195 {
3196 Lisp_Object mini_frame;
3197
3198 mini_frame = WINDOW_FRAME (XWINDOW (minibuf_window));
3199
3200 Fraise_frame (mini_frame);
3201 }
3202
3203 obj = read_filtered_event (1, 0, 0, 0);
3204 cursor_in_echo_area = 0;
3205 /* If we need to quit, quit with cursor_in_echo_area = 0. */
3206 QUIT;
3207
3208 key = Fmake_vector (make_number (1), obj);
3209 def = Flookup_key (map, key, Qt);
3210
3211 if (EQ (def, intern ("skip")))
3212 {
3213 answer = 0;
3214 break;
3215 }
3216 else if (EQ (def, intern ("act")))
3217 {
3218 answer = 1;
3219 break;
3220 }
3221 else if (EQ (def, intern ("recenter")))
3222 {
3223 Frecenter (Qnil);
3224 xprompt = prompt;
3225 continue;
3226 }
3227 else if (EQ (def, intern ("quit")))
3228 Vquit_flag = Qt;
3229 /* We want to exit this command for exit-prefix,
3230 and this is the only way to do it. */
3231 else if (EQ (def, intern ("exit-prefix")))
3232 Vquit_flag = Qt;
3233
3234 QUIT;
3235
3236 /* If we don't clear this, then the next call to read_char will
3237 return quit_char again, and we'll enter an infinite loop. */
3238 Vquit_flag = Qnil;
3239
3240 Fding (Qnil);
3241 Fdiscard_input ();
3242 if (EQ (xprompt, prompt))
3243 {
3244 args[0] = build_string ("Please answer y or n. ");
3245 args[1] = prompt;
3246 xprompt = Fconcat (2, args);
3247 }
3248 }
3249 UNGCPRO;
3250
3251 if (! noninteractive)
3252 {
3253 cursor_in_echo_area = -1;
3254 message_with_string (answer ? "%s(y or n) y" : "%s(y or n) n",
3255 xprompt, 0);
3256 }
3257
3258 unbind_to (count, Qnil);
3259 return answer ? Qt : Qnil;
3260 }
3261 \f
3262 /* This is how C code calls `yes-or-no-p' and allows the user
3263 to redefined it.
3264
3265 Anything that calls this function must protect from GC! */
3266
3267 Lisp_Object
3268 do_yes_or_no_p (prompt)
3269 Lisp_Object prompt;
3270 {
3271 return call1 (intern ("yes-or-no-p"), prompt);
3272 }
3273
3274 /* Anything that calls this function must protect from GC! */
3275
3276 DEFUN ("yes-or-no-p", Fyes_or_no_p, Syes_or_no_p, 1, 1, 0,
3277 doc: /* Ask user a yes-or-no question. Return t if answer is yes.
3278 Takes one argument, which is the string to display to ask the question.
3279 It should end in a space; `yes-or-no-p' adds `(yes or no) ' to it.
3280 The user must confirm the answer with RET,
3281 and can edit it until it has been confirmed.
3282
3283 Under a windowing system a dialog box will be used if `last-nonmenu-event'
3284 is nil, and `use-dialog-box' is non-nil. */)
3285 (prompt)
3286 Lisp_Object prompt;
3287 {
3288 register Lisp_Object ans;
3289 Lisp_Object args[2];
3290 struct gcpro gcpro1;
3291
3292 CHECK_STRING (prompt);
3293
3294 #ifdef HAVE_MENUS
3295 if ((NILP (last_nonmenu_event) || CONSP (last_nonmenu_event))
3296 && use_dialog_box
3297 && have_menus_p ())
3298 {
3299 Lisp_Object pane, menu, obj;
3300 redisplay_preserve_echo_area (4);
3301 pane = Fcons (Fcons (build_string ("Yes"), Qt),
3302 Fcons (Fcons (build_string ("No"), Qnil),
3303 Qnil));
3304 GCPRO1 (pane);
3305 menu = Fcons (prompt, pane);
3306 obj = Fx_popup_dialog (Qt, menu);
3307 UNGCPRO;
3308 return obj;
3309 }
3310 #endif /* HAVE_MENUS */
3311
3312 args[0] = prompt;
3313 args[1] = build_string ("(yes or no) ");
3314 prompt = Fconcat (2, args);
3315
3316 GCPRO1 (prompt);
3317
3318 while (1)
3319 {
3320 ans = Fdowncase (Fread_from_minibuffer (prompt, Qnil, Qnil, Qnil,
3321 Qyes_or_no_p_history, Qnil,
3322 Qnil, Qnil));
3323 if (SCHARS (ans) == 3 && !strcmp (SDATA (ans), "yes"))
3324 {
3325 UNGCPRO;
3326 return Qt;
3327 }
3328 if (SCHARS (ans) == 2 && !strcmp (SDATA (ans), "no"))
3329 {
3330 UNGCPRO;
3331 return Qnil;
3332 }
3333
3334 Fding (Qnil);
3335 Fdiscard_input ();
3336 message ("Please answer yes or no.");
3337 Fsleep_for (make_number (2), Qnil);
3338 }
3339 }
3340 \f
3341 DEFUN ("load-average", Fload_average, Sload_average, 0, 1, 0,
3342 doc: /* Return list of 1 minute, 5 minute and 15 minute load averages.
3343
3344 Each of the three load averages is multiplied by 100, then converted
3345 to integer.
3346
3347 When USE-FLOATS is non-nil, floats will be used instead of integers.
3348 These floats are not multiplied by 100.
3349
3350 If the 5-minute or 15-minute load averages are not available, return a
3351 shortened list, containing only those averages which are available.
3352
3353 An error is thrown if the load average can't be obtained. In some
3354 cases making it work would require Emacs being installed setuid or
3355 setgid so that it can read kernel information, and that usually isn't
3356 advisable. */)
3357 (use_floats)
3358 Lisp_Object use_floats;
3359 {
3360 double load_ave[3];
3361 int loads = getloadavg (load_ave, 3);
3362 Lisp_Object ret = Qnil;
3363
3364 if (loads < 0)
3365 error ("load-average not implemented for this operating system");
3366
3367 while (loads-- > 0)
3368 {
3369 Lisp_Object load = (NILP (use_floats) ?
3370 make_number ((int) (100.0 * load_ave[loads]))
3371 : make_float (load_ave[loads]));
3372 ret = Fcons (load, ret);
3373 }
3374
3375 return ret;
3376 }
3377 \f
3378 Lisp_Object Vfeatures, Qsubfeatures;
3379 extern Lisp_Object Vafter_load_alist;
3380
3381 DEFUN ("featurep", Ffeaturep, Sfeaturep, 1, 2, 0,
3382 doc: /* Returns t if FEATURE is present in this Emacs.
3383
3384 Use this to conditionalize execution of lisp code based on the
3385 presence or absence of emacs or environment extensions.
3386 Use `provide' to declare that a feature is available. This function
3387 looks at the value of the variable `features'. The optional argument
3388 SUBFEATURE can be used to check a specific subfeature of FEATURE. */)
3389 (feature, subfeature)
3390 Lisp_Object feature, subfeature;
3391 {
3392 register Lisp_Object tem;
3393 CHECK_SYMBOL (feature);
3394 tem = Fmemq (feature, Vfeatures);
3395 if (!NILP (tem) && !NILP (subfeature))
3396 tem = Fmember (subfeature, Fget (feature, Qsubfeatures));
3397 return (NILP (tem)) ? Qnil : Qt;
3398 }
3399
3400 DEFUN ("provide", Fprovide, Sprovide, 1, 2, 0,
3401 doc: /* Announce that FEATURE is a feature of the current Emacs.
3402 The optional argument SUBFEATURES should be a list of symbols listing
3403 particular subfeatures supported in this version of FEATURE. */)
3404 (feature, subfeatures)
3405 Lisp_Object feature, subfeatures;
3406 {
3407 register Lisp_Object tem;
3408 CHECK_SYMBOL (feature);
3409 CHECK_LIST (subfeatures);
3410 if (!NILP (Vautoload_queue))
3411 Vautoload_queue = Fcons (Fcons (Vfeatures, Qnil), Vautoload_queue);
3412 tem = Fmemq (feature, Vfeatures);
3413 if (NILP (tem))
3414 Vfeatures = Fcons (feature, Vfeatures);
3415 if (!NILP (subfeatures))
3416 Fput (feature, Qsubfeatures, subfeatures);
3417 LOADHIST_ATTACH (Fcons (Qprovide, feature));
3418
3419 /* Run any load-hooks for this file. */
3420 tem = Fassq (feature, Vafter_load_alist);
3421 if (CONSP (tem))
3422 Fprogn (XCDR (tem));
3423
3424 return feature;
3425 }
3426 \f
3427 /* `require' and its subroutines. */
3428
3429 /* List of features currently being require'd, innermost first. */
3430
3431 Lisp_Object require_nesting_list;
3432
3433 Lisp_Object
3434 require_unwind (old_value)
3435 Lisp_Object old_value;
3436 {
3437 return require_nesting_list = old_value;
3438 }
3439
3440 DEFUN ("require", Frequire, Srequire, 1, 3, 0,
3441 doc: /* If feature FEATURE is not loaded, load it from FILENAME.
3442 If FEATURE is not a member of the list `features', then the feature
3443 is not loaded; so load the file FILENAME.
3444 If FILENAME is omitted, the printname of FEATURE is used as the file name,
3445 and `load' will try to load this name appended with the suffix `.elc' or
3446 `.el', in that order. The name without appended suffix will not be used.
3447 If the optional third argument NOERROR is non-nil,
3448 then return nil if the file is not found instead of signaling an error.
3449 Normally the return value is FEATURE.
3450 The normal messages at start and end of loading FILENAME are suppressed. */)
3451 (feature, filename, noerror)
3452 Lisp_Object feature, filename, noerror;
3453 {
3454 register Lisp_Object tem;
3455 struct gcpro gcpro1, gcpro2;
3456
3457 CHECK_SYMBOL (feature);
3458
3459 /* Record the presence of `require' in this file
3460 even if the feature specified is already loaded.
3461 But not more than once in any file,
3462 and not when we aren't loading a file. */
3463 if (! NILP (Vloads_in_progress))
3464 {
3465 tem = Fcons (Qrequire, feature);
3466 if (NILP (Fmember (tem, Vcurrent_load_list)))
3467 LOADHIST_ATTACH (tem);
3468 }
3469 tem = Fmemq (feature, Vfeatures);
3470
3471 if (NILP (tem))
3472 {
3473 int count = SPECPDL_INDEX ();
3474 int nesting = 0;
3475
3476 /* This is to make sure that loadup.el gives a clear picture
3477 of what files are preloaded and when. */
3478 if (! NILP (Vpurify_flag))
3479 error ("(require %s) while preparing to dump",
3480 SDATA (SYMBOL_NAME (feature)));
3481
3482 /* A certain amount of recursive `require' is legitimate,
3483 but if we require the same feature recursively 3 times,
3484 signal an error. */
3485 tem = require_nesting_list;
3486 while (! NILP (tem))
3487 {
3488 if (! NILP (Fequal (feature, XCAR (tem))))
3489 nesting++;
3490 tem = XCDR (tem);
3491 }
3492 if (nesting > 3)
3493 error ("Recursive `require' for feature `%s'",
3494 SDATA (SYMBOL_NAME (feature)));
3495
3496 /* Update the list for any nested `require's that occur. */
3497 record_unwind_protect (require_unwind, require_nesting_list);
3498 require_nesting_list = Fcons (feature, require_nesting_list);
3499
3500 /* Value saved here is to be restored into Vautoload_queue */
3501 record_unwind_protect (un_autoload, Vautoload_queue);
3502 Vautoload_queue = Qt;
3503
3504 /* Load the file. */
3505 GCPRO2 (feature, filename);
3506 tem = Fload (NILP (filename) ? Fsymbol_name (feature) : filename,
3507 noerror, Qt, Qnil, (NILP (filename) ? Qt : Qnil));
3508 UNGCPRO;
3509
3510 /* If load failed entirely, return nil. */
3511 if (NILP (tem))
3512 return unbind_to (count, Qnil);
3513
3514 tem = Fmemq (feature, Vfeatures);
3515 if (NILP (tem))
3516 error ("Required feature `%s' was not provided",
3517 SDATA (SYMBOL_NAME (feature)));
3518
3519 /* Once loading finishes, don't undo it. */
3520 Vautoload_queue = Qt;
3521 feature = unbind_to (count, feature);
3522 }
3523
3524 return feature;
3525 }
3526 \f
3527 /* Primitives for work of the "widget" library.
3528 In an ideal world, this section would not have been necessary.
3529 However, lisp function calls being as slow as they are, it turns
3530 out that some functions in the widget library (wid-edit.el) are the
3531 bottleneck of Widget operation. Here is their translation to C,
3532 for the sole reason of efficiency. */
3533
3534 DEFUN ("plist-member", Fplist_member, Splist_member, 2, 2, 0,
3535 doc: /* Return non-nil if PLIST has the property PROP.
3536 PLIST is a property list, which is a list of the form
3537 \(PROP1 VALUE1 PROP2 VALUE2 ...\). PROP is a symbol.
3538 Unlike `plist-get', this allows you to distinguish between a missing
3539 property and a property with the value nil.
3540 The value is actually the tail of PLIST whose car is PROP. */)
3541 (plist, prop)
3542 Lisp_Object plist, prop;
3543 {
3544 while (CONSP (plist) && !EQ (XCAR (plist), prop))
3545 {
3546 QUIT;
3547 plist = XCDR (plist);
3548 plist = CDR (plist);
3549 }
3550 return plist;
3551 }
3552
3553 DEFUN ("widget-put", Fwidget_put, Swidget_put, 3, 3, 0,
3554 doc: /* In WIDGET, set PROPERTY to VALUE.
3555 The value can later be retrieved with `widget-get'. */)
3556 (widget, property, value)
3557 Lisp_Object widget, property, value;
3558 {
3559 CHECK_CONS (widget);
3560 XSETCDR (widget, Fplist_put (XCDR (widget), property, value));
3561 return value;
3562 }
3563
3564 DEFUN ("widget-get", Fwidget_get, Swidget_get, 2, 2, 0,
3565 doc: /* In WIDGET, get the value of PROPERTY.
3566 The value could either be specified when the widget was created, or
3567 later with `widget-put'. */)
3568 (widget, property)
3569 Lisp_Object widget, property;
3570 {
3571 Lisp_Object tmp;
3572
3573 while (1)
3574 {
3575 if (NILP (widget))
3576 return Qnil;
3577 CHECK_CONS (widget);
3578 tmp = Fplist_member (XCDR (widget), property);
3579 if (CONSP (tmp))
3580 {
3581 tmp = XCDR (tmp);
3582 return CAR (tmp);
3583 }
3584 tmp = XCAR (widget);
3585 if (NILP (tmp))
3586 return Qnil;
3587 widget = Fget (tmp, Qwidget_type);
3588 }
3589 }
3590
3591 DEFUN ("widget-apply", Fwidget_apply, Swidget_apply, 2, MANY, 0,
3592 doc: /* Apply the value of WIDGET's PROPERTY to the widget itself.
3593 ARGS are passed as extra arguments to the function.
3594 usage: (widget-apply WIDGET PROPERTY &rest ARGS) */)
3595 (nargs, args)
3596 int nargs;
3597 Lisp_Object *args;
3598 {
3599 /* This function can GC. */
3600 Lisp_Object newargs[3];
3601 struct gcpro gcpro1, gcpro2;
3602 Lisp_Object result;
3603
3604 newargs[0] = Fwidget_get (args[0], args[1]);
3605 newargs[1] = args[0];
3606 newargs[2] = Flist (nargs - 2, args + 2);
3607 GCPRO2 (newargs[0], newargs[2]);
3608 result = Fapply (3, newargs);
3609 UNGCPRO;
3610 return result;
3611 }
3612
3613 #ifdef HAVE_LANGINFO_CODESET
3614 #include <langinfo.h>
3615 #endif
3616
3617 DEFUN ("locale-info", Flocale_info, Slocale_info, 1, 1, 0,
3618 doc: /* Access locale data ITEM for the current C locale, if available.
3619 ITEM should be one of the following:
3620
3621 `codeset', returning the character set as a string (locale item CODESET);
3622
3623 `days', returning a 7-element vector of day names (locale items DAY_n);
3624
3625 `months', returning a 12-element vector of month names (locale items MON_n);
3626
3627 `paper', returning a list (WIDTH HEIGHT) for the default paper size,
3628 both measured in milimeters (locale items PAPER_WIDTH, PAPER_HEIGHT).
3629
3630 If the system can't provide such information through a call to
3631 `nl_langinfo', or if ITEM isn't from the list above, return nil.
3632
3633 See also Info node `(libc)Locales'.
3634
3635 The data read from the system are decoded using `locale-coding-system'. */)
3636 (item)
3637 Lisp_Object item;
3638 {
3639 char *str = NULL;
3640 #ifdef HAVE_LANGINFO_CODESET
3641 Lisp_Object val;
3642 if (EQ (item, Qcodeset))
3643 {
3644 str = nl_langinfo (CODESET);
3645 return build_string (str);
3646 }
3647 #ifdef DAY_1
3648 else if (EQ (item, Qdays)) /* e.g. for calendar-day-name-array */
3649 {
3650 Lisp_Object v = Fmake_vector (make_number (7), Qnil);
3651 int days[7] = {DAY_1, DAY_2, DAY_3, DAY_4, DAY_5, DAY_6, DAY_7};
3652 int i;
3653 synchronize_system_time_locale ();
3654 for (i = 0; i < 7; i++)
3655 {
3656 str = nl_langinfo (days[i]);
3657 val = make_unibyte_string (str, strlen (str));
3658 /* Fixme: Is this coding system necessarily right, even if
3659 it is consistent with CODESET? If not, what to do? */
3660 Faset (v, make_number (i),
3661 code_convert_string_norecord (val, Vlocale_coding_system,
3662 0));
3663 }
3664 return v;
3665 }
3666 #endif /* DAY_1 */
3667 #ifdef MON_1
3668 else if (EQ (item, Qmonths)) /* e.g. for calendar-month-name-array */
3669 {
3670 struct Lisp_Vector *p = allocate_vector (12);
3671 int months[12] = {MON_1, MON_2, MON_3, MON_4, MON_5, MON_6, MON_7,
3672 MON_8, MON_9, MON_10, MON_11, MON_12};
3673 int i;
3674 synchronize_system_time_locale ();
3675 for (i = 0; i < 12; i++)
3676 {
3677 str = nl_langinfo (months[i]);
3678 val = make_unibyte_string (str, strlen (str));
3679 p->contents[i] =
3680 code_convert_string_norecord (val, Vlocale_coding_system, 0);
3681 }
3682 XSETVECTOR (val, p);
3683 return val;
3684 }
3685 #endif /* MON_1 */
3686 /* LC_PAPER stuff isn't defined as accessible in glibc as of 2.3.1,
3687 but is in the locale files. This could be used by ps-print. */
3688 #ifdef PAPER_WIDTH
3689 else if (EQ (item, Qpaper))
3690 {
3691 return list2 (make_number (nl_langinfo (PAPER_WIDTH)),
3692 make_number (nl_langinfo (PAPER_HEIGHT)));
3693 }
3694 #endif /* PAPER_WIDTH */
3695 #endif /* HAVE_LANGINFO_CODESET*/
3696 return Qnil;
3697 }
3698 \f
3699 /* base64 encode/decode functions (RFC 2045).
3700 Based on code from GNU recode. */
3701
3702 #define MIME_LINE_LENGTH 76
3703
3704 #define IS_ASCII(Character) \
3705 ((Character) < 128)
3706 #define IS_BASE64(Character) \
3707 (IS_ASCII (Character) && base64_char_to_value[Character] >= 0)
3708 #define IS_BASE64_IGNORABLE(Character) \
3709 ((Character) == ' ' || (Character) == '\t' || (Character) == '\n' \
3710 || (Character) == '\f' || (Character) == '\r')
3711
3712 /* Used by base64_decode_1 to retrieve a non-base64-ignorable
3713 character or return retval if there are no characters left to
3714 process. */
3715 #define READ_QUADRUPLET_BYTE(retval) \
3716 do \
3717 { \
3718 if (i == length) \
3719 { \
3720 if (nchars_return) \
3721 *nchars_return = nchars; \
3722 return (retval); \
3723 } \
3724 c = from[i++]; \
3725 } \
3726 while (IS_BASE64_IGNORABLE (c))
3727
3728 /* Table of characters coding the 64 values. */
3729 static char base64_value_to_char[64] =
3730 {
3731 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', /* 0- 9 */
3732 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', /* 10-19 */
3733 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', /* 20-29 */
3734 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', /* 30-39 */
3735 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', /* 40-49 */
3736 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', /* 50-59 */
3737 '8', '9', '+', '/' /* 60-63 */
3738 };
3739
3740 /* Table of base64 values for first 128 characters. */
3741 static short base64_char_to_value[128] =
3742 {
3743 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0- 9 */
3744 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 10- 19 */
3745 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 20- 29 */
3746 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 30- 39 */
3747 -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, /* 40- 49 */
3748 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, /* 50- 59 */
3749 -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, /* 60- 69 */
3750 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, /* 70- 79 */
3751 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, /* 80- 89 */
3752 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, /* 90- 99 */
3753 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, /* 100-109 */
3754 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, /* 110-119 */
3755 49, 50, 51, -1, -1, -1, -1, -1 /* 120-127 */
3756 };
3757
3758 /* The following diagram shows the logical steps by which three octets
3759 get transformed into four base64 characters.
3760
3761 .--------. .--------. .--------.
3762 |aaaaaabb| |bbbbcccc| |ccdddddd|
3763 `--------' `--------' `--------'
3764 6 2 4 4 2 6
3765 .--------+--------+--------+--------.
3766 |00aaaaaa|00bbbbbb|00cccccc|00dddddd|
3767 `--------+--------+--------+--------'
3768
3769 .--------+--------+--------+--------.
3770 |AAAAAAAA|BBBBBBBB|CCCCCCCC|DDDDDDDD|
3771 `--------+--------+--------+--------'
3772
3773 The octets are divided into 6 bit chunks, which are then encoded into
3774 base64 characters. */
3775
3776
3777 static int base64_encode_1 P_ ((const char *, char *, int, int, int));
3778 static int base64_decode_1 P_ ((const char *, char *, int, int, int *));
3779
3780 DEFUN ("base64-encode-region", Fbase64_encode_region, Sbase64_encode_region,
3781 2, 3, "r",
3782 doc: /* Base64-encode the region between BEG and END.
3783 Return the length of the encoded text.
3784 Optional third argument NO-LINE-BREAK means do not break long lines
3785 into shorter lines. */)
3786 (beg, end, no_line_break)
3787 Lisp_Object beg, end, no_line_break;
3788 {
3789 char *encoded;
3790 int allength, length;
3791 int ibeg, iend, encoded_length;
3792 int old_pos = PT;
3793 USE_SAFE_ALLOCA;
3794
3795 validate_region (&beg, &end);
3796
3797 ibeg = CHAR_TO_BYTE (XFASTINT (beg));
3798 iend = CHAR_TO_BYTE (XFASTINT (end));
3799 move_gap_both (XFASTINT (beg), ibeg);
3800
3801 /* We need to allocate enough room for encoding the text.
3802 We need 33 1/3% more space, plus a newline every 76
3803 characters, and then we round up. */
3804 length = iend - ibeg;
3805 allength = length + length/3 + 1;
3806 allength += allength / MIME_LINE_LENGTH + 1 + 6;
3807
3808 SAFE_ALLOCA (encoded, char *, allength);
3809 encoded_length = base64_encode_1 (BYTE_POS_ADDR (ibeg), encoded, length,
3810 NILP (no_line_break),
3811 !NILP (current_buffer->enable_multibyte_characters));
3812 if (encoded_length > allength)
3813 abort ();
3814
3815 if (encoded_length < 0)
3816 {
3817 /* The encoding wasn't possible. */
3818 SAFE_FREE ();
3819 error ("Multibyte character in data for base64 encoding");
3820 }
3821
3822 /* Now we have encoded the region, so we insert the new contents
3823 and delete the old. (Insert first in order to preserve markers.) */
3824 SET_PT_BOTH (XFASTINT (beg), ibeg);
3825 insert (encoded, encoded_length);
3826 SAFE_FREE ();
3827 del_range_byte (ibeg + encoded_length, iend + encoded_length, 1);
3828
3829 /* If point was outside of the region, restore it exactly; else just
3830 move to the beginning of the region. */
3831 if (old_pos >= XFASTINT (end))
3832 old_pos += encoded_length - (XFASTINT (end) - XFASTINT (beg));
3833 else if (old_pos > XFASTINT (beg))
3834 old_pos = XFASTINT (beg);
3835 SET_PT (old_pos);
3836
3837 /* We return the length of the encoded text. */
3838 return make_number (encoded_length);
3839 }
3840
3841 DEFUN ("base64-encode-string", Fbase64_encode_string, Sbase64_encode_string,
3842 1, 2, 0,
3843 doc: /* Base64-encode STRING and return the result.
3844 Optional second argument NO-LINE-BREAK means do not break long lines
3845 into shorter lines. */)
3846 (string, no_line_break)
3847 Lisp_Object string, no_line_break;
3848 {
3849 int allength, length, encoded_length;
3850 char *encoded;
3851 Lisp_Object encoded_string;
3852 USE_SAFE_ALLOCA;
3853
3854 CHECK_STRING (string);
3855
3856 /* We need to allocate enough room for encoding the text.
3857 We need 33 1/3% more space, plus a newline every 76
3858 characters, and then we round up. */
3859 length = SBYTES (string);
3860 allength = length + length/3 + 1;
3861 allength += allength / MIME_LINE_LENGTH + 1 + 6;
3862
3863 /* We need to allocate enough room for decoding the text. */
3864 SAFE_ALLOCA (encoded, char *, allength);
3865
3866 encoded_length = base64_encode_1 (SDATA (string),
3867 encoded, length, NILP (no_line_break),
3868 STRING_MULTIBYTE (string));
3869 if (encoded_length > allength)
3870 abort ();
3871
3872 if (encoded_length < 0)
3873 {
3874 /* The encoding wasn't possible. */
3875 SAFE_FREE ();
3876 error ("Multibyte character in data for base64 encoding");
3877 }
3878
3879 encoded_string = make_unibyte_string (encoded, encoded_length);
3880 SAFE_FREE ();
3881
3882 return encoded_string;
3883 }
3884
3885 static int
3886 base64_encode_1 (from, to, length, line_break, multibyte)
3887 const char *from;
3888 char *to;
3889 int length;
3890 int line_break;
3891 int multibyte;
3892 {
3893 int counter = 0, i = 0;
3894 char *e = to;
3895 int c;
3896 unsigned int value;
3897 int bytes;
3898
3899 while (i < length)
3900 {
3901 if (multibyte)
3902 {
3903 c = STRING_CHAR_AND_LENGTH (from + i, length - i, bytes);
3904 if (c >= 256)
3905 return -1;
3906 i += bytes;
3907 }
3908 else
3909 c = from[i++];
3910
3911 /* Wrap line every 76 characters. */
3912
3913 if (line_break)
3914 {
3915 if (counter < MIME_LINE_LENGTH / 4)
3916 counter++;
3917 else
3918 {
3919 *e++ = '\n';
3920 counter = 1;
3921 }
3922 }
3923
3924 /* Process first byte of a triplet. */
3925
3926 *e++ = base64_value_to_char[0x3f & c >> 2];
3927 value = (0x03 & c) << 4;
3928
3929 /* Process second byte of a triplet. */
3930
3931 if (i == length)
3932 {
3933 *e++ = base64_value_to_char[value];
3934 *e++ = '=';
3935 *e++ = '=';
3936 break;
3937 }
3938
3939 if (multibyte)
3940 {
3941 c = STRING_CHAR_AND_LENGTH (from + i, length - i, bytes);
3942 if (c >= 256)
3943 return -1;
3944 i += bytes;
3945 }
3946 else
3947 c = from[i++];
3948
3949 *e++ = base64_value_to_char[value | (0x0f & c >> 4)];
3950 value = (0x0f & c) << 2;
3951
3952 /* Process third byte of a triplet. */
3953
3954 if (i == length)
3955 {
3956 *e++ = base64_value_to_char[value];
3957 *e++ = '=';
3958 break;
3959 }
3960
3961 if (multibyte)
3962 {
3963 c = STRING_CHAR_AND_LENGTH (from + i, length - i, bytes);
3964 if (c >= 256)
3965 return -1;
3966 i += bytes;
3967 }
3968 else
3969 c = from[i++];
3970
3971 *e++ = base64_value_to_char[value | (0x03 & c >> 6)];
3972 *e++ = base64_value_to_char[0x3f & c];
3973 }
3974
3975 return e - to;
3976 }
3977
3978
3979 DEFUN ("base64-decode-region", Fbase64_decode_region, Sbase64_decode_region,
3980 2, 2, "r",
3981 doc: /* Base64-decode the region between BEG and END.
3982 Return the length of the decoded text.
3983 If the region can't be decoded, signal an error and don't modify the buffer. */)
3984 (beg, end)
3985 Lisp_Object beg, end;
3986 {
3987 int ibeg, iend, length, allength;
3988 char *decoded;
3989 int old_pos = PT;
3990 int decoded_length;
3991 int inserted_chars;
3992 int multibyte = !NILP (current_buffer->enable_multibyte_characters);
3993 USE_SAFE_ALLOCA;
3994
3995 validate_region (&beg, &end);
3996
3997 ibeg = CHAR_TO_BYTE (XFASTINT (beg));
3998 iend = CHAR_TO_BYTE (XFASTINT (end));
3999
4000 length = iend - ibeg;
4001
4002 /* We need to allocate enough room for decoding the text. If we are
4003 working on a multibyte buffer, each decoded code may occupy at
4004 most two bytes. */
4005 allength = multibyte ? length * 2 : length;
4006 SAFE_ALLOCA (decoded, char *, allength);
4007
4008 move_gap_both (XFASTINT (beg), ibeg);
4009 decoded_length = base64_decode_1 (BYTE_POS_ADDR (ibeg), decoded, length,
4010 multibyte, &inserted_chars);
4011 if (decoded_length > allength)
4012 abort ();
4013
4014 if (decoded_length < 0)
4015 {
4016 /* The decoding wasn't possible. */
4017 SAFE_FREE ();
4018 error ("Invalid base64 data");
4019 }
4020
4021 /* Now we have decoded the region, so we insert the new contents
4022 and delete the old. (Insert first in order to preserve markers.) */
4023 TEMP_SET_PT_BOTH (XFASTINT (beg), ibeg);
4024 insert_1_both (decoded, inserted_chars, decoded_length, 0, 1, 0);
4025 SAFE_FREE ();
4026
4027 /* Delete the original text. */
4028 del_range_both (PT, PT_BYTE, XFASTINT (end) + inserted_chars,
4029 iend + decoded_length, 1);
4030
4031 /* If point was outside of the region, restore it exactly; else just
4032 move to the beginning of the region. */
4033 if (old_pos >= XFASTINT (end))
4034 old_pos += inserted_chars - (XFASTINT (end) - XFASTINT (beg));
4035 else if (old_pos > XFASTINT (beg))
4036 old_pos = XFASTINT (beg);
4037 SET_PT (old_pos > ZV ? ZV : old_pos);
4038
4039 return make_number (inserted_chars);
4040 }
4041
4042 DEFUN ("base64-decode-string", Fbase64_decode_string, Sbase64_decode_string,
4043 1, 1, 0,
4044 doc: /* Base64-decode STRING and return the result. */)
4045 (string)
4046 Lisp_Object string;
4047 {
4048 char *decoded;
4049 int length, decoded_length;
4050 Lisp_Object decoded_string;
4051 USE_SAFE_ALLOCA;
4052
4053 CHECK_STRING (string);
4054
4055 length = SBYTES (string);
4056 /* We need to allocate enough room for decoding the text. */
4057 SAFE_ALLOCA (decoded, char *, length);
4058
4059 /* The decoded result should be unibyte. */
4060 decoded_length = base64_decode_1 (SDATA (string), decoded, length,
4061 0, NULL);
4062 if (decoded_length > length)
4063 abort ();
4064 else if (decoded_length >= 0)
4065 decoded_string = make_unibyte_string (decoded, decoded_length);
4066 else
4067 decoded_string = Qnil;
4068
4069 SAFE_FREE ();
4070 if (!STRINGP (decoded_string))
4071 error ("Invalid base64 data");
4072
4073 return decoded_string;
4074 }
4075
4076 /* Base64-decode the data at FROM of LENGHT bytes into TO. If
4077 MULTIBYTE is nonzero, the decoded result should be in multibyte
4078 form. If NCHARS_RETRUN is not NULL, store the number of produced
4079 characters in *NCHARS_RETURN. */
4080
4081 static int
4082 base64_decode_1 (from, to, length, multibyte, nchars_return)
4083 const char *from;
4084 char *to;
4085 int length;
4086 int multibyte;
4087 int *nchars_return;
4088 {
4089 int i = 0;
4090 char *e = to;
4091 unsigned char c;
4092 unsigned long value;
4093 int nchars = 0;
4094
4095 while (1)
4096 {
4097 /* Process first byte of a quadruplet. */
4098
4099 READ_QUADRUPLET_BYTE (e-to);
4100
4101 if (!IS_BASE64 (c))
4102 return -1;
4103 value = base64_char_to_value[c] << 18;
4104
4105 /* Process second byte of a quadruplet. */
4106
4107 READ_QUADRUPLET_BYTE (-1);
4108
4109 if (!IS_BASE64 (c))
4110 return -1;
4111 value |= base64_char_to_value[c] << 12;
4112
4113 c = (unsigned char) (value >> 16);
4114 if (multibyte)
4115 e += CHAR_STRING (c, e);
4116 else
4117 *e++ = c;
4118 nchars++;
4119
4120 /* Process third byte of a quadruplet. */
4121
4122 READ_QUADRUPLET_BYTE (-1);
4123
4124 if (c == '=')
4125 {
4126 READ_QUADRUPLET_BYTE (-1);
4127
4128 if (c != '=')
4129 return -1;
4130 continue;
4131 }
4132
4133 if (!IS_BASE64 (c))
4134 return -1;
4135 value |= base64_char_to_value[c] << 6;
4136
4137 c = (unsigned char) (0xff & value >> 8);
4138 if (multibyte)
4139 e += CHAR_STRING (c, e);
4140 else
4141 *e++ = c;
4142 nchars++;
4143
4144 /* Process fourth byte of a quadruplet. */
4145
4146 READ_QUADRUPLET_BYTE (-1);
4147
4148 if (c == '=')
4149 continue;
4150
4151 if (!IS_BASE64 (c))
4152 return -1;
4153 value |= base64_char_to_value[c];
4154
4155 c = (unsigned char) (0xff & value);
4156 if (multibyte)
4157 e += CHAR_STRING (c, e);
4158 else
4159 *e++ = c;
4160 nchars++;
4161 }
4162 }
4163
4164
4165 \f
4166 /***********************************************************************
4167 ***** *****
4168 ***** Hash Tables *****
4169 ***** *****
4170 ***********************************************************************/
4171
4172 /* Implemented by gerd@gnu.org. This hash table implementation was
4173 inspired by CMUCL hash tables. */
4174
4175 /* Ideas:
4176
4177 1. For small tables, association lists are probably faster than
4178 hash tables because they have lower overhead.
4179
4180 For uses of hash tables where the O(1) behavior of table
4181 operations is not a requirement, it might therefore be a good idea
4182 not to hash. Instead, we could just do a linear search in the
4183 key_and_value vector of the hash table. This could be done
4184 if a `:linear-search t' argument is given to make-hash-table. */
4185
4186
4187 /* The list of all weak hash tables. Don't staticpro this one. */
4188
4189 Lisp_Object Vweak_hash_tables;
4190
4191 /* Various symbols. */
4192
4193 Lisp_Object Qhash_table_p, Qeq, Qeql, Qequal, Qkey, Qvalue;
4194 Lisp_Object QCtest, QCsize, QCrehash_size, QCrehash_threshold, QCweakness;
4195 Lisp_Object Qhash_table_test, Qkey_or_value, Qkey_and_value;
4196
4197 /* Function prototypes. */
4198
4199 static struct Lisp_Hash_Table *check_hash_table P_ ((Lisp_Object));
4200 static int get_key_arg P_ ((Lisp_Object, int, Lisp_Object *, char *));
4201 static void maybe_resize_hash_table P_ ((struct Lisp_Hash_Table *));
4202 static int cmpfn_eql P_ ((struct Lisp_Hash_Table *, Lisp_Object, unsigned,
4203 Lisp_Object, unsigned));
4204 static int cmpfn_equal P_ ((struct Lisp_Hash_Table *, Lisp_Object, unsigned,
4205 Lisp_Object, unsigned));
4206 static int cmpfn_user_defined P_ ((struct Lisp_Hash_Table *, Lisp_Object,
4207 unsigned, Lisp_Object, unsigned));
4208 static unsigned hashfn_eq P_ ((struct Lisp_Hash_Table *, Lisp_Object));
4209 static unsigned hashfn_eql P_ ((struct Lisp_Hash_Table *, Lisp_Object));
4210 static unsigned hashfn_equal P_ ((struct Lisp_Hash_Table *, Lisp_Object));
4211 static unsigned hashfn_user_defined P_ ((struct Lisp_Hash_Table *,
4212 Lisp_Object));
4213 static unsigned sxhash_string P_ ((unsigned char *, int));
4214 static unsigned sxhash_list P_ ((Lisp_Object, int));
4215 static unsigned sxhash_vector P_ ((Lisp_Object, int));
4216 static unsigned sxhash_bool_vector P_ ((Lisp_Object));
4217 static int sweep_weak_table P_ ((struct Lisp_Hash_Table *, int));
4218
4219
4220 \f
4221 /***********************************************************************
4222 Utilities
4223 ***********************************************************************/
4224
4225 /* If OBJ is a Lisp hash table, return a pointer to its struct
4226 Lisp_Hash_Table. Otherwise, signal an error. */
4227
4228 static struct Lisp_Hash_Table *
4229 check_hash_table (obj)
4230 Lisp_Object obj;
4231 {
4232 CHECK_HASH_TABLE (obj);
4233 return XHASH_TABLE (obj);
4234 }
4235
4236
4237 /* Value is the next integer I >= N, N >= 0 which is "almost" a prime
4238 number. */
4239
4240 int
4241 next_almost_prime (n)
4242 int n;
4243 {
4244 if (n % 2 == 0)
4245 n += 1;
4246 if (n % 3 == 0)
4247 n += 2;
4248 if (n % 7 == 0)
4249 n += 4;
4250 return n;
4251 }
4252
4253
4254 /* Find KEY in ARGS which has size NARGS. Don't consider indices for
4255 which USED[I] is non-zero. If found at index I in ARGS, set
4256 USED[I] and USED[I + 1] to 1, and return I + 1. Otherwise return
4257 -1. This function is used to extract a keyword/argument pair from
4258 a DEFUN parameter list. */
4259
4260 static int
4261 get_key_arg (key, nargs, args, used)
4262 Lisp_Object key;
4263 int nargs;
4264 Lisp_Object *args;
4265 char *used;
4266 {
4267 int i;
4268
4269 for (i = 0; i < nargs - 1; ++i)
4270 if (!used[i] && EQ (args[i], key))
4271 break;
4272
4273 if (i >= nargs - 1)
4274 i = -1;
4275 else
4276 {
4277 used[i++] = 1;
4278 used[i] = 1;
4279 }
4280
4281 return i;
4282 }
4283
4284
4285 /* Return a Lisp vector which has the same contents as VEC but has
4286 size NEW_SIZE, NEW_SIZE >= VEC->size. Entries in the resulting
4287 vector that are not copied from VEC are set to INIT. */
4288
4289 Lisp_Object
4290 larger_vector (vec, new_size, init)
4291 Lisp_Object vec;
4292 int new_size;
4293 Lisp_Object init;
4294 {
4295 struct Lisp_Vector *v;
4296 int i, old_size;
4297
4298 xassert (VECTORP (vec));
4299 old_size = XVECTOR (vec)->size;
4300 xassert (new_size >= old_size);
4301
4302 v = allocate_vector (new_size);
4303 bcopy (XVECTOR (vec)->contents, v->contents,
4304 old_size * sizeof *v->contents);
4305 for (i = old_size; i < new_size; ++i)
4306 v->contents[i] = init;
4307 XSETVECTOR (vec, v);
4308 return vec;
4309 }
4310
4311
4312 /***********************************************************************
4313 Low-level Functions
4314 ***********************************************************************/
4315
4316 /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code
4317 HASH2 in hash table H using `eql'. Value is non-zero if KEY1 and
4318 KEY2 are the same. */
4319
4320 static int
4321 cmpfn_eql (h, key1, hash1, key2, hash2)
4322 struct Lisp_Hash_Table *h;
4323 Lisp_Object key1, key2;
4324 unsigned hash1, hash2;
4325 {
4326 return (FLOATP (key1)
4327 && FLOATP (key2)
4328 && XFLOAT_DATA (key1) == XFLOAT_DATA (key2));
4329 }
4330
4331
4332 /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code
4333 HASH2 in hash table H using `equal'. Value is non-zero if KEY1 and
4334 KEY2 are the same. */
4335
4336 static int
4337 cmpfn_equal (h, key1, hash1, key2, hash2)
4338 struct Lisp_Hash_Table *h;
4339 Lisp_Object key1, key2;
4340 unsigned hash1, hash2;
4341 {
4342 return hash1 == hash2 && !NILP (Fequal (key1, key2));
4343 }
4344
4345
4346 /* Compare KEY1 which has hash code HASH1, and KEY2 with hash code
4347 HASH2 in hash table H using H->user_cmp_function. Value is non-zero
4348 if KEY1 and KEY2 are the same. */
4349
4350 static int
4351 cmpfn_user_defined (h, key1, hash1, key2, hash2)
4352 struct Lisp_Hash_Table *h;
4353 Lisp_Object key1, key2;
4354 unsigned hash1, hash2;
4355 {
4356 if (hash1 == hash2)
4357 {
4358 Lisp_Object args[3];
4359
4360 args[0] = h->user_cmp_function;
4361 args[1] = key1;
4362 args[2] = key2;
4363 return !NILP (Ffuncall (3, args));
4364 }
4365 else
4366 return 0;
4367 }
4368
4369
4370 /* Value is a hash code for KEY for use in hash table H which uses
4371 `eq' to compare keys. The hash code returned is guaranteed to fit
4372 in a Lisp integer. */
4373
4374 static unsigned
4375 hashfn_eq (h, key)
4376 struct Lisp_Hash_Table *h;
4377 Lisp_Object key;
4378 {
4379 unsigned hash = XUINT (key) ^ XGCTYPE (key);
4380 xassert ((hash & ~INTMASK) == 0);
4381 return hash;
4382 }
4383
4384
4385 /* Value is a hash code for KEY for use in hash table H which uses
4386 `eql' to compare keys. The hash code returned is guaranteed to fit
4387 in a Lisp integer. */
4388
4389 static unsigned
4390 hashfn_eql (h, key)
4391 struct Lisp_Hash_Table *h;
4392 Lisp_Object key;
4393 {
4394 unsigned hash;
4395 if (FLOATP (key))
4396 hash = sxhash (key, 0);
4397 else
4398 hash = XUINT (key) ^ XGCTYPE (key);
4399 xassert ((hash & ~INTMASK) == 0);
4400 return hash;
4401 }
4402
4403
4404 /* Value is a hash code for KEY for use in hash table H which uses
4405 `equal' to compare keys. The hash code returned is guaranteed to fit
4406 in a Lisp integer. */
4407
4408 static unsigned
4409 hashfn_equal (h, key)
4410 struct Lisp_Hash_Table *h;
4411 Lisp_Object key;
4412 {
4413 unsigned hash = sxhash (key, 0);
4414 xassert ((hash & ~INTMASK) == 0);
4415 return hash;
4416 }
4417
4418
4419 /* Value is a hash code for KEY for use in hash table H which uses as
4420 user-defined function to compare keys. The hash code returned is
4421 guaranteed to fit in a Lisp integer. */
4422
4423 static unsigned
4424 hashfn_user_defined (h, key)
4425 struct Lisp_Hash_Table *h;
4426 Lisp_Object key;
4427 {
4428 Lisp_Object args[2], hash;
4429
4430 args[0] = h->user_hash_function;
4431 args[1] = key;
4432 hash = Ffuncall (2, args);
4433 if (!INTEGERP (hash))
4434 Fsignal (Qerror,
4435 list2 (build_string ("Invalid hash code returned from \
4436 user-supplied hash function"),
4437 hash));
4438 return XUINT (hash);
4439 }
4440
4441
4442 /* Create and initialize a new hash table.
4443
4444 TEST specifies the test the hash table will use to compare keys.
4445 It must be either one of the predefined tests `eq', `eql' or
4446 `equal' or a symbol denoting a user-defined test named TEST with
4447 test and hash functions USER_TEST and USER_HASH.
4448
4449 Give the table initial capacity SIZE, SIZE >= 0, an integer.
4450
4451 If REHASH_SIZE is an integer, it must be > 0, and this hash table's
4452 new size when it becomes full is computed by adding REHASH_SIZE to
4453 its old size. If REHASH_SIZE is a float, it must be > 1.0, and the
4454 table's new size is computed by multiplying its old size with
4455 REHASH_SIZE.
4456
4457 REHASH_THRESHOLD must be a float <= 1.0, and > 0. The table will
4458 be resized when the ratio of (number of entries in the table) /
4459 (table size) is >= REHASH_THRESHOLD.
4460
4461 WEAK specifies the weakness of the table. If non-nil, it must be
4462 one of the symbols `key', `value', `key-or-value', or `key-and-value'. */
4463
4464 Lisp_Object
4465 make_hash_table (test, size, rehash_size, rehash_threshold, weak,
4466 user_test, user_hash)
4467 Lisp_Object test, size, rehash_size, rehash_threshold, weak;
4468 Lisp_Object user_test, user_hash;
4469 {
4470 struct Lisp_Hash_Table *h;
4471 Lisp_Object table;
4472 int index_size, i, sz;
4473
4474 /* Preconditions. */
4475 xassert (SYMBOLP (test));
4476 xassert (INTEGERP (size) && XINT (size) >= 0);
4477 xassert ((INTEGERP (rehash_size) && XINT (rehash_size) > 0)
4478 || (FLOATP (rehash_size) && XFLOATINT (rehash_size) > 1.0));
4479 xassert (FLOATP (rehash_threshold)
4480 && XFLOATINT (rehash_threshold) > 0
4481 && XFLOATINT (rehash_threshold) <= 1.0);
4482
4483 if (XFASTINT (size) == 0)
4484 size = make_number (1);
4485
4486 /* Allocate a table and initialize it. */
4487 h = allocate_hash_table ();
4488
4489 /* Initialize hash table slots. */
4490 sz = XFASTINT (size);
4491
4492 h->test = test;
4493 if (EQ (test, Qeql))
4494 {
4495 h->cmpfn = cmpfn_eql;
4496 h->hashfn = hashfn_eql;
4497 }
4498 else if (EQ (test, Qeq))
4499 {
4500 h->cmpfn = NULL;
4501 h->hashfn = hashfn_eq;
4502 }
4503 else if (EQ (test, Qequal))
4504 {
4505 h->cmpfn = cmpfn_equal;
4506 h->hashfn = hashfn_equal;
4507 }
4508 else
4509 {
4510 h->user_cmp_function = user_test;
4511 h->user_hash_function = user_hash;
4512 h->cmpfn = cmpfn_user_defined;
4513 h->hashfn = hashfn_user_defined;
4514 }
4515
4516 h->weak = weak;
4517 h->rehash_threshold = rehash_threshold;
4518 h->rehash_size = rehash_size;
4519 h->count = make_number (0);
4520 h->key_and_value = Fmake_vector (make_number (2 * sz), Qnil);
4521 h->hash = Fmake_vector (size, Qnil);
4522 h->next = Fmake_vector (size, Qnil);
4523 /* Cast to int here avoids losing with gcc 2.95 on Tru64/Alpha... */
4524 index_size = next_almost_prime ((int) (sz / XFLOATINT (rehash_threshold)));
4525 h->index = Fmake_vector (make_number (index_size), Qnil);
4526
4527 /* Set up the free list. */
4528 for (i = 0; i < sz - 1; ++i)
4529 HASH_NEXT (h, i) = make_number (i + 1);
4530 h->next_free = make_number (0);
4531
4532 XSET_HASH_TABLE (table, h);
4533 xassert (HASH_TABLE_P (table));
4534 xassert (XHASH_TABLE (table) == h);
4535
4536 /* Maybe add this hash table to the list of all weak hash tables. */
4537 if (NILP (h->weak))
4538 h->next_weak = Qnil;
4539 else
4540 {
4541 h->next_weak = Vweak_hash_tables;
4542 Vweak_hash_tables = table;
4543 }
4544
4545 return table;
4546 }
4547
4548
4549 /* Return a copy of hash table H1. Keys and values are not copied,
4550 only the table itself is. */
4551
4552 Lisp_Object
4553 copy_hash_table (h1)
4554 struct Lisp_Hash_Table *h1;
4555 {
4556 Lisp_Object table;
4557 struct Lisp_Hash_Table *h2;
4558 struct Lisp_Vector *next;
4559
4560 h2 = allocate_hash_table ();
4561 next = h2->vec_next;
4562 bcopy (h1, h2, sizeof *h2);
4563 h2->vec_next = next;
4564 h2->key_and_value = Fcopy_sequence (h1->key_and_value);
4565 h2->hash = Fcopy_sequence (h1->hash);
4566 h2->next = Fcopy_sequence (h1->next);
4567 h2->index = Fcopy_sequence (h1->index);
4568 XSET_HASH_TABLE (table, h2);
4569
4570 /* Maybe add this hash table to the list of all weak hash tables. */
4571 if (!NILP (h2->weak))
4572 {
4573 h2->next_weak = Vweak_hash_tables;
4574 Vweak_hash_tables = table;
4575 }
4576
4577 return table;
4578 }
4579
4580
4581 /* Resize hash table H if it's too full. If H cannot be resized
4582 because it's already too large, throw an error. */
4583
4584 static INLINE void
4585 maybe_resize_hash_table (h)
4586 struct Lisp_Hash_Table *h;
4587 {
4588 if (NILP (h->next_free))
4589 {
4590 int old_size = HASH_TABLE_SIZE (h);
4591 int i, new_size, index_size;
4592
4593 if (INTEGERP (h->rehash_size))
4594 new_size = old_size + XFASTINT (h->rehash_size);
4595 else
4596 new_size = old_size * XFLOATINT (h->rehash_size);
4597 new_size = max (old_size + 1, new_size);
4598 index_size = next_almost_prime ((int)
4599 (new_size
4600 / XFLOATINT (h->rehash_threshold)));
4601 if (max (index_size, 2 * new_size) > MOST_POSITIVE_FIXNUM)
4602 error ("Hash table too large to resize");
4603
4604 h->key_and_value = larger_vector (h->key_and_value, 2 * new_size, Qnil);
4605 h->next = larger_vector (h->next, new_size, Qnil);
4606 h->hash = larger_vector (h->hash, new_size, Qnil);
4607 h->index = Fmake_vector (make_number (index_size), Qnil);
4608
4609 /* Update the free list. Do it so that new entries are added at
4610 the end of the free list. This makes some operations like
4611 maphash faster. */
4612 for (i = old_size; i < new_size - 1; ++i)
4613 HASH_NEXT (h, i) = make_number (i + 1);
4614
4615 if (!NILP (h->next_free))
4616 {
4617 Lisp_Object last, next;
4618
4619 last = h->next_free;
4620 while (next = HASH_NEXT (h, XFASTINT (last)),
4621 !NILP (next))
4622 last = next;
4623
4624 HASH_NEXT (h, XFASTINT (last)) = make_number (old_size);
4625 }
4626 else
4627 XSETFASTINT (h->next_free, old_size);
4628
4629 /* Rehash. */
4630 for (i = 0; i < old_size; ++i)
4631 if (!NILP (HASH_HASH (h, i)))
4632 {
4633 unsigned hash_code = XUINT (HASH_HASH (h, i));
4634 int start_of_bucket = hash_code % XVECTOR (h->index)->size;
4635 HASH_NEXT (h, i) = HASH_INDEX (h, start_of_bucket);
4636 HASH_INDEX (h, start_of_bucket) = make_number (i);
4637 }
4638 }
4639 }
4640
4641
4642 /* Lookup KEY in hash table H. If HASH is non-null, return in *HASH
4643 the hash code of KEY. Value is the index of the entry in H
4644 matching KEY, or -1 if not found. */
4645
4646 int
4647 hash_lookup (h, key, hash)
4648 struct Lisp_Hash_Table *h;
4649 Lisp_Object key;
4650 unsigned *hash;
4651 {
4652 unsigned hash_code;
4653 int start_of_bucket;
4654 Lisp_Object idx;
4655
4656 hash_code = h->hashfn (h, key);
4657 if (hash)
4658 *hash = hash_code;
4659
4660 start_of_bucket = hash_code % XVECTOR (h->index)->size;
4661 idx = HASH_INDEX (h, start_of_bucket);
4662
4663 /* We need not gcpro idx since it's either an integer or nil. */
4664 while (!NILP (idx))
4665 {
4666 int i = XFASTINT (idx);
4667 if (EQ (key, HASH_KEY (h, i))
4668 || (h->cmpfn
4669 && h->cmpfn (h, key, hash_code,
4670 HASH_KEY (h, i), XUINT (HASH_HASH (h, i)))))
4671 break;
4672 idx = HASH_NEXT (h, i);
4673 }
4674
4675 return NILP (idx) ? -1 : XFASTINT (idx);
4676 }
4677
4678
4679 /* Put an entry into hash table H that associates KEY with VALUE.
4680 HASH is a previously computed hash code of KEY.
4681 Value is the index of the entry in H matching KEY. */
4682
4683 int
4684 hash_put (h, key, value, hash)
4685 struct Lisp_Hash_Table *h;
4686 Lisp_Object key, value;
4687 unsigned hash;
4688 {
4689 int start_of_bucket, i;
4690
4691 xassert ((hash & ~INTMASK) == 0);
4692
4693 /* Increment count after resizing because resizing may fail. */
4694 maybe_resize_hash_table (h);
4695 h->count = make_number (XFASTINT (h->count) + 1);
4696
4697 /* Store key/value in the key_and_value vector. */
4698 i = XFASTINT (h->next_free);
4699 h->next_free = HASH_NEXT (h, i);
4700 HASH_KEY (h, i) = key;
4701 HASH_VALUE (h, i) = value;
4702
4703 /* Remember its hash code. */
4704 HASH_HASH (h, i) = make_number (hash);
4705
4706 /* Add new entry to its collision chain. */
4707 start_of_bucket = hash % XVECTOR (h->index)->size;
4708 HASH_NEXT (h, i) = HASH_INDEX (h, start_of_bucket);
4709 HASH_INDEX (h, start_of_bucket) = make_number (i);
4710 return i;
4711 }
4712
4713
4714 /* Remove the entry matching KEY from hash table H, if there is one. */
4715
4716 void
4717 hash_remove (h, key)
4718 struct Lisp_Hash_Table *h;
4719 Lisp_Object key;
4720 {
4721 unsigned hash_code;
4722 int start_of_bucket;
4723 Lisp_Object idx, prev;
4724
4725 hash_code = h->hashfn (h, key);
4726 start_of_bucket = hash_code % XVECTOR (h->index)->size;
4727 idx = HASH_INDEX (h, start_of_bucket);
4728 prev = Qnil;
4729
4730 /* We need not gcpro idx, prev since they're either integers or nil. */
4731 while (!NILP (idx))
4732 {
4733 int i = XFASTINT (idx);
4734
4735 if (EQ (key, HASH_KEY (h, i))
4736 || (h->cmpfn
4737 && h->cmpfn (h, key, hash_code,
4738 HASH_KEY (h, i), XUINT (HASH_HASH (h, i)))))
4739 {
4740 /* Take entry out of collision chain. */
4741 if (NILP (prev))
4742 HASH_INDEX (h, start_of_bucket) = HASH_NEXT (h, i);
4743 else
4744 HASH_NEXT (h, XFASTINT (prev)) = HASH_NEXT (h, i);
4745
4746 /* Clear slots in key_and_value and add the slots to
4747 the free list. */
4748 HASH_KEY (h, i) = HASH_VALUE (h, i) = HASH_HASH (h, i) = Qnil;
4749 HASH_NEXT (h, i) = h->next_free;
4750 h->next_free = make_number (i);
4751 h->count = make_number (XFASTINT (h->count) - 1);
4752 xassert (XINT (h->count) >= 0);
4753 break;
4754 }
4755 else
4756 {
4757 prev = idx;
4758 idx = HASH_NEXT (h, i);
4759 }
4760 }
4761 }
4762
4763
4764 /* Clear hash table H. */
4765
4766 void
4767 hash_clear (h)
4768 struct Lisp_Hash_Table *h;
4769 {
4770 if (XFASTINT (h->count) > 0)
4771 {
4772 int i, size = HASH_TABLE_SIZE (h);
4773
4774 for (i = 0; i < size; ++i)
4775 {
4776 HASH_NEXT (h, i) = i < size - 1 ? make_number (i + 1) : Qnil;
4777 HASH_KEY (h, i) = Qnil;
4778 HASH_VALUE (h, i) = Qnil;
4779 HASH_HASH (h, i) = Qnil;
4780 }
4781
4782 for (i = 0; i < XVECTOR (h->index)->size; ++i)
4783 XVECTOR (h->index)->contents[i] = Qnil;
4784
4785 h->next_free = make_number (0);
4786 h->count = make_number (0);
4787 }
4788 }
4789
4790
4791 \f
4792 /************************************************************************
4793 Weak Hash Tables
4794 ************************************************************************/
4795
4796 /* Sweep weak hash table H. REMOVE_ENTRIES_P non-zero means remove
4797 entries from the table that don't survive the current GC.
4798 REMOVE_ENTRIES_P zero means mark entries that are in use. Value is
4799 non-zero if anything was marked. */
4800
4801 static int
4802 sweep_weak_table (h, remove_entries_p)
4803 struct Lisp_Hash_Table *h;
4804 int remove_entries_p;
4805 {
4806 int bucket, n, marked;
4807
4808 n = XVECTOR (h->index)->size & ~ARRAY_MARK_FLAG;
4809 marked = 0;
4810
4811 for (bucket = 0; bucket < n; ++bucket)
4812 {
4813 Lisp_Object idx, next, prev;
4814
4815 /* Follow collision chain, removing entries that
4816 don't survive this garbage collection. */
4817 prev = Qnil;
4818 for (idx = HASH_INDEX (h, bucket); !GC_NILP (idx); idx = next)
4819 {
4820 int i = XFASTINT (idx);
4821 int key_known_to_survive_p = survives_gc_p (HASH_KEY (h, i));
4822 int value_known_to_survive_p = survives_gc_p (HASH_VALUE (h, i));
4823 int remove_p;
4824
4825 if (EQ (h->weak, Qkey))
4826 remove_p = !key_known_to_survive_p;
4827 else if (EQ (h->weak, Qvalue))
4828 remove_p = !value_known_to_survive_p;
4829 else if (EQ (h->weak, Qkey_or_value))
4830 remove_p = !(key_known_to_survive_p || value_known_to_survive_p);
4831 else if (EQ (h->weak, Qkey_and_value))
4832 remove_p = !(key_known_to_survive_p && value_known_to_survive_p);
4833 else
4834 abort ();
4835
4836 next = HASH_NEXT (h, i);
4837
4838 if (remove_entries_p)
4839 {
4840 if (remove_p)
4841 {
4842 /* Take out of collision chain. */
4843 if (GC_NILP (prev))
4844 HASH_INDEX (h, bucket) = next;
4845 else
4846 HASH_NEXT (h, XFASTINT (prev)) = next;
4847
4848 /* Add to free list. */
4849 HASH_NEXT (h, i) = h->next_free;
4850 h->next_free = idx;
4851
4852 /* Clear key, value, and hash. */
4853 HASH_KEY (h, i) = HASH_VALUE (h, i) = Qnil;
4854 HASH_HASH (h, i) = Qnil;
4855
4856 h->count = make_number (XFASTINT (h->count) - 1);
4857 }
4858 else
4859 {
4860 prev = idx;
4861 }
4862 }
4863 else
4864 {
4865 if (!remove_p)
4866 {
4867 /* Make sure key and value survive. */
4868 if (!key_known_to_survive_p)
4869 {
4870 mark_object (HASH_KEY (h, i));
4871 marked = 1;
4872 }
4873
4874 if (!value_known_to_survive_p)
4875 {
4876 mark_object (HASH_VALUE (h, i));
4877 marked = 1;
4878 }
4879 }
4880 }
4881 }
4882 }
4883
4884 return marked;
4885 }
4886
4887 /* Remove elements from weak hash tables that don't survive the
4888 current garbage collection. Remove weak tables that don't survive
4889 from Vweak_hash_tables. Called from gc_sweep. */
4890
4891 void
4892 sweep_weak_hash_tables ()
4893 {
4894 Lisp_Object table, used, next;
4895 struct Lisp_Hash_Table *h;
4896 int marked;
4897
4898 /* Mark all keys and values that are in use. Keep on marking until
4899 there is no more change. This is necessary for cases like
4900 value-weak table A containing an entry X -> Y, where Y is used in a
4901 key-weak table B, Z -> Y. If B comes after A in the list of weak
4902 tables, X -> Y might be removed from A, although when looking at B
4903 one finds that it shouldn't. */
4904 do
4905 {
4906 marked = 0;
4907 for (table = Vweak_hash_tables; !GC_NILP (table); table = h->next_weak)
4908 {
4909 h = XHASH_TABLE (table);
4910 if (h->size & ARRAY_MARK_FLAG)
4911 marked |= sweep_weak_table (h, 0);
4912 }
4913 }
4914 while (marked);
4915
4916 /* Remove tables and entries that aren't used. */
4917 for (table = Vweak_hash_tables, used = Qnil; !GC_NILP (table); table = next)
4918 {
4919 h = XHASH_TABLE (table);
4920 next = h->next_weak;
4921
4922 if (h->size & ARRAY_MARK_FLAG)
4923 {
4924 /* TABLE is marked as used. Sweep its contents. */
4925 if (XFASTINT (h->count) > 0)
4926 sweep_weak_table (h, 1);
4927
4928 /* Add table to the list of used weak hash tables. */
4929 h->next_weak = used;
4930 used = table;
4931 }
4932 }
4933
4934 Vweak_hash_tables = used;
4935 }
4936
4937
4938 \f
4939 /***********************************************************************
4940 Hash Code Computation
4941 ***********************************************************************/
4942
4943 /* Maximum depth up to which to dive into Lisp structures. */
4944
4945 #define SXHASH_MAX_DEPTH 3
4946
4947 /* Maximum length up to which to take list and vector elements into
4948 account. */
4949
4950 #define SXHASH_MAX_LEN 7
4951
4952 /* Combine two integers X and Y for hashing. */
4953
4954 #define SXHASH_COMBINE(X, Y) \
4955 ((((unsigned)(X) << 4) + (((unsigned)(X) >> 24) & 0x0fffffff)) \
4956 + (unsigned)(Y))
4957
4958
4959 /* Return a hash for string PTR which has length LEN. The hash
4960 code returned is guaranteed to fit in a Lisp integer. */
4961
4962 static unsigned
4963 sxhash_string (ptr, len)
4964 unsigned char *ptr;
4965 int len;
4966 {
4967 unsigned char *p = ptr;
4968 unsigned char *end = p + len;
4969 unsigned char c;
4970 unsigned hash = 0;
4971
4972 while (p != end)
4973 {
4974 c = *p++;
4975 if (c >= 0140)
4976 c -= 40;
4977 hash = ((hash << 3) + (hash >> 28) + c);
4978 }
4979
4980 return hash & INTMASK;
4981 }
4982
4983
4984 /* Return a hash for list LIST. DEPTH is the current depth in the
4985 list. We don't recurse deeper than SXHASH_MAX_DEPTH in it. */
4986
4987 static unsigned
4988 sxhash_list (list, depth)
4989 Lisp_Object list;
4990 int depth;
4991 {
4992 unsigned hash = 0;
4993 int i;
4994
4995 if (depth < SXHASH_MAX_DEPTH)
4996 for (i = 0;
4997 CONSP (list) && i < SXHASH_MAX_LEN;
4998 list = XCDR (list), ++i)
4999 {
5000 unsigned hash2 = sxhash (XCAR (list), depth + 1);
5001 hash = SXHASH_COMBINE (hash, hash2);
5002 }
5003
5004 return hash;
5005 }
5006
5007
5008 /* Return a hash for vector VECTOR. DEPTH is the current depth in
5009 the Lisp structure. */
5010
5011 static unsigned
5012 sxhash_vector (vec, depth)
5013 Lisp_Object vec;
5014 int depth;
5015 {
5016 unsigned hash = XVECTOR (vec)->size;
5017 int i, n;
5018
5019 n = min (SXHASH_MAX_LEN, XVECTOR (vec)->size);
5020 for (i = 0; i < n; ++i)
5021 {
5022 unsigned hash2 = sxhash (XVECTOR (vec)->contents[i], depth + 1);
5023 hash = SXHASH_COMBINE (hash, hash2);
5024 }
5025
5026 return hash;
5027 }
5028
5029
5030 /* Return a hash for bool-vector VECTOR. */
5031
5032 static unsigned
5033 sxhash_bool_vector (vec)
5034 Lisp_Object vec;
5035 {
5036 unsigned hash = XBOOL_VECTOR (vec)->size;
5037 int i, n;
5038
5039 n = min (SXHASH_MAX_LEN, XBOOL_VECTOR (vec)->vector_size);
5040 for (i = 0; i < n; ++i)
5041 hash = SXHASH_COMBINE (hash, XBOOL_VECTOR (vec)->data[i]);
5042
5043 return hash;
5044 }
5045
5046
5047 /* Return a hash code for OBJ. DEPTH is the current depth in the Lisp
5048 structure. Value is an unsigned integer clipped to INTMASK. */
5049
5050 unsigned
5051 sxhash (obj, depth)
5052 Lisp_Object obj;
5053 int depth;
5054 {
5055 unsigned hash;
5056
5057 if (depth > SXHASH_MAX_DEPTH)
5058 return 0;
5059
5060 switch (XTYPE (obj))
5061 {
5062 case Lisp_Int:
5063 hash = XUINT (obj);
5064 break;
5065
5066 case Lisp_Misc:
5067 hash = XUINT (obj);
5068 break;
5069
5070 case Lisp_Symbol:
5071 obj = SYMBOL_NAME (obj);
5072 /* Fall through. */
5073
5074 case Lisp_String:
5075 hash = sxhash_string (SDATA (obj), SCHARS (obj));
5076 break;
5077
5078 /* This can be everything from a vector to an overlay. */
5079 case Lisp_Vectorlike:
5080 if (VECTORP (obj))
5081 /* According to the CL HyperSpec, two arrays are equal only if
5082 they are `eq', except for strings and bit-vectors. In
5083 Emacs, this works differently. We have to compare element
5084 by element. */
5085 hash = sxhash_vector (obj, depth);
5086 else if (BOOL_VECTOR_P (obj))
5087 hash = sxhash_bool_vector (obj);
5088 else
5089 /* Others are `equal' if they are `eq', so let's take their
5090 address as hash. */
5091 hash = XUINT (obj);
5092 break;
5093
5094 case Lisp_Cons:
5095 hash = sxhash_list (obj, depth);
5096 break;
5097
5098 case Lisp_Float:
5099 {
5100 unsigned char *p = (unsigned char *) &XFLOAT_DATA (obj);
5101 unsigned char *e = p + sizeof XFLOAT_DATA (obj);
5102 for (hash = 0; p < e; ++p)
5103 hash = SXHASH_COMBINE (hash, *p);
5104 break;
5105 }
5106
5107 default:
5108 abort ();
5109 }
5110
5111 return hash & INTMASK;
5112 }
5113
5114
5115 \f
5116 /***********************************************************************
5117 Lisp Interface
5118 ***********************************************************************/
5119
5120
5121 DEFUN ("sxhash", Fsxhash, Ssxhash, 1, 1, 0,
5122 doc: /* Compute a hash code for OBJ and return it as integer. */)
5123 (obj)
5124 Lisp_Object obj;
5125 {
5126 unsigned hash = sxhash (obj, 0);;
5127 return make_number (hash);
5128 }
5129
5130
5131 DEFUN ("make-hash-table", Fmake_hash_table, Smake_hash_table, 0, MANY, 0,
5132 doc: /* Create and return a new hash table.
5133
5134 Arguments are specified as keyword/argument pairs. The following
5135 arguments are defined:
5136
5137 :test TEST -- TEST must be a symbol that specifies how to compare
5138 keys. Default is `eql'. Predefined are the tests `eq', `eql', and
5139 `equal'. User-supplied test and hash functions can be specified via
5140 `define-hash-table-test'.
5141
5142 :size SIZE -- A hint as to how many elements will be put in the table.
5143 Default is 65.
5144
5145 :rehash-size REHASH-SIZE - Indicates how to expand the table when it
5146 fills up. If REHASH-SIZE is an integer, add that many space. If it
5147 is a float, it must be > 1.0, and the new size is computed by
5148 multiplying the old size with that factor. Default is 1.5.
5149
5150 :rehash-threshold THRESHOLD -- THRESHOLD must a float > 0, and <= 1.0.
5151 Resize the hash table when ratio of the number of entries in the
5152 table. Default is 0.8.
5153
5154 :weakness WEAK -- WEAK must be one of nil, t, `key', `value',
5155 `key-or-value', or `key-and-value'. If WEAK is not nil, the table
5156 returned is a weak table. Key/value pairs are removed from a weak
5157 hash table when there are no non-weak references pointing to their
5158 key, value, one of key or value, or both key and value, depending on
5159 WEAK. WEAK t is equivalent to `key-and-value'. Default value of WEAK
5160 is nil.
5161
5162 usage: (make-hash-table &rest KEYWORD-ARGS) */)
5163 (nargs, args)
5164 int nargs;
5165 Lisp_Object *args;
5166 {
5167 Lisp_Object test, size, rehash_size, rehash_threshold, weak;
5168 Lisp_Object user_test, user_hash;
5169 char *used;
5170 int i;
5171
5172 /* The vector `used' is used to keep track of arguments that
5173 have been consumed. */
5174 used = (char *) alloca (nargs * sizeof *used);
5175 bzero (used, nargs * sizeof *used);
5176
5177 /* See if there's a `:test TEST' among the arguments. */
5178 i = get_key_arg (QCtest, nargs, args, used);
5179 test = i < 0 ? Qeql : args[i];
5180 if (!EQ (test, Qeq) && !EQ (test, Qeql) && !EQ (test, Qequal))
5181 {
5182 /* See if it is a user-defined test. */
5183 Lisp_Object prop;
5184
5185 prop = Fget (test, Qhash_table_test);
5186 if (!CONSP (prop) || !CONSP (XCDR (prop)))
5187 Fsignal (Qerror, list2 (build_string ("Invalid hash table test"),
5188 test));
5189 user_test = XCAR (prop);
5190 user_hash = XCAR (XCDR (prop));
5191 }
5192 else
5193 user_test = user_hash = Qnil;
5194
5195 /* See if there's a `:size SIZE' argument. */
5196 i = get_key_arg (QCsize, nargs, args, used);
5197 size = i < 0 ? Qnil : args[i];
5198 if (NILP (size))
5199 size = make_number (DEFAULT_HASH_SIZE);
5200 else if (!INTEGERP (size) || XINT (size) < 0)
5201 Fsignal (Qerror,
5202 list2 (build_string ("Invalid hash table size"),
5203 size));
5204
5205 /* Look for `:rehash-size SIZE'. */
5206 i = get_key_arg (QCrehash_size, nargs, args, used);
5207 rehash_size = i < 0 ? make_float (DEFAULT_REHASH_SIZE) : args[i];
5208 if (!NUMBERP (rehash_size)
5209 || (INTEGERP (rehash_size) && XINT (rehash_size) <= 0)
5210 || XFLOATINT (rehash_size) <= 1.0)
5211 Fsignal (Qerror,
5212 list2 (build_string ("Invalid hash table rehash size"),
5213 rehash_size));
5214
5215 /* Look for `:rehash-threshold THRESHOLD'. */
5216 i = get_key_arg (QCrehash_threshold, nargs, args, used);
5217 rehash_threshold = i < 0 ? make_float (DEFAULT_REHASH_THRESHOLD) : args[i];
5218 if (!FLOATP (rehash_threshold)
5219 || XFLOATINT (rehash_threshold) <= 0.0
5220 || XFLOATINT (rehash_threshold) > 1.0)
5221 Fsignal (Qerror,
5222 list2 (build_string ("Invalid hash table rehash threshold"),
5223 rehash_threshold));
5224
5225 /* Look for `:weakness WEAK'. */
5226 i = get_key_arg (QCweakness, nargs, args, used);
5227 weak = i < 0 ? Qnil : args[i];
5228 if (EQ (weak, Qt))
5229 weak = Qkey_and_value;
5230 if (!NILP (weak)
5231 && !EQ (weak, Qkey)
5232 && !EQ (weak, Qvalue)
5233 && !EQ (weak, Qkey_or_value)
5234 && !EQ (weak, Qkey_and_value))
5235 Fsignal (Qerror, list2 (build_string ("Invalid hash table weakness"),
5236 weak));
5237
5238 /* Now, all args should have been used up, or there's a problem. */
5239 for (i = 0; i < nargs; ++i)
5240 if (!used[i])
5241 Fsignal (Qerror,
5242 list2 (build_string ("Invalid argument list"), args[i]));
5243
5244 return make_hash_table (test, size, rehash_size, rehash_threshold, weak,
5245 user_test, user_hash);
5246 }
5247
5248
5249 DEFUN ("copy-hash-table", Fcopy_hash_table, Scopy_hash_table, 1, 1, 0,
5250 doc: /* Return a copy of hash table TABLE. */)
5251 (table)
5252 Lisp_Object table;
5253 {
5254 return copy_hash_table (check_hash_table (table));
5255 }
5256
5257
5258 DEFUN ("hash-table-count", Fhash_table_count, Shash_table_count, 1, 1, 0,
5259 doc: /* Return the number of elements in TABLE. */)
5260 (table)
5261 Lisp_Object table;
5262 {
5263 return check_hash_table (table)->count;
5264 }
5265
5266
5267 DEFUN ("hash-table-rehash-size", Fhash_table_rehash_size,
5268 Shash_table_rehash_size, 1, 1, 0,
5269 doc: /* Return the current rehash size of TABLE. */)
5270 (table)
5271 Lisp_Object table;
5272 {
5273 return check_hash_table (table)->rehash_size;
5274 }
5275
5276
5277 DEFUN ("hash-table-rehash-threshold", Fhash_table_rehash_threshold,
5278 Shash_table_rehash_threshold, 1, 1, 0,
5279 doc: /* Return the current rehash threshold of TABLE. */)
5280 (table)
5281 Lisp_Object table;
5282 {
5283 return check_hash_table (table)->rehash_threshold;
5284 }
5285
5286
5287 DEFUN ("hash-table-size", Fhash_table_size, Shash_table_size, 1, 1, 0,
5288 doc: /* Return the size of TABLE.
5289 The size can be used as an argument to `make-hash-table' to create
5290 a hash table than can hold as many elements of TABLE holds
5291 without need for resizing. */)
5292 (table)
5293 Lisp_Object table;
5294 {
5295 struct Lisp_Hash_Table *h = check_hash_table (table);
5296 return make_number (HASH_TABLE_SIZE (h));
5297 }
5298
5299
5300 DEFUN ("hash-table-test", Fhash_table_test, Shash_table_test, 1, 1, 0,
5301 doc: /* Return the test TABLE uses. */)
5302 (table)
5303 Lisp_Object table;
5304 {
5305 return check_hash_table (table)->test;
5306 }
5307
5308
5309 DEFUN ("hash-table-weakness", Fhash_table_weakness, Shash_table_weakness,
5310 1, 1, 0,
5311 doc: /* Return the weakness of TABLE. */)
5312 (table)
5313 Lisp_Object table;
5314 {
5315 return check_hash_table (table)->weak;
5316 }
5317
5318
5319 DEFUN ("hash-table-p", Fhash_table_p, Shash_table_p, 1, 1, 0,
5320 doc: /* Return t if OBJ is a Lisp hash table object. */)
5321 (obj)
5322 Lisp_Object obj;
5323 {
5324 return HASH_TABLE_P (obj) ? Qt : Qnil;
5325 }
5326
5327
5328 DEFUN ("clrhash", Fclrhash, Sclrhash, 1, 1, 0,
5329 doc: /* Clear hash table TABLE. */)
5330 (table)
5331 Lisp_Object table;
5332 {
5333 hash_clear (check_hash_table (table));
5334 return Qnil;
5335 }
5336
5337
5338 DEFUN ("gethash", Fgethash, Sgethash, 2, 3, 0,
5339 doc: /* Look up KEY in TABLE and return its associated value.
5340 If KEY is not found, return DFLT which defaults to nil. */)
5341 (key, table, dflt)
5342 Lisp_Object key, table, dflt;
5343 {
5344 struct Lisp_Hash_Table *h = check_hash_table (table);
5345 int i = hash_lookup (h, key, NULL);
5346 return i >= 0 ? HASH_VALUE (h, i) : dflt;
5347 }
5348
5349
5350 DEFUN ("puthash", Fputhash, Sputhash, 3, 3, 0,
5351 doc: /* Associate KEY with VALUE in hash table TABLE.
5352 If KEY is already present in table, replace its current value with
5353 VALUE. */)
5354 (key, value, table)
5355 Lisp_Object key, value, table;
5356 {
5357 struct Lisp_Hash_Table *h = check_hash_table (table);
5358 int i;
5359 unsigned hash;
5360
5361 i = hash_lookup (h, key, &hash);
5362 if (i >= 0)
5363 HASH_VALUE (h, i) = value;
5364 else
5365 hash_put (h, key, value, hash);
5366
5367 return value;
5368 }
5369
5370
5371 DEFUN ("remhash", Fremhash, Sremhash, 2, 2, 0,
5372 doc: /* Remove KEY from TABLE. */)
5373 (key, table)
5374 Lisp_Object key, table;
5375 {
5376 struct Lisp_Hash_Table *h = check_hash_table (table);
5377 hash_remove (h, key);
5378 return Qnil;
5379 }
5380
5381
5382 DEFUN ("maphash", Fmaphash, Smaphash, 2, 2, 0,
5383 doc: /* Call FUNCTION for all entries in hash table TABLE.
5384 FUNCTION is called with 2 arguments KEY and VALUE. */)
5385 (function, table)
5386 Lisp_Object function, table;
5387 {
5388 struct Lisp_Hash_Table *h = check_hash_table (table);
5389 Lisp_Object args[3];
5390 int i;
5391
5392 for (i = 0; i < HASH_TABLE_SIZE (h); ++i)
5393 if (!NILP (HASH_HASH (h, i)))
5394 {
5395 args[0] = function;
5396 args[1] = HASH_KEY (h, i);
5397 args[2] = HASH_VALUE (h, i);
5398 Ffuncall (3, args);
5399 }
5400
5401 return Qnil;
5402 }
5403
5404
5405 DEFUN ("define-hash-table-test", Fdefine_hash_table_test,
5406 Sdefine_hash_table_test, 3, 3, 0,
5407 doc: /* Define a new hash table test with name NAME, a symbol.
5408
5409 In hash tables created with NAME specified as test, use TEST to
5410 compare keys, and HASH for computing hash codes of keys.
5411
5412 TEST must be a function taking two arguments and returning non-nil if
5413 both arguments are the same. HASH must be a function taking one
5414 argument and return an integer that is the hash code of the argument.
5415 Hash code computation should use the whole value range of integers,
5416 including negative integers. */)
5417 (name, test, hash)
5418 Lisp_Object name, test, hash;
5419 {
5420 return Fput (name, Qhash_table_test, list2 (test, hash));
5421 }
5422
5423
5424 \f
5425 /************************************************************************
5426 MD5
5427 ************************************************************************/
5428
5429 #include "md5.h"
5430 #include "coding.h"
5431
5432 DEFUN ("md5", Fmd5, Smd5, 1, 5, 0,
5433 doc: /* Return MD5 message digest of OBJECT, a buffer or string.
5434
5435 A message digest is a cryptographic checksum of a document, and the
5436 algorithm to calculate it is defined in RFC 1321.
5437
5438 The two optional arguments START and END are character positions
5439 specifying for which part of OBJECT the message digest should be
5440 computed. If nil or omitted, the digest is computed for the whole
5441 OBJECT.
5442
5443 The MD5 message digest is computed from the result of encoding the
5444 text in a coding system, not directly from the internal Emacs form of
5445 the text. The optional fourth argument CODING-SYSTEM specifies which
5446 coding system to encode the text with. It should be the same coding
5447 system that you used or will use when actually writing the text into a
5448 file.
5449
5450 If CODING-SYSTEM is nil or omitted, the default depends on OBJECT. If
5451 OBJECT is a buffer, the default for CODING-SYSTEM is whatever coding
5452 system would be chosen by default for writing this text into a file.
5453
5454 If OBJECT is a string, the most preferred coding system (see the
5455 command `prefer-coding-system') is used.
5456
5457 If NOERROR is non-nil, silently assume the `raw-text' coding if the
5458 guesswork fails. Normally, an error is signaled in such case. */)
5459 (object, start, end, coding_system, noerror)
5460 Lisp_Object object, start, end, coding_system, noerror;
5461 {
5462 unsigned char digest[16];
5463 unsigned char value[33];
5464 int i;
5465 int size;
5466 int size_byte = 0;
5467 int start_char = 0, end_char = 0;
5468 int start_byte = 0, end_byte = 0;
5469 register int b, e;
5470 register struct buffer *bp;
5471 int temp;
5472
5473 if (STRINGP (object))
5474 {
5475 if (NILP (coding_system))
5476 {
5477 /* Decide the coding-system to encode the data with. */
5478
5479 if (STRING_MULTIBYTE (object))
5480 /* use default, we can't guess correct value */
5481 coding_system = SYMBOL_VALUE (XCAR (Vcoding_category_list));
5482 else
5483 coding_system = Qraw_text;
5484 }
5485
5486 if (NILP (Fcoding_system_p (coding_system)))
5487 {
5488 /* Invalid coding system. */
5489
5490 if (!NILP (noerror))
5491 coding_system = Qraw_text;
5492 else
5493 while (1)
5494 Fsignal (Qcoding_system_error, Fcons (coding_system, Qnil));
5495 }
5496
5497 if (STRING_MULTIBYTE (object))
5498 object = code_convert_string1 (object, coding_system, Qnil, 1);
5499
5500 size = SCHARS (object);
5501 size_byte = SBYTES (object);
5502
5503 if (!NILP (start))
5504 {
5505 CHECK_NUMBER (start);
5506
5507 start_char = XINT (start);
5508
5509 if (start_char < 0)
5510 start_char += size;
5511
5512 start_byte = string_char_to_byte (object, start_char);
5513 }
5514
5515 if (NILP (end))
5516 {
5517 end_char = size;
5518 end_byte = size_byte;
5519 }
5520 else
5521 {
5522 CHECK_NUMBER (end);
5523
5524 end_char = XINT (end);
5525
5526 if (end_char < 0)
5527 end_char += size;
5528
5529 end_byte = string_char_to_byte (object, end_char);
5530 }
5531
5532 if (!(0 <= start_char && start_char <= end_char && end_char <= size))
5533 args_out_of_range_3 (object, make_number (start_char),
5534 make_number (end_char));
5535 }
5536 else
5537 {
5538 struct buffer *prev = current_buffer;
5539
5540 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
5541
5542 CHECK_BUFFER (object);
5543
5544 bp = XBUFFER (object);
5545 if (bp != current_buffer)
5546 set_buffer_internal (bp);
5547
5548 if (NILP (start))
5549 b = BEGV;
5550 else
5551 {
5552 CHECK_NUMBER_COERCE_MARKER (start);
5553 b = XINT (start);
5554 }
5555
5556 if (NILP (end))
5557 e = ZV;
5558 else
5559 {
5560 CHECK_NUMBER_COERCE_MARKER (end);
5561 e = XINT (end);
5562 }
5563
5564 if (b > e)
5565 temp = b, b = e, e = temp;
5566
5567 if (!(BEGV <= b && e <= ZV))
5568 args_out_of_range (start, end);
5569
5570 if (NILP (coding_system))
5571 {
5572 /* Decide the coding-system to encode the data with.
5573 See fileio.c:Fwrite-region */
5574
5575 if (!NILP (Vcoding_system_for_write))
5576 coding_system = Vcoding_system_for_write;
5577 else
5578 {
5579 int force_raw_text = 0;
5580
5581 coding_system = XBUFFER (object)->buffer_file_coding_system;
5582 if (NILP (coding_system)
5583 || NILP (Flocal_variable_p (Qbuffer_file_coding_system, Qnil)))
5584 {
5585 coding_system = Qnil;
5586 if (NILP (current_buffer->enable_multibyte_characters))
5587 force_raw_text = 1;
5588 }
5589
5590 if (NILP (coding_system) && !NILP (Fbuffer_file_name(object)))
5591 {
5592 /* Check file-coding-system-alist. */
5593 Lisp_Object args[4], val;
5594
5595 args[0] = Qwrite_region; args[1] = start; args[2] = end;
5596 args[3] = Fbuffer_file_name(object);
5597 val = Ffind_operation_coding_system (4, args);
5598 if (CONSP (val) && !NILP (XCDR (val)))
5599 coding_system = XCDR (val);
5600 }
5601
5602 if (NILP (coding_system)
5603 && !NILP (XBUFFER (object)->buffer_file_coding_system))
5604 {
5605 /* If we still have not decided a coding system, use the
5606 default value of buffer-file-coding-system. */
5607 coding_system = XBUFFER (object)->buffer_file_coding_system;
5608 }
5609
5610 if (!force_raw_text
5611 && !NILP (Ffboundp (Vselect_safe_coding_system_function)))
5612 /* Confirm that VAL can surely encode the current region. */
5613 coding_system = call4 (Vselect_safe_coding_system_function,
5614 make_number (b), make_number (e),
5615 coding_system, Qnil);
5616
5617 if (force_raw_text)
5618 coding_system = Qraw_text;
5619 }
5620
5621 if (NILP (Fcoding_system_p (coding_system)))
5622 {
5623 /* Invalid coding system. */
5624
5625 if (!NILP (noerror))
5626 coding_system = Qraw_text;
5627 else
5628 while (1)
5629 Fsignal (Qcoding_system_error, Fcons (coding_system, Qnil));
5630 }
5631 }
5632
5633 object = make_buffer_string (b, e, 0);
5634 if (prev != current_buffer)
5635 set_buffer_internal (prev);
5636 /* Discard the unwind protect for recovering the current
5637 buffer. */
5638 specpdl_ptr--;
5639
5640 if (STRING_MULTIBYTE (object))
5641 object = code_convert_string1 (object, coding_system, Qnil, 1);
5642 }
5643
5644 md5_buffer (SDATA (object) + start_byte,
5645 SBYTES (object) - (size_byte - end_byte),
5646 digest);
5647
5648 for (i = 0; i < 16; i++)
5649 sprintf (&value[2 * i], "%02x", digest[i]);
5650 value[32] = '\0';
5651
5652 return make_string (value, 32);
5653 }
5654
5655 \f
5656 void
5657 syms_of_fns ()
5658 {
5659 /* Hash table stuff. */
5660 Qhash_table_p = intern ("hash-table-p");
5661 staticpro (&Qhash_table_p);
5662 Qeq = intern ("eq");
5663 staticpro (&Qeq);
5664 Qeql = intern ("eql");
5665 staticpro (&Qeql);
5666 Qequal = intern ("equal");
5667 staticpro (&Qequal);
5668 QCtest = intern (":test");
5669 staticpro (&QCtest);
5670 QCsize = intern (":size");
5671 staticpro (&QCsize);
5672 QCrehash_size = intern (":rehash-size");
5673 staticpro (&QCrehash_size);
5674 QCrehash_threshold = intern (":rehash-threshold");
5675 staticpro (&QCrehash_threshold);
5676 QCweakness = intern (":weakness");
5677 staticpro (&QCweakness);
5678 Qkey = intern ("key");
5679 staticpro (&Qkey);
5680 Qvalue = intern ("value");
5681 staticpro (&Qvalue);
5682 Qhash_table_test = intern ("hash-table-test");
5683 staticpro (&Qhash_table_test);
5684 Qkey_or_value = intern ("key-or-value");
5685 staticpro (&Qkey_or_value);
5686 Qkey_and_value = intern ("key-and-value");
5687 staticpro (&Qkey_and_value);
5688
5689 defsubr (&Ssxhash);
5690 defsubr (&Smake_hash_table);
5691 defsubr (&Scopy_hash_table);
5692 defsubr (&Shash_table_count);
5693 defsubr (&Shash_table_rehash_size);
5694 defsubr (&Shash_table_rehash_threshold);
5695 defsubr (&Shash_table_size);
5696 defsubr (&Shash_table_test);
5697 defsubr (&Shash_table_weakness);
5698 defsubr (&Shash_table_p);
5699 defsubr (&Sclrhash);
5700 defsubr (&Sgethash);
5701 defsubr (&Sputhash);
5702 defsubr (&Sremhash);
5703 defsubr (&Smaphash);
5704 defsubr (&Sdefine_hash_table_test);
5705
5706 Qstring_lessp = intern ("string-lessp");
5707 staticpro (&Qstring_lessp);
5708 Qprovide = intern ("provide");
5709 staticpro (&Qprovide);
5710 Qrequire = intern ("require");
5711 staticpro (&Qrequire);
5712 Qyes_or_no_p_history = intern ("yes-or-no-p-history");
5713 staticpro (&Qyes_or_no_p_history);
5714 Qcursor_in_echo_area = intern ("cursor-in-echo-area");
5715 staticpro (&Qcursor_in_echo_area);
5716 Qwidget_type = intern ("widget-type");
5717 staticpro (&Qwidget_type);
5718
5719 staticpro (&string_char_byte_cache_string);
5720 string_char_byte_cache_string = Qnil;
5721
5722 require_nesting_list = Qnil;
5723 staticpro (&require_nesting_list);
5724
5725 Fset (Qyes_or_no_p_history, Qnil);
5726
5727 DEFVAR_LISP ("features", &Vfeatures,
5728 doc: /* A list of symbols which are the features of the executing emacs.
5729 Used by `featurep' and `require', and altered by `provide'. */);
5730 Vfeatures = Qnil;
5731 Qsubfeatures = intern ("subfeatures");
5732 staticpro (&Qsubfeatures);
5733
5734 #ifdef HAVE_LANGINFO_CODESET
5735 Qcodeset = intern ("codeset");
5736 staticpro (&Qcodeset);
5737 Qdays = intern ("days");
5738 staticpro (&Qdays);
5739 Qmonths = intern ("months");
5740 staticpro (&Qmonths);
5741 Qpaper = intern ("paper");
5742 staticpro (&Qpaper);
5743 #endif /* HAVE_LANGINFO_CODESET */
5744
5745 DEFVAR_BOOL ("use-dialog-box", &use_dialog_box,
5746 doc: /* *Non-nil means mouse commands use dialog boxes to ask questions.
5747 This applies to `y-or-n-p' and `yes-or-no-p' questions asked by commands
5748 invoked by mouse clicks and mouse menu items. */);
5749 use_dialog_box = 1;
5750
5751 DEFVAR_BOOL ("use-file-dialog", &use_file_dialog,
5752 doc: /* *Non-nil means mouse commands use a file dialog to ask for files.
5753 This applies to commands from menus and tool bar buttons. The value of
5754 `use-dialog-box' takes precedence over this variable, so a file dialog is only
5755 used if both `use-dialog-box' and this variable are non-nil. */);
5756 use_file_dialog = 1;
5757
5758 defsubr (&Sidentity);
5759 defsubr (&Srandom);
5760 defsubr (&Slength);
5761 defsubr (&Ssafe_length);
5762 defsubr (&Sstring_bytes);
5763 defsubr (&Sstring_equal);
5764 defsubr (&Scompare_strings);
5765 defsubr (&Sstring_lessp);
5766 defsubr (&Sappend);
5767 defsubr (&Sconcat);
5768 defsubr (&Svconcat);
5769 defsubr (&Scopy_sequence);
5770 defsubr (&Sstring_make_multibyte);
5771 defsubr (&Sstring_make_unibyte);
5772 defsubr (&Sstring_as_multibyte);
5773 defsubr (&Sstring_as_unibyte);
5774 defsubr (&Sstring_to_multibyte);
5775 defsubr (&Scopy_alist);
5776 defsubr (&Ssubstring);
5777 defsubr (&Ssubstring_no_properties);
5778 defsubr (&Snthcdr);
5779 defsubr (&Snth);
5780 defsubr (&Selt);
5781 defsubr (&Smember);
5782 defsubr (&Smemq);
5783 defsubr (&Sassq);
5784 defsubr (&Sassoc);
5785 defsubr (&Srassq);
5786 defsubr (&Srassoc);
5787 defsubr (&Sdelq);
5788 defsubr (&Sdelete);
5789 defsubr (&Snreverse);
5790 defsubr (&Sreverse);
5791 defsubr (&Ssort);
5792 defsubr (&Splist_get);
5793 defsubr (&Ssafe_plist_get);
5794 defsubr (&Sget);
5795 defsubr (&Splist_put);
5796 defsubr (&Sput);
5797 defsubr (&Slax_plist_get);
5798 defsubr (&Slax_plist_put);
5799 defsubr (&Seql);
5800 defsubr (&Sequal);
5801 defsubr (&Sequal_including_properties);
5802 defsubr (&Sfillarray);
5803 defsubr (&Sclear_string);
5804 defsubr (&Schar_table_subtype);
5805 defsubr (&Schar_table_parent);
5806 defsubr (&Sset_char_table_parent);
5807 defsubr (&Schar_table_extra_slot);
5808 defsubr (&Sset_char_table_extra_slot);
5809 defsubr (&Schar_table_range);
5810 defsubr (&Sset_char_table_range);
5811 defsubr (&Sset_char_table_default);
5812 defsubr (&Soptimize_char_table);
5813 defsubr (&Smap_char_table);
5814 defsubr (&Snconc);
5815 defsubr (&Smapcar);
5816 defsubr (&Smapc);
5817 defsubr (&Smapconcat);
5818 defsubr (&Sy_or_n_p);
5819 defsubr (&Syes_or_no_p);
5820 defsubr (&Sload_average);
5821 defsubr (&Sfeaturep);
5822 defsubr (&Srequire);
5823 defsubr (&Sprovide);
5824 defsubr (&Splist_member);
5825 defsubr (&Swidget_put);
5826 defsubr (&Swidget_get);
5827 defsubr (&Swidget_apply);
5828 defsubr (&Sbase64_encode_region);
5829 defsubr (&Sbase64_decode_region);
5830 defsubr (&Sbase64_encode_string);
5831 defsubr (&Sbase64_decode_string);
5832 defsubr (&Smd5);
5833 defsubr (&Slocale_info);
5834 }
5835
5836
5837 void
5838 init_fns ()
5839 {
5840 Vweak_hash_tables = Qnil;
5841 }
5842
5843 /* arch-tag: 787f8219-5b74-46bd-8469-7e1cc475fa31
5844 (do not change this comment) */