1 /* Random utility Lisp functions.
2 Copyright (C) 1985, 86, 87, 93, 94, 95, 97, 98, 99, 2000, 2001, 02, 03, 2004
3 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
;
70 Lisp_Object Qstring_lessp
, Qprovide
, Qrequire
;
71 Lisp_Object Qyes_or_no_p_history
;
72 Lisp_Object Qcursor_in_echo_area
;
73 Lisp_Object Qwidget_type
;
74 Lisp_Object Qcodeset
, Qdays
, Qmonths
, Qpaper
;
76 extern Lisp_Object Qinput_method_function
;
78 static int internal_equal ();
80 extern long get_random ();
81 extern void seed_random ();
87 DEFUN ("identity", Fidentity
, Sidentity
, 1, 1, 0,
88 doc
: /* Return the argument unchanged. */)
95 DEFUN ("random", Frandom
, Srandom
, 0, 1, 0,
96 doc
: /* Return a pseudo-random number.
97 All integers representable in Lisp are equally likely.
98 On most systems, this is 29 bits' worth.
99 With positive integer argument N, return random number in interval [0,N).
100 With argument t, set the random number seed from the current time and pid. */)
105 Lisp_Object lispy_val
;
106 unsigned long denominator
;
109 seed_random (getpid () + time (NULL
));
110 if (NATNUMP (n
) && XFASTINT (n
) != 0)
112 /* Try to take our random number from the higher bits of VAL,
113 not the lower, since (says Gentzel) the low bits of `random'
114 are less random than the higher ones. We do this by using the
115 quotient rather than the remainder. At the high end of the RNG
116 it's possible to get a quotient larger than n; discarding
117 these values eliminates the bias that would otherwise appear
118 when using a large n. */
119 denominator
= ((unsigned long)1 << VALBITS
) / XFASTINT (n
);
121 val
= get_random () / denominator
;
122 while (val
>= XFASTINT (n
));
126 XSETINT (lispy_val
, val
);
130 /* Random data-structure functions */
132 DEFUN ("length", Flength
, Slength
, 1, 1, 0,
133 doc
: /* Return the length of vector, list or string SEQUENCE.
134 A byte-code function object is also allowed.
135 If the string contains multibyte characters, this is not necessarily
136 the number of bytes in the string; it is the number of characters.
137 To get the number of bytes, use `string-bytes'. */)
139 register Lisp_Object sequence
;
141 register Lisp_Object val
;
145 if (STRINGP (sequence
))
146 XSETFASTINT (val
, SCHARS (sequence
));
147 else if (VECTORP (sequence
))
148 XSETFASTINT (val
, XVECTOR (sequence
)->size
);
149 else if (SUB_CHAR_TABLE_P (sequence
))
150 XSETFASTINT (val
, SUB_CHAR_TABLE_ORDINARY_SLOTS
);
151 else if (CHAR_TABLE_P (sequence
))
152 XSETFASTINT (val
, MAX_CHAR
);
153 else if (BOOL_VECTOR_P (sequence
))
154 XSETFASTINT (val
, XBOOL_VECTOR (sequence
)->size
);
155 else if (COMPILEDP (sequence
))
156 XSETFASTINT (val
, XVECTOR (sequence
)->size
& PSEUDOVECTOR_SIZE_MASK
);
157 else if (CONSP (sequence
))
160 while (CONSP (sequence
))
162 sequence
= XCDR (sequence
);
165 if (!CONSP (sequence
))
168 sequence
= XCDR (sequence
);
173 if (!NILP (sequence
))
174 wrong_type_argument (Qlistp
, sequence
);
176 val
= make_number (i
);
178 else if (NILP (sequence
))
179 XSETFASTINT (val
, 0);
182 sequence
= wrong_type_argument (Qsequencep
, sequence
);
188 /* This does not check for quits. That is safe
189 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 (XCHAR_TABLE (arg
)->defalt
);
468 /* Copy all the contents. */
469 bcopy (XCHAR_TABLE (arg
)->contents
, XCHAR_TABLE (copy
)->contents
,
470 SUB_CHAR_TABLE_ORDINARY_SLOTS
* sizeof (Lisp_Object
));
471 /* Recursively copy any sub char-tables in the ordinary slots. */
472 for (i
= 32; i
< SUB_CHAR_TABLE_ORDINARY_SLOTS
; i
++)
473 if (SUB_CHAR_TABLE_P (XCHAR_TABLE (arg
)->contents
[i
]))
474 XCHAR_TABLE (copy
)->contents
[i
]
475 = copy_sub_char_table (XCHAR_TABLE (copy
)->contents
[i
]);
481 DEFUN ("copy-sequence", Fcopy_sequence
, Scopy_sequence
, 1, 1, 0,
482 doc
: /* Return a copy of a list, vector, string or char-table.
483 The elements of a list or vector are not copied; they are shared
484 with the original. */)
488 if (NILP (arg
)) return arg
;
490 if (CHAR_TABLE_P (arg
))
495 copy
= Fmake_char_table (XCHAR_TABLE (arg
)->purpose
, Qnil
);
496 /* Copy all the slots, including the extra ones. */
497 bcopy (XVECTOR (arg
)->contents
, XVECTOR (copy
)->contents
,
498 ((XCHAR_TABLE (arg
)->size
& PSEUDOVECTOR_SIZE_MASK
)
499 * sizeof (Lisp_Object
)));
501 /* Recursively copy any sub char tables in the ordinary slots
502 for multibyte characters. */
503 for (i
= CHAR_TABLE_SINGLE_BYTE_SLOTS
;
504 i
< CHAR_TABLE_ORDINARY_SLOTS
; i
++)
505 if (SUB_CHAR_TABLE_P (XCHAR_TABLE (arg
)->contents
[i
]))
506 XCHAR_TABLE (copy
)->contents
[i
]
507 = copy_sub_char_table (XCHAR_TABLE (copy
)->contents
[i
]);
512 if (BOOL_VECTOR_P (arg
))
516 = ((XBOOL_VECTOR (arg
)->size
+ BOOL_VECTOR_BITS_PER_CHAR
- 1)
517 / BOOL_VECTOR_BITS_PER_CHAR
);
519 val
= Fmake_bool_vector (Flength (arg
), Qnil
);
520 bcopy (XBOOL_VECTOR (arg
)->data
, XBOOL_VECTOR (val
)->data
,
525 if (!CONSP (arg
) && !VECTORP (arg
) && !STRINGP (arg
))
526 arg
= wrong_type_argument (Qsequencep
, arg
);
527 return concat (1, &arg
, CONSP (arg
) ? Lisp_Cons
: XTYPE (arg
), 0);
530 /* This structure holds information of an argument of `concat' that is
531 a string and has text properties to be copied. */
534 int argnum
; /* refer to ARGS (arguments of `concat') */
535 int from
; /* refer to ARGS[argnum] (argument string) */
536 int to
; /* refer to VAL (the target string) */
540 concat (nargs
, args
, target_type
, last_special
)
543 enum Lisp_Type target_type
;
547 register Lisp_Object tail
;
548 register Lisp_Object
this;
550 int toindex_byte
= 0;
551 register int result_len
;
552 register int result_len_byte
;
554 Lisp_Object last_tail
;
557 /* When we make a multibyte string, we can't copy text properties
558 while concatinating each string because the length of resulting
559 string can't be decided until we finish the whole concatination.
560 So, we record strings that have text properties to be copied
561 here, and copy the text properties after the concatination. */
562 struct textprop_rec
*textprops
= NULL
;
563 /* Number of elments in textprops. */
564 int num_textprops
= 0;
569 /* In append, the last arg isn't treated like the others */
570 if (last_special
&& nargs
> 0)
573 last_tail
= args
[nargs
];
578 /* Canonicalize each argument. */
579 for (argnum
= 0; argnum
< nargs
; argnum
++)
582 if (!(CONSP (this) || NILP (this) || VECTORP (this) || STRINGP (this)
583 || COMPILEDP (this) || BOOL_VECTOR_P (this)))
585 args
[argnum
] = wrong_type_argument (Qsequencep
, this);
589 /* Compute total length in chars of arguments in RESULT_LEN.
590 If desired output is a string, also compute length in bytes
591 in RESULT_LEN_BYTE, and determine in SOME_MULTIBYTE
592 whether the result should be a multibyte string. */
596 for (argnum
= 0; argnum
< nargs
; argnum
++)
600 len
= XFASTINT (Flength (this));
601 if (target_type
== Lisp_String
)
603 /* We must count the number of bytes needed in the string
604 as well as the number of characters. */
610 for (i
= 0; i
< len
; i
++)
612 ch
= XVECTOR (this)->contents
[i
];
614 wrong_type_argument (Qintegerp
, ch
);
615 this_len_byte
= CHAR_BYTES (XINT (ch
));
616 result_len_byte
+= this_len_byte
;
617 if (!SINGLE_BYTE_CHAR_P (XINT (ch
)))
620 else if (BOOL_VECTOR_P (this) && XBOOL_VECTOR (this)->size
> 0)
621 wrong_type_argument (Qintegerp
, Faref (this, make_number (0)));
622 else if (CONSP (this))
623 for (; CONSP (this); this = XCDR (this))
627 wrong_type_argument (Qintegerp
, ch
);
628 this_len_byte
= CHAR_BYTES (XINT (ch
));
629 result_len_byte
+= this_len_byte
;
630 if (!SINGLE_BYTE_CHAR_P (XINT (ch
)))
633 else if (STRINGP (this))
635 if (STRING_MULTIBYTE (this))
638 result_len_byte
+= SBYTES (this);
641 result_len_byte
+= count_size_as_multibyte (SDATA (this),
649 if (! some_multibyte
)
650 result_len_byte
= result_len
;
652 /* Create the output object. */
653 if (target_type
== Lisp_Cons
)
654 val
= Fmake_list (make_number (result_len
), Qnil
);
655 else if (target_type
== Lisp_Vectorlike
)
656 val
= Fmake_vector (make_number (result_len
), Qnil
);
657 else if (some_multibyte
)
658 val
= make_uninit_multibyte_string (result_len
, result_len_byte
);
660 val
= make_uninit_string (result_len
);
662 /* In `append', if all but last arg are nil, return last arg. */
663 if (target_type
== Lisp_Cons
&& EQ (val
, Qnil
))
666 /* Copy the contents of the args into the result. */
668 tail
= val
, toindex
= -1; /* -1 in toindex is flag we are making a list */
670 toindex
= 0, toindex_byte
= 0;
674 SAFE_ALLOCA (textprops
, struct textprop_rec
*, sizeof (struct textprop_rec
) * nargs
);
676 for (argnum
= 0; argnum
< nargs
; argnum
++)
680 register unsigned int thisindex
= 0;
681 register unsigned int thisindex_byte
= 0;
685 thislen
= Flength (this), thisleni
= XINT (thislen
);
687 /* Between strings of the same kind, copy fast. */
688 if (STRINGP (this) && STRINGP (val
)
689 && STRING_MULTIBYTE (this) == some_multibyte
)
691 int thislen_byte
= SBYTES (this);
693 bcopy (SDATA (this), SDATA (val
) + toindex_byte
,
695 if (! NULL_INTERVAL_P (STRING_INTERVALS (this)))
697 textprops
[num_textprops
].argnum
= argnum
;
698 textprops
[num_textprops
].from
= 0;
699 textprops
[num_textprops
++].to
= toindex
;
701 toindex_byte
+= thislen_byte
;
703 STRING_SET_CHARS (val
, SCHARS (val
));
705 /* Copy a single-byte string to a multibyte string. */
706 else if (STRINGP (this) && STRINGP (val
))
708 if (! NULL_INTERVAL_P (STRING_INTERVALS (this)))
710 textprops
[num_textprops
].argnum
= argnum
;
711 textprops
[num_textprops
].from
= 0;
712 textprops
[num_textprops
++].to
= toindex
;
714 toindex_byte
+= copy_text (SDATA (this),
715 SDATA (val
) + toindex_byte
,
716 SCHARS (this), 0, 1);
720 /* Copy element by element. */
723 register Lisp_Object elt
;
725 /* Fetch next element of `this' arg into `elt', or break if
726 `this' is exhausted. */
727 if (NILP (this)) break;
729 elt
= XCAR (this), this = XCDR (this);
730 else if (thisindex
>= thisleni
)
732 else if (STRINGP (this))
735 if (STRING_MULTIBYTE (this))
737 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c
, this,
740 XSETFASTINT (elt
, c
);
744 XSETFASTINT (elt
, SREF (this, thisindex
)); thisindex
++;
746 && (XINT (elt
) >= 0240
747 || (XINT (elt
) >= 0200
748 && ! NILP (Vnonascii_translation_table
)))
749 && XINT (elt
) < 0400)
751 c
= unibyte_char_to_multibyte (XINT (elt
));
756 else if (BOOL_VECTOR_P (this))
759 byte
= XBOOL_VECTOR (this)->data
[thisindex
/ BOOL_VECTOR_BITS_PER_CHAR
];
760 if (byte
& (1 << (thisindex
% BOOL_VECTOR_BITS_PER_CHAR
)))
767 elt
= XVECTOR (this)->contents
[thisindex
++];
769 /* Store this element into the result. */
776 else if (VECTORP (val
))
777 XVECTOR (val
)->contents
[toindex
++] = elt
;
781 if (SINGLE_BYTE_CHAR_P (XINT (elt
)))
785 += CHAR_STRING (XINT (elt
),
786 SDATA (val
) + toindex_byte
);
788 SSET (val
, toindex_byte
++, XINT (elt
));
792 /* If we have any multibyte characters,
793 we already decided to make a multibyte string. */
796 /* P exists as a variable
797 to avoid a bug on the Masscomp C compiler. */
798 unsigned char *p
= SDATA (val
) + toindex_byte
;
800 toindex_byte
+= CHAR_STRING (c
, p
);
807 XSETCDR (prev
, last_tail
);
809 if (num_textprops
> 0)
812 int last_to_end
= -1;
814 for (argnum
= 0; argnum
< num_textprops
; argnum
++)
816 this = args
[textprops
[argnum
].argnum
];
817 props
= text_property_list (this,
819 make_number (SCHARS (this)),
821 /* If successive arguments have properites, be sure that the
822 value of `composition' property be the copy. */
823 if (last_to_end
== textprops
[argnum
].to
)
824 make_composition_value_copy (props
);
825 add_text_properties_from_list (val
, props
,
826 make_number (textprops
[argnum
].to
));
827 last_to_end
= textprops
[argnum
].to
+ SCHARS (this);
835 static Lisp_Object string_char_byte_cache_string
;
836 static int string_char_byte_cache_charpos
;
837 static int string_char_byte_cache_bytepos
;
840 clear_string_char_byte_cache ()
842 string_char_byte_cache_string
= Qnil
;
845 /* Return the character index corresponding to CHAR_INDEX in STRING. */
848 string_char_to_byte (string
, char_index
)
853 int best_below
, best_below_byte
;
854 int best_above
, best_above_byte
;
856 best_below
= best_below_byte
= 0;
857 best_above
= SCHARS (string
);
858 best_above_byte
= SBYTES (string
);
859 if (best_above
== best_above_byte
)
862 if (EQ (string
, string_char_byte_cache_string
))
864 if (string_char_byte_cache_charpos
< char_index
)
866 best_below
= string_char_byte_cache_charpos
;
867 best_below_byte
= string_char_byte_cache_bytepos
;
871 best_above
= string_char_byte_cache_charpos
;
872 best_above_byte
= string_char_byte_cache_bytepos
;
876 if (char_index
- best_below
< best_above
- char_index
)
878 while (best_below
< char_index
)
881 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c
, string
,
882 best_below
, best_below_byte
);
885 i_byte
= best_below_byte
;
889 while (best_above
> char_index
)
891 unsigned char *pend
= SDATA (string
) + best_above_byte
;
892 unsigned char *pbeg
= pend
- best_above_byte
;
893 unsigned char *p
= pend
- 1;
896 while (p
> pbeg
&& !CHAR_HEAD_P (*p
)) p
--;
897 PARSE_MULTIBYTE_SEQ (p
, pend
- p
, bytes
);
898 if (bytes
== pend
- p
)
899 best_above_byte
-= bytes
;
900 else if (bytes
> pend
- p
)
901 best_above_byte
-= (pend
- p
);
907 i_byte
= best_above_byte
;
910 string_char_byte_cache_bytepos
= i_byte
;
911 string_char_byte_cache_charpos
= i
;
912 string_char_byte_cache_string
= string
;
917 /* Return the character index corresponding to BYTE_INDEX in STRING. */
920 string_byte_to_char (string
, byte_index
)
925 int best_below
, best_below_byte
;
926 int best_above
, best_above_byte
;
928 best_below
= best_below_byte
= 0;
929 best_above
= SCHARS (string
);
930 best_above_byte
= SBYTES (string
);
931 if (best_above
== best_above_byte
)
934 if (EQ (string
, string_char_byte_cache_string
))
936 if (string_char_byte_cache_bytepos
< byte_index
)
938 best_below
= string_char_byte_cache_charpos
;
939 best_below_byte
= string_char_byte_cache_bytepos
;
943 best_above
= string_char_byte_cache_charpos
;
944 best_above_byte
= string_char_byte_cache_bytepos
;
948 if (byte_index
- best_below_byte
< best_above_byte
- byte_index
)
950 while (best_below_byte
< byte_index
)
953 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c
, string
,
954 best_below
, best_below_byte
);
957 i_byte
= best_below_byte
;
961 while (best_above_byte
> byte_index
)
963 unsigned char *pend
= SDATA (string
) + best_above_byte
;
964 unsigned char *pbeg
= pend
- best_above_byte
;
965 unsigned char *p
= pend
- 1;
968 while (p
> pbeg
&& !CHAR_HEAD_P (*p
)) p
--;
969 PARSE_MULTIBYTE_SEQ (p
, pend
- p
, bytes
);
970 if (bytes
== pend
- p
)
971 best_above_byte
-= bytes
;
972 else if (bytes
> pend
- p
)
973 best_above_byte
-= (pend
- p
);
979 i_byte
= best_above_byte
;
982 string_char_byte_cache_bytepos
= i_byte
;
983 string_char_byte_cache_charpos
= i
;
984 string_char_byte_cache_string
= string
;
989 /* Convert STRING to a multibyte string.
990 Single-byte characters 0240 through 0377 are converted
991 by adding nonascii_insert_offset to each. */
994 string_make_multibyte (string
)
1002 if (STRING_MULTIBYTE (string
))
1005 nbytes
= count_size_as_multibyte (SDATA (string
),
1007 /* If all the chars are ASCII, they won't need any more bytes
1008 once converted. In that case, we can return STRING itself. */
1009 if (nbytes
== SBYTES (string
))
1012 SAFE_ALLOCA (buf
, unsigned char *, nbytes
);
1013 copy_text (SDATA (string
), buf
, SBYTES (string
),
1016 ret
= make_multibyte_string (buf
, SCHARS (string
), nbytes
);
1023 /* Convert STRING to a multibyte string without changing each
1024 character codes. Thus, characters 0200 trough 0237 are converted
1025 to eight-bit-control characters, and characters 0240 through 0377
1026 are converted eight-bit-graphic characters. */
1029 string_to_multibyte (string
)
1037 if (STRING_MULTIBYTE (string
))
1040 nbytes
= parse_str_to_multibyte (SDATA (string
), SBYTES (string
));
1041 /* If all the chars are ASCII or eight-bit-graphic, they won't need
1042 any more bytes once converted. */
1043 if (nbytes
== SBYTES (string
))
1044 return make_multibyte_string (SDATA (string
), nbytes
, nbytes
);
1046 SAFE_ALLOCA (buf
, unsigned char *, nbytes
);
1047 bcopy (SDATA (string
), buf
, SBYTES (string
));
1048 str_to_multibyte (buf
, nbytes
, SBYTES (string
));
1050 ret
= make_multibyte_string (buf
, SCHARS (string
), nbytes
);
1057 /* Convert STRING to a single-byte string. */
1060 string_make_unibyte (string
)
1068 if (! STRING_MULTIBYTE (string
))
1071 nchars
= SCHARS (string
);
1073 SAFE_ALLOCA (buf
, unsigned char *, nchars
);
1074 copy_text (SDATA (string
), buf
, SBYTES (string
),
1077 ret
= make_unibyte_string (buf
, nchars
);
1083 DEFUN ("string-make-multibyte", Fstring_make_multibyte
, Sstring_make_multibyte
,
1085 doc
: /* Return the multibyte equivalent of STRING.
1086 If STRING is unibyte and contains non-ASCII characters, the function
1087 `unibyte-char-to-multibyte' is used to convert each unibyte character
1088 to a multibyte character. In this case, the returned string is a
1089 newly created string with no text properties. If STRING is multibyte
1090 or entirely ASCII, it is returned unchanged. In particular, when
1091 STRING is unibyte and entirely ASCII, the returned string is unibyte.
1092 \(When the characters are all ASCII, Emacs primitives will treat the
1093 string the same way whether it is unibyte or multibyte.) */)
1097 CHECK_STRING (string
);
1099 return string_make_multibyte (string
);
1102 DEFUN ("string-make-unibyte", Fstring_make_unibyte
, Sstring_make_unibyte
,
1104 doc
: /* Return the unibyte equivalent of STRING.
1105 Multibyte character codes are converted to unibyte according to
1106 `nonascii-translation-table' or, if that is nil, `nonascii-insert-offset'.
1107 If the lookup in the translation table fails, this function takes just
1108 the low 8 bits of each character. */)
1112 CHECK_STRING (string
);
1114 return string_make_unibyte (string
);
1117 DEFUN ("string-as-unibyte", Fstring_as_unibyte
, Sstring_as_unibyte
,
1119 doc
: /* Return a unibyte string with the same individual bytes as STRING.
1120 If STRING is unibyte, the result is STRING itself.
1121 Otherwise it is a newly created string, with no text properties.
1122 If STRING is multibyte and contains a character of charset
1123 `eight-bit-control' or `eight-bit-graphic', it is converted to the
1124 corresponding single byte. */)
1128 CHECK_STRING (string
);
1130 if (STRING_MULTIBYTE (string
))
1132 int bytes
= SBYTES (string
);
1133 unsigned char *str
= (unsigned char *) xmalloc (bytes
);
1135 bcopy (SDATA (string
), str
, bytes
);
1136 bytes
= str_as_unibyte (str
, bytes
);
1137 string
= make_unibyte_string (str
, bytes
);
1143 DEFUN ("string-as-multibyte", Fstring_as_multibyte
, Sstring_as_multibyte
,
1145 doc
: /* Return a multibyte string with the same individual bytes as STRING.
1146 If STRING is multibyte, the result is STRING itself.
1147 Otherwise it is a newly created string, with no text properties.
1148 If STRING is unibyte and contains an individual 8-bit byte (i.e. not
1149 part of a multibyte form), it is converted to the corresponding
1150 multibyte character of charset `eight-bit-control' or `eight-bit-graphic'. */)
1154 CHECK_STRING (string
);
1156 if (! STRING_MULTIBYTE (string
))
1158 Lisp_Object new_string
;
1161 parse_str_as_multibyte (SDATA (string
),
1164 new_string
= make_uninit_multibyte_string (nchars
, nbytes
);
1165 bcopy (SDATA (string
), SDATA (new_string
),
1167 if (nbytes
!= SBYTES (string
))
1168 str_as_multibyte (SDATA (new_string
), nbytes
,
1169 SBYTES (string
), NULL
);
1170 string
= new_string
;
1171 STRING_SET_INTERVALS (string
, NULL_INTERVAL
);
1176 DEFUN ("string-to-multibyte", Fstring_to_multibyte
, Sstring_to_multibyte
,
1178 doc
: /* Return a multibyte string with the same individual chars as STRING.
1179 If STRING is multibyte, the result is STRING itself.
1180 Otherwise it is a newly created string, with no text properties.
1181 Characters 0200 through 0237 are converted to eight-bit-control
1182 characters of the same character code. Characters 0240 through 0377
1183 are converted to eight-bit-graphic characters of the same character
1188 CHECK_STRING (string
);
1190 return string_to_multibyte (string
);
1194 DEFUN ("copy-alist", Fcopy_alist
, Scopy_alist
, 1, 1, 0,
1195 doc
: /* Return a copy of ALIST.
1196 This is an alist which represents the same mapping from objects to objects,
1197 but does not share the alist structure with ALIST.
1198 The objects mapped (cars and cdrs of elements of the alist)
1199 are shared, however.
1200 Elements of ALIST that are not conses are also shared. */)
1204 register Lisp_Object tem
;
1209 alist
= concat (1, &alist
, Lisp_Cons
, 0);
1210 for (tem
= alist
; CONSP (tem
); tem
= XCDR (tem
))
1212 register Lisp_Object car
;
1216 XSETCAR (tem
, Fcons (XCAR (car
), XCDR (car
)));
1221 DEFUN ("substring", Fsubstring
, Ssubstring
, 2, 3, 0,
1222 doc
: /* Return a substring of STRING, starting at index FROM and ending before TO.
1223 TO may be nil or omitted; then the substring runs to the end of STRING.
1224 FROM and TO start at 0. If either is negative, it counts from the end.
1226 This function allows vectors as well as strings. */)
1229 register Lisp_Object from
, to
;
1234 int from_char
, to_char
;
1235 int from_byte
= 0, to_byte
= 0;
1237 if (! (STRINGP (string
) || VECTORP (string
)))
1238 wrong_type_argument (Qarrayp
, string
);
1240 CHECK_NUMBER (from
);
1242 if (STRINGP (string
))
1244 size
= SCHARS (string
);
1245 size_byte
= SBYTES (string
);
1248 size
= XVECTOR (string
)->size
;
1253 to_byte
= size_byte
;
1259 to_char
= XINT (to
);
1263 if (STRINGP (string
))
1264 to_byte
= string_char_to_byte (string
, to_char
);
1267 from_char
= XINT (from
);
1270 if (STRINGP (string
))
1271 from_byte
= string_char_to_byte (string
, from_char
);
1273 if (!(0 <= from_char
&& from_char
<= to_char
&& to_char
<= size
))
1274 args_out_of_range_3 (string
, make_number (from_char
),
1275 make_number (to_char
));
1277 if (STRINGP (string
))
1279 res
= make_specified_string (SDATA (string
) + from_byte
,
1280 to_char
- from_char
, to_byte
- from_byte
,
1281 STRING_MULTIBYTE (string
));
1282 copy_text_properties (make_number (from_char
), make_number (to_char
),
1283 string
, make_number (0), res
, Qnil
);
1286 res
= Fvector (to_char
- from_char
,
1287 XVECTOR (string
)->contents
+ from_char
);
1293 DEFUN ("substring-no-properties", Fsubstring_no_properties
, Ssubstring_no_properties
, 1, 3, 0,
1294 doc
: /* Return a substring of STRING, without text properties.
1295 It starts at index FROM and ending before TO.
1296 TO may be nil or omitted; then the substring runs to the end of STRING.
1297 If FROM is nil or omitted, the substring starts at the beginning of STRING.
1298 If FROM or TO is negative, it counts from the end.
1300 With one argument, just copy STRING without its properties. */)
1303 register Lisp_Object from
, to
;
1305 int size
, size_byte
;
1306 int from_char
, to_char
;
1307 int from_byte
, to_byte
;
1309 CHECK_STRING (string
);
1311 size
= SCHARS (string
);
1312 size_byte
= SBYTES (string
);
1315 from_char
= from_byte
= 0;
1318 CHECK_NUMBER (from
);
1319 from_char
= XINT (from
);
1323 from_byte
= string_char_to_byte (string
, from_char
);
1329 to_byte
= size_byte
;
1335 to_char
= XINT (to
);
1339 to_byte
= string_char_to_byte (string
, to_char
);
1342 if (!(0 <= from_char
&& from_char
<= to_char
&& to_char
<= size
))
1343 args_out_of_range_3 (string
, make_number (from_char
),
1344 make_number (to_char
));
1346 return make_specified_string (SDATA (string
) + from_byte
,
1347 to_char
- from_char
, to_byte
- from_byte
,
1348 STRING_MULTIBYTE (string
));
1351 /* Extract a substring of STRING, giving start and end positions
1352 both in characters and in bytes. */
1355 substring_both (string
, from
, from_byte
, to
, to_byte
)
1357 int from
, from_byte
, to
, to_byte
;
1363 if (! (STRINGP (string
) || VECTORP (string
)))
1364 wrong_type_argument (Qarrayp
, string
);
1366 if (STRINGP (string
))
1368 size
= SCHARS (string
);
1369 size_byte
= SBYTES (string
);
1372 size
= XVECTOR (string
)->size
;
1374 if (!(0 <= from
&& from
<= to
&& to
<= size
))
1375 args_out_of_range_3 (string
, make_number (from
), make_number (to
));
1377 if (STRINGP (string
))
1379 res
= make_specified_string (SDATA (string
) + from_byte
,
1380 to
- from
, to_byte
- from_byte
,
1381 STRING_MULTIBYTE (string
));
1382 copy_text_properties (make_number (from
), make_number (to
),
1383 string
, make_number (0), res
, Qnil
);
1386 res
= Fvector (to
- from
,
1387 XVECTOR (string
)->contents
+ from
);
1392 DEFUN ("nthcdr", Fnthcdr
, Snthcdr
, 2, 2, 0,
1393 doc
: /* Take cdr N times on LIST, returns the result. */)
1396 register Lisp_Object list
;
1398 register int i
, num
;
1401 for (i
= 0; i
< num
&& !NILP (list
); i
++)
1405 wrong_type_argument (Qlistp
, list
);
1411 DEFUN ("nth", Fnth
, Snth
, 2, 2, 0,
1412 doc
: /* Return the Nth element of LIST.
1413 N counts from zero. If LIST is not that long, nil is returned. */)
1415 Lisp_Object n
, list
;
1417 return Fcar (Fnthcdr (n
, list
));
1420 DEFUN ("elt", Felt
, Selt
, 2, 2, 0,
1421 doc
: /* Return element of SEQUENCE at index N. */)
1423 register Lisp_Object sequence
, n
;
1428 if (CONSP (sequence
) || NILP (sequence
))
1429 return Fcar (Fnthcdr (n
, sequence
));
1430 else if (STRINGP (sequence
) || VECTORP (sequence
)
1431 || BOOL_VECTOR_P (sequence
) || CHAR_TABLE_P (sequence
))
1432 return Faref (sequence
, n
);
1434 sequence
= wrong_type_argument (Qsequencep
, sequence
);
1438 DEFUN ("member", Fmember
, Smember
, 2, 2, 0,
1439 doc
: /* Return non-nil if ELT is an element of LIST. Comparison done with `equal'.
1440 The value is actually the tail of LIST whose car is ELT. */)
1442 register Lisp_Object elt
;
1445 register Lisp_Object tail
;
1446 for (tail
= list
; !NILP (tail
); tail
= XCDR (tail
))
1448 register Lisp_Object tem
;
1450 wrong_type_argument (Qlistp
, list
);
1452 if (! NILP (Fequal (elt
, tem
)))
1459 DEFUN ("memq", Fmemq
, Smemq
, 2, 2, 0,
1460 doc
: /* Return non-nil if ELT is an element of LIST.
1461 Comparison done with EQ. The value is actually the tail of LIST
1462 whose car is ELT. */)
1464 Lisp_Object elt
, list
;
1468 if (!CONSP (list
) || EQ (XCAR (list
), elt
))
1472 if (!CONSP (list
) || EQ (XCAR (list
), elt
))
1476 if (!CONSP (list
) || EQ (XCAR (list
), elt
))
1483 if (!CONSP (list
) && !NILP (list
))
1484 list
= wrong_type_argument (Qlistp
, list
);
1489 DEFUN ("assq", Fassq
, Sassq
, 2, 2, 0,
1490 doc
: /* Return non-nil if KEY is `eq' to the car of an element of LIST.
1491 The value is actually the first element of LIST whose car is KEY.
1492 Elements of LIST that are not conses are ignored. */)
1494 Lisp_Object key
, list
;
1501 || (CONSP (XCAR (list
))
1502 && EQ (XCAR (XCAR (list
)), key
)))
1507 || (CONSP (XCAR (list
))
1508 && EQ (XCAR (XCAR (list
)), key
)))
1513 || (CONSP (XCAR (list
))
1514 && EQ (XCAR (XCAR (list
)), key
)))
1522 result
= XCAR (list
);
1523 else if (NILP (list
))
1526 result
= wrong_type_argument (Qlistp
, list
);
1531 /* Like Fassq but never report an error and do not allow quits.
1532 Use only on lists known never to be circular. */
1535 assq_no_quit (key
, list
)
1536 Lisp_Object key
, list
;
1539 && (!CONSP (XCAR (list
))
1540 || !EQ (XCAR (XCAR (list
)), key
)))
1543 return CONSP (list
) ? XCAR (list
) : Qnil
;
1546 DEFUN ("assoc", Fassoc
, Sassoc
, 2, 2, 0,
1547 doc
: /* Return non-nil if KEY is `equal' to the car of an element of LIST.
1548 The value is actually the first element of LIST whose car equals KEY. */)
1550 Lisp_Object key
, list
;
1552 Lisp_Object result
, car
;
1557 || (CONSP (XCAR (list
))
1558 && (car
= XCAR (XCAR (list
)),
1559 EQ (car
, key
) || !NILP (Fequal (car
, key
)))))
1564 || (CONSP (XCAR (list
))
1565 && (car
= XCAR (XCAR (list
)),
1566 EQ (car
, key
) || !NILP (Fequal (car
, key
)))))
1571 || (CONSP (XCAR (list
))
1572 && (car
= XCAR (XCAR (list
)),
1573 EQ (car
, key
) || !NILP (Fequal (car
, key
)))))
1581 result
= XCAR (list
);
1582 else if (NILP (list
))
1585 result
= wrong_type_argument (Qlistp
, list
);
1590 DEFUN ("rassq", Frassq
, Srassq
, 2, 2, 0,
1591 doc
: /* Return non-nil if KEY is `eq' to the cdr of an element of LIST.
1592 The value is actually the first element of LIST whose cdr is KEY. */)
1594 register Lisp_Object key
;
1602 || (CONSP (XCAR (list
))
1603 && EQ (XCDR (XCAR (list
)), key
)))
1608 || (CONSP (XCAR (list
))
1609 && EQ (XCDR (XCAR (list
)), key
)))
1614 || (CONSP (XCAR (list
))
1615 && EQ (XCDR (XCAR (list
)), key
)))
1624 else if (CONSP (list
))
1625 result
= XCAR (list
);
1627 result
= wrong_type_argument (Qlistp
, list
);
1632 DEFUN ("rassoc", Frassoc
, Srassoc
, 2, 2, 0,
1633 doc
: /* Return non-nil if KEY is `equal' to the cdr of an element of LIST.
1634 The value is actually the first element of LIST whose cdr equals KEY. */)
1636 Lisp_Object key
, list
;
1638 Lisp_Object result
, cdr
;
1643 || (CONSP (XCAR (list
))
1644 && (cdr
= XCDR (XCAR (list
)),
1645 EQ (cdr
, key
) || !NILP (Fequal (cdr
, key
)))))
1650 || (CONSP (XCAR (list
))
1651 && (cdr
= XCDR (XCAR (list
)),
1652 EQ (cdr
, key
) || !NILP (Fequal (cdr
, key
)))))
1657 || (CONSP (XCAR (list
))
1658 && (cdr
= XCDR (XCAR (list
)),
1659 EQ (cdr
, key
) || !NILP (Fequal (cdr
, key
)))))
1667 result
= XCAR (list
);
1668 else if (NILP (list
))
1671 result
= wrong_type_argument (Qlistp
, list
);
1676 DEFUN ("delq", Fdelq
, Sdelq
, 2, 2, 0,
1677 doc
: /* Delete by side effect any occurrences of ELT as a member of LIST.
1678 The modified LIST is returned. Comparison is done with `eq'.
1679 If the first member of LIST is ELT, there is no way to remove it by side effect;
1680 therefore, write `(setq foo (delq element foo))'
1681 to be sure of changing the value of `foo'. */)
1683 register Lisp_Object elt
;
1686 register Lisp_Object tail
, prev
;
1687 register Lisp_Object tem
;
1691 while (!NILP (tail
))
1694 wrong_type_argument (Qlistp
, list
);
1701 Fsetcdr (prev
, XCDR (tail
));
1711 DEFUN ("delete", Fdelete
, Sdelete
, 2, 2, 0,
1712 doc
: /* Delete by side effect any occurrences of ELT as a member of SEQ.
1713 SEQ must be a list, a vector, or a string.
1714 The modified SEQ is returned. Comparison is done with `equal'.
1715 If SEQ is not a list, or the first member of SEQ is ELT, deleting it
1716 is not a side effect; it is simply using a different sequence.
1717 Therefore, write `(setq foo (delete element foo))'
1718 to be sure of changing the value of `foo'. */)
1720 Lisp_Object elt
, seq
;
1726 for (i
= n
= 0; i
< ASIZE (seq
); ++i
)
1727 if (NILP (Fequal (AREF (seq
, i
), elt
)))
1730 if (n
!= ASIZE (seq
))
1732 struct Lisp_Vector
*p
= allocate_vector (n
);
1734 for (i
= n
= 0; i
< ASIZE (seq
); ++i
)
1735 if (NILP (Fequal (AREF (seq
, i
), elt
)))
1736 p
->contents
[n
++] = AREF (seq
, i
);
1738 XSETVECTOR (seq
, p
);
1741 else if (STRINGP (seq
))
1743 EMACS_INT i
, ibyte
, nchars
, nbytes
, cbytes
;
1746 for (i
= nchars
= nbytes
= ibyte
= 0;
1748 ++i
, ibyte
+= cbytes
)
1750 if (STRING_MULTIBYTE (seq
))
1752 c
= STRING_CHAR (SDATA (seq
) + ibyte
,
1753 SBYTES (seq
) - ibyte
);
1754 cbytes
= CHAR_BYTES (c
);
1762 if (!INTEGERP (elt
) || c
!= XINT (elt
))
1769 if (nchars
!= SCHARS (seq
))
1773 tem
= make_uninit_multibyte_string (nchars
, nbytes
);
1774 if (!STRING_MULTIBYTE (seq
))
1775 STRING_SET_UNIBYTE (tem
);
1777 for (i
= nchars
= nbytes
= ibyte
= 0;
1779 ++i
, ibyte
+= cbytes
)
1781 if (STRING_MULTIBYTE (seq
))
1783 c
= STRING_CHAR (SDATA (seq
) + ibyte
,
1784 SBYTES (seq
) - ibyte
);
1785 cbytes
= CHAR_BYTES (c
);
1793 if (!INTEGERP (elt
) || c
!= XINT (elt
))
1795 unsigned char *from
= SDATA (seq
) + ibyte
;
1796 unsigned char *to
= SDATA (tem
) + nbytes
;
1802 for (n
= cbytes
; n
--; )
1812 Lisp_Object tail
, prev
;
1814 for (tail
= seq
, prev
= Qnil
; !NILP (tail
); tail
= XCDR (tail
))
1817 wrong_type_argument (Qlistp
, seq
);
1819 if (!NILP (Fequal (elt
, XCAR (tail
))))
1824 Fsetcdr (prev
, XCDR (tail
));
1835 DEFUN ("nreverse", Fnreverse
, Snreverse
, 1, 1, 0,
1836 doc
: /* Reverse LIST by modifying cdr pointers.
1837 Return the reversed list. */)
1841 register Lisp_Object prev
, tail
, next
;
1843 if (NILP (list
)) return list
;
1846 while (!NILP (tail
))
1850 wrong_type_argument (Qlistp
, list
);
1852 Fsetcdr (tail
, prev
);
1859 DEFUN ("reverse", Freverse
, Sreverse
, 1, 1, 0,
1860 doc
: /* Reverse LIST, copying. Return the reversed list.
1861 See also the function `nreverse', which is used more often. */)
1867 for (new = Qnil
; CONSP (list
); list
= XCDR (list
))
1870 new = Fcons (XCAR (list
), new);
1873 wrong_type_argument (Qconsp
, list
);
1877 Lisp_Object
merge ();
1879 DEFUN ("sort", Fsort
, Ssort
, 2, 2, 0,
1880 doc
: /* Sort LIST, stably, comparing elements using PREDICATE.
1881 Returns the sorted list. LIST is modified by side effects.
1882 PREDICATE is called with two elements of LIST, and should return t
1883 if the first element is "less" than the second. */)
1885 Lisp_Object list
, predicate
;
1887 Lisp_Object front
, back
;
1888 register Lisp_Object len
, tem
;
1889 struct gcpro gcpro1
, gcpro2
;
1890 register int length
;
1893 len
= Flength (list
);
1894 length
= XINT (len
);
1898 XSETINT (len
, (length
/ 2) - 1);
1899 tem
= Fnthcdr (len
, list
);
1901 Fsetcdr (tem
, Qnil
);
1903 GCPRO2 (front
, back
);
1904 front
= Fsort (front
, predicate
);
1905 back
= Fsort (back
, predicate
);
1907 return merge (front
, back
, predicate
);
1911 merge (org_l1
, org_l2
, pred
)
1912 Lisp_Object org_l1
, org_l2
;
1916 register Lisp_Object tail
;
1918 register Lisp_Object l1
, l2
;
1919 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
;
1926 /* It is sufficient to protect org_l1 and org_l2.
1927 When l1 and l2 are updated, we copy the new values
1928 back into the org_ vars. */
1929 GCPRO4 (org_l1
, org_l2
, pred
, value
);
1949 tem
= call2 (pred
, Fcar (l2
), Fcar (l1
));
1965 Fsetcdr (tail
, tem
);
1971 DEFUN ("plist-get", Fplist_get
, Splist_get
, 2, 2, 0,
1972 doc
: /* Extract a value from a property list.
1973 PLIST is a property list, which is a list of the form
1974 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value
1975 corresponding to the given PROP, or nil if PROP is not
1976 one of the properties on the list. */)
1984 CONSP (tail
) && CONSP (XCDR (tail
));
1985 tail
= XCDR (XCDR (tail
)))
1987 if (EQ (prop
, XCAR (tail
)))
1988 return XCAR (XCDR (tail
));
1990 /* This function can be called asynchronously
1991 (setup_coding_system). Don't QUIT in that case. */
1992 if (!interrupt_input_blocked
)
1997 wrong_type_argument (Qlistp
, prop
);
2002 DEFUN ("safe-plist-get", Fsafe_plist_get
, Ssafe_plist_get
, 2, 2, 0,
2003 doc
: /* Extract a value from a property list.
2004 PLIST is a property list, which is a list of the form
2005 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value
2006 corresponding to the given PROP, or nil if PROP is not
2007 one of the properties on the list.
2008 This function never signals an error. */)
2013 Lisp_Object tail
, halftail
;
2015 /* halftail is used to detect circular lists. */
2016 tail
= halftail
= plist
;
2017 while (CONSP (tail
) && CONSP (XCDR (tail
)))
2019 if (EQ (prop
, XCAR (tail
)))
2020 return XCAR (XCDR (tail
));
2022 tail
= XCDR (XCDR (tail
));
2023 halftail
= XCDR (halftail
);
2024 if (EQ (tail
, halftail
))
2031 DEFUN ("get", Fget
, Sget
, 2, 2, 0,
2032 doc
: /* Return the value of SYMBOL's PROPNAME property.
2033 This is the last value stored with `(put SYMBOL PROPNAME VALUE)'. */)
2035 Lisp_Object symbol
, propname
;
2037 CHECK_SYMBOL (symbol
);
2038 return Fplist_get (XSYMBOL (symbol
)->plist
, propname
);
2041 DEFUN ("plist-put", Fplist_put
, Splist_put
, 3, 3, 0,
2042 doc
: /* Change value in PLIST of PROP to VAL.
2043 PLIST is a property list, which is a list of the form
2044 \(PROP1 VALUE1 PROP2 VALUE2 ...). PROP is a symbol and VAL is any object.
2045 If PROP is already a property on the list, its value is set to VAL,
2046 otherwise the new PROP VAL pair is added. The new plist is returned;
2047 use `(setq x (plist-put x prop val))' to be sure to use the new value.
2048 The PLIST is modified by side effects. */)
2051 register Lisp_Object prop
;
2054 register Lisp_Object tail
, prev
;
2055 Lisp_Object newcell
;
2057 for (tail
= plist
; CONSP (tail
) && CONSP (XCDR (tail
));
2058 tail
= XCDR (XCDR (tail
)))
2060 if (EQ (prop
, XCAR (tail
)))
2062 Fsetcar (XCDR (tail
), val
);
2069 newcell
= Fcons (prop
, Fcons (val
, Qnil
));
2073 Fsetcdr (XCDR (prev
), newcell
);
2077 DEFUN ("put", Fput
, Sput
, 3, 3, 0,
2078 doc
: /* Store SYMBOL's PROPNAME property with value VALUE.
2079 It can be retrieved with `(get SYMBOL PROPNAME)'. */)
2080 (symbol
, propname
, value
)
2081 Lisp_Object symbol
, propname
, value
;
2083 CHECK_SYMBOL (symbol
);
2084 XSYMBOL (symbol
)->plist
2085 = Fplist_put (XSYMBOL (symbol
)->plist
, propname
, value
);
2089 DEFUN ("lax-plist-get", Flax_plist_get
, Slax_plist_get
, 2, 2, 0,
2090 doc
: /* Extract a value from a property list, comparing with `equal'.
2091 PLIST is a property list, which is a list of the form
2092 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value
2093 corresponding to the given PROP, or nil if PROP is not
2094 one of the properties on the list. */)
2102 CONSP (tail
) && CONSP (XCDR (tail
));
2103 tail
= XCDR (XCDR (tail
)))
2105 if (! NILP (Fequal (prop
, XCAR (tail
))))
2106 return XCAR (XCDR (tail
));
2112 wrong_type_argument (Qlistp
, prop
);
2117 DEFUN ("lax-plist-put", Flax_plist_put
, Slax_plist_put
, 3, 3, 0,
2118 doc
: /* Change value in PLIST of PROP to VAL, comparing with `equal'.
2119 PLIST is a property list, which is a list of the form
2120 \(PROP1 VALUE1 PROP2 VALUE2 ...). PROP and VAL are any objects.
2121 If PROP is already a property on the list, its value is set to VAL,
2122 otherwise the new PROP VAL pair is added. The new plist is returned;
2123 use `(setq x (lax-plist-put x prop val))' to be sure to use the new value.
2124 The PLIST is modified by side effects. */)
2127 register Lisp_Object prop
;
2130 register Lisp_Object tail
, prev
;
2131 Lisp_Object newcell
;
2133 for (tail
= plist
; CONSP (tail
) && CONSP (XCDR (tail
));
2134 tail
= XCDR (XCDR (tail
)))
2136 if (! NILP (Fequal (prop
, XCAR (tail
))))
2138 Fsetcar (XCDR (tail
), val
);
2145 newcell
= Fcons (prop
, Fcons (val
, Qnil
));
2149 Fsetcdr (XCDR (prev
), newcell
);
2153 DEFUN ("eql", Feql
, Seql
, 2, 2, 0,
2154 doc
: /* Return t if the two args are the same Lisp object.
2155 Floating-point numbers of equal value are `eql', but they may not be `eq'. */)
2157 Lisp_Object obj1
, obj2
;
2160 return internal_equal (obj1
, obj2
, 0, 0) ? Qt
: Qnil
;
2162 return EQ (obj1
, obj2
) ? Qt
: Qnil
;
2165 DEFUN ("equal", Fequal
, Sequal
, 2, 2, 0,
2166 doc
: /* Return t if two Lisp objects have similar structure and contents.
2167 They must have the same data type.
2168 Conses are compared by comparing the cars and the cdrs.
2169 Vectors and strings are compared element by element.
2170 Numbers are compared by value, but integers cannot equal floats.
2171 (Use `=' if you want integers and floats to be able to be equal.)
2172 Symbols must match exactly. */)
2174 register Lisp_Object o1
, o2
;
2176 return internal_equal (o1
, o2
, 0, 0) ? Qt
: Qnil
;
2179 DEFUN ("equal-including-properties", Fequal_including_properties
, Sequal_including_properties
, 2, 2, 0,
2180 doc
: /* Return t if two Lisp objects have similar structure and contents.
2181 This is like `equal' except that it compares the text properties
2182 of strings. (`equal' ignores text properties.) */)
2184 register Lisp_Object o1
, o2
;
2186 return internal_equal (o1
, o2
, 0, 1) ? Qt
: Qnil
;
2189 /* DEPTH is current depth of recursion. Signal an error if it
2191 PROPS, if non-nil, means compare string text properties too. */
2194 internal_equal (o1
, o2
, depth
, props
)
2195 register Lisp_Object o1
, o2
;
2199 error ("Stack overflow in equal");
2205 if (XTYPE (o1
) != XTYPE (o2
))
2214 d1
= extract_float (o1
);
2215 d2
= extract_float (o2
);
2216 /* If d is a NaN, then d != d. Two NaNs should be `equal' even
2217 though they are not =. */
2218 return d1
== d2
|| (d1
!= d1
&& d2
!= d2
);
2222 if (!internal_equal (XCAR (o1
), XCAR (o2
), depth
+ 1, props
))
2229 if (XMISCTYPE (o1
) != XMISCTYPE (o2
))
2233 if (!internal_equal (OVERLAY_START (o1
), OVERLAY_START (o2
),
2235 || !internal_equal (OVERLAY_END (o1
), OVERLAY_END (o2
),
2238 o1
= XOVERLAY (o1
)->plist
;
2239 o2
= XOVERLAY (o2
)->plist
;
2244 return (XMARKER (o1
)->buffer
== XMARKER (o2
)->buffer
2245 && (XMARKER (o1
)->buffer
== 0
2246 || XMARKER (o1
)->bytepos
== XMARKER (o2
)->bytepos
));
2250 case Lisp_Vectorlike
:
2253 EMACS_INT size
= XVECTOR (o1
)->size
;
2254 /* Pseudovectors have the type encoded in the size field, so this test
2255 actually checks that the objects have the same type as well as the
2257 if (XVECTOR (o2
)->size
!= size
)
2259 /* Boolvectors are compared much like strings. */
2260 if (BOOL_VECTOR_P (o1
))
2263 = ((XBOOL_VECTOR (o1
)->size
+ BOOL_VECTOR_BITS_PER_CHAR
- 1)
2264 / BOOL_VECTOR_BITS_PER_CHAR
);
2266 if (XBOOL_VECTOR (o1
)->size
!= XBOOL_VECTOR (o2
)->size
)
2268 if (bcmp (XBOOL_VECTOR (o1
)->data
, XBOOL_VECTOR (o2
)->data
,
2273 if (WINDOW_CONFIGURATIONP (o1
))
2274 return compare_window_configurations (o1
, o2
, 0);
2276 /* Aside from them, only true vectors, char-tables, and compiled
2277 functions are sensible to compare, so eliminate the others now. */
2278 if (size
& PSEUDOVECTOR_FLAG
)
2280 if (!(size
& (PVEC_COMPILED
| PVEC_CHAR_TABLE
)))
2282 size
&= PSEUDOVECTOR_SIZE_MASK
;
2284 for (i
= 0; i
< size
; i
++)
2287 v1
= XVECTOR (o1
)->contents
[i
];
2288 v2
= XVECTOR (o2
)->contents
[i
];
2289 if (!internal_equal (v1
, v2
, depth
+ 1, props
))
2297 if (SCHARS (o1
) != SCHARS (o2
))
2299 if (SBYTES (o1
) != SBYTES (o2
))
2301 if (bcmp (SDATA (o1
), SDATA (o2
),
2304 if (props
&& !compare_string_intervals (o1
, o2
))
2310 case Lisp_Type_Limit
:
2317 extern Lisp_Object
Fmake_char_internal ();
2319 DEFUN ("fillarray", Ffillarray
, Sfillarray
, 2, 2, 0,
2320 doc
: /* Store each element of ARRAY with ITEM.
2321 ARRAY is a vector, string, char-table, or bool-vector. */)
2323 Lisp_Object array
, item
;
2325 register int size
, index
, charval
;
2327 if (VECTORP (array
))
2329 register Lisp_Object
*p
= XVECTOR (array
)->contents
;
2330 size
= XVECTOR (array
)->size
;
2331 for (index
= 0; index
< size
; index
++)
2334 else if (CHAR_TABLE_P (array
))
2336 register Lisp_Object
*p
= XCHAR_TABLE (array
)->contents
;
2337 size
= CHAR_TABLE_ORDINARY_SLOTS
;
2338 for (index
= 0; index
< size
; index
++)
2340 XCHAR_TABLE (array
)->defalt
= Qnil
;
2342 else if (STRINGP (array
))
2344 register unsigned char *p
= SDATA (array
);
2345 CHECK_NUMBER (item
);
2346 charval
= XINT (item
);
2347 size
= SCHARS (array
);
2348 if (STRING_MULTIBYTE (array
))
2350 unsigned char str
[MAX_MULTIBYTE_LENGTH
];
2351 int len
= CHAR_STRING (charval
, str
);
2352 int size_byte
= SBYTES (array
);
2353 unsigned char *p1
= p
, *endp
= p
+ size_byte
;
2356 if (size
!= size_byte
)
2359 int this_len
= MULTIBYTE_FORM_LENGTH (p1
, endp
- p1
);
2360 if (len
!= this_len
)
2361 error ("Attempt to change byte length of a string");
2364 for (i
= 0; i
< size_byte
; i
++)
2365 *p
++ = str
[i
% len
];
2368 for (index
= 0; index
< size
; index
++)
2371 else if (BOOL_VECTOR_P (array
))
2373 register unsigned char *p
= XBOOL_VECTOR (array
)->data
;
2375 = ((XBOOL_VECTOR (array
)->size
+ BOOL_VECTOR_BITS_PER_CHAR
- 1)
2376 / BOOL_VECTOR_BITS_PER_CHAR
);
2378 charval
= (! NILP (item
) ? -1 : 0);
2379 for (index
= 0; index
< size_in_chars
- 1; index
++)
2381 if (index
< size_in_chars
)
2383 /* Mask out bits beyond the vector size. */
2384 if (XBOOL_VECTOR (array
)->size
% BOOL_VECTOR_BITS_PER_CHAR
)
2385 charval
&= (1 << (XBOOL_VECTOR (array
)->size
% BOOL_VECTOR_BITS_PER_CHAR
)) - 1;
2391 array
= wrong_type_argument (Qarrayp
, array
);
2397 DEFUN ("clear-string", Fclear_string
, Sclear_string
,
2399 doc
: /* Clear the contents of STRING.
2400 This makes STRING unibyte and may change its length. */)
2405 CHECK_STRING (string
);
2406 len
= SBYTES (string
);
2407 bzero (SDATA (string
), len
);
2408 STRING_SET_CHARS (string
, len
);
2409 STRING_SET_UNIBYTE (string
);
2413 DEFUN ("char-table-subtype", Fchar_table_subtype
, Schar_table_subtype
,
2415 doc
: /* Return the subtype of char-table CHAR-TABLE. The value is a symbol. */)
2417 Lisp_Object char_table
;
2419 CHECK_CHAR_TABLE (char_table
);
2421 return XCHAR_TABLE (char_table
)->purpose
;
2424 DEFUN ("char-table-parent", Fchar_table_parent
, Schar_table_parent
,
2426 doc
: /* Return the parent char-table of CHAR-TABLE.
2427 The value is either nil or another char-table.
2428 If CHAR-TABLE holds nil for a given character,
2429 then the actual applicable value is inherited from the parent char-table
2430 \(or from its parents, if necessary). */)
2432 Lisp_Object char_table
;
2434 CHECK_CHAR_TABLE (char_table
);
2436 return XCHAR_TABLE (char_table
)->parent
;
2439 DEFUN ("set-char-table-parent", Fset_char_table_parent
, Sset_char_table_parent
,
2441 doc
: /* Set the parent char-table of CHAR-TABLE to PARENT.
2442 Return PARENT. PARENT must be either nil or another char-table. */)
2443 (char_table
, parent
)
2444 Lisp_Object char_table
, parent
;
2448 CHECK_CHAR_TABLE (char_table
);
2452 CHECK_CHAR_TABLE (parent
);
2454 for (temp
= parent
; !NILP (temp
); temp
= XCHAR_TABLE (temp
)->parent
)
2455 if (EQ (temp
, char_table
))
2456 error ("Attempt to make a chartable be its own parent");
2459 XCHAR_TABLE (char_table
)->parent
= parent
;
2464 DEFUN ("char-table-extra-slot", Fchar_table_extra_slot
, Schar_table_extra_slot
,
2466 doc
: /* Return the value of CHAR-TABLE's extra-slot number N. */)
2468 Lisp_Object char_table
, n
;
2470 CHECK_CHAR_TABLE (char_table
);
2473 || XINT (n
) >= CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (char_table
)))
2474 args_out_of_range (char_table
, n
);
2476 return XCHAR_TABLE (char_table
)->extras
[XINT (n
)];
2479 DEFUN ("set-char-table-extra-slot", Fset_char_table_extra_slot
,
2480 Sset_char_table_extra_slot
,
2482 doc
: /* Set CHAR-TABLE's extra-slot number N to VALUE. */)
2483 (char_table
, n
, value
)
2484 Lisp_Object char_table
, n
, value
;
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
)] = value
;
2495 DEFUN ("char-table-range", Fchar_table_range
, Schar_table_range
,
2497 doc
: /* Return the value in CHAR-TABLE for a range of characters RANGE.
2498 RANGE should be nil (for the default value)
2499 a vector which identifies a character set or a row of a character set,
2500 a character set name, or a character code. */)
2502 Lisp_Object char_table
, range
;
2504 CHECK_CHAR_TABLE (char_table
);
2506 if (EQ (range
, Qnil
))
2507 return XCHAR_TABLE (char_table
)->defalt
;
2508 else if (INTEGERP (range
))
2509 return Faref (char_table
, range
);
2510 else if (SYMBOLP (range
))
2512 Lisp_Object charset_info
;
2514 charset_info
= Fget (range
, Qcharset
);
2515 CHECK_VECTOR (charset_info
);
2517 return Faref (char_table
,
2518 make_number (XINT (XVECTOR (charset_info
)->contents
[0])
2521 else if (VECTORP (range
))
2523 if (XVECTOR (range
)->size
== 1)
2524 return Faref (char_table
,
2525 make_number (XINT (XVECTOR (range
)->contents
[0]) + 128));
2528 int size
= XVECTOR (range
)->size
;
2529 Lisp_Object
*val
= XVECTOR (range
)->contents
;
2530 Lisp_Object ch
= Fmake_char_internal (size
<= 0 ? Qnil
: val
[0],
2531 size
<= 1 ? Qnil
: val
[1],
2532 size
<= 2 ? Qnil
: val
[2]);
2533 return Faref (char_table
, ch
);
2537 error ("Invalid RANGE argument to `char-table-range'");
2541 DEFUN ("set-char-table-range", Fset_char_table_range
, Sset_char_table_range
,
2543 doc
: /* Set the value in CHAR-TABLE for a range of characters RANGE to VALUE.
2544 RANGE should be t (for all characters), nil (for the default value),
2545 a character set, a vector which identifies a character set, a row of a
2546 character set, or a character code. Return VALUE. */)
2547 (char_table
, range
, value
)
2548 Lisp_Object char_table
, range
, value
;
2552 CHECK_CHAR_TABLE (char_table
);
2555 for (i
= 0; i
< CHAR_TABLE_ORDINARY_SLOTS
; i
++)
2556 XCHAR_TABLE (char_table
)->contents
[i
] = value
;
2557 else if (EQ (range
, Qnil
))
2558 XCHAR_TABLE (char_table
)->defalt
= value
;
2559 else if (SYMBOLP (range
))
2561 Lisp_Object charset_info
;
2564 charset_info
= Fget (range
, Qcharset
);
2565 if (! VECTORP (charset_info
)
2566 || ! NATNUMP (AREF (charset_info
, 0))
2567 || (charset_id
= XINT (AREF (charset_info
, 0)),
2568 ! CHARSET_DEFINED_P (charset_id
)))
2569 error ("Invalid charset: %s", SDATA (SYMBOL_NAME (range
)));
2571 if (charset_id
== CHARSET_ASCII
)
2572 for (i
= 0; i
< 128; i
++)
2573 XCHAR_TABLE (char_table
)->contents
[i
] = value
;
2574 else if (charset_id
== CHARSET_8_BIT_CONTROL
)
2575 for (i
= 128; i
< 160; i
++)
2576 XCHAR_TABLE (char_table
)->contents
[i
] = value
;
2577 else if (charset_id
== CHARSET_8_BIT_GRAPHIC
)
2578 for (i
= 160; i
< 256; i
++)
2579 XCHAR_TABLE (char_table
)->contents
[i
] = value
;
2581 XCHAR_TABLE (char_table
)->contents
[charset_id
+ 128] = value
;
2583 else if (INTEGERP (range
))
2584 Faset (char_table
, range
, value
);
2585 else if (VECTORP (range
))
2587 if (XVECTOR (range
)->size
== 1)
2588 return Faset (char_table
,
2589 make_number (XINT (XVECTOR (range
)->contents
[0]) + 128),
2593 int size
= XVECTOR (range
)->size
;
2594 Lisp_Object
*val
= XVECTOR (range
)->contents
;
2595 Lisp_Object ch
= Fmake_char_internal (size
<= 0 ? Qnil
: val
[0],
2596 size
<= 1 ? Qnil
: val
[1],
2597 size
<= 2 ? Qnil
: val
[2]);
2598 return Faset (char_table
, ch
, value
);
2602 error ("Invalid RANGE argument to `set-char-table-range'");
2607 DEFUN ("set-char-table-default", Fset_char_table_default
,
2608 Sset_char_table_default
, 3, 3, 0,
2609 doc
: /* Set the default value in CHAR-TABLE for generic character CH to VALUE.
2610 The generic character specifies the group of characters.
2611 See also the documentation of `make-char'. */)
2612 (char_table
, ch
, value
)
2613 Lisp_Object char_table
, ch
, value
;
2615 int c
, charset
, code1
, code2
;
2618 CHECK_CHAR_TABLE (char_table
);
2622 SPLIT_CHAR (c
, charset
, code1
, code2
);
2624 /* Since we may want to set the default value for a character set
2625 not yet defined, we check only if the character set is in the
2626 valid range or not, instead of it is already defined or not. */
2627 if (! CHARSET_VALID_P (charset
))
2628 invalid_character (c
);
2630 if (charset
== CHARSET_ASCII
)
2631 return (XCHAR_TABLE (char_table
)->defalt
= value
);
2633 /* Even if C is not a generic char, we had better behave as if a
2634 generic char is specified. */
2635 if (!CHARSET_DEFINED_P (charset
) || CHARSET_DIMENSION (charset
) == 1)
2637 temp
= XCHAR_TABLE (char_table
)->contents
[charset
+ 128];
2640 if (SUB_CHAR_TABLE_P (temp
))
2641 XCHAR_TABLE (temp
)->defalt
= value
;
2643 XCHAR_TABLE (char_table
)->contents
[charset
+ 128] = value
;
2646 if (SUB_CHAR_TABLE_P (temp
))
2649 char_table
= (XCHAR_TABLE (char_table
)->contents
[charset
+ 128]
2650 = make_sub_char_table (temp
));
2651 temp
= XCHAR_TABLE (char_table
)->contents
[code1
];
2652 if (SUB_CHAR_TABLE_P (temp
))
2653 XCHAR_TABLE (temp
)->defalt
= value
;
2655 XCHAR_TABLE (char_table
)->contents
[code1
] = value
;
2659 /* Look up the element in TABLE at index CH,
2660 and return it as an integer.
2661 If the element is nil, return CH itself.
2662 (Actually we do that for any non-integer.) */
2665 char_table_translate (table
, ch
)
2670 value
= Faref (table
, make_number (ch
));
2671 if (! INTEGERP (value
))
2673 return XINT (value
);
2677 optimize_sub_char_table (table
, chars
)
2685 from
= 33, to
= 127;
2687 from
= 32, to
= 128;
2689 if (!SUB_CHAR_TABLE_P (*table
))
2691 elt
= XCHAR_TABLE (*table
)->contents
[from
++];
2692 for (; from
< to
; from
++)
2693 if (NILP (Fequal (elt
, XCHAR_TABLE (*table
)->contents
[from
])))
2698 DEFUN ("optimize-char-table", Foptimize_char_table
, Soptimize_char_table
,
2699 1, 1, 0, doc
: /* Optimize char table TABLE. */)
2707 CHECK_CHAR_TABLE (table
);
2709 for (i
= CHAR_TABLE_SINGLE_BYTE_SLOTS
; i
< CHAR_TABLE_ORDINARY_SLOTS
; i
++)
2711 elt
= XCHAR_TABLE (table
)->contents
[i
];
2712 if (!SUB_CHAR_TABLE_P (elt
))
2714 dim
= CHARSET_DIMENSION (i
- 128);
2716 for (j
= 32; j
< SUB_CHAR_TABLE_ORDINARY_SLOTS
; j
++)
2717 optimize_sub_char_table (XCHAR_TABLE (elt
)->contents
+ j
, dim
);
2718 optimize_sub_char_table (XCHAR_TABLE (table
)->contents
+ i
, dim
);
2724 /* Map C_FUNCTION or FUNCTION over SUBTABLE, calling it for each
2725 character or group of characters that share a value.
2726 DEPTH is the current depth in the originally specified
2727 chartable, and INDICES contains the vector indices
2728 for the levels our callers have descended.
2730 ARG is passed to C_FUNCTION when that is called. */
2733 map_char_table (c_function
, function
, table
, subtable
, arg
, depth
, indices
)
2734 void (*c_function
) P_ ((Lisp_Object
, Lisp_Object
, Lisp_Object
));
2735 Lisp_Object function
, table
, subtable
, arg
, *indices
;
2739 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
;
2741 GCPRO4 (arg
, table
, subtable
, function
);
2745 /* At first, handle ASCII and 8-bit European characters. */
2746 for (i
= 0; i
< CHAR_TABLE_SINGLE_BYTE_SLOTS
; i
++)
2748 Lisp_Object elt
= XCHAR_TABLE (subtable
)->contents
[i
];
2750 elt
= XCHAR_TABLE (subtable
)->defalt
;
2752 elt
= Faref (subtable
, make_number (i
));
2754 (*c_function
) (arg
, make_number (i
), elt
);
2756 call2 (function
, make_number (i
), elt
);
2758 #if 0 /* If the char table has entries for higher characters,
2759 we should report them. */
2760 if (NILP (current_buffer
->enable_multibyte_characters
))
2766 to
= CHAR_TABLE_ORDINARY_SLOTS
;
2770 int charset
= XFASTINT (indices
[0]) - 128;
2773 to
= SUB_CHAR_TABLE_ORDINARY_SLOTS
;
2774 if (CHARSET_CHARS (charset
) == 94)
2783 elt
= XCHAR_TABLE (subtable
)->contents
[i
];
2784 XSETFASTINT (indices
[depth
], i
);
2785 charset
= XFASTINT (indices
[0]) - 128;
2787 && (!CHARSET_DEFINED_P (charset
)
2788 || charset
== CHARSET_8_BIT_CONTROL
2789 || charset
== CHARSET_8_BIT_GRAPHIC
))
2792 if (SUB_CHAR_TABLE_P (elt
))
2795 error ("Too deep char table");
2796 map_char_table (c_function
, function
, table
, elt
, arg
, depth
+ 1, indices
);
2802 c1
= depth
>= 1 ? XFASTINT (indices
[1]) : 0;
2803 c2
= depth
>= 2 ? XFASTINT (indices
[2]) : 0;
2804 c
= MAKE_CHAR (charset
, c1
, c2
);
2807 elt
= XCHAR_TABLE (subtable
)->defalt
;
2809 elt
= Faref (table
, make_number (c
));
2812 (*c_function
) (arg
, make_number (c
), elt
);
2814 call2 (function
, make_number (c
), elt
);
2820 static void void_call2
P_ ((Lisp_Object a
, Lisp_Object b
, Lisp_Object c
));
2822 void_call2 (a
, b
, c
)
2823 Lisp_Object a
, b
, c
;
2828 DEFUN ("map-char-table", Fmap_char_table
, Smap_char_table
,
2830 doc
: /* Call FUNCTION for each (normal and generic) characters in CHAR-TABLE.
2831 FUNCTION is called with two arguments--a key and a value.
2832 The key is always a possible IDX argument to `aref'. */)
2833 (function
, char_table
)
2834 Lisp_Object function
, char_table
;
2836 /* The depth of char table is at most 3. */
2837 Lisp_Object indices
[3];
2839 CHECK_CHAR_TABLE (char_table
);
2841 /* When Lisp_Object is represented as a union, `call2' cannot directly
2842 be passed to map_char_table because it returns a Lisp_Object rather
2843 than returning nothing.
2844 Casting leads to crashes on some architectures. -stef */
2845 map_char_table (void_call2
, Qnil
, char_table
, char_table
, function
, 0, indices
);
2849 /* Return a value for character C in char-table TABLE. Store the
2850 actual index for that value in *IDX. Ignore the default value of
2854 char_table_ref_and_index (table
, c
, idx
)
2858 int charset
, c1
, c2
;
2861 if (SINGLE_BYTE_CHAR_P (c
))
2864 return XCHAR_TABLE (table
)->contents
[c
];
2866 SPLIT_CHAR (c
, charset
, c1
, c2
);
2867 elt
= XCHAR_TABLE (table
)->contents
[charset
+ 128];
2868 *idx
= MAKE_CHAR (charset
, 0, 0);
2869 if (!SUB_CHAR_TABLE_P (elt
))
2871 if (c1
< 32 || NILP (XCHAR_TABLE (elt
)->contents
[c1
]))
2872 return XCHAR_TABLE (elt
)->defalt
;
2873 elt
= XCHAR_TABLE (elt
)->contents
[c1
];
2874 *idx
= MAKE_CHAR (charset
, c1
, 0);
2875 if (!SUB_CHAR_TABLE_P (elt
))
2877 if (c2
< 32 || NILP (XCHAR_TABLE (elt
)->contents
[c2
]))
2878 return XCHAR_TABLE (elt
)->defalt
;
2880 return XCHAR_TABLE (elt
)->contents
[c2
];
2890 Lisp_Object args
[2];
2893 return Fnconc (2, args
);
2895 return Fnconc (2, &s1
);
2896 #endif /* NO_ARG_ARRAY */
2899 DEFUN ("nconc", Fnconc
, Snconc
, 0, MANY
, 0,
2900 doc
: /* Concatenate any number of lists by altering them.
2901 Only the last argument is not altered, and need not be a list.
2902 usage: (nconc &rest LISTS) */)
2907 register int argnum
;
2908 register Lisp_Object tail
, tem
, val
;
2912 for (argnum
= 0; argnum
< nargs
; argnum
++)
2915 if (NILP (tem
)) continue;
2920 if (argnum
+ 1 == nargs
) break;
2923 tem
= wrong_type_argument (Qlistp
, tem
);
2932 tem
= args
[argnum
+ 1];
2933 Fsetcdr (tail
, tem
);
2935 args
[argnum
+ 1] = tail
;
2941 /* This is the guts of all mapping functions.
2942 Apply FN to each element of SEQ, one by one,
2943 storing the results into elements of VALS, a C vector of Lisp_Objects.
2944 LENI is the length of VALS, which should also be the length of SEQ. */
2947 mapcar1 (leni
, vals
, fn
, seq
)
2950 Lisp_Object fn
, seq
;
2952 register Lisp_Object tail
;
2955 struct gcpro gcpro1
, gcpro2
, gcpro3
;
2959 /* Don't let vals contain any garbage when GC happens. */
2960 for (i
= 0; i
< leni
; i
++)
2963 GCPRO3 (dummy
, fn
, seq
);
2965 gcpro1
.nvars
= leni
;
2969 /* We need not explicitly protect `tail' because it is used only on lists, and
2970 1) lists are not relocated and 2) the list is marked via `seq' so will not be freed */
2974 for (i
= 0; i
< leni
; i
++)
2976 dummy
= XVECTOR (seq
)->contents
[i
];
2977 dummy
= call1 (fn
, dummy
);
2982 else if (BOOL_VECTOR_P (seq
))
2984 for (i
= 0; i
< leni
; i
++)
2987 byte
= XBOOL_VECTOR (seq
)->data
[i
/ BOOL_VECTOR_BITS_PER_CHAR
];
2988 if (byte
& (1 << (i
% BOOL_VECTOR_BITS_PER_CHAR
)))
2993 dummy
= call1 (fn
, dummy
);
2998 else if (STRINGP (seq
))
3002 for (i
= 0, i_byte
= 0; i
< leni
;)
3007 FETCH_STRING_CHAR_ADVANCE (c
, seq
, i
, i_byte
);
3008 XSETFASTINT (dummy
, c
);
3009 dummy
= call1 (fn
, dummy
);
3011 vals
[i_before
] = dummy
;
3014 else /* Must be a list, since Flength did not get an error */
3017 for (i
= 0; i
< leni
; i
++)
3019 dummy
= call1 (fn
, Fcar (tail
));
3029 DEFUN ("mapconcat", Fmapconcat
, Smapconcat
, 3, 3, 0,
3030 doc
: /* Apply FUNCTION to each element of SEQUENCE, and concat the results as strings.
3031 In between each pair of results, stick in SEPARATOR. Thus, " " as
3032 SEPARATOR results in spaces between the values returned by FUNCTION.
3033 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
3034 (function
, sequence
, separator
)
3035 Lisp_Object function
, sequence
, separator
;
3040 register Lisp_Object
*args
;
3042 struct gcpro gcpro1
;
3046 len
= Flength (sequence
);
3048 nargs
= leni
+ leni
- 1;
3049 if (nargs
< 0) return build_string ("");
3051 SAFE_ALLOCA_LISP (args
, nargs
);
3054 mapcar1 (leni
, args
, function
, sequence
);
3057 for (i
= leni
- 1; i
>= 0; i
--)
3058 args
[i
+ i
] = args
[i
];
3060 for (i
= 1; i
< nargs
; i
+= 2)
3061 args
[i
] = separator
;
3063 ret
= Fconcat (nargs
, args
);
3069 DEFUN ("mapcar", Fmapcar
, Smapcar
, 2, 2, 0,
3070 doc
: /* Apply FUNCTION to each element of SEQUENCE, and make a list of the results.
3071 The result is a list just as long as SEQUENCE.
3072 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
3073 (function
, sequence
)
3074 Lisp_Object function
, sequence
;
3076 register Lisp_Object len
;
3078 register Lisp_Object
*args
;
3082 len
= Flength (sequence
);
3083 leni
= XFASTINT (len
);
3085 SAFE_ALLOCA_LISP (args
, leni
);
3087 mapcar1 (leni
, args
, function
, sequence
);
3089 ret
= Flist (leni
, args
);
3095 DEFUN ("mapc", Fmapc
, Smapc
, 2, 2, 0,
3096 doc
: /* Apply FUNCTION to each element of SEQUENCE for side effects only.
3097 Unlike `mapcar', don't accumulate the results. Return SEQUENCE.
3098 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
3099 (function
, sequence
)
3100 Lisp_Object function
, sequence
;
3104 leni
= XFASTINT (Flength (sequence
));
3105 mapcar1 (leni
, 0, function
, sequence
);
3110 /* Anything that calls this function must protect from GC! */
3112 DEFUN ("y-or-n-p", Fy_or_n_p
, Sy_or_n_p
, 1, 1, 0,
3113 doc
: /* Ask user a "y or n" question. Return t if answer is "y".
3114 Takes one argument, which is the string to display to ask the question.
3115 It should end in a space; `y-or-n-p' adds `(y or n) ' to it.
3116 No confirmation of the answer is requested; a single character is enough.
3117 Also accepts Space to mean yes, or Delete to mean no. \(Actually, it uses
3118 the bindings in `query-replace-map'; see the documentation of that variable
3119 for more information. In this case, the useful bindings are `act', `skip',
3120 `recenter', and `quit'.\)
3122 Under a windowing system a dialog box will be used if `last-nonmenu-event'
3123 is nil and `use-dialog-box' is non-nil. */)
3127 register Lisp_Object obj
, key
, def
, map
;
3128 register int answer
;
3129 Lisp_Object xprompt
;
3130 Lisp_Object args
[2];
3131 struct gcpro gcpro1
, gcpro2
;
3132 int count
= SPECPDL_INDEX ();
3134 specbind (Qcursor_in_echo_area
, Qt
);
3136 map
= Fsymbol_value (intern ("query-replace-map"));
3138 CHECK_STRING (prompt
);
3140 GCPRO2 (prompt
, xprompt
);
3142 #ifdef HAVE_X_WINDOWS
3143 if (display_hourglass_p
)
3144 cancel_hourglass ();
3151 if ((NILP (last_nonmenu_event
) || CONSP (last_nonmenu_event
))
3155 Lisp_Object pane
, menu
;
3156 redisplay_preserve_echo_area (3);
3157 pane
= Fcons (Fcons (build_string ("Yes"), Qt
),
3158 Fcons (Fcons (build_string ("No"), Qnil
),
3160 menu
= Fcons (prompt
, pane
);
3161 obj
= Fx_popup_dialog (Qt
, menu
);
3162 answer
= !NILP (obj
);
3165 #endif /* HAVE_MENUS */
3166 cursor_in_echo_area
= 1;
3167 choose_minibuf_frame ();
3170 Lisp_Object pargs
[3];
3172 /* Colorize prompt according to `minibuffer-prompt' face. */
3173 pargs
[0] = build_string ("%s(y or n) ");
3174 pargs
[1] = intern ("face");
3175 pargs
[2] = intern ("minibuffer-prompt");
3176 args
[0] = Fpropertize (3, pargs
);
3181 if (minibuffer_auto_raise
)
3183 Lisp_Object mini_frame
;
3185 mini_frame
= WINDOW_FRAME (XWINDOW (minibuf_window
));
3187 Fraise_frame (mini_frame
);
3190 obj
= read_filtered_event (1, 0, 0, 0);
3191 cursor_in_echo_area
= 0;
3192 /* If we need to quit, quit with cursor_in_echo_area = 0. */
3195 key
= Fmake_vector (make_number (1), obj
);
3196 def
= Flookup_key (map
, key
, Qt
);
3198 if (EQ (def
, intern ("skip")))
3203 else if (EQ (def
, intern ("act")))
3208 else if (EQ (def
, intern ("recenter")))
3214 else if (EQ (def
, intern ("quit")))
3216 /* We want to exit this command for exit-prefix,
3217 and this is the only way to do it. */
3218 else if (EQ (def
, intern ("exit-prefix")))
3223 /* If we don't clear this, then the next call to read_char will
3224 return quit_char again, and we'll enter an infinite loop. */
3229 if (EQ (xprompt
, prompt
))
3231 args
[0] = build_string ("Please answer y or n. ");
3233 xprompt
= Fconcat (2, args
);
3238 if (! noninteractive
)
3240 cursor_in_echo_area
= -1;
3241 message_with_string (answer
? "%s(y or n) y" : "%s(y or n) n",
3245 unbind_to (count
, Qnil
);
3246 return answer
? Qt
: Qnil
;
3249 /* This is how C code calls `yes-or-no-p' and allows the user
3252 Anything that calls this function must protect from GC! */
3255 do_yes_or_no_p (prompt
)
3258 return call1 (intern ("yes-or-no-p"), prompt
);
3261 /* Anything that calls this function must protect from GC! */
3263 DEFUN ("yes-or-no-p", Fyes_or_no_p
, Syes_or_no_p
, 1, 1, 0,
3264 doc
: /* Ask user a yes-or-no question. Return t if answer is yes.
3265 Takes one argument, which is the string to display to ask the question.
3266 It should end in a space; `yes-or-no-p' adds `(yes or no) ' to it.
3267 The user must confirm the answer with RET,
3268 and can edit it until it has been confirmed.
3270 Under a windowing system a dialog box will be used if `last-nonmenu-event'
3271 is nil, and `use-dialog-box' is non-nil. */)
3275 register Lisp_Object ans
;
3276 Lisp_Object args
[2];
3277 struct gcpro gcpro1
;
3279 CHECK_STRING (prompt
);
3282 if ((NILP (last_nonmenu_event
) || CONSP (last_nonmenu_event
))
3286 Lisp_Object pane
, menu
, obj
;
3287 redisplay_preserve_echo_area (4);
3288 pane
= Fcons (Fcons (build_string ("Yes"), Qt
),
3289 Fcons (Fcons (build_string ("No"), Qnil
),
3292 menu
= Fcons (prompt
, pane
);
3293 obj
= Fx_popup_dialog (Qt
, menu
);
3297 #endif /* HAVE_MENUS */
3300 args
[1] = build_string ("(yes or no) ");
3301 prompt
= Fconcat (2, args
);
3307 ans
= Fdowncase (Fread_from_minibuffer (prompt
, Qnil
, Qnil
, Qnil
,
3308 Qyes_or_no_p_history
, Qnil
,
3310 if (SCHARS (ans
) == 3 && !strcmp (SDATA (ans
), "yes"))
3315 if (SCHARS (ans
) == 2 && !strcmp (SDATA (ans
), "no"))
3323 message ("Please answer yes or no.");
3324 Fsleep_for (make_number (2), Qnil
);
3328 DEFUN ("load-average", Fload_average
, Sload_average
, 0, 1, 0,
3329 doc
: /* Return list of 1 minute, 5 minute and 15 minute load averages.
3331 Each of the three load averages is multiplied by 100, then converted
3334 When USE-FLOATS is non-nil, floats will be used instead of integers.
3335 These floats are not multiplied by 100.
3337 If the 5-minute or 15-minute load averages are not available, return a
3338 shortened list, containing only those averages which are available.
3340 An error is thrown if the load average can't be obtained. In some
3341 cases making it work would require Emacs being installed setuid or
3342 setgid so that it can read kernel information, and that usually isn't
3345 Lisp_Object use_floats
;
3348 int loads
= getloadavg (load_ave
, 3);
3349 Lisp_Object ret
= Qnil
;
3352 error ("load-average not implemented for this operating system");
3356 Lisp_Object load
= (NILP (use_floats
) ?
3357 make_number ((int) (100.0 * load_ave
[loads
]))
3358 : make_float (load_ave
[loads
]));
3359 ret
= Fcons (load
, ret
);
3365 Lisp_Object Vfeatures
, Qsubfeatures
;
3366 extern Lisp_Object Vafter_load_alist
;
3368 DEFUN ("featurep", Ffeaturep
, Sfeaturep
, 1, 2, 0,
3369 doc
: /* Returns t if FEATURE is present in this Emacs.
3371 Use this to conditionalize execution of lisp code based on the
3372 presence or absence of emacs or environment extensions.
3373 Use `provide' to declare that a feature is available. This function
3374 looks at the value of the variable `features'. The optional argument
3375 SUBFEATURE can be used to check a specific subfeature of FEATURE. */)
3376 (feature
, subfeature
)
3377 Lisp_Object feature
, subfeature
;
3379 register Lisp_Object tem
;
3380 CHECK_SYMBOL (feature
);
3381 tem
= Fmemq (feature
, Vfeatures
);
3382 if (!NILP (tem
) && !NILP (subfeature
))
3383 tem
= Fmember (subfeature
, Fget (feature
, Qsubfeatures
));
3384 return (NILP (tem
)) ? Qnil
: Qt
;
3387 DEFUN ("provide", Fprovide
, Sprovide
, 1, 2, 0,
3388 doc
: /* Announce that FEATURE is a feature of the current Emacs.
3389 The optional argument SUBFEATURES should be a list of symbols listing
3390 particular subfeatures supported in this version of FEATURE. */)
3391 (feature
, subfeatures
)
3392 Lisp_Object feature
, subfeatures
;
3394 register Lisp_Object tem
;
3395 CHECK_SYMBOL (feature
);
3396 CHECK_LIST (subfeatures
);
3397 if (!NILP (Vautoload_queue
))
3398 Vautoload_queue
= Fcons (Fcons (Vfeatures
, Qnil
), Vautoload_queue
);
3399 tem
= Fmemq (feature
, Vfeatures
);
3401 Vfeatures
= Fcons (feature
, Vfeatures
);
3402 if (!NILP (subfeatures
))
3403 Fput (feature
, Qsubfeatures
, subfeatures
);
3404 LOADHIST_ATTACH (Fcons (Qprovide
, feature
));
3406 /* Run any load-hooks for this file. */
3407 tem
= Fassq (feature
, Vafter_load_alist
);
3409 Fprogn (XCDR (tem
));
3414 /* `require' and its subroutines. */
3416 /* List of features currently being require'd, innermost first. */
3418 Lisp_Object require_nesting_list
;
3421 require_unwind (old_value
)
3422 Lisp_Object old_value
;
3424 return require_nesting_list
= old_value
;
3427 DEFUN ("require", Frequire
, Srequire
, 1, 3, 0,
3428 doc
: /* If feature FEATURE is not loaded, load it from FILENAME.
3429 If FEATURE is not a member of the list `features', then the feature
3430 is not loaded; so load the file FILENAME.
3431 If FILENAME is omitted, the printname of FEATURE is used as the file name,
3432 and `load' will try to load this name appended with the suffix `.elc' or
3433 `.el', in that order. The name without appended suffix will not be used.
3434 If the optional third argument NOERROR is non-nil,
3435 then return nil if the file is not found instead of signaling an error.
3436 Normally the return value is FEATURE.
3437 The normal messages at start and end of loading FILENAME are suppressed. */)
3438 (feature
, filename
, noerror
)
3439 Lisp_Object feature
, filename
, noerror
;
3441 register Lisp_Object tem
;
3442 struct gcpro gcpro1
, gcpro2
;
3444 CHECK_SYMBOL (feature
);
3446 /* Record the presence of `require' in this file
3447 even if the feature specified is already loaded. */
3448 LOADHIST_ATTACH (Fcons (Qrequire
, feature
));
3450 tem
= Fmemq (feature
, Vfeatures
);
3454 int count
= SPECPDL_INDEX ();
3457 /* This is to make sure that loadup.el gives a clear picture
3458 of what files are preloaded and when. */
3459 if (! NILP (Vpurify_flag
))
3460 error ("(require %s) while preparing to dump",
3461 SDATA (SYMBOL_NAME (feature
)));
3463 /* A certain amount of recursive `require' is legitimate,
3464 but if we require the same feature recursively 3 times,
3466 tem
= require_nesting_list
;
3467 while (! NILP (tem
))
3469 if (! NILP (Fequal (feature
, XCAR (tem
))))
3474 error ("Recursive `require' for feature `%s'",
3475 SDATA (SYMBOL_NAME (feature
)));
3477 /* Update the list for any nested `require's that occur. */
3478 record_unwind_protect (require_unwind
, require_nesting_list
);
3479 require_nesting_list
= Fcons (feature
, require_nesting_list
);
3481 /* Value saved here is to be restored into Vautoload_queue */
3482 record_unwind_protect (un_autoload
, Vautoload_queue
);
3483 Vautoload_queue
= Qt
;
3485 /* Load the file. */
3486 GCPRO2 (feature
, filename
);
3487 tem
= Fload (NILP (filename
) ? Fsymbol_name (feature
) : filename
,
3488 noerror
, Qt
, Qnil
, (NILP (filename
) ? Qt
: Qnil
));
3491 /* If load failed entirely, return nil. */
3493 return unbind_to (count
, Qnil
);
3495 tem
= Fmemq (feature
, Vfeatures
);
3497 error ("Required feature `%s' was not provided",
3498 SDATA (SYMBOL_NAME (feature
)));
3500 /* Once loading finishes, don't undo it. */
3501 Vautoload_queue
= Qt
;
3502 feature
= unbind_to (count
, feature
);
3508 /* Primitives for work of the "widget" library.
3509 In an ideal world, this section would not have been necessary.
3510 However, lisp function calls being as slow as they are, it turns
3511 out that some functions in the widget library (wid-edit.el) are the
3512 bottleneck of Widget operation. Here is their translation to C,
3513 for the sole reason of efficiency. */
3515 DEFUN ("plist-member", Fplist_member
, Splist_member
, 2, 2, 0,
3516 doc
: /* Return non-nil if PLIST has the property PROP.
3517 PLIST is a property list, which is a list of the form
3518 \(PROP1 VALUE1 PROP2 VALUE2 ...\). PROP is a symbol.
3519 Unlike `plist-get', this allows you to distinguish between a missing
3520 property and a property with the value nil.
3521 The value is actually the tail of PLIST whose car is PROP. */)
3523 Lisp_Object plist
, prop
;
3525 while (CONSP (plist
) && !EQ (XCAR (plist
), prop
))
3528 plist
= XCDR (plist
);
3529 plist
= CDR (plist
);
3534 DEFUN ("widget-put", Fwidget_put
, Swidget_put
, 3, 3, 0,
3535 doc
: /* In WIDGET, set PROPERTY to VALUE.
3536 The value can later be retrieved with `widget-get'. */)
3537 (widget
, property
, value
)
3538 Lisp_Object widget
, property
, value
;
3540 CHECK_CONS (widget
);
3541 XSETCDR (widget
, Fplist_put (XCDR (widget
), property
, value
));
3545 DEFUN ("widget-get", Fwidget_get
, Swidget_get
, 2, 2, 0,
3546 doc
: /* In WIDGET, get the value of PROPERTY.
3547 The value could either be specified when the widget was created, or
3548 later with `widget-put'. */)
3550 Lisp_Object widget
, property
;
3558 CHECK_CONS (widget
);
3559 tmp
= Fplist_member (XCDR (widget
), property
);
3565 tmp
= XCAR (widget
);
3568 widget
= Fget (tmp
, Qwidget_type
);
3572 DEFUN ("widget-apply", Fwidget_apply
, Swidget_apply
, 2, MANY
, 0,
3573 doc
: /* Apply the value of WIDGET's PROPERTY to the widget itself.
3574 ARGS are passed as extra arguments to the function.
3575 usage: (widget-apply WIDGET PROPERTY &rest ARGS) */)
3580 /* This function can GC. */
3581 Lisp_Object newargs
[3];
3582 struct gcpro gcpro1
, gcpro2
;
3585 newargs
[0] = Fwidget_get (args
[0], args
[1]);
3586 newargs
[1] = args
[0];
3587 newargs
[2] = Flist (nargs
- 2, args
+ 2);
3588 GCPRO2 (newargs
[0], newargs
[2]);
3589 result
= Fapply (3, newargs
);
3594 #ifdef HAVE_LANGINFO_CODESET
3595 #include <langinfo.h>
3598 DEFUN ("locale-info", Flocale_info
, Slocale_info
, 1, 1, 0,
3599 doc
: /* Access locale data ITEM for the current C locale, if available.
3600 ITEM should be one of the following:
3602 `codeset', returning the character set as a string (locale item CODESET);
3604 `days', returning a 7-element vector of day names (locale items DAY_n);
3606 `months', returning a 12-element vector of month names (locale items MON_n);
3608 `paper', returning a list (WIDTH HEIGHT) for the default paper size,
3609 both measured in milimeters (locale items PAPER_WIDTH, PAPER_HEIGHT).
3611 If the system can't provide such information through a call to
3612 `nl_langinfo', or if ITEM isn't from the list above, return nil.
3614 See also Info node `(libc)Locales'.
3616 The data read from the system are decoded using `locale-coding-system'. */)
3621 #ifdef HAVE_LANGINFO_CODESET
3623 if (EQ (item
, Qcodeset
))
3625 str
= nl_langinfo (CODESET
);
3626 return build_string (str
);
3629 else if (EQ (item
, Qdays
)) /* e.g. for calendar-day-name-array */
3631 Lisp_Object v
= Fmake_vector (make_number (7), Qnil
);
3632 int days
[7] = {DAY_1
, DAY_2
, DAY_3
, DAY_4
, DAY_5
, DAY_6
, DAY_7
};
3634 synchronize_system_time_locale ();
3635 for (i
= 0; i
< 7; i
++)
3637 str
= nl_langinfo (days
[i
]);
3638 val
= make_unibyte_string (str
, strlen (str
));
3639 /* Fixme: Is this coding system necessarily right, even if
3640 it is consistent with CODESET? If not, what to do? */
3641 Faset (v
, make_number (i
),
3642 code_convert_string_norecord (val
, Vlocale_coding_system
,
3649 else if (EQ (item
, Qmonths
)) /* e.g. for calendar-month-name-array */
3651 struct Lisp_Vector
*p
= allocate_vector (12);
3652 int months
[12] = {MON_1
, MON_2
, MON_3
, MON_4
, MON_5
, MON_6
, MON_7
,
3653 MON_8
, MON_9
, MON_10
, MON_11
, MON_12
};
3655 synchronize_system_time_locale ();
3656 for (i
= 0; i
< 12; i
++)
3658 str
= nl_langinfo (months
[i
]);
3659 val
= make_unibyte_string (str
, strlen (str
));
3661 code_convert_string_norecord (val
, Vlocale_coding_system
, 0);
3663 XSETVECTOR (val
, p
);
3667 /* LC_PAPER stuff isn't defined as accessible in glibc as of 2.3.1,
3668 but is in the locale files. This could be used by ps-print. */
3670 else if (EQ (item
, Qpaper
))
3672 return list2 (make_number (nl_langinfo (PAPER_WIDTH
)),
3673 make_number (nl_langinfo (PAPER_HEIGHT
)));
3675 #endif /* PAPER_WIDTH */
3676 #endif /* HAVE_LANGINFO_CODESET*/
3680 /* base64 encode/decode functions (RFC 2045).
3681 Based on code from GNU recode. */
3683 #define MIME_LINE_LENGTH 76
3685 #define IS_ASCII(Character) \
3687 #define IS_BASE64(Character) \
3688 (IS_ASCII (Character) && base64_char_to_value[Character] >= 0)
3689 #define IS_BASE64_IGNORABLE(Character) \
3690 ((Character) == ' ' || (Character) == '\t' || (Character) == '\n' \
3691 || (Character) == '\f' || (Character) == '\r')
3693 /* Used by base64_decode_1 to retrieve a non-base64-ignorable
3694 character or return retval if there are no characters left to
3696 #define READ_QUADRUPLET_BYTE(retval) \
3701 if (nchars_return) \
3702 *nchars_return = nchars; \
3707 while (IS_BASE64_IGNORABLE (c))
3709 /* Table of characters coding the 64 values. */
3710 static char base64_value_to_char
[64] =
3712 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', /* 0- 9 */
3713 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', /* 10-19 */
3714 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', /* 20-29 */
3715 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', /* 30-39 */
3716 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', /* 40-49 */
3717 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', /* 50-59 */
3718 '8', '9', '+', '/' /* 60-63 */
3721 /* Table of base64 values for first 128 characters. */
3722 static short base64_char_to_value
[128] =
3724 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0- 9 */
3725 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 10- 19 */
3726 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 20- 29 */
3727 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 30- 39 */
3728 -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, /* 40- 49 */
3729 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, /* 50- 59 */
3730 -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, /* 60- 69 */
3731 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, /* 70- 79 */
3732 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, /* 80- 89 */
3733 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, /* 90- 99 */
3734 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, /* 100-109 */
3735 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, /* 110-119 */
3736 49, 50, 51, -1, -1, -1, -1, -1 /* 120-127 */
3739 /* The following diagram shows the logical steps by which three octets
3740 get transformed into four base64 characters.
3742 .--------. .--------. .--------.
3743 |aaaaaabb| |bbbbcccc| |ccdddddd|
3744 `--------' `--------' `--------'
3746 .--------+--------+--------+--------.
3747 |00aaaaaa|00bbbbbb|00cccccc|00dddddd|
3748 `--------+--------+--------+--------'
3750 .--------+--------+--------+--------.
3751 |AAAAAAAA|BBBBBBBB|CCCCCCCC|DDDDDDDD|
3752 `--------+--------+--------+--------'
3754 The octets are divided into 6 bit chunks, which are then encoded into
3755 base64 characters. */
3758 static int base64_encode_1
P_ ((const char *, char *, int, int, int));
3759 static int base64_decode_1
P_ ((const char *, char *, int, int, int *));
3761 DEFUN ("base64-encode-region", Fbase64_encode_region
, Sbase64_encode_region
,
3763 doc
: /* Base64-encode the region between BEG and END.
3764 Return the length of the encoded text.
3765 Optional third argument NO-LINE-BREAK means do not break long lines
3766 into shorter lines. */)
3767 (beg
, end
, no_line_break
)
3768 Lisp_Object beg
, end
, no_line_break
;
3771 int allength
, length
;
3772 int ibeg
, iend
, encoded_length
;
3776 validate_region (&beg
, &end
);
3778 ibeg
= CHAR_TO_BYTE (XFASTINT (beg
));
3779 iend
= CHAR_TO_BYTE (XFASTINT (end
));
3780 move_gap_both (XFASTINT (beg
), ibeg
);
3782 /* We need to allocate enough room for encoding the text.
3783 We need 33 1/3% more space, plus a newline every 76
3784 characters, and then we round up. */
3785 length
= iend
- ibeg
;
3786 allength
= length
+ length
/3 + 1;
3787 allength
+= allength
/ MIME_LINE_LENGTH
+ 1 + 6;
3789 SAFE_ALLOCA (encoded
, char *, allength
);
3790 encoded_length
= base64_encode_1 (BYTE_POS_ADDR (ibeg
), encoded
, length
,
3791 NILP (no_line_break
),
3792 !NILP (current_buffer
->enable_multibyte_characters
));
3793 if (encoded_length
> allength
)
3796 if (encoded_length
< 0)
3798 /* The encoding wasn't possible. */
3800 error ("Multibyte character in data for base64 encoding");
3803 /* Now we have encoded the region, so we insert the new contents
3804 and delete the old. (Insert first in order to preserve markers.) */
3805 SET_PT_BOTH (XFASTINT (beg
), ibeg
);
3806 insert (encoded
, encoded_length
);
3808 del_range_byte (ibeg
+ encoded_length
, iend
+ encoded_length
, 1);
3810 /* If point was outside of the region, restore it exactly; else just
3811 move to the beginning of the region. */
3812 if (old_pos
>= XFASTINT (end
))
3813 old_pos
+= encoded_length
- (XFASTINT (end
) - XFASTINT (beg
));
3814 else if (old_pos
> XFASTINT (beg
))
3815 old_pos
= XFASTINT (beg
);
3818 /* We return the length of the encoded text. */
3819 return make_number (encoded_length
);
3822 DEFUN ("base64-encode-string", Fbase64_encode_string
, Sbase64_encode_string
,
3824 doc
: /* Base64-encode STRING and return the result.
3825 Optional second argument NO-LINE-BREAK means do not break long lines
3826 into shorter lines. */)
3827 (string
, no_line_break
)
3828 Lisp_Object string
, no_line_break
;
3830 int allength
, length
, encoded_length
;
3832 Lisp_Object encoded_string
;
3835 CHECK_STRING (string
);
3837 /* We need to allocate enough room for encoding the text.
3838 We need 33 1/3% more space, plus a newline every 76
3839 characters, and then we round up. */
3840 length
= SBYTES (string
);
3841 allength
= length
+ length
/3 + 1;
3842 allength
+= allength
/ MIME_LINE_LENGTH
+ 1 + 6;
3844 /* We need to allocate enough room for decoding the text. */
3845 SAFE_ALLOCA (encoded
, char *, allength
);
3847 encoded_length
= base64_encode_1 (SDATA (string
),
3848 encoded
, length
, NILP (no_line_break
),
3849 STRING_MULTIBYTE (string
));
3850 if (encoded_length
> allength
)
3853 if (encoded_length
< 0)
3855 /* The encoding wasn't possible. */
3857 error ("Multibyte character in data for base64 encoding");
3860 encoded_string
= make_unibyte_string (encoded
, encoded_length
);
3863 return encoded_string
;
3867 base64_encode_1 (from
, to
, length
, line_break
, multibyte
)
3874 int counter
= 0, i
= 0;
3884 c
= STRING_CHAR_AND_LENGTH (from
+ i
, length
- i
, bytes
);
3892 /* Wrap line every 76 characters. */
3896 if (counter
< MIME_LINE_LENGTH
/ 4)
3905 /* Process first byte of a triplet. */
3907 *e
++ = base64_value_to_char
[0x3f & c
>> 2];
3908 value
= (0x03 & c
) << 4;
3910 /* Process second byte of a triplet. */
3914 *e
++ = base64_value_to_char
[value
];
3922 c
= STRING_CHAR_AND_LENGTH (from
+ i
, length
- i
, bytes
);
3930 *e
++ = base64_value_to_char
[value
| (0x0f & c
>> 4)];
3931 value
= (0x0f & c
) << 2;
3933 /* Process third byte of a triplet. */
3937 *e
++ = base64_value_to_char
[value
];
3944 c
= STRING_CHAR_AND_LENGTH (from
+ i
, length
- i
, bytes
);
3952 *e
++ = base64_value_to_char
[value
| (0x03 & c
>> 6)];
3953 *e
++ = base64_value_to_char
[0x3f & c
];
3960 DEFUN ("base64-decode-region", Fbase64_decode_region
, Sbase64_decode_region
,
3962 doc
: /* Base64-decode the region between BEG and END.
3963 Return the length of the decoded text.
3964 If the region can't be decoded, signal an error and don't modify the buffer. */)
3966 Lisp_Object beg
, end
;
3968 int ibeg
, iend
, length
, allength
;
3973 int multibyte
= !NILP (current_buffer
->enable_multibyte_characters
);
3976 validate_region (&beg
, &end
);
3978 ibeg
= CHAR_TO_BYTE (XFASTINT (beg
));
3979 iend
= CHAR_TO_BYTE (XFASTINT (end
));
3981 length
= iend
- ibeg
;
3983 /* We need to allocate enough room for decoding the text. If we are
3984 working on a multibyte buffer, each decoded code may occupy at
3986 allength
= multibyte
? length
* 2 : length
;
3987 SAFE_ALLOCA (decoded
, char *, allength
);
3989 move_gap_both (XFASTINT (beg
), ibeg
);
3990 decoded_length
= base64_decode_1 (BYTE_POS_ADDR (ibeg
), decoded
, length
,
3991 multibyte
, &inserted_chars
);
3992 if (decoded_length
> allength
)
3995 if (decoded_length
< 0)
3997 /* The decoding wasn't possible. */
3999 error ("Invalid base64 data");
4002 /* Now we have decoded the region, so we insert the new contents
4003 and delete the old. (Insert first in order to preserve markers.) */
4004 TEMP_SET_PT_BOTH (XFASTINT (beg
), ibeg
);
4005 insert_1_both (decoded
, inserted_chars
, decoded_length
, 0, 1, 0);
4008 /* Delete the original text. */
4009 del_range_both (PT
, PT_BYTE
, XFASTINT (end
) + inserted_chars
,
4010 iend
+ decoded_length
, 1);
4012 /* If point was outside of the region, restore it exactly; else just
4013 move to the beginning of the region. */
4014 if (old_pos
>= XFASTINT (end
))
4015 old_pos
+= inserted_chars
- (XFASTINT (end
) - XFASTINT (beg
));
4016 else if (old_pos
> XFASTINT (beg
))
4017 old_pos
= XFASTINT (beg
);
4018 SET_PT (old_pos
> ZV
? ZV
: old_pos
);
4020 return make_number (inserted_chars
);
4023 DEFUN ("base64-decode-string", Fbase64_decode_string
, Sbase64_decode_string
,
4025 doc
: /* Base64-decode STRING and return the result. */)
4030 int length
, decoded_length
;
4031 Lisp_Object decoded_string
;
4034 CHECK_STRING (string
);
4036 length
= SBYTES (string
);
4037 /* We need to allocate enough room for decoding the text. */
4038 SAFE_ALLOCA (decoded
, char *, length
);
4040 /* The decoded result should be unibyte. */
4041 decoded_length
= base64_decode_1 (SDATA (string
), decoded
, length
,
4043 if (decoded_length
> length
)
4045 else if (decoded_length
>= 0)
4046 decoded_string
= make_unibyte_string (decoded
, decoded_length
);
4048 decoded_string
= Qnil
;
4051 if (!STRINGP (decoded_string
))
4052 error ("Invalid base64 data");
4054 return decoded_string
;
4057 /* Base64-decode the data at FROM of LENGHT bytes into TO. If
4058 MULTIBYTE is nonzero, the decoded result should be in multibyte
4059 form. If NCHARS_RETRUN is not NULL, store the number of produced
4060 characters in *NCHARS_RETURN. */
4063 base64_decode_1 (from
, to
, length
, multibyte
, nchars_return
)
4073 unsigned long value
;
4078 /* Process first byte of a quadruplet. */
4080 READ_QUADRUPLET_BYTE (e
-to
);
4084 value
= base64_char_to_value
[c
] << 18;
4086 /* Process second byte of a quadruplet. */
4088 READ_QUADRUPLET_BYTE (-1);
4092 value
|= base64_char_to_value
[c
] << 12;
4094 c
= (unsigned char) (value
>> 16);
4096 e
+= CHAR_STRING (c
, e
);
4101 /* Process third byte of a quadruplet. */
4103 READ_QUADRUPLET_BYTE (-1);
4107 READ_QUADRUPLET_BYTE (-1);
4116 value
|= base64_char_to_value
[c
] << 6;
4118 c
= (unsigned char) (0xff & value
>> 8);
4120 e
+= CHAR_STRING (c
, e
);
4125 /* Process fourth byte of a quadruplet. */
4127 READ_QUADRUPLET_BYTE (-1);
4134 value
|= base64_char_to_value
[c
];
4136 c
= (unsigned char) (0xff & value
);
4138 e
+= CHAR_STRING (c
, e
);
4147 /***********************************************************************
4149 ***** Hash Tables *****
4151 ***********************************************************************/
4153 /* Implemented by gerd@gnu.org. This hash table implementation was
4154 inspired by CMUCL hash tables. */
4158 1. For small tables, association lists are probably faster than
4159 hash tables because they have lower overhead.
4161 For uses of hash tables where the O(1) behavior of table
4162 operations is not a requirement, it might therefore be a good idea
4163 not to hash. Instead, we could just do a linear search in the
4164 key_and_value vector of the hash table. This could be done
4165 if a `:linear-search t' argument is given to make-hash-table. */
4168 /* The list of all weak hash tables. Don't staticpro this one. */
4170 Lisp_Object Vweak_hash_tables
;
4172 /* Various symbols. */
4174 Lisp_Object Qhash_table_p
, Qeq
, Qeql
, Qequal
, Qkey
, Qvalue
;
4175 Lisp_Object QCtest
, QCsize
, QCrehash_size
, QCrehash_threshold
, QCweakness
;
4176 Lisp_Object Qhash_table_test
, Qkey_or_value
, Qkey_and_value
;
4178 /* Function prototypes. */
4180 static struct Lisp_Hash_Table
*check_hash_table
P_ ((Lisp_Object
));
4181 static int get_key_arg
P_ ((Lisp_Object
, int, Lisp_Object
*, char *));
4182 static void maybe_resize_hash_table
P_ ((struct Lisp_Hash_Table
*));
4183 static int cmpfn_eql
P_ ((struct Lisp_Hash_Table
*, Lisp_Object
, unsigned,
4184 Lisp_Object
, unsigned));
4185 static int cmpfn_equal
P_ ((struct Lisp_Hash_Table
*, Lisp_Object
, unsigned,
4186 Lisp_Object
, unsigned));
4187 static int cmpfn_user_defined
P_ ((struct Lisp_Hash_Table
*, Lisp_Object
,
4188 unsigned, Lisp_Object
, unsigned));
4189 static unsigned hashfn_eq
P_ ((struct Lisp_Hash_Table
*, Lisp_Object
));
4190 static unsigned hashfn_eql
P_ ((struct Lisp_Hash_Table
*, Lisp_Object
));
4191 static unsigned hashfn_equal
P_ ((struct Lisp_Hash_Table
*, Lisp_Object
));
4192 static unsigned hashfn_user_defined
P_ ((struct Lisp_Hash_Table
*,
4194 static unsigned sxhash_string
P_ ((unsigned char *, int));
4195 static unsigned sxhash_list
P_ ((Lisp_Object
, int));
4196 static unsigned sxhash_vector
P_ ((Lisp_Object
, int));
4197 static unsigned sxhash_bool_vector
P_ ((Lisp_Object
));
4198 static int sweep_weak_table
P_ ((struct Lisp_Hash_Table
*, int));
4202 /***********************************************************************
4204 ***********************************************************************/
4206 /* If OBJ is a Lisp hash table, return a pointer to its struct
4207 Lisp_Hash_Table. Otherwise, signal an error. */
4209 static struct Lisp_Hash_Table
*
4210 check_hash_table (obj
)
4213 CHECK_HASH_TABLE (obj
);
4214 return XHASH_TABLE (obj
);
4218 /* Value is the next integer I >= N, N >= 0 which is "almost" a prime
4222 next_almost_prime (n
)
4235 /* Find KEY in ARGS which has size NARGS. Don't consider indices for
4236 which USED[I] is non-zero. If found at index I in ARGS, set
4237 USED[I] and USED[I + 1] to 1, and return I + 1. Otherwise return
4238 -1. This function is used to extract a keyword/argument pair from
4239 a DEFUN parameter list. */
4242 get_key_arg (key
, nargs
, args
, used
)
4250 for (i
= 0; i
< nargs
- 1; ++i
)
4251 if (!used
[i
] && EQ (args
[i
], key
))
4266 /* Return a Lisp vector which has the same contents as VEC but has
4267 size NEW_SIZE, NEW_SIZE >= VEC->size. Entries in the resulting
4268 vector that are not copied from VEC are set to INIT. */
4271 larger_vector (vec
, new_size
, init
)
4276 struct Lisp_Vector
*v
;
4279 xassert (VECTORP (vec
));
4280 old_size
= XVECTOR (vec
)->size
;
4281 xassert (new_size
>= old_size
);
4283 v
= allocate_vector (new_size
);
4284 bcopy (XVECTOR (vec
)->contents
, v
->contents
,
4285 old_size
* sizeof *v
->contents
);
4286 for (i
= old_size
; i
< new_size
; ++i
)
4287 v
->contents
[i
] = init
;
4288 XSETVECTOR (vec
, v
);
4293 /***********************************************************************
4295 ***********************************************************************/
4297 /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code
4298 HASH2 in hash table H using `eql'. Value is non-zero if KEY1 and
4299 KEY2 are the same. */
4302 cmpfn_eql (h
, key1
, hash1
, key2
, hash2
)
4303 struct Lisp_Hash_Table
*h
;
4304 Lisp_Object key1
, key2
;
4305 unsigned hash1
, hash2
;
4307 return (FLOATP (key1
)
4309 && XFLOAT_DATA (key1
) == XFLOAT_DATA (key2
));
4313 /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code
4314 HASH2 in hash table H using `equal'. Value is non-zero if KEY1 and
4315 KEY2 are the same. */
4318 cmpfn_equal (h
, key1
, hash1
, key2
, hash2
)
4319 struct Lisp_Hash_Table
*h
;
4320 Lisp_Object key1
, key2
;
4321 unsigned hash1
, hash2
;
4323 return hash1
== hash2
&& !NILP (Fequal (key1
, key2
));
4327 /* Compare KEY1 which has hash code HASH1, and KEY2 with hash code
4328 HASH2 in hash table H using H->user_cmp_function. Value is non-zero
4329 if KEY1 and KEY2 are the same. */
4332 cmpfn_user_defined (h
, key1
, hash1
, key2
, hash2
)
4333 struct Lisp_Hash_Table
*h
;
4334 Lisp_Object key1
, key2
;
4335 unsigned hash1
, hash2
;
4339 Lisp_Object args
[3];
4341 args
[0] = h
->user_cmp_function
;
4344 return !NILP (Ffuncall (3, args
));
4351 /* Value is a hash code for KEY for use in hash table H which uses
4352 `eq' to compare keys. The hash code returned is guaranteed to fit
4353 in a Lisp integer. */
4357 struct Lisp_Hash_Table
*h
;
4360 unsigned hash
= XUINT (key
) ^ XGCTYPE (key
);
4361 xassert ((hash
& ~INTMASK
) == 0);
4366 /* Value is a hash code for KEY for use in hash table H which uses
4367 `eql' to compare keys. The hash code returned is guaranteed to fit
4368 in a Lisp integer. */
4372 struct Lisp_Hash_Table
*h
;
4377 hash
= sxhash (key
, 0);
4379 hash
= XUINT (key
) ^ XGCTYPE (key
);
4380 xassert ((hash
& ~INTMASK
) == 0);
4385 /* Value is a hash code for KEY for use in hash table H which uses
4386 `equal' to compare keys. The hash code returned is guaranteed to fit
4387 in a Lisp integer. */
4390 hashfn_equal (h
, key
)
4391 struct Lisp_Hash_Table
*h
;
4394 unsigned hash
= sxhash (key
, 0);
4395 xassert ((hash
& ~INTMASK
) == 0);
4400 /* Value is a hash code for KEY for use in hash table H which uses as
4401 user-defined function to compare keys. The hash code returned is
4402 guaranteed to fit in a Lisp integer. */
4405 hashfn_user_defined (h
, key
)
4406 struct Lisp_Hash_Table
*h
;
4409 Lisp_Object args
[2], hash
;
4411 args
[0] = h
->user_hash_function
;
4413 hash
= Ffuncall (2, args
);
4414 if (!INTEGERP (hash
))
4416 list2 (build_string ("Invalid hash code returned from \
4417 user-supplied hash function"),
4419 return XUINT (hash
);
4423 /* Create and initialize a new hash table.
4425 TEST specifies the test the hash table will use to compare keys.
4426 It must be either one of the predefined tests `eq', `eql' or
4427 `equal' or a symbol denoting a user-defined test named TEST with
4428 test and hash functions USER_TEST and USER_HASH.
4430 Give the table initial capacity SIZE, SIZE >= 0, an integer.
4432 If REHASH_SIZE is an integer, it must be > 0, and this hash table's
4433 new size when it becomes full is computed by adding REHASH_SIZE to
4434 its old size. If REHASH_SIZE is a float, it must be > 1.0, and the
4435 table's new size is computed by multiplying its old size with
4438 REHASH_THRESHOLD must be a float <= 1.0, and > 0. The table will
4439 be resized when the ratio of (number of entries in the table) /
4440 (table size) is >= REHASH_THRESHOLD.
4442 WEAK specifies the weakness of the table. If non-nil, it must be
4443 one of the symbols `key', `value', `key-or-value', or `key-and-value'. */
4446 make_hash_table (test
, size
, rehash_size
, rehash_threshold
, weak
,
4447 user_test
, user_hash
)
4448 Lisp_Object test
, size
, rehash_size
, rehash_threshold
, weak
;
4449 Lisp_Object user_test
, user_hash
;
4451 struct Lisp_Hash_Table
*h
;
4453 int index_size
, i
, sz
;
4455 /* Preconditions. */
4456 xassert (SYMBOLP (test
));
4457 xassert (INTEGERP (size
) && XINT (size
) >= 0);
4458 xassert ((INTEGERP (rehash_size
) && XINT (rehash_size
) > 0)
4459 || (FLOATP (rehash_size
) && XFLOATINT (rehash_size
) > 1.0));
4460 xassert (FLOATP (rehash_threshold
)
4461 && XFLOATINT (rehash_threshold
) > 0
4462 && XFLOATINT (rehash_threshold
) <= 1.0);
4464 if (XFASTINT (size
) == 0)
4465 size
= make_number (1);
4467 /* Allocate a table and initialize it. */
4468 h
= allocate_hash_table ();
4470 /* Initialize hash table slots. */
4471 sz
= XFASTINT (size
);
4474 if (EQ (test
, Qeql
))
4476 h
->cmpfn
= cmpfn_eql
;
4477 h
->hashfn
= hashfn_eql
;
4479 else if (EQ (test
, Qeq
))
4482 h
->hashfn
= hashfn_eq
;
4484 else if (EQ (test
, Qequal
))
4486 h
->cmpfn
= cmpfn_equal
;
4487 h
->hashfn
= hashfn_equal
;
4491 h
->user_cmp_function
= user_test
;
4492 h
->user_hash_function
= user_hash
;
4493 h
->cmpfn
= cmpfn_user_defined
;
4494 h
->hashfn
= hashfn_user_defined
;
4498 h
->rehash_threshold
= rehash_threshold
;
4499 h
->rehash_size
= rehash_size
;
4500 h
->count
= make_number (0);
4501 h
->key_and_value
= Fmake_vector (make_number (2 * sz
), Qnil
);
4502 h
->hash
= Fmake_vector (size
, Qnil
);
4503 h
->next
= Fmake_vector (size
, Qnil
);
4504 /* Cast to int here avoids losing with gcc 2.95 on Tru64/Alpha... */
4505 index_size
= next_almost_prime ((int) (sz
/ XFLOATINT (rehash_threshold
)));
4506 h
->index
= Fmake_vector (make_number (index_size
), Qnil
);
4508 /* Set up the free list. */
4509 for (i
= 0; i
< sz
- 1; ++i
)
4510 HASH_NEXT (h
, i
) = make_number (i
+ 1);
4511 h
->next_free
= make_number (0);
4513 XSET_HASH_TABLE (table
, h
);
4514 xassert (HASH_TABLE_P (table
));
4515 xassert (XHASH_TABLE (table
) == h
);
4517 /* Maybe add this hash table to the list of all weak hash tables. */
4519 h
->next_weak
= Qnil
;
4522 h
->next_weak
= Vweak_hash_tables
;
4523 Vweak_hash_tables
= table
;
4530 /* Return a copy of hash table H1. Keys and values are not copied,
4531 only the table itself is. */
4534 copy_hash_table (h1
)
4535 struct Lisp_Hash_Table
*h1
;
4538 struct Lisp_Hash_Table
*h2
;
4539 struct Lisp_Vector
*next
;
4541 h2
= allocate_hash_table ();
4542 next
= h2
->vec_next
;
4543 bcopy (h1
, h2
, sizeof *h2
);
4544 h2
->vec_next
= next
;
4545 h2
->key_and_value
= Fcopy_sequence (h1
->key_and_value
);
4546 h2
->hash
= Fcopy_sequence (h1
->hash
);
4547 h2
->next
= Fcopy_sequence (h1
->next
);
4548 h2
->index
= Fcopy_sequence (h1
->index
);
4549 XSET_HASH_TABLE (table
, h2
);
4551 /* Maybe add this hash table to the list of all weak hash tables. */
4552 if (!NILP (h2
->weak
))
4554 h2
->next_weak
= Vweak_hash_tables
;
4555 Vweak_hash_tables
= table
;
4562 /* Resize hash table H if it's too full. If H cannot be resized
4563 because it's already too large, throw an error. */
4566 maybe_resize_hash_table (h
)
4567 struct Lisp_Hash_Table
*h
;
4569 if (NILP (h
->next_free
))
4571 int old_size
= HASH_TABLE_SIZE (h
);
4572 int i
, new_size
, index_size
;
4574 if (INTEGERP (h
->rehash_size
))
4575 new_size
= old_size
+ XFASTINT (h
->rehash_size
);
4577 new_size
= old_size
* XFLOATINT (h
->rehash_size
);
4578 new_size
= max (old_size
+ 1, new_size
);
4579 index_size
= next_almost_prime ((int)
4581 / XFLOATINT (h
->rehash_threshold
)));
4582 if (max (index_size
, 2 * new_size
) > MOST_POSITIVE_FIXNUM
)
4583 error ("Hash table too large to resize");
4585 h
->key_and_value
= larger_vector (h
->key_and_value
, 2 * new_size
, Qnil
);
4586 h
->next
= larger_vector (h
->next
, new_size
, Qnil
);
4587 h
->hash
= larger_vector (h
->hash
, new_size
, Qnil
);
4588 h
->index
= Fmake_vector (make_number (index_size
), Qnil
);
4590 /* Update the free list. Do it so that new entries are added at
4591 the end of the free list. This makes some operations like
4593 for (i
= old_size
; i
< new_size
- 1; ++i
)
4594 HASH_NEXT (h
, i
) = make_number (i
+ 1);
4596 if (!NILP (h
->next_free
))
4598 Lisp_Object last
, next
;
4600 last
= h
->next_free
;
4601 while (next
= HASH_NEXT (h
, XFASTINT (last
)),
4605 HASH_NEXT (h
, XFASTINT (last
)) = make_number (old_size
);
4608 XSETFASTINT (h
->next_free
, old_size
);
4611 for (i
= 0; i
< old_size
; ++i
)
4612 if (!NILP (HASH_HASH (h
, i
)))
4614 unsigned hash_code
= XUINT (HASH_HASH (h
, i
));
4615 int start_of_bucket
= hash_code
% XVECTOR (h
->index
)->size
;
4616 HASH_NEXT (h
, i
) = HASH_INDEX (h
, start_of_bucket
);
4617 HASH_INDEX (h
, start_of_bucket
) = make_number (i
);
4623 /* Lookup KEY in hash table H. If HASH is non-null, return in *HASH
4624 the hash code of KEY. Value is the index of the entry in H
4625 matching KEY, or -1 if not found. */
4628 hash_lookup (h
, key
, hash
)
4629 struct Lisp_Hash_Table
*h
;
4634 int start_of_bucket
;
4637 hash_code
= h
->hashfn (h
, key
);
4641 start_of_bucket
= hash_code
% XVECTOR (h
->index
)->size
;
4642 idx
= HASH_INDEX (h
, start_of_bucket
);
4644 /* We need not gcpro idx since it's either an integer or nil. */
4647 int i
= XFASTINT (idx
);
4648 if (EQ (key
, HASH_KEY (h
, i
))
4650 && h
->cmpfn (h
, key
, hash_code
,
4651 HASH_KEY (h
, i
), XUINT (HASH_HASH (h
, i
)))))
4653 idx
= HASH_NEXT (h
, i
);
4656 return NILP (idx
) ? -1 : XFASTINT (idx
);
4660 /* Put an entry into hash table H that associates KEY with VALUE.
4661 HASH is a previously computed hash code of KEY.
4662 Value is the index of the entry in H matching KEY. */
4665 hash_put (h
, key
, value
, hash
)
4666 struct Lisp_Hash_Table
*h
;
4667 Lisp_Object key
, value
;
4670 int start_of_bucket
, i
;
4672 xassert ((hash
& ~INTMASK
) == 0);
4674 /* Increment count after resizing because resizing may fail. */
4675 maybe_resize_hash_table (h
);
4676 h
->count
= make_number (XFASTINT (h
->count
) + 1);
4678 /* Store key/value in the key_and_value vector. */
4679 i
= XFASTINT (h
->next_free
);
4680 h
->next_free
= HASH_NEXT (h
, i
);
4681 HASH_KEY (h
, i
) = key
;
4682 HASH_VALUE (h
, i
) = value
;
4684 /* Remember its hash code. */
4685 HASH_HASH (h
, i
) = make_number (hash
);
4687 /* Add new entry to its collision chain. */
4688 start_of_bucket
= hash
% XVECTOR (h
->index
)->size
;
4689 HASH_NEXT (h
, i
) = HASH_INDEX (h
, start_of_bucket
);
4690 HASH_INDEX (h
, start_of_bucket
) = make_number (i
);
4695 /* Remove the entry matching KEY from hash table H, if there is one. */
4698 hash_remove (h
, key
)
4699 struct Lisp_Hash_Table
*h
;
4703 int start_of_bucket
;
4704 Lisp_Object idx
, prev
;
4706 hash_code
= h
->hashfn (h
, key
);
4707 start_of_bucket
= hash_code
% XVECTOR (h
->index
)->size
;
4708 idx
= HASH_INDEX (h
, start_of_bucket
);
4711 /* We need not gcpro idx, prev since they're either integers or nil. */
4714 int i
= XFASTINT (idx
);
4716 if (EQ (key
, HASH_KEY (h
, i
))
4718 && h
->cmpfn (h
, key
, hash_code
,
4719 HASH_KEY (h
, i
), XUINT (HASH_HASH (h
, i
)))))
4721 /* Take entry out of collision chain. */
4723 HASH_INDEX (h
, start_of_bucket
) = HASH_NEXT (h
, i
);
4725 HASH_NEXT (h
, XFASTINT (prev
)) = HASH_NEXT (h
, i
);
4727 /* Clear slots in key_and_value and add the slots to
4729 HASH_KEY (h
, i
) = HASH_VALUE (h
, i
) = HASH_HASH (h
, i
) = Qnil
;
4730 HASH_NEXT (h
, i
) = h
->next_free
;
4731 h
->next_free
= make_number (i
);
4732 h
->count
= make_number (XFASTINT (h
->count
) - 1);
4733 xassert (XINT (h
->count
) >= 0);
4739 idx
= HASH_NEXT (h
, i
);
4745 /* Clear hash table H. */
4749 struct Lisp_Hash_Table
*h
;
4751 if (XFASTINT (h
->count
) > 0)
4753 int i
, size
= HASH_TABLE_SIZE (h
);
4755 for (i
= 0; i
< size
; ++i
)
4757 HASH_NEXT (h
, i
) = i
< size
- 1 ? make_number (i
+ 1) : Qnil
;
4758 HASH_KEY (h
, i
) = Qnil
;
4759 HASH_VALUE (h
, i
) = Qnil
;
4760 HASH_HASH (h
, i
) = Qnil
;
4763 for (i
= 0; i
< XVECTOR (h
->index
)->size
; ++i
)
4764 XVECTOR (h
->index
)->contents
[i
] = Qnil
;
4766 h
->next_free
= make_number (0);
4767 h
->count
= make_number (0);
4773 /************************************************************************
4775 ************************************************************************/
4777 /* Sweep weak hash table H. REMOVE_ENTRIES_P non-zero means remove
4778 entries from the table that don't survive the current GC.
4779 REMOVE_ENTRIES_P zero means mark entries that are in use. Value is
4780 non-zero if anything was marked. */
4783 sweep_weak_table (h
, remove_entries_p
)
4784 struct Lisp_Hash_Table
*h
;
4785 int remove_entries_p
;
4787 int bucket
, n
, marked
;
4789 n
= XVECTOR (h
->index
)->size
& ~ARRAY_MARK_FLAG
;
4792 for (bucket
= 0; bucket
< n
; ++bucket
)
4794 Lisp_Object idx
, next
, prev
;
4796 /* Follow collision chain, removing entries that
4797 don't survive this garbage collection. */
4799 for (idx
= HASH_INDEX (h
, bucket
); !GC_NILP (idx
); idx
= next
)
4801 int i
= XFASTINT (idx
);
4802 int key_known_to_survive_p
= survives_gc_p (HASH_KEY (h
, i
));
4803 int value_known_to_survive_p
= survives_gc_p (HASH_VALUE (h
, i
));
4806 if (EQ (h
->weak
, Qkey
))
4807 remove_p
= !key_known_to_survive_p
;
4808 else if (EQ (h
->weak
, Qvalue
))
4809 remove_p
= !value_known_to_survive_p
;
4810 else if (EQ (h
->weak
, Qkey_or_value
))
4811 remove_p
= !(key_known_to_survive_p
|| value_known_to_survive_p
);
4812 else if (EQ (h
->weak
, Qkey_and_value
))
4813 remove_p
= !(key_known_to_survive_p
&& value_known_to_survive_p
);
4817 next
= HASH_NEXT (h
, i
);
4819 if (remove_entries_p
)
4823 /* Take out of collision chain. */
4825 HASH_INDEX (h
, bucket
) = next
;
4827 HASH_NEXT (h
, XFASTINT (prev
)) = next
;
4829 /* Add to free list. */
4830 HASH_NEXT (h
, i
) = h
->next_free
;
4833 /* Clear key, value, and hash. */
4834 HASH_KEY (h
, i
) = HASH_VALUE (h
, i
) = Qnil
;
4835 HASH_HASH (h
, i
) = Qnil
;
4837 h
->count
= make_number (XFASTINT (h
->count
) - 1);
4848 /* Make sure key and value survive. */
4849 if (!key_known_to_survive_p
)
4851 mark_object (HASH_KEY (h
, i
));
4855 if (!value_known_to_survive_p
)
4857 mark_object (HASH_VALUE (h
, i
));
4868 /* Remove elements from weak hash tables that don't survive the
4869 current garbage collection. Remove weak tables that don't survive
4870 from Vweak_hash_tables. Called from gc_sweep. */
4873 sweep_weak_hash_tables ()
4875 Lisp_Object table
, used
, next
;
4876 struct Lisp_Hash_Table
*h
;
4879 /* Mark all keys and values that are in use. Keep on marking until
4880 there is no more change. This is necessary for cases like
4881 value-weak table A containing an entry X -> Y, where Y is used in a
4882 key-weak table B, Z -> Y. If B comes after A in the list of weak
4883 tables, X -> Y might be removed from A, although when looking at B
4884 one finds that it shouldn't. */
4888 for (table
= Vweak_hash_tables
; !GC_NILP (table
); table
= h
->next_weak
)
4890 h
= XHASH_TABLE (table
);
4891 if (h
->size
& ARRAY_MARK_FLAG
)
4892 marked
|= sweep_weak_table (h
, 0);
4897 /* Remove tables and entries that aren't used. */
4898 for (table
= Vweak_hash_tables
, used
= Qnil
; !GC_NILP (table
); table
= next
)
4900 h
= XHASH_TABLE (table
);
4901 next
= h
->next_weak
;
4903 if (h
->size
& ARRAY_MARK_FLAG
)
4905 /* TABLE is marked as used. Sweep its contents. */
4906 if (XFASTINT (h
->count
) > 0)
4907 sweep_weak_table (h
, 1);
4909 /* Add table to the list of used weak hash tables. */
4910 h
->next_weak
= used
;
4915 Vweak_hash_tables
= used
;
4920 /***********************************************************************
4921 Hash Code Computation
4922 ***********************************************************************/
4924 /* Maximum depth up to which to dive into Lisp structures. */
4926 #define SXHASH_MAX_DEPTH 3
4928 /* Maximum length up to which to take list and vector elements into
4931 #define SXHASH_MAX_LEN 7
4933 /* Combine two integers X and Y for hashing. */
4935 #define SXHASH_COMBINE(X, Y) \
4936 ((((unsigned)(X) << 4) + (((unsigned)(X) >> 24) & 0x0fffffff)) \
4940 /* Return a hash for string PTR which has length LEN. The hash
4941 code returned is guaranteed to fit in a Lisp integer. */
4944 sxhash_string (ptr
, len
)
4948 unsigned char *p
= ptr
;
4949 unsigned char *end
= p
+ len
;
4958 hash
= ((hash
<< 3) + (hash
>> 28) + c
);
4961 return hash
& INTMASK
;
4965 /* Return a hash for list LIST. DEPTH is the current depth in the
4966 list. We don't recurse deeper than SXHASH_MAX_DEPTH in it. */
4969 sxhash_list (list
, depth
)
4976 if (depth
< SXHASH_MAX_DEPTH
)
4978 CONSP (list
) && i
< SXHASH_MAX_LEN
;
4979 list
= XCDR (list
), ++i
)
4981 unsigned hash2
= sxhash (XCAR (list
), depth
+ 1);
4982 hash
= SXHASH_COMBINE (hash
, hash2
);
4989 /* Return a hash for vector VECTOR. DEPTH is the current depth in
4990 the Lisp structure. */
4993 sxhash_vector (vec
, depth
)
4997 unsigned hash
= XVECTOR (vec
)->size
;
5000 n
= min (SXHASH_MAX_LEN
, XVECTOR (vec
)->size
);
5001 for (i
= 0; i
< n
; ++i
)
5003 unsigned hash2
= sxhash (XVECTOR (vec
)->contents
[i
], depth
+ 1);
5004 hash
= SXHASH_COMBINE (hash
, hash2
);
5011 /* Return a hash for bool-vector VECTOR. */
5014 sxhash_bool_vector (vec
)
5017 unsigned hash
= XBOOL_VECTOR (vec
)->size
;
5020 n
= min (SXHASH_MAX_LEN
, XBOOL_VECTOR (vec
)->vector_size
);
5021 for (i
= 0; i
< n
; ++i
)
5022 hash
= SXHASH_COMBINE (hash
, XBOOL_VECTOR (vec
)->data
[i
]);
5028 /* Return a hash code for OBJ. DEPTH is the current depth in the Lisp
5029 structure. Value is an unsigned integer clipped to INTMASK. */
5038 if (depth
> SXHASH_MAX_DEPTH
)
5041 switch (XTYPE (obj
))
5052 obj
= SYMBOL_NAME (obj
);
5056 hash
= sxhash_string (SDATA (obj
), SCHARS (obj
));
5059 /* This can be everything from a vector to an overlay. */
5060 case Lisp_Vectorlike
:
5062 /* According to the CL HyperSpec, two arrays are equal only if
5063 they are `eq', except for strings and bit-vectors. In
5064 Emacs, this works differently. We have to compare element
5066 hash
= sxhash_vector (obj
, depth
);
5067 else if (BOOL_VECTOR_P (obj
))
5068 hash
= sxhash_bool_vector (obj
);
5070 /* Others are `equal' if they are `eq', so let's take their
5076 hash
= sxhash_list (obj
, depth
);
5081 unsigned char *p
= (unsigned char *) &XFLOAT_DATA (obj
);
5082 unsigned char *e
= p
+ sizeof XFLOAT_DATA (obj
);
5083 for (hash
= 0; p
< e
; ++p
)
5084 hash
= SXHASH_COMBINE (hash
, *p
);
5092 return hash
& INTMASK
;
5097 /***********************************************************************
5099 ***********************************************************************/
5102 DEFUN ("sxhash", Fsxhash
, Ssxhash
, 1, 1, 0,
5103 doc
: /* Compute a hash code for OBJ and return it as integer. */)
5107 unsigned hash
= sxhash (obj
, 0);;
5108 return make_number (hash
);
5112 DEFUN ("make-hash-table", Fmake_hash_table
, Smake_hash_table
, 0, MANY
, 0,
5113 doc
: /* Create and return a new hash table.
5115 Arguments are specified as keyword/argument pairs. The following
5116 arguments are defined:
5118 :test TEST -- TEST must be a symbol that specifies how to compare
5119 keys. Default is `eql'. Predefined are the tests `eq', `eql', and
5120 `equal'. User-supplied test and hash functions can be specified via
5121 `define-hash-table-test'.
5123 :size SIZE -- A hint as to how many elements will be put in the table.
5126 :rehash-size REHASH-SIZE - Indicates how to expand the table when it
5127 fills up. If REHASH-SIZE is an integer, add that many space. If it
5128 is a float, it must be > 1.0, and the new size is computed by
5129 multiplying the old size with that factor. Default is 1.5.
5131 :rehash-threshold THRESHOLD -- THRESHOLD must a float > 0, and <= 1.0.
5132 Resize the hash table when ratio of the number of entries in the
5133 table. Default is 0.8.
5135 :weakness WEAK -- WEAK must be one of nil, t, `key', `value',
5136 `key-or-value', or `key-and-value'. If WEAK is not nil, the table
5137 returned is a weak table. Key/value pairs are removed from a weak
5138 hash table when there are no non-weak references pointing to their
5139 key, value, one of key or value, or both key and value, depending on
5140 WEAK. WEAK t is equivalent to `key-and-value'. Default value of WEAK
5143 usage: (make-hash-table &rest KEYWORD-ARGS) */)
5148 Lisp_Object test
, size
, rehash_size
, rehash_threshold
, weak
;
5149 Lisp_Object user_test
, user_hash
;
5153 /* The vector `used' is used to keep track of arguments that
5154 have been consumed. */
5155 used
= (char *) alloca (nargs
* sizeof *used
);
5156 bzero (used
, nargs
* sizeof *used
);
5158 /* See if there's a `:test TEST' among the arguments. */
5159 i
= get_key_arg (QCtest
, nargs
, args
, used
);
5160 test
= i
< 0 ? Qeql
: args
[i
];
5161 if (!EQ (test
, Qeq
) && !EQ (test
, Qeql
) && !EQ (test
, Qequal
))
5163 /* See if it is a user-defined test. */
5166 prop
= Fget (test
, Qhash_table_test
);
5167 if (!CONSP (prop
) || !CONSP (XCDR (prop
)))
5168 Fsignal (Qerror
, list2 (build_string ("Invalid hash table test"),
5170 user_test
= XCAR (prop
);
5171 user_hash
= XCAR (XCDR (prop
));
5174 user_test
= user_hash
= Qnil
;
5176 /* See if there's a `:size SIZE' argument. */
5177 i
= get_key_arg (QCsize
, nargs
, args
, used
);
5178 size
= i
< 0 ? Qnil
: args
[i
];
5180 size
= make_number (DEFAULT_HASH_SIZE
);
5181 else if (!INTEGERP (size
) || XINT (size
) < 0)
5183 list2 (build_string ("Invalid hash table size"),
5186 /* Look for `:rehash-size SIZE'. */
5187 i
= get_key_arg (QCrehash_size
, nargs
, args
, used
);
5188 rehash_size
= i
< 0 ? make_float (DEFAULT_REHASH_SIZE
) : args
[i
];
5189 if (!NUMBERP (rehash_size
)
5190 || (INTEGERP (rehash_size
) && XINT (rehash_size
) <= 0)
5191 || XFLOATINT (rehash_size
) <= 1.0)
5193 list2 (build_string ("Invalid hash table rehash size"),
5196 /* Look for `:rehash-threshold THRESHOLD'. */
5197 i
= get_key_arg (QCrehash_threshold
, nargs
, args
, used
);
5198 rehash_threshold
= i
< 0 ? make_float (DEFAULT_REHASH_THRESHOLD
) : args
[i
];
5199 if (!FLOATP (rehash_threshold
)
5200 || XFLOATINT (rehash_threshold
) <= 0.0
5201 || XFLOATINT (rehash_threshold
) > 1.0)
5203 list2 (build_string ("Invalid hash table rehash threshold"),
5206 /* Look for `:weakness WEAK'. */
5207 i
= get_key_arg (QCweakness
, nargs
, args
, used
);
5208 weak
= i
< 0 ? Qnil
: args
[i
];
5210 weak
= Qkey_and_value
;
5213 && !EQ (weak
, Qvalue
)
5214 && !EQ (weak
, Qkey_or_value
)
5215 && !EQ (weak
, Qkey_and_value
))
5216 Fsignal (Qerror
, list2 (build_string ("Invalid hash table weakness"),
5219 /* Now, all args should have been used up, or there's a problem. */
5220 for (i
= 0; i
< nargs
; ++i
)
5223 list2 (build_string ("Invalid argument list"), args
[i
]));
5225 return make_hash_table (test
, size
, rehash_size
, rehash_threshold
, weak
,
5226 user_test
, user_hash
);
5230 DEFUN ("copy-hash-table", Fcopy_hash_table
, Scopy_hash_table
, 1, 1, 0,
5231 doc
: /* Return a copy of hash table TABLE. */)
5235 return copy_hash_table (check_hash_table (table
));
5239 DEFUN ("hash-table-count", Fhash_table_count
, Shash_table_count
, 1, 1, 0,
5240 doc
: /* Return the number of elements in TABLE. */)
5244 return check_hash_table (table
)->count
;
5248 DEFUN ("hash-table-rehash-size", Fhash_table_rehash_size
,
5249 Shash_table_rehash_size
, 1, 1, 0,
5250 doc
: /* Return the current rehash size of TABLE. */)
5254 return check_hash_table (table
)->rehash_size
;
5258 DEFUN ("hash-table-rehash-threshold", Fhash_table_rehash_threshold
,
5259 Shash_table_rehash_threshold
, 1, 1, 0,
5260 doc
: /* Return the current rehash threshold of TABLE. */)
5264 return check_hash_table (table
)->rehash_threshold
;
5268 DEFUN ("hash-table-size", Fhash_table_size
, Shash_table_size
, 1, 1, 0,
5269 doc
: /* Return the size of TABLE.
5270 The size can be used as an argument to `make-hash-table' to create
5271 a hash table than can hold as many elements of TABLE holds
5272 without need for resizing. */)
5276 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
5277 return make_number (HASH_TABLE_SIZE (h
));
5281 DEFUN ("hash-table-test", Fhash_table_test
, Shash_table_test
, 1, 1, 0,
5282 doc
: /* Return the test TABLE uses. */)
5286 return check_hash_table (table
)->test
;
5290 DEFUN ("hash-table-weakness", Fhash_table_weakness
, Shash_table_weakness
,
5292 doc
: /* Return the weakness of TABLE. */)
5296 return check_hash_table (table
)->weak
;
5300 DEFUN ("hash-table-p", Fhash_table_p
, Shash_table_p
, 1, 1, 0,
5301 doc
: /* Return t if OBJ is a Lisp hash table object. */)
5305 return HASH_TABLE_P (obj
) ? Qt
: Qnil
;
5309 DEFUN ("clrhash", Fclrhash
, Sclrhash
, 1, 1, 0,
5310 doc
: /* Clear hash table TABLE. */)
5314 hash_clear (check_hash_table (table
));
5319 DEFUN ("gethash", Fgethash
, Sgethash
, 2, 3, 0,
5320 doc
: /* Look up KEY in TABLE and return its associated value.
5321 If KEY is not found, return DFLT which defaults to nil. */)
5323 Lisp_Object key
, table
, dflt
;
5325 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
5326 int i
= hash_lookup (h
, key
, NULL
);
5327 return i
>= 0 ? HASH_VALUE (h
, i
) : dflt
;
5331 DEFUN ("puthash", Fputhash
, Sputhash
, 3, 3, 0,
5332 doc
: /* Associate KEY with VALUE in hash table TABLE.
5333 If KEY is already present in table, replace its current value with
5336 Lisp_Object key
, value
, table
;
5338 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
5342 i
= hash_lookup (h
, key
, &hash
);
5344 HASH_VALUE (h
, i
) = value
;
5346 hash_put (h
, key
, value
, hash
);
5352 DEFUN ("remhash", Fremhash
, Sremhash
, 2, 2, 0,
5353 doc
: /* Remove KEY from TABLE. */)
5355 Lisp_Object key
, table
;
5357 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
5358 hash_remove (h
, key
);
5363 DEFUN ("maphash", Fmaphash
, Smaphash
, 2, 2, 0,
5364 doc
: /* Call FUNCTION for all entries in hash table TABLE.
5365 FUNCTION is called with 2 arguments KEY and VALUE. */)
5367 Lisp_Object function
, table
;
5369 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
5370 Lisp_Object args
[3];
5373 for (i
= 0; i
< HASH_TABLE_SIZE (h
); ++i
)
5374 if (!NILP (HASH_HASH (h
, i
)))
5377 args
[1] = HASH_KEY (h
, i
);
5378 args
[2] = HASH_VALUE (h
, i
);
5386 DEFUN ("define-hash-table-test", Fdefine_hash_table_test
,
5387 Sdefine_hash_table_test
, 3, 3, 0,
5388 doc
: /* Define a new hash table test with name NAME, a symbol.
5390 In hash tables created with NAME specified as test, use TEST to
5391 compare keys, and HASH for computing hash codes of keys.
5393 TEST must be a function taking two arguments and returning non-nil if
5394 both arguments are the same. HASH must be a function taking one
5395 argument and return an integer that is the hash code of the argument.
5396 Hash code computation should use the whole value range of integers,
5397 including negative integers. */)
5399 Lisp_Object name
, test
, hash
;
5401 return Fput (name
, Qhash_table_test
, list2 (test
, hash
));
5406 /************************************************************************
5408 ************************************************************************/
5413 DEFUN ("md5", Fmd5
, Smd5
, 1, 5, 0,
5414 doc
: /* Return MD5 message digest of OBJECT, a buffer or string.
5416 A message digest is a cryptographic checksum of a document, and the
5417 algorithm to calculate it is defined in RFC 1321.
5419 The two optional arguments START and END are character positions
5420 specifying for which part of OBJECT the message digest should be
5421 computed. If nil or omitted, the digest is computed for the whole
5424 The MD5 message digest is computed from the result of encoding the
5425 text in a coding system, not directly from the internal Emacs form of
5426 the text. The optional fourth argument CODING-SYSTEM specifies which
5427 coding system to encode the text with. It should be the same coding
5428 system that you used or will use when actually writing the text into a
5431 If CODING-SYSTEM is nil or omitted, the default depends on OBJECT. If
5432 OBJECT is a buffer, the default for CODING-SYSTEM is whatever coding
5433 system would be chosen by default for writing this text into a file.
5435 If OBJECT is a string, the most preferred coding system (see the
5436 command `prefer-coding-system') is used.
5438 If NOERROR is non-nil, silently assume the `raw-text' coding if the
5439 guesswork fails. Normally, an error is signaled in such case. */)
5440 (object
, start
, end
, coding_system
, noerror
)
5441 Lisp_Object object
, start
, end
, coding_system
, noerror
;
5443 unsigned char digest
[16];
5444 unsigned char value
[33];
5448 int start_char
= 0, end_char
= 0;
5449 int start_byte
= 0, end_byte
= 0;
5451 register struct buffer
*bp
;
5454 if (STRINGP (object
))
5456 if (NILP (coding_system
))
5458 /* Decide the coding-system to encode the data with. */
5460 if (STRING_MULTIBYTE (object
))
5461 /* use default, we can't guess correct value */
5462 coding_system
= SYMBOL_VALUE (XCAR (Vcoding_category_list
));
5464 coding_system
= Qraw_text
;
5467 if (NILP (Fcoding_system_p (coding_system
)))
5469 /* Invalid coding system. */
5471 if (!NILP (noerror
))
5472 coding_system
= Qraw_text
;
5475 Fsignal (Qcoding_system_error
, Fcons (coding_system
, Qnil
));
5478 if (STRING_MULTIBYTE (object
))
5479 object
= code_convert_string1 (object
, coding_system
, Qnil
, 1);
5481 size
= SCHARS (object
);
5482 size_byte
= SBYTES (object
);
5486 CHECK_NUMBER (start
);
5488 start_char
= XINT (start
);
5493 start_byte
= string_char_to_byte (object
, start_char
);
5499 end_byte
= size_byte
;
5505 end_char
= XINT (end
);
5510 end_byte
= string_char_to_byte (object
, end_char
);
5513 if (!(0 <= start_char
&& start_char
<= end_char
&& end_char
<= size
))
5514 args_out_of_range_3 (object
, make_number (start_char
),
5515 make_number (end_char
));
5519 struct buffer
*prev
= current_buffer
;
5521 record_unwind_protect (Fset_buffer
, Fcurrent_buffer ());
5523 CHECK_BUFFER (object
);
5525 bp
= XBUFFER (object
);
5526 if (bp
!= current_buffer
)
5527 set_buffer_internal (bp
);
5533 CHECK_NUMBER_COERCE_MARKER (start
);
5541 CHECK_NUMBER_COERCE_MARKER (end
);
5546 temp
= b
, b
= e
, e
= temp
;
5548 if (!(BEGV
<= b
&& e
<= ZV
))
5549 args_out_of_range (start
, end
);
5551 if (NILP (coding_system
))
5553 /* Decide the coding-system to encode the data with.
5554 See fileio.c:Fwrite-region */
5556 if (!NILP (Vcoding_system_for_write
))
5557 coding_system
= Vcoding_system_for_write
;
5560 int force_raw_text
= 0;
5562 coding_system
= XBUFFER (object
)->buffer_file_coding_system
;
5563 if (NILP (coding_system
)
5564 || NILP (Flocal_variable_p (Qbuffer_file_coding_system
, Qnil
)))
5566 coding_system
= Qnil
;
5567 if (NILP (current_buffer
->enable_multibyte_characters
))
5571 if (NILP (coding_system
) && !NILP (Fbuffer_file_name(object
)))
5573 /* Check file-coding-system-alist. */
5574 Lisp_Object args
[4], val
;
5576 args
[0] = Qwrite_region
; args
[1] = start
; args
[2] = end
;
5577 args
[3] = Fbuffer_file_name(object
);
5578 val
= Ffind_operation_coding_system (4, args
);
5579 if (CONSP (val
) && !NILP (XCDR (val
)))
5580 coding_system
= XCDR (val
);
5583 if (NILP (coding_system
)
5584 && !NILP (XBUFFER (object
)->buffer_file_coding_system
))
5586 /* If we still have not decided a coding system, use the
5587 default value of buffer-file-coding-system. */
5588 coding_system
= XBUFFER (object
)->buffer_file_coding_system
;
5592 && !NILP (Ffboundp (Vselect_safe_coding_system_function
)))
5593 /* Confirm that VAL can surely encode the current region. */
5594 coding_system
= call4 (Vselect_safe_coding_system_function
,
5595 make_number (b
), make_number (e
),
5596 coding_system
, Qnil
);
5599 coding_system
= Qraw_text
;
5602 if (NILP (Fcoding_system_p (coding_system
)))
5604 /* Invalid coding system. */
5606 if (!NILP (noerror
))
5607 coding_system
= Qraw_text
;
5610 Fsignal (Qcoding_system_error
, Fcons (coding_system
, Qnil
));
5614 object
= make_buffer_string (b
, e
, 0);
5615 if (prev
!= current_buffer
)
5616 set_buffer_internal (prev
);
5617 /* Discard the unwind protect for recovering the current
5621 if (STRING_MULTIBYTE (object
))
5622 object
= code_convert_string1 (object
, coding_system
, Qnil
, 1);
5625 md5_buffer (SDATA (object
) + start_byte
,
5626 SBYTES (object
) - (size_byte
- end_byte
),
5629 for (i
= 0; i
< 16; i
++)
5630 sprintf (&value
[2 * i
], "%02x", digest
[i
]);
5633 return make_string (value
, 32);
5640 /* Hash table stuff. */
5641 Qhash_table_p
= intern ("hash-table-p");
5642 staticpro (&Qhash_table_p
);
5643 Qeq
= intern ("eq");
5645 Qeql
= intern ("eql");
5647 Qequal
= intern ("equal");
5648 staticpro (&Qequal
);
5649 QCtest
= intern (":test");
5650 staticpro (&QCtest
);
5651 QCsize
= intern (":size");
5652 staticpro (&QCsize
);
5653 QCrehash_size
= intern (":rehash-size");
5654 staticpro (&QCrehash_size
);
5655 QCrehash_threshold
= intern (":rehash-threshold");
5656 staticpro (&QCrehash_threshold
);
5657 QCweakness
= intern (":weakness");
5658 staticpro (&QCweakness
);
5659 Qkey
= intern ("key");
5661 Qvalue
= intern ("value");
5662 staticpro (&Qvalue
);
5663 Qhash_table_test
= intern ("hash-table-test");
5664 staticpro (&Qhash_table_test
);
5665 Qkey_or_value
= intern ("key-or-value");
5666 staticpro (&Qkey_or_value
);
5667 Qkey_and_value
= intern ("key-and-value");
5668 staticpro (&Qkey_and_value
);
5671 defsubr (&Smake_hash_table
);
5672 defsubr (&Scopy_hash_table
);
5673 defsubr (&Shash_table_count
);
5674 defsubr (&Shash_table_rehash_size
);
5675 defsubr (&Shash_table_rehash_threshold
);
5676 defsubr (&Shash_table_size
);
5677 defsubr (&Shash_table_test
);
5678 defsubr (&Shash_table_weakness
);
5679 defsubr (&Shash_table_p
);
5680 defsubr (&Sclrhash
);
5681 defsubr (&Sgethash
);
5682 defsubr (&Sputhash
);
5683 defsubr (&Sremhash
);
5684 defsubr (&Smaphash
);
5685 defsubr (&Sdefine_hash_table_test
);
5687 Qstring_lessp
= intern ("string-lessp");
5688 staticpro (&Qstring_lessp
);
5689 Qprovide
= intern ("provide");
5690 staticpro (&Qprovide
);
5691 Qrequire
= intern ("require");
5692 staticpro (&Qrequire
);
5693 Qyes_or_no_p_history
= intern ("yes-or-no-p-history");
5694 staticpro (&Qyes_or_no_p_history
);
5695 Qcursor_in_echo_area
= intern ("cursor-in-echo-area");
5696 staticpro (&Qcursor_in_echo_area
);
5697 Qwidget_type
= intern ("widget-type");
5698 staticpro (&Qwidget_type
);
5700 staticpro (&string_char_byte_cache_string
);
5701 string_char_byte_cache_string
= Qnil
;
5703 require_nesting_list
= Qnil
;
5704 staticpro (&require_nesting_list
);
5706 Fset (Qyes_or_no_p_history
, Qnil
);
5708 DEFVAR_LISP ("features", &Vfeatures
,
5709 doc
: /* A list of symbols which are the features of the executing emacs.
5710 Used by `featurep' and `require', and altered by `provide'. */);
5712 Qsubfeatures
= intern ("subfeatures");
5713 staticpro (&Qsubfeatures
);
5715 #ifdef HAVE_LANGINFO_CODESET
5716 Qcodeset
= intern ("codeset");
5717 staticpro (&Qcodeset
);
5718 Qdays
= intern ("days");
5720 Qmonths
= intern ("months");
5721 staticpro (&Qmonths
);
5722 Qpaper
= intern ("paper");
5723 staticpro (&Qpaper
);
5724 #endif /* HAVE_LANGINFO_CODESET */
5726 DEFVAR_BOOL ("use-dialog-box", &use_dialog_box
,
5727 doc
: /* *Non-nil means mouse commands use dialog boxes to ask questions.
5728 This applies to `y-or-n-p' and `yes-or-no-p' questions asked by commands
5729 invoked by mouse clicks and mouse menu items. */);
5732 DEFVAR_BOOL ("use-file-dialog", &use_file_dialog
,
5733 doc
: /* *Non-nil means mouse commands use a file dialog to ask for files.
5734 This applies to commands from menus and tool bar buttons. The value of
5735 `use-dialog-box' takes precedence over this variable, so a file dialog is only
5736 used if both `use-dialog-box' and this variable are non-nil. */);
5737 use_file_dialog
= 1;
5739 defsubr (&Sidentity
);
5742 defsubr (&Ssafe_length
);
5743 defsubr (&Sstring_bytes
);
5744 defsubr (&Sstring_equal
);
5745 defsubr (&Scompare_strings
);
5746 defsubr (&Sstring_lessp
);
5749 defsubr (&Svconcat
);
5750 defsubr (&Scopy_sequence
);
5751 defsubr (&Sstring_make_multibyte
);
5752 defsubr (&Sstring_make_unibyte
);
5753 defsubr (&Sstring_as_multibyte
);
5754 defsubr (&Sstring_as_unibyte
);
5755 defsubr (&Sstring_to_multibyte
);
5756 defsubr (&Scopy_alist
);
5757 defsubr (&Ssubstring
);
5758 defsubr (&Ssubstring_no_properties
);
5770 defsubr (&Snreverse
);
5771 defsubr (&Sreverse
);
5773 defsubr (&Splist_get
);
5774 defsubr (&Ssafe_plist_get
);
5776 defsubr (&Splist_put
);
5778 defsubr (&Slax_plist_get
);
5779 defsubr (&Slax_plist_put
);
5782 defsubr (&Sequal_including_properties
);
5783 defsubr (&Sfillarray
);
5784 defsubr (&Sclear_string
);
5785 defsubr (&Schar_table_subtype
);
5786 defsubr (&Schar_table_parent
);
5787 defsubr (&Sset_char_table_parent
);
5788 defsubr (&Schar_table_extra_slot
);
5789 defsubr (&Sset_char_table_extra_slot
);
5790 defsubr (&Schar_table_range
);
5791 defsubr (&Sset_char_table_range
);
5792 defsubr (&Sset_char_table_default
);
5793 defsubr (&Soptimize_char_table
);
5794 defsubr (&Smap_char_table
);
5798 defsubr (&Smapconcat
);
5799 defsubr (&Sy_or_n_p
);
5800 defsubr (&Syes_or_no_p
);
5801 defsubr (&Sload_average
);
5802 defsubr (&Sfeaturep
);
5803 defsubr (&Srequire
);
5804 defsubr (&Sprovide
);
5805 defsubr (&Splist_member
);
5806 defsubr (&Swidget_put
);
5807 defsubr (&Swidget_get
);
5808 defsubr (&Swidget_apply
);
5809 defsubr (&Sbase64_encode_region
);
5810 defsubr (&Sbase64_decode_region
);
5811 defsubr (&Sbase64_encode_string
);
5812 defsubr (&Sbase64_decode_string
);
5814 defsubr (&Slocale_info
);
5821 Vweak_hash_tables
= Qnil
;
5824 /* arch-tag: 787f8219-5b74-46bd-8469-7e1cc475fa31
5825 (do not change this comment) */