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