1 /* Random utility Lisp functions.
2 Copyright (C) 1985, 86, 87, 93, 94, 95, 97, 98, 99, 2000 Free Software Foundation, Inc.
4 This file is part of GNU Emacs.
6 GNU Emacs is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU Emacs is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs; see the file COPYING. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
29 /* Note on some machines this defines `vector' as a typedef,
30 so make sure we don't use that name in this file. */
40 #include "intervals.h"
43 #if defined (HAVE_MENUS) && defined (HAVE_X_WINDOWS)
48 #define NULL (void *)0
52 #define min(a, b) ((a) < (b) ? (a) : (b))
53 #define max(a, b) ((a) > (b) ? (a) : (b))
56 /* Nonzero enables use of dialog boxes for questions
57 asked by mouse commands. */
60 extern int minibuffer_auto_raise
;
61 extern Lisp_Object minibuf_window
;
63 Lisp_Object Qstring_lessp
, Qprovide
, Qrequire
;
64 Lisp_Object Qyes_or_no_p_history
;
65 Lisp_Object Qcursor_in_echo_area
;
66 Lisp_Object Qwidget_type
;
68 extern Lisp_Object Qinput_method_function
;
70 static int internal_equal ();
72 extern long get_random ();
73 extern void seed_random ();
79 DEFUN ("identity", Fidentity
, Sidentity
, 1, 1, 0,
80 "Return the argument unchanged.")
87 DEFUN ("random", Frandom
, Srandom
, 0, 1, 0,
88 "Return a pseudo-random number.\n\
89 All integers representable in Lisp are equally likely.\n\
90 On most systems, this is 28 bits' worth.\n\
91 With positive integer argument N, return random number in interval [0,N).\n\
92 With argument t, set the random number seed from the current time and pid.")
97 Lisp_Object lispy_val
;
98 unsigned long denominator
;
101 seed_random (getpid () + time (NULL
));
102 if (NATNUMP (n
) && XFASTINT (n
) != 0)
104 /* Try to take our random number from the higher bits of VAL,
105 not the lower, since (says Gentzel) the low bits of `random'
106 are less random than the higher ones. We do this by using the
107 quotient rather than the remainder. At the high end of the RNG
108 it's possible to get a quotient larger than n; discarding
109 these values eliminates the bias that would otherwise appear
110 when using a large n. */
111 denominator
= ((unsigned long)1 << VALBITS
) / XFASTINT (n
);
113 val
= get_random () / denominator
;
114 while (val
>= XFASTINT (n
));
118 XSETINT (lispy_val
, val
);
122 /* Random data-structure functions */
124 DEFUN ("length", Flength
, Slength
, 1, 1, 0,
125 "Return the length of vector, list or string SEQUENCE.\n\
126 A byte-code function object is also allowed.\n\
127 If the string contains multibyte characters, this is not the necessarily\n\
128 the number of bytes in the string; it is the number of characters.\n\
129 To get the number of bytes, use `string-bytes'")
131 register Lisp_Object sequence
;
133 register Lisp_Object tail
, val
;
137 if (STRINGP (sequence
))
138 XSETFASTINT (val
, XSTRING (sequence
)->size
);
139 else if (VECTORP (sequence
))
140 XSETFASTINT (val
, XVECTOR (sequence
)->size
);
141 else if (CHAR_TABLE_P (sequence
))
142 XSETFASTINT (val
, MAX_CHAR
);
143 else if (BOOL_VECTOR_P (sequence
))
144 XSETFASTINT (val
, XBOOL_VECTOR (sequence
)->size
);
145 else if (COMPILEDP (sequence
))
146 XSETFASTINT (val
, XVECTOR (sequence
)->size
& PSEUDOVECTOR_SIZE_MASK
);
147 else if (CONSP (sequence
))
150 while (CONSP (sequence
))
152 sequence
= XCDR (sequence
);
155 if (!CONSP (sequence
))
158 sequence
= XCDR (sequence
);
163 if (!NILP (sequence
))
164 wrong_type_argument (Qlistp
, sequence
);
166 val
= make_number (i
);
168 else if (NILP (sequence
))
169 XSETFASTINT (val
, 0);
172 sequence
= wrong_type_argument (Qsequencep
, sequence
);
178 /* This does not check for quits. That is safe
179 since it must terminate. */
181 DEFUN ("safe-length", Fsafe_length
, Ssafe_length
, 1, 1, 0,
182 "Return the length of a list, but avoid error or infinite loop.\n\
183 This function never gets an error. If LIST is not really a list,\n\
184 it returns 0. If LIST is circular, it returns a finite value\n\
185 which is at least the number of distinct elements.")
189 Lisp_Object tail
, halftail
, length
;
192 /* halftail is used to detect circular lists. */
194 for (tail
= list
; CONSP (tail
); tail
= XCDR (tail
))
196 if (EQ (tail
, halftail
) && len
!= 0)
200 halftail
= XCDR (halftail
);
203 XSETINT (length
, len
);
207 DEFUN ("string-bytes", Fstring_bytes
, Sstring_bytes
, 1, 1, 0,
208 "Return the number of bytes in STRING.\n\
209 If STRING is a multibyte string, this is greater than the length of STRING.")
213 CHECK_STRING (string
, 1);
214 return make_number (STRING_BYTES (XSTRING (string
)));
217 DEFUN ("string-equal", Fstring_equal
, Sstring_equal
, 2, 2, 0,
218 "Return t if two strings have identical contents.\n\
219 Case is significant, but text properties are ignored.\n\
220 Symbols are also allowed; their print names are used instead.")
222 register Lisp_Object s1
, s2
;
225 XSETSTRING (s1
, XSYMBOL (s1
)->name
);
227 XSETSTRING (s2
, XSYMBOL (s2
)->name
);
228 CHECK_STRING (s1
, 0);
229 CHECK_STRING (s2
, 1);
231 if (XSTRING (s1
)->size
!= XSTRING (s2
)->size
232 || STRING_BYTES (XSTRING (s1
)) != STRING_BYTES (XSTRING (s2
))
233 || bcmp (XSTRING (s1
)->data
, XSTRING (s2
)->data
, STRING_BYTES (XSTRING (s1
))))
238 DEFUN ("compare-strings", Fcompare_strings
,
239 Scompare_strings
, 6, 7, 0,
240 "Compare the contents of two strings, converting to multibyte if needed.\n\
241 In string STR1, skip the first START1 characters and stop at END1.\n\
242 In string STR2, skip the first START2 characters and stop at END2.\n\
243 END1 and END2 default to the full lengths of the respective strings.\n\
245 Case is significant in this comparison if IGNORE-CASE is nil.\n\
246 Unibyte strings are converted to multibyte for comparison.\n\
248 The value is t if the strings (or specified portions) match.\n\
249 If string STR1 is less, the value is a negative number N;\n\
250 - 1 - N is the number of characters that match at the beginning.\n\
251 If string STR1 is greater, the value is a positive number N;\n\
252 N - 1 is the number of characters that match at the beginning.")
253 (str1
, start1
, end1
, str2
, start2
, end2
, ignore_case
)
254 Lisp_Object str1
, start1
, end1
, start2
, str2
, end2
, ignore_case
;
256 register int end1_char
, end2_char
;
257 register int i1
, i1_byte
, i2
, i2_byte
;
259 CHECK_STRING (str1
, 0);
260 CHECK_STRING (str2
, 1);
262 start1
= make_number (0);
264 start2
= make_number (0);
265 CHECK_NATNUM (start1
, 2);
266 CHECK_NATNUM (start2
, 3);
268 CHECK_NATNUM (end1
, 4);
270 CHECK_NATNUM (end2
, 4);
275 i1_byte
= string_char_to_byte (str1
, i1
);
276 i2_byte
= string_char_to_byte (str2
, i2
);
278 end1_char
= XSTRING (str1
)->size
;
279 if (! NILP (end1
) && end1_char
> XINT (end1
))
280 end1_char
= XINT (end1
);
282 end2_char
= XSTRING (str2
)->size
;
283 if (! NILP (end2
) && end2_char
> XINT (end2
))
284 end2_char
= XINT (end2
);
286 while (i1
< end1_char
&& i2
< end2_char
)
288 /* When we find a mismatch, we must compare the
289 characters, not just the bytes. */
292 if (STRING_MULTIBYTE (str1
))
293 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c1
, str1
, i1
, i1_byte
);
296 c1
= XSTRING (str1
)->data
[i1
++];
297 c1
= unibyte_char_to_multibyte (c1
);
300 if (STRING_MULTIBYTE (str2
))
301 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c2
, str2
, i2
, i2_byte
);
304 c2
= XSTRING (str2
)->data
[i2
++];
305 c2
= unibyte_char_to_multibyte (c2
);
311 if (! NILP (ignore_case
))
315 tem
= Fupcase (make_number (c1
));
317 tem
= Fupcase (make_number (c2
));
324 /* Note that I1 has already been incremented
325 past the character that we are comparing;
326 hence we don't add or subtract 1 here. */
328 return make_number (- i1
);
330 return make_number (i1
);
334 return make_number (i1
- XINT (start1
) + 1);
336 return make_number (- i1
+ XINT (start1
) - 1);
341 DEFUN ("string-lessp", Fstring_lessp
, Sstring_lessp
, 2, 2, 0,
342 "Return t if first arg string is less than second in lexicographic order.\n\
343 Case is significant.\n\
344 Symbols are also allowed; their print names are used instead.")
346 register Lisp_Object s1
, s2
;
349 register int i1
, i1_byte
, i2
, i2_byte
;
352 XSETSTRING (s1
, XSYMBOL (s1
)->name
);
354 XSETSTRING (s2
, XSYMBOL (s2
)->name
);
355 CHECK_STRING (s1
, 0);
356 CHECK_STRING (s2
, 1);
358 i1
= i1_byte
= i2
= i2_byte
= 0;
360 end
= XSTRING (s1
)->size
;
361 if (end
> XSTRING (s2
)->size
)
362 end
= XSTRING (s2
)->size
;
366 /* When we find a mismatch, we must compare the
367 characters, not just the bytes. */
370 FETCH_STRING_CHAR_ADVANCE (c1
, s1
, i1
, i1_byte
);
371 FETCH_STRING_CHAR_ADVANCE (c2
, s2
, i2
, i2_byte
);
374 return c1
< c2
? Qt
: Qnil
;
376 return i1
< XSTRING (s2
)->size
? Qt
: Qnil
;
379 static Lisp_Object
concat ();
390 return concat (2, args
, Lisp_String
, 0);
392 return concat (2, &s1
, Lisp_String
, 0);
393 #endif /* NO_ARG_ARRAY */
399 Lisp_Object s1
, s2
, s3
;
406 return concat (3, args
, Lisp_String
, 0);
408 return concat (3, &s1
, Lisp_String
, 0);
409 #endif /* NO_ARG_ARRAY */
412 DEFUN ("append", Fappend
, Sappend
, 0, MANY
, 0,
413 "Concatenate all the arguments and make the result a list.\n\
414 The result is a list whose elements are the elements of all the arguments.\n\
415 Each argument may be a list, vector or string.\n\
416 The last argument is not copied, just used as the tail of the new list.")
421 return concat (nargs
, args
, Lisp_Cons
, 1);
424 DEFUN ("concat", Fconcat
, Sconcat
, 0, MANY
, 0,
425 "Concatenate all the arguments and make the result a string.\n\
426 The result is a string whose elements are the elements of all the arguments.\n\
427 Each argument may be a string or a list or vector of characters (integers).")
432 return concat (nargs
, args
, Lisp_String
, 0);
435 DEFUN ("vconcat", Fvconcat
, Svconcat
, 0, MANY
, 0,
436 "Concatenate all the arguments and make the result a vector.\n\
437 The result is a vector whose elements are the elements of all the arguments.\n\
438 Each argument may be a list, vector or string.")
443 return concat (nargs
, args
, Lisp_Vectorlike
, 0);
446 /* Retrun a copy of a sub char table ARG. The elements except for a
447 nested sub char table are not copied. */
449 copy_sub_char_table (arg
)
452 Lisp_Object copy
= make_sub_char_table (XCHAR_TABLE (arg
)->defalt
);
455 /* Copy all the contents. */
456 bcopy (XCHAR_TABLE (arg
)->contents
, XCHAR_TABLE (copy
)->contents
,
457 SUB_CHAR_TABLE_ORDINARY_SLOTS
* sizeof (Lisp_Object
));
458 /* Recursively copy any sub char-tables in the ordinary slots. */
459 for (i
= 32; i
< SUB_CHAR_TABLE_ORDINARY_SLOTS
; i
++)
460 if (SUB_CHAR_TABLE_P (XCHAR_TABLE (arg
)->contents
[i
]))
461 XCHAR_TABLE (copy
)->contents
[i
]
462 = copy_sub_char_table (XCHAR_TABLE (copy
)->contents
[i
]);
468 DEFUN ("copy-sequence", Fcopy_sequence
, Scopy_sequence
, 1, 1, 0,
469 "Return a copy of a list, vector or string.\n\
470 The elements of a list or vector are not copied; they are shared\n\
475 if (NILP (arg
)) return arg
;
477 if (CHAR_TABLE_P (arg
))
482 copy
= Fmake_char_table (XCHAR_TABLE (arg
)->purpose
, Qnil
);
483 /* Copy all the slots, including the extra ones. */
484 bcopy (XVECTOR (arg
)->contents
, XVECTOR (copy
)->contents
,
485 ((XCHAR_TABLE (arg
)->size
& PSEUDOVECTOR_SIZE_MASK
)
486 * sizeof (Lisp_Object
)));
488 /* Recursively copy any sub char tables in the ordinary slots
489 for multibyte characters. */
490 for (i
= CHAR_TABLE_SINGLE_BYTE_SLOTS
;
491 i
< CHAR_TABLE_ORDINARY_SLOTS
; i
++)
492 if (SUB_CHAR_TABLE_P (XCHAR_TABLE (arg
)->contents
[i
]))
493 XCHAR_TABLE (copy
)->contents
[i
]
494 = copy_sub_char_table (XCHAR_TABLE (copy
)->contents
[i
]);
499 if (BOOL_VECTOR_P (arg
))
503 = (XBOOL_VECTOR (arg
)->size
+ BITS_PER_CHAR
- 1) / BITS_PER_CHAR
;
505 val
= Fmake_bool_vector (Flength (arg
), Qnil
);
506 bcopy (XBOOL_VECTOR (arg
)->data
, XBOOL_VECTOR (val
)->data
,
511 if (!CONSP (arg
) && !VECTORP (arg
) && !STRINGP (arg
))
512 arg
= wrong_type_argument (Qsequencep
, arg
);
513 return concat (1, &arg
, CONSP (arg
) ? Lisp_Cons
: XTYPE (arg
), 0);
516 /* In string STR of length LEN, see if bytes before STR[I] combine
517 with bytes after STR[I] to form a single character. If so, return
518 the number of bytes after STR[I] which combine in this way.
519 Otherwize, return 0. */
522 count_combining (str
, len
, i
)
526 int j
= i
- 1, bytes
;
528 if (i
== 0 || i
== len
|| CHAR_HEAD_P (str
[i
]))
530 while (j
>= 0 && !CHAR_HEAD_P (str
[j
])) j
--;
531 if (j
< 0 || ! BASE_LEADING_CODE_P (str
[j
]))
533 PARSE_MULTIBYTE_SEQ (str
+ j
, len
- j
, bytes
);
534 return (bytes
<= i
- j
? 0 : bytes
- (i
- j
));
537 /* This structure holds information of an argument of `concat' that is
538 a string and has text properties to be copied. */
541 int argnum
; /* refer to ARGS (arguments of `concat') */
542 int from
; /* refer to ARGS[argnum] (argument string) */
543 int to
; /* refer to VAL (the target string) */
547 concat (nargs
, args
, target_type
, last_special
)
550 enum Lisp_Type target_type
;
554 register Lisp_Object tail
;
555 register Lisp_Object
this;
557 int toindex_byte
= 0;
558 register int result_len
;
559 register int result_len_byte
;
561 Lisp_Object last_tail
;
564 /* When we make a multibyte string, we can't copy text properties
565 while concatinating each string because the length of resulting
566 string can't be decided until we finish the whole concatination.
567 So, we record strings that have text properties to be copied
568 here, and copy the text properties after the concatination. */
569 struct textprop_rec
*textprops
= NULL
;
570 /* Number of elments in textprops. */
571 int num_textprops
= 0;
575 /* In append, the last arg isn't treated like the others */
576 if (last_special
&& nargs
> 0)
579 last_tail
= args
[nargs
];
584 /* Canonicalize each argument. */
585 for (argnum
= 0; argnum
< nargs
; argnum
++)
588 if (!(CONSP (this) || NILP (this) || VECTORP (this) || STRINGP (this)
589 || COMPILEDP (this) || BOOL_VECTOR_P (this)))
591 args
[argnum
] = wrong_type_argument (Qsequencep
, this);
595 /* Compute total length in chars of arguments in RESULT_LEN.
596 If desired output is a string, also compute length in bytes
597 in RESULT_LEN_BYTE, and determine in SOME_MULTIBYTE
598 whether the result should be a multibyte string. */
602 for (argnum
= 0; argnum
< nargs
; argnum
++)
606 len
= XFASTINT (Flength (this));
607 if (target_type
== Lisp_String
)
609 /* We must count the number of bytes needed in the string
610 as well as the number of characters. */
616 for (i
= 0; i
< len
; i
++)
618 ch
= XVECTOR (this)->contents
[i
];
620 wrong_type_argument (Qintegerp
, ch
);
621 this_len_byte
= CHAR_BYTES (XINT (ch
));
622 result_len_byte
+= this_len_byte
;
623 if (!SINGLE_BYTE_CHAR_P (XINT (ch
)))
626 else if (BOOL_VECTOR_P (this) && XBOOL_VECTOR (this)->size
> 0)
627 wrong_type_argument (Qintegerp
, Faref (this, make_number (0)));
628 else if (CONSP (this))
629 for (; CONSP (this); this = XCDR (this))
633 wrong_type_argument (Qintegerp
, ch
);
634 this_len_byte
= CHAR_BYTES (XINT (ch
));
635 result_len_byte
+= this_len_byte
;
636 if (!SINGLE_BYTE_CHAR_P (XINT (ch
)))
639 else if (STRINGP (this))
641 if (STRING_MULTIBYTE (this))
644 result_len_byte
+= STRING_BYTES (XSTRING (this));
647 result_len_byte
+= count_size_as_multibyte (XSTRING (this)->data
,
648 XSTRING (this)->size
);
655 if (! some_multibyte
)
656 result_len_byte
= result_len
;
658 /* Create the output object. */
659 if (target_type
== Lisp_Cons
)
660 val
= Fmake_list (make_number (result_len
), Qnil
);
661 else if (target_type
== Lisp_Vectorlike
)
662 val
= Fmake_vector (make_number (result_len
), Qnil
);
663 else if (some_multibyte
)
664 val
= make_uninit_multibyte_string (result_len
, result_len_byte
);
666 val
= make_uninit_string (result_len
);
668 /* In `append', if all but last arg are nil, return last arg. */
669 if (target_type
== Lisp_Cons
&& EQ (val
, Qnil
))
672 /* Copy the contents of the args into the result. */
674 tail
= val
, toindex
= -1; /* -1 in toindex is flag we are making a list */
676 toindex
= 0, toindex_byte
= 0;
681 = (struct textprop_rec
*) alloca (sizeof (struct textprop_rec
) * nargs
);
683 for (argnum
= 0; argnum
< nargs
; argnum
++)
687 register unsigned int thisindex
= 0;
688 register unsigned int thisindex_byte
= 0;
692 thislen
= Flength (this), thisleni
= XINT (thislen
);
694 /* Between strings of the same kind, copy fast. */
695 if (STRINGP (this) && STRINGP (val
)
696 && STRING_MULTIBYTE (this) == some_multibyte
)
698 int thislen_byte
= STRING_BYTES (XSTRING (this));
701 bcopy (XSTRING (this)->data
, XSTRING (val
)->data
+ toindex_byte
,
702 STRING_BYTES (XSTRING (this)));
703 combined
= (some_multibyte
&& toindex_byte
> 0
704 ? count_combining (XSTRING (val
)->data
,
705 toindex_byte
+ thislen_byte
,
708 if (! NULL_INTERVAL_P (XSTRING (this)->intervals
))
710 textprops
[num_textprops
].argnum
= argnum
;
711 /* We ignore text properties on characters being combined. */
712 textprops
[num_textprops
].from
= combined
;
713 textprops
[num_textprops
++].to
= toindex
;
715 toindex_byte
+= thislen_byte
;
716 toindex
+= thisleni
- combined
;
717 XSTRING (val
)->size
-= combined
;
719 /* Copy a single-byte string to a multibyte string. */
720 else if (STRINGP (this) && STRINGP (val
))
722 if (! NULL_INTERVAL_P (XSTRING (this)->intervals
))
724 textprops
[num_textprops
].argnum
= argnum
;
725 textprops
[num_textprops
].from
= 0;
726 textprops
[num_textprops
++].to
= toindex
;
728 toindex_byte
+= copy_text (XSTRING (this)->data
,
729 XSTRING (val
)->data
+ toindex_byte
,
730 XSTRING (this)->size
, 0, 1);
734 /* Copy element by element. */
737 register Lisp_Object elt
;
739 /* Fetch next element of `this' arg into `elt', or break if
740 `this' is exhausted. */
741 if (NILP (this)) break;
743 elt
= XCAR (this), this = XCDR (this);
744 else if (thisindex
>= thisleni
)
746 else if (STRINGP (this))
749 if (STRING_MULTIBYTE (this))
751 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c
, this,
754 XSETFASTINT (elt
, c
);
758 XSETFASTINT (elt
, XSTRING (this)->data
[thisindex
++]);
760 && (XINT (elt
) >= 0240
761 || (XINT (elt
) >= 0200
762 && ! NILP (Vnonascii_translation_table
)))
763 && XINT (elt
) < 0400)
765 c
= unibyte_char_to_multibyte (XINT (elt
));
770 else if (BOOL_VECTOR_P (this))
773 byte
= XBOOL_VECTOR (this)->data
[thisindex
/ BITS_PER_CHAR
];
774 if (byte
& (1 << (thisindex
% BITS_PER_CHAR
)))
781 elt
= XVECTOR (this)->contents
[thisindex
++];
783 /* Store this element into the result. */
790 else if (VECTORP (val
))
791 XVECTOR (val
)->contents
[toindex
++] = elt
;
794 CHECK_NUMBER (elt
, 0);
795 if (SINGLE_BYTE_CHAR_P (XINT (elt
)))
799 += CHAR_STRING (XINT (elt
),
800 XSTRING (val
)->data
+ toindex_byte
);
802 XSTRING (val
)->data
[toindex_byte
++] = XINT (elt
);
805 && count_combining (XSTRING (val
)->data
,
806 toindex_byte
, toindex_byte
- 1))
807 XSTRING (val
)->size
--;
812 /* If we have any multibyte characters,
813 we already decided to make a multibyte string. */
816 /* P exists as a variable
817 to avoid a bug on the Masscomp C compiler. */
818 unsigned char *p
= & XSTRING (val
)->data
[toindex_byte
];
820 toindex_byte
+= CHAR_STRING (c
, p
);
827 XCDR (prev
) = last_tail
;
829 if (num_textprops
> 0)
833 for (argnum
= 0; argnum
< num_textprops
; argnum
++)
835 this = args
[textprops
[argnum
].argnum
];
836 props
= text_property_list (this,
838 make_number (XSTRING (this)->size
),
840 /* If successive arguments have properites, be sure that the
841 value of `composition' property be the copy. */
843 && textprops
[argnum
- 1].argnum
+ 1 == textprops
[argnum
].argnum
)
844 make_composition_value_copy (props
);
845 add_text_properties_from_list (val
, props
,
846 make_number (textprops
[argnum
].to
));
852 static Lisp_Object string_char_byte_cache_string
;
853 static int string_char_byte_cache_charpos
;
854 static int string_char_byte_cache_bytepos
;
857 clear_string_char_byte_cache ()
859 string_char_byte_cache_string
= Qnil
;
862 /* Return the character index corresponding to CHAR_INDEX in STRING. */
865 string_char_to_byte (string
, char_index
)
870 int best_below
, best_below_byte
;
871 int best_above
, best_above_byte
;
873 if (! STRING_MULTIBYTE (string
))
876 best_below
= best_below_byte
= 0;
877 best_above
= XSTRING (string
)->size
;
878 best_above_byte
= STRING_BYTES (XSTRING (string
));
880 if (EQ (string
, string_char_byte_cache_string
))
882 if (string_char_byte_cache_charpos
< char_index
)
884 best_below
= string_char_byte_cache_charpos
;
885 best_below_byte
= string_char_byte_cache_bytepos
;
889 best_above
= string_char_byte_cache_charpos
;
890 best_above_byte
= string_char_byte_cache_bytepos
;
894 if (char_index
- best_below
< best_above
- char_index
)
896 while (best_below
< char_index
)
899 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c
, string
,
900 best_below
, best_below_byte
);
903 i_byte
= best_below_byte
;
907 while (best_above
> char_index
)
909 unsigned char *pend
= XSTRING (string
)->data
+ best_above_byte
;
910 unsigned char *pbeg
= pend
- best_above_byte
;
911 unsigned char *p
= pend
- 1;
914 while (p
> pbeg
&& !CHAR_HEAD_P (*p
)) p
--;
915 PARSE_MULTIBYTE_SEQ (p
, pend
- p
, bytes
);
916 if (bytes
== pend
- p
)
917 best_above_byte
-= bytes
;
918 else if (bytes
> pend
- p
)
919 best_above_byte
-= (pend
- p
);
925 i_byte
= best_above_byte
;
928 string_char_byte_cache_bytepos
= i_byte
;
929 string_char_byte_cache_charpos
= i
;
930 string_char_byte_cache_string
= string
;
935 /* Return the character index corresponding to BYTE_INDEX in STRING. */
938 string_byte_to_char (string
, byte_index
)
943 int best_below
, best_below_byte
;
944 int best_above
, best_above_byte
;
946 if (! STRING_MULTIBYTE (string
))
949 best_below
= best_below_byte
= 0;
950 best_above
= XSTRING (string
)->size
;
951 best_above_byte
= STRING_BYTES (XSTRING (string
));
953 if (EQ (string
, string_char_byte_cache_string
))
955 if (string_char_byte_cache_bytepos
< byte_index
)
957 best_below
= string_char_byte_cache_charpos
;
958 best_below_byte
= string_char_byte_cache_bytepos
;
962 best_above
= string_char_byte_cache_charpos
;
963 best_above_byte
= string_char_byte_cache_bytepos
;
967 if (byte_index
- best_below_byte
< best_above_byte
- byte_index
)
969 while (best_below_byte
< byte_index
)
972 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c
, string
,
973 best_below
, best_below_byte
);
976 i_byte
= best_below_byte
;
980 while (best_above_byte
> byte_index
)
982 unsigned char *pend
= XSTRING (string
)->data
+ best_above_byte
;
983 unsigned char *pbeg
= pend
- best_above_byte
;
984 unsigned char *p
= pend
- 1;
987 while (p
> pbeg
&& !CHAR_HEAD_P (*p
)) p
--;
988 PARSE_MULTIBYTE_SEQ (p
, pend
- p
, bytes
);
989 if (bytes
== pend
- p
)
990 best_above_byte
-= bytes
;
991 else if (bytes
> pend
- p
)
992 best_above_byte
-= (pend
- p
);
998 i_byte
= best_above_byte
;
1001 string_char_byte_cache_bytepos
= i_byte
;
1002 string_char_byte_cache_charpos
= i
;
1003 string_char_byte_cache_string
= string
;
1008 /* Convert STRING to a multibyte string.
1009 Single-byte characters 0240 through 0377 are converted
1010 by adding nonascii_insert_offset to each. */
1013 string_make_multibyte (string
)
1019 if (STRING_MULTIBYTE (string
))
1022 nbytes
= count_size_as_multibyte (XSTRING (string
)->data
,
1023 XSTRING (string
)->size
);
1024 /* If all the chars are ASCII, they won't need any more bytes
1025 once converted. In that case, we can return STRING itself. */
1026 if (nbytes
== STRING_BYTES (XSTRING (string
)))
1029 buf
= (unsigned char *) alloca (nbytes
);
1030 copy_text (XSTRING (string
)->data
, buf
, STRING_BYTES (XSTRING (string
)),
1033 return make_multibyte_string (buf
, XSTRING (string
)->size
, nbytes
);
1036 /* Convert STRING to a single-byte string. */
1039 string_make_unibyte (string
)
1044 if (! STRING_MULTIBYTE (string
))
1047 buf
= (unsigned char *) alloca (XSTRING (string
)->size
);
1049 copy_text (XSTRING (string
)->data
, buf
, STRING_BYTES (XSTRING (string
)),
1052 return make_unibyte_string (buf
, XSTRING (string
)->size
);
1055 DEFUN ("string-make-multibyte", Fstring_make_multibyte
, Sstring_make_multibyte
,
1057 "Return the multibyte equivalent of STRING.\n\
1058 The function `unibyte-char-to-multibyte' is used to convert\n\
1059 each unibyte character to a multibyte character.")
1063 CHECK_STRING (string
, 0);
1065 return string_make_multibyte (string
);
1068 DEFUN ("string-make-unibyte", Fstring_make_unibyte
, Sstring_make_unibyte
,
1070 "Return the unibyte equivalent of STRING.\n\
1071 Multibyte character codes are converted to unibyte\n\
1072 by using just the low 8 bits.")
1076 CHECK_STRING (string
, 0);
1078 return string_make_unibyte (string
);
1081 DEFUN ("string-as-unibyte", Fstring_as_unibyte
, Sstring_as_unibyte
,
1083 "Return a unibyte string with the same individual bytes as STRING.\n\
1084 If STRING is unibyte, the result is STRING itself.\n\
1085 Otherwise it is a newly created string, with no text properties.\n\
1086 If STRING is multibyte and contains a character of charset\n\
1087 `eight-bit-control' or `eight-bit-graphic', it is converted to the\n\
1088 corresponding single byte.")
1092 CHECK_STRING (string
, 0);
1094 if (STRING_MULTIBYTE (string
))
1096 int bytes
= STRING_BYTES (XSTRING (string
));
1097 unsigned char *str
= (unsigned char *) xmalloc (bytes
);
1099 bcopy (XSTRING (string
)->data
, str
, bytes
);
1100 bytes
= str_as_unibyte (str
, bytes
);
1101 string
= make_unibyte_string (str
, bytes
);
1107 DEFUN ("string-as-multibyte", Fstring_as_multibyte
, Sstring_as_multibyte
,
1109 "Return a multibyte string with the same individual bytes as STRING.\n\
1110 If STRING is multibyte, the result is STRING itself.\n\
1111 Otherwise it is a newly created string, with no text properties.\n\
1112 If STRING is unibyte and contains an individual 8-bit byte (i.e. not\n\
1113 part of a multibyte form), it is converted to the corresponding\n\
1114 multibyte character of charset `eight-bit-control' or `eight-bit-graphic'.")
1118 CHECK_STRING (string
, 0);
1120 if (! STRING_MULTIBYTE (string
))
1122 Lisp_Object new_string
;
1125 parse_str_as_multibyte (XSTRING (string
)->data
,
1126 STRING_BYTES (XSTRING (string
)),
1128 new_string
= make_uninit_multibyte_string (nchars
, nbytes
);
1129 bcopy (XSTRING (string
)->data
, XSTRING (new_string
)->data
,
1130 STRING_BYTES (XSTRING (string
)));
1131 if (nbytes
!= STRING_BYTES (XSTRING (string
)))
1132 str_as_multibyte (XSTRING (new_string
)->data
, nbytes
,
1133 STRING_BYTES (XSTRING (string
)), NULL
);
1134 string
= new_string
;
1135 XSTRING (string
)->intervals
= NULL_INTERVAL
;
1140 DEFUN ("copy-alist", Fcopy_alist
, Scopy_alist
, 1, 1, 0,
1141 "Return a copy of ALIST.\n\
1142 This is an alist which represents the same mapping from objects to objects,\n\
1143 but does not share the alist structure with ALIST.\n\
1144 The objects mapped (cars and cdrs of elements of the alist)\n\
1145 are shared, however.\n\
1146 Elements of ALIST that are not conses are also shared.")
1150 register Lisp_Object tem
;
1152 CHECK_LIST (alist
, 0);
1155 alist
= concat (1, &alist
, Lisp_Cons
, 0);
1156 for (tem
= alist
; CONSP (tem
); tem
= XCDR (tem
))
1158 register Lisp_Object car
;
1162 XCAR (tem
) = Fcons (XCAR (car
), XCDR (car
));
1167 DEFUN ("substring", Fsubstring
, Ssubstring
, 2, 3, 0,
1168 "Return a substring of STRING, starting at index FROM and ending before TO.\n\
1169 TO may be nil or omitted; then the substring runs to the end of STRING.\n\
1170 If FROM or TO is negative, it counts from the end.\n\
1172 This function allows vectors as well as strings.")
1175 register Lisp_Object from
, to
;
1180 int from_char
, to_char
;
1181 int from_byte
= 0, to_byte
= 0;
1183 if (! (STRINGP (string
) || VECTORP (string
)))
1184 wrong_type_argument (Qarrayp
, string
);
1186 CHECK_NUMBER (from
, 1);
1188 if (STRINGP (string
))
1190 size
= XSTRING (string
)->size
;
1191 size_byte
= STRING_BYTES (XSTRING (string
));
1194 size
= XVECTOR (string
)->size
;
1199 to_byte
= size_byte
;
1203 CHECK_NUMBER (to
, 2);
1205 to_char
= XINT (to
);
1209 if (STRINGP (string
))
1210 to_byte
= string_char_to_byte (string
, to_char
);
1213 from_char
= XINT (from
);
1216 if (STRINGP (string
))
1217 from_byte
= string_char_to_byte (string
, from_char
);
1219 if (!(0 <= from_char
&& from_char
<= to_char
&& to_char
<= size
))
1220 args_out_of_range_3 (string
, make_number (from_char
),
1221 make_number (to_char
));
1223 if (STRINGP (string
))
1225 res
= make_specified_string (XSTRING (string
)->data
+ from_byte
,
1226 to_char
- from_char
, to_byte
- from_byte
,
1227 STRING_MULTIBYTE (string
));
1228 copy_text_properties (make_number (from_char
), make_number (to_char
),
1229 string
, make_number (0), res
, Qnil
);
1232 res
= Fvector (to_char
- from_char
,
1233 XVECTOR (string
)->contents
+ from_char
);
1238 /* Extract a substring of STRING, giving start and end positions
1239 both in characters and in bytes. */
1242 substring_both (string
, from
, from_byte
, to
, to_byte
)
1244 int from
, from_byte
, to
, to_byte
;
1250 if (! (STRINGP (string
) || VECTORP (string
)))
1251 wrong_type_argument (Qarrayp
, string
);
1253 if (STRINGP (string
))
1255 size
= XSTRING (string
)->size
;
1256 size_byte
= STRING_BYTES (XSTRING (string
));
1259 size
= XVECTOR (string
)->size
;
1261 if (!(0 <= from
&& from
<= to
&& to
<= size
))
1262 args_out_of_range_3 (string
, make_number (from
), make_number (to
));
1264 if (STRINGP (string
))
1266 res
= make_specified_string (XSTRING (string
)->data
+ from_byte
,
1267 to
- from
, to_byte
- from_byte
,
1268 STRING_MULTIBYTE (string
));
1269 copy_text_properties (make_number (from
), make_number (to
),
1270 string
, make_number (0), res
, Qnil
);
1273 res
= Fvector (to
- from
,
1274 XVECTOR (string
)->contents
+ from
);
1279 DEFUN ("nthcdr", Fnthcdr
, Snthcdr
, 2, 2, 0,
1280 "Take cdr N times on LIST, returns the result.")
1283 register Lisp_Object list
;
1285 register int i
, num
;
1286 CHECK_NUMBER (n
, 0);
1288 for (i
= 0; i
< num
&& !NILP (list
); i
++)
1292 wrong_type_argument (Qlistp
, list
);
1298 DEFUN ("nth", Fnth
, Snth
, 2, 2, 0,
1299 "Return the Nth element of LIST.\n\
1300 N counts from zero. If LIST is not that long, nil is returned.")
1302 Lisp_Object n
, list
;
1304 return Fcar (Fnthcdr (n
, list
));
1307 DEFUN ("elt", Felt
, Selt
, 2, 2, 0,
1308 "Return element of SEQUENCE at index N.")
1310 register Lisp_Object sequence
, n
;
1312 CHECK_NUMBER (n
, 0);
1315 if (CONSP (sequence
) || NILP (sequence
))
1316 return Fcar (Fnthcdr (n
, sequence
));
1317 else if (STRINGP (sequence
) || VECTORP (sequence
)
1318 || BOOL_VECTOR_P (sequence
) || CHAR_TABLE_P (sequence
))
1319 return Faref (sequence
, n
);
1321 sequence
= wrong_type_argument (Qsequencep
, sequence
);
1325 DEFUN ("member", Fmember
, Smember
, 2, 2, 0,
1326 "Return non-nil if ELT is an element of LIST. Comparison done with `equal'.\n\
1327 The value is actually the tail of LIST whose car is ELT.")
1329 register Lisp_Object elt
;
1332 register Lisp_Object tail
;
1333 for (tail
= list
; !NILP (tail
); tail
= XCDR (tail
))
1335 register Lisp_Object tem
;
1337 wrong_type_argument (Qlistp
, list
);
1339 if (! NILP (Fequal (elt
, tem
)))
1346 DEFUN ("memq", Fmemq
, Smemq
, 2, 2, 0,
1347 "Return non-nil if ELT is an element of LIST.\n\
1348 Comparison done with EQ. The value is actually the tail of LIST\n\
1351 Lisp_Object elt
, list
;
1355 if (!CONSP (list
) || EQ (XCAR (list
), elt
))
1359 if (!CONSP (list
) || EQ (XCAR (list
), elt
))
1363 if (!CONSP (list
) || EQ (XCAR (list
), elt
))
1370 if (!CONSP (list
) && !NILP (list
))
1371 list
= wrong_type_argument (Qlistp
, list
);
1376 DEFUN ("assq", Fassq
, Sassq
, 2, 2, 0,
1377 "Return non-nil if KEY is `eq' to the car of an element of LIST.\n\
1378 The value is actually the element of LIST whose car is KEY.\n\
1379 Elements of LIST that are not conses are ignored.")
1381 Lisp_Object key
, list
;
1388 || (CONSP (XCAR (list
))
1389 && EQ (XCAR (XCAR (list
)), key
)))
1394 || (CONSP (XCAR (list
))
1395 && EQ (XCAR (XCAR (list
)), key
)))
1400 || (CONSP (XCAR (list
))
1401 && EQ (XCAR (XCAR (list
)), key
)))
1409 result
= XCAR (list
);
1410 else if (NILP (list
))
1413 result
= wrong_type_argument (Qlistp
, list
);
1418 /* Like Fassq but never report an error and do not allow quits.
1419 Use only on lists known never to be circular. */
1422 assq_no_quit (key
, list
)
1423 Lisp_Object key
, list
;
1426 && (!CONSP (XCAR (list
))
1427 || !EQ (XCAR (XCAR (list
)), key
)))
1430 return CONSP (list
) ? XCAR (list
) : Qnil
;
1433 DEFUN ("assoc", Fassoc
, Sassoc
, 2, 2, 0,
1434 "Return non-nil if KEY is `equal' to the car of an element of LIST.\n\
1435 The value is actually the element of LIST whose car equals KEY.")
1437 Lisp_Object key
, list
;
1439 Lisp_Object result
, car
;
1444 || (CONSP (XCAR (list
))
1445 && (car
= XCAR (XCAR (list
)),
1446 EQ (car
, key
) || !NILP (Fequal (car
, key
)))))
1451 || (CONSP (XCAR (list
))
1452 && (car
= XCAR (XCAR (list
)),
1453 EQ (car
, key
) || !NILP (Fequal (car
, key
)))))
1458 || (CONSP (XCAR (list
))
1459 && (car
= XCAR (XCAR (list
)),
1460 EQ (car
, key
) || !NILP (Fequal (car
, key
)))))
1468 result
= XCAR (list
);
1469 else if (NILP (list
))
1472 result
= wrong_type_argument (Qlistp
, list
);
1477 DEFUN ("rassq", Frassq
, Srassq
, 2, 2, 0,
1478 "Return non-nil if KEY is `eq' to the cdr of an element of LIST.\n\
1479 The value is actually the element of LIST whose cdr is KEY.")
1481 register Lisp_Object key
;
1489 || (CONSP (XCAR (list
))
1490 && EQ (XCDR (XCAR (list
)), key
)))
1495 || (CONSP (XCAR (list
))
1496 && EQ (XCDR (XCAR (list
)), key
)))
1501 || (CONSP (XCAR (list
))
1502 && EQ (XCDR (XCAR (list
)), key
)))
1511 else if (CONSP (list
))
1512 result
= XCAR (list
);
1514 result
= wrong_type_argument (Qlistp
, list
);
1519 DEFUN ("rassoc", Frassoc
, Srassoc
, 2, 2, 0,
1520 "Return non-nil if KEY is `equal' to the cdr of an element of LIST.\n\
1521 The value is actually the element of LIST whose cdr equals KEY.")
1523 Lisp_Object key
, list
;
1525 Lisp_Object result
, cdr
;
1530 || (CONSP (XCAR (list
))
1531 && (cdr
= XCDR (XCAR (list
)),
1532 EQ (cdr
, key
) || !NILP (Fequal (cdr
, key
)))))
1537 || (CONSP (XCAR (list
))
1538 && (cdr
= XCDR (XCAR (list
)),
1539 EQ (cdr
, key
) || !NILP (Fequal (cdr
, key
)))))
1544 || (CONSP (XCAR (list
))
1545 && (cdr
= XCDR (XCAR (list
)),
1546 EQ (cdr
, key
) || !NILP (Fequal (cdr
, key
)))))
1554 result
= XCAR (list
);
1555 else if (NILP (list
))
1558 result
= wrong_type_argument (Qlistp
, list
);
1563 DEFUN ("delq", Fdelq
, Sdelq
, 2, 2, 0,
1564 "Delete by side effect any occurrences of ELT as a member of LIST.\n\
1565 The modified LIST is returned. Comparison is done with `eq'.\n\
1566 If the first member of LIST is ELT, there is no way to remove it by side effect;\n\
1567 therefore, write `(setq foo (delq element foo))'\n\
1568 to be sure of changing the value of `foo'.")
1570 register Lisp_Object elt
;
1573 register Lisp_Object tail
, prev
;
1574 register Lisp_Object tem
;
1578 while (!NILP (tail
))
1581 wrong_type_argument (Qlistp
, list
);
1588 Fsetcdr (prev
, XCDR (tail
));
1598 DEFUN ("delete", Fdelete
, Sdelete
, 2, 2, 0,
1599 "Delete by side effect any occurrences of ELT as a member of SEQ.\n\
1600 SEQ must be a list, a vector, or a string.\n\
1601 The modified SEQ is returned. Comparison is done with `equal'.\n\
1602 If SEQ is not a list, or the first member of SEQ is ELT, deleting it\n\
1603 is not a side effect; it is simply using a different sequence.\n\
1604 Therefore, write `(setq foo (delete element foo))'\n\
1605 to be sure of changing the value of `foo'.")
1607 Lisp_Object elt
, seq
;
1611 EMACS_INT i
, n
, size
;
1613 for (i
= n
= 0; i
< ASIZE (seq
); ++i
)
1614 if (NILP (Fequal (AREF (seq
, i
), elt
)))
1617 if (n
!= ASIZE (seq
))
1619 struct Lisp_Vector
*p
= allocate_vectorlike (n
);
1621 for (i
= n
= 0; i
< ASIZE (seq
); ++i
)
1622 if (NILP (Fequal (AREF (seq
, i
), elt
)))
1623 p
->contents
[n
++] = AREF (seq
, i
);
1626 XSETVECTOR (seq
, p
);
1629 else if (STRINGP (seq
))
1631 EMACS_INT i
, ibyte
, nchars
, nbytes
, cbytes
;
1634 for (i
= nchars
= nbytes
= ibyte
= 0;
1635 i
< XSTRING (seq
)->size
;
1636 ++i
, ibyte
+= cbytes
)
1638 if (STRING_MULTIBYTE (seq
))
1640 c
= STRING_CHAR (&XSTRING (seq
)->data
[ibyte
],
1641 STRING_BYTES (XSTRING (seq
)) - ibyte
);
1642 cbytes
= CHAR_BYTES (c
);
1646 c
= XSTRING (seq
)->data
[i
];
1650 if (!INTEGERP (elt
) || c
!= XINT (elt
))
1657 if (nchars
!= XSTRING (seq
)->size
)
1661 tem
= make_uninit_multibyte_string (nchars
, nbytes
);
1662 if (!STRING_MULTIBYTE (seq
))
1663 SET_STRING_BYTES (XSTRING (tem
), -1);
1665 for (i
= nchars
= nbytes
= ibyte
= 0;
1666 i
< XSTRING (seq
)->size
;
1667 ++i
, ibyte
+= cbytes
)
1669 if (STRING_MULTIBYTE (seq
))
1671 c
= STRING_CHAR (&XSTRING (seq
)->data
[ibyte
],
1672 STRING_BYTES (XSTRING (seq
)) - ibyte
);
1673 cbytes
= CHAR_BYTES (c
);
1677 c
= XSTRING (seq
)->data
[i
];
1681 if (!INTEGERP (elt
) || c
!= XINT (elt
))
1683 unsigned char *from
= &XSTRING (seq
)->data
[ibyte
];
1684 unsigned char *to
= &XSTRING (tem
)->data
[nbytes
];
1690 for (n
= cbytes
; n
--; )
1700 Lisp_Object tail
, prev
;
1702 for (tail
= seq
, prev
= Qnil
; !NILP (tail
); tail
= XCDR (tail
))
1705 wrong_type_argument (Qlistp
, seq
);
1707 if (!NILP (Fequal (elt
, XCAR (tail
))))
1712 Fsetcdr (prev
, XCDR (tail
));
1723 DEFUN ("nreverse", Fnreverse
, Snreverse
, 1, 1, 0,
1724 "Reverse LIST by modifying cdr pointers.\n\
1725 Returns the beginning of the reversed list.")
1729 register Lisp_Object prev
, tail
, next
;
1731 if (NILP (list
)) return list
;
1734 while (!NILP (tail
))
1738 wrong_type_argument (Qlistp
, list
);
1740 Fsetcdr (tail
, prev
);
1747 DEFUN ("reverse", Freverse
, Sreverse
, 1, 1, 0,
1748 "Reverse LIST, copying. Returns the beginning of the reversed list.\n\
1749 See also the function `nreverse', which is used more often.")
1755 for (new = Qnil
; CONSP (list
); list
= XCDR (list
))
1756 new = Fcons (XCAR (list
), new);
1758 wrong_type_argument (Qconsp
, list
);
1762 Lisp_Object
merge ();
1764 DEFUN ("sort", Fsort
, Ssort
, 2, 2, 0,
1765 "Sort LIST, stably, comparing elements using PREDICATE.\n\
1766 Returns the sorted list. LIST is modified by side effects.\n\
1767 PREDICATE is called with two elements of LIST, and should return T\n\
1768 if the first element is \"less\" than the second.")
1770 Lisp_Object list
, predicate
;
1772 Lisp_Object front
, back
;
1773 register Lisp_Object len
, tem
;
1774 struct gcpro gcpro1
, gcpro2
;
1775 register int length
;
1778 len
= Flength (list
);
1779 length
= XINT (len
);
1783 XSETINT (len
, (length
/ 2) - 1);
1784 tem
= Fnthcdr (len
, list
);
1786 Fsetcdr (tem
, Qnil
);
1788 GCPRO2 (front
, back
);
1789 front
= Fsort (front
, predicate
);
1790 back
= Fsort (back
, predicate
);
1792 return merge (front
, back
, predicate
);
1796 merge (org_l1
, org_l2
, pred
)
1797 Lisp_Object org_l1
, org_l2
;
1801 register Lisp_Object tail
;
1803 register Lisp_Object l1
, l2
;
1804 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
;
1811 /* It is sufficient to protect org_l1 and org_l2.
1812 When l1 and l2 are updated, we copy the new values
1813 back into the org_ vars. */
1814 GCPRO4 (org_l1
, org_l2
, pred
, value
);
1834 tem
= call2 (pred
, Fcar (l2
), Fcar (l1
));
1850 Fsetcdr (tail
, tem
);
1856 DEFUN ("plist-get", Fplist_get
, Splist_get
, 2, 2, 0,
1857 "Extract a value from a property list.\n\
1858 PLIST is a property list, which is a list of the form\n\
1859 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value\n\
1860 corresponding to the given PROP, or nil if PROP is not\n\
1861 one of the properties on the list.")
1864 register Lisp_Object prop
;
1866 register Lisp_Object tail
;
1867 for (tail
= plist
; !NILP (tail
); tail
= Fcdr (XCDR (tail
)))
1869 register Lisp_Object tem
;
1872 return Fcar (XCDR (tail
));
1877 DEFUN ("get", Fget
, Sget
, 2, 2, 0,
1878 "Return the value of SYMBOL's PROPNAME property.\n\
1879 This is the last value stored with `(put SYMBOL PROPNAME VALUE)'.")
1881 Lisp_Object symbol
, propname
;
1883 CHECK_SYMBOL (symbol
, 0);
1884 return Fplist_get (XSYMBOL (symbol
)->plist
, propname
);
1887 DEFUN ("plist-put", Fplist_put
, Splist_put
, 3, 3, 0,
1888 "Change value in PLIST of PROP to VAL.\n\
1889 PLIST is a property list, which is a list of the form\n\
1890 \(PROP1 VALUE1 PROP2 VALUE2 ...). PROP is a symbol and VAL is any object.\n\
1891 If PROP is already a property on the list, its value is set to VAL,\n\
1892 otherwise the new PROP VAL pair is added. The new plist is returned;\n\
1893 use `(setq x (plist-put x prop val))' to be sure to use the new value.\n\
1894 The PLIST is modified by side effects.")
1897 register Lisp_Object prop
;
1900 register Lisp_Object tail
, prev
;
1901 Lisp_Object newcell
;
1903 for (tail
= plist
; CONSP (tail
) && CONSP (XCDR (tail
));
1904 tail
= XCDR (XCDR (tail
)))
1906 if (EQ (prop
, XCAR (tail
)))
1908 Fsetcar (XCDR (tail
), val
);
1913 newcell
= Fcons (prop
, Fcons (val
, Qnil
));
1917 Fsetcdr (XCDR (prev
), newcell
);
1921 DEFUN ("put", Fput
, Sput
, 3, 3, 0,
1922 "Store SYMBOL's PROPNAME property with value VALUE.\n\
1923 It can be retrieved with `(get SYMBOL PROPNAME)'.")
1924 (symbol
, propname
, value
)
1925 Lisp_Object symbol
, propname
, value
;
1927 CHECK_SYMBOL (symbol
, 0);
1928 XSYMBOL (symbol
)->plist
1929 = Fplist_put (XSYMBOL (symbol
)->plist
, propname
, value
);
1933 DEFUN ("equal", Fequal
, Sequal
, 2, 2, 0,
1934 "Return t if two Lisp objects have similar structure and contents.\n\
1935 They must have the same data type.\n\
1936 Conses are compared by comparing the cars and the cdrs.\n\
1937 Vectors and strings are compared element by element.\n\
1938 Numbers are compared by value, but integers cannot equal floats.\n\
1939 (Use `=' if you want integers and floats to be able to be equal.)\n\
1940 Symbols must match exactly.")
1942 register Lisp_Object o1
, o2
;
1944 return internal_equal (o1
, o2
, 0) ? Qt
: Qnil
;
1948 internal_equal (o1
, o2
, depth
)
1949 register Lisp_Object o1
, o2
;
1953 error ("Stack overflow in equal");
1959 if (XTYPE (o1
) != XTYPE (o2
))
1965 return (extract_float (o1
) == extract_float (o2
));
1968 if (!internal_equal (XCAR (o1
), XCAR (o2
), depth
+ 1))
1975 if (XMISCTYPE (o1
) != XMISCTYPE (o2
))
1979 if (!internal_equal (OVERLAY_START (o1
), OVERLAY_START (o2
),
1981 || !internal_equal (OVERLAY_END (o1
), OVERLAY_END (o2
),
1984 o1
= XOVERLAY (o1
)->plist
;
1985 o2
= XOVERLAY (o2
)->plist
;
1990 return (XMARKER (o1
)->buffer
== XMARKER (o2
)->buffer
1991 && (XMARKER (o1
)->buffer
== 0
1992 || XMARKER (o1
)->bytepos
== XMARKER (o2
)->bytepos
));
1996 case Lisp_Vectorlike
:
1998 register int i
, size
;
1999 size
= XVECTOR (o1
)->size
;
2000 /* Pseudovectors have the type encoded in the size field, so this test
2001 actually checks that the objects have the same type as well as the
2003 if (XVECTOR (o2
)->size
!= size
)
2005 /* Boolvectors are compared much like strings. */
2006 if (BOOL_VECTOR_P (o1
))
2009 = (XBOOL_VECTOR (o1
)->size
+ BITS_PER_CHAR
- 1) / BITS_PER_CHAR
;
2011 if (XBOOL_VECTOR (o1
)->size
!= XBOOL_VECTOR (o2
)->size
)
2013 if (bcmp (XBOOL_VECTOR (o1
)->data
, XBOOL_VECTOR (o2
)->data
,
2018 if (WINDOW_CONFIGURATIONP (o1
))
2019 return compare_window_configurations (o1
, o2
, 0);
2021 /* Aside from them, only true vectors, char-tables, and compiled
2022 functions are sensible to compare, so eliminate the others now. */
2023 if (size
& PSEUDOVECTOR_FLAG
)
2025 if (!(size
& (PVEC_COMPILED
| PVEC_CHAR_TABLE
)))
2027 size
&= PSEUDOVECTOR_SIZE_MASK
;
2029 for (i
= 0; i
< size
; i
++)
2032 v1
= XVECTOR (o1
)->contents
[i
];
2033 v2
= XVECTOR (o2
)->contents
[i
];
2034 if (!internal_equal (v1
, v2
, depth
+ 1))
2042 if (XSTRING (o1
)->size
!= XSTRING (o2
)->size
)
2044 if (STRING_BYTES (XSTRING (o1
)) != STRING_BYTES (XSTRING (o2
)))
2046 if (bcmp (XSTRING (o1
)->data
, XSTRING (o2
)->data
,
2047 STRING_BYTES (XSTRING (o1
))))
2053 case Lisp_Type_Limit
:
2060 extern Lisp_Object
Fmake_char_internal ();
2062 DEFUN ("fillarray", Ffillarray
, Sfillarray
, 2, 2, 0,
2063 "Store each element of ARRAY with ITEM.\n\
2064 ARRAY is a vector, string, char-table, or bool-vector.")
2066 Lisp_Object array
, item
;
2068 register int size
, index
, charval
;
2070 if (VECTORP (array
))
2072 register Lisp_Object
*p
= XVECTOR (array
)->contents
;
2073 size
= XVECTOR (array
)->size
;
2074 for (index
= 0; index
< size
; index
++)
2077 else if (CHAR_TABLE_P (array
))
2079 register Lisp_Object
*p
= XCHAR_TABLE (array
)->contents
;
2080 size
= CHAR_TABLE_ORDINARY_SLOTS
;
2081 for (index
= 0; index
< size
; index
++)
2083 XCHAR_TABLE (array
)->defalt
= Qnil
;
2085 else if (STRINGP (array
))
2087 register unsigned char *p
= XSTRING (array
)->data
;
2088 CHECK_NUMBER (item
, 1);
2089 charval
= XINT (item
);
2090 size
= XSTRING (array
)->size
;
2091 if (STRING_MULTIBYTE (array
))
2093 unsigned char str
[MAX_MULTIBYTE_LENGTH
];
2094 int len
= CHAR_STRING (charval
, str
);
2095 int size_byte
= STRING_BYTES (XSTRING (array
));
2096 unsigned char *p1
= p
, *endp
= p
+ size_byte
;
2099 if (size
!= size_byte
)
2102 int this_len
= MULTIBYTE_FORM_LENGTH (p1
, endp
- p1
);
2103 if (len
!= this_len
)
2104 error ("Attempt to change byte length of a string");
2107 for (i
= 0; i
< size_byte
; i
++)
2108 *p
++ = str
[i
% len
];
2111 for (index
= 0; index
< size
; index
++)
2114 else if (BOOL_VECTOR_P (array
))
2116 register unsigned char *p
= XBOOL_VECTOR (array
)->data
;
2118 = (XBOOL_VECTOR (array
)->size
+ BITS_PER_CHAR
- 1) / BITS_PER_CHAR
;
2120 charval
= (! NILP (item
) ? -1 : 0);
2121 for (index
= 0; index
< size_in_chars
; index
++)
2126 array
= wrong_type_argument (Qarrayp
, array
);
2132 DEFUN ("char-table-subtype", Fchar_table_subtype
, Schar_table_subtype
,
2134 "Return the subtype of char-table CHAR-TABLE. The value is a symbol.")
2136 Lisp_Object char_table
;
2138 CHECK_CHAR_TABLE (char_table
, 0);
2140 return XCHAR_TABLE (char_table
)->purpose
;
2143 DEFUN ("char-table-parent", Fchar_table_parent
, Schar_table_parent
,
2145 "Return the parent char-table of CHAR-TABLE.\n\
2146 The value is either nil or another char-table.\n\
2147 If CHAR-TABLE holds nil for a given character,\n\
2148 then the actual applicable value is inherited from the parent char-table\n\
2149 \(or from its parents, if necessary).")
2151 Lisp_Object char_table
;
2153 CHECK_CHAR_TABLE (char_table
, 0);
2155 return XCHAR_TABLE (char_table
)->parent
;
2158 DEFUN ("set-char-table-parent", Fset_char_table_parent
, Sset_char_table_parent
,
2160 "Set the parent char-table of CHAR-TABLE to PARENT.\n\
2161 PARENT must be either nil or another char-table.")
2162 (char_table
, parent
)
2163 Lisp_Object char_table
, parent
;
2167 CHECK_CHAR_TABLE (char_table
, 0);
2171 CHECK_CHAR_TABLE (parent
, 0);
2173 for (temp
= parent
; !NILP (temp
); temp
= XCHAR_TABLE (temp
)->parent
)
2174 if (EQ (temp
, char_table
))
2175 error ("Attempt to make a chartable be its own parent");
2178 XCHAR_TABLE (char_table
)->parent
= parent
;
2183 DEFUN ("char-table-extra-slot", Fchar_table_extra_slot
, Schar_table_extra_slot
,
2185 "Return the value of CHAR-TABLE's extra-slot number N.")
2187 Lisp_Object char_table
, n
;
2189 CHECK_CHAR_TABLE (char_table
, 1);
2190 CHECK_NUMBER (n
, 2);
2192 || XINT (n
) >= CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (char_table
)))
2193 args_out_of_range (char_table
, n
);
2195 return XCHAR_TABLE (char_table
)->extras
[XINT (n
)];
2198 DEFUN ("set-char-table-extra-slot", Fset_char_table_extra_slot
,
2199 Sset_char_table_extra_slot
,
2201 "Set CHAR-TABLE's extra-slot number N to VALUE.")
2202 (char_table
, n
, value
)
2203 Lisp_Object char_table
, n
, value
;
2205 CHECK_CHAR_TABLE (char_table
, 1);
2206 CHECK_NUMBER (n
, 2);
2208 || XINT (n
) >= CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (char_table
)))
2209 args_out_of_range (char_table
, n
);
2211 return XCHAR_TABLE (char_table
)->extras
[XINT (n
)] = value
;
2214 DEFUN ("char-table-range", Fchar_table_range
, Schar_table_range
,
2216 "Return the value in CHAR-TABLE for a range of characters RANGE.\n\
2217 RANGE should be nil (for the default value)\n\
2218 a vector which identifies a character set or a row of a character set,\n\
2219 a character set name, or a character code.")
2221 Lisp_Object char_table
, range
;
2223 CHECK_CHAR_TABLE (char_table
, 0);
2225 if (EQ (range
, Qnil
))
2226 return XCHAR_TABLE (char_table
)->defalt
;
2227 else if (INTEGERP (range
))
2228 return Faref (char_table
, range
);
2229 else if (SYMBOLP (range
))
2231 Lisp_Object charset_info
;
2233 charset_info
= Fget (range
, Qcharset
);
2234 CHECK_VECTOR (charset_info
, 0);
2236 return Faref (char_table
,
2237 make_number (XINT (XVECTOR (charset_info
)->contents
[0])
2240 else if (VECTORP (range
))
2242 if (XVECTOR (range
)->size
== 1)
2243 return Faref (char_table
,
2244 make_number (XINT (XVECTOR (range
)->contents
[0]) + 128));
2247 int size
= XVECTOR (range
)->size
;
2248 Lisp_Object
*val
= XVECTOR (range
)->contents
;
2249 Lisp_Object ch
= Fmake_char_internal (size
<= 0 ? Qnil
: val
[0],
2250 size
<= 1 ? Qnil
: val
[1],
2251 size
<= 2 ? Qnil
: val
[2]);
2252 return Faref (char_table
, ch
);
2256 error ("Invalid RANGE argument to `char-table-range'");
2260 DEFUN ("set-char-table-range", Fset_char_table_range
, Sset_char_table_range
,
2262 "Set the value in CHAR-TABLE for a range of characters RANGE to VALUE.\n\
2263 RANGE should be t (for all characters), nil (for the default value)\n\
2264 a vector which identifies a character set or a row of a character set,\n\
2265 a coding system, or a character code.")
2266 (char_table
, range
, value
)
2267 Lisp_Object char_table
, range
, value
;
2271 CHECK_CHAR_TABLE (char_table
, 0);
2274 for (i
= 0; i
< CHAR_TABLE_ORDINARY_SLOTS
; i
++)
2275 XCHAR_TABLE (char_table
)->contents
[i
] = value
;
2276 else if (EQ (range
, Qnil
))
2277 XCHAR_TABLE (char_table
)->defalt
= value
;
2278 else if (SYMBOLP (range
))
2280 Lisp_Object charset_info
;
2282 charset_info
= Fget (range
, Qcharset
);
2283 CHECK_VECTOR (charset_info
, 0);
2285 return Faset (char_table
,
2286 make_number (XINT (XVECTOR (charset_info
)->contents
[0])
2290 else if (INTEGERP (range
))
2291 Faset (char_table
, range
, value
);
2292 else if (VECTORP (range
))
2294 if (XVECTOR (range
)->size
== 1)
2295 return Faset (char_table
,
2296 make_number (XINT (XVECTOR (range
)->contents
[0]) + 128),
2300 int size
= XVECTOR (range
)->size
;
2301 Lisp_Object
*val
= XVECTOR (range
)->contents
;
2302 Lisp_Object ch
= Fmake_char_internal (size
<= 0 ? Qnil
: val
[0],
2303 size
<= 1 ? Qnil
: val
[1],
2304 size
<= 2 ? Qnil
: val
[2]);
2305 return Faset (char_table
, ch
, value
);
2309 error ("Invalid RANGE argument to `set-char-table-range'");
2314 DEFUN ("set-char-table-default", Fset_char_table_default
,
2315 Sset_char_table_default
, 3, 3, 0,
2316 "Set the default value in CHAR-TABLE for a generic character CHAR to VALUE.\n\
2317 The generic character specifies the group of characters.\n\
2318 See also the documentation of make-char.")
2319 (char_table
, ch
, value
)
2320 Lisp_Object char_table
, ch
, value
;
2322 int c
, charset
, code1
, code2
;
2325 CHECK_CHAR_TABLE (char_table
, 0);
2326 CHECK_NUMBER (ch
, 1);
2329 SPLIT_CHAR (c
, charset
, code1
, code2
);
2331 /* Since we may want to set the default value for a character set
2332 not yet defined, we check only if the character set is in the
2333 valid range or not, instead of it is already defined or not. */
2334 if (! CHARSET_VALID_P (charset
))
2335 invalid_character (c
);
2337 if (charset
== CHARSET_ASCII
)
2338 return (XCHAR_TABLE (char_table
)->defalt
= value
);
2340 /* Even if C is not a generic char, we had better behave as if a
2341 generic char is specified. */
2342 if (CHARSET_DIMENSION (charset
) == 1)
2344 temp
= XCHAR_TABLE (char_table
)->contents
[charset
+ 128];
2347 if (SUB_CHAR_TABLE_P (temp
))
2348 XCHAR_TABLE (temp
)->defalt
= value
;
2350 XCHAR_TABLE (char_table
)->contents
[charset
+ 128] = value
;
2354 if (! SUB_CHAR_TABLE_P (char_table
))
2355 char_table
= (XCHAR_TABLE (char_table
)->contents
[charset
+ 128]
2356 = make_sub_char_table (temp
));
2357 temp
= XCHAR_TABLE (char_table
)->contents
[code1
];
2358 if (SUB_CHAR_TABLE_P (temp
))
2359 XCHAR_TABLE (temp
)->defalt
= value
;
2361 XCHAR_TABLE (char_table
)->contents
[code1
] = value
;
2365 /* Look up the element in TABLE at index CH,
2366 and return it as an integer.
2367 If the element is nil, return CH itself.
2368 (Actually we do that for any non-integer.) */
2371 char_table_translate (table
, ch
)
2376 value
= Faref (table
, make_number (ch
));
2377 if (! INTEGERP (value
))
2379 return XINT (value
);
2383 optimize_sub_char_table (table
, chars
)
2391 from
= 33, to
= 127;
2393 from
= 32, to
= 128;
2395 if (!SUB_CHAR_TABLE_P (*table
))
2397 elt
= XCHAR_TABLE (*table
)->contents
[from
++];
2398 for (; from
< to
; from
++)
2399 if (NILP (Fequal (elt
, XCHAR_TABLE (*table
)->contents
[from
])))
2404 DEFUN ("optimize-char-table", Foptimize_char_table
, Soptimize_char_table
,
2406 "Optimize char table TABLE.")
2414 CHECK_CHAR_TABLE (table
, 0);
2416 for (i
= CHAR_TABLE_SINGLE_BYTE_SLOTS
; i
< CHAR_TABLE_ORDINARY_SLOTS
; i
++)
2418 elt
= XCHAR_TABLE (table
)->contents
[i
];
2419 if (!SUB_CHAR_TABLE_P (elt
))
2421 dim
= CHARSET_DIMENSION (i
);
2423 for (j
= 32; j
< SUB_CHAR_TABLE_ORDINARY_SLOTS
; j
++)
2424 optimize_sub_char_table (XCHAR_TABLE (elt
)->contents
+ j
, dim
);
2425 optimize_sub_char_table (XCHAR_TABLE (table
)->contents
+ i
, dim
);
2431 /* Map C_FUNCTION or FUNCTION over SUBTABLE, calling it for each
2432 character or group of characters that share a value.
2433 DEPTH is the current depth in the originally specified
2434 chartable, and INDICES contains the vector indices
2435 for the levels our callers have descended.
2437 ARG is passed to C_FUNCTION when that is called. */
2440 map_char_table (c_function
, function
, subtable
, arg
, depth
, indices
)
2441 void (*c_function
) P_ ((Lisp_Object
, Lisp_Object
, Lisp_Object
));
2442 Lisp_Object function
, subtable
, arg
, *indices
;
2449 /* At first, handle ASCII and 8-bit European characters. */
2450 for (i
= 0; i
< CHAR_TABLE_SINGLE_BYTE_SLOTS
; i
++)
2452 Lisp_Object elt
= XCHAR_TABLE (subtable
)->contents
[i
];
2454 (*c_function
) (arg
, make_number (i
), elt
);
2456 call2 (function
, make_number (i
), elt
);
2458 #if 0 /* If the char table has entries for higher characters,
2459 we should report them. */
2460 if (NILP (current_buffer
->enable_multibyte_characters
))
2463 to
= CHAR_TABLE_ORDINARY_SLOTS
;
2467 int charset
= XFASTINT (indices
[0]) - 128;
2470 to
= SUB_CHAR_TABLE_ORDINARY_SLOTS
;
2471 if (CHARSET_CHARS (charset
) == 94)
2480 elt
= XCHAR_TABLE (subtable
)->contents
[i
];
2481 XSETFASTINT (indices
[depth
], i
);
2482 charset
= XFASTINT (indices
[0]) - 128;
2484 && (!CHARSET_DEFINED_P (charset
)
2485 || charset
== CHARSET_8_BIT_CONTROL
2486 || charset
== CHARSET_8_BIT_GRAPHIC
))
2489 if (SUB_CHAR_TABLE_P (elt
))
2492 error ("Too deep char table");
2493 map_char_table (c_function
, function
, elt
, arg
, depth
+ 1, indices
);
2500 elt
= XCHAR_TABLE (subtable
)->defalt
;
2501 c1
= depth
>= 1 ? XFASTINT (indices
[1]) : 0;
2502 c2
= depth
>= 2 ? XFASTINT (indices
[2]) : 0;
2503 c
= MAKE_CHAR (charset
, c1
, c2
);
2505 (*c_function
) (arg
, make_number (c
), elt
);
2507 call2 (function
, make_number (c
), elt
);
2512 DEFUN ("map-char-table", Fmap_char_table
, Smap_char_table
,
2514 "Call FUNCTION for each (normal and generic) characters in CHAR-TABLE.\n\
2515 FUNCTION is called with two arguments--a key and a value.\n\
2516 The key is always a possible IDX argument to `aref'.")
2517 (function
, char_table
)
2518 Lisp_Object function
, char_table
;
2520 /* The depth of char table is at most 3. */
2521 Lisp_Object indices
[3];
2523 CHECK_CHAR_TABLE (char_table
, 1);
2525 map_char_table (NULL
, function
, char_table
, char_table
, 0, indices
);
2529 /* Return a value for character C in char-table TABLE. Store the
2530 actual index for that value in *IDX. Ignore the default value of
2534 char_table_ref_and_index (table
, c
, idx
)
2538 int charset
, c1
, c2
;
2541 if (SINGLE_BYTE_CHAR_P (c
))
2544 return XCHAR_TABLE (table
)->contents
[c
];
2546 SPLIT_CHAR (c
, charset
, c1
, c2
);
2547 elt
= XCHAR_TABLE (table
)->contents
[charset
+ 128];
2548 *idx
= MAKE_CHAR (charset
, 0, 0);
2549 if (!SUB_CHAR_TABLE_P (elt
))
2551 if (c1
< 32 || NILP (XCHAR_TABLE (elt
)->contents
[c1
]))
2552 return XCHAR_TABLE (elt
)->defalt
;
2553 elt
= XCHAR_TABLE (elt
)->contents
[c1
];
2554 *idx
= MAKE_CHAR (charset
, c1
, 0);
2555 if (!SUB_CHAR_TABLE_P (elt
))
2557 if (c2
< 32 || NILP (XCHAR_TABLE (elt
)->contents
[c2
]))
2558 return XCHAR_TABLE (elt
)->defalt
;
2560 return XCHAR_TABLE (elt
)->contents
[c2
];
2570 Lisp_Object args
[2];
2573 return Fnconc (2, args
);
2575 return Fnconc (2, &s1
);
2576 #endif /* NO_ARG_ARRAY */
2579 DEFUN ("nconc", Fnconc
, Snconc
, 0, MANY
, 0,
2580 "Concatenate any number of lists by altering them.\n\
2581 Only the last argument is not altered, and need not be a list.")
2586 register int argnum
;
2587 register Lisp_Object tail
, tem
, val
;
2591 for (argnum
= 0; argnum
< nargs
; argnum
++)
2594 if (NILP (tem
)) continue;
2599 if (argnum
+ 1 == nargs
) break;
2602 tem
= wrong_type_argument (Qlistp
, tem
);
2611 tem
= args
[argnum
+ 1];
2612 Fsetcdr (tail
, tem
);
2614 args
[argnum
+ 1] = tail
;
2620 /* This is the guts of all mapping functions.
2621 Apply FN to each element of SEQ, one by one,
2622 storing the results into elements of VALS, a C vector of Lisp_Objects.
2623 LENI is the length of VALS, which should also be the length of SEQ. */
2626 mapcar1 (leni
, vals
, fn
, seq
)
2629 Lisp_Object fn
, seq
;
2631 register Lisp_Object tail
;
2634 struct gcpro gcpro1
, gcpro2
, gcpro3
;
2638 /* Don't let vals contain any garbage when GC happens. */
2639 for (i
= 0; i
< leni
; i
++)
2642 GCPRO3 (dummy
, fn
, seq
);
2644 gcpro1
.nvars
= leni
;
2648 /* We need not explicitly protect `tail' because it is used only on lists, and
2649 1) lists are not relocated and 2) the list is marked via `seq' so will not be freed */
2653 for (i
= 0; i
< leni
; i
++)
2655 dummy
= XVECTOR (seq
)->contents
[i
];
2656 dummy
= call1 (fn
, dummy
);
2661 else if (BOOL_VECTOR_P (seq
))
2663 for (i
= 0; i
< leni
; i
++)
2666 byte
= XBOOL_VECTOR (seq
)->data
[i
/ BITS_PER_CHAR
];
2667 if (byte
& (1 << (i
% BITS_PER_CHAR
)))
2672 dummy
= call1 (fn
, dummy
);
2677 else if (STRINGP (seq
))
2681 for (i
= 0, i_byte
= 0; i
< leni
;)
2686 FETCH_STRING_CHAR_ADVANCE (c
, seq
, i
, i_byte
);
2687 XSETFASTINT (dummy
, c
);
2688 dummy
= call1 (fn
, dummy
);
2690 vals
[i_before
] = dummy
;
2693 else /* Must be a list, since Flength did not get an error */
2696 for (i
= 0; i
< leni
; i
++)
2698 dummy
= call1 (fn
, Fcar (tail
));
2708 DEFUN ("mapconcat", Fmapconcat
, Smapconcat
, 3, 3, 0,
2709 "Apply FUNCTION to each element of SEQUENCE, and concat the results as strings.\n\
2710 In between each pair of results, stick in SEPARATOR. Thus, \" \" as\n\
2711 SEPARATOR results in spaces between the values returned by FUNCTION.\n\
2712 SEQUENCE may be a list, a vector, a bool-vector, or a string.")
2713 (function
, sequence
, separator
)
2714 Lisp_Object function
, sequence
, separator
;
2719 register Lisp_Object
*args
;
2721 struct gcpro gcpro1
;
2723 len
= Flength (sequence
);
2725 nargs
= leni
+ leni
- 1;
2726 if (nargs
< 0) return build_string ("");
2728 args
= (Lisp_Object
*) alloca (nargs
* sizeof (Lisp_Object
));
2731 mapcar1 (leni
, args
, function
, sequence
);
2734 for (i
= leni
- 1; i
>= 0; i
--)
2735 args
[i
+ i
] = args
[i
];
2737 for (i
= 1; i
< nargs
; i
+= 2)
2738 args
[i
] = separator
;
2740 return Fconcat (nargs
, args
);
2743 DEFUN ("mapcar", Fmapcar
, Smapcar
, 2, 2, 0,
2744 "Apply FUNCTION to each element of SEQUENCE, and make a list of the results.\n\
2745 The result is a list just as long as SEQUENCE.\n\
2746 SEQUENCE may be a list, a vector, a bool-vector, or a string.")
2747 (function
, sequence
)
2748 Lisp_Object function
, sequence
;
2750 register Lisp_Object len
;
2752 register Lisp_Object
*args
;
2754 len
= Flength (sequence
);
2755 leni
= XFASTINT (len
);
2756 args
= (Lisp_Object
*) alloca (leni
* sizeof (Lisp_Object
));
2758 mapcar1 (leni
, args
, function
, sequence
);
2760 return Flist (leni
, args
);
2763 DEFUN ("mapc", Fmapc
, Smapc
, 2, 2, 0,
2764 "Apply FUNCTION to each element of SEQUENCE for side effects only.\n\
2765 Unlike `mapcar', don't accumulate the results. Return SEQUENCE.\n\
2766 SEQUENCE may be a list, a vector, a bool-vector, or a string.")
2767 (function
, sequence
)
2768 Lisp_Object function
, sequence
;
2772 leni
= XFASTINT (Flength (sequence
));
2773 mapcar1 (leni
, 0, function
, sequence
);
2778 /* Anything that calls this function must protect from GC! */
2780 DEFUN ("y-or-n-p", Fy_or_n_p
, Sy_or_n_p
, 1, 1, 0,
2781 "Ask user a \"y or n\" question. Return t if answer is \"y\".\n\
2782 Takes one argument, which is the string to display to ask the question.\n\
2783 It should end in a space; `y-or-n-p' adds `(y or n) ' to it.\n\
2784 No confirmation of the answer is requested; a single character is enough.\n\
2785 Also accepts Space to mean yes, or Delete to mean no. \(Actually, it uses\n\
2786 the bindings in `query-replace-map'; see the documentation of that variable\n\
2787 for more information. In this case, the useful bindings are `act', `skip',\n\
2788 `recenter', and `quit'.\)\n\
2790 Under a windowing system a dialog box will be used if `last-nonmenu-event'\n\
2791 is nil and `use-dialog-box' is non-nil.")
2795 register Lisp_Object obj
, key
, def
, map
;
2796 register int answer
;
2797 Lisp_Object xprompt
;
2798 Lisp_Object args
[2];
2799 struct gcpro gcpro1
, gcpro2
;
2800 int count
= specpdl_ptr
- specpdl
;
2802 specbind (Qcursor_in_echo_area
, Qt
);
2804 map
= Fsymbol_value (intern ("query-replace-map"));
2806 CHECK_STRING (prompt
, 0);
2808 GCPRO2 (prompt
, xprompt
);
2810 #ifdef HAVE_X_WINDOWS
2811 if (display_busy_cursor_p
)
2812 cancel_busy_cursor ();
2819 if ((NILP (last_nonmenu_event
) || CONSP (last_nonmenu_event
))
2823 Lisp_Object pane
, menu
;
2824 redisplay_preserve_echo_area ();
2825 pane
= Fcons (Fcons (build_string ("Yes"), Qt
),
2826 Fcons (Fcons (build_string ("No"), Qnil
),
2828 menu
= Fcons (prompt
, pane
);
2829 obj
= Fx_popup_dialog (Qt
, menu
);
2830 answer
= !NILP (obj
);
2833 #endif /* HAVE_MENUS */
2834 cursor_in_echo_area
= 1;
2835 choose_minibuf_frame ();
2836 message_with_string ("%s(y or n) ", xprompt
, 0);
2838 if (minibuffer_auto_raise
)
2840 Lisp_Object mini_frame
;
2842 mini_frame
= WINDOW_FRAME (XWINDOW (minibuf_window
));
2844 Fraise_frame (mini_frame
);
2847 obj
= read_filtered_event (1, 0, 0, 0);
2848 cursor_in_echo_area
= 0;
2849 /* If we need to quit, quit with cursor_in_echo_area = 0. */
2852 key
= Fmake_vector (make_number (1), obj
);
2853 def
= Flookup_key (map
, key
, Qt
);
2855 if (EQ (def
, intern ("skip")))
2860 else if (EQ (def
, intern ("act")))
2865 else if (EQ (def
, intern ("recenter")))
2871 else if (EQ (def
, intern ("quit")))
2873 /* We want to exit this command for exit-prefix,
2874 and this is the only way to do it. */
2875 else if (EQ (def
, intern ("exit-prefix")))
2880 /* If we don't clear this, then the next call to read_char will
2881 return quit_char again, and we'll enter an infinite loop. */
2886 if (EQ (xprompt
, prompt
))
2888 args
[0] = build_string ("Please answer y or n. ");
2890 xprompt
= Fconcat (2, args
);
2895 if (! noninteractive
)
2897 cursor_in_echo_area
= -1;
2898 message_with_string (answer
? "%s(y or n) y" : "%s(y or n) n",
2902 unbind_to (count
, Qnil
);
2903 return answer
? Qt
: Qnil
;
2906 /* This is how C code calls `yes-or-no-p' and allows the user
2909 Anything that calls this function must protect from GC! */
2912 do_yes_or_no_p (prompt
)
2915 return call1 (intern ("yes-or-no-p"), prompt
);
2918 /* Anything that calls this function must protect from GC! */
2920 DEFUN ("yes-or-no-p", Fyes_or_no_p
, Syes_or_no_p
, 1, 1, 0,
2921 "Ask user a yes-or-no question. Return t if answer is yes.\n\
2922 Takes one argument, which is the string to display to ask the question.\n\
2923 It should end in a space; `yes-or-no-p' adds `(yes or no) ' to it.\n\
2924 The user must confirm the answer with RET,\n\
2925 and can edit it until it has been confirmed.\n\
2927 Under a windowing system a dialog box will be used if `last-nonmenu-event'\n\
2928 is nil, and `use-dialog-box' is non-nil.")
2932 register Lisp_Object ans
;
2933 Lisp_Object args
[2];
2934 struct gcpro gcpro1
;
2936 CHECK_STRING (prompt
, 0);
2939 if ((NILP (last_nonmenu_event
) || CONSP (last_nonmenu_event
))
2943 Lisp_Object pane
, menu
, obj
;
2944 redisplay_preserve_echo_area ();
2945 pane
= Fcons (Fcons (build_string ("Yes"), Qt
),
2946 Fcons (Fcons (build_string ("No"), Qnil
),
2949 menu
= Fcons (prompt
, pane
);
2950 obj
= Fx_popup_dialog (Qt
, menu
);
2954 #endif /* HAVE_MENUS */
2957 args
[1] = build_string ("(yes or no) ");
2958 prompt
= Fconcat (2, args
);
2964 ans
= Fdowncase (Fread_from_minibuffer (prompt
, Qnil
, Qnil
, Qnil
,
2965 Qyes_or_no_p_history
, Qnil
,
2967 if (XSTRING (ans
)->size
== 3 && !strcmp (XSTRING (ans
)->data
, "yes"))
2972 if (XSTRING (ans
)->size
== 2 && !strcmp (XSTRING (ans
)->data
, "no"))
2980 message ("Please answer yes or no.");
2981 Fsleep_for (make_number (2), Qnil
);
2985 DEFUN ("load-average", Fload_average
, Sload_average
, 0, 1, 0,
2986 "Return list of 1 minute, 5 minute and 15 minute load averages.\n\
2987 Each of the three load averages is multiplied by 100,\n\
2988 then converted to integer.\n\
2989 When USE-FLOATS is non-nil, floats will be used instead of integers.\n\
2990 These floats are not multiplied by 100.\n\n\
2991 If the 5-minute or 15-minute load averages are not available, return a\n\
2992 shortened list, containing only those averages which are available.")
2994 Lisp_Object use_floats
;
2997 int loads
= getloadavg (load_ave
, 3);
2998 Lisp_Object ret
= Qnil
;
3001 error ("load-average not implemented for this operating system");
3005 Lisp_Object load
= (NILP (use_floats
) ?
3006 make_number ((int) (100.0 * load_ave
[loads
]))
3007 : make_float (load_ave
[loads
]));
3008 ret
= Fcons (load
, ret
);
3014 Lisp_Object Vfeatures
;
3016 DEFUN ("featurep", Ffeaturep
, Sfeaturep
, 1, 1, 0,
3017 "Returns t if FEATURE is present in this Emacs.\n\
3018 Use this to conditionalize execution of lisp code based on the presence or\n\
3019 absence of emacs or environment extensions.\n\
3020 Use `provide' to declare that a feature is available.\n\
3021 This function looks at the value of the variable `features'.")
3023 Lisp_Object feature
;
3025 register Lisp_Object tem
;
3026 CHECK_SYMBOL (feature
, 0);
3027 tem
= Fmemq (feature
, Vfeatures
);
3028 return (NILP (tem
)) ? Qnil
: Qt
;
3031 DEFUN ("provide", Fprovide
, Sprovide
, 1, 1, 0,
3032 "Announce that FEATURE is a feature of the current Emacs.")
3034 Lisp_Object feature
;
3036 register Lisp_Object tem
;
3037 CHECK_SYMBOL (feature
, 0);
3038 if (!NILP (Vautoload_queue
))
3039 Vautoload_queue
= Fcons (Fcons (Vfeatures
, Qnil
), Vautoload_queue
);
3040 tem
= Fmemq (feature
, Vfeatures
);
3042 Vfeatures
= Fcons (feature
, Vfeatures
);
3043 LOADHIST_ATTACH (Fcons (Qprovide
, feature
));
3047 DEFUN ("require", Frequire
, Srequire
, 1, 3, 0,
3048 "If feature FEATURE is not loaded, load it from FILENAME.\n\
3049 If FEATURE is not a member of the list `features', then the feature\n\
3050 is not loaded; so load the file FILENAME.\n\
3051 If FILENAME is omitted, the printname of FEATURE is used as the file name,\n\
3052 but in this case `load' insists on adding the suffix `.el' or `.elc'.\n\
3053 If the optional third argument NOERROR is non-nil,\n\
3054 then return nil if the file is not found.\n\
3055 Normally the return value is FEATURE.")
3056 (feature
, file_name
, noerror
)
3057 Lisp_Object feature
, file_name
, noerror
;
3059 register Lisp_Object tem
;
3060 CHECK_SYMBOL (feature
, 0);
3061 tem
= Fmemq (feature
, Vfeatures
);
3063 LOADHIST_ATTACH (Fcons (Qrequire
, feature
));
3067 int count
= specpdl_ptr
- specpdl
;
3069 /* Value saved here is to be restored into Vautoload_queue */
3070 record_unwind_protect (un_autoload
, Vautoload_queue
);
3071 Vautoload_queue
= Qt
;
3073 tem
= Fload (NILP (file_name
) ? Fsymbol_name (feature
) : file_name
,
3074 noerror
, Qt
, Qnil
, (NILP (file_name
) ? Qt
: Qnil
));
3075 /* If load failed entirely, return nil. */
3077 return unbind_to (count
, Qnil
);
3079 tem
= Fmemq (feature
, Vfeatures
);
3081 error ("Required feature %s was not provided",
3082 XSYMBOL (feature
)->name
->data
);
3084 /* Once loading finishes, don't undo it. */
3085 Vautoload_queue
= Qt
;
3086 feature
= unbind_to (count
, feature
);
3091 /* Primitives for work of the "widget" library.
3092 In an ideal world, this section would not have been necessary.
3093 However, lisp function calls being as slow as they are, it turns
3094 out that some functions in the widget library (wid-edit.el) are the
3095 bottleneck of Widget operation. Here is their translation to C,
3096 for the sole reason of efficiency. */
3098 DEFUN ("plist-member", Fplist_member
, Splist_member
, 2, 2, 0,
3099 "Return non-nil if PLIST has the property PROP.\n\
3100 PLIST is a property list, which is a list of the form\n\
3101 \(PROP1 VALUE1 PROP2 VALUE2 ...\). PROP is a symbol.\n\
3102 Unlike `plist-get', this allows you to distinguish between a missing\n\
3103 property and a property with the value nil.\n\
3104 The value is actually the tail of PLIST whose car is PROP.")
3106 Lisp_Object plist
, prop
;
3108 while (CONSP (plist
) && !EQ (XCAR (plist
), prop
))
3111 plist
= XCDR (plist
);
3112 plist
= CDR (plist
);
3117 DEFUN ("widget-put", Fwidget_put
, Swidget_put
, 3, 3, 0,
3118 "In WIDGET, set PROPERTY to VALUE.\n\
3119 The value can later be retrieved with `widget-get'.")
3120 (widget
, property
, value
)
3121 Lisp_Object widget
, property
, value
;
3123 CHECK_CONS (widget
, 1);
3124 XCDR (widget
) = Fplist_put (XCDR (widget
), property
, value
);
3128 DEFUN ("widget-get", Fwidget_get
, Swidget_get
, 2, 2, 0,
3129 "In WIDGET, get the value of PROPERTY.\n\
3130 The value could either be specified when the widget was created, or\n\
3131 later with `widget-put'.")
3133 Lisp_Object widget
, property
;
3141 CHECK_CONS (widget
, 1);
3142 tmp
= Fplist_member (XCDR (widget
), property
);
3148 tmp
= XCAR (widget
);
3151 widget
= Fget (tmp
, Qwidget_type
);
3155 DEFUN ("widget-apply", Fwidget_apply
, Swidget_apply
, 2, MANY
, 0,
3156 "Apply the value of WIDGET's PROPERTY to the widget itself.\n\
3157 ARGS are passed as extra arguments to the function.")
3162 /* This function can GC. */
3163 Lisp_Object newargs
[3];
3164 struct gcpro gcpro1
, gcpro2
;
3167 newargs
[0] = Fwidget_get (args
[0], args
[1]);
3168 newargs
[1] = args
[0];
3169 newargs
[2] = Flist (nargs
- 2, args
+ 2);
3170 GCPRO2 (newargs
[0], newargs
[2]);
3171 result
= Fapply (3, newargs
);
3176 /* base64 encode/decode functions (RFC 2045).
3177 Based on code from GNU recode. */
3179 #define MIME_LINE_LENGTH 76
3181 #define IS_ASCII(Character) \
3183 #define IS_BASE64(Character) \
3184 (IS_ASCII (Character) && base64_char_to_value[Character] >= 0)
3185 #define IS_BASE64_IGNORABLE(Character) \
3186 ((Character) == ' ' || (Character) == '\t' || (Character) == '\n' \
3187 || (Character) == '\f' || (Character) == '\r')
3189 /* Used by base64_decode_1 to retrieve a non-base64-ignorable
3190 character or return retval if there are no characters left to
3192 #define READ_QUADRUPLET_BYTE(retval) \
3197 if (nchars_return) \
3198 *nchars_return = nchars; \
3203 while (IS_BASE64_IGNORABLE (c))
3205 /* Don't use alloca for regions larger than this, lest we overflow
3207 #define MAX_ALLOCA 16*1024
3209 /* Table of characters coding the 64 values. */
3210 static char base64_value_to_char
[64] =
3212 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', /* 0- 9 */
3213 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', /* 10-19 */
3214 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', /* 20-29 */
3215 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', /* 30-39 */
3216 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', /* 40-49 */
3217 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', /* 50-59 */
3218 '8', '9', '+', '/' /* 60-63 */
3221 /* Table of base64 values for first 128 characters. */
3222 static short base64_char_to_value
[128] =
3224 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0- 9 */
3225 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 10- 19 */
3226 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 20- 29 */
3227 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 30- 39 */
3228 -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, /* 40- 49 */
3229 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, /* 50- 59 */
3230 -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, /* 60- 69 */
3231 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, /* 70- 79 */
3232 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, /* 80- 89 */
3233 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, /* 90- 99 */
3234 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, /* 100-109 */
3235 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, /* 110-119 */
3236 49, 50, 51, -1, -1, -1, -1, -1 /* 120-127 */
3239 /* The following diagram shows the logical steps by which three octets
3240 get transformed into four base64 characters.
3242 .--------. .--------. .--------.
3243 |aaaaaabb| |bbbbcccc| |ccdddddd|
3244 `--------' `--------' `--------'
3246 .--------+--------+--------+--------.
3247 |00aaaaaa|00bbbbbb|00cccccc|00dddddd|
3248 `--------+--------+--------+--------'
3250 .--------+--------+--------+--------.
3251 |AAAAAAAA|BBBBBBBB|CCCCCCCC|DDDDDDDD|
3252 `--------+--------+--------+--------'
3254 The octets are divided into 6 bit chunks, which are then encoded into
3255 base64 characters. */
3258 static int base64_encode_1
P_ ((const char *, char *, int, int, int));
3259 static int base64_decode_1
P_ ((const char *, char *, int, int, int *));
3261 DEFUN ("base64-encode-region", Fbase64_encode_region
, Sbase64_encode_region
,
3263 "Base64-encode the region between BEG and END.\n\
3264 Return the length of the encoded text.\n\
3265 Optional third argument NO-LINE-BREAK means do not break long lines\n\
3266 into shorter lines.")
3267 (beg
, end
, no_line_break
)
3268 Lisp_Object beg
, end
, no_line_break
;
3271 int allength
, length
;
3272 int ibeg
, iend
, encoded_length
;
3275 validate_region (&beg
, &end
);
3277 ibeg
= CHAR_TO_BYTE (XFASTINT (beg
));
3278 iend
= CHAR_TO_BYTE (XFASTINT (end
));
3279 move_gap_both (XFASTINT (beg
), ibeg
);
3281 /* We need to allocate enough room for encoding the text.
3282 We need 33 1/3% more space, plus a newline every 76
3283 characters, and then we round up. */
3284 length
= iend
- ibeg
;
3285 allength
= length
+ length
/3 + 1;
3286 allength
+= allength
/ MIME_LINE_LENGTH
+ 1 + 6;
3288 if (allength
<= MAX_ALLOCA
)
3289 encoded
= (char *) alloca (allength
);
3291 encoded
= (char *) xmalloc (allength
);
3292 encoded_length
= base64_encode_1 (BYTE_POS_ADDR (ibeg
), encoded
, length
,
3293 NILP (no_line_break
),
3294 !NILP (current_buffer
->enable_multibyte_characters
));
3295 if (encoded_length
> allength
)
3298 if (encoded_length
< 0)
3300 /* The encoding wasn't possible. */
3301 if (length
> MAX_ALLOCA
)
3303 error ("Multibyte character in data for base64 encoding");
3306 /* Now we have encoded the region, so we insert the new contents
3307 and delete the old. (Insert first in order to preserve markers.) */
3308 SET_PT_BOTH (XFASTINT (beg
), ibeg
);
3309 insert (encoded
, encoded_length
);
3310 if (allength
> MAX_ALLOCA
)
3312 del_range_byte (ibeg
+ encoded_length
, iend
+ encoded_length
, 1);
3314 /* If point was outside of the region, restore it exactly; else just
3315 move to the beginning of the region. */
3316 if (old_pos
>= XFASTINT (end
))
3317 old_pos
+= encoded_length
- (XFASTINT (end
) - XFASTINT (beg
));
3318 else if (old_pos
> XFASTINT (beg
))
3319 old_pos
= XFASTINT (beg
);
3322 /* We return the length of the encoded text. */
3323 return make_number (encoded_length
);
3326 DEFUN ("base64-encode-string", Fbase64_encode_string
, Sbase64_encode_string
,
3328 "Base64-encode STRING and return the result.\n\
3329 Optional second argument NO-LINE-BREAK means do not break long lines\n\
3330 into shorter lines.")
3331 (string
, no_line_break
)
3332 Lisp_Object string
, no_line_break
;
3334 int allength
, length
, encoded_length
;
3336 Lisp_Object encoded_string
;
3338 CHECK_STRING (string
, 1);
3340 /* We need to allocate enough room for encoding the text.
3341 We need 33 1/3% more space, plus a newline every 76
3342 characters, and then we round up. */
3343 length
= STRING_BYTES (XSTRING (string
));
3344 allength
= length
+ length
/3 + 1;
3345 allength
+= allength
/ MIME_LINE_LENGTH
+ 1 + 6;
3347 /* We need to allocate enough room for decoding the text. */
3348 if (allength
<= MAX_ALLOCA
)
3349 encoded
= (char *) alloca (allength
);
3351 encoded
= (char *) xmalloc (allength
);
3353 encoded_length
= base64_encode_1 (XSTRING (string
)->data
,
3354 encoded
, length
, NILP (no_line_break
),
3355 STRING_MULTIBYTE (string
));
3356 if (encoded_length
> allength
)
3359 if (encoded_length
< 0)
3361 /* The encoding wasn't possible. */
3362 if (length
> MAX_ALLOCA
)
3364 error ("Multibyte character in data for base64 encoding");
3367 encoded_string
= make_unibyte_string (encoded
, encoded_length
);
3368 if (allength
> MAX_ALLOCA
)
3371 return encoded_string
;
3375 base64_encode_1 (from
, to
, length
, line_break
, multibyte
)
3382 int counter
= 0, i
= 0;
3392 c
= STRING_CHAR_AND_LENGTH (from
+ i
, length
- i
, bytes
);
3400 /* Wrap line every 76 characters. */
3404 if (counter
< MIME_LINE_LENGTH
/ 4)
3413 /* Process first byte of a triplet. */
3415 *e
++ = base64_value_to_char
[0x3f & c
>> 2];
3416 value
= (0x03 & c
) << 4;
3418 /* Process second byte of a triplet. */
3422 *e
++ = base64_value_to_char
[value
];
3430 c
= STRING_CHAR_AND_LENGTH (from
+ i
, length
- i
, bytes
);
3438 *e
++ = base64_value_to_char
[value
| (0x0f & c
>> 4)];
3439 value
= (0x0f & c
) << 2;
3441 /* Process third byte of a triplet. */
3445 *e
++ = base64_value_to_char
[value
];
3452 c
= STRING_CHAR_AND_LENGTH (from
+ i
, length
- i
, bytes
);
3460 *e
++ = base64_value_to_char
[value
| (0x03 & c
>> 6)];
3461 *e
++ = base64_value_to_char
[0x3f & c
];
3468 DEFUN ("base64-decode-region", Fbase64_decode_region
, Sbase64_decode_region
,
3470 "Base64-decode the region between BEG and END.\n\
3471 Return the length of the decoded text.\n\
3472 If the region can't be decoded, signal an error and don't modify the buffer.")
3474 Lisp_Object beg
, end
;
3476 int ibeg
, iend
, length
, allength
;
3481 int multibyte
= !NILP (current_buffer
->enable_multibyte_characters
);
3483 validate_region (&beg
, &end
);
3485 ibeg
= CHAR_TO_BYTE (XFASTINT (beg
));
3486 iend
= CHAR_TO_BYTE (XFASTINT (end
));
3488 length
= iend
- ibeg
;
3490 /* We need to allocate enough room for decoding the text. If we are
3491 working on a multibyte buffer, each decoded code may occupy at
3493 allength
= multibyte
? length
* 2 : length
;
3494 if (allength
<= MAX_ALLOCA
)
3495 decoded
= (char *) alloca (allength
);
3497 decoded
= (char *) xmalloc (allength
);
3499 move_gap_both (XFASTINT (beg
), ibeg
);
3500 decoded_length
= base64_decode_1 (BYTE_POS_ADDR (ibeg
), decoded
, length
,
3501 multibyte
, &inserted_chars
);
3502 if (decoded_length
> allength
)
3505 if (decoded_length
< 0)
3507 /* The decoding wasn't possible. */
3508 if (allength
> MAX_ALLOCA
)
3510 error ("Invalid base64 data");
3513 /* Now we have decoded the region, so we insert the new contents
3514 and delete the old. (Insert first in order to preserve markers.) */
3515 TEMP_SET_PT_BOTH (XFASTINT (beg
), ibeg
);
3516 insert_1_both (decoded
, inserted_chars
, decoded_length
, 0, 1, 0);
3517 if (allength
> MAX_ALLOCA
)
3519 /* Delete the original text. */
3520 del_range_both (PT
, PT_BYTE
, XFASTINT (end
) + inserted_chars
,
3521 iend
+ decoded_length
, 1);
3523 /* If point was outside of the region, restore it exactly; else just
3524 move to the beginning of the region. */
3525 if (old_pos
>= XFASTINT (end
))
3526 old_pos
+= inserted_chars
- (XFASTINT (end
) - XFASTINT (beg
));
3527 else if (old_pos
> XFASTINT (beg
))
3528 old_pos
= XFASTINT (beg
);
3529 SET_PT (old_pos
> ZV
? ZV
: old_pos
);
3531 return make_number (inserted_chars
);
3534 DEFUN ("base64-decode-string", Fbase64_decode_string
, Sbase64_decode_string
,
3536 "Base64-decode STRING and return the result.")
3541 int length
, decoded_length
;
3542 Lisp_Object decoded_string
;
3544 CHECK_STRING (string
, 1);
3546 length
= STRING_BYTES (XSTRING (string
));
3547 /* We need to allocate enough room for decoding the text. */
3548 if (length
<= MAX_ALLOCA
)
3549 decoded
= (char *) alloca (length
);
3551 decoded
= (char *) xmalloc (length
);
3553 decoded_length
= base64_decode_1 (XSTRING (string
)->data
, decoded
, length
,
3554 STRING_MULTIBYTE (string
), NULL
);
3555 if (decoded_length
> length
)
3557 else if (decoded_length
>= 0)
3558 decoded_string
= make_unibyte_string (decoded
, decoded_length
);
3560 decoded_string
= Qnil
;
3562 if (length
> MAX_ALLOCA
)
3564 if (!STRINGP (decoded_string
))
3565 error ("Invalid base64 data");
3567 return decoded_string
;
3570 /* Base64-decode the data at FROM of LENGHT bytes into TO. If
3571 MULTIBYTE is nonzero, the decoded result should be in multibyte
3572 form. If NCHARS_RETRUN is not NULL, store the number of produced
3573 characters in *NCHARS_RETURN. */
3576 base64_decode_1 (from
, to
, length
, multibyte
, nchars_return
)
3586 unsigned long value
;
3591 /* Process first byte of a quadruplet. */
3593 READ_QUADRUPLET_BYTE (e
-to
);
3597 value
= base64_char_to_value
[c
] << 18;
3599 /* Process second byte of a quadruplet. */
3601 READ_QUADRUPLET_BYTE (-1);
3605 value
|= base64_char_to_value
[c
] << 12;
3607 c
= (unsigned char) (value
>> 16);
3609 e
+= CHAR_STRING (c
, e
);
3614 /* Process third byte of a quadruplet. */
3616 READ_QUADRUPLET_BYTE (-1);
3620 READ_QUADRUPLET_BYTE (-1);
3629 value
|= base64_char_to_value
[c
] << 6;
3631 c
= (unsigned char) (0xff & value
>> 8);
3633 e
+= CHAR_STRING (c
, e
);
3638 /* Process fourth byte of a quadruplet. */
3640 READ_QUADRUPLET_BYTE (-1);
3647 value
|= base64_char_to_value
[c
];
3649 c
= (unsigned char) (0xff & value
);
3651 e
+= CHAR_STRING (c
, e
);
3660 /***********************************************************************
3662 ***** Hash Tables *****
3664 ***********************************************************************/
3666 /* Implemented by gerd@gnu.org. This hash table implementation was
3667 inspired by CMUCL hash tables. */
3671 1. For small tables, association lists are probably faster than
3672 hash tables because they have lower overhead.
3674 For uses of hash tables where the O(1) behavior of table
3675 operations is not a requirement, it might therefore be a good idea
3676 not to hash. Instead, we could just do a linear search in the
3677 key_and_value vector of the hash table. This could be done
3678 if a `:linear-search t' argument is given to make-hash-table. */
3681 /* Value is the key part of entry IDX in hash table H. */
3683 #define HASH_KEY(H, IDX) AREF ((H)->key_and_value, 2 * (IDX))
3685 /* Value is the value part of entry IDX in hash table H. */
3687 #define HASH_VALUE(H, IDX) AREF ((H)->key_and_value, 2 * (IDX) + 1)
3689 /* Value is the index of the next entry following the one at IDX
3692 #define HASH_NEXT(H, IDX) AREF ((H)->next, (IDX))
3694 /* Value is the hash code computed for entry IDX in hash table H. */
3696 #define HASH_HASH(H, IDX) AREF ((H)->hash, (IDX))
3698 /* Value is the index of the element in hash table H that is the
3699 start of the collision list at index IDX in the index vector of H. */
3701 #define HASH_INDEX(H, IDX) AREF ((H)->index, (IDX))
3703 /* Value is the size of hash table H. */
3705 #define HASH_TABLE_SIZE(H) XVECTOR ((H)->next)->size
3707 /* The list of all weak hash tables. Don't staticpro this one. */
3709 Lisp_Object Vweak_hash_tables
;
3711 /* Various symbols. */
3713 Lisp_Object Qhash_table_p
, Qeq
, Qeql
, Qequal
, Qkey
, Qvalue
;
3714 Lisp_Object QCtest
, QCsize
, QCrehash_size
, QCrehash_threshold
, QCweakness
;
3715 Lisp_Object Qhash_table_test
, Qkey_or_value
, Qkey_and_value
;
3717 /* Function prototypes. */
3719 static struct Lisp_Hash_Table
*check_hash_table
P_ ((Lisp_Object
));
3720 static int get_key_arg
P_ ((Lisp_Object
, int, Lisp_Object
*, char *));
3721 static void maybe_resize_hash_table
P_ ((struct Lisp_Hash_Table
*));
3722 static int cmpfn_eql
P_ ((struct Lisp_Hash_Table
*, Lisp_Object
, unsigned,
3723 Lisp_Object
, unsigned));
3724 static int cmpfn_equal
P_ ((struct Lisp_Hash_Table
*, Lisp_Object
, unsigned,
3725 Lisp_Object
, unsigned));
3726 static int cmpfn_user_defined
P_ ((struct Lisp_Hash_Table
*, Lisp_Object
,
3727 unsigned, Lisp_Object
, unsigned));
3728 static unsigned hashfn_eq
P_ ((struct Lisp_Hash_Table
*, Lisp_Object
));
3729 static unsigned hashfn_eql
P_ ((struct Lisp_Hash_Table
*, Lisp_Object
));
3730 static unsigned hashfn_equal
P_ ((struct Lisp_Hash_Table
*, Lisp_Object
));
3731 static unsigned hashfn_user_defined
P_ ((struct Lisp_Hash_Table
*,
3733 static unsigned sxhash_string
P_ ((unsigned char *, int));
3734 static unsigned sxhash_list
P_ ((Lisp_Object
, int));
3735 static unsigned sxhash_vector
P_ ((Lisp_Object
, int));
3736 static unsigned sxhash_bool_vector
P_ ((Lisp_Object
));
3737 static int sweep_weak_table
P_ ((struct Lisp_Hash_Table
*, int));
3741 /***********************************************************************
3743 ***********************************************************************/
3745 /* If OBJ is a Lisp hash table, return a pointer to its struct
3746 Lisp_Hash_Table. Otherwise, signal an error. */
3748 static struct Lisp_Hash_Table
*
3749 check_hash_table (obj
)
3752 CHECK_HASH_TABLE (obj
, 0);
3753 return XHASH_TABLE (obj
);
3757 /* Value is the next integer I >= N, N >= 0 which is "almost" a prime
3761 next_almost_prime (n
)
3774 /* Find KEY in ARGS which has size NARGS. Don't consider indices for
3775 which USED[I] is non-zero. If found at index I in ARGS, set
3776 USED[I] and USED[I + 1] to 1, and return I + 1. Otherwise return
3777 -1. This function is used to extract a keyword/argument pair from
3778 a DEFUN parameter list. */
3781 get_key_arg (key
, nargs
, args
, used
)
3789 for (i
= 0; i
< nargs
- 1; ++i
)
3790 if (!used
[i
] && EQ (args
[i
], key
))
3805 /* Return a Lisp vector which has the same contents as VEC but has
3806 size NEW_SIZE, NEW_SIZE >= VEC->size. Entries in the resulting
3807 vector that are not copied from VEC are set to INIT. */
3810 larger_vector (vec
, new_size
, init
)
3815 struct Lisp_Vector
*v
;
3818 xassert (VECTORP (vec
));
3819 old_size
= XVECTOR (vec
)->size
;
3820 xassert (new_size
>= old_size
);
3822 v
= allocate_vectorlike (new_size
);
3824 bcopy (XVECTOR (vec
)->contents
, v
->contents
,
3825 old_size
* sizeof *v
->contents
);
3826 for (i
= old_size
; i
< new_size
; ++i
)
3827 v
->contents
[i
] = init
;
3828 XSETVECTOR (vec
, v
);
3833 /***********************************************************************
3835 ***********************************************************************/
3837 /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code
3838 HASH2 in hash table H using `eql'. Value is non-zero if KEY1 and
3839 KEY2 are the same. */
3842 cmpfn_eql (h
, key1
, hash1
, key2
, hash2
)
3843 struct Lisp_Hash_Table
*h
;
3844 Lisp_Object key1
, key2
;
3845 unsigned hash1
, hash2
;
3847 return (FLOATP (key1
)
3849 && XFLOAT_DATA (key1
) == XFLOAT_DATA (key2
));
3853 /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code
3854 HASH2 in hash table H using `equal'. Value is non-zero if KEY1 and
3855 KEY2 are the same. */
3858 cmpfn_equal (h
, key1
, hash1
, key2
, hash2
)
3859 struct Lisp_Hash_Table
*h
;
3860 Lisp_Object key1
, key2
;
3861 unsigned hash1
, hash2
;
3863 return hash1
== hash2
&& !NILP (Fequal (key1
, key2
));
3867 /* Compare KEY1 which has hash code HASH1, and KEY2 with hash code
3868 HASH2 in hash table H using H->user_cmp_function. Value is non-zero
3869 if KEY1 and KEY2 are the same. */
3872 cmpfn_user_defined (h
, key1
, hash1
, key2
, hash2
)
3873 struct Lisp_Hash_Table
*h
;
3874 Lisp_Object key1
, key2
;
3875 unsigned hash1
, hash2
;
3879 Lisp_Object args
[3];
3881 args
[0] = h
->user_cmp_function
;
3884 return !NILP (Ffuncall (3, args
));
3891 /* Value is a hash code for KEY for use in hash table H which uses
3892 `eq' to compare keys. The hash code returned is guaranteed to fit
3893 in a Lisp integer. */
3897 struct Lisp_Hash_Table
*h
;
3900 unsigned hash
= XUINT (key
) ^ XGCTYPE (key
);
3901 xassert ((hash
& ~VALMASK
) == 0);
3906 /* Value is a hash code for KEY for use in hash table H which uses
3907 `eql' to compare keys. The hash code returned is guaranteed to fit
3908 in a Lisp integer. */
3912 struct Lisp_Hash_Table
*h
;
3917 hash
= sxhash (key
, 0);
3919 hash
= XUINT (key
) ^ XGCTYPE (key
);
3920 xassert ((hash
& ~VALMASK
) == 0);
3925 /* Value is a hash code for KEY for use in hash table H which uses
3926 `equal' to compare keys. The hash code returned is guaranteed to fit
3927 in a Lisp integer. */
3930 hashfn_equal (h
, key
)
3931 struct Lisp_Hash_Table
*h
;
3934 unsigned hash
= sxhash (key
, 0);
3935 xassert ((hash
& ~VALMASK
) == 0);
3940 /* Value is a hash code for KEY for use in hash table H which uses as
3941 user-defined function to compare keys. The hash code returned is
3942 guaranteed to fit in a Lisp integer. */
3945 hashfn_user_defined (h
, key
)
3946 struct Lisp_Hash_Table
*h
;
3949 Lisp_Object args
[2], hash
;
3951 args
[0] = h
->user_hash_function
;
3953 hash
= Ffuncall (2, args
);
3954 if (!INTEGERP (hash
))
3956 list2 (build_string ("Invalid hash code returned from \
3957 user-supplied hash function"),
3959 return XUINT (hash
);
3963 /* Create and initialize a new hash table.
3965 TEST specifies the test the hash table will use to compare keys.
3966 It must be either one of the predefined tests `eq', `eql' or
3967 `equal' or a symbol denoting a user-defined test named TEST with
3968 test and hash functions USER_TEST and USER_HASH.
3970 Give the table initial capacity SIZE, SIZE >= 0, an integer.
3972 If REHASH_SIZE is an integer, it must be > 0, and this hash table's
3973 new size when it becomes full is computed by adding REHASH_SIZE to
3974 its old size. If REHASH_SIZE is a float, it must be > 1.0, and the
3975 table's new size is computed by multiplying its old size with
3978 REHASH_THRESHOLD must be a float <= 1.0, and > 0. The table will
3979 be resized when the ratio of (number of entries in the table) /
3980 (table size) is >= REHASH_THRESHOLD.
3982 WEAK specifies the weakness of the table. If non-nil, it must be
3983 one of the symbols `key', `value', `key-or-value', or `key-and-value'. */
3986 make_hash_table (test
, size
, rehash_size
, rehash_threshold
, weak
,
3987 user_test
, user_hash
)
3988 Lisp_Object test
, size
, rehash_size
, rehash_threshold
, weak
;
3989 Lisp_Object user_test
, user_hash
;
3991 struct Lisp_Hash_Table
*h
;
3992 struct Lisp_Vector
*v
;
3994 int index_size
, i
, len
, sz
;
3996 /* Preconditions. */
3997 xassert (SYMBOLP (test
));
3998 xassert (INTEGERP (size
) && XINT (size
) >= 0);
3999 xassert ((INTEGERP (rehash_size
) && XINT (rehash_size
) > 0)
4000 || (FLOATP (rehash_size
) && XFLOATINT (rehash_size
) > 1.0));
4001 xassert (FLOATP (rehash_threshold
)
4002 && XFLOATINT (rehash_threshold
) > 0
4003 && XFLOATINT (rehash_threshold
) <= 1.0);
4005 if (XFASTINT (size
) == 0)
4006 size
= make_number (1);
4008 /* Allocate a vector, and initialize it. */
4009 len
= VECSIZE (struct Lisp_Hash_Table
);
4010 v
= allocate_vectorlike (len
);
4012 for (i
= 0; i
< len
; ++i
)
4013 v
->contents
[i
] = Qnil
;
4015 /* Initialize hash table slots. */
4016 sz
= XFASTINT (size
);
4017 h
= (struct Lisp_Hash_Table
*) v
;
4020 if (EQ (test
, Qeql
))
4022 h
->cmpfn
= cmpfn_eql
;
4023 h
->hashfn
= hashfn_eql
;
4025 else if (EQ (test
, Qeq
))
4028 h
->hashfn
= hashfn_eq
;
4030 else if (EQ (test
, Qequal
))
4032 h
->cmpfn
= cmpfn_equal
;
4033 h
->hashfn
= hashfn_equal
;
4037 h
->user_cmp_function
= user_test
;
4038 h
->user_hash_function
= user_hash
;
4039 h
->cmpfn
= cmpfn_user_defined
;
4040 h
->hashfn
= hashfn_user_defined
;
4044 h
->rehash_threshold
= rehash_threshold
;
4045 h
->rehash_size
= rehash_size
;
4046 h
->count
= make_number (0);
4047 h
->key_and_value
= Fmake_vector (make_number (2 * sz
), Qnil
);
4048 h
->hash
= Fmake_vector (size
, Qnil
);
4049 h
->next
= Fmake_vector (size
, Qnil
);
4050 /* Cast to int here avoids losing with gcc 2.95 on Tru64/Alpha... */
4051 index_size
= next_almost_prime ((int) (sz
/ XFLOATINT (rehash_threshold
)));
4052 h
->index
= Fmake_vector (make_number (index_size
), Qnil
);
4054 /* Set up the free list. */
4055 for (i
= 0; i
< sz
- 1; ++i
)
4056 HASH_NEXT (h
, i
) = make_number (i
+ 1);
4057 h
->next_free
= make_number (0);
4059 XSET_HASH_TABLE (table
, h
);
4060 xassert (HASH_TABLE_P (table
));
4061 xassert (XHASH_TABLE (table
) == h
);
4063 /* Maybe add this hash table to the list of all weak hash tables. */
4065 h
->next_weak
= Qnil
;
4068 h
->next_weak
= Vweak_hash_tables
;
4069 Vweak_hash_tables
= table
;
4076 /* Return a copy of hash table H1. Keys and values are not copied,
4077 only the table itself is. */
4080 copy_hash_table (h1
)
4081 struct Lisp_Hash_Table
*h1
;
4084 struct Lisp_Hash_Table
*h2
;
4085 struct Lisp_Vector
*v
, *next
;
4088 len
= VECSIZE (struct Lisp_Hash_Table
);
4089 v
= allocate_vectorlike (len
);
4090 h2
= (struct Lisp_Hash_Table
*) v
;
4091 next
= h2
->vec_next
;
4092 bcopy (h1
, h2
, sizeof *h2
);
4093 h2
->vec_next
= next
;
4094 h2
->key_and_value
= Fcopy_sequence (h1
->key_and_value
);
4095 h2
->hash
= Fcopy_sequence (h1
->hash
);
4096 h2
->next
= Fcopy_sequence (h1
->next
);
4097 h2
->index
= Fcopy_sequence (h1
->index
);
4098 XSET_HASH_TABLE (table
, h2
);
4100 /* Maybe add this hash table to the list of all weak hash tables. */
4101 if (!NILP (h2
->weak
))
4103 h2
->next_weak
= Vweak_hash_tables
;
4104 Vweak_hash_tables
= table
;
4111 /* Resize hash table H if it's too full. If H cannot be resized
4112 because it's already too large, throw an error. */
4115 maybe_resize_hash_table (h
)
4116 struct Lisp_Hash_Table
*h
;
4118 if (NILP (h
->next_free
))
4120 int old_size
= HASH_TABLE_SIZE (h
);
4121 int i
, new_size
, index_size
;
4123 if (INTEGERP (h
->rehash_size
))
4124 new_size
= old_size
+ XFASTINT (h
->rehash_size
);
4126 new_size
= old_size
* XFLOATINT (h
->rehash_size
);
4127 new_size
= max (old_size
+ 1, new_size
);
4128 index_size
= next_almost_prime ((int)
4130 / XFLOATINT (h
->rehash_threshold
)));
4131 if (max (index_size
, 2 * new_size
) & ~VALMASK
)
4132 error ("Hash table too large to resize");
4134 h
->key_and_value
= larger_vector (h
->key_and_value
, 2 * new_size
, Qnil
);
4135 h
->next
= larger_vector (h
->next
, new_size
, Qnil
);
4136 h
->hash
= larger_vector (h
->hash
, new_size
, Qnil
);
4137 h
->index
= Fmake_vector (make_number (index_size
), Qnil
);
4139 /* Update the free list. Do it so that new entries are added at
4140 the end of the free list. This makes some operations like
4142 for (i
= old_size
; i
< new_size
- 1; ++i
)
4143 HASH_NEXT (h
, i
) = make_number (i
+ 1);
4145 if (!NILP (h
->next_free
))
4147 Lisp_Object last
, next
;
4149 last
= h
->next_free
;
4150 while (next
= HASH_NEXT (h
, XFASTINT (last
)),
4154 HASH_NEXT (h
, XFASTINT (last
)) = make_number (old_size
);
4157 XSETFASTINT (h
->next_free
, old_size
);
4160 for (i
= 0; i
< old_size
; ++i
)
4161 if (!NILP (HASH_HASH (h
, i
)))
4163 unsigned hash_code
= XUINT (HASH_HASH (h
, i
));
4164 int start_of_bucket
= hash_code
% XVECTOR (h
->index
)->size
;
4165 HASH_NEXT (h
, i
) = HASH_INDEX (h
, start_of_bucket
);
4166 HASH_INDEX (h
, start_of_bucket
) = make_number (i
);
4172 /* Lookup KEY in hash table H. If HASH is non-null, return in *HASH
4173 the hash code of KEY. Value is the index of the entry in H
4174 matching KEY, or -1 if not found. */
4177 hash_lookup (h
, key
, hash
)
4178 struct Lisp_Hash_Table
*h
;
4183 int start_of_bucket
;
4186 hash_code
= h
->hashfn (h
, key
);
4190 start_of_bucket
= hash_code
% XVECTOR (h
->index
)->size
;
4191 idx
= HASH_INDEX (h
, start_of_bucket
);
4193 /* We need not gcpro idx since it's either an integer or nil. */
4196 int i
= XFASTINT (idx
);
4197 if (EQ (key
, HASH_KEY (h
, i
))
4199 && h
->cmpfn (h
, key
, hash_code
,
4200 HASH_KEY (h
, i
), XUINT (HASH_HASH (h
, i
)))))
4202 idx
= HASH_NEXT (h
, i
);
4205 return NILP (idx
) ? -1 : XFASTINT (idx
);
4209 /* Put an entry into hash table H that associates KEY with VALUE.
4210 HASH is a previously computed hash code of KEY.
4211 Value is the index of the entry in H matching KEY. */
4214 hash_put (h
, key
, value
, hash
)
4215 struct Lisp_Hash_Table
*h
;
4216 Lisp_Object key
, value
;
4219 int start_of_bucket
, i
;
4221 xassert ((hash
& ~VALMASK
) == 0);
4223 /* Increment count after resizing because resizing may fail. */
4224 maybe_resize_hash_table (h
);
4225 h
->count
= make_number (XFASTINT (h
->count
) + 1);
4227 /* Store key/value in the key_and_value vector. */
4228 i
= XFASTINT (h
->next_free
);
4229 h
->next_free
= HASH_NEXT (h
, i
);
4230 HASH_KEY (h
, i
) = key
;
4231 HASH_VALUE (h
, i
) = value
;
4233 /* Remember its hash code. */
4234 HASH_HASH (h
, i
) = make_number (hash
);
4236 /* Add new entry to its collision chain. */
4237 start_of_bucket
= hash
% XVECTOR (h
->index
)->size
;
4238 HASH_NEXT (h
, i
) = HASH_INDEX (h
, start_of_bucket
);
4239 HASH_INDEX (h
, start_of_bucket
) = make_number (i
);
4244 /* Remove the entry matching KEY from hash table H, if there is one. */
4247 hash_remove (h
, key
)
4248 struct Lisp_Hash_Table
*h
;
4252 int start_of_bucket
;
4253 Lisp_Object idx
, prev
;
4255 hash_code
= h
->hashfn (h
, key
);
4256 start_of_bucket
= hash_code
% XVECTOR (h
->index
)->size
;
4257 idx
= HASH_INDEX (h
, start_of_bucket
);
4260 /* We need not gcpro idx, prev since they're either integers or nil. */
4263 int i
= XFASTINT (idx
);
4265 if (EQ (key
, HASH_KEY (h
, i
))
4267 && h
->cmpfn (h
, key
, hash_code
,
4268 HASH_KEY (h
, i
), XUINT (HASH_HASH (h
, i
)))))
4270 /* Take entry out of collision chain. */
4272 HASH_INDEX (h
, start_of_bucket
) = HASH_NEXT (h
, i
);
4274 HASH_NEXT (h
, XFASTINT (prev
)) = HASH_NEXT (h
, i
);
4276 /* Clear slots in key_and_value and add the slots to
4278 HASH_KEY (h
, i
) = HASH_VALUE (h
, i
) = HASH_HASH (h
, i
) = Qnil
;
4279 HASH_NEXT (h
, i
) = h
->next_free
;
4280 h
->next_free
= make_number (i
);
4281 h
->count
= make_number (XFASTINT (h
->count
) - 1);
4282 xassert (XINT (h
->count
) >= 0);
4288 idx
= HASH_NEXT (h
, i
);
4294 /* Clear hash table H. */
4298 struct Lisp_Hash_Table
*h
;
4300 if (XFASTINT (h
->count
) > 0)
4302 int i
, size
= HASH_TABLE_SIZE (h
);
4304 for (i
= 0; i
< size
; ++i
)
4306 HASH_NEXT (h
, i
) = i
< size
- 1 ? make_number (i
+ 1) : Qnil
;
4307 HASH_KEY (h
, i
) = Qnil
;
4308 HASH_VALUE (h
, i
) = Qnil
;
4309 HASH_HASH (h
, i
) = Qnil
;
4312 for (i
= 0; i
< XVECTOR (h
->index
)->size
; ++i
)
4313 XVECTOR (h
->index
)->contents
[i
] = Qnil
;
4315 h
->next_free
= make_number (0);
4316 h
->count
= make_number (0);
4322 /************************************************************************
4324 ************************************************************************/
4326 /* Sweep weak hash table H. REMOVE_ENTRIES_P non-zero means remove
4327 entries from the table that don't survive the current GC.
4328 REMOVE_ENTRIES_P zero means mark entries that are in use. Value is
4329 non-zero if anything was marked. */
4332 sweep_weak_table (h
, remove_entries_p
)
4333 struct Lisp_Hash_Table
*h
;
4334 int remove_entries_p
;
4336 int bucket
, n
, marked
;
4338 n
= XVECTOR (h
->index
)->size
& ~ARRAY_MARK_FLAG
;
4341 for (bucket
= 0; bucket
< n
; ++bucket
)
4343 Lisp_Object idx
, prev
;
4345 /* Follow collision chain, removing entries that
4346 don't survive this garbage collection. */
4347 idx
= HASH_INDEX (h
, bucket
);
4349 while (!GC_NILP (idx
))
4352 int i
= XFASTINT (idx
);
4354 int key_known_to_survive_p
, value_known_to_survive_p
;
4356 key_known_to_survive_p
= survives_gc_p (HASH_KEY (h
, i
));
4357 value_known_to_survive_p
= survives_gc_p (HASH_VALUE (h
, i
));
4359 if (EQ (h
->weak
, Qkey
))
4360 remove_p
= !key_known_to_survive_p
;
4361 else if (EQ (h
->weak
, Qvalue
))
4362 remove_p
= !value_known_to_survive_p
;
4363 else if (EQ (h
->weak
, Qkey_or_value
))
4364 remove_p
= !(key_known_to_survive_p
|| value_known_to_survive_p
);
4365 else if (EQ (h
->weak
, Qkey_and_value
))
4366 remove_p
= !(key_known_to_survive_p
&& value_known_to_survive_p
);
4370 next
= HASH_NEXT (h
, i
);
4372 if (remove_entries_p
)
4376 /* Take out of collision chain. */
4378 HASH_INDEX (h
, i
) = next
;
4380 HASH_NEXT (h
, XFASTINT (prev
)) = next
;
4382 /* Add to free list. */
4383 HASH_NEXT (h
, i
) = h
->next_free
;
4386 /* Clear key, value, and hash. */
4387 HASH_KEY (h
, i
) = HASH_VALUE (h
, i
) = Qnil
;
4388 HASH_HASH (h
, i
) = Qnil
;
4390 h
->count
= make_number (XFASTINT (h
->count
) - 1);
4397 /* Make sure key and value survive. */
4398 if (!key_known_to_survive_p
)
4400 mark_object (&HASH_KEY (h
, i
));
4404 if (!value_known_to_survive_p
)
4406 mark_object (&HASH_VALUE (h
, i
));
4419 /* Remove elements from weak hash tables that don't survive the
4420 current garbage collection. Remove weak tables that don't survive
4421 from Vweak_hash_tables. Called from gc_sweep. */
4424 sweep_weak_hash_tables ()
4426 Lisp_Object table
, used
, next
;
4427 struct Lisp_Hash_Table
*h
;
4430 /* Mark all keys and values that are in use. Keep on marking until
4431 there is no more change. This is necessary for cases like
4432 value-weak table A containing an entry X -> Y, where Y is used in a
4433 key-weak table B, Z -> Y. If B comes after A in the list of weak
4434 tables, X -> Y might be removed from A, although when looking at B
4435 one finds that it shouldn't. */
4439 for (table
= Vweak_hash_tables
; !GC_NILP (table
); table
= h
->next_weak
)
4441 h
= XHASH_TABLE (table
);
4442 if (h
->size
& ARRAY_MARK_FLAG
)
4443 marked
|= sweep_weak_table (h
, 0);
4448 /* Remove tables and entries that aren't used. */
4449 for (table
= Vweak_hash_tables
, used
= Qnil
; !GC_NILP (table
); table
= next
)
4451 h
= XHASH_TABLE (table
);
4452 next
= h
->next_weak
;
4454 if (h
->size
& ARRAY_MARK_FLAG
)
4456 /* TABLE is marked as used. Sweep its contents. */
4457 if (XFASTINT (h
->count
) > 0)
4458 sweep_weak_table (h
, 1);
4460 /* Add table to the list of used weak hash tables. */
4461 h
->next_weak
= used
;
4466 Vweak_hash_tables
= used
;
4471 /***********************************************************************
4472 Hash Code Computation
4473 ***********************************************************************/
4475 /* Maximum depth up to which to dive into Lisp structures. */
4477 #define SXHASH_MAX_DEPTH 3
4479 /* Maximum length up to which to take list and vector elements into
4482 #define SXHASH_MAX_LEN 7
4484 /* Combine two integers X and Y for hashing. */
4486 #define SXHASH_COMBINE(X, Y) \
4487 ((((unsigned)(X) << 4) + (((unsigned)(X) >> 24) & 0x0fffffff)) \
4491 /* Return a hash for string PTR which has length LEN. The hash
4492 code returned is guaranteed to fit in a Lisp integer. */
4495 sxhash_string (ptr
, len
)
4499 unsigned char *p
= ptr
;
4500 unsigned char *end
= p
+ len
;
4509 hash
= ((hash
<< 3) + (hash
>> 28) + c
);
4512 return hash
& VALMASK
;
4516 /* Return a hash for list LIST. DEPTH is the current depth in the
4517 list. We don't recurse deeper than SXHASH_MAX_DEPTH in it. */
4520 sxhash_list (list
, depth
)
4527 if (depth
< SXHASH_MAX_DEPTH
)
4529 CONSP (list
) && i
< SXHASH_MAX_LEN
;
4530 list
= XCDR (list
), ++i
)
4532 unsigned hash2
= sxhash (XCAR (list
), depth
+ 1);
4533 hash
= SXHASH_COMBINE (hash
, hash2
);
4540 /* Return a hash for vector VECTOR. DEPTH is the current depth in
4541 the Lisp structure. */
4544 sxhash_vector (vec
, depth
)
4548 unsigned hash
= XVECTOR (vec
)->size
;
4551 n
= min (SXHASH_MAX_LEN
, XVECTOR (vec
)->size
);
4552 for (i
= 0; i
< n
; ++i
)
4554 unsigned hash2
= sxhash (XVECTOR (vec
)->contents
[i
], depth
+ 1);
4555 hash
= SXHASH_COMBINE (hash
, hash2
);
4562 /* Return a hash for bool-vector VECTOR. */
4565 sxhash_bool_vector (vec
)
4568 unsigned hash
= XBOOL_VECTOR (vec
)->size
;
4571 n
= min (SXHASH_MAX_LEN
, XBOOL_VECTOR (vec
)->vector_size
);
4572 for (i
= 0; i
< n
; ++i
)
4573 hash
= SXHASH_COMBINE (hash
, XBOOL_VECTOR (vec
)->data
[i
]);
4579 /* Return a hash code for OBJ. DEPTH is the current depth in the Lisp
4580 structure. Value is an unsigned integer clipped to VALMASK. */
4589 if (depth
> SXHASH_MAX_DEPTH
)
4592 switch (XTYPE (obj
))
4599 hash
= sxhash_string (XSYMBOL (obj
)->name
->data
,
4600 XSYMBOL (obj
)->name
->size
);
4608 hash
= sxhash_string (XSTRING (obj
)->data
, XSTRING (obj
)->size
);
4611 /* This can be everything from a vector to an overlay. */
4612 case Lisp_Vectorlike
:
4614 /* According to the CL HyperSpec, two arrays are equal only if
4615 they are `eq', except for strings and bit-vectors. In
4616 Emacs, this works differently. We have to compare element
4618 hash
= sxhash_vector (obj
, depth
);
4619 else if (BOOL_VECTOR_P (obj
))
4620 hash
= sxhash_bool_vector (obj
);
4622 /* Others are `equal' if they are `eq', so let's take their
4628 hash
= sxhash_list (obj
, depth
);
4633 unsigned char *p
= (unsigned char *) &XFLOAT_DATA (obj
);
4634 unsigned char *e
= p
+ sizeof XFLOAT_DATA (obj
);
4635 for (hash
= 0; p
< e
; ++p
)
4636 hash
= SXHASH_COMBINE (hash
, *p
);
4644 return hash
& VALMASK
;
4649 /***********************************************************************
4651 ***********************************************************************/
4654 DEFUN ("sxhash", Fsxhash
, Ssxhash
, 1, 1, 0,
4655 "Compute a hash code for OBJ and return it as integer.")
4659 unsigned hash
= sxhash (obj
, 0);;
4660 return make_number (hash
);
4664 DEFUN ("make-hash-table", Fmake_hash_table
, Smake_hash_table
, 0, MANY
, 0,
4665 "Create and return a new hash table.\n\
4666 Arguments are specified as keyword/argument pairs. The following\n\
4667 arguments are defined:\n\
4669 :test TEST -- TEST must be a symbol that specifies how to compare keys.\n\
4670 Default is `eql'. Predefined are the tests `eq', `eql', and `equal'.\n\
4671 User-supplied test and hash functions can be specified via\n\
4672 `define-hash-table-test'.\n\
4674 :size SIZE -- A hint as to how many elements will be put in the table.\n\
4677 :rehash-size REHASH-SIZE - Indicates how to expand the table when\n\
4678 it fills up. If REHASH-SIZE is an integer, add that many space.\n\
4679 If it is a float, it must be > 1.0, and the new size is computed by\n\
4680 multiplying the old size with that factor. Default is 1.5.\n\
4682 :rehash-threshold THRESHOLD -- THRESHOLD must a float > 0, and <= 1.0.\n\
4683 Resize the hash table when ratio of the number of entries in the table.\n\
4686 :weakness WEAK -- WEAK must be one of nil, t, `key', `value',\n\
4687 `key-or-value', or `key-and-value'. If WEAK is not nil, the table returned\n\
4688 is a weak table. Key/value pairs are removed from a weak hash table when\n\
4689 there are no non-weak references pointing to their key, value, one of key\n\
4690 or value, or both key and value, depending on WEAK. WEAK t is equivalent\n\
4691 to `key-and-value'. Default value of WEAK is nil.")
4696 Lisp_Object test
, size
, rehash_size
, rehash_threshold
, weak
;
4697 Lisp_Object user_test
, user_hash
;
4701 /* The vector `used' is used to keep track of arguments that
4702 have been consumed. */
4703 used
= (char *) alloca (nargs
* sizeof *used
);
4704 bzero (used
, nargs
* sizeof *used
);
4706 /* See if there's a `:test TEST' among the arguments. */
4707 i
= get_key_arg (QCtest
, nargs
, args
, used
);
4708 test
= i
< 0 ? Qeql
: args
[i
];
4709 if (!EQ (test
, Qeq
) && !EQ (test
, Qeql
) && !EQ (test
, Qequal
))
4711 /* See if it is a user-defined test. */
4714 prop
= Fget (test
, Qhash_table_test
);
4715 if (!CONSP (prop
) || XFASTINT (Flength (prop
)) < 2)
4716 Fsignal (Qerror
, list2 (build_string ("Invalid hash table test"),
4718 user_test
= Fnth (make_number (0), prop
);
4719 user_hash
= Fnth (make_number (1), prop
);
4722 user_test
= user_hash
= Qnil
;
4724 /* See if there's a `:size SIZE' argument. */
4725 i
= get_key_arg (QCsize
, nargs
, args
, used
);
4726 size
= i
< 0 ? make_number (DEFAULT_HASH_SIZE
) : args
[i
];
4727 if (!INTEGERP (size
) || XINT (size
) < 0)
4729 list2 (build_string ("Invalid hash table size"),
4732 /* Look for `:rehash-size SIZE'. */
4733 i
= get_key_arg (QCrehash_size
, nargs
, args
, used
);
4734 rehash_size
= i
< 0 ? make_float (DEFAULT_REHASH_SIZE
) : args
[i
];
4735 if (!NUMBERP (rehash_size
)
4736 || (INTEGERP (rehash_size
) && XINT (rehash_size
) <= 0)
4737 || XFLOATINT (rehash_size
) <= 1.0)
4739 list2 (build_string ("Invalid hash table rehash size"),
4742 /* Look for `:rehash-threshold THRESHOLD'. */
4743 i
= get_key_arg (QCrehash_threshold
, nargs
, args
, used
);
4744 rehash_threshold
= i
< 0 ? make_float (DEFAULT_REHASH_THRESHOLD
) : args
[i
];
4745 if (!FLOATP (rehash_threshold
)
4746 || XFLOATINT (rehash_threshold
) <= 0.0
4747 || XFLOATINT (rehash_threshold
) > 1.0)
4749 list2 (build_string ("Invalid hash table rehash threshold"),
4752 /* Look for `:weakness WEAK'. */
4753 i
= get_key_arg (QCweakness
, nargs
, args
, used
);
4754 weak
= i
< 0 ? Qnil
: args
[i
];
4756 weak
= Qkey_and_value
;
4759 && !EQ (weak
, Qvalue
)
4760 && !EQ (weak
, Qkey_or_value
)
4761 && !EQ (weak
, Qkey_and_value
))
4762 Fsignal (Qerror
, list2 (build_string ("Invalid hash table weakness"),
4765 /* Now, all args should have been used up, or there's a problem. */
4766 for (i
= 0; i
< nargs
; ++i
)
4769 list2 (build_string ("Invalid argument list"), args
[i
]));
4771 return make_hash_table (test
, size
, rehash_size
, rehash_threshold
, weak
,
4772 user_test
, user_hash
);
4776 DEFUN ("copy-hash-table", Fcopy_hash_table
, Scopy_hash_table
, 1, 1, 0,
4777 "Return a copy of hash table TABLE.")
4781 return copy_hash_table (check_hash_table (table
));
4785 DEFUN ("makehash", Fmakehash
, Smakehash
, 0, 1, 0,
4786 "Create a new hash table.\n\
4787 Optional first argument TEST specifies how to compare keys in\n\
4788 the table. Predefined tests are `eq', `eql', and `equal'. Default\n\
4789 is `eql'. New tests can be defined with `define-hash-table-test'.")
4793 Lisp_Object args
[2];
4795 args
[1] = NILP (test
) ? Qeql
: test
;
4796 return Fmake_hash_table (2, args
);
4800 DEFUN ("hash-table-count", Fhash_table_count
, Shash_table_count
, 1, 1, 0,
4801 "Return the number of elements in TABLE.")
4805 return check_hash_table (table
)->count
;
4809 DEFUN ("hash-table-rehash-size", Fhash_table_rehash_size
,
4810 Shash_table_rehash_size
, 1, 1, 0,
4811 "Return the current rehash size of TABLE.")
4815 return check_hash_table (table
)->rehash_size
;
4819 DEFUN ("hash-table-rehash-threshold", Fhash_table_rehash_threshold
,
4820 Shash_table_rehash_threshold
, 1, 1, 0,
4821 "Return the current rehash threshold of TABLE.")
4825 return check_hash_table (table
)->rehash_threshold
;
4829 DEFUN ("hash-table-size", Fhash_table_size
, Shash_table_size
, 1, 1, 0,
4830 "Return the size of TABLE.\n\
4831 The size can be used as an argument to `make-hash-table' to create\n\
4832 a hash table than can hold as many elements of TABLE holds\n\
4833 without need for resizing.")
4837 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
4838 return make_number (HASH_TABLE_SIZE (h
));
4842 DEFUN ("hash-table-test", Fhash_table_test
, Shash_table_test
, 1, 1, 0,
4843 "Return the test TABLE uses.")
4847 return check_hash_table (table
)->test
;
4851 DEFUN ("hash-table-weakness", Fhash_table_weakness
, Shash_table_weakness
,
4853 "Return the weakness of TABLE.")
4857 return check_hash_table (table
)->weak
;
4861 DEFUN ("hash-table-p", Fhash_table_p
, Shash_table_p
, 1, 1, 0,
4862 "Return t if OBJ is a Lisp hash table object.")
4866 return HASH_TABLE_P (obj
) ? Qt
: Qnil
;
4870 DEFUN ("clrhash", Fclrhash
, Sclrhash
, 1, 1, 0,
4871 "Clear hash table TABLE.")
4875 hash_clear (check_hash_table (table
));
4880 DEFUN ("gethash", Fgethash
, Sgethash
, 2, 3, 0,
4881 "Look up KEY in TABLE and return its associated value.\n\
4882 If KEY is not found, return DFLT which defaults to nil.")
4884 Lisp_Object key
, table
, dflt
;
4886 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
4887 int i
= hash_lookup (h
, key
, NULL
);
4888 return i
>= 0 ? HASH_VALUE (h
, i
) : dflt
;
4892 DEFUN ("puthash", Fputhash
, Sputhash
, 3, 3, 0,
4893 "Associate KEY with VALUE in hash table TABLE.\n\
4894 If KEY is already present in table, replace its current value with\n\
4897 Lisp_Object key
, value
, table
;
4899 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
4903 i
= hash_lookup (h
, key
, &hash
);
4905 HASH_VALUE (h
, i
) = value
;
4907 hash_put (h
, key
, value
, hash
);
4913 DEFUN ("remhash", Fremhash
, Sremhash
, 2, 2, 0,
4914 "Remove KEY from TABLE.")
4916 Lisp_Object key
, table
;
4918 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
4919 hash_remove (h
, key
);
4924 DEFUN ("maphash", Fmaphash
, Smaphash
, 2, 2, 0,
4925 "Call FUNCTION for all entries in hash table TABLE.\n\
4926 FUNCTION is called with 2 arguments KEY and VALUE.")
4928 Lisp_Object function
, table
;
4930 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
4931 Lisp_Object args
[3];
4934 for (i
= 0; i
< HASH_TABLE_SIZE (h
); ++i
)
4935 if (!NILP (HASH_HASH (h
, i
)))
4938 args
[1] = HASH_KEY (h
, i
);
4939 args
[2] = HASH_VALUE (h
, i
);
4947 DEFUN ("define-hash-table-test", Fdefine_hash_table_test
,
4948 Sdefine_hash_table_test
, 3, 3, 0,
4949 "Define a new hash table test with name NAME, a symbol.\n\
4950 In hash tables create with NAME specified as test, use TEST to compare\n\
4951 keys, and HASH for computing hash codes of keys.\n\
4953 TEST must be a function taking two arguments and returning non-nil\n\
4954 if both arguments are the same. HASH must be a function taking\n\
4955 one argument and return an integer that is the hash code of the\n\
4956 argument. Hash code computation should use the whole value range of\n\
4957 integers, including negative integers.")
4959 Lisp_Object name
, test
, hash
;
4961 return Fput (name
, Qhash_table_test
, list2 (test
, hash
));
4970 /* Hash table stuff. */
4971 Qhash_table_p
= intern ("hash-table-p");
4972 staticpro (&Qhash_table_p
);
4973 Qeq
= intern ("eq");
4975 Qeql
= intern ("eql");
4977 Qequal
= intern ("equal");
4978 staticpro (&Qequal
);
4979 QCtest
= intern (":test");
4980 staticpro (&QCtest
);
4981 QCsize
= intern (":size");
4982 staticpro (&QCsize
);
4983 QCrehash_size
= intern (":rehash-size");
4984 staticpro (&QCrehash_size
);
4985 QCrehash_threshold
= intern (":rehash-threshold");
4986 staticpro (&QCrehash_threshold
);
4987 QCweakness
= intern (":weakness");
4988 staticpro (&QCweakness
);
4989 Qkey
= intern ("key");
4991 Qvalue
= intern ("value");
4992 staticpro (&Qvalue
);
4993 Qhash_table_test
= intern ("hash-table-test");
4994 staticpro (&Qhash_table_test
);
4995 Qkey_or_value
= intern ("key-or-value");
4996 staticpro (&Qkey_or_value
);
4997 Qkey_and_value
= intern ("key-and-value");
4998 staticpro (&Qkey_and_value
);
5001 defsubr (&Smake_hash_table
);
5002 defsubr (&Scopy_hash_table
);
5003 defsubr (&Smakehash
);
5004 defsubr (&Shash_table_count
);
5005 defsubr (&Shash_table_rehash_size
);
5006 defsubr (&Shash_table_rehash_threshold
);
5007 defsubr (&Shash_table_size
);
5008 defsubr (&Shash_table_test
);
5009 defsubr (&Shash_table_weakness
);
5010 defsubr (&Shash_table_p
);
5011 defsubr (&Sclrhash
);
5012 defsubr (&Sgethash
);
5013 defsubr (&Sputhash
);
5014 defsubr (&Sremhash
);
5015 defsubr (&Smaphash
);
5016 defsubr (&Sdefine_hash_table_test
);
5018 Qstring_lessp
= intern ("string-lessp");
5019 staticpro (&Qstring_lessp
);
5020 Qprovide
= intern ("provide");
5021 staticpro (&Qprovide
);
5022 Qrequire
= intern ("require");
5023 staticpro (&Qrequire
);
5024 Qyes_or_no_p_history
= intern ("yes-or-no-p-history");
5025 staticpro (&Qyes_or_no_p_history
);
5026 Qcursor_in_echo_area
= intern ("cursor-in-echo-area");
5027 staticpro (&Qcursor_in_echo_area
);
5028 Qwidget_type
= intern ("widget-type");
5029 staticpro (&Qwidget_type
);
5031 staticpro (&string_char_byte_cache_string
);
5032 string_char_byte_cache_string
= Qnil
;
5034 Fset (Qyes_or_no_p_history
, Qnil
);
5036 DEFVAR_LISP ("features", &Vfeatures
,
5037 "A list of symbols which are the features of the executing emacs.\n\
5038 Used by `featurep' and `require', and altered by `provide'.");
5041 DEFVAR_BOOL ("use-dialog-box", &use_dialog_box
,
5042 "*Non-nil means mouse commands use dialog boxes to ask questions.\n\
5043 This applies to y-or-n and yes-or-no questions asked by commands\n\
5044 invoked by mouse clicks and mouse menu items.");
5047 defsubr (&Sidentity
);
5050 defsubr (&Ssafe_length
);
5051 defsubr (&Sstring_bytes
);
5052 defsubr (&Sstring_equal
);
5053 defsubr (&Scompare_strings
);
5054 defsubr (&Sstring_lessp
);
5057 defsubr (&Svconcat
);
5058 defsubr (&Scopy_sequence
);
5059 defsubr (&Sstring_make_multibyte
);
5060 defsubr (&Sstring_make_unibyte
);
5061 defsubr (&Sstring_as_multibyte
);
5062 defsubr (&Sstring_as_unibyte
);
5063 defsubr (&Scopy_alist
);
5064 defsubr (&Ssubstring
);
5076 defsubr (&Snreverse
);
5077 defsubr (&Sreverse
);
5079 defsubr (&Splist_get
);
5081 defsubr (&Splist_put
);
5084 defsubr (&Sfillarray
);
5085 defsubr (&Schar_table_subtype
);
5086 defsubr (&Schar_table_parent
);
5087 defsubr (&Sset_char_table_parent
);
5088 defsubr (&Schar_table_extra_slot
);
5089 defsubr (&Sset_char_table_extra_slot
);
5090 defsubr (&Schar_table_range
);
5091 defsubr (&Sset_char_table_range
);
5092 defsubr (&Sset_char_table_default
);
5093 defsubr (&Soptimize_char_table
);
5094 defsubr (&Smap_char_table
);
5098 defsubr (&Smapconcat
);
5099 defsubr (&Sy_or_n_p
);
5100 defsubr (&Syes_or_no_p
);
5101 defsubr (&Sload_average
);
5102 defsubr (&Sfeaturep
);
5103 defsubr (&Srequire
);
5104 defsubr (&Sprovide
);
5105 defsubr (&Splist_member
);
5106 defsubr (&Swidget_put
);
5107 defsubr (&Swidget_get
);
5108 defsubr (&Swidget_apply
);
5109 defsubr (&Sbase64_encode_region
);
5110 defsubr (&Sbase64_decode_region
);
5111 defsubr (&Sbase64_encode_string
);
5112 defsubr (&Sbase64_decode_string
);
5119 Vweak_hash_tables
= Qnil
;