]> code.delx.au - gnu-emacs/blob - src/fns.c
(Fset_char_table_range): Don't set slots used as default
[gnu-emacs] / 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 int load_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 ("safe-get", Fsafe_get, Ssafe_get, 2, 2, 0,
2055 doc: /* Return the value of SYMBOL's PROPNAME property.
2056 This is the last value stored with `(put SYMBOL PROPNAME VALUE)'.
2057 This function never signals an error. */)
2058 (symbol, propname)
2059 Lisp_Object symbol, propname;
2060 {
2061 if (!SYMBOLP (symbol))
2062 return Qnil;
2063 return Fsafe_plist_get (XSYMBOL (symbol)->plist, propname);
2064 }
2065
2066 DEFUN ("plist-put", Fplist_put, Splist_put, 3, 3, 0,
2067 doc: /* Change value in PLIST of PROP to VAL.
2068 PLIST is a property list, which is a list of the form
2069 \(PROP1 VALUE1 PROP2 VALUE2 ...). PROP is a symbol and VAL is any object.
2070 If PROP is already a property on the list, its value is set to VAL,
2071 otherwise the new PROP VAL pair is added. The new plist is returned;
2072 use `(setq x (plist-put x prop val))' to be sure to use the new value.
2073 The PLIST is modified by side effects. */)
2074 (plist, prop, val)
2075 Lisp_Object plist;
2076 register Lisp_Object prop;
2077 Lisp_Object val;
2078 {
2079 register Lisp_Object tail, prev;
2080 Lisp_Object newcell;
2081 prev = Qnil;
2082 for (tail = plist; CONSP (tail) && CONSP (XCDR (tail));
2083 tail = XCDR (XCDR (tail)))
2084 {
2085 if (EQ (prop, XCAR (tail)))
2086 {
2087 Fsetcar (XCDR (tail), val);
2088 return plist;
2089 }
2090
2091 prev = tail;
2092 QUIT;
2093 }
2094 newcell = Fcons (prop, Fcons (val, Qnil));
2095 if (NILP (prev))
2096 return newcell;
2097 else
2098 Fsetcdr (XCDR (prev), newcell);
2099 return plist;
2100 }
2101
2102 DEFUN ("put", Fput, Sput, 3, 3, 0,
2103 doc: /* Store SYMBOL's PROPNAME property with value VALUE.
2104 It can be retrieved with `(get SYMBOL PROPNAME)'. */)
2105 (symbol, propname, value)
2106 Lisp_Object symbol, propname, value;
2107 {
2108 CHECK_SYMBOL (symbol);
2109 XSYMBOL (symbol)->plist
2110 = Fplist_put (XSYMBOL (symbol)->plist, propname, value);
2111 return value;
2112 }
2113 \f
2114 DEFUN ("lax-plist-get", Flax_plist_get, Slax_plist_get, 2, 2, 0,
2115 doc: /* Extract a value from a property list, comparing with `equal'.
2116 PLIST is a property list, which is a list of the form
2117 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value
2118 corresponding to the given PROP, or nil if PROP is not
2119 one of the properties on the list. */)
2120 (plist, prop)
2121 Lisp_Object plist;
2122 Lisp_Object prop;
2123 {
2124 Lisp_Object tail;
2125
2126 for (tail = plist;
2127 CONSP (tail) && CONSP (XCDR (tail));
2128 tail = XCDR (XCDR (tail)))
2129 {
2130 if (! NILP (Fequal (prop, XCAR (tail))))
2131 return XCAR (XCDR (tail));
2132
2133 QUIT;
2134 }
2135
2136 if (!NILP (tail))
2137 wrong_type_argument (Qlistp, prop);
2138
2139 return Qnil;
2140 }
2141
2142 DEFUN ("lax-plist-put", Flax_plist_put, Slax_plist_put, 3, 3, 0,
2143 doc: /* Change value in PLIST of PROP to VAL, comparing with `equal'.
2144 PLIST is a property list, which is a list of the form
2145 \(PROP1 VALUE1 PROP2 VALUE2 ...). PROP and VAL are any objects.
2146 If PROP is already a property on the list, its value is set to VAL,
2147 otherwise the new PROP VAL pair is added. The new plist is returned;
2148 use `(setq x (lax-plist-put x prop val))' to be sure to use the new value.
2149 The PLIST is modified by side effects. */)
2150 (plist, prop, val)
2151 Lisp_Object plist;
2152 register Lisp_Object prop;
2153 Lisp_Object val;
2154 {
2155 register Lisp_Object tail, prev;
2156 Lisp_Object newcell;
2157 prev = Qnil;
2158 for (tail = plist; CONSP (tail) && CONSP (XCDR (tail));
2159 tail = XCDR (XCDR (tail)))
2160 {
2161 if (! NILP (Fequal (prop, XCAR (tail))))
2162 {
2163 Fsetcar (XCDR (tail), val);
2164 return plist;
2165 }
2166
2167 prev = tail;
2168 QUIT;
2169 }
2170 newcell = Fcons (prop, Fcons (val, Qnil));
2171 if (NILP (prev))
2172 return newcell;
2173 else
2174 Fsetcdr (XCDR (prev), newcell);
2175 return plist;
2176 }
2177 \f
2178 DEFUN ("eql", Feql, Seql, 2, 2, 0,
2179 doc: /* Return t if the two args are the same Lisp object.
2180 Floating-point numbers of equal value are `eql', but they may not be `eq'. */)
2181 (obj1, obj2)
2182 Lisp_Object obj1, obj2;
2183 {
2184 if (FLOATP (obj1))
2185 return internal_equal (obj1, obj2, 0, 0) ? Qt : Qnil;
2186 else
2187 return EQ (obj1, obj2) ? Qt : Qnil;
2188 }
2189
2190 DEFUN ("equal", Fequal, Sequal, 2, 2, 0,
2191 doc: /* Return t if two Lisp objects have similar structure and contents.
2192 They must have the same data type.
2193 Conses are compared by comparing the cars and the cdrs.
2194 Vectors and strings are compared element by element.
2195 Numbers are compared by value, but integers cannot equal floats.
2196 (Use `=' if you want integers and floats to be able to be equal.)
2197 Symbols must match exactly. */)
2198 (o1, o2)
2199 register Lisp_Object o1, o2;
2200 {
2201 return internal_equal (o1, o2, 0, 0) ? Qt : Qnil;
2202 }
2203
2204 DEFUN ("equal-including-properties", Fequal_including_properties, Sequal_including_properties, 2, 2, 0,
2205 doc: /* Return t if two Lisp objects have similar structure and contents.
2206 This is like `equal' except that it compares the text properties
2207 of strings. (`equal' ignores text properties.) */)
2208 (o1, o2)
2209 register Lisp_Object o1, o2;
2210 {
2211 return internal_equal (o1, o2, 0, 1) ? Qt : Qnil;
2212 }
2213
2214 /* DEPTH is current depth of recursion. Signal an error if it
2215 gets too deep.
2216 PROPS, if non-nil, means compare string text properties too. */
2217
2218 static int
2219 internal_equal (o1, o2, depth, props)
2220 register Lisp_Object o1, o2;
2221 int depth, props;
2222 {
2223 if (depth > 200)
2224 error ("Stack overflow in equal");
2225
2226 tail_recurse:
2227 QUIT;
2228 if (EQ (o1, o2))
2229 return 1;
2230 if (XTYPE (o1) != XTYPE (o2))
2231 return 0;
2232
2233 switch (XTYPE (o1))
2234 {
2235 case Lisp_Float:
2236 {
2237 double d1, d2;
2238
2239 d1 = extract_float (o1);
2240 d2 = extract_float (o2);
2241 /* If d is a NaN, then d != d. Two NaNs should be `equal' even
2242 though they are not =. */
2243 return d1 == d2 || (d1 != d1 && d2 != d2);
2244 }
2245
2246 case Lisp_Cons:
2247 if (!internal_equal (XCAR (o1), XCAR (o2), depth + 1, props))
2248 return 0;
2249 o1 = XCDR (o1);
2250 o2 = XCDR (o2);
2251 goto tail_recurse;
2252
2253 case Lisp_Misc:
2254 if (XMISCTYPE (o1) != XMISCTYPE (o2))
2255 return 0;
2256 if (OVERLAYP (o1))
2257 {
2258 if (!internal_equal (OVERLAY_START (o1), OVERLAY_START (o2),
2259 depth + 1, props)
2260 || !internal_equal (OVERLAY_END (o1), OVERLAY_END (o2),
2261 depth + 1))
2262 return 0;
2263 o1 = XOVERLAY (o1)->plist;
2264 o2 = XOVERLAY (o2)->plist;
2265 goto tail_recurse;
2266 }
2267 if (MARKERP (o1))
2268 {
2269 return (XMARKER (o1)->buffer == XMARKER (o2)->buffer
2270 && (XMARKER (o1)->buffer == 0
2271 || XMARKER (o1)->bytepos == XMARKER (o2)->bytepos));
2272 }
2273 break;
2274
2275 case Lisp_Vectorlike:
2276 {
2277 register int i;
2278 EMACS_INT size = XVECTOR (o1)->size;
2279 /* Pseudovectors have the type encoded in the size field, so this test
2280 actually checks that the objects have the same type as well as the
2281 same size. */
2282 if (XVECTOR (o2)->size != size)
2283 return 0;
2284 /* Boolvectors are compared much like strings. */
2285 if (BOOL_VECTOR_P (o1))
2286 {
2287 int size_in_chars
2288 = ((XBOOL_VECTOR (o1)->size + BOOL_VECTOR_BITS_PER_CHAR - 1)
2289 / BOOL_VECTOR_BITS_PER_CHAR);
2290
2291 if (XBOOL_VECTOR (o1)->size != XBOOL_VECTOR (o2)->size)
2292 return 0;
2293 if (bcmp (XBOOL_VECTOR (o1)->data, XBOOL_VECTOR (o2)->data,
2294 size_in_chars))
2295 return 0;
2296 return 1;
2297 }
2298 if (WINDOW_CONFIGURATIONP (o1))
2299 return compare_window_configurations (o1, o2, 0);
2300
2301 /* Aside from them, only true vectors, char-tables, and compiled
2302 functions are sensible to compare, so eliminate the others now. */
2303 if (size & PSEUDOVECTOR_FLAG)
2304 {
2305 if (!(size & (PVEC_COMPILED | PVEC_CHAR_TABLE)))
2306 return 0;
2307 size &= PSEUDOVECTOR_SIZE_MASK;
2308 }
2309 for (i = 0; i < size; i++)
2310 {
2311 Lisp_Object v1, v2;
2312 v1 = XVECTOR (o1)->contents [i];
2313 v2 = XVECTOR (o2)->contents [i];
2314 if (!internal_equal (v1, v2, depth + 1, props))
2315 return 0;
2316 }
2317 return 1;
2318 }
2319 break;
2320
2321 case Lisp_String:
2322 if (SCHARS (o1) != SCHARS (o2))
2323 return 0;
2324 if (SBYTES (o1) != SBYTES (o2))
2325 return 0;
2326 if (bcmp (SDATA (o1), SDATA (o2),
2327 SBYTES (o1)))
2328 return 0;
2329 if (props && !compare_string_intervals (o1, o2))
2330 return 0;
2331 return 1;
2332
2333 case Lisp_Int:
2334 case Lisp_Symbol:
2335 case Lisp_Type_Limit:
2336 break;
2337 }
2338
2339 return 0;
2340 }
2341 \f
2342 extern Lisp_Object Fmake_char_internal ();
2343
2344 DEFUN ("fillarray", Ffillarray, Sfillarray, 2, 2, 0,
2345 doc: /* Store each element of ARRAY with ITEM.
2346 ARRAY is a vector, string, char-table, or bool-vector. */)
2347 (array, item)
2348 Lisp_Object array, item;
2349 {
2350 register int size, index, charval;
2351 retry:
2352 if (VECTORP (array))
2353 {
2354 register Lisp_Object *p = XVECTOR (array)->contents;
2355 size = XVECTOR (array)->size;
2356 for (index = 0; index < size; index++)
2357 p[index] = item;
2358 }
2359 else if (CHAR_TABLE_P (array))
2360 {
2361 register Lisp_Object *p = XCHAR_TABLE (array)->contents;
2362 size = CHAR_TABLE_ORDINARY_SLOTS;
2363 for (index = 0; index < size; index++)
2364 p[index] = item;
2365 XCHAR_TABLE (array)->defalt = Qnil;
2366 }
2367 else if (STRINGP (array))
2368 {
2369 register unsigned char *p = SDATA (array);
2370 CHECK_NUMBER (item);
2371 charval = XINT (item);
2372 size = SCHARS (array);
2373 if (STRING_MULTIBYTE (array))
2374 {
2375 unsigned char str[MAX_MULTIBYTE_LENGTH];
2376 int len = CHAR_STRING (charval, str);
2377 int size_byte = SBYTES (array);
2378 unsigned char *p1 = p, *endp = p + size_byte;
2379 int i;
2380
2381 if (size != size_byte)
2382 while (p1 < endp)
2383 {
2384 int this_len = MULTIBYTE_FORM_LENGTH (p1, endp - p1);
2385 if (len != this_len)
2386 error ("Attempt to change byte length of a string");
2387 p1 += this_len;
2388 }
2389 for (i = 0; i < size_byte; i++)
2390 *p++ = str[i % len];
2391 }
2392 else
2393 for (index = 0; index < size; index++)
2394 p[index] = charval;
2395 }
2396 else if (BOOL_VECTOR_P (array))
2397 {
2398 register unsigned char *p = XBOOL_VECTOR (array)->data;
2399 int size_in_chars
2400 = ((XBOOL_VECTOR (array)->size + BOOL_VECTOR_BITS_PER_CHAR - 1)
2401 / BOOL_VECTOR_BITS_PER_CHAR);
2402
2403 charval = (! NILP (item) ? -1 : 0);
2404 for (index = 0; index < size_in_chars - 1; index++)
2405 p[index] = charval;
2406 if (index < size_in_chars)
2407 {
2408 /* Mask out bits beyond the vector size. */
2409 if (XBOOL_VECTOR (array)->size % BOOL_VECTOR_BITS_PER_CHAR)
2410 charval &= (1 << (XBOOL_VECTOR (array)->size % BOOL_VECTOR_BITS_PER_CHAR)) - 1;
2411 p[index] = charval;
2412 }
2413 }
2414 else
2415 {
2416 array = wrong_type_argument (Qarrayp, array);
2417 goto retry;
2418 }
2419 return array;
2420 }
2421
2422 DEFUN ("clear-string", Fclear_string, Sclear_string,
2423 1, 1, 0,
2424 doc: /* Clear the contents of STRING.
2425 This makes STRING unibyte and may change its length. */)
2426 (string)
2427 Lisp_Object string;
2428 {
2429 int len;
2430 CHECK_STRING (string);
2431 len = SBYTES (string);
2432 bzero (SDATA (string), len);
2433 STRING_SET_CHARS (string, len);
2434 STRING_SET_UNIBYTE (string);
2435 return Qnil;
2436 }
2437 \f
2438 DEFUN ("char-table-subtype", Fchar_table_subtype, Schar_table_subtype,
2439 1, 1, 0,
2440 doc: /* Return the subtype of char-table CHAR-TABLE. The value is a symbol. */)
2441 (char_table)
2442 Lisp_Object char_table;
2443 {
2444 CHECK_CHAR_TABLE (char_table);
2445
2446 return XCHAR_TABLE (char_table)->purpose;
2447 }
2448
2449 DEFUN ("char-table-parent", Fchar_table_parent, Schar_table_parent,
2450 1, 1, 0,
2451 doc: /* Return the parent char-table of CHAR-TABLE.
2452 The value is either nil or another char-table.
2453 If CHAR-TABLE holds nil for a given character,
2454 then the actual applicable value is inherited from the parent char-table
2455 \(or from its parents, if necessary). */)
2456 (char_table)
2457 Lisp_Object char_table;
2458 {
2459 CHECK_CHAR_TABLE (char_table);
2460
2461 return XCHAR_TABLE (char_table)->parent;
2462 }
2463
2464 DEFUN ("set-char-table-parent", Fset_char_table_parent, Sset_char_table_parent,
2465 2, 2, 0,
2466 doc: /* Set the parent char-table of CHAR-TABLE to PARENT.
2467 Return PARENT. PARENT must be either nil or another char-table. */)
2468 (char_table, parent)
2469 Lisp_Object char_table, parent;
2470 {
2471 Lisp_Object temp;
2472
2473 CHECK_CHAR_TABLE (char_table);
2474
2475 if (!NILP (parent))
2476 {
2477 CHECK_CHAR_TABLE (parent);
2478
2479 for (temp = parent; !NILP (temp); temp = XCHAR_TABLE (temp)->parent)
2480 if (EQ (temp, char_table))
2481 error ("Attempt to make a chartable be its own parent");
2482 }
2483
2484 XCHAR_TABLE (char_table)->parent = parent;
2485
2486 return parent;
2487 }
2488
2489 DEFUN ("char-table-extra-slot", Fchar_table_extra_slot, Schar_table_extra_slot,
2490 2, 2, 0,
2491 doc: /* Return the value of CHAR-TABLE's extra-slot number N. */)
2492 (char_table, n)
2493 Lisp_Object char_table, n;
2494 {
2495 CHECK_CHAR_TABLE (char_table);
2496 CHECK_NUMBER (n);
2497 if (XINT (n) < 0
2498 || XINT (n) >= CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (char_table)))
2499 args_out_of_range (char_table, n);
2500
2501 return XCHAR_TABLE (char_table)->extras[XINT (n)];
2502 }
2503
2504 DEFUN ("set-char-table-extra-slot", Fset_char_table_extra_slot,
2505 Sset_char_table_extra_slot,
2506 3, 3, 0,
2507 doc: /* Set CHAR-TABLE's extra-slot number N to VALUE. */)
2508 (char_table, n, value)
2509 Lisp_Object char_table, n, value;
2510 {
2511 CHECK_CHAR_TABLE (char_table);
2512 CHECK_NUMBER (n);
2513 if (XINT (n) < 0
2514 || XINT (n) >= CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (char_table)))
2515 args_out_of_range (char_table, n);
2516
2517 return XCHAR_TABLE (char_table)->extras[XINT (n)] = value;
2518 }
2519 \f
2520 DEFUN ("char-table-range", Fchar_table_range, Schar_table_range,
2521 2, 2, 0,
2522 doc: /* Return the value in CHAR-TABLE for a range of characters RANGE.
2523 RANGE should be nil (for the default value)
2524 a vector which identifies a character set or a row of a character set,
2525 a character set name, or a character code. */)
2526 (char_table, range)
2527 Lisp_Object char_table, range;
2528 {
2529 CHECK_CHAR_TABLE (char_table);
2530
2531 if (EQ (range, Qnil))
2532 return XCHAR_TABLE (char_table)->defalt;
2533 else if (INTEGERP (range))
2534 return Faref (char_table, range);
2535 else if (SYMBOLP (range))
2536 {
2537 Lisp_Object charset_info;
2538
2539 charset_info = Fget (range, Qcharset);
2540 CHECK_VECTOR (charset_info);
2541
2542 return Faref (char_table,
2543 make_number (XINT (XVECTOR (charset_info)->contents[0])
2544 + 128));
2545 }
2546 else if (VECTORP (range))
2547 {
2548 if (XVECTOR (range)->size == 1)
2549 return Faref (char_table,
2550 make_number (XINT (XVECTOR (range)->contents[0]) + 128));
2551 else
2552 {
2553 int size = XVECTOR (range)->size;
2554 Lisp_Object *val = XVECTOR (range)->contents;
2555 Lisp_Object ch = Fmake_char_internal (size <= 0 ? Qnil : val[0],
2556 size <= 1 ? Qnil : val[1],
2557 size <= 2 ? Qnil : val[2]);
2558 return Faref (char_table, ch);
2559 }
2560 }
2561 else
2562 error ("Invalid RANGE argument to `char-table-range'");
2563 return Qt;
2564 }
2565
2566 DEFUN ("set-char-table-range", Fset_char_table_range, Sset_char_table_range,
2567 3, 3, 0,
2568 doc: /* Set the value in CHAR-TABLE for a range of characters RANGE to VALUE.
2569 RANGE should be t (for all characters), nil (for the default value),
2570 a character set, a vector which identifies a character set, a row of a
2571 character set, or a character code. Return VALUE. */)
2572 (char_table, range, value)
2573 Lisp_Object char_table, range, value;
2574 {
2575 int i;
2576
2577 CHECK_CHAR_TABLE (char_table);
2578
2579 if (EQ (range, Qt))
2580 for (i = 0; i < CHAR_TABLE_ORDINARY_SLOTS; i++)
2581 {
2582 /* Don't set these special slots used for default values of
2583 ascii, eight-bit-control, and eight-bit-graphic. */
2584 if (i != CHAR_TABLE_DEFAULT_SLOT_ASCII
2585 && i != CHAR_TABLE_DEFAULT_SLOT_8_BIT_CONTROL
2586 && i != CHAR_TABLE_DEFAULT_SLOT_8_BIT_GRAPHIC)
2587 XCHAR_TABLE (char_table)->contents[i] = value;
2588 }
2589 else if (EQ (range, Qnil))
2590 XCHAR_TABLE (char_table)->defalt = value;
2591 else if (SYMBOLP (range))
2592 {
2593 Lisp_Object charset_info;
2594 int charset_id;
2595
2596 charset_info = Fget (range, Qcharset);
2597 if (! VECTORP (charset_info)
2598 || ! NATNUMP (AREF (charset_info, 0))
2599 || (charset_id = XINT (AREF (charset_info, 0)),
2600 ! CHARSET_DEFINED_P (charset_id)))
2601 error ("Invalid charset: %s", SDATA (SYMBOL_NAME (range)));
2602
2603 if (charset_id == CHARSET_ASCII)
2604 for (i = 0; i < 128; i++)
2605 XCHAR_TABLE (char_table)->contents[i] = value;
2606 else if (charset_id == CHARSET_8_BIT_CONTROL)
2607 for (i = 128; i < 160; i++)
2608 XCHAR_TABLE (char_table)->contents[i] = value;
2609 else if (charset_id == CHARSET_8_BIT_GRAPHIC)
2610 for (i = 160; i < 256; i++)
2611 XCHAR_TABLE (char_table)->contents[i] = value;
2612 else
2613 XCHAR_TABLE (char_table)->contents[charset_id + 128] = value;
2614 }
2615 else if (INTEGERP (range))
2616 Faset (char_table, range, value);
2617 else if (VECTORP (range))
2618 {
2619 int size = XVECTOR (range)->size;
2620 Lisp_Object *val = XVECTOR (range)->contents;
2621 Lisp_Object ch = Fmake_char_internal (size <= 0 ? Qnil : val[0],
2622 size <= 1 ? Qnil : val[1],
2623 size <= 2 ? Qnil : val[2]);
2624 Faset (char_table, ch, value);
2625 }
2626 else
2627 error ("Invalid RANGE argument to `set-char-table-range'");
2628
2629 return value;
2630 }
2631
2632 DEFUN ("set-char-table-default", Fset_char_table_default,
2633 Sset_char_table_default, 3, 3, 0,
2634 doc: /* Set the default value in CHAR-TABLE for generic character CH to VALUE.
2635 The generic character specifies the group of characters.
2636 If CH is a normal character, set the default value for a group of
2637 characters to which CH belongs.
2638 See also the documentation of `make-char'. */)
2639 (char_table, ch, value)
2640 Lisp_Object char_table, ch, value;
2641 {
2642 int c, charset, code1, code2;
2643 Lisp_Object temp;
2644
2645 CHECK_CHAR_TABLE (char_table);
2646 CHECK_NUMBER (ch);
2647
2648 c = XINT (ch);
2649 SPLIT_CHAR (c, charset, code1, code2);
2650
2651 /* Since we may want to set the default value for a character set
2652 not yet defined, we check only if the character set is in the
2653 valid range or not, instead of it is already defined or not. */
2654 if (! CHARSET_VALID_P (charset))
2655 invalid_character (c);
2656
2657 if (SINGLE_BYTE_CHAR_P (c))
2658 {
2659 /* We use special slots for the default values of single byte
2660 characters. */
2661 int default_slot
2662 = (c < 0x80 ? CHAR_TABLE_DEFAULT_SLOT_ASCII
2663 : c < 0xA0 ? CHAR_TABLE_DEFAULT_SLOT_8_BIT_CONTROL
2664 : CHAR_TABLE_DEFAULT_SLOT_8_BIT_GRAPHIC);
2665
2666 return (XCHAR_TABLE (char_table)->contents[default_slot] = value);
2667 }
2668
2669 /* Even if C is not a generic char, we had better behave as if a
2670 generic char is specified. */
2671 if (!CHARSET_DEFINED_P (charset) || CHARSET_DIMENSION (charset) == 1)
2672 code1 = 0;
2673 temp = XCHAR_TABLE (char_table)->contents[charset + 128];
2674 if (! SUB_CHAR_TABLE_P (temp))
2675 {
2676 temp = make_sub_char_table (temp);
2677 XCHAR_TABLE (char_table)->contents[charset + 128] = temp;
2678 }
2679 if (!code1)
2680 {
2681 XCHAR_TABLE (temp)->defalt = value;
2682 return value;
2683 }
2684 char_table = temp;
2685 temp = XCHAR_TABLE (char_table)->contents[code1];
2686 if (SUB_CHAR_TABLE_P (temp))
2687 XCHAR_TABLE (temp)->defalt = value;
2688 else
2689 XCHAR_TABLE (char_table)->contents[code1] = value;
2690 return value;
2691 }
2692
2693 /* Look up the element in TABLE at index CH,
2694 and return it as an integer.
2695 If the element is nil, return CH itself.
2696 (Actually we do that for any non-integer.) */
2697
2698 int
2699 char_table_translate (table, ch)
2700 Lisp_Object table;
2701 int ch;
2702 {
2703 Lisp_Object value;
2704 value = Faref (table, make_number (ch));
2705 if (! INTEGERP (value))
2706 return ch;
2707 return XINT (value);
2708 }
2709
2710 static void
2711 optimize_sub_char_table (table, chars)
2712 Lisp_Object *table;
2713 int chars;
2714 {
2715 Lisp_Object elt;
2716 int from, to;
2717
2718 if (chars == 94)
2719 from = 33, to = 127;
2720 else
2721 from = 32, to = 128;
2722
2723 if (!SUB_CHAR_TABLE_P (*table))
2724 return;
2725 elt = XCHAR_TABLE (*table)->contents[from++];
2726 for (; from < to; from++)
2727 if (NILP (Fequal (elt, XCHAR_TABLE (*table)->contents[from])))
2728 return;
2729 *table = elt;
2730 }
2731
2732 DEFUN ("optimize-char-table", Foptimize_char_table, Soptimize_char_table,
2733 1, 1, 0, doc: /* Optimize char table TABLE. */)
2734 (table)
2735 Lisp_Object table;
2736 {
2737 Lisp_Object elt;
2738 int dim;
2739 int i, j;
2740
2741 CHECK_CHAR_TABLE (table);
2742
2743 for (i = CHAR_TABLE_SINGLE_BYTE_SLOTS; i < CHAR_TABLE_ORDINARY_SLOTS; i++)
2744 {
2745 elt = XCHAR_TABLE (table)->contents[i];
2746 if (!SUB_CHAR_TABLE_P (elt))
2747 continue;
2748 dim = CHARSET_DIMENSION (i - 128);
2749 if (dim == 2)
2750 for (j = 32; j < SUB_CHAR_TABLE_ORDINARY_SLOTS; j++)
2751 optimize_sub_char_table (XCHAR_TABLE (elt)->contents + j, dim);
2752 optimize_sub_char_table (XCHAR_TABLE (table)->contents + i, dim);
2753 }
2754 return Qnil;
2755 }
2756
2757 \f
2758 /* Map C_FUNCTION or FUNCTION over SUBTABLE, calling it for each
2759 character or group of characters that share a value.
2760 DEPTH is the current depth in the originally specified
2761 chartable, and INDICES contains the vector indices
2762 for the levels our callers have descended.
2763
2764 ARG is passed to C_FUNCTION when that is called. */
2765
2766 void
2767 map_char_table (c_function, function, table, subtable, arg, depth, indices)
2768 void (*c_function) P_ ((Lisp_Object, Lisp_Object, Lisp_Object));
2769 Lisp_Object function, table, subtable, arg, *indices;
2770 int depth;
2771 {
2772 int i, to;
2773 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
2774
2775 GCPRO4 (arg, table, subtable, function);
2776
2777 if (depth == 0)
2778 {
2779 /* At first, handle ASCII and 8-bit European characters. */
2780 for (i = 0; i < CHAR_TABLE_SINGLE_BYTE_SLOTS; i++)
2781 {
2782 Lisp_Object elt= XCHAR_TABLE (subtable)->contents[i];
2783 if (NILP (elt))
2784 elt = XCHAR_TABLE (subtable)->defalt;
2785 if (NILP (elt))
2786 elt = Faref (subtable, make_number (i));
2787 if (c_function)
2788 (*c_function) (arg, make_number (i), elt);
2789 else
2790 call2 (function, make_number (i), elt);
2791 }
2792 #if 0 /* If the char table has entries for higher characters,
2793 we should report them. */
2794 if (NILP (current_buffer->enable_multibyte_characters))
2795 {
2796 UNGCPRO;
2797 return;
2798 }
2799 #endif
2800 to = CHAR_TABLE_ORDINARY_SLOTS;
2801 }
2802 else
2803 {
2804 int charset = XFASTINT (indices[0]) - 128;
2805
2806 i = 32;
2807 to = SUB_CHAR_TABLE_ORDINARY_SLOTS;
2808 if (CHARSET_CHARS (charset) == 94)
2809 i++, to--;
2810 }
2811
2812 for (; i < to; i++)
2813 {
2814 Lisp_Object elt;
2815 int charset;
2816
2817 elt = XCHAR_TABLE (subtable)->contents[i];
2818 XSETFASTINT (indices[depth], i);
2819 charset = XFASTINT (indices[0]) - 128;
2820 if (depth == 0
2821 && (!CHARSET_DEFINED_P (charset)
2822 || charset == CHARSET_8_BIT_CONTROL
2823 || charset == CHARSET_8_BIT_GRAPHIC))
2824 continue;
2825
2826 if (SUB_CHAR_TABLE_P (elt))
2827 {
2828 if (depth >= 3)
2829 error ("Too deep char table");
2830 map_char_table (c_function, function, table, elt, arg, depth + 1, indices);
2831 }
2832 else
2833 {
2834 int c1, c2, c;
2835
2836 c1 = depth >= 1 ? XFASTINT (indices[1]) : 0;
2837 c2 = depth >= 2 ? XFASTINT (indices[2]) : 0;
2838 c = MAKE_CHAR (charset, c1, c2);
2839
2840 if (NILP (elt))
2841 elt = XCHAR_TABLE (subtable)->defalt;
2842 if (NILP (elt))
2843 elt = Faref (table, make_number (c));
2844
2845 if (c_function)
2846 (*c_function) (arg, make_number (c), elt);
2847 else
2848 call2 (function, make_number (c), elt);
2849 }
2850 }
2851 UNGCPRO;
2852 }
2853
2854 static void void_call2 P_ ((Lisp_Object a, Lisp_Object b, Lisp_Object c));
2855 static void
2856 void_call2 (a, b, c)
2857 Lisp_Object a, b, c;
2858 {
2859 call2 (a, b, c);
2860 }
2861
2862 DEFUN ("map-char-table", Fmap_char_table, Smap_char_table,
2863 2, 2, 0,
2864 doc: /* Call FUNCTION for each (normal and generic) characters in CHAR-TABLE.
2865 FUNCTION is called with two arguments--a key and a value.
2866 The key is always a possible IDX argument to `aref'. */)
2867 (function, char_table)
2868 Lisp_Object function, char_table;
2869 {
2870 /* The depth of char table is at most 3. */
2871 Lisp_Object indices[3];
2872
2873 CHECK_CHAR_TABLE (char_table);
2874
2875 /* When Lisp_Object is represented as a union, `call2' cannot directly
2876 be passed to map_char_table because it returns a Lisp_Object rather
2877 than returning nothing.
2878 Casting leads to crashes on some architectures. -stef */
2879 map_char_table (void_call2, Qnil, char_table, char_table, function, 0, indices);
2880 return Qnil;
2881 }
2882
2883 /* Return a value for character C in char-table TABLE. Store the
2884 actual index for that value in *IDX. Ignore the default value of
2885 TABLE. */
2886
2887 Lisp_Object
2888 char_table_ref_and_index (table, c, idx)
2889 Lisp_Object table;
2890 int c, *idx;
2891 {
2892 int charset, c1, c2;
2893 Lisp_Object elt;
2894
2895 if (SINGLE_BYTE_CHAR_P (c))
2896 {
2897 *idx = c;
2898 return XCHAR_TABLE (table)->contents[c];
2899 }
2900 SPLIT_CHAR (c, charset, c1, c2);
2901 elt = XCHAR_TABLE (table)->contents[charset + 128];
2902 *idx = MAKE_CHAR (charset, 0, 0);
2903 if (!SUB_CHAR_TABLE_P (elt))
2904 return elt;
2905 if (c1 < 32 || NILP (XCHAR_TABLE (elt)->contents[c1]))
2906 return XCHAR_TABLE (elt)->defalt;
2907 elt = XCHAR_TABLE (elt)->contents[c1];
2908 *idx = MAKE_CHAR (charset, c1, 0);
2909 if (!SUB_CHAR_TABLE_P (elt))
2910 return elt;
2911 if (c2 < 32 || NILP (XCHAR_TABLE (elt)->contents[c2]))
2912 return XCHAR_TABLE (elt)->defalt;
2913 *idx = c;
2914 return XCHAR_TABLE (elt)->contents[c2];
2915 }
2916
2917 \f
2918 /* ARGSUSED */
2919 Lisp_Object
2920 nconc2 (s1, s2)
2921 Lisp_Object s1, s2;
2922 {
2923 #ifdef NO_ARG_ARRAY
2924 Lisp_Object args[2];
2925 args[0] = s1;
2926 args[1] = s2;
2927 return Fnconc (2, args);
2928 #else
2929 return Fnconc (2, &s1);
2930 #endif /* NO_ARG_ARRAY */
2931 }
2932
2933 DEFUN ("nconc", Fnconc, Snconc, 0, MANY, 0,
2934 doc: /* Concatenate any number of lists by altering them.
2935 Only the last argument is not altered, and need not be a list.
2936 usage: (nconc &rest LISTS) */)
2937 (nargs, args)
2938 int nargs;
2939 Lisp_Object *args;
2940 {
2941 register int argnum;
2942 register Lisp_Object tail, tem, val;
2943
2944 val = tail = Qnil;
2945
2946 for (argnum = 0; argnum < nargs; argnum++)
2947 {
2948 tem = args[argnum];
2949 if (NILP (tem)) continue;
2950
2951 if (NILP (val))
2952 val = tem;
2953
2954 if (argnum + 1 == nargs) break;
2955
2956 if (!CONSP (tem))
2957 tem = wrong_type_argument (Qlistp, tem);
2958
2959 while (CONSP (tem))
2960 {
2961 tail = tem;
2962 tem = XCDR (tail);
2963 QUIT;
2964 }
2965
2966 tem = args[argnum + 1];
2967 Fsetcdr (tail, tem);
2968 if (NILP (tem))
2969 args[argnum + 1] = tail;
2970 }
2971
2972 return val;
2973 }
2974 \f
2975 /* This is the guts of all mapping functions.
2976 Apply FN to each element of SEQ, one by one,
2977 storing the results into elements of VALS, a C vector of Lisp_Objects.
2978 LENI is the length of VALS, which should also be the length of SEQ. */
2979
2980 static void
2981 mapcar1 (leni, vals, fn, seq)
2982 int leni;
2983 Lisp_Object *vals;
2984 Lisp_Object fn, seq;
2985 {
2986 register Lisp_Object tail;
2987 Lisp_Object dummy;
2988 register int i;
2989 struct gcpro gcpro1, gcpro2, gcpro3;
2990
2991 if (vals)
2992 {
2993 /* Don't let vals contain any garbage when GC happens. */
2994 for (i = 0; i < leni; i++)
2995 vals[i] = Qnil;
2996
2997 GCPRO3 (dummy, fn, seq);
2998 gcpro1.var = vals;
2999 gcpro1.nvars = leni;
3000 }
3001 else
3002 GCPRO2 (fn, seq);
3003 /* We need not explicitly protect `tail' because it is used only on lists, and
3004 1) lists are not relocated and 2) the list is marked via `seq' so will not be freed */
3005
3006 if (VECTORP (seq))
3007 {
3008 for (i = 0; i < leni; i++)
3009 {
3010 dummy = XVECTOR (seq)->contents[i];
3011 dummy = call1 (fn, dummy);
3012 if (vals)
3013 vals[i] = dummy;
3014 }
3015 }
3016 else if (BOOL_VECTOR_P (seq))
3017 {
3018 for (i = 0; i < leni; i++)
3019 {
3020 int byte;
3021 byte = XBOOL_VECTOR (seq)->data[i / BOOL_VECTOR_BITS_PER_CHAR];
3022 if (byte & (1 << (i % BOOL_VECTOR_BITS_PER_CHAR)))
3023 dummy = Qt;
3024 else
3025 dummy = Qnil;
3026
3027 dummy = call1 (fn, dummy);
3028 if (vals)
3029 vals[i] = dummy;
3030 }
3031 }
3032 else if (STRINGP (seq))
3033 {
3034 int i_byte;
3035
3036 for (i = 0, i_byte = 0; i < leni;)
3037 {
3038 int c;
3039 int i_before = i;
3040
3041 FETCH_STRING_CHAR_ADVANCE (c, seq, i, i_byte);
3042 XSETFASTINT (dummy, c);
3043 dummy = call1 (fn, dummy);
3044 if (vals)
3045 vals[i_before] = dummy;
3046 }
3047 }
3048 else /* Must be a list, since Flength did not get an error */
3049 {
3050 tail = seq;
3051 for (i = 0; i < leni; i++)
3052 {
3053 dummy = call1 (fn, Fcar (tail));
3054 if (vals)
3055 vals[i] = dummy;
3056 tail = XCDR (tail);
3057 }
3058 }
3059
3060 UNGCPRO;
3061 }
3062
3063 DEFUN ("mapconcat", Fmapconcat, Smapconcat, 3, 3, 0,
3064 doc: /* Apply FUNCTION to each element of SEQUENCE, and concat the results as strings.
3065 In between each pair of results, stick in SEPARATOR. Thus, " " as
3066 SEPARATOR results in spaces between the values returned by FUNCTION.
3067 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
3068 (function, sequence, separator)
3069 Lisp_Object function, sequence, separator;
3070 {
3071 Lisp_Object len;
3072 register int leni;
3073 int nargs;
3074 register Lisp_Object *args;
3075 register int i;
3076 struct gcpro gcpro1;
3077 Lisp_Object ret;
3078 USE_SAFE_ALLOCA;
3079
3080 len = Flength (sequence);
3081 leni = XINT (len);
3082 nargs = leni + leni - 1;
3083 if (nargs < 0) return build_string ("");
3084
3085 SAFE_ALLOCA_LISP (args, nargs);
3086
3087 GCPRO1 (separator);
3088 mapcar1 (leni, args, function, sequence);
3089 UNGCPRO;
3090
3091 for (i = leni - 1; i >= 0; i--)
3092 args[i + i] = args[i];
3093
3094 for (i = 1; i < nargs; i += 2)
3095 args[i] = separator;
3096
3097 ret = Fconcat (nargs, args);
3098 SAFE_FREE ();
3099
3100 return ret;
3101 }
3102
3103 DEFUN ("mapcar", Fmapcar, Smapcar, 2, 2, 0,
3104 doc: /* Apply FUNCTION to each element of SEQUENCE, and make a list of the results.
3105 The result is a list just as long as SEQUENCE.
3106 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
3107 (function, sequence)
3108 Lisp_Object function, sequence;
3109 {
3110 register Lisp_Object len;
3111 register int leni;
3112 register Lisp_Object *args;
3113 Lisp_Object ret;
3114 USE_SAFE_ALLOCA;
3115
3116 len = Flength (sequence);
3117 leni = XFASTINT (len);
3118
3119 SAFE_ALLOCA_LISP (args, leni);
3120
3121 mapcar1 (leni, args, function, sequence);
3122
3123 ret = Flist (leni, args);
3124 SAFE_FREE ();
3125
3126 return ret;
3127 }
3128
3129 DEFUN ("mapc", Fmapc, Smapc, 2, 2, 0,
3130 doc: /* Apply FUNCTION to each element of SEQUENCE for side effects only.
3131 Unlike `mapcar', don't accumulate the results. Return SEQUENCE.
3132 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
3133 (function, sequence)
3134 Lisp_Object function, sequence;
3135 {
3136 register int leni;
3137
3138 leni = XFASTINT (Flength (sequence));
3139 mapcar1 (leni, 0, function, sequence);
3140
3141 return sequence;
3142 }
3143 \f
3144 /* Anything that calls this function must protect from GC! */
3145
3146 DEFUN ("y-or-n-p", Fy_or_n_p, Sy_or_n_p, 1, 1, 0,
3147 doc: /* Ask user a "y or n" question. Return t if answer is "y".
3148 Takes one argument, which is the string to display to ask the question.
3149 It should end in a space; `y-or-n-p' adds `(y or n) ' to it.
3150 No confirmation of the answer is requested; a single character is enough.
3151 Also accepts Space to mean yes, or Delete to mean no. \(Actually, it uses
3152 the bindings in `query-replace-map'; see the documentation of that variable
3153 for more information. In this case, the useful bindings are `act', `skip',
3154 `recenter', and `quit'.\)
3155
3156 Under a windowing system a dialog box will be used if `last-nonmenu-event'
3157 is nil and `use-dialog-box' is non-nil. */)
3158 (prompt)
3159 Lisp_Object prompt;
3160 {
3161 register Lisp_Object obj, key, def, map;
3162 register int answer;
3163 Lisp_Object xprompt;
3164 Lisp_Object args[2];
3165 struct gcpro gcpro1, gcpro2;
3166 int count = SPECPDL_INDEX ();
3167
3168 specbind (Qcursor_in_echo_area, Qt);
3169
3170 map = Fsymbol_value (intern ("query-replace-map"));
3171
3172 CHECK_STRING (prompt);
3173 xprompt = prompt;
3174 GCPRO2 (prompt, xprompt);
3175
3176 #ifdef HAVE_X_WINDOWS
3177 if (display_hourglass_p)
3178 cancel_hourglass ();
3179 #endif
3180
3181 while (1)
3182 {
3183
3184 #ifdef HAVE_MENUS
3185 if ((NILP (last_nonmenu_event) || CONSP (last_nonmenu_event))
3186 && use_dialog_box
3187 && have_menus_p ())
3188 {
3189 Lisp_Object pane, menu;
3190 redisplay_preserve_echo_area (3);
3191 pane = Fcons (Fcons (build_string ("Yes"), Qt),
3192 Fcons (Fcons (build_string ("No"), Qnil),
3193 Qnil));
3194 menu = Fcons (prompt, pane);
3195 obj = Fx_popup_dialog (Qt, menu);
3196 answer = !NILP (obj);
3197 break;
3198 }
3199 #endif /* HAVE_MENUS */
3200 cursor_in_echo_area = 1;
3201 choose_minibuf_frame ();
3202
3203 {
3204 Lisp_Object pargs[3];
3205
3206 /* Colorize prompt according to `minibuffer-prompt' face. */
3207 pargs[0] = build_string ("%s(y or n) ");
3208 pargs[1] = intern ("face");
3209 pargs[2] = intern ("minibuffer-prompt");
3210 args[0] = Fpropertize (3, pargs);
3211 args[1] = xprompt;
3212 Fmessage (2, args);
3213 }
3214
3215 if (minibuffer_auto_raise)
3216 {
3217 Lisp_Object mini_frame;
3218
3219 mini_frame = WINDOW_FRAME (XWINDOW (minibuf_window));
3220
3221 Fraise_frame (mini_frame);
3222 }
3223
3224 obj = read_filtered_event (1, 0, 0, 0);
3225 cursor_in_echo_area = 0;
3226 /* If we need to quit, quit with cursor_in_echo_area = 0. */
3227 QUIT;
3228
3229 key = Fmake_vector (make_number (1), obj);
3230 def = Flookup_key (map, key, Qt);
3231
3232 if (EQ (def, intern ("skip")))
3233 {
3234 answer = 0;
3235 break;
3236 }
3237 else if (EQ (def, intern ("act")))
3238 {
3239 answer = 1;
3240 break;
3241 }
3242 else if (EQ (def, intern ("recenter")))
3243 {
3244 Frecenter (Qnil);
3245 xprompt = prompt;
3246 continue;
3247 }
3248 else if (EQ (def, intern ("quit")))
3249 Vquit_flag = Qt;
3250 /* We want to exit this command for exit-prefix,
3251 and this is the only way to do it. */
3252 else if (EQ (def, intern ("exit-prefix")))
3253 Vquit_flag = Qt;
3254
3255 QUIT;
3256
3257 /* If we don't clear this, then the next call to read_char will
3258 return quit_char again, and we'll enter an infinite loop. */
3259 Vquit_flag = Qnil;
3260
3261 Fding (Qnil);
3262 Fdiscard_input ();
3263 if (EQ (xprompt, prompt))
3264 {
3265 args[0] = build_string ("Please answer y or n. ");
3266 args[1] = prompt;
3267 xprompt = Fconcat (2, args);
3268 }
3269 }
3270 UNGCPRO;
3271
3272 if (! noninteractive)
3273 {
3274 cursor_in_echo_area = -1;
3275 message_with_string (answer ? "%s(y or n) y" : "%s(y or n) n",
3276 xprompt, 0);
3277 }
3278
3279 unbind_to (count, Qnil);
3280 return answer ? Qt : Qnil;
3281 }
3282 \f
3283 /* This is how C code calls `yes-or-no-p' and allows the user
3284 to redefined it.
3285
3286 Anything that calls this function must protect from GC! */
3287
3288 Lisp_Object
3289 do_yes_or_no_p (prompt)
3290 Lisp_Object prompt;
3291 {
3292 return call1 (intern ("yes-or-no-p"), prompt);
3293 }
3294
3295 /* Anything that calls this function must protect from GC! */
3296
3297 DEFUN ("yes-or-no-p", Fyes_or_no_p, Syes_or_no_p, 1, 1, 0,
3298 doc: /* Ask user a yes-or-no question. Return t if answer is yes.
3299 Takes one argument, which is the string to display to ask the question.
3300 It should end in a space; `yes-or-no-p' adds `(yes or no) ' to it.
3301 The user must confirm the answer with RET,
3302 and can edit it until it has been confirmed.
3303
3304 Under a windowing system a dialog box will be used if `last-nonmenu-event'
3305 is nil, and `use-dialog-box' is non-nil. */)
3306 (prompt)
3307 Lisp_Object prompt;
3308 {
3309 register Lisp_Object ans;
3310 Lisp_Object args[2];
3311 struct gcpro gcpro1;
3312
3313 CHECK_STRING (prompt);
3314
3315 #ifdef HAVE_MENUS
3316 if ((NILP (last_nonmenu_event) || CONSP (last_nonmenu_event))
3317 && use_dialog_box
3318 && have_menus_p ())
3319 {
3320 Lisp_Object pane, menu, obj;
3321 redisplay_preserve_echo_area (4);
3322 pane = Fcons (Fcons (build_string ("Yes"), Qt),
3323 Fcons (Fcons (build_string ("No"), Qnil),
3324 Qnil));
3325 GCPRO1 (pane);
3326 menu = Fcons (prompt, pane);
3327 obj = Fx_popup_dialog (Qt, menu);
3328 UNGCPRO;
3329 return obj;
3330 }
3331 #endif /* HAVE_MENUS */
3332
3333 args[0] = prompt;
3334 args[1] = build_string ("(yes or no) ");
3335 prompt = Fconcat (2, args);
3336
3337 GCPRO1 (prompt);
3338
3339 while (1)
3340 {
3341 ans = Fdowncase (Fread_from_minibuffer (prompt, Qnil, Qnil, Qnil,
3342 Qyes_or_no_p_history, Qnil,
3343 Qnil, Qnil));
3344 if (SCHARS (ans) == 3 && !strcmp (SDATA (ans), "yes"))
3345 {
3346 UNGCPRO;
3347 return Qt;
3348 }
3349 if (SCHARS (ans) == 2 && !strcmp (SDATA (ans), "no"))
3350 {
3351 UNGCPRO;
3352 return Qnil;
3353 }
3354
3355 Fding (Qnil);
3356 Fdiscard_input ();
3357 message ("Please answer yes or no.");
3358 Fsleep_for (make_number (2), Qnil);
3359 }
3360 }
3361 \f
3362 DEFUN ("load-average", Fload_average, Sload_average, 0, 1, 0,
3363 doc: /* Return list of 1 minute, 5 minute and 15 minute load averages.
3364
3365 Each of the three load averages is multiplied by 100, then converted
3366 to integer.
3367
3368 When USE-FLOATS is non-nil, floats will be used instead of integers.
3369 These floats are not multiplied by 100.
3370
3371 If the 5-minute or 15-minute load averages are not available, return a
3372 shortened list, containing only those averages which are available.
3373
3374 An error is thrown if the load average can't be obtained. In some
3375 cases making it work would require Emacs being installed setuid or
3376 setgid so that it can read kernel information, and that usually isn't
3377 advisable. */)
3378 (use_floats)
3379 Lisp_Object use_floats;
3380 {
3381 double load_ave[3];
3382 int loads = getloadavg (load_ave, 3);
3383 Lisp_Object ret = Qnil;
3384
3385 if (loads < 0)
3386 error ("load-average not implemented for this operating system");
3387
3388 while (loads-- > 0)
3389 {
3390 Lisp_Object load = (NILP (use_floats) ?
3391 make_number ((int) (100.0 * load_ave[loads]))
3392 : make_float (load_ave[loads]));
3393 ret = Fcons (load, ret);
3394 }
3395
3396 return ret;
3397 }
3398 \f
3399 Lisp_Object Vfeatures, Qsubfeatures;
3400 extern Lisp_Object Vafter_load_alist;
3401
3402 DEFUN ("featurep", Ffeaturep, Sfeaturep, 1, 2, 0,
3403 doc: /* Returns t if FEATURE is present in this Emacs.
3404
3405 Use this to conditionalize execution of lisp code based on the
3406 presence or absence of emacs or environment extensions.
3407 Use `provide' to declare that a feature is available. This function
3408 looks at the value of the variable `features'. The optional argument
3409 SUBFEATURE can be used to check a specific subfeature of FEATURE. */)
3410 (feature, subfeature)
3411 Lisp_Object feature, subfeature;
3412 {
3413 register Lisp_Object tem;
3414 CHECK_SYMBOL (feature);
3415 tem = Fmemq (feature, Vfeatures);
3416 if (!NILP (tem) && !NILP (subfeature))
3417 tem = Fmember (subfeature, Fget (feature, Qsubfeatures));
3418 return (NILP (tem)) ? Qnil : Qt;
3419 }
3420
3421 DEFUN ("provide", Fprovide, Sprovide, 1, 2, 0,
3422 doc: /* Announce that FEATURE is a feature of the current Emacs.
3423 The optional argument SUBFEATURES should be a list of symbols listing
3424 particular subfeatures supported in this version of FEATURE. */)
3425 (feature, subfeatures)
3426 Lisp_Object feature, subfeatures;
3427 {
3428 register Lisp_Object tem;
3429 CHECK_SYMBOL (feature);
3430 CHECK_LIST (subfeatures);
3431 if (!NILP (Vautoload_queue))
3432 Vautoload_queue = Fcons (Fcons (Vfeatures, Qnil), Vautoload_queue);
3433 tem = Fmemq (feature, Vfeatures);
3434 if (NILP (tem))
3435 Vfeatures = Fcons (feature, Vfeatures);
3436 if (!NILP (subfeatures))
3437 Fput (feature, Qsubfeatures, subfeatures);
3438 LOADHIST_ATTACH (Fcons (Qprovide, feature));
3439
3440 /* Run any load-hooks for this file. */
3441 tem = Fassq (feature, Vafter_load_alist);
3442 if (CONSP (tem))
3443 Fprogn (XCDR (tem));
3444
3445 return feature;
3446 }
3447 \f
3448 /* `require' and its subroutines. */
3449
3450 /* List of features currently being require'd, innermost first. */
3451
3452 Lisp_Object require_nesting_list;
3453
3454 Lisp_Object
3455 require_unwind (old_value)
3456 Lisp_Object old_value;
3457 {
3458 return require_nesting_list = old_value;
3459 }
3460
3461 DEFUN ("require", Frequire, Srequire, 1, 3, 0,
3462 doc: /* If feature FEATURE is not loaded, load it from FILENAME.
3463 If FEATURE is not a member of the list `features', then the feature
3464 is not loaded; so load the file FILENAME.
3465 If FILENAME is omitted, the printname of FEATURE is used as the file name,
3466 and `load' will try to load this name appended with the suffix `.elc' or
3467 `.el', in that order. The name without appended suffix will not be used.
3468 If the optional third argument NOERROR is non-nil,
3469 then return nil if the file is not found instead of signaling an error.
3470 Normally the return value is FEATURE.
3471 The normal messages at start and end of loading FILENAME are suppressed. */)
3472 (feature, filename, noerror)
3473 Lisp_Object feature, filename, noerror;
3474 {
3475 register Lisp_Object tem;
3476 struct gcpro gcpro1, gcpro2;
3477
3478 CHECK_SYMBOL (feature);
3479
3480 /* Record the presence of `require' in this file
3481 even if the feature specified is already loaded.
3482 But not more than once in any file,
3483 and not when we aren't loading a file. */
3484 if (load_in_progress)
3485 {
3486 tem = Fcons (Qrequire, feature);
3487 if (NILP (Fmember (tem, Vcurrent_load_list)))
3488 LOADHIST_ATTACH (tem);
3489 }
3490 tem = Fmemq (feature, Vfeatures);
3491
3492 if (NILP (tem))
3493 {
3494 int count = SPECPDL_INDEX ();
3495 int nesting = 0;
3496
3497 /* This is to make sure that loadup.el gives a clear picture
3498 of what files are preloaded and when. */
3499 if (! NILP (Vpurify_flag))
3500 error ("(require %s) while preparing to dump",
3501 SDATA (SYMBOL_NAME (feature)));
3502
3503 /* A certain amount of recursive `require' is legitimate,
3504 but if we require the same feature recursively 3 times,
3505 signal an error. */
3506 tem = require_nesting_list;
3507 while (! NILP (tem))
3508 {
3509 if (! NILP (Fequal (feature, XCAR (tem))))
3510 nesting++;
3511 tem = XCDR (tem);
3512 }
3513 if (nesting > 3)
3514 error ("Recursive `require' for feature `%s'",
3515 SDATA (SYMBOL_NAME (feature)));
3516
3517 /* Update the list for any nested `require's that occur. */
3518 record_unwind_protect (require_unwind, require_nesting_list);
3519 require_nesting_list = Fcons (feature, require_nesting_list);
3520
3521 /* Value saved here is to be restored into Vautoload_queue */
3522 record_unwind_protect (un_autoload, Vautoload_queue);
3523 Vautoload_queue = Qt;
3524
3525 /* Load the file. */
3526 GCPRO2 (feature, filename);
3527 tem = Fload (NILP (filename) ? Fsymbol_name (feature) : filename,
3528 noerror, Qt, Qnil, (NILP (filename) ? Qt : Qnil));
3529 UNGCPRO;
3530
3531 /* If load failed entirely, return nil. */
3532 if (NILP (tem))
3533 return unbind_to (count, Qnil);
3534
3535 tem = Fmemq (feature, Vfeatures);
3536 if (NILP (tem))
3537 error ("Required feature `%s' was not provided",
3538 SDATA (SYMBOL_NAME (feature)));
3539
3540 /* Once loading finishes, don't undo it. */
3541 Vautoload_queue = Qt;
3542 feature = unbind_to (count, feature);
3543 }
3544
3545 return feature;
3546 }
3547 \f
3548 /* Primitives for work of the "widget" library.
3549 In an ideal world, this section would not have been necessary.
3550 However, lisp function calls being as slow as they are, it turns
3551 out that some functions in the widget library (wid-edit.el) are the
3552 bottleneck of Widget operation. Here is their translation to C,
3553 for the sole reason of efficiency. */
3554
3555 DEFUN ("plist-member", Fplist_member, Splist_member, 2, 2, 0,
3556 doc: /* Return non-nil if PLIST has the property PROP.
3557 PLIST is a property list, which is a list of the form
3558 \(PROP1 VALUE1 PROP2 VALUE2 ...\). PROP is a symbol.
3559 Unlike `plist-get', this allows you to distinguish between a missing
3560 property and a property with the value nil.
3561 The value is actually the tail of PLIST whose car is PROP. */)
3562 (plist, prop)
3563 Lisp_Object plist, prop;
3564 {
3565 while (CONSP (plist) && !EQ (XCAR (plist), prop))
3566 {
3567 QUIT;
3568 plist = XCDR (plist);
3569 plist = CDR (plist);
3570 }
3571 return plist;
3572 }
3573
3574 DEFUN ("widget-put", Fwidget_put, Swidget_put, 3, 3, 0,
3575 doc: /* In WIDGET, set PROPERTY to VALUE.
3576 The value can later be retrieved with `widget-get'. */)
3577 (widget, property, value)
3578 Lisp_Object widget, property, value;
3579 {
3580 CHECK_CONS (widget);
3581 XSETCDR (widget, Fplist_put (XCDR (widget), property, value));
3582 return value;
3583 }
3584
3585 DEFUN ("widget-get", Fwidget_get, Swidget_get, 2, 2, 0,
3586 doc: /* In WIDGET, get the value of PROPERTY.
3587 The value could either be specified when the widget was created, or
3588 later with `widget-put'. */)
3589 (widget, property)
3590 Lisp_Object widget, property;
3591 {
3592 Lisp_Object tmp;
3593
3594 while (1)
3595 {
3596 if (NILP (widget))
3597 return Qnil;
3598 CHECK_CONS (widget);
3599 tmp = Fplist_member (XCDR (widget), property);
3600 if (CONSP (tmp))
3601 {
3602 tmp = XCDR (tmp);
3603 return CAR (tmp);
3604 }
3605 tmp = XCAR (widget);
3606 if (NILP (tmp))
3607 return Qnil;
3608 widget = Fget (tmp, Qwidget_type);
3609 }
3610 }
3611
3612 DEFUN ("widget-apply", Fwidget_apply, Swidget_apply, 2, MANY, 0,
3613 doc: /* Apply the value of WIDGET's PROPERTY to the widget itself.
3614 ARGS are passed as extra arguments to the function.
3615 usage: (widget-apply WIDGET PROPERTY &rest ARGS) */)
3616 (nargs, args)
3617 int nargs;
3618 Lisp_Object *args;
3619 {
3620 /* This function can GC. */
3621 Lisp_Object newargs[3];
3622 struct gcpro gcpro1, gcpro2;
3623 Lisp_Object result;
3624
3625 newargs[0] = Fwidget_get (args[0], args[1]);
3626 newargs[1] = args[0];
3627 newargs[2] = Flist (nargs - 2, args + 2);
3628 GCPRO2 (newargs[0], newargs[2]);
3629 result = Fapply (3, newargs);
3630 UNGCPRO;
3631 return result;
3632 }
3633
3634 #ifdef HAVE_LANGINFO_CODESET
3635 #include <langinfo.h>
3636 #endif
3637
3638 DEFUN ("locale-info", Flocale_info, Slocale_info, 1, 1, 0,
3639 doc: /* Access locale data ITEM for the current C locale, if available.
3640 ITEM should be one of the following:
3641
3642 `codeset', returning the character set as a string (locale item CODESET);
3643
3644 `days', returning a 7-element vector of day names (locale items DAY_n);
3645
3646 `months', returning a 12-element vector of month names (locale items MON_n);
3647
3648 `paper', returning a list (WIDTH HEIGHT) for the default paper size,
3649 both measured in milimeters (locale items PAPER_WIDTH, PAPER_HEIGHT).
3650
3651 If the system can't provide such information through a call to
3652 `nl_langinfo', or if ITEM isn't from the list above, return nil.
3653
3654 See also Info node `(libc)Locales'.
3655
3656 The data read from the system are decoded using `locale-coding-system'. */)
3657 (item)
3658 Lisp_Object item;
3659 {
3660 char *str = NULL;
3661 #ifdef HAVE_LANGINFO_CODESET
3662 Lisp_Object val;
3663 if (EQ (item, Qcodeset))
3664 {
3665 str = nl_langinfo (CODESET);
3666 return build_string (str);
3667 }
3668 #ifdef DAY_1
3669 else if (EQ (item, Qdays)) /* e.g. for calendar-day-name-array */
3670 {
3671 Lisp_Object v = Fmake_vector (make_number (7), Qnil);
3672 int days[7] = {DAY_1, DAY_2, DAY_3, DAY_4, DAY_5, DAY_6, DAY_7};
3673 int i;
3674 synchronize_system_time_locale ();
3675 for (i = 0; i < 7; i++)
3676 {
3677 str = nl_langinfo (days[i]);
3678 val = make_unibyte_string (str, strlen (str));
3679 /* Fixme: Is this coding system necessarily right, even if
3680 it is consistent with CODESET? If not, what to do? */
3681 Faset (v, make_number (i),
3682 code_convert_string_norecord (val, Vlocale_coding_system,
3683 0));
3684 }
3685 return v;
3686 }
3687 #endif /* DAY_1 */
3688 #ifdef MON_1
3689 else if (EQ (item, Qmonths)) /* e.g. for calendar-month-name-array */
3690 {
3691 struct Lisp_Vector *p = allocate_vector (12);
3692 int months[12] = {MON_1, MON_2, MON_3, MON_4, MON_5, MON_6, MON_7,
3693 MON_8, MON_9, MON_10, MON_11, MON_12};
3694 int i;
3695 synchronize_system_time_locale ();
3696 for (i = 0; i < 12; i++)
3697 {
3698 str = nl_langinfo (months[i]);
3699 val = make_unibyte_string (str, strlen (str));
3700 p->contents[i] =
3701 code_convert_string_norecord (val, Vlocale_coding_system, 0);
3702 }
3703 XSETVECTOR (val, p);
3704 return val;
3705 }
3706 #endif /* MON_1 */
3707 /* LC_PAPER stuff isn't defined as accessible in glibc as of 2.3.1,
3708 but is in the locale files. This could be used by ps-print. */
3709 #ifdef PAPER_WIDTH
3710 else if (EQ (item, Qpaper))
3711 {
3712 return list2 (make_number (nl_langinfo (PAPER_WIDTH)),
3713 make_number (nl_langinfo (PAPER_HEIGHT)));
3714 }
3715 #endif /* PAPER_WIDTH */
3716 #endif /* HAVE_LANGINFO_CODESET*/
3717 return Qnil;
3718 }
3719 \f
3720 /* base64 encode/decode functions (RFC 2045).
3721 Based on code from GNU recode. */
3722
3723 #define MIME_LINE_LENGTH 76
3724
3725 #define IS_ASCII(Character) \
3726 ((Character) < 128)
3727 #define IS_BASE64(Character) \
3728 (IS_ASCII (Character) && base64_char_to_value[Character] >= 0)
3729 #define IS_BASE64_IGNORABLE(Character) \
3730 ((Character) == ' ' || (Character) == '\t' || (Character) == '\n' \
3731 || (Character) == '\f' || (Character) == '\r')
3732
3733 /* Used by base64_decode_1 to retrieve a non-base64-ignorable
3734 character or return retval if there are no characters left to
3735 process. */
3736 #define READ_QUADRUPLET_BYTE(retval) \
3737 do \
3738 { \
3739 if (i == length) \
3740 { \
3741 if (nchars_return) \
3742 *nchars_return = nchars; \
3743 return (retval); \
3744 } \
3745 c = from[i++]; \
3746 } \
3747 while (IS_BASE64_IGNORABLE (c))
3748
3749 /* Table of characters coding the 64 values. */
3750 static char base64_value_to_char[64] =
3751 {
3752 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', /* 0- 9 */
3753 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', /* 10-19 */
3754 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', /* 20-29 */
3755 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', /* 30-39 */
3756 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', /* 40-49 */
3757 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', /* 50-59 */
3758 '8', '9', '+', '/' /* 60-63 */
3759 };
3760
3761 /* Table of base64 values for first 128 characters. */
3762 static short base64_char_to_value[128] =
3763 {
3764 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0- 9 */
3765 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 10- 19 */
3766 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 20- 29 */
3767 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 30- 39 */
3768 -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, /* 40- 49 */
3769 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, /* 50- 59 */
3770 -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, /* 60- 69 */
3771 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, /* 70- 79 */
3772 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, /* 80- 89 */
3773 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, /* 90- 99 */
3774 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, /* 100-109 */
3775 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, /* 110-119 */
3776 49, 50, 51, -1, -1, -1, -1, -1 /* 120-127 */
3777 };
3778
3779 /* The following diagram shows the logical steps by which three octets
3780 get transformed into four base64 characters.
3781
3782 .--------. .--------. .--------.
3783 |aaaaaabb| |bbbbcccc| |ccdddddd|
3784 `--------' `--------' `--------'
3785 6 2 4 4 2 6
3786 .--------+--------+--------+--------.
3787 |00aaaaaa|00bbbbbb|00cccccc|00dddddd|
3788 `--------+--------+--------+--------'
3789
3790 .--------+--------+--------+--------.
3791 |AAAAAAAA|BBBBBBBB|CCCCCCCC|DDDDDDDD|
3792 `--------+--------+--------+--------'
3793
3794 The octets are divided into 6 bit chunks, which are then encoded into
3795 base64 characters. */
3796
3797
3798 static int base64_encode_1 P_ ((const char *, char *, int, int, int));
3799 static int base64_decode_1 P_ ((const char *, char *, int, int, int *));
3800
3801 DEFUN ("base64-encode-region", Fbase64_encode_region, Sbase64_encode_region,
3802 2, 3, "r",
3803 doc: /* Base64-encode the region between BEG and END.
3804 Return the length of the encoded text.
3805 Optional third argument NO-LINE-BREAK means do not break long lines
3806 into shorter lines. */)
3807 (beg, end, no_line_break)
3808 Lisp_Object beg, end, no_line_break;
3809 {
3810 char *encoded;
3811 int allength, length;
3812 int ibeg, iend, encoded_length;
3813 int old_pos = PT;
3814 USE_SAFE_ALLOCA;
3815
3816 validate_region (&beg, &end);
3817
3818 ibeg = CHAR_TO_BYTE (XFASTINT (beg));
3819 iend = CHAR_TO_BYTE (XFASTINT (end));
3820 move_gap_both (XFASTINT (beg), ibeg);
3821
3822 /* We need to allocate enough room for encoding the text.
3823 We need 33 1/3% more space, plus a newline every 76
3824 characters, and then we round up. */
3825 length = iend - ibeg;
3826 allength = length + length/3 + 1;
3827 allength += allength / MIME_LINE_LENGTH + 1 + 6;
3828
3829 SAFE_ALLOCA (encoded, char *, allength);
3830 encoded_length = base64_encode_1 (BYTE_POS_ADDR (ibeg), encoded, length,
3831 NILP (no_line_break),
3832 !NILP (current_buffer->enable_multibyte_characters));
3833 if (encoded_length > allength)
3834 abort ();
3835
3836 if (encoded_length < 0)
3837 {
3838 /* The encoding wasn't possible. */
3839 SAFE_FREE ();
3840 error ("Multibyte character in data for base64 encoding");
3841 }
3842
3843 /* Now we have encoded the region, so we insert the new contents
3844 and delete the old. (Insert first in order to preserve markers.) */
3845 SET_PT_BOTH (XFASTINT (beg), ibeg);
3846 insert (encoded, encoded_length);
3847 SAFE_FREE ();
3848 del_range_byte (ibeg + encoded_length, iend + encoded_length, 1);
3849
3850 /* If point was outside of the region, restore it exactly; else just
3851 move to the beginning of the region. */
3852 if (old_pos >= XFASTINT (end))
3853 old_pos += encoded_length - (XFASTINT (end) - XFASTINT (beg));
3854 else if (old_pos > XFASTINT (beg))
3855 old_pos = XFASTINT (beg);
3856 SET_PT (old_pos);
3857
3858 /* We return the length of the encoded text. */
3859 return make_number (encoded_length);
3860 }
3861
3862 DEFUN ("base64-encode-string", Fbase64_encode_string, Sbase64_encode_string,
3863 1, 2, 0,
3864 doc: /* Base64-encode STRING and return the result.
3865 Optional second argument NO-LINE-BREAK means do not break long lines
3866 into shorter lines. */)
3867 (string, no_line_break)
3868 Lisp_Object string, no_line_break;
3869 {
3870 int allength, length, encoded_length;
3871 char *encoded;
3872 Lisp_Object encoded_string;
3873 USE_SAFE_ALLOCA;
3874
3875 CHECK_STRING (string);
3876
3877 /* We need to allocate enough room for encoding the text.
3878 We need 33 1/3% more space, plus a newline every 76
3879 characters, and then we round up. */
3880 length = SBYTES (string);
3881 allength = length + length/3 + 1;
3882 allength += allength / MIME_LINE_LENGTH + 1 + 6;
3883
3884 /* We need to allocate enough room for decoding the text. */
3885 SAFE_ALLOCA (encoded, char *, allength);
3886
3887 encoded_length = base64_encode_1 (SDATA (string),
3888 encoded, length, NILP (no_line_break),
3889 STRING_MULTIBYTE (string));
3890 if (encoded_length > allength)
3891 abort ();
3892
3893 if (encoded_length < 0)
3894 {
3895 /* The encoding wasn't possible. */
3896 SAFE_FREE ();
3897 error ("Multibyte character in data for base64 encoding");
3898 }
3899
3900 encoded_string = make_unibyte_string (encoded, encoded_length);
3901 SAFE_FREE ();
3902
3903 return encoded_string;
3904 }
3905
3906 static int
3907 base64_encode_1 (from, to, length, line_break, multibyte)
3908 const char *from;
3909 char *to;
3910 int length;
3911 int line_break;
3912 int multibyte;
3913 {
3914 int counter = 0, i = 0;
3915 char *e = to;
3916 int c;
3917 unsigned int value;
3918 int bytes;
3919
3920 while (i < length)
3921 {
3922 if (multibyte)
3923 {
3924 c = STRING_CHAR_AND_LENGTH (from + i, length - i, bytes);
3925 if (c >= 256)
3926 return -1;
3927 i += bytes;
3928 }
3929 else
3930 c = from[i++];
3931
3932 /* Wrap line every 76 characters. */
3933
3934 if (line_break)
3935 {
3936 if (counter < MIME_LINE_LENGTH / 4)
3937 counter++;
3938 else
3939 {
3940 *e++ = '\n';
3941 counter = 1;
3942 }
3943 }
3944
3945 /* Process first byte of a triplet. */
3946
3947 *e++ = base64_value_to_char[0x3f & c >> 2];
3948 value = (0x03 & c) << 4;
3949
3950 /* Process second byte of a triplet. */
3951
3952 if (i == length)
3953 {
3954 *e++ = base64_value_to_char[value];
3955 *e++ = '=';
3956 *e++ = '=';
3957 break;
3958 }
3959
3960 if (multibyte)
3961 {
3962 c = STRING_CHAR_AND_LENGTH (from + i, length - i, bytes);
3963 if (c >= 256)
3964 return -1;
3965 i += bytes;
3966 }
3967 else
3968 c = from[i++];
3969
3970 *e++ = base64_value_to_char[value | (0x0f & c >> 4)];
3971 value = (0x0f & c) << 2;
3972
3973 /* Process third byte of a triplet. */
3974
3975 if (i == length)
3976 {
3977 *e++ = base64_value_to_char[value];
3978 *e++ = '=';
3979 break;
3980 }
3981
3982 if (multibyte)
3983 {
3984 c = STRING_CHAR_AND_LENGTH (from + i, length - i, bytes);
3985 if (c >= 256)
3986 return -1;
3987 i += bytes;
3988 }
3989 else
3990 c = from[i++];
3991
3992 *e++ = base64_value_to_char[value | (0x03 & c >> 6)];
3993 *e++ = base64_value_to_char[0x3f & c];
3994 }
3995
3996 return e - to;
3997 }
3998
3999
4000 DEFUN ("base64-decode-region", Fbase64_decode_region, Sbase64_decode_region,
4001 2, 2, "r",
4002 doc: /* Base64-decode the region between BEG and END.
4003 Return the length of the decoded text.
4004 If the region can't be decoded, signal an error and don't modify the buffer. */)
4005 (beg, end)
4006 Lisp_Object beg, end;
4007 {
4008 int ibeg, iend, length, allength;
4009 char *decoded;
4010 int old_pos = PT;
4011 int decoded_length;
4012 int inserted_chars;
4013 int multibyte = !NILP (current_buffer->enable_multibyte_characters);
4014 USE_SAFE_ALLOCA;
4015
4016 validate_region (&beg, &end);
4017
4018 ibeg = CHAR_TO_BYTE (XFASTINT (beg));
4019 iend = CHAR_TO_BYTE (XFASTINT (end));
4020
4021 length = iend - ibeg;
4022
4023 /* We need to allocate enough room for decoding the text. If we are
4024 working on a multibyte buffer, each decoded code may occupy at
4025 most two bytes. */
4026 allength = multibyte ? length * 2 : length;
4027 SAFE_ALLOCA (decoded, char *, allength);
4028
4029 move_gap_both (XFASTINT (beg), ibeg);
4030 decoded_length = base64_decode_1 (BYTE_POS_ADDR (ibeg), decoded, length,
4031 multibyte, &inserted_chars);
4032 if (decoded_length > allength)
4033 abort ();
4034
4035 if (decoded_length < 0)
4036 {
4037 /* The decoding wasn't possible. */
4038 SAFE_FREE ();
4039 error ("Invalid base64 data");
4040 }
4041
4042 /* Now we have decoded the region, so we insert the new contents
4043 and delete the old. (Insert first in order to preserve markers.) */
4044 TEMP_SET_PT_BOTH (XFASTINT (beg), ibeg);
4045 insert_1_both (decoded, inserted_chars, decoded_length, 0, 1, 0);
4046 SAFE_FREE ();
4047
4048 /* Delete the original text. */
4049 del_range_both (PT, PT_BYTE, XFASTINT (end) + inserted_chars,
4050 iend + decoded_length, 1);
4051
4052 /* If point was outside of the region, restore it exactly; else just
4053 move to the beginning of the region. */
4054 if (old_pos >= XFASTINT (end))
4055 old_pos += inserted_chars - (XFASTINT (end) - XFASTINT (beg));
4056 else if (old_pos > XFASTINT (beg))
4057 old_pos = XFASTINT (beg);
4058 SET_PT (old_pos > ZV ? ZV : old_pos);
4059
4060 return make_number (inserted_chars);
4061 }
4062
4063 DEFUN ("base64-decode-string", Fbase64_decode_string, Sbase64_decode_string,
4064 1, 1, 0,
4065 doc: /* Base64-decode STRING and return the result. */)
4066 (string)
4067 Lisp_Object string;
4068 {
4069 char *decoded;
4070 int length, decoded_length;
4071 Lisp_Object decoded_string;
4072 USE_SAFE_ALLOCA;
4073
4074 CHECK_STRING (string);
4075
4076 length = SBYTES (string);
4077 /* We need to allocate enough room for decoding the text. */
4078 SAFE_ALLOCA (decoded, char *, length);
4079
4080 /* The decoded result should be unibyte. */
4081 decoded_length = base64_decode_1 (SDATA (string), decoded, length,
4082 0, NULL);
4083 if (decoded_length > length)
4084 abort ();
4085 else if (decoded_length >= 0)
4086 decoded_string = make_unibyte_string (decoded, decoded_length);
4087 else
4088 decoded_string = Qnil;
4089
4090 SAFE_FREE ();
4091 if (!STRINGP (decoded_string))
4092 error ("Invalid base64 data");
4093
4094 return decoded_string;
4095 }
4096
4097 /* Base64-decode the data at FROM of LENGHT bytes into TO. If
4098 MULTIBYTE is nonzero, the decoded result should be in multibyte
4099 form. If NCHARS_RETRUN is not NULL, store the number of produced
4100 characters in *NCHARS_RETURN. */
4101
4102 static int
4103 base64_decode_1 (from, to, length, multibyte, nchars_return)
4104 const char *from;
4105 char *to;
4106 int length;
4107 int multibyte;
4108 int *nchars_return;
4109 {
4110 int i = 0;
4111 char *e = to;
4112 unsigned char c;
4113 unsigned long value;
4114 int nchars = 0;
4115
4116 while (1)
4117 {
4118 /* Process first byte of a quadruplet. */
4119
4120 READ_QUADRUPLET_BYTE (e-to);
4121
4122 if (!IS_BASE64 (c))
4123 return -1;
4124 value = base64_char_to_value[c] << 18;
4125
4126 /* Process second byte of a quadruplet. */
4127
4128 READ_QUADRUPLET_BYTE (-1);
4129
4130 if (!IS_BASE64 (c))
4131 return -1;
4132 value |= base64_char_to_value[c] << 12;
4133
4134 c = (unsigned char) (value >> 16);
4135 if (multibyte)
4136 e += CHAR_STRING (c, e);
4137 else
4138 *e++ = c;
4139 nchars++;
4140
4141 /* Process third byte of a quadruplet. */
4142
4143 READ_QUADRUPLET_BYTE (-1);
4144
4145 if (c == '=')
4146 {
4147 READ_QUADRUPLET_BYTE (-1);
4148
4149 if (c != '=')
4150 return -1;
4151 continue;
4152 }
4153
4154 if (!IS_BASE64 (c))
4155 return -1;
4156 value |= base64_char_to_value[c] << 6;
4157
4158 c = (unsigned char) (0xff & value >> 8);
4159 if (multibyte)
4160 e += CHAR_STRING (c, e);
4161 else
4162 *e++ = c;
4163 nchars++;
4164
4165 /* Process fourth byte of a quadruplet. */
4166
4167 READ_QUADRUPLET_BYTE (-1);
4168
4169 if (c == '=')
4170 continue;
4171
4172 if (!IS_BASE64 (c))
4173 return -1;
4174 value |= base64_char_to_value[c];
4175
4176 c = (unsigned char) (0xff & value);
4177 if (multibyte)
4178 e += CHAR_STRING (c, e);
4179 else
4180 *e++ = c;
4181 nchars++;
4182 }
4183 }
4184
4185
4186 \f
4187 /***********************************************************************
4188 ***** *****
4189 ***** Hash Tables *****
4190 ***** *****
4191 ***********************************************************************/
4192
4193 /* Implemented by gerd@gnu.org. This hash table implementation was
4194 inspired by CMUCL hash tables. */
4195
4196 /* Ideas:
4197
4198 1. For small tables, association lists are probably faster than
4199 hash tables because they have lower overhead.
4200
4201 For uses of hash tables where the O(1) behavior of table
4202 operations is not a requirement, it might therefore be a good idea
4203 not to hash. Instead, we could just do a linear search in the
4204 key_and_value vector of the hash table. This could be done
4205 if a `:linear-search t' argument is given to make-hash-table. */
4206
4207
4208 /* The list of all weak hash tables. Don't staticpro this one. */
4209
4210 Lisp_Object Vweak_hash_tables;
4211
4212 /* Various symbols. */
4213
4214 Lisp_Object Qhash_table_p, Qeq, Qeql, Qequal, Qkey, Qvalue;
4215 Lisp_Object QCtest, QCsize, QCrehash_size, QCrehash_threshold, QCweakness;
4216 Lisp_Object Qhash_table_test, Qkey_or_value, Qkey_and_value;
4217
4218 /* Function prototypes. */
4219
4220 static struct Lisp_Hash_Table *check_hash_table P_ ((Lisp_Object));
4221 static int get_key_arg P_ ((Lisp_Object, int, Lisp_Object *, char *));
4222 static void maybe_resize_hash_table P_ ((struct Lisp_Hash_Table *));
4223 static int cmpfn_eql P_ ((struct Lisp_Hash_Table *, Lisp_Object, unsigned,
4224 Lisp_Object, unsigned));
4225 static int cmpfn_equal P_ ((struct Lisp_Hash_Table *, Lisp_Object, unsigned,
4226 Lisp_Object, unsigned));
4227 static int cmpfn_user_defined P_ ((struct Lisp_Hash_Table *, Lisp_Object,
4228 unsigned, Lisp_Object, unsigned));
4229 static unsigned hashfn_eq P_ ((struct Lisp_Hash_Table *, Lisp_Object));
4230 static unsigned hashfn_eql P_ ((struct Lisp_Hash_Table *, Lisp_Object));
4231 static unsigned hashfn_equal P_ ((struct Lisp_Hash_Table *, Lisp_Object));
4232 static unsigned hashfn_user_defined P_ ((struct Lisp_Hash_Table *,
4233 Lisp_Object));
4234 static unsigned sxhash_string P_ ((unsigned char *, int));
4235 static unsigned sxhash_list P_ ((Lisp_Object, int));
4236 static unsigned sxhash_vector P_ ((Lisp_Object, int));
4237 static unsigned sxhash_bool_vector P_ ((Lisp_Object));
4238 static int sweep_weak_table P_ ((struct Lisp_Hash_Table *, int));
4239
4240
4241 \f
4242 /***********************************************************************
4243 Utilities
4244 ***********************************************************************/
4245
4246 /* If OBJ is a Lisp hash table, return a pointer to its struct
4247 Lisp_Hash_Table. Otherwise, signal an error. */
4248
4249 static struct Lisp_Hash_Table *
4250 check_hash_table (obj)
4251 Lisp_Object obj;
4252 {
4253 CHECK_HASH_TABLE (obj);
4254 return XHASH_TABLE (obj);
4255 }
4256
4257
4258 /* Value is the next integer I >= N, N >= 0 which is "almost" a prime
4259 number. */
4260
4261 int
4262 next_almost_prime (n)
4263 int n;
4264 {
4265 if (n % 2 == 0)
4266 n += 1;
4267 if (n % 3 == 0)
4268 n += 2;
4269 if (n % 7 == 0)
4270 n += 4;
4271 return n;
4272 }
4273
4274
4275 /* Find KEY in ARGS which has size NARGS. Don't consider indices for
4276 which USED[I] is non-zero. If found at index I in ARGS, set
4277 USED[I] and USED[I + 1] to 1, and return I + 1. Otherwise return
4278 -1. This function is used to extract a keyword/argument pair from
4279 a DEFUN parameter list. */
4280
4281 static int
4282 get_key_arg (key, nargs, args, used)
4283 Lisp_Object key;
4284 int nargs;
4285 Lisp_Object *args;
4286 char *used;
4287 {
4288 int i;
4289
4290 for (i = 0; i < nargs - 1; ++i)
4291 if (!used[i] && EQ (args[i], key))
4292 break;
4293
4294 if (i >= nargs - 1)
4295 i = -1;
4296 else
4297 {
4298 used[i++] = 1;
4299 used[i] = 1;
4300 }
4301
4302 return i;
4303 }
4304
4305
4306 /* Return a Lisp vector which has the same contents as VEC but has
4307 size NEW_SIZE, NEW_SIZE >= VEC->size. Entries in the resulting
4308 vector that are not copied from VEC are set to INIT. */
4309
4310 Lisp_Object
4311 larger_vector (vec, new_size, init)
4312 Lisp_Object vec;
4313 int new_size;
4314 Lisp_Object init;
4315 {
4316 struct Lisp_Vector *v;
4317 int i, old_size;
4318
4319 xassert (VECTORP (vec));
4320 old_size = XVECTOR (vec)->size;
4321 xassert (new_size >= old_size);
4322
4323 v = allocate_vector (new_size);
4324 bcopy (XVECTOR (vec)->contents, v->contents,
4325 old_size * sizeof *v->contents);
4326 for (i = old_size; i < new_size; ++i)
4327 v->contents[i] = init;
4328 XSETVECTOR (vec, v);
4329 return vec;
4330 }
4331
4332
4333 /***********************************************************************
4334 Low-level Functions
4335 ***********************************************************************/
4336
4337 /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code
4338 HASH2 in hash table H using `eql'. Value is non-zero if KEY1 and
4339 KEY2 are the same. */
4340
4341 static int
4342 cmpfn_eql (h, key1, hash1, key2, hash2)
4343 struct Lisp_Hash_Table *h;
4344 Lisp_Object key1, key2;
4345 unsigned hash1, hash2;
4346 {
4347 return (FLOATP (key1)
4348 && FLOATP (key2)
4349 && XFLOAT_DATA (key1) == XFLOAT_DATA (key2));
4350 }
4351
4352
4353 /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code
4354 HASH2 in hash table H using `equal'. Value is non-zero if KEY1 and
4355 KEY2 are the same. */
4356
4357 static int
4358 cmpfn_equal (h, key1, hash1, key2, hash2)
4359 struct Lisp_Hash_Table *h;
4360 Lisp_Object key1, key2;
4361 unsigned hash1, hash2;
4362 {
4363 return hash1 == hash2 && !NILP (Fequal (key1, key2));
4364 }
4365
4366
4367 /* Compare KEY1 which has hash code HASH1, and KEY2 with hash code
4368 HASH2 in hash table H using H->user_cmp_function. Value is non-zero
4369 if KEY1 and KEY2 are the same. */
4370
4371 static int
4372 cmpfn_user_defined (h, key1, hash1, key2, hash2)
4373 struct Lisp_Hash_Table *h;
4374 Lisp_Object key1, key2;
4375 unsigned hash1, hash2;
4376 {
4377 if (hash1 == hash2)
4378 {
4379 Lisp_Object args[3];
4380
4381 args[0] = h->user_cmp_function;
4382 args[1] = key1;
4383 args[2] = key2;
4384 return !NILP (Ffuncall (3, args));
4385 }
4386 else
4387 return 0;
4388 }
4389
4390
4391 /* Value is a hash code for KEY for use in hash table H which uses
4392 `eq' to compare keys. The hash code returned is guaranteed to fit
4393 in a Lisp integer. */
4394
4395 static unsigned
4396 hashfn_eq (h, key)
4397 struct Lisp_Hash_Table *h;
4398 Lisp_Object key;
4399 {
4400 unsigned hash = XUINT (key) ^ XGCTYPE (key);
4401 xassert ((hash & ~INTMASK) == 0);
4402 return hash;
4403 }
4404
4405
4406 /* Value is a hash code for KEY for use in hash table H which uses
4407 `eql' to compare keys. The hash code returned is guaranteed to fit
4408 in a Lisp integer. */
4409
4410 static unsigned
4411 hashfn_eql (h, key)
4412 struct Lisp_Hash_Table *h;
4413 Lisp_Object key;
4414 {
4415 unsigned hash;
4416 if (FLOATP (key))
4417 hash = sxhash (key, 0);
4418 else
4419 hash = XUINT (key) ^ XGCTYPE (key);
4420 xassert ((hash & ~INTMASK) == 0);
4421 return hash;
4422 }
4423
4424
4425 /* Value is a hash code for KEY for use in hash table H which uses
4426 `equal' to compare keys. The hash code returned is guaranteed to fit
4427 in a Lisp integer. */
4428
4429 static unsigned
4430 hashfn_equal (h, key)
4431 struct Lisp_Hash_Table *h;
4432 Lisp_Object key;
4433 {
4434 unsigned hash = sxhash (key, 0);
4435 xassert ((hash & ~INTMASK) == 0);
4436 return hash;
4437 }
4438
4439
4440 /* Value is a hash code for KEY for use in hash table H which uses as
4441 user-defined function to compare keys. The hash code returned is
4442 guaranteed to fit in a Lisp integer. */
4443
4444 static unsigned
4445 hashfn_user_defined (h, key)
4446 struct Lisp_Hash_Table *h;
4447 Lisp_Object key;
4448 {
4449 Lisp_Object args[2], hash;
4450
4451 args[0] = h->user_hash_function;
4452 args[1] = key;
4453 hash = Ffuncall (2, args);
4454 if (!INTEGERP (hash))
4455 Fsignal (Qerror,
4456 list2 (build_string ("Invalid hash code returned from \
4457 user-supplied hash function"),
4458 hash));
4459 return XUINT (hash);
4460 }
4461
4462
4463 /* Create and initialize a new hash table.
4464
4465 TEST specifies the test the hash table will use to compare keys.
4466 It must be either one of the predefined tests `eq', `eql' or
4467 `equal' or a symbol denoting a user-defined test named TEST with
4468 test and hash functions USER_TEST and USER_HASH.
4469
4470 Give the table initial capacity SIZE, SIZE >= 0, an integer.
4471
4472 If REHASH_SIZE is an integer, it must be > 0, and this hash table's
4473 new size when it becomes full is computed by adding REHASH_SIZE to
4474 its old size. If REHASH_SIZE is a float, it must be > 1.0, and the
4475 table's new size is computed by multiplying its old size with
4476 REHASH_SIZE.
4477
4478 REHASH_THRESHOLD must be a float <= 1.0, and > 0. The table will
4479 be resized when the ratio of (number of entries in the table) /
4480 (table size) is >= REHASH_THRESHOLD.
4481
4482 WEAK specifies the weakness of the table. If non-nil, it must be
4483 one of the symbols `key', `value', `key-or-value', or `key-and-value'. */
4484
4485 Lisp_Object
4486 make_hash_table (test, size, rehash_size, rehash_threshold, weak,
4487 user_test, user_hash)
4488 Lisp_Object test, size, rehash_size, rehash_threshold, weak;
4489 Lisp_Object user_test, user_hash;
4490 {
4491 struct Lisp_Hash_Table *h;
4492 Lisp_Object table;
4493 int index_size, i, sz;
4494
4495 /* Preconditions. */
4496 xassert (SYMBOLP (test));
4497 xassert (INTEGERP (size) && XINT (size) >= 0);
4498 xassert ((INTEGERP (rehash_size) && XINT (rehash_size) > 0)
4499 || (FLOATP (rehash_size) && XFLOATINT (rehash_size) > 1.0));
4500 xassert (FLOATP (rehash_threshold)
4501 && XFLOATINT (rehash_threshold) > 0
4502 && XFLOATINT (rehash_threshold) <= 1.0);
4503
4504 if (XFASTINT (size) == 0)
4505 size = make_number (1);
4506
4507 /* Allocate a table and initialize it. */
4508 h = allocate_hash_table ();
4509
4510 /* Initialize hash table slots. */
4511 sz = XFASTINT (size);
4512
4513 h->test = test;
4514 if (EQ (test, Qeql))
4515 {
4516 h->cmpfn = cmpfn_eql;
4517 h->hashfn = hashfn_eql;
4518 }
4519 else if (EQ (test, Qeq))
4520 {
4521 h->cmpfn = NULL;
4522 h->hashfn = hashfn_eq;
4523 }
4524 else if (EQ (test, Qequal))
4525 {
4526 h->cmpfn = cmpfn_equal;
4527 h->hashfn = hashfn_equal;
4528 }
4529 else
4530 {
4531 h->user_cmp_function = user_test;
4532 h->user_hash_function = user_hash;
4533 h->cmpfn = cmpfn_user_defined;
4534 h->hashfn = hashfn_user_defined;
4535 }
4536
4537 h->weak = weak;
4538 h->rehash_threshold = rehash_threshold;
4539 h->rehash_size = rehash_size;
4540 h->count = make_number (0);
4541 h->key_and_value = Fmake_vector (make_number (2 * sz), Qnil);
4542 h->hash = Fmake_vector (size, Qnil);
4543 h->next = Fmake_vector (size, Qnil);
4544 /* Cast to int here avoids losing with gcc 2.95 on Tru64/Alpha... */
4545 index_size = next_almost_prime ((int) (sz / XFLOATINT (rehash_threshold)));
4546 h->index = Fmake_vector (make_number (index_size), Qnil);
4547
4548 /* Set up the free list. */
4549 for (i = 0; i < sz - 1; ++i)
4550 HASH_NEXT (h, i) = make_number (i + 1);
4551 h->next_free = make_number (0);
4552
4553 XSET_HASH_TABLE (table, h);
4554 xassert (HASH_TABLE_P (table));
4555 xassert (XHASH_TABLE (table) == h);
4556
4557 /* Maybe add this hash table to the list of all weak hash tables. */
4558 if (NILP (h->weak))
4559 h->next_weak = Qnil;
4560 else
4561 {
4562 h->next_weak = Vweak_hash_tables;
4563 Vweak_hash_tables = table;
4564 }
4565
4566 return table;
4567 }
4568
4569
4570 /* Return a copy of hash table H1. Keys and values are not copied,
4571 only the table itself is. */
4572
4573 Lisp_Object
4574 copy_hash_table (h1)
4575 struct Lisp_Hash_Table *h1;
4576 {
4577 Lisp_Object table;
4578 struct Lisp_Hash_Table *h2;
4579 struct Lisp_Vector *next;
4580
4581 h2 = allocate_hash_table ();
4582 next = h2->vec_next;
4583 bcopy (h1, h2, sizeof *h2);
4584 h2->vec_next = next;
4585 h2->key_and_value = Fcopy_sequence (h1->key_and_value);
4586 h2->hash = Fcopy_sequence (h1->hash);
4587 h2->next = Fcopy_sequence (h1->next);
4588 h2->index = Fcopy_sequence (h1->index);
4589 XSET_HASH_TABLE (table, h2);
4590
4591 /* Maybe add this hash table to the list of all weak hash tables. */
4592 if (!NILP (h2->weak))
4593 {
4594 h2->next_weak = Vweak_hash_tables;
4595 Vweak_hash_tables = table;
4596 }
4597
4598 return table;
4599 }
4600
4601
4602 /* Resize hash table H if it's too full. If H cannot be resized
4603 because it's already too large, throw an error. */
4604
4605 static INLINE void
4606 maybe_resize_hash_table (h)
4607 struct Lisp_Hash_Table *h;
4608 {
4609 if (NILP (h->next_free))
4610 {
4611 int old_size = HASH_TABLE_SIZE (h);
4612 int i, new_size, index_size;
4613
4614 if (INTEGERP (h->rehash_size))
4615 new_size = old_size + XFASTINT (h->rehash_size);
4616 else
4617 new_size = old_size * XFLOATINT (h->rehash_size);
4618 new_size = max (old_size + 1, new_size);
4619 index_size = next_almost_prime ((int)
4620 (new_size
4621 / XFLOATINT (h->rehash_threshold)));
4622 if (max (index_size, 2 * new_size) > MOST_POSITIVE_FIXNUM)
4623 error ("Hash table too large to resize");
4624
4625 h->key_and_value = larger_vector (h->key_and_value, 2 * new_size, Qnil);
4626 h->next = larger_vector (h->next, new_size, Qnil);
4627 h->hash = larger_vector (h->hash, new_size, Qnil);
4628 h->index = Fmake_vector (make_number (index_size), Qnil);
4629
4630 /* Update the free list. Do it so that new entries are added at
4631 the end of the free list. This makes some operations like
4632 maphash faster. */
4633 for (i = old_size; i < new_size - 1; ++i)
4634 HASH_NEXT (h, i) = make_number (i + 1);
4635
4636 if (!NILP (h->next_free))
4637 {
4638 Lisp_Object last, next;
4639
4640 last = h->next_free;
4641 while (next = HASH_NEXT (h, XFASTINT (last)),
4642 !NILP (next))
4643 last = next;
4644
4645 HASH_NEXT (h, XFASTINT (last)) = make_number (old_size);
4646 }
4647 else
4648 XSETFASTINT (h->next_free, old_size);
4649
4650 /* Rehash. */
4651 for (i = 0; i < old_size; ++i)
4652 if (!NILP (HASH_HASH (h, i)))
4653 {
4654 unsigned hash_code = XUINT (HASH_HASH (h, i));
4655 int start_of_bucket = hash_code % XVECTOR (h->index)->size;
4656 HASH_NEXT (h, i) = HASH_INDEX (h, start_of_bucket);
4657 HASH_INDEX (h, start_of_bucket) = make_number (i);
4658 }
4659 }
4660 }
4661
4662
4663 /* Lookup KEY in hash table H. If HASH is non-null, return in *HASH
4664 the hash code of KEY. Value is the index of the entry in H
4665 matching KEY, or -1 if not found. */
4666
4667 int
4668 hash_lookup (h, key, hash)
4669 struct Lisp_Hash_Table *h;
4670 Lisp_Object key;
4671 unsigned *hash;
4672 {
4673 unsigned hash_code;
4674 int start_of_bucket;
4675 Lisp_Object idx;
4676
4677 hash_code = h->hashfn (h, key);
4678 if (hash)
4679 *hash = hash_code;
4680
4681 start_of_bucket = hash_code % XVECTOR (h->index)->size;
4682 idx = HASH_INDEX (h, start_of_bucket);
4683
4684 /* We need not gcpro idx since it's either an integer or nil. */
4685 while (!NILP (idx))
4686 {
4687 int i = XFASTINT (idx);
4688 if (EQ (key, HASH_KEY (h, i))
4689 || (h->cmpfn
4690 && h->cmpfn (h, key, hash_code,
4691 HASH_KEY (h, i), XUINT (HASH_HASH (h, i)))))
4692 break;
4693 idx = HASH_NEXT (h, i);
4694 }
4695
4696 return NILP (idx) ? -1 : XFASTINT (idx);
4697 }
4698
4699
4700 /* Put an entry into hash table H that associates KEY with VALUE.
4701 HASH is a previously computed hash code of KEY.
4702 Value is the index of the entry in H matching KEY. */
4703
4704 int
4705 hash_put (h, key, value, hash)
4706 struct Lisp_Hash_Table *h;
4707 Lisp_Object key, value;
4708 unsigned hash;
4709 {
4710 int start_of_bucket, i;
4711
4712 xassert ((hash & ~INTMASK) == 0);
4713
4714 /* Increment count after resizing because resizing may fail. */
4715 maybe_resize_hash_table (h);
4716 h->count = make_number (XFASTINT (h->count) + 1);
4717
4718 /* Store key/value in the key_and_value vector. */
4719 i = XFASTINT (h->next_free);
4720 h->next_free = HASH_NEXT (h, i);
4721 HASH_KEY (h, i) = key;
4722 HASH_VALUE (h, i) = value;
4723
4724 /* Remember its hash code. */
4725 HASH_HASH (h, i) = make_number (hash);
4726
4727 /* Add new entry to its collision chain. */
4728 start_of_bucket = hash % XVECTOR (h->index)->size;
4729 HASH_NEXT (h, i) = HASH_INDEX (h, start_of_bucket);
4730 HASH_INDEX (h, start_of_bucket) = make_number (i);
4731 return i;
4732 }
4733
4734
4735 /* Remove the entry matching KEY from hash table H, if there is one. */
4736
4737 void
4738 hash_remove (h, key)
4739 struct Lisp_Hash_Table *h;
4740 Lisp_Object key;
4741 {
4742 unsigned hash_code;
4743 int start_of_bucket;
4744 Lisp_Object idx, prev;
4745
4746 hash_code = h->hashfn (h, key);
4747 start_of_bucket = hash_code % XVECTOR (h->index)->size;
4748 idx = HASH_INDEX (h, start_of_bucket);
4749 prev = Qnil;
4750
4751 /* We need not gcpro idx, prev since they're either integers or nil. */
4752 while (!NILP (idx))
4753 {
4754 int i = XFASTINT (idx);
4755
4756 if (EQ (key, HASH_KEY (h, i))
4757 || (h->cmpfn
4758 && h->cmpfn (h, key, hash_code,
4759 HASH_KEY (h, i), XUINT (HASH_HASH (h, i)))))
4760 {
4761 /* Take entry out of collision chain. */
4762 if (NILP (prev))
4763 HASH_INDEX (h, start_of_bucket) = HASH_NEXT (h, i);
4764 else
4765 HASH_NEXT (h, XFASTINT (prev)) = HASH_NEXT (h, i);
4766
4767 /* Clear slots in key_and_value and add the slots to
4768 the free list. */
4769 HASH_KEY (h, i) = HASH_VALUE (h, i) = HASH_HASH (h, i) = Qnil;
4770 HASH_NEXT (h, i) = h->next_free;
4771 h->next_free = make_number (i);
4772 h->count = make_number (XFASTINT (h->count) - 1);
4773 xassert (XINT (h->count) >= 0);
4774 break;
4775 }
4776 else
4777 {
4778 prev = idx;
4779 idx = HASH_NEXT (h, i);
4780 }
4781 }
4782 }
4783
4784
4785 /* Clear hash table H. */
4786
4787 void
4788 hash_clear (h)
4789 struct Lisp_Hash_Table *h;
4790 {
4791 if (XFASTINT (h->count) > 0)
4792 {
4793 int i, size = HASH_TABLE_SIZE (h);
4794
4795 for (i = 0; i < size; ++i)
4796 {
4797 HASH_NEXT (h, i) = i < size - 1 ? make_number (i + 1) : Qnil;
4798 HASH_KEY (h, i) = Qnil;
4799 HASH_VALUE (h, i) = Qnil;
4800 HASH_HASH (h, i) = Qnil;
4801 }
4802
4803 for (i = 0; i < XVECTOR (h->index)->size; ++i)
4804 XVECTOR (h->index)->contents[i] = Qnil;
4805
4806 h->next_free = make_number (0);
4807 h->count = make_number (0);
4808 }
4809 }
4810
4811
4812 \f
4813 /************************************************************************
4814 Weak Hash Tables
4815 ************************************************************************/
4816
4817 /* Sweep weak hash table H. REMOVE_ENTRIES_P non-zero means remove
4818 entries from the table that don't survive the current GC.
4819 REMOVE_ENTRIES_P zero means mark entries that are in use. Value is
4820 non-zero if anything was marked. */
4821
4822 static int
4823 sweep_weak_table (h, remove_entries_p)
4824 struct Lisp_Hash_Table *h;
4825 int remove_entries_p;
4826 {
4827 int bucket, n, marked;
4828
4829 n = XVECTOR (h->index)->size & ~ARRAY_MARK_FLAG;
4830 marked = 0;
4831
4832 for (bucket = 0; bucket < n; ++bucket)
4833 {
4834 Lisp_Object idx, next, prev;
4835
4836 /* Follow collision chain, removing entries that
4837 don't survive this garbage collection. */
4838 prev = Qnil;
4839 for (idx = HASH_INDEX (h, bucket); !GC_NILP (idx); idx = next)
4840 {
4841 int i = XFASTINT (idx);
4842 int key_known_to_survive_p = survives_gc_p (HASH_KEY (h, i));
4843 int value_known_to_survive_p = survives_gc_p (HASH_VALUE (h, i));
4844 int remove_p;
4845
4846 if (EQ (h->weak, Qkey))
4847 remove_p = !key_known_to_survive_p;
4848 else if (EQ (h->weak, Qvalue))
4849 remove_p = !value_known_to_survive_p;
4850 else if (EQ (h->weak, Qkey_or_value))
4851 remove_p = !(key_known_to_survive_p || value_known_to_survive_p);
4852 else if (EQ (h->weak, Qkey_and_value))
4853 remove_p = !(key_known_to_survive_p && value_known_to_survive_p);
4854 else
4855 abort ();
4856
4857 next = HASH_NEXT (h, i);
4858
4859 if (remove_entries_p)
4860 {
4861 if (remove_p)
4862 {
4863 /* Take out of collision chain. */
4864 if (GC_NILP (prev))
4865 HASH_INDEX (h, bucket) = next;
4866 else
4867 HASH_NEXT (h, XFASTINT (prev)) = next;
4868
4869 /* Add to free list. */
4870 HASH_NEXT (h, i) = h->next_free;
4871 h->next_free = idx;
4872
4873 /* Clear key, value, and hash. */
4874 HASH_KEY (h, i) = HASH_VALUE (h, i) = Qnil;
4875 HASH_HASH (h, i) = Qnil;
4876
4877 h->count = make_number (XFASTINT (h->count) - 1);
4878 }
4879 else
4880 {
4881 prev = idx;
4882 }
4883 }
4884 else
4885 {
4886 if (!remove_p)
4887 {
4888 /* Make sure key and value survive. */
4889 if (!key_known_to_survive_p)
4890 {
4891 mark_object (HASH_KEY (h, i));
4892 marked = 1;
4893 }
4894
4895 if (!value_known_to_survive_p)
4896 {
4897 mark_object (HASH_VALUE (h, i));
4898 marked = 1;
4899 }
4900 }
4901 }
4902 }
4903 }
4904
4905 return marked;
4906 }
4907
4908 /* Remove elements from weak hash tables that don't survive the
4909 current garbage collection. Remove weak tables that don't survive
4910 from Vweak_hash_tables. Called from gc_sweep. */
4911
4912 void
4913 sweep_weak_hash_tables ()
4914 {
4915 Lisp_Object table, used, next;
4916 struct Lisp_Hash_Table *h;
4917 int marked;
4918
4919 /* Mark all keys and values that are in use. Keep on marking until
4920 there is no more change. This is necessary for cases like
4921 value-weak table A containing an entry X -> Y, where Y is used in a
4922 key-weak table B, Z -> Y. If B comes after A in the list of weak
4923 tables, X -> Y might be removed from A, although when looking at B
4924 one finds that it shouldn't. */
4925 do
4926 {
4927 marked = 0;
4928 for (table = Vweak_hash_tables; !GC_NILP (table); table = h->next_weak)
4929 {
4930 h = XHASH_TABLE (table);
4931 if (h->size & ARRAY_MARK_FLAG)
4932 marked |= sweep_weak_table (h, 0);
4933 }
4934 }
4935 while (marked);
4936
4937 /* Remove tables and entries that aren't used. */
4938 for (table = Vweak_hash_tables, used = Qnil; !GC_NILP (table); table = next)
4939 {
4940 h = XHASH_TABLE (table);
4941 next = h->next_weak;
4942
4943 if (h->size & ARRAY_MARK_FLAG)
4944 {
4945 /* TABLE is marked as used. Sweep its contents. */
4946 if (XFASTINT (h->count) > 0)
4947 sweep_weak_table (h, 1);
4948
4949 /* Add table to the list of used weak hash tables. */
4950 h->next_weak = used;
4951 used = table;
4952 }
4953 }
4954
4955 Vweak_hash_tables = used;
4956 }
4957
4958
4959 \f
4960 /***********************************************************************
4961 Hash Code Computation
4962 ***********************************************************************/
4963
4964 /* Maximum depth up to which to dive into Lisp structures. */
4965
4966 #define SXHASH_MAX_DEPTH 3
4967
4968 /* Maximum length up to which to take list and vector elements into
4969 account. */
4970
4971 #define SXHASH_MAX_LEN 7
4972
4973 /* Combine two integers X and Y for hashing. */
4974
4975 #define SXHASH_COMBINE(X, Y) \
4976 ((((unsigned)(X) << 4) + (((unsigned)(X) >> 24) & 0x0fffffff)) \
4977 + (unsigned)(Y))
4978
4979
4980 /* Return a hash for string PTR which has length LEN. The hash
4981 code returned is guaranteed to fit in a Lisp integer. */
4982
4983 static unsigned
4984 sxhash_string (ptr, len)
4985 unsigned char *ptr;
4986 int len;
4987 {
4988 unsigned char *p = ptr;
4989 unsigned char *end = p + len;
4990 unsigned char c;
4991 unsigned hash = 0;
4992
4993 while (p != end)
4994 {
4995 c = *p++;
4996 if (c >= 0140)
4997 c -= 40;
4998 hash = ((hash << 3) + (hash >> 28) + c);
4999 }
5000
5001 return hash & INTMASK;
5002 }
5003
5004
5005 /* Return a hash for list LIST. DEPTH is the current depth in the
5006 list. We don't recurse deeper than SXHASH_MAX_DEPTH in it. */
5007
5008 static unsigned
5009 sxhash_list (list, depth)
5010 Lisp_Object list;
5011 int depth;
5012 {
5013 unsigned hash = 0;
5014 int i;
5015
5016 if (depth < SXHASH_MAX_DEPTH)
5017 for (i = 0;
5018 CONSP (list) && i < SXHASH_MAX_LEN;
5019 list = XCDR (list), ++i)
5020 {
5021 unsigned hash2 = sxhash (XCAR (list), depth + 1);
5022 hash = SXHASH_COMBINE (hash, hash2);
5023 }
5024
5025 return hash;
5026 }
5027
5028
5029 /* Return a hash for vector VECTOR. DEPTH is the current depth in
5030 the Lisp structure. */
5031
5032 static unsigned
5033 sxhash_vector (vec, depth)
5034 Lisp_Object vec;
5035 int depth;
5036 {
5037 unsigned hash = XVECTOR (vec)->size;
5038 int i, n;
5039
5040 n = min (SXHASH_MAX_LEN, XVECTOR (vec)->size);
5041 for (i = 0; i < n; ++i)
5042 {
5043 unsigned hash2 = sxhash (XVECTOR (vec)->contents[i], depth + 1);
5044 hash = SXHASH_COMBINE (hash, hash2);
5045 }
5046
5047 return hash;
5048 }
5049
5050
5051 /* Return a hash for bool-vector VECTOR. */
5052
5053 static unsigned
5054 sxhash_bool_vector (vec)
5055 Lisp_Object vec;
5056 {
5057 unsigned hash = XBOOL_VECTOR (vec)->size;
5058 int i, n;
5059
5060 n = min (SXHASH_MAX_LEN, XBOOL_VECTOR (vec)->vector_size);
5061 for (i = 0; i < n; ++i)
5062 hash = SXHASH_COMBINE (hash, XBOOL_VECTOR (vec)->data[i]);
5063
5064 return hash;
5065 }
5066
5067
5068 /* Return a hash code for OBJ. DEPTH is the current depth in the Lisp
5069 structure. Value is an unsigned integer clipped to INTMASK. */
5070
5071 unsigned
5072 sxhash (obj, depth)
5073 Lisp_Object obj;
5074 int depth;
5075 {
5076 unsigned hash;
5077
5078 if (depth > SXHASH_MAX_DEPTH)
5079 return 0;
5080
5081 switch (XTYPE (obj))
5082 {
5083 case Lisp_Int:
5084 hash = XUINT (obj);
5085 break;
5086
5087 case Lisp_Misc:
5088 hash = XUINT (obj);
5089 break;
5090
5091 case Lisp_Symbol:
5092 obj = SYMBOL_NAME (obj);
5093 /* Fall through. */
5094
5095 case Lisp_String:
5096 hash = sxhash_string (SDATA (obj), SCHARS (obj));
5097 break;
5098
5099 /* This can be everything from a vector to an overlay. */
5100 case Lisp_Vectorlike:
5101 if (VECTORP (obj))
5102 /* According to the CL HyperSpec, two arrays are equal only if
5103 they are `eq', except for strings and bit-vectors. In
5104 Emacs, this works differently. We have to compare element
5105 by element. */
5106 hash = sxhash_vector (obj, depth);
5107 else if (BOOL_VECTOR_P (obj))
5108 hash = sxhash_bool_vector (obj);
5109 else
5110 /* Others are `equal' if they are `eq', so let's take their
5111 address as hash. */
5112 hash = XUINT (obj);
5113 break;
5114
5115 case Lisp_Cons:
5116 hash = sxhash_list (obj, depth);
5117 break;
5118
5119 case Lisp_Float:
5120 {
5121 unsigned char *p = (unsigned char *) &XFLOAT_DATA (obj);
5122 unsigned char *e = p + sizeof XFLOAT_DATA (obj);
5123 for (hash = 0; p < e; ++p)
5124 hash = SXHASH_COMBINE (hash, *p);
5125 break;
5126 }
5127
5128 default:
5129 abort ();
5130 }
5131
5132 return hash & INTMASK;
5133 }
5134
5135
5136 \f
5137 /***********************************************************************
5138 Lisp Interface
5139 ***********************************************************************/
5140
5141
5142 DEFUN ("sxhash", Fsxhash, Ssxhash, 1, 1, 0,
5143 doc: /* Compute a hash code for OBJ and return it as integer. */)
5144 (obj)
5145 Lisp_Object obj;
5146 {
5147 unsigned hash = sxhash (obj, 0);;
5148 return make_number (hash);
5149 }
5150
5151
5152 DEFUN ("make-hash-table", Fmake_hash_table, Smake_hash_table, 0, MANY, 0,
5153 doc: /* Create and return a new hash table.
5154
5155 Arguments are specified as keyword/argument pairs. The following
5156 arguments are defined:
5157
5158 :test TEST -- TEST must be a symbol that specifies how to compare
5159 keys. Default is `eql'. Predefined are the tests `eq', `eql', and
5160 `equal'. User-supplied test and hash functions can be specified via
5161 `define-hash-table-test'.
5162
5163 :size SIZE -- A hint as to how many elements will be put in the table.
5164 Default is 65.
5165
5166 :rehash-size REHASH-SIZE - Indicates how to expand the table when it
5167 fills up. If REHASH-SIZE is an integer, add that many space. If it
5168 is a float, it must be > 1.0, and the new size is computed by
5169 multiplying the old size with that factor. Default is 1.5.
5170
5171 :rehash-threshold THRESHOLD -- THRESHOLD must a float > 0, and <= 1.0.
5172 Resize the hash table when ratio of the number of entries in the
5173 table. Default is 0.8.
5174
5175 :weakness WEAK -- WEAK must be one of nil, t, `key', `value',
5176 `key-or-value', or `key-and-value'. If WEAK is not nil, the table
5177 returned is a weak table. Key/value pairs are removed from a weak
5178 hash table when there are no non-weak references pointing to their
5179 key, value, one of key or value, or both key and value, depending on
5180 WEAK. WEAK t is equivalent to `key-and-value'. Default value of WEAK
5181 is nil.
5182
5183 usage: (make-hash-table &rest KEYWORD-ARGS) */)
5184 (nargs, args)
5185 int nargs;
5186 Lisp_Object *args;
5187 {
5188 Lisp_Object test, size, rehash_size, rehash_threshold, weak;
5189 Lisp_Object user_test, user_hash;
5190 char *used;
5191 int i;
5192
5193 /* The vector `used' is used to keep track of arguments that
5194 have been consumed. */
5195 used = (char *) alloca (nargs * sizeof *used);
5196 bzero (used, nargs * sizeof *used);
5197
5198 /* See if there's a `:test TEST' among the arguments. */
5199 i = get_key_arg (QCtest, nargs, args, used);
5200 test = i < 0 ? Qeql : args[i];
5201 if (!EQ (test, Qeq) && !EQ (test, Qeql) && !EQ (test, Qequal))
5202 {
5203 /* See if it is a user-defined test. */
5204 Lisp_Object prop;
5205
5206 prop = Fget (test, Qhash_table_test);
5207 if (!CONSP (prop) || !CONSP (XCDR (prop)))
5208 Fsignal (Qerror, list2 (build_string ("Invalid hash table test"),
5209 test));
5210 user_test = XCAR (prop);
5211 user_hash = XCAR (XCDR (prop));
5212 }
5213 else
5214 user_test = user_hash = Qnil;
5215
5216 /* See if there's a `:size SIZE' argument. */
5217 i = get_key_arg (QCsize, nargs, args, used);
5218 size = i < 0 ? Qnil : args[i];
5219 if (NILP (size))
5220 size = make_number (DEFAULT_HASH_SIZE);
5221 else if (!INTEGERP (size) || XINT (size) < 0)
5222 Fsignal (Qerror,
5223 list2 (build_string ("Invalid hash table size"),
5224 size));
5225
5226 /* Look for `:rehash-size SIZE'. */
5227 i = get_key_arg (QCrehash_size, nargs, args, used);
5228 rehash_size = i < 0 ? make_float (DEFAULT_REHASH_SIZE) : args[i];
5229 if (!NUMBERP (rehash_size)
5230 || (INTEGERP (rehash_size) && XINT (rehash_size) <= 0)
5231 || XFLOATINT (rehash_size) <= 1.0)
5232 Fsignal (Qerror,
5233 list2 (build_string ("Invalid hash table rehash size"),
5234 rehash_size));
5235
5236 /* Look for `:rehash-threshold THRESHOLD'. */
5237 i = get_key_arg (QCrehash_threshold, nargs, args, used);
5238 rehash_threshold = i < 0 ? make_float (DEFAULT_REHASH_THRESHOLD) : args[i];
5239 if (!FLOATP (rehash_threshold)
5240 || XFLOATINT (rehash_threshold) <= 0.0
5241 || XFLOATINT (rehash_threshold) > 1.0)
5242 Fsignal (Qerror,
5243 list2 (build_string ("Invalid hash table rehash threshold"),
5244 rehash_threshold));
5245
5246 /* Look for `:weakness WEAK'. */
5247 i = get_key_arg (QCweakness, nargs, args, used);
5248 weak = i < 0 ? Qnil : args[i];
5249 if (EQ (weak, Qt))
5250 weak = Qkey_and_value;
5251 if (!NILP (weak)
5252 && !EQ (weak, Qkey)
5253 && !EQ (weak, Qvalue)
5254 && !EQ (weak, Qkey_or_value)
5255 && !EQ (weak, Qkey_and_value))
5256 Fsignal (Qerror, list2 (build_string ("Invalid hash table weakness"),
5257 weak));
5258
5259 /* Now, all args should have been used up, or there's a problem. */
5260 for (i = 0; i < nargs; ++i)
5261 if (!used[i])
5262 Fsignal (Qerror,
5263 list2 (build_string ("Invalid argument list"), args[i]));
5264
5265 return make_hash_table (test, size, rehash_size, rehash_threshold, weak,
5266 user_test, user_hash);
5267 }
5268
5269
5270 DEFUN ("copy-hash-table", Fcopy_hash_table, Scopy_hash_table, 1, 1, 0,
5271 doc: /* Return a copy of hash table TABLE. */)
5272 (table)
5273 Lisp_Object table;
5274 {
5275 return copy_hash_table (check_hash_table (table));
5276 }
5277
5278
5279 DEFUN ("hash-table-count", Fhash_table_count, Shash_table_count, 1, 1, 0,
5280 doc: /* Return the number of elements in TABLE. */)
5281 (table)
5282 Lisp_Object table;
5283 {
5284 return check_hash_table (table)->count;
5285 }
5286
5287
5288 DEFUN ("hash-table-rehash-size", Fhash_table_rehash_size,
5289 Shash_table_rehash_size, 1, 1, 0,
5290 doc: /* Return the current rehash size of TABLE. */)
5291 (table)
5292 Lisp_Object table;
5293 {
5294 return check_hash_table (table)->rehash_size;
5295 }
5296
5297
5298 DEFUN ("hash-table-rehash-threshold", Fhash_table_rehash_threshold,
5299 Shash_table_rehash_threshold, 1, 1, 0,
5300 doc: /* Return the current rehash threshold of TABLE. */)
5301 (table)
5302 Lisp_Object table;
5303 {
5304 return check_hash_table (table)->rehash_threshold;
5305 }
5306
5307
5308 DEFUN ("hash-table-size", Fhash_table_size, Shash_table_size, 1, 1, 0,
5309 doc: /* Return the size of TABLE.
5310 The size can be used as an argument to `make-hash-table' to create
5311 a hash table than can hold as many elements of TABLE holds
5312 without need for resizing. */)
5313 (table)
5314 Lisp_Object table;
5315 {
5316 struct Lisp_Hash_Table *h = check_hash_table (table);
5317 return make_number (HASH_TABLE_SIZE (h));
5318 }
5319
5320
5321 DEFUN ("hash-table-test", Fhash_table_test, Shash_table_test, 1, 1, 0,
5322 doc: /* Return the test TABLE uses. */)
5323 (table)
5324 Lisp_Object table;
5325 {
5326 return check_hash_table (table)->test;
5327 }
5328
5329
5330 DEFUN ("hash-table-weakness", Fhash_table_weakness, Shash_table_weakness,
5331 1, 1, 0,
5332 doc: /* Return the weakness of TABLE. */)
5333 (table)
5334 Lisp_Object table;
5335 {
5336 return check_hash_table (table)->weak;
5337 }
5338
5339
5340 DEFUN ("hash-table-p", Fhash_table_p, Shash_table_p, 1, 1, 0,
5341 doc: /* Return t if OBJ is a Lisp hash table object. */)
5342 (obj)
5343 Lisp_Object obj;
5344 {
5345 return HASH_TABLE_P (obj) ? Qt : Qnil;
5346 }
5347
5348
5349 DEFUN ("clrhash", Fclrhash, Sclrhash, 1, 1, 0,
5350 doc: /* Clear hash table TABLE. */)
5351 (table)
5352 Lisp_Object table;
5353 {
5354 hash_clear (check_hash_table (table));
5355 return Qnil;
5356 }
5357
5358
5359 DEFUN ("gethash", Fgethash, Sgethash, 2, 3, 0,
5360 doc: /* Look up KEY in TABLE and return its associated value.
5361 If KEY is not found, return DFLT which defaults to nil. */)
5362 (key, table, dflt)
5363 Lisp_Object key, table, dflt;
5364 {
5365 struct Lisp_Hash_Table *h = check_hash_table (table);
5366 int i = hash_lookup (h, key, NULL);
5367 return i >= 0 ? HASH_VALUE (h, i) : dflt;
5368 }
5369
5370
5371 DEFUN ("puthash", Fputhash, Sputhash, 3, 3, 0,
5372 doc: /* Associate KEY with VALUE in hash table TABLE.
5373 If KEY is already present in table, replace its current value with
5374 VALUE. */)
5375 (key, value, table)
5376 Lisp_Object key, value, table;
5377 {
5378 struct Lisp_Hash_Table *h = check_hash_table (table);
5379 int i;
5380 unsigned hash;
5381
5382 i = hash_lookup (h, key, &hash);
5383 if (i >= 0)
5384 HASH_VALUE (h, i) = value;
5385 else
5386 hash_put (h, key, value, hash);
5387
5388 return value;
5389 }
5390
5391
5392 DEFUN ("remhash", Fremhash, Sremhash, 2, 2, 0,
5393 doc: /* Remove KEY from TABLE. */)
5394 (key, table)
5395 Lisp_Object key, table;
5396 {
5397 struct Lisp_Hash_Table *h = check_hash_table (table);
5398 hash_remove (h, key);
5399 return Qnil;
5400 }
5401
5402
5403 DEFUN ("maphash", Fmaphash, Smaphash, 2, 2, 0,
5404 doc: /* Call FUNCTION for all entries in hash table TABLE.
5405 FUNCTION is called with 2 arguments KEY and VALUE. */)
5406 (function, table)
5407 Lisp_Object function, table;
5408 {
5409 struct Lisp_Hash_Table *h = check_hash_table (table);
5410 Lisp_Object args[3];
5411 int i;
5412
5413 for (i = 0; i < HASH_TABLE_SIZE (h); ++i)
5414 if (!NILP (HASH_HASH (h, i)))
5415 {
5416 args[0] = function;
5417 args[1] = HASH_KEY (h, i);
5418 args[2] = HASH_VALUE (h, i);
5419 Ffuncall (3, args);
5420 }
5421
5422 return Qnil;
5423 }
5424
5425
5426 DEFUN ("define-hash-table-test", Fdefine_hash_table_test,
5427 Sdefine_hash_table_test, 3, 3, 0,
5428 doc: /* Define a new hash table test with name NAME, a symbol.
5429
5430 In hash tables created with NAME specified as test, use TEST to
5431 compare keys, and HASH for computing hash codes of keys.
5432
5433 TEST must be a function taking two arguments and returning non-nil if
5434 both arguments are the same. HASH must be a function taking one
5435 argument and return an integer that is the hash code of the argument.
5436 Hash code computation should use the whole value range of integers,
5437 including negative integers. */)
5438 (name, test, hash)
5439 Lisp_Object name, test, hash;
5440 {
5441 return Fput (name, Qhash_table_test, list2 (test, hash));
5442 }
5443
5444
5445 \f
5446 /************************************************************************
5447 MD5
5448 ************************************************************************/
5449
5450 #include "md5.h"
5451 #include "coding.h"
5452
5453 DEFUN ("md5", Fmd5, Smd5, 1, 5, 0,
5454 doc: /* Return MD5 message digest of OBJECT, a buffer or string.
5455
5456 A message digest is a cryptographic checksum of a document, and the
5457 algorithm to calculate it is defined in RFC 1321.
5458
5459 The two optional arguments START and END are character positions
5460 specifying for which part of OBJECT the message digest should be
5461 computed. If nil or omitted, the digest is computed for the whole
5462 OBJECT.
5463
5464 The MD5 message digest is computed from the result of encoding the
5465 text in a coding system, not directly from the internal Emacs form of
5466 the text. The optional fourth argument CODING-SYSTEM specifies which
5467 coding system to encode the text with. It should be the same coding
5468 system that you used or will use when actually writing the text into a
5469 file.
5470
5471 If CODING-SYSTEM is nil or omitted, the default depends on OBJECT. If
5472 OBJECT is a buffer, the default for CODING-SYSTEM is whatever coding
5473 system would be chosen by default for writing this text into a file.
5474
5475 If OBJECT is a string, the most preferred coding system (see the
5476 command `prefer-coding-system') is used.
5477
5478 If NOERROR is non-nil, silently assume the `raw-text' coding if the
5479 guesswork fails. Normally, an error is signaled in such case. */)
5480 (object, start, end, coding_system, noerror)
5481 Lisp_Object object, start, end, coding_system, noerror;
5482 {
5483 unsigned char digest[16];
5484 unsigned char value[33];
5485 int i;
5486 int size;
5487 int size_byte = 0;
5488 int start_char = 0, end_char = 0;
5489 int start_byte = 0, end_byte = 0;
5490 register int b, e;
5491 register struct buffer *bp;
5492 int temp;
5493
5494 if (STRINGP (object))
5495 {
5496 if (NILP (coding_system))
5497 {
5498 /* Decide the coding-system to encode the data with. */
5499
5500 if (STRING_MULTIBYTE (object))
5501 /* use default, we can't guess correct value */
5502 coding_system = SYMBOL_VALUE (XCAR (Vcoding_category_list));
5503 else
5504 coding_system = Qraw_text;
5505 }
5506
5507 if (NILP (Fcoding_system_p (coding_system)))
5508 {
5509 /* Invalid coding system. */
5510
5511 if (!NILP (noerror))
5512 coding_system = Qraw_text;
5513 else
5514 while (1)
5515 Fsignal (Qcoding_system_error, Fcons (coding_system, Qnil));
5516 }
5517
5518 if (STRING_MULTIBYTE (object))
5519 object = code_convert_string1 (object, coding_system, Qnil, 1);
5520
5521 size = SCHARS (object);
5522 size_byte = SBYTES (object);
5523
5524 if (!NILP (start))
5525 {
5526 CHECK_NUMBER (start);
5527
5528 start_char = XINT (start);
5529
5530 if (start_char < 0)
5531 start_char += size;
5532
5533 start_byte = string_char_to_byte (object, start_char);
5534 }
5535
5536 if (NILP (end))
5537 {
5538 end_char = size;
5539 end_byte = size_byte;
5540 }
5541 else
5542 {
5543 CHECK_NUMBER (end);
5544
5545 end_char = XINT (end);
5546
5547 if (end_char < 0)
5548 end_char += size;
5549
5550 end_byte = string_char_to_byte (object, end_char);
5551 }
5552
5553 if (!(0 <= start_char && start_char <= end_char && end_char <= size))
5554 args_out_of_range_3 (object, make_number (start_char),
5555 make_number (end_char));
5556 }
5557 else
5558 {
5559 struct buffer *prev = current_buffer;
5560
5561 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
5562
5563 CHECK_BUFFER (object);
5564
5565 bp = XBUFFER (object);
5566 if (bp != current_buffer)
5567 set_buffer_internal (bp);
5568
5569 if (NILP (start))
5570 b = BEGV;
5571 else
5572 {
5573 CHECK_NUMBER_COERCE_MARKER (start);
5574 b = XINT (start);
5575 }
5576
5577 if (NILP (end))
5578 e = ZV;
5579 else
5580 {
5581 CHECK_NUMBER_COERCE_MARKER (end);
5582 e = XINT (end);
5583 }
5584
5585 if (b > e)
5586 temp = b, b = e, e = temp;
5587
5588 if (!(BEGV <= b && e <= ZV))
5589 args_out_of_range (start, end);
5590
5591 if (NILP (coding_system))
5592 {
5593 /* Decide the coding-system to encode the data with.
5594 See fileio.c:Fwrite-region */
5595
5596 if (!NILP (Vcoding_system_for_write))
5597 coding_system = Vcoding_system_for_write;
5598 else
5599 {
5600 int force_raw_text = 0;
5601
5602 coding_system = XBUFFER (object)->buffer_file_coding_system;
5603 if (NILP (coding_system)
5604 || NILP (Flocal_variable_p (Qbuffer_file_coding_system, Qnil)))
5605 {
5606 coding_system = Qnil;
5607 if (NILP (current_buffer->enable_multibyte_characters))
5608 force_raw_text = 1;
5609 }
5610
5611 if (NILP (coding_system) && !NILP (Fbuffer_file_name(object)))
5612 {
5613 /* Check file-coding-system-alist. */
5614 Lisp_Object args[4], val;
5615
5616 args[0] = Qwrite_region; args[1] = start; args[2] = end;
5617 args[3] = Fbuffer_file_name(object);
5618 val = Ffind_operation_coding_system (4, args);
5619 if (CONSP (val) && !NILP (XCDR (val)))
5620 coding_system = XCDR (val);
5621 }
5622
5623 if (NILP (coding_system)
5624 && !NILP (XBUFFER (object)->buffer_file_coding_system))
5625 {
5626 /* If we still have not decided a coding system, use the
5627 default value of buffer-file-coding-system. */
5628 coding_system = XBUFFER (object)->buffer_file_coding_system;
5629 }
5630
5631 if (!force_raw_text
5632 && !NILP (Ffboundp (Vselect_safe_coding_system_function)))
5633 /* Confirm that VAL can surely encode the current region. */
5634 coding_system = call4 (Vselect_safe_coding_system_function,
5635 make_number (b), make_number (e),
5636 coding_system, Qnil);
5637
5638 if (force_raw_text)
5639 coding_system = Qraw_text;
5640 }
5641
5642 if (NILP (Fcoding_system_p (coding_system)))
5643 {
5644 /* Invalid coding system. */
5645
5646 if (!NILP (noerror))
5647 coding_system = Qraw_text;
5648 else
5649 while (1)
5650 Fsignal (Qcoding_system_error, Fcons (coding_system, Qnil));
5651 }
5652 }
5653
5654 object = make_buffer_string (b, e, 0);
5655 if (prev != current_buffer)
5656 set_buffer_internal (prev);
5657 /* Discard the unwind protect for recovering the current
5658 buffer. */
5659 specpdl_ptr--;
5660
5661 if (STRING_MULTIBYTE (object))
5662 object = code_convert_string1 (object, coding_system, Qnil, 1);
5663 }
5664
5665 md5_buffer (SDATA (object) + start_byte,
5666 SBYTES (object) - (size_byte - end_byte),
5667 digest);
5668
5669 for (i = 0; i < 16; i++)
5670 sprintf (&value[2 * i], "%02x", digest[i]);
5671 value[32] = '\0';
5672
5673 return make_string (value, 32);
5674 }
5675
5676 \f
5677 void
5678 syms_of_fns ()
5679 {
5680 /* Hash table stuff. */
5681 Qhash_table_p = intern ("hash-table-p");
5682 staticpro (&Qhash_table_p);
5683 Qeq = intern ("eq");
5684 staticpro (&Qeq);
5685 Qeql = intern ("eql");
5686 staticpro (&Qeql);
5687 Qequal = intern ("equal");
5688 staticpro (&Qequal);
5689 QCtest = intern (":test");
5690 staticpro (&QCtest);
5691 QCsize = intern (":size");
5692 staticpro (&QCsize);
5693 QCrehash_size = intern (":rehash-size");
5694 staticpro (&QCrehash_size);
5695 QCrehash_threshold = intern (":rehash-threshold");
5696 staticpro (&QCrehash_threshold);
5697 QCweakness = intern (":weakness");
5698 staticpro (&QCweakness);
5699 Qkey = intern ("key");
5700 staticpro (&Qkey);
5701 Qvalue = intern ("value");
5702 staticpro (&Qvalue);
5703 Qhash_table_test = intern ("hash-table-test");
5704 staticpro (&Qhash_table_test);
5705 Qkey_or_value = intern ("key-or-value");
5706 staticpro (&Qkey_or_value);
5707 Qkey_and_value = intern ("key-and-value");
5708 staticpro (&Qkey_and_value);
5709
5710 defsubr (&Ssxhash);
5711 defsubr (&Smake_hash_table);
5712 defsubr (&Scopy_hash_table);
5713 defsubr (&Shash_table_count);
5714 defsubr (&Shash_table_rehash_size);
5715 defsubr (&Shash_table_rehash_threshold);
5716 defsubr (&Shash_table_size);
5717 defsubr (&Shash_table_test);
5718 defsubr (&Shash_table_weakness);
5719 defsubr (&Shash_table_p);
5720 defsubr (&Sclrhash);
5721 defsubr (&Sgethash);
5722 defsubr (&Sputhash);
5723 defsubr (&Sremhash);
5724 defsubr (&Smaphash);
5725 defsubr (&Sdefine_hash_table_test);
5726
5727 Qstring_lessp = intern ("string-lessp");
5728 staticpro (&Qstring_lessp);
5729 Qprovide = intern ("provide");
5730 staticpro (&Qprovide);
5731 Qrequire = intern ("require");
5732 staticpro (&Qrequire);
5733 Qyes_or_no_p_history = intern ("yes-or-no-p-history");
5734 staticpro (&Qyes_or_no_p_history);
5735 Qcursor_in_echo_area = intern ("cursor-in-echo-area");
5736 staticpro (&Qcursor_in_echo_area);
5737 Qwidget_type = intern ("widget-type");
5738 staticpro (&Qwidget_type);
5739
5740 staticpro (&string_char_byte_cache_string);
5741 string_char_byte_cache_string = Qnil;
5742
5743 require_nesting_list = Qnil;
5744 staticpro (&require_nesting_list);
5745
5746 Fset (Qyes_or_no_p_history, Qnil);
5747
5748 DEFVAR_LISP ("features", &Vfeatures,
5749 doc: /* A list of symbols which are the features of the executing emacs.
5750 Used by `featurep' and `require', and altered by `provide'. */);
5751 Vfeatures = Qnil;
5752 Qsubfeatures = intern ("subfeatures");
5753 staticpro (&Qsubfeatures);
5754
5755 #ifdef HAVE_LANGINFO_CODESET
5756 Qcodeset = intern ("codeset");
5757 staticpro (&Qcodeset);
5758 Qdays = intern ("days");
5759 staticpro (&Qdays);
5760 Qmonths = intern ("months");
5761 staticpro (&Qmonths);
5762 Qpaper = intern ("paper");
5763 staticpro (&Qpaper);
5764 #endif /* HAVE_LANGINFO_CODESET */
5765
5766 DEFVAR_BOOL ("use-dialog-box", &use_dialog_box,
5767 doc: /* *Non-nil means mouse commands use dialog boxes to ask questions.
5768 This applies to `y-or-n-p' and `yes-or-no-p' questions asked by commands
5769 invoked by mouse clicks and mouse menu items. */);
5770 use_dialog_box = 1;
5771
5772 DEFVAR_BOOL ("use-file-dialog", &use_file_dialog,
5773 doc: /* *Non-nil means mouse commands use a file dialog to ask for files.
5774 This applies to commands from menus and tool bar buttons. The value of
5775 `use-dialog-box' takes precedence over this variable, so a file dialog is only
5776 used if both `use-dialog-box' and this variable are non-nil. */);
5777 use_file_dialog = 1;
5778
5779 defsubr (&Sidentity);
5780 defsubr (&Srandom);
5781 defsubr (&Slength);
5782 defsubr (&Ssafe_length);
5783 defsubr (&Sstring_bytes);
5784 defsubr (&Sstring_equal);
5785 defsubr (&Scompare_strings);
5786 defsubr (&Sstring_lessp);
5787 defsubr (&Sappend);
5788 defsubr (&Sconcat);
5789 defsubr (&Svconcat);
5790 defsubr (&Scopy_sequence);
5791 defsubr (&Sstring_make_multibyte);
5792 defsubr (&Sstring_make_unibyte);
5793 defsubr (&Sstring_as_multibyte);
5794 defsubr (&Sstring_as_unibyte);
5795 defsubr (&Sstring_to_multibyte);
5796 defsubr (&Scopy_alist);
5797 defsubr (&Ssubstring);
5798 defsubr (&Ssubstring_no_properties);
5799 defsubr (&Snthcdr);
5800 defsubr (&Snth);
5801 defsubr (&Selt);
5802 defsubr (&Smember);
5803 defsubr (&Smemq);
5804 defsubr (&Sassq);
5805 defsubr (&Sassoc);
5806 defsubr (&Srassq);
5807 defsubr (&Srassoc);
5808 defsubr (&Sdelq);
5809 defsubr (&Sdelete);
5810 defsubr (&Snreverse);
5811 defsubr (&Sreverse);
5812 defsubr (&Ssort);
5813 defsubr (&Splist_get);
5814 defsubr (&Ssafe_plist_get);
5815 defsubr (&Sget);
5816 defsubr (&Ssafe_get);
5817 defsubr (&Splist_put);
5818 defsubr (&Sput);
5819 defsubr (&Slax_plist_get);
5820 defsubr (&Slax_plist_put);
5821 defsubr (&Seql);
5822 defsubr (&Sequal);
5823 defsubr (&Sequal_including_properties);
5824 defsubr (&Sfillarray);
5825 defsubr (&Sclear_string);
5826 defsubr (&Schar_table_subtype);
5827 defsubr (&Schar_table_parent);
5828 defsubr (&Sset_char_table_parent);
5829 defsubr (&Schar_table_extra_slot);
5830 defsubr (&Sset_char_table_extra_slot);
5831 defsubr (&Schar_table_range);
5832 defsubr (&Sset_char_table_range);
5833 defsubr (&Sset_char_table_default);
5834 defsubr (&Soptimize_char_table);
5835 defsubr (&Smap_char_table);
5836 defsubr (&Snconc);
5837 defsubr (&Smapcar);
5838 defsubr (&Smapc);
5839 defsubr (&Smapconcat);
5840 defsubr (&Sy_or_n_p);
5841 defsubr (&Syes_or_no_p);
5842 defsubr (&Sload_average);
5843 defsubr (&Sfeaturep);
5844 defsubr (&Srequire);
5845 defsubr (&Sprovide);
5846 defsubr (&Splist_member);
5847 defsubr (&Swidget_put);
5848 defsubr (&Swidget_get);
5849 defsubr (&Swidget_apply);
5850 defsubr (&Sbase64_encode_region);
5851 defsubr (&Sbase64_decode_region);
5852 defsubr (&Sbase64_encode_string);
5853 defsubr (&Sbase64_decode_string);
5854 defsubr (&Smd5);
5855 defsubr (&Slocale_info);
5856 }
5857
5858
5859 void
5860 init_fns ()
5861 {
5862 Vweak_hash_tables = Qnil;
5863 }
5864
5865 /* arch-tag: 787f8219-5b74-46bd-8469-7e1cc475fa31
5866 (do not change this comment) */