1 /* Random utility Lisp functions.
2 Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1997, 1998, 1999, 2000,
3 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
5 This file is part of GNU Emacs.
7 GNU Emacs is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs; see the file COPYING. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
30 /* On Mac OS, defining this conflicts with precompiled headers. */
32 /* Note on some machines this defines `vector' as a typedef,
33 so make sure we don't use that name in this file. */
37 #endif /* ! MAC_OSX */
46 #include "intervals.h"
49 #include "blockinput.h"
50 #if defined (HAVE_MENUS) && defined (HAVE_X_WINDOWS)
55 #define NULL ((POINTER_TYPE *)0)
58 /* Nonzero enables use of dialog boxes for questions
59 asked by mouse commands. */
62 /* Nonzero enables use of a file dialog for file name
63 questions asked by mouse commands. */
66 extern int minibuffer_auto_raise
;
67 extern Lisp_Object minibuf_window
;
68 extern Lisp_Object Vlocale_coding_system
;
69 extern int load_in_progress
;
71 Lisp_Object Qstring_lessp
, Qprovide
, Qrequire
;
72 Lisp_Object Qyes_or_no_p_history
;
73 Lisp_Object Qcursor_in_echo_area
;
74 Lisp_Object Qwidget_type
;
75 Lisp_Object Qcodeset
, Qdays
, Qmonths
, Qpaper
;
77 extern Lisp_Object Qinput_method_function
;
79 static int internal_equal ();
81 extern long get_random ();
82 extern void seed_random ();
88 DEFUN ("identity", Fidentity
, Sidentity
, 1, 1, 0,
89 doc
: /* Return the argument unchanged. */)
96 DEFUN ("random", Frandom
, Srandom
, 0, 1, 0,
97 doc
: /* Return a pseudo-random number.
98 All integers representable in Lisp are equally likely.
99 On most systems, this is 29 bits' worth.
100 With positive integer argument N, return random number in interval [0,N).
101 With argument t, set the random number seed from the current time and pid. */)
106 Lisp_Object lispy_val
;
107 unsigned long denominator
;
110 seed_random (getpid () + time (NULL
));
111 if (NATNUMP (n
) && XFASTINT (n
) != 0)
113 /* Try to take our random number from the higher bits of VAL,
114 not the lower, since (says Gentzel) the low bits of `random'
115 are less random than the higher ones. We do this by using the
116 quotient rather than the remainder. At the high end of the RNG
117 it's possible to get a quotient larger than n; discarding
118 these values eliminates the bias that would otherwise appear
119 when using a large n. */
120 denominator
= ((unsigned long)1 << VALBITS
) / XFASTINT (n
);
122 val
= get_random () / denominator
;
123 while (val
>= XFASTINT (n
));
127 XSETINT (lispy_val
, val
);
131 /* Random data-structure functions */
133 DEFUN ("length", Flength
, Slength
, 1, 1, 0,
134 doc
: /* Return the length of vector, list or string SEQUENCE.
135 A byte-code function object is also allowed.
136 If the string contains multibyte characters, this is not necessarily
137 the number of bytes in the string; it is the number of characters.
138 To get the number of bytes, use `string-bytes'. */)
140 register Lisp_Object sequence
;
142 register Lisp_Object val
;
146 if (STRINGP (sequence
))
147 XSETFASTINT (val
, SCHARS (sequence
));
148 else if (VECTORP (sequence
))
149 XSETFASTINT (val
, XVECTOR (sequence
)->size
);
150 else if (SUB_CHAR_TABLE_P (sequence
))
151 XSETFASTINT (val
, SUB_CHAR_TABLE_ORDINARY_SLOTS
);
152 else if (CHAR_TABLE_P (sequence
))
153 XSETFASTINT (val
, MAX_CHAR
);
154 else if (BOOL_VECTOR_P (sequence
))
155 XSETFASTINT (val
, XBOOL_VECTOR (sequence
)->size
);
156 else if (COMPILEDP (sequence
))
157 XSETFASTINT (val
, XVECTOR (sequence
)->size
& PSEUDOVECTOR_SIZE_MASK
);
158 else if (CONSP (sequence
))
161 while (CONSP (sequence
))
163 sequence
= XCDR (sequence
);
166 if (!CONSP (sequence
))
169 sequence
= XCDR (sequence
);
174 if (!NILP (sequence
))
175 wrong_type_argument (Qlistp
, sequence
);
177 val
= make_number (i
);
179 else if (NILP (sequence
))
180 XSETFASTINT (val
, 0);
183 sequence
= wrong_type_argument (Qsequencep
, sequence
);
189 /* This does not check for quits. That is safe since it must terminate. */
191 DEFUN ("safe-length", Fsafe_length
, Ssafe_length
, 1, 1, 0,
192 doc
: /* Return the length of a list, but avoid error or infinite loop.
193 This function never gets an error. If LIST is not really a list,
194 it returns 0. If LIST is circular, it returns a finite value
195 which is at least the number of distinct elements. */)
199 Lisp_Object tail
, halftail
, length
;
202 /* halftail is used to detect circular lists. */
204 for (tail
= list
; CONSP (tail
); tail
= XCDR (tail
))
206 if (EQ (tail
, halftail
) && len
!= 0)
210 halftail
= XCDR (halftail
);
213 XSETINT (length
, len
);
217 DEFUN ("string-bytes", Fstring_bytes
, Sstring_bytes
, 1, 1, 0,
218 doc
: /* Return the number of bytes in STRING.
219 If STRING is a multibyte string, this is greater than the length of STRING. */)
223 CHECK_STRING (string
);
224 return make_number (SBYTES (string
));
227 DEFUN ("string-equal", Fstring_equal
, Sstring_equal
, 2, 2, 0,
228 doc
: /* Return t if two strings have identical contents.
229 Case is significant, but text properties are ignored.
230 Symbols are also allowed; their print names are used instead. */)
232 register Lisp_Object s1
, s2
;
235 s1
= SYMBOL_NAME (s1
);
237 s2
= SYMBOL_NAME (s2
);
241 if (SCHARS (s1
) != SCHARS (s2
)
242 || SBYTES (s1
) != SBYTES (s2
)
243 || bcmp (SDATA (s1
), SDATA (s2
), SBYTES (s1
)))
248 DEFUN ("compare-strings", Fcompare_strings
,
249 Scompare_strings
, 6, 7, 0,
250 doc
: /* Compare the contents of two strings, converting to multibyte if needed.
251 In string STR1, skip the first START1 characters and stop at END1.
252 In string STR2, skip the first START2 characters and stop at END2.
253 END1 and END2 default to the full lengths of the respective strings.
255 Case is significant in this comparison if IGNORE-CASE is nil.
256 Unibyte strings are converted to multibyte for comparison.
258 The value is t if the strings (or specified portions) match.
259 If string STR1 is less, the value is a negative number N;
260 - 1 - N is the number of characters that match at the beginning.
261 If string STR1 is greater, the value is a positive number N;
262 N - 1 is the number of characters that match at the beginning. */)
263 (str1
, start1
, end1
, str2
, start2
, end2
, ignore_case
)
264 Lisp_Object str1
, start1
, end1
, start2
, str2
, end2
, ignore_case
;
266 register int end1_char
, end2_char
;
267 register int i1
, i1_byte
, i2
, i2_byte
;
272 start1
= make_number (0);
274 start2
= make_number (0);
275 CHECK_NATNUM (start1
);
276 CHECK_NATNUM (start2
);
285 i1_byte
= string_char_to_byte (str1
, i1
);
286 i2_byte
= string_char_to_byte (str2
, i2
);
288 end1_char
= SCHARS (str1
);
289 if (! NILP (end1
) && end1_char
> XINT (end1
))
290 end1_char
= XINT (end1
);
292 end2_char
= SCHARS (str2
);
293 if (! NILP (end2
) && end2_char
> XINT (end2
))
294 end2_char
= XINT (end2
);
296 while (i1
< end1_char
&& i2
< end2_char
)
298 /* When we find a mismatch, we must compare the
299 characters, not just the bytes. */
302 if (STRING_MULTIBYTE (str1
))
303 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c1
, str1
, i1
, i1_byte
);
306 c1
= SREF (str1
, i1
++);
307 c1
= unibyte_char_to_multibyte (c1
);
310 if (STRING_MULTIBYTE (str2
))
311 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c2
, str2
, i2
, i2_byte
);
314 c2
= SREF (str2
, i2
++);
315 c2
= unibyte_char_to_multibyte (c2
);
321 if (! NILP (ignore_case
))
325 tem
= Fupcase (make_number (c1
));
327 tem
= Fupcase (make_number (c2
));
334 /* Note that I1 has already been incremented
335 past the character that we are comparing;
336 hence we don't add or subtract 1 here. */
338 return make_number (- i1
+ XINT (start1
));
340 return make_number (i1
- XINT (start1
));
344 return make_number (i1
- XINT (start1
) + 1);
346 return make_number (- i1
+ XINT (start1
) - 1);
351 DEFUN ("string-lessp", Fstring_lessp
, Sstring_lessp
, 2, 2, 0,
352 doc
: /* Return t if first arg string is less than second in lexicographic order.
354 Symbols are also allowed; their print names are used instead. */)
356 register Lisp_Object s1
, s2
;
359 register int i1
, i1_byte
, i2
, i2_byte
;
362 s1
= SYMBOL_NAME (s1
);
364 s2
= SYMBOL_NAME (s2
);
368 i1
= i1_byte
= i2
= i2_byte
= 0;
371 if (end
> SCHARS (s2
))
376 /* When we find a mismatch, we must compare the
377 characters, not just the bytes. */
380 FETCH_STRING_CHAR_ADVANCE (c1
, s1
, i1
, i1_byte
);
381 FETCH_STRING_CHAR_ADVANCE (c2
, s2
, i2
, i2_byte
);
384 return c1
< c2
? Qt
: Qnil
;
386 return i1
< SCHARS (s2
) ? Qt
: Qnil
;
389 static Lisp_Object
concat ();
400 return concat (2, args
, Lisp_String
, 0);
402 return concat (2, &s1
, Lisp_String
, 0);
403 #endif /* NO_ARG_ARRAY */
409 Lisp_Object s1
, s2
, s3
;
416 return concat (3, args
, Lisp_String
, 0);
418 return concat (3, &s1
, Lisp_String
, 0);
419 #endif /* NO_ARG_ARRAY */
422 DEFUN ("append", Fappend
, Sappend
, 0, MANY
, 0,
423 doc
: /* Concatenate all the arguments and make the result a list.
424 The result is a list whose elements are the elements of all the arguments.
425 Each argument may be a list, vector or string.
426 The last argument is not copied, just used as the tail of the new list.
427 usage: (append &rest SEQUENCES) */)
432 return concat (nargs
, args
, Lisp_Cons
, 1);
435 DEFUN ("concat", Fconcat
, Sconcat
, 0, MANY
, 0,
436 doc
: /* Concatenate all the arguments and make the result a string.
437 The result is a string whose elements are the elements of all the arguments.
438 Each argument may be a string or a list or vector of characters (integers).
439 usage: (concat &rest SEQUENCES) */)
444 return concat (nargs
, args
, Lisp_String
, 0);
447 DEFUN ("vconcat", Fvconcat
, Svconcat
, 0, MANY
, 0,
448 doc
: /* Concatenate all the arguments and make the result a vector.
449 The result is a vector whose elements are the elements of all the arguments.
450 Each argument may be a list, vector or string.
451 usage: (vconcat &rest SEQUENCES) */)
456 return concat (nargs
, args
, Lisp_Vectorlike
, 0);
459 /* Return a copy of a sub char table ARG. The elements except for a
460 nested sub char table are not copied. */
462 copy_sub_char_table (arg
)
465 Lisp_Object copy
= make_sub_char_table (Qnil
);
468 XCHAR_TABLE (copy
)->defalt
= XCHAR_TABLE (arg
)->defalt
;
469 /* Copy all the contents. */
470 bcopy (XCHAR_TABLE (arg
)->contents
, XCHAR_TABLE (copy
)->contents
,
471 SUB_CHAR_TABLE_ORDINARY_SLOTS
* sizeof (Lisp_Object
));
472 /* Recursively copy any sub char-tables in the ordinary slots. */
473 for (i
= 32; i
< SUB_CHAR_TABLE_ORDINARY_SLOTS
; i
++)
474 if (SUB_CHAR_TABLE_P (XCHAR_TABLE (arg
)->contents
[i
]))
475 XCHAR_TABLE (copy
)->contents
[i
]
476 = copy_sub_char_table (XCHAR_TABLE (copy
)->contents
[i
]);
482 DEFUN ("copy-sequence", Fcopy_sequence
, Scopy_sequence
, 1, 1, 0,
483 doc
: /* Return a copy of a list, vector, string or char-table.
484 The elements of a list or vector are not copied; they are shared
485 with the original. */)
489 if (NILP (arg
)) return arg
;
491 if (CHAR_TABLE_P (arg
))
496 copy
= Fmake_char_table (XCHAR_TABLE (arg
)->purpose
, Qnil
);
497 /* Copy all the slots, including the extra ones. */
498 bcopy (XVECTOR (arg
)->contents
, XVECTOR (copy
)->contents
,
499 ((XCHAR_TABLE (arg
)->size
& PSEUDOVECTOR_SIZE_MASK
)
500 * sizeof (Lisp_Object
)));
502 /* Recursively copy any sub char tables in the ordinary slots
503 for multibyte characters. */
504 for (i
= CHAR_TABLE_SINGLE_BYTE_SLOTS
;
505 i
< CHAR_TABLE_ORDINARY_SLOTS
; i
++)
506 if (SUB_CHAR_TABLE_P (XCHAR_TABLE (arg
)->contents
[i
]))
507 XCHAR_TABLE (copy
)->contents
[i
]
508 = copy_sub_char_table (XCHAR_TABLE (copy
)->contents
[i
]);
513 if (BOOL_VECTOR_P (arg
))
517 = ((XBOOL_VECTOR (arg
)->size
+ BOOL_VECTOR_BITS_PER_CHAR
- 1)
518 / BOOL_VECTOR_BITS_PER_CHAR
);
520 val
= Fmake_bool_vector (Flength (arg
), Qnil
);
521 bcopy (XBOOL_VECTOR (arg
)->data
, XBOOL_VECTOR (val
)->data
,
526 if (!CONSP (arg
) && !VECTORP (arg
) && !STRINGP (arg
))
527 arg
= wrong_type_argument (Qsequencep
, arg
);
528 return concat (1, &arg
, CONSP (arg
) ? Lisp_Cons
: XTYPE (arg
), 0);
531 /* This structure holds information of an argument of `concat' that is
532 a string and has text properties to be copied. */
535 int argnum
; /* refer to ARGS (arguments of `concat') */
536 int from
; /* refer to ARGS[argnum] (argument string) */
537 int to
; /* refer to VAL (the target string) */
541 concat (nargs
, args
, target_type
, last_special
)
544 enum Lisp_Type target_type
;
548 register Lisp_Object tail
;
549 register Lisp_Object
this;
551 int toindex_byte
= 0;
552 register int result_len
;
553 register int result_len_byte
;
555 Lisp_Object last_tail
;
558 /* When we make a multibyte string, we can't copy text properties
559 while concatinating each string because the length of resulting
560 string can't be decided until we finish the whole concatination.
561 So, we record strings that have text properties to be copied
562 here, and copy the text properties after the concatination. */
563 struct textprop_rec
*textprops
= NULL
;
564 /* Number of elments in textprops. */
565 int num_textprops
= 0;
570 /* In append, the last arg isn't treated like the others */
571 if (last_special
&& nargs
> 0)
574 last_tail
= args
[nargs
];
579 /* Canonicalize each argument. */
580 for (argnum
= 0; argnum
< nargs
; argnum
++)
583 if (!(CONSP (this) || NILP (this) || VECTORP (this) || STRINGP (this)
584 || COMPILEDP (this) || BOOL_VECTOR_P (this)))
586 args
[argnum
] = wrong_type_argument (Qsequencep
, this);
590 /* Compute total length in chars of arguments in RESULT_LEN.
591 If desired output is a string, also compute length in bytes
592 in RESULT_LEN_BYTE, and determine in SOME_MULTIBYTE
593 whether the result should be a multibyte string. */
597 for (argnum
= 0; argnum
< nargs
; argnum
++)
601 len
= XFASTINT (Flength (this));
602 if (target_type
== Lisp_String
)
604 /* We must count the number of bytes needed in the string
605 as well as the number of characters. */
611 for (i
= 0; i
< len
; i
++)
613 ch
= XVECTOR (this)->contents
[i
];
615 wrong_type_argument (Qintegerp
, ch
);
616 this_len_byte
= CHAR_BYTES (XINT (ch
));
617 result_len_byte
+= this_len_byte
;
618 if (!SINGLE_BYTE_CHAR_P (XINT (ch
)))
621 else if (BOOL_VECTOR_P (this) && XBOOL_VECTOR (this)->size
> 0)
622 wrong_type_argument (Qintegerp
, Faref (this, make_number (0)));
623 else if (CONSP (this))
624 for (; CONSP (this); this = XCDR (this))
628 wrong_type_argument (Qintegerp
, ch
);
629 this_len_byte
= CHAR_BYTES (XINT (ch
));
630 result_len_byte
+= this_len_byte
;
631 if (!SINGLE_BYTE_CHAR_P (XINT (ch
)))
634 else if (STRINGP (this))
636 if (STRING_MULTIBYTE (this))
639 result_len_byte
+= SBYTES (this);
642 result_len_byte
+= count_size_as_multibyte (SDATA (this),
650 if (! some_multibyte
)
651 result_len_byte
= result_len
;
653 /* Create the output object. */
654 if (target_type
== Lisp_Cons
)
655 val
= Fmake_list (make_number (result_len
), Qnil
);
656 else if (target_type
== Lisp_Vectorlike
)
657 val
= Fmake_vector (make_number (result_len
), Qnil
);
658 else if (some_multibyte
)
659 val
= make_uninit_multibyte_string (result_len
, result_len_byte
);
661 val
= make_uninit_string (result_len
);
663 /* In `append', if all but last arg are nil, return last arg. */
664 if (target_type
== Lisp_Cons
&& EQ (val
, Qnil
))
667 /* Copy the contents of the args into the result. */
669 tail
= val
, toindex
= -1; /* -1 in toindex is flag we are making a list */
671 toindex
= 0, toindex_byte
= 0;
675 SAFE_ALLOCA (textprops
, struct textprop_rec
*, sizeof (struct textprop_rec
) * nargs
);
677 for (argnum
= 0; argnum
< nargs
; argnum
++)
681 register unsigned int thisindex
= 0;
682 register unsigned int thisindex_byte
= 0;
686 thislen
= Flength (this), thisleni
= XINT (thislen
);
688 /* Between strings of the same kind, copy fast. */
689 if (STRINGP (this) && STRINGP (val
)
690 && STRING_MULTIBYTE (this) == some_multibyte
)
692 int thislen_byte
= SBYTES (this);
694 bcopy (SDATA (this), SDATA (val
) + toindex_byte
,
696 if (! NULL_INTERVAL_P (STRING_INTERVALS (this)))
698 textprops
[num_textprops
].argnum
= argnum
;
699 textprops
[num_textprops
].from
= 0;
700 textprops
[num_textprops
++].to
= toindex
;
702 toindex_byte
+= thislen_byte
;
704 STRING_SET_CHARS (val
, SCHARS (val
));
706 /* Copy a single-byte string to a multibyte string. */
707 else if (STRINGP (this) && STRINGP (val
))
709 if (! NULL_INTERVAL_P (STRING_INTERVALS (this)))
711 textprops
[num_textprops
].argnum
= argnum
;
712 textprops
[num_textprops
].from
= 0;
713 textprops
[num_textprops
++].to
= toindex
;
715 toindex_byte
+= copy_text (SDATA (this),
716 SDATA (val
) + toindex_byte
,
717 SCHARS (this), 0, 1);
721 /* Copy element by element. */
724 register Lisp_Object elt
;
726 /* Fetch next element of `this' arg into `elt', or break if
727 `this' is exhausted. */
728 if (NILP (this)) break;
730 elt
= XCAR (this), this = XCDR (this);
731 else if (thisindex
>= thisleni
)
733 else if (STRINGP (this))
736 if (STRING_MULTIBYTE (this))
738 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c
, this,
741 XSETFASTINT (elt
, c
);
745 XSETFASTINT (elt
, SREF (this, thisindex
)); thisindex
++;
747 && (XINT (elt
) >= 0240
748 || (XINT (elt
) >= 0200
749 && ! NILP (Vnonascii_translation_table
)))
750 && XINT (elt
) < 0400)
752 c
= unibyte_char_to_multibyte (XINT (elt
));
757 else if (BOOL_VECTOR_P (this))
760 byte
= XBOOL_VECTOR (this)->data
[thisindex
/ BOOL_VECTOR_BITS_PER_CHAR
];
761 if (byte
& (1 << (thisindex
% BOOL_VECTOR_BITS_PER_CHAR
)))
768 elt
= XVECTOR (this)->contents
[thisindex
++];
770 /* Store this element into the result. */
777 else if (VECTORP (val
))
778 XVECTOR (val
)->contents
[toindex
++] = elt
;
782 if (SINGLE_BYTE_CHAR_P (XINT (elt
)))
786 += CHAR_STRING (XINT (elt
),
787 SDATA (val
) + toindex_byte
);
789 SSET (val
, toindex_byte
++, XINT (elt
));
793 /* If we have any multibyte characters,
794 we already decided to make a multibyte string. */
797 /* P exists as a variable
798 to avoid a bug on the Masscomp C compiler. */
799 unsigned char *p
= SDATA (val
) + toindex_byte
;
801 toindex_byte
+= CHAR_STRING (c
, p
);
808 XSETCDR (prev
, last_tail
);
810 if (num_textprops
> 0)
813 int last_to_end
= -1;
815 for (argnum
= 0; argnum
< num_textprops
; argnum
++)
817 this = args
[textprops
[argnum
].argnum
];
818 props
= text_property_list (this,
820 make_number (SCHARS (this)),
822 /* If successive arguments have properites, be sure that the
823 value of `composition' property be the copy. */
824 if (last_to_end
== textprops
[argnum
].to
)
825 make_composition_value_copy (props
);
826 add_text_properties_from_list (val
, props
,
827 make_number (textprops
[argnum
].to
));
828 last_to_end
= textprops
[argnum
].to
+ SCHARS (this);
836 static Lisp_Object string_char_byte_cache_string
;
837 static int string_char_byte_cache_charpos
;
838 static int string_char_byte_cache_bytepos
;
841 clear_string_char_byte_cache ()
843 string_char_byte_cache_string
= Qnil
;
846 /* Return the character index corresponding to CHAR_INDEX in STRING. */
849 string_char_to_byte (string
, char_index
)
854 int best_below
, best_below_byte
;
855 int best_above
, best_above_byte
;
857 best_below
= best_below_byte
= 0;
858 best_above
= SCHARS (string
);
859 best_above_byte
= SBYTES (string
);
860 if (best_above
== best_above_byte
)
863 if (EQ (string
, string_char_byte_cache_string
))
865 if (string_char_byte_cache_charpos
< char_index
)
867 best_below
= string_char_byte_cache_charpos
;
868 best_below_byte
= string_char_byte_cache_bytepos
;
872 best_above
= string_char_byte_cache_charpos
;
873 best_above_byte
= string_char_byte_cache_bytepos
;
877 if (char_index
- best_below
< best_above
- char_index
)
879 while (best_below
< char_index
)
882 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c
, string
,
883 best_below
, best_below_byte
);
886 i_byte
= best_below_byte
;
890 while (best_above
> char_index
)
892 unsigned char *pend
= SDATA (string
) + best_above_byte
;
893 unsigned char *pbeg
= pend
- best_above_byte
;
894 unsigned char *p
= pend
- 1;
897 while (p
> pbeg
&& !CHAR_HEAD_P (*p
)) p
--;
898 PARSE_MULTIBYTE_SEQ (p
, pend
- p
, bytes
);
899 if (bytes
== pend
- p
)
900 best_above_byte
-= bytes
;
901 else if (bytes
> pend
- p
)
902 best_above_byte
-= (pend
- p
);
908 i_byte
= best_above_byte
;
911 string_char_byte_cache_bytepos
= i_byte
;
912 string_char_byte_cache_charpos
= i
;
913 string_char_byte_cache_string
= string
;
918 /* Return the character index corresponding to BYTE_INDEX in STRING. */
921 string_byte_to_char (string
, byte_index
)
926 int best_below
, best_below_byte
;
927 int best_above
, best_above_byte
;
929 best_below
= best_below_byte
= 0;
930 best_above
= SCHARS (string
);
931 best_above_byte
= SBYTES (string
);
932 if (best_above
== best_above_byte
)
935 if (EQ (string
, string_char_byte_cache_string
))
937 if (string_char_byte_cache_bytepos
< byte_index
)
939 best_below
= string_char_byte_cache_charpos
;
940 best_below_byte
= string_char_byte_cache_bytepos
;
944 best_above
= string_char_byte_cache_charpos
;
945 best_above_byte
= string_char_byte_cache_bytepos
;
949 if (byte_index
- best_below_byte
< best_above_byte
- byte_index
)
951 while (best_below_byte
< byte_index
)
954 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c
, string
,
955 best_below
, best_below_byte
);
958 i_byte
= best_below_byte
;
962 while (best_above_byte
> byte_index
)
964 unsigned char *pend
= SDATA (string
) + best_above_byte
;
965 unsigned char *pbeg
= pend
- best_above_byte
;
966 unsigned char *p
= pend
- 1;
969 while (p
> pbeg
&& !CHAR_HEAD_P (*p
)) p
--;
970 PARSE_MULTIBYTE_SEQ (p
, pend
- p
, bytes
);
971 if (bytes
== pend
- p
)
972 best_above_byte
-= bytes
;
973 else if (bytes
> pend
- p
)
974 best_above_byte
-= (pend
- p
);
980 i_byte
= best_above_byte
;
983 string_char_byte_cache_bytepos
= i_byte
;
984 string_char_byte_cache_charpos
= i
;
985 string_char_byte_cache_string
= string
;
990 /* Convert STRING to a multibyte string.
991 Single-byte characters 0240 through 0377 are converted
992 by adding nonascii_insert_offset to each. */
995 string_make_multibyte (string
)
1003 if (STRING_MULTIBYTE (string
))
1006 nbytes
= count_size_as_multibyte (SDATA (string
),
1008 /* If all the chars are ASCII, they won't need any more bytes
1009 once converted. In that case, we can return STRING itself. */
1010 if (nbytes
== SBYTES (string
))
1013 SAFE_ALLOCA (buf
, unsigned char *, nbytes
);
1014 copy_text (SDATA (string
), buf
, SBYTES (string
),
1017 ret
= make_multibyte_string (buf
, SCHARS (string
), nbytes
);
1024 /* Convert STRING to a multibyte string without changing each
1025 character codes. Thus, characters 0200 trough 0237 are converted
1026 to eight-bit-control characters, and characters 0240 through 0377
1027 are converted eight-bit-graphic characters. */
1030 string_to_multibyte (string
)
1038 if (STRING_MULTIBYTE (string
))
1041 nbytes
= parse_str_to_multibyte (SDATA (string
), SBYTES (string
));
1042 /* If all the chars are ASCII or eight-bit-graphic, they won't need
1043 any more bytes once converted. */
1044 if (nbytes
== SBYTES (string
))
1045 return make_multibyte_string (SDATA (string
), nbytes
, nbytes
);
1047 SAFE_ALLOCA (buf
, unsigned char *, nbytes
);
1048 bcopy (SDATA (string
), buf
, SBYTES (string
));
1049 str_to_multibyte (buf
, nbytes
, SBYTES (string
));
1051 ret
= make_multibyte_string (buf
, SCHARS (string
), nbytes
);
1058 /* Convert STRING to a single-byte string. */
1061 string_make_unibyte (string
)
1069 if (! STRING_MULTIBYTE (string
))
1072 nchars
= SCHARS (string
);
1074 SAFE_ALLOCA (buf
, unsigned char *, nchars
);
1075 copy_text (SDATA (string
), buf
, SBYTES (string
),
1078 ret
= make_unibyte_string (buf
, nchars
);
1084 DEFUN ("string-make-multibyte", Fstring_make_multibyte
, Sstring_make_multibyte
,
1086 doc
: /* Return the multibyte equivalent of STRING.
1087 If STRING is unibyte and contains non-ASCII characters, the function
1088 `unibyte-char-to-multibyte' is used to convert each unibyte character
1089 to a multibyte character. In this case, the returned string is a
1090 newly created string with no text properties. If STRING is multibyte
1091 or entirely ASCII, it is returned unchanged. In particular, when
1092 STRING is unibyte and entirely ASCII, the returned string is unibyte.
1093 \(When the characters are all ASCII, Emacs primitives will treat the
1094 string the same way whether it is unibyte or multibyte.) */)
1098 CHECK_STRING (string
);
1100 return string_make_multibyte (string
);
1103 DEFUN ("string-make-unibyte", Fstring_make_unibyte
, Sstring_make_unibyte
,
1105 doc
: /* Return the unibyte equivalent of STRING.
1106 Multibyte character codes are converted to unibyte according to
1107 `nonascii-translation-table' or, if that is nil, `nonascii-insert-offset'.
1108 If the lookup in the translation table fails, this function takes just
1109 the low 8 bits of each character. */)
1113 CHECK_STRING (string
);
1115 return string_make_unibyte (string
);
1118 DEFUN ("string-as-unibyte", Fstring_as_unibyte
, Sstring_as_unibyte
,
1120 doc
: /* Return a unibyte string with the same individual bytes as STRING.
1121 If STRING is unibyte, the result is STRING itself.
1122 Otherwise it is a newly created string, with no text properties.
1123 If STRING is multibyte and contains a character of charset
1124 `eight-bit-control' or `eight-bit-graphic', it is converted to the
1125 corresponding single byte. */)
1129 CHECK_STRING (string
);
1131 if (STRING_MULTIBYTE (string
))
1133 int bytes
= SBYTES (string
);
1134 unsigned char *str
= (unsigned char *) xmalloc (bytes
);
1136 bcopy (SDATA (string
), str
, bytes
);
1137 bytes
= str_as_unibyte (str
, bytes
);
1138 string
= make_unibyte_string (str
, bytes
);
1144 DEFUN ("string-as-multibyte", Fstring_as_multibyte
, Sstring_as_multibyte
,
1146 doc
: /* Return a multibyte string with the same individual bytes as STRING.
1147 If STRING is multibyte, the result is STRING itself.
1148 Otherwise it is a newly created string, with no text properties.
1149 If STRING is unibyte and contains an individual 8-bit byte (i.e. not
1150 part of a multibyte form), it is converted to the corresponding
1151 multibyte character of charset `eight-bit-control' or `eight-bit-graphic'.
1152 Beware, this often doesn't really do what you think it does.
1153 It is similar to (decode-coding-string STRING 'emacs-mule-unix).
1154 If you're not sure, whether to use `string-as-multibyte' or
1155 `string-to-multibyte', use `string-to-multibyte'. Beware:
1156 (aref (string-as-multibyte "\201") 0) -> 129 (aka ?\201)
1157 (aref (string-as-multibyte "\300") 0) -> 192 (aka ?\300)
1158 (aref (string-as-multibyte "\300\201") 0) -> 192 (aka ?\300)
1159 (aref (string-as-multibyte "\300\201") 1) -> 129 (aka ?\201)
1161 (aref (string-as-multibyte "\201\300") 0) -> 2240
1162 (aref (string-as-multibyte "\201\300") 1) -> <error> */)
1166 CHECK_STRING (string
);
1168 if (! STRING_MULTIBYTE (string
))
1170 Lisp_Object new_string
;
1173 parse_str_as_multibyte (SDATA (string
),
1176 new_string
= make_uninit_multibyte_string (nchars
, nbytes
);
1177 bcopy (SDATA (string
), SDATA (new_string
),
1179 if (nbytes
!= SBYTES (string
))
1180 str_as_multibyte (SDATA (new_string
), nbytes
,
1181 SBYTES (string
), NULL
);
1182 string
= new_string
;
1183 STRING_SET_INTERVALS (string
, NULL_INTERVAL
);
1188 DEFUN ("string-to-multibyte", Fstring_to_multibyte
, Sstring_to_multibyte
,
1190 doc
: /* Return a multibyte string with the same individual chars as STRING.
1191 If STRING is multibyte, the result is STRING itself.
1192 Otherwise it is a newly created string, with no text properties.
1193 Characters 0200 through 0237 are converted to eight-bit-control
1194 characters of the same character code. Characters 0240 through 0377
1195 are converted to eight-bit-graphic characters of the same character
1197 This is similar to (decode-coding-string STRING 'binary) */)
1201 CHECK_STRING (string
);
1203 return string_to_multibyte (string
);
1207 DEFUN ("copy-alist", Fcopy_alist
, Scopy_alist
, 1, 1, 0,
1208 doc
: /* Return a copy of ALIST.
1209 This is an alist which represents the same mapping from objects to objects,
1210 but does not share the alist structure with ALIST.
1211 The objects mapped (cars and cdrs of elements of the alist)
1212 are shared, however.
1213 Elements of ALIST that are not conses are also shared. */)
1217 register Lisp_Object tem
;
1222 alist
= concat (1, &alist
, Lisp_Cons
, 0);
1223 for (tem
= alist
; CONSP (tem
); tem
= XCDR (tem
))
1225 register Lisp_Object car
;
1229 XSETCAR (tem
, Fcons (XCAR (car
), XCDR (car
)));
1234 DEFUN ("substring", Fsubstring
, Ssubstring
, 2, 3, 0,
1235 doc
: /* Return a substring of STRING, starting at index FROM and ending before TO.
1236 TO may be nil or omitted; then the substring runs to the end of STRING.
1237 FROM and TO start at 0. If either is negative, it counts from the end.
1239 This function allows vectors as well as strings. */)
1242 register Lisp_Object from
, to
;
1247 int from_char
, to_char
;
1248 int from_byte
= 0, to_byte
= 0;
1250 if (! (STRINGP (string
) || VECTORP (string
)))
1251 wrong_type_argument (Qarrayp
, string
);
1253 CHECK_NUMBER (from
);
1255 if (STRINGP (string
))
1257 size
= SCHARS (string
);
1258 size_byte
= SBYTES (string
);
1261 size
= XVECTOR (string
)->size
;
1266 to_byte
= size_byte
;
1272 to_char
= XINT (to
);
1276 if (STRINGP (string
))
1277 to_byte
= string_char_to_byte (string
, to_char
);
1280 from_char
= XINT (from
);
1283 if (STRINGP (string
))
1284 from_byte
= string_char_to_byte (string
, from_char
);
1286 if (!(0 <= from_char
&& from_char
<= to_char
&& to_char
<= size
))
1287 args_out_of_range_3 (string
, make_number (from_char
),
1288 make_number (to_char
));
1290 if (STRINGP (string
))
1292 res
= make_specified_string (SDATA (string
) + from_byte
,
1293 to_char
- from_char
, to_byte
- from_byte
,
1294 STRING_MULTIBYTE (string
));
1295 copy_text_properties (make_number (from_char
), make_number (to_char
),
1296 string
, make_number (0), res
, Qnil
);
1299 res
= Fvector (to_char
- from_char
,
1300 XVECTOR (string
)->contents
+ from_char
);
1306 DEFUN ("substring-no-properties", Fsubstring_no_properties
, Ssubstring_no_properties
, 1, 3, 0,
1307 doc
: /* Return a substring of STRING, without text properties.
1308 It starts at index FROM and ending before TO.
1309 TO may be nil or omitted; then the substring runs to the end of STRING.
1310 If FROM is nil or omitted, the substring starts at the beginning of STRING.
1311 If FROM or TO is negative, it counts from the end.
1313 With one argument, just copy STRING without its properties. */)
1316 register Lisp_Object from
, to
;
1318 int size
, size_byte
;
1319 int from_char
, to_char
;
1320 int from_byte
, to_byte
;
1322 CHECK_STRING (string
);
1324 size
= SCHARS (string
);
1325 size_byte
= SBYTES (string
);
1328 from_char
= from_byte
= 0;
1331 CHECK_NUMBER (from
);
1332 from_char
= XINT (from
);
1336 from_byte
= string_char_to_byte (string
, from_char
);
1342 to_byte
= size_byte
;
1348 to_char
= XINT (to
);
1352 to_byte
= string_char_to_byte (string
, to_char
);
1355 if (!(0 <= from_char
&& from_char
<= to_char
&& to_char
<= size
))
1356 args_out_of_range_3 (string
, make_number (from_char
),
1357 make_number (to_char
));
1359 return make_specified_string (SDATA (string
) + from_byte
,
1360 to_char
- from_char
, to_byte
- from_byte
,
1361 STRING_MULTIBYTE (string
));
1364 /* Extract a substring of STRING, giving start and end positions
1365 both in characters and in bytes. */
1368 substring_both (string
, from
, from_byte
, to
, to_byte
)
1370 int from
, from_byte
, to
, to_byte
;
1376 if (! (STRINGP (string
) || VECTORP (string
)))
1377 wrong_type_argument (Qarrayp
, string
);
1379 if (STRINGP (string
))
1381 size
= SCHARS (string
);
1382 size_byte
= SBYTES (string
);
1385 size
= XVECTOR (string
)->size
;
1387 if (!(0 <= from
&& from
<= to
&& to
<= size
))
1388 args_out_of_range_3 (string
, make_number (from
), make_number (to
));
1390 if (STRINGP (string
))
1392 res
= make_specified_string (SDATA (string
) + from_byte
,
1393 to
- from
, to_byte
- from_byte
,
1394 STRING_MULTIBYTE (string
));
1395 copy_text_properties (make_number (from
), make_number (to
),
1396 string
, make_number (0), res
, Qnil
);
1399 res
= Fvector (to
- from
,
1400 XVECTOR (string
)->contents
+ from
);
1405 DEFUN ("nthcdr", Fnthcdr
, Snthcdr
, 2, 2, 0,
1406 doc
: /* Take cdr N times on LIST, returns the result. */)
1409 register Lisp_Object list
;
1411 register int i
, num
;
1414 for (i
= 0; i
< num
&& !NILP (list
); i
++)
1418 wrong_type_argument (Qlistp
, list
);
1424 DEFUN ("nth", Fnth
, Snth
, 2, 2, 0,
1425 doc
: /* Return the Nth element of LIST.
1426 N counts from zero. If LIST is not that long, nil is returned. */)
1428 Lisp_Object n
, list
;
1430 return Fcar (Fnthcdr (n
, list
));
1433 DEFUN ("elt", Felt
, Selt
, 2, 2, 0,
1434 doc
: /* Return element of SEQUENCE at index N. */)
1436 register Lisp_Object sequence
, n
;
1441 if (CONSP (sequence
) || NILP (sequence
))
1442 return Fcar (Fnthcdr (n
, sequence
));
1443 else if (STRINGP (sequence
) || VECTORP (sequence
)
1444 || BOOL_VECTOR_P (sequence
) || CHAR_TABLE_P (sequence
))
1445 return Faref (sequence
, n
);
1447 sequence
= wrong_type_argument (Qsequencep
, sequence
);
1451 DEFUN ("member", Fmember
, Smember
, 2, 2, 0,
1452 doc
: /* Return non-nil if ELT is an element of LIST. Comparison done with `equal'.
1453 The value is actually the tail of LIST whose car is ELT. */)
1455 register Lisp_Object elt
;
1458 register Lisp_Object tail
;
1459 for (tail
= list
; !NILP (tail
); tail
= XCDR (tail
))
1461 register Lisp_Object tem
;
1463 wrong_type_argument (Qlistp
, list
);
1465 if (! NILP (Fequal (elt
, tem
)))
1472 DEFUN ("memq", Fmemq
, Smemq
, 2, 2, 0,
1473 doc
: /* Return non-nil if ELT is an element of LIST.
1474 Comparison done with EQ. The value is actually the tail of LIST
1475 whose car is ELT. */)
1477 Lisp_Object elt
, list
;
1481 if (!CONSP (list
) || EQ (XCAR (list
), elt
))
1485 if (!CONSP (list
) || EQ (XCAR (list
), elt
))
1489 if (!CONSP (list
) || EQ (XCAR (list
), elt
))
1496 if (!CONSP (list
) && !NILP (list
))
1497 list
= wrong_type_argument (Qlistp
, list
);
1502 DEFUN ("assq", Fassq
, Sassq
, 2, 2, 0,
1503 doc
: /* Return non-nil if KEY is `eq' to the car of an element of LIST.
1504 The value is actually the first element of LIST whose car is KEY.
1505 Elements of LIST that are not conses are ignored. */)
1507 Lisp_Object key
, list
;
1514 || (CONSP (XCAR (list
))
1515 && EQ (XCAR (XCAR (list
)), key
)))
1520 || (CONSP (XCAR (list
))
1521 && EQ (XCAR (XCAR (list
)), key
)))
1526 || (CONSP (XCAR (list
))
1527 && EQ (XCAR (XCAR (list
)), key
)))
1535 result
= XCAR (list
);
1536 else if (NILP (list
))
1539 result
= wrong_type_argument (Qlistp
, list
);
1544 /* Like Fassq but never report an error and do not allow quits.
1545 Use only on lists known never to be circular. */
1548 assq_no_quit (key
, list
)
1549 Lisp_Object key
, list
;
1552 && (!CONSP (XCAR (list
))
1553 || !EQ (XCAR (XCAR (list
)), key
)))
1556 return CONSP (list
) ? XCAR (list
) : Qnil
;
1559 DEFUN ("assoc", Fassoc
, Sassoc
, 2, 2, 0,
1560 doc
: /* Return non-nil if KEY is `equal' to the car of an element of LIST.
1561 The value is actually the first element of LIST whose car equals KEY. */)
1563 Lisp_Object key
, list
;
1565 Lisp_Object result
, car
;
1570 || (CONSP (XCAR (list
))
1571 && (car
= XCAR (XCAR (list
)),
1572 EQ (car
, key
) || !NILP (Fequal (car
, key
)))))
1577 || (CONSP (XCAR (list
))
1578 && (car
= XCAR (XCAR (list
)),
1579 EQ (car
, key
) || !NILP (Fequal (car
, key
)))))
1584 || (CONSP (XCAR (list
))
1585 && (car
= XCAR (XCAR (list
)),
1586 EQ (car
, key
) || !NILP (Fequal (car
, key
)))))
1594 result
= XCAR (list
);
1595 else if (NILP (list
))
1598 result
= wrong_type_argument (Qlistp
, list
);
1603 DEFUN ("rassq", Frassq
, Srassq
, 2, 2, 0,
1604 doc
: /* Return non-nil if KEY is `eq' to the cdr of an element of LIST.
1605 The value is actually the first element of LIST whose cdr is KEY. */)
1607 register Lisp_Object key
;
1615 || (CONSP (XCAR (list
))
1616 && EQ (XCDR (XCAR (list
)), key
)))
1621 || (CONSP (XCAR (list
))
1622 && EQ (XCDR (XCAR (list
)), key
)))
1627 || (CONSP (XCAR (list
))
1628 && EQ (XCDR (XCAR (list
)), key
)))
1637 else if (CONSP (list
))
1638 result
= XCAR (list
);
1640 result
= wrong_type_argument (Qlistp
, list
);
1645 DEFUN ("rassoc", Frassoc
, Srassoc
, 2, 2, 0,
1646 doc
: /* Return non-nil if KEY is `equal' to the cdr of an element of LIST.
1647 The value is actually the first element of LIST whose cdr equals KEY. */)
1649 Lisp_Object key
, list
;
1651 Lisp_Object result
, cdr
;
1656 || (CONSP (XCAR (list
))
1657 && (cdr
= XCDR (XCAR (list
)),
1658 EQ (cdr
, key
) || !NILP (Fequal (cdr
, key
)))))
1663 || (CONSP (XCAR (list
))
1664 && (cdr
= XCDR (XCAR (list
)),
1665 EQ (cdr
, key
) || !NILP (Fequal (cdr
, key
)))))
1670 || (CONSP (XCAR (list
))
1671 && (cdr
= XCDR (XCAR (list
)),
1672 EQ (cdr
, key
) || !NILP (Fequal (cdr
, key
)))))
1680 result
= XCAR (list
);
1681 else if (NILP (list
))
1684 result
= wrong_type_argument (Qlistp
, list
);
1689 DEFUN ("delq", Fdelq
, Sdelq
, 2, 2, 0,
1690 doc
: /* Delete by side effect any occurrences of ELT as a member of LIST.
1691 The modified LIST is returned. Comparison is done with `eq'.
1692 If the first member of LIST is ELT, there is no way to remove it by side effect;
1693 therefore, write `(setq foo (delq element foo))'
1694 to be sure of changing the value of `foo'. */)
1696 register Lisp_Object elt
;
1699 register Lisp_Object tail
, prev
;
1700 register Lisp_Object tem
;
1704 while (!NILP (tail
))
1707 wrong_type_argument (Qlistp
, list
);
1714 Fsetcdr (prev
, XCDR (tail
));
1724 DEFUN ("delete", Fdelete
, Sdelete
, 2, 2, 0,
1725 doc
: /* Delete by side effect any occurrences of ELT as a member of SEQ.
1726 SEQ must be a list, a vector, or a string.
1727 The modified SEQ is returned. Comparison is done with `equal'.
1728 If SEQ is not a list, or the first member of SEQ is ELT, deleting it
1729 is not a side effect; it is simply using a different sequence.
1730 Therefore, write `(setq foo (delete element foo))'
1731 to be sure of changing the value of `foo'. */)
1733 Lisp_Object elt
, seq
;
1739 for (i
= n
= 0; i
< ASIZE (seq
); ++i
)
1740 if (NILP (Fequal (AREF (seq
, i
), elt
)))
1743 if (n
!= ASIZE (seq
))
1745 struct Lisp_Vector
*p
= allocate_vector (n
);
1747 for (i
= n
= 0; i
< ASIZE (seq
); ++i
)
1748 if (NILP (Fequal (AREF (seq
, i
), elt
)))
1749 p
->contents
[n
++] = AREF (seq
, i
);
1751 XSETVECTOR (seq
, p
);
1754 else if (STRINGP (seq
))
1756 EMACS_INT i
, ibyte
, nchars
, nbytes
, cbytes
;
1759 for (i
= nchars
= nbytes
= ibyte
= 0;
1761 ++i
, ibyte
+= cbytes
)
1763 if (STRING_MULTIBYTE (seq
))
1765 c
= STRING_CHAR (SDATA (seq
) + ibyte
,
1766 SBYTES (seq
) - ibyte
);
1767 cbytes
= CHAR_BYTES (c
);
1775 if (!INTEGERP (elt
) || c
!= XINT (elt
))
1782 if (nchars
!= SCHARS (seq
))
1786 tem
= make_uninit_multibyte_string (nchars
, nbytes
);
1787 if (!STRING_MULTIBYTE (seq
))
1788 STRING_SET_UNIBYTE (tem
);
1790 for (i
= nchars
= nbytes
= ibyte
= 0;
1792 ++i
, ibyte
+= cbytes
)
1794 if (STRING_MULTIBYTE (seq
))
1796 c
= STRING_CHAR (SDATA (seq
) + ibyte
,
1797 SBYTES (seq
) - ibyte
);
1798 cbytes
= CHAR_BYTES (c
);
1806 if (!INTEGERP (elt
) || c
!= XINT (elt
))
1808 unsigned char *from
= SDATA (seq
) + ibyte
;
1809 unsigned char *to
= SDATA (tem
) + nbytes
;
1815 for (n
= cbytes
; n
--; )
1825 Lisp_Object tail
, prev
;
1827 for (tail
= seq
, prev
= Qnil
; !NILP (tail
); tail
= XCDR (tail
))
1830 wrong_type_argument (Qlistp
, seq
);
1832 if (!NILP (Fequal (elt
, XCAR (tail
))))
1837 Fsetcdr (prev
, XCDR (tail
));
1848 DEFUN ("nreverse", Fnreverse
, Snreverse
, 1, 1, 0,
1849 doc
: /* Reverse LIST by modifying cdr pointers.
1850 Return the reversed list. */)
1854 register Lisp_Object prev
, tail
, next
;
1856 if (NILP (list
)) return list
;
1859 while (!NILP (tail
))
1863 wrong_type_argument (Qlistp
, list
);
1865 Fsetcdr (tail
, prev
);
1872 DEFUN ("reverse", Freverse
, Sreverse
, 1, 1, 0,
1873 doc
: /* Reverse LIST, copying. Return the reversed list.
1874 See also the function `nreverse', which is used more often. */)
1880 for (new = Qnil
; CONSP (list
); list
= XCDR (list
))
1883 new = Fcons (XCAR (list
), new);
1886 wrong_type_argument (Qconsp
, list
);
1890 Lisp_Object
merge ();
1892 DEFUN ("sort", Fsort
, Ssort
, 2, 2, 0,
1893 doc
: /* Sort LIST, stably, comparing elements using PREDICATE.
1894 Returns the sorted list. LIST is modified by side effects.
1895 PREDICATE is called with two elements of LIST, and should return t
1896 if the first element is "less" than the second. */)
1898 Lisp_Object list
, predicate
;
1900 Lisp_Object front
, back
;
1901 register Lisp_Object len
, tem
;
1902 struct gcpro gcpro1
, gcpro2
;
1903 register int length
;
1906 len
= Flength (list
);
1907 length
= XINT (len
);
1911 XSETINT (len
, (length
/ 2) - 1);
1912 tem
= Fnthcdr (len
, list
);
1914 Fsetcdr (tem
, Qnil
);
1916 GCPRO2 (front
, back
);
1917 front
= Fsort (front
, predicate
);
1918 back
= Fsort (back
, predicate
);
1920 return merge (front
, back
, predicate
);
1924 merge (org_l1
, org_l2
, pred
)
1925 Lisp_Object org_l1
, org_l2
;
1929 register Lisp_Object tail
;
1931 register Lisp_Object l1
, l2
;
1932 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
;
1939 /* It is sufficient to protect org_l1 and org_l2.
1940 When l1 and l2 are updated, we copy the new values
1941 back into the org_ vars. */
1942 GCPRO4 (org_l1
, org_l2
, pred
, value
);
1962 tem
= call2 (pred
, Fcar (l2
), Fcar (l1
));
1978 Fsetcdr (tail
, tem
);
1984 #if 0 /* Unsafe version. */
1985 DEFUN ("plist-get", Fplist_get
, Splist_get
, 2, 2, 0,
1986 doc
: /* Extract a value from a property list.
1987 PLIST is a property list, which is a list of the form
1988 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value
1989 corresponding to the given PROP, or nil if PROP is not
1990 one of the properties on the list. */)
1998 CONSP (tail
) && CONSP (XCDR (tail
));
1999 tail
= XCDR (XCDR (tail
)))
2001 if (EQ (prop
, XCAR (tail
)))
2002 return XCAR (XCDR (tail
));
2004 /* This function can be called asynchronously
2005 (setup_coding_system). Don't QUIT in that case. */
2006 if (!interrupt_input_blocked
)
2011 wrong_type_argument (Qlistp
, prop
);
2017 /* This does not check for quits. That is safe since it must terminate. */
2019 DEFUN ("plist-get", Fplist_get
, Splist_get
, 2, 2, 0,
2020 doc
: /* Extract a value from a property list.
2021 PLIST is a property list, which is a list of the form
2022 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value
2023 corresponding to the given PROP, or nil if PROP is not one of the
2024 properties on the list. This function never signals an error. */)
2029 Lisp_Object tail
, halftail
;
2031 /* halftail is used to detect circular lists. */
2032 tail
= halftail
= plist
;
2033 while (CONSP (tail
) && CONSP (XCDR (tail
)))
2035 if (EQ (prop
, XCAR (tail
)))
2036 return XCAR (XCDR (tail
));
2038 tail
= XCDR (XCDR (tail
));
2039 halftail
= XCDR (halftail
);
2040 if (EQ (tail
, halftail
))
2047 DEFUN ("get", Fget
, Sget
, 2, 2, 0,
2048 doc
: /* Return the value of SYMBOL's PROPNAME property.
2049 This is the last value stored with `(put SYMBOL PROPNAME VALUE)'. */)
2051 Lisp_Object symbol
, propname
;
2053 CHECK_SYMBOL (symbol
);
2054 return Fplist_get (XSYMBOL (symbol
)->plist
, propname
);
2057 DEFUN ("plist-put", Fplist_put
, Splist_put
, 3, 3, 0,
2058 doc
: /* Change value in PLIST of PROP to VAL.
2059 PLIST is a property list, which is a list of the form
2060 \(PROP1 VALUE1 PROP2 VALUE2 ...). PROP is a symbol and VAL is any object.
2061 If PROP is already a property on the list, its value is set to VAL,
2062 otherwise the new PROP VAL pair is added. The new plist is returned;
2063 use `(setq x (plist-put x prop val))' to be sure to use the new value.
2064 The PLIST is modified by side effects. */)
2067 register Lisp_Object prop
;
2070 register Lisp_Object tail
, prev
;
2071 Lisp_Object newcell
;
2073 for (tail
= plist
; CONSP (tail
) && CONSP (XCDR (tail
));
2074 tail
= XCDR (XCDR (tail
)))
2076 if (EQ (prop
, XCAR (tail
)))
2078 Fsetcar (XCDR (tail
), val
);
2085 newcell
= Fcons (prop
, Fcons (val
, Qnil
));
2089 Fsetcdr (XCDR (prev
), newcell
);
2093 DEFUN ("put", Fput
, Sput
, 3, 3, 0,
2094 doc
: /* Store SYMBOL's PROPNAME property with value VALUE.
2095 It can be retrieved with `(get SYMBOL PROPNAME)'. */)
2096 (symbol
, propname
, value
)
2097 Lisp_Object symbol
, propname
, value
;
2099 CHECK_SYMBOL (symbol
);
2100 XSYMBOL (symbol
)->plist
2101 = Fplist_put (XSYMBOL (symbol
)->plist
, propname
, value
);
2105 DEFUN ("lax-plist-get", Flax_plist_get
, Slax_plist_get
, 2, 2, 0,
2106 doc
: /* Extract a value from a property list, comparing with `equal'.
2107 PLIST is a property list, which is a list of the form
2108 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value
2109 corresponding to the given PROP, or nil if PROP is not
2110 one of the properties on the list. */)
2118 CONSP (tail
) && CONSP (XCDR (tail
));
2119 tail
= XCDR (XCDR (tail
)))
2121 if (! NILP (Fequal (prop
, XCAR (tail
))))
2122 return XCAR (XCDR (tail
));
2128 wrong_type_argument (Qlistp
, prop
);
2133 DEFUN ("lax-plist-put", Flax_plist_put
, Slax_plist_put
, 3, 3, 0,
2134 doc
: /* Change value in PLIST of PROP to VAL, comparing with `equal'.
2135 PLIST is a property list, which is a list of the form
2136 \(PROP1 VALUE1 PROP2 VALUE2 ...). PROP and VAL are any objects.
2137 If PROP is already a property on the list, its value is set to VAL,
2138 otherwise the new PROP VAL pair is added. The new plist is returned;
2139 use `(setq x (lax-plist-put x prop val))' to be sure to use the new value.
2140 The PLIST is modified by side effects. */)
2143 register Lisp_Object prop
;
2146 register Lisp_Object tail
, prev
;
2147 Lisp_Object newcell
;
2149 for (tail
= plist
; CONSP (tail
) && CONSP (XCDR (tail
));
2150 tail
= XCDR (XCDR (tail
)))
2152 if (! NILP (Fequal (prop
, XCAR (tail
))))
2154 Fsetcar (XCDR (tail
), val
);
2161 newcell
= Fcons (prop
, Fcons (val
, Qnil
));
2165 Fsetcdr (XCDR (prev
), newcell
);
2169 DEFUN ("eql", Feql
, Seql
, 2, 2, 0,
2170 doc
: /* Return t if the two args are the same Lisp object.
2171 Floating-point numbers of equal value are `eql', but they may not be `eq'. */)
2173 Lisp_Object obj1
, obj2
;
2176 return internal_equal (obj1
, obj2
, 0, 0) ? Qt
: Qnil
;
2178 return EQ (obj1
, obj2
) ? Qt
: Qnil
;
2181 DEFUN ("equal", Fequal
, Sequal
, 2, 2, 0,
2182 doc
: /* Return t if two Lisp objects have similar structure and contents.
2183 They must have the same data type.
2184 Conses are compared by comparing the cars and the cdrs.
2185 Vectors and strings are compared element by element.
2186 Numbers are compared by value, but integers cannot equal floats.
2187 (Use `=' if you want integers and floats to be able to be equal.)
2188 Symbols must match exactly. */)
2190 register Lisp_Object o1
, o2
;
2192 return internal_equal (o1
, o2
, 0, 0) ? Qt
: Qnil
;
2195 DEFUN ("equal-including-properties", Fequal_including_properties
, Sequal_including_properties
, 2, 2, 0,
2196 doc
: /* Return t if two Lisp objects have similar structure and contents.
2197 This is like `equal' except that it compares the text properties
2198 of strings. (`equal' ignores text properties.) */)
2200 register Lisp_Object o1
, o2
;
2202 return internal_equal (o1
, o2
, 0, 1) ? Qt
: Qnil
;
2205 /* DEPTH is current depth of recursion. Signal an error if it
2207 PROPS, if non-nil, means compare string text properties too. */
2210 internal_equal (o1
, o2
, depth
, props
)
2211 register Lisp_Object o1
, o2
;
2215 error ("Stack overflow in equal");
2221 if (XTYPE (o1
) != XTYPE (o2
))
2230 d1
= extract_float (o1
);
2231 d2
= extract_float (o2
);
2232 /* If d is a NaN, then d != d. Two NaNs should be `equal' even
2233 though they are not =. */
2234 return d1
== d2
|| (d1
!= d1
&& d2
!= d2
);
2238 if (!internal_equal (XCAR (o1
), XCAR (o2
), depth
+ 1, props
))
2245 if (XMISCTYPE (o1
) != XMISCTYPE (o2
))
2249 if (!internal_equal (OVERLAY_START (o1
), OVERLAY_START (o2
),
2251 || !internal_equal (OVERLAY_END (o1
), OVERLAY_END (o2
),
2254 o1
= XOVERLAY (o1
)->plist
;
2255 o2
= XOVERLAY (o2
)->plist
;
2260 return (XMARKER (o1
)->buffer
== XMARKER (o2
)->buffer
2261 && (XMARKER (o1
)->buffer
== 0
2262 || XMARKER (o1
)->bytepos
== XMARKER (o2
)->bytepos
));
2266 case Lisp_Vectorlike
:
2269 EMACS_INT size
= XVECTOR (o1
)->size
;
2270 /* Pseudovectors have the type encoded in the size field, so this test
2271 actually checks that the objects have the same type as well as the
2273 if (XVECTOR (o2
)->size
!= size
)
2275 /* Boolvectors are compared much like strings. */
2276 if (BOOL_VECTOR_P (o1
))
2279 = ((XBOOL_VECTOR (o1
)->size
+ BOOL_VECTOR_BITS_PER_CHAR
- 1)
2280 / BOOL_VECTOR_BITS_PER_CHAR
);
2282 if (XBOOL_VECTOR (o1
)->size
!= XBOOL_VECTOR (o2
)->size
)
2284 if (bcmp (XBOOL_VECTOR (o1
)->data
, XBOOL_VECTOR (o2
)->data
,
2289 if (WINDOW_CONFIGURATIONP (o1
))
2290 return compare_window_configurations (o1
, o2
, 0);
2292 /* Aside from them, only true vectors, char-tables, and compiled
2293 functions are sensible to compare, so eliminate the others now. */
2294 if (size
& PSEUDOVECTOR_FLAG
)
2296 if (!(size
& (PVEC_COMPILED
| PVEC_CHAR_TABLE
)))
2298 size
&= PSEUDOVECTOR_SIZE_MASK
;
2300 for (i
= 0; i
< size
; i
++)
2303 v1
= XVECTOR (o1
)->contents
[i
];
2304 v2
= XVECTOR (o2
)->contents
[i
];
2305 if (!internal_equal (v1
, v2
, depth
+ 1, props
))
2313 if (SCHARS (o1
) != SCHARS (o2
))
2315 if (SBYTES (o1
) != SBYTES (o2
))
2317 if (bcmp (SDATA (o1
), SDATA (o2
),
2320 if (props
&& !compare_string_intervals (o1
, o2
))
2326 case Lisp_Type_Limit
:
2333 extern Lisp_Object
Fmake_char_internal ();
2335 DEFUN ("fillarray", Ffillarray
, Sfillarray
, 2, 2, 0,
2336 doc
: /* Store each element of ARRAY with ITEM.
2337 ARRAY is a vector, string, char-table, or bool-vector. */)
2339 Lisp_Object array
, item
;
2341 register int size
, index
, charval
;
2343 if (VECTORP (array
))
2345 register Lisp_Object
*p
= XVECTOR (array
)->contents
;
2346 size
= XVECTOR (array
)->size
;
2347 for (index
= 0; index
< size
; index
++)
2350 else if (CHAR_TABLE_P (array
))
2352 register Lisp_Object
*p
= XCHAR_TABLE (array
)->contents
;
2353 size
= CHAR_TABLE_ORDINARY_SLOTS
;
2354 for (index
= 0; index
< size
; index
++)
2356 XCHAR_TABLE (array
)->defalt
= Qnil
;
2358 else if (STRINGP (array
))
2360 register unsigned char *p
= SDATA (array
);
2361 CHECK_NUMBER (item
);
2362 charval
= XINT (item
);
2363 size
= SCHARS (array
);
2364 if (STRING_MULTIBYTE (array
))
2366 unsigned char str
[MAX_MULTIBYTE_LENGTH
];
2367 int len
= CHAR_STRING (charval
, str
);
2368 int size_byte
= SBYTES (array
);
2369 unsigned char *p1
= p
, *endp
= p
+ size_byte
;
2372 if (size
!= size_byte
)
2375 int this_len
= MULTIBYTE_FORM_LENGTH (p1
, endp
- p1
);
2376 if (len
!= this_len
)
2377 error ("Attempt to change byte length of a string");
2380 for (i
= 0; i
< size_byte
; i
++)
2381 *p
++ = str
[i
% len
];
2384 for (index
= 0; index
< size
; index
++)
2387 else if (BOOL_VECTOR_P (array
))
2389 register unsigned char *p
= XBOOL_VECTOR (array
)->data
;
2391 = ((XBOOL_VECTOR (array
)->size
+ BOOL_VECTOR_BITS_PER_CHAR
- 1)
2392 / BOOL_VECTOR_BITS_PER_CHAR
);
2394 charval
= (! NILP (item
) ? -1 : 0);
2395 for (index
= 0; index
< size_in_chars
- 1; index
++)
2397 if (index
< size_in_chars
)
2399 /* Mask out bits beyond the vector size. */
2400 if (XBOOL_VECTOR (array
)->size
% BOOL_VECTOR_BITS_PER_CHAR
)
2401 charval
&= (1 << (XBOOL_VECTOR (array
)->size
% BOOL_VECTOR_BITS_PER_CHAR
)) - 1;
2407 array
= wrong_type_argument (Qarrayp
, array
);
2413 DEFUN ("clear-string", Fclear_string
, Sclear_string
,
2415 doc
: /* Clear the contents of STRING.
2416 This makes STRING unibyte and may change its length. */)
2421 CHECK_STRING (string
);
2422 len
= SBYTES (string
);
2423 bzero (SDATA (string
), len
);
2424 STRING_SET_CHARS (string
, len
);
2425 STRING_SET_UNIBYTE (string
);
2429 DEFUN ("char-table-subtype", Fchar_table_subtype
, Schar_table_subtype
,
2431 doc
: /* Return the subtype of char-table CHAR-TABLE. The value is a symbol. */)
2433 Lisp_Object char_table
;
2435 CHECK_CHAR_TABLE (char_table
);
2437 return XCHAR_TABLE (char_table
)->purpose
;
2440 DEFUN ("char-table-parent", Fchar_table_parent
, Schar_table_parent
,
2442 doc
: /* Return the parent char-table of CHAR-TABLE.
2443 The value is either nil or another char-table.
2444 If CHAR-TABLE holds nil for a given character,
2445 then the actual applicable value is inherited from the parent char-table
2446 \(or from its parents, if necessary). */)
2448 Lisp_Object char_table
;
2450 CHECK_CHAR_TABLE (char_table
);
2452 return XCHAR_TABLE (char_table
)->parent
;
2455 DEFUN ("set-char-table-parent", Fset_char_table_parent
, Sset_char_table_parent
,
2457 doc
: /* Set the parent char-table of CHAR-TABLE to PARENT.
2458 Return PARENT. PARENT must be either nil or another char-table. */)
2459 (char_table
, parent
)
2460 Lisp_Object char_table
, parent
;
2464 CHECK_CHAR_TABLE (char_table
);
2468 CHECK_CHAR_TABLE (parent
);
2470 for (temp
= parent
; !NILP (temp
); temp
= XCHAR_TABLE (temp
)->parent
)
2471 if (EQ (temp
, char_table
))
2472 error ("Attempt to make a chartable be its own parent");
2475 XCHAR_TABLE (char_table
)->parent
= parent
;
2480 DEFUN ("char-table-extra-slot", Fchar_table_extra_slot
, Schar_table_extra_slot
,
2482 doc
: /* Return the value of CHAR-TABLE's extra-slot number N. */)
2484 Lisp_Object char_table
, n
;
2486 CHECK_CHAR_TABLE (char_table
);
2489 || XINT (n
) >= CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (char_table
)))
2490 args_out_of_range (char_table
, n
);
2492 return XCHAR_TABLE (char_table
)->extras
[XINT (n
)];
2495 DEFUN ("set-char-table-extra-slot", Fset_char_table_extra_slot
,
2496 Sset_char_table_extra_slot
,
2498 doc
: /* Set CHAR-TABLE's extra-slot number N to VALUE. */)
2499 (char_table
, n
, value
)
2500 Lisp_Object char_table
, n
, value
;
2502 CHECK_CHAR_TABLE (char_table
);
2505 || XINT (n
) >= CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (char_table
)))
2506 args_out_of_range (char_table
, n
);
2508 return XCHAR_TABLE (char_table
)->extras
[XINT (n
)] = value
;
2512 char_table_range (table
, from
, to
, defalt
)
2519 if (! NILP (XCHAR_TABLE (table
)->defalt
))
2520 defalt
= XCHAR_TABLE (table
)->defalt
;
2521 val
= XCHAR_TABLE (table
)->contents
[from
];
2522 if (SUB_CHAR_TABLE_P (val
))
2523 val
= char_table_range (val
, 32, 127, defalt
);
2524 else if (NILP (val
))
2526 for (from
++; from
<= to
; from
++)
2528 Lisp_Object this_val
;
2530 this_val
= XCHAR_TABLE (table
)->contents
[from
];
2531 if (SUB_CHAR_TABLE_P (this_val
))
2532 this_val
= char_table_range (this_val
, 32, 127, defalt
);
2533 else if (NILP (this_val
))
2535 if (! EQ (val
, this_val
))
2536 error ("Characters in the range have inconsistent values");
2542 DEFUN ("char-table-range", Fchar_table_range
, Schar_table_range
,
2544 doc
: /* Return the value in CHAR-TABLE for a range of characters RANGE.
2545 RANGE should be nil (for the default value),
2546 a vector which identifies a character set or a row of a character set,
2547 a character set name, or a character code.
2548 If the characters in the specified range have different values,
2549 an error is signalled.
2551 Note that this function doesn't check the parent of CHAR-TABLE. */)
2553 Lisp_Object char_table
, range
;
2555 int charset_id
, c1
= 0, c2
= 0;
2557 Lisp_Object ch
, val
, current_default
;
2559 CHECK_CHAR_TABLE (char_table
);
2561 if (EQ (range
, Qnil
))
2562 return XCHAR_TABLE (char_table
)->defalt
;
2563 if (INTEGERP (range
))
2565 int c
= XINT (range
);
2566 if (! CHAR_VALID_P (c
, 0))
2567 error ("Invalid character code: %d", c
);
2569 SPLIT_CHAR (c
, charset_id
, c1
, c2
);
2571 else if (SYMBOLP (range
))
2573 Lisp_Object charset_info
;
2575 charset_info
= Fget (range
, Qcharset
);
2576 CHECK_VECTOR (charset_info
);
2577 charset_id
= XINT (XVECTOR (charset_info
)->contents
[0]);
2578 ch
= Fmake_char_internal (make_number (charset_id
),
2579 make_number (0), make_number (0));
2581 else if (VECTORP (range
))
2583 size
= ASIZE (range
);
2585 args_out_of_range (range
, make_number (0));
2586 CHECK_NUMBER (AREF (range
, 0));
2587 charset_id
= XINT (AREF (range
, 0));
2590 CHECK_NUMBER (AREF (range
, 1));
2591 c1
= XINT (AREF (range
, 1));
2594 CHECK_NUMBER (AREF (range
, 2));
2595 c2
= XINT (AREF (range
, 2));
2599 /* This checks if charset_id, c0, and c1 are all valid or not. */
2600 ch
= Fmake_char_internal (make_number (charset_id
),
2601 make_number (c1
), make_number (c2
));
2604 error ("Invalid RANGE argument to `char-table-range'");
2606 if (c1
> 0 && (CHARSET_DIMENSION (charset_id
) == 1 || c2
> 0))
2608 /* Fully specified character. */
2609 Lisp_Object parent
= XCHAR_TABLE (char_table
)->parent
;
2611 XCHAR_TABLE (char_table
)->parent
= Qnil
;
2612 val
= Faref (char_table
, ch
);
2613 XCHAR_TABLE (char_table
)->parent
= parent
;
2617 current_default
= XCHAR_TABLE (char_table
)->defalt
;
2618 if (charset_id
== CHARSET_ASCII
2619 || charset_id
== CHARSET_8_BIT_CONTROL
2620 || charset_id
== CHARSET_8_BIT_GRAPHIC
)
2622 int from
, to
, defalt
;
2624 if (charset_id
== CHARSET_ASCII
)
2625 from
= 0, to
= 127, defalt
= CHAR_TABLE_DEFAULT_SLOT_ASCII
;
2626 else if (charset_id
== CHARSET_8_BIT_CONTROL
)
2627 from
= 128, to
= 159, defalt
= CHAR_TABLE_DEFAULT_SLOT_8_BIT_CONTROL
;
2629 from
= 160, to
= 255, defalt
= CHAR_TABLE_DEFAULT_SLOT_8_BIT_GRAPHIC
;
2630 if (! NILP (XCHAR_TABLE (char_table
)->contents
[defalt
]))
2631 current_default
= XCHAR_TABLE (char_table
)->contents
[defalt
];
2632 return char_table_range (char_table
, from
, to
, current_default
);
2635 val
= XCHAR_TABLE (char_table
)->contents
[128 + charset_id
];
2636 if (! SUB_CHAR_TABLE_P (val
))
2637 return (NILP (val
) ? current_default
: val
);
2638 if (! NILP (XCHAR_TABLE (val
)->defalt
))
2639 current_default
= XCHAR_TABLE (val
)->defalt
;
2641 return char_table_range (val
, 32, 127, current_default
);
2642 val
= XCHAR_TABLE (val
)->contents
[c1
];
2643 if (! SUB_CHAR_TABLE_P (val
))
2644 return (NILP (val
) ? current_default
: val
);
2645 if (! NILP (XCHAR_TABLE (val
)->defalt
))
2646 current_default
= XCHAR_TABLE (val
)->defalt
;
2647 return char_table_range (val
, 32, 127, current_default
);
2650 DEFUN ("set-char-table-range", Fset_char_table_range
, Sset_char_table_range
,
2652 doc
: /* Set the value in CHAR-TABLE for a range of characters RANGE to VALUE.
2653 RANGE should be t (for all characters), nil (for the default value),
2654 a character set, a vector which identifies a character set, a row of a
2655 character set, or a character code. Return VALUE. */)
2656 (char_table
, range
, value
)
2657 Lisp_Object char_table
, range
, value
;
2661 CHECK_CHAR_TABLE (char_table
);
2664 for (i
= 0; i
< CHAR_TABLE_ORDINARY_SLOTS
; i
++)
2666 /* Don't set these special slots used for default values of
2667 ascii, eight-bit-control, and eight-bit-graphic. */
2668 if (i
!= CHAR_TABLE_DEFAULT_SLOT_ASCII
2669 && i
!= CHAR_TABLE_DEFAULT_SLOT_8_BIT_CONTROL
2670 && i
!= CHAR_TABLE_DEFAULT_SLOT_8_BIT_GRAPHIC
)
2671 XCHAR_TABLE (char_table
)->contents
[i
] = value
;
2673 else if (EQ (range
, Qnil
))
2674 XCHAR_TABLE (char_table
)->defalt
= value
;
2675 else if (SYMBOLP (range
))
2677 Lisp_Object charset_info
;
2680 charset_info
= Fget (range
, Qcharset
);
2681 if (! VECTORP (charset_info
)
2682 || ! NATNUMP (AREF (charset_info
, 0))
2683 || (charset_id
= XINT (AREF (charset_info
, 0)),
2684 ! CHARSET_DEFINED_P (charset_id
)))
2685 error ("Invalid charset: %s", SDATA (SYMBOL_NAME (range
)));
2687 if (charset_id
== CHARSET_ASCII
)
2688 for (i
= 0; i
< 128; i
++)
2689 XCHAR_TABLE (char_table
)->contents
[i
] = value
;
2690 else if (charset_id
== CHARSET_8_BIT_CONTROL
)
2691 for (i
= 128; i
< 160; i
++)
2692 XCHAR_TABLE (char_table
)->contents
[i
] = value
;
2693 else if (charset_id
== CHARSET_8_BIT_GRAPHIC
)
2694 for (i
= 160; i
< 256; i
++)
2695 XCHAR_TABLE (char_table
)->contents
[i
] = value
;
2697 XCHAR_TABLE (char_table
)->contents
[charset_id
+ 128] = value
;
2699 else if (INTEGERP (range
))
2700 Faset (char_table
, range
, value
);
2701 else if (VECTORP (range
))
2703 int size
= XVECTOR (range
)->size
;
2704 Lisp_Object
*val
= XVECTOR (range
)->contents
;
2705 Lisp_Object ch
= Fmake_char_internal (size
<= 0 ? Qnil
: val
[0],
2706 size
<= 1 ? Qnil
: val
[1],
2707 size
<= 2 ? Qnil
: val
[2]);
2708 Faset (char_table
, ch
, value
);
2711 error ("Invalid RANGE argument to `set-char-table-range'");
2716 DEFUN ("set-char-table-default", Fset_char_table_default
,
2717 Sset_char_table_default
, 3, 3, 0,
2718 doc
: /* Set the default value in CHAR-TABLE for generic character CH to VALUE.
2719 The generic character specifies the group of characters.
2720 If CH is a normal character, set the default value for a group of
2721 characters to which CH belongs.
2722 See also the documentation of `make-char'. */)
2723 (char_table
, ch
, value
)
2724 Lisp_Object char_table
, ch
, value
;
2726 int c
, charset
, code1
, code2
;
2729 CHECK_CHAR_TABLE (char_table
);
2733 SPLIT_CHAR (c
, charset
, code1
, code2
);
2735 /* Since we may want to set the default value for a character set
2736 not yet defined, we check only if the character set is in the
2737 valid range or not, instead of it is already defined or not. */
2738 if (! CHARSET_VALID_P (charset
))
2739 invalid_character (c
);
2741 if (SINGLE_BYTE_CHAR_P (c
))
2743 /* We use special slots for the default values of single byte
2746 = (c
< 0x80 ? CHAR_TABLE_DEFAULT_SLOT_ASCII
2747 : c
< 0xA0 ? CHAR_TABLE_DEFAULT_SLOT_8_BIT_CONTROL
2748 : CHAR_TABLE_DEFAULT_SLOT_8_BIT_GRAPHIC
);
2750 return (XCHAR_TABLE (char_table
)->contents
[default_slot
] = value
);
2753 /* Even if C is not a generic char, we had better behave as if a
2754 generic char is specified. */
2755 if (!CHARSET_DEFINED_P (charset
) || CHARSET_DIMENSION (charset
) == 1)
2757 temp
= XCHAR_TABLE (char_table
)->contents
[charset
+ 128];
2758 if (! SUB_CHAR_TABLE_P (temp
))
2760 temp
= make_sub_char_table (temp
);
2761 XCHAR_TABLE (char_table
)->contents
[charset
+ 128] = temp
;
2765 XCHAR_TABLE (temp
)->defalt
= value
;
2769 temp
= XCHAR_TABLE (char_table
)->contents
[code1
];
2770 if (SUB_CHAR_TABLE_P (temp
))
2771 XCHAR_TABLE (temp
)->defalt
= value
;
2773 XCHAR_TABLE (char_table
)->contents
[code1
] = value
;
2777 /* Look up the element in TABLE at index CH,
2778 and return it as an integer.
2779 If the element is nil, return CH itself.
2780 (Actually we do that for any non-integer.) */
2783 char_table_translate (table
, ch
)
2788 value
= Faref (table
, make_number (ch
));
2789 if (! INTEGERP (value
))
2791 return XINT (value
);
2795 optimize_sub_char_table (table
, chars
)
2803 from
= 33, to
= 127;
2805 from
= 32, to
= 128;
2807 if (!SUB_CHAR_TABLE_P (*table
))
2809 elt
= XCHAR_TABLE (*table
)->contents
[from
++];
2810 for (; from
< to
; from
++)
2811 if (NILP (Fequal (elt
, XCHAR_TABLE (*table
)->contents
[from
])))
2816 DEFUN ("optimize-char-table", Foptimize_char_table
, Soptimize_char_table
,
2817 1, 1, 0, doc
: /* Optimize char table TABLE. */)
2825 CHECK_CHAR_TABLE (table
);
2827 for (i
= CHAR_TABLE_SINGLE_BYTE_SLOTS
; i
< CHAR_TABLE_ORDINARY_SLOTS
; i
++)
2829 elt
= XCHAR_TABLE (table
)->contents
[i
];
2830 if (!SUB_CHAR_TABLE_P (elt
))
2832 dim
= CHARSET_DIMENSION (i
- 128);
2834 for (j
= 32; j
< SUB_CHAR_TABLE_ORDINARY_SLOTS
; j
++)
2835 optimize_sub_char_table (XCHAR_TABLE (elt
)->contents
+ j
, dim
);
2836 optimize_sub_char_table (XCHAR_TABLE (table
)->contents
+ i
, dim
);
2842 /* Map C_FUNCTION or FUNCTION over SUBTABLE, calling it for each
2843 character or group of characters that share a value.
2844 DEPTH is the current depth in the originally specified
2845 chartable, and INDICES contains the vector indices
2846 for the levels our callers have descended.
2848 ARG is passed to C_FUNCTION when that is called. */
2851 map_char_table (c_function
, function
, table
, subtable
, arg
, depth
, indices
)
2852 void (*c_function
) P_ ((Lisp_Object
, Lisp_Object
, Lisp_Object
));
2853 Lisp_Object function
, table
, subtable
, arg
, *indices
;
2857 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
;
2859 GCPRO4 (arg
, table
, subtable
, function
);
2863 /* At first, handle ASCII and 8-bit European characters. */
2864 for (i
= 0; i
< CHAR_TABLE_SINGLE_BYTE_SLOTS
; i
++)
2866 Lisp_Object elt
= XCHAR_TABLE (subtable
)->contents
[i
];
2868 elt
= XCHAR_TABLE (subtable
)->defalt
;
2870 elt
= Faref (subtable
, make_number (i
));
2872 (*c_function
) (arg
, make_number (i
), elt
);
2874 call2 (function
, make_number (i
), elt
);
2876 #if 0 /* If the char table has entries for higher characters,
2877 we should report them. */
2878 if (NILP (current_buffer
->enable_multibyte_characters
))
2884 to
= CHAR_TABLE_ORDINARY_SLOTS
;
2888 int charset
= XFASTINT (indices
[0]) - 128;
2891 to
= SUB_CHAR_TABLE_ORDINARY_SLOTS
;
2892 if (CHARSET_CHARS (charset
) == 94)
2901 elt
= XCHAR_TABLE (subtable
)->contents
[i
];
2902 XSETFASTINT (indices
[depth
], i
);
2903 charset
= XFASTINT (indices
[0]) - 128;
2905 && (!CHARSET_DEFINED_P (charset
)
2906 || charset
== CHARSET_8_BIT_CONTROL
2907 || charset
== CHARSET_8_BIT_GRAPHIC
))
2910 if (SUB_CHAR_TABLE_P (elt
))
2913 error ("Too deep char table");
2914 map_char_table (c_function
, function
, table
, elt
, arg
, depth
+ 1, indices
);
2920 c1
= depth
>= 1 ? XFASTINT (indices
[1]) : 0;
2921 c2
= depth
>= 2 ? XFASTINT (indices
[2]) : 0;
2922 c
= MAKE_CHAR (charset
, c1
, c2
);
2925 elt
= XCHAR_TABLE (subtable
)->defalt
;
2927 elt
= Faref (table
, make_number (c
));
2930 (*c_function
) (arg
, make_number (c
), elt
);
2932 call2 (function
, make_number (c
), elt
);
2938 static void void_call2
P_ ((Lisp_Object a
, Lisp_Object b
, Lisp_Object c
));
2940 void_call2 (a
, b
, c
)
2941 Lisp_Object a
, b
, c
;
2946 DEFUN ("map-char-table", Fmap_char_table
, Smap_char_table
,
2948 doc
: /* Call FUNCTION for each (normal and generic) characters in CHAR-TABLE.
2949 FUNCTION is called with two arguments--a key and a value.
2950 The key is always a possible IDX argument to `aref'. */)
2951 (function
, char_table
)
2952 Lisp_Object function
, char_table
;
2954 /* The depth of char table is at most 3. */
2955 Lisp_Object indices
[3];
2957 CHECK_CHAR_TABLE (char_table
);
2959 /* When Lisp_Object is represented as a union, `call2' cannot directly
2960 be passed to map_char_table because it returns a Lisp_Object rather
2961 than returning nothing.
2962 Casting leads to crashes on some architectures. -stef */
2963 map_char_table (void_call2
, Qnil
, char_table
, char_table
, function
, 0, indices
);
2967 /* Return a value for character C in char-table TABLE. Store the
2968 actual index for that value in *IDX. Ignore the default value of
2972 char_table_ref_and_index (table
, c
, idx
)
2976 int charset
, c1
, c2
;
2979 if (SINGLE_BYTE_CHAR_P (c
))
2982 return XCHAR_TABLE (table
)->contents
[c
];
2984 SPLIT_CHAR (c
, charset
, c1
, c2
);
2985 elt
= XCHAR_TABLE (table
)->contents
[charset
+ 128];
2986 *idx
= MAKE_CHAR (charset
, 0, 0);
2987 if (!SUB_CHAR_TABLE_P (elt
))
2989 if (c1
< 32 || NILP (XCHAR_TABLE (elt
)->contents
[c1
]))
2990 return XCHAR_TABLE (elt
)->defalt
;
2991 elt
= XCHAR_TABLE (elt
)->contents
[c1
];
2992 *idx
= MAKE_CHAR (charset
, c1
, 0);
2993 if (!SUB_CHAR_TABLE_P (elt
))
2995 if (c2
< 32 || NILP (XCHAR_TABLE (elt
)->contents
[c2
]))
2996 return XCHAR_TABLE (elt
)->defalt
;
2998 return XCHAR_TABLE (elt
)->contents
[c2
];
3008 Lisp_Object args
[2];
3011 return Fnconc (2, args
);
3013 return Fnconc (2, &s1
);
3014 #endif /* NO_ARG_ARRAY */
3017 DEFUN ("nconc", Fnconc
, Snconc
, 0, MANY
, 0,
3018 doc
: /* Concatenate any number of lists by altering them.
3019 Only the last argument is not altered, and need not be a list.
3020 usage: (nconc &rest LISTS) */)
3025 register int argnum
;
3026 register Lisp_Object tail
, tem
, val
;
3030 for (argnum
= 0; argnum
< nargs
; argnum
++)
3033 if (NILP (tem
)) continue;
3038 if (argnum
+ 1 == nargs
) break;
3041 tem
= wrong_type_argument (Qlistp
, tem
);
3050 tem
= args
[argnum
+ 1];
3051 Fsetcdr (tail
, tem
);
3053 args
[argnum
+ 1] = tail
;
3059 /* This is the guts of all mapping functions.
3060 Apply FN to each element of SEQ, one by one,
3061 storing the results into elements of VALS, a C vector of Lisp_Objects.
3062 LENI is the length of VALS, which should also be the length of SEQ. */
3065 mapcar1 (leni
, vals
, fn
, seq
)
3068 Lisp_Object fn
, seq
;
3070 register Lisp_Object tail
;
3073 struct gcpro gcpro1
, gcpro2
, gcpro3
;
3077 /* Don't let vals contain any garbage when GC happens. */
3078 for (i
= 0; i
< leni
; i
++)
3081 GCPRO3 (dummy
, fn
, seq
);
3083 gcpro1
.nvars
= leni
;
3087 /* We need not explicitly protect `tail' because it is used only on lists, and
3088 1) lists are not relocated and 2) the list is marked via `seq' so will not be freed */
3092 for (i
= 0; i
< leni
; i
++)
3094 dummy
= XVECTOR (seq
)->contents
[i
];
3095 dummy
= call1 (fn
, dummy
);
3100 else if (BOOL_VECTOR_P (seq
))
3102 for (i
= 0; i
< leni
; i
++)
3105 byte
= XBOOL_VECTOR (seq
)->data
[i
/ BOOL_VECTOR_BITS_PER_CHAR
];
3106 if (byte
& (1 << (i
% BOOL_VECTOR_BITS_PER_CHAR
)))
3111 dummy
= call1 (fn
, dummy
);
3116 else if (STRINGP (seq
))
3120 for (i
= 0, i_byte
= 0; i
< leni
;)
3125 FETCH_STRING_CHAR_ADVANCE (c
, seq
, i
, i_byte
);
3126 XSETFASTINT (dummy
, c
);
3127 dummy
= call1 (fn
, dummy
);
3129 vals
[i_before
] = dummy
;
3132 else /* Must be a list, since Flength did not get an error */
3135 for (i
= 0; i
< leni
; i
++)
3137 dummy
= call1 (fn
, Fcar (tail
));
3147 DEFUN ("mapconcat", Fmapconcat
, Smapconcat
, 3, 3, 0,
3148 doc
: /* Apply FUNCTION to each element of SEQUENCE, and concat the results as strings.
3149 In between each pair of results, stick in SEPARATOR. Thus, " " as
3150 SEPARATOR results in spaces between the values returned by FUNCTION.
3151 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
3152 (function
, sequence
, separator
)
3153 Lisp_Object function
, sequence
, separator
;
3158 register Lisp_Object
*args
;
3160 struct gcpro gcpro1
;
3164 len
= Flength (sequence
);
3166 nargs
= leni
+ leni
- 1;
3167 if (nargs
< 0) return build_string ("");
3169 SAFE_ALLOCA_LISP (args
, nargs
);
3172 mapcar1 (leni
, args
, function
, sequence
);
3175 for (i
= leni
- 1; i
>= 0; i
--)
3176 args
[i
+ i
] = args
[i
];
3178 for (i
= 1; i
< nargs
; i
+= 2)
3179 args
[i
] = separator
;
3181 ret
= Fconcat (nargs
, args
);
3187 DEFUN ("mapcar", Fmapcar
, Smapcar
, 2, 2, 0,
3188 doc
: /* Apply FUNCTION to each element of SEQUENCE, and make a list of the results.
3189 The result is a list just as long as SEQUENCE.
3190 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
3191 (function
, sequence
)
3192 Lisp_Object function
, sequence
;
3194 register Lisp_Object len
;
3196 register Lisp_Object
*args
;
3200 len
= Flength (sequence
);
3201 leni
= XFASTINT (len
);
3203 SAFE_ALLOCA_LISP (args
, leni
);
3205 mapcar1 (leni
, args
, function
, sequence
);
3207 ret
= Flist (leni
, args
);
3213 DEFUN ("mapc", Fmapc
, Smapc
, 2, 2, 0,
3214 doc
: /* Apply FUNCTION to each element of SEQUENCE for side effects only.
3215 Unlike `mapcar', don't accumulate the results. Return SEQUENCE.
3216 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
3217 (function
, sequence
)
3218 Lisp_Object function
, sequence
;
3222 leni
= XFASTINT (Flength (sequence
));
3223 mapcar1 (leni
, 0, function
, sequence
);
3228 /* Anything that calls this function must protect from GC! */
3230 DEFUN ("y-or-n-p", Fy_or_n_p
, Sy_or_n_p
, 1, 1, 0,
3231 doc
: /* Ask user a "y or n" question. Return t if answer is "y".
3232 Takes one argument, which is the string to display to ask the question.
3233 It should end in a space; `y-or-n-p' adds `(y or n) ' to it.
3234 No confirmation of the answer is requested; a single character is enough.
3235 Also accepts Space to mean yes, or Delete to mean no. \(Actually, it uses
3236 the bindings in `query-replace-map'; see the documentation of that variable
3237 for more information. In this case, the useful bindings are `act', `skip',
3238 `recenter', and `quit'.\)
3240 Under a windowing system a dialog box will be used if `last-nonmenu-event'
3241 is nil and `use-dialog-box' is non-nil. */)
3245 register Lisp_Object obj
, key
, def
, map
;
3246 register int answer
;
3247 Lisp_Object xprompt
;
3248 Lisp_Object args
[2];
3249 struct gcpro gcpro1
, gcpro2
;
3250 int count
= SPECPDL_INDEX ();
3252 specbind (Qcursor_in_echo_area
, Qt
);
3254 map
= Fsymbol_value (intern ("query-replace-map"));
3256 CHECK_STRING (prompt
);
3258 GCPRO2 (prompt
, xprompt
);
3260 #ifdef HAVE_X_WINDOWS
3261 if (display_hourglass_p
)
3262 cancel_hourglass ();
3269 if ((NILP (last_nonmenu_event
) || CONSP (last_nonmenu_event
))
3273 Lisp_Object pane
, menu
;
3274 redisplay_preserve_echo_area (3);
3275 pane
= Fcons (Fcons (build_string ("Yes"), Qt
),
3276 Fcons (Fcons (build_string ("No"), Qnil
),
3278 menu
= Fcons (prompt
, pane
);
3279 obj
= Fx_popup_dialog (Qt
, menu
);
3280 answer
= !NILP (obj
);
3283 #endif /* HAVE_MENUS */
3284 cursor_in_echo_area
= 1;
3285 choose_minibuf_frame ();
3288 Lisp_Object pargs
[3];
3290 /* Colorize prompt according to `minibuffer-prompt' face. */
3291 pargs
[0] = build_string ("%s(y or n) ");
3292 pargs
[1] = intern ("face");
3293 pargs
[2] = intern ("minibuffer-prompt");
3294 args
[0] = Fpropertize (3, pargs
);
3299 if (minibuffer_auto_raise
)
3301 Lisp_Object mini_frame
;
3303 mini_frame
= WINDOW_FRAME (XWINDOW (minibuf_window
));
3305 Fraise_frame (mini_frame
);
3308 obj
= read_filtered_event (1, 0, 0, 0);
3309 cursor_in_echo_area
= 0;
3310 /* If we need to quit, quit with cursor_in_echo_area = 0. */
3313 key
= Fmake_vector (make_number (1), obj
);
3314 def
= Flookup_key (map
, key
, Qt
);
3316 if (EQ (def
, intern ("skip")))
3321 else if (EQ (def
, intern ("act")))
3326 else if (EQ (def
, intern ("recenter")))
3332 else if (EQ (def
, intern ("quit")))
3334 /* We want to exit this command for exit-prefix,
3335 and this is the only way to do it. */
3336 else if (EQ (def
, intern ("exit-prefix")))
3341 /* If we don't clear this, then the next call to read_char will
3342 return quit_char again, and we'll enter an infinite loop. */
3347 if (EQ (xprompt
, prompt
))
3349 args
[0] = build_string ("Please answer y or n. ");
3351 xprompt
= Fconcat (2, args
);
3356 if (! noninteractive
)
3358 cursor_in_echo_area
= -1;
3359 message_with_string (answer
? "%s(y or n) y" : "%s(y or n) n",
3363 unbind_to (count
, Qnil
);
3364 return answer
? Qt
: Qnil
;
3367 /* This is how C code calls `yes-or-no-p' and allows the user
3370 Anything that calls this function must protect from GC! */
3373 do_yes_or_no_p (prompt
)
3376 return call1 (intern ("yes-or-no-p"), prompt
);
3379 /* Anything that calls this function must protect from GC! */
3381 DEFUN ("yes-or-no-p", Fyes_or_no_p
, Syes_or_no_p
, 1, 1, 0,
3382 doc
: /* Ask user a yes-or-no question. Return t if answer is yes.
3383 Takes one argument, which is the string to display to ask the question.
3384 It should end in a space; `yes-or-no-p' adds `(yes or no) ' to it.
3385 The user must confirm the answer with RET,
3386 and can edit it until it has been confirmed.
3388 Under a windowing system a dialog box will be used if `last-nonmenu-event'
3389 is nil, and `use-dialog-box' is non-nil. */)
3393 register Lisp_Object ans
;
3394 Lisp_Object args
[2];
3395 struct gcpro gcpro1
;
3397 CHECK_STRING (prompt
);
3400 if ((NILP (last_nonmenu_event
) || CONSP (last_nonmenu_event
))
3404 Lisp_Object pane
, menu
, obj
;
3405 redisplay_preserve_echo_area (4);
3406 pane
= Fcons (Fcons (build_string ("Yes"), Qt
),
3407 Fcons (Fcons (build_string ("No"), Qnil
),
3410 menu
= Fcons (prompt
, pane
);
3411 obj
= Fx_popup_dialog (Qt
, menu
);
3415 #endif /* HAVE_MENUS */
3418 args
[1] = build_string ("(yes or no) ");
3419 prompt
= Fconcat (2, args
);
3425 ans
= Fdowncase (Fread_from_minibuffer (prompt
, Qnil
, Qnil
, Qnil
,
3426 Qyes_or_no_p_history
, Qnil
,
3428 if (SCHARS (ans
) == 3 && !strcmp (SDATA (ans
), "yes"))
3433 if (SCHARS (ans
) == 2 && !strcmp (SDATA (ans
), "no"))
3441 message ("Please answer yes or no.");
3442 Fsleep_for (make_number (2), Qnil
);
3446 DEFUN ("load-average", Fload_average
, Sload_average
, 0, 1, 0,
3447 doc
: /* Return list of 1 minute, 5 minute and 15 minute load averages.
3449 Each of the three load averages is multiplied by 100, then converted
3452 When USE-FLOATS is non-nil, floats will be used instead of integers.
3453 These floats are not multiplied by 100.
3455 If the 5-minute or 15-minute load averages are not available, return a
3456 shortened list, containing only those averages which are available.
3458 An error is thrown if the load average can't be obtained. In some
3459 cases making it work would require Emacs being installed setuid or
3460 setgid so that it can read kernel information, and that usually isn't
3463 Lisp_Object use_floats
;
3466 int loads
= getloadavg (load_ave
, 3);
3467 Lisp_Object ret
= Qnil
;
3470 error ("load-average not implemented for this operating system");
3474 Lisp_Object load
= (NILP (use_floats
) ?
3475 make_number ((int) (100.0 * load_ave
[loads
]))
3476 : make_float (load_ave
[loads
]));
3477 ret
= Fcons (load
, ret
);
3483 Lisp_Object Vfeatures
, Qsubfeatures
;
3484 extern Lisp_Object Vafter_load_alist
;
3486 DEFUN ("featurep", Ffeaturep
, Sfeaturep
, 1, 2, 0,
3487 doc
: /* Returns t if FEATURE is present in this Emacs.
3489 Use this to conditionalize execution of lisp code based on the
3490 presence or absence of emacs or environment extensions.
3491 Use `provide' to declare that a feature is available. This function
3492 looks at the value of the variable `features'. The optional argument
3493 SUBFEATURE can be used to check a specific subfeature of FEATURE. */)
3494 (feature
, subfeature
)
3495 Lisp_Object feature
, subfeature
;
3497 register Lisp_Object tem
;
3498 CHECK_SYMBOL (feature
);
3499 tem
= Fmemq (feature
, Vfeatures
);
3500 if (!NILP (tem
) && !NILP (subfeature
))
3501 tem
= Fmember (subfeature
, Fget (feature
, Qsubfeatures
));
3502 return (NILP (tem
)) ? Qnil
: Qt
;
3505 DEFUN ("provide", Fprovide
, Sprovide
, 1, 2, 0,
3506 doc
: /* Announce that FEATURE is a feature of the current Emacs.
3507 The optional argument SUBFEATURES should be a list of symbols listing
3508 particular subfeatures supported in this version of FEATURE. */)
3509 (feature
, subfeatures
)
3510 Lisp_Object feature
, subfeatures
;
3512 register Lisp_Object tem
;
3513 CHECK_SYMBOL (feature
);
3514 CHECK_LIST (subfeatures
);
3515 if (!NILP (Vautoload_queue
))
3516 Vautoload_queue
= Fcons (Fcons (Vfeatures
, Qnil
), Vautoload_queue
);
3517 tem
= Fmemq (feature
, Vfeatures
);
3519 Vfeatures
= Fcons (feature
, Vfeatures
);
3520 if (!NILP (subfeatures
))
3521 Fput (feature
, Qsubfeatures
, subfeatures
);
3522 LOADHIST_ATTACH (Fcons (Qprovide
, feature
));
3524 /* Run any load-hooks for this file. */
3525 tem
= Fassq (feature
, Vafter_load_alist
);
3527 Fprogn (XCDR (tem
));
3532 /* `require' and its subroutines. */
3534 /* List of features currently being require'd, innermost first. */
3536 Lisp_Object require_nesting_list
;
3539 require_unwind (old_value
)
3540 Lisp_Object old_value
;
3542 return require_nesting_list
= old_value
;
3545 DEFUN ("require", Frequire
, Srequire
, 1, 3, 0,
3546 doc
: /* If feature FEATURE is not loaded, load it from FILENAME.
3547 If FEATURE is not a member of the list `features', then the feature
3548 is not loaded; so load the file FILENAME.
3549 If FILENAME is omitted, the printname of FEATURE is used as the file name,
3550 and `load' will try to load this name appended with the suffix `.elc' or
3551 `.el', in that order. The name without appended suffix will not be used.
3552 If the optional third argument NOERROR is non-nil,
3553 then return nil if the file is not found instead of signaling an error.
3554 Normally the return value is FEATURE.
3555 The normal messages at start and end of loading FILENAME are suppressed. */)
3556 (feature
, filename
, noerror
)
3557 Lisp_Object feature
, filename
, noerror
;
3559 register Lisp_Object tem
;
3560 struct gcpro gcpro1
, gcpro2
;
3562 CHECK_SYMBOL (feature
);
3564 /* Record the presence of `require' in this file
3565 even if the feature specified is already loaded.
3566 But not more than once in any file,
3567 and not when we aren't loading a file. */
3568 if (load_in_progress
)
3570 tem
= Fcons (Qrequire
, feature
);
3571 if (NILP (Fmember (tem
, Vcurrent_load_list
)))
3572 LOADHIST_ATTACH (tem
);
3574 tem
= Fmemq (feature
, Vfeatures
);
3578 int count
= SPECPDL_INDEX ();
3581 /* This is to make sure that loadup.el gives a clear picture
3582 of what files are preloaded and when. */
3583 if (! NILP (Vpurify_flag
))
3584 error ("(require %s) while preparing to dump",
3585 SDATA (SYMBOL_NAME (feature
)));
3587 /* A certain amount of recursive `require' is legitimate,
3588 but if we require the same feature recursively 3 times,
3590 tem
= require_nesting_list
;
3591 while (! NILP (tem
))
3593 if (! NILP (Fequal (feature
, XCAR (tem
))))
3598 error ("Recursive `require' for feature `%s'",
3599 SDATA (SYMBOL_NAME (feature
)));
3601 /* Update the list for any nested `require's that occur. */
3602 record_unwind_protect (require_unwind
, require_nesting_list
);
3603 require_nesting_list
= Fcons (feature
, require_nesting_list
);
3605 /* Value saved here is to be restored into Vautoload_queue */
3606 record_unwind_protect (un_autoload
, Vautoload_queue
);
3607 Vautoload_queue
= Qt
;
3609 /* Load the file. */
3610 GCPRO2 (feature
, filename
);
3611 tem
= Fload (NILP (filename
) ? Fsymbol_name (feature
) : filename
,
3612 noerror
, Qt
, Qnil
, (NILP (filename
) ? Qt
: Qnil
));
3615 /* If load failed entirely, return nil. */
3617 return unbind_to (count
, Qnil
);
3619 tem
= Fmemq (feature
, Vfeatures
);
3621 error ("Required feature `%s' was not provided",
3622 SDATA (SYMBOL_NAME (feature
)));
3624 /* Once loading finishes, don't undo it. */
3625 Vautoload_queue
= Qt
;
3626 feature
= unbind_to (count
, feature
);
3632 /* Primitives for work of the "widget" library.
3633 In an ideal world, this section would not have been necessary.
3634 However, lisp function calls being as slow as they are, it turns
3635 out that some functions in the widget library (wid-edit.el) are the
3636 bottleneck of Widget operation. Here is their translation to C,
3637 for the sole reason of efficiency. */
3639 DEFUN ("plist-member", Fplist_member
, Splist_member
, 2, 2, 0,
3640 doc
: /* Return non-nil if PLIST has the property PROP.
3641 PLIST is a property list, which is a list of the form
3642 \(PROP1 VALUE1 PROP2 VALUE2 ...\). PROP is a symbol.
3643 Unlike `plist-get', this allows you to distinguish between a missing
3644 property and a property with the value nil.
3645 The value is actually the tail of PLIST whose car is PROP. */)
3647 Lisp_Object plist
, prop
;
3649 while (CONSP (plist
) && !EQ (XCAR (plist
), prop
))
3652 plist
= XCDR (plist
);
3653 plist
= CDR (plist
);
3658 DEFUN ("widget-put", Fwidget_put
, Swidget_put
, 3, 3, 0,
3659 doc
: /* In WIDGET, set PROPERTY to VALUE.
3660 The value can later be retrieved with `widget-get'. */)
3661 (widget
, property
, value
)
3662 Lisp_Object widget
, property
, value
;
3664 CHECK_CONS (widget
);
3665 XSETCDR (widget
, Fplist_put (XCDR (widget
), property
, value
));
3669 DEFUN ("widget-get", Fwidget_get
, Swidget_get
, 2, 2, 0,
3670 doc
: /* In WIDGET, get the value of PROPERTY.
3671 The value could either be specified when the widget was created, or
3672 later with `widget-put'. */)
3674 Lisp_Object widget
, property
;
3682 CHECK_CONS (widget
);
3683 tmp
= Fplist_member (XCDR (widget
), property
);
3689 tmp
= XCAR (widget
);
3692 widget
= Fget (tmp
, Qwidget_type
);
3696 DEFUN ("widget-apply", Fwidget_apply
, Swidget_apply
, 2, MANY
, 0,
3697 doc
: /* Apply the value of WIDGET's PROPERTY to the widget itself.
3698 ARGS are passed as extra arguments to the function.
3699 usage: (widget-apply WIDGET PROPERTY &rest ARGS) */)
3704 /* This function can GC. */
3705 Lisp_Object newargs
[3];
3706 struct gcpro gcpro1
, gcpro2
;
3709 newargs
[0] = Fwidget_get (args
[0], args
[1]);
3710 newargs
[1] = args
[0];
3711 newargs
[2] = Flist (nargs
- 2, args
+ 2);
3712 GCPRO2 (newargs
[0], newargs
[2]);
3713 result
= Fapply (3, newargs
);
3718 #ifdef HAVE_LANGINFO_CODESET
3719 #include <langinfo.h>
3722 DEFUN ("locale-info", Flocale_info
, Slocale_info
, 1, 1, 0,
3723 doc
: /* Access locale data ITEM for the current C locale, if available.
3724 ITEM should be one of the following:
3726 `codeset', returning the character set as a string (locale item CODESET);
3728 `days', returning a 7-element vector of day names (locale items DAY_n);
3730 `months', returning a 12-element vector of month names (locale items MON_n);
3732 `paper', returning a list (WIDTH HEIGHT) for the default paper size,
3733 both measured in milimeters (locale items PAPER_WIDTH, PAPER_HEIGHT).
3735 If the system can't provide such information through a call to
3736 `nl_langinfo', or if ITEM isn't from the list above, return nil.
3738 See also Info node `(libc)Locales'.
3740 The data read from the system are decoded using `locale-coding-system'. */)
3745 #ifdef HAVE_LANGINFO_CODESET
3747 if (EQ (item
, Qcodeset
))
3749 str
= nl_langinfo (CODESET
);
3750 return build_string (str
);
3753 else if (EQ (item
, Qdays
)) /* e.g. for calendar-day-name-array */
3755 Lisp_Object v
= Fmake_vector (make_number (7), Qnil
);
3756 int days
[7] = {DAY_1
, DAY_2
, DAY_3
, DAY_4
, DAY_5
, DAY_6
, DAY_7
};
3758 synchronize_system_time_locale ();
3759 for (i
= 0; i
< 7; i
++)
3761 str
= nl_langinfo (days
[i
]);
3762 val
= make_unibyte_string (str
, strlen (str
));
3763 /* Fixme: Is this coding system necessarily right, even if
3764 it is consistent with CODESET? If not, what to do? */
3765 Faset (v
, make_number (i
),
3766 code_convert_string_norecord (val
, Vlocale_coding_system
,
3773 else if (EQ (item
, Qmonths
)) /* e.g. for calendar-month-name-array */
3775 struct Lisp_Vector
*p
= allocate_vector (12);
3776 int months
[12] = {MON_1
, MON_2
, MON_3
, MON_4
, MON_5
, MON_6
, MON_7
,
3777 MON_8
, MON_9
, MON_10
, MON_11
, MON_12
};
3779 synchronize_system_time_locale ();
3780 for (i
= 0; i
< 12; i
++)
3782 str
= nl_langinfo (months
[i
]);
3783 val
= make_unibyte_string (str
, strlen (str
));
3785 code_convert_string_norecord (val
, Vlocale_coding_system
, 0);
3787 XSETVECTOR (val
, p
);
3791 /* LC_PAPER stuff isn't defined as accessible in glibc as of 2.3.1,
3792 but is in the locale files. This could be used by ps-print. */
3794 else if (EQ (item
, Qpaper
))
3796 return list2 (make_number (nl_langinfo (PAPER_WIDTH
)),
3797 make_number (nl_langinfo (PAPER_HEIGHT
)));
3799 #endif /* PAPER_WIDTH */
3800 #endif /* HAVE_LANGINFO_CODESET*/
3804 /* base64 encode/decode functions (RFC 2045).
3805 Based on code from GNU recode. */
3807 #define MIME_LINE_LENGTH 76
3809 #define IS_ASCII(Character) \
3811 #define IS_BASE64(Character) \
3812 (IS_ASCII (Character) && base64_char_to_value[Character] >= 0)
3813 #define IS_BASE64_IGNORABLE(Character) \
3814 ((Character) == ' ' || (Character) == '\t' || (Character) == '\n' \
3815 || (Character) == '\f' || (Character) == '\r')
3817 /* Used by base64_decode_1 to retrieve a non-base64-ignorable
3818 character or return retval if there are no characters left to
3820 #define READ_QUADRUPLET_BYTE(retval) \
3825 if (nchars_return) \
3826 *nchars_return = nchars; \
3831 while (IS_BASE64_IGNORABLE (c))
3833 /* Table of characters coding the 64 values. */
3834 static char base64_value_to_char
[64] =
3836 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', /* 0- 9 */
3837 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', /* 10-19 */
3838 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', /* 20-29 */
3839 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', /* 30-39 */
3840 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', /* 40-49 */
3841 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', /* 50-59 */
3842 '8', '9', '+', '/' /* 60-63 */
3845 /* Table of base64 values for first 128 characters. */
3846 static short base64_char_to_value
[128] =
3848 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0- 9 */
3849 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 10- 19 */
3850 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 20- 29 */
3851 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 30- 39 */
3852 -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, /* 40- 49 */
3853 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, /* 50- 59 */
3854 -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, /* 60- 69 */
3855 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, /* 70- 79 */
3856 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, /* 80- 89 */
3857 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, /* 90- 99 */
3858 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, /* 100-109 */
3859 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, /* 110-119 */
3860 49, 50, 51, -1, -1, -1, -1, -1 /* 120-127 */
3863 /* The following diagram shows the logical steps by which three octets
3864 get transformed into four base64 characters.
3866 .--------. .--------. .--------.
3867 |aaaaaabb| |bbbbcccc| |ccdddddd|
3868 `--------' `--------' `--------'
3870 .--------+--------+--------+--------.
3871 |00aaaaaa|00bbbbbb|00cccccc|00dddddd|
3872 `--------+--------+--------+--------'
3874 .--------+--------+--------+--------.
3875 |AAAAAAAA|BBBBBBBB|CCCCCCCC|DDDDDDDD|
3876 `--------+--------+--------+--------'
3878 The octets are divided into 6 bit chunks, which are then encoded into
3879 base64 characters. */
3882 static int base64_encode_1
P_ ((const char *, char *, int, int, int));
3883 static int base64_decode_1
P_ ((const char *, char *, int, int, int *));
3885 DEFUN ("base64-encode-region", Fbase64_encode_region
, Sbase64_encode_region
,
3887 doc
: /* Base64-encode the region between BEG and END.
3888 Return the length of the encoded text.
3889 Optional third argument NO-LINE-BREAK means do not break long lines
3890 into shorter lines. */)
3891 (beg
, end
, no_line_break
)
3892 Lisp_Object beg
, end
, no_line_break
;
3895 int allength
, length
;
3896 int ibeg
, iend
, encoded_length
;
3900 validate_region (&beg
, &end
);
3902 ibeg
= CHAR_TO_BYTE (XFASTINT (beg
));
3903 iend
= CHAR_TO_BYTE (XFASTINT (end
));
3904 move_gap_both (XFASTINT (beg
), ibeg
);
3906 /* We need to allocate enough room for encoding the text.
3907 We need 33 1/3% more space, plus a newline every 76
3908 characters, and then we round up. */
3909 length
= iend
- ibeg
;
3910 allength
= length
+ length
/3 + 1;
3911 allength
+= allength
/ MIME_LINE_LENGTH
+ 1 + 6;
3913 SAFE_ALLOCA (encoded
, char *, allength
);
3914 encoded_length
= base64_encode_1 (BYTE_POS_ADDR (ibeg
), encoded
, length
,
3915 NILP (no_line_break
),
3916 !NILP (current_buffer
->enable_multibyte_characters
));
3917 if (encoded_length
> allength
)
3920 if (encoded_length
< 0)
3922 /* The encoding wasn't possible. */
3924 error ("Multibyte character in data for base64 encoding");
3927 /* Now we have encoded the region, so we insert the new contents
3928 and delete the old. (Insert first in order to preserve markers.) */
3929 SET_PT_BOTH (XFASTINT (beg
), ibeg
);
3930 insert (encoded
, encoded_length
);
3932 del_range_byte (ibeg
+ encoded_length
, iend
+ encoded_length
, 1);
3934 /* If point was outside of the region, restore it exactly; else just
3935 move to the beginning of the region. */
3936 if (old_pos
>= XFASTINT (end
))
3937 old_pos
+= encoded_length
- (XFASTINT (end
) - XFASTINT (beg
));
3938 else if (old_pos
> XFASTINT (beg
))
3939 old_pos
= XFASTINT (beg
);
3942 /* We return the length of the encoded text. */
3943 return make_number (encoded_length
);
3946 DEFUN ("base64-encode-string", Fbase64_encode_string
, Sbase64_encode_string
,
3948 doc
: /* Base64-encode STRING and return the result.
3949 Optional second argument NO-LINE-BREAK means do not break long lines
3950 into shorter lines. */)
3951 (string
, no_line_break
)
3952 Lisp_Object string
, no_line_break
;
3954 int allength
, length
, encoded_length
;
3956 Lisp_Object encoded_string
;
3959 CHECK_STRING (string
);
3961 /* We need to allocate enough room for encoding the text.
3962 We need 33 1/3% more space, plus a newline every 76
3963 characters, and then we round up. */
3964 length
= SBYTES (string
);
3965 allength
= length
+ length
/3 + 1;
3966 allength
+= allength
/ MIME_LINE_LENGTH
+ 1 + 6;
3968 /* We need to allocate enough room for decoding the text. */
3969 SAFE_ALLOCA (encoded
, char *, allength
);
3971 encoded_length
= base64_encode_1 (SDATA (string
),
3972 encoded
, length
, NILP (no_line_break
),
3973 STRING_MULTIBYTE (string
));
3974 if (encoded_length
> allength
)
3977 if (encoded_length
< 0)
3979 /* The encoding wasn't possible. */
3981 error ("Multibyte character in data for base64 encoding");
3984 encoded_string
= make_unibyte_string (encoded
, encoded_length
);
3987 return encoded_string
;
3991 base64_encode_1 (from
, to
, length
, line_break
, multibyte
)
3998 int counter
= 0, i
= 0;
4008 c
= STRING_CHAR_AND_LENGTH (from
+ i
, length
- i
, bytes
);
4016 /* Wrap line every 76 characters. */
4020 if (counter
< MIME_LINE_LENGTH
/ 4)
4029 /* Process first byte of a triplet. */
4031 *e
++ = base64_value_to_char
[0x3f & c
>> 2];
4032 value
= (0x03 & c
) << 4;
4034 /* Process second byte of a triplet. */
4038 *e
++ = base64_value_to_char
[value
];
4046 c
= STRING_CHAR_AND_LENGTH (from
+ i
, length
- i
, bytes
);
4054 *e
++ = base64_value_to_char
[value
| (0x0f & c
>> 4)];
4055 value
= (0x0f & c
) << 2;
4057 /* Process third byte of a triplet. */
4061 *e
++ = base64_value_to_char
[value
];
4068 c
= STRING_CHAR_AND_LENGTH (from
+ i
, length
- i
, bytes
);
4076 *e
++ = base64_value_to_char
[value
| (0x03 & c
>> 6)];
4077 *e
++ = base64_value_to_char
[0x3f & c
];
4084 DEFUN ("base64-decode-region", Fbase64_decode_region
, Sbase64_decode_region
,
4086 doc
: /* Base64-decode the region between BEG and END.
4087 Return the length of the decoded text.
4088 If the region can't be decoded, signal an error and don't modify the buffer. */)
4090 Lisp_Object beg
, end
;
4092 int ibeg
, iend
, length
, allength
;
4097 int multibyte
= !NILP (current_buffer
->enable_multibyte_characters
);
4100 validate_region (&beg
, &end
);
4102 ibeg
= CHAR_TO_BYTE (XFASTINT (beg
));
4103 iend
= CHAR_TO_BYTE (XFASTINT (end
));
4105 length
= iend
- ibeg
;
4107 /* We need to allocate enough room for decoding the text. If we are
4108 working on a multibyte buffer, each decoded code may occupy at
4110 allength
= multibyte
? length
* 2 : length
;
4111 SAFE_ALLOCA (decoded
, char *, allength
);
4113 move_gap_both (XFASTINT (beg
), ibeg
);
4114 decoded_length
= base64_decode_1 (BYTE_POS_ADDR (ibeg
), decoded
, length
,
4115 multibyte
, &inserted_chars
);
4116 if (decoded_length
> allength
)
4119 if (decoded_length
< 0)
4121 /* The decoding wasn't possible. */
4123 error ("Invalid base64 data");
4126 /* Now we have decoded the region, so we insert the new contents
4127 and delete the old. (Insert first in order to preserve markers.) */
4128 TEMP_SET_PT_BOTH (XFASTINT (beg
), ibeg
);
4129 insert_1_both (decoded
, inserted_chars
, decoded_length
, 0, 1, 0);
4132 /* Delete the original text. */
4133 del_range_both (PT
, PT_BYTE
, XFASTINT (end
) + inserted_chars
,
4134 iend
+ decoded_length
, 1);
4136 /* If point was outside of the region, restore it exactly; else just
4137 move to the beginning of the region. */
4138 if (old_pos
>= XFASTINT (end
))
4139 old_pos
+= inserted_chars
- (XFASTINT (end
) - XFASTINT (beg
));
4140 else if (old_pos
> XFASTINT (beg
))
4141 old_pos
= XFASTINT (beg
);
4142 SET_PT (old_pos
> ZV
? ZV
: old_pos
);
4144 return make_number (inserted_chars
);
4147 DEFUN ("base64-decode-string", Fbase64_decode_string
, Sbase64_decode_string
,
4149 doc
: /* Base64-decode STRING and return the result. */)
4154 int length
, decoded_length
;
4155 Lisp_Object decoded_string
;
4158 CHECK_STRING (string
);
4160 length
= SBYTES (string
);
4161 /* We need to allocate enough room for decoding the text. */
4162 SAFE_ALLOCA (decoded
, char *, length
);
4164 /* The decoded result should be unibyte. */
4165 decoded_length
= base64_decode_1 (SDATA (string
), decoded
, length
,
4167 if (decoded_length
> length
)
4169 else if (decoded_length
>= 0)
4170 decoded_string
= make_unibyte_string (decoded
, decoded_length
);
4172 decoded_string
= Qnil
;
4175 if (!STRINGP (decoded_string
))
4176 error ("Invalid base64 data");
4178 return decoded_string
;
4181 /* Base64-decode the data at FROM of LENGHT bytes into TO. If
4182 MULTIBYTE is nonzero, the decoded result should be in multibyte
4183 form. If NCHARS_RETRUN is not NULL, store the number of produced
4184 characters in *NCHARS_RETURN. */
4187 base64_decode_1 (from
, to
, length
, multibyte
, nchars_return
)
4197 unsigned long value
;
4202 /* Process first byte of a quadruplet. */
4204 READ_QUADRUPLET_BYTE (e
-to
);
4208 value
= base64_char_to_value
[c
] << 18;
4210 /* Process second byte of a quadruplet. */
4212 READ_QUADRUPLET_BYTE (-1);
4216 value
|= base64_char_to_value
[c
] << 12;
4218 c
= (unsigned char) (value
>> 16);
4220 e
+= CHAR_STRING (c
, e
);
4225 /* Process third byte of a quadruplet. */
4227 READ_QUADRUPLET_BYTE (-1);
4231 READ_QUADRUPLET_BYTE (-1);
4240 value
|= base64_char_to_value
[c
] << 6;
4242 c
= (unsigned char) (0xff & value
>> 8);
4244 e
+= CHAR_STRING (c
, e
);
4249 /* Process fourth byte of a quadruplet. */
4251 READ_QUADRUPLET_BYTE (-1);
4258 value
|= base64_char_to_value
[c
];
4260 c
= (unsigned char) (0xff & value
);
4262 e
+= CHAR_STRING (c
, e
);
4271 /***********************************************************************
4273 ***** Hash Tables *****
4275 ***********************************************************************/
4277 /* Implemented by gerd@gnu.org. This hash table implementation was
4278 inspired by CMUCL hash tables. */
4282 1. For small tables, association lists are probably faster than
4283 hash tables because they have lower overhead.
4285 For uses of hash tables where the O(1) behavior of table
4286 operations is not a requirement, it might therefore be a good idea
4287 not to hash. Instead, we could just do a linear search in the
4288 key_and_value vector of the hash table. This could be done
4289 if a `:linear-search t' argument is given to make-hash-table. */
4292 /* The list of all weak hash tables. Don't staticpro this one. */
4294 Lisp_Object Vweak_hash_tables
;
4296 /* Various symbols. */
4298 Lisp_Object Qhash_table_p
, Qeq
, Qeql
, Qequal
, Qkey
, Qvalue
;
4299 Lisp_Object QCtest
, QCsize
, QCrehash_size
, QCrehash_threshold
, QCweakness
;
4300 Lisp_Object Qhash_table_test
, Qkey_or_value
, Qkey_and_value
;
4302 /* Function prototypes. */
4304 static struct Lisp_Hash_Table
*check_hash_table
P_ ((Lisp_Object
));
4305 static int get_key_arg
P_ ((Lisp_Object
, int, Lisp_Object
*, char *));
4306 static void maybe_resize_hash_table
P_ ((struct Lisp_Hash_Table
*));
4307 static int cmpfn_eql
P_ ((struct Lisp_Hash_Table
*, Lisp_Object
, unsigned,
4308 Lisp_Object
, unsigned));
4309 static int cmpfn_equal
P_ ((struct Lisp_Hash_Table
*, Lisp_Object
, unsigned,
4310 Lisp_Object
, unsigned));
4311 static int cmpfn_user_defined
P_ ((struct Lisp_Hash_Table
*, Lisp_Object
,
4312 unsigned, Lisp_Object
, unsigned));
4313 static unsigned hashfn_eq
P_ ((struct Lisp_Hash_Table
*, Lisp_Object
));
4314 static unsigned hashfn_eql
P_ ((struct Lisp_Hash_Table
*, Lisp_Object
));
4315 static unsigned hashfn_equal
P_ ((struct Lisp_Hash_Table
*, Lisp_Object
));
4316 static unsigned hashfn_user_defined
P_ ((struct Lisp_Hash_Table
*,
4318 static unsigned sxhash_string
P_ ((unsigned char *, int));
4319 static unsigned sxhash_list
P_ ((Lisp_Object
, int));
4320 static unsigned sxhash_vector
P_ ((Lisp_Object
, int));
4321 static unsigned sxhash_bool_vector
P_ ((Lisp_Object
));
4322 static int sweep_weak_table
P_ ((struct Lisp_Hash_Table
*, int));
4326 /***********************************************************************
4328 ***********************************************************************/
4330 /* If OBJ is a Lisp hash table, return a pointer to its struct
4331 Lisp_Hash_Table. Otherwise, signal an error. */
4333 static struct Lisp_Hash_Table
*
4334 check_hash_table (obj
)
4337 CHECK_HASH_TABLE (obj
);
4338 return XHASH_TABLE (obj
);
4342 /* Value is the next integer I >= N, N >= 0 which is "almost" a prime
4346 next_almost_prime (n
)
4359 /* Find KEY in ARGS which has size NARGS. Don't consider indices for
4360 which USED[I] is non-zero. If found at index I in ARGS, set
4361 USED[I] and USED[I + 1] to 1, and return I + 1. Otherwise return
4362 -1. This function is used to extract a keyword/argument pair from
4363 a DEFUN parameter list. */
4366 get_key_arg (key
, nargs
, args
, used
)
4374 for (i
= 0; i
< nargs
- 1; ++i
)
4375 if (!used
[i
] && EQ (args
[i
], key
))
4390 /* Return a Lisp vector which has the same contents as VEC but has
4391 size NEW_SIZE, NEW_SIZE >= VEC->size. Entries in the resulting
4392 vector that are not copied from VEC are set to INIT. */
4395 larger_vector (vec
, new_size
, init
)
4400 struct Lisp_Vector
*v
;
4403 xassert (VECTORP (vec
));
4404 old_size
= XVECTOR (vec
)->size
;
4405 xassert (new_size
>= old_size
);
4407 v
= allocate_vector (new_size
);
4408 bcopy (XVECTOR (vec
)->contents
, v
->contents
,
4409 old_size
* sizeof *v
->contents
);
4410 for (i
= old_size
; i
< new_size
; ++i
)
4411 v
->contents
[i
] = init
;
4412 XSETVECTOR (vec
, v
);
4417 /***********************************************************************
4419 ***********************************************************************/
4421 /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code
4422 HASH2 in hash table H using `eql'. Value is non-zero if KEY1 and
4423 KEY2 are the same. */
4426 cmpfn_eql (h
, key1
, hash1
, key2
, hash2
)
4427 struct Lisp_Hash_Table
*h
;
4428 Lisp_Object key1
, key2
;
4429 unsigned hash1
, hash2
;
4431 return (FLOATP (key1
)
4433 && XFLOAT_DATA (key1
) == XFLOAT_DATA (key2
));
4437 /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code
4438 HASH2 in hash table H using `equal'. Value is non-zero if KEY1 and
4439 KEY2 are the same. */
4442 cmpfn_equal (h
, key1
, hash1
, key2
, hash2
)
4443 struct Lisp_Hash_Table
*h
;
4444 Lisp_Object key1
, key2
;
4445 unsigned hash1
, hash2
;
4447 return hash1
== hash2
&& !NILP (Fequal (key1
, key2
));
4451 /* Compare KEY1 which has hash code HASH1, and KEY2 with hash code
4452 HASH2 in hash table H using H->user_cmp_function. Value is non-zero
4453 if KEY1 and KEY2 are the same. */
4456 cmpfn_user_defined (h
, key1
, hash1
, key2
, hash2
)
4457 struct Lisp_Hash_Table
*h
;
4458 Lisp_Object key1
, key2
;
4459 unsigned hash1
, hash2
;
4463 Lisp_Object args
[3];
4465 args
[0] = h
->user_cmp_function
;
4468 return !NILP (Ffuncall (3, args
));
4475 /* Value is a hash code for KEY for use in hash table H which uses
4476 `eq' to compare keys. The hash code returned is guaranteed to fit
4477 in a Lisp integer. */
4481 struct Lisp_Hash_Table
*h
;
4484 unsigned hash
= XUINT (key
) ^ XGCTYPE (key
);
4485 xassert ((hash
& ~INTMASK
) == 0);
4490 /* Value is a hash code for KEY for use in hash table H which uses
4491 `eql' to compare keys. The hash code returned is guaranteed to fit
4492 in a Lisp integer. */
4496 struct Lisp_Hash_Table
*h
;
4501 hash
= sxhash (key
, 0);
4503 hash
= XUINT (key
) ^ XGCTYPE (key
);
4504 xassert ((hash
& ~INTMASK
) == 0);
4509 /* Value is a hash code for KEY for use in hash table H which uses
4510 `equal' to compare keys. The hash code returned is guaranteed to fit
4511 in a Lisp integer. */
4514 hashfn_equal (h
, key
)
4515 struct Lisp_Hash_Table
*h
;
4518 unsigned hash
= sxhash (key
, 0);
4519 xassert ((hash
& ~INTMASK
) == 0);
4524 /* Value is a hash code for KEY for use in hash table H which uses as
4525 user-defined function to compare keys. The hash code returned is
4526 guaranteed to fit in a Lisp integer. */
4529 hashfn_user_defined (h
, key
)
4530 struct Lisp_Hash_Table
*h
;
4533 Lisp_Object args
[2], hash
;
4535 args
[0] = h
->user_hash_function
;
4537 hash
= Ffuncall (2, args
);
4538 if (!INTEGERP (hash
))
4540 list2 (build_string ("Invalid hash code returned from \
4541 user-supplied hash function"),
4543 return XUINT (hash
);
4547 /* Create and initialize a new hash table.
4549 TEST specifies the test the hash table will use to compare keys.
4550 It must be either one of the predefined tests `eq', `eql' or
4551 `equal' or a symbol denoting a user-defined test named TEST with
4552 test and hash functions USER_TEST and USER_HASH.
4554 Give the table initial capacity SIZE, SIZE >= 0, an integer.
4556 If REHASH_SIZE is an integer, it must be > 0, and this hash table's
4557 new size when it becomes full is computed by adding REHASH_SIZE to
4558 its old size. If REHASH_SIZE is a float, it must be > 1.0, and the
4559 table's new size is computed by multiplying its old size with
4562 REHASH_THRESHOLD must be a float <= 1.0, and > 0. The table will
4563 be resized when the ratio of (number of entries in the table) /
4564 (table size) is >= REHASH_THRESHOLD.
4566 WEAK specifies the weakness of the table. If non-nil, it must be
4567 one of the symbols `key', `value', `key-or-value', or `key-and-value'. */
4570 make_hash_table (test
, size
, rehash_size
, rehash_threshold
, weak
,
4571 user_test
, user_hash
)
4572 Lisp_Object test
, size
, rehash_size
, rehash_threshold
, weak
;
4573 Lisp_Object user_test
, user_hash
;
4575 struct Lisp_Hash_Table
*h
;
4577 int index_size
, i
, sz
;
4579 /* Preconditions. */
4580 xassert (SYMBOLP (test
));
4581 xassert (INTEGERP (size
) && XINT (size
) >= 0);
4582 xassert ((INTEGERP (rehash_size
) && XINT (rehash_size
) > 0)
4583 || (FLOATP (rehash_size
) && XFLOATINT (rehash_size
) > 1.0));
4584 xassert (FLOATP (rehash_threshold
)
4585 && XFLOATINT (rehash_threshold
) > 0
4586 && XFLOATINT (rehash_threshold
) <= 1.0);
4588 if (XFASTINT (size
) == 0)
4589 size
= make_number (1);
4591 /* Allocate a table and initialize it. */
4592 h
= allocate_hash_table ();
4594 /* Initialize hash table slots. */
4595 sz
= XFASTINT (size
);
4598 if (EQ (test
, Qeql
))
4600 h
->cmpfn
= cmpfn_eql
;
4601 h
->hashfn
= hashfn_eql
;
4603 else if (EQ (test
, Qeq
))
4606 h
->hashfn
= hashfn_eq
;
4608 else if (EQ (test
, Qequal
))
4610 h
->cmpfn
= cmpfn_equal
;
4611 h
->hashfn
= hashfn_equal
;
4615 h
->user_cmp_function
= user_test
;
4616 h
->user_hash_function
= user_hash
;
4617 h
->cmpfn
= cmpfn_user_defined
;
4618 h
->hashfn
= hashfn_user_defined
;
4622 h
->rehash_threshold
= rehash_threshold
;
4623 h
->rehash_size
= rehash_size
;
4624 h
->count
= make_number (0);
4625 h
->key_and_value
= Fmake_vector (make_number (2 * sz
), Qnil
);
4626 h
->hash
= Fmake_vector (size
, Qnil
);
4627 h
->next
= Fmake_vector (size
, Qnil
);
4628 /* Cast to int here avoids losing with gcc 2.95 on Tru64/Alpha... */
4629 index_size
= next_almost_prime ((int) (sz
/ XFLOATINT (rehash_threshold
)));
4630 h
->index
= Fmake_vector (make_number (index_size
), Qnil
);
4632 /* Set up the free list. */
4633 for (i
= 0; i
< sz
- 1; ++i
)
4634 HASH_NEXT (h
, i
) = make_number (i
+ 1);
4635 h
->next_free
= make_number (0);
4637 XSET_HASH_TABLE (table
, h
);
4638 xassert (HASH_TABLE_P (table
));
4639 xassert (XHASH_TABLE (table
) == h
);
4641 /* Maybe add this hash table to the list of all weak hash tables. */
4643 h
->next_weak
= Qnil
;
4646 h
->next_weak
= Vweak_hash_tables
;
4647 Vweak_hash_tables
= table
;
4654 /* Return a copy of hash table H1. Keys and values are not copied,
4655 only the table itself is. */
4658 copy_hash_table (h1
)
4659 struct Lisp_Hash_Table
*h1
;
4662 struct Lisp_Hash_Table
*h2
;
4663 struct Lisp_Vector
*next
;
4665 h2
= allocate_hash_table ();
4666 next
= h2
->vec_next
;
4667 bcopy (h1
, h2
, sizeof *h2
);
4668 h2
->vec_next
= next
;
4669 h2
->key_and_value
= Fcopy_sequence (h1
->key_and_value
);
4670 h2
->hash
= Fcopy_sequence (h1
->hash
);
4671 h2
->next
= Fcopy_sequence (h1
->next
);
4672 h2
->index
= Fcopy_sequence (h1
->index
);
4673 XSET_HASH_TABLE (table
, h2
);
4675 /* Maybe add this hash table to the list of all weak hash tables. */
4676 if (!NILP (h2
->weak
))
4678 h2
->next_weak
= Vweak_hash_tables
;
4679 Vweak_hash_tables
= table
;
4686 /* Resize hash table H if it's too full. If H cannot be resized
4687 because it's already too large, throw an error. */
4690 maybe_resize_hash_table (h
)
4691 struct Lisp_Hash_Table
*h
;
4693 if (NILP (h
->next_free
))
4695 int old_size
= HASH_TABLE_SIZE (h
);
4696 int i
, new_size
, index_size
;
4698 if (INTEGERP (h
->rehash_size
))
4699 new_size
= old_size
+ XFASTINT (h
->rehash_size
);
4701 new_size
= old_size
* XFLOATINT (h
->rehash_size
);
4702 new_size
= max (old_size
+ 1, new_size
);
4703 index_size
= next_almost_prime ((int)
4705 / XFLOATINT (h
->rehash_threshold
)));
4706 if (max (index_size
, 2 * new_size
) > MOST_POSITIVE_FIXNUM
)
4707 error ("Hash table too large to resize");
4709 h
->key_and_value
= larger_vector (h
->key_and_value
, 2 * new_size
, Qnil
);
4710 h
->next
= larger_vector (h
->next
, new_size
, Qnil
);
4711 h
->hash
= larger_vector (h
->hash
, new_size
, Qnil
);
4712 h
->index
= Fmake_vector (make_number (index_size
), Qnil
);
4714 /* Update the free list. Do it so that new entries are added at
4715 the end of the free list. This makes some operations like
4717 for (i
= old_size
; i
< new_size
- 1; ++i
)
4718 HASH_NEXT (h
, i
) = make_number (i
+ 1);
4720 if (!NILP (h
->next_free
))
4722 Lisp_Object last
, next
;
4724 last
= h
->next_free
;
4725 while (next
= HASH_NEXT (h
, XFASTINT (last
)),
4729 HASH_NEXT (h
, XFASTINT (last
)) = make_number (old_size
);
4732 XSETFASTINT (h
->next_free
, old_size
);
4735 for (i
= 0; i
< old_size
; ++i
)
4736 if (!NILP (HASH_HASH (h
, i
)))
4738 unsigned hash_code
= XUINT (HASH_HASH (h
, i
));
4739 int start_of_bucket
= hash_code
% XVECTOR (h
->index
)->size
;
4740 HASH_NEXT (h
, i
) = HASH_INDEX (h
, start_of_bucket
);
4741 HASH_INDEX (h
, start_of_bucket
) = make_number (i
);
4747 /* Lookup KEY in hash table H. If HASH is non-null, return in *HASH
4748 the hash code of KEY. Value is the index of the entry in H
4749 matching KEY, or -1 if not found. */
4752 hash_lookup (h
, key
, hash
)
4753 struct Lisp_Hash_Table
*h
;
4758 int start_of_bucket
;
4761 hash_code
= h
->hashfn (h
, key
);
4765 start_of_bucket
= hash_code
% XVECTOR (h
->index
)->size
;
4766 idx
= HASH_INDEX (h
, start_of_bucket
);
4768 /* We need not gcpro idx since it's either an integer or nil. */
4771 int i
= XFASTINT (idx
);
4772 if (EQ (key
, HASH_KEY (h
, i
))
4774 && h
->cmpfn (h
, key
, hash_code
,
4775 HASH_KEY (h
, i
), XUINT (HASH_HASH (h
, i
)))))
4777 idx
= HASH_NEXT (h
, i
);
4780 return NILP (idx
) ? -1 : XFASTINT (idx
);
4784 /* Put an entry into hash table H that associates KEY with VALUE.
4785 HASH is a previously computed hash code of KEY.
4786 Value is the index of the entry in H matching KEY. */
4789 hash_put (h
, key
, value
, hash
)
4790 struct Lisp_Hash_Table
*h
;
4791 Lisp_Object key
, value
;
4794 int start_of_bucket
, i
;
4796 xassert ((hash
& ~INTMASK
) == 0);
4798 /* Increment count after resizing because resizing may fail. */
4799 maybe_resize_hash_table (h
);
4800 h
->count
= make_number (XFASTINT (h
->count
) + 1);
4802 /* Store key/value in the key_and_value vector. */
4803 i
= XFASTINT (h
->next_free
);
4804 h
->next_free
= HASH_NEXT (h
, i
);
4805 HASH_KEY (h
, i
) = key
;
4806 HASH_VALUE (h
, i
) = value
;
4808 /* Remember its hash code. */
4809 HASH_HASH (h
, i
) = make_number (hash
);
4811 /* Add new entry to its collision chain. */
4812 start_of_bucket
= hash
% XVECTOR (h
->index
)->size
;
4813 HASH_NEXT (h
, i
) = HASH_INDEX (h
, start_of_bucket
);
4814 HASH_INDEX (h
, start_of_bucket
) = make_number (i
);
4819 /* Remove the entry matching KEY from hash table H, if there is one. */
4822 hash_remove (h
, key
)
4823 struct Lisp_Hash_Table
*h
;
4827 int start_of_bucket
;
4828 Lisp_Object idx
, prev
;
4830 hash_code
= h
->hashfn (h
, key
);
4831 start_of_bucket
= hash_code
% XVECTOR (h
->index
)->size
;
4832 idx
= HASH_INDEX (h
, start_of_bucket
);
4835 /* We need not gcpro idx, prev since they're either integers or nil. */
4838 int i
= XFASTINT (idx
);
4840 if (EQ (key
, HASH_KEY (h
, i
))
4842 && h
->cmpfn (h
, key
, hash_code
,
4843 HASH_KEY (h
, i
), XUINT (HASH_HASH (h
, i
)))))
4845 /* Take entry out of collision chain. */
4847 HASH_INDEX (h
, start_of_bucket
) = HASH_NEXT (h
, i
);
4849 HASH_NEXT (h
, XFASTINT (prev
)) = HASH_NEXT (h
, i
);
4851 /* Clear slots in key_and_value and add the slots to
4853 HASH_KEY (h
, i
) = HASH_VALUE (h
, i
) = HASH_HASH (h
, i
) = Qnil
;
4854 HASH_NEXT (h
, i
) = h
->next_free
;
4855 h
->next_free
= make_number (i
);
4856 h
->count
= make_number (XFASTINT (h
->count
) - 1);
4857 xassert (XINT (h
->count
) >= 0);
4863 idx
= HASH_NEXT (h
, i
);
4869 /* Clear hash table H. */
4873 struct Lisp_Hash_Table
*h
;
4875 if (XFASTINT (h
->count
) > 0)
4877 int i
, size
= HASH_TABLE_SIZE (h
);
4879 for (i
= 0; i
< size
; ++i
)
4881 HASH_NEXT (h
, i
) = i
< size
- 1 ? make_number (i
+ 1) : Qnil
;
4882 HASH_KEY (h
, i
) = Qnil
;
4883 HASH_VALUE (h
, i
) = Qnil
;
4884 HASH_HASH (h
, i
) = Qnil
;
4887 for (i
= 0; i
< XVECTOR (h
->index
)->size
; ++i
)
4888 XVECTOR (h
->index
)->contents
[i
] = Qnil
;
4890 h
->next_free
= make_number (0);
4891 h
->count
= make_number (0);
4897 /************************************************************************
4899 ************************************************************************/
4901 /* Sweep weak hash table H. REMOVE_ENTRIES_P non-zero means remove
4902 entries from the table that don't survive the current GC.
4903 REMOVE_ENTRIES_P zero means mark entries that are in use. Value is
4904 non-zero if anything was marked. */
4907 sweep_weak_table (h
, remove_entries_p
)
4908 struct Lisp_Hash_Table
*h
;
4909 int remove_entries_p
;
4911 int bucket
, n
, marked
;
4913 n
= XVECTOR (h
->index
)->size
& ~ARRAY_MARK_FLAG
;
4916 for (bucket
= 0; bucket
< n
; ++bucket
)
4918 Lisp_Object idx
, next
, prev
;
4920 /* Follow collision chain, removing entries that
4921 don't survive this garbage collection. */
4923 for (idx
= HASH_INDEX (h
, bucket
); !GC_NILP (idx
); idx
= next
)
4925 int i
= XFASTINT (idx
);
4926 int key_known_to_survive_p
= survives_gc_p (HASH_KEY (h
, i
));
4927 int value_known_to_survive_p
= survives_gc_p (HASH_VALUE (h
, i
));
4930 if (EQ (h
->weak
, Qkey
))
4931 remove_p
= !key_known_to_survive_p
;
4932 else if (EQ (h
->weak
, Qvalue
))
4933 remove_p
= !value_known_to_survive_p
;
4934 else if (EQ (h
->weak
, Qkey_or_value
))
4935 remove_p
= !(key_known_to_survive_p
|| value_known_to_survive_p
);
4936 else if (EQ (h
->weak
, Qkey_and_value
))
4937 remove_p
= !(key_known_to_survive_p
&& value_known_to_survive_p
);
4941 next
= HASH_NEXT (h
, i
);
4943 if (remove_entries_p
)
4947 /* Take out of collision chain. */
4949 HASH_INDEX (h
, bucket
) = next
;
4951 HASH_NEXT (h
, XFASTINT (prev
)) = next
;
4953 /* Add to free list. */
4954 HASH_NEXT (h
, i
) = h
->next_free
;
4957 /* Clear key, value, and hash. */
4958 HASH_KEY (h
, i
) = HASH_VALUE (h
, i
) = Qnil
;
4959 HASH_HASH (h
, i
) = Qnil
;
4961 h
->count
= make_number (XFASTINT (h
->count
) - 1);
4972 /* Make sure key and value survive. */
4973 if (!key_known_to_survive_p
)
4975 mark_object (HASH_KEY (h
, i
));
4979 if (!value_known_to_survive_p
)
4981 mark_object (HASH_VALUE (h
, i
));
4992 /* Remove elements from weak hash tables that don't survive the
4993 current garbage collection. Remove weak tables that don't survive
4994 from Vweak_hash_tables. Called from gc_sweep. */
4997 sweep_weak_hash_tables ()
4999 Lisp_Object table
, used
, next
;
5000 struct Lisp_Hash_Table
*h
;
5003 /* Mark all keys and values that are in use. Keep on marking until
5004 there is no more change. This is necessary for cases like
5005 value-weak table A containing an entry X -> Y, where Y is used in a
5006 key-weak table B, Z -> Y. If B comes after A in the list of weak
5007 tables, X -> Y might be removed from A, although when looking at B
5008 one finds that it shouldn't. */
5012 for (table
= Vweak_hash_tables
; !GC_NILP (table
); table
= h
->next_weak
)
5014 h
= XHASH_TABLE (table
);
5015 if (h
->size
& ARRAY_MARK_FLAG
)
5016 marked
|= sweep_weak_table (h
, 0);
5021 /* Remove tables and entries that aren't used. */
5022 for (table
= Vweak_hash_tables
, used
= Qnil
; !GC_NILP (table
); table
= next
)
5024 h
= XHASH_TABLE (table
);
5025 next
= h
->next_weak
;
5027 if (h
->size
& ARRAY_MARK_FLAG
)
5029 /* TABLE is marked as used. Sweep its contents. */
5030 if (XFASTINT (h
->count
) > 0)
5031 sweep_weak_table (h
, 1);
5033 /* Add table to the list of used weak hash tables. */
5034 h
->next_weak
= used
;
5039 Vweak_hash_tables
= used
;
5044 /***********************************************************************
5045 Hash Code Computation
5046 ***********************************************************************/
5048 /* Maximum depth up to which to dive into Lisp structures. */
5050 #define SXHASH_MAX_DEPTH 3
5052 /* Maximum length up to which to take list and vector elements into
5055 #define SXHASH_MAX_LEN 7
5057 /* Combine two integers X and Y for hashing. */
5059 #define SXHASH_COMBINE(X, Y) \
5060 ((((unsigned)(X) << 4) + (((unsigned)(X) >> 24) & 0x0fffffff)) \
5064 /* Return a hash for string PTR which has length LEN. The hash
5065 code returned is guaranteed to fit in a Lisp integer. */
5068 sxhash_string (ptr
, len
)
5072 unsigned char *p
= ptr
;
5073 unsigned char *end
= p
+ len
;
5082 hash
= ((hash
<< 3) + (hash
>> 28) + c
);
5085 return hash
& INTMASK
;
5089 /* Return a hash for list LIST. DEPTH is the current depth in the
5090 list. We don't recurse deeper than SXHASH_MAX_DEPTH in it. */
5093 sxhash_list (list
, depth
)
5100 if (depth
< SXHASH_MAX_DEPTH
)
5102 CONSP (list
) && i
< SXHASH_MAX_LEN
;
5103 list
= XCDR (list
), ++i
)
5105 unsigned hash2
= sxhash (XCAR (list
), depth
+ 1);
5106 hash
= SXHASH_COMBINE (hash
, hash2
);
5113 /* Return a hash for vector VECTOR. DEPTH is the current depth in
5114 the Lisp structure. */
5117 sxhash_vector (vec
, depth
)
5121 unsigned hash
= XVECTOR (vec
)->size
;
5124 n
= min (SXHASH_MAX_LEN
, XVECTOR (vec
)->size
);
5125 for (i
= 0; i
< n
; ++i
)
5127 unsigned hash2
= sxhash (XVECTOR (vec
)->contents
[i
], depth
+ 1);
5128 hash
= SXHASH_COMBINE (hash
, hash2
);
5135 /* Return a hash for bool-vector VECTOR. */
5138 sxhash_bool_vector (vec
)
5141 unsigned hash
= XBOOL_VECTOR (vec
)->size
;
5144 n
= min (SXHASH_MAX_LEN
, XBOOL_VECTOR (vec
)->vector_size
);
5145 for (i
= 0; i
< n
; ++i
)
5146 hash
= SXHASH_COMBINE (hash
, XBOOL_VECTOR (vec
)->data
[i
]);
5152 /* Return a hash code for OBJ. DEPTH is the current depth in the Lisp
5153 structure. Value is an unsigned integer clipped to INTMASK. */
5162 if (depth
> SXHASH_MAX_DEPTH
)
5165 switch (XTYPE (obj
))
5176 obj
= SYMBOL_NAME (obj
);
5180 hash
= sxhash_string (SDATA (obj
), SCHARS (obj
));
5183 /* This can be everything from a vector to an overlay. */
5184 case Lisp_Vectorlike
:
5186 /* According to the CL HyperSpec, two arrays are equal only if
5187 they are `eq', except for strings and bit-vectors. In
5188 Emacs, this works differently. We have to compare element
5190 hash
= sxhash_vector (obj
, depth
);
5191 else if (BOOL_VECTOR_P (obj
))
5192 hash
= sxhash_bool_vector (obj
);
5194 /* Others are `equal' if they are `eq', so let's take their
5200 hash
= sxhash_list (obj
, depth
);
5205 unsigned char *p
= (unsigned char *) &XFLOAT_DATA (obj
);
5206 unsigned char *e
= p
+ sizeof XFLOAT_DATA (obj
);
5207 for (hash
= 0; p
< e
; ++p
)
5208 hash
= SXHASH_COMBINE (hash
, *p
);
5216 return hash
& INTMASK
;
5221 /***********************************************************************
5223 ***********************************************************************/
5226 DEFUN ("sxhash", Fsxhash
, Ssxhash
, 1, 1, 0,
5227 doc
: /* Compute a hash code for OBJ and return it as integer. */)
5231 unsigned hash
= sxhash (obj
, 0);;
5232 return make_number (hash
);
5236 DEFUN ("make-hash-table", Fmake_hash_table
, Smake_hash_table
, 0, MANY
, 0,
5237 doc
: /* Create and return a new hash table.
5239 Arguments are specified as keyword/argument pairs. The following
5240 arguments are defined:
5242 :test TEST -- TEST must be a symbol that specifies how to compare
5243 keys. Default is `eql'. Predefined are the tests `eq', `eql', and
5244 `equal'. User-supplied test and hash functions can be specified via
5245 `define-hash-table-test'.
5247 :size SIZE -- A hint as to how many elements will be put in the table.
5250 :rehash-size REHASH-SIZE - Indicates how to expand the table when it
5251 fills up. If REHASH-SIZE is an integer, add that many space. If it
5252 is a float, it must be > 1.0, and the new size is computed by
5253 multiplying the old size with that factor. Default is 1.5.
5255 :rehash-threshold THRESHOLD -- THRESHOLD must a float > 0, and <= 1.0.
5256 Resize the hash table when ratio of the number of entries in the
5257 table. Default is 0.8.
5259 :weakness WEAK -- WEAK must be one of nil, t, `key', `value',
5260 `key-or-value', or `key-and-value'. If WEAK is not nil, the table
5261 returned is a weak table. Key/value pairs are removed from a weak
5262 hash table when there are no non-weak references pointing to their
5263 key, value, one of key or value, or both key and value, depending on
5264 WEAK. WEAK t is equivalent to `key-and-value'. Default value of WEAK
5267 usage: (make-hash-table &rest KEYWORD-ARGS) */)
5272 Lisp_Object test
, size
, rehash_size
, rehash_threshold
, weak
;
5273 Lisp_Object user_test
, user_hash
;
5277 /* The vector `used' is used to keep track of arguments that
5278 have been consumed. */
5279 used
= (char *) alloca (nargs
* sizeof *used
);
5280 bzero (used
, nargs
* sizeof *used
);
5282 /* See if there's a `:test TEST' among the arguments. */
5283 i
= get_key_arg (QCtest
, nargs
, args
, used
);
5284 test
= i
< 0 ? Qeql
: args
[i
];
5285 if (!EQ (test
, Qeq
) && !EQ (test
, Qeql
) && !EQ (test
, Qequal
))
5287 /* See if it is a user-defined test. */
5290 prop
= Fget (test
, Qhash_table_test
);
5291 if (!CONSP (prop
) || !CONSP (XCDR (prop
)))
5292 Fsignal (Qerror
, list2 (build_string ("Invalid hash table test"),
5294 user_test
= XCAR (prop
);
5295 user_hash
= XCAR (XCDR (prop
));
5298 user_test
= user_hash
= Qnil
;
5300 /* See if there's a `:size SIZE' argument. */
5301 i
= get_key_arg (QCsize
, nargs
, args
, used
);
5302 size
= i
< 0 ? Qnil
: args
[i
];
5304 size
= make_number (DEFAULT_HASH_SIZE
);
5305 else if (!INTEGERP (size
) || XINT (size
) < 0)
5307 list2 (build_string ("Invalid hash table size"),
5310 /* Look for `:rehash-size SIZE'. */
5311 i
= get_key_arg (QCrehash_size
, nargs
, args
, used
);
5312 rehash_size
= i
< 0 ? make_float (DEFAULT_REHASH_SIZE
) : args
[i
];
5313 if (!NUMBERP (rehash_size
)
5314 || (INTEGERP (rehash_size
) && XINT (rehash_size
) <= 0)
5315 || XFLOATINT (rehash_size
) <= 1.0)
5317 list2 (build_string ("Invalid hash table rehash size"),
5320 /* Look for `:rehash-threshold THRESHOLD'. */
5321 i
= get_key_arg (QCrehash_threshold
, nargs
, args
, used
);
5322 rehash_threshold
= i
< 0 ? make_float (DEFAULT_REHASH_THRESHOLD
) : args
[i
];
5323 if (!FLOATP (rehash_threshold
)
5324 || XFLOATINT (rehash_threshold
) <= 0.0
5325 || XFLOATINT (rehash_threshold
) > 1.0)
5327 list2 (build_string ("Invalid hash table rehash threshold"),
5330 /* Look for `:weakness WEAK'. */
5331 i
= get_key_arg (QCweakness
, nargs
, args
, used
);
5332 weak
= i
< 0 ? Qnil
: args
[i
];
5334 weak
= Qkey_and_value
;
5337 && !EQ (weak
, Qvalue
)
5338 && !EQ (weak
, Qkey_or_value
)
5339 && !EQ (weak
, Qkey_and_value
))
5340 Fsignal (Qerror
, list2 (build_string ("Invalid hash table weakness"),
5343 /* Now, all args should have been used up, or there's a problem. */
5344 for (i
= 0; i
< nargs
; ++i
)
5347 list2 (build_string ("Invalid argument list"), args
[i
]));
5349 return make_hash_table (test
, size
, rehash_size
, rehash_threshold
, weak
,
5350 user_test
, user_hash
);
5354 DEFUN ("copy-hash-table", Fcopy_hash_table
, Scopy_hash_table
, 1, 1, 0,
5355 doc
: /* Return a copy of hash table TABLE. */)
5359 return copy_hash_table (check_hash_table (table
));
5363 DEFUN ("hash-table-count", Fhash_table_count
, Shash_table_count
, 1, 1, 0,
5364 doc
: /* Return the number of elements in TABLE. */)
5368 return check_hash_table (table
)->count
;
5372 DEFUN ("hash-table-rehash-size", Fhash_table_rehash_size
,
5373 Shash_table_rehash_size
, 1, 1, 0,
5374 doc
: /* Return the current rehash size of TABLE. */)
5378 return check_hash_table (table
)->rehash_size
;
5382 DEFUN ("hash-table-rehash-threshold", Fhash_table_rehash_threshold
,
5383 Shash_table_rehash_threshold
, 1, 1, 0,
5384 doc
: /* Return the current rehash threshold of TABLE. */)
5388 return check_hash_table (table
)->rehash_threshold
;
5392 DEFUN ("hash-table-size", Fhash_table_size
, Shash_table_size
, 1, 1, 0,
5393 doc
: /* Return the size of TABLE.
5394 The size can be used as an argument to `make-hash-table' to create
5395 a hash table than can hold as many elements of TABLE holds
5396 without need for resizing. */)
5400 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
5401 return make_number (HASH_TABLE_SIZE (h
));
5405 DEFUN ("hash-table-test", Fhash_table_test
, Shash_table_test
, 1, 1, 0,
5406 doc
: /* Return the test TABLE uses. */)
5410 return check_hash_table (table
)->test
;
5414 DEFUN ("hash-table-weakness", Fhash_table_weakness
, Shash_table_weakness
,
5416 doc
: /* Return the weakness of TABLE. */)
5420 return check_hash_table (table
)->weak
;
5424 DEFUN ("hash-table-p", Fhash_table_p
, Shash_table_p
, 1, 1, 0,
5425 doc
: /* Return t if OBJ is a Lisp hash table object. */)
5429 return HASH_TABLE_P (obj
) ? Qt
: Qnil
;
5433 DEFUN ("clrhash", Fclrhash
, Sclrhash
, 1, 1, 0,
5434 doc
: /* Clear hash table TABLE. */)
5438 hash_clear (check_hash_table (table
));
5443 DEFUN ("gethash", Fgethash
, Sgethash
, 2, 3, 0,
5444 doc
: /* Look up KEY in TABLE and return its associated value.
5445 If KEY is not found, return DFLT which defaults to nil. */)
5447 Lisp_Object key
, table
, dflt
;
5449 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
5450 int i
= hash_lookup (h
, key
, NULL
);
5451 return i
>= 0 ? HASH_VALUE (h
, i
) : dflt
;
5455 DEFUN ("puthash", Fputhash
, Sputhash
, 3, 3, 0,
5456 doc
: /* Associate KEY with VALUE in hash table TABLE.
5457 If KEY is already present in table, replace its current value with
5460 Lisp_Object key
, value
, table
;
5462 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
5466 i
= hash_lookup (h
, key
, &hash
);
5468 HASH_VALUE (h
, i
) = value
;
5470 hash_put (h
, key
, value
, hash
);
5476 DEFUN ("remhash", Fremhash
, Sremhash
, 2, 2, 0,
5477 doc
: /* Remove KEY from TABLE. */)
5479 Lisp_Object key
, table
;
5481 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
5482 hash_remove (h
, key
);
5487 DEFUN ("maphash", Fmaphash
, Smaphash
, 2, 2, 0,
5488 doc
: /* Call FUNCTION for all entries in hash table TABLE.
5489 FUNCTION is called with 2 arguments KEY and VALUE. */)
5491 Lisp_Object function
, table
;
5493 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
5494 Lisp_Object args
[3];
5497 for (i
= 0; i
< HASH_TABLE_SIZE (h
); ++i
)
5498 if (!NILP (HASH_HASH (h
, i
)))
5501 args
[1] = HASH_KEY (h
, i
);
5502 args
[2] = HASH_VALUE (h
, i
);
5510 DEFUN ("define-hash-table-test", Fdefine_hash_table_test
,
5511 Sdefine_hash_table_test
, 3, 3, 0,
5512 doc
: /* Define a new hash table test with name NAME, a symbol.
5514 In hash tables created with NAME specified as test, use TEST to
5515 compare keys, and HASH for computing hash codes of keys.
5517 TEST must be a function taking two arguments and returning non-nil if
5518 both arguments are the same. HASH must be a function taking one
5519 argument and return an integer that is the hash code of the argument.
5520 Hash code computation should use the whole value range of integers,
5521 including negative integers. */)
5523 Lisp_Object name
, test
, hash
;
5525 return Fput (name
, Qhash_table_test
, list2 (test
, hash
));
5530 /************************************************************************
5532 ************************************************************************/
5537 DEFUN ("md5", Fmd5
, Smd5
, 1, 5, 0,
5538 doc
: /* Return MD5 message digest of OBJECT, a buffer or string.
5540 A message digest is a cryptographic checksum of a document, and the
5541 algorithm to calculate it is defined in RFC 1321.
5543 The two optional arguments START and END are character positions
5544 specifying for which part of OBJECT the message digest should be
5545 computed. If nil or omitted, the digest is computed for the whole
5548 The MD5 message digest is computed from the result of encoding the
5549 text in a coding system, not directly from the internal Emacs form of
5550 the text. The optional fourth argument CODING-SYSTEM specifies which
5551 coding system to encode the text with. It should be the same coding
5552 system that you used or will use when actually writing the text into a
5555 If CODING-SYSTEM is nil or omitted, the default depends on OBJECT. If
5556 OBJECT is a buffer, the default for CODING-SYSTEM is whatever coding
5557 system would be chosen by default for writing this text into a file.
5559 If OBJECT is a string, the most preferred coding system (see the
5560 command `prefer-coding-system') is used.
5562 If NOERROR is non-nil, silently assume the `raw-text' coding if the
5563 guesswork fails. Normally, an error is signaled in such case. */)
5564 (object
, start
, end
, coding_system
, noerror
)
5565 Lisp_Object object
, start
, end
, coding_system
, noerror
;
5567 unsigned char digest
[16];
5568 unsigned char value
[33];
5572 int start_char
= 0, end_char
= 0;
5573 int start_byte
= 0, end_byte
= 0;
5575 register struct buffer
*bp
;
5578 if (STRINGP (object
))
5580 if (NILP (coding_system
))
5582 /* Decide the coding-system to encode the data with. */
5584 if (STRING_MULTIBYTE (object
))
5585 /* use default, we can't guess correct value */
5586 coding_system
= SYMBOL_VALUE (XCAR (Vcoding_category_list
));
5588 coding_system
= Qraw_text
;
5591 if (NILP (Fcoding_system_p (coding_system
)))
5593 /* Invalid coding system. */
5595 if (!NILP (noerror
))
5596 coding_system
= Qraw_text
;
5599 Fsignal (Qcoding_system_error
, Fcons (coding_system
, Qnil
));
5602 if (STRING_MULTIBYTE (object
))
5603 object
= code_convert_string1 (object
, coding_system
, Qnil
, 1);
5605 size
= SCHARS (object
);
5606 size_byte
= SBYTES (object
);
5610 CHECK_NUMBER (start
);
5612 start_char
= XINT (start
);
5617 start_byte
= string_char_to_byte (object
, start_char
);
5623 end_byte
= size_byte
;
5629 end_char
= XINT (end
);
5634 end_byte
= string_char_to_byte (object
, end_char
);
5637 if (!(0 <= start_char
&& start_char
<= end_char
&& end_char
<= size
))
5638 args_out_of_range_3 (object
, make_number (start_char
),
5639 make_number (end_char
));
5643 struct buffer
*prev
= current_buffer
;
5645 record_unwind_protect (Fset_buffer
, Fcurrent_buffer ());
5647 CHECK_BUFFER (object
);
5649 bp
= XBUFFER (object
);
5650 if (bp
!= current_buffer
)
5651 set_buffer_internal (bp
);
5657 CHECK_NUMBER_COERCE_MARKER (start
);
5665 CHECK_NUMBER_COERCE_MARKER (end
);
5670 temp
= b
, b
= e
, e
= temp
;
5672 if (!(BEGV
<= b
&& e
<= ZV
))
5673 args_out_of_range (start
, end
);
5675 if (NILP (coding_system
))
5677 /* Decide the coding-system to encode the data with.
5678 See fileio.c:Fwrite-region */
5680 if (!NILP (Vcoding_system_for_write
))
5681 coding_system
= Vcoding_system_for_write
;
5684 int force_raw_text
= 0;
5686 coding_system
= XBUFFER (object
)->buffer_file_coding_system
;
5687 if (NILP (coding_system
)
5688 || NILP (Flocal_variable_p (Qbuffer_file_coding_system
, Qnil
)))
5690 coding_system
= Qnil
;
5691 if (NILP (current_buffer
->enable_multibyte_characters
))
5695 if (NILP (coding_system
) && !NILP (Fbuffer_file_name(object
)))
5697 /* Check file-coding-system-alist. */
5698 Lisp_Object args
[4], val
;
5700 args
[0] = Qwrite_region
; args
[1] = start
; args
[2] = end
;
5701 args
[3] = Fbuffer_file_name(object
);
5702 val
= Ffind_operation_coding_system (4, args
);
5703 if (CONSP (val
) && !NILP (XCDR (val
)))
5704 coding_system
= XCDR (val
);
5707 if (NILP (coding_system
)
5708 && !NILP (XBUFFER (object
)->buffer_file_coding_system
))
5710 /* If we still have not decided a coding system, use the
5711 default value of buffer-file-coding-system. */
5712 coding_system
= XBUFFER (object
)->buffer_file_coding_system
;
5716 && !NILP (Ffboundp (Vselect_safe_coding_system_function
)))
5717 /* Confirm that VAL can surely encode the current region. */
5718 coding_system
= call4 (Vselect_safe_coding_system_function
,
5719 make_number (b
), make_number (e
),
5720 coding_system
, Qnil
);
5723 coding_system
= Qraw_text
;
5726 if (NILP (Fcoding_system_p (coding_system
)))
5728 /* Invalid coding system. */
5730 if (!NILP (noerror
))
5731 coding_system
= Qraw_text
;
5734 Fsignal (Qcoding_system_error
, Fcons (coding_system
, Qnil
));
5738 object
= make_buffer_string (b
, e
, 0);
5739 if (prev
!= current_buffer
)
5740 set_buffer_internal (prev
);
5741 /* Discard the unwind protect for recovering the current
5745 if (STRING_MULTIBYTE (object
))
5746 object
= code_convert_string1 (object
, coding_system
, Qnil
, 1);
5749 md5_buffer (SDATA (object
) + start_byte
,
5750 SBYTES (object
) - (size_byte
- end_byte
),
5753 for (i
= 0; i
< 16; i
++)
5754 sprintf (&value
[2 * i
], "%02x", digest
[i
]);
5757 return make_string (value
, 32);
5764 /* Hash table stuff. */
5765 Qhash_table_p
= intern ("hash-table-p");
5766 staticpro (&Qhash_table_p
);
5767 Qeq
= intern ("eq");
5769 Qeql
= intern ("eql");
5771 Qequal
= intern ("equal");
5772 staticpro (&Qequal
);
5773 QCtest
= intern (":test");
5774 staticpro (&QCtest
);
5775 QCsize
= intern (":size");
5776 staticpro (&QCsize
);
5777 QCrehash_size
= intern (":rehash-size");
5778 staticpro (&QCrehash_size
);
5779 QCrehash_threshold
= intern (":rehash-threshold");
5780 staticpro (&QCrehash_threshold
);
5781 QCweakness
= intern (":weakness");
5782 staticpro (&QCweakness
);
5783 Qkey
= intern ("key");
5785 Qvalue
= intern ("value");
5786 staticpro (&Qvalue
);
5787 Qhash_table_test
= intern ("hash-table-test");
5788 staticpro (&Qhash_table_test
);
5789 Qkey_or_value
= intern ("key-or-value");
5790 staticpro (&Qkey_or_value
);
5791 Qkey_and_value
= intern ("key-and-value");
5792 staticpro (&Qkey_and_value
);
5795 defsubr (&Smake_hash_table
);
5796 defsubr (&Scopy_hash_table
);
5797 defsubr (&Shash_table_count
);
5798 defsubr (&Shash_table_rehash_size
);
5799 defsubr (&Shash_table_rehash_threshold
);
5800 defsubr (&Shash_table_size
);
5801 defsubr (&Shash_table_test
);
5802 defsubr (&Shash_table_weakness
);
5803 defsubr (&Shash_table_p
);
5804 defsubr (&Sclrhash
);
5805 defsubr (&Sgethash
);
5806 defsubr (&Sputhash
);
5807 defsubr (&Sremhash
);
5808 defsubr (&Smaphash
);
5809 defsubr (&Sdefine_hash_table_test
);
5811 Qstring_lessp
= intern ("string-lessp");
5812 staticpro (&Qstring_lessp
);
5813 Qprovide
= intern ("provide");
5814 staticpro (&Qprovide
);
5815 Qrequire
= intern ("require");
5816 staticpro (&Qrequire
);
5817 Qyes_or_no_p_history
= intern ("yes-or-no-p-history");
5818 staticpro (&Qyes_or_no_p_history
);
5819 Qcursor_in_echo_area
= intern ("cursor-in-echo-area");
5820 staticpro (&Qcursor_in_echo_area
);
5821 Qwidget_type
= intern ("widget-type");
5822 staticpro (&Qwidget_type
);
5824 staticpro (&string_char_byte_cache_string
);
5825 string_char_byte_cache_string
= Qnil
;
5827 require_nesting_list
= Qnil
;
5828 staticpro (&require_nesting_list
);
5830 Fset (Qyes_or_no_p_history
, Qnil
);
5832 DEFVAR_LISP ("features", &Vfeatures
,
5833 doc
: /* A list of symbols which are the features of the executing emacs.
5834 Used by `featurep' and `require', and altered by `provide'. */);
5836 Qsubfeatures
= intern ("subfeatures");
5837 staticpro (&Qsubfeatures
);
5839 #ifdef HAVE_LANGINFO_CODESET
5840 Qcodeset
= intern ("codeset");
5841 staticpro (&Qcodeset
);
5842 Qdays
= intern ("days");
5844 Qmonths
= intern ("months");
5845 staticpro (&Qmonths
);
5846 Qpaper
= intern ("paper");
5847 staticpro (&Qpaper
);
5848 #endif /* HAVE_LANGINFO_CODESET */
5850 DEFVAR_BOOL ("use-dialog-box", &use_dialog_box
,
5851 doc
: /* *Non-nil means mouse commands use dialog boxes to ask questions.
5852 This applies to `y-or-n-p' and `yes-or-no-p' questions asked by commands
5853 invoked by mouse clicks and mouse menu items. */);
5856 DEFVAR_BOOL ("use-file-dialog", &use_file_dialog
,
5857 doc
: /* *Non-nil means mouse commands use a file dialog to ask for files.
5858 This applies to commands from menus and tool bar buttons. The value of
5859 `use-dialog-box' takes precedence over this variable, so a file dialog is only
5860 used if both `use-dialog-box' and this variable are non-nil. */);
5861 use_file_dialog
= 1;
5863 defsubr (&Sidentity
);
5866 defsubr (&Ssafe_length
);
5867 defsubr (&Sstring_bytes
);
5868 defsubr (&Sstring_equal
);
5869 defsubr (&Scompare_strings
);
5870 defsubr (&Sstring_lessp
);
5873 defsubr (&Svconcat
);
5874 defsubr (&Scopy_sequence
);
5875 defsubr (&Sstring_make_multibyte
);
5876 defsubr (&Sstring_make_unibyte
);
5877 defsubr (&Sstring_as_multibyte
);
5878 defsubr (&Sstring_as_unibyte
);
5879 defsubr (&Sstring_to_multibyte
);
5880 defsubr (&Scopy_alist
);
5881 defsubr (&Ssubstring
);
5882 defsubr (&Ssubstring_no_properties
);
5894 defsubr (&Snreverse
);
5895 defsubr (&Sreverse
);
5897 defsubr (&Splist_get
);
5899 defsubr (&Splist_put
);
5901 defsubr (&Slax_plist_get
);
5902 defsubr (&Slax_plist_put
);
5905 defsubr (&Sequal_including_properties
);
5906 defsubr (&Sfillarray
);
5907 defsubr (&Sclear_string
);
5908 defsubr (&Schar_table_subtype
);
5909 defsubr (&Schar_table_parent
);
5910 defsubr (&Sset_char_table_parent
);
5911 defsubr (&Schar_table_extra_slot
);
5912 defsubr (&Sset_char_table_extra_slot
);
5913 defsubr (&Schar_table_range
);
5914 defsubr (&Sset_char_table_range
);
5915 defsubr (&Sset_char_table_default
);
5916 defsubr (&Soptimize_char_table
);
5917 defsubr (&Smap_char_table
);
5921 defsubr (&Smapconcat
);
5922 defsubr (&Sy_or_n_p
);
5923 defsubr (&Syes_or_no_p
);
5924 defsubr (&Sload_average
);
5925 defsubr (&Sfeaturep
);
5926 defsubr (&Srequire
);
5927 defsubr (&Sprovide
);
5928 defsubr (&Splist_member
);
5929 defsubr (&Swidget_put
);
5930 defsubr (&Swidget_get
);
5931 defsubr (&Swidget_apply
);
5932 defsubr (&Sbase64_encode_region
);
5933 defsubr (&Sbase64_decode_region
);
5934 defsubr (&Sbase64_encode_string
);
5935 defsubr (&Sbase64_decode_string
);
5937 defsubr (&Slocale_info
);
5944 Vweak_hash_tables
= Qnil
;
5947 /* arch-tag: 787f8219-5b74-46bd-8469-7e1cc475fa31
5948 (do not change this comment) */