1 /* Random utility Lisp functions.
2 Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1997, 1998, 1999, 2000,
3 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
5 This file is part of GNU Emacs.
7 GNU Emacs is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs; see the file COPYING. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
30 /* On Mac OS, defining this conflicts with precompiled headers. */
32 /* Note on some machines this defines `vector' as a typedef,
33 so make sure we don't use that name in this file. */
37 #endif /* ! MAC_OSX */
46 #include "intervals.h"
49 #include "blockinput.h"
50 #if defined (HAVE_MENUS) && defined (HAVE_X_WINDOWS)
55 #define NULL ((POINTER_TYPE *)0)
58 /* Nonzero enables use of dialog boxes for questions
59 asked by mouse commands. */
62 /* Nonzero enables use of a file dialog for file name
63 questions asked by mouse commands. */
66 extern int minibuffer_auto_raise
;
67 extern Lisp_Object minibuf_window
;
68 extern Lisp_Object Vlocale_coding_system
;
69 extern int load_in_progress
;
71 Lisp_Object Qstring_lessp
, Qprovide
, Qrequire
;
72 Lisp_Object Qyes_or_no_p_history
;
73 Lisp_Object Qcursor_in_echo_area
;
74 Lisp_Object Qwidget_type
;
75 Lisp_Object Qcodeset
, Qdays
, Qmonths
, Qpaper
;
77 extern Lisp_Object Qinput_method_function
;
79 static int internal_equal ();
81 extern long get_random ();
82 extern void seed_random ();
88 DEFUN ("identity", Fidentity
, Sidentity
, 1, 1, 0,
89 doc
: /* Return the argument unchanged. */)
96 DEFUN ("random", Frandom
, Srandom
, 0, 1, 0,
97 doc
: /* Return a pseudo-random number.
98 All integers representable in Lisp are equally likely.
99 On most systems, this is 29 bits' worth.
100 With positive integer argument N, return random number in interval [0,N).
101 With argument t, set the random number seed from the current time and pid. */)
106 Lisp_Object lispy_val
;
107 unsigned long denominator
;
110 seed_random (getpid () + time (NULL
));
111 if (NATNUMP (n
) && XFASTINT (n
) != 0)
113 /* Try to take our random number from the higher bits of VAL,
114 not the lower, since (says Gentzel) the low bits of `random'
115 are less random than the higher ones. We do this by using the
116 quotient rather than the remainder. At the high end of the RNG
117 it's possible to get a quotient larger than n; discarding
118 these values eliminates the bias that would otherwise appear
119 when using a large n. */
120 denominator
= ((unsigned long)1 << VALBITS
) / XFASTINT (n
);
122 val
= get_random () / denominator
;
123 while (val
>= XFASTINT (n
));
127 XSETINT (lispy_val
, val
);
131 /* Random data-structure functions */
133 DEFUN ("length", Flength
, Slength
, 1, 1, 0,
134 doc
: /* Return the length of vector, list or string SEQUENCE.
135 A byte-code function object is also allowed.
136 If the string contains multibyte characters, this is not necessarily
137 the number of bytes in the string; it is the number of characters.
138 To get the number of bytes, use `string-bytes'. */)
140 register Lisp_Object sequence
;
142 register Lisp_Object val
;
146 if (STRINGP (sequence
))
147 XSETFASTINT (val
, SCHARS (sequence
));
148 else if (VECTORP (sequence
))
149 XSETFASTINT (val
, XVECTOR (sequence
)->size
);
150 else if (SUB_CHAR_TABLE_P (sequence
))
151 XSETFASTINT (val
, SUB_CHAR_TABLE_ORDINARY_SLOTS
);
152 else if (CHAR_TABLE_P (sequence
))
153 XSETFASTINT (val
, MAX_CHAR
);
154 else if (BOOL_VECTOR_P (sequence
))
155 XSETFASTINT (val
, XBOOL_VECTOR (sequence
)->size
);
156 else if (COMPILEDP (sequence
))
157 XSETFASTINT (val
, XVECTOR (sequence
)->size
& PSEUDOVECTOR_SIZE_MASK
);
158 else if (CONSP (sequence
))
161 while (CONSP (sequence
))
163 sequence
= XCDR (sequence
);
166 if (!CONSP (sequence
))
169 sequence
= XCDR (sequence
);
174 if (!NILP (sequence
))
175 wrong_type_argument (Qlistp
, sequence
);
177 val
= make_number (i
);
179 else if (NILP (sequence
))
180 XSETFASTINT (val
, 0);
183 sequence
= wrong_type_argument (Qsequencep
, sequence
);
189 /* This does not check for quits. That is safe since it must terminate. */
191 DEFUN ("safe-length", Fsafe_length
, Ssafe_length
, 1, 1, 0,
192 doc
: /* Return the length of a list, but avoid error or infinite loop.
193 This function never gets an error. If LIST is not really a list,
194 it returns 0. If LIST is circular, it returns a finite value
195 which is at least the number of distinct elements. */)
199 Lisp_Object tail
, halftail
, length
;
202 /* halftail is used to detect circular lists. */
204 for (tail
= list
; CONSP (tail
); tail
= XCDR (tail
))
206 if (EQ (tail
, halftail
) && len
!= 0)
210 halftail
= XCDR (halftail
);
213 XSETINT (length
, len
);
217 DEFUN ("string-bytes", Fstring_bytes
, Sstring_bytes
, 1, 1, 0,
218 doc
: /* Return the number of bytes in STRING.
219 If STRING is a multibyte string, this is greater than the length of STRING. */)
223 CHECK_STRING (string
);
224 return make_number (SBYTES (string
));
227 DEFUN ("string-equal", Fstring_equal
, Sstring_equal
, 2, 2, 0,
228 doc
: /* Return t if two strings have identical contents.
229 Case is significant, but text properties are ignored.
230 Symbols are also allowed; their print names are used instead. */)
232 register Lisp_Object s1
, s2
;
235 s1
= SYMBOL_NAME (s1
);
237 s2
= SYMBOL_NAME (s2
);
241 if (SCHARS (s1
) != SCHARS (s2
)
242 || SBYTES (s1
) != SBYTES (s2
)
243 || bcmp (SDATA (s1
), SDATA (s2
), SBYTES (s1
)))
248 DEFUN ("compare-strings", Fcompare_strings
,
249 Scompare_strings
, 6, 7, 0,
250 doc
: /* Compare the contents of two strings, converting to multibyte if needed.
251 In string STR1, skip the first START1 characters and stop at END1.
252 In string STR2, skip the first START2 characters and stop at END2.
253 END1 and END2 default to the full lengths of the respective strings.
255 Case is significant in this comparison if IGNORE-CASE is nil.
256 Unibyte strings are converted to multibyte for comparison.
258 The value is t if the strings (or specified portions) match.
259 If string STR1 is less, the value is a negative number N;
260 - 1 - N is the number of characters that match at the beginning.
261 If string STR1 is greater, the value is a positive number N;
262 N - 1 is the number of characters that match at the beginning. */)
263 (str1
, start1
, end1
, str2
, start2
, end2
, ignore_case
)
264 Lisp_Object str1
, start1
, end1
, start2
, str2
, end2
, ignore_case
;
266 register int end1_char
, end2_char
;
267 register int i1
, i1_byte
, i2
, i2_byte
;
272 start1
= make_number (0);
274 start2
= make_number (0);
275 CHECK_NATNUM (start1
);
276 CHECK_NATNUM (start2
);
285 i1_byte
= string_char_to_byte (str1
, i1
);
286 i2_byte
= string_char_to_byte (str2
, i2
);
288 end1_char
= SCHARS (str1
);
289 if (! NILP (end1
) && end1_char
> XINT (end1
))
290 end1_char
= XINT (end1
);
292 end2_char
= SCHARS (str2
);
293 if (! NILP (end2
) && end2_char
> XINT (end2
))
294 end2_char
= XINT (end2
);
296 while (i1
< end1_char
&& i2
< end2_char
)
298 /* When we find a mismatch, we must compare the
299 characters, not just the bytes. */
302 if (STRING_MULTIBYTE (str1
))
303 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c1
, str1
, i1
, i1_byte
);
306 c1
= SREF (str1
, i1
++);
307 c1
= unibyte_char_to_multibyte (c1
);
310 if (STRING_MULTIBYTE (str2
))
311 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c2
, str2
, i2
, i2_byte
);
314 c2
= SREF (str2
, i2
++);
315 c2
= unibyte_char_to_multibyte (c2
);
321 if (! NILP (ignore_case
))
325 tem
= Fupcase (make_number (c1
));
327 tem
= Fupcase (make_number (c2
));
334 /* Note that I1 has already been incremented
335 past the character that we are comparing;
336 hence we don't add or subtract 1 here. */
338 return make_number (- i1
+ XINT (start1
));
340 return make_number (i1
- XINT (start1
));
344 return make_number (i1
- XINT (start1
) + 1);
346 return make_number (- i1
+ XINT (start1
) - 1);
351 DEFUN ("string-lessp", Fstring_lessp
, Sstring_lessp
, 2, 2, 0,
352 doc
: /* Return t if first arg string is less than second in lexicographic order.
354 Symbols are also allowed; their print names are used instead. */)
356 register Lisp_Object s1
, s2
;
359 register int i1
, i1_byte
, i2
, i2_byte
;
362 s1
= SYMBOL_NAME (s1
);
364 s2
= SYMBOL_NAME (s2
);
368 i1
= i1_byte
= i2
= i2_byte
= 0;
371 if (end
> SCHARS (s2
))
376 /* When we find a mismatch, we must compare the
377 characters, not just the bytes. */
380 FETCH_STRING_CHAR_ADVANCE (c1
, s1
, i1
, i1_byte
);
381 FETCH_STRING_CHAR_ADVANCE (c2
, s2
, i2
, i2_byte
);
384 return c1
< c2
? Qt
: Qnil
;
386 return i1
< SCHARS (s2
) ? Qt
: Qnil
;
389 static Lisp_Object
concat ();
400 return concat (2, args
, Lisp_String
, 0);
402 return concat (2, &s1
, Lisp_String
, 0);
403 #endif /* NO_ARG_ARRAY */
409 Lisp_Object s1
, s2
, s3
;
416 return concat (3, args
, Lisp_String
, 0);
418 return concat (3, &s1
, Lisp_String
, 0);
419 #endif /* NO_ARG_ARRAY */
422 DEFUN ("append", Fappend
, Sappend
, 0, MANY
, 0,
423 doc
: /* Concatenate all the arguments and make the result a list.
424 The result is a list whose elements are the elements of all the arguments.
425 Each argument may be a list, vector or string.
426 The last argument is not copied, just used as the tail of the new list.
427 usage: (append &rest SEQUENCES) */)
432 return concat (nargs
, args
, Lisp_Cons
, 1);
435 DEFUN ("concat", Fconcat
, Sconcat
, 0, MANY
, 0,
436 doc
: /* Concatenate all the arguments and make the result a string.
437 The result is a string whose elements are the elements of all the arguments.
438 Each argument may be a string or a list or vector of characters (integers).
439 usage: (concat &rest SEQUENCES) */)
444 return concat (nargs
, args
, Lisp_String
, 0);
447 DEFUN ("vconcat", Fvconcat
, Svconcat
, 0, MANY
, 0,
448 doc
: /* Concatenate all the arguments and make the result a vector.
449 The result is a vector whose elements are the elements of all the arguments.
450 Each argument may be a list, vector or string.
451 usage: (vconcat &rest SEQUENCES) */)
456 return concat (nargs
, args
, Lisp_Vectorlike
, 0);
459 /* Return a copy of a sub char table ARG. The elements except for a
460 nested sub char table are not copied. */
462 copy_sub_char_table (arg
)
465 Lisp_Object copy
= make_sub_char_table (Qnil
);
468 XCHAR_TABLE (copy
)->defalt
= XCHAR_TABLE (arg
)->defalt
;
469 /* Copy all the contents. */
470 bcopy (XCHAR_TABLE (arg
)->contents
, XCHAR_TABLE (copy
)->contents
,
471 SUB_CHAR_TABLE_ORDINARY_SLOTS
* sizeof (Lisp_Object
));
472 /* Recursively copy any sub char-tables in the ordinary slots. */
473 for (i
= 32; i
< SUB_CHAR_TABLE_ORDINARY_SLOTS
; i
++)
474 if (SUB_CHAR_TABLE_P (XCHAR_TABLE (arg
)->contents
[i
]))
475 XCHAR_TABLE (copy
)->contents
[i
]
476 = copy_sub_char_table (XCHAR_TABLE (copy
)->contents
[i
]);
482 DEFUN ("copy-sequence", Fcopy_sequence
, Scopy_sequence
, 1, 1, 0,
483 doc
: /* Return a copy of a list, vector, string or char-table.
484 The elements of a list or vector are not copied; they are shared
485 with the original. */)
489 if (NILP (arg
)) return arg
;
491 if (CHAR_TABLE_P (arg
))
496 copy
= Fmake_char_table (XCHAR_TABLE (arg
)->purpose
, Qnil
);
497 /* Copy all the slots, including the extra ones. */
498 bcopy (XVECTOR (arg
)->contents
, XVECTOR (copy
)->contents
,
499 ((XCHAR_TABLE (arg
)->size
& PSEUDOVECTOR_SIZE_MASK
)
500 * sizeof (Lisp_Object
)));
502 /* Recursively copy any sub char tables in the ordinary slots
503 for multibyte characters. */
504 for (i
= CHAR_TABLE_SINGLE_BYTE_SLOTS
;
505 i
< CHAR_TABLE_ORDINARY_SLOTS
; i
++)
506 if (SUB_CHAR_TABLE_P (XCHAR_TABLE (arg
)->contents
[i
]))
507 XCHAR_TABLE (copy
)->contents
[i
]
508 = copy_sub_char_table (XCHAR_TABLE (copy
)->contents
[i
]);
513 if (BOOL_VECTOR_P (arg
))
517 = ((XBOOL_VECTOR (arg
)->size
+ BOOL_VECTOR_BITS_PER_CHAR
- 1)
518 / BOOL_VECTOR_BITS_PER_CHAR
);
520 val
= Fmake_bool_vector (Flength (arg
), Qnil
);
521 bcopy (XBOOL_VECTOR (arg
)->data
, XBOOL_VECTOR (val
)->data
,
526 if (!CONSP (arg
) && !VECTORP (arg
) && !STRINGP (arg
))
527 arg
= wrong_type_argument (Qsequencep
, arg
);
528 return concat (1, &arg
, CONSP (arg
) ? Lisp_Cons
: XTYPE (arg
), 0);
531 /* This structure holds information of an argument of `concat' that is
532 a string and has text properties to be copied. */
535 int argnum
; /* refer to ARGS (arguments of `concat') */
536 int from
; /* refer to ARGS[argnum] (argument string) */
537 int to
; /* refer to VAL (the target string) */
541 concat (nargs
, args
, target_type
, last_special
)
544 enum Lisp_Type target_type
;
548 register Lisp_Object tail
;
549 register Lisp_Object
this;
551 int toindex_byte
= 0;
552 register int result_len
;
553 register int result_len_byte
;
555 Lisp_Object last_tail
;
558 /* When we make a multibyte string, we can't copy text properties
559 while concatinating each string because the length of resulting
560 string can't be decided until we finish the whole concatination.
561 So, we record strings that have text properties to be copied
562 here, and copy the text properties after the concatination. */
563 struct textprop_rec
*textprops
= NULL
;
564 /* Number of elments in textprops. */
565 int num_textprops
= 0;
570 /* In append, the last arg isn't treated like the others */
571 if (last_special
&& nargs
> 0)
574 last_tail
= args
[nargs
];
579 /* Canonicalize each argument. */
580 for (argnum
= 0; argnum
< nargs
; argnum
++)
583 if (!(CONSP (this) || NILP (this) || VECTORP (this) || STRINGP (this)
584 || COMPILEDP (this) || BOOL_VECTOR_P (this)))
586 args
[argnum
] = wrong_type_argument (Qsequencep
, this);
590 /* Compute total length in chars of arguments in RESULT_LEN.
591 If desired output is a string, also compute length in bytes
592 in RESULT_LEN_BYTE, and determine in SOME_MULTIBYTE
593 whether the result should be a multibyte string. */
597 for (argnum
= 0; argnum
< nargs
; argnum
++)
601 len
= XFASTINT (Flength (this));
602 if (target_type
== Lisp_String
)
604 /* We must count the number of bytes needed in the string
605 as well as the number of characters. */
611 for (i
= 0; i
< len
; i
++)
613 ch
= XVECTOR (this)->contents
[i
];
615 wrong_type_argument (Qintegerp
, ch
);
616 this_len_byte
= CHAR_BYTES (XINT (ch
));
617 result_len_byte
+= this_len_byte
;
618 if (!SINGLE_BYTE_CHAR_P (XINT (ch
)))
621 else if (BOOL_VECTOR_P (this) && XBOOL_VECTOR (this)->size
> 0)
622 wrong_type_argument (Qintegerp
, Faref (this, make_number (0)));
623 else if (CONSP (this))
624 for (; CONSP (this); this = XCDR (this))
628 wrong_type_argument (Qintegerp
, ch
);
629 this_len_byte
= CHAR_BYTES (XINT (ch
));
630 result_len_byte
+= this_len_byte
;
631 if (!SINGLE_BYTE_CHAR_P (XINT (ch
)))
634 else if (STRINGP (this))
636 if (STRING_MULTIBYTE (this))
639 result_len_byte
+= SBYTES (this);
642 result_len_byte
+= count_size_as_multibyte (SDATA (this),
650 if (! some_multibyte
)
651 result_len_byte
= result_len
;
653 /* Create the output object. */
654 if (target_type
== Lisp_Cons
)
655 val
= Fmake_list (make_number (result_len
), Qnil
);
656 else if (target_type
== Lisp_Vectorlike
)
657 val
= Fmake_vector (make_number (result_len
), Qnil
);
658 else if (some_multibyte
)
659 val
= make_uninit_multibyte_string (result_len
, result_len_byte
);
661 val
= make_uninit_string (result_len
);
663 /* In `append', if all but last arg are nil, return last arg. */
664 if (target_type
== Lisp_Cons
&& EQ (val
, Qnil
))
667 /* Copy the contents of the args into the result. */
669 tail
= val
, toindex
= -1; /* -1 in toindex is flag we are making a list */
671 toindex
= 0, toindex_byte
= 0;
675 SAFE_ALLOCA (textprops
, struct textprop_rec
*, sizeof (struct textprop_rec
) * nargs
);
677 for (argnum
= 0; argnum
< nargs
; argnum
++)
681 register unsigned int thisindex
= 0;
682 register unsigned int thisindex_byte
= 0;
686 thislen
= Flength (this), thisleni
= XINT (thislen
);
688 /* Between strings of the same kind, copy fast. */
689 if (STRINGP (this) && STRINGP (val
)
690 && STRING_MULTIBYTE (this) == some_multibyte
)
692 int thislen_byte
= SBYTES (this);
694 bcopy (SDATA (this), SDATA (val
) + toindex_byte
,
696 if (! NULL_INTERVAL_P (STRING_INTERVALS (this)))
698 textprops
[num_textprops
].argnum
= argnum
;
699 textprops
[num_textprops
].from
= 0;
700 textprops
[num_textprops
++].to
= toindex
;
702 toindex_byte
+= thislen_byte
;
704 STRING_SET_CHARS (val
, SCHARS (val
));
706 /* Copy a single-byte string to a multibyte string. */
707 else if (STRINGP (this) && STRINGP (val
))
709 if (! NULL_INTERVAL_P (STRING_INTERVALS (this)))
711 textprops
[num_textprops
].argnum
= argnum
;
712 textprops
[num_textprops
].from
= 0;
713 textprops
[num_textprops
++].to
= toindex
;
715 toindex_byte
+= copy_text (SDATA (this),
716 SDATA (val
) + toindex_byte
,
717 SCHARS (this), 0, 1);
721 /* Copy element by element. */
724 register Lisp_Object elt
;
726 /* Fetch next element of `this' arg into `elt', or break if
727 `this' is exhausted. */
728 if (NILP (this)) break;
730 elt
= XCAR (this), this = XCDR (this);
731 else if (thisindex
>= thisleni
)
733 else if (STRINGP (this))
736 if (STRING_MULTIBYTE (this))
738 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c
, this,
741 XSETFASTINT (elt
, c
);
745 XSETFASTINT (elt
, SREF (this, thisindex
)); thisindex
++;
747 && (XINT (elt
) >= 0240
748 || (XINT (elt
) >= 0200
749 && ! NILP (Vnonascii_translation_table
)))
750 && XINT (elt
) < 0400)
752 c
= unibyte_char_to_multibyte (XINT (elt
));
757 else if (BOOL_VECTOR_P (this))
760 byte
= XBOOL_VECTOR (this)->data
[thisindex
/ BOOL_VECTOR_BITS_PER_CHAR
];
761 if (byte
& (1 << (thisindex
% BOOL_VECTOR_BITS_PER_CHAR
)))
768 elt
= XVECTOR (this)->contents
[thisindex
++];
770 /* Store this element into the result. */
777 else if (VECTORP (val
))
778 XVECTOR (val
)->contents
[toindex
++] = elt
;
782 if (SINGLE_BYTE_CHAR_P (XINT (elt
)))
786 += CHAR_STRING (XINT (elt
),
787 SDATA (val
) + toindex_byte
);
789 SSET (val
, toindex_byte
++, XINT (elt
));
793 /* If we have any multibyte characters,
794 we already decided to make a multibyte string. */
797 /* P exists as a variable
798 to avoid a bug on the Masscomp C compiler. */
799 unsigned char *p
= SDATA (val
) + toindex_byte
;
801 toindex_byte
+= CHAR_STRING (c
, p
);
808 XSETCDR (prev
, last_tail
);
810 if (num_textprops
> 0)
813 int last_to_end
= -1;
815 for (argnum
= 0; argnum
< num_textprops
; argnum
++)
817 this = args
[textprops
[argnum
].argnum
];
818 props
= text_property_list (this,
820 make_number (SCHARS (this)),
822 /* If successive arguments have properites, be sure that the
823 value of `composition' property be the copy. */
824 if (last_to_end
== textprops
[argnum
].to
)
825 make_composition_value_copy (props
);
826 add_text_properties_from_list (val
, props
,
827 make_number (textprops
[argnum
].to
));
828 last_to_end
= textprops
[argnum
].to
+ SCHARS (this);
836 static Lisp_Object string_char_byte_cache_string
;
837 static int string_char_byte_cache_charpos
;
838 static int string_char_byte_cache_bytepos
;
841 clear_string_char_byte_cache ()
843 string_char_byte_cache_string
= Qnil
;
846 /* Return the character index corresponding to CHAR_INDEX in STRING. */
849 string_char_to_byte (string
, char_index
)
854 int best_below
, best_below_byte
;
855 int best_above
, best_above_byte
;
857 best_below
= best_below_byte
= 0;
858 best_above
= SCHARS (string
);
859 best_above_byte
= SBYTES (string
);
860 if (best_above
== best_above_byte
)
863 if (EQ (string
, string_char_byte_cache_string
))
865 if (string_char_byte_cache_charpos
< char_index
)
867 best_below
= string_char_byte_cache_charpos
;
868 best_below_byte
= string_char_byte_cache_bytepos
;
872 best_above
= string_char_byte_cache_charpos
;
873 best_above_byte
= string_char_byte_cache_bytepos
;
877 if (char_index
- best_below
< best_above
- char_index
)
879 while (best_below
< char_index
)
882 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c
, string
,
883 best_below
, best_below_byte
);
886 i_byte
= best_below_byte
;
890 while (best_above
> char_index
)
892 unsigned char *pend
= SDATA (string
) + best_above_byte
;
893 unsigned char *pbeg
= pend
- best_above_byte
;
894 unsigned char *p
= pend
- 1;
897 while (p
> pbeg
&& !CHAR_HEAD_P (*p
)) p
--;
898 PARSE_MULTIBYTE_SEQ (p
, pend
- p
, bytes
);
899 if (bytes
== pend
- p
)
900 best_above_byte
-= bytes
;
901 else if (bytes
> pend
- p
)
902 best_above_byte
-= (pend
- p
);
908 i_byte
= best_above_byte
;
911 string_char_byte_cache_bytepos
= i_byte
;
912 string_char_byte_cache_charpos
= i
;
913 string_char_byte_cache_string
= string
;
918 /* Return the character index corresponding to BYTE_INDEX in STRING. */
921 string_byte_to_char (string
, byte_index
)
926 int best_below
, best_below_byte
;
927 int best_above
, best_above_byte
;
929 best_below
= best_below_byte
= 0;
930 best_above
= SCHARS (string
);
931 best_above_byte
= SBYTES (string
);
932 if (best_above
== best_above_byte
)
935 if (EQ (string
, string_char_byte_cache_string
))
937 if (string_char_byte_cache_bytepos
< byte_index
)
939 best_below
= string_char_byte_cache_charpos
;
940 best_below_byte
= string_char_byte_cache_bytepos
;
944 best_above
= string_char_byte_cache_charpos
;
945 best_above_byte
= string_char_byte_cache_bytepos
;
949 if (byte_index
- best_below_byte
< best_above_byte
- byte_index
)
951 while (best_below_byte
< byte_index
)
954 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c
, string
,
955 best_below
, best_below_byte
);
958 i_byte
= best_below_byte
;
962 while (best_above_byte
> byte_index
)
964 unsigned char *pend
= SDATA (string
) + best_above_byte
;
965 unsigned char *pbeg
= pend
- best_above_byte
;
966 unsigned char *p
= pend
- 1;
969 while (p
> pbeg
&& !CHAR_HEAD_P (*p
)) p
--;
970 PARSE_MULTIBYTE_SEQ (p
, pend
- p
, bytes
);
971 if (bytes
== pend
- p
)
972 best_above_byte
-= bytes
;
973 else if (bytes
> pend
- p
)
974 best_above_byte
-= (pend
- p
);
980 i_byte
= best_above_byte
;
983 string_char_byte_cache_bytepos
= i_byte
;
984 string_char_byte_cache_charpos
= i
;
985 string_char_byte_cache_string
= string
;
990 /* Convert STRING to a multibyte string.
991 Single-byte characters 0240 through 0377 are converted
992 by adding nonascii_insert_offset to each. */
995 string_make_multibyte (string
)
1003 if (STRING_MULTIBYTE (string
))
1006 nbytes
= count_size_as_multibyte (SDATA (string
),
1008 /* If all the chars are ASCII, they won't need any more bytes
1009 once converted. In that case, we can return STRING itself. */
1010 if (nbytes
== SBYTES (string
))
1013 SAFE_ALLOCA (buf
, unsigned char *, nbytes
);
1014 copy_text (SDATA (string
), buf
, SBYTES (string
),
1017 ret
= make_multibyte_string (buf
, SCHARS (string
), nbytes
);
1024 /* Convert STRING to a multibyte string without changing each
1025 character codes. Thus, characters 0200 trough 0237 are converted
1026 to eight-bit-control characters, and characters 0240 through 0377
1027 are converted eight-bit-graphic characters. */
1030 string_to_multibyte (string
)
1038 if (STRING_MULTIBYTE (string
))
1041 nbytes
= parse_str_to_multibyte (SDATA (string
), SBYTES (string
));
1042 /* If all the chars are ASCII or eight-bit-graphic, they won't need
1043 any more bytes once converted. */
1044 if (nbytes
== SBYTES (string
))
1045 return make_multibyte_string (SDATA (string
), nbytes
, nbytes
);
1047 SAFE_ALLOCA (buf
, unsigned char *, nbytes
);
1048 bcopy (SDATA (string
), buf
, SBYTES (string
));
1049 str_to_multibyte (buf
, nbytes
, SBYTES (string
));
1051 ret
= make_multibyte_string (buf
, SCHARS (string
), nbytes
);
1058 /* Convert STRING to a single-byte string. */
1061 string_make_unibyte (string
)
1069 if (! STRING_MULTIBYTE (string
))
1072 nchars
= SCHARS (string
);
1074 SAFE_ALLOCA (buf
, unsigned char *, nchars
);
1075 copy_text (SDATA (string
), buf
, SBYTES (string
),
1078 ret
= make_unibyte_string (buf
, nchars
);
1084 DEFUN ("string-make-multibyte", Fstring_make_multibyte
, Sstring_make_multibyte
,
1086 doc
: /* Return the multibyte equivalent of STRING.
1087 If STRING is unibyte and contains non-ASCII characters, the function
1088 `unibyte-char-to-multibyte' is used to convert each unibyte character
1089 to a multibyte character. In this case, the returned string is a
1090 newly created string with no text properties. If STRING is multibyte
1091 or entirely ASCII, it is returned unchanged. In particular, when
1092 STRING is unibyte and entirely ASCII, the returned string is unibyte.
1093 \(When the characters are all ASCII, Emacs primitives will treat the
1094 string the same way whether it is unibyte or multibyte.) */)
1098 CHECK_STRING (string
);
1100 return string_make_multibyte (string
);
1103 DEFUN ("string-make-unibyte", Fstring_make_unibyte
, Sstring_make_unibyte
,
1105 doc
: /* Return the unibyte equivalent of STRING.
1106 Multibyte character codes are converted to unibyte according to
1107 `nonascii-translation-table' or, if that is nil, `nonascii-insert-offset'.
1108 If the lookup in the translation table fails, this function takes just
1109 the low 8 bits of each character. */)
1113 CHECK_STRING (string
);
1115 return string_make_unibyte (string
);
1118 DEFUN ("string-as-unibyte", Fstring_as_unibyte
, Sstring_as_unibyte
,
1120 doc
: /* Return a unibyte string with the same individual bytes as STRING.
1121 If STRING is unibyte, the result is STRING itself.
1122 Otherwise it is a newly created string, with no text properties.
1123 If STRING is multibyte and contains a character of charset
1124 `eight-bit-control' or `eight-bit-graphic', it is converted to the
1125 corresponding single byte. */)
1129 CHECK_STRING (string
);
1131 if (STRING_MULTIBYTE (string
))
1133 int bytes
= SBYTES (string
);
1134 unsigned char *str
= (unsigned char *) xmalloc (bytes
);
1136 bcopy (SDATA (string
), str
, bytes
);
1137 bytes
= str_as_unibyte (str
, bytes
);
1138 string
= make_unibyte_string (str
, bytes
);
1144 DEFUN ("string-as-multibyte", Fstring_as_multibyte
, Sstring_as_multibyte
,
1146 doc
: /* Return a multibyte string with the same individual bytes as STRING.
1147 If STRING is multibyte, the result is STRING itself.
1148 Otherwise it is a newly created string, with no text properties.
1149 If STRING is unibyte and contains an individual 8-bit byte (i.e. not
1150 part of a multibyte form), it is converted to the corresponding
1151 multibyte character of charset `eight-bit-control' or `eight-bit-graphic'.
1152 Beware, this often doesn't really do what you think it does.
1153 It is similar to (decode-coding-string STRING 'emacs-mule-unix).
1154 If you're not sure, whether to use `string-as-multibyte' or
1155 `string-to-multibyte', use `string-to-multibyte'. Beware:
1156 (aref (string-as-multibyte "\201") 0) -> 129 (aka ?\201)
1157 (aref (string-as-multibyte "\300") 0) -> 192 (aka ?\300)
1158 (aref (string-as-multibyte "\300\201") 0) -> 192 (aka ?\300)
1159 (aref (string-as-multibyte "\300\201") 1) -> 129 (aka ?\201)
1161 (aref (string-as-multibyte "\201\300") 0) -> 2240
1162 (aref (string-as-multibyte "\201\300") 1) -> <error> */)
1166 CHECK_STRING (string
);
1168 if (! STRING_MULTIBYTE (string
))
1170 Lisp_Object new_string
;
1173 parse_str_as_multibyte (SDATA (string
),
1176 new_string
= make_uninit_multibyte_string (nchars
, nbytes
);
1177 bcopy (SDATA (string
), SDATA (new_string
),
1179 if (nbytes
!= SBYTES (string
))
1180 str_as_multibyte (SDATA (new_string
), nbytes
,
1181 SBYTES (string
), NULL
);
1182 string
= new_string
;
1183 STRING_SET_INTERVALS (string
, NULL_INTERVAL
);
1188 DEFUN ("string-to-multibyte", Fstring_to_multibyte
, Sstring_to_multibyte
,
1190 doc
: /* Return a multibyte string with the same individual chars as STRING.
1191 If STRING is multibyte, the result is STRING itself.
1192 Otherwise it is a newly created string, with no text properties.
1193 Characters 0200 through 0237 are converted to eight-bit-control
1194 characters of the same character code. Characters 0240 through 0377
1195 are converted to eight-bit-graphic characters of the same character
1197 This is similar to (decode-coding-string STRING 'binary) */)
1201 CHECK_STRING (string
);
1203 return string_to_multibyte (string
);
1207 DEFUN ("copy-alist", Fcopy_alist
, Scopy_alist
, 1, 1, 0,
1208 doc
: /* Return a copy of ALIST.
1209 This is an alist which represents the same mapping from objects to objects,
1210 but does not share the alist structure with ALIST.
1211 The objects mapped (cars and cdrs of elements of the alist)
1212 are shared, however.
1213 Elements of ALIST that are not conses are also shared. */)
1217 register Lisp_Object tem
;
1222 alist
= concat (1, &alist
, Lisp_Cons
, 0);
1223 for (tem
= alist
; CONSP (tem
); tem
= XCDR (tem
))
1225 register Lisp_Object car
;
1229 XSETCAR (tem
, Fcons (XCAR (car
), XCDR (car
)));
1234 DEFUN ("substring", Fsubstring
, Ssubstring
, 2, 3, 0,
1235 doc
: /* Return a substring of STRING, starting at index FROM and ending before TO.
1236 TO may be nil or omitted; then the substring runs to the end of STRING.
1237 FROM and TO start at 0. If either is negative, it counts from the end.
1239 This function allows vectors as well as strings. */)
1242 register Lisp_Object from
, to
;
1247 int from_char
, to_char
;
1248 int from_byte
= 0, to_byte
= 0;
1250 if (! (STRINGP (string
) || VECTORP (string
)))
1251 wrong_type_argument (Qarrayp
, string
);
1253 CHECK_NUMBER (from
);
1255 if (STRINGP (string
))
1257 size
= SCHARS (string
);
1258 size_byte
= SBYTES (string
);
1261 size
= XVECTOR (string
)->size
;
1266 to_byte
= size_byte
;
1272 to_char
= XINT (to
);
1276 if (STRINGP (string
))
1277 to_byte
= string_char_to_byte (string
, to_char
);
1280 from_char
= XINT (from
);
1283 if (STRINGP (string
))
1284 from_byte
= string_char_to_byte (string
, from_char
);
1286 if (!(0 <= from_char
&& from_char
<= to_char
&& to_char
<= size
))
1287 args_out_of_range_3 (string
, make_number (from_char
),
1288 make_number (to_char
));
1290 if (STRINGP (string
))
1292 res
= make_specified_string (SDATA (string
) + from_byte
,
1293 to_char
- from_char
, to_byte
- from_byte
,
1294 STRING_MULTIBYTE (string
));
1295 copy_text_properties (make_number (from_char
), make_number (to_char
),
1296 string
, make_number (0), res
, Qnil
);
1299 res
= Fvector (to_char
- from_char
,
1300 XVECTOR (string
)->contents
+ from_char
);
1306 DEFUN ("substring-no-properties", Fsubstring_no_properties
, Ssubstring_no_properties
, 1, 3, 0,
1307 doc
: /* Return a substring of STRING, without text properties.
1308 It starts at index FROM and ending before TO.
1309 TO may be nil or omitted; then the substring runs to the end of STRING.
1310 If FROM is nil or omitted, the substring starts at the beginning of STRING.
1311 If FROM or TO is negative, it counts from the end.
1313 With one argument, just copy STRING without its properties. */)
1316 register Lisp_Object from
, to
;
1318 int size
, size_byte
;
1319 int from_char
, to_char
;
1320 int from_byte
, to_byte
;
1322 CHECK_STRING (string
);
1324 size
= SCHARS (string
);
1325 size_byte
= SBYTES (string
);
1328 from_char
= from_byte
= 0;
1331 CHECK_NUMBER (from
);
1332 from_char
= XINT (from
);
1336 from_byte
= string_char_to_byte (string
, from_char
);
1342 to_byte
= size_byte
;
1348 to_char
= XINT (to
);
1352 to_byte
= string_char_to_byte (string
, to_char
);
1355 if (!(0 <= from_char
&& from_char
<= to_char
&& to_char
<= size
))
1356 args_out_of_range_3 (string
, make_number (from_char
),
1357 make_number (to_char
));
1359 return make_specified_string (SDATA (string
) + from_byte
,
1360 to_char
- from_char
, to_byte
- from_byte
,
1361 STRING_MULTIBYTE (string
));
1364 /* Extract a substring of STRING, giving start and end positions
1365 both in characters and in bytes. */
1368 substring_both (string
, from
, from_byte
, to
, to_byte
)
1370 int from
, from_byte
, to
, to_byte
;
1376 if (! (STRINGP (string
) || VECTORP (string
)))
1377 wrong_type_argument (Qarrayp
, string
);
1379 if (STRINGP (string
))
1381 size
= SCHARS (string
);
1382 size_byte
= SBYTES (string
);
1385 size
= XVECTOR (string
)->size
;
1387 if (!(0 <= from
&& from
<= to
&& to
<= size
))
1388 args_out_of_range_3 (string
, make_number (from
), make_number (to
));
1390 if (STRINGP (string
))
1392 res
= make_specified_string (SDATA (string
) + from_byte
,
1393 to
- from
, to_byte
- from_byte
,
1394 STRING_MULTIBYTE (string
));
1395 copy_text_properties (make_number (from
), make_number (to
),
1396 string
, make_number (0), res
, Qnil
);
1399 res
= Fvector (to
- from
,
1400 XVECTOR (string
)->contents
+ from
);
1405 DEFUN ("nthcdr", Fnthcdr
, Snthcdr
, 2, 2, 0,
1406 doc
: /* Take cdr N times on LIST, returns the result. */)
1409 register Lisp_Object list
;
1411 register int i
, num
;
1414 for (i
= 0; i
< num
&& !NILP (list
); i
++)
1418 wrong_type_argument (Qlistp
, list
);
1424 DEFUN ("nth", Fnth
, Snth
, 2, 2, 0,
1425 doc
: /* Return the Nth element of LIST.
1426 N counts from zero. If LIST is not that long, nil is returned. */)
1428 Lisp_Object n
, list
;
1430 return Fcar (Fnthcdr (n
, list
));
1433 DEFUN ("elt", Felt
, Selt
, 2, 2, 0,
1434 doc
: /* Return element of SEQUENCE at index N. */)
1436 register Lisp_Object sequence
, n
;
1441 if (CONSP (sequence
) || NILP (sequence
))
1442 return Fcar (Fnthcdr (n
, sequence
));
1443 else if (STRINGP (sequence
) || VECTORP (sequence
)
1444 || BOOL_VECTOR_P (sequence
) || CHAR_TABLE_P (sequence
))
1445 return Faref (sequence
, n
);
1447 sequence
= wrong_type_argument (Qsequencep
, sequence
);
1451 DEFUN ("member", Fmember
, Smember
, 2, 2, 0,
1452 doc
: /* Return non-nil if ELT is an element of LIST. Comparison done with `equal'.
1453 The value is actually the tail of LIST whose car is ELT. */)
1455 register Lisp_Object elt
;
1458 register Lisp_Object tail
;
1459 for (tail
= list
; !NILP (tail
); tail
= XCDR (tail
))
1461 register Lisp_Object tem
;
1463 wrong_type_argument (Qlistp
, list
);
1465 if (! NILP (Fequal (elt
, tem
)))
1472 DEFUN ("memq", Fmemq
, Smemq
, 2, 2, 0,
1473 doc
: /* Return non-nil if ELT is an element of LIST.
1474 Comparison done with EQ. The value is actually the tail of LIST
1475 whose car is ELT. */)
1477 Lisp_Object elt
, list
;
1481 if (!CONSP (list
) || EQ (XCAR (list
), elt
))
1485 if (!CONSP (list
) || EQ (XCAR (list
), elt
))
1489 if (!CONSP (list
) || EQ (XCAR (list
), elt
))
1496 if (!CONSP (list
) && !NILP (list
))
1497 list
= wrong_type_argument (Qlistp
, list
);
1502 DEFUN ("assq", Fassq
, Sassq
, 2, 2, 0,
1503 doc
: /* Return non-nil if KEY is `eq' to the car of an element of LIST.
1504 The value is actually the first element of LIST whose car is KEY.
1505 Elements of LIST that are not conses are ignored. */)
1507 Lisp_Object key
, list
;
1514 || (CONSP (XCAR (list
))
1515 && EQ (XCAR (XCAR (list
)), key
)))
1520 || (CONSP (XCAR (list
))
1521 && EQ (XCAR (XCAR (list
)), key
)))
1526 || (CONSP (XCAR (list
))
1527 && EQ (XCAR (XCAR (list
)), key
)))
1535 result
= XCAR (list
);
1536 else if (NILP (list
))
1539 result
= wrong_type_argument (Qlistp
, list
);
1544 /* Like Fassq but never report an error and do not allow quits.
1545 Use only on lists known never to be circular. */
1548 assq_no_quit (key
, list
)
1549 Lisp_Object key
, list
;
1552 && (!CONSP (XCAR (list
))
1553 || !EQ (XCAR (XCAR (list
)), key
)))
1556 return CONSP (list
) ? XCAR (list
) : Qnil
;
1559 DEFUN ("assoc", Fassoc
, Sassoc
, 2, 2, 0,
1560 doc
: /* Return non-nil if KEY is `equal' to the car of an element of LIST.
1561 The value is actually the first element of LIST whose car equals KEY. */)
1563 Lisp_Object key
, list
;
1565 Lisp_Object result
, car
;
1570 || (CONSP (XCAR (list
))
1571 && (car
= XCAR (XCAR (list
)),
1572 EQ (car
, key
) || !NILP (Fequal (car
, key
)))))
1577 || (CONSP (XCAR (list
))
1578 && (car
= XCAR (XCAR (list
)),
1579 EQ (car
, key
) || !NILP (Fequal (car
, key
)))))
1584 || (CONSP (XCAR (list
))
1585 && (car
= XCAR (XCAR (list
)),
1586 EQ (car
, key
) || !NILP (Fequal (car
, key
)))))
1594 result
= XCAR (list
);
1595 else if (NILP (list
))
1598 result
= wrong_type_argument (Qlistp
, list
);
1603 DEFUN ("rassq", Frassq
, Srassq
, 2, 2, 0,
1604 doc
: /* Return non-nil if KEY is `eq' to the cdr of an element of LIST.
1605 The value is actually the first element of LIST whose cdr is KEY. */)
1607 register Lisp_Object key
;
1615 || (CONSP (XCAR (list
))
1616 && EQ (XCDR (XCAR (list
)), key
)))
1621 || (CONSP (XCAR (list
))
1622 && EQ (XCDR (XCAR (list
)), key
)))
1627 || (CONSP (XCAR (list
))
1628 && EQ (XCDR (XCAR (list
)), key
)))
1637 else if (CONSP (list
))
1638 result
= XCAR (list
);
1640 result
= wrong_type_argument (Qlistp
, list
);
1645 DEFUN ("rassoc", Frassoc
, Srassoc
, 2, 2, 0,
1646 doc
: /* Return non-nil if KEY is `equal' to the cdr of an element of LIST.
1647 The value is actually the first element of LIST whose cdr equals KEY. */)
1649 Lisp_Object key
, list
;
1651 Lisp_Object result
, cdr
;
1656 || (CONSP (XCAR (list
))
1657 && (cdr
= XCDR (XCAR (list
)),
1658 EQ (cdr
, key
) || !NILP (Fequal (cdr
, key
)))))
1663 || (CONSP (XCAR (list
))
1664 && (cdr
= XCDR (XCAR (list
)),
1665 EQ (cdr
, key
) || !NILP (Fequal (cdr
, key
)))))
1670 || (CONSP (XCAR (list
))
1671 && (cdr
= XCDR (XCAR (list
)),
1672 EQ (cdr
, key
) || !NILP (Fequal (cdr
, key
)))))
1680 result
= XCAR (list
);
1681 else if (NILP (list
))
1684 result
= wrong_type_argument (Qlistp
, list
);
1689 DEFUN ("delq", Fdelq
, Sdelq
, 2, 2, 0,
1690 doc
: /* Delete by side effect any occurrences of ELT as a member of LIST.
1691 The modified LIST is returned. Comparison is done with `eq'.
1692 If the first member of LIST is ELT, there is no way to remove it by side effect;
1693 therefore, write `(setq foo (delq element foo))'
1694 to be sure of changing the value of `foo'. */)
1696 register Lisp_Object elt
;
1699 register Lisp_Object tail
, prev
;
1700 register Lisp_Object tem
;
1704 while (!NILP (tail
))
1707 wrong_type_argument (Qlistp
, list
);
1714 Fsetcdr (prev
, XCDR (tail
));
1724 DEFUN ("delete", Fdelete
, Sdelete
, 2, 2, 0,
1725 doc
: /* Delete by side effect any occurrences of ELT as a member of SEQ.
1726 SEQ must be a list, a vector, or a string.
1727 The modified SEQ is returned. Comparison is done with `equal'.
1728 If SEQ is not a list, or the first member of SEQ is ELT, deleting it
1729 is not a side effect; it is simply using a different sequence.
1730 Therefore, write `(setq foo (delete element foo))'
1731 to be sure of changing the value of `foo'. */)
1733 Lisp_Object elt
, seq
;
1739 for (i
= n
= 0; i
< ASIZE (seq
); ++i
)
1740 if (NILP (Fequal (AREF (seq
, i
), elt
)))
1743 if (n
!= ASIZE (seq
))
1745 struct Lisp_Vector
*p
= allocate_vector (n
);
1747 for (i
= n
= 0; i
< ASIZE (seq
); ++i
)
1748 if (NILP (Fequal (AREF (seq
, i
), elt
)))
1749 p
->contents
[n
++] = AREF (seq
, i
);
1751 XSETVECTOR (seq
, p
);
1754 else if (STRINGP (seq
))
1756 EMACS_INT i
, ibyte
, nchars
, nbytes
, cbytes
;
1759 for (i
= nchars
= nbytes
= ibyte
= 0;
1761 ++i
, ibyte
+= cbytes
)
1763 if (STRING_MULTIBYTE (seq
))
1765 c
= STRING_CHAR (SDATA (seq
) + ibyte
,
1766 SBYTES (seq
) - ibyte
);
1767 cbytes
= CHAR_BYTES (c
);
1775 if (!INTEGERP (elt
) || c
!= XINT (elt
))
1782 if (nchars
!= SCHARS (seq
))
1786 tem
= make_uninit_multibyte_string (nchars
, nbytes
);
1787 if (!STRING_MULTIBYTE (seq
))
1788 STRING_SET_UNIBYTE (tem
);
1790 for (i
= nchars
= nbytes
= ibyte
= 0;
1792 ++i
, ibyte
+= cbytes
)
1794 if (STRING_MULTIBYTE (seq
))
1796 c
= STRING_CHAR (SDATA (seq
) + ibyte
,
1797 SBYTES (seq
) - ibyte
);
1798 cbytes
= CHAR_BYTES (c
);
1806 if (!INTEGERP (elt
) || c
!= XINT (elt
))
1808 unsigned char *from
= SDATA (seq
) + ibyte
;
1809 unsigned char *to
= SDATA (tem
) + nbytes
;
1815 for (n
= cbytes
; n
--; )
1825 Lisp_Object tail
, prev
;
1827 for (tail
= seq
, prev
= Qnil
; !NILP (tail
); tail
= XCDR (tail
))
1830 wrong_type_argument (Qlistp
, seq
);
1832 if (!NILP (Fequal (elt
, XCAR (tail
))))
1837 Fsetcdr (prev
, XCDR (tail
));
1848 DEFUN ("nreverse", Fnreverse
, Snreverse
, 1, 1, 0,
1849 doc
: /* Reverse LIST by modifying cdr pointers.
1850 Return the reversed list. */)
1854 register Lisp_Object prev
, tail
, next
;
1856 if (NILP (list
)) return list
;
1859 while (!NILP (tail
))
1863 wrong_type_argument (Qlistp
, list
);
1865 Fsetcdr (tail
, prev
);
1872 DEFUN ("reverse", Freverse
, Sreverse
, 1, 1, 0,
1873 doc
: /* Reverse LIST, copying. Return the reversed list.
1874 See also the function `nreverse', which is used more often. */)
1880 for (new = Qnil
; CONSP (list
); list
= XCDR (list
))
1883 new = Fcons (XCAR (list
), new);
1886 wrong_type_argument (Qconsp
, list
);
1890 Lisp_Object
merge ();
1892 DEFUN ("sort", Fsort
, Ssort
, 2, 2, 0,
1893 doc
: /* Sort LIST, stably, comparing elements using PREDICATE.
1894 Returns the sorted list. LIST is modified by side effects.
1895 PREDICATE is called with two elements of LIST, and should return t
1896 if the first element is "less" than the second. */)
1898 Lisp_Object list
, predicate
;
1900 Lisp_Object front
, back
;
1901 register Lisp_Object len
, tem
;
1902 struct gcpro gcpro1
, gcpro2
;
1903 register int length
;
1906 len
= Flength (list
);
1907 length
= XINT (len
);
1911 XSETINT (len
, (length
/ 2) - 1);
1912 tem
= Fnthcdr (len
, list
);
1914 Fsetcdr (tem
, Qnil
);
1916 GCPRO2 (front
, back
);
1917 front
= Fsort (front
, predicate
);
1918 back
= Fsort (back
, predicate
);
1920 return merge (front
, back
, predicate
);
1924 merge (org_l1
, org_l2
, pred
)
1925 Lisp_Object org_l1
, org_l2
;
1929 register Lisp_Object tail
;
1931 register Lisp_Object l1
, l2
;
1932 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
;
1939 /* It is sufficient to protect org_l1 and org_l2.
1940 When l1 and l2 are updated, we copy the new values
1941 back into the org_ vars. */
1942 GCPRO4 (org_l1
, org_l2
, pred
, value
);
1962 tem
= call2 (pred
, Fcar (l2
), Fcar (l1
));
1978 Fsetcdr (tail
, tem
);
1984 #if 0 /* Unsafe version. */
1985 DEFUN ("plist-get", Fplist_get
, Splist_get
, 2, 2, 0,
1986 doc
: /* Extract a value from a property list.
1987 PLIST is a property list, which is a list of the form
1988 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value
1989 corresponding to the given PROP, or nil if PROP is not
1990 one of the properties on the list. */)
1998 CONSP (tail
) && CONSP (XCDR (tail
));
1999 tail
= XCDR (XCDR (tail
)))
2001 if (EQ (prop
, XCAR (tail
)))
2002 return XCAR (XCDR (tail
));
2004 /* This function can be called asynchronously
2005 (setup_coding_system). Don't QUIT in that case. */
2006 if (!interrupt_input_blocked
)
2011 wrong_type_argument (Qlistp
, prop
);
2017 /* This does not check for quits. That is safe since it must terminate. */
2019 DEFUN ("plist-get", Fplist_get
, Splist_get
, 2, 2, 0,
2020 doc
: /* Extract a value from a property list.
2021 PLIST is a property list, which is a list of the form
2022 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value
2023 corresponding to the given PROP, or nil if PROP is not one of the
2024 properties on the list. This function never signals an error. */)
2029 Lisp_Object tail
, halftail
;
2031 /* halftail is used to detect circular lists. */
2032 tail
= halftail
= plist
;
2033 while (CONSP (tail
) && CONSP (XCDR (tail
)))
2035 if (EQ (prop
, XCAR (tail
)))
2036 return XCAR (XCDR (tail
));
2038 tail
= XCDR (XCDR (tail
));
2039 halftail
= XCDR (halftail
);
2040 if (EQ (tail
, halftail
))
2047 DEFUN ("get", Fget
, Sget
, 2, 2, 0,
2048 doc
: /* Return the value of SYMBOL's PROPNAME property.
2049 This is the last value stored with `(put SYMBOL PROPNAME VALUE)'. */)
2051 Lisp_Object symbol
, propname
;
2053 CHECK_SYMBOL (symbol
);
2054 return Fplist_get (XSYMBOL (symbol
)->plist
, propname
);
2057 DEFUN ("plist-put", Fplist_put
, Splist_put
, 3, 3, 0,
2058 doc
: /* Change value in PLIST of PROP to VAL.
2059 PLIST is a property list, which is a list of the form
2060 \(PROP1 VALUE1 PROP2 VALUE2 ...). PROP is a symbol and VAL is any object.
2061 If PROP is already a property on the list, its value is set to VAL,
2062 otherwise the new PROP VAL pair is added. The new plist is returned;
2063 use `(setq x (plist-put x prop val))' to be sure to use the new value.
2064 The PLIST is modified by side effects. */)
2067 register Lisp_Object prop
;
2070 register Lisp_Object tail
, prev
;
2071 Lisp_Object newcell
;
2073 for (tail
= plist
; CONSP (tail
) && CONSP (XCDR (tail
));
2074 tail
= XCDR (XCDR (tail
)))
2076 if (EQ (prop
, XCAR (tail
)))
2078 Fsetcar (XCDR (tail
), val
);
2085 newcell
= Fcons (prop
, Fcons (val
, Qnil
));
2089 Fsetcdr (XCDR (prev
), newcell
);
2093 DEFUN ("put", Fput
, Sput
, 3, 3, 0,
2094 doc
: /* Store SYMBOL's PROPNAME property with value VALUE.
2095 It can be retrieved with `(get SYMBOL PROPNAME)'. */)
2096 (symbol
, propname
, value
)
2097 Lisp_Object symbol
, propname
, value
;
2099 CHECK_SYMBOL (symbol
);
2100 XSYMBOL (symbol
)->plist
2101 = Fplist_put (XSYMBOL (symbol
)->plist
, propname
, value
);
2105 DEFUN ("lax-plist-get", Flax_plist_get
, Slax_plist_get
, 2, 2, 0,
2106 doc
: /* Extract a value from a property list, comparing with `equal'.
2107 PLIST is a property list, which is a list of the form
2108 \(PROP1 VALUE1 PROP2 VALUE2...). This function returns the value
2109 corresponding to the given PROP, or nil if PROP is not
2110 one of the properties on the list. */)
2118 CONSP (tail
) && CONSP (XCDR (tail
));
2119 tail
= XCDR (XCDR (tail
)))
2121 if (! NILP (Fequal (prop
, XCAR (tail
))))
2122 return XCAR (XCDR (tail
));
2128 wrong_type_argument (Qlistp
, prop
);
2133 DEFUN ("lax-plist-put", Flax_plist_put
, Slax_plist_put
, 3, 3, 0,
2134 doc
: /* Change value in PLIST of PROP to VAL, comparing with `equal'.
2135 PLIST is a property list, which is a list of the form
2136 \(PROP1 VALUE1 PROP2 VALUE2 ...). PROP and VAL are any objects.
2137 If PROP is already a property on the list, its value is set to VAL,
2138 otherwise the new PROP VAL pair is added. The new plist is returned;
2139 use `(setq x (lax-plist-put x prop val))' to be sure to use the new value.
2140 The PLIST is modified by side effects. */)
2143 register Lisp_Object prop
;
2146 register Lisp_Object tail
, prev
;
2147 Lisp_Object newcell
;
2149 for (tail
= plist
; CONSP (tail
) && CONSP (XCDR (tail
));
2150 tail
= XCDR (XCDR (tail
)))
2152 if (! NILP (Fequal (prop
, XCAR (tail
))))
2154 Fsetcar (XCDR (tail
), val
);
2161 newcell
= Fcons (prop
, Fcons (val
, Qnil
));
2165 Fsetcdr (XCDR (prev
), newcell
);
2169 DEFUN ("eql", Feql
, Seql
, 2, 2, 0,
2170 doc
: /* Return t if the two args are the same Lisp object.
2171 Floating-point numbers of equal value are `eql', but they may not be `eq'. */)
2173 Lisp_Object obj1
, obj2
;
2176 return internal_equal (obj1
, obj2
, 0, 0) ? Qt
: Qnil
;
2178 return EQ (obj1
, obj2
) ? Qt
: Qnil
;
2181 DEFUN ("equal", Fequal
, Sequal
, 2, 2, 0,
2182 doc
: /* Return t if two Lisp objects have similar structure and contents.
2183 They must have the same data type.
2184 Conses are compared by comparing the cars and the cdrs.
2185 Vectors and strings are compared element by element.
2186 Numbers are compared by value, but integers cannot equal floats.
2187 (Use `=' if you want integers and floats to be able to be equal.)
2188 Symbols must match exactly. */)
2190 register Lisp_Object o1
, o2
;
2192 return internal_equal (o1
, o2
, 0, 0) ? Qt
: Qnil
;
2195 DEFUN ("equal-including-properties", Fequal_including_properties
, Sequal_including_properties
, 2, 2, 0,
2196 doc
: /* Return t if two Lisp objects have similar structure and contents.
2197 This is like `equal' except that it compares the text properties
2198 of strings. (`equal' ignores text properties.) */)
2200 register Lisp_Object o1
, o2
;
2202 return internal_equal (o1
, o2
, 0, 1) ? Qt
: Qnil
;
2205 /* DEPTH is current depth of recursion. Signal an error if it
2207 PROPS, if non-nil, means compare string text properties too. */
2210 internal_equal (o1
, o2
, depth
, props
)
2211 register Lisp_Object o1
, o2
;
2215 error ("Stack overflow in equal");
2221 if (XTYPE (o1
) != XTYPE (o2
))
2230 d1
= extract_float (o1
);
2231 d2
= extract_float (o2
);
2232 /* If d is a NaN, then d != d. Two NaNs should be `equal' even
2233 though they are not =. */
2234 return d1
== d2
|| (d1
!= d1
&& d2
!= d2
);
2238 if (!internal_equal (XCAR (o1
), XCAR (o2
), depth
+ 1, props
))
2245 if (XMISCTYPE (o1
) != XMISCTYPE (o2
))
2249 if (!internal_equal (OVERLAY_START (o1
), OVERLAY_START (o2
),
2251 || !internal_equal (OVERLAY_END (o1
), OVERLAY_END (o2
),
2254 o1
= XOVERLAY (o1
)->plist
;
2255 o2
= XOVERLAY (o2
)->plist
;
2260 return (XMARKER (o1
)->buffer
== XMARKER (o2
)->buffer
2261 && (XMARKER (o1
)->buffer
== 0
2262 || XMARKER (o1
)->bytepos
== XMARKER (o2
)->bytepos
));
2266 case Lisp_Vectorlike
:
2269 EMACS_INT size
= XVECTOR (o1
)->size
;
2270 /* Pseudovectors have the type encoded in the size field, so this test
2271 actually checks that the objects have the same type as well as the
2273 if (XVECTOR (o2
)->size
!= size
)
2275 /* Boolvectors are compared much like strings. */
2276 if (BOOL_VECTOR_P (o1
))
2279 = ((XBOOL_VECTOR (o1
)->size
+ BOOL_VECTOR_BITS_PER_CHAR
- 1)
2280 / BOOL_VECTOR_BITS_PER_CHAR
);
2282 if (XBOOL_VECTOR (o1
)->size
!= XBOOL_VECTOR (o2
)->size
)
2284 if (bcmp (XBOOL_VECTOR (o1
)->data
, XBOOL_VECTOR (o2
)->data
,
2289 if (WINDOW_CONFIGURATIONP (o1
))
2290 return compare_window_configurations (o1
, o2
, 0);
2292 /* Aside from them, only true vectors, char-tables, and compiled
2293 functions are sensible to compare, so eliminate the others now. */
2294 if (size
& PSEUDOVECTOR_FLAG
)
2296 if (!(size
& (PVEC_COMPILED
| PVEC_CHAR_TABLE
)))
2298 size
&= PSEUDOVECTOR_SIZE_MASK
;
2300 for (i
= 0; i
< size
; i
++)
2303 v1
= XVECTOR (o1
)->contents
[i
];
2304 v2
= XVECTOR (o2
)->contents
[i
];
2305 if (!internal_equal (v1
, v2
, depth
+ 1, props
))
2313 if (SCHARS (o1
) != SCHARS (o2
))
2315 if (SBYTES (o1
) != SBYTES (o2
))
2317 if (bcmp (SDATA (o1
), SDATA (o2
),
2320 if (props
&& !compare_string_intervals (o1
, o2
))
2326 case Lisp_Type_Limit
:
2333 extern Lisp_Object
Fmake_char_internal ();
2335 DEFUN ("fillarray", Ffillarray
, Sfillarray
, 2, 2, 0,
2336 doc
: /* Store each element of ARRAY with ITEM.
2337 ARRAY is a vector, string, char-table, or bool-vector. */)
2339 Lisp_Object array
, item
;
2341 register int size
, index
, charval
;
2343 if (VECTORP (array
))
2345 register Lisp_Object
*p
= XVECTOR (array
)->contents
;
2346 size
= XVECTOR (array
)->size
;
2347 for (index
= 0; index
< size
; index
++)
2350 else if (CHAR_TABLE_P (array
))
2352 register Lisp_Object
*p
= XCHAR_TABLE (array
)->contents
;
2353 size
= CHAR_TABLE_ORDINARY_SLOTS
;
2354 for (index
= 0; index
< size
; index
++)
2356 XCHAR_TABLE (array
)->defalt
= Qnil
;
2358 else if (STRINGP (array
))
2360 register unsigned char *p
= SDATA (array
);
2361 CHECK_NUMBER (item
);
2362 charval
= XINT (item
);
2363 size
= SCHARS (array
);
2364 if (STRING_MULTIBYTE (array
))
2366 unsigned char str
[MAX_MULTIBYTE_LENGTH
];
2367 int len
= CHAR_STRING (charval
, str
);
2368 int size_byte
= SBYTES (array
);
2369 unsigned char *p1
= p
, *endp
= p
+ size_byte
;
2372 if (size
!= size_byte
)
2375 int this_len
= MULTIBYTE_FORM_LENGTH (p1
, endp
- p1
);
2376 if (len
!= this_len
)
2377 error ("Attempt to change byte length of a string");
2380 for (i
= 0; i
< size_byte
; i
++)
2381 *p
++ = str
[i
% len
];
2384 for (index
= 0; index
< size
; index
++)
2387 else if (BOOL_VECTOR_P (array
))
2389 register unsigned char *p
= XBOOL_VECTOR (array
)->data
;
2391 = ((XBOOL_VECTOR (array
)->size
+ BOOL_VECTOR_BITS_PER_CHAR
- 1)
2392 / BOOL_VECTOR_BITS_PER_CHAR
);
2394 charval
= (! NILP (item
) ? -1 : 0);
2395 for (index
= 0; index
< size_in_chars
- 1; index
++)
2397 if (index
< size_in_chars
)
2399 /* Mask out bits beyond the vector size. */
2400 if (XBOOL_VECTOR (array
)->size
% BOOL_VECTOR_BITS_PER_CHAR
)
2401 charval
&= (1 << (XBOOL_VECTOR (array
)->size
% BOOL_VECTOR_BITS_PER_CHAR
)) - 1;
2407 array
= wrong_type_argument (Qarrayp
, array
);
2413 DEFUN ("clear-string", Fclear_string
, Sclear_string
,
2415 doc
: /* Clear the contents of STRING.
2416 This makes STRING unibyte and may change its length. */)
2421 CHECK_STRING (string
);
2422 len
= SBYTES (string
);
2423 bzero (SDATA (string
), len
);
2424 STRING_SET_CHARS (string
, len
);
2425 STRING_SET_UNIBYTE (string
);
2429 DEFUN ("char-table-subtype", Fchar_table_subtype
, Schar_table_subtype
,
2431 doc
: /* Return the subtype of char-table CHAR-TABLE. The value is a symbol. */)
2433 Lisp_Object char_table
;
2435 CHECK_CHAR_TABLE (char_table
);
2437 return XCHAR_TABLE (char_table
)->purpose
;
2440 DEFUN ("char-table-parent", Fchar_table_parent
, Schar_table_parent
,
2442 doc
: /* Return the parent char-table of CHAR-TABLE.
2443 The value is either nil or another char-table.
2444 If CHAR-TABLE holds nil for a given character,
2445 then the actual applicable value is inherited from the parent char-table
2446 \(or from its parents, if necessary). */)
2448 Lisp_Object char_table
;
2450 CHECK_CHAR_TABLE (char_table
);
2452 return XCHAR_TABLE (char_table
)->parent
;
2455 DEFUN ("set-char-table-parent", Fset_char_table_parent
, Sset_char_table_parent
,
2457 doc
: /* Set the parent char-table of CHAR-TABLE to PARENT.
2458 Return PARENT. PARENT must be either nil or another char-table. */)
2459 (char_table
, parent
)
2460 Lisp_Object char_table
, parent
;
2464 CHECK_CHAR_TABLE (char_table
);
2468 CHECK_CHAR_TABLE (parent
);
2470 for (temp
= parent
; !NILP (temp
); temp
= XCHAR_TABLE (temp
)->parent
)
2471 if (EQ (temp
, char_table
))
2472 error ("Attempt to make a chartable be its own parent");
2475 XCHAR_TABLE (char_table
)->parent
= parent
;
2480 DEFUN ("char-table-extra-slot", Fchar_table_extra_slot
, Schar_table_extra_slot
,
2482 doc
: /* Return the value of CHAR-TABLE's extra-slot number N. */)
2484 Lisp_Object char_table
, n
;
2486 CHECK_CHAR_TABLE (char_table
);
2489 || XINT (n
) >= CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (char_table
)))
2490 args_out_of_range (char_table
, n
);
2492 return XCHAR_TABLE (char_table
)->extras
[XINT (n
)];
2495 DEFUN ("set-char-table-extra-slot", Fset_char_table_extra_slot
,
2496 Sset_char_table_extra_slot
,
2498 doc
: /* Set CHAR-TABLE's extra-slot number N to VALUE. */)
2499 (char_table
, n
, value
)
2500 Lisp_Object char_table
, n
, value
;
2502 CHECK_CHAR_TABLE (char_table
);
2505 || XINT (n
) >= CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (char_table
)))
2506 args_out_of_range (char_table
, n
);
2508 return XCHAR_TABLE (char_table
)->extras
[XINT (n
)] = value
;
2511 DEFUN ("char-table-range", Fchar_table_range
, Schar_table_range
,
2513 doc
: /* Return the value in CHAR-TABLE for a range of characters RANGE.
2514 RANGE should be nil (for the default value)
2515 a vector which identifies a character set or a row of a character set,
2516 a character set name, or a character code. */)
2518 Lisp_Object char_table
, range
;
2520 CHECK_CHAR_TABLE (char_table
);
2522 if (EQ (range
, Qnil
))
2523 return XCHAR_TABLE (char_table
)->defalt
;
2524 else if (INTEGERP (range
))
2525 return Faref (char_table
, range
);
2526 else if (SYMBOLP (range
))
2528 Lisp_Object charset_info
;
2530 charset_info
= Fget (range
, Qcharset
);
2531 CHECK_VECTOR (charset_info
);
2533 return Faref (char_table
,
2534 make_number (XINT (XVECTOR (charset_info
)->contents
[0])
2537 else if (VECTORP (range
))
2539 if (XVECTOR (range
)->size
== 1)
2540 return Faref (char_table
,
2541 make_number (XINT (XVECTOR (range
)->contents
[0]) + 128));
2544 int size
= XVECTOR (range
)->size
;
2545 Lisp_Object
*val
= XVECTOR (range
)->contents
;
2546 Lisp_Object ch
= Fmake_char_internal (size
<= 0 ? Qnil
: val
[0],
2547 size
<= 1 ? Qnil
: val
[1],
2548 size
<= 2 ? Qnil
: val
[2]);
2549 return Faref (char_table
, ch
);
2553 error ("Invalid RANGE argument to `char-table-range'");
2557 DEFUN ("set-char-table-range", Fset_char_table_range
, Sset_char_table_range
,
2559 doc
: /* Set the value in CHAR-TABLE for a range of characters RANGE to VALUE.
2560 RANGE should be t (for all characters), nil (for the default value),
2561 a character set, a vector which identifies a character set, a row of a
2562 character set, or a character code. Return VALUE. */)
2563 (char_table
, range
, value
)
2564 Lisp_Object char_table
, range
, value
;
2568 CHECK_CHAR_TABLE (char_table
);
2571 for (i
= 0; i
< CHAR_TABLE_ORDINARY_SLOTS
; i
++)
2573 /* Don't set these special slots used for default values of
2574 ascii, eight-bit-control, and eight-bit-graphic. */
2575 if (i
!= CHAR_TABLE_DEFAULT_SLOT_ASCII
2576 && i
!= CHAR_TABLE_DEFAULT_SLOT_8_BIT_CONTROL
2577 && i
!= CHAR_TABLE_DEFAULT_SLOT_8_BIT_GRAPHIC
)
2578 XCHAR_TABLE (char_table
)->contents
[i
] = value
;
2580 else if (EQ (range
, Qnil
))
2581 XCHAR_TABLE (char_table
)->defalt
= value
;
2582 else if (SYMBOLP (range
))
2584 Lisp_Object charset_info
;
2587 charset_info
= Fget (range
, Qcharset
);
2588 if (! VECTORP (charset_info
)
2589 || ! NATNUMP (AREF (charset_info
, 0))
2590 || (charset_id
= XINT (AREF (charset_info
, 0)),
2591 ! CHARSET_DEFINED_P (charset_id
)))
2592 error ("Invalid charset: %s", SDATA (SYMBOL_NAME (range
)));
2594 if (charset_id
== CHARSET_ASCII
)
2595 for (i
= 0; i
< 128; i
++)
2596 XCHAR_TABLE (char_table
)->contents
[i
] = value
;
2597 else if (charset_id
== CHARSET_8_BIT_CONTROL
)
2598 for (i
= 128; i
< 160; i
++)
2599 XCHAR_TABLE (char_table
)->contents
[i
] = value
;
2600 else if (charset_id
== CHARSET_8_BIT_GRAPHIC
)
2601 for (i
= 160; i
< 256; i
++)
2602 XCHAR_TABLE (char_table
)->contents
[i
] = value
;
2604 XCHAR_TABLE (char_table
)->contents
[charset_id
+ 128] = value
;
2606 else if (INTEGERP (range
))
2607 Faset (char_table
, range
, value
);
2608 else if (VECTORP (range
))
2610 int size
= XVECTOR (range
)->size
;
2611 Lisp_Object
*val
= XVECTOR (range
)->contents
;
2612 Lisp_Object ch
= Fmake_char_internal (size
<= 0 ? Qnil
: val
[0],
2613 size
<= 1 ? Qnil
: val
[1],
2614 size
<= 2 ? Qnil
: val
[2]);
2615 Faset (char_table
, ch
, value
);
2618 error ("Invalid RANGE argument to `set-char-table-range'");
2623 DEFUN ("set-char-table-default", Fset_char_table_default
,
2624 Sset_char_table_default
, 3, 3, 0,
2625 doc
: /* Set the default value in CHAR-TABLE for generic character CH to VALUE.
2626 The generic character specifies the group of characters.
2627 If CH is a normal character, set the default value for a group of
2628 characters to which CH belongs.
2629 See also the documentation of `make-char'. */)
2630 (char_table
, ch
, value
)
2631 Lisp_Object char_table
, ch
, value
;
2633 int c
, charset
, code1
, code2
;
2636 CHECK_CHAR_TABLE (char_table
);
2640 SPLIT_CHAR (c
, charset
, code1
, code2
);
2642 /* Since we may want to set the default value for a character set
2643 not yet defined, we check only if the character set is in the
2644 valid range or not, instead of it is already defined or not. */
2645 if (! CHARSET_VALID_P (charset
))
2646 invalid_character (c
);
2648 if (SINGLE_BYTE_CHAR_P (c
))
2650 /* We use special slots for the default values of single byte
2653 = (c
< 0x80 ? CHAR_TABLE_DEFAULT_SLOT_ASCII
2654 : c
< 0xA0 ? CHAR_TABLE_DEFAULT_SLOT_8_BIT_CONTROL
2655 : CHAR_TABLE_DEFAULT_SLOT_8_BIT_GRAPHIC
);
2657 return (XCHAR_TABLE (char_table
)->contents
[default_slot
] = value
);
2660 /* Even if C is not a generic char, we had better behave as if a
2661 generic char is specified. */
2662 if (!CHARSET_DEFINED_P (charset
) || CHARSET_DIMENSION (charset
) == 1)
2664 temp
= XCHAR_TABLE (char_table
)->contents
[charset
+ 128];
2665 if (! SUB_CHAR_TABLE_P (temp
))
2667 temp
= make_sub_char_table (temp
);
2668 XCHAR_TABLE (char_table
)->contents
[charset
+ 128] = temp
;
2672 XCHAR_TABLE (temp
)->defalt
= value
;
2676 temp
= XCHAR_TABLE (char_table
)->contents
[code1
];
2677 if (SUB_CHAR_TABLE_P (temp
))
2678 XCHAR_TABLE (temp
)->defalt
= value
;
2680 XCHAR_TABLE (char_table
)->contents
[code1
] = value
;
2684 /* Look up the element in TABLE at index CH,
2685 and return it as an integer.
2686 If the element is nil, return CH itself.
2687 (Actually we do that for any non-integer.) */
2690 char_table_translate (table
, ch
)
2695 value
= Faref (table
, make_number (ch
));
2696 if (! INTEGERP (value
))
2698 return XINT (value
);
2702 optimize_sub_char_table (table
, chars
)
2710 from
= 33, to
= 127;
2712 from
= 32, to
= 128;
2714 if (!SUB_CHAR_TABLE_P (*table
))
2716 elt
= XCHAR_TABLE (*table
)->contents
[from
++];
2717 for (; from
< to
; from
++)
2718 if (NILP (Fequal (elt
, XCHAR_TABLE (*table
)->contents
[from
])))
2723 DEFUN ("optimize-char-table", Foptimize_char_table
, Soptimize_char_table
,
2724 1, 1, 0, doc
: /* Optimize char table TABLE. */)
2732 CHECK_CHAR_TABLE (table
);
2734 for (i
= CHAR_TABLE_SINGLE_BYTE_SLOTS
; i
< CHAR_TABLE_ORDINARY_SLOTS
; i
++)
2736 elt
= XCHAR_TABLE (table
)->contents
[i
];
2737 if (!SUB_CHAR_TABLE_P (elt
))
2739 dim
= CHARSET_DIMENSION (i
- 128);
2741 for (j
= 32; j
< SUB_CHAR_TABLE_ORDINARY_SLOTS
; j
++)
2742 optimize_sub_char_table (XCHAR_TABLE (elt
)->contents
+ j
, dim
);
2743 optimize_sub_char_table (XCHAR_TABLE (table
)->contents
+ i
, dim
);
2749 /* Map C_FUNCTION or FUNCTION over SUBTABLE, calling it for each
2750 character or group of characters that share a value.
2751 DEPTH is the current depth in the originally specified
2752 chartable, and INDICES contains the vector indices
2753 for the levels our callers have descended.
2755 ARG is passed to C_FUNCTION when that is called. */
2758 map_char_table (c_function
, function
, table
, subtable
, arg
, depth
, indices
)
2759 void (*c_function
) P_ ((Lisp_Object
, Lisp_Object
, Lisp_Object
));
2760 Lisp_Object function
, table
, subtable
, arg
, *indices
;
2764 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
;
2766 GCPRO4 (arg
, table
, subtable
, function
);
2770 /* At first, handle ASCII and 8-bit European characters. */
2771 for (i
= 0; i
< CHAR_TABLE_SINGLE_BYTE_SLOTS
; i
++)
2773 Lisp_Object elt
= XCHAR_TABLE (subtable
)->contents
[i
];
2775 elt
= XCHAR_TABLE (subtable
)->defalt
;
2777 elt
= Faref (subtable
, make_number (i
));
2779 (*c_function
) (arg
, make_number (i
), elt
);
2781 call2 (function
, make_number (i
), elt
);
2783 #if 0 /* If the char table has entries for higher characters,
2784 we should report them. */
2785 if (NILP (current_buffer
->enable_multibyte_characters
))
2791 to
= CHAR_TABLE_ORDINARY_SLOTS
;
2795 int charset
= XFASTINT (indices
[0]) - 128;
2798 to
= SUB_CHAR_TABLE_ORDINARY_SLOTS
;
2799 if (CHARSET_CHARS (charset
) == 94)
2808 elt
= XCHAR_TABLE (subtable
)->contents
[i
];
2809 XSETFASTINT (indices
[depth
], i
);
2810 charset
= XFASTINT (indices
[0]) - 128;
2812 && (!CHARSET_DEFINED_P (charset
)
2813 || charset
== CHARSET_8_BIT_CONTROL
2814 || charset
== CHARSET_8_BIT_GRAPHIC
))
2817 if (SUB_CHAR_TABLE_P (elt
))
2820 error ("Too deep char table");
2821 map_char_table (c_function
, function
, table
, elt
, arg
, depth
+ 1, indices
);
2827 c1
= depth
>= 1 ? XFASTINT (indices
[1]) : 0;
2828 c2
= depth
>= 2 ? XFASTINT (indices
[2]) : 0;
2829 c
= MAKE_CHAR (charset
, c1
, c2
);
2832 elt
= XCHAR_TABLE (subtable
)->defalt
;
2834 elt
= Faref (table
, make_number (c
));
2837 (*c_function
) (arg
, make_number (c
), elt
);
2839 call2 (function
, make_number (c
), elt
);
2845 static void void_call2
P_ ((Lisp_Object a
, Lisp_Object b
, Lisp_Object c
));
2847 void_call2 (a
, b
, c
)
2848 Lisp_Object a
, b
, c
;
2853 DEFUN ("map-char-table", Fmap_char_table
, Smap_char_table
,
2855 doc
: /* Call FUNCTION for each (normal and generic) characters in CHAR-TABLE.
2856 FUNCTION is called with two arguments--a key and a value.
2857 The key is always a possible IDX argument to `aref'. */)
2858 (function
, char_table
)
2859 Lisp_Object function
, char_table
;
2861 /* The depth of char table is at most 3. */
2862 Lisp_Object indices
[3];
2864 CHECK_CHAR_TABLE (char_table
);
2866 /* When Lisp_Object is represented as a union, `call2' cannot directly
2867 be passed to map_char_table because it returns a Lisp_Object rather
2868 than returning nothing.
2869 Casting leads to crashes on some architectures. -stef */
2870 map_char_table (void_call2
, Qnil
, char_table
, char_table
, function
, 0, indices
);
2874 /* Return a value for character C in char-table TABLE. Store the
2875 actual index for that value in *IDX. Ignore the default value of
2879 char_table_ref_and_index (table
, c
, idx
)
2883 int charset
, c1
, c2
;
2886 if (SINGLE_BYTE_CHAR_P (c
))
2889 return XCHAR_TABLE (table
)->contents
[c
];
2891 SPLIT_CHAR (c
, charset
, c1
, c2
);
2892 elt
= XCHAR_TABLE (table
)->contents
[charset
+ 128];
2893 *idx
= MAKE_CHAR (charset
, 0, 0);
2894 if (!SUB_CHAR_TABLE_P (elt
))
2896 if (c1
< 32 || NILP (XCHAR_TABLE (elt
)->contents
[c1
]))
2897 return XCHAR_TABLE (elt
)->defalt
;
2898 elt
= XCHAR_TABLE (elt
)->contents
[c1
];
2899 *idx
= MAKE_CHAR (charset
, c1
, 0);
2900 if (!SUB_CHAR_TABLE_P (elt
))
2902 if (c2
< 32 || NILP (XCHAR_TABLE (elt
)->contents
[c2
]))
2903 return XCHAR_TABLE (elt
)->defalt
;
2905 return XCHAR_TABLE (elt
)->contents
[c2
];
2915 Lisp_Object args
[2];
2918 return Fnconc (2, args
);
2920 return Fnconc (2, &s1
);
2921 #endif /* NO_ARG_ARRAY */
2924 DEFUN ("nconc", Fnconc
, Snconc
, 0, MANY
, 0,
2925 doc
: /* Concatenate any number of lists by altering them.
2926 Only the last argument is not altered, and need not be a list.
2927 usage: (nconc &rest LISTS) */)
2932 register int argnum
;
2933 register Lisp_Object tail
, tem
, val
;
2937 for (argnum
= 0; argnum
< nargs
; argnum
++)
2940 if (NILP (tem
)) continue;
2945 if (argnum
+ 1 == nargs
) break;
2948 tem
= wrong_type_argument (Qlistp
, tem
);
2957 tem
= args
[argnum
+ 1];
2958 Fsetcdr (tail
, tem
);
2960 args
[argnum
+ 1] = tail
;
2966 /* This is the guts of all mapping functions.
2967 Apply FN to each element of SEQ, one by one,
2968 storing the results into elements of VALS, a C vector of Lisp_Objects.
2969 LENI is the length of VALS, which should also be the length of SEQ. */
2972 mapcar1 (leni
, vals
, fn
, seq
)
2975 Lisp_Object fn
, seq
;
2977 register Lisp_Object tail
;
2980 struct gcpro gcpro1
, gcpro2
, gcpro3
;
2984 /* Don't let vals contain any garbage when GC happens. */
2985 for (i
= 0; i
< leni
; i
++)
2988 GCPRO3 (dummy
, fn
, seq
);
2990 gcpro1
.nvars
= leni
;
2994 /* We need not explicitly protect `tail' because it is used only on lists, and
2995 1) lists are not relocated and 2) the list is marked via `seq' so will not be freed */
2999 for (i
= 0; i
< leni
; i
++)
3001 dummy
= XVECTOR (seq
)->contents
[i
];
3002 dummy
= call1 (fn
, dummy
);
3007 else if (BOOL_VECTOR_P (seq
))
3009 for (i
= 0; i
< leni
; i
++)
3012 byte
= XBOOL_VECTOR (seq
)->data
[i
/ BOOL_VECTOR_BITS_PER_CHAR
];
3013 if (byte
& (1 << (i
% BOOL_VECTOR_BITS_PER_CHAR
)))
3018 dummy
= call1 (fn
, dummy
);
3023 else if (STRINGP (seq
))
3027 for (i
= 0, i_byte
= 0; i
< leni
;)
3032 FETCH_STRING_CHAR_ADVANCE (c
, seq
, i
, i_byte
);
3033 XSETFASTINT (dummy
, c
);
3034 dummy
= call1 (fn
, dummy
);
3036 vals
[i_before
] = dummy
;
3039 else /* Must be a list, since Flength did not get an error */
3042 for (i
= 0; i
< leni
; i
++)
3044 dummy
= call1 (fn
, Fcar (tail
));
3054 DEFUN ("mapconcat", Fmapconcat
, Smapconcat
, 3, 3, 0,
3055 doc
: /* Apply FUNCTION to each element of SEQUENCE, and concat the results as strings.
3056 In between each pair of results, stick in SEPARATOR. Thus, " " as
3057 SEPARATOR results in spaces between the values returned by FUNCTION.
3058 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
3059 (function
, sequence
, separator
)
3060 Lisp_Object function
, sequence
, separator
;
3065 register Lisp_Object
*args
;
3067 struct gcpro gcpro1
;
3071 len
= Flength (sequence
);
3073 nargs
= leni
+ leni
- 1;
3074 if (nargs
< 0) return build_string ("");
3076 SAFE_ALLOCA_LISP (args
, nargs
);
3079 mapcar1 (leni
, args
, function
, sequence
);
3082 for (i
= leni
- 1; i
>= 0; i
--)
3083 args
[i
+ i
] = args
[i
];
3085 for (i
= 1; i
< nargs
; i
+= 2)
3086 args
[i
] = separator
;
3088 ret
= Fconcat (nargs
, args
);
3094 DEFUN ("mapcar", Fmapcar
, Smapcar
, 2, 2, 0,
3095 doc
: /* Apply FUNCTION to each element of SEQUENCE, and make a list of the results.
3096 The result is a list just as long as SEQUENCE.
3097 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
3098 (function
, sequence
)
3099 Lisp_Object function
, sequence
;
3101 register Lisp_Object len
;
3103 register Lisp_Object
*args
;
3107 len
= Flength (sequence
);
3108 leni
= XFASTINT (len
);
3110 SAFE_ALLOCA_LISP (args
, leni
);
3112 mapcar1 (leni
, args
, function
, sequence
);
3114 ret
= Flist (leni
, args
);
3120 DEFUN ("mapc", Fmapc
, Smapc
, 2, 2, 0,
3121 doc
: /* Apply FUNCTION to each element of SEQUENCE for side effects only.
3122 Unlike `mapcar', don't accumulate the results. Return SEQUENCE.
3123 SEQUENCE may be a list, a vector, a bool-vector, or a string. */)
3124 (function
, sequence
)
3125 Lisp_Object function
, sequence
;
3129 leni
= XFASTINT (Flength (sequence
));
3130 mapcar1 (leni
, 0, function
, sequence
);
3135 /* Anything that calls this function must protect from GC! */
3137 DEFUN ("y-or-n-p", Fy_or_n_p
, Sy_or_n_p
, 1, 1, 0,
3138 doc
: /* Ask user a "y or n" question. Return t if answer is "y".
3139 Takes one argument, which is the string to display to ask the question.
3140 It should end in a space; `y-or-n-p' adds `(y or n) ' to it.
3141 No confirmation of the answer is requested; a single character is enough.
3142 Also accepts Space to mean yes, or Delete to mean no. \(Actually, it uses
3143 the bindings in `query-replace-map'; see the documentation of that variable
3144 for more information. In this case, the useful bindings are `act', `skip',
3145 `recenter', and `quit'.\)
3147 Under a windowing system a dialog box will be used if `last-nonmenu-event'
3148 is nil and `use-dialog-box' is non-nil. */)
3152 register Lisp_Object obj
, key
, def
, map
;
3153 register int answer
;
3154 Lisp_Object xprompt
;
3155 Lisp_Object args
[2];
3156 struct gcpro gcpro1
, gcpro2
;
3157 int count
= SPECPDL_INDEX ();
3159 specbind (Qcursor_in_echo_area
, Qt
);
3161 map
= Fsymbol_value (intern ("query-replace-map"));
3163 CHECK_STRING (prompt
);
3165 GCPRO2 (prompt
, xprompt
);
3167 #ifdef HAVE_X_WINDOWS
3168 if (display_hourglass_p
)
3169 cancel_hourglass ();
3176 if ((NILP (last_nonmenu_event
) || CONSP (last_nonmenu_event
))
3180 Lisp_Object pane
, menu
;
3181 redisplay_preserve_echo_area (3);
3182 pane
= Fcons (Fcons (build_string ("Yes"), Qt
),
3183 Fcons (Fcons (build_string ("No"), Qnil
),
3185 menu
= Fcons (prompt
, pane
);
3186 obj
= Fx_popup_dialog (Qt
, menu
);
3187 answer
= !NILP (obj
);
3190 #endif /* HAVE_MENUS */
3191 cursor_in_echo_area
= 1;
3192 choose_minibuf_frame ();
3195 Lisp_Object pargs
[3];
3197 /* Colorize prompt according to `minibuffer-prompt' face. */
3198 pargs
[0] = build_string ("%s(y or n) ");
3199 pargs
[1] = intern ("face");
3200 pargs
[2] = intern ("minibuffer-prompt");
3201 args
[0] = Fpropertize (3, pargs
);
3206 if (minibuffer_auto_raise
)
3208 Lisp_Object mini_frame
;
3210 mini_frame
= WINDOW_FRAME (XWINDOW (minibuf_window
));
3212 Fraise_frame (mini_frame
);
3215 obj
= read_filtered_event (1, 0, 0, 0);
3216 cursor_in_echo_area
= 0;
3217 /* If we need to quit, quit with cursor_in_echo_area = 0. */
3220 key
= Fmake_vector (make_number (1), obj
);
3221 def
= Flookup_key (map
, key
, Qt
);
3223 if (EQ (def
, intern ("skip")))
3228 else if (EQ (def
, intern ("act")))
3233 else if (EQ (def
, intern ("recenter")))
3239 else if (EQ (def
, intern ("quit")))
3241 /* We want to exit this command for exit-prefix,
3242 and this is the only way to do it. */
3243 else if (EQ (def
, intern ("exit-prefix")))
3248 /* If we don't clear this, then the next call to read_char will
3249 return quit_char again, and we'll enter an infinite loop. */
3254 if (EQ (xprompt
, prompt
))
3256 args
[0] = build_string ("Please answer y or n. ");
3258 xprompt
= Fconcat (2, args
);
3263 if (! noninteractive
)
3265 cursor_in_echo_area
= -1;
3266 message_with_string (answer
? "%s(y or n) y" : "%s(y or n) n",
3270 unbind_to (count
, Qnil
);
3271 return answer
? Qt
: Qnil
;
3274 /* This is how C code calls `yes-or-no-p' and allows the user
3277 Anything that calls this function must protect from GC! */
3280 do_yes_or_no_p (prompt
)
3283 return call1 (intern ("yes-or-no-p"), prompt
);
3286 /* Anything that calls this function must protect from GC! */
3288 DEFUN ("yes-or-no-p", Fyes_or_no_p
, Syes_or_no_p
, 1, 1, 0,
3289 doc
: /* Ask user a yes-or-no question. Return t if answer is yes.
3290 Takes one argument, which is the string to display to ask the question.
3291 It should end in a space; `yes-or-no-p' adds `(yes or no) ' to it.
3292 The user must confirm the answer with RET,
3293 and can edit it until it has been confirmed.
3295 Under a windowing system a dialog box will be used if `last-nonmenu-event'
3296 is nil, and `use-dialog-box' is non-nil. */)
3300 register Lisp_Object ans
;
3301 Lisp_Object args
[2];
3302 struct gcpro gcpro1
;
3304 CHECK_STRING (prompt
);
3307 if ((NILP (last_nonmenu_event
) || CONSP (last_nonmenu_event
))
3311 Lisp_Object pane
, menu
, obj
;
3312 redisplay_preserve_echo_area (4);
3313 pane
= Fcons (Fcons (build_string ("Yes"), Qt
),
3314 Fcons (Fcons (build_string ("No"), Qnil
),
3317 menu
= Fcons (prompt
, pane
);
3318 obj
= Fx_popup_dialog (Qt
, menu
);
3322 #endif /* HAVE_MENUS */
3325 args
[1] = build_string ("(yes or no) ");
3326 prompt
= Fconcat (2, args
);
3332 ans
= Fdowncase (Fread_from_minibuffer (prompt
, Qnil
, Qnil
, Qnil
,
3333 Qyes_or_no_p_history
, Qnil
,
3335 if (SCHARS (ans
) == 3 && !strcmp (SDATA (ans
), "yes"))
3340 if (SCHARS (ans
) == 2 && !strcmp (SDATA (ans
), "no"))
3348 message ("Please answer yes or no.");
3349 Fsleep_for (make_number (2), Qnil
);
3353 DEFUN ("load-average", Fload_average
, Sload_average
, 0, 1, 0,
3354 doc
: /* Return list of 1 minute, 5 minute and 15 minute load averages.
3356 Each of the three load averages is multiplied by 100, then converted
3359 When USE-FLOATS is non-nil, floats will be used instead of integers.
3360 These floats are not multiplied by 100.
3362 If the 5-minute or 15-minute load averages are not available, return a
3363 shortened list, containing only those averages which are available.
3365 An error is thrown if the load average can't be obtained. In some
3366 cases making it work would require Emacs being installed setuid or
3367 setgid so that it can read kernel information, and that usually isn't
3370 Lisp_Object use_floats
;
3373 int loads
= getloadavg (load_ave
, 3);
3374 Lisp_Object ret
= Qnil
;
3377 error ("load-average not implemented for this operating system");
3381 Lisp_Object load
= (NILP (use_floats
) ?
3382 make_number ((int) (100.0 * load_ave
[loads
]))
3383 : make_float (load_ave
[loads
]));
3384 ret
= Fcons (load
, ret
);
3390 Lisp_Object Vfeatures
, Qsubfeatures
;
3391 extern Lisp_Object Vafter_load_alist
;
3393 DEFUN ("featurep", Ffeaturep
, Sfeaturep
, 1, 2, 0,
3394 doc
: /* Returns t if FEATURE is present in this Emacs.
3396 Use this to conditionalize execution of lisp code based on the
3397 presence or absence of emacs or environment extensions.
3398 Use `provide' to declare that a feature is available. This function
3399 looks at the value of the variable `features'. The optional argument
3400 SUBFEATURE can be used to check a specific subfeature of FEATURE. */)
3401 (feature
, subfeature
)
3402 Lisp_Object feature
, subfeature
;
3404 register Lisp_Object tem
;
3405 CHECK_SYMBOL (feature
);
3406 tem
= Fmemq (feature
, Vfeatures
);
3407 if (!NILP (tem
) && !NILP (subfeature
))
3408 tem
= Fmember (subfeature
, Fget (feature
, Qsubfeatures
));
3409 return (NILP (tem
)) ? Qnil
: Qt
;
3412 DEFUN ("provide", Fprovide
, Sprovide
, 1, 2, 0,
3413 doc
: /* Announce that FEATURE is a feature of the current Emacs.
3414 The optional argument SUBFEATURES should be a list of symbols listing
3415 particular subfeatures supported in this version of FEATURE. */)
3416 (feature
, subfeatures
)
3417 Lisp_Object feature
, subfeatures
;
3419 register Lisp_Object tem
;
3420 CHECK_SYMBOL (feature
);
3421 CHECK_LIST (subfeatures
);
3422 if (!NILP (Vautoload_queue
))
3423 Vautoload_queue
= Fcons (Fcons (Vfeatures
, Qnil
), Vautoload_queue
);
3424 tem
= Fmemq (feature
, Vfeatures
);
3426 Vfeatures
= Fcons (feature
, Vfeatures
);
3427 if (!NILP (subfeatures
))
3428 Fput (feature
, Qsubfeatures
, subfeatures
);
3429 LOADHIST_ATTACH (Fcons (Qprovide
, feature
));
3431 /* Run any load-hooks for this file. */
3432 tem
= Fassq (feature
, Vafter_load_alist
);
3434 Fprogn (XCDR (tem
));
3439 /* `require' and its subroutines. */
3441 /* List of features currently being require'd, innermost first. */
3443 Lisp_Object require_nesting_list
;
3446 require_unwind (old_value
)
3447 Lisp_Object old_value
;
3449 return require_nesting_list
= old_value
;
3452 DEFUN ("require", Frequire
, Srequire
, 1, 3, 0,
3453 doc
: /* If feature FEATURE is not loaded, load it from FILENAME.
3454 If FEATURE is not a member of the list `features', then the feature
3455 is not loaded; so load the file FILENAME.
3456 If FILENAME is omitted, the printname of FEATURE is used as the file name,
3457 and `load' will try to load this name appended with the suffix `.elc' or
3458 `.el', in that order. The name without appended suffix will not be used.
3459 If the optional third argument NOERROR is non-nil,
3460 then return nil if the file is not found instead of signaling an error.
3461 Normally the return value is FEATURE.
3462 The normal messages at start and end of loading FILENAME are suppressed. */)
3463 (feature
, filename
, noerror
)
3464 Lisp_Object feature
, filename
, noerror
;
3466 register Lisp_Object tem
;
3467 struct gcpro gcpro1
, gcpro2
;
3469 CHECK_SYMBOL (feature
);
3471 /* Record the presence of `require' in this file
3472 even if the feature specified is already loaded.
3473 But not more than once in any file,
3474 and not when we aren't loading a file. */
3475 if (load_in_progress
)
3477 tem
= Fcons (Qrequire
, feature
);
3478 if (NILP (Fmember (tem
, Vcurrent_load_list
)))
3479 LOADHIST_ATTACH (tem
);
3481 tem
= Fmemq (feature
, Vfeatures
);
3485 int count
= SPECPDL_INDEX ();
3488 /* This is to make sure that loadup.el gives a clear picture
3489 of what files are preloaded and when. */
3490 if (! NILP (Vpurify_flag
))
3491 error ("(require %s) while preparing to dump",
3492 SDATA (SYMBOL_NAME (feature
)));
3494 /* A certain amount of recursive `require' is legitimate,
3495 but if we require the same feature recursively 3 times,
3497 tem
= require_nesting_list
;
3498 while (! NILP (tem
))
3500 if (! NILP (Fequal (feature
, XCAR (tem
))))
3505 error ("Recursive `require' for feature `%s'",
3506 SDATA (SYMBOL_NAME (feature
)));
3508 /* Update the list for any nested `require's that occur. */
3509 record_unwind_protect (require_unwind
, require_nesting_list
);
3510 require_nesting_list
= Fcons (feature
, require_nesting_list
);
3512 /* Value saved here is to be restored into Vautoload_queue */
3513 record_unwind_protect (un_autoload
, Vautoload_queue
);
3514 Vautoload_queue
= Qt
;
3516 /* Load the file. */
3517 GCPRO2 (feature
, filename
);
3518 tem
= Fload (NILP (filename
) ? Fsymbol_name (feature
) : filename
,
3519 noerror
, Qt
, Qnil
, (NILP (filename
) ? Qt
: Qnil
));
3522 /* If load failed entirely, return nil. */
3524 return unbind_to (count
, Qnil
);
3526 tem
= Fmemq (feature
, Vfeatures
);
3528 error ("Required feature `%s' was not provided",
3529 SDATA (SYMBOL_NAME (feature
)));
3531 /* Once loading finishes, don't undo it. */
3532 Vautoload_queue
= Qt
;
3533 feature
= unbind_to (count
, feature
);
3539 /* Primitives for work of the "widget" library.
3540 In an ideal world, this section would not have been necessary.
3541 However, lisp function calls being as slow as they are, it turns
3542 out that some functions in the widget library (wid-edit.el) are the
3543 bottleneck of Widget operation. Here is their translation to C,
3544 for the sole reason of efficiency. */
3546 DEFUN ("plist-member", Fplist_member
, Splist_member
, 2, 2, 0,
3547 doc
: /* Return non-nil if PLIST has the property PROP.
3548 PLIST is a property list, which is a list of the form
3549 \(PROP1 VALUE1 PROP2 VALUE2 ...\). PROP is a symbol.
3550 Unlike `plist-get', this allows you to distinguish between a missing
3551 property and a property with the value nil.
3552 The value is actually the tail of PLIST whose car is PROP. */)
3554 Lisp_Object plist
, prop
;
3556 while (CONSP (plist
) && !EQ (XCAR (plist
), prop
))
3559 plist
= XCDR (plist
);
3560 plist
= CDR (plist
);
3565 DEFUN ("widget-put", Fwidget_put
, Swidget_put
, 3, 3, 0,
3566 doc
: /* In WIDGET, set PROPERTY to VALUE.
3567 The value can later be retrieved with `widget-get'. */)
3568 (widget
, property
, value
)
3569 Lisp_Object widget
, property
, value
;
3571 CHECK_CONS (widget
);
3572 XSETCDR (widget
, Fplist_put (XCDR (widget
), property
, value
));
3576 DEFUN ("widget-get", Fwidget_get
, Swidget_get
, 2, 2, 0,
3577 doc
: /* In WIDGET, get the value of PROPERTY.
3578 The value could either be specified when the widget was created, or
3579 later with `widget-put'. */)
3581 Lisp_Object widget
, property
;
3589 CHECK_CONS (widget
);
3590 tmp
= Fplist_member (XCDR (widget
), property
);
3596 tmp
= XCAR (widget
);
3599 widget
= Fget (tmp
, Qwidget_type
);
3603 DEFUN ("widget-apply", Fwidget_apply
, Swidget_apply
, 2, MANY
, 0,
3604 doc
: /* Apply the value of WIDGET's PROPERTY to the widget itself.
3605 ARGS are passed as extra arguments to the function.
3606 usage: (widget-apply WIDGET PROPERTY &rest ARGS) */)
3611 /* This function can GC. */
3612 Lisp_Object newargs
[3];
3613 struct gcpro gcpro1
, gcpro2
;
3616 newargs
[0] = Fwidget_get (args
[0], args
[1]);
3617 newargs
[1] = args
[0];
3618 newargs
[2] = Flist (nargs
- 2, args
+ 2);
3619 GCPRO2 (newargs
[0], newargs
[2]);
3620 result
= Fapply (3, newargs
);
3625 #ifdef HAVE_LANGINFO_CODESET
3626 #include <langinfo.h>
3629 DEFUN ("locale-info", Flocale_info
, Slocale_info
, 1, 1, 0,
3630 doc
: /* Access locale data ITEM for the current C locale, if available.
3631 ITEM should be one of the following:
3633 `codeset', returning the character set as a string (locale item CODESET);
3635 `days', returning a 7-element vector of day names (locale items DAY_n);
3637 `months', returning a 12-element vector of month names (locale items MON_n);
3639 `paper', returning a list (WIDTH HEIGHT) for the default paper size,
3640 both measured in milimeters (locale items PAPER_WIDTH, PAPER_HEIGHT).
3642 If the system can't provide such information through a call to
3643 `nl_langinfo', or if ITEM isn't from the list above, return nil.
3645 See also Info node `(libc)Locales'.
3647 The data read from the system are decoded using `locale-coding-system'. */)
3652 #ifdef HAVE_LANGINFO_CODESET
3654 if (EQ (item
, Qcodeset
))
3656 str
= nl_langinfo (CODESET
);
3657 return build_string (str
);
3660 else if (EQ (item
, Qdays
)) /* e.g. for calendar-day-name-array */
3662 Lisp_Object v
= Fmake_vector (make_number (7), Qnil
);
3663 int days
[7] = {DAY_1
, DAY_2
, DAY_3
, DAY_4
, DAY_5
, DAY_6
, DAY_7
};
3665 synchronize_system_time_locale ();
3666 for (i
= 0; i
< 7; i
++)
3668 str
= nl_langinfo (days
[i
]);
3669 val
= make_unibyte_string (str
, strlen (str
));
3670 /* Fixme: Is this coding system necessarily right, even if
3671 it is consistent with CODESET? If not, what to do? */
3672 Faset (v
, make_number (i
),
3673 code_convert_string_norecord (val
, Vlocale_coding_system
,
3680 else if (EQ (item
, Qmonths
)) /* e.g. for calendar-month-name-array */
3682 struct Lisp_Vector
*p
= allocate_vector (12);
3683 int months
[12] = {MON_1
, MON_2
, MON_3
, MON_4
, MON_5
, MON_6
, MON_7
,
3684 MON_8
, MON_9
, MON_10
, MON_11
, MON_12
};
3686 synchronize_system_time_locale ();
3687 for (i
= 0; i
< 12; i
++)
3689 str
= nl_langinfo (months
[i
]);
3690 val
= make_unibyte_string (str
, strlen (str
));
3692 code_convert_string_norecord (val
, Vlocale_coding_system
, 0);
3694 XSETVECTOR (val
, p
);
3698 /* LC_PAPER stuff isn't defined as accessible in glibc as of 2.3.1,
3699 but is in the locale files. This could be used by ps-print. */
3701 else if (EQ (item
, Qpaper
))
3703 return list2 (make_number (nl_langinfo (PAPER_WIDTH
)),
3704 make_number (nl_langinfo (PAPER_HEIGHT
)));
3706 #endif /* PAPER_WIDTH */
3707 #endif /* HAVE_LANGINFO_CODESET*/
3711 /* base64 encode/decode functions (RFC 2045).
3712 Based on code from GNU recode. */
3714 #define MIME_LINE_LENGTH 76
3716 #define IS_ASCII(Character) \
3718 #define IS_BASE64(Character) \
3719 (IS_ASCII (Character) && base64_char_to_value[Character] >= 0)
3720 #define IS_BASE64_IGNORABLE(Character) \
3721 ((Character) == ' ' || (Character) == '\t' || (Character) == '\n' \
3722 || (Character) == '\f' || (Character) == '\r')
3724 /* Used by base64_decode_1 to retrieve a non-base64-ignorable
3725 character or return retval if there are no characters left to
3727 #define READ_QUADRUPLET_BYTE(retval) \
3732 if (nchars_return) \
3733 *nchars_return = nchars; \
3738 while (IS_BASE64_IGNORABLE (c))
3740 /* Table of characters coding the 64 values. */
3741 static char base64_value_to_char
[64] =
3743 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', /* 0- 9 */
3744 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', /* 10-19 */
3745 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', /* 20-29 */
3746 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', /* 30-39 */
3747 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', /* 40-49 */
3748 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', /* 50-59 */
3749 '8', '9', '+', '/' /* 60-63 */
3752 /* Table of base64 values for first 128 characters. */
3753 static short base64_char_to_value
[128] =
3755 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0- 9 */
3756 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 10- 19 */
3757 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 20- 29 */
3758 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 30- 39 */
3759 -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, /* 40- 49 */
3760 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, /* 50- 59 */
3761 -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, /* 60- 69 */
3762 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, /* 70- 79 */
3763 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, /* 80- 89 */
3764 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, /* 90- 99 */
3765 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, /* 100-109 */
3766 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, /* 110-119 */
3767 49, 50, 51, -1, -1, -1, -1, -1 /* 120-127 */
3770 /* The following diagram shows the logical steps by which three octets
3771 get transformed into four base64 characters.
3773 .--------. .--------. .--------.
3774 |aaaaaabb| |bbbbcccc| |ccdddddd|
3775 `--------' `--------' `--------'
3777 .--------+--------+--------+--------.
3778 |00aaaaaa|00bbbbbb|00cccccc|00dddddd|
3779 `--------+--------+--------+--------'
3781 .--------+--------+--------+--------.
3782 |AAAAAAAA|BBBBBBBB|CCCCCCCC|DDDDDDDD|
3783 `--------+--------+--------+--------'
3785 The octets are divided into 6 bit chunks, which are then encoded into
3786 base64 characters. */
3789 static int base64_encode_1
P_ ((const char *, char *, int, int, int));
3790 static int base64_decode_1
P_ ((const char *, char *, int, int, int *));
3792 DEFUN ("base64-encode-region", Fbase64_encode_region
, Sbase64_encode_region
,
3794 doc
: /* Base64-encode the region between BEG and END.
3795 Return the length of the encoded text.
3796 Optional third argument NO-LINE-BREAK means do not break long lines
3797 into shorter lines. */)
3798 (beg
, end
, no_line_break
)
3799 Lisp_Object beg
, end
, no_line_break
;
3802 int allength
, length
;
3803 int ibeg
, iend
, encoded_length
;
3807 validate_region (&beg
, &end
);
3809 ibeg
= CHAR_TO_BYTE (XFASTINT (beg
));
3810 iend
= CHAR_TO_BYTE (XFASTINT (end
));
3811 move_gap_both (XFASTINT (beg
), ibeg
);
3813 /* We need to allocate enough room for encoding the text.
3814 We need 33 1/3% more space, plus a newline every 76
3815 characters, and then we round up. */
3816 length
= iend
- ibeg
;
3817 allength
= length
+ length
/3 + 1;
3818 allength
+= allength
/ MIME_LINE_LENGTH
+ 1 + 6;
3820 SAFE_ALLOCA (encoded
, char *, allength
);
3821 encoded_length
= base64_encode_1 (BYTE_POS_ADDR (ibeg
), encoded
, length
,
3822 NILP (no_line_break
),
3823 !NILP (current_buffer
->enable_multibyte_characters
));
3824 if (encoded_length
> allength
)
3827 if (encoded_length
< 0)
3829 /* The encoding wasn't possible. */
3831 error ("Multibyte character in data for base64 encoding");
3834 /* Now we have encoded the region, so we insert the new contents
3835 and delete the old. (Insert first in order to preserve markers.) */
3836 SET_PT_BOTH (XFASTINT (beg
), ibeg
);
3837 insert (encoded
, encoded_length
);
3839 del_range_byte (ibeg
+ encoded_length
, iend
+ encoded_length
, 1);
3841 /* If point was outside of the region, restore it exactly; else just
3842 move to the beginning of the region. */
3843 if (old_pos
>= XFASTINT (end
))
3844 old_pos
+= encoded_length
- (XFASTINT (end
) - XFASTINT (beg
));
3845 else if (old_pos
> XFASTINT (beg
))
3846 old_pos
= XFASTINT (beg
);
3849 /* We return the length of the encoded text. */
3850 return make_number (encoded_length
);
3853 DEFUN ("base64-encode-string", Fbase64_encode_string
, Sbase64_encode_string
,
3855 doc
: /* Base64-encode STRING and return the result.
3856 Optional second argument NO-LINE-BREAK means do not break long lines
3857 into shorter lines. */)
3858 (string
, no_line_break
)
3859 Lisp_Object string
, no_line_break
;
3861 int allength
, length
, encoded_length
;
3863 Lisp_Object encoded_string
;
3866 CHECK_STRING (string
);
3868 /* We need to allocate enough room for encoding the text.
3869 We need 33 1/3% more space, plus a newline every 76
3870 characters, and then we round up. */
3871 length
= SBYTES (string
);
3872 allength
= length
+ length
/3 + 1;
3873 allength
+= allength
/ MIME_LINE_LENGTH
+ 1 + 6;
3875 /* We need to allocate enough room for decoding the text. */
3876 SAFE_ALLOCA (encoded
, char *, allength
);
3878 encoded_length
= base64_encode_1 (SDATA (string
),
3879 encoded
, length
, NILP (no_line_break
),
3880 STRING_MULTIBYTE (string
));
3881 if (encoded_length
> allength
)
3884 if (encoded_length
< 0)
3886 /* The encoding wasn't possible. */
3888 error ("Multibyte character in data for base64 encoding");
3891 encoded_string
= make_unibyte_string (encoded
, encoded_length
);
3894 return encoded_string
;
3898 base64_encode_1 (from
, to
, length
, line_break
, multibyte
)
3905 int counter
= 0, i
= 0;
3915 c
= STRING_CHAR_AND_LENGTH (from
+ i
, length
- i
, bytes
);
3923 /* Wrap line every 76 characters. */
3927 if (counter
< MIME_LINE_LENGTH
/ 4)
3936 /* Process first byte of a triplet. */
3938 *e
++ = base64_value_to_char
[0x3f & c
>> 2];
3939 value
= (0x03 & c
) << 4;
3941 /* Process second byte of a triplet. */
3945 *e
++ = base64_value_to_char
[value
];
3953 c
= STRING_CHAR_AND_LENGTH (from
+ i
, length
- i
, bytes
);
3961 *e
++ = base64_value_to_char
[value
| (0x0f & c
>> 4)];
3962 value
= (0x0f & c
) << 2;
3964 /* Process third byte of a triplet. */
3968 *e
++ = base64_value_to_char
[value
];
3975 c
= STRING_CHAR_AND_LENGTH (from
+ i
, length
- i
, bytes
);
3983 *e
++ = base64_value_to_char
[value
| (0x03 & c
>> 6)];
3984 *e
++ = base64_value_to_char
[0x3f & c
];
3991 DEFUN ("base64-decode-region", Fbase64_decode_region
, Sbase64_decode_region
,
3993 doc
: /* Base64-decode the region between BEG and END.
3994 Return the length of the decoded text.
3995 If the region can't be decoded, signal an error and don't modify the buffer. */)
3997 Lisp_Object beg
, end
;
3999 int ibeg
, iend
, length
, allength
;
4004 int multibyte
= !NILP (current_buffer
->enable_multibyte_characters
);
4007 validate_region (&beg
, &end
);
4009 ibeg
= CHAR_TO_BYTE (XFASTINT (beg
));
4010 iend
= CHAR_TO_BYTE (XFASTINT (end
));
4012 length
= iend
- ibeg
;
4014 /* We need to allocate enough room for decoding the text. If we are
4015 working on a multibyte buffer, each decoded code may occupy at
4017 allength
= multibyte
? length
* 2 : length
;
4018 SAFE_ALLOCA (decoded
, char *, allength
);
4020 move_gap_both (XFASTINT (beg
), ibeg
);
4021 decoded_length
= base64_decode_1 (BYTE_POS_ADDR (ibeg
), decoded
, length
,
4022 multibyte
, &inserted_chars
);
4023 if (decoded_length
> allength
)
4026 if (decoded_length
< 0)
4028 /* The decoding wasn't possible. */
4030 error ("Invalid base64 data");
4033 /* Now we have decoded the region, so we insert the new contents
4034 and delete the old. (Insert first in order to preserve markers.) */
4035 TEMP_SET_PT_BOTH (XFASTINT (beg
), ibeg
);
4036 insert_1_both (decoded
, inserted_chars
, decoded_length
, 0, 1, 0);
4039 /* Delete the original text. */
4040 del_range_both (PT
, PT_BYTE
, XFASTINT (end
) + inserted_chars
,
4041 iend
+ decoded_length
, 1);
4043 /* If point was outside of the region, restore it exactly; else just
4044 move to the beginning of the region. */
4045 if (old_pos
>= XFASTINT (end
))
4046 old_pos
+= inserted_chars
- (XFASTINT (end
) - XFASTINT (beg
));
4047 else if (old_pos
> XFASTINT (beg
))
4048 old_pos
= XFASTINT (beg
);
4049 SET_PT (old_pos
> ZV
? ZV
: old_pos
);
4051 return make_number (inserted_chars
);
4054 DEFUN ("base64-decode-string", Fbase64_decode_string
, Sbase64_decode_string
,
4056 doc
: /* Base64-decode STRING and return the result. */)
4061 int length
, decoded_length
;
4062 Lisp_Object decoded_string
;
4065 CHECK_STRING (string
);
4067 length
= SBYTES (string
);
4068 /* We need to allocate enough room for decoding the text. */
4069 SAFE_ALLOCA (decoded
, char *, length
);
4071 /* The decoded result should be unibyte. */
4072 decoded_length
= base64_decode_1 (SDATA (string
), decoded
, length
,
4074 if (decoded_length
> length
)
4076 else if (decoded_length
>= 0)
4077 decoded_string
= make_unibyte_string (decoded
, decoded_length
);
4079 decoded_string
= Qnil
;
4082 if (!STRINGP (decoded_string
))
4083 error ("Invalid base64 data");
4085 return decoded_string
;
4088 /* Base64-decode the data at FROM of LENGHT bytes into TO. If
4089 MULTIBYTE is nonzero, the decoded result should be in multibyte
4090 form. If NCHARS_RETRUN is not NULL, store the number of produced
4091 characters in *NCHARS_RETURN. */
4094 base64_decode_1 (from
, to
, length
, multibyte
, nchars_return
)
4104 unsigned long value
;
4109 /* Process first byte of a quadruplet. */
4111 READ_QUADRUPLET_BYTE (e
-to
);
4115 value
= base64_char_to_value
[c
] << 18;
4117 /* Process second byte of a quadruplet. */
4119 READ_QUADRUPLET_BYTE (-1);
4123 value
|= base64_char_to_value
[c
] << 12;
4125 c
= (unsigned char) (value
>> 16);
4127 e
+= CHAR_STRING (c
, e
);
4132 /* Process third byte of a quadruplet. */
4134 READ_QUADRUPLET_BYTE (-1);
4138 READ_QUADRUPLET_BYTE (-1);
4147 value
|= base64_char_to_value
[c
] << 6;
4149 c
= (unsigned char) (0xff & value
>> 8);
4151 e
+= CHAR_STRING (c
, e
);
4156 /* Process fourth byte of a quadruplet. */
4158 READ_QUADRUPLET_BYTE (-1);
4165 value
|= base64_char_to_value
[c
];
4167 c
= (unsigned char) (0xff & value
);
4169 e
+= CHAR_STRING (c
, e
);
4178 /***********************************************************************
4180 ***** Hash Tables *****
4182 ***********************************************************************/
4184 /* Implemented by gerd@gnu.org. This hash table implementation was
4185 inspired by CMUCL hash tables. */
4189 1. For small tables, association lists are probably faster than
4190 hash tables because they have lower overhead.
4192 For uses of hash tables where the O(1) behavior of table
4193 operations is not a requirement, it might therefore be a good idea
4194 not to hash. Instead, we could just do a linear search in the
4195 key_and_value vector of the hash table. This could be done
4196 if a `:linear-search t' argument is given to make-hash-table. */
4199 /* The list of all weak hash tables. Don't staticpro this one. */
4201 Lisp_Object Vweak_hash_tables
;
4203 /* Various symbols. */
4205 Lisp_Object Qhash_table_p
, Qeq
, Qeql
, Qequal
, Qkey
, Qvalue
;
4206 Lisp_Object QCtest
, QCsize
, QCrehash_size
, QCrehash_threshold
, QCweakness
;
4207 Lisp_Object Qhash_table_test
, Qkey_or_value
, Qkey_and_value
;
4209 /* Function prototypes. */
4211 static struct Lisp_Hash_Table
*check_hash_table
P_ ((Lisp_Object
));
4212 static int get_key_arg
P_ ((Lisp_Object
, int, Lisp_Object
*, char *));
4213 static void maybe_resize_hash_table
P_ ((struct Lisp_Hash_Table
*));
4214 static int cmpfn_eql
P_ ((struct Lisp_Hash_Table
*, Lisp_Object
, unsigned,
4215 Lisp_Object
, unsigned));
4216 static int cmpfn_equal
P_ ((struct Lisp_Hash_Table
*, Lisp_Object
, unsigned,
4217 Lisp_Object
, unsigned));
4218 static int cmpfn_user_defined
P_ ((struct Lisp_Hash_Table
*, Lisp_Object
,
4219 unsigned, Lisp_Object
, unsigned));
4220 static unsigned hashfn_eq
P_ ((struct Lisp_Hash_Table
*, Lisp_Object
));
4221 static unsigned hashfn_eql
P_ ((struct Lisp_Hash_Table
*, Lisp_Object
));
4222 static unsigned hashfn_equal
P_ ((struct Lisp_Hash_Table
*, Lisp_Object
));
4223 static unsigned hashfn_user_defined
P_ ((struct Lisp_Hash_Table
*,
4225 static unsigned sxhash_string
P_ ((unsigned char *, int));
4226 static unsigned sxhash_list
P_ ((Lisp_Object
, int));
4227 static unsigned sxhash_vector
P_ ((Lisp_Object
, int));
4228 static unsigned sxhash_bool_vector
P_ ((Lisp_Object
));
4229 static int sweep_weak_table
P_ ((struct Lisp_Hash_Table
*, int));
4233 /***********************************************************************
4235 ***********************************************************************/
4237 /* If OBJ is a Lisp hash table, return a pointer to its struct
4238 Lisp_Hash_Table. Otherwise, signal an error. */
4240 static struct Lisp_Hash_Table
*
4241 check_hash_table (obj
)
4244 CHECK_HASH_TABLE (obj
);
4245 return XHASH_TABLE (obj
);
4249 /* Value is the next integer I >= N, N >= 0 which is "almost" a prime
4253 next_almost_prime (n
)
4266 /* Find KEY in ARGS which has size NARGS. Don't consider indices for
4267 which USED[I] is non-zero. If found at index I in ARGS, set
4268 USED[I] and USED[I + 1] to 1, and return I + 1. Otherwise return
4269 -1. This function is used to extract a keyword/argument pair from
4270 a DEFUN parameter list. */
4273 get_key_arg (key
, nargs
, args
, used
)
4281 for (i
= 0; i
< nargs
- 1; ++i
)
4282 if (!used
[i
] && EQ (args
[i
], key
))
4297 /* Return a Lisp vector which has the same contents as VEC but has
4298 size NEW_SIZE, NEW_SIZE >= VEC->size. Entries in the resulting
4299 vector that are not copied from VEC are set to INIT. */
4302 larger_vector (vec
, new_size
, init
)
4307 struct Lisp_Vector
*v
;
4310 xassert (VECTORP (vec
));
4311 old_size
= XVECTOR (vec
)->size
;
4312 xassert (new_size
>= old_size
);
4314 v
= allocate_vector (new_size
);
4315 bcopy (XVECTOR (vec
)->contents
, v
->contents
,
4316 old_size
* sizeof *v
->contents
);
4317 for (i
= old_size
; i
< new_size
; ++i
)
4318 v
->contents
[i
] = init
;
4319 XSETVECTOR (vec
, v
);
4324 /***********************************************************************
4326 ***********************************************************************/
4328 /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code
4329 HASH2 in hash table H using `eql'. Value is non-zero if KEY1 and
4330 KEY2 are the same. */
4333 cmpfn_eql (h
, key1
, hash1
, key2
, hash2
)
4334 struct Lisp_Hash_Table
*h
;
4335 Lisp_Object key1
, key2
;
4336 unsigned hash1
, hash2
;
4338 return (FLOATP (key1
)
4340 && XFLOAT_DATA (key1
) == XFLOAT_DATA (key2
));
4344 /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code
4345 HASH2 in hash table H using `equal'. Value is non-zero if KEY1 and
4346 KEY2 are the same. */
4349 cmpfn_equal (h
, key1
, hash1
, key2
, hash2
)
4350 struct Lisp_Hash_Table
*h
;
4351 Lisp_Object key1
, key2
;
4352 unsigned hash1
, hash2
;
4354 return hash1
== hash2
&& !NILP (Fequal (key1
, key2
));
4358 /* Compare KEY1 which has hash code HASH1, and KEY2 with hash code
4359 HASH2 in hash table H using H->user_cmp_function. Value is non-zero
4360 if KEY1 and KEY2 are the same. */
4363 cmpfn_user_defined (h
, key1
, hash1
, key2
, hash2
)
4364 struct Lisp_Hash_Table
*h
;
4365 Lisp_Object key1
, key2
;
4366 unsigned hash1
, hash2
;
4370 Lisp_Object args
[3];
4372 args
[0] = h
->user_cmp_function
;
4375 return !NILP (Ffuncall (3, args
));
4382 /* Value is a hash code for KEY for use in hash table H which uses
4383 `eq' to compare keys. The hash code returned is guaranteed to fit
4384 in a Lisp integer. */
4388 struct Lisp_Hash_Table
*h
;
4391 unsigned hash
= XUINT (key
) ^ XGCTYPE (key
);
4392 xassert ((hash
& ~INTMASK
) == 0);
4397 /* Value is a hash code for KEY for use in hash table H which uses
4398 `eql' to compare keys. The hash code returned is guaranteed to fit
4399 in a Lisp integer. */
4403 struct Lisp_Hash_Table
*h
;
4408 hash
= sxhash (key
, 0);
4410 hash
= XUINT (key
) ^ XGCTYPE (key
);
4411 xassert ((hash
& ~INTMASK
) == 0);
4416 /* Value is a hash code for KEY for use in hash table H which uses
4417 `equal' to compare keys. The hash code returned is guaranteed to fit
4418 in a Lisp integer. */
4421 hashfn_equal (h
, key
)
4422 struct Lisp_Hash_Table
*h
;
4425 unsigned hash
= sxhash (key
, 0);
4426 xassert ((hash
& ~INTMASK
) == 0);
4431 /* Value is a hash code for KEY for use in hash table H which uses as
4432 user-defined function to compare keys. The hash code returned is
4433 guaranteed to fit in a Lisp integer. */
4436 hashfn_user_defined (h
, key
)
4437 struct Lisp_Hash_Table
*h
;
4440 Lisp_Object args
[2], hash
;
4442 args
[0] = h
->user_hash_function
;
4444 hash
= Ffuncall (2, args
);
4445 if (!INTEGERP (hash
))
4447 list2 (build_string ("Invalid hash code returned from \
4448 user-supplied hash function"),
4450 return XUINT (hash
);
4454 /* Create and initialize a new hash table.
4456 TEST specifies the test the hash table will use to compare keys.
4457 It must be either one of the predefined tests `eq', `eql' or
4458 `equal' or a symbol denoting a user-defined test named TEST with
4459 test and hash functions USER_TEST and USER_HASH.
4461 Give the table initial capacity SIZE, SIZE >= 0, an integer.
4463 If REHASH_SIZE is an integer, it must be > 0, and this hash table's
4464 new size when it becomes full is computed by adding REHASH_SIZE to
4465 its old size. If REHASH_SIZE is a float, it must be > 1.0, and the
4466 table's new size is computed by multiplying its old size with
4469 REHASH_THRESHOLD must be a float <= 1.0, and > 0. The table will
4470 be resized when the ratio of (number of entries in the table) /
4471 (table size) is >= REHASH_THRESHOLD.
4473 WEAK specifies the weakness of the table. If non-nil, it must be
4474 one of the symbols `key', `value', `key-or-value', or `key-and-value'. */
4477 make_hash_table (test
, size
, rehash_size
, rehash_threshold
, weak
,
4478 user_test
, user_hash
)
4479 Lisp_Object test
, size
, rehash_size
, rehash_threshold
, weak
;
4480 Lisp_Object user_test
, user_hash
;
4482 struct Lisp_Hash_Table
*h
;
4484 int index_size
, i
, sz
;
4486 /* Preconditions. */
4487 xassert (SYMBOLP (test
));
4488 xassert (INTEGERP (size
) && XINT (size
) >= 0);
4489 xassert ((INTEGERP (rehash_size
) && XINT (rehash_size
) > 0)
4490 || (FLOATP (rehash_size
) && XFLOATINT (rehash_size
) > 1.0));
4491 xassert (FLOATP (rehash_threshold
)
4492 && XFLOATINT (rehash_threshold
) > 0
4493 && XFLOATINT (rehash_threshold
) <= 1.0);
4495 if (XFASTINT (size
) == 0)
4496 size
= make_number (1);
4498 /* Allocate a table and initialize it. */
4499 h
= allocate_hash_table ();
4501 /* Initialize hash table slots. */
4502 sz
= XFASTINT (size
);
4505 if (EQ (test
, Qeql
))
4507 h
->cmpfn
= cmpfn_eql
;
4508 h
->hashfn
= hashfn_eql
;
4510 else if (EQ (test
, Qeq
))
4513 h
->hashfn
= hashfn_eq
;
4515 else if (EQ (test
, Qequal
))
4517 h
->cmpfn
= cmpfn_equal
;
4518 h
->hashfn
= hashfn_equal
;
4522 h
->user_cmp_function
= user_test
;
4523 h
->user_hash_function
= user_hash
;
4524 h
->cmpfn
= cmpfn_user_defined
;
4525 h
->hashfn
= hashfn_user_defined
;
4529 h
->rehash_threshold
= rehash_threshold
;
4530 h
->rehash_size
= rehash_size
;
4531 h
->count
= make_number (0);
4532 h
->key_and_value
= Fmake_vector (make_number (2 * sz
), Qnil
);
4533 h
->hash
= Fmake_vector (size
, Qnil
);
4534 h
->next
= Fmake_vector (size
, Qnil
);
4535 /* Cast to int here avoids losing with gcc 2.95 on Tru64/Alpha... */
4536 index_size
= next_almost_prime ((int) (sz
/ XFLOATINT (rehash_threshold
)));
4537 h
->index
= Fmake_vector (make_number (index_size
), Qnil
);
4539 /* Set up the free list. */
4540 for (i
= 0; i
< sz
- 1; ++i
)
4541 HASH_NEXT (h
, i
) = make_number (i
+ 1);
4542 h
->next_free
= make_number (0);
4544 XSET_HASH_TABLE (table
, h
);
4545 xassert (HASH_TABLE_P (table
));
4546 xassert (XHASH_TABLE (table
) == h
);
4548 /* Maybe add this hash table to the list of all weak hash tables. */
4550 h
->next_weak
= Qnil
;
4553 h
->next_weak
= Vweak_hash_tables
;
4554 Vweak_hash_tables
= table
;
4561 /* Return a copy of hash table H1. Keys and values are not copied,
4562 only the table itself is. */
4565 copy_hash_table (h1
)
4566 struct Lisp_Hash_Table
*h1
;
4569 struct Lisp_Hash_Table
*h2
;
4570 struct Lisp_Vector
*next
;
4572 h2
= allocate_hash_table ();
4573 next
= h2
->vec_next
;
4574 bcopy (h1
, h2
, sizeof *h2
);
4575 h2
->vec_next
= next
;
4576 h2
->key_and_value
= Fcopy_sequence (h1
->key_and_value
);
4577 h2
->hash
= Fcopy_sequence (h1
->hash
);
4578 h2
->next
= Fcopy_sequence (h1
->next
);
4579 h2
->index
= Fcopy_sequence (h1
->index
);
4580 XSET_HASH_TABLE (table
, h2
);
4582 /* Maybe add this hash table to the list of all weak hash tables. */
4583 if (!NILP (h2
->weak
))
4585 h2
->next_weak
= Vweak_hash_tables
;
4586 Vweak_hash_tables
= table
;
4593 /* Resize hash table H if it's too full. If H cannot be resized
4594 because it's already too large, throw an error. */
4597 maybe_resize_hash_table (h
)
4598 struct Lisp_Hash_Table
*h
;
4600 if (NILP (h
->next_free
))
4602 int old_size
= HASH_TABLE_SIZE (h
);
4603 int i
, new_size
, index_size
;
4605 if (INTEGERP (h
->rehash_size
))
4606 new_size
= old_size
+ XFASTINT (h
->rehash_size
);
4608 new_size
= old_size
* XFLOATINT (h
->rehash_size
);
4609 new_size
= max (old_size
+ 1, new_size
);
4610 index_size
= next_almost_prime ((int)
4612 / XFLOATINT (h
->rehash_threshold
)));
4613 if (max (index_size
, 2 * new_size
) > MOST_POSITIVE_FIXNUM
)
4614 error ("Hash table too large to resize");
4616 h
->key_and_value
= larger_vector (h
->key_and_value
, 2 * new_size
, Qnil
);
4617 h
->next
= larger_vector (h
->next
, new_size
, Qnil
);
4618 h
->hash
= larger_vector (h
->hash
, new_size
, Qnil
);
4619 h
->index
= Fmake_vector (make_number (index_size
), Qnil
);
4621 /* Update the free list. Do it so that new entries are added at
4622 the end of the free list. This makes some operations like
4624 for (i
= old_size
; i
< new_size
- 1; ++i
)
4625 HASH_NEXT (h
, i
) = make_number (i
+ 1);
4627 if (!NILP (h
->next_free
))
4629 Lisp_Object last
, next
;
4631 last
= h
->next_free
;
4632 while (next
= HASH_NEXT (h
, XFASTINT (last
)),
4636 HASH_NEXT (h
, XFASTINT (last
)) = make_number (old_size
);
4639 XSETFASTINT (h
->next_free
, old_size
);
4642 for (i
= 0; i
< old_size
; ++i
)
4643 if (!NILP (HASH_HASH (h
, i
)))
4645 unsigned hash_code
= XUINT (HASH_HASH (h
, i
));
4646 int start_of_bucket
= hash_code
% XVECTOR (h
->index
)->size
;
4647 HASH_NEXT (h
, i
) = HASH_INDEX (h
, start_of_bucket
);
4648 HASH_INDEX (h
, start_of_bucket
) = make_number (i
);
4654 /* Lookup KEY in hash table H. If HASH is non-null, return in *HASH
4655 the hash code of KEY. Value is the index of the entry in H
4656 matching KEY, or -1 if not found. */
4659 hash_lookup (h
, key
, hash
)
4660 struct Lisp_Hash_Table
*h
;
4665 int start_of_bucket
;
4668 hash_code
= h
->hashfn (h
, key
);
4672 start_of_bucket
= hash_code
% XVECTOR (h
->index
)->size
;
4673 idx
= HASH_INDEX (h
, start_of_bucket
);
4675 /* We need not gcpro idx since it's either an integer or nil. */
4678 int i
= XFASTINT (idx
);
4679 if (EQ (key
, HASH_KEY (h
, i
))
4681 && h
->cmpfn (h
, key
, hash_code
,
4682 HASH_KEY (h
, i
), XUINT (HASH_HASH (h
, i
)))))
4684 idx
= HASH_NEXT (h
, i
);
4687 return NILP (idx
) ? -1 : XFASTINT (idx
);
4691 /* Put an entry into hash table H that associates KEY with VALUE.
4692 HASH is a previously computed hash code of KEY.
4693 Value is the index of the entry in H matching KEY. */
4696 hash_put (h
, key
, value
, hash
)
4697 struct Lisp_Hash_Table
*h
;
4698 Lisp_Object key
, value
;
4701 int start_of_bucket
, i
;
4703 xassert ((hash
& ~INTMASK
) == 0);
4705 /* Increment count after resizing because resizing may fail. */
4706 maybe_resize_hash_table (h
);
4707 h
->count
= make_number (XFASTINT (h
->count
) + 1);
4709 /* Store key/value in the key_and_value vector. */
4710 i
= XFASTINT (h
->next_free
);
4711 h
->next_free
= HASH_NEXT (h
, i
);
4712 HASH_KEY (h
, i
) = key
;
4713 HASH_VALUE (h
, i
) = value
;
4715 /* Remember its hash code. */
4716 HASH_HASH (h
, i
) = make_number (hash
);
4718 /* Add new entry to its collision chain. */
4719 start_of_bucket
= hash
% XVECTOR (h
->index
)->size
;
4720 HASH_NEXT (h
, i
) = HASH_INDEX (h
, start_of_bucket
);
4721 HASH_INDEX (h
, start_of_bucket
) = make_number (i
);
4726 /* Remove the entry matching KEY from hash table H, if there is one. */
4729 hash_remove (h
, key
)
4730 struct Lisp_Hash_Table
*h
;
4734 int start_of_bucket
;
4735 Lisp_Object idx
, prev
;
4737 hash_code
= h
->hashfn (h
, key
);
4738 start_of_bucket
= hash_code
% XVECTOR (h
->index
)->size
;
4739 idx
= HASH_INDEX (h
, start_of_bucket
);
4742 /* We need not gcpro idx, prev since they're either integers or nil. */
4745 int i
= XFASTINT (idx
);
4747 if (EQ (key
, HASH_KEY (h
, i
))
4749 && h
->cmpfn (h
, key
, hash_code
,
4750 HASH_KEY (h
, i
), XUINT (HASH_HASH (h
, i
)))))
4752 /* Take entry out of collision chain. */
4754 HASH_INDEX (h
, start_of_bucket
) = HASH_NEXT (h
, i
);
4756 HASH_NEXT (h
, XFASTINT (prev
)) = HASH_NEXT (h
, i
);
4758 /* Clear slots in key_and_value and add the slots to
4760 HASH_KEY (h
, i
) = HASH_VALUE (h
, i
) = HASH_HASH (h
, i
) = Qnil
;
4761 HASH_NEXT (h
, i
) = h
->next_free
;
4762 h
->next_free
= make_number (i
);
4763 h
->count
= make_number (XFASTINT (h
->count
) - 1);
4764 xassert (XINT (h
->count
) >= 0);
4770 idx
= HASH_NEXT (h
, i
);
4776 /* Clear hash table H. */
4780 struct Lisp_Hash_Table
*h
;
4782 if (XFASTINT (h
->count
) > 0)
4784 int i
, size
= HASH_TABLE_SIZE (h
);
4786 for (i
= 0; i
< size
; ++i
)
4788 HASH_NEXT (h
, i
) = i
< size
- 1 ? make_number (i
+ 1) : Qnil
;
4789 HASH_KEY (h
, i
) = Qnil
;
4790 HASH_VALUE (h
, i
) = Qnil
;
4791 HASH_HASH (h
, i
) = Qnil
;
4794 for (i
= 0; i
< XVECTOR (h
->index
)->size
; ++i
)
4795 XVECTOR (h
->index
)->contents
[i
] = Qnil
;
4797 h
->next_free
= make_number (0);
4798 h
->count
= make_number (0);
4804 /************************************************************************
4806 ************************************************************************/
4808 /* Sweep weak hash table H. REMOVE_ENTRIES_P non-zero means remove
4809 entries from the table that don't survive the current GC.
4810 REMOVE_ENTRIES_P zero means mark entries that are in use. Value is
4811 non-zero if anything was marked. */
4814 sweep_weak_table (h
, remove_entries_p
)
4815 struct Lisp_Hash_Table
*h
;
4816 int remove_entries_p
;
4818 int bucket
, n
, marked
;
4820 n
= XVECTOR (h
->index
)->size
& ~ARRAY_MARK_FLAG
;
4823 for (bucket
= 0; bucket
< n
; ++bucket
)
4825 Lisp_Object idx
, next
, prev
;
4827 /* Follow collision chain, removing entries that
4828 don't survive this garbage collection. */
4830 for (idx
= HASH_INDEX (h
, bucket
); !GC_NILP (idx
); idx
= next
)
4832 int i
= XFASTINT (idx
);
4833 int key_known_to_survive_p
= survives_gc_p (HASH_KEY (h
, i
));
4834 int value_known_to_survive_p
= survives_gc_p (HASH_VALUE (h
, i
));
4837 if (EQ (h
->weak
, Qkey
))
4838 remove_p
= !key_known_to_survive_p
;
4839 else if (EQ (h
->weak
, Qvalue
))
4840 remove_p
= !value_known_to_survive_p
;
4841 else if (EQ (h
->weak
, Qkey_or_value
))
4842 remove_p
= !(key_known_to_survive_p
|| value_known_to_survive_p
);
4843 else if (EQ (h
->weak
, Qkey_and_value
))
4844 remove_p
= !(key_known_to_survive_p
&& value_known_to_survive_p
);
4848 next
= HASH_NEXT (h
, i
);
4850 if (remove_entries_p
)
4854 /* Take out of collision chain. */
4856 HASH_INDEX (h
, bucket
) = next
;
4858 HASH_NEXT (h
, XFASTINT (prev
)) = next
;
4860 /* Add to free list. */
4861 HASH_NEXT (h
, i
) = h
->next_free
;
4864 /* Clear key, value, and hash. */
4865 HASH_KEY (h
, i
) = HASH_VALUE (h
, i
) = Qnil
;
4866 HASH_HASH (h
, i
) = Qnil
;
4868 h
->count
= make_number (XFASTINT (h
->count
) - 1);
4879 /* Make sure key and value survive. */
4880 if (!key_known_to_survive_p
)
4882 mark_object (HASH_KEY (h
, i
));
4886 if (!value_known_to_survive_p
)
4888 mark_object (HASH_VALUE (h
, i
));
4899 /* Remove elements from weak hash tables that don't survive the
4900 current garbage collection. Remove weak tables that don't survive
4901 from Vweak_hash_tables. Called from gc_sweep. */
4904 sweep_weak_hash_tables ()
4906 Lisp_Object table
, used
, next
;
4907 struct Lisp_Hash_Table
*h
;
4910 /* Mark all keys and values that are in use. Keep on marking until
4911 there is no more change. This is necessary for cases like
4912 value-weak table A containing an entry X -> Y, where Y is used in a
4913 key-weak table B, Z -> Y. If B comes after A in the list of weak
4914 tables, X -> Y might be removed from A, although when looking at B
4915 one finds that it shouldn't. */
4919 for (table
= Vweak_hash_tables
; !GC_NILP (table
); table
= h
->next_weak
)
4921 h
= XHASH_TABLE (table
);
4922 if (h
->size
& ARRAY_MARK_FLAG
)
4923 marked
|= sweep_weak_table (h
, 0);
4928 /* Remove tables and entries that aren't used. */
4929 for (table
= Vweak_hash_tables
, used
= Qnil
; !GC_NILP (table
); table
= next
)
4931 h
= XHASH_TABLE (table
);
4932 next
= h
->next_weak
;
4934 if (h
->size
& ARRAY_MARK_FLAG
)
4936 /* TABLE is marked as used. Sweep its contents. */
4937 if (XFASTINT (h
->count
) > 0)
4938 sweep_weak_table (h
, 1);
4940 /* Add table to the list of used weak hash tables. */
4941 h
->next_weak
= used
;
4946 Vweak_hash_tables
= used
;
4951 /***********************************************************************
4952 Hash Code Computation
4953 ***********************************************************************/
4955 /* Maximum depth up to which to dive into Lisp structures. */
4957 #define SXHASH_MAX_DEPTH 3
4959 /* Maximum length up to which to take list and vector elements into
4962 #define SXHASH_MAX_LEN 7
4964 /* Combine two integers X and Y for hashing. */
4966 #define SXHASH_COMBINE(X, Y) \
4967 ((((unsigned)(X) << 4) + (((unsigned)(X) >> 24) & 0x0fffffff)) \
4971 /* Return a hash for string PTR which has length LEN. The hash
4972 code returned is guaranteed to fit in a Lisp integer. */
4975 sxhash_string (ptr
, len
)
4979 unsigned char *p
= ptr
;
4980 unsigned char *end
= p
+ len
;
4989 hash
= ((hash
<< 3) + (hash
>> 28) + c
);
4992 return hash
& INTMASK
;
4996 /* Return a hash for list LIST. DEPTH is the current depth in the
4997 list. We don't recurse deeper than SXHASH_MAX_DEPTH in it. */
5000 sxhash_list (list
, depth
)
5007 if (depth
< SXHASH_MAX_DEPTH
)
5009 CONSP (list
) && i
< SXHASH_MAX_LEN
;
5010 list
= XCDR (list
), ++i
)
5012 unsigned hash2
= sxhash (XCAR (list
), depth
+ 1);
5013 hash
= SXHASH_COMBINE (hash
, hash2
);
5020 /* Return a hash for vector VECTOR. DEPTH is the current depth in
5021 the Lisp structure. */
5024 sxhash_vector (vec
, depth
)
5028 unsigned hash
= XVECTOR (vec
)->size
;
5031 n
= min (SXHASH_MAX_LEN
, XVECTOR (vec
)->size
);
5032 for (i
= 0; i
< n
; ++i
)
5034 unsigned hash2
= sxhash (XVECTOR (vec
)->contents
[i
], depth
+ 1);
5035 hash
= SXHASH_COMBINE (hash
, hash2
);
5042 /* Return a hash for bool-vector VECTOR. */
5045 sxhash_bool_vector (vec
)
5048 unsigned hash
= XBOOL_VECTOR (vec
)->size
;
5051 n
= min (SXHASH_MAX_LEN
, XBOOL_VECTOR (vec
)->vector_size
);
5052 for (i
= 0; i
< n
; ++i
)
5053 hash
= SXHASH_COMBINE (hash
, XBOOL_VECTOR (vec
)->data
[i
]);
5059 /* Return a hash code for OBJ. DEPTH is the current depth in the Lisp
5060 structure. Value is an unsigned integer clipped to INTMASK. */
5069 if (depth
> SXHASH_MAX_DEPTH
)
5072 switch (XTYPE (obj
))
5083 obj
= SYMBOL_NAME (obj
);
5087 hash
= sxhash_string (SDATA (obj
), SCHARS (obj
));
5090 /* This can be everything from a vector to an overlay. */
5091 case Lisp_Vectorlike
:
5093 /* According to the CL HyperSpec, two arrays are equal only if
5094 they are `eq', except for strings and bit-vectors. In
5095 Emacs, this works differently. We have to compare element
5097 hash
= sxhash_vector (obj
, depth
);
5098 else if (BOOL_VECTOR_P (obj
))
5099 hash
= sxhash_bool_vector (obj
);
5101 /* Others are `equal' if they are `eq', so let's take their
5107 hash
= sxhash_list (obj
, depth
);
5112 unsigned char *p
= (unsigned char *) &XFLOAT_DATA (obj
);
5113 unsigned char *e
= p
+ sizeof XFLOAT_DATA (obj
);
5114 for (hash
= 0; p
< e
; ++p
)
5115 hash
= SXHASH_COMBINE (hash
, *p
);
5123 return hash
& INTMASK
;
5128 /***********************************************************************
5130 ***********************************************************************/
5133 DEFUN ("sxhash", Fsxhash
, Ssxhash
, 1, 1, 0,
5134 doc
: /* Compute a hash code for OBJ and return it as integer. */)
5138 unsigned hash
= sxhash (obj
, 0);;
5139 return make_number (hash
);
5143 DEFUN ("make-hash-table", Fmake_hash_table
, Smake_hash_table
, 0, MANY
, 0,
5144 doc
: /* Create and return a new hash table.
5146 Arguments are specified as keyword/argument pairs. The following
5147 arguments are defined:
5149 :test TEST -- TEST must be a symbol that specifies how to compare
5150 keys. Default is `eql'. Predefined are the tests `eq', `eql', and
5151 `equal'. User-supplied test and hash functions can be specified via
5152 `define-hash-table-test'.
5154 :size SIZE -- A hint as to how many elements will be put in the table.
5157 :rehash-size REHASH-SIZE - Indicates how to expand the table when it
5158 fills up. If REHASH-SIZE is an integer, add that many space. If it
5159 is a float, it must be > 1.0, and the new size is computed by
5160 multiplying the old size with that factor. Default is 1.5.
5162 :rehash-threshold THRESHOLD -- THRESHOLD must a float > 0, and <= 1.0.
5163 Resize the hash table when ratio of the number of entries in the
5164 table. Default is 0.8.
5166 :weakness WEAK -- WEAK must be one of nil, t, `key', `value',
5167 `key-or-value', or `key-and-value'. If WEAK is not nil, the table
5168 returned is a weak table. Key/value pairs are removed from a weak
5169 hash table when there are no non-weak references pointing to their
5170 key, value, one of key or value, or both key and value, depending on
5171 WEAK. WEAK t is equivalent to `key-and-value'. Default value of WEAK
5174 usage: (make-hash-table &rest KEYWORD-ARGS) */)
5179 Lisp_Object test
, size
, rehash_size
, rehash_threshold
, weak
;
5180 Lisp_Object user_test
, user_hash
;
5184 /* The vector `used' is used to keep track of arguments that
5185 have been consumed. */
5186 used
= (char *) alloca (nargs
* sizeof *used
);
5187 bzero (used
, nargs
* sizeof *used
);
5189 /* See if there's a `:test TEST' among the arguments. */
5190 i
= get_key_arg (QCtest
, nargs
, args
, used
);
5191 test
= i
< 0 ? Qeql
: args
[i
];
5192 if (!EQ (test
, Qeq
) && !EQ (test
, Qeql
) && !EQ (test
, Qequal
))
5194 /* See if it is a user-defined test. */
5197 prop
= Fget (test
, Qhash_table_test
);
5198 if (!CONSP (prop
) || !CONSP (XCDR (prop
)))
5199 Fsignal (Qerror
, list2 (build_string ("Invalid hash table test"),
5201 user_test
= XCAR (prop
);
5202 user_hash
= XCAR (XCDR (prop
));
5205 user_test
= user_hash
= Qnil
;
5207 /* See if there's a `:size SIZE' argument. */
5208 i
= get_key_arg (QCsize
, nargs
, args
, used
);
5209 size
= i
< 0 ? Qnil
: args
[i
];
5211 size
= make_number (DEFAULT_HASH_SIZE
);
5212 else if (!INTEGERP (size
) || XINT (size
) < 0)
5214 list2 (build_string ("Invalid hash table size"),
5217 /* Look for `:rehash-size SIZE'. */
5218 i
= get_key_arg (QCrehash_size
, nargs
, args
, used
);
5219 rehash_size
= i
< 0 ? make_float (DEFAULT_REHASH_SIZE
) : args
[i
];
5220 if (!NUMBERP (rehash_size
)
5221 || (INTEGERP (rehash_size
) && XINT (rehash_size
) <= 0)
5222 || XFLOATINT (rehash_size
) <= 1.0)
5224 list2 (build_string ("Invalid hash table rehash size"),
5227 /* Look for `:rehash-threshold THRESHOLD'. */
5228 i
= get_key_arg (QCrehash_threshold
, nargs
, args
, used
);
5229 rehash_threshold
= i
< 0 ? make_float (DEFAULT_REHASH_THRESHOLD
) : args
[i
];
5230 if (!FLOATP (rehash_threshold
)
5231 || XFLOATINT (rehash_threshold
) <= 0.0
5232 || XFLOATINT (rehash_threshold
) > 1.0)
5234 list2 (build_string ("Invalid hash table rehash threshold"),
5237 /* Look for `:weakness WEAK'. */
5238 i
= get_key_arg (QCweakness
, nargs
, args
, used
);
5239 weak
= i
< 0 ? Qnil
: args
[i
];
5241 weak
= Qkey_and_value
;
5244 && !EQ (weak
, Qvalue
)
5245 && !EQ (weak
, Qkey_or_value
)
5246 && !EQ (weak
, Qkey_and_value
))
5247 Fsignal (Qerror
, list2 (build_string ("Invalid hash table weakness"),
5250 /* Now, all args should have been used up, or there's a problem. */
5251 for (i
= 0; i
< nargs
; ++i
)
5254 list2 (build_string ("Invalid argument list"), args
[i
]));
5256 return make_hash_table (test
, size
, rehash_size
, rehash_threshold
, weak
,
5257 user_test
, user_hash
);
5261 DEFUN ("copy-hash-table", Fcopy_hash_table
, Scopy_hash_table
, 1, 1, 0,
5262 doc
: /* Return a copy of hash table TABLE. */)
5266 return copy_hash_table (check_hash_table (table
));
5270 DEFUN ("hash-table-count", Fhash_table_count
, Shash_table_count
, 1, 1, 0,
5271 doc
: /* Return the number of elements in TABLE. */)
5275 return check_hash_table (table
)->count
;
5279 DEFUN ("hash-table-rehash-size", Fhash_table_rehash_size
,
5280 Shash_table_rehash_size
, 1, 1, 0,
5281 doc
: /* Return the current rehash size of TABLE. */)
5285 return check_hash_table (table
)->rehash_size
;
5289 DEFUN ("hash-table-rehash-threshold", Fhash_table_rehash_threshold
,
5290 Shash_table_rehash_threshold
, 1, 1, 0,
5291 doc
: /* Return the current rehash threshold of TABLE. */)
5295 return check_hash_table (table
)->rehash_threshold
;
5299 DEFUN ("hash-table-size", Fhash_table_size
, Shash_table_size
, 1, 1, 0,
5300 doc
: /* Return the size of TABLE.
5301 The size can be used as an argument to `make-hash-table' to create
5302 a hash table than can hold as many elements of TABLE holds
5303 without need for resizing. */)
5307 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
5308 return make_number (HASH_TABLE_SIZE (h
));
5312 DEFUN ("hash-table-test", Fhash_table_test
, Shash_table_test
, 1, 1, 0,
5313 doc
: /* Return the test TABLE uses. */)
5317 return check_hash_table (table
)->test
;
5321 DEFUN ("hash-table-weakness", Fhash_table_weakness
, Shash_table_weakness
,
5323 doc
: /* Return the weakness of TABLE. */)
5327 return check_hash_table (table
)->weak
;
5331 DEFUN ("hash-table-p", Fhash_table_p
, Shash_table_p
, 1, 1, 0,
5332 doc
: /* Return t if OBJ is a Lisp hash table object. */)
5336 return HASH_TABLE_P (obj
) ? Qt
: Qnil
;
5340 DEFUN ("clrhash", Fclrhash
, Sclrhash
, 1, 1, 0,
5341 doc
: /* Clear hash table TABLE. */)
5345 hash_clear (check_hash_table (table
));
5350 DEFUN ("gethash", Fgethash
, Sgethash
, 2, 3, 0,
5351 doc
: /* Look up KEY in TABLE and return its associated value.
5352 If KEY is not found, return DFLT which defaults to nil. */)
5354 Lisp_Object key
, table
, dflt
;
5356 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
5357 int i
= hash_lookup (h
, key
, NULL
);
5358 return i
>= 0 ? HASH_VALUE (h
, i
) : dflt
;
5362 DEFUN ("puthash", Fputhash
, Sputhash
, 3, 3, 0,
5363 doc
: /* Associate KEY with VALUE in hash table TABLE.
5364 If KEY is already present in table, replace its current value with
5367 Lisp_Object key
, value
, table
;
5369 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
5373 i
= hash_lookup (h
, key
, &hash
);
5375 HASH_VALUE (h
, i
) = value
;
5377 hash_put (h
, key
, value
, hash
);
5383 DEFUN ("remhash", Fremhash
, Sremhash
, 2, 2, 0,
5384 doc
: /* Remove KEY from TABLE. */)
5386 Lisp_Object key
, table
;
5388 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
5389 hash_remove (h
, key
);
5394 DEFUN ("maphash", Fmaphash
, Smaphash
, 2, 2, 0,
5395 doc
: /* Call FUNCTION for all entries in hash table TABLE.
5396 FUNCTION is called with 2 arguments KEY and VALUE. */)
5398 Lisp_Object function
, table
;
5400 struct Lisp_Hash_Table
*h
= check_hash_table (table
);
5401 Lisp_Object args
[3];
5404 for (i
= 0; i
< HASH_TABLE_SIZE (h
); ++i
)
5405 if (!NILP (HASH_HASH (h
, i
)))
5408 args
[1] = HASH_KEY (h
, i
);
5409 args
[2] = HASH_VALUE (h
, i
);
5417 DEFUN ("define-hash-table-test", Fdefine_hash_table_test
,
5418 Sdefine_hash_table_test
, 3, 3, 0,
5419 doc
: /* Define a new hash table test with name NAME, a symbol.
5421 In hash tables created with NAME specified as test, use TEST to
5422 compare keys, and HASH for computing hash codes of keys.
5424 TEST must be a function taking two arguments and returning non-nil if
5425 both arguments are the same. HASH must be a function taking one
5426 argument and return an integer that is the hash code of the argument.
5427 Hash code computation should use the whole value range of integers,
5428 including negative integers. */)
5430 Lisp_Object name
, test
, hash
;
5432 return Fput (name
, Qhash_table_test
, list2 (test
, hash
));
5437 /************************************************************************
5439 ************************************************************************/
5444 DEFUN ("md5", Fmd5
, Smd5
, 1, 5, 0,
5445 doc
: /* Return MD5 message digest of OBJECT, a buffer or string.
5447 A message digest is a cryptographic checksum of a document, and the
5448 algorithm to calculate it is defined in RFC 1321.
5450 The two optional arguments START and END are character positions
5451 specifying for which part of OBJECT the message digest should be
5452 computed. If nil or omitted, the digest is computed for the whole
5455 The MD5 message digest is computed from the result of encoding the
5456 text in a coding system, not directly from the internal Emacs form of
5457 the text. The optional fourth argument CODING-SYSTEM specifies which
5458 coding system to encode the text with. It should be the same coding
5459 system that you used or will use when actually writing the text into a
5462 If CODING-SYSTEM is nil or omitted, the default depends on OBJECT. If
5463 OBJECT is a buffer, the default for CODING-SYSTEM is whatever coding
5464 system would be chosen by default for writing this text into a file.
5466 If OBJECT is a string, the most preferred coding system (see the
5467 command `prefer-coding-system') is used.
5469 If NOERROR is non-nil, silently assume the `raw-text' coding if the
5470 guesswork fails. Normally, an error is signaled in such case. */)
5471 (object
, start
, end
, coding_system
, noerror
)
5472 Lisp_Object object
, start
, end
, coding_system
, noerror
;
5474 unsigned char digest
[16];
5475 unsigned char value
[33];
5479 int start_char
= 0, end_char
= 0;
5480 int start_byte
= 0, end_byte
= 0;
5482 register struct buffer
*bp
;
5485 if (STRINGP (object
))
5487 if (NILP (coding_system
))
5489 /* Decide the coding-system to encode the data with. */
5491 if (STRING_MULTIBYTE (object
))
5492 /* use default, we can't guess correct value */
5493 coding_system
= SYMBOL_VALUE (XCAR (Vcoding_category_list
));
5495 coding_system
= Qraw_text
;
5498 if (NILP (Fcoding_system_p (coding_system
)))
5500 /* Invalid coding system. */
5502 if (!NILP (noerror
))
5503 coding_system
= Qraw_text
;
5506 Fsignal (Qcoding_system_error
, Fcons (coding_system
, Qnil
));
5509 if (STRING_MULTIBYTE (object
))
5510 object
= code_convert_string1 (object
, coding_system
, Qnil
, 1);
5512 size
= SCHARS (object
);
5513 size_byte
= SBYTES (object
);
5517 CHECK_NUMBER (start
);
5519 start_char
= XINT (start
);
5524 start_byte
= string_char_to_byte (object
, start_char
);
5530 end_byte
= size_byte
;
5536 end_char
= XINT (end
);
5541 end_byte
= string_char_to_byte (object
, end_char
);
5544 if (!(0 <= start_char
&& start_char
<= end_char
&& end_char
<= size
))
5545 args_out_of_range_3 (object
, make_number (start_char
),
5546 make_number (end_char
));
5550 struct buffer
*prev
= current_buffer
;
5552 record_unwind_protect (Fset_buffer
, Fcurrent_buffer ());
5554 CHECK_BUFFER (object
);
5556 bp
= XBUFFER (object
);
5557 if (bp
!= current_buffer
)
5558 set_buffer_internal (bp
);
5564 CHECK_NUMBER_COERCE_MARKER (start
);
5572 CHECK_NUMBER_COERCE_MARKER (end
);
5577 temp
= b
, b
= e
, e
= temp
;
5579 if (!(BEGV
<= b
&& e
<= ZV
))
5580 args_out_of_range (start
, end
);
5582 if (NILP (coding_system
))
5584 /* Decide the coding-system to encode the data with.
5585 See fileio.c:Fwrite-region */
5587 if (!NILP (Vcoding_system_for_write
))
5588 coding_system
= Vcoding_system_for_write
;
5591 int force_raw_text
= 0;
5593 coding_system
= XBUFFER (object
)->buffer_file_coding_system
;
5594 if (NILP (coding_system
)
5595 || NILP (Flocal_variable_p (Qbuffer_file_coding_system
, Qnil
)))
5597 coding_system
= Qnil
;
5598 if (NILP (current_buffer
->enable_multibyte_characters
))
5602 if (NILP (coding_system
) && !NILP (Fbuffer_file_name(object
)))
5604 /* Check file-coding-system-alist. */
5605 Lisp_Object args
[4], val
;
5607 args
[0] = Qwrite_region
; args
[1] = start
; args
[2] = end
;
5608 args
[3] = Fbuffer_file_name(object
);
5609 val
= Ffind_operation_coding_system (4, args
);
5610 if (CONSP (val
) && !NILP (XCDR (val
)))
5611 coding_system
= XCDR (val
);
5614 if (NILP (coding_system
)
5615 && !NILP (XBUFFER (object
)->buffer_file_coding_system
))
5617 /* If we still have not decided a coding system, use the
5618 default value of buffer-file-coding-system. */
5619 coding_system
= XBUFFER (object
)->buffer_file_coding_system
;
5623 && !NILP (Ffboundp (Vselect_safe_coding_system_function
)))
5624 /* Confirm that VAL can surely encode the current region. */
5625 coding_system
= call4 (Vselect_safe_coding_system_function
,
5626 make_number (b
), make_number (e
),
5627 coding_system
, Qnil
);
5630 coding_system
= Qraw_text
;
5633 if (NILP (Fcoding_system_p (coding_system
)))
5635 /* Invalid coding system. */
5637 if (!NILP (noerror
))
5638 coding_system
= Qraw_text
;
5641 Fsignal (Qcoding_system_error
, Fcons (coding_system
, Qnil
));
5645 object
= make_buffer_string (b
, e
, 0);
5646 if (prev
!= current_buffer
)
5647 set_buffer_internal (prev
);
5648 /* Discard the unwind protect for recovering the current
5652 if (STRING_MULTIBYTE (object
))
5653 object
= code_convert_string1 (object
, coding_system
, Qnil
, 1);
5656 md5_buffer (SDATA (object
) + start_byte
,
5657 SBYTES (object
) - (size_byte
- end_byte
),
5660 for (i
= 0; i
< 16; i
++)
5661 sprintf (&value
[2 * i
], "%02x", digest
[i
]);
5664 return make_string (value
, 32);
5671 /* Hash table stuff. */
5672 Qhash_table_p
= intern ("hash-table-p");
5673 staticpro (&Qhash_table_p
);
5674 Qeq
= intern ("eq");
5676 Qeql
= intern ("eql");
5678 Qequal
= intern ("equal");
5679 staticpro (&Qequal
);
5680 QCtest
= intern (":test");
5681 staticpro (&QCtest
);
5682 QCsize
= intern (":size");
5683 staticpro (&QCsize
);
5684 QCrehash_size
= intern (":rehash-size");
5685 staticpro (&QCrehash_size
);
5686 QCrehash_threshold
= intern (":rehash-threshold");
5687 staticpro (&QCrehash_threshold
);
5688 QCweakness
= intern (":weakness");
5689 staticpro (&QCweakness
);
5690 Qkey
= intern ("key");
5692 Qvalue
= intern ("value");
5693 staticpro (&Qvalue
);
5694 Qhash_table_test
= intern ("hash-table-test");
5695 staticpro (&Qhash_table_test
);
5696 Qkey_or_value
= intern ("key-or-value");
5697 staticpro (&Qkey_or_value
);
5698 Qkey_and_value
= intern ("key-and-value");
5699 staticpro (&Qkey_and_value
);
5702 defsubr (&Smake_hash_table
);
5703 defsubr (&Scopy_hash_table
);
5704 defsubr (&Shash_table_count
);
5705 defsubr (&Shash_table_rehash_size
);
5706 defsubr (&Shash_table_rehash_threshold
);
5707 defsubr (&Shash_table_size
);
5708 defsubr (&Shash_table_test
);
5709 defsubr (&Shash_table_weakness
);
5710 defsubr (&Shash_table_p
);
5711 defsubr (&Sclrhash
);
5712 defsubr (&Sgethash
);
5713 defsubr (&Sputhash
);
5714 defsubr (&Sremhash
);
5715 defsubr (&Smaphash
);
5716 defsubr (&Sdefine_hash_table_test
);
5718 Qstring_lessp
= intern ("string-lessp");
5719 staticpro (&Qstring_lessp
);
5720 Qprovide
= intern ("provide");
5721 staticpro (&Qprovide
);
5722 Qrequire
= intern ("require");
5723 staticpro (&Qrequire
);
5724 Qyes_or_no_p_history
= intern ("yes-or-no-p-history");
5725 staticpro (&Qyes_or_no_p_history
);
5726 Qcursor_in_echo_area
= intern ("cursor-in-echo-area");
5727 staticpro (&Qcursor_in_echo_area
);
5728 Qwidget_type
= intern ("widget-type");
5729 staticpro (&Qwidget_type
);
5731 staticpro (&string_char_byte_cache_string
);
5732 string_char_byte_cache_string
= Qnil
;
5734 require_nesting_list
= Qnil
;
5735 staticpro (&require_nesting_list
);
5737 Fset (Qyes_or_no_p_history
, Qnil
);
5739 DEFVAR_LISP ("features", &Vfeatures
,
5740 doc
: /* A list of symbols which are the features of the executing emacs.
5741 Used by `featurep' and `require', and altered by `provide'. */);
5743 Qsubfeatures
= intern ("subfeatures");
5744 staticpro (&Qsubfeatures
);
5746 #ifdef HAVE_LANGINFO_CODESET
5747 Qcodeset
= intern ("codeset");
5748 staticpro (&Qcodeset
);
5749 Qdays
= intern ("days");
5751 Qmonths
= intern ("months");
5752 staticpro (&Qmonths
);
5753 Qpaper
= intern ("paper");
5754 staticpro (&Qpaper
);
5755 #endif /* HAVE_LANGINFO_CODESET */
5757 DEFVAR_BOOL ("use-dialog-box", &use_dialog_box
,
5758 doc
: /* *Non-nil means mouse commands use dialog boxes to ask questions.
5759 This applies to `y-or-n-p' and `yes-or-no-p' questions asked by commands
5760 invoked by mouse clicks and mouse menu items. */);
5763 DEFVAR_BOOL ("use-file-dialog", &use_file_dialog
,
5764 doc
: /* *Non-nil means mouse commands use a file dialog to ask for files.
5765 This applies to commands from menus and tool bar buttons. The value of
5766 `use-dialog-box' takes precedence over this variable, so a file dialog is only
5767 used if both `use-dialog-box' and this variable are non-nil. */);
5768 use_file_dialog
= 1;
5770 defsubr (&Sidentity
);
5773 defsubr (&Ssafe_length
);
5774 defsubr (&Sstring_bytes
);
5775 defsubr (&Sstring_equal
);
5776 defsubr (&Scompare_strings
);
5777 defsubr (&Sstring_lessp
);
5780 defsubr (&Svconcat
);
5781 defsubr (&Scopy_sequence
);
5782 defsubr (&Sstring_make_multibyte
);
5783 defsubr (&Sstring_make_unibyte
);
5784 defsubr (&Sstring_as_multibyte
);
5785 defsubr (&Sstring_as_unibyte
);
5786 defsubr (&Sstring_to_multibyte
);
5787 defsubr (&Scopy_alist
);
5788 defsubr (&Ssubstring
);
5789 defsubr (&Ssubstring_no_properties
);
5801 defsubr (&Snreverse
);
5802 defsubr (&Sreverse
);
5804 defsubr (&Splist_get
);
5806 defsubr (&Splist_put
);
5808 defsubr (&Slax_plist_get
);
5809 defsubr (&Slax_plist_put
);
5812 defsubr (&Sequal_including_properties
);
5813 defsubr (&Sfillarray
);
5814 defsubr (&Sclear_string
);
5815 defsubr (&Schar_table_subtype
);
5816 defsubr (&Schar_table_parent
);
5817 defsubr (&Sset_char_table_parent
);
5818 defsubr (&Schar_table_extra_slot
);
5819 defsubr (&Sset_char_table_extra_slot
);
5820 defsubr (&Schar_table_range
);
5821 defsubr (&Sset_char_table_range
);
5822 defsubr (&Sset_char_table_default
);
5823 defsubr (&Soptimize_char_table
);
5824 defsubr (&Smap_char_table
);
5828 defsubr (&Smapconcat
);
5829 defsubr (&Sy_or_n_p
);
5830 defsubr (&Syes_or_no_p
);
5831 defsubr (&Sload_average
);
5832 defsubr (&Sfeaturep
);
5833 defsubr (&Srequire
);
5834 defsubr (&Sprovide
);
5835 defsubr (&Splist_member
);
5836 defsubr (&Swidget_put
);
5837 defsubr (&Swidget_get
);
5838 defsubr (&Swidget_apply
);
5839 defsubr (&Sbase64_encode_region
);
5840 defsubr (&Sbase64_decode_region
);
5841 defsubr (&Sbase64_encode_string
);
5842 defsubr (&Sbase64_decode_string
);
5844 defsubr (&Slocale_info
);
5851 Vweak_hash_tables
= Qnil
;
5854 /* arch-tag: 787f8219-5b74-46bd-8469-7e1cc475fa31
5855 (do not change this comment) */